diff --git a/addons/userrights/userrightsprofile.class.inc.php b/addons/userrights/userrightsprofile.class.inc.php index 6370e5fe3..63a9a0a26 100644 --- a/addons/userrights/userrightsprofile.class.inc.php +++ b/addons/userrights/userrightsprofile.class.inc.php @@ -228,7 +228,7 @@ class URP_UserProfile extends UserRightsBaseClassGUI "db_table" => "priv_urp_userprofile", "db_key_field" => "id", "db_finalclass_field" => "", - "is_link" => true, /** @since 3.1.0 N°6482 */ + "is_link" => true, /** @since 3.1.0 N°6482 N°5324 */ 'uniqueness_rules' => array( 'no_duplicate' => array( 'attributes' => array( diff --git a/addons/userrights/userrightsprofile.db.class.inc.php b/addons/userrights/userrightsprofile.db.class.inc.php index 12a8874c9..ce7a13ee2 100644 --- a/addons/userrights/userrightsprofile.db.class.inc.php +++ b/addons/userrights/userrightsprofile.db.class.inc.php @@ -23,7 +23,7 @@ define('PORTAL_PROFILE_NAME', 'Portal user'); class UserRightsBaseClassGUI extends cmdbAbstractObject { // Whenever something changes, reload the privileges - + protected function AfterInsert() { UserRights::FlushPrivileges(); @@ -43,7 +43,7 @@ class UserRightsBaseClassGUI extends cmdbAbstractObject class UserRightsBaseClass extends DBObject { // Whenever something changes, reload the privileges - + protected function AfterInsert() { UserRights::FlushPrivileges(); @@ -100,7 +100,7 @@ class URP_Profiles extends UserRightsBaseClassGUI $this->m_bCheckReservedNames = false; } - + protected static $m_aActions = array( UR_ACTION_READ => 'Read', UR_ACTION_MODIFY => 'Modify', @@ -113,7 +113,7 @@ class URP_Profiles extends UserRightsBaseClassGUI protected static $m_aCacheActionGrants = null; protected static $m_aCacheStimulusGrants = null; protected static $m_aCacheProfiles = null; - + public static function DoCreateProfile($sName, $sDescription, $bReservedName = false) { if (is_null(self::$m_aCacheProfiles)) @@ -125,7 +125,7 @@ class URP_Profiles extends UserRightsBaseClassGUI { self::$m_aCacheProfiles[$oProfile->Get('name')] = $oProfile->GetKey(); } - } + } $sCacheKey = $sName; if (isset(self::$m_aCacheProfiles[$sCacheKey])) @@ -137,17 +137,17 @@ class URP_Profiles extends UserRightsBaseClassGUI $oNewObj->Set('description', $sDescription); if ($bReservedName) { - $oNewObj->DisableCheckOnReservedNames(); + $oNewObj->DisableCheckOnReservedNames(); } $iId = $oNewObj->DBInsertNoReload(); - self::$m_aCacheProfiles[$sCacheKey] = $iId; + self::$m_aCacheProfiles[$sCacheKey] = $iId; return $iId; } - + public static function DoCreateActionGrant($iProfile, $iAction, $sClass, $bPermission = true) { $sAction = self::$m_aActions[$iAction]; - + if (is_null(self::$m_aCacheActionGrants)) { self::$m_aCacheActionGrants = array(); @@ -157,7 +157,7 @@ class URP_Profiles extends UserRightsBaseClassGUI { self::$m_aCacheActionGrants[$oGrant->Get('profileid').'-'.$oGrant->Get('action').'-'.$oGrant->Get('class')] = $oGrant->GetKey(); } - } + } $sCacheKey = "$iProfile-$sAction-$sClass"; if (isset(self::$m_aCacheActionGrants[$sCacheKey])) @@ -171,10 +171,10 @@ class URP_Profiles extends UserRightsBaseClassGUI $oNewObj->Set('class', $sClass); $oNewObj->Set('action', $sAction); $iId = $oNewObj->DBInsertNoReload(); - self::$m_aCacheActionGrants[$sCacheKey] = $iId; + self::$m_aCacheActionGrants[$sCacheKey] = $iId; return $iId; } - + public static function DoCreateStimulusGrant($iProfile, $sStimulusCode, $sClass) { if (is_null(self::$m_aCacheStimulusGrants)) @@ -186,7 +186,7 @@ class URP_Profiles extends UserRightsBaseClassGUI { self::$m_aCacheStimulusGrants[$oGrant->Get('profileid').'-'.$oGrant->Get('stimulus').'-'.$oGrant->Get('class')] = $oGrant->GetKey(); } - } + } $sCacheKey = "$iProfile-$sStimulusCode-$sClass"; if (isset(self::$m_aCacheStimulusGrants[$sCacheKey])) @@ -199,13 +199,13 @@ class URP_Profiles extends UserRightsBaseClassGUI $oNewObj->Set('class', $sClass); $oNewObj->Set('stimulus', $sStimulusCode); $iId = $oNewObj->DBInsertNoReload(); - self::$m_aCacheStimulusGrants[$sCacheKey] = $iId; + self::$m_aCacheStimulusGrants[$sCacheKey] = $iId; return $iId; } - + /* * Create the built-in Administrator profile with its reserved name - */ + */ public static function DoCreateAdminProfile() { self::DoCreateProfile(ADMIN_PROFILE_NAME, 'Has the rights on everything (bypassing any control)', true /* reserved name */); @@ -213,7 +213,7 @@ class URP_Profiles extends UserRightsBaseClassGUI /* * Overload the standard behavior to preserve reserved names - */ + */ public function DoCheckToWrite() { parent::DoCheckToWrite(); @@ -255,7 +255,7 @@ class URP_Profiles extends UserRightsBaseClassGUI return ''.Dict::S('UI:UserManagement:ActionAllowed:No').''; } } - + function DoShowGrantSumary($oPage) { if ($this->GetRawName() == "Administrator") @@ -267,7 +267,7 @@ class URP_Profiles extends UserRightsBaseClassGUI // Note: for sure, we assume that the instance is derived from UserRightsProfile $oUserRights = UserRights::GetModuleInstance(); - + $aDisplayData = array(); foreach (MetaModel::GetClasses('bizmodel') as $sClass) { @@ -284,7 +284,7 @@ class URP_Profiles extends UserRightsBaseClassGUI } } $sStimuli = implode(', ', $aStimuli); - + $aDisplayData[] = array( 'class' => MetaModel::GetName($sClass), 'read' => $this->GetGrantAsHtml($oUserRights, $sClass, 'Read'), @@ -296,7 +296,7 @@ class URP_Profiles extends UserRightsBaseClassGUI 'stimuli' => $sStimuli, ); } - + $aDisplayConfig = array(); $aDisplayConfig['class'] = array('label' => Dict::S('UI:UserManagement:Class'), 'description' => Dict::S('UI:UserManagement:Class+')); $aDisplayConfig['read'] = array('label' => Dict::S('UI:UserManagement:Action:Read'), 'description' => Dict::S('UI:UserManagement:Action:Read+')); @@ -334,7 +334,7 @@ class URP_UserProfile extends UserRightsBaseClassGUI "db_table" => "priv_urp_userprofile", "db_key_field" => "id", "db_finalclass_field" => "", - "is_link" => true, /** @since 3.1.0 N°6482 */ + "is_link" => true, /** @since 3.1.0 N°6482 N°5324 */ ); MetaModel::Init_Params($aParams); //MetaModel::Init_InheritAttributes(); @@ -611,7 +611,7 @@ class UserRightsProfile extends UserRightsAddOnAPI $oSearch->AllowAllData(); $oCondition = new BinaryExpression(new FieldExpression('userid'), '=', new VariableExpression('userid')); $oSearch->AddConditionExpression($oCondition); - + $oUserOrgSet = new DBObjectSet($oSearch, array(), array('userid' => $iUser)); while ($oUserOrg = $oUserOrgSet->Fetch()) { @@ -633,7 +633,7 @@ class UserRightsProfile extends UserRightsAddOnAPI $oSearch->AllowAllData(); $oCondition = new BinaryExpression(new FieldExpression('userid'), '=', new VariableExpression('userid')); $oSearch->AddConditionExpression($oCondition); - + $this->m_aUserProfiles[$iUser] = array(); $oUserProfileSet = new DBObjectSet($oSearch, array(), array('userid' => $iUser)); while ($oUserProfile = $oUserProfileSet->Fetch()) @@ -648,7 +648,7 @@ class UserRightsProfile extends UserRightsAddOnAPI public function ResetCache() { // Loaded by Load cache - $this->m_aProfiles = null; + $this->m_aProfiles = null; $this->m_aUserProfiles = array(); $this->m_aUserOrgs = array(); @@ -658,7 +658,7 @@ class UserRightsProfile extends UserRightsAddOnAPI // Loaded on demand (time consuming as compared to the others) $this->m_aClassActionGrants = null; $this->m_aClassStimulusGrants = null; - + $this->m_aObjectActionGrants = array(); } @@ -694,10 +694,10 @@ class UserRightsProfile extends UserRightsAddOnAPI } $oProfileSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_Profiles")); - $this->m_aProfiles = array(); + $this->m_aProfiles = array(); while ($oProfile = $oProfileSet->Fetch()) { - $this->m_aProfiles[$oProfile->GetKey()] = $oProfile; + $this->m_aProfiles[$oProfile->GetKey()] = $oProfile; } $this->m_aClassStimulusGrants = array(); @@ -871,7 +871,7 @@ exit; $this->m_aObjectActionGrants[$iUser][$sClass][$iActionCode] = $aRes; return $aRes; } - + public function IsActionAllowed($oUser, $sClass, $iActionCode, $oInstanceSet = null) { $this->LoadCache(); @@ -1009,8 +1009,8 @@ exit; /** * Find out which attribute is corresponding the the dimension 'owner org' - * returns null if no such attribute has been found (no filtering should occur) - */ + * returns null if no such attribute has been found (no filtering should occur) + */ public static function GetOwnerOrganizationAttCode($sClass) { $sAttCode = null; diff --git a/addons/userrights/userrightsprojection.class.inc.php b/addons/userrights/userrightsprojection.class.inc.php index 50413fabc..e2bf86e0e 100644 --- a/addons/userrights/userrightsprojection.class.inc.php +++ b/addons/userrights/userrightsprojection.class.inc.php @@ -22,9 +22,9 @@ define('ADMIN_PROFILE_ID', 1); class UserRightsBaseClass extends cmdbAbstractObject { // Whenever something changes, reload the privileges - + // Whenever something changes, reload the privileges - + protected function AfterInsert() { UserRights::FlushPrivileges(); @@ -78,7 +78,7 @@ class URP_Profiles extends UserRightsBaseClass function GetGrantAsHtml($oUserRights, $sClass, $sAction) { $oGrant = $oUserRights->GetClassActionGrant($this->GetKey(), $sClass, $sAction); - if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes')) + if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes')) { return ''.Dict::S('UI:UserManagement:ActionAllowed:Yes').''; } @@ -87,7 +87,7 @@ class URP_Profiles extends UserRightsBaseClass return ''.Dict::S('UI:UserManagement:ActionAllowed:No').''; } } - + function DoShowGrantSumary($oPage) { if ($this->GetRawName() == "Administrator") @@ -99,7 +99,7 @@ class URP_Profiles extends UserRightsBaseClass // Note: for sure, we assume that the instance is derived from UserRightsProjection $oUserRights = UserRights::GetModuleInstance(); - + $aDisplayData = array(); foreach (MetaModel::GetClasses('bizmodel') as $sClass) { @@ -116,7 +116,7 @@ class URP_Profiles extends UserRightsBaseClass } } $sStimuli = implode(', ', $aStimuli); - + $aDisplayData[] = array( 'class' => MetaModel::GetName($sClass), 'read' => $this->GetGrantAsHtml($oUserRights, $sClass, 'Read'), @@ -128,7 +128,7 @@ class URP_Profiles extends UserRightsBaseClass 'stimuli' => $sStimuli, ); } - + $aDisplayConfig = array(); $aDisplayConfig['class'] = array('label' => Dict::S('UI:UserManagement:Class'), 'description' => Dict::S('UI:UserManagement:Class+')); $aDisplayConfig['read'] = array('label' => Dict::S('UI:UserManagement:Action:Read'), 'description' => Dict::S('UI:UserManagement:Action:Read+')); @@ -277,7 +277,7 @@ class URP_UserProfile extends UserRightsBaseClass "db_table" => "priv_urp_userprofile", "db_key_field" => "id", "db_finalclass_field" => "", - "is_link" => true, /** @since 3.1.0 N°6482 */ + "is_link" => true, /** @since 3.1.0 N°6482 N°5324 */ ); MetaModel::Init_Params($aParams); //MetaModel::Init_InheritAttributes(); @@ -356,7 +356,7 @@ class URP_ProfileProjection extends UserRightsBaseClass { $aRes = array($oUser->Get($sColumn)); } - + } elseif (($sExpr == '') || ($sExpr == '')) { @@ -427,14 +427,14 @@ class URP_ClassProjection extends UserRightsBaseClass { $aRes = array($oObject->Get($sColumn)); } - + } elseif (($sExpr == '') || ($sExpr == '')) { $aRes = null; } elseif (strtolower(substr($sExpr, 0, 6)) == 'select') - { + { $sColumn = $this->Get('attribute'); // SELECT... $oValueSetDef = new ValueSetObjects($sExpr, $sColumn, array(), true /*allow all data*/); @@ -585,14 +585,14 @@ class UserRightsProjection extends UserRightsAddOnAPI $oContact->Set('org_id', $iOrgId); $oContact->Set('email', 'my.email@foo.org'); $iContactId = $oContact->DBInsertNoReload(); - + $oUser = new UserLocal(); $oUser->Set('login', $sAdminUser); $oUser->Set('password', $sAdminPwd); $oUser->Set('contactid', $iContactId); $oUser->Set('language', $sLanguage); // Language was chosen during the installation $iUserId = $oUser->DBInsertNoReload(); - + // Add this user to the very specific 'admin' profile $oUserProfile = new URP_UserProfile(); $oUserProfile->Set('userid', $iUserId); @@ -643,24 +643,24 @@ class UserRightsProjection extends UserRightsAddOnAPI // Could be loaded in a shared memory (?) $oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_Dimensions")); - $this->m_aDimensions = array(); + $this->m_aDimensions = array(); while ($oDimension = $oDimensionSet->Fetch()) { - $this->m_aDimensions[$oDimension->GetKey()] = $oDimension; + $this->m_aDimensions[$oDimension->GetKey()] = $oDimension; } - + $oClassProjSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_ClassProjection")); - $this->m_aClassProjs = array(); + $this->m_aClassProjs = array(); while ($oClassProj = $oClassProjSet->Fetch()) { - $this->m_aClassProjs[$oClassProj->Get('class')][$oClassProj->Get('dimensionid')] = $oClassProj; + $this->m_aClassProjs[$oClassProj->Get('class')][$oClassProj->Get('dimensionid')] = $oClassProj; } $oProfileSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_Profiles")); - $this->m_aProfiles = array(); + $this->m_aProfiles = array(); while ($oProfile = $oProfileSet->Fetch()) { - $this->m_aProfiles[$oProfile->GetKey()] = $oProfile; + $this->m_aProfiles[$oProfile->GetKey()] = $oProfile; } $oUserProfileSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_UserProfile")); @@ -676,10 +676,10 @@ class UserRightsProjection extends UserRightsAddOnAPI } $oProProSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_ProfileProjection")); - $this->m_aProPros = array(); + $this->m_aProPros = array(); while ($oProPro = $oProProSet->Fetch()) { - $this->m_aProPros[$oProPro->Get('profileid')][$oProPro->Get('dimensionid')] = $oProPro; + $this->m_aProPros[$oProPro->Get('profileid')][$oProPro->Get('dimensionid')] = $oProPro; } /* @@ -707,7 +707,7 @@ exit; // Authorize any for this dimension, then no additional criteria is required continue; } - + // 1 - Get class projection info // $oExpression = null; @@ -731,13 +731,13 @@ exit; } elseif (strtolower(substr($sExpr, 0, 6)) == 'select') { - throw new CoreException('Sorry, projections by the mean of OQL are not supported currently, please specify an attribute instead', array('class' => $sClass, 'expression' => $sExpr)); + throw new CoreException('Sorry, projections by the mean of OQL are not supported currently, please specify an attribute instead', array('class' => $sClass, 'expression' => $sExpr)); } else { // Constant value(s) // unsupported - throw new CoreException('Sorry, constant projections are not supported currently, please specify an attribute instead', array('class' => $sClass, 'expression' => $sExpr)); + throw new CoreException('Sorry, constant projections are not supported currently, please specify an attribute instead', array('class' => $sClass, 'expression' => $sExpr)); // $aRes = explode(';', trim($sExpr)); } @@ -866,7 +866,7 @@ exit; $this->m_aObjectActionGrants[$oUser->GetKey()][$sClass][$iObjectRef][$iActionCode] = $aRes; return $aRes; } - + public function IsActionAllowed($oUser, $sClass, $iActionCode, $oInstanceSet = null) { if (is_null($oInstanceSet)) @@ -934,7 +934,7 @@ exit; } else { - $iInstancePermission = UR_ALLOWED_NO; + $iInstancePermission = UR_ALLOWED_NO; } if (isset($iGlobalPermission)) @@ -1140,7 +1140,7 @@ exit; } protected $m_aMatchingProfiles = array(); // cache of the matching profiles for a given user/object - + protected function GetMatchingProfiles($oUser, $sClass, /*DBObject*/ $oObject = null) { $iUser = $oUser->GetKey(); @@ -1186,7 +1186,7 @@ exit; @$aProfileRes[$iProfile] += 1; } } - + $aRes = array(); $iDimCount = count($this->m_aDimensions); foreach ($aProfileRes as $iProfile => $iMatches) @@ -1200,7 +1200,7 @@ exit; // store into the cache $this->m_aMatchingProfiles[$iUser][$sClass][$iObjectRef] = $aRes; - return $aRes; + return $aRes; } public function FlushPrivileges() diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index e6eb02407..90f80489e 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -2247,6 +2247,49 @@ interface iModuleExtension public function __construct(); } +/** + * Interface to provide messages to be displayed in the "Welcome Popup" + * + * @api + * @private + * @since 3.1.0 + */ +interface iWelcomePopup +{ + // Importance for ordering messages + // Just two levels since less important messages have nothing to do in the welcome popup + const IMPORTANCE_CRITICAL = 0; + const IMPORTANCE_HIGH = 1; + /** + * @return [['importance' => IMPORTANCE_CRITICAL|IMPORTANCE_HIGH, 'id' => '...', 'title' => '', 'html' => '', 'twig' => '']] + */ + public function GetMessages(); + /** + * The message specified by the given Id has been acknowledged by the current user + * @param string $sMessageId + */ + public function AcknowledgeMessage(string $sMessageId): void; +} + +/** + * Inherit from this class to provide messages to be displayed in the "Welcome Popup" + * + * @api + * @since 3.1.0 + */ +abstract class AbstractWelcomePopup implements iWelcomePopup +{ + public function GetMessages() + { + return []; + } + public function AcknowledgeMessage(string $sMessageId): void + { + return; + } +} + + /** * KPI logging extensibility point * @@ -2254,19 +2297,19 @@ interface iModuleExtension */ interface iKPILoggerExtension { - /** - * Init the statistics collected - * - * @return void - */ - public function InitStats(); + /** + * Init the statistics collected + * + * @return void + */ + public function InitStats(); - /** - * Add a new KPI to the stats - * - * @param \Combodo\iTop\Core\Kpi\KpiLogData $oKpiLogData - * - * @return mixed - */ - public function LogOperation($oKpiLogData); -} \ No newline at end of file + /** + * Add a new KPI to the stats + * + * @param \Combodo\iTop\Core\Kpi\KpiLogData $oKpiLogData + * + * @return mixed + */ + public function LogOperation($oKpiLogData); +} diff --git a/application/datamodel.application.xml b/application/datamodel.application.xml index 765e3563a..8638e5ea5 100644 --- a/application/datamodel.application.xml +++ b/application/datamodel.application.xml @@ -40,6 +40,36 @@ + + DBObject + + /* Acknowledge welcome popup messages */ + false + + autoincrement + priv_welcome_popup_acknowledge + + + + message_uuid + + false + + + user_id + User + false + DEL_SILENT + + + acknowledge_date + + false + + + + + diff --git a/application/menunode.class.inc.php b/application/menunode.class.inc.php index d76616e6e..0b081e2da 100644 --- a/application/menunode.class.inc.php +++ b/application/menunode.class.inc.php @@ -9,6 +9,7 @@ use Combodo\iTop\Application\Helper\WebResourcesHelper; require_once(APPROOT.'/application/utils.inc.php'); require_once(APPROOT.'/application/template.class.inc.php'); require_once(APPROOT."/application/user.dashboard.class.inc.php"); +require_once(APPROOT."/setup/parentmenunodecompiler.class.inc.php"); /** @@ -103,7 +104,7 @@ class ApplicationMenu { self::$sFavoriteSiloQuery = $sOQL; } - + /** * Get the query used to limit the list of displayed organizations in the drop-down menu * @return string The OQL query returning a list of Organization objects @@ -273,12 +274,23 @@ class ApplicationMenu continue; } + $aSubMenuNodes = static::GetSubMenuNodes($sMenuGroupIdx, $aExtraParams); + if (! ParentMenuNodeCompiler::$bUseLegacyMenuCompilation && !($oMenuNode instanceof ShortcutMenuNode)){ + if (is_array($aSubMenuNodes) && 0 === sizeof($aSubMenuNodes)){ + IssueLog::Error('Empty menu node not displayed', LogChannels::CONSOLE, [ + 'menu_node_class' => get_class($oMenuNode), + 'menu_node_label' => $oMenuNode->GetLabel(), + ]); + continue; + } + } + $aMenuGroups[] = [ 'sId' => $oMenuNode->GetMenuID(), 'sIconCssClasses' => $oMenuNode->GetDecorationClasses(), 'sInitials' => $oMenuNode->GetInitials(), 'sTitle' => $oMenuNode->GetTitle(), - 'aSubMenuNodes' => static::GetSubMenuNodes($sMenuGroupIdx, $aExtraParams), + 'aSubMenuNodes' => $aSubMenuNodes, ]; } @@ -536,7 +548,7 @@ EOF return -1; } - + /** * Retrieves the currently active menu (if any, otherwise the first menu is the default) * @return string The Id of the currently active menu @@ -544,7 +556,7 @@ EOF public static function GetActiveNodeId() { $oAppContext = new ApplicationContext(); - $sMenuId = $oAppContext->GetCurrentValue('menu', null); + $sMenuId = $oAppContext->GetCurrentValue('menu', null); if ($sMenuId === null) { $sMenuId = self::GetDefaultMenuId(); @@ -654,7 +666,7 @@ abstract class MenuNode /** * Stimulus to check: if the user can 'apply' this stimulus, then she/he can see this menu - */ + */ protected $m_aEnableStimuli; /** @@ -814,7 +826,7 @@ abstract class MenuNode { return false; } - + /** * Add a limiting display condition for the same menu node. The conditions will be combined with a AND * @param $oMenuNode MenuNode Another definition of the same menu node, with potentially different access restriction @@ -987,7 +999,7 @@ class TemplateMenuNode extends MenuNode * @var string */ protected $sTemplateFile; - + /** * Create a menu item based on a custom template and inserts it into the application's main menu * @param string $sMenuId Unique identifier of the menu (used to identify the menu for bookmarking, and for getting the labels from the dictionary) @@ -1058,7 +1070,7 @@ class OQLMenuNode extends MenuNode * @var bool|null */ protected $bSearchFormOpen; - + /** * Extra parameters to be passed to the display block to fine tune its appearence */ @@ -1091,7 +1103,7 @@ class OQLMenuNode extends MenuNode // Enhancement: we could set as the "enable" condition that the user has enough rights to "read" the objects // of the class specified by the OQL... } - + /** * Set some extra parameters to be passed to the display block to fine tune its appearence * @param array $aParams paramCode => value. See DisplayBlock::GetDisplay for the meaning of the parameters @@ -1120,7 +1132,7 @@ class OQLMenuNode extends MenuNode 'Menu_'.$this->GetMenuId(), $this->bSearch, // Search pane $this->bSearchFormOpen, // Search open - $oPage, + $oPage, array_merge($this->m_aParams, $aExtraParams), true ); @@ -1354,10 +1366,10 @@ class NewObjectMenuNode extends MenuNode { // Enable this menu, only if the current user has enough rights to create such an object, or an object of // any child class - + $aSubClasses = MetaModel::EnumChildClasses($this->sClass, ENUM_CHILD_CLASSES_ALL); // Including the specified class itself $bActionIsAllowed = false; - + foreach($aSubClasses as $sCandidateClass) { if (!MetaModel::IsAbstract($sCandidateClass) && (UserRights::IsActionAllowed($sCandidateClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES)) @@ -1366,7 +1378,7 @@ class NewObjectMenuNode extends MenuNode break; // Enough for now } } - return $bActionIsAllowed; + return $bActionIsAllowed; } /** @@ -1508,7 +1520,7 @@ class DashboardMenuNode extends MenuNode throw new Exception("Error: failed to load dashboard file: '{$this->sDashboardFile}'"); } } - + } /** @@ -1549,7 +1561,7 @@ class ShortcutContainerMenuNode extends MenuNode $sName = $this->GetMenuId().'_'.$oShortcut->GetKey(); new ShortcutMenuNode($sName, $oShortcut, $this->GetIndex(), $fRank++); } - + // Complete the tree // parent::PopulateChildMenus(); diff --git a/application/templates/welcome_popup.html b/application/templates/welcome_popup.html deleted file mode 100644 index 6f6397db5..000000000 --- a/application/templates/welcome_popup.html +++ /dev/null @@ -1,29 +0,0 @@ -
- -

-

-

UI:WelcomeMenu:Title

-

- - - - - -
-UI:WelcomeMenu:LeftBlock - -UI:WelcomeMenu:RightBlock -
-
diff --git a/core/cmdbsource.class.inc.php b/core/cmdbsource.class.inc.php index e05d4e94a..5feb077ba 100644 --- a/core/cmdbsource.class.inc.php +++ b/core/cmdbsource.class.inc.php @@ -3,7 +3,7 @@ // // This file is part of iTop. // -// iTop is free software; you can redistribute it and/or modify +// iTop is free software; you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. @@ -380,7 +380,7 @@ class CMDBSource public static function GetDBVendor() { $sDBVendor = static::ENUM_DB_VENDOR_MYSQL; - + $sVersionComment = static::GetServerVariable('version') . ' - ' . static::GetServerVariable('version_comment'); if(preg_match('/mariadb/i', $sVersionComment) === 1) { @@ -390,7 +390,7 @@ class CMDBSource { $sDBVendor = static::ENUM_DB_VENDOR_PERCONA; } - + return $sDBVendor; } @@ -934,7 +934,7 @@ class CMDBSource { throw new MySQLException('Failed to issue SQL query', array('query' => $sSql)); } - + while ($aRow = $oResult->fetch_array($iMode)) { $aData[] = $aRow; @@ -1088,7 +1088,7 @@ class CMDBSource if (!array_key_exists($iKey, $aTableInfo["Fields"])) return false; $aFieldData = $aTableInfo["Fields"][$iKey]; if (!array_key_exists("Key", $aFieldData)) return false; - return ($aFieldData["Key"] == "PRI"); + return ($aFieldData["Key"] == "PRI"); } public static function IsAutoIncrement($sTable, $sField) @@ -1099,7 +1099,7 @@ class CMDBSource $aFieldData = $aTableInfo["Fields"][$sField]; if (!array_key_exists("Extra", $aFieldData)) return false; //MyHelpers::debug_breakpoint($aFieldData); - return (strstr($aFieldData["Extra"], "auto_increment")); + return (strstr($aFieldData["Extra"], "auto_increment")); } public static function IsField($sTable, $sField) @@ -1366,13 +1366,13 @@ class CMDBSource public static function GetTableFieldsList($sTable) { assert(!empty($sTable)); - + $aTableInfo = self::GetTableInfo($sTable); if (empty($aTableInfo)) return array(); // #@# or an error ? return array_keys($aTableInfo["Fields"]); } - + // Cache the information about existing tables, and their fields private static $m_aTablesInfo = array(); private static function _TablesInfoCacheReset($sTableName = null) @@ -1505,7 +1505,7 @@ class CMDBSource { throw new MySQLException('Failed to issue SQL query', array('query' => $sSql)); } - + $aRows = array(); while ($aRow = $oResult->fetch_array(MYSQLI_ASSOC)) { @@ -1514,7 +1514,7 @@ class CMDBSource $oResult->free(); return $aRows; } - + /** * Returns the value of the specified server variable * @param string $sVarName Name of the server variable @@ -1530,7 +1530,7 @@ class CMDBSource /** * Returns the privileges of the current user * @return string privileges in a raw format - */ + */ public static function GetRawPrivileges() { try @@ -1556,8 +1556,8 @@ class CMDBSource /** * Determine the slave status of the server - * @return bool true if the server is slave - */ + * @return bool true if the server is slave + */ public static function IsSlaveServer() { try diff --git a/core/config.class.inc.php b/core/config.class.inc.php index f23e80e2a..db78a8aa8 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -1353,6 +1353,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'navigation_menu.sorted_popup_user_menu_items' => [ + 'type' => 'array', + 'description' => 'Sort user menu items after setup on page load', + 'default' => [], + 'value' => false, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'quick_create.enabled' => [ 'type' => 'bool', 'description' => 'Whether or not the quick create is enabled', @@ -1635,6 +1643,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'security.single_profile_completion' => [ + 'type' => 'array', + 'description' => 'Non standalone profiles can be completed by other profiles via this configuration. default configuration is equivalent to [\'Portal power user\' => \'Portal user\'] configuration. unless you have specific portal customization.', + 'default' => null, + 'value' => false, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'behind_reverse_proxy' => [ 'type' => 'bool', 'description' => 'If true, then proxies custom header (X-Forwarded-*) are taken into account. Use only if the webserver is not publicly accessible (reachable only by the reverse proxy)', diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 9673f79d1..9764d2598 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -57,7 +57,7 @@ require_once('mutex.class.inc.php'); /** - * A persistent object, as defined by the metamodel + * A persistent object, as defined by the metamodel * * @package iTopORM * @api @@ -299,9 +299,9 @@ abstract class DBObject implements iDisplay /** * Whether the object is already persisted in DB or not. - * + * * @api - * + * * @return bool */ public function IsNew() @@ -311,9 +311,9 @@ abstract class DBObject implements iDisplay /** * Returns an Id for memory objects - * + * * @internal - * + * * @param string $sClass * * @return int @@ -350,7 +350,7 @@ abstract class DBObject implements iDisplay $sRet .= "$sClass::$iPKey ($sFriendlyname)
\n"; return $sRet; } - + /** * Alias of DBObject::Reload() * @@ -373,7 +373,7 @@ abstract class DBObject implements iDisplay * * @internal * @see m_bFullyLoaded - * + * * @return bool * @throws CoreException */ @@ -496,7 +496,7 @@ abstract class DBObject implements iDisplay { $aAttList = $aAttToLoad[$sClassAlias]; } - + foreach($aAttList as $sAttCode=>$oAttDef) { // Skip links (could not be loaded by the mean of this query) @@ -556,7 +556,7 @@ abstract class DBObject implements iDisplay $bFullyLoaded = false; } } - + // Load extended data if ($aExtendedDataSpec != null) { @@ -580,7 +580,7 @@ abstract class DBObject implements iDisplay * * @internal * @see Set() - * + * * @param string $sAttCode * @param mixed $value */ @@ -785,11 +785,11 @@ abstract class DBObject implements iDisplay /** * Get the label of an attribute. - * + * * Shortcut to the field's AttributeDefinition->GetLabel() * * @api - * + * * @param string $sAttCode * * @return string @@ -862,7 +862,7 @@ abstract class DBObject implements iDisplay * * @internal * @see Get - * + * * @param string $sAttCode * * @return int|mixed|null @@ -967,7 +967,7 @@ abstract class DBObject implements iDisplay * Returns the default value of the $sAttCode. * * Returns the default value of the given attribute. - * + * * @internal * * @param string $sAttCode @@ -988,12 +988,12 @@ abstract class DBObject implements iDisplay * @internal * * @return array|null - */ + */ public function GetExtendedData() { return $this->m_aExtendedData; } - + /** * Set the HighlightCode * @@ -1015,7 +1015,7 @@ abstract class DBObject implements iDisplay { $fCurrentRank = $aHighlightScale[$this->m_sHighlightCode]['rank']; } - + if (array_key_exists($sCode, $aHighlightScale)) { $fRank = $aHighlightScale[$sCode]['rank']; @@ -1025,13 +1025,13 @@ abstract class DBObject implements iDisplay } } } - + /** * Get the current HighlightCode - * + * * @internal * @used-by DBObject::ComputeHighlightCode() - * + * * @return string|null The Hightlight code (null if none set, meaning rank = 0) */ protected function GetHighlightCode() @@ -1080,7 +1080,7 @@ abstract class DBObject implements iDisplay * corresponding to the external key and getting the value from it * * UNUSED ? - * + * * @internal * @todo: check if this is dead code. * @@ -1151,7 +1151,7 @@ abstract class DBObject implements iDisplay /** * @api - * + * * @param string $sAttCode * @param bool $bLocalize * @@ -1197,11 +1197,11 @@ abstract class DBObject implements iDisplay /** * Get the value as it must be in the edit areas (forms) - * + * * Makes a raw text representation of the value. * * @internal - * + * * @param string $sAttCode * * @return int|mixed|string @@ -1231,7 +1231,7 @@ abstract class DBObject implements iDisplay else { $sEditValue = 0; - } + } } else { @@ -1247,14 +1247,14 @@ abstract class DBObject implements iDisplay /** * Get $sAttCode formatted as XML - * + * * The returned value is a text that is suitable for insertion into an XML node. * Depending on the type of attribute, the returned text is either: * * A literal, with XML entities already escaped, * * XML * * @api - * + * * @param string $sAttCode * @param bool $bLocalize * @@ -1292,10 +1292,10 @@ abstract class DBObject implements iDisplay } /** - * + * * @see GetAsHTML() * @see GetOriginal() - * + * * @param string $sAttCode * @param bool $bLocalize * @@ -1470,7 +1470,7 @@ abstract class DBObject implements iDisplay /** * @internal - * + * * @param string $sClass * * @return mixed @@ -1525,7 +1525,7 @@ abstract class DBObject implements iDisplay * Get the id * * @api - * + * * @return string|null */ public function GetKey() @@ -1536,7 +1536,7 @@ abstract class DBObject implements iDisplay /** * Primary key Setter * Usable only for not yet persisted DBObjects - * + * * @internal * * @param int $iNewKey the desired identifier @@ -1549,7 +1549,7 @@ abstract class DBObject implements iDisplay { throw new CoreException("An object id must be an integer value ($iNewKey)"); } - + if ($this->m_bIsInDB && !empty($this->m_iKey) && ($this->m_iKey != $iNewKey)) { throw new CoreException("Changing the key ({$this->m_iKey} to $iNewKey) on an object (class {".get_class($this).") wich already exists in the Database"); @@ -1559,7 +1559,7 @@ abstract class DBObject implements iDisplay /** * Get the icon representing this object - * + * * @api * * @param boolean $bImgTag If true the result is a full IMG tag (or an empty string if no icon is defined) @@ -1649,7 +1649,7 @@ abstract class DBObject implements iDisplay * * Returns the label as defined in the dictionary for the language of the current user * - * @api + * @api * * @return string (empty for default name scheme) */ @@ -1716,7 +1716,7 @@ abstract class DBObject implements iDisplay /** * Helper to get the state - * + * * @api * * @return mixed|string '' if no state attribute, object representing its value otherwise @@ -1738,9 +1738,9 @@ abstract class DBObject implements iDisplay /** * Get the label (raw text) of the current state * helper for MetaModel::GetStateLabel() - * + * * @api - * + * * @return mixed|string * * @throws ArchivedObjectException @@ -1787,7 +1787,7 @@ abstract class DBObject implements iDisplay * Define attributes read-only from the end-user perspective * * @return array|null List of attcodes - */ + */ public static function GetReadOnlyAttributes() { return null; @@ -1796,14 +1796,14 @@ abstract class DBObject implements iDisplay /** * Get predefined objects - * + * * The predefined objects will be synchronized with the DB at each install/upgrade * As soon as a class has predefined objects, then nobody can create nor delete objects * * @internal * * @return array An array of id => array of attcode => php value(so-called "real value": integer, string, ormDocument, DBObjectSet, etc.) - */ + */ public static function GetPredefinedObjects() { return null; @@ -1932,7 +1932,7 @@ abstract class DBObject implements iDisplay * Note: Attributes (and flags) from the target state and the transition are combined. * * @internal - * + * * @param string $sStimulus * @param string $sOriginState Default is current state * @@ -2139,7 +2139,7 @@ abstract class DBObject implements iDisplay /** * @internal - * + * * @throws \CoreException * @throws \OQLException * @@ -2511,7 +2511,7 @@ abstract class DBObject implements iDisplay * * an array of displayable error is added in {@see DBObject::$m_aDeleteIssues} * - * @internal + * @internal * * @param \DeletionPlan $oDeletionPlan * @@ -2628,7 +2628,7 @@ abstract class DBObject implements iDisplay { // The value is a scalar, the comparison must be 100% strict if($this->m_aOrigValues[$sAtt] !== $proposedValue) - { + { //echo "$sAtt:
\n";
 					//var_dump($this->m_aOrigValues[$sAtt]);
 					//var_dump($proposedValue);
@@ -2750,7 +2750,7 @@ abstract class DBObject implements iDisplay
 
 	/**
 	 * Used only by insert, Meant to be overloaded
-     * 
+     *
      * @overwritable-hook You can extend this method in order to provide your own logic.
 	 */
 	protected function OnObjectKeyReady()
@@ -2858,7 +2858,7 @@ abstract class DBObject implements iDisplay
 		// fields in first array, values in the second
 		$aFieldsToWrite = array();
 		$aValuesToWrite = array();
-		
+
 		if (!empty($this->m_iKey) && ($this->m_iKey >= 0))
 		{
 			// Add it to the list of fields to write
@@ -2867,7 +2867,7 @@ abstract class DBObject implements iDisplay
 		}
 
 		$aHierarchicalKeys = array();
-		
+
 		foreach(MetaModel::ListAttributeDefs($sTableClass) as $sAttCode=>$oAttDef) {
 			// Skip this attribute if not defined in this table
 			if ((!MetaModel::IsAttributeOrigin($sTableClass, $sAttCode) && !$oAttDef->CopyOnAllTables())
@@ -2877,7 +2877,7 @@ abstract class DBObject implements iDisplay
 			$aAttColumns = $oAttDef->GetSQLValues($this->m_aCurrValues[$sAttCode]);
 			foreach($aAttColumns as $sColumn => $sValue)
 			{
-				$aFieldsToWrite[] = "`$sColumn`"; 
+				$aFieldsToWrite[] = "`$sColumn`";
 				$aValuesToWrite[] = CMDBSource::Quote($sValue);
 			}
 			if ($oAttDef->IsHierarchicalKey())
@@ -2901,7 +2901,7 @@ abstract class DBObject implements iDisplay
 					self::$m_aBulkInsertCols[$sClass][$sTable] = implode(', ', $aFieldsToWrite);
 				}
 				self::$m_aBulkInsertItems[$sClass][$sTable][] = '('.implode (', ', $aValuesToWrite).')';
-				
+
 				$iNewKey = 999999; // TODO - compute next id....
 			}
 			else
@@ -2986,7 +2986,7 @@ abstract class DBObject implements iDisplay
 		// fields in first array, values in the second
 		$aFieldsToWrite = array();
 		$aValuesToWrite = array();
-		
+
 		if (!empty($this->m_iKey) && ($this->m_iKey >= 0))
 		{
 			// Add it to the list of fields to write
@@ -3021,7 +3021,7 @@ abstract class DBObject implements iDisplay
 			$aAttColumns = $oAttDef->GetSQLValues($value);
 			foreach($aAttColumns as $sColumn => $sValue)
 			{
-				$aFieldsToWrite[] = "`$sColumn`"; 
+				$aFieldsToWrite[] = "`$sColumn`";
 				$aValuesToWrite[] = CMDBSource::Quote($sValue);
 			}
 			if ($oAttDef->IsHierarchicalKey())
@@ -3161,6 +3161,10 @@ abstract class DBObject implements iDisplay
 					// First query built upon on the root class, because the ID must be created first
 					$this->m_iKey = $this->DBInsertSingleTable($sRootClass);
 
+					//since N°5324: issue with test and db links events
+					$this->SetReadOnly('No modification allowed during transaction');
+					MetaModel::StartReentranceProtection($this);
+
 					// Then do the leaf class, if different from the root class
 					if ($sClass != $sRootClass) {
 						$this->DBInsertSingleTable($sClass);
@@ -3212,6 +3216,7 @@ abstract class DBObject implements iDisplay
 				}
 			}
 
+			$this->SetReadWrite();
 			$this->m_bIsInDB = true;
 			$this->m_bDirty = false;
 			foreach ($this->m_aCurrValues as $sAttCode => $value) {
@@ -3222,7 +3227,7 @@ abstract class DBObject implements iDisplay
 			}
 
 			// Prevent DBUpdate at this point (reentrance protection)
-			MetaModel::StartReentranceProtection($this);
+			//MetaModel::StartReentranceProtection($this);
 
 			try {
 				$this->PostInsertActions();
@@ -3301,7 +3306,7 @@ abstract class DBObject implements iDisplay
 		$this->RecordObjCreation();
 		return $ret;
 	}
-	
+
 	/**
 	 * This function is automatically called after cloning an object with the "clone" PHP language construct
 	 * The purpose of this method is to reset the appropriate attributes of the object in
@@ -3392,6 +3397,7 @@ abstract class DBObject implements iDisplay
 					}
 				}
 
+				$this->SetReadOnly('No modification allowed during transaction');
 				$iTransactionRetry = 1;
 				$bIsTransactionEnabled = MetaModel::GetConfig()->Get('db_core_transactions_enabled');
 				if ($bIsTransactionEnabled) {
@@ -3506,6 +3512,8 @@ abstract class DBObject implements iDisplay
 				// following lines are resetting changes (so after this {@see DBObject::ListChanges()} won't return changes anymore)
 				// new values are already in the object (call {@see DBObject::Get()} to get them)
 				// call {@see DBObject::ListPreviousValuesForUpdatedAttributes()} to get changed fields and previous values
+
+				$this->SetReadWrite();
 				$this->m_bDirty = false;
 				$this->m_aTouchedAtt = array();
 				$this->m_aModifiedAtt = array();
@@ -3925,7 +3933,7 @@ abstract class DBObject implements iDisplay
      * First, checks if the object can be deleted regarding database integrity.
      * If the answer is yes, it performs any required cleanup (delete other objects or reset external keys) in addition to the object
      * deletion.
-     * 
+     *
      * @api
      *
      * @param \DeletionPlan $oDeletionPlan Do not use: aims at dealing with recursion
@@ -4348,7 +4356,7 @@ abstract class DBObject implements iDisplay
      *
      * @api
      *
-	 */	 	
+	 */
 	public function Reset($sAttCode)
 	{
 		$this->Set($sAttCode, $this->GetDefaultValue($sAttCode));
@@ -4360,7 +4368,7 @@ abstract class DBObject implements iDisplay
      * Suitable for use as a lifecycle action
      *
      * @api
-	 */	 	
+	 */
 	public function Copy($sDestAttCode, $sSourceAttCode)
 	{
 		$oTypeValueToCopy = MetaModel::GetAttributeDef(get_class($this), $sSourceAttCode);
@@ -4690,7 +4698,7 @@ abstract class DBObject implements iDisplay
 			{
 				throw new CoreException("Unknown attribute '$sExtKeyAttCode' for the class ".get_class($this));
 			}
-			
+
 			$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode);
 			if (!$oKeyAttDef instanceof AttributeExternalKey)
 			{
@@ -4708,14 +4716,14 @@ abstract class DBObject implements iDisplay
 				$ret  = $oRemoteObj->GetForTemplate($sRemoteAttCode);
 			}
 		}
-		else 
+		else
 		{
 			switch($sPlaceholderAttCode)
 			{
 				case 'id':
 				$ret = $this->GetKey();
 				break;
-				
+
 				case 'name()':
 				$ret = $this->GetName();
 				break;
@@ -4902,7 +4910,7 @@ abstract class DBObject implements iDisplay
 		if ($oOwner)
 		{
 			$sLinkSetOwnerClass = get_class($oOwner);
-			
+
 			$oMyChangeOp = MetaModel::NewObject($sChangeOpClass);
 			$oMyChangeOp->Set("objclass", $sLinkSetOwnerClass);
 			$oMyChangeOp->Set("objkey", $iLinkSetOwnerId);
@@ -4929,7 +4937,7 @@ abstract class DBObject implements iDisplay
 		{
 			/** @var \AttributeLinkedSet $oLinkSet */
 			if (($oLinkSet->GetTrackingLevel() & LINKSET_TRACKING_LIST) == 0) continue;
-			
+
 			$iLinkSetOwnerId  = $this->Get($sExtKeyAttCode);
 			$oMyChangeOp = $this->PrepareChangeOpLinkSet($iLinkSetOwnerId, $oLinkSet, 'CMDBChangeOpSetAttributeLinksAddRemove');
 			if ($oMyChangeOp)
@@ -4999,7 +5007,7 @@ abstract class DBObject implements iDisplay
 				// Keep track of link changes
 				//
 				if (($oLinkSet->GetTrackingLevel() & LINKSET_TRACKING_DETAILS) == 0) continue;
-				
+
 				$iLinkSetOwnerId  = $this->Get($sExtKeyAttCode);
 				$oMyChangeOp = $this->PrepareChangeOpLinkSet($iLinkSetOwnerId, $oLinkSet, 'CMDBChangeOpSetAttributeLinksTune');
 				if ($oMyChangeOp)
@@ -5148,7 +5156,7 @@ abstract class DBObject implements iDisplay
 		$this->FireEventCheckToDelete($oDeletionPlan);
 		$this->DoCheckToDelete($oDeletionPlan);
 		$oDeletionPlan->SetDeletionIssues($this, $this->m_aDeleteIssues, $this->m_bSecurityIssue);
-	
+
 		$aDependentObjects = $this->GetReferencingObjects(true /* allow all data */);
 
 		// Getting and setting time limit are not symmetric:
@@ -5330,7 +5338,7 @@ abstract class DBObject implements iDisplay
 				$aSynchroClasses[] = $sTarget;
 			}
 		}
-		
+
 		foreach($aSynchroClasses as $sClass)
 		{
 			if ($this instanceof $sClass)
diff --git a/core/metamodel.class.php b/core/metamodel.class.php
index 7b7143a42..9f4f5ac62 100644
--- a/core/metamodel.class.php
+++ b/core/metamodel.class.php
@@ -1241,7 +1241,7 @@ abstract class MetaModel
 			}
 			$sTable = self::DBGetTable($sClass);
 
-			// Could be completed later with all the classes that are using a given table 
+			// Could be completed later with all the classes that are using a given table
 			if (!array_key_exists($sTable, $aTables)) {
 				$aTables[$sTable] = array();
 			}
@@ -3522,7 +3522,7 @@ abstract class MetaModel
 		}
 
 		// Set the "host class" as soon as possible, since HierarchicalKeys use it for their 'target class' as well
-		// and this needs to be know early (for Init_IsKnowClass 19 lines below)		
+		// and this needs to be know early (for Init_IsKnowClass 19 lines below)
 		$oAtt->SetHostClass($sTargetClass);
 
 		// Some attributes could refer to a class
@@ -3564,7 +3564,7 @@ abstract class MetaModel
 
 		self::$m_aAttribDefs[$sTargetClass][$oAtt->GetCode()] = $oAtt;
 		self::$m_aAttribOrigins[$sTargetClass][$oAtt->GetCode()] = $sTargetClass;
-		// Note: it looks redundant to put targetclass there, but a mix occurs when inheritance is used		
+		// Note: it looks redundant to put targetclass there, but a mix occurs when inheritance is used
 	}
 
 	/**
@@ -3764,7 +3764,7 @@ abstract class MetaModel
 		self::$m_aStimuli[$sTargetClass][$oStimulus->GetCode()] = $oStimulus;
 
 		// I wanted to simplify the syntax of the declaration of objects in the biz model
-		// Therefore, the reference to the host class is set there 
+		// Therefore, the reference to the host class is set there
 		$oStimulus->SetHostClass($sTargetClass);
 	}
 
@@ -6479,7 +6479,7 @@ abstract class MetaModel
 				$aCache['m_aExtensionClassNames'] = self::$m_aExtensionClassNames;
 				$aCache['m_Category2Class'] = self::$m_Category2Class;
 				$aCache['m_aRootClasses'] = self::$m_aRootClasses; // array of "classname" => "rootclass"
-				$aCache['m_aParentClasses'] = self::$m_aParentClasses; // array of ("classname" => array of "parentclass") 
+				$aCache['m_aParentClasses'] = self::$m_aParentClasses; // array of ("classname" => array of "parentclass")
 				$aCache['m_aChildClasses'] = self::$m_aChildClasses; // array of ("classname" => array of "childclass")
 				$aCache['m_aClassParams'] = self::$m_aClassParams; // array of ("classname" => array of class information)
 				$aCache['m_aAttribDefs'] = self::$m_aAttribDefs; // array of ("classname" => array of attributes)
@@ -7586,6 +7586,20 @@ abstract class MetaModel
 		return false;
 	}
 
+	/**
+	 * @since 3.1.0 N°5324: to ease reentrance checks when using events on links (to avoid reentering if main link object ongoing operation)
+	 */
+	public static function GetReentranceObjectByChildClass(string $sParentClass, $sKey)
+	{
+		foreach (self::EnumChildClasses($sParentClass, ENUM_CHILD_CLASSES_ALL, false) as $sChildClass){
+			if (self::GetReentranceObject($sChildClass, $sKey)){
+				return true;
+			}
+		}
+
+		return false;
+	}
+
 	/**
 	 * @param \DBObject $oObject
 	 *
diff --git a/css/backoffice/pages/_csv-import.scss b/css/backoffice/pages/_csv-import.scss
index 55a24b2e7..cf0857221 100644
--- a/css/backoffice/pages/_csv-import.scss
+++ b/css/backoffice/pages/_csv-import.scss
@@ -51,4 +51,4 @@ tr.ibo-csv-import--row-added td {
   font-size: $ibo-csv-import--download-file--font-size;
   color: $ibo-csv-import--download-file--color;
   margin: $ibo-csv-import--download-file--margin;
-}
\ No newline at end of file
+}
diff --git a/css/backoffice/pages/_welcome-popup.scss b/css/backoffice/pages/_welcome-popup.scss
index 17326749a..3bacb4e9c 100644
--- a/css/backoffice/pages/_welcome-popup.scss
+++ b/css/backoffice/pages/_welcome-popup.scss
@@ -17,7 +17,9 @@ $ibo-welcome-popup--text--options--bottom: 10px !default;
 
 #welcome_popup{
   display: flex;
-  
+}
+.ibo-welcome-popup--columns{
+	display: flex;
 }
 .ibo-welcome-popup--image{
   display: flex;
@@ -44,7 +46,39 @@ $ibo-welcome-popup--text--options--bottom: 10px !default;
     }
   }
 }
-.ibo-welcome-popup--text--options{
-  position: absolute;
-  bottom: $ibo-welcome-popup--text--options--bottom;
+.ibo-welcome-popup--dialog {
+	width: 60rem;
+}
+.ibo-welcome-popup--content {
+	width: 100%; 
+	.ibo-welcome-popup--message {
+		width: 100%;
+		min-height: 12rem;
+	}
+	.ibo-welcome-popup--button {
+		width: 100%;
+		text-align: center;
+		padding-top: 1rem;
+		position: absolute;
+		bottom: 4.5rem;
+	}
+}
+.ibo-welcome-popup--indicators {
+	width: 100%;
+	display: block;
+	text-align: center;
+	padding-top: 1.5rem;
+	padding-bottom: 0;
+	height: 3rem;
+	.ibo-welcome-popup--indicator {
+		width: 1rem;
+		height: 1rem;
+		border-radius: 0.5rem;
+		background-color: $ibo-color-secondary-600;
+		display: inline-block;
+		cursor: pointer;
+	}
+	.ibo-welcome-popup--active {
+		background-color: $ibo-color-information-600 !important;
+	}
 }
\ No newline at end of file
diff --git a/datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css b/datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css
new file mode 100644
index 000000000..a45e0c648
--- /dev/null
+++ b/datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css
@@ -0,0 +1,12 @@
+/*
+=== SIGNATURE BEGIN ===
+{"variables":"d751713988987e9331980363e24189ce","stylesheets":{"fullmoon":"18b8c59bb2be4f8490ead6fd6465aa95","editor":"811370f12f8f3db4d7569b699761c696","datamodel-compiled-scss-rules":"3fc3340989950a881b64934384d4a71e"},"variable_imports":{"nord-scss-variables":"de08012c8304a1097b2a6e44280b5086","darkmoon-scss-variables":"4cfc12fee531e33c596113525e74e3a5"},"images":{"images\/full-screen.png":"b541fadd3f1563856a4b44aeebd9d563","images\/tv-item.gif":"719fe2d4566108e73162fb8868d3778c","images\/tv-collapsable.gif":"63a3351ea0d580797c9b8c386aa4f48b","images\/tv-expandable.gif":"a2d1af4128e4a798a7f3390b12a28574","images\/tv-item-last.gif":"2ae7e1d9972ce71e5caa65a086bc5b7e","images\/tv-collapsable-last.gif":"71acaa9d7c2616e9e8b7131a75ca65da","images\/tv-expandable-last.gif":"9d51036b3a8102742709da66789fd0f7","images\/tv-folder.gif":"9f41e1454905fd7416f89aa4380a65e1","images\/tv-file.gif":"9ab0e28d85d8ab5eb954fc28f6ac1e80"},"utility_imports":{"..\/css\/backoffice\/utils\/_all.scss":"4ad9e64e998b8702c6f4ec0550d8d6c2","..\/css\/backoffice\/utils\/variables\/_all.scss":"b62e15ec99ea8c5d887ab5d2d4c48073","..\/css\/backoffice\/utils\/variables\/colors\/_all.scss":"6f1ae96aa486f919f8c5d650c4be2b35","..\/css\/backoffice\/utils\/variables\/colors\/_base.scss":"56c34d3585027c646ec372b4190a1a7f","..\/css\/backoffice\/utils\/variables\/colors\/_base-palette.scss":"3e6de1e802252954559ba47b327bc309","..\/css\/backoffice\/utils\/variables\/colors\/_semantic-palette.scss":"a0ab2becf07b9006246b4b7a3da56d4b","..\/css\/backoffice\/utils\/variables\/colors\/_lifecycle-palette.scss":"edbdd28bc92158002a11811a80fd5d84","..\/css\/backoffice\/utils\/variables\/_border-radius.scss":"67b8bb1a9ab917c8c09439d384216db4","..\/css\/backoffice\/utils\/variables\/_depression.scss":"c2280a7253b0993f3ab7b56498db654a","..\/css\/backoffice\/utils\/variables\/_elevation.scss":"46f2c32b1749b900872f544230371a2b","..\/css\/backoffice\/utils\/variables\/_path.scss":"9b6885881e7c4a3e3a00c2ed0c133cdf","..\/css\/backoffice\/utils\/variables\/_size.scss":"dbf6f836c5e9c66321887d266bb0f308","..\/css\/backoffice\/utils\/variables\/_spacing.scss":"28eb94c65f05e69b46142aa449acf402","..\/css\/backoffice\/utils\/variables\/_typography.scss":"d30240b6ae58d7485fbbdcfe5dc6ce8c","..\/css\/backoffice\/utils\/variables\/_base.scss":"d1fab58362b8bcfdf27ccc82fa6cc5d4","..\/css\/backoffice\/utils\/functions\/_all.scss":"98ab57d45bb4dab9d71a86bb9fb2fdad","..\/css\/backoffice\/utils\/functions\/_color.scss":"64d9a49df5587f3ebb3beccbebea2368","..\/css\/backoffice\/utils\/mixins\/_all.scss":"e7d77b97c6a069bc0b09b74517fcc5f6","..\/css\/backoffice\/utils\/helpers\/_all.scss":"082454639198198654edf0f941389c9c","..\/css\/backoffice\/utils\/helpers\/_border-radius.scss":"6a26fe83af24b025047e90d2e6fe7507","..\/css\/backoffice\/utils\/helpers\/_color.scss":"3c8bc772ab4bf802f6e59acbc3272d55","..\/css\/backoffice\/utils\/helpers\/_depression.scss":"0ea78b619fb6bc167a159d577d9c53e3","..\/css\/backoffice\/utils\/helpers\/_elevation.scss":"d393fa35752e05fb9c4fc2237bebbc8e","..\/css\/backoffice\/utils\/helpers\/_font-icon.scss":"40f9bdd2aa1761522d507a425e11a649","..\/css\/backoffice\/utils\/helpers\/_typography.scss":"9f29681d56f707b85b55cd478dc0e4b9","..\/css\/backoffice\/utils\/helpers\/_misc.scss":"20ac307d1314439dd023e70d304f4447","..\/css\/backoffice\/utils\/helpers\/_class-icon.scss":"144e7fbf08196a3c46b6f3d9846cff0a","..\/css\/backoffice\/vendors\/_all.scss":"0979c290741138f5afdee1151dbf6d77","..\/css\/backoffice\/vendors\/_bulma-variables-overload.scss":"03e154b0aa3bc15c30055c295643dfca","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_all.scss":"e374bc4ffb043b458d29e319b37fec03","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_initial-variables.scss":"527552844220a961a10b9af7b75add8b","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_functions.scss":"b39215085d7b424be74e05ae0c9a096b","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_animations.scss":"9eeec504cab94a45a597592020b7f0e7","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_mixins.scss":"6201fa9f37198a13291708785bed8c9c","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_controls.scss":"d2fd10c6dc0750b99b1f40952e8a4562","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/base\/_all.scss":"22cda0b152315361269f768c4a0e08d0","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/base\/_minireset.scss":"53ee547c0bff77ba3e6353def2f8729b","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/base\/_generic.scss":"c6a82d37120ed7d2dc7a64dccac78efd","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/elements\/_content.scss":"4123c3d4d782cfbaaa8d4726f3a0425a","..\/css\/backoffice\/vendors\/_ckeditor.scss":"6e8959c11d32b2ff18f0b9311bb229f9","..\/css\/backoffice\/vendors\/_c3.scss":"67e85e5dca90ff7359d3e93fdf60d083","..\/css\/backoffice\/vendors\/_tippy.scss":"28551f4fbcd0aedc1e2deca98de1f735","..\/css\/backoffice\/vendors\/_jqueryui.scss":"cd247942214d778d8721165535c7762e","..\/css\/backoffice\/vendors\/_jquery-multiselect.scss":"9e58b3df3ea9cfee07d933daf626f381","..\/css\/backoffice\/vendors\/_datatables.scss":"3a02a47e9bb576062daca339ed8ce34c","..\/css\/backoffice\/vendors\/_jquery-treeview.scss":"4b1c6fd7adf40559c618c0eef75ed951","..\/css\/backoffice\/vendors\/_jquery-blockui.scss":"896ca889ddc740ddc186f6c53acda565","..\/css\/backoffice\/vendors\/_magnific-popup.scss":"651c701491c80f3070748aea4c10df34","..\/css\/backoffice\/vendors\/_selectize.scss":"d944bf615982b8724d45e568cdfd1522","..\/css\/backoffice\/base\/_all.scss":"558d5216604cb41b86793d513b9b427c","..\/css\/backoffice\/base\/_base.scss":"c1ea8efbdb3859e1d280789f7a04f016","..\/css\/backoffice\/base\/_typography.scss":"d3fe6b58526f49a9f30f6cdbf09204f2","..\/css\/backoffice\/components\/_all.scss":"34672a1fe56533372898e0837156260d","..\/css\/backoffice\/components\/_alert.scss":"00ad2abe7a23814f10f8d335d9125011","..\/css\/backoffice\/components\/_button.scss":"631c3d071af32d7594e589ffcaaf8dc8","..\/css\/backoffice\/components\/_button-group.scss":"ddff8a511b0155cf7de5fd8d2129afff","..\/css\/backoffice\/components\/_breadcrumbs.scss":"d958b19b860261e5edce9b86f8989dcf","..\/css\/backoffice\/components\/_quick-create.scss":"dad66636d9cdb57d4958b566f26d06e6","..\/css\/backoffice\/components\/_global-search.scss":"c0ba075ab3819090d9aca2674faa0b7b","..\/css\/backoffice\/components\/popover-menu\/_popover-menu.scss":"df56706d5f1b6fea881275b29c83cd5b","..\/css\/backoffice\/components\/popover-menu\/_popover-menu-item.scss":"f8c97c88680ba1ec6b23a630bf126da8","..\/css\/backoffice\/components\/_newsroom-menu.scss":"40501458a9d7597d56e3b68e2ce7a1c8","..\/css\/backoffice\/components\/_panel.scss":"b61375f790cf580bfd1715ba042b3fae","..\/css\/backoffice\/components\/_collapsible-section.scss":"75d696fbded5c4924cc4b9f7811ec68f","..\/css\/backoffice\/components\/_modal.scss":"59f3780d094682fdb3caf72e8e548333","..\/css\/backoffice\/components\/dashlet\/_all.scss":"b385664d72427211449e126e84aa569f","..\/css\/backoffice\/components\/dashlet\/_dashlet.scss":"d01a28405200be86f6dc80301294bf4c","..\/css\/backoffice\/components\/dashlet\/_dashlet-badge.scss":"6c3d13fe510b8979671151b20b35401e","..\/css\/backoffice\/components\/dashlet\/_dashlet-header-static.scss":"e59fade683e16a868d650883d4709617","..\/css\/backoffice\/components\/dashlet\/_dashlet-header-dynamic.scss":"5ec620b7422eefd82f2b81efed8eb17f","..\/css\/backoffice\/components\/input\/_all.scss":"5c7ce9d539e0d013694b6a26ae1b8b97","..\/css\/backoffice\/components\/input\/_input.scss":"3809d4ca16b29cca914b89a5acef3abb","..\/css\/backoffice\/components\/input\/_input-checkbox.scss":"abe96ce9ca97d41391444ea3e78f5bb9","..\/css\/backoffice\/components\/input\/_input-date.scss":"a84faa2f6ec3ee4c9e33bbf34074fa3f","..\/css\/backoffice\/components\/input\/_input-datetime.scss":"6b5555ebc6a86523574ca2820cf83577","..\/css\/backoffice\/components\/input\/_input-duration.scss":"a731eddd2c7b9aef723b02e0b65985de","..\/css\/backoffice\/components\/input\/_input-image.scss":"42c5b5abcde8ce3710cba701e9bd00f6","..\/css\/backoffice\/components\/input\/_input-richtext.scss":"07f4c65829c575b7d728fe8257fca215","..\/css\/backoffice\/components\/input\/_input-select.scss":"8f89ba7746711734816f923b54fb3add","..\/css\/backoffice\/components\/input\/_input-select-icon.scss":"1a0b416edc9cd634c0f17f30d341e547","..\/css\/backoffice\/components\/input\/_input-string.scss":"59f3780d094682fdb3caf72e8e548333","..\/css\/backoffice\/components\/input\/_input-one-way-password.scss":"87fd24c0c7ab1195a27094a79f67a8f1","..\/css\/backoffice\/components\/input\/_input-set.scss":"865a68e750f79b3f9e56786d6c2feb0b","..\/css\/backoffice\/components\/input\/_input-text.scss":"fc9a33a291ed62e83efefdbda77555e7","..\/css\/backoffice\/components\/_pill.scss":"c7f9f9b61043331fe38be0a5e287669d","..\/css\/backoffice\/components\/_prop.scss":"8ca0dd553e3772da165841d782ff6e57","..\/css\/backoffice\/components\/_title.scss":"355806429e2ef9e15590119c56c91cce","..\/css\/backoffice\/components\/_datatable.scss":"67bcbc87747e764a49f8700c7c585be9","..\/css\/backoffice\/components\/_form.scss":"7a67f1ce93c1911320f35d4ae21c7f0a","..\/css\/backoffice\/components\/_fieldset.scss":"191d28ab6c78d15c131fbaa3e136ddb4","..\/css\/backoffice\/components\/_field.scss":"de3b3b79abe9693d549a213dc2adf5f3","..\/css\/backoffice\/components\/toolbar\/_all.scss":"d5eb50f38b0a9b3ed11510c604c5918b","..\/css\/backoffice\/components\/toolbar\/_toolbar.scss":"6161441a72be2769fca5d508d4cee299","..\/css\/backoffice\/components\/toolbar\/_toolbar-spacer.scss":"4ec67ee81463a3a47a7a9df9e7a06080","..\/css\/backoffice\/components\/toolbar\/_separator.scss":"e8e5a7d9e35ea695f9727c27529afdb7","..\/css\/backoffice\/components\/_richtext.scss":"59f3780d094682fdb3caf72e8e548333","..\/css\/backoffice\/components\/_formtable.scss":"028c5a8ca9bb33cdcb277436437f4971","..\/css\/backoffice\/components\/_formtablerow.scss":"028c5a8ca9bb33cdcb277436437f4971","..\/css\/backoffice\/components\/_search-form.scss":"e6f5d3a0da2be04fcc4e67d18f2aeb17","..\/css\/backoffice\/components\/_field-badge.scss":"38692963080288a8325c9e426a269c74","..\/css\/backoffice\/components\/_file-select.scss":"31e7a997da6d70700d00f31b6788f690","..\/css\/backoffice\/components\/_medallion-icon.scss":"73e84c66b1070e2d4464aa30e3d3c768","..\/css\/backoffice\/layout\/_all.scss":"5c50b58ad1026cdd8861d87c22ce4513","..\/css\/backoffice\/layout\/_navigation-menu.scss":"b59cacde1d5c765805f1844dc9f59a85","..\/css\/backoffice\/layout\/_top-bar.scss":"8e04bc9bf197678a5b55c53bd6447f15","..\/css\/backoffice\/layout\/_content.scss":"bc03eff9cacfc9f4fe613c1ea7ad5d0a","..\/css\/backoffice\/layout\/tab-container\/_tab-container.scss":"7f02ce7e1e03a2f7a924493f742a08c5","..\/css\/backoffice\/layout\/tab-container\/_tab.scss":"028c5a8ca9bb33cdcb277436437f4971","..\/css\/backoffice\/layout\/multi-column\/_multi-column.scss":"a3bd6424719a0b6196686e770f784014","..\/css\/backoffice\/layout\/multi-column\/_column.scss":"0041fb40ed0a05a26b07a7923ea3009c","..\/css\/backoffice\/layout\/dashboard\/_all.scss":"a17ee88767a61d2789dc7e1e43fb17f1","..\/css\/backoffice\/layout\/dashboard\/_dashboard.scss":"96e071ddb7dee0bc36aa2326f1530653","..\/css\/backoffice\/layout\/dashboard\/_dashboard-editor.scss":"0a9edc12987a9a2ea3060cd1067b34e8","..\/css\/backoffice\/layout\/wizard-container\/_wizard-container.scss":"84101487af2ce14b2b7941c760416c33","..\/css\/backoffice\/layout\/object\/_object-details.scss":"5ee4248f9e6ddb01295ba88e2a813aba","..\/css\/backoffice\/layout\/activity-panel\/_all.scss":"546b722b1a748bde41a678aa865ee67d","..\/css\/backoffice\/layout\/activity-panel\/_activity-panel.scss":"b5676b8527574567704b0a3007c022ad","..\/css\/backoffice\/layout\/activity-panel\/_caselog-entry-form.scss":"f9d0bd1c0ed277aade5732bc830869eb","..\/css\/backoffice\/layout\/activity-panel\/_activity-entry.scss":"b84cab116d7cd8e6ff2853500fa6628c","..\/css\/backoffice\/layout\/activity-panel\/_caselog-entry.scss":"867e5c22f25bd95ada1e9698e99f5234","..\/css\/backoffice\/layout\/activity-panel\/_transition-entry.scss":"cf8212f89285040b224f493e5d64a816","..\/css\/backoffice\/layout\/activity-panel\/_edits-entry.scss":"1899e6018c8586d2cb2cd35132324b7e","..\/css\/backoffice\/layout\/activity-panel\/_notification-entry.scss":"461b27be17165557807433c8fa66c07d","..\/css\/backoffice\/application\/_all.scss":"de4aa12caf01a7d79056915b9ad58673","..\/css\/backoffice\/application\/display-block\/_all.scss":"b81c3c3291412431611a43b0c7eec72d","..\/css\/backoffice\/application\/display-block\/_block-csv.scss":"3cba3f9f15b648693825c8f122610650","..\/css\/backoffice\/application\/display-block\/_block-list.scss":"fef575d1f57574a99272b85f1b41eee2","..\/css\/backoffice\/application\/tabular-fields\/_all.scss":"bb7b8281324c87d26a0d22abd8b1ba8b","..\/css\/backoffice\/application\/tabular-fields\/_tabular-fields-selector.scss":"4ae78f1af36f21afaca04a89c4147e71","..\/css\/backoffice\/pages\/_all.scss":"c95bf2962a9be5575ed32e8cbc87bf83","..\/css\/backoffice\/pages\/_base.scss":"e089a9c02db3930aecd81d6cda3f32a6","..\/css\/backoffice\/pages\/_preferences.scss":"47111e8cb0dbf85dcdedb7e6a5be45a0","..\/css\/backoffice\/pages\/_attachments.scss":"bb7de626f3b36e803135df30fa8da71b","..\/css\/backoffice\/pages\/_impact-analysis.scss":"9aad4e214a84acef6bc7bc4c86c532be","..\/css\/backoffice\/pages\/_audit.scss":"48e1f03c5a3e31195b22a861721fce31","..\/css\/backoffice\/pages\/_data-synchro.scss":"d6c1eeca2d6473325656f571053b383f","..\/css\/backoffice\/pages\/_datamodel-viewer.scss":"536dc679266eecbda1518929e73b6410","..\/css\/backoffice\/pages\/_csv-import.scss":"5bd044c3770b81339f276f06a335ea7a","..\/css\/backoffice\/pages\/_global-search.scss":"8c01ff4b2c536ef5e5a53f4ca74980b3","..\/css\/backoffice\/pages\/_run-query.scss":"505911cef16a4c399033bfbecbb616ce","..\/css\/backoffice\/pages\/_welcome-popup.scss":"24ed7e9b464b2227ea78742851c2f353","..\/css\/backoffice\/blocks-integrations\/_all.scss":"ef60f7c36d5e28340d611a84b1c2fa7e","..\/css\/backoffice\/blocks-integrations\/alert\/_all.scss":"4d870bd603525e90378ffed9bbb2b448","..\/css\/backoffice\/blocks-integrations\/alert\/_alert-with-blocks.scss":"7ef408cc779ea029db9e0b13b74cce0f","..\/css\/backoffice\/blocks-integrations\/button\/_all.scss":"00901236f8e910ef13b6f1bd5cd45512","..\/css\/backoffice\/blocks-integrations\/button\/_button-with-button.scss":"2c6f01cc22d0bfa2093099b29f400702","..\/css\/backoffice\/blocks-integrations\/button\/_button-with-button-group.scss":"e117d48704df344aeaf8751785467486","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_all.scss":"638f28965ab9ca521c133cad94d89ffa","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_collapsible-section-with-blocks.scss":"2b6d54a377a3dd6bf9ef95fa311ecc58","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_collapsible-section-within-caselog-list.scss":"5801ed35287052e48452c9e9227d5ce2","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_collapsible-section-within-alert.scss":"701869874ba293c5118079b62fb5d84f","..\/css\/backoffice\/blocks-integrations\/datatable\/_all.scss":"56745c2d06c920d3cbb766667d6266bb","..\/css\/backoffice\/blocks-integrations\/datatable\/_datatable-with-blocks.scss":"63c3b8baee07aa4be0bbff22600e51f9","..\/css\/backoffice\/blocks-integrations\/datatable\/_datatable-within-panel.scss":"5641191ddfaf0193be54d5d91dbb2a30","..\/css\/backoffice\/blocks-integrations\/display-block\/_all.scss":"5a5ed7a46554f893b6e187f4e786ae25","..\/css\/backoffice\/blocks-integrations\/display-block\/_display-block-with-blocks.scss":"effa7cf7175dabec23e7c2913d695cc6","..\/css\/backoffice\/blocks-integrations\/field\/_all.scss":"a5231382ad4e1fdabd91819a8dc72e6c","..\/css\/backoffice\/blocks-integrations\/field\/_field-with-field.scss":"b8e4e1b104bea79572949feef2fba8a2","..\/css\/backoffice\/blocks-integrations\/field\/_field-with-fieldset.scss":"4dbe83ec93f874fce4227f54fb91ded8","..\/css\/backoffice\/blocks-integrations\/fieldset\/_all.scss":"39b072cf5b36ac44ad3a6600ce478cbd","..\/css\/backoffice\/blocks-integrations\/fieldset\/_fieldset-with-field.scss":"adaa89ad149517ed94452dd011d1c78b","..\/css\/backoffice\/blocks-integrations\/fieldset\/_fieldset-with-fieldset.scss":"10697b71aae94960d32927c72dbfc007","..\/css\/backoffice\/blocks-integrations\/fieldset\/_fieldset-with-multicolumn.scss":"576b80563de26c3bab1a43deee6ef926","..\/css\/backoffice\/blocks-integrations\/form\/_all.scss":"b70c461655578d228554bc1be0b73b93","..\/css\/backoffice\/blocks-integrations\/form\/_form-with-form.scss":"6712546b0cf7836b42d948c75816d211","..\/css\/backoffice\/blocks-integrations\/input\/_all.scss":"080cc2af5ee3c106f47300429e0a77af","..\/css\/backoffice\/blocks-integrations\/input\/_input-with-label.scss":"09f14fc2ce8dfdaf56ff2444ab754984","..\/css\/backoffice\/blocks-integrations\/input\/_input-within-datatable.scss":"5b29a66710a04eac12114ff149dca56e","..\/css\/backoffice\/blocks-integrations\/panel\/_all.scss":"502fc8c4ff7a0073bd9b63c6beee5c53","..\/css\/backoffice\/blocks-integrations\/panel\/_panel-with-blocks.scss":"9e55aa7d1ebf163c4dbc2f67752ba732","..\/css\/backoffice\/blocks-integrations\/panel\/_panel-within-main-content.scss":"11f773a9951845af07c4d53f60a9ec5f","..\/css\/backoffice\/blocks-integrations\/panel\/_panel-within-modal.scss":"c9eca2a3600e33c642406855ee9050fb","..\/css\/backoffice\/blocks-integrations\/pill\/_all.scss":"ea4c950b3421b10c32e5c48f1a6f5539","..\/css\/backoffice\/blocks-integrations\/pill\/_pill-with-pill.scss":"d0084039ff9b4e330c4ef2ba17111b00","..\/css\/backoffice\/blocks-integrations\/dashlet\/_all.scss":"d5777561380a250211331ad4431bd15f","..\/css\/backoffice\/blocks-integrations\/dashlet\/_dashlet-within-dashboard.scss":"2ba232ac9810596c42b2b7e2e85f075d","..\/css\/backoffice\/blocks-integrations\/_add-to-dashboard.scss":"025abc61dece0c6c13d6ffd345aec9ad","..\/css\/backoffice\/blocks-integrations\/_caselog-entry-form-within-activity-panel.scss":"ce0bd212dfcce5bfef6fd623706255da","..\/css\/backoffice\/blocks-integrations\/_tab-container-within-panel.scss":"6b5276ba5987a00357834c45169e3bdf","..\/css\/backoffice\/blocks-integrations\/_object-details-with-tab-container.scss":"ee09bc6539e0168c407ab2fccaa25144","..\/css\/backoffice\/blocks-integrations\/_medallion-with-blocklist.scss":"dc917f57e71b9b99cb00241f23a9bc67","..\/css\/backoffice\/blocks-integrations\/_field-badge-within-datatable.scss":"6d3a3598a271b9d6eac37af5ddc532ce","..\/css\/backoffice\/blocks-integrations\/_jquery-blockui-within-dialog.scss":"d0d276a5f19c3d75ac304782f7f3b07e","..\/css\/backoffice\/blocks-integrations\/_jquery-blockui-within-datatable.scss":"e68b5c5622b7c5372ed7110548704eda","..\/css\/backoffice\/themes\/_all.scss":"e7d77b97c6a069bc0b09b74517fcc5f6","..\/css\/backoffice\/_fallback.scss":"be12ae72f5050ceb543dd3f082a4dd71","..\/css\/backoffice\/_shame.scss":"8d7ae95ae0694b63efb6b85ef1cae6a6"}}
+=== SIGNATURE END ===
+*/
+:root{--ibo-color-white-100:white;--ibo-color-white-200:#f2f2f2;--ibo-color-transparent:rgba(255, 255, 255, 0);--ibo-color-grey-50:#ECEFF4;--ibo-color-grey-100:#E5E9F0;--ibo-color-grey-200:#D8DEE9;--ibo-color-grey-300:#7b88a1;--ibo-color-grey-400:#616e88;--ibo-color-grey-500:#4C566A;--ibo-color-grey-600:#434C5E;--ibo-color-grey-700:#3B4252;--ibo-color-grey-800:#2E3440;--ibo-color-grey-900:#191c22;--ibo-color-grey-950:#0e1013;--ibo-color-blue-grey-50:#f1f5f8;--ibo-color-blue-grey-100:#cfd8dc;--ibo-color-blue-grey-200:#b0bec5;--ibo-color-blue-grey-300:#90a4ae;--ibo-color-blue-grey-400:#78909c;--ibo-color-blue-grey-500:#607d8b;--ibo-color-blue-grey-600:#546e7a;--ibo-color-blue-grey-700:#455a64;--ibo-color-blue-grey-800:#37474f;--ibo-color-blue-grey-900:#263238;--ibo-color-blue-grey-950:#1b2428;--ibo-color-blue-100:#ebf8ff;--ibo-color-blue-200:#bee3f8;--ibo-color-blue-300:#90cef4;--ibo-color-blue-400:#63b4ed;--ibo-color-blue-500:#429ae1;--ibo-color-blue-600:#3182ce;--ibo-color-blue-700:#2b6bb0;--ibo-color-blue-800:#2c5382;--ibo-color-blue-900:#2a4265;--ibo-color-blue-950:#253750;--ibo-color-cyan-100:#c9eef2;--ibo-color-cyan-200:#80deea;--ibo-color-cyan-300:#4dd0e1;--ibo-color-cyan-400:#26c5da;--ibo-color-cyan-500:#00bbd4;--ibo-color-cyan-600:#00aac1;--ibo-color-cyan-700:#0096a7;--ibo-color-cyan-800:#00838f;--ibo-color-cyan-900:#006164;--ibo-color-cyan-950:#003636;--ibo-color-green-100:#dcedc8;--ibo-color-green-200:#c5e1a5;--ibo-color-green-300:#aed581;--ibo-color-green-400:#9ccc65;--ibo-color-green-500:#8ac34a;--ibo-color-green-600:#7cb342;--ibo-color-green-700:#689f38;--ibo-color-green-800:#558b2f;--ibo-color-green-900:#33691e;--ibo-color-green-950:#235816;--ibo-color-orange-100:floralwhite;--ibo-color-orange-200:#feebc8;--ibo-color-orange-300:#fbd38d;--ibo-color-orange-400:#f6ae55;--ibo-color-orange-500:#ea7d1e;--ibo-color-orange-600:#dd6c20;--ibo-color-orange-700:#c05621;--ibo-color-orange-800:#9c4221;--ibo-color-orange-900:#7b341e;--ibo-color-orange-950:#572819;--ibo-color-red-100:#faf2f3;--ibo-color-red-200:#f2e0e2;--ibo-color-red-300:#dfb1b5;--ibo-color-red-400:#d5979d;--ibo-color-red-500:#c97a82;--ibo-color-red-600:#BF616A;--ibo-color-red-700:#b44953;--ibo-color-red-800:#973d46;--ibo-color-red-900:#7d333a;--ibo-color-red-950:#491d1d;--ibo-color-pink-100:#fff5f7;--ibo-color-pink-200:#fed7e2;--ibo-color-pink-300:#fbb6ce;--ibo-color-pink-400:#f688b4;--ibo-color-pink-500:#ed64a6;--ibo-color-pink-600:#d53f8c;--ibo-color-pink-700:#b83280;--ibo-color-pink-800:#97266d;--ibo-color-pink-900:#702459;--ibo-color-pink-950:#511a40}:root{--ibo-color-primary-100:#bfdde6;--ibo-color-primary-200:#a5cfdc;--ibo-color-primary-300:#88C0D0;--ibo-color-primary-400:#6eb2c6;--ibo-color-primary-500:#81A1C1;--ibo-color-primary-600:#698fb5;--ibo-color-primary-700:#7693b8;--ibo-color-primary-800:#5E81AC;--ibo-color-primary-900:#384f6c;--ibo-color-primary-950:#26374b;--ibo-color-secondary-100:#E5E9F0;--ibo-color-secondary-200:#D8DEE9;--ibo-color-secondary-300:#7b88a1;--ibo-color-secondary-400:#616e88;--ibo-color-secondary-500:#4C566A;--ibo-color-secondary-600:#434C5E;--ibo-color-secondary-700:#3B4252;--ibo-color-secondary-800:#2E3440;--ibo-color-secondary-900:#191c22;--ibo-color-secondary-950:#0e1013;--ibo-color-information-100:#ebf8ff;--ibo-color-information-200:#bee3f8;--ibo-color-information-300:#90cef4;--ibo-color-information-400:#63b4ed;--ibo-color-information-500:#429ae1;--ibo-color-information-600:#3182ce;--ibo-color-information-700:#2b6bb0;--ibo-color-information-800:#2c5382;--ibo-color-information-900:#2a4265;--ibo-color-information-950:#253750;--ibo-color-success-100:#dcedc8;--ibo-color-success-200:#c5e1a5;--ibo-color-success-300:#aed581;--ibo-color-success-400:#9ccc65;--ibo-color-success-500:#8ac34a;--ibo-color-success-600:#7cb342;--ibo-color-success-700:#689f38;--ibo-color-success-800:#558b2f;--ibo-color-success-900:#33691e;--ibo-color-success-950:#235816;--ibo-color-warning-100:floralwhite;--ibo-color-warning-200:#feebc8;--ibo-color-warning-300:#fbd38d;--ibo-color-warning-400:#f6ae55;--ibo-color-warning-500:#ea7d1e;--ibo-color-warning-600:#dd6c20;--ibo-color-warning-700:#c05621;--ibo-color-warning-800:#9c4221;--ibo-color-warning-900:#7b341e;--ibo-color-warning-950:#572819;--ibo-color-danger-100:#faf2f3;--ibo-color-danger-200:#f2e0e2;--ibo-color-danger-300:#dfb1b5;--ibo-color-danger-400:#d5979d;--ibo-color-danger-500:#c97a82;--ibo-color-danger-600:#BF616A;--ibo-color-danger-700:#b44953;--ibo-color-danger-800:#973d46;--ibo-color-danger-900:#7d333a;--ibo-color-danger-950:#491d1d;--ibo-color-error-100:#faf2f3;--ibo-color-error-200:#f2e0e2;--ibo-color-error-300:#dfb1b5;--ibo-color-error-400:#d5979d;--ibo-color-error-500:#c97a82;--ibo-color-error-600:#BF616A;--ibo-color-error-700:#b44953;--ibo-color-error-800:#973d46;--ibo-color-error-900:#7d333a;--ibo-color-error-950:#491d1d;--ibo-caselog-color-highlight-1:#689f38;--ibo-caselog-color-highlight-2:#b83280;--ibo-caselog-color-highlight-3:#f6ae55;--ibo-caselog-color-highlight-4:#3182ce;--ibo-caselog-color-highlight-5:#80deea}:root{--ibo-lifecycle-new-state-primary-color:#2c5382;--ibo-lifecycle-new-state-secondary-color:white;--ibo-lifecycle-neutral-state-primary-color:#2c5382;--ibo-lifecycle-neutral-state-secondary-color:white;--ibo-lifecycle-waiting-state-primary-color:#f6ae55;--ibo-lifecycle-waiting-state-secondary-color:white;--ibo-lifecycle-success-state-primary-color:#689f38;--ibo-lifecycle-success-state-secondary-color:white;--ibo-lifecycle-failure-state-primary-color:#b83280;--ibo-lifecycle-failure-state-secondary-color:white;--ibo-lifecycle-frozen-state-primary-color:#D8DEE9;--ibo-lifecycle-frozen-state-secondary-color:#3B4252;--ibo-lifecycle-active-state-primary-color:#689f38;--ibo-lifecycle-active-state-secondary-color:white;--ibo-lifecycle-inactive-state-primary-color:#f6ae55;--ibo-lifecycle-inactive-state-secondary-color:white}:root{--ibo-border-radius-100:1px;--ibo-border-radius-300:3px;--ibo-border-radius-500:5px;--ibo-border-radius-700:10px;--ibo-border-radius-900:16px;--ibo-border-radius-full:100%}:root{--ibo-elevation-100:inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}:root{--ibo-elevation-100:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);--ibo-elevation-200:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15);--ibo-elevation-300:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15);--ibo-elevation-400:0 5px 10px rgba(0, 0, 0, 0.05), 0 15px 25px rgba(0, 0, 0, 0.15);--ibo-elevation-500:0 20px 40px rgba(0, 0, 0, 0.2)}:root{--ibo-size-0:0;--ibo-size-50:2px;--ibo-size-100:4px;--ibo-size-150:8px;--ibo-size-200:12px;--ibo-size-250:16px;--ibo-size-300:24px;--ibo-size-350:32px;--ibo-size-400:48px;--ibo-size-450:64px;--ibo-size-500:96px;--ibo-size-550:128px;--ibo-size-600:192px;--ibo-size-650:256px;--ibo-size-700:384px;--ibo-size-750:512px;--ibo-size-800:640px;--ibo-size-850:768px;--ibo-size-900:896px}:root{--ibo-spacing-0:0;--ibo-spacing-100:2px;--ibo-spacing-200:4px;--ibo-spacing-300:8px;--ibo-spacing-400:12px;--ibo-spacing-500:16px;--ibo-spacing-600:24px;--ibo-spacing-700:32px;--ibo-spacing-800:48px;--ibo-spacing-900:64px}:root{--ibo-font-size-50:0.83rem;--ibo-font-size-100:1rem;--ibo-font-size-150:1.17rem;--ibo-font-size-200:1.33rem;--ibo-font-size-250:1.5rem;--ibo-font-size-300:1.67rem;--ibo-font-size-350:1.83rem;--ibo-font-size-400:2rem;--ibo-font-size-450:2.5rem;--ibo-font-size-500:3rem;--ibo-font-size-550:4rem}:root{--ibo-font-weight-100:100;--ibo-font-weight-200:200;--ibo-font-weight-300:300;--ibo-font-weight-400:400;--ibo-font-weight-500:500;--ibo-font-weight-600:600;--ibo-font-weight-700:700;--ibo-font-weight-800:800;--ibo-font-weight-900:900;--ibo-font-weight-950:950}:root{--ibo-font-family-base:Raleway;--ibo-font-family-monospace:monospace;--ibo-font-family-code:monospace}.ibo-datatable .ibo-field-badge::before{border-radius:100%}.ibo-text.ibo-is-primary{color:#5E81AC}.ibo-text.ibo-is-secondary,.ui-dialog .ibo-text.ui-button,.ibo-text.ui-datepicker-current,.ibo-text.ui-datepicker-close{color:#2E3440}.ibo-text.ibo-is-neutral,.ui-dialog .ibo-text.ui-button.ui-dialog-titlebar-close{color:#2E3440}.ibo-text.ibo-is-information{color:#2c5382}.ibo-text.ibo-is-success{color:#558b2f}.ibo-text.ibo-is-failure{color:#973d46}.ibo-text.ibo-is-warning{color:#9c4221}.ibo-text.ibo-is-danger{color:#973d46}.ibo-text.ibo-is-grey{color:#2E3440}.ibo-text.ibo-is-blue-grey{color:#37474f}.ibo-text.ibo-is-blue{color:#2c5382}.ibo-text.ibo-is-cyan{color:#00838f}.ibo-text.ibo-is-green{color:#558b2f}.ibo-text.ibo-is-orange{color:#9c4221}.ibo-text.ibo-is-red{color:#973d46}.ibo-text.ibo-is-pink{color:#97266d}.ibo-activity-panel--tab-title-decoration{box-shadow:inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}.ibo-top-bar,.ibo-tab-container--extra-tabs-list{box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}ul.cke_autocomplete_panel,.ibo-breadcrumbs--previous-items-list,.ibo-quick-create--input.selectize-control.single .selectize-dropdown,.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul,.ibo-activity-panel--filter-options{box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}.dataTables_scrollHead thead tr th.sorting::after,.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after,.ibo-prop--apply.ui-state-error:after,.ibo-sort-order::after{font-family:"Font Awesome 5 Free";font-weight:900;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.ibo-font-size-50,.ibo-field--fullscreen-toggler,.ibo-activity-panel--tab-title-draft-indicator,.ibo-activity-entry--sub-information{font-size:0.83rem}.ibo-font-size-100,.dataTables_paginate a.paginate_button,.ibo-quick-create--drawer,.ibo-global-search--drawer,.ibo-dashlet-header-dynamic--label,.ibo-datatable--toolbar,.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration,.ibo-criterion-area,.ibo-dashboard-editor--properties table td .ibo-field,.ibo-dashboard--available-dashlets table td .ibo-field,.ibo-dashlet--properties table td .ibo-field,.ibo-dashboard-editor--properties table th .ibo-field,.ibo-dashboard--available-dashlets table th .ibo-field,.ibo-dashlet--properties table th .ibo-field,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{font-size:1rem}.ibo-font-size-150,.ibo-alert,.ibo-breadcrumbs--item-icon,.ibo-panel--subtitle,.ibo-panel--body,.ibo-dashlet-badge--action-create,.ibo-prop-header,.ibo-field,.sf_results_placeholder,.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name,.ibo-tab-container--tabs-list,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,.ibo-activity-entry--medallion{font-size:1.17rem}.ibo-font-size-200,.dataTables_paginate a.paginate_button.previous,.dataTables_paginate a.paginate_button.next{font-size:1.33rem}.ibo-font-size-250,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-container--label>span,.ibo-dashboard-editor--properties-title{font-size:1.5rem}.ibo-font-size-300,.ibo-title--for-object-details,.ibo-tab--temporary-remote-content--button{font-size:1.67rem}.ibo-font-size-350,.ibo-panel--title,.ibo-dashlet-header-static--body,.ibo-title-for-dashlet--title{font-size:1.83rem}.ibo-font-size-400{font-size:2rem}.ibo-font-size-450{font-size:2.5rem}.ibo-font-size-500{font-size:3rem}.ibo-font-size-550{font-size:4rem}.ibo-font-weight-100{font-weight:100}.ibo-font-weight-200{font-weight:200}.ibo-font-weight-300{font-weight:300}.ibo-font-weight-400{font-weight:400}.ibo-font-weight-500{font-weight:500}.ibo-font-weight-600,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-field--label{font-weight:600}.ibo-font-weight-700,ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-title,.ibo-alert .ibo-alert--title,.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{font-weight:700}.ibo-font-weight-800{font-weight:800}.ibo-font-weight-900{font-weight:900}.ibo-font-weight-950{font-weight:950}.ibo-font-ral-nor-50,.ibo-navigation-menu--menu-filter-hotkey{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-100,.ui-datepicker .ui-datepicker-title select,.ui-multiselect-checkboxes label,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.dataModelSchema text,.tooltipD3{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-150,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input,.ibo-title--subtitle,.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul li>span,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-datamodel-viewer--details .ibo-panel--subtitle,.ibo-global-search--result--title{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-200,.ibo-collapsible-section .ibo-collapsible-section--body,.ibo-navigation-menu--menu-group{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-250,.ui-dialog-title,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-welcome-popup--text{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-300,.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input,.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item,.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-350,.ibo-navigation-menu--menu-nodes-title{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-400,.ibo-quick-create--icon,.ibo-global-search--icon{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-100,.dataTable th,.dataTable td,.ibo-breadcrumbs--item,.ibo-breadcrumbs--previous-items-list-toggler,.ibo-breadcrumbs--previous-item,body{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-150,.ui-multiselect-checkboxes li{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-250,.ibo-dashlet-badge--action-list{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-300,.ibo-title--text{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-50,.ibo-field--label>.ibo-has-description::after,.ibo-navigation-menu--menu-filter-clear,.ibo-input-with-label--label.ibo-has-description::after{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-100,.ui-multiselect-header ul,.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label,.ibo-navigation-menu--menu-node-counter,#tooltipD3_top{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-150,.ibo-alert.ibo-is-primary a,.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-close a,.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a,.ibo-alert.ibo-is-information a,.ibo-alert.ibo-is-success a,.ibo-alert.ibo-is-failure a,.ibo-alert.ibo-is-warning a,.ibo-alert.ibo-is-danger a,.ibo-alert.ibo-is-grey a,.ibo-alert.ibo-is-blue-grey a,.ibo-alert.ibo-is-blue a,.ibo-alert.ibo-is-cyan a,.ibo-alert.ibo-is-green a,.ibo-alert.ibo-is-orange a,.ibo-alert.ibo-is-red a,.ibo-alert.ibo-is-pink a{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-200,.ibo-dashlet-header-dynamic--count{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-250,.ibo-dashboard--top-bar .ibo-dashboard--top-bar-title{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-450,.ibo-dashlet-badge--action-list-count{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-100,.dataTables_paginate a.paginate_button.current,.dataTables_scrollHead thead tr th,.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-300,.ibo-welcome-popup--text>div>div:first-child{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-50,.ibo-navigation-menu--menu-filter-hint{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-100,.ibo-quick-create--compartment--placeholder-hint,.ibo-global-search--compartment--placeholder-hint,.ibo-navigation-menu--menu--placeholder-hint,.ibo-activity-panel--body--placeholder-hint{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-code-50{font-size:0.83rem;font-family:monospace;font-weight:400}.ibo-font-code-100{font-size:1rem;font-family:monospace;font-weight:400}.ibo-font-code-150,.ibo-is-code,.ibo-input-text.ibo-is-code,textarea.ibo-is-code{font-size:1.17rem;font-family:monospace;font-weight:400}.ibo-font-code-200{font-size:1.33rem;font-family:monospace;font-weight:400}.ibo-font-code-250{font-size:1.5rem;font-family:monospace;font-weight:400}.ibo-font-code-300{font-size:1.67rem;font-family:monospace;font-weight:400}.ibo-font-code-350{font-size:1.83rem;font-family:monospace;font-weight:400}.ibo-font-code-400{font-size:2rem;font-family:monospace;font-weight:400}.ibo-font-code-450{font-size:2.5rem;font-family:monospace;font-weight:400}.ibo-font-code-500{font-size:3rem;font-family:monospace;font-weight:400}.ibo-font-code-550{font-size:4rem;font-family:monospace;font-weight:400}.ibo-is-visible{display:inherit !important;visibility:visible !important}.ibo-is-hidden{display:none !important}.ibo-is-transparent{opacity:0 !important}.ibo-is-opaque{opacity:1 !important}.ibo-is-fullwidth{width:100%}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image,.ibo-panel--header-left,.ibo-panel--icon,.ibo-dashlet-header-static--icon-container,.ibo-input-image--image-view,.ibo-input-select--autocomplete-item-image,.ibo-pill,.ibo-title--icon,.ibo-datatable--toolbar-left,.ibo-datatable--toolbar-right,.ibo-field--fullscreen-toggler,.ibo-navigation-menu--bottom-part,.ibo-navigation-menu--user-info,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-object-details--status-dot,.ibo-activity-panel--togglers,.ibo-activity-panel--tabs-togglers,.ibo-activity-panel--tab-title,.ibo-activity-panel--tab-toolbar-actions,.ibo-activity-panel--tab-toolbar-action,.ibo-activity-panel--body--placeholder-image,.ibo-activity-panel--body--placeholder-hint,.ibo-activity-panel--closed-cover,.ibo-caselog-entry-form--lock-icon,.ibo-activity-entry--medallion,.ibo-activity-panel--load-more-entries-container,.ibo-activity-panel--load-entries-button{display:flex;justify-content:center;align-items:center}.dataTables_paginate,.ibo-dashlet-badge--action-list,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-toolbar.ibo-toolbar--button,.ibo-activity-panel--tab-toolbar-left-actions,.ibo-activity-panel--tab-toolbar-middle-actions,.ibo-activity-panel--tab-toolbar-right-actions,.ibo-activity-panel--filter-option,.ibo-activity-panel--entry-forms-confirmation-preference,.ibo-caselog-entry-form--lock-indicator,.ibo-caselog-entry-form--action-buttons--main-actions{display:flex;align-items:center}.ibo-dashlet-badge--action-create,.ibo-title,.ibo-title--subtitle,.ibo-object-details--status,.ibo-activity-panel--add-caselog-entry-button{display:flex;align-items:baseline}.ibo-breadcrumbs,.ibo-quick-create,.ibo-quick-create--head,.ibo-global-search,.ibo-global-search--head,.ibo-top-bar,.ibo-top-bar--quick-actions,.ibo-top-bar--toolbar,.ibo-top-bar--toolbar-dashboard-menu-toggler,.ibo-tab-container--tabs-list,.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container,.ibo-dashboard--top-bar{display:flex;align-items:stretch}html.ibo-has-fullscreen-descendant{position:fixed !important;width:0 !important;height:0 !important}body.ibo-has-fullscreen-descendant{width:0 !important;height:0 !important;overflow:hidden !important}.ibo-has-fullscreen-descendant{position:static !important;overflow:visible !important;z-index:1050 !important}.ibo-is-fullscreen{position:absolute;top:0 !important;left:0 !important;margin:0 !important;padding:0 !important;width:100vw;height:100vh;overflow:auto;z-index:1050}.ibo-text-truncated-with-ellipsis,.ui-dialog .ui-dialog-title,.ibo-button--label,.ibo-breadcrumbs--item-label,.ibo-quick-create--compartment-element,.ibo-quick-create--compartment-results--element>.option,.ibo-global-search--compartment-element,.ibo-dashlet-badge--action-list-label,.ibo-input-select--autocomplete-item-txt,.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-navigation-menu--menu-group-title,.ibo-navigation-menu--menu-nodes-title,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-tab-container--tab-toggler-label,.ibo-tab-container--extra-tab-toggler,.ibo-object-details>.ibo-panel--header .ibo-panel--subtitle,.ibo-activity-panel--tab-title-text,.ibo-activity-panel--filter-option{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.dataTables_paginate a.paginate_button,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler,.search_form_handler a,.ibo-navigation-menu--menu-filter-clear,.ibo-navigation-menu--menu-filter-hint-close,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-activity-panel--load-entries-button{color:inherit}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active:hover,.ibo-field--fullscreen-toggler:hover,.search_form_handler a:hover,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover,.ibo-navigation-menu--menu-filter-clear:hover,.ibo-navigation-menu--menu-filter-hint-close:hover,.ibo-tab-container--tab-toggler:hover,.ibo-tab-container--extra-tabs-list-toggler:hover,.ibo-activity-panel--load-entries-button:hover,.dataTables_paginate a.paginate_button:active,.ibo-dashlet-badge--action-list:hover:active,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler:active,.search_form_handler a:active,.ibo-navigation-menu--menu-filter-clear:active,.ibo-navigation-menu--menu-filter-hint-close:active,.ibo-tab-container--tab-toggler:active,.ibo-tab-container--extra-tabs-list-toggler:active,.ibo-activity-panel--load-entries-button:active{color:inherit}.ibo-is-broken-hyperlink{text-decoration:line-through;cursor:help}.ibo-is-code{background-color:#2E3440;padding:1.25rem 1.5rem}.ibo-add-margin-top-250{margin-top:12px}.ibo-is-html-content{}.ibo-is-html-content table{width:unset !important;max-width:max-content}.ibo-is-html-content table{border-collapse:separate;border-spacing:2px}.ibo-is-html-content>code,.ibo-is-html-content code:not(.hljs){color:inherit}.ibo-sticky-sentinel{position:absolute;left:0;right:0;visibility:hidden}.ibo-sticky-sentinel-top{top:0;height:0}.ibo-sticky-sentinel-bottom{bottom:0;height:0}.ibo-class-icon.ibo-is-small{width:32px;min-width:32px;max-height:32px}.ibo-class-icon.ibo-is-medium{width:48px;min-width:48px;max-height:48px}.ibo-class-icon.ibo-is-large{width:64px;min-width:64px;max-height:64px}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.content:not(:last-child),.ibo-is-html-content:not(:last-child){margin-bottom:1.5rem}/* minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:white;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:auto;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:"Raleway", "sans-serif", "system-ui"}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#191c22;font-size:1rem;font-weight:500;line-height:1.5}a{color:#3273dc;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:#363636}code{background-color:#7b88a1;color:#5E81AC;font-size:0.875em;font-weight:normal;padding:0.25em 0.5em 0.25em}hr{background-color:whitesmoke;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:0.875em}span{font-style:inherit;font-weight:inherit}strong{color:inherit;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#434C5E;color:#E5E9F0;font-size:0.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:inherit}.content li+li,.ibo-is-html-content li+li{margin-top:0.25em}.content p:not(:last-child),.ibo-is-html-content p:not(:last-child),.content dl:not(:last-child),.ibo-is-html-content dl:not(:last-child),.content ol:not(:last-child),.ibo-is-html-content ol:not(:last-child),.content ul:not(:last-child),.ibo-is-html-content ul:not(:last-child),.content blockquote:not(:last-child),.ibo-is-html-content blockquote:not(:last-child),.content pre:not(:last-child),.ibo-is-html-content pre:not(:last-child),.content table:not(:last-child),.ibo-is-html-content table:not(:last-child){margin-bottom:1em}.content h1,.ibo-is-html-content h1,.content h2,.ibo-is-html-content h2,.content h3,.ibo-is-html-content h3,.content h4,.ibo-is-html-content h4,.content h5,.ibo-is-html-content h5,.content h6,.ibo-is-html-content h6{color:inherit;font-weight:600;line-height:1.125}.content h1,.ibo-is-html-content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child),.ibo-is-html-content h1:not(:first-child){margin-top:1em}.content h2,.ibo-is-html-content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child),.ibo-is-html-content h2:not(:first-child){margin-top:1.1428em}.content h3,.ibo-is-html-content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child),.ibo-is-html-content h3:not(:first-child){margin-top:1.3333em}.content h4,.ibo-is-html-content h4{font-size:1.25em;margin-bottom:0.8em}.content h5,.ibo-is-html-content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6,.ibo-is-html-content h6{font-size:1em;margin-bottom:1em}.content blockquote,.ibo-is-html-content blockquote{background-color:whitesmoke;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol,.ibo-is-html-content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]),.ibo-is-html-content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha,.ibo-is-html-content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman,.ibo-is-html-content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha,.ibo-is-html-content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman,.ibo-is-html-content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul,.ibo-is-html-content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul,.ibo-is-html-content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul,.ibo-is-html-content ul ul ul{list-style-type:square}.content dd,.ibo-is-html-content dd{margin-left:2em}.content figure,.ibo-is-html-content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child),.ibo-is-html-content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child),.ibo-is-html-content figure:not(:last-child){margin-bottom:2em}.content figure img,.ibo-is-html-content figure img{display:inline-block}.content figure figcaption,.ibo-is-html-content figure figcaption{font-style:italic}.content pre,.ibo-is-html-content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sup,.ibo-is-html-content sup,.content sub,.ibo-is-html-content sub{font-size:75%}.content table,.ibo-is-html-content table{width:100%}.content table td,.ibo-is-html-content table td,.content table th,.ibo-is-html-content table th{border:'invalid on purpose';border-width:'invalid on purpose';padding:'invalid on purpose';vertical-align:top}.content table th,.ibo-is-html-content table th{color:'invalid on purpose'}.content table th:not([align]),.ibo-is-html-content table th:not([align]){text-align:inherit}.content table thead td,.ibo-is-html-content table thead td,.content table thead th,.ibo-is-html-content table thead th{border-width:'invalid on purpose';color:'invalid on purpose'}.content table tfoot td,.ibo-is-html-content table tfoot td,.content table tfoot th,.ibo-is-html-content table tfoot th{border-width:'invalid on purpose';color:'invalid on purpose'}.content table tbody tr:last-child td,.ibo-is-html-content table tbody tr:last-child td,.content table tbody tr:last-child th,.ibo-is-html-content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li,.ibo-is-html-content .tabs li+li{margin-top:0}.content.is-small,.is-small.ibo-is-html-content{font-size:0.75rem}.content.is-medium,.is-medium.ibo-is-html-content{font-size:1.25rem}.content.is-large,.is-large.ibo-is-html-content{font-size:1.5rem}.ibo-vendors-ckeditor--toolbar-fullscreen-button{display:none}.cke_toolbox_collapser.cke_toolbox_collapser_min~.ibo-vendors-ckeditor--toolbar-fullscreen-button{display:block;width:12px;height:11px;border:1px #A6A6A6 solid;cursor:pointer;background-position:center center !important;background-repeat:no-repeat !important;background-size:100% !important;background-image:url('../../../../images/full-screen.png') !important}.cke_toolbox_collapser.cke_toolbox_collapser_min~.ibo-vendors-ckeditor--toolbar-fullscreen-button:hover{background-color:#CCC}.hljs{padding:0.9rem !important;box-shadow:0 0px 3px 2px inset rgba(0, 0, 0, 0.4);border-radius:3px;white-space:pre-line}.ibo-hljs-container{padding:0 !important}ul.cke_autocomplete_panel{background-color:white;border:none;border-radius:3px}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item{display:flex;justify-content:left;align-items:center}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image{width:25px;height:25px;min-width:25px;min-height:25px;background-position:center center;background-size:100%;border-radius:100%;margin-right:0.5rem;background-color:#ebf8ff;border:1px solid #434C5E}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-title{white-space:nowrap;color:#3A3A3A}.ibo-vendors-ckeditor--display-content .cke_editable,.ibo-field--value .HTML .cke_editable,.ibo-caselog-entry .ibo-activity-entry--main-information-content .cke_editable{line-height:1.4}.ibo-vendors-ckeditor--display-content figure,.ibo-field--value .HTML figure,.ibo-caselog-entry .ibo-activity-entry--main-information-content figure{border:solid 1px #ccc;border-radius:2px}.ibo-vendors-ckeditor--display-content p,.ibo-field--value .HTML p,.ibo-caselog-entry .ibo-activity-entry--main-information-content p{margin-top:0.25em;margin-bottom:0.25em}.c3 path:not(.c3-legend-item-tile),.c3 line:not(.c3-legend-item-tile){stroke:#7b88a1 !important}.c3-chart-arc path:not(.c3-legend-item-tile){stroke:white !important}.c3-axis{fill:#D8DEE9 !important}.c3-tooltip th{background-color:#434C5E !important;color:#E5E9F0 !important}.c3-tooltip td{background-color:#434C5E !important}.c3-legend-background{fill:#f2f2f2 !important;stroke:white !important}.c3-tooltip{background-color:#434C5E !important}.c3-tooltip tr{border:1px solid #CCC}.c3-legend-item{fill:#E5E9F0 !important}.tippy-content{white-space:pre-line}.ui-dialog{box-sizing:content-box;display:flex;flex-direction:column;position:absolute;top:0;left:0;background-color:#2E3440;border-radius:5px;overflow:hidden;outline:0;z-index:21}.ui-dialog .ui-dialog-titlebar{padding:0.4em 30px;position:relative;background-color:#2E3440;height:50px;border-bottom:solid 1px #4C566A;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.ui-dialog .ui-dialog-title{float:left;margin:0.1em 0;width:100%;padding-right:24px}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:0;top:0.4em;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{box-sizing:content-box;position:relative;padding:16px 30px;overflow:auto}.ui-dialog .ui-dialog-buttonpane{margin-top:auto;text-align:left;border-width:1px 0 0 0;background-image:none;padding:0.4em 30px;position:relative;background-color:#2E3440;border-top:solid 1px #4C566A;height:50px}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:0.5em 0.4em 0.5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se{width:7px;height:7px;right:0;bottom:0}.ui-dialog .ui-resizable-sw{width:7px;height:7px;left:0;bottom:0}.ui-dialog .ui-resizable-ne{width:7px;height:7px;right:0;top:0}.ui-dialog .ui-resizable-nw{width:7px;height:7px;left:0;top:0}.ui-dialog .ui-button>.ui-icon{background-image:none;float:unset;margin:auto}.ui-dialog .ui-button>.ui-icon.ui-icon-closethick::after{content:'\f00d';font-family:'Font Awesome 5 Free';font-weight:600;text-indent:0;position:absolute;left:0px;width:100%;top:4px}.ui-button-icon-only{text-indent:-9999px;white-space:nowrap}.ui-widget-overlay.ui-front{position:fixed;top:0;left:0;width:100%;height:100%;opacity:0.6;filter:Alpha(Opacity=60);background-color:#37474f}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-layout-pane{overflow:auto}.ui-datepicker{background-color:white;border-radius:5px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);z-index:32 !important;padding:0 8px 5px 8px}.ui-datepicker .ui-datepicker-header{position:relative;margin:8px 8px 4px 8px;padding-top:24px}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:0}.ui-datepicker .ui-datepicker-prev{left:0}.ui-datepicker .ui-datepicker-next{right:0}.ui-datepicker .ui-datepicker-title{display:flex;justify-content:space-evenly}.ui-datepicker .ui-datepicker-title select{flex-grow:1}.ui-datepicker .ui-datepicker-year{margin-left:8px}.ui-datepicker .ui-datepicker-calendar{margin:0 8px 8px 8px}.ui-datepicker th{padding:0.7em 0.3em;text-align:center;font-weight:bold}.ui-datepicker td{padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:0.2em 0;text-align:center;width:23px;border-radius:100%;color:#c05621}.ui-datepicker td span.ui-state-active,.ui-datepicker td a.ui-state-active{background-color:#c05621;color:floralwhite}.ui-datepicker td span.ui-state-highlight:not(.ui-state-active),.ui-datepicker td a.ui-state-highlight:not(.ui-state-active){background-color:#feebc8}.ui-datepicker td span.ui-state-hover:not(.ui-state-active),.ui-datepicker td a.ui-state-hover:not(.ui-state-active){color:#7b341e}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:0.7em 0 0 0;padding:0 0.2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:0.5em 0.2em 0.4em;cursor:pointer;padding:0.2em 0.6em 0.3em 0.6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto 0.4em}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-slider{position:relative;text-align:left;background-color:#E5E9F0;border:solid 1px #434C5E;border-radius:3px}.ui-slider .ui-slider-handle{background-color:white;border:solid 1px #434C5E;border-radius:3px;position:absolute;z-index:2;width:1.4em;height:1.4em;-ms-touch-action:none;touch-action:none;cursor:pointer}.ui-slider .ui-slider-handle:hover,.ui-slider .ui-slider-handle:active{border:solid 1px #c05621}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:0.7em;display:block;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle{filter:inherit}.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:0.8em}.ui-slider-horizontal .ui-slider-handle{top:-0.2em;margin-left:-0.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:0.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-0.3em;margin-left:0;margin-bottom:-0.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default;z-index:100}.ui-autocomplete .ui-menu-item{padding:0}.ui-autocomplete-input{width:auto;display:inline}.ui-helper-hidden-accessible{clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-tabs-tab.ui-state-disabled a{cursor:not-allowed !important}.ui-multiselect{width:auto !important;padding-left:0.7em !important;padding-right:1.5em !important;text-align:left;white-space:nowrap;overflow:hidden;display:grid}button.ui-multiselect>span{overflow:hidden}.ui-multiselect span.ui-icon{float:right}.ui-multiselect-single .ui-multiselect-checkboxes input{position:absolute !important;top:auto !important;left:-9999px}.ui-multiselect-single .ui-multiselect-checkboxes label{padding:5px !important}.ui-multiselect-header{margin-bottom:3px;padding:3px 0}.ui-multiselect-header ul{padding-left:24px}.ui-multiselect-header ul li{float:left;padding:0 10px 0 0}.ui-multiselect-header span.ui-icon{float:left}.ui-multiselect-header li.ui-multiselect-close{float:right;text-align:right;padding-right:0}.ui-multiselect-menu{display:none;padding:3px;position:absolute;z-index:10000;text-align:left}.ui-multiselect-checkboxes{position:relative;overflow-y:scroll !important}.ui-multiselect-checkboxes label{display:flex;align-items:center;cursor:pointer;padding:3px 1px}.ui-multiselect-checkboxes label input{margin-right:5px;position:relative;top:1px}.ui-multiselect-checkboxes li{clear:both;padding-right:3px}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label{text-align:center}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label a{display:block;padding:3px;margin:1px 0;text-decoration:none}.ui-dialog-titlebar.ui-multiselect-header{padding-left:20px;padding-right:20px}.ui-dialog-titlebar.ui-multiselect-header ul{padding-left:0;width:100%}.ui-dialog-titlebar.ui-multiselect-header a{color:#191c22;font-weight:normal}.ui-multiselect,.ui-multiselect-menu,.ui-multiselect-header{background-color:#E5E9F0}button.ui-multiselect{padding-right:10px !important}button.ui-multiselect .fas{float:right;padding-left:10px}.dataTables_paginate{color:#D8DEE9}.dataTables_paginate a.paginate_button{display:inline-flex;justify-content:center;align-items:center;padding:0 5px;min-width:20px;height:20px;border-radius:3px}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover{background-color:#3B4252}.dataTables_paginate a.paginate_button.disabled{color:#434C5E;background-color:transparent;cursor:default}.dataTables_paginate a.paginate_button.current{color:#D8DEE9;background-color:#191c22;box-shadow:inset 0px 1px 0px rgba(0, 0, 0, 0.15)}.dataTables_length select{}.dataTables_length select[aria-controls]{display:inline-flex;width:unset;min-width:50px;height:20px;padding:0 4px}.dataTables_scrollHead{}.dataTables_scrollHead thead tr th{cursor:pointer}.dataTables_scrollHead thead tr th.sorting::after{position:absolute;right:calc((12px - 8px) / 2);content:"\f0dc";opacity:0.3;line-height:inherit}.dataTables_scrollHead thead tr th.sorting_asc:after{content:"\f0d8";opacity:1}.dataTables_scrollHead thead tr th.sorting_desc:after{content:"\f0d7";opacity:1}.dataTables_scrollHeadInner{border-bottom:1px solid #616e88}.dataTable th,.dataTable td{position:relative;padding:10px 12px}.dataTable tr:nth-child(odd){background-color:#3B4252}.dataTable tr:nth-child(even){background-color:#2E3440}.dataTable tr.ibo-is-red{background-color:#b44953}.dataTable tr.ibo-is-danger{background-color:#b44953}.dataTable tr.ibo-is-alert{background-color:#b44953}.dataTable tr.ibo-is-orange{background-color:#c05621}.dataTable tr.ibo-is-warning{background-color:#d08770}.dataTable tr.ibo-is-blue{background-color:#5e81ac}.dataTable tr.ibo-is-info{background-color:#5e81ac}.treeview,.treeview ul{padding:0;margin:0;list-style:none}.treeview div.hitarea{height:15px;width:15px;margin-left:-15px;float:left;cursor:pointer}.treeview li{margin:0;padding:3px 0 3px 16px}.treeview a.selected{background-color:#E5E9F0}#treecontrol{margin:1em 0}.treeview .hover{color:#698fb5;cursor:pointer}.treeview li{background:url('../../../..//images/tv-item.gif') 0 0 no-repeat}.treeview .collapsable{background-image:url('../../../..//images/tv-collapsable.gif')}.treeview .expandable{background-image:url('../../../..//images/tv-expandable.gif')}.treeview .last{background-image:url('../../../..//images/tv-item-last.gif')}.treeview .lastCollapsable{background-image:url('../../../..//images/tv-collapsable-last.gif')}.treeview .lastExpandable{background-image:url('../../../..//images/tv-expandable-last.gif')}.filetree li{padding:3px 0 1px 16px}.filetree span.folder,.filetree span.file{padding-left:16px;display:block;height:15px}.filetree span.folder{background:url('../../../..//images/tv-folder.gif') 0 0 no-repeat}.filetree span.file{background:url('../../../..//images/tv-file.gif') 0 0 no-repeat}.blockUI.blockOverlay{background-color:#2E3440}.blockUI.blockMsg{font-size:6em;text-align:center;color:#D8DEE9;border:none;background-color:transparent}.mfp-bg{z-index:1100}.mfp-wrap{z-index:1101}/*
+ * @copyright   Copyright (C) 2010-2021 Combodo SARL
+ * @license     http://opensource.org/licenses/AGPL-3.0
+ */.selectize-dropdown-content{max-height:unset}.selectize-input input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active input{color:#E5E9F0}:root{--ibo-scrollbar--scrollbar-width:8px;--ibo-scrollbar--scrollbar-height:8px;--ibo-scrollbar--scrollbar-track-background-color:#3B4252;--ibo-scrollbar--scrollbar-track-border-radius:5px;--ibo-scrollbar--scrollbar-thumb-background-color:#191c22;--ibo-scrollbar--scrollbar-thumb-border:none;--ibo-scrollbar--scrollbar-thumb-border-radius:5px;--ibo-hyperlink-color:#a5cfdc;--ibo-hyperlink-color--on-hover:#6eb2c6;--ibo-hyperlink-color--on-active:#81A1C1}*,*::before,*::after{box-sizing:border-box}*{scrollbar-width:thin;scrollbar-color:var(--ibo-scrollbar--scrollbar-thumb-background-color) var(--ibo-scrollbar--scrollbar-track-background-color)}*::-webkit-scrollbar{width:var(--ibo-scrollbar--scrollbar-width);height:var(--ibo-scrollbar--scrollbar-height)}*::-webkit-scrollbar-track{background-color:var(--ibo-scrollbar--scrollbar-track-background-color);border-radius:var(--ibo-scrollbar--scrollbar-track-border-radius)}* ::-webkit-scrollbar-thumb{background-color:var(--ibo-scrollbar--scrollbar-thumb-background-color);border:var(--ibo-scrollbar--scrollbar-thumb-border);border-radius:var(--ibo-scrollbar--scrollbar-thumb-border-radius)}html{font-size:12px}a{color:var(--ibo-hyperlink-color);text-decoration:none}a:hover,.ibo-quick-create--compartment-results--element>.option:hover,a:active,a:visited{text-decoration:none}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:var(--ibo-hyperlink-color--on-hover)}a:active{color:var(--ibo-hyperlink-color--on-active)}@font-face{font-family:Raleway;font-weight:100;font-style:normal;font-display:swap;src:local('Raleway Thin'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-100-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:100;font-style:italic;font-display:swap;src:local('Raleway Thin'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-100-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:200;font-style:normal;font-display:swap;src:local('Raleway ExtraLight'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-200-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:200;font-style:italic;font-display:swap;src:local('Raleway ExtraLight'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-200-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:300;font-style:normal;font-display:swap;src:local('Raleway Light'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-300-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:300;font-style:italic;font-display:swap;src:local('Raleway Light'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-300-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:400;font-style:normal;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-400-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:400;font-style:italic;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-400-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:500;font-style:normal;font-display:swap;src:local('Raleway Medium'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-500-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:500;font-style:italic;font-display:swap;src:local('Raleway Medium'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-500-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:600;font-style:normal;font-display:swap;src:local('Raleway SemiBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-600-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:600;font-style:italic;font-display:swap;src:local('Raleway SemiBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-600-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:700;font-style:normal;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-700-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:700;font-style:italic;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-700-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:800;font-style:normal;font-display:swap;src:local('Raleway ExtraBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-800-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:800;font-style:italic;font-display:swap;src:local('Raleway ExtraBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-800-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:900;font-style:normal;font-display:swap;src:local('Raleway Black'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-900-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:900;font-style:italic;font-display:swap;src:local('Raleway Black'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-900-italic.woff') format('woff')}.ibo-alert.ibo-is-primary{background-color:#384f6c;color:#a5cfdc}.ibo-alert.ibo-is-primary a{color:#a5cfdc}.ibo-alert.ibo-is-primary::before{background-color:#7693b8}.ibo-alert.ibo-is-secondary,.ui-dialog .ibo-alert.ui-button,.ibo-alert.ui-datepicker-current,.ibo-alert.ui-datepicker-close{background-color:#191c22;color:#D8DEE9}.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-close a{color:#D8DEE9}.ibo-alert.ibo-is-secondary::before,.ui-dialog .ibo-alert.ui-button::before,.ibo-alert.ui-datepicker-current::before,.ibo-alert.ui-datepicker-close::before{background-color:#3B4252}.ibo-alert.ibo-is-neutral,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close{background-color:#191c22;color:#D8DEE9}.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a{color:#D8DEE9}.ibo-alert.ibo-is-neutral::before,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close::before{background-color:#3B4252}.ibo-alert.ibo-is-information{background-color:#2a4265;color:#bee3f8}.ibo-alert.ibo-is-information a{color:#bee3f8}.ibo-alert.ibo-is-information::before{background-color:#2b6bb0}.ibo-alert.ibo-is-success{background-color:#33691e;color:#dcedc8}.ibo-alert.ibo-is-success a{color:#dcedc8}.ibo-alert.ibo-is-success::before{background-color:#689f38}.ibo-alert.ibo-is-failure{background-color:#7d333a;color:#f2e0e2}.ibo-alert.ibo-is-failure a{color:#f2e0e2}.ibo-alert.ibo-is-failure::before{background-color:#b44953}.ibo-alert.ibo-is-warning{background-color:#7b341e;color:#feebc8}.ibo-alert.ibo-is-warning a{color:#feebc8}.ibo-alert.ibo-is-warning::before{background-color:#c05621}.ibo-alert.ibo-is-danger{background-color:#7d333a;color:#f2e0e2}.ibo-alert.ibo-is-danger a{color:#f2e0e2}.ibo-alert.ibo-is-danger::before{background-color:#b44953}.ibo-alert.ibo-is-grey{background-color:#191c22;color:#D8DEE9}.ibo-alert.ibo-is-grey a{color:#D8DEE9}.ibo-alert.ibo-is-grey::before{background-color:#3B4252}.ibo-alert.ibo-is-blue-grey{background-color:#263238;color:#b0bec5}.ibo-alert.ibo-is-blue-grey a{color:#b0bec5}.ibo-alert.ibo-is-blue-grey::before{background-color:#455a64}.ibo-alert.ibo-is-blue{background-color:#2a4265;color:#bee3f8}.ibo-alert.ibo-is-blue a{color:#bee3f8}.ibo-alert.ibo-is-blue::before{background-color:#2b6bb0}.ibo-alert.ibo-is-cyan{background-color:#006164;color:#c9eef2}.ibo-alert.ibo-is-cyan a{color:#c9eef2}.ibo-alert.ibo-is-cyan::before{background-color:#2b6bb0}.ibo-alert.ibo-is-green{background-color:#33691e;color:#dcedc8}.ibo-alert.ibo-is-green a{color:#dcedc8}.ibo-alert.ibo-is-green::before{background-color:#689f38}.ibo-alert.ibo-is-orange{background-color:#7b341e;color:#feebc8}.ibo-alert.ibo-is-orange a{color:#feebc8}.ibo-alert.ibo-is-orange::before{background-color:#c05621}.ibo-alert.ibo-is-red{background-color:#7d333a;color:#f2e0e2}.ibo-alert.ibo-is-red a{color:#f2e0e2}.ibo-alert.ibo-is-red::before{background-color:#b44953}.ibo-alert.ibo-is-pink{background-color:#702459;color:#fed7e2}.ibo-alert.ibo-is-pink a{color:#fed7e2}.ibo-alert.ibo-is-pink::before{background-color:#b83280}.ibo-alert{position:relative;padding:18px 20px;min-height:30px;border-radius:3px;overflow:hidden}.ibo-alert::before{display:block;position:absolute;top:0;left:0;content:'';width:4px;height:100%}.ibo-alert .ibo-alert--title{cursor:pointer}.ibo-alert.ibo-is-opened .ibo-alert--minimize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--minimize-button{display:block}.ibo-alert.ibo-is-opened .ibo-alert--maximize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--maximize-button{display:none}.ibo-alert:not(.ibo-is-opened){padding:5px 20px}.ibo-alert:not(.ibo-is-opened) .ibo-alert--title{padding-bottom:0}.ibo-alert:not(.ibo-is-opened) .ibo-alert--minimize-button{display:none}.ibo-alert:not(.ibo-is-opened) .ibo-alert--maximize-button{display:block}.ibo-alert:not(.ibo-is-opened) .ibo-alert--body{display:none}.ibo-alert--title+.ibo-alert--body{margin-top:4px}.ibo-alert--action-button{position:absolute;cursor:pointer;top:5px}.ibo-alert--action-button:hover i{opacity:0.8}.ibo-alert--action-button.ibo-alert--maximize-button,.ibo-alert--action-button.ibo-alert--minimize-button{right:30px}.ibo-alert--action-button.ibo-alert--close-button{right:10px}.ibo-button.ibo-is-regular.ibo-is-neutral,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-current,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ibo-is-neutral.ui-button,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:#434C5E;color:#D8DEE9;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-neutral:hover,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-current:hover,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#4C566A;color:#E5E9F0;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-neutral:active,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-current:active,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#4C566A;color:#D8DEE9;box-shadow:inset 0px 2px 0px #616e88 , 0px 2px 0px #4C566A}.ibo-button.ibo-is-regular.ibo-is-neutral:disabled,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-current:disabled,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-primary,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button,.ibo-is-primary.ui-datepicker-current,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current,.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button,.ibo-button.ibo-is-primary.ui-datepicker-current,.ibo-button.ibo-is-primary.ui-datepicker-close{background-color:#7693b8;color:white;box-shadow:0px 2px 0px #6eb2c6}.ibo-button.ibo-is-regular.ibo-is-primary:hover,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:hover,.ibo-is-primary.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:hover,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button:hover,.ibo-button.ibo-is-primary.ui-datepicker-current:hover,.ibo-button.ibo-is-primary.ui-datepicker-close:hover{background-color:#698fb5;color:white;box-shadow:0px 2px 0px #6eb2c6}.ibo-button.ibo-is-regular.ibo-is-primary:active,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:active,.ibo-is-primary.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:active,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button:active,.ibo-button.ibo-is-primary.ui-datepicker-current:active,.ibo-button.ibo-is-primary.ui-datepicker-close:active{background-color:#698fb5;color:white;box-shadow:inset 0px 2px 0px #6eb2c6 , 0px 2px 0px #698fb5}.ibo-button.ibo-is-regular.ibo-is-primary:disabled,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:disabled,.ibo-is-primary.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:disabled,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button:disabled,.ibo-button.ibo-is-primary.ui-datepicker-current:disabled,.ibo-button.ibo-is-primary.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-secondary,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button,.ui-dialog .ui-button,.ui-dialog .ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current,.ui-datepicker-current,.ui-datepicker-current.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button,.ibo-is-regular.ui-datepicker-current,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button,.ui-datepicker-close.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close,.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current,.ibo-is-regular.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button,.ui-dialog .ibo-button.ui-button,.ui-dialog .ibo-button.ui-button.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button,.ibo-button.ui-datepicker-current,.ibo-button.ui-datepicker-current.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button,.ibo-button.ui-datepicker-close.ui-datepicker-current,.ibo-button.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button,.ibo-button.ibo-is-regular.ui-datepicker-current,.ibo-button.ibo-is-regular.ui-datepicker-close{background-color:#434C5E;color:#D8DEE9;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-secondary:hover,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button:hover,.ui-dialog .ui-button:hover,.ui-dialog .ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current:hover,.ui-datepicker-current:hover,.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:hover,.ibo-is-regular.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:hover,.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close:hover,.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:hover,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-button.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:hover,.ibo-button.ui-datepicker-current:hover,.ibo-button.ui-datepicker-current.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:hover,.ibo-button.ui-datepicker-close.ui-datepicker-current:hover,.ibo-button.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button:hover,.ibo-button.ibo-is-regular.ui-datepicker-current:hover,.ibo-button.ibo-is-regular.ui-datepicker-close:hover{background-color:#4C566A;color:#E5E9F0;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-secondary:active,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button:active,.ui-dialog .ui-button:active,.ui-dialog .ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current:active,.ui-datepicker-current:active,.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:active,.ibo-is-regular.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:active,.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close:active,.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:active,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-button.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:active,.ibo-button.ui-datepicker-current:active,.ibo-button.ui-datepicker-current.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:active,.ibo-button.ui-datepicker-close.ui-datepicker-current:active,.ibo-button.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button:active,.ibo-button.ibo-is-regular.ui-datepicker-current:active,.ibo-button.ibo-is-regular.ui-datepicker-close:active{background-color:#4C566A;color:#D8DEE9;box-shadow:inset 0px 2px 0px #616e88 , 0px 2px 0px #4C566A}.ibo-button.ibo-is-regular.ibo-is-secondary:disabled,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button:disabled,.ui-dialog .ui-button:disabled,.ui-dialog .ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current:disabled,.ui-datepicker-current:disabled,.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:disabled,.ibo-is-regular.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:disabled,.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close:disabled,.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:disabled,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-button.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:disabled,.ibo-button.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:disabled,.ibo-button.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button:disabled,.ibo-button.ibo-is-regular.ui-datepicker-current:disabled,.ibo-button.ibo-is-regular.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-danger,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button,.ibo-is-danger.ui-datepicker-current,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current,.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button,.ibo-button.ibo-is-danger.ui-datepicker-current,.ibo-button.ibo-is-danger.ui-datepicker-close{background-color:#b44953;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-danger:hover,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:hover,.ibo-is-danger.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:hover,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button:hover,.ibo-button.ibo-is-danger.ui-datepicker-current:hover,.ibo-button.ibo-is-danger.ui-datepicker-close:hover{background-color:#BF616A;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-danger:active,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:active,.ibo-is-danger.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:active,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button:active,.ibo-button.ibo-is-danger.ui-datepicker-current:active,.ibo-button.ibo-is-danger.ui-datepicker-close:active{background-color:#BF616A;color:white;box-shadow:inset 0px 2px 0px #c97a82 , 0px 2px 0px #BF616A}.ibo-button.ibo-is-regular.ibo-is-danger:disabled,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:disabled,.ibo-is-danger.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:disabled,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button:disabled,.ibo-button.ibo-is-danger.ui-datepicker-current:disabled,.ibo-button.ibo-is-danger.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-success,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button,.ibo-is-success.ui-datepicker-current,.ibo-is-success.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button,.ibo-is-success.ui-datepicker-close.ui-datepicker-current,.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-success.ui-button,.ibo-button.ibo-is-success.ui-datepicker-current,.ibo-button.ibo-is-success.ui-datepicker-close{background-color:#689f38;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-success:hover,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:hover,.ibo-is-success.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:hover,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button:hover,.ibo-button.ibo-is-success.ui-datepicker-current:hover,.ibo-button.ibo-is-success.ui-datepicker-close:hover{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-success:active,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:active,.ibo-is-success.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:active,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button:active,.ibo-button.ibo-is-success.ui-datepicker-current:active,.ibo-button.ibo-is-success.ui-datepicker-close:active{background-color:#558b2f;color:white;box-shadow:inset 0px 2px 0px #33691e , 0px 2px 0px #558b2f}.ibo-button.ibo-is-regular.ibo-is-success:disabled,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:disabled,.ibo-is-success.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:disabled,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button:disabled,.ibo-button.ibo-is-success.ui-datepicker-current:disabled,.ibo-button.ibo-is-success.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-red,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button,.ibo-is-red.ui-datepicker-current,.ibo-is-red.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button,.ibo-is-red.ui-datepicker-close.ui-datepicker-current,.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-red.ui-button,.ibo-button.ibo-is-red.ui-datepicker-current,.ibo-button.ibo-is-red.ui-datepicker-close{background-color:#b44953;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-red:hover,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:hover,.ibo-is-red.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:hover,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button:hover,.ibo-button.ibo-is-red.ui-datepicker-current:hover,.ibo-button.ibo-is-red.ui-datepicker-close:hover{background-color:#BF616A;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-red:active,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:active,.ibo-is-red.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:active,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button:active,.ibo-button.ibo-is-red.ui-datepicker-current:active,.ibo-button.ibo-is-red.ui-datepicker-close:active{background-color:#BF616A;color:white;box-shadow:inset 0px 2px 0px #c97a82 , 0px 2px 0px #BF616A}.ibo-button.ibo-is-regular.ibo-is-red:disabled,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:disabled,.ibo-is-red.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:disabled,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button:disabled,.ibo-button.ibo-is-red.ui-datepicker-current:disabled,.ibo-button.ibo-is-red.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-green,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button,.ibo-is-green.ui-datepicker-current,.ibo-is-green.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button,.ibo-is-green.ui-datepicker-close.ui-datepicker-current,.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-green.ui-button,.ibo-button.ibo-is-green.ui-datepicker-current,.ibo-button.ibo-is-green.ui-datepicker-close{background-color:#689f38;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-green:hover,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:hover,.ibo-is-green.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:hover,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button:hover,.ibo-button.ibo-is-green.ui-datepicker-current:hover,.ibo-button.ibo-is-green.ui-datepicker-close:hover{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-green:active,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:active,.ibo-is-green.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:active,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button:active,.ibo-button.ibo-is-green.ui-datepicker-current:active,.ibo-button.ibo-is-green.ui-datepicker-close:active{background-color:#558b2f;color:white;box-shadow:inset 0px 2px 0px #33691e , 0px 2px 0px #558b2f}.ibo-button.ibo-is-regular.ibo-is-green:disabled,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:disabled,.ibo-is-green.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:disabled,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button:disabled,.ibo-button.ibo-is-green.ui-datepicker-current:disabled,.ibo-button.ibo-is-green.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-cyan,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button,.ibo-is-cyan.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button,.ibo-button.ibo-is-cyan.ui-datepicker-current,.ibo-button.ibo-is-cyan.ui-datepicker-close{background-color:#00bbd4;color:white;box-shadow:0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-cyan:hover,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:hover,.ibo-is-cyan.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:hover,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:hover,.ibo-button.ibo-is-cyan.ui-datepicker-current:hover,.ibo-button.ibo-is-cyan.ui-datepicker-close:hover{background-color:#0096a7;color:white;box-shadow:0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-cyan:active,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:active,.ibo-is-cyan.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:active,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:active,.ibo-button.ibo-is-cyan.ui-datepicker-current:active,.ibo-button.ibo-is-cyan.ui-datepicker-close:active{background-color:#0096a7;color:white;box-shadow:inset 0px 2px 0px #006164 , 0px 2px 0px #0096a7}.ibo-button.ibo-is-regular.ibo-is-cyan:disabled,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:disabled,.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:disabled,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-alternative.ibo-is-neutral,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#7b88a1;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-neutral:hover,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#3B4252;color:#7b88a1;box-shadow:0px 2px 0px #3B4252}.ibo-button.ibo-is-alternative.ibo-is-neutral:active,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#3B4252;color:#7b88a1;box-shadow:inset 0px 2px 0px #3B4252 , 0px 2px 0px #3B4252}.ibo-button.ibo-is-alternative.ibo-is-neutral:disabled,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#88C0D0;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary:hover,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#384f6c;color:#88C0D0;box-shadow:0px 2px 0px #384f6c}.ibo-button.ibo-is-alternative.ibo-is-primary:active,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#384f6c;color:#88C0D0;box-shadow:inset 0px 2px 0px #384f6c , 0px 2px 0px #384f6c}.ibo-button.ibo-is-alternative.ibo-is-primary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-button,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button,.ibo-is-alternative.ui-datepicker-current,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button,.ibo-button.ibo-is-alternative.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close{background-color:transparent;color:#7b88a1;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary:hover,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-button:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:hover,.ibo-is-alternative.ui-datepicker-current:hover,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:hover,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:hover,.ibo-button.ibo-is-alternative.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover{background-color:#E5E9F0;color:#191c22;box-shadow:0px 2px 0px #E5E9F0}.ibo-button.ibo-is-alternative.ibo-is-secondary:active,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-button:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:active,.ibo-is-alternative.ui-datepicker-current:active,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:active,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:active,.ibo-button.ibo-is-alternative.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active{background-color:#E5E9F0;color:#191c22;box-shadow:inset 0px 2px 0px #D8DEE9 , 0px 2px 0px #E5E9F0}.ibo-button.ibo-is-alternative.ibo-is-secondary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-button:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:disabled,.ibo-is-alternative.ui-datepicker-current:disabled,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:disabled,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#b44953;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger:hover,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#f2e0e2;color:#7d333a;box-shadow:0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-danger:active,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#f2e0e2;color:#7d333a;box-shadow:inset 0px 2px 0px #b44953 , 0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-danger:disabled,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success:hover,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:active,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:disabled,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#b44953;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red:hover,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#f2e0e2;color:#7d333a;box-shadow:0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-red:active,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#f2e0e2;color:#7d333a;box-shadow:inset 0px 2px 0px #b44953 , 0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-red:disabled,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green:hover,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:active,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:disabled,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#006164;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan:hover,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#c9eef2;color:#006164;box-shadow:0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:active,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#c9eef2;color:#006164;box-shadow:inset 0px 2px 0px #00838f , 0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:disabled,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close{position:relative;display:inline-block;padding:6px 9px;border:0;border-radius:4px;cursor:pointer;text-transform:uppercase;white-space:nowrap}.ibo-button.ibo-action-button,.ui-dialog .ibo-action-button.ui-button,.ibo-action-button.ui-datepicker-current,.ibo-action-button.ui-datepicker-close{float:right}.ibo-button .ibo-button--loading-icon,.ui-dialog .ui-button .ibo-button--loading-icon,.ui-datepicker-current .ibo-button--loading-icon,.ui-datepicker-close .ibo-button--loading-icon{display:none}.ibo-button.ibo-is-loading .ibo-button--icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--icon,.ibo-is-loading.ui-datepicker-current .ibo-button--icon,.ibo-is-loading.ui-datepicker-close .ibo-button--icon{display:none}.ibo-button.ibo-is-loading .ibo-button--loading-icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon{display:inline-block}.ibo-button.ibo-is-loading .ibo-button--loading-icon+.ibo-button--label,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon+.ibo-button--label{margin-left:4px}.ibo-button--icon+.ibo-button--label{margin-left:4px}.ibo-button--vertical-align{margin-top:4px;margin-bottom:4px}.ibo-button-group{display:inline-flex;flex-wrap:nowrap}.ibo-button-group .ibo-button,.ibo-button-group .ui-dialog .ui-button,.ui-dialog .ibo-button-group .ui-button,.ibo-button-group .ui-datepicker-current,.ibo-button-group .ui-datepicker-close{position:relative}.ibo-button-group .ibo-button:first-child,.ibo-button-group .ui-dialog .ui-button:first-child,.ui-dialog .ibo-button-group .ui-button:first-child,.ibo-button-group .ui-datepicker-current:first-child,.ibo-button-group .ui-datepicker-close:first-child{border-radius:4px 0 0 4px}.ibo-button-group .ibo-button:last-child,.ibo-button-group .ui-dialog .ui-button:last-child,.ui-dialog .ibo-button-group .ui-button:last-child,.ibo-button-group .ui-datepicker-current:last-child,.ibo-button-group .ui-datepicker-close:last-child{border-radius:0 4px 4px 0}.ibo-button-group .ibo-button:not(:first-child):not(:last-child),.ibo-button-group .ui-dialog .ui-button:not(:last-child):not(:first-child),.ui-dialog .ibo-button-group .ui-button:not(:last-child):not(:first-child),.ibo-button-group .ui-datepicker-current:not(:last-child):not(:first-child),.ibo-button-group .ui-datepicker-close:not(:last-child):not(:first-child){border-radius:0}.ibo-button-group .ibo-button+.ibo-button,.ibo-button-group .ui-dialog .ui-button+.ibo-button,.ibo-button-group .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-button-group .ui-dialog .ui-button+.ui-button,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-current,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-button-group .ui-button+.ibo-button,.ibo-button-group .ui-datepicker-current+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-current+.ui-button,.ibo-button-group .ui-datepicker-current+.ui-datepicker-current,.ibo-button-group .ui-datepicker-current+.ui-datepicker-close,.ibo-button-group .ui-datepicker-close+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-close+.ui-button,.ibo-button-group .ui-datepicker-close+.ui-datepicker-current,.ibo-button-group .ui-datepicker-close+.ui-datepicker-close,.ibo-button-group .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-button-group .ibo-button+.ui-button,.ibo-button-group .ibo-button+.ui-datepicker-current,.ibo-button-group .ibo-button+.ui-datepicker-close{margin-left:0}.ibo-button-group .ibo-button+.ibo-button::before,.ibo-button-group .ui-dialog .ui-button+.ibo-button::before,.ui-dialog .ibo-button-group .ui-button+.ibo-button::before,.ibo-button-group .ui-datepicker-current+.ibo-button::before,.ibo-button-group .ui-datepicker-close+.ibo-button::before,.ibo-button-group .ui-dialog .ibo-button+.ui-button::before,.ui-dialog .ibo-button-group .ibo-button+.ui-button::before,.ibo-button-group .ibo-button+.ui-datepicker-current::before,.ibo-button-group .ibo-button+.ui-datepicker-close::before{content:"";position:absolute;top:6px;bottom:6px;left:0;width:1px;border-left:1px solid transparent}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before{border-left-color:#88C0D0}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before:hover{border-left-color:#88C0D0}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before:active,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before:active{border-left-color:#5E81AC}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button::before,.ibo-button-group>*+*.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before:hover{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before:active,.ui-dialog .ibo-button-group>*+*.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before:active,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before:active{border-left-color:#D8DEE9}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before:hover{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before:active,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before:active{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before:active,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before:hover{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before:active,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before:active{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before:active,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before:hover{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before:active,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before:active{border-left-color:#0096a7}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before{border-left-color:#0096a7}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before:active,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before{border-left-color:#BF616A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before{border-left-color:#BF616A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-breadcrumbs{position:relative;margin-right:32px}.ibo-breadcrumbs.ibo-is-overflowing{justify-content:right}.ibo-breadcrumbs *{display:flex;align-items:center}.ibo-breadcrumbs--item{color:#a5cfdc}.ibo-breadcrumbs--item:not(:last-child):hover .ibo-breadcrumbs--item-icon>*{opacity:1;filter:none}.ibo-breadcrumbs--item-icon{margin-right:8px;transition:all 0.1s linear}.ibo-breadcrumbs--item-icon>span{color:#6eb2c6;opacity:0.6}.ibo-breadcrumbs--item-icon>img{height:auto;max-width:16px;opacity:0.3;filter:grayscale(100%)}.ibo-breadcrumbs--item-label{display:inline;max-width:100px}.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{content:'\f054';margin:0 12px;color:#4C566A}.ibo-breadcrumbs--previous-items-list-toggler{margin-right:24px;color:#3B4252 !important}.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{position:absolute;right:-24px}.ibo-breadcrumbs--previous-items-list{display:flex;flex-direction:column;align-items:stretch;position:fixed;top:37px;padding:8px 0;background-color:white}.ibo-breadcrumbs--previous-item{color:#a5cfdc;padding:12px 12px}.ibo-breadcrumbs--previous-item .ibo-breadcrumbs--item-label{max-width:200px}@keyframes ibo-quick-create--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-quick-create{position:relative}.ibo-quick-create.ibo-is-opened .ibo-quick-create--input,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--input{width:245px}.ibo-quick-create.ibo-is-opened .ibo-quick-create--drawer,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--drawer{animation-name:ibo-quick-create--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-quick-create--head{background-color:#3B4252}.ibo-quick-create--icon{color:#698fb5;align-self:center;padding:0 16px}.ibo-quick-create--icon:hover{color:#7693b8}.ibo-quick-create--icon:active{color:#5E81AC}.ibo-quick-create--input{width:0;border:none;transition:all 0.2s ease-in-out}.ibo-quick-create--input.selectize-control.single{position:sticky;display:flex}.ibo-quick-create--input.selectize-control.single .selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active{display:flex;background-color:transparent;background-image:none;border:none;box-shadow:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input{color:#E5E9F0;outline:none;border:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input::placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::placeholder{color:#D8DEE9}.ibo-quick-create--input.selectize-control.single .selectize-input>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input>input::-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::-ms-input-placeholder{color:#D8DEE9}.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item{color:#E5E9F0;line-height:200%}.ibo-quick-create--input.selectize-control.single .selectize-dropdown{background-color:#3B4252;border:none;border-radius:0}.ibo-quick-create--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:#3B4252;box-shadow:none}.ibo-quick-create--compartment-title{margin-top:8px;margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#7b88a1}.ibo-quick-create--compartment-title>span{position:relative}.ibo-quick-create--compartment-title>span::before,.ibo-quick-create--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #7b88a1}.ibo-quick-create--compartment-title>span::before{right:100%;margin-right:8px}.ibo-quick-create--compartment-title>span::after{left:100%;margin-left:8px}.ibo-quick-create--compartment-content{color:#D8DEE9}.ibo-quick-create--compartment-element{display:flex;align-items:center;padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-element-image{margin-right:8px;width:20px}.ibo-quick-create--compartment-results--container{width:100% !important}.ibo-quick-create--compartment-results--element>.option{padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-results--element>.option.active{background-color:#4C566A;border-radius:3px}.ibo-quick-create--compartment-results--element>.option:hover{cursor:pointer}.ibo-quick-create--compartment-results--element>.option .highlight{font-weight:bold}.ibo-quick-create--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-quick-create--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-quick-create--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#D8DEE9}@keyframes ibo-global-search--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-global-search{position:relative}.ibo-global-search.ibo-is-opened .ibo-global-search--input,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input,.ibo-global-search.ibo-is-opened .ibo-global-search--input:hover,.ibo-global-search.ibo-is-opened .ibo-global-search--input:focus,.ibo-global-search.ibo-is-opened .ibo-global-search--input:active,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:hover,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:focus,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:active{padding:8px 8px;width:245px}.ibo-global-search.ibo-is-opened .ibo-global-search--drawer,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--drawer{animation-name:ibo-global-search--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-global-search--head{background-color:#3B4252}.ibo-global-search--icon{color:#698fb5;align-self:center;padding:0 16px}.ibo-global-search--icon:hover{color:#7693b8}.ibo-global-search--icon:active{color:#5E81AC}.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{padding:0;width:0;color:#E5E9F0;background-color:transparent;border:none;outline:none;transition:all 0.2s ease-in-out}.ibo-global-search--input::placeholder,.ibo-global-search--input:hover::placeholder,.ibo-global-search--input:focus::placeholder,.ibo-global-search--input:active::placeholder{color:#D8DEE9}.ibo-global-search--input:-ms-input-placeholder,.ibo-global-search--input:hover:-ms-input-placeholder,.ibo-global-search--input:focus:-ms-input-placeholder,.ibo-global-search--input:active:-ms-input-placeholder,.ibo-global-search--input::-ms-input-placeholder,.ibo-global-search--input:hover::-ms-input-placeholder,.ibo-global-search--input:focus::-ms-input-placeholder,.ibo-global-search--input:active::-ms-input-placeholder{color:#D8DEE9}.ibo-global-search--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:#3B4252;box-shadow:none}.ibo-global-search--compartment-title{margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#7b88a1}.ibo-global-search--compartment-title>span{position:relative}.ibo-global-search--compartment-title>span::before,.ibo-global-search--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #7b88a1}.ibo-global-search--compartment-title>span::before{right:100%;margin-right:8px}.ibo-global-search--compartment-title>span::after{left:100%;margin-left:8px}.ibo-global-search--compartment-content{color:#D8DEE9}.ibo-global-search--compartment-element{display:flex;align-items:center;color:inherit}.ibo-global-search--compartment-element:not(:last-child){margin-bottom:8px}.ibo-global-search--compartment-element-image{margin-right:8px;width:20px}.ibo-global-search--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-global-search--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-global-search--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#E5E9F0}.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul{display:none;padding:0;background-color:#3B4252;border-radius:3px;flex-wrap:wrap;position:absolute}.ibo-popover-menu.ibo-is-opened,.ibo-is-opened.ui-menu,.ui-menu.ibo-input-select-icon--menu,.ibo-is-opened.ui-multiselect-menu,.ui-multiselect-menu.ibo-input-select-icon--menu,.ibo-is-opened.ibo-input-select-icon--menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul.ibo-is-opened,.graph_config .toolkit_menu.graph>ul>li ul.ibo-input-select-icon--menu,.ibo-popover-menu.ibo-input-select-icon--menu,.ibo-input-select-icon--menu.ui-menu,.ibo-input-select-icon--menu.ui-multiselect-menu{display:flex;flex-direction:column}.ibo-popover-menu--toggler-visual-hint{margin-left:0.5rem}.ibo-popover-menu--section,.ui-multiselect-checkboxes{display:flex;flex-direction:column;align-self:flex-start;margin:0 0;width:100%;white-space:nowrap;overflow:hidden}.ibo-popover-menu--section:first-child,.ui-multiselect-checkboxes:first-child{border-radius:3px 3px 0 0}.ibo-popover-menu--section:last-child,.ui-multiselect-checkboxes:last-child{border-radius:0 0 3px 3px}.ibo-popover-menu--item,.ui-menu-item,.ui-multiselect-checkboxes li,.ibo-input-select-icon--menu--item,.graph_config .toolkit_menu.graph>ul>li ul li{padding:12px 24px 12px 16px;color:#D8DEE9}.ibo-popover-menu--item a,.ui-menu-item a,.ui-multiselect-checkboxes li a,.ibo-input-select-icon--menu--item a,.graph_config .toolkit_menu.graph>ul>li ul li a{color:#D8DEE9}.ibo-popover-menu--item:hover,.ui-menu-item:hover,.ui-multiselect-checkboxes li:hover,.ibo-input-select-icon--menu--item:hover,.graph_config .toolkit_menu.graph>ul>li ul li:hover{background-color:#4C566A;color:inherit}.ibo-popover-menu--item.ibo-popover-menu--item-separator,.ibo-popover-menu--item-separator.ui-menu-item,.ui-menu-item.ui-autocomplete-category,.ui-multiselect-checkboxes li.ibo-popover-menu--item-separator,.ui-multiselect-checkboxes li.ui-autocomplete-category,.ibo-popover-menu--item-separator.ibo-input-select-icon--menu--item,.ibo-input-select-icon--menu--item.ui-autocomplete-category,.graph_config .toolkit_menu.graph>ul>li ul li.ibo-popover-menu--item-separator,.graph_config .toolkit_menu.graph>ul>li ul li.ui-autocomplete-category,.ibo-popover-menu--item.ui-autocomplete-category,.ui-autocomplete-category.ui-menu-item,.ui-autocomplete-category.ibo-input-select-icon--menu--item{padding:0;margin:0;background-color:#D8DEE9}.ibo-popover-menu--item--icon{padding-right:5px;color:#3B4252;font-size:1.33rem}#ibo-navigation-menu--notifications-menu{flex-flow:column;min-width:250px}#ibo-navigation-menu--notifications-menu .ibo-navigation-menu--notifications--messages-section{overflow:auto}.ibo-navigation-menu--notifications--show-all-messages,.ibo-navigation-menu--notifications-dismiss-all,.ibo-navigation-menu--notifications-show-all-multiple{overflow-x:inherit;text-align:center;min-height:45px}.ibo-navigation-menu--notifications--item--image{max-width:20px;max-height:20px;margin:0 6px;border-radius:100%}img.ibo-navigation-menu--notifications--item--image[src=""]{display:none}img.ibo-navigation-menu--notifications--item--image:not([src=""])~i.ibo-navigation-menu--notifications--item--image{display:none}.ibo-navigation-menu--notifications--item--bottom-text{display:flex;flex-direction:column;align-items:center;float:right;align-self:center;margin-left:auto}.ibo-navigation-menu--notifications--item--content{padding:0 14px}.ibo-navigation-menu--notifications--item--content img{max-height:100px;padding:5px}.ibo-navigation-menu--notifications-item{display:flex;flex-direction:row}.ibo-navigation-menu--notifications--item--new-message-indicator{width:10px;height:10px;background-color:#429ae1;border-radius:100%;margin-top:4px}.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications--item--new-message-indicator,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications--item--new-message-indicator{display:inline-block;margin-right:15px}.ibo-navigation-menu--notifications-dismiss-all--icon{margin:0 10px 0 0}.ibo-popover-menu--item--no-message{text-align:center}.ibo-popover-menu--item--no-message--image>svg{display:flex;width:100%;height:inherit;padding:15px}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--titles,.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--header-left{transition:all 0.15s linear}.ibo-panel{--ibo-main-color:#434C5E;position:relative}.ibo-panel.ibo-has-icon .ibo-panel--titles{padding-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon .ibo-panel--header-left{position:relative;z-index:1;margin-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon{position:absolute;bottom:-24px;left:0;overflow:hidden;width:72px;height:72px;min-width:72px;min-height:72px;background-color:#434C5E;border:2px solid #3B4252;border-radius:100%}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles{padding-left:calc(72px + 16px)}.ibo-panel--header{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:4px}.ibo-panel--header-left{justify-content:left}.ibo-panel--icon{width:48px;height:48px;min-width:48px;min-height:48px}.ibo-panel--icon-background{width:100%;height:100%;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-panel--icon-background--must-contain{background-size:contain}.ibo-panel--icon-background--must-cover{background-size:cover}.ibo-panel--icon-background--must-zoomout{background-size:66.67%}.ibo-panel--title{display:inline-block;color:#D8DEE9;flex-grow:1}.ibo-panel--subtitle{display:flex;color:#a8b0c1}.ibo-panel--body{position:relative;z-index:1;padding:32px 16px 24px 16px;background-color:#3B4252;border:1px solid #232831;border-radius:5px;overflow:hidden}.ibo-panel--body::before{position:absolute;top:0;left:0;display:block;background-color:var(--ibo-main-color);content:"";width:100%;height:8px;padding-bottom:8px}.ibo-panel.ibo-is-primary>.ibo-panel--body::before{background-color:#698fb5}.ibo-panel.ibo-is-secondary>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button>.ibo-panel--body::before,.ibo-panel.ui-datepicker-current>.ibo-panel--body::before,.ibo-panel.ui-datepicker-close>.ibo-panel--body::before{background-color:#434C5E}.ibo-panel.ibo-is-neutral>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button.ui-dialog-titlebar-close>.ibo-panel--body::before{background-color:#434C5E}.ibo-panel.ibo-is-information>.ibo-panel--body::before{background-color:#3182ce}.ibo-panel.ibo-is-success>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-failure>.ibo-panel--body::before{background-color:#BF616A}.ibo-panel.ibo-is-warning>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-danger>.ibo-panel--body::before{background-color:#BF616A}.ibo-panel.ibo-is-grey>.ibo-panel--body::before{background-color:#434C5E}.ibo-panel.ibo-is-blue-grey>.ibo-panel--body::before{background-color:#546e7a}.ibo-panel.ibo-is-blue>.ibo-panel--body::before{background-color:#2c5382}.ibo-panel.ibo-is-cyan>.ibo-panel--body::before{background-color:#00aac1}.ibo-panel.ibo-is-green>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-orange>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-red>.ibo-panel--body::before{background-color:#BF616A}.ibo-panel.ibo-is-pink>.ibo-panel--body::before{background-color:#d53f8c}.ibo-panel--collapsible-toggler{display:inline-block;margin-right:8px;font-size:1.5rem;color:#616e88;cursor:pointer}.ibo-panel .ibo-panel--collapsible-toggler--opened{display:block}.ibo-panel .ibo-panel--collapsible-toggler--closed{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--closed{display:block}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--opened{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--body{display:none}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header{position:sticky;top:0;border:transparent;transition-property:all, top, background-color;transition-duration:0.15s, 0s, 0s;transition-timing-function:linear}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--titles{}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking{padding-top:4px;padding-bottom:4px;background-color:#3B4252;border:1px solid #616e88;align-items:center}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--title{font-size:1.17rem}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--subtitle{font-size:1rem}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header{}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--icon{bottom:-12px;width:48px;height:48px;min-width:48px;min-height:48px;border:1px solid #616e88}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles{padding-left:calc(48px + 16px)}.ibo-collapsible-section--header{display:flex;align-items:stretch}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--minimize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--minimize-button{display:block}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--maximize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--maximize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--minimize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--maximize-button{display:block}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--body{display:none}.ibo-collapsible-section .ibo-collapsible-section--header{cursor:pointer}.ibo-collapsible-section .ibo-collapsible-section--header:hover i{opacity:0.8}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button{align-self:center}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--maximize-button,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--minimize-button{color:#616e88;margin-right:8px}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title{color:#D8DEE9;flex-grow:1}.ibo-collapsible-section .ibo-collapsible-section--body{position:relative;padding:24px 16px 16px;background-color:#3B4252;border:solid 1px #616e88;border-radius:5px;overflow:hidden}.ibo-dashlet{position:relative;width:calc(100% - 24px);margin:calc(24px / 2) calc(24px / 2)}.ibo-dashlet.dashlet-selected{position:relative}.ibo-dashlet--is-inline{width:auto}.ibo-details>.ibo-prop--apply{display:table-column}.ibo-details{margin-top:5px}.ibo-dashlet-blocker{position:absolute;z-index:9;top:0;left:0;width:100%;height:100%;cursor:not-allowed}:root{--ibo-dashlet-badge--min-width:200px;--ibo-dashlet-badge--padding-x:16px;--ibo-dashlet-badge--padding-y:16px;--ibo-dashlet-badge--background-color:#3B4252;--ibo-dashlet-badge--border:1px solid #232831;--ibo-dashlet-badge--border-radius:5px}.ibo-dashlet-badge{max-width:350px;flex-basis:200px;flex-grow:1;flex-shrink:1;padding:16px 16px;background-color:#3B4252;border:1px solid #232831;border-radius:5px}.ibo-dashlet-badge--body{display:flex;justify-items:left;align-items:center}.ibo-dashlet-badge--icon-container{margin-right:16px}.ibo-dashlet-badge--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-badge--actions{flex-grow:1;overflow-x:hidden}.ibo-dashlet-badge--action-list{color:inherit}.ibo-dashlet-badge--action-list-count{margin-right:8px}.ibo-dashlet-badge--action-list-label{display:inline-block}.ibo-dashlet-badge--action-create-icon{margin-right:8px}.ibo-dashlet-header-static{padding:16px 16px 0 16px;overflow-x:hidden}.ibo-dashlet-header-static--body{position:relative;display:inline-flex;justify-items:left;align-items:center;margin-left:48px;color:#D8DEE9}.ibo-dashlet-header-static--body::before,.ibo-dashlet-header-static--body::after{content:"";position:absolute;top:50%;width:10000px;height:1px;border-bottom:2px solid #616e88}.ibo-dashlet-header-static--body::before{right:calc(100% + 16px)}.ibo-dashlet-header-static--body::after{left:calc(100% + 16px)}.ibo-dashlet-header-static--icon-container{margin-right:16px}.ibo-dashlet-header-static--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-header-dynamic--container{display:flex;flex-wrap:wrap}.ibo-dashlet-header-dynamic--count{margin-right:10px}.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{height:30px;width:100%;background-color:#434C5E;color:#D8DEE9;padding:0 10px;border:1px solid #191c22;border-radius:3px}.ibo-input:focus,.ui-autocomplete-input:focus,.ui-multiselect:focus,.dataTables_length select:focus,.ui_tpicker_hour_slider>select:focus,.ui_tpicker_minute_slider>select:focus,.ui_tpicker_second_slider>select:focus,select.ibo-input-select-placeholder:focus,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:focus,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:focus{border:1px solid #88C0D0}.ibo-input:disabled,.ui-autocomplete-input:disabled,.ui-multiselect:disabled,.dataTables_length select:disabled,.ui_tpicker_hour_slider>select:disabled,.ui_tpicker_minute_slider>select:disabled,.ui_tpicker_second_slider>select:disabled,select.ibo-input-select-placeholder:disabled,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:disabled,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:disabled{background-color:#4C566A;color:#D8DEE9}.ibo-input::placeholder,.ui-autocomplete-input::placeholder,.ui-multiselect::placeholder,.dataTables_length select::placeholder,.ui_tpicker_hour_slider>select::placeholder,.ui_tpicker_minute_slider>select::placeholder,.ui_tpicker_second_slider>select::placeholder,select.ibo-input-select-placeholder::placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]::placeholder,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]::placeholder{color:#D8DEE9}textarea.ibo-input,textarea.ui-autocomplete-input,textarea.ui-multiselect{height:unset}.ibo-input-wrapper.is-error .ibo-input,.is-error.ui_tpicker_hour_slider .ibo-input,.is-error.ui_tpicker_hour_slider .ui-autocomplete-input,.is-error.ui_tpicker_hour_slider .ui-multiselect,.is-error.ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_hour_slider select,.is-error.ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_hour_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_minute_slider .ibo-input,.is-error.ui_tpicker_minute_slider .ui-autocomplete-input,.is-error.ui_tpicker_minute_slider .ui-multiselect,.is-error.ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_minute_slider select,.is-error.ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_minute_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_second_slider .ibo-input,.is-error.ui_tpicker_second_slider .ui-autocomplete-input,.is-error.ui_tpicker_second_slider .ui-multiselect,.is-error.ui_tpicker_second_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_second_slider select,.is-error.ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_second_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_second_slider input[type="text"],.is-error.ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_second_slider input[type="text"],.ibo-input-wrapper.is-error .ui-autocomplete-input,.ibo-input-wrapper.is-error .ui-multiselect,.ibo-input-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-wrapper.is-error select,.ibo-input-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .ibo-input,.ibo-input-field-wrapper.is-error .ui-autocomplete-input,.ibo-input-field-wrapper.is-error .ui-multiselect,.ibo-input-field-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-field-wrapper.is-error select,.ibo-input-field-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-field-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-field-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .ibo-input-vanilla,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla,.is-error.ui_tpicker_second_slider .ibo-input-vanilla,.ibo-input-field-wrapper.is-error .ibo-input-vanilla,.ibo-input-wrapper.is-error .cke,.is-error.ui_tpicker_hour_slider .cke,.is-error.ui_tpicker_minute_slider .cke,.is-error.ui_tpicker_second_slider .cke,.ibo-input-field-wrapper.is-error .cke,.ibo-input-wrapper.is-error textarea,.is-error.ui_tpicker_hour_slider textarea,.is-error.ui_tpicker_minute_slider textarea,.is-error.ui_tpicker_second_slider textarea,.ibo-input-field-wrapper.is-error textarea{border:1px solid #b44953}.ibo-input-wrapper.is-error .ibo-input-vanilla input,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla input,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla input,.is-error.ui_tpicker_second_slider .ibo-input-vanilla input,.ibo-input-field-wrapper.is-error .ibo-input-vanilla input{border:0;background-color:#11ffee00}input.ibo-input-vanilla{width:unset;display:initial}.ibo-input-wrapper--with-buttons,.ibo-input-select-wrapper--with-buttons{position:relative;display:flex}.ibo-field-validation{color:#f2e0e2}.file-input{display:block;position:relative}.ibo-input--label-right{margin-right:4px;display:inline}.ibo-input--label-left{margin-left:4px;display:inline}.disabled{background-color:#4C566A}.ibo-input-checkbox{height:16px;width:auto}.ibo-input-date-wrapper{position:relative}.ibo-input-date{display:inline-block;width:100%}.ibo-input-date+button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;background-color:transparent;color:#2E3440;border:none}.ibo-input-datetime-wrapper{position:relative}.ibo-input-datetime{display:inline-block;width:100%}.ibo-input-datetime--action-button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;color:#2E3440}.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select{width:auto;padding-right:18px}.ibo-input-duration{display:inline-block;width:unset;text-align:right}.ibo-input-image{display:flex;justify-content:flex-start;align-items:flex-start}.ibo-input-image--image-view{position:relative;overflow:hidden;min-height:96px;background-color:#D8DEE9;border-radius:5px}.ibo-input-image--image-view img[src=""],.ibo-input-image--image-view img[src="null"]{visibility:hidden}.ibo-input-image--image-view input[type="file"]{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;opacity:0}.ibo-input-image--edit-buttons{display:flex;flex-direction:column;margin-left:0.5rem}.ibo-input-image--edit-buttons .ibo-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-input-image--edit-buttons .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-current+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-datepicker-close+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-close+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ibo-button+.ui-button,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-close{margin-top:0.5rem;margin-left:0}.ibo-input-richtext-placeholder{height:200px;width:100%;visibility:hidden}.ibo-input-select,.ui-multiselect,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder{display:inline-flex;min-width:50px}.ibo-input-select:not(.ibo-input-select-autocomplete):not(.ibo-input-selectize),.ui-multiselect:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),.ui_tpicker_hour_slider>select:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),.ui_tpicker_minute_slider>select:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),.ui_tpicker_second_slider>select:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),select.ibo-input-select-placeholder:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete){appearance:none}.ibo-input-select.ibo-input-selectize,.ibo-input-selectize.ui-multiselect,.ui_tpicker_hour_slider>select.ibo-input-selectize,.ui_tpicker_minute_slider>select.ibo-input-selectize,.ui_tpicker_second_slider>select.ibo-input-selectize,select.ibo-input-selectize.ibo-input-select-placeholder{padding-right:0;padding-left:0;min-width:150px !important}.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input{border-width:0px;color:inherit;border-color:white;padding-left:10px}.ibo-input-select.ibo-input-selectize>[data-value],.ibo-input-selectize.ui-multiselect>[data-value],.ui_tpicker_hour_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_minute_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_second_slider>select.ibo-input-selectize>[data-value],select.ibo-input-selectize.ibo-input-select-placeholder>[data-value]{height:100%;line-height:30px;padding-left:10px}.ibo-input-select[size],.ui-multiselect[size],.ui_tpicker_hour_slider>select[size],.ui_tpicker_minute_slider>select[size],.ui_tpicker_second_slider>select[size],select.ibo-input-select-placeholder[size]{height:auto}.ibo-input-select[multiple],.ui-multiselect[multiple],.ui_tpicker_hour_slider>select[multiple],.ui_tpicker_minute_slider>select[multiple],.ui_tpicker_second_slider>select[multiple],select.ibo-input-select-placeholder[multiple]{padding-left:unset;padding-right:unset}.ibo-input-select[multiple] option,.ui-multiselect[multiple] option,.ui_tpicker_hour_slider>select[multiple] option,.ui_tpicker_minute_slider>select[multiple] option,.ui_tpicker_second_slider>select[multiple] option,select.ibo-input-select-placeholder[multiple] option{padding:4px 10px}.ibo-input-select-autocomplete{min-width:150px !important;text-overflow:ellipsis}.ibo-input-selectize{min-width:150px !important}.ibo-input-selectize>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ibo-input-selectize>input{background-color:unset;border:unset}.ibo-input-selectize>input:focus{outline:none !important}.ibo-input-selectize.input-active{border:1px solid #88C0D0}.ibo-input-select-wrapper,.ui_tpicker_hour_slider,.ui_tpicker_minute_slider,.ui_tpicker_second_slider{position:relative}.ibo-input-select-wrapper--with-buttons .selectize-control{display:grid;width:100%}.ibo-input-select-wrapper::after,.ui_tpicker_hour_slider::after,.ui_tpicker_minute_slider::after,.ui_tpicker_second_slider::after{position:absolute;content:"\f0d7";font-family:"Font Awesome 5 Free";font-weight:600;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#7b88a1;pointer-events:none}.ibo-input-select-container{display:flex}.ibo-input-select-wrapper--with-buttons:not(.ibo-input-select-autocomplete-wrapper)::after{position:absolute;content:"\f0d7";font-family:"Font Awesome 5 Free";font-weight:600;cursor:pointer;right:8px;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#7b88a1;pointer-events:none}.ibo-input-select--action-buttons{position:absolute;display:flex;height:28px;margin-top:0;margin-right:3px;font-size:1rem;background-color:inherit;color:#7b88a1;padding:0 2px;text-align:right;bottom:0;top:0;right:0}.ibo-input-select-wrapper .ibo-input-select--action-buttons,.ui_tpicker_hour_slider .ibo-input-select--action-buttons,.ui_tpicker_minute_slider .ibo-input-select--action-buttons,.ui_tpicker_second_slider .ibo-input-select--action-buttons{margin-right:20px}.ibo-input-select--action-button{display:flex;align-items:center;padding-left:6px;padding-right:2px;float:right}.selectize-dropdown.ui-autocomplete,.selectize-dropdown.set-dropdown,.selectize-dropdown.plugin-custom_itop{z-index:2000;max-height:50vh;max-width:50em;overflow-y:auto}.selectize-dropdown.ui-menu .ui-state-active{margin:unset;background-color:#4C566A;color:#E5E9F0}.ibo-input-select--autocomplete-item{display:flex;justify-content:left;align-items:center}.ibo-input-select--autocomplete-item-image{width:25px;height:25px;min-width:25px;min-height:25px;background-position:center center;background-size:100%;border-radius:100%;margin-right:0.5rem;background-color:#ebf8ff;border:1px solid #434C5E}.ibo-input-select-icon{display:inline-flex;text-align:left}.ibo-input-select-icon>img{max-height:100%;max-width:100%;padding-right:4px}.ibo-input-select-icon>span{overflow:hidden}.ibo-input-select-icon--menu{position:absolute;z-index:21;max-height:300px;overflow-x:hidden;overflow-y:auto;flex-wrap:nowrap}.ibo-input-select-icon--menu--item>*{width:100%;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.ibo-input-select-icon--menu--item>*>.ibo-input-select-icon--menu--icon{max-width:80px;max-height:45px;margin-right:10px}/*
+ * @copyright   Copyright (C) 2010-2021 Combodo SARL
+ * @license     http://opensource.org/licenses/AGPL-3.0
+ */.ibo-input-one-way-password-wrapper>*:not(first-child){margin-top:6px}.ibo-input-set>input{height:100%}.ibo-input-set .item[data-value]>.remove{font-size:18px;padding-top:0.15em;border-left:none}.ibo-input-set.has-items::after{content:"\f067";font-family:"Font Awesome 5 Free";font-weight:600;font-size:10px;position:absolute;right:8px;top:5px}.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item{display:inline-block;margin-top:2px;margin-right:0;margin-bottom:2px;padding:4px 6px;max-width:120px;background:white none;border:none;border-radius:3px;box-shadow:0 1px 1px rgba(0, 0, 0, 0.15), 0 0 1px 1px rgba(241, 241, 241, 0.7);color:#191c22;text-shadow:none}.attribute-set .attribute-set-item:not(:first-child),.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item:not(:first-child),.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child),.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child){margin-left:3px}.attribute-set.history-added .attribute-set-item{font-weight:bold}.attribute-set.history-removed .attribute-set-item{text-decoration:line-through;font-style:italic}.selectize-control.multi .selectize-input.ibo-input-set,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active{padding:5px 8px}.ibo-input-text,textarea{width:100%;min-height:12rem;padding:10px 12px}.ibo-input-text.ibo-is-code,textarea.ibo-is-code{background-color:#434C5E}.ibo-input-text--export{width:100%;min-height:15em}.ibo-pill.ibo-is-new{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-neutral,.ui-dialog .ibo-pill.ui-button.ui-dialog-titlebar-close{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-waiting{color:#9c4221;background-color:floralwhite}.ibo-pill.ibo-is-success{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-failure{color:#973d46;background-color:#faf2f3}.ibo-pill.ibo-is-frozen{color:#3B4252;background-color:#E5E9F0}.ibo-pill.ibo-is-active{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-inactive{color:#9c4221;background-color:floralwhite}.ibo-pill{--ibo-main-color--100:#ebf8ff;--ibo-main-color--900:#2a4265;max-width:240px;margin-top:4px;margin-bottom:4px;padding:6px 10px;border-radius:3px;color:var(--ibo-main-color--900);background-color:var(--ibo-main-color--100)}.ibo-pill:hover,.ibo-pill:active{color:inherit}.ibo-prop--apply{width:calc(32px + 12px);padding-left:12px}.ibo-prop--apply.ui-state-error:after{color:#2E3440;content:'\f071';vertical-align:bottom}.ibo-prop--apply.ui-state-error>span{display:none !important}.ibo-prop--cancel{width:calc(32px + 8px);padding-left:8px}.ibo-prop--apply,.ibo-prop--cancel{height:28px}.ibo-prop--apply>span,.ibo-prop--cancel>span{display:block;height:28px;width:32px;text-align:center}.ibo-prop--apply>span>div,.ibo-prop--cancel>span>div{display:inline-flex;justify-content:center;align-items:center;width:100%;height:100%}.ibo-title{color:#E5E9F0;padding:12px 0}.ibo-title--icon{width:90px;height:90px;min-width:90px;min-height:90px;overflow:hidden}.ibo-title--icon>.ibo-title--icon-level-2{width:80px;height:80px;min-width:80px;min-height:80px}.ibo-title--icon>.ibo-title--icon-level-3{width:70px;height:70px;min-width:70px;min-height:70px}.ibo-title--icon-background{width:100%;height:100%;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-title--icon-background--must-contain{background-size:contain}.ibo-title--icon-background--must-cover{background-size:cover}.ibo-title--icon-background--must-zoomout{background-size:66.67%}.ibo-title--subtitle{margin-top:2px;margin-bottom:2px;flex-wrap:wrap}.ibo-title-for-dashlet{padding-top:2em}.ibo-title-for-dashlet--content{background-color:white;border-radius:5px;border:1px solid;border-color:#616e88;padding-bottom:1em}.ibo-title-separator{border-radius:5px 5px 0 0;border-color:#3182ce;color:#3182ce;background-color:#3182ce;border:3px solid;margin:0;padding:0}:root{--ibo-datatable-panel--table-spacing:48px}.ibo-datatable--toolbar{display:flex;justify-content:space-between;align-items:center;padding:0 6px;color:#7b88a1}.ibo-datatable--toolbar:first-child{margin-bottom:18px}.ibo-datatable--toolbar:not(:first-child){margin-top:18px}.ibo-datatable--toolbar-left>*:not(:first-child),.ibo-datatable--toolbar-right>*:not(:first-child){margin-left:1rem}.ibo-datatable-header{color:#D8DEE9}.ibo-datatable-panel>.ibo-panel--body{padding:32px 0 24px}.ibo-datatable--selection-validation-buttons-toolbar{clear:both;margin-top:10px}.ibo-list-column{max-height:150px;overflow-y:auto}.ibo-sort-order::after{color:#dd6c20}.ibo-sort-order.ibo-is-descending::after{content:'\f0dd'}.ibo-sort-order.ibo-is-ascending::after{content:'\f0de'}.ibo-sort-order.ibo-is-none::after{content:'\f0dc'}.itop-fieldsorter>.selected{background-color:#bee3f8}.ibo-datatable tbody>tr{transition:background-color 300ms linear}.ibo-datatable tbody>tr:hover,.ibo-datatable tbody>tr.selected:hover{cursor:pointer;background-color:#2a4265}.ibo-datatable tbody>tr.selected{background-color:#2b6bb0}.ibo-datatable--selected-count,.ibo-datatable--result-count{padding-right:0.2em;padding-left:0.1em}.ibo-prop-header{padding-bottom:14px}.ibo-fieldset~.ibo-fieldset:not(.ibo-column),fieldset~.ibo-fieldset:not(.ibo-column),.ibo-fieldset~fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column~.ibo-fieldset,.ibo-multi-column~fieldset{margin-top:48px}.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend{width:100%;margin-bottom:16px;padding-bottom:4px;border-bottom:2px solid #4C566A}.ibo-field{}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container){}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value{word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value *:not(input, select, textarea){word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value pre{white-space:break-spaces}.ibo-field-large{display:block}.ibo-field-large .ibo-field--label{position:relative;display:flex;align-items:center;max-width:initial;width:100%}.ibo-field-large .ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px;min-width:100px;max-width:145px;width:30%}.ibo-field-large .ibo-field--value{margin-top:2px}.ibo-field-large .ibo-field--value>*{--ibo-scrollbar--scrollbar-track-background-color:#f2f2f2}.ibo-field-large.ibo-is-fullscreen{background-color:#3B4252}.ibo-field-large.ibo-is-fullscreen .ibo-field--label{position:fixed;width:100%;min-width:initial;max-width:initial;padding:4px 8px;background-color:#2E3440;border-bottom:1px solid #616e88}.ibo-field-large.ibo-is-fullscreen .ibo-field--value{padding:36px 8px 4px 8px}.ibo-field-large.ibo-is-fullscreen .ibo-field--value>*{height:initial !important;width:initial !important}.ibo-field-small{display:table;width:100%}.ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px}.ibo-field--fullscreen-toggler{width:20px;height:20px;border-radius:5px;cursor:pointer}.ibo-field--fullscreen-toggler:hover{background-color:#4C566A}.ibo-field--label{min-width:100px;max-width:145px;width:30%;word-break:break-word}.ibo-field--label>.ibo-has-description::after{content:"?";padding-left:4px;vertical-align:top;cursor:pointer;color:#7b88a1}.ibo-field--label-small .ibo-field--label{width:20em}.ibo-field--value{width:100%;color:#E5E9F0}.ibo-field--value .HTML table{table-layout:fixed;width:100%}.ibo-field--label>.ibo-field--comments{flex:auto}.ibo-fieldset-legend>.ibo-field--comments,.ibo-dashboard-editor--properties-subtitle>.ibo-field--comments,.ibo-dashboard--available-dashlet--title>.ibo-field--comments,.ibo-dashlet--properties--title>.ibo-field--comments,legend>.ibo-field--comments{padding-bottom:2px;font-size:1.17rem}.ibo-field--comments{display:table-cell;vertical-align:top;width:5em}.ibo-field--comments>input[type="checkbox"]{margin-left:5px;float:right}.ibo-field--comments>.multi_values,.ibo-field--comments>.mono_value,.ibo-field--comments>.ibo-field--comments--synchro{float:right}.mailto,.tel{white-space:nowrap}.mailto .text_decoration,.tel .text_decoration{margin-right:0.5rem;font-size:0.9em}.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration{margin-right:0.5rem}.ibo-field--enable-bulk,.ibo-field--comments--synchro{display:inline;padding:2px 5px;margin:0 0 0 5px;height:calc(100% - 5px);border-radius:5px;font-weight:bold;white-space:nowrap}.ibo-field--enable-bulk--checkbox{margin-left:8px}.ibo-toolbar{display:flex;align-items:center}.ibo-toolbar.ibo-toolbar--action{position:relative}.ibo-toolbar.ibo-toolbar--button{margin-top:16px}.ibo-toolbar-spacer{flex-grow:1}.ibo-toolbar-vertical-separator{display:inline-flex;border-right:1px solid #4C566A;width:1px;height:16px;margin:0 0.75rem}.search_box{box-sizing:border-box;position:relative;z-index:1100;text-align:center}.search_box *{box-sizing:border-box}.search_form_handler{}.search_form_handler a{}.search_form_handler input[type="text"],.search_form_handler select{padding:1px 2px}.search_form_handler:not(.closed) .sf_title .sft_short{display:none}.search_form_handler:not(.closed) .sf_title .sft_toggler{transform:rotateX(180deg);transition:transform 0.5s linear}.search_form_handler.closed{margin-bottom:0.5em;width:150px;overflow:hidden;border-radius:4px}.search_form_handler.closed .sf_criterion_area{height:0;opacity:0;padding:0}.search_form_handler.closed .sf_title{padding:6px 8px;text-align:center;font-size:12px}.search_form_handler.closed .sf_title .sft_long{display:none}.search_form_handler.closed .sf_title .sft_hint,.search_form_handler.closed .sf_title .sfobs_hint{display:none}.search_form_handler:not(.no_auto_submit) .sft_hint{display:none}.search_form_handler:not(.no_auto_submit) .sfc_fg_apply{display:none}.search_form_handler.no_auto_submit .sfc_fg_search{display:none}.search_form_handler.no_auto_submit .sft_hint{display:inline-block}.search_form_handler:not(.hide_obsolete_data) .sfobs_hint{display:none}.search_form_handler.hide_obsolete_data .sfobs_hint{display:inline-block}.search_form_handler.hide_obsolete_data.no_auto_submit .sfobs_hint{margin-left:30px}.search_form_handler .sf_message{display:none;margin:8px 8px 0 8px;border-radius:0px}.search_form_handler .sf_criterion_area{padding:8px 8px 3px 8px}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child){margin-top:20px}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::before{content:"";position:absolute;top:-12px;left:0px;width:100%;border-top:1px solid #D8DEE9}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::after{content:"or";position:absolute;top:-20px;left:8px;padding-left:5px;padding-right:5px;color:#434C5E;background-color:white}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group{display:inline}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_fg_button,.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_header{border:1px solid #4C566A;border-radius:3px}.search_form_handler .sf_criterion_area .search_form_criteria,.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{position:relative;display:inline-block;margin-right:10px;margin-top:3px;margin-bottom:3px;vertical-align:top}.search_form_handler .sf_criterion_area .search_form_criteria.opened,.search_form_handler .sf_criterion_area .sf_more_criterion.opened,.search_form_handler .sf_criterion_area .sf_button.opened{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_header,.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfc_header,.search_form_handler .sf_criterion_area .sf_button.opened .sfc_header,.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfm_header,.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_header,.search_form_handler .sf_criterion_area .sf_button.opened .sfm_header{border-bottom:none !important;padding-bottom:13px}.search_form_handler .sf_criterion_area .search_form_criteria>*,.search_form_handler .sf_criterion_area .sf_more_criterion>*,.search_form_handler .sf_criterion_area .sf_button>*{padding:7px 8px;vertical-align:top;border:solid 1px #4C566A;border-radius:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfm_content,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content,.search_form_handler .sf_criterion_area .sf_button .sfm_content{position:absolute;z-index:-1;min-width:100%;left:0px;margin-top:-1px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_button .sfc_fg_buttons,.search_form_handler .sf_criterion_area .search_form_criteria .sfm_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_buttons,.search_form_handler .sf_criterion_area .sf_button .sfm_buttons{white-space:nowrap}.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{min-width:34px;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria{}.search_form_handler .sf_criterion_area .search_form_criteria.locked{background-color:#7b88a1}.search_form_handler .sf_criterion_area .search_form_criteria.locked .sfc_title{user-select:none;cursor:initial}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_header,.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_form_group{border-style:dashed;border-color:#434C5E}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_title{font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria.opened{z-index:1}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_toggle{transform:rotateX(-180deg)}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_form_group{display:block;margin-top:-1px;z-index:-1}.search_form_handler .sf_criterion_area .search_form_criteria.opened_left .sfc_form_group{left:auto;right:0px}.search_form_handler .sf_criterion_area .search_form_criteria:not(:last-of-type){margin-right:12px}.search_form_handler .sf_criterion_area .search_form_criteria>*{background-color:#2E3440;color:#E5E9F0}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close{position:absolute;top:7px;color:#698fb5}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{position:absolute;top:9px;color:#4C566A}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle{display:inline-block;right:23px;transition:all 0.3s ease-in-out}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title{max-width:240px;padding-right:30px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;cursor:pointer}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title .sfc_values{font-weight:bold}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group{position:absolute;display:none;max-width:450px;width:max-content;max-height:520px;overflow-x:auto;overflow-y:hidden}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators{font-size:12px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator.force_hide{display:none !important}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label{line-height:20px;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label>*{display:inline-block;vertical-align:middle}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_radio{width:12px;margin:0;margin-right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_name{width:96px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]{display:unset;width:160px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices label>input{vertical-align:text-top;margin-left:0;margin-right:8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper{max-height:415px;overflow-y:auto;margin:0 -8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list{text-align:left}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected{position:relative;padding-top:5px;margin-top:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected::before{content:"";position:absolute;border-top:1px solid #7b88a1;width:calc(100% - 12px);margin-left:6px;top:0px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_placeholder{padding:15px 8px;font-style:italic;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item{padding:4px 8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item:hover{background-color:#4C566A}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item label{display:inline-block;width:100%}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint{margin-top:15px;margin-bottom:15px;padding-left:9px;padding-right:9px;color:#3B4252;font-size:10px;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint>span{margin-right:0.5em;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_cancel{margin-top:8px;font-size:1rem}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply{margin-right:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{position:absolute;bottom:7px;right:0px;cursor:pointer;color:#2c5382;font-size:10px;font-weight:bold;border:none;background-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more>span,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less>span{margin-left:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:first-of-type .sfc_op_radio{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator{margin-bottom:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:last-of-type{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:first-of-type .sfc_op_radio{display:inherit}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_less{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_more{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .hide_on_advanced{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group:not(.advanced) .hide_on_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw>*{border-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_title{cursor:initial;padding-right:20px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_form_group{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_from_outer{display:inline}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_until_outer{display:inline;margin-left:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_from_label,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_until_label{width:45px;display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between input[type="text"]{width:77px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_form_group.advanced .sfc_fg_operator_between,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_form_group.advanced .sfc_fg_operator_between{margin-bottom:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_fg_operator_between_days input,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_fg_operator_between_days input{width:135px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger{background:none;border:none;height:100%;padding:2px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger img,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger img{vertical-align:middle}.search_form_handler .sf_criterion_area .sf_more_criterion.opened{z-index:2}.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_content{display:inherit}.search_form_handler .sf_criterion_area .sf_more_criterion.opened_left .sfm_content{left:auto;right:0px}.search_form_handler .sf_criterion_area .sf_more_criterion>*{background-color:#2E3440;color:#E5E9F0}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_title{margin-right:7px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_icon{color:#698fb5}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content{display:none;min-width:200px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists{margin:0 -8px;padding:0 8px;max-height:400px;overflow-x:hidden;overflow-y:auto}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists .sfl_items>li:hover{background-color:#4C566A}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons{display:none}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button{margin-top:8px;margin-right:5px;padding:3px 6px;font-size:11px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button:last-of-type{margin-right:0}.search_form_handler .sf_criterion_area .sf_button{cursor:pointer}.search_form_handler .sf_criterion_area .sf_button>*{background-color:#2E3440;color:#81A1C1}.search_form_handler .sf_list:not(:first-of-type) .sfl_title{border-top:1px solid #616e88;padding-top:8px;margin-top:5px}.search_form_handler .sf_list .sfl_title{font-weight:bold}.search_form_handler .sf_list .sfl_items{margin:5px -8px 0 -8px;padding:0;text-align:left}.search_form_handler .sf_list .sfl_items>li{padding:4px 8px;list-style:none;white-space:nowrap}.search_form_handler .sf_list .sfl_items>li:hover{background-color:#4C566A}.search_form_handler .sf_list .sfl_items>li.sfl_i_placeholder{font-style:italic;opacity:0.8}.search_form_handler .sf_list .sfl_items>li>label{display:inline-block;width:100%}.search_form_handler .sf_list .sfl_items>li>label>*{vertical-align:middle}.search_form_handler .sf_list .sfl_items>li>label>input[type="checkbox"]{margin-left:0;margin-right:8px}.search_form_handler .sf_filter{position:relative;margin-top:8px;margin-bottom:8px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button,.search_form_handler .sf_filter .sff_picto{vertical-align:middle;height:22px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button{border:1px solid #ABABAB}.search_form_handler .sf_filter input{width:100% !important}.search_form_handler .sf_filter button{width:23px;background-color:white;color:#698fb5;font-size:10px}.search_form_handler .sf_filter button:first-of-type{margin-left:5px}.search_form_handler .sf_filter button:not(:first-of-type){border-left:transparent}.search_form_handler .sf_filter .sff_input_wrapper{position:relative}.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{display:unset}.search_form_handler .sf_filter .sff_input_wrapper .sff_picto{position:absolute;right:7px;top:3px;user-select:none;color:#2E3440}.search_form_handler .sf_filter .sff_input_wrapper .sff_reset{display:none}.search_form_handler .sf_filter .sff_input_wrapper input::-ms-clear{display:none}.search_form_handler .sf_filter.sf_with_buttons input{width:calc(100% - 28px) !important;min-width:120px}.sft_hint,.sfobs_hint,.sft_toggler{margin-left:8px;color:#2E3440}.sf_results_placeholder{margin-top:24px;text-align:center}.sf_results_placeholder button{margin-top:8px}.sf_results_placeholder button>span{margin-right:0.5em}.ibo-search-form-panel{z-index:3;margin-bottom:8px}.ibo-search-form-panel .ibo-panel--body{padding:18px 14px 10px;overflow:initial}.ibo-search-form-panel .ibo-panel--body::before{border-radius:5px 5px 0 0}#ibo-main-content .search_form_handler .sf_criterion_area{padding:0}.sfm_tg_title{display:none}.ibo-criterion-group:empty~.sf_more_criterion .sfm_tg_title{display:unset}.sf_results_area{z-index:1;margin-bottom:300px}.ibo-search-form-panel .ibo-panel--body.ibo-is-sticking{position:fixed;border-radius:0;border-bottom-color:transparent}.ibo-datatable-panel.ibo-is-sticking .ibo-panel--header{z-index:0}.ibo-datatable-panel.ibo-is-sticking .ibo-datatable--toolbar{position:fixed;z-index:2;padding-bottom:4px;background-color:#3B4252;border-left:1px solid #232831;border-right:1px solid #232831}.ibo-datatable-panel.ibo-is-sticking .dataTables_scrollHead{position:fixed !important;z-index:2;background-color:#3B4252;border-left:1px solid #232831 !important;border-right:1px solid #232831 !important}.ibo-field-badge{display:inline-flex;align-items:baseline;margin:0;padding:4px 10px;border-radius:3px;background-color:var(--ibo-main-color);color:var(--ibo-complementary-color)}.ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:0.5rem}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-input{display:none}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name{margin-left:10px}.ibo-medallion-icon{display:flex;padding:13px 0}.ibo-medallion-icon--image{height:48px;width:48px;padding:2px;border-radius:100%;background-color:#bee3f8}.ibo-medallion-icon--description{display:inline-block;padding-left:8px}:root{}.ibo-navigation-menu{position:relative;height:100vh}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--square-company-logo{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--full-company-logo{display:flex}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-selection{display:inline-block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-visual-hint{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body{width:310px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(1){top:4px;left:7px;width:14px;transform:rotateZ(-45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(2){top:8px;left:7px;width:0;opacity:0}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(3){top:12px;left:7px;width:14px;transform:rotateZ(45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:16px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part{padding:24px 0 12px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--notifications .ibo-navigation-menu--notifications-toggler{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info{height:100%}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{display:block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{margin-top:-60px;width:72px;height:72px;border:solid 3px #263238}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{max-width:72px;max-height:72px}.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{right:calc(-1 * 312px)}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-filter-clear{display:block}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes{margin-bottom:48px}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes .ibo-navigation-menu--menu-nodes-title{margin-bottom:8px}.ibo-navigation-menu--body,.ibo-navigation-menu--drawer{height:100vh}.ibo-navigation-menu--body{z-index:1;display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;height:100vh;width:60px;background-color:#191c22;transition:width 0.1s ease-in-out}.ibo-navigation-menu--top-part{z-index:2;min-height:120px;padding:16px 16px;overflow:hidden}.ibo-navigation-menu--middle-part{z-index:1;flex-grow:1;overflow-y:auto;padding:24px 16px 16px;scrollbar-width:thin;scrollbar-color:#7b88a1 rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar{width:5px}.ibo-navigation-menu--middle-part::-webkit-scrollbar-track{background-color:rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar-thumb{background-color:#7b88a1}.ibo-navigation-menu--bottom-part{z-index:2;padding-top:20px;padding-bottom:16px;height:126px;background-color:#232831;justify-content:space-between;flex-direction:column}.ibo-navigation-menu--toggler,.ibo-navigation-menu--menu-group{margin:calc(-1 * 10px) calc(-1 * 8px);padding:10px 8px;border-radius:5px}.ibo-navigation-menu--square-company-logo{display:flex;width:38px;height:38px;margin:0 -5px 32px}.ibo-navigation-menu--square-company-logo>img{object-fit:contain}.ibo-navigation-menu--full-company-logo{display:none;width:310px;height:70px;margin:0 0 0 -16px}.ibo-navigation-menu--full-company-logo>img{object-fit:contain;margin:0 auto}.ibo-navigation-menu--toggler{position:relative;display:inline-flex;width:44px}.ibo-navigation-menu--toggler:hover,.ibo-navigation-menu--toggler:active{background-color:#455a64}.ibo-navigation-menu--toggler:hover .ibo-navigation-menu--toggler-bar,.ibo-navigation-menu--toggler:active .ibo-navigation-menu--toggler-bar{background-color:white}.ibo-navigation-menu--toggler-icon{position:relative;display:flex;height:20px;width:28px}.ibo-navigation-menu--toggler-bar{position:absolute;display:block;height:3px;width:100%;opacity:1;transition:all 0.2s linear;background-color:#D8DEE9}.ibo-navigation-menu--toggler-bar:nth-child(1){top:0}.ibo-navigation-menu--toggler-bar:nth-child(2){top:8px}.ibo-navigation-menu--toggler-bar:nth-child(3){top:16px}.ibo-navigation-menu--silo-selection{position:absolute;display:none;width:70%;margin-left:15px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-multiselect,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ibo-input-wrapper select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"]{padding-right:38px;overflow:hidden}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete{padding-right:60px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search{margin-left:-42px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear{margin-left:-72px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy{margin-left:-60px}.ibo-navigation-menu--silo-visual-hint{position:absolute;top:2px;right:0;width:16px;height:16px;background-color:#BF616A;border:2px solid #191c22;border-radius:100%}.ibo-navigation-menu--menu-group{display:flex;justify-content:left;align-items:center;white-space:nowrap;overflow-x:hidden;color:#D8DEE9;transition-property:background-color, color, padding, margin, border-radius;transition-duration:0.1s;transition-timing-function:linear}.ibo-navigation-menu--menu-group>.ibo-navigation-menu--menu-group-icon,.ibo-navigation-menu--menu-group>.ibo-navigation-menu--menu-group-title{display:flex}.ibo-navigation-menu--menu-group:not(:last-child){margin-bottom:20px}.ibo-navigation-menu--menu-group:not(.ibo-is-active):hover,.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{color:white;background-color:#455a64}.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:100%}.ibo-navigation-menu--menu-group.ibo-is-active{margin-right:calc(-2 * 8px);padding-right:calc(2 - 8px);color:#a5cfdc;background-color:#26374b;border-radius:5px 0 0 5px}.ibo-navigation-menu--menu-group.ibo-is-active .ibo-navigation-menu--menu-group-icon{color:#81A1C1}.ibo-navigation-menu--menu-group-icon{width:28px;min-width:28px;justify-content:center;font-size:1.83rem}.ibo-navigation-menu--menu-group-icon::before{width:28px}.ibo-navigation-menu--menu-group-title{margin-left:16px;justify-content:left}.ibo-navigation-menu--drawer{position:absolute;z-index:-1;top:0;bottom:0;right:0;display:flex;flex-direction:column;justify-content:flex-start;width:312px;padding:32px 20px;background-color:#26374b;border-right:1px solid #7b88a1;transition:right 0.2s ease-in-out}.ibo-navigation-menu--menu-filter{position:relative}.ibo-navigation-menu--menu-filter-input{width:100%;padding:8px 10px;color:#D8DEE9;background-color:#434C5E;border:1px solid #88C0D0;border-radius:3px;padding-right:76px}.ibo-navigation-menu--menu-filter-input::placeholder{color:#D8DEE9}.ibo-navigation-menu--menu-filter-input:-ms-input-placeholder,.ibo-navigation-menu--menu-filter-input::-ms-input-placeholder{color:#D8DEE9}.ibo-navigation-menu--menu-filter-clear{display:none;position:absolute;top:8px;right:60px;padding:3px 3px}.ibo-navigation-menu--menu-filter-hotkey{position:absolute;top:6.5px;right:10px;border:1px solid #7b88a1;border-radius:3px;color:#D8DEE9;padding:2px 4px}.ibo-navigation-menu--menu-filter-hint{position:relative;margin-top:16px;padding-right:12px;color:#E5E9F0}.ibo-navigation-menu--menu-filter-hint-close{position:absolute;top:1px;right:2px}.ibo-navigation-menu--menu--placeholder{width:100%;margin-top:50px}.ibo-navigation-menu--menu--placeholder-image>svg{display:block;width:90%;height:auto;margin:auto}.ibo-navigation-menu--menu--placeholder-hint{margin-top:8px;text-align:center}.ibo-navigation-menu--menu-groups{overflow-y:auto;overflow-x:hidden;margin:50px calc(-1 * 20px) 0 calc(-1 * 20px);padding-left:20px;padding-right:20px;width:inherit}.ibo-navigation-menu--menu-nodes{display:none}.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul li>span{margin:0 -10px;padding:6px 10px;border-radius:0;color:#E5E9F0}.ibo-navigation-menu--menu-nodes ul li>a{color:inherit}.ibo-navigation-menu--menu-nodes ul li>a:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover{background-color:#698fb5;border-radius:5px}.ibo-navigation-menu--menu-nodes ul ul{padding-left:20px}.ibo-navigation-menu--menu-nodes.ibo-is-active{display:block}.ibo-navigation-menu--menu-nodes-title{margin-top:0;margin-bottom:32px}.ibo-navigation-menu--menu-node-title{display:flex;justify-content:space-between;align-items:center}.ibo-navigation-menu--menu-node-counter{margin-left:8px;padding:2px 6px;width:34px;min-width:34px;text-align:center;background:#698fb5;border-radius:5px}.ibo-navigation-menu--notifications{position:relative;display:flex;flex-direction:column;align-content:center}.ibo-navigation-menu--notifications-toggler{position:relative;font-size:2rem;color:#434C5E}.ibo-navigation-menu--notifications-toggler:hover,.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:hover{color:#f2f2f2}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded{color:#7b88a1}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--notifications-toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-7px;width:16px;height:16px}.ibo-navigation-menu--user-notifications--toggler{position:relative}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded{color:#7b88a1}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--user-notifications--toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-5px;width:10px;height:10px}.ibo-navigation-menu--notifications-toggler--new-messages{position:absolute;display:none;background-color:#BF616A;border:2px solid #232831;border-radius:100%}.ibo-navigation-menu--user-info{justify-content:space-between;flex-direction:column}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{width:36px;height:36px;overflow:hidden;background-color:#7b88a1;border-radius:100%}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{display:flex;max-width:36px;max-height:36px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications{display:none;text-align:center;color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--text,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--toggler{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message--toggler{padding-left:6px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--text{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--toggler--icon{padding-left:5px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{color:#ebf8ff}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container{position:absolute;bottom:10px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ui-multiselect-checkboxes:nth-child(odd),.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ui-multiselect-checkboxes:nth-child(odd){background-color:#E5E9F0}:root{--ibo-top-bar--height:54px;--ibo-top-bar--padding-left:16px;--ibo-top-bar--padding-right:16px;--ibo-top-bar--padding-y:0;--ibo-top-bar--background-color:#3B4252;--ibo-top-bar--elements-spacing:32px;--ibo-top-bar--quick-actions--margin-right:32px}.ibo-top-bar{height:var(--ibo-top-bar--height);padding:var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-right) var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-left);background-color:var(--ibo-top-bar--background-color)}.ibo-top-bar .ibo-breadcrumbs{flex-grow:1;overflow-x:hidden}.ibo-top-bar--quick-actions{margin-right:var(--ibo-top-bar--quick-actions--margin-right)}.ibo-top-bar--toolbar-dashboard-title{max-width:350px}.ibo-top-bar--toolbar-dashboard-menu-toggler{display:flex;align-items:center}.switch{position:relative;display:inline-block;width:36px;height:20px;vertical-align:baseline}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#434C5E;transition:0.4s}.slider:before{position:absolute;content:"";height:15px;width:15px;left:3px;bottom:3px;background-color:#7b88a1;transition:0.4s}input:checked+.slider{background-color:#698fb5}input:focus+.slider{box-shadow:0 0 1px #698fb5}input:checked+.slider:before{transform:translateX(14.5px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:7px}#ibo-center-container.ibo-center-container--with-side-content{display:flex;align-items:stretch}#ibo-center-container.ibo-center-container--with-side-content #ibo-main-content{flex-grow:1}.ibo-v-spacer{padding-top:1em}#ibo-side-content{background-color:#2E3440;border-left:1px solid #191c22}.ibo-tab-container:not(.ibo-is-scrollable):not([data-status="loaded"]) .ibo-tab-container--tab-container:not(:first-child){display:none}.ibo-tab-container--tabs-list{position:relative;height:36px;background-color:#4C566A}.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container{color:#ECEFF4}.ibo-tab-container--tab-header:hover:not(.ui-state-disabled),.ibo-tab-container--extra-tabs-container:not(.ui-state-disabled):hover{color:#bee3f8;background-color:#616e88}.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{color:#90cef4}.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler{padding-left:24px;padding-right:24px}.ibo-tab-container--extra-tabs-container{position:absolute;top:0;bottom:0;right:0;background-color:#4C566A}.ibo-tab-container--extra-tabs-list-toggler{padding-left:12px;padding-right:12px}.ibo-tab-container--extra-tabs-list{position:absolute;z-index:1;top:calc(100% + 6px);right:12px;max-height:300px;display:flex;flex-direction:column;background-color:#4C566A;border-radius:3px}.ibo-tab-container--extra-tab-toggler{padding:8px 16px;max-width:220px;color:#ebf8ff}.ibo-tab-container--extra-tab-toggler:hover,.ibo-tab-container--extra-tab-toggler:active{color:#bee3f8;background-color:#4C566A}.ibo-tab-container--tab-container{padding:32px 32px;overflow-x:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container--label{display:block}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container{min-height:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container:last-child{min-height:60vh}.ibo-tab-container--tab-container--label{display:none;margin-bottom:20px;overflow-x:hidden}.ibo-tab-container--tab-container--label>span{position:relative;padding-left:20px;margin-left:40px;color:#D8DEE9}.ibo-tab-container--tab-container--label>span::before,.ibo-tab-container--tab-container--label>span::after{content:"";display:inline-block;position:absolute;top:calc(50% - (2px / 2));height:1px;width:10000px;border-top:2px solid #D8DEE9}.ibo-tab-container--tab-container--label>span::before{right:100%}.ibo-tab-container--tab-container--label>span::after{left:100%;margin-left:20px}.ibo-tab--temporary-remote-content{position:relative}.ibo-tab--temporary-remote-content--placeholder{position:relative;height:auto;max-height:300px;text-align:center}.ibo-tab--temporary-remote-content--placeholder>svg{max-width:calc(300px * 5.4);max-height:300px}.ibo-tab--temporary-remote-content--button{position:absolute;top:0;display:flex;justify-content:center;align-content:center;flex-direction:column;text-align:center;height:100%;width:100%;cursor:pointer;background-color:transparent;color:#2E3440}.ibo-tab--temporary-remote-content--button:hover{opacity:0.5;background-color:#191c22;color:#D8DEE9}.ibo-multi-column{display:flex;flex-wrap:wrap;margin:0 -16px}.ibo-column{min-width:300px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%}.ibo-column:not(:last-child) .ibo-column:not(.ibo-without-margin){margin-bottom:48px}.ibo-mini-column{min-width:30px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%;display:flex;flex-direction:column}.ibo-mini-column>.ibo-button,.ui-dialog .ibo-mini-column>.ui-button,.ibo-mini-column>.ui-datepicker-current,.ibo-mini-column>.ui-datepicker-close{margin-left:0;margin-right:0}.ibo-mini-column:not(:last-child){margin-bottom:48px}.ibo-dashboard--top-bar{display:flex;justify-content:space-between;align-items:center;padding-bottom:20px}.ibo-dashboard--top-bar .ibo-dashboard--top-bar-toolbar{display:flex;align-items:center}.ibo-dashboard--selector{display:flex;align-items:center;margin-left:12px;margin-right:1px}.ibo-dashboard--selector:hover{background-color:#E5E9F0;border-radius:4px}.ibo-dashboard--selector .selector-label{display:inline-block;margin-left:10px;margin-right:10px;vertical-align:super}.ibo-dashboard--grid{width:100%}.ibo-dashboard--grid-row{display:flex;flex-direction:row;justify-content:space-between;overflow:hidden}.ibo-dashboard--grid-row:not(:last-child){padding-bottom:calc(24px / 2)}.ibo-dashboard--grid-row:not(:first-child){padding-top:calc(24px / 2)}.ibo-dashboard--grid-column{display:flex;flex-flow:row wrap;align-items:flex-start;align-content:flex-start;width:calc(100% + (2 * 24px));margin:calc(-1 * 24px / 2) calc(-1 * 24px / 2);min-width:0}.ibo-dashboard--grid-column:not(:last-child){margin-right:0}.ibo-dashboard--grid-column:not(:first-child){margin-left:0}.ibo-dashboard--grid-column.edit_mode{margin:1px;border:2px #ccc dashed;width:100%;min-height:40px}.ibo-dashboard--switch{position:relative;display:inline-block;width:30px;height:24px;vertical-align:baseline}.ibo-dashboard--switch input{display:none}.ibo-dashboard--slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.ibo-dashboard--slider:before{position:absolute;right:5px;bottom:3px;color:#2E3440;content:"\f007";font-family:"Font Awesome 5 Free", serif;font-size:0.83rem;font-weight:900}.ibo-dashboard--slider:after{position:absolute;left:6px;bottom:1px;color:#698fb5;content:"\f1ad";font-family:"Font Awesome 5 Free", serif;font-size:1.17rem;font-weight:900}input:checked+.ibo-dashboard--slider:before{content:"\f1ad"}input:checked+.ibo-dashboard--slider:after{content:"\f007"}.ibo-dashboard-editor--pane{flex-grow:1;padding:16px 30px 16px 15px;overflow:auto}.ibo-dashboard-editor--available-dashlet-icon{display:inline-block;height:34px;width:34px;margin:2px 5px;cursor:grab}.ibo-dashboard-editor--available-dashlet-icon:active{cursor:move}.ibo-dashboard-editor--properties,.ibo-dashboard--available-dashlets,.ibo-dashlet--properties{display:flex;flex-direction:column;padding-bottom:20px}.ibo-dashboard-editor--properties table,.ibo-dashboard--available-dashlets table,.ibo-dashlet--properties table{width:100%;text-align:left}.ibo-dashboard-editor--properties table td,.ibo-dashboard--available-dashlets table td,.ibo-dashlet--properties table td,.ibo-dashboard-editor--properties table th,.ibo-dashboard--available-dashlets table th,.ibo-dashlet--properties table th{margin-bottom:14px}.ibo-dashboard-editor--properties-title{padding-bottom:2rem}.ibo-dashboard-editor--layout-list{display:flex;justify-content:center;padding-bottom:12px}.ibo-dashboard-editor--layout-list>.ui-button{display:inline-block;height:auto;margin:0 15px 0 5px}.ibo-dashboard--available-dashlets--list{display:flex;justify-content:center;flex-wrap:wrap}#dashboard_editor{display:flex;flex-direction:row;padding:0}#dashboard_editor>.itop-dashboard{resize:horizontal;overflow:scroll;border-right:solid 1px #D8DEE9;padding:16px 15px 16px 30px}.ibo-dashboard-editor--delete-dashlet-icon{position:absolute;top:7px;right:9px;padding:2px 6px;z-index:21}.ibo-dashboard-editor .itop-dashboard a{cursor:not-allowed}.ibo-wizard-container{padding:10px 16px;background:#2a4265;border-radius:3px;border-left:3px solid #3182ce}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left{margin-left:32px;padding-left:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon{bottom:calc(-1 * 96px / 2 + -12px);width:96px;height:96px;min-width:96px;min-height:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles{padding-left:32px}.ibo-object-details--status-dot{width:10px;height:10px;min-width:10px;min-height:10px;border-radius:100%}.ibo-object-details--status-dot+.ibo-object-details--status-label{margin-left:8px}.ibo-object-details--status+.ibo-object-details--object-class{margin-left:0.5rem}.ibo-object-details--status+.ibo-object-details--object-class::before{content:"("}.ibo-object-details--status+.ibo-object-details--object-class::after{content:")"}.ibo-object-details--tag{color:#a8b0c1}.ibo-object-details--tag:not(:first-child){margin-left:12px}.ibo-object-details--tag-icon{margin-right:6px;color:#3B4252}.ibo-object-details--object-class~.ibo-object-details--tag::before,.ibo-object-details--tag~.ibo-object-details--tag::before{content:" ";display:inline-block;vertical-align:middle;margin-right:12px;width:5px;height:5px;border-radius:100%;background-color:#7b88a1}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header{}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--header-left{}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-object-details--object-class{display:none}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header{}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-left{padding-left:48px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-right{padding-right:8px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles{padding-left:32px}.ibo-activity-panel{position:relative;display:flex;flex-direction:column;width:480px;height:100%;transition:width 0.2s ease-in-out}.ibo-activity-panel.ibo-is-expanded{width:60vw}.ibo-activity-panel.ibo-is-expanded .ibo-activity-panel--expand-icon{display:none}.ibo-activity-panel:not(.ibo-is-expanded) .ibo-activity-panel--reduce-icon{display:none}.ibo-activity-panel.ibo-is-closed{width:32px}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--header,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--body,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--add-caselog-entry-button{display:none}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--closed-cover{display:inherit}.ibo-activity-panel--header{position:relative;background-color:#616e88}.ibo-activity-panel--header>.ibo-activity-panel--tabs-togglers a{color:#2E3440}.ibo-activity-panel--togglers{position:absolute;right:16px;top:0;bottom:0;color:#434C5E}.ibo-activity-panel--togglers:hover{color:#2E3440}.ibo-activity-panel--togglers>*:not(:first-child){margin-left:0.75rem}.ibo-activity-panel--tabs-togglers{position:relative;padding-left:48px;padding-right:48px}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title{background-color:#D8DEE9}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title-messages-count{display:none}.ibo-activity-panel--tab-toggler.ibo-is-draft .ibo-activity-panel--tab-title-draft-indicator{display:initial}.ibo-activity-panel--tab-toggler-for-caselog-1 .ibo-activity-panel--tab-title-decoration{background-color:#689f38}.ibo-activity-panel--tab-toggler-for-caselog-2 .ibo-activity-panel--tab-title-decoration{background-color:#b83280}.ibo-activity-panel--tab-toggler-for-caselog-3 .ibo-activity-panel--tab-title-decoration{background-color:#f6ae55}.ibo-activity-panel--tab-toggler-for-caselog-4 .ibo-activity-panel--tab-title-decoration{background-color:#3182ce}.ibo-activity-panel--tab-toggler-for-caselog-5 .ibo-activity-panel--tab-title-decoration{background-color:#80deea}.ibo-activity-panel--tab-toggler-for-caselog-6 .ibo-activity-panel--tab-title-decoration{background-color:#c5e1a5}.ibo-activity-panel--tab-toggler-for-caselog-7 .ibo-activity-panel--tab-title-decoration{background-color:#fbb6ce}.ibo-activity-panel--tab-title{padding:8px 16px}.ibo-activity-panel--tab-title:hover{background-color:#D8DEE9}.ibo-activity-panel--tab-title-decoration{display:inline-flex;margin-right:8px;width:12px;height:12px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count{display:inline-block;margin-left:8px;background-color:#D8DEE9;padding:0 4px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count[data-messages-count="0"]{display:none}.ibo-activity-panel--tab-title-draft-indicator{display:none;margin-left:8px}.ibo-activity-panel--tab-title-text{max-width:100px}.ibo-activity-panel--tab-toolbar{display:none;flex-direction:column;padding-left:10px;padding-right:10px;background-color:#D8DEE9}.ibo-activity-panel--tab-toolbar.ibo-is-active{display:flex}.ibo-activity-panel--tab-toolbar-actions{justify-content:space-between;flex-wrap:nowrap;margin:4px 0;height:32px}.ibo-activity-panel--tab-toolbar-left-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child)::before{content:"-";margin:0 8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action>input{margin-right:8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child){margin-left:18px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info{color:#2E3440}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info>.ibo-activity-panel--tab-toolbar-info-icon{margin-left:8px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info:not(:first-child){margin-left:16px}.ibo-activity-panel--tab-toolbar-action{position:relative;color:#2E3440}.ibo-activity-panel--filter{cursor:pointer}.ibo-activity-panel--filter-options-toggler{padding-left:0.5rem;color:#2E3440}.ibo-activity-panel--filter-options-toggler.ibo-is-closed{transform:rotateX(180deg)}.ibo-activity-panel--filter-options-toggler.ibo-is-closed+.ibo-activity-panel--filter-options{display:none}.ibo-activity-panel--filter-options{position:absolute;z-index:1;display:flex;flex-direction:column;top:24px;left:-12px;max-width:200px;padding:8px 12px;background-color:#D8DEE9;border-radius:3px}.ibo-activity-panel--filter-option{cursor:pointer}.ibo-activity-panel--filter-option:not(:first-child){margin-top:8px}.ibo-activity-panel--filter-option-input{margin-right:0.5rem}.ibo-activity-panel--body{flex-grow:1;overflow:auto;padding:16px 16px}.ibo-activity-panel--body--placeholder{margin-top:16px}.ibo-activity-panel--body--placeholder-image>svg{width:250px;height:inherit}.ibo-activity-panel--body--placeholder-hint{margin-top:16px;color:#D8DEE9}.ibo-activity-panel--add-caselog-entry-button{position:absolute;z-index:1;right:12px;top:88px;width:36px;height:36px;background-color:#698fb5;color:white;border-radius:100%;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-activity-panel--add-caselog-entry-button>i{text-align:center;height:100%;width:100%;font-size:1.33rem;line-height:33px}.ibo-activity-panel--add-caselog-entry-button:hover{color:white;background-color:#81A1C1;box-shadow:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15)}.ibo-activity-panel--add-caselog-entry-button:active{color:white;background-color:#7693b8}.ibo-activity-panel--add-caselog-entry-button.ibo-is-hidden{display:none}.ibo-activity-panel .ibo-activity-panel--entry-forms-confirmation-dialog{display:none}.ibo-activity-panel--entry-forms-confirmation-explanation{margin-bottom:16px}.ibo-activity-panel--entry-forms-confirmation-preference-input{margin-right:0.5rem}.ibo-activity-panel--closed-cover{display:none;position:absolute;z-index:2;top:0;bottom:0;left:0;right:0;background-color:#616e88;cursor:pointer}.ibo-activity-panel--closed-content-container{transform:rotateZ(-90deg);white-space:nowrap}.ibo-activity-panel--open-icon{margin-left:0.75rem}.ibo-caselog-entry-form{display:block;width:100%;background-color:#D8DEE9}.ibo-caselog-entry-form.ibo-is-closed{display:none}.ibo-caselog-entry-form--actions{display:flex;justify-content:space-between;margin-top:8px;margin-bottom:8px}.ibo-caselog-entry-form--lock-indicator{margin-top:12px}.ibo-caselog-entry-form--lock-icon{width:32px;min-width:32px;height:32px;min-height:32px;color:#ECEFF4;background-color:#2E3440;border-radius:100%}.ibo-caselog-entry-form--lock-message{margin-left:1rem}.ibo-caselog-entry-form--action-buttons--main-actions{}.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-popover-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-multiselect-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li .ibo-caselog-entry-form--action-buttons--main-actions>ul{z-index:1}.ibo-activity-panel--entry-group:not(:last-child){margin-bottom:24px}.ibo-activity-entry{display:flex;flex-direction:row;align-items:flex-end}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--medallion{visibility:hidden}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--sub-information{margin-bottom:4px}.ibo-activity-entry.ibo-is-current-user{flex-direction:row-reverse;min-width:min-content}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--medallion{margin-right:initial;margin-left:8px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--information{margin-right:0;margin-left:40px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--main-information{background-color:#a5cfdc}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--sub-information{text-align:right}.ibo-activity-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information{border-bottom-right-radius:0;border-bottom-left-radius:5px}.ibo-activity-entry:not(.ibo-is-current-user) .ibo-activity-entry--information{margin-right:40px;margin-left:0}.ibo-activity-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information{border-bottom-right-radius:5px;border-bottom-left-radius:0}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information{max-height:48px;overflow:hidden;cursor:pointer}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information::after{content:"...";position:absolute;top:30px;left:0;padding-left:16px;width:100%;height:100%;background-color:inherit}.ibo-activity-entry--medallion{margin-right:8px;margin-bottom:18px;min-width:32px;width:32px;min-height:32px;height:32px;overflow:hidden;border-radius:100%}.ibo-activity-entry--medallion.ibo-has-image{background-color:#ebf8ff;box-shadow:inset 0 1px 2px 0 rgba(0, 0, 0, 0.25)}.ibo-activity-entry--medallion:not(.ibo-has-image){background-color:#546e7a;color:white;border:1px solid #D8DEE9}.ibo-activity-entry--medallion .ibo-activity-entry--author-picture{max-height:100%}.ibo-activity-entry--main-information{position:relative;display:flex;flex-direction:row;align-items:baseline;padding:12px 16px;color:#2E3440;background-color:#D8DEE9;border-radius:5px}.ibo-activity-entry--main-information-icon{margin-right:16px;color:#3B4252;font-size:1.33rem}.ibo-activity-entry--main-information-content{flex-grow:1;word-break:break-word}.ibo-activity-entry--main-information-content a{color:#2b6bb0}.ibo-activity-entry--main-information-content a:hover,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-activity-entry--main-information-content a:active,.ibo-activity-entry--main-information-content a:focus{color:#2a4265}.ibo-activity-entry--sub-information{margin-top:4px;text-align:left;color:#D8DEE9}.ibo-activity-entry--sub-information>*:not(:last-child):after{content:" ";display:inline-block;vertical-align:middle;margin-left:0.5rem;margin-right:0.5rem;width:4px;height:4px;border-radius:100%;background-color:#434C5E}.ibo-activity-panel--load-more-entries-container{position:relative}.ibo-activity-panel--load-more-entries-container:hover .ibo-activity-panel--load-all-entries{margin-left:84px}.ibo-activity-panel--load-more-entries-container:not(:hover) .ibo-activity-panel--load-all-entries{visibility:hidden}.ibo-activity-panel--load-entries-button{width:32px;height:32px;border-radius:100%;background-color:#D8DEE9;border:1px solid #191c22}.ibo-activity-panel--load-more-entries{z-index:1}.ibo-activity-panel--load-all-entries{position:absolute;z-index:0;top:0;margin-left:0;transition:all 0.1s ease-in-out}.ibo-caselog-entry .ibo-activity-entry--main-information{padding-top:12px;padding-bottom:12px}.ibo-caselog-entry .ibo-activity-entry--main-information-icon{display:none}.ibo-caselog-entry .ibo-activity-entry--main-information-content{}.ibo-caselog-entry .ibo-activity-entry--main-information::before{content:"";position:absolute;top:0;bottom:0;width:3px}.ibo-caselog-entry:not(.ibo-is-current-user) .ibo-activity-entry--main-information::before{left:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.ibo-caselog-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information::before{border-bottom-left-radius:0}.ibo-caselog-entry.ibo-is-current-user .ibo-activity-entry--main-information::before{right:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.ibo-caselog-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information::before{border-bottom-right-radius:0}.ibo-caselog-entry.ibo-is-closed.ibo-is-current-user .ibo-activity-entry--main-information::after{width:calc(100% - 3px)}.ibo-caselog-entry.ibo-is-closed:not(.ibo-is-current-user) .ibo-activity-entry--main-information::after{margin-left:3px}.ibo-caselog-entry--entry-for-caselog-1 .ibo-activity-entry--main-information::before{background-color:#689f38}.ibo-caselog-entry--entry-for-caselog-2 .ibo-activity-entry--main-information::before{background-color:#b83280}.ibo-caselog-entry--entry-for-caselog-3 .ibo-activity-entry--main-information::before{background-color:#f6ae55}.ibo-caselog-entry--entry-for-caselog-4 .ibo-activity-entry--main-information::before{background-color:#3182ce}.ibo-caselog-entry--entry-for-caselog-5 .ibo-activity-entry--main-information::before{background-color:#80deea}.ibo-caselog-entry--entry-for-caselog-6 .ibo-activity-entry--main-information::before{background-color:#c5e1a5}.ibo-caselog-entry--entry-for-caselog-7 .ibo-activity-entry--main-information::before{background-color:#fbb6ce}.ibo-transition-entry--original-state-label{color:#2E3440;text-decoration:line-through}a.ibo-edits-entry--short-description{position:relative;display:block;color:inherit}.ibo-edits-entry--long-description-toggler-icon{position:absolute;top:3px;right:0;transition:all 0.2s ease-in-out}.ibo-edits-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description{display:block}a.ibo-notification-entry--short-description{color:inherit}.ibo-notification-entry--long-description-toggler-icon{margin-left:12px;transition:all 0.2s ease-in-out}.ibo-notification-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description{display:block}.ibo-block-csv textarea{width:100%;min-height:10em;margin-top:10px}.ibo-block-list--empty-text,.ibo-block-list--create-action{text-align:center}.ibo-block-list--create-icon{margin-right:0.5rem}.ibo-table-preview{margin-top:20px;overflow-x:auto}.ibo-table-preview th{position:relative;padding:5px;padding-right:24px;border-width:1px 1px 0;border-style:groove groove none;background:#f2f2f2}.ibo-table-preview td{padding-right:5px;padding-left:5px;border-width:0 1px;border-style:none groove}.ibo-table-preview tr:last-child td{border-bottom-width:1px;border-bottom-style:groove}.ibo-preview-header{margin-bottom:5px}.ibo-table-preview--remove-column{position:absolute;top:8px;right:8px;display:inline-block;cursor:pointer;font-size:8px}#form_part_interactive_fields_xlsx,#form_part_interactive_fields_csv,#form_part_interactive_fields_pdf{margin-top:24px}:root{--ibo-body-text-color:#E5E9F0;--ibo-body-background-color:#2E3440}html{height:100vh}body{display:flex;height:100vh;color:var(--ibo-body-text-color);background-color:var(--ibo-body-background-color)}#ibo-navigation-menu{z-index:20}#ibo-page-container{position:relative;z-index:10;height:100%;overflow:auto;flex-grow:1;display:flex;flex-direction:column}#ibo-top-bar,#ibo-main-content{padding-left:36px;padding-right:36px}#ibo-top-container{z-index:20;position:sticky;top:0;left:0;right:0}#ibo-center-container{position:relative;z-index:10;flex-grow:1;overflow:hidden}#ibo-center-container>*{height:100%}#ibo-main-content{padding-top:16px;padding-bottom:16px;overflow:auto}#ibo-main-content>.ibo-panel{margin-left:auto;margin-right:auto}.ibo-preferences--user-preferences--picture-placeholder{display:flex;flex-direction:row;flex-wrap:wrap}.ibo-preferences--user-preferences--picture-placeholder--image{height:54px;width:54px;border-radius:100%;margin:12px;border:solid 3px #7b88a1}.ibo-preferences--user-preferences--picture-placeholder--image>img{border-radius:100%;background-color:#7b88a1}.ibo-preferences--user-preferences--picture-placeholder--image.ibo-is-active{border-color:#2c5382}.ibo-preferences--user-preferences--picture-placeholder--image:hover{border-color:#3182ce}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut{display:table;width:100%}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut>*:not(.ibo-button){width:30%;display:table-cell}.ibo-keyboard-shortcut--input,.ibo-keyboard-shortcut--input:focus{display:inline-block;width:auto;text-transform:capitalize;text-align:center;color:#D8DEE9;background-color:#434C5E;border:1px solid #4C566A;border-bottom:2px solid #4C566A;border-radius:3px;padding:2px 4px;margin-bottom:5px}.ibo-keyboard-shortcut--input.ibo-is-focus,.ibo-keyboard-shortcut--input:focus.ibo-is-focus{text-transform:none;color:#5E81AC;border-color:#698fb5}#ibo-favorite-organizations .ibo-toolbar{float:right;vertical-align:top}#ibo-favorite-organizations .ibo-datatable--toolbar{padding-top:3px}#ibo-attachment--upload-file .ibo-input-file-select--container{display:inline-block}.ibo-attachment--datatable--icon-preview{max-height:44px;max-width:44px}.ibo-attachment--datatable tbody tr td{line-height:44px}.ibo-attachment--datatable tbody tr td:nth-child(1){line-height:0px}.ibo-attachment--upload-file--drop-zone-hint{display:none}.ibo-drag-in{border:2px #616e88 dashed}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;max-height:200px;margin:22px 0;color:#3B4252}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint>svg{margin-bottom:5px}.ibo-drag-in #ibo-attachment--upload-file--upload-button-container{display:none}.ibo-tab-container--tab-header.ibo-drag-in,.ibo-drag-in.ibo-tab-container--extra-tabs-container{border:none;background-color:#bee3f8;color:#2c5382}.ibo-tab-container--tab-header.ibo-drag-in>a::after,.ibo-drag-in.ibo-tab-container--extra-tabs-container>a::after{padding-left:8px;font-family:"Font Awesome 5 Free";content:"\f382";font-weight:900;color:#3182ce}.itop-simple-graph{margin-top:10px;border:1px dotted transparent;border-radius:5px}.itop-simple-graph.ibo-has-focus{border:1px dotted #2E3440}.graph_zoom{display:flex;float:right;align-items:center}.graph_zoom_slider{height:1.1em;display:inline-block;width:10em}.graph_zoom_plus,.graph_zoom_minus{cursor:pointer;display:inline-block;margin-left:0.5em;margin-right:0.5em}.graph_config{display:flex;align-items:center;flex-wrap:wrap}.graph_config .toolkit_menu.graph>ul>li{position:relative}.graph_config .toolkit_menu.graph>ul>li ul{z-index:1;position:absolute;display:none}.graph_separator{flex-grow:1}.ibo-simple-graph--grouping-threshold--container,.ibo-simple-graph--additional-context--container{margin-right:0.3em;display:flex;align-items:center}.ibo-simple-graph--grouping-threshold--container>*,.ibo-simple-graph--additional-context--container>*{margin-right:1em}#graph_grouping_threshold{width:auto;padding-right:0}.ibo-display-graph--search-box .sf_criterion_area{display:flex;flex-direction:column}.ibo-display-graph--search-box .sf_criterion_row{display:flex;flex-wrap:wrap;align-items:center}.ibo-display-graph--search-box .sf_criterion_row>div{align-items:center;display:flex;padding:0 15px}.ibo-display-graph--search-box .sf_criterion_row>div>input{margin-right:10px}.ibo-display-graph--search-box .sf_criterion_row>div .ibo-medallion-icon{display:flex;align-items:center}.ibo-display-graph--search-box #ReloadMovieBtn{align-self:flex-end}#impacted_objects_lists>div~div{margin-top:24px}#impacted_objects_lists_placeholder,#impacted_groups_placeholder{height:250px}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-red td:last-of-type:before{background-color:#b44953}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-orange td:last-of-type:before{background-color:#c05621}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-green td:last-of-type:before{background-color:#558b2f}.ibo-audit--audit-category--panel .ibo-panel--body{padding:10px 16px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable td:not(:nth-child(1)),.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable th:not(:nth-child(1)){text-align:right;width:100px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable--toolbar{display:none}.ibo-audit--audit-category--panel .ibo-panel--body tr td:last-of-type:before{content:'';height:12px;width:12px;border-radius:100%;display:inline-block;margin-right:5px;vertical-align:middle}.ibo-audit--dashboard{padding:18px 0}.ibo-dashboard--grid-row+.ibo-audit--error-alert{margin-top:24px}.ibo-audit--audit-line--csv-download{height:2.5em;vertical-align:middle}.ibo-data-synchro-source--replicas-status.ibo-is-grey{color:#191c22;background-color:#616e88}.ibo-data-synchro-source--replicas-status.ibo-is-orange{color:#7b341e;background-color:#fbd38d}.ibo-data-synchro-source--replicas-status.ibo-is-bluegrey{color:#263238;background-color:#b0bec5}.ibo-data-synchro-source--replicas-status.ibo-is-red{color:#7d333a;background-color:#dfb1b5}.ibo-data-synchro-source--replicas-status.ibo-is-blue{color:#2a4265;background-color:#bee3f8}.ibo-data-synchro-source--replicas-status.ibo-is-green{color:#33691e;background-color:#dcedc8}.ibo-data-synchro-source--replicas-status.ibo-is-cyan{color:#006164;background-color:#c9eef2}.ibo-data-synchro-source--replicas-status-separator{border-top:2px solid white}.ibo-data-synchro-source--replicas-status.ibo-is-light{opacity:0.5}.ibo-data-synchro-source--replicas-status.ibo-is-light:hover{opacity:1}.synoptics tr td{padding:10px;min-width:200px;vertical-align:middle;text-align:center}.synoptics tr td.arrow{min-width:100px;border-top:2px solid #ECEFF4}.ibo-data-synchro-source--replicas-status--warning{margin:0 5px 0 8px}.ibo-datamodel-viewer--parent--spacer{padding:0 8px}#ibo-datamodel-viewer--attributes-table>tbody tr td:first-child{width:3px}.ibo-datamodel-viewer--origin-cell{vertical-align:middle}.ibo-datamodel-viewer--origin-cell>div{height:8px;width:8px;border-radius:100%}.ibo-datamodel-viewer--classes-list{position:relative;height:100%;width:350px;padding-left:24px;overflow-y:scroll}.ibo-datamodel-viewer--lifecycle--code{color:#3B4252}.ibo-datamodel-viewer--lifecycle--stimuli{color:#2a4265}.ibo-datamodel-viewer--lifecycle--attribute-option{color:#702459}.dataModelSchema g{cursor:pointer}.dataModelSchema g:hover rect:not(.liseret){fill:#616e88}.dataModelSchema text{fill:#191c22;text-anchor:middle}#selfreferencing:hover~g>.selfattr{fill:#616e88}.tooltipD3{position:fixed;text-align:center;background:white;border:1px solid #3B4252;border-radius:3px;pointer-events:none;fill:#191c22;text-anchor:middle}.tooltipD3 i{font-size:1rem}.tooltipD3 span{margin:3px}#tooltipD3_top{border-bottom:1px solid #3B4252;padding:3px}.ibo-datamodel-viewer--lifecycle-image{margin-bottom:16px}#tabs1-import .ibo-field--label{max-width:50%}div.ibo-csv-import--cell-modified{font-weight:bold;color:#2b6bb0}div.ibo-csv-import--cell-error{font-weight:bold;color:#b44953}div.ibo-csv-import--cell-message{padding-top:3px}tr.ibo-csv-import--row-unchanged td{border-bottom:1px #616e88 solid}.wizContainer table tr.ibo-csv-import--row-error td{border-bottom:1px #616e88 solid;background-color:#f2e0e2}tr.ibo-csv-import--row-modified td{border-bottom:1px #616e88 solid}tr.ibo-csv-import--row-added td{border-bottom:1px #616e88 solid}.ibo-csv-import--download-file{font-size:4em;color:#6eb2c6;margin:20px}.ibo-global-search--result--title>img{max-height:48px;max-width:48px;margin-right:8px}.ibo-run-query--highlight{background-color:#7693b8}#welcome_popup{display:flex}.ibo-welcome-popup--image{display:flex;justify-content:center;align-self:center;width:30%}.ibo-welcome-popup--image>svg{height:100%;padding:20px}.ibo-welcome-popup--text{flex-grow:1;align-self:center;padding:15px}.ibo-welcome-popup--text>div>div{padding-bottom:20px}.ibo-welcome-popup--text>div>div:first-child{padding-bottom:25px}.ibo-welcome-popup--text--options{position:absolute;bottom:10px}.ibo-alert+.ibo-alert{margin-top:4px}.ibo-alert+.ibo-block:not(.ibo-alert){margin-top:16px}.ibo-button+.ibo-button,.ui-dialog .ui-button+.ibo-button,.ui-dialog .ui-button+.ui-button,.ui-dialog .ui-button+.ui-datepicker-current,.ui-dialog .ui-button+.ui-datepicker-close,.ui-datepicker-current+.ibo-button,.ui-dialog .ui-datepicker-current+.ui-button,.ui-datepicker-current+.ui-datepicker-current,.ui-datepicker-current+.ui-datepicker-close,.ui-datepicker-close+.ibo-button,.ui-dialog .ui-datepicker-close+.ui-button,.ui-datepicker-close+.ui-datepicker-current,.ui-datepicker-close+.ui-datepicker-close,.ui-dialog .ibo-button+.ui-button,.ibo-button+.ui-datepicker-current,.ibo-button+.ui-datepicker-close{margin-left:4px}.ibo-button-group+.ibo-button-group,.ibo-button+.ibo-button-group,.ui-dialog .ui-button+.ibo-button-group,.ui-datepicker-current+.ibo-button-group,.ui-datepicker-close+.ibo-button-group,.ibo-button-group+.ibo-button,.ui-dialog .ibo-button-group+.ui-button,.ibo-button-group+.ui-datepicker-current,.ibo-button-group+.ui-datepicker-close{margin-left:4px}.ibo-collapsible-section+.ibo-collapsible-section{margin-top:12px}.ibo-collapsible-section+.ibo-block:not(.ibo-collapsible-section){margin-top:16px}.ibo-caselog-list .ibo-collapsible-section{margin:0;min-width:22em}.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body{color:#191c22;padding:8px;background-color:rgba(229, 233, 240, 0.5)}.ibo-alert--body .ibo-collapsible-section{margin:0;min-width:22em}.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{color:#191c22;padding:8px}.ibo-datatable+.ibo-block{margin-top:4px}.ibo-panel .ibo-panel--body .ibo-datatable{width:100%}.display_block+.display_block{margin-top:24px}.display_block+.ibo-block:not(.display_block){margin-top:16px}.ibo-field+.ibo-field{margin-top:16px}.form_field+.form_field{margin-top:16px}.ibo-fieldset+.ibo-field,fieldset+.ibo-field{margin-top:32px}.ibo-field+.ibo-fieldset:not(.ibo-column),.ibo-field+fieldset:not(.ibo-column){margin-top:32px}.ibo-fieldset+.ibo-fieldset:not(.ibo-column),fieldset+.ibo-fieldset:not(.ibo-column),.ibo-fieldset+fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column+.ibo-fieldset,.ibo-multi-column+fieldset{margin-top:48px}.ibo-form+.ibo-form{margin-top:24px}select+label,label+select,label>select,input+label,label+input,label>input{margin-left:8px}.ibo-input-with-label--label.ibo-has-description::after{content:"?";padding-left:4px;vertical-align:top;cursor:pointer;color:#7b88a1}.ibo-datatable .attribute-set .attribute-set-item{display:inline;margin:0;padding:4px 6px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-datatable .attribute-set .attribute-set-item+.attribute-set-item{margin-left:0.5rem}.ibo-panel+.ibo-panel{margin-top:24px}.ibo-panel+.ibo-block:not(.ibo-panel){margin-top:16px}#ibo-main-content{}#ibo-main-content .ibo-panel.ibo-has-sticky-header{margin-bottom:200px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking{top:-16px}.ui-dialog-content{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking{top:-16px}.ibo-pill:not(:last-child){margin-right:16px}.ibo-dashboard--grid-row .ibo-dashlet-header-static{margin-top:12px}.ibo-dashboard--grid-row:first-child .ibo-dashlet:first-child .ibo-dashlet-header-static{margin-top:0}.ibo-details .ibo-prop--apply>span,.ibo-details .ibo-prop--cancel>span{display:unset}.ibo-details .ibo-prop--apply{display:table-column}.ibo-details{margin-top:5px}.ibo-activity-panel--tab-entry-form .ibo-caselog-entry-form{padding-bottom:14px;border-bottom:1px solid #4C566A}.ibo-panel>.ibo-panel--body>.ibo-tab-container{margin-top:-24px;margin-left:-16px;margin-right:-16px;margin-bottom:-24px}.ibo-panel>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tab-container-list{height:100%;overflow-y:auto;flex-grow:1}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical{display:flex;flex-direction:row}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list{padding-top:50px;flex-direction:column;height:auto;padding-left:unset;margin-right:unset;min-width:calc(32px + 90px + 32px)}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container{height:50px;width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--extra-tabs-list-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--extra-tabs-list-toggler{width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tab-container{flex-grow:1;margin-left:unset}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tabs-list.ibo-is-sticking{position:fixed;z-index:10}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking{padding-left:0}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--tab-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler{font-size:1rem}.ibo-object-details.ibo-has-medallion-icon>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list{padding-left:calc(32px + 96px + 32px - 24px)}.ibo-block-list--medallion{flex-direction:column;align-items:center}.ibo-block-list--medallion>.ibo-medallion-icon--image{margin:0 auto}.ibo-block-list--medallion>.ibo-medallion-icon--image~.ibo-medallion-icon--description{margin-top:12px}.ibo-block-list--medallion>.ibo-medallion-icon--description{flex-grow:1;text-align:center}.ibo-datatable .ibo-field-badge{margin:0;padding:0;color:unset;background-color:unset}.ibo-datatable .ibo-field-badge::before{content:"";display:inline-flex;margin-right:0.5rem;width:10px;height:10px;min-width:10px;min-height:10px;background-color:var(--ibo-main-color)}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration{display:none}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:unset}.ui-dialog .blockUI.blockOverlay{background-color:#2E3440}.ibo-datatable .blockUI.blockOverlay{background-color:#2E3440}.ibo-datatable .blockUI.blockMsg{font-size:2em}.ibo-svg-illustration--container>svg *[fill="#6c63ff"]{fill:#81A1C1}.ibo-is-html-content table:not(:last-child){margin-bottom:0}.ibo-is-html-content table tbody tr:last-child td,.ibo-is-html-content table tbody tr:last-child th{border-bottom-width:1px}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{color:#0e1013 !important}.cke_reset_all fieldset{border:2px groove #e0dfe3 !important}.cke_chrome{border:1px solid #7b88a1 !important}.cke_editable{background:#E5E9F0}.cke_inner{background:#7b88a1 !important}.cke_top{border-bottom:1px solid #4C566A !important;background:#D8DEE9 !important;white-space:normal !important}.cke_float .cke_top{border:1px solid #4C566A !important}.cke_bottom{border-top:1px solid #4C566A !important;background:#D8DEE9 !important}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{border-color:transparent #bcbcbc transparent transparent}.cke_resizer_rtl{border-color:transparent transparent transparent #bcbcbc}.cke_panel{background-color:#D8DEE9;border:1px solid #d1d1d1}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem .ibo-quick-create--compartment-results--element>.option:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_panel_grouptitle{color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a:hover.cke_colorbox,.ibo-quick-create--compartment-results--element>.cke_colorbox.option:hover,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox,.ibo-quick-create--compartment-results--element>.cke_colorbox.option:hover{border-color:#bcbcbc}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a:hover.cke_colorauto,.ibo-quick-create--compartment-results--element>.cke_colorauto.option:hover,a:hover.cke_colormore,.ibo-quick-create--compartment-results--element>.cke_colormore.option:hover,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,.ibo-quick-create--compartment-results--element>.cke_colorauto.option:hover,a:hover.cke_colormore,.ibo-quick-create--compartment-results--element>.cke_colormore.option:hover{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,.ibo-quick-create--compartment-results--element>.cke_button_off.option:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,.ibo-quick-create--compartment-results--element>.cke_button_expandable.cke_button_off.option:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc .ibo-quick-create--compartment-results--element>.cke_button_off.option:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,.ibo-quick-create--compartment-results--element>.cke_button_disabled.option:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,.ibo-quick-create--compartment-results--element>.cke_button_expandable.cke_button_disabled.option:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc .ibo-quick-create--compartment-results--element>.cke_button_disabled.option:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl .ibo-quick-create--compartment-results--element>.cke_button_disabled.option:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:0.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:0.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_hc .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:0.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:0.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,.ibo-quick-create--compartment-results--element>.cke_path_item.option:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc .ibo-quick-create--compartment-results--element>.cke_path_item.option:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:"Courier New", Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:0.95;filter:alpha(opacity=95);-webkit-animation:fadeIn 0.7s;animation:fadeIn 0.7s}.cke_notification_message a{color:#12306f}:root{--ibo-dm-enum--Organization-status-active--main-color:#689f38;--ibo-dm-enum--Organization-status-active--complementary-color:white}.ibo-dm-enum--Organization-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Organization-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Organization-status-inactive--main-color:#f6ae55;--ibo-dm-enum--Organization-status-inactive--complementary-color:white}.ibo-dm-enum--Organization-status-inactive{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Organization-status-inactive{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Location-status-active--main-color:#689f38;--ibo-dm-enum--Location-status-active--complementary-color:white}.ibo-dm-enum--Location-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Location-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Location-status-inactive--main-color:#f6ae55;--ibo-dm-enum--Location-status-inactive--complementary-color:white}.ibo-dm-enum--Location-status-inactive{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Location-status-inactive{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-class--Contact--main-color:#546e7a;--ibo-dm-class--Contact--complementary-color:white}.ibo-dm-class--Contact{--ibo-main-color:#546e7a;--ibo-main-color--100:#303f45;--ibo-main-color--900:#eaeef0;--ibo-complementary-color:white}.ibo-dm-class-alt--Contact{--ibo-main-color:white;--ibo-complementary-color:#546e7a}:root{--ibo-dm-enum--Contact-status-active--main-color:#689f38;--ibo-dm-enum--Contact-status-active--complementary-color:white}.ibo-dm-enum--Contact-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Contact-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Contact-status-inactive--main-color:#f6ae55;--ibo-dm-enum--Contact-status-inactive--complementary-color:white}.ibo-dm-enum--Contact-status-inactive{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Contact-status-inactive{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Ticket-operational_status-resolved--main-color:#689f38;--ibo-dm-enum--Ticket-operational_status-resolved--complementary-color:white}.ibo-dm-enum--Ticket-operational_status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Ticket-operational_status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Ticket-operational_status-closed--main-color:#D8DEE9;--ibo-dm-enum--Ticket-operational_status-closed--complementary-color:#3B4252}.ibo-dm-enum--Ticket-operational_status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Ticket-operational_status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Ticket-operational_status--main-color:#2c5382;--ibo-dm-enum--Ticket-operational_status--complementary-color:white}.ibo-dm-enum--Ticket-operational_status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Ticket-operational_status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--ApplicationSolution-status-active--main-color:#689f38;--ibo-dm-enum--ApplicationSolution-status-active--complementary-color:white}.ibo-dm-enum--ApplicationSolution-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--ApplicationSolution-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--ApplicationSolution-status-inactive--main-color:#D8DEE9;--ibo-dm-enum--ApplicationSolution-status-inactive--complementary-color:#3B4252}.ibo-dm-enum--ApplicationSolution-status-inactive{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--ApplicationSolution-status-inactive{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--BusinessProcess-status-active--main-color:#689f38;--ibo-dm-enum--BusinessProcess-status-active--complementary-color:white}.ibo-dm-enum--BusinessProcess-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--BusinessProcess-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--BusinessProcess-status-inactive--main-color:#D8DEE9;--ibo-dm-enum--BusinessProcess-status-inactive--complementary-color:#3B4252}.ibo-dm-enum--BusinessProcess-status-inactive{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--BusinessProcess-status-inactive{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--SoftwareInstance-status-active--main-color:#689f38;--ibo-dm-enum--SoftwareInstance-status-active--complementary-color:white}.ibo-dm-enum--SoftwareInstance-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--SoftwareInstance-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--SoftwareInstance-status-inactive--main-color:#D8DEE9;--ibo-dm-enum--SoftwareInstance-status-inactive--complementary-color:#3B4252}.ibo-dm-enum--SoftwareInstance-status-inactive{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--SoftwareInstance-status-inactive{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-class--Incident--main-color:#BF616A}.ibo-dm-class--Incident{--ibo-main-color:#BF616A;--ibo-main-color--100:#532225;--ibo-main-color--900:#f5e6e7}.ibo-dm-class-alt--Incident{--ibo-complementary-color:#BF616A}:root{--ibo-dm-enum--Incident-status-new--main-color:#2c5382;--ibo-dm-enum--Incident-status-new--complementary-color:white}.ibo-dm-enum--Incident-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Incident-status-assigned--main-color:#2c5382;--ibo-dm-enum--Incident-status-assigned--complementary-color:white}.ibo-dm-enum--Incident-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Incident-status-pending--main-color:#f6ae55;--ibo-dm-enum--Incident-status-pending--complementary-color:white}.ibo-dm-enum--Incident-status-pending{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-pending{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Incident-status-escalated_tto--main-color:#b83280;--ibo-dm-enum--Incident-status-escalated_tto--complementary-color:white}.ibo-dm-enum--Incident-status-escalated_tto{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-escalated_tto{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Incident-status-escalated_ttr--main-color:#b83280;--ibo-dm-enum--Incident-status-escalated_ttr--complementary-color:white}.ibo-dm-enum--Incident-status-escalated_ttr{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-escalated_ttr{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Incident-status-resolved--main-color:#689f38;--ibo-dm-enum--Incident-status-resolved--complementary-color:white}.ibo-dm-enum--Incident-status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Incident-status-closed--main-color:#D8DEE9;--ibo-dm-enum--Incident-status-closed--complementary-color:#3B4252}.ibo-dm-enum--Incident-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Incident-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Incident-status--main-color:#2c5382;--ibo-dm-enum--Incident-status--complementary-color:white}.ibo-dm-enum--Incident-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Problem-status-new--main-color:#2c5382;--ibo-dm-enum--Problem-status-new--complementary-color:white}.ibo-dm-enum--Problem-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Problem-status-assigned--main-color:#2c5382;--ibo-dm-enum--Problem-status-assigned--complementary-color:white}.ibo-dm-enum--Problem-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Problem-status-resolved--main-color:#689f38;--ibo-dm-enum--Problem-status-resolved--complementary-color:white}.ibo-dm-enum--Problem-status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Problem-status-closed--main-color:#D8DEE9;--ibo-dm-enum--Problem-status-closed--complementary-color:#3B4252}.ibo-dm-enum--Problem-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Problem-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Problem-status--main-color:#2c5382;--ibo-dm-enum--Problem-status--complementary-color:white}.ibo-dm-enum--Problem-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-class--UserRequest--main-color:#2c5382}.ibo-dm-class--UserRequest{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6}.ibo-dm-class-alt--UserRequest{--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--UserRequest-status-new--main-color:#2c5382;--ibo-dm-enum--UserRequest-status-new--complementary-color:white}.ibo-dm-enum--UserRequest-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--UserRequest-status-waiting_for_approval--main-color:#f6ae55;--ibo-dm-enum--UserRequest-status-waiting_for_approval--complementary-color:white}.ibo-dm-enum--UserRequest-status-waiting_for_approval{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-waiting_for_approval{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--UserRequest-status-approved--main-color:#689f38;--ibo-dm-enum--UserRequest-status-approved--complementary-color:white}.ibo-dm-enum--UserRequest-status-approved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-approved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--UserRequest-status-rejected--main-color:#b83280;--ibo-dm-enum--UserRequest-status-rejected--complementary-color:white}.ibo-dm-enum--UserRequest-status-rejected{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-rejected{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--UserRequest-status-assigned--main-color:#2c5382;--ibo-dm-enum--UserRequest-status-assigned--complementary-color:white}.ibo-dm-enum--UserRequest-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--UserRequest-status-pending--main-color:#f6ae55;--ibo-dm-enum--UserRequest-status-pending--complementary-color:white}.ibo-dm-enum--UserRequest-status-pending{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-pending{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--UserRequest-status-escalated_tto--main-color:#b83280;--ibo-dm-enum--UserRequest-status-escalated_tto--complementary-color:white}.ibo-dm-enum--UserRequest-status-escalated_tto{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-escalated_tto{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--UserRequest-status-escalated_ttr--main-color:#b83280;--ibo-dm-enum--UserRequest-status-escalated_ttr--complementary-color:white}.ibo-dm-enum--UserRequest-status-escalated_ttr{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-escalated_ttr{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--UserRequest-status-resolved--main-color:#689f38;--ibo-dm-enum--UserRequest-status-resolved--complementary-color:white}.ibo-dm-enum--UserRequest-status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--UserRequest-status-closed--main-color:#D8DEE9;--ibo-dm-enum--UserRequest-status-closed--complementary-color:#3B4252}.ibo-dm-enum--UserRequest-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--UserRequest-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--UserRequest-status--main-color:#2c5382;--ibo-dm-enum--UserRequest-status--complementary-color:white}.ibo-dm-enum--UserRequest-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Change-status-approved--main-color:#689f38;--ibo-dm-enum--Change-status-approved--complementary-color:white}.ibo-dm-enum--Change-status-approved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-approved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Change-status-assigned--main-color:#2c5382;--ibo-dm-enum--Change-status-assigned--complementary-color:white}.ibo-dm-enum--Change-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Change-status-closed--main-color:#D8DEE9;--ibo-dm-enum--Change-status-closed--complementary-color:#3B4252}.ibo-dm-enum--Change-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Change-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Change-status-new--main-color:#2c5382;--ibo-dm-enum--Change-status-new--complementary-color:white}.ibo-dm-enum--Change-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Change-status-notapproved--main-color:#b83280;--ibo-dm-enum--Change-status-notapproved--complementary-color:white}.ibo-dm-enum--Change-status-notapproved{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-notapproved{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Change-status-plannedscheduled--main-color:#f6ae55;--ibo-dm-enum--Change-status-plannedscheduled--complementary-color:white}.ibo-dm-enum--Change-status-plannedscheduled{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-plannedscheduled{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Change-status-rejected--main-color:#b83280;--ibo-dm-enum--Change-status-rejected--complementary-color:white}.ibo-dm-enum--Change-status-rejected{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-rejected{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Change-status-validated--main-color:#689f38;--ibo-dm-enum--Change-status-validated--complementary-color:white}.ibo-dm-enum--Change-status-validated{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-validated{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Change-status--main-color:#2c5382;--ibo-dm-enum--Change-status--complementary-color:white}.ibo-dm-enum--Change-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-profiles-itil/datamodel.itop-profiles-itil.xml b/datamodels/2.x/itop-profiles-itil/datamodel.itop-profiles-itil.xml
index 298b1cbc9..e0b9c3e19 100755
--- a/datamodels/2.x/itop-profiles-itil/datamodel.itop-profiles-itil.xml
+++ b/datamodels/2.x/itop-profiles-itil/datamodel.itop-profiles-itil.xml
@@ -1,5 +1,5 @@
 
-
+
   
   
     
@@ -546,5 +546,6 @@
         
       
     
+  
   
 
diff --git a/datamodels/2.x/itop-profiles-itil/dictionaries/en.dict.itop-profiles-itil.php b/datamodels/2.x/itop-profiles-itil/dictionaries/en.dict.itop-profiles-itil.php
new file mode 100644
index 000000000..6f562335a
--- /dev/null
+++ b/datamodels/2.x/itop-profiles-itil/dictionaries/en.dict.itop-profiles-itil.php
@@ -0,0 +1,13 @@
+ 'Profile %1$s cannot be standalone. You should add other profiles to user %2$s otherwise you may encounter access issue with this user.',
+	'Class:User/NonStandaloneProfileWarning-ReparationMessage' => 'Profile %1$s cannot be standalone. User %2$s has been completed with another profile: %3$s.',
+));
+
diff --git a/datamodels/2.x/itop-profiles-itil/dictionaries/fr.dict.itop-profiles-itil.php b/datamodels/2.x/itop-profiles-itil/dictionaries/fr.dict.itop-profiles-itil.php
new file mode 100644
index 000000000..f9d9accc3
--- /dev/null
+++ b/datamodels/2.x/itop-profiles-itil/dictionaries/fr.dict.itop-profiles-itil.php
@@ -0,0 +1,13 @@
+ 'Le profil %1$s ne peut être seul. Sans le rajout d\'autres profiles, l\'utilisateur %2$s peut rencontrer des problèmes dans iTop.',
+	'Class:User/NonStandaloneProfileWarning-ReparationMessage' => 'Le profil %1$s ne peut être seul. Le user %2$s a été complété par le profil %3$s.',
+));
+
diff --git a/datamodels/2.x/itop-profiles-itil/module.itop-profiles-itil.php b/datamodels/2.x/itop-profiles-itil/module.itop-profiles-itil.php
index 9f91ca4bc..8f58ee2c4 100755
--- a/datamodels/2.x/itop-profiles-itil/module.itop-profiles-itil.php
+++ b/datamodels/2.x/itop-profiles-itil/module.itop-profiles-itil.php
@@ -36,6 +36,7 @@ SetupWebPage::AddModule(
 		// Components
 		//
 		'datamodel' => array(
+			'src/UserProfilesEventListener.php'
 		),
 		'webservice' => array(
 			//'webservices.itop-profiles-itil.php',
diff --git a/datamodels/2.x/itop-profiles-itil/src/UserProfilesEventListener.php b/datamodels/2.x/itop-profiles-itil/src/UserProfilesEventListener.php
new file mode 100644
index 000000000..d22e1e738
--- /dev/null
+++ b/datamodels/2.x/itop-profiles-itil/src/UserProfilesEventListener.php
@@ -0,0 +1,394 @@
+ repairing profile id
+	private $aNonStandaloneProfilesMap = [];
+
+	/**
+	 * @inheritDoc
+	 */
+	public function RegisterEventsAndListeners()
+	{
+		$this->Init();
+
+		if (false === $this->bIsRepairmentEnabled){
+			IssueLog::Debug('UserProfilesEventListener bIsRepairmentEnabled disabled', LogChannels::DM_CRUD);
+			return;
+		}
+
+		$aEventSource = [\User::class, \UserExternal::class, \UserInternal::class];
+		EventService::RegisterListener(
+			EVENT_DB_BEFORE_WRITE,
+			[$this, 'OnUserEdition'],
+			$aEventSource
+		);
+
+		EventService::RegisterListener(
+			EVENT_DB_BEFORE_WRITE,
+			[ $this, 'OnUserProfileEdition' ],
+			[ \URP_UserProfile::class ],
+			[],
+			null
+		);
+
+		EventService::RegisterListener(
+			EVENT_DB_CHECK_TO_DELETE,
+			[ $this, 'OnUserProfileLinkDeletion' ],
+			[ \URP_UserProfile::class ],
+			[],
+			null
+		);
+	}
+
+	public function IsRepairmentEnabled() : bool
+	{
+		return $this->bIsRepairmentEnabled;
+	}
+
+
+	public function OnUserEdition(EventData $oEventData): void {
+		/** @var \User $oObject */
+		$oUser = $oEventData->Get('object');
+
+		try {
+			$this->ValidateThenRepairOrWarn($oUser);
+		} catch (Exception $e) {
+			IssueLog::Error('Exception occurred on RepairProfiles', LogChannels::DM_CRUD, [
+				'user_class' => get_class($oUser),
+				'user_id' => $oUser->GetKey(),
+				'exception_message' => $e->getMessage(),
+				'exception_stacktrace' => $e->getTraceAsString(),
+			]);
+			if ($e instanceof \CoreCannotSaveObjectException){
+				throw $e;
+			}
+		}
+	}
+
+	public function OnUserProfileEdition(EventData $oEventData): void {
+		$oURP_UserProfile = $oEventData->Get('object');
+
+		try {
+			$iUserId = $oURP_UserProfile->Get('userid');
+			$oUser = \MetaModel::GetReentranceObjectByChildClass(\User::class, $iUserId);
+			if (false !== $oUser){
+				IssueLog::Debug('OnUserProfileEdition user already being edited', LogChannels::DM_CRUD);
+				//user edition: handled by other event
+				return;
+			}
+
+			$oUser = \MetaModel::GetObject(\User::class, $iUserId);
+			$aChanges = $oURP_UserProfile->ListChanges();
+			if (array_key_exists('userid', $aChanges)) {
+				IssueLog::Debug('OnUserProfileEdition userid changed', LogChannels::DM_CRUD);
+				$iUserId = $oURP_UserProfile->GetOriginal('userid');
+				$oPreviousUser = \MetaModel::GetObject(\User::class, $iUserId);
+
+				$oProfileLinkSet = $oPreviousUser->Get('profile_list');
+				$oProfileLinkSet->Rewind();
+				$iCount = 0;
+				$sSingleProfileName = null;
+				while ($oCurrentURP_UserProfile = $oProfileLinkSet->Fetch()) {
+					$sNewUserId = $oCurrentURP_UserProfile->Get('userid');
+					$sOriginalUserId = $oCurrentURP_UserProfile->GetOriginal('userid');
+					if ($sNewUserId !== $sOriginalUserId) {
+						$sRemovedProfileId = $oCurrentURP_UserProfile->GetOriginal('profileid');
+						IssueLog::Debug('OnUserProfileEdition profile moved does not count', LogChannels::DM_CRUD, [
+							'URP_UserProfile' => $oURP_UserProfile->GetKey(),
+							'sRemovedProfileId' => $sRemovedProfileId,
+							'sNewUserId' => $sNewUserId,
+							'sOriginalUserId' => $sOriginalUserId,
+						]);
+						continue;
+					}
+
+					$iCount++;
+					if ($iCount  > 1){
+						IssueLog::Debug('OnUserProfileEdition more than one user', LogChannels::DM_CRUD);
+						//more than one profile: no repairment needed
+						return;
+					}
+					$sSingleProfileName = $oCurrentURP_UserProfile->Get('profile');
+				}
+				$this->RepairProfileChangesOrWarn($oPreviousUser, $sSingleProfileName, $oURP_UserProfile, $sRemovedProfileId);
+			} else if (array_key_exists('profileid', $aChanges)){
+				IssueLog::Debug('OnUserProfileEdition profileid changed', LogChannels::DM_CRUD);
+				$oCurrentUserProfileSet = $oUser->Get('profile_list');
+				if ($oCurrentUserProfileSet->Count() === 1){
+					$oProfile = $oCurrentUserProfileSet->Fetch();
+
+					$this->RepairProfileChangesOrWarn($oUser, $oProfile->Get('profile'), $oURP_UserProfile, $oProfile->GetOriginal("profileid"));
+				}
+			}
+		} catch (Exception $e) {
+			IssueLog::Error('OnUserProfileEdition Exception', LogChannels::DM_CRUD, [
+				'user_id' => $iUserId,
+				'lnk_id' => $oURP_UserProfile->GetKey(),
+				'exception_message' => $e->getMessage(),
+				'exception_stacktrace' => $e->getTraceAsString(),
+			]);
+			if ($e instanceof \CoreCannotSaveObjectException){
+				throw $e;
+			}
+		}
+	}
+
+	public function OnUserProfileLinkDeletion(EventData $oEventData): void {
+		$oURP_UserProfile = $oEventData->Get('object');
+
+		try {
+			$iUserId = $oURP_UserProfile->Get('userid');
+			$oUser = \MetaModel::GetReentranceObjectByChildClass(\User::class, $iUserId);
+			if (false !== $oUser){
+				IssueLog::Debug('OnUserProfileLinkDeletion user being deleted already', LogChannels::DM_CRUD);
+				//user edition: handled by other event
+				return;
+			}
+
+			$oUser = \MetaModel::GetObject(\User::class, $iUserId);
+
+			/** @var \DeletionPlan $oDeletionPlan */
+			$oDeletionPlan = $oEventData->Get('deletion_plan');
+			$aDeletedURP_UserProfiles = [];
+			if (! is_null($oDeletionPlan)){
+				$aListDeletes = $oDeletionPlan->ListDeletes();
+				if (array_key_exists(\URP_UserProfile::class, $aListDeletes)) {
+					foreach ($aListDeletes[\URP_UserProfile::class] as $iId => $aDeletes) {
+						$aDeletedURP_UserProfiles []= $iId;
+					}
+				}
+			}
+
+			$oProfileLinkSet = $oUser->Get('profile_list');
+			$oProfileLinkSet->Rewind();
+			$sSingleProfileName = null;
+			$iCount = 0;
+			while ($oCurrentURP_UserProfile = $oProfileLinkSet->Fetch()) {
+				if (in_array($oCurrentURP_UserProfile->GetKey(), $aDeletedURP_UserProfiles)) {
+					continue;
+				}
+				$iCount++;
+				if ($iCount  > 1){
+					IssueLog::Debug('OnUserProfileLinkDeletion more than one profile', LogChannels::DM_CRUD);
+					//more than one profile: no repairment needed
+					return;
+				}
+				$sSingleProfileName = $oCurrentURP_UserProfile->Get('profile');
+			}
+
+			$this->RepairProfileChangesOrWarn($oUser, $sSingleProfileName, $oURP_UserProfile, $oURP_UserProfile->Get('profileid'), true);
+		} catch (Exception $e) {
+			IssueLog::Error('OnUserProfileLinkDeletion Exception', LogChannels::DM_CRUD, [
+				'user_id' => $iUserId,
+				'profile_id' => $oURP_UserProfile->Get('profileid'),
+				'exception_message' => $e->getMessage(),
+				'exception_stacktrace' => $e->getTraceAsString(),
+			]);
+		}
+	}
+
+
+	/**
+	 * @param $aPortalDispatcherData: passed only for testing purpose
+	 *
+	 * @return void
+	 * @throws \ConfigException
+	 * @throws \CoreException
+	 */
+	public function Init($aPortalDispatcherData=null) : void {
+		if (is_null($aPortalDispatcherData)){
+			$aPortalDispatcherData = \PortalDispatcherData::GetData();
+		}
+
+		$aNonStandaloneProfiles = \utils::GetConfig()->Get(self::USERPROFILE_REPAIR_ITOP_PARAM_NAME, null);
+
+		//When there are several customized portals on an itop, choosing a specific profile means choosing which portal user will access
+		//In that case, itop administrator has to specify it via itop configuration. we dont use default profiles repairment otherwise
+		if (is_null($aNonStandaloneProfiles)){
+			if (count($aPortalDispatcherData) > 2){
+				IssueLog::Debug('Init repairment disabled as there are more than 2 portals (extended customer should decide on their own)', LogChannels::DM_CRUD);
+				$this->bIsRepairmentEnabled = false;
+				return;
+			}
+
+			$aPortalNames = array_keys($aPortalDispatcherData);
+			sort($aPortalNames);
+			if ($aPortalNames !== ['backoffice', 'itop-portal']){
+				IssueLog::Debug('Init repairment disabled there is a custom portal', LogChannels::DM_CRUD, [$aPortalNames]);
+				$this->bIsRepairmentEnabled = false;
+				return;
+			}
+		}
+
+		if (is_null($aNonStandaloneProfiles)){
+			//default configuration in the case there are no customized portals
+			$aNonStandaloneProfiles = [ POWER_USER_PORTAL_PROFILE_NAME => PORTAL_PROFILE_NAME ];
+		}
+
+		if (! is_array($aNonStandaloneProfiles)){
+			\IssueLog::Error(sprintf("%s is badly configured. it should be an array.", self::USERPROFILE_REPAIR_ITOP_PARAM_NAME),LogChannels::DM_CRUD, [self::USERPROFILE_REPAIR_ITOP_PARAM_NAME => $aNonStandaloneProfiles]);
+			$this->bIsRepairmentEnabled = false;
+			return;
+		}
+
+		if (empty($aNonStandaloneProfiles)){
+			//Feature specifically disabled in itop configuration
+			IssueLog::Debug('Init repairment disabled by conf on purpose', LogChannels::DM_CRUD);
+			$this->bIsRepairmentEnabled = false;
+			return;
+		}
+
+
+		$this->FetchRepairingProfileIds($aNonStandaloneProfiles);
+	}
+
+	public function FetchRepairingProfileIds(array $aNonStandaloneProfiles) : void {
+		$aProfiles = [];
+		try {
+			$aProfilesToSearch = array_unique(array_values($aNonStandaloneProfiles));
+			if(($iIndex = array_search(null, $aProfilesToSearch)) !== false) {
+				unset($aProfilesToSearch[$iIndex]);
+			}
+
+			if (1 === count($aProfilesToSearch)){
+				$sInCondition = sprintf('"%s"', array_pop($aProfilesToSearch));
+			} else {
+				$sInCondition = sprintf('"%s"', implode('","', $aProfilesToSearch));
+			}
+
+			$sOql = "SELECT URP_Profiles WHERE name IN ($sInCondition)";
+			$oSearch = \DBSearch::FromOQL($sOql);
+			$oSearch->AllowAllData();
+			$oSet = new \DBObjectSet($oSearch);
+			while(($oProfile = $oSet->Fetch()) != null) {
+				$sProfileName = $oProfile->Get('name');
+				$aProfiles[$sProfileName] = $oProfile->GetKey();
+			}
+
+			$this->aNonStandaloneProfilesMap = [];
+			foreach ($aNonStandaloneProfiles as $sNonStandaloneProfileName => $sRepairProfileName) {
+				if (is_null($sRepairProfileName)) {
+					$this->aNonStandaloneProfilesMap[$sNonStandaloneProfileName] = null;
+					continue;
+				}
+
+				if (! array_key_exists($sRepairProfileName, $aProfiles)) {
+					throw new \Exception(sprintf("%s is badly configured. profile $sRepairProfileName does not exist.", self::USERPROFILE_REPAIR_ITOP_PARAM_NAME));
+				}
+
+				$this->aNonStandaloneProfilesMap[$sNonStandaloneProfileName] = [ 'name' => $sRepairProfileName, 'id' => $aProfiles[$sRepairProfileName]];
+			}
+
+			$this->bIsRepairmentEnabled = true;
+		} catch (\Exception $e) {
+			IssueLog::Error('Exception when searching user portal profile', LogChannels::DM_CRUD, [
+				'exception_message' => $e->getMessage(),
+				'exception_stacktrace' => $e->getTraceAsString(),
+				'aProfiles' => $aProfiles,
+				'aNonStandaloneProfiles' => $aNonStandaloneProfiles,
+			]);
+			$this->bIsRepairmentEnabled = false;
+		}
+	}
+
+	public function ValidateThenRepairOrWarn(\User $oUser) : void
+	{
+		$oCurrentUserProfileSet = $oUser->Get('profile_list');
+		if ($oCurrentUserProfileSet->Count() === 1){
+			IssueLog::Debug('ValidateThenRepairOrWarn one profile found', LogChannels::DM_CRUD);
+			$oProfile = $oCurrentUserProfileSet->Fetch();
+
+			$this->RepairUserChangesOrWarn($oUser, $oProfile->Get('profile'));
+		}
+	}
+
+	public function RepairUserChangesOrWarn(\User $oUser, string $sSingleProfileName) : void {
+		IssueLog::Debug('RepairUserChangesOrWarn', LogChannels::DM_CRUD,
+			[
+				'aNonStandaloneProfilesMap' => $this->aNonStandaloneProfilesMap,
+				'sSingleProfileName' => $sSingleProfileName
+			]
+		);
+
+		if (array_key_exists($sSingleProfileName, $this->aNonStandaloneProfilesMap)) {
+			$aRepairingProfileInfo = $this->aNonStandaloneProfilesMap[$sSingleProfileName];
+			if (is_null($aRepairingProfileInfo)){
+				$sMessage = \Dict::Format("Class:User/NonStandaloneProfileWarning", $sSingleProfileName, $oUser->Get('friendlyname'));
+				throw new \CoreCannotSaveObjectException(array('issues' => [$sMessage], 'class' => get_class($oUser), 'id' => $oUser->GetKey()));
+			} else {
+				//Completing profiles profiles by adding repairing one : by default portal user to a power portal user
+				$oUserProfile = new \URP_UserProfile();
+				$oUserProfile->Set('profileid', $aRepairingProfileInfo['id']);
+				$oCurrentUserProfileSet = $oUser->Get('profile_list');
+				$oCurrentUserProfileSet->AddItem($oUserProfile);
+				$oUser->Set('profile_list', $oCurrentUserProfileSet);
+				$sMessage = \Dict::Format("Class:User/NonStandaloneProfileWarning-ReparationMessage", $sSingleProfileName, $oUser->Get('friendlyname'), $aRepairingProfileInfo['name']);
+				$oUser::SetSessionMessage(get_class($oUser), $oUser->GetKey(), 1, $sMessage, 'WARNING', 1);
+			}
+		}
+	}
+
+	public function RepairProfileChangesOrWarn(\User $oUser, ?string $sSingleProfileName, \URP_UserProfile $oURP_UserProfile, string $sRemovedProfileId, $bIsRemoval=false) : void {
+		IssueLog::Debug('RepairUserChangesOrWarn', LogChannels::DM_CRUD,
+			[
+				'aNonStandaloneProfilesMap' => $this->aNonStandaloneProfilesMap,
+				'sSingleProfileName' => $sSingleProfileName
+			]
+		);
+
+		if (is_null($sSingleProfileName)){
+			return;
+		}
+
+		if (array_key_exists($sSingleProfileName, $this->aNonStandaloneProfilesMap)) {
+			$aRepairingProfileInfo = $this->aNonStandaloneProfilesMap[$sSingleProfileName];
+			if (is_null($aRepairingProfileInfo)
+				|| ($aRepairingProfileInfo['id'] === $sRemovedProfileId) //cannot repair by readding same remove profile as it will raise uniqueness rule
+			){
+				$sMessage = \Dict::Format("Class:User/NonStandaloneProfileWarning", $sSingleProfileName, $oUser->Get('friendlyname'));
+				if ($bIsRemoval){
+					$oURP_UserProfile->AddDeleteIssue($sMessage);
+				} else {
+					throw new \CoreCannotSaveObjectException(array('issues' => [$sMessage], 'class' => get_class($oURP_UserProfile), 'id' => $oURP_UserProfile->GetKey()));
+				}
+			} else {
+				//Completing profiles profiles by adding repairing one : by default portal user to a power portal user
+				$oUserProfile = new \URP_UserProfile();
+				$oUserProfile->Set('profileid', $aRepairingProfileInfo['id']);
+				$oCurrentUserProfileSet = $oUser->Get('profile_list');
+				$oCurrentUserProfileSet->AddItem($oUserProfile);
+				$oUser->Set('profile_list', $oCurrentUserProfileSet);
+				$oUser->DBWrite();
+
+				$sMessage = \Dict::Format("Class:User/NonStandaloneProfileWarning-ReparationMessage", $sSingleProfileName, $oUser->Get('friendlyname'), $aRepairingProfileInfo['name']);
+				$oURP_UserProfile::SetSessionMessage(get_class($oURP_UserProfile), $oURP_UserProfile->GetKey(), 1, $sMessage, 'WARNING', 1);
+			}
+		}
+	}
+}
diff --git a/dictionaries/en.dictionary.itop.ui.php b/dictionaries/en.dictionary.itop.ui.php
index 8e05bd527..da7114cb8 100644
--- a/dictionaries/en.dictionary.itop.ui.php
+++ b/dictionaries/en.dictionary.itop.ui.php
@@ -452,6 +452,7 @@ Dict::Add('EN US', 'English', 'English', array(
 We hope you’ll enjoy this version as much as we enjoyed imagining and creating it.
 
 
Customize your '.ITOP_APPLICATION.' preferences for a personalized experience.
', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, discard this message', 'UI:WelcomeMenu:AllOpenRequests' => 'Open requests: %1$d', 'UI:WelcomeMenu:MyCalls' => 'My requests', 'UI:WelcomeMenu:OpenIncidents' => 'Open incidents: %1$d', diff --git a/dictionaries/es_cr.dictionary.itop.ui.php b/dictionaries/es_cr.dictionary.itop.ui.php index aa444e89a..0c2e28048 100644 --- a/dictionaries/es_cr.dictionary.itop.ui.php +++ b/dictionaries/es_cr.dictionary.itop.ui.php @@ -444,6 +444,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( Esperamos distrute de esta versión tanto como nosotros la imaginamos y creamos.
Configure las preferencias de '.ITOP_APPLICATION.' para una experiencia personalizada.
', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, descartar este mensaje', 'UI:WelcomeMenu:AllOpenRequests' => 'Requerimientos Abiertos: %1$d', 'UI:WelcomeMenu:MyCalls' => 'Mis Requerimientos', 'UI:WelcomeMenu:OpenIncidents' => 'Incidentes Abiertos: %1$d', diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php index 664deeb07..d06d9481b 100644 --- a/dictionaries/fr.dictionary.itop.ui.php +++ b/dictionaries/fr.dictionary.itop.ui.php @@ -433,6 +433,7 @@ Dict::Add('FR FR', 'French', 'Français', array( Nous espérons que vous aimerez cette version autant que nous avons eu du plaisir à l\'imaginer et à la créer.
Configurez vos préférences '.ITOP_APPLICATION.' pour une expérience personnalisée.
', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, supprimer ce message', 'UI:WelcomeMenu:AllOpenRequests' => 'Requêtes en cours: %1$d', 'UI:WelcomeMenu:MyCalls' => 'Mes appels support', 'UI:WelcomeMenu:OpenIncidents' => 'Incidents en cours: %1$d', diff --git a/images/welcome.jpg b/images/welcome.jpg deleted file mode 100644 index c15aa1b92..000000000 Binary files a/images/welcome.jpg and /dev/null differ diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 54317abd2..b95541401 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -14,6 +14,7 @@ return array( 'AbstractPortalUIExtension' => $baseDir . '/application/applicationextension.inc.php', 'AbstractPreferencesExtension' => $baseDir . '/application/applicationextension.inc.php', 'AbstractWeeklyScheduledProcess' => $baseDir . '/core/backgroundprocess.inc.php', + 'AbstractWelcomePopup' => $baseDir . '/application/applicationextension.inc.php', 'Action' => $baseDir . '/core/action.class.inc.php', 'ActionChecker' => $baseDir . '/core/userrights.class.inc.php', 'ActionEmail' => $baseDir . '/core/action.class.inc.php', @@ -363,6 +364,8 @@ return array( 'Combodo\\iTop\\Application\\UI\\Links\\Set\\LinkSetUIBlockFactory' => $baseDir . '/sources/Application/UI/Links/Set/LinksSetUIBlockFactory.php', 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => $baseDir . '/sources/Application/UI/Preferences/BlockShortcuts/BlockShortcuts.php', 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => $baseDir . '/sources/Application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\DefaultWelcomePopup' => $baseDir . '/sources/Application/WelcomePopup/DefaultWelcomePopup.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\WelcomePopupService' => $baseDir . '/sources/Application/WelcomePopup/WelcomePopupService.php', 'Combodo\\iTop\\Composer\\iTopComposer' => $baseDir . '/sources/Composer/iTopComposer.php', 'Combodo\\iTop\\Controller\\AbstractController' => $baseDir . '/sources/Controller/AbstractController.php', 'Combodo\\iTop\\Controller\\AjaxRenderController' => $baseDir . '/sources/Controller/AjaxRenderController.php', @@ -372,6 +375,7 @@ return array( 'Combodo\\iTop\\Controller\\OAuth\\OAuthLandingController' => $baseDir . '/sources/Controller/OAuth/OAuthLandingController.php', 'Combodo\\iTop\\Controller\\PreferencesController' => $baseDir . '/sources/Controller/PreferencesController.php', 'Combodo\\iTop\\Controller\\TemporaryObjects\\TemporaryObjectController' => $baseDir . '/sources/Controller/TemporaryObjects/TemporaryObjectController.php', + 'Combodo\\iTop\\Controller\\WelcomePopupController' => $baseDir . '/sources/Controller/WelcomePopupController.php', 'Combodo\\iTop\\Controller\\iController' => $baseDir . '/sources/Controller/iController.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientProvider' => $baseDir . '/sources/Core/Authentication/Client/OAuth/IOAuthClientProvider.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAbstract' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAbstract.php', @@ -2985,6 +2989,7 @@ return array( 'iTopWebPage' => $baseDir . '/sources/Application/WebPage/iTopWebPage.php', 'iTopWizardWebPage' => $baseDir . '/sources/Application/WebPage/iTopWizardWebPage.php', 'iTopXmlException' => $baseDir . '/application/exceptions/iTopXmlException.php', + 'iWelcomePopup' => $baseDir . '/application/applicationextension.inc.php', 'iWorkingTimeComputer' => $baseDir . '/core/computing.inc.php', 'lnkAuditCategoryToAuditDomain' => $baseDir . '/application/audit.domain.class.inc.php', 'lnkTriggerAction' => $baseDir . '/core/trigger.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 346658c7b..e3661ab24 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -378,6 +378,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'AbstractPortalUIExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'AbstractPreferencesExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'AbstractWeeklyScheduledProcess' => __DIR__ . '/../..' . '/core/backgroundprocess.inc.php', + 'AbstractWelcomePopup' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'Action' => __DIR__ . '/../..' . '/core/action.class.inc.php', 'ActionChecker' => __DIR__ . '/../..' . '/core/userrights.class.inc.php', 'ActionEmail' => __DIR__ . '/../..' . '/core/action.class.inc.php', @@ -727,6 +728,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Combodo\\iTop\\Application\\UI\\Links\\Set\\LinkSetUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Links/Set/LinksSetUIBlockFactory.php', 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => __DIR__ . '/../..' . '/sources/Application/UI/Preferences/BlockShortcuts/BlockShortcuts.php', 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => __DIR__ . '/../..' . '/sources/Application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\DefaultWelcomePopup' => __DIR__ . '/../..' . '/sources/Application/WelcomePopup/DefaultWelcomePopup.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\WelcomePopupService' => __DIR__ . '/../..' . '/sources/Application/WelcomePopup/WelcomePopupService.php', 'Combodo\\iTop\\Composer\\iTopComposer' => __DIR__ . '/../..' . '/sources/Composer/iTopComposer.php', 'Combodo\\iTop\\Controller\\AbstractController' => __DIR__ . '/../..' . '/sources/Controller/AbstractController.php', 'Combodo\\iTop\\Controller\\AjaxRenderController' => __DIR__ . '/../..' . '/sources/Controller/AjaxRenderController.php', @@ -736,6 +739,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Combodo\\iTop\\Controller\\OAuth\\OAuthLandingController' => __DIR__ . '/../..' . '/sources/Controller/OAuth/OAuthLandingController.php', 'Combodo\\iTop\\Controller\\PreferencesController' => __DIR__ . '/../..' . '/sources/Controller/PreferencesController.php', 'Combodo\\iTop\\Controller\\TemporaryObjects\\TemporaryObjectController' => __DIR__ . '/../..' . '/sources/Controller/TemporaryObjects/TemporaryObjectController.php', + 'Combodo\\iTop\\Controller\\WelcomePopupController' => __DIR__ . '/../..' . '/sources/Controller/WelcomePopupController.php', 'Combodo\\iTop\\Controller\\iController' => __DIR__ . '/../..' . '/sources/Controller/iController.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientProvider' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/IOAuthClientProvider.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAbstract' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAbstract.php', @@ -3349,6 +3353,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'iTopWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/iTopWebPage.php', 'iTopWizardWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/iTopWizardWebPage.php', 'iTopXmlException' => __DIR__ . '/../..' . '/application/exceptions/iTopXmlException.php', + 'iWelcomePopup' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'iWorkingTimeComputer' => __DIR__ . '/../..' . '/core/computing.inc.php', 'lnkAuditCategoryToAuditDomain' => __DIR__ . '/../..' . '/application/audit.domain.class.inc.php', 'lnkTriggerAction' => __DIR__ . '/../..' . '/core/trigger.class.inc.php', diff --git a/lib/composer/installed.php b/lib/composer/installed.php index 5f032ca9e..38c38520e 100644 --- a/lib/composer/installed.php +++ b/lib/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'dbf3393c9729a20f0bf389d343507238d61fef56', + 'reference' => '204a6d8e51619cd669c6d9d7722edaa36d1c3394', 'name' => 'combodo/itop', 'dev' => true, ), @@ -25,7 +25,7 @@ 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'dbf3393c9729a20f0bf389d343507238d61fef56', + 'reference' => '204a6d8e51619cd669c6d9d7722edaa36d1c3394', 'dev_requirement' => false, ), 'combodo/tcpdf' => array( diff --git a/pages/UI.php b/pages/UI.php index 8c2f31609..8b353dc6c 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -20,6 +20,7 @@ use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory; use Combodo\iTop\Controller\Base\Layout\ObjectController; use Combodo\iTop\Service\Router\Router; +use Combodo\iTop\Application\WelcomePopup\WelcomePopupService; /** * Displays a popup welcome message, once per session at maximum @@ -29,19 +30,18 @@ use Combodo\iTop\Service\Router\Router; * * @return void */ -function DisplayWelcomePopup(WebPage $oP) +function DisplayWelcomePopup(WebPage $oP): void { if (!Session::IsSet('welcome')) { - // Check, only once per session, if the popup should be displayed... - // If the user did not already ask for hiding it forever - $bPopup = appUserPreferences::GetPref('welcome_popup', true); - if ($bPopup) + $oWelcomePopupService = new WelcomePopupService(); + $aMessages = $oWelcomePopupService->GetMessages(); + if (count($aMessages) > 0) { - TwigHelper::RenderIntoPage($oP, APPROOT.'/', 'templates/pages/backoffice/welcome_popup/welcome_popup'); - Session::Set('welcome', 'ok'); + TwigHelper::RenderIntoPage($oP, APPROOT.'/', 'templates/pages/backoffice/welcome_popup/welcome_popup', ['messages' => $aMessages]); } - } + Session::Set('welcome', 'ok'); // Try just once per session + } } /** @@ -66,7 +66,7 @@ function ApplyNextAction(Webpage $oP, CMDBObject $oObj, $sNextAction) } // Get the list of missing mandatory fields for the target state, considering only the changes from the previous form (i.e don't prompt twice) $aExpectedAttributes = $oObj->GetTransitionAttributes($sNextAction); - + if (count($aExpectedAttributes) == 0) { // If all the mandatory fields are already present, just apply the transition silently... @@ -85,7 +85,7 @@ function ApplyNextAction(Webpage $oP, CMDBObject $oObj, $sNextAction) // redirect to the 'stimulus' action $oAppContext = new ApplicationContext(); //echo "

Missing Attributes

".print_r($aExpectedAttributes, true)."

\n"; - + $oP->add_header('Location: '.utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=stimulus&class='.get_class($oObj).'&stimulus='.$sNextAction.'&id='.$oObj->getKey().'&'.$oAppContext->GetForLink()); } } @@ -243,7 +243,7 @@ function DisplayMultipleSelectionForm(WebPage $oP, DBSearch $oFilter, string $sN $aExtraParams['surround_with_panel'] = true; if(array_key_exists('icon', $aDisplayParams)){ $aExtraParams['panel_icon'] = $aDisplayParams['icon']; - } + } if(array_key_exists('title', $aDisplayParams)){ $aExtraParams['panel_title'] = $aDisplayParams['title']; } @@ -292,7 +292,7 @@ function DisplayNavigatorGroupTab($oP) } /*********************************************************************************** - * + * * Main user interface page starts here * ***********************************************************************************/ @@ -700,7 +700,7 @@ try break; /////////////////////////////////////////////////////////////////////////////////////////// - + /** @deprecated 3.1.0 Use the "object.new" route instead */ // Kept for backward compatibility case 'new': // Form to create a new object @@ -1638,4 +1638,4 @@ class UI ); cmdbAbstractObject::DoBulkModify($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $bPreview, $sCancelUrl, $aContext); } -} \ No newline at end of file +} diff --git a/pages/ajax.render.php b/pages/ajax.render.php index ffdb84bc6..08b67a9c3 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -17,6 +17,7 @@ use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer; use Combodo\iTop\Renderer\Console\ConsoleFormRenderer; use Combodo\iTop\Service\Router\Router; use Combodo\iTop\Service\TemporaryObjects\TemporaryObjectManager; +use Combodo\iTop\Controller\WelcomePopupController; require_once('../approot.inc.php'); @@ -201,10 +202,10 @@ try $oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates); $oAppContext = new ApplicationContext(); $aPrefillFormParam = array( - 'user' => Session::Get("auth_user"), - 'context' => $oAppContext->GetAsHash(), - 'att_code' => $sAttCode, - 'origin' => 'console', + 'user' => Session::Get("auth_user"), + 'context' => $oAppContext->GetAsHash(), + 'att_code' => $sAttCode, + 'origin' => 'console', 'source_obj' => $oObj ); $aAlreadyLinked = utils::ReadParam('aAlreadyLinked', array()); @@ -276,10 +277,10 @@ try $oPage->SetContentType('text/html'); $oAppContext = new ApplicationContext(); $aPrefillFormParam = array( - 'user' => Session::Get('auth_user'), - 'context' => $oAppContext->GetAsHash(), - 'att_code' => $sAttCode, - 'origin' => 'console', + 'user' => Session::Get('auth_user'), + 'context' => $oAppContext->GetAsHash(), + 'att_code' => $sAttCode, + 'origin' => 'console', 'source_obj' => $oObj, ); $aPrefillFormParam['dest_class'] = ($oObj === null ? '' : $oObj->Get($sAttCode)->GetClass()); @@ -303,10 +304,10 @@ try } $oAppContext = new ApplicationContext(); $aPrefillFormParam = array( - 'user' => Session::Get('auth_user'), - 'context' => $oAppContext->GetAsHash(), - 'att_code' => $sAttCode, - 'origin' => 'console', + 'user' => Session::Get('auth_user'), + 'context' => $oAppContext->GetAsHash(), + 'att_code' => $sAttCode, + 'origin' => 'console', 'source_obj' => $oObj, ); $aPrefillFormParam['dest_class'] = ($oObj === null ? '' : $oObj->Get($sAttCode)->GetClass()); @@ -418,10 +419,10 @@ try $iInputId = utils::ReadParam('iInputId', ''); $sAttCode = utils::ReadParam('sAttCode', ''); $sJson = utils::ReadParam('json', '', false, 'raw_data'); - $bTargetClassSelected = utils::ReadParam('bTargetClassSelected', '', false, 'raw_data'); - // Building form, if target class has child classes we ask the user for the desired leaf class, unless we've already done just that + $bTargetClassSelected = utils::ReadParam('bTargetClassSelected', '', false, 'raw_data'); + // Building form, if target class has child classes we ask the user for the desired leaf class, unless we've already done just that $oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode, false); - if(!$bTargetClassSelected && MetaModel::HasChildrenClasses($sTargetClass)){ + if (!$bTargetClassSelected && MetaModel::HasChildrenClasses($sTargetClass)) { $oWidget->GetClassSelectionForm($oPage); } else { $aPrefillFormParam = array(); @@ -430,11 +431,11 @@ try $oObj = $oWizardHelper->GetTargetObject(); $oAppContext = new ApplicationContext(); $aPrefillFormParam = array( - 'user' => Session::Get('auth_user'), - 'context' => $oAppContext->GetAsHash(), - 'att_code' => $sAttCode, + 'user' => Session::Get('auth_user'), + 'context' => $oAppContext->GetAsHash(), + 'att_code' => $sAttCode, 'source_obj' => $oObj, - 'origin' => 'console' + 'origin' => 'console' ); } else { // Search form: no current object @@ -527,7 +528,8 @@ try $oObj->Set($sAttCode, $defaultValue); } $sFormPrefix = $oWizardHelper->GetFormPrefix(); - $aExpectedAttributes = ($oWizardHelper->GetStimulus() === null) ? array() : $oObj->GetTransitionAttributes($oWizardHelper->GetStimulus(), $oWizardHelper->GetInitialState()); + $aExpectedAttributes = ($oWizardHelper->GetStimulus() === null) ? array() : $oObj->GetTransitionAttributes($oWizardHelper->GetStimulus(), + $oWizardHelper->GetInitialState()); foreach ($oWizardHelper->GetFieldsForAllowedValues() as $sAttCode) { $sId = $oWizardHelper->GetIdForField($sAttCode); if ($sId != '') { @@ -573,7 +575,8 @@ try $sTargetState = utils::ReadParam('target_state', ''); $iTransactionId = utils::ReadParam('transaction_id', '', false, 'transaction_id'); $oObj->Set(MetaModel::GetStateAttributeCode($sClass), $sTargetState); - cmdbAbstractObject::DisplayCreationForm($oPage, $sClass, $oObj, array(), array('action' => utils::GetAbsoluteUrlAppRoot().'pages/UI.php', 'transaction_id' => $iTransactionId)); + cmdbAbstractObject::DisplayCreationForm($oPage, $sClass, $oObj, array(), + array('action' => utils::GetAbsoluteUrlAppRoot().'pages/UI.php', 'transaction_id' => $iTransactionId)); break; // DisplayBlock @@ -600,8 +603,7 @@ try } else { try { $oFilter = DBSearch::unserialize($sFilter); - } - catch (CoreException $e) { + } catch (CoreException $e) { $sFilter = utils::HtmlEntities($sFilter); $oPage->p("Invalid query (invalid filter) : $sFilter"); IssueLog::Error("ajax.render operation='ajax', invalid DBSearch filter param : $sFilter"); @@ -666,7 +668,8 @@ try $aResult['JSURLs'] = str_replace('"', '\'', $oBlock->sJSURLs); $aResult['js'] = 'charts['.$iRefresh.'].load({json: '.str_replace('"', '\'', $oBlock->sJson). ',keys: { x: \'label\', value: [\'value\']'. - '},onclick: function (d) { var aURLs = $.parseJSON('.str_replace('"', '\'', $oBlock->sJSURLs).'); window.location.href= aURLs[d.index]; }})'; + '},onclick: function (d) { var aURLs = $.parseJSON('.str_replace('"', '\'', + $oBlock->sJSURLs).'); window.location.href= aURLs[d.index]; }})'; break; case 'pie': @@ -677,7 +680,8 @@ try $aResult['JSURLs'] = str_replace('"', '\'', $oBlock->sJSURLs); $aResult['js'] = 'charts['.$iRefresh.'].load({columns: '.str_replace('"', '\'', $oBlock->sJSColumns). ',names: '.str_replace('"', '\'', $oBlock->sJSNames). - ',onclick: function (d) { var aURLs = $.parseJSON('.str_replace('"', '\'', $oBlock->sJSURLs).'); window.location.href= aURLs[d.index]; }})'; + ',onclick: function (d) { var aURLs = $.parseJSON('.str_replace('"', '\'', + $oBlock->sJSURLs).'); window.location.href= aURLs[d.index]; }})'; break; } } else { @@ -777,14 +781,14 @@ try $oFilter = new DBObjectSearch($sClass); $oSet = new CMDBObjectSet($oFilter); $sHtml = cmdbAbstractObject::GetSearchForm($oPage, $oSet, array( - 'currentId' => $currentId, - 'baseClass' => $sRootClass, - 'action' => $sAction, - 'table_id' => $sTableId, - 'selection_mode' => $sSelectionMode, + 'currentId' => $currentId, + 'baseClass' => $sRootClass, + 'action' => $sAction, + 'table_id' => $sTableId, + 'selection_mode' => $sSelectionMode, 'result_list_outer_selector' => $sResultListOuterSelector, - 'cssCount' => $scssCount, - 'table_inner_id' => $sTableInnerId + 'cssCount' => $scssCount, + 'table_inner_id' => $sTableInnerId )); $oPage->add($sHtml); break; @@ -821,13 +825,13 @@ try TemporaryObjectManager::GetInstance()->CancelAllTemporaryObjects($iTransactionId); IssueLog::Trace('on_form_cancel', $sObjClass, array( - '$iObjKey' => $iObjKey, + '$iObjKey' => $iObjKey, '$sTransactionId' => $iTransactionId, - '$sTempId' => $sTempId, - '$sToken' => $sToken, - '$sUser' => UserRights::GetUser(), - 'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'], - 'REQUEST_URI' => @$_SERVER['REQUEST_URI'], + '$sTempId' => $sTempId, + '$sToken' => $sToken, + '$sUser' => UserRights::GetUser(), + 'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'], + 'REQUEST_URI' => @$_SERVER['REQUEST_URI'], )); break; @@ -879,11 +883,9 @@ try $oDoc = utils::ReadPostedDocument('dashboard_upload_file'); $oDashboard->FromXml($oDoc->GetData()); $oDashboard->Save(); - } - catch (DOMException $e) { + } catch (DOMException $e) { $aResult = array('error' => Dict::S('UI:Error:InvalidDashboardFile')); - } - catch (Exception $e) { + } catch (Exception $e) { $aResult = array('error' => $e->getMessage()); } } else { @@ -1054,7 +1056,8 @@ EOF $oPage->add_script("$('#dashlet_$sDashletId').html('$sHtml');"); // in ajax web page add_script has the same effect as add_ready_script // but is executed BEFORE all 'ready_scripts' $oForm = $oDashlet->GetForm(); // Rebuild the form since the values/content changed - $oForm->SetSubmitParams(utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php', array('operation' => 'update_dashlet_property')); + $oForm->SetSubmitParams(utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php', + array('operation' => 'update_dashlet_property')); $sHtml = addslashes($oForm->RenderAsPropertySheet($oPage, true /* bReturnHtml */, '.itop-dashboard')); $sHtml = str_replace("\n", '', $sHtml); $sHtml = str_replace("\r", '', $sHtml); @@ -1113,7 +1116,8 @@ EOF } if ($oDashlet->IsFormRedrawNeeded()) { $oForm = $oDashlet->GetForm(); // Rebuild the form since the values/content changed - $oForm->SetSubmitParams(utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php', array('operation' => 'update_dashlet_property', 'extra_params' => $aExtraParams)); + $oForm->SetSubmitParams(utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php', + array('operation' => 'update_dashlet_property', 'extra_params' => $aExtraParams)); $sHtml = addslashes($oForm->RenderAsPropertySheet($oPage, true, '.itop-dashboard')); $sHtml = str_replace("\n", '', $sHtml); $sHtml = str_replace("\r", '', $sHtml); @@ -1359,7 +1363,8 @@ JS } $sFullTextJS = addslashes($sFullText); - $bEnableEnlarge = array_key_exists($sClassName, $aAccelerators) && array_key_exists('query', $aAccelerators[$sClassName]); + $bEnableEnlarge = array_key_exists($sClassName, $aAccelerators) && array_key_exists('query', + $aAccelerators[$sClassName]); if (array_key_exists($sClassName, $aAccelerators) && array_key_exists('enable_enlarge', $aAccelerators[$sClassName])) { $bEnableEnlarge &= $aAccelerators[$sClassName]['enable_enlarge']; } @@ -1393,9 +1398,11 @@ EOF; $oPage->add("
\n"); $oPage->add("
\n"); if (array_key_exists($sClassName, $aAccelerators)) { - $oPage->add('

'.MetaModel::GetClassIcon($sClassName).Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aLeafs), Metamodel::GetName($sClassName)).$sEnlargeButton."

\n"); + $oPage->add('

'.MetaModel::GetClassIcon($sClassName).Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', + count($aLeafs), Metamodel::GetName($sClassName)).$sEnlargeButton."

\n"); } else { - $oPage->add('

'.MetaModel::GetClassIcon($sClassName).Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aLeafs), Metamodel::GetName($sClassName))."

\n"); + $oPage->add('

'.MetaModel::GetClassIcon($sClassName).Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', + count($aLeafs), Metamodel::GetName($sClassName))."

\n"); } $oPage->add("
\n"); $oLeafsFilter->AddCondition('id', $aLeafs, 'IN'); @@ -1411,7 +1418,8 @@ EOF; if (array_key_exists($sClassName, $aAccelerators)) { $oPage->add("
\n"); $oPage->add("
\n"); - $oPage->add('

'.MetaModel::GetClassIcon($sClassName).Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', 0, Metamodel::GetName($sClassName)).$sEnlargeButton."

\n"); + $oPage->add('

'.MetaModel::GetClassIcon($sClassName).Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', + 0, Metamodel::GetName($sClassName)).$sEnlargeButton."

\n"); $oPage->add("
\n"); $oPage->add("
\n"); $oPage->p(' '); // Some space ? @@ -1491,7 +1499,8 @@ EOF $oFilter->SetShowObsoleteData(utils::ShowObsoleteData()); $oSet = new DBObjectSet($oFilter); $oPage->add("
\n"); - $oPage->add("

".MetaModel::GetClassIcon($sClass)." ".Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', $oSet->Count(), Metamodel::GetName($sClass))."

\n"); + $oPage->add("

".MetaModel::GetClassIcon($sClass)." ".Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', + $oSet->Count(), Metamodel::GetName($sClass))."

\n"); $oPage->add("
\n"); if ($oSet->Count() > 0) { $aLeafs = array(); @@ -1579,10 +1588,11 @@ EOF $oPage->add('
'.Dict::S('ExcelExport:Statistics').'
'); $oPage->add('
'); $aLabels = array( - 'dialog_title' => Dict::S('ExcelExporter:ExportDialogTitle'), - 'cancel_button' => Dict::S('UI:Button:Cancel'), - 'export_button' => Dict::S('ExcelExporter:ExportButton'), - 'download_button' => Dict::Format('ExcelExporter:DownloadButton', 'export.xlsx'), //TODO: better name for the file (based on the class of the filter??) + 'dialog_title' => Dict::S('ExcelExporter:ExportDialogTitle'), + 'cancel_button' => Dict::S('UI:Button:Cancel'), + 'export_button' => Dict::S('ExcelExporter:ExportButton'), + 'download_button' => Dict::Format('ExcelExporter:DownloadButton', 'export.xlsx'), + //TODO: better name for the file (based on the class of the filter??) ); $sJSLabels = json_encode($aLabels); $sFilter = addslashes($sFilter); @@ -1694,7 +1704,8 @@ EOF if ($sDirection == 'up') { $oRelGraph = MetaModel::GetRelatedObjectsUp($sRelation, $aSourceObjects, $iMaxRecursionDepth, true, $aContexts); } else { - $oRelGraph = MetaModel::GetRelatedObjectsDown($sRelation, $aSourceObjects, $iMaxRecursionDepth, true, $aExcludedObjects, $aContexts); + $oRelGraph = MetaModel::GetRelatedObjectsDown($sRelation, $aSourceObjects, $iMaxRecursionDepth, true, $aExcludedObjects, + $aContexts); } // Remove excluded classes from the graph @@ -1754,9 +1765,11 @@ EOF $sIconUrl = MetaModel::GetClassIcon($sListClass, false); $sIconUrl = str_replace(utils::GetAbsoluteUrlModulesRoot(), APPROOT.'env-'.utils::GetCurrentEnvironment().'/', $sIconUrl); $oTitle = new Html(" ".Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', $oSet->Count(), Metamodel::GetName($sListClass)));*/ - $oTitle = new Html(Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', $oSet->Count(), Metamodel::GetName($sListClass))); + $oTitle = new Html(Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', $oSet->Count(), + Metamodel::GetName($sListClass))); $oPage->AddSubBlock(TitleUIBlockFactory::MakeStandard($oTitle, 2)); - $oPage->AddSubBlock(cmdbAbstractObject::GetDataTableFromDBObjectSet($oSet, array('table_id' => $sSourceClass.'_'.$sRelation.'_'.$sDirection.'_'.$sListClass))); + $oPage->AddSubBlock(cmdbAbstractObject::GetDataTableFromDBObjectSet($oSet, + array('table_id' => $sSourceClass.'_'.$sRelation.'_'.$sDirection.'_'.$sListClass))); } // Then the content of the groups (one table per group) @@ -1768,8 +1781,10 @@ EOF $sListClass = get_class(current($aObjects)); $oSet = CMDBObjectSet::FromArray($sListClass, $aObjects); $sIconUrl = MetaModel::GetClassIcon($sListClass, false); - $sIconUrl = str_replace(utils::GetAbsoluteUrlModulesRoot(), APPROOT.'env-'.utils::GetCurrentEnvironment().'/', $sIconUrl); - $oTitle = new Html(" ".Dict::Format('UI:RelationGroupNumber_N', (1 + $idx)), Metamodel::GetName($sListClass)); + $sIconUrl = str_replace(utils::GetAbsoluteUrlModulesRoot(), APPROOT.'env-'.utils::GetCurrentEnvironment().'/', + $sIconUrl); + $oTitle = new Html(" ".Dict::Format('UI:RelationGroupNumber_N', + (1 + $idx)), Metamodel::GetName($sListClass)); $oPage->AddSubBlock(TitleUIBlockFactory::MakeStandard($oTitle, 2)); $oPage->AddSubBlock(cmdbAbstractObject::GetDataTableFromDBObjectSet($oSet)); @@ -1843,7 +1858,8 @@ EOF if ($sDirection == 'up') { $oRelGraph = MetaModel::GetRelatedObjectsUp($sRelation, $aSourceObjects, $iMaxRecursionDepth, true, $aContexts); } else { - $oRelGraph = MetaModel::GetRelatedObjectsDown($sRelation, $aSourceObjects, $iMaxRecursionDepth, true, $aExcludedObjects, $aContexts); + $oRelGraph = MetaModel::GetRelatedObjectsDown($sRelation, $aSourceObjects, $iMaxRecursionDepth, true, $aExcludedObjects, + $aContexts); } // Remove excluded classes from the graph @@ -1874,13 +1890,15 @@ EOF $oSearch = new DBObjectSearch($sListClass); $oSearch->AddCondition('id', $aDefinition['keys'], 'IN'); $oSearch->SetShowObsoleteData(utils::ShowObsoleteData()); - $oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral(Dict::Format('UI:RelationGroupNumber_N', (1 + $idx)), 1, "relation_group_$idx")); + $oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral(Dict::Format('UI:RelationGroupNumber_N', (1 + $idx)), 1, + "relation_group_$idx")); $oBlock = new DisplayBlock($oSearch, 'list'); $oBlock->Display($oPage, 'group_'.$iBlock++, array( 'surround_with_panel' => true, - 'panel_class' => $sListClass, - 'panel_title' => Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aDefinition['keys']), Metamodel::GetName($sListClass)), - 'panel_icon' => MetaModel::GetClassIcon($sListClass, false), + 'panel_class' => $sListClass, + 'panel_title' => Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aDefinition['keys']), + Metamodel::GetName($sListClass)), + 'panel_icon' => MetaModel::GetClassIcon($sListClass, false), )); } break; @@ -1894,11 +1912,12 @@ EOF $oSearch->SetShowObsoleteData(utils::ShowObsoleteData()); $oBlock = new DisplayBlock($oSearch, 'list'); $oBlock->Display($oPage, 'list_'.$iBlock++, array( - 'table_id' => 'ImpactAnalysis_'.$sListClass, + 'table_id' => 'ImpactAnalysis_'.$sListClass, 'surround_with_panel' => true, - 'panel_class' => $sListClass, - 'panel_title' => Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aKeys), Metamodel::GetName($sListClass)), - 'panel_icon' => MetaModel::GetClassIcon($sListClass, false), + 'panel_class' => $sListClass, + 'panel_title' => Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aKeys), + Metamodel::GetName($sListClass)), + 'panel_icon' => MetaModel::GetClassIcon($sListClass, false), )); } break; @@ -1950,7 +1969,8 @@ EOF $sContextKey = 'itop-tickets/relation_context/'.$sClass.'/'.$sRelation.'/'.$sDirection; $oAppContext = new ApplicationContext(); - $oGraph->Display($oPage, $aResults, $sRelation, $oAppContext, $aExcludedObjects, $sClass, $iId, $sContextKey, array('this' => $oTicket)); + $oGraph->Display($oPage, $aResults, $sRelation, $oAppContext, $aExcludedObjects, $sClass, $iId, $sContextKey, + array('this' => $oTicket)); break; case 'export_build': @@ -2000,7 +2020,7 @@ EOF $aLockData = iTopOwnershipLock::IsLocked($sObjClass, $iObjKey); $aResult = [ - 'locked' => $aLockData['locked'], + 'locked' => $aLockData['locked'], 'message' => '', ]; @@ -2087,11 +2107,11 @@ EOF $aResult = array( 'uploaded' => 0, 'fileName' => '', - 'url' => '', - 'icon' => '', - 'msg' => '', - 'att_id' => 0, - 'preview' => 'false', + 'url' => '', + 'icon' => '', + 'msg' => '', + 'att_id' => 0, + 'preview' => 'false', ); $sObjClass = stripslashes(utils::ReadParam('obj_class', '', false, 'class')); @@ -2126,20 +2146,19 @@ EOF } IssueLog::Trace('InlineImage created', LogChannels::INLINE_IMAGE, array( - '$operation' => $operation, - '$aResult' => $aResult, - 'secret' => $oAttachment->Get('secret'), - 'temp_id' => $sTempId, - 'item_class' => $sObjClass, - 'user' => UserRights::GetUser(), + '$operation' => $operation, + '$aResult' => $aResult, + 'secret' => $oAttachment->Get('secret'), + 'temp_id' => $sTempId, + 'item_class' => $sObjClass, + 'user' => UserRights::GetUser(), 'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'], - 'REQUEST_URI' => @$_SERVER['REQUEST_URI'], + 'REQUEST_URI' => @$_SERVER['REQUEST_URI'], )); } else { $aResult['error'] = $oDoc->GetFileName().' is not a valid image format.'; } - } - catch (FileUploadException $e) { + } catch (FileUploadException $e) { $aResult['error'] = $e->GetMessage(); } } @@ -2156,8 +2175,8 @@ EOF if (!InlineImage::IsImage($sDocMimeType)) { LogErrorMessage('CKE : error when uploading image in ajax.render.php, not an image', array( - 'operation' => 'cke_upload_and_browse', - 'class' => $sObjClass, + 'operation' => 'cke_upload_and_browse', + 'class' => $sObjClass, 'ImgMimeType' => $sDocMimeType, )); } else { @@ -2174,22 +2193,21 @@ EOF $iAttId = $oAttachment->DBInsert(); IssueLog::Trace('InlineImage created', LogChannels::INLINE_IMAGE, array( - '$operation' => $operation, - 'secret' => $oAttachment->Get('secret'), - 'temp_id' => $sTempId, - 'item_class' => $sObjClass, - 'user' => UserRights::GetUser(), + '$operation' => $operation, + 'secret' => $oAttachment->Get('secret'), + 'temp_id' => $sTempId, + 'item_class' => $sObjClass, + 'user' => UserRights::GetUser(), 'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'], - 'REQUEST_URI' => @$_SERVER['REQUEST_URI'], + 'REQUEST_URI' => @$_SERVER['REQUEST_URI'], )); } - } - catch (FileUploadException $e) { + } catch (FileUploadException $e) { LogErrorMessage('CKE : error when uploading image in ajax.render.php, exception occured', array( - 'operation' => 'cke_upload_and_browse', - 'class' => $sObjClass, + 'operation' => 'cke_upload_and_browse', + 'class' => $sObjClass, 'exceptionMsg' => $e, )); } @@ -2303,7 +2321,8 @@ $('.img-picker').magnificPopup({type: 'image', closeOnContentClick: true }); EOF ); $sOQL = "SELECT InlineImage WHERE ((temp_id = :temp_id) OR (item_class = :obj_class AND item_id = :obj_id))"; - $oSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('temp_id' => $sTempId, 'obj_class' => $sClass, 'obj_id' => $iObjectId)); + $oSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), + array('temp_id' => $sTempId, 'obj_class' => $sClass, 'obj_id' => $iObjectId)); $oPage->add("
$sAvailableImagesLegend"); if ($oSet->Count() == 0) { @@ -2360,7 +2379,8 @@ EOF $aTriggerMentionedSearches = []; $aTriggerSetParams = array('class_list' => MetaModel::EnumParentClasses($sHostClass, ENUM_PARENT_CLASSES_ALL)); - $oTriggerSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnObjectMention AS t WHERE t.target_class IN (:class_list)"), array(), $aTriggerSetParams); + $oTriggerSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnObjectMention AS t WHERE t.target_class IN (:class_list)"), + array(), $aTriggerSetParams); /** @var \TriggerOnObjectMention $oTrigger */ while ($oTrigger = $oTriggerSet->Fetch()) { $sTriggerMentionedOQL = $oTrigger->Get('mentioned_filter'); @@ -2394,7 +2414,8 @@ EOF // Add condition to filter on the friendlyname $oSearch->AddConditionExpression( - new BinaryExpression(new FieldExpression('friendlyname', $sSearchMainClassAlias), 'LIKE', new VariableExpression('needle')) + new BinaryExpression(new FieldExpression('friendlyname', $sSearchMainClassAlias), 'LIKE', + new VariableExpression('needle')) ); $oSet = new DBObjectSet($oSearch, [], $aSearchParams); @@ -2413,8 +2434,8 @@ EOF $sObjectClass = get_class($oObject); $iObjectId = $oObject->GetKey(); $aMatch = [ - 'class' => $sObjectClass, - 'id' => $iObjectId, + 'class' => $sObjectClass, + 'id' => $iObjectId, 'friendlyname' => $oObject->Get('friendlyname'), ]; @@ -2423,7 +2444,8 @@ EOF /** @var \ormDocument $oImage */ $oImage = $oObject->Get($sObjectImageAttCode); if (!$oImage->IsEmpty()) { - $aMatch['picture_style'] = "background-image: url('".$oImage->GetDisplayURL($sObjectClass, $iObjectId, $sObjectImageAttCode)."')"; + $aMatch['picture_style'] = "background-image: url('".$oImage->GetDisplayURL($sObjectClass, $iObjectId, + $sObjectImageAttCode)."')"; $aMatch['initials'] = ''; } else { // If no image found, fallback on initials @@ -2460,8 +2482,7 @@ EOF $aRenderRes = $oRenderer->Render($aRequestedFields); $aResult['form']['updated_fields'] = $aRenderRes; - } - catch (Exception $e) { + } catch (Exception $e) { $aResult['error'] = $e->getMessage(); } $oPage->SetData($aResult); @@ -2478,10 +2499,9 @@ EOF $oController = new PreferencesController(); $aResult = $oController->SetUserPicture(); $aResult['success'] = true; - } - catch (Exception $oException) { + } catch (Exception $oException) { $aResult = [ - 'success' => false, + 'success' => false, 'error_message' => $oException->getMessage(), ]; } @@ -2500,10 +2520,9 @@ EOF $aResult = [ 'success' => true, ]; - } - catch (Exception $oException) { + } catch (Exception $oException) { $aResult = [ - 'success' => false, + 'success' => false, 'error_message' => $oException->getMessage(), ]; } @@ -2516,10 +2535,9 @@ EOF try { $oController = new ActivityPanelController(); $aResult = $oController->AddCaseLogsEntries(); - } - catch (Exception $oException) { + } catch (Exception $oException) { $aResult = [ - 'success' => false, + 'success' => false, 'error_message' => $oException->getMessage(), ]; } @@ -2532,10 +2550,9 @@ EOF try { $oController = new ActivityPanelController(); $aResult = $oController->LoadMoreEntries(); - } - catch (Exception $oException) { + } catch (Exception $oException) { $aResult = [ - 'success' => false, + 'success' => false, 'error_message' => $oException->getMessage(), ]; } @@ -2551,6 +2568,24 @@ EOF $oAjaxRenderController->GetMenusCount($oPage); break; + //-------------------------------- + // WelcomePopupMenu + //-------------------------------- + case 'welcome_popup_acknowledge_message': + $oPage = new JsonPage(); + try { + $oController = new WelcomePopupController(); + $oController->AcknowledgeMessage(); + $aResult = ['success' => true]; + } catch (Exception $oException) { + $aResult = [ + 'success' => false, + 'error_message' => $oException->getMessage(), + ]; + } + $oPage->SetData($aResult); + break; + //-------------------------------- // Object //-------------------------------- diff --git a/pages/preferences.php b/pages/preferences.php index d8417227b..be8880644 100644 --- a/pages/preferences.php +++ b/pages/preferences.php @@ -141,55 +141,58 @@ JS // ////////////////////////////////////////////////////////////////////////// - $oFavoriteOrganizationsBlock = new Panel(Dict::S('UI:FavoriteOrganizations'), array(), 'grey', 'ibo-favorite-organizations'); - $oFavoriteOrganizationsBlock->SetSubTitle(Dict::S('UI:FavoriteOrganizations+')); - $oFavoriteOrganizationsBlock->AddCSSClass('ibo-datatable-panel'); - $oFavoriteOrganizationsForm = new Form(); - $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsForm); - // Favorite organizations: the organizations listed in the drop-down menu - $sOQL = ApplicationMenu::GetFavoriteSiloQuery(); - $oFilter = DBObjectSearch::FromOQL($sOQL); - $oBlock = new DisplayBlock($oFilter, 'list', false); + $bIsSiloSelectionEnabled = MetaModel::GetConfig()->Get('navigation_menu.show_organization_filter'); + if ($bIsSiloSelectionEnabled) + { + $oFavoriteOrganizationsBlock = new Panel(Dict::S('UI:FavoriteOrganizations'), array(), 'grey', 'ibo-favorite-organizations'); + $oFavoriteOrganizationsBlock->SetSubTitle(Dict::S('UI:FavoriteOrganizations+')); + $oFavoriteOrganizationsBlock->AddCSSClass('ibo-datatable-panel'); + $oFavoriteOrganizationsForm = new Form(); + $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsForm); + // Favorite organizations: the organizations listed in the drop-down menu + $sOQL = ApplicationMenu::GetFavoriteSiloQuery(); + $oFilter = DBObjectSearch::FromOQL($sOQL); + $oBlock = new DisplayBlock($oFilter, 'list', false); - $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null); + $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null); - $sIdFavoriteOrganizations = 1; - $oFavoriteOrganizationsForm->AddSubBlock($oBlock->GetDisplay($oP, $sIdFavoriteOrganizations, [ - 'menu' => false, - 'selection_mode' => true, - 'selection_type' => 'multiple', - 'table_id' => 'user_prefs', - 'surround_with_panel' => false, - 'selected_rows' => $aFavoriteOrgs, - ])); - $oFavoriteOrganizationsForm->AddSubBlock($oAppContext->GetForFormBlock()); + $sIdFavoriteOrganizations = 1; + $oFavoriteOrganizationsForm->AddSubBlock($oBlock->GetDisplay($oP, $sIdFavoriteOrganizations, [ + 'menu' => false, + 'selection_mode' => true, + 'selection_type' => 'multiple', + 'table_id' => 'user_prefs', + 'surround_with_panel' => false, + 'selected_rows' => $aFavoriteOrgs, + ])); + $oFavoriteOrganizationsForm->AddSubBlock($oAppContext->GetForFormBlock()); - // Button toolbar - $oFavoriteOrganizationsToolBar = ToolbarUIBlockFactory::MakeForButton(null, ['ibo-is-fullwidth']); - $oFavoriteOrganizationsForm->AddSubBlock($oFavoriteOrganizationsToolBar); + // Button toolbar + $oFavoriteOrganizationsToolBar = ToolbarUIBlockFactory::MakeForButton(null, ['ibo-is-fullwidth']); + $oFavoriteOrganizationsForm->AddSubBlock($oFavoriteOrganizationsToolBar); - // - Cancel button - $oFavoriteOrganizationsCancelButton = ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel')); - $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsCancelButton); - $oFavoriteOrganizationsCancelButton->SetOnClickJsCode("window.location.href = '$sURL'"); - // - Submit button - $oFavoriteOrganizationsSubmitButton = ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Apply'), 'operation', 'apply', true); - $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsSubmitButton); + // - Cancel button + $oFavoriteOrganizationsCancelButton = ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel')); + $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsCancelButton); + $oFavoriteOrganizationsCancelButton->SetOnClickJsCode("window.location.href = '$sURL'"); + // - Submit button + $oFavoriteOrganizationsSubmitButton = ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Apply'), 'operation', 'apply', true); + $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsSubmitButton); - // TODO 3.0 have this code work again, currently it prevents the display of favorite organizations and shortcuts. - // if ($aFavoriteOrgs == null) { - // // All checked - // $oP->add_ready_script( - // <<AddMainBlock($oFavoriteOrganizationsBlock); + // TODO 3.0 have this code work again, currently it prevents the display of favorite organizations and shortcuts. + // if ($aFavoriteOrgs == null) { + // // All checked + // $oP->add_ready_script( + // <<AddMainBlock($oFavoriteOrganizationsBlock); + } ////////////////////////////////////////////////////////////////////////// // // Shortcuts diff --git a/setup/backup.class.inc.php b/setup/backup.class.inc.php index f51b7525a..7119833bc 100644 --- a/setup/backup.class.inc.php +++ b/setup/backup.class.inc.php @@ -3,7 +3,7 @@ // // This file is part of iTop. // -// iTop is free software; you can redistribute it and/or modify +// iTop is free software; you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. @@ -146,18 +146,23 @@ class DBBackup /** * Create a normalized backup name, depending on the current date/time and Database * - * @param string $sNameSpec Name and path, eventually containing itop placeholders + time formatting following the strftime() format {@link https://www.php.net/manual/fr/function.strftime.php} + * @param string|null $sNameSpec Name and path, eventually containing itop placeholders + time formatting following the strftime() format {@link https://www.php.net/manual/fr/function.strftime.php} * @param \DateTime|null $oDateTime Date time to use for the name * - * @return string Name of the backup file WITHOUT the file extension (eg. `.tar.gz`) + * @return ?string Name of the backup file WITHOUT the file extension (eg. `.tar.gz`) * @since 3.1.0 N°5279 Add $oDateTime parameter */ - public function MakeName(string $sNameSpec = "__DB__-%Y-%m-%d", DateTime $oDateTime = null) + public function MakeName(?string $sNameSpec = null, ?DateTime $oDateTime = null) { if ($oDateTime === null) { $oDateTime = new DateTime(); } + //N°6640 + if ($sNameSpec === null) { + $sNameSpec = "__DB__-%Y-%m-%d"; + } + $sFileName = $sNameSpec; $sFileName = str_replace('__HOST__', $this->sDBHost, $sFileName); $sFileName = str_replace('__DB__', $this->sDBName, $sFileName); @@ -222,7 +227,7 @@ class DBBackup * * @param string $sSourceConfigFile * @param string $sTmpFolder - * @param bool $bSkipSQLDumpForTesting + * @param bool $bSkipSQLDumpForTesting * * @return array list of files to archive * @throws \Exception @@ -273,7 +278,7 @@ class DBBackup if(!file_exists(APPROOT.'/'.$sExtraFileOrDir)) { continue; // Ignore non-existing files } - + $sExtraFullPath = utils::RealPath(APPROOT.'/'.$sExtraFileOrDir, APPROOT); if ($sExtraFullPath === false) { diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index d8eb16caf..c0e20d619 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -23,15 +23,15 @@ use Combodo\iTop\DesignElement; require_once(APPROOT.'setup/setuputils.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); +require_once(APPROOT.'setup/parentmenunodecompiler.class.inc.php'); require_once(APPROOT.'core/moduledesign.class.inc.php'); - class DOMFormatException extends Exception { /** * Overrides the Exception default constructor to automatically add informations about the concerned node (path and * line number) - * + * * @param string $message * @param $code * @param $previous @@ -49,7 +49,7 @@ class DOMFormatException extends Exception /** * Compiler class - */ + */ class MFCompiler { const DATA_PRECOMPILED_FOLDER = 'data'.DIRECTORY_SEPARATOR.'precompiled_styles'.DIRECTORY_SEPARATOR; @@ -356,7 +356,7 @@ class MFCompiler apc_clear_cache(); } } - + /** * Perform the actual "Compilation" of all modules @@ -368,21 +368,16 @@ class MFCompiler */ protected function DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks = false) { - $aAllClasses = array(); // flat list of classes - $aModulesInfo = array(); // Hash array of module_name => array('version' => string, 'root_dir' => string) + $aAllClasses = []; // flat list of classes + $aModulesInfo = []; // Hash array of module_name => array('version' => string, 'root_dir' => string) // Determine the target modules for the MENUS - // - $aMenuNodes = array(); - $aMenusByModule = array(); - foreach ($this->oFactory->GetNodes('menus/menu') as $oMenuNode) - { - $sMenuId = $oMenuNode->getAttribute('id'); - $aMenuNodes[$sMenuId] = $oMenuNode; - $sModuleMenu = $oMenuNode->getAttribute('_created_in'); - $aMenusByModule[$sModuleMenu][] = $sMenuId; - } + /** + * @since 3.1 N°4762 + */ + $oParentMenuNodeCompiler = new ParentMenuNodeCompiler($this); + $oParentMenuNodeCompiler->LoadXmlMenus($this->oFactory); // Determine the target module (exactly one!) for USER RIGHTS // This used to be based solely on the module which created the user_rights node first @@ -429,6 +424,7 @@ class MFCompiler static::SetUseSymbolicLinksFlag($bUseSymbolicLinks); + $oParentMenuNodeCompiler->LoadModuleMenuInfo($aModules); foreach ($aModules as $foo => $oModule) { $sModuleName = $oModule->GetName(); $sModuleVersion = $oModule->GetVersion(); @@ -513,7 +509,7 @@ class MFCompiler } } - if (!array_key_exists($sModuleName, $aMenusByModule)) + if (is_null($oParentMenuNodeCompiler->GetMenusByModule($sModuleName))) { $this->Log("Found module without menus declared: $sModuleName"); } @@ -533,79 +529,19 @@ class $sMenuCreationClass extends ModuleHandlerAPI global \$__comp_menus__; // ensure that the global variable is indeed global ! EOF; - // Preliminary: determine parent menus not defined within the current module - $aMenusToLoad = array(); - $aParentMenus = array(); - foreach($aMenusByModule[$sModuleName] as $sMenuId) - { - $oMenuNode = $aMenuNodes[$sMenuId]; - // compute parent hierarchy - $aParentIdHierarchy = []; - while ($sParent = $oMenuNode->GetChildText('parent', null)) { - array_unshift($aParentIdHierarchy, $sParent); - $oMenuNode = $aMenuNodes[$sParent]; - } - $aMenusToLoad = array_merge($aMenusToLoad, $aParentIdHierarchy); - $aParentMenus = array_merge($aParentMenus, $aParentIdHierarchy); - // Note: the order matters: the parents must be defined BEFORE - $aMenusToLoad[] = $sMenuId; - } - $aMenusToLoad = array_unique($aMenusToLoad); - $aMenuLinesForAll = array(); - $aMenuLinesForAdmins = array(); - $aAdminMenus = array(); - foreach($aMenusToLoad as $sMenuId) - { - $oMenuNode = $aMenuNodes[$sMenuId]; - if (is_null($oMenuNode)) - { - throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); - } - if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup') - { - // Note: this algorithm is wrong - // 1 - the module may appear empty in the current module, while children are defined in other modules - // 2 - check recursively that child nodes are not empty themselves - // Future algorithm: - // a- browse the modules and build the menu tree - // b- browse the tree and blacklist empty menus - // c- before compiling, discard if blacklisted - if (!in_array($oMenuNode->getAttribute("id"), $aParentMenus)) - { - // Discard empty menu groups - continue; - } - } - try - { - /** @var \iTopWebPage $oP */ - $aMenuLines = $this->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); - } - catch (DOMFormatException $e) - { - throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); - } - $sParent = $oMenuNode->GetChildText('parent', null); - if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent])) - { - $aMenuLinesForAdmins = array_merge($aMenuLinesForAdmins, $aMenuLines); - $aAdminMenus[$oMenuNode->getAttribute("id")] = true; - } - else - { - $aMenuLinesForAll = array_merge($aMenuLinesForAll, $aMenuLines); - } - } + + $oParentMenuNodeCompiler->CompileModuleMenus($oModule, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + $sIndent = "\t\t"; - foreach ($aMenuLinesForAll as $sPHPLine) + foreach ($oParentMenuNodeCompiler->GetMenuLinesForAll() as $sPHPLine) { $sCompiledCode .= $sIndent.$sPHPLine."\n"; } - if (count($aMenuLinesForAdmins) > 0) + if (count($oParentMenuNodeCompiler->GetMenuLinesForAdmins()) > 0) { $sCompiledCode .= $sIndent."if (UserRights::IsAdministrator())\n"; $sCompiledCode .= $sIndent."{\n"; - foreach ($aMenuLinesForAdmins as $sPHPLine) + foreach ($oParentMenuNodeCompiler->GetMenuLinesForAdmins() as $sPHPLine) { $sCompiledCode .= $sIndent."\t".$sPHPLine."\n"; } @@ -637,7 +573,7 @@ EOF; $sCompiledCode .= $aSnippet['content']."\n"; } } - + // Create (overwrite if existing) the compiled file // if (strlen($sCompiledCode) > 0) @@ -741,7 +677,7 @@ PHP; $this->sMainPHPCode .= $aSnippet['content']."\n"; } } - + // Compile the portals /** @var \MFElement $oPortalsNode */ $oPortalsNode = $this->oFactory->GetNodes('/itop_design/portals')->item(0); @@ -755,7 +691,7 @@ PHP; /** @var \MFElement $oParametersNode */ $oParametersNode = $this->oFactory->GetNodes('/itop_design/module_parameters')->item(0); $this->CompileParameters($oParametersNode, $sTempTargetDir, $sFinalTargetDir); - + if (array_key_exists('_core_', $this->aSnippets)) { foreach( $this->aSnippets['_core_']['after'] as $aSnippet) @@ -789,7 +725,7 @@ PHP; $sCurrDate = date(DATE_ISO8601); // Autoload $sPHPFile = $sTempTargetDir.'/autoload.php'; - $sPHPFileContent = + $sPHPFileContent = << 'OPT_ATT_MUSTCHANGE', 'hidden' => 'OPT_ATT_HIDDEN', ); - + $aFlags = array(); foreach ($aNodeAttributeToFlag as $sNodeAttribute => $sFlag) { @@ -867,7 +803,7 @@ EOF } if (empty($aFlags)) { - $aFlags[] = 'OPT_ATT_NORMAL'; // When no flag is defined, reset the state to "normal" + $aFlags[] = 'OPT_ATT_NORMAL'; // When no flag is defined, reset the state to "normal" } $sRes = implode(' | ', $aFlags); return $sRes; @@ -889,7 +825,7 @@ EOF 'details' => 'LINKSET_TRACKING_DETAILS', 'all' => 'LINKSET_TRACKING_ALL', ); - + static $aXmlToPHP_Others = array( 'none' => 'ATTRIBUTE_TRACKING_NONE', 'all' => 'ATTRIBUTE_TRACKING_ALL', @@ -930,7 +866,7 @@ EOF 'in_place' => 'LINKSET_EDITMODE_INPLACE', 'add_remove' => 'LINKSET_EDITMODE_ADDREMOVE', ); - + if (!array_key_exists($sEditMode, $aXmlToPHP)) { throw new DOMFormatException("Edit mode: unknown value '$sEditMode'"); @@ -938,10 +874,10 @@ EOF return $aXmlToPHP[$sEditMode]; } - + /** * Format a path (file or url) as an absolute path or relative to the module or the app - */ + */ protected function PathToPHP($sPath, $sModuleRelativeDir, $bIsUrl = false) { if ($sPath == '') @@ -1034,7 +970,7 @@ EOF else { throw new DOMFormatException("missing (or empty) mandatory tag '$sTag' under the tag '".$oNode->nodeName."'"); - } + } } /** @@ -1138,7 +1074,7 @@ EOF /** * Adds quotes and escape characters - */ + */ protected function QuoteForPHP($sStr, $bSimpleQuotes = false) { if ($bSimpleQuotes) @@ -1245,7 +1181,7 @@ EOF $sScalar = (string)(int)$sText; } break; - + case 'float': if (is_null($sText)) { @@ -1257,7 +1193,7 @@ EOF $sScalar = (string)(float)$sText; } break; - + case 'bool': if (is_null($sText)) { @@ -2722,7 +2658,7 @@ CSS; * @throws \DOMException * @throws \DOMFormatException */ - protected function CompileMenu($oMenu, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, $oP) + public function CompileMenu($oMenu, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, $oP) { $this->CompileFiles($oMenu, $sTempTargetDir.'/'.$sModuleRelativeDir, $sFinalTargetDir.'/'.$sModuleRelativeDir, $sModuleRelativeDir); @@ -2818,11 +2754,11 @@ CSS; case '1': $sSearchFormOpen = 'true'; break; - + case '0': $sSearchFormOpen = 'false'; break; - + default: $sSearchFormOpen = 'true'; } @@ -2911,7 +2847,7 @@ CSS; foreach($this->oFactory->ListFields($oClass) as $oField) { $sAttType = $oField->getAttribute('xsi:type'); - + if (($sAttType == 'AttributeExternalKey') || ($sAttType == 'AttributeHierarchicalKey')) { $sOnTargetDel = $oField->GetChildText('on_target_delete'); @@ -2937,7 +2873,7 @@ CSS; $oClasses = $oGroup->GetUniqueElement('classes'); foreach($oClasses->getElementsByTagName('class') as $oClass) { - + $sClass = $oClass->getAttribute("id"); $aClasses[] = $sClass; @@ -2955,7 +2891,7 @@ CSS; $aProfiles[1] = array( 'name' => 'Administrator', 'description' => 'Has the rights on everything (bypassing any control)', - ); + ); $aGrants = array(); $oProfiles = $oUserRightsNode->GetUniqueElement('profiles'); @@ -2987,7 +2923,7 @@ CSS; } $sGrant = $oAction->GetText(); $bGrant = ($sGrant == 'allow'); - + if ($sGroupId == '*') { $aGrantClasses = array('*'); @@ -3226,7 +3162,7 @@ Dict::SetLanguagesList( $sLanguagesDump ); EOF; - + file_put_contents($sLanguagesFile, $sLanguagesFileContent); } @@ -3263,7 +3199,7 @@ EOF; { throw new DOMFormatException('Could not find the file with ref '.$sFileId); } - + $sName = $oNodes->item(0)->GetChildText('name'); $sData = base64_decode($oNodes->item(0)->GetChildText('data')); $aPathInfo = pathinfo($sName); @@ -3277,7 +3213,7 @@ EOF; } $oParentNode = $oFileRef->parentNode; $oParentNode->removeChild($oFileRef); - + $oTextNode = $oParentNode->ownerDocument->createTextNode($sRelativePath.'/images/'.$sFile); $oParentNode->appendChild($oTextNode); } @@ -3358,7 +3294,7 @@ EOF; 'utility_imports' => array(), 'stylesheets' => array(), ); - + if($oThemesCommonNodes !== null) { /** @var \DOMNodeList $oThemesCommonVariables */ $oThemesCommonVariables = $oThemesCommonNodes->GetNodes('variables/variable'); @@ -3366,7 +3302,7 @@ EOF; $sVariableId = $oVariable->getAttribute('id'); $aThemesCommonParameters['variables'][$sVariableId] = $oVariable->GetText(); } - + /** @var \DOMNodeList $oThemesCommonImports */ $oThemesCommonImports = $oThemesCommonNodes->GetNodes('imports/import'); foreach ($oThemesCommonImports as $oImport) { @@ -3380,7 +3316,7 @@ EOF; SetupLog::Warning('CompileThemes: Theme common has an import (#'.$sImportId.') without explicit xsi:type, it will be ignored. Check Datamodel XML Reference to fix it.'); } } - + // Stylesheets // - Manually added in the XML /** @var \DOMNodeList $oThemesCommonStylesheets */ @@ -3445,7 +3381,7 @@ EOF; $aThemeParameters[$sThemeParameterName] = array_merge($aThemeParameter, $aThemesCommonParameters[$sThemeParameterName]); } } - + $aThemes[$sThemeId] = [ 'theme_parameters' => $aThemeParameters, 'precompiled_stylesheet' => $oTheme->GetChildText('precompiled_stylesheet', ''), @@ -3639,8 +3575,8 @@ EOF; { SetupUtils::rrmdir($sTempTargetDir.'/branding/images'); } - - // Compile themes + + // Compile themes $this->CompileThemes($oBrandingNode, $sTempTargetDir); } } @@ -3681,11 +3617,11 @@ EOF; { $aPortalsConfig[$sPortalId]['deny'][] = $oProfile->getAttribute('id'); } - } + } } - + uasort($aPortalsConfig, array(get_class($this), 'SortOnRank')); - + $this->sMainPHPCode .= "\n"; $this->sMainPHPCode .= "/**\n"; $this->sMainPHPCode .= " * Portal(s) definition(s) extracted from the XML definition at compile time\n"; @@ -3728,7 +3664,7 @@ EOF; $oParamsReader = new MFParameters($oParams); $aParametersConfig[$sModuleId] = $oParamsReader->GetAll(); } - + $this->sMainPHPCode .= "\n"; $this->sMainPHPCode .= "/**\n"; $this->sMainPHPCode .= " * Modules parameters extracted from the XML definition at compile time\n"; diff --git a/setup/parentmenunodecompiler.class.inc.php b/setup/parentmenunodecompiler.class.inc.php new file mode 100644 index 000000000..374a915ce --- /dev/null +++ b/setup/parentmenunodecompiler.class.inc.php @@ -0,0 +1,287 @@ +oMFCompiler = $oMFCompiler; + } + + public static function UseLegacyMenuCompilation(){ + self::$bUseLegacyMenuCompilation = true; + } + + /** + * @param \ModelFactory $oFactory + * Initialize menu nodes arrays + * @return void + */ + public function LoadXmlMenus(\ModelFactory $oFactory) : void { + foreach ($oFactory->GetNodes('menus/menu') as $oMenuNode) { + $sMenuId = $oMenuNode->getAttribute('id'); + $this->aMenuNodes[$sMenuId] = $oMenuNode; + + $sModuleMenu = $oMenuNode->getAttribute('_created_in'); + $this->aMenusByModule[$sModuleMenu][] = $sMenuId; + } + } + + /** + * @param $aModules + * Initialize arrays related to parent/child menus + * @return void + */ + public function LoadModuleMenuInfo($aModules) : void + { + foreach ($aModules as $foo => $oModule) { + $sModuleRootDir = $oModule->GetRootDir(); + $sModuleName = $oModule->GetName(); + + if (array_key_exists($sModuleName, $this->aMenusByModule)) { + $aMenusToLoad = []; + $aParentMenus = []; + + foreach ($this->aMenusByModule[$sModuleName] as $sMenuId) { + $oMenuNode = $this->aMenuNodes[$sMenuId]; + + if (self::$bUseLegacyMenuCompilation){ + if ($sParent = $oMenuNode->GetChildText('parent', null)) { + $aMenusToLoad[] = $sParent; + $aParentMenus[] = $sParent; + } + } else { + if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup') { + $this->aParentModuleRootDirs[$sMenuId] = $sModuleRootDir; + } + + if ($sParent = $oMenuNode->GetChildText('parent', null)) { + $aMenusToLoad[] = $sParent; + $aParentMenus[] = $sParent; + + $this->aParentModuleRootDirs[$sParent] = $sModuleRootDir; + } + + if (array_key_exists($sMenuId, $this->aParentModuleRootDirs)){ + $this->aParentMenuNodes[$sMenuId] = $oMenuNode; + } + } + + // Note: the order matters: the parents must be defined BEFORE + $aMenusToLoad[] = $sMenuId; + } + + $this->aMenusToLoadByModule[$sModuleName] = array_unique($aMenusToLoad); + $this->aParentMenusByModule[$sModuleName] = array_unique($aParentMenus); + } + } + } + + /** + * Perform the actual "Compilation" for one module at a time + * @param \MFModule $oModule + * @param string $sTempTargetDir + * @param string $sFinalTargetDir + * @param string $sRelativeDir + * @param Page $oP + * + * @return void + * @throws \Exception + */ + public function CompileModuleMenus(MFModule $oModule, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP = null) : void + { + $this->aMenuLinesForAdmins = []; + $this->aMenuLinesForAll = []; + $aAdminMenus = []; + + $sModuleRootDir = $oModule->GetRootDir(); + $sModuleName = $oModule->GetName(); + + $aParentMenus = $this->aParentMenusByModule[$sModuleName]; + foreach($this->aMenusToLoadByModule[$sModuleName] as $sMenuId) + { + $oMenuNode = $this->aMenuNodes[$sMenuId]; + if (is_null($oMenuNode)) + { + throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); + } + + if (self::$bUseLegacyMenuCompilation) { + if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup') { + // Note: this algorithm is wrong + // 1 - the module may appear empty in the current module, while children are defined in other modules + // 2 - check recursively that child nodes are not empty themselves + // Future algorithm: + // a- browse the modules and build the menu tree + // b- browse the tree and blacklist empty menus + // c- before compiling, discard if blacklisted + if (! in_array($oMenuNode->getAttribute("id"), $aParentMenus)) { + // Discard empty menu groups + continue; + } + } + } else { + if (array_key_exists($sMenuId, $this->aParentMenuNodes)) { + // compile parent menus recursively + $this->CompileParentMenuNode($sMenuId, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + continue; + } + } + + try + { + //both new/legacy algo: compile leaf menu + $aMenuLines = $this->oMFCompiler->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } + catch (DOMFormatException $e) + { + throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); + } + + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent]) || isset($this->aParentAdminMenus[$sParent])) + { + $this->aMenuLinesForAdmins = array_merge($this->aMenuLinesForAdmins, $aMenuLines); + $aAdminMenus[$oMenuNode->getAttribute("id")] = true; + } + else + { + $this->aMenuLinesForAll = array_merge($this->aMenuLinesForAll, $aMenuLines); + } + } + } + + /** + * Perform parent menu compilation including its ancestrors (recursively) + * @param string $sMenuId + * @param string $sTempTargetDir + * @param string $sFinalTargetDir + * @param string $sRelativeDir + * @param Page $oP + * + * @return void + * @throws \Exception + */ + public function CompileParentMenuNode(string $sMenuId, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP = null) : void + { + $oMenuNode = $this->aParentMenuNodes[$sMenuId]; + $sStatus = array_key_exists($sMenuId, $this->aMenuProcessStatus) ? $this->aMenuProcessStatus[$sMenuId] : null; + if ($sStatus === self::COMPILED){ + //node already processed before + return; + } else if ($sStatus === self::COMPILING){ + throw new \Exception("Cyclic dependency between parent menus ($sMenuId)"); + } + + $this->aMenuProcessStatus[$sMenuId] = self::COMPILING; + + try { + $sParent = $oMenuNode->GetChildText('parent', null); + if (! empty($sParent)){ + //compile parents before (even parent of parents ... recursively) + $this->CompileParentMenuNode($sParent, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } + + if (! array_key_exists($sMenuId, $this->aParentModuleRootDirs)){ + throw new Exception("Failed to process parent menu '$sMenuId' that is referenced by a child but not defined"); + } + $sModuleRootDir = $this->aParentModuleRootDirs[$sMenuId]; + $aMenuLines = $this->oMFCompiler->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } catch (DOMFormatException $e) { + throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); + } + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($this->aParentAdminMenus[$sParent])) { + $this->aMenuLinesForAdmins = array_merge($this->aMenuLinesForAdmins, $aMenuLines); + $this->aParentAdminMenus[$oMenuNode->getAttribute("id")] = true; + } else { + $this->aMenuLinesForAll = array_merge($this->aMenuLinesForAll, $aMenuLines); + } + + $this->aMenuProcessStatus[$sMenuId] = self::COMPILED; + } + + public function GetMenusByModule(string $sModuleName) : ?array + { + if (array_key_exists($sModuleName, $this->aMenusByModule)) { + return $this->aMenusByModule[$sModuleName]; + } + + return null; + } + + public function GetMenuLinesForAdmins(): array { + return $this->aMenuLinesForAdmins; + } + + public function GetMenuLinesForAll(): array { + return $this->aMenuLinesForAll; + } +} diff --git a/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php b/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php index ddc86570c..d9dd0b8fb 100644 --- a/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php +++ b/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php @@ -49,6 +49,16 @@ class NewsroomMenuFactory return $oMenu; } + /** + * Check if there is any Newsroom provider configured + * @return boolean + */ + public static function HasProviders() + { + $aProviders = MetaModel::EnumPlugins('iNewsroomProvider'); + return count($aProviders) > 0; + } + /** * Prepare parameters for the newsroom JS widget * @@ -100,4 +110,4 @@ class NewsroomMenuFactory ); return $aParams; } -} \ No newline at end of file +} diff --git a/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php b/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php index 784d2abc6..d2577731a 100644 --- a/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php +++ b/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php @@ -21,6 +21,7 @@ namespace Combodo\iTop\Application\UI\Base\Component\PopoverMenu; +use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItem; use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItemFactory; use Dict; use JSPopupMenuItem; @@ -56,30 +57,68 @@ class PopoverMenuFactory ->SetHorizontalPosition(PopoverMenu::ENUM_HORIZONTAL_POSITION_ALIGN_OUTER_RIGHT) ->SetVerticalPosition(PopoverMenu::ENUM_VERTICAL_POSITION_ABOVE); + $aUserMenuItems = []; + // Allowed portals $aAllowedPortalsItems = static::PrepareAllowedPortalsItemsForUserMenu(); - if (!empty($aAllowedPortalsItems)) { - $oMenu->AddSection('allowed_portals') - ->SetItems('allowed_portals', $aAllowedPortalsItems); - } + self::AddPopoverMenuItems($aAllowedPortalsItems, $aUserMenuItems); // User related pages - $oMenu->AddSection('user_related') - ->SetItems('user_related', static::PrepareUserRelatedItemsForUserMenu()); + self::AddPopoverMenuItems(static::PrepareUserRelatedItemsForUserMenu(), $aUserMenuItems); // API: iPopupMenuExtension::MENU_USER_ACTIONS $aAPIItems = static::PrepareAPIItemsForUserMenu($oMenu); - if (count($aAPIItems) > 0) { - $oMenu->AddSection('popup_menu_extension-menu_user_actions') - ->SetItems('popup_menu_extension-menu_user_actions', $aAPIItems); - } + self::AddPopoverMenuItems($aAPIItems, $aUserMenuItems); // Misc links - $oMenu->AddSection('misc') - ->SetItems('misc', static::PrepareMiscItemsForUserMenu()); + /*$oMenu->AddSection('misc') + ->SetItems('misc', static::PrepareMiscItemsForUserMenu());*/ + self::AddPopoverMenuItems(static::PrepareMiscItemsForUserMenu(), $aUserMenuItems); + self::SortPopoverMenuItems($aUserMenuItems); + + $oMenu->AddSection('misc') + ->AddItems('misc', $aUserMenuItems); return $oMenu; } + + /** + * @param PopoverMenuItem[] $aPopoverMenuItem + * @param PopoverMenuItem[] $aUserMenuItems + * + * @return void + */ + private static function AddPopoverMenuItems(array $aPopoverMenuItem, array &$aUserMenuItems) : void { + foreach ($aPopoverMenuItem as $oPopoverMenuItem){ + $aUserMenuItems[$oPopoverMenuItem->GetUID()] = $oPopoverMenuItem; + } + } + + /** + * @param PopoverMenuItem[] $aPopoverMenuItem + * @param PopoverMenuItem[] $aUserMenuItems + * + * @return void + */ + private static function SortPopoverMenuItems(array &$aUserMenuItems) : void { + $aSortedMenusFromConfig = MetaModel::GetConfig()->Get('navigation_menu.sorted_popup_user_menu_items'); + if (!is_array($aSortedMenusFromConfig) || empty($aSortedMenusFromConfig)){ + return; + } + + $aSortedMenus = []; + foreach ($aSortedMenusFromConfig as $sMenuUID){ + if (array_key_exists($sMenuUID, $aUserMenuItems)){ + $aSortedMenus[]=$aUserMenuItems[$sMenuUID]; + unset($aUserMenuItems[$sMenuUID]); + } + } + + foreach ($aUserMenuItems as $oMenu){ + $aSortedMenus[]=$oMenu; + } + $aUserMenuItems = $aSortedMenus; + } /** * Return the allowed portals items for the current user @@ -273,4 +312,4 @@ class PopoverMenuFactory return $oMenu; } -} \ No newline at end of file +} diff --git a/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index a89f5a442..85efcb4bd 100644 --- a/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -34,6 +34,7 @@ use MetaModel; use UIExtKeyWidget; use UserRights; use utils; +use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\NewsroomMenu\NewsroomMenuFactory; /** * Class NavigationMenu @@ -274,7 +275,7 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut */ public function IsNewsroomEnabled(): bool { - return MetaModel::GetConfig()->Get('newsroom_enabled'); + return (MetaModel::GetConfig()->Get('newsroom_enabled') && NewsroomMenuFactory::HasProviders()); } /** diff --git a/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php b/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php index 29aae68b0..e2c1dae9c 100644 --- a/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php +++ b/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php @@ -48,7 +48,7 @@ class NavigationMenuFactory { $oNewsroomMenu = null; - if (MetaModel::GetConfig()->Get('newsroom_enabled')) + if (MetaModel::GetConfig()->Get('newsroom_enabled') && NewsroomMenuFactory::HasProviders()) { $oNewsroomMenu = NewsroomMenuFactory::MakeNewsroomMenuForNavigationMenu(); } @@ -57,4 +57,4 @@ class NavigationMenuFactory new ApplicationContext(), PopoverMenuFactory::MakeUserMenuForNavigationMenu(), $oNewsroomMenu, NavigationMenu::BLOCK_CODE ); } -} \ No newline at end of file +} diff --git a/sources/Application/WelcomePopup/DefaultWelcomePopup.php b/sources/Application/WelcomePopup/DefaultWelcomePopup.php new file mode 100644 index 000000000..06a8d38a0 --- /dev/null +++ b/sources/Application/WelcomePopup/DefaultWelcomePopup.php @@ -0,0 +1,27 @@ + '0001', + 'title' => Dict::S('UI:WelcomeMenu:Title'), + 'twig' => '/templates/pages/backoffice/welcome_popup/default_welcome_popup', + 'importance' => \iWelcomePopup::IMPORTANCE_HIGH, + 'parameters' => [], + ], + ]; + } +} diff --git a/sources/Application/WelcomePopup/WelcomePopupService.php b/sources/Application/WelcomePopup/WelcomePopupService.php new file mode 100644 index 000000000..97009fd0a --- /dev/null +++ b/sources/Application/WelcomePopup/WelcomePopupService.php @@ -0,0 +1,234 @@ +LoadProviders(); + return $this->ProcessMessages(); + } + + /** + * Get the messages to display from a list of iWelcomePopup instances + * The messages are ordered by importance (CRITICAL first) then by ID + * Invalid messages or acknowledged messages are removed from the list + * @return array + */ + protected function ProcessMessages(): array + { + $this->LoadProviders(); + $aMessages = []; + foreach($this->aMessagesProviders as $oProvider) { + $aProviderMessages = $oProvider->GetMessages(); + if (count($aProviderMessages) === 0) { + IssueLog::Debug('Empty list of messages for '.get_class($oProvider), LogChannels::CONSOLE); + } + foreach($aProviderMessages as $aMessage) { + $aReasons = []; + if (!$this->IsMessageValid($aMessage, $aReasons)) { + IssueLog::Error('Invalid structure returned by '.get_class($oProvider).'::GetMessages()', LogChannels::CONSOLE, $aReasons); + continue; // Fail silently + } + $sUUID = $this->MakeStringFitIn(get_class($oProvider), static::PROVIDER_KEY_LENGTH).'::'.$aMessage['id']; + $aMessage['uuid'] = $sUUID; + $aMessages[] = $aMessage; + } + } + // Filter the acknowledged messages AFTER getting all messages + // This allows for "replacing" a message (from another provider for example) + // by automatically acknowledging it when called in GetMessages() + foreach($aMessages as $key => $aMessage) { + if ($this->IsMessageAcknowledged($aMessage['uuid'])) { + IssueLog::Debug('Ignoring already acknowledged message '.$aMessage['uuid'], LogChannels::CONSOLE); + unset($aMessages[$key]); + } + } + usort($aMessages, array(get_class($this), 'SortOnImportance')); + return $aMessages; + } + + /** + * Helper function for usort to compare two items based on their 'importance' field + * @param string[] $aItem1 + * @param string[] $aItem2 + * @return int + */ + public static function SortOnImportance($aItem1, $aItem2): int + { + if ($aItem1['importance'] === $aItem2['importance']) { + return strcmp($aItem1['id'], $aItem2['id']); + } + return ($aItem1['importance'] < $aItem2['importance']) ? -1 : 1; + } + + public function AcknowledgeMessage(string $sMessageUUID): void + { + $this->LoadProviders(); + $oAcknowledge = MetaModel::NewObject(WelcomePopupAcknowledge::class, [ + 'message_uuid' => $sMessageUUID, + 'acknowledge_date' => date(AttributeDateTime::GetSQLFormat()), + 'user_id' => UserRights::GetConnectedUserId(), + ]); + try { + $oAcknowledge->DBInsert(); + $oProvider = $this->GetProviderByUUID($sMessageUUID); + if (static::$aAcknowledgedMessage !== null) { + static::$aAcknowledgedMessage[] = $sMessageUUID; // Update the cache + } + // Notify the provider of the message + $sMessageId = substr($sMessageUUID, strpos($sMessageUUID, '::')+2); + if ($oProvider !== null) { + $oProvider->AcknowledgeMessage($sMessageId); + } + } catch(Exception $e) { + IssueLog::Error("Failed to acknowledge the message $sMessageUUID for user ".UserRights::GetConnectedUserId().". Reason: ".$e->getMessage(), LogChannels::CONSOLE); + } + } + + /** + * Load the provider of messages, decoupled from the constructor for testability + */ + protected function LoadProviders(): void + { + if ($this->aMessagesProviders !== null) return; + + $aProviders = []; + $aProviderClasses = utils::GetClassesForInterface(iWelcomePopup::class, '', array('[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]')); + foreach($aProviderClasses as $sProviderClass) { + $aProviders[] = new $sProviderClass(); + } + $this->SetMessagesProviders($aProviders); + } + + /** + * Check if a given message was acknowledged by the current user + * @param string $sMessageId + * @return bool + */ + protected function IsMessageAcknowledged(string $sMessageUUID): bool + { + $iUserId = UserRights::GetConnectedUserId(); + if (static::$aAcknowledgedMessage === null) { + + $oSearch = new DBObjectSearch(WelcomePopupAcknowledge::class); + $oSearch->AddCondition('user_id', $iUserId); + $oSet = new DBObjectSet($oSearch); + $aAcknowledgedMessages = $oSet->GetColumnAsArray('message_uuid'); + $this->SetAcknowledgedMessagesCache($aAcknowledgedMessages); + } + return in_array($sMessageUUID, static::$aAcknowledgedMessage); + } + + /** + * Set the cache of acknowledged messages (useful for testing) + * @param array $aAcknowledgedMessages + */ + protected function SetAcknowledgedMessagesCache(array $aAcknowledgedMessages): void + { + static::$aAcknowledgedMessage = $aAcknowledgedMessages; + } + + /** + * Set the cache of welcome popup message providers (useful for testing) + * @param iWelcomePopup[] $aMessagesProviders + */ + protected function SetMessagesProviders(array $aMessagesProviders): void + { + $this->aMessagesProviders = $aMessagesProviders; + } + + /** + * Retrieve the provider associated with a message + * @param string $sMessageUUID + * @return iWelcomePopup|NULL + */ + protected function GetProviderByUUID(string $sMessageUUID): ?iWelcomePopup + { + $this->LoadProviders(); + $sProviderKey = substr($sMessageUUID, 0, strpos($sMessageUUID, '::')); + foreach($this->aMessagesProviders as $oProvider) { + if ($this->MakeStringFitIn(get_class($oProvider), static::PROVIDER_KEY_LENGTH) === $sProviderKey) { + return $oProvider; + } + } + return null; + } + + /** + * Check if the structure of a given message is valid by checking + * all its mandatory elements + * @param string[] $aMessage + * @param string[] $aReasons + * @return bool + */ + protected function IsMessageValid($aMessage, array &$aReasons): bool + { + if (!is_array($aMessage)) { + $aReasons[] = 'GetMessage() must return an array of arrays.'; + return false; // Stop checking immediately + } + $bRet = true; + foreach(['id', 'importance', 'title'] as $sKey) { + if (!array_key_exists($sKey, $aMessage)) { + $aReasons[] = "Field '$sKey' missing from the message structure."; + $bRet = false; + } + } + if (!array_key_exists('html', $aMessage) && !array_key_exists('twig', $aMessage)) { + $aReasons[] = "Message structure must contain either a field 'html' or a field 'twig'."; + $bRet = false; + } + return $bRet; + } + + /** + * Shorten the given string (if needed) but preserving its uniqueness + * @param string $sProviderClass + * @param int $iLengthLimit + * @return string + */ + protected function MakeStringFitIn(string $sProviderClass, int $iLengthLimit): string + { + if(mb_strlen($sProviderClass) <= $iLengthLimit) { + return $sProviderClass; + } + // Truncate the string to $iLimitLength and replace the first carahcters with the MD5 of the complete string + $sMD5 = md5($sProviderClass, false); + return $sMD5.'-'.mb_substr($sProviderClass, -($iLengthLimit - strlen($sMD5) - 1)); // strlen is OK on the MD5 string, and '-' is not allowed in a class name + } +} + diff --git a/sources/Controller/WelcomePopupController.php b/sources/Controller/WelcomePopupController.php new file mode 100644 index 000000000..1919b3092 --- /dev/null +++ b/sources/Controller/WelcomePopupController.php @@ -0,0 +1,24 @@ +AcknowledgeMessage($sMessageUUID); + } +} + diff --git a/sources/Service/Events/EventService.php b/sources/Service/Events/EventService.php index 072b77473..197f05de4 100644 --- a/sources/Service/Events/EventService.php +++ b/sources/Service/Events/EventService.php @@ -134,8 +134,8 @@ final class EventService return; } - $oLastException = null; - $sLastExceptionMessage = null; + $oFirstException = null; + $sFirstExceptionMessage = null; $bEventFired = false; foreach (self::GetListeners($sEvent, $eventSource) as $aEventCallback) { if (!self::MatchContext($aEventCallback['context'])) { @@ -153,9 +153,12 @@ final class EventService throw $e; } catch (Exception $e) { - $sLastExceptionMessage = "Event '$sLogEventName' for '$sName' id {$aEventCallback['id']} failed with non-blocking error: ".$e->getMessage(); - EventServiceLog::Error($sLastExceptionMessage); - $oLastException = $e; + $sExceptionMessage = "Event '$sLogEventName' for '$sName' id {$aEventCallback['id']} failed with non-blocking error: ".$e->getMessage(); + EventServiceLog::Error($sExceptionMessage); + if (is_null($oFirstException)){ + $oFirstException = $e; + $sFirstExceptionMessage = $sExceptionMessage; + } } } if ($bEventFired) { @@ -163,9 +166,9 @@ final class EventService } $oKPI->ComputeStats('FireEvent', $sEvent); - if (!is_null($oLastException)) { - EventServiceLog::Error("Throwing the last exception caught: $sLastExceptionMessage"); - throw $oLastException; + if (!is_null($oFirstException)) { + EventServiceLog::Error("Throwing the last exception caught: $sFirstExceptionMessage"); + throw $oFirstException; } } diff --git a/templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig b/templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig new file mode 100644 index 000000000..95611adab --- /dev/null +++ b/templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig @@ -0,0 +1,10 @@ +
+
+ {{ source("images/illustrations/undraw_relaunch_day.svg") }} +
+
+
+ {{ 'UI:WelcomeMenu:Text'| dict_s|raw }} +
+
+
\ No newline at end of file diff --git a/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig b/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig index 382d4558b..7ac3a2c4b 100644 --- a/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig +++ b/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig @@ -1,14 +1,25 @@ -
-
- {{ source("images/illustrations/undraw_relaunch_day.svg") }} -
-
-
- {{ 'UI:WelcomeMenu:Text'| dict_s|raw }} -
-
- -
-
- +
+
+{% for message in messages %} +
+ {% if message.twig is defined %} + {{ include([message.twig ~ '.html.twig', message.twig ~ '.twig', message.twig], message.parameters ?? {}, sandboxed = true) }} + {% else %} + {{ message.html|raw }} + {% endif %} +
+ {% UIButton ForPrimaryAction{'sLabel':'UI:WelcomePopup:Button:Acknowledge'|dict_s, 'bIsSubmit': false } %} +
+
+{% endfor %}
+
+{% if messages|length > 1 %} + {% for message in messages %} + + {% endfor %} +{% endif %} +
+
+ + diff --git a/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig b/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig index 48097df02..35959ec5f 100644 --- a/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig +++ b/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig @@ -1,14 +1,38 @@ -$('#welcome_popup').dialog( { width:'60%', height: 'auto', title: '{{ 'UI:WelcomeMenu:Title'|dict_s }}', autoOpen: true, modal:true, - close: function() { - var bDisplay = $('#display_welcome_popup:checked').length; - SetUserPreference('welcome_popup', bDisplay, true); - }, - buttons: [{ - text: "{{ 'UI:Button:Ok'|dict_s }}", click: function() { - $(this).dialog( "close" ); $(this).remove(); - }}], +$('#welcome_popup_dialog').removeClass('ibo-is-hidden'); +$('#welcome_popup_dialog').dialog({ + modal: true, + width: '60%', + autoOpen: true, + title: $('div[data_role=welcome-popup-title]').first().attr('data-title'), + close: function() { $('#welcome_popup_dialog').remove(); } + }); +$('.ui-widget-overlay').click(function() { $('#welcome_popup_dialog').dialog('close'); } ); +$('.ibo-welcome-popup--indicator').click(function() { + const id = $(this).attr('data-message-uuid'); + const escaped_id = id.replace(/\\/g, '\\\\'); // All backslashes must be doubled in a jQuery selector + const new_title = $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').attr('data-title'); + $('.ibo-welcome-popup--message').addClass('ibo-is-hidden'); + $('.ibo-welcome-popup--indicator').removeClass('ibo-welcome-popup--active'); + $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').removeClass('ibo-is-hidden'); + $('.ibo-welcome-popup--indicator[data-message-uuid="'+escaped_id+'"]').addClass('ibo-welcome-popup--active'); + $('#welcome_popup_dialog').dialog('option', 'title', new_title); + $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"] button').focus(); +}); +$('.ibo-welcome-popup--button').click('button', function() { + const id = $(this).attr('data-message-uuid'); + $.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'welcome_popup_acknowledge_message', message_uuid: id}); + const escaped_id = id.replace(/\\/g, '\\\\');; // All backslashes must be doubled in a jQuery selector + $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').remove(); + if($('.ibo-welcome-popup--message').length == 0) { + // Last message, close the dialog + $('#welcome_popup_dialog').dialog('close'); + } else { + // Move the active state to the next message + $('.ibo-welcome-popup--indicator[data-message-uuid="'+escaped_id+'"]').siblings().first().trigger('click'); + $('.ibo-welcome-popup--indicator[data-message-uuid="'+escaped_id+'"]').remove(); + if ($('.ibo-welcome-popup--indicator').length == 1) { + // Last indicator, remove it + $('.ibo-welcome-popup--indicator').remove(); + } + } }); -if ($('#welcome_popup').height() > ($(window).height()-70)) -{ - $('#welcome_popup').height($(window).height()-70); -} diff --git a/tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php b/tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php new file mode 100644 index 000000000..5072c2aa3 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php @@ -0,0 +1,96 @@ + [ + 'aConf' => null, + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'not an array conf' => [ + 'aConf' => "wrong conf", + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'default conf' => [ + 'aConf' => [], + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'same order in conf' => [ + 'aConf' => [ + 'portal:itop-portal', + 'UI:Preferences', + 'UI:Help', + 'UI:AboutBox', + ], + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'first menus sorted and last one missing in conf' => [ + 'aConf' => [ + "portal:itop-portal", + "UI:Preferences", + ], + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'some menus but not all sorted' => [ + 'aConf' => [ + 'UI:Preferences', + 'UI:AboutBox', + ], + 'aExpectedMenuUIDs' => [ + 'UI_Preferences', + 'UI_AboutBox', + 'portal_itop_portal', + 'UI_Help', + ] + ], + 'all user menu sorted' => [ + 'aConf' => [ + 'UI:Preferences', + 'UI:AboutBox', + 'portal:itop-portal', + 'UI:Help', + ], + 'aExpectedMenuUIDs' => [ + 'UI_Preferences', + 'UI_AboutBox', + 'portal_itop_portal', + 'UI_Help', + ] + ], + ]; + } + /** + * @dataProvider MakeUserMenuForNavigationMenuProvider + */ + public function testMakeUserMenuForNavigationMenu($aConf, $aExpectedMenuUIDs){ + if (! is_null($aConf)){ + \MetaModel::GetConfig()->Set('navigation_menu.sorted_popup_user_menu_items', $aConf); + } + + $aRes = PopoverMenuFactory::MakeUserMenuForNavigationMenu()->GetSections(); + $this->assertTrue(array_key_exists('misc', $aRes)); + $aUIDsWithDummyRandoString = array_keys($aRes['misc']['aItems']); + //replace ibo-popover-menu--item-6464cdca5ecf4214716943--UI_AboutBox by UI_AboutBox (for ex) + $aUIDs = preg_replace('/ibo-popover-menu--item-([^\-]+)--/', '', $aUIDsWithDummyRandoString); + $this->assertEquals($aExpectedMenuUIDs, $aUIDs); + } +} diff --git a/tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php b/tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php new file mode 100644 index 000000000..25bc32871 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php @@ -0,0 +1,221 @@ +assertTrue($bResult); + $this->assertEquals($aExpected, $aToSort); + } + + /** + * Data provider for testSortOnImportance + * @return array[][]|string[][][][]|number[][][][] + */ + public function sortOnImportanceDataProvider() + { + return [ + 'empty array' => [ + 'to-sort' => [], + 'expected' => [], + ], + '3-item array' => [ + 'to-sort' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ], + 'expected' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ], + ], + '5-item array' => [ + 'to-sort' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'zz1', 'title' => 'ZZ1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'zz2', 'title' => 'ZZ2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ], + 'expected' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'zz1', 'title' => 'ZZ1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ['id' => 'zz2', 'title' => 'ZZ2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ], + ], + ]; + } + + /** + * @dataProvider isMessageAcknowledgedDataProvider + */ + public function testIsMessageAcknowledged($sMessageId, $aCache, $bExpected) + { + $oService = new WelcomePopupService(); + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetAcknowledgedMessagesCache', $oService, [$aCache]); + + $this->assertEquals($bExpected, $this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageId])); + } + + public function isMessageAcknowledgedDataProvider() + { + return [ + 'empty-cache' => [ + '123', [], false, + ], + 'acknowledged' => [ + '123', ['123'], true, + ], + 'non-acknowledged' => [ + '456', ['123'], false, + ], + ]; + } + + /** + * @dataProvider isMessageValidDataProvider + */ + public function testIsMessageValid($aMessage, $bExpected) + { + $oService = new WelcomePopupService(); + $aReasons = []; + $bResult = $this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageValid', $oService, [$aMessage, &$aReasons]); + if ($bResult !== $bExpected) { + print_r($aReasons); + } + $this->assertEquals($bExpected, $bResult); + if ($bResult) { + $this->assertEquals(0, count($aReasons)); + } else { + $this->assertNotEquals(0, count($aReasons)); + } + } + + public function isMessageValidDataProvider() + { + return [ + 'not an array' => [ + '123', false, + ], + 'empty array' => [ + [], false, + ], + 'missing id' => [ + ['title' => 'foo', 'importance' => 0, 'html' => '

Hello

'], false, + ], + 'message Ok (html)' => [ + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'html' => '

Hello

'], true, + ], + 'message Ok (twig)' => [ + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'twig' => '/some/path'], true, + ], + 'missing html and twig' => [ + ['id' => '123', 'title' => 'foo', 'importance' => 0], false, + ], + ]; + } + + public function testProcessMessages() + { + // Mock a WelcomePopup message provider, with a fixed class name + $oProvider1 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider1')->getMock(); + $oProvider1->expects($this->once())->method('GetMessages')->willReturn([ + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'html' => '

Hello Foo

'], + ['id' => '456', 'title' => 'bar', 'importance' => 1, 'html' => '

Hello Bar

'], // Already acknowledged will be skipped + ]); + + // Mock another WelcomePopup message provider, with a different class name + $oProvider2 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider2')->getMock(); + $oProvider2->expects($this->once())->method('GetMessages')->willReturn([ + ['id' => '789', 'title' => 'Ga', 'importance' => 1, 'html' => '

Hello Ga

'], + ['id' => '012', 'title' => 'Bu', 'importance' => 0, 'twig' => 'ga/bu/zo'], + ['id' => '000', 'title' => 'Bu', 'importance' => 0], // Invalid, will be ignored + ]); + $oService = new WelcomePopupService(); + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetAcknowledgedMessagesCache', $oService, [[get_class($oProvider1).'::456']]); + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetMessagesProviders', $oService, [[$oProvider1, $oProvider2]]); + + $aMessages = $this->InvokeNonPublicMethod(WelcomePopupService::class, 'ProcessMessages', $oService, []); + $this->assertEquals( + [ + ['id' => '012', 'title' => 'Bu', 'importance' => 0, 'twig' => 'ga/bu/zo', 'uuid' => 'Provider2::012'], + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'html' => '

Hello Foo

', 'uuid' => 'Provider1::123'], + ['id' => '789', 'title' => 'Ga', 'importance' => 1, 'html' => '

Hello Ga

', 'uuid' => 'Provider2::789'], + ], + $aMessages + ); + } + + + public function testAcknowledgeMessage() + { + self::CreateUser('admin-testAcknowledgeMessage', 1, '-Passw0rd!Complex-'); + UserRights::Login('admin-testAcknowledgeMessage'); + + // Mock a WelcomePopup message provider, with a fixed class name + $oProvider1 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider1')->getMock(); + $oProvider1->expects($this->exactly(2))->method('AcknowledgeMessage'); + + // Mock another WelcomePopup message provider, with a different class name + $oProvider2 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider2')->getMock(); + $oProvider2->expects($this->exactly(1))->method('AcknowledgeMessage'); + + $sMessageUUID1 = get_class($oProvider1).'::0123456'; + $sMessageUUID2 = get_class($oProvider1).'::456789'; + $sMessageUUID3 = get_class($oProvider2).'::456789'; // Same message id but different provider / UUID + $oService = new WelcomePopupService(); + + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetMessagesProviders', $oService, [[$oProvider1, $oProvider2]]); + + $oService->AcknowledgeMessage($sMessageUUID1); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID1])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, ['-This-Message-Id-Is-Not-Ack0ledg3dged!'])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID3])); + + $oService->AcknowledgeMessage($sMessageUUID2); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID1])); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID2])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, ['-This-Message-Id-Is-Not-Ack0ledg3dged!'])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID3])); + + $oService->AcknowledgeMessage($sMessageUUID3); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID3])); + } + + /** + * @dataProvider makeStringFitInProvider + */ + public function testMakeStringFitIn($sInput, $iLimit, $sExpected) + { + $oService = new WelcomePopupService(); + $sFitted = $this->InvokeNonPublicMethod(WelcomePopupService::class, 'MakeStringFitIn', $oService, [$sInput, $iLimit]); + $this->assertTrue(mb_strlen($sFitted) <= $iLimit); + $this->assertEquals($sExpected, $sFitted); + } + + public function makeStringFitInProvider() + { + return [ + 'Simple (no truncation)' => ['/Some/Short/EnoughName', 50, '/Some/Short/EnoughName'], + 'Very long (truncated)' => ['/Some/Very/Loooooooooooooooooooooooooooong/Naaaaaaaaaaaaaaaaaaaaaaaaaame', 50, '4769a98d57a0f2e9b99483f780833faf-aaaaaaaaaaaaaaame'], + 'Long More aggressive truncation' => ['/Some/Very/Loooooooooooooooooooooooooooong/Naaaaaaaaaaaaaaaaaaaaaaaaaame', 45, '4769a98d57a0f2e9b99483f780833faf-aaaaaaaaaame'], + ]; + } + +} + diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-profiles-itil/UserProfilesEventListenerTest.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-profiles-itil/UserProfilesEventListenerTest.php new file mode 100644 index 000000000..7bfd5b1f7 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-profiles-itil/UserProfilesEventListenerTest.php @@ -0,0 +1,657 @@ + +// + +/** + * Created by PhpStorm. + * User: Eric + * Date: 25/01/2018 + * Time: 11:12 + */ + +namespace Combodo\iTop\Test\UnitTest\Module\iTopProfilesItil; + +use Combodo\iTop\Application\Helper\Session; +use Combodo\iTop\Application\UI\Base\Layout\NavigationMenu\NavigationMenuFactory; +use Combodo\iTop\ItilProfiles\UserProfilesEventListener; +use Combodo\iTop\Service\Events\EventService; +use Combodo\iTop\Test\UnitTest\ItopDataTestCase; +use DBObjectSet; +use URP_UserProfile; +use UserRights; + +/** + * @since 3.1.0 N°5324 + * @group itopRequestMgmt + * @group userRights + * @group defaultProfiles + * + * @runTestsInSeparateProcesses + * @preserveGlobalState disabled + * @backupGlobals disabled + */ +class UserProfilesEventListenerTest extends ItopDataTestCase +{ + public function setUp(): void { + parent::setUp(); + + //reset conf to have nominal behaviour + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, null); + } + + public function PortaPowerUserProvider(){ + return [ + 'Portal power user only => user should be repaired by adding User portal profile' => [ + 'aAssociatedProfilesBeforeUserCreation' => [ + 'Portal power user' + ], + 'aExpectedAssociatedProfilesAfterUserCreation'=> [ + 'Portal power user', + 'Portal user', + ], + 'bCheckSessionMessage' => true + ], + 'Portal power user + Configuration Manager => profiles untouched' => [ + 'aAssociatedProfilesBeforeUserCreation' => [ + 'Portal power user', + 'Configuration Manager', + ], + 'aExpectedAssociatedProfilesAfterUserCreation'=> [ + 'Portal power user', + 'Configuration Manager', + ] + ], + ]; + } + + /** + * @dataProvider PortaPowerUserProvider + */ + public function testUserLocalCreation($aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation, $bCheckSessionMessage=false) + { + /*if ($bCheckSessionMessage){ + $sLogin = "Admin-" . uniqid(); + $oConnectedUser = $this->CreateContactlessUser($sLogin, 1, "Iuytrez9876543ç_è-("); + $_SESSION = []; + \UserRights::Login($oConnectedUser->Get('login')); + }*/ + + $oUser = new \UserLocal(); + $sLogin = 'testUserLocalCreationWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $oUser->Set('password', 'ABCD1234@gabuzomeu'); + $oUser->Set('language', 'EN US'); + $this->commonUserCreationTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aExpectedAssociatedProfilesAfterUserCreation); + + /*if ($bCheckSessionMessage){ + $aObjMessages = Session::Get('obj_messages'); + $this->assertNotEmpty($aObjMessages); + $sKey = sprintf("%s::%s", get_class($oUser), $oUser->GetKey()); + $this->assertTrue(array_key_exists($sKey, $aObjMessages)); + + $sMsg = << 1, + 'severity' => 'WARNING', + 'message' => $sMsg + ] + ]; + $this->assertEquals($aExpectedMessages, array_values($aObjMessages[$sKey]), var_export($aObjMessages[$sKey], true)); + }*/ + } + + /** + * @dataProvider PortaPowerUserProvider + */ + public function testUserLocalUpdate($aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation, $bCheckSessionMessage=false) + { + $oUser = new \UserLocal(); + $sLogin = 'testUserLocalUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $oUser->Set('password', 'ABCD1234@gabuzomeu'); + $oUser->Set('language', 'EN US'); + $this->commonUserUpdateTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aExpectedAssociatedProfilesAfterUserCreation); + } + + /** + * @dataProvider PortaPowerUserProvider + */ + public function testUserLDAPCreation($aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation, $bCheckSessionMessage=false) + { + $oUser = new \UserLDAP(); + $sLogin = 'testUserLDAPCreationWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $this->commonUserCreationTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aExpectedAssociatedProfilesAfterUserCreation); + } + + /** + * @dataProvider PortaPowerUserProvider + */ + public function testUserLDAPUpdate($aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation) + { + $oUser = new \UserLDAP(); + $sLogin = 'testUserLDAPUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $this->commonUserUpdateTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aExpectedAssociatedProfilesAfterUserCreation); + } + + /** + * @dataProvider PortaPowerUserProvider + */ + public function testUserExternalCreation($aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation, $bCheckSessionMessage=false) + { + $oUser = new \UserExternal(); + $sLogin = 'testUserLDAPCreationWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $this->commonUserCreationTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aExpectedAssociatedProfilesAfterUserCreation); + } + + /** + * @dataProvider PortaPowerUserProvider + */ + public function testUserExternalUpdate($aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation, $bCheckSessionMessage=false) + { + $oUser = new \UserExternal(); + $sLogin = 'testUserLDAPUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $this->commonUserUpdateTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aExpectedAssociatedProfilesAfterUserCreation); + } + + public function CreateUserForProfileTesting(\User $oUserToCreate, array $aAssociatedProfilesBeforeUserCreation, $bDbInsert=true) : array + { + $aProfiles = []; + $oSearch = \DBSearch::FromOQL("SELECT URP_Profiles"); + $oProfileSet = new DBObjectSet($oSearch); + while (($oProfile = $oProfileSet->Fetch()) != null){ + $aProfiles[$oProfile->Get('name')] = $oProfile; + } + + $this->CreateTestOrganization(); + $oContact = $this->CreatePerson("1"); + $iContactid = $oContact->GetKey(); + + $oUserToCreate->Set('contactid', $iContactid); + $sUserClass = get_class($oUserToCreate); + + $oUserProfileList = $oUserToCreate->Get('profile_list'); + foreach ($aAssociatedProfilesBeforeUserCreation as $sProfileName){ + $oUserProfile = new URP_UserProfile(); + $oProfile = $aProfiles[$sProfileName]; + $oUserProfile->Set('profileid', $oProfile->GetKey()); + $oUserProfile->Set('reason', 'UNIT Tests'); + $oUserProfileList->AddItem($oUserProfile); + } + + $oUserToCreate->Set('profile_list', $oUserProfileList); + if ($bDbInsert){ + $sId = $oUserToCreate->DBInsert(); + } else { + $sId = -1; + } + + return [ $sId, $aProfiles]; + } + + public function commonUserCreationTest($oUserToCreate, $aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation, $bTestUserItopAccess=true) + { + $sUserClass = get_class($oUserToCreate); + list ($sId, $aProfiles) = $this->CreateUserForProfileTesting($oUserToCreate, $aAssociatedProfilesBeforeUserCreation); + + $this->CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sId, $aExpectedAssociatedProfilesAfterUserCreation, $bTestUserItopAccess); + } + + public function CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sId, $aExpectedAssociatedProfilesAfterUserCreation, $bTestItopConnection=true){ + $oUser = \MetaModel::GetObject($sUserClass, $sId); + $oUserProfileList = $oUser->Get('profile_list'); + $aProfilesAfterCreation=[]; + while (($oProfile = $oUserProfileList->Fetch()) != null){ + $aProfilesAfterCreation[] = $oProfile->Get('profile'); + } + + foreach ($aExpectedAssociatedProfilesAfterUserCreation as $sExpectedProfileName){ + $this->assertTrue(in_array($sExpectedProfileName, $aProfilesAfterCreation), + "profile \'$sExpectedProfileName\' should be asociated to user after creation. " . var_export($aProfilesAfterCreation, true) ); + } + + if (! $bTestItopConnection){ + return; + } + + $_SESSION = []; + + UserRights::Login($oUser->Get('login')); + + if (! UserRights::IsPortalUser()) { + //calling this API triggers Fatal Error on below OQL used by \User->GetContactObject() for a user with only 'portal power user' profile + /** + * Error: No result for the single row query: 'SELECT DISTINCT `Contact`.`id` AS `Contactid`, `Contact`.`name` AS `Contactname`, `Contact`.`status` AS `Contactstatus`, `Contact`.`org_id` AS `Contactorg_id`, `Organization_org_id`.`name` AS `Contactorg_name`, `Contact`.`email` AS `Contactemail`, `Contact`.`phone` AS `Contactphone`, `Contact`.`notify` AS `Contactnotify`, `Contact`.`function` AS `Contactfunction`, `Contact`.`finalclass` AS `Contactfinalclass`, IF((`Contact`.`finalclass` IN ('Team', 'Contact')), CAST(CONCAT(COALESCE(`Contact`.`name`, '')) AS CHAR), CAST(CONCAT(COALESCE(`Contact_poly_Person`.`first_name`, ''), COALESCE(' ', ''), COALESCE(`Contact`.`name`, '')) AS CHAR)) AS `Contactfriendlyname`, COALESCE((`Contact`.`status` = 'inactive'), 0) AS `Contactobsolescence_flag`, `Contact`.`obsolescence_date` AS `Contactobsolescence_date`, CAST(CONCAT(COALESCE(`Organization_org_id`.`name`, '')) AS CHAR) AS `Contactorg_id_friendlyname`, COALESCE((`Organization_org_id`.`status` = 'inactive'), 0) AS `Contactorg_id_obsolescence_flag` FROM `contact` AS `Contact` INNER JOIN `organization` AS `Organization_org_id` ON `Contact`.`org_id` = `Organization_org_id`.`id` LEFT JOIN `person` AS `Contact_poly_Person` ON `Contact`.`id` = `Contact_poly_Person`.`id` WHERE ((`Contact`.`id` = 40) AND 0) '. + */ + NavigationMenuFactory::MakeStandard(); + } + + $this->assertTrue(true, 'after fix N°5324 no exception raised'); + // logout + $_SESSION = []; + } + + public function commonUserUpdateTest($oUserToCreate, $aAssociatedProfilesBeforeUserCreation, + $aExpectedAssociatedProfilesAfterUserCreation) + { + $sUserClass = get_class($oUserToCreate); + list ($sId, $aProfiles) = $this->CreateUserForProfileTesting($oUserToCreate, ["Administrator"]); + + $oUserToUpdate = \MetaModel::GetObject($sUserClass, $sId); + $oProfileList = $oUserToUpdate->Get('profile_list'); + while($oObj = $oProfileList->Fetch()){ + $oProfileList->RemoveItem($oObj->GetKey()); + } + + foreach ($aAssociatedProfilesBeforeUserCreation as $sProfileName){ + $oAdminUrpProfile = new URP_UserProfile(); + $oProfile = $aProfiles[$sProfileName]; + $oAdminUrpProfile->Set('profileid', $oProfile->GetKey()); + $oAdminUrpProfile->Set('reason', 'UNIT Tests'); + $oProfileList->AddItem($oAdminUrpProfile); + } + + $oUserToUpdate->Set('profile_list', $oProfileList); + $oUserToUpdate->DBWrite(); + + $this->CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sId, $aExpectedAssociatedProfilesAfterUserCreation); + } + + /** + * @dataProvider ProfilesLinksProvider + */ + public function testProfilesLinksDBDelete(string $sProfileNameToRemove, $bRaiseException=false){ + $aInitialProfiles = [ $sProfileNameToRemove, "Portal power user"]; + + $oUser = new \UserExternal(); + $sLogin = 'testUserLDAPUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + + $sUserClass = get_class($oUser); + list ($sId, $aProfiles) = $this->CreateUserForProfileTesting($oUser, $aInitialProfiles); + + if ($bRaiseException){ + $this->expectException(\DeleteException::class); + $sMessage = <<expectExceptionMessage($sMessage); + } + + $aURPUserProfileByUser = $this->GetURPUserProfileByUser($sId); + if (array_key_exists($sProfileNameToRemove, $aURPUserProfileByUser)){ + $oURPUserProfile = $aURPUserProfileByUser[$sProfileNameToRemove]; + $oURPUserProfile->DBDelete(); + } + + if (! $bRaiseException) { + $aExpectedProfilesAfterUpdate = ["Portal power user", "Portal user"]; + $this->CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sId, $aExpectedProfilesAfterUpdate); + } + } + + /** + * @dataProvider ProfilesLinksProvider + */ + public function testProfilesLinksEdit_ChangeProfileId(string $sInitialProfile, $bRaiseException=false){ + $oUser = new \UserExternal(); + $sLogin = 'testUserLDAPUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + + $sUserClass = get_class($oUser); + list ($sId, $aProfiles) = $this->CreateUserForProfileTesting($oUser, [$sInitialProfile]); + + $oURP_Profile = \MetaModel::GetObjectByColumn("URP_Profiles", "name", "Portal power user"); + + $aURPUserProfileByUser = $this->GetURPUserProfileByUser($sId); + + if ($bRaiseException){ + $this->expectException(\CoreCannotSaveObjectException::class); + } + + if (array_key_exists($sInitialProfile, $aURPUserProfileByUser)){ + $oURPUserProfile = $aURPUserProfileByUser[$sInitialProfile]; + $oURPUserProfile->Set('profileid', $oURP_Profile->GetKey()); + $oURPUserProfile->DBWrite(); + } + + if (!$bRaiseException) { + $aExpectedProfilesAfterUpdate = ["Portal power user", "Portal user"]; + $this->CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sId, $aExpectedProfilesAfterUpdate); + + //check warning + /*$aObjMessages = Session::Get('obj_messages'); + $this->assertNotEmpty($aObjMessages); + $sKey = sprintf("%s::%s", get_class($oURPUserProfile), $oURPUserProfile->GetKey()); + $this->assertTrue(array_key_exists($sKey, $aObjMessages)); + + $sMsg = << 1, + 'severity' => 'WARNING', + 'message' => $sMsg + ] + ]; + $this->assertEquals($aExpectedMessages, array_values($aObjMessages[$sKey]), var_export($aObjMessages[$sKey], true));*/ + } + } + + public function ProfilesLinksProvider() { + return [ + "Administrator" => [ "sProfileNameToMove" => "Administrator" ], + "Portal user" => [ "sProfileNameToMove" => "Portal user", "bRaiseException" => true ], + ]; + } + + /** + * @dataProvider ProfilesLinksProvider + */ + public function testProfilesLinksEdit_ChangeUserId($sProfileNameToMove, $bRaiseException=false){ + $aInitialProfiles = [ $sProfileNameToMove, "Portal power user"]; + + $oUser = new \UserExternal(); + $sLogin1 = 'testUserLDAPUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin1); + + $sUserClass = get_class($oUser); + list ($sId, $aProfiles) = $this->CreateUserForProfileTesting($oUser, $aInitialProfiles); + + $oUser = new \UserExternal(); + $sLogin2 = 'testUserLDAPUpdateWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin2); + list ($sAnotherUserId, $aProfiles) = $this->CreateUserForProfileTesting($oUser, ["Configuration Manager"]); + + if ($bRaiseException){ + $this->expectException(\CoreCannotSaveObjectException::class); + $sMessage = <<expectExceptionMessage($sMessage); + } + + $aURPUserProfileByUser = $this->GetURPUserProfileByUser($sId); + if (array_key_exists($sProfileNameToMove, $aURPUserProfileByUser)){ + $oURPUserProfile = $aURPUserProfileByUser[$sProfileNameToMove]; + $oURPUserProfile->Set('userid', $sAnotherUserId); + $oURPUserProfile->DBWrite(); + } + + if (! $bRaiseException) { + $aExpectedProfilesAfterUpdate = [$sProfileNameToMove, "Configuration Manager"]; + $this->CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sAnotherUserId, $aExpectedProfilesAfterUpdate); + + $aExpectedProfilesAfterUpdate = ["Portal power user", "Portal user"]; + $this->CheckProfilesAreOkAndThenConnectToITop($sUserClass, $sId, $aExpectedProfilesAfterUpdate); + } + } + + private function GetURPUserProfileByUser($iUserId) : array { + $aRes = []; + $oSearch = \DBSearch::FromOQL("SELECT URP_UserProfile WHERE userid=$iUserId"); + $oSet = new DBObjectSet($oSearch); + while (($oURPUserProfile = $oSet->Fetch()) != null){ + $aRes[$oURPUserProfile->Get('profile')] = $oURPUserProfile; + } + + return $aRes; + } + + public function testUserProfilesEventListenerInit_nominal(){ + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testUserProfilesEventListenerInit_badlyconfigured(){ + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, "a string instead of an array"); + + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + + $this->assertFalse($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testUserProfilesEventListenerInit_specifically_disabled(){ + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, []); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + + $this->assertFalse($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function CustomizedPortalsProvider(){ + return [ + 'console + customized portal' => [ + 'aPortalDispatcherData' => [ + 'customer-portal', + 'backoffice' + ]], + 'console + itop portal + customized portal' => [ + 'aPortalDispatcherData' => [ + 'itop-portal', + 'customer-portal', + 'backoffice' + ] + ], + ]; + } + + /** + * @dataProvider CustomizedPortalsProvider + */ + public function testUserProfilesEventListenerInit_furtherportals_norepairmentconfigured($aPortalDispatcherData){ + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init($aPortalDispatcherData); + + $this->assertFalse($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testUserProfilesEventListenerInit_furtherportals_repairmentconfigured(){ + $aPortalDispatcherData = [ + 'itop-portal', + 'customer-portal', + 'backoffice' + ]; + + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, ['Portal power user' => 'Portal user']); + + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init($aPortalDispatcherData); + + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testUserProfilesEventListenerInit_with_unknownprofile(){ + $aPortalDispatcherData = [ + 'itop-portal', + 'customer-portal', + 'backoffice' + ]; + + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, ['Portal power user' => 'Dummy Profile']); + + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init($aPortalDispatcherData); + + $this->assertFalse($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testInit_ConfWithOneWarningProfile() { + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, + ['Configuration Manager' => 'Administrator', 'Portal power user' => null] + ); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testInit_ConfWithFurtherWarningProfiles() { + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, + ['Configuration Manager' => null, 'Portal power user' => null] + ); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testInit_ConfWithFurtherWarningProfilesAndOneRepairment() { + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, + ['Portal power user' => null, 'Configuration Manager' => null, 'Administrator' => "Configuration Manager"] + ); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + } + + public function testRepairProfiles_WithAnotherFallbackProfile() + { + $oUser = new \UserLocal(); + $sLogin = 'testUserLocalCreationWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $oUser->Set('password', 'ABCD1234@gabuzomeu'); + $oUser->Set('language', 'EN US'); + + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, + ['Portal power user' => 'Configuration Manager'] + ); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + + $this->CreateUserForProfileTesting($oUser, ['Portal power user'], false); + $oUserProfilesEventListener->ValidateThenRepairOrWarn($oUser); + + $oUserProfileList = $oUser->Get('profile_list'); + $aProfilesAfterCreation=[]; + while (($oProfile = $oUserProfileList->Fetch()) != null){ + $aProfilesAfterCreation[] = $oProfile->Get('profile'); + } + + $this->assertContains('Configuration Manager', $aProfilesAfterCreation, var_export($aProfilesAfterCreation, true)); + $this->assertContains('Portal power user', $aProfilesAfterCreation, var_export($aProfilesAfterCreation, true)); + } + + public function testRepairProfiles_MultiRepairmentConf() + { + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, + [ + 'Administrator' => 'Portal user', + 'Portal power user' => 'Configuration Manager' + ] + ); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->Init(); + $this->assertTrue($oUserProfilesEventListener->IsRepairmentEnabled()); + + $oUser = new \UserLocal(); + $sLogin = 'testUserLocalCreationWithPortalPowerUserProfile-'.uniqid(); + $oUser->Set('login', $sLogin); + $oUser->Set('password', 'ABCD1234@gabuzomeu'); + $oUser->Set('language', 'EN US'); + $this->CreateUserForProfileTesting($oUser, ['Portal power user'], false); + $oUserProfilesEventListener->ValidateThenRepairOrWarn($oUser); + + $oUserProfileList = $oUser->Get('profile_list'); + $aProfilesAfterCreation=[]; + while (($oProfile = $oUserProfileList->Fetch()) != null){ + $aProfilesAfterCreation[] = $oProfile->Get('profile'); + } + + $this->assertContains('Configuration Manager', $aProfilesAfterCreation, var_export($aProfilesAfterCreation, true)); + $this->assertContains('Portal power user', $aProfilesAfterCreation, var_export($aProfilesAfterCreation, true)); + + $oUser2 = new \UserLocal(); + $sLogin = 'testUserLocalCreationWithPortalPowerUserProfile-'.uniqid(); + $oUser2->Set('login', $sLogin); + $oUser2->Set('password', 'ABCD1234@gabuzomeu'); + $oUser2->Set('language', 'EN US'); + + $this->CreateUserForProfileTesting($oUser2, ['Administrator'], false); + $oUserProfilesEventListener->ValidateThenRepairOrWarn($oUser2); + + $oUserProfileList = $oUser2->Get('profile_list'); + $aProfilesAfterCreation=[]; + while (($oProfile = $oUserProfileList->Fetch()) != null){ + $aProfilesAfterCreation[] = $oProfile->Get('profile'); + } + + $this->assertContains('Administrator', $aProfilesAfterCreation, var_export($aProfilesAfterCreation, true)); + $this->assertContains('Portal user', $aProfilesAfterCreation, var_export($aProfilesAfterCreation, true)); + } + + public function testUserCreationWithWarningMessageConf() + { + $_SESSION = []; + $oAdminUser = new \UserLocal(); + $sLogin = 'testUserCreationWithWarningMessageConf-Admin'.uniqid(); + $oAdminUser->Set('login', $sLogin); + $oAdminUser->Set('password', 'ABCD1234@gabuzomeu'); + $oAdminUser->Set('language', 'EN US'); + $aAssociatedProfilesBeforeUserCreation = ['Administrator']; + $this->commonUserCreationTest($oAdminUser, $aAssociatedProfilesBeforeUserCreation, $aAssociatedProfilesBeforeUserCreation, false); + UserRights::Login($oAdminUser->Get('login')); + + $aAssociatedProfilesBeforeUserCreation = [ + 'Portal power user' + ]; + + $oUser = new \UserLocal(); + $sLogin = 'testUserCreationWithWarningMessageConf-'.uniqid(); + $oUser->Set('login', $sLogin); + $oUser->Set('password', 'ABCD1234@gabuzomeu'); + $oUser->Set('language', 'EN US'); + + \MetaModel::GetConfig()->Set(UserProfilesEventListener::USERPROFILE_REPAIR_ITOP_PARAM_NAME, + ['Portal power user' => null ] + ); + + $this->SetNonPublicStaticProperty(EventService::class, "aEventListeners", []); + $oUserProfilesEventListener = new UserProfilesEventListener(); + $oUserProfilesEventListener->RegisterEventsAndListeners(); + + $this->expectException(\CoreCannotSaveObjectException::class); + $sMessage = <<expectExceptionMessage($sMessage); + + $this->commonUserCreationTest($oUser, $aAssociatedProfilesBeforeUserCreation, $aAssociatedProfilesBeforeUserCreation, false); + + $_SESSION = []; + } +} diff --git a/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php b/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php index 1267921ad..c67190c0f 100644 --- a/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php @@ -140,7 +140,7 @@ class DBBackupTest extends ItopTestCase * * @return void */ - public function testMakeName(string $sInputFormat, DateTime $oBackupDateTime, string $sExpectedFilename): void + public function testMakeName(?string $sInputFormat, ?DateTime $oBackupDateTime, string $sExpectedFilename): void { $oConfig = utils::GetConfig(); @@ -160,6 +160,11 @@ class DBBackupTest extends ItopTestCase $oBackupDateTime = DateTime::createFromFormat('Y-m-d H:i:s', '1985-07-30 15:30:59'); return [ + 'Default format - no params' => [ + '__DB__-%Y-%m-%d', + $oBackupDateTime, + static::DUMMY_DB_NAME.'-1985-07-30', + ], 'Default format' => [ '__DB__-%Y-%m-%d', $oBackupDateTime, @@ -182,4 +187,28 @@ class DBBackupTest extends ItopTestCase ], ]; } + + /** + * N°6640 - Broken unattended setup with XML backup configuration + */ + public function testMakeNameWithoutParams(): void + { + $oConfig = utils::GetConfig(); + + // See https://github.com/Combodo/iTop/commit/f7ee21f1d7d1c23910506e9e31b57f33311bd5e0#diff-d693fb790e3463d1aa960c2b8b293532b1bbd12c3b8f885d568d315c404f926aR131 + $oConfig->Set('db_host', static::DUMMY_DB_HOST); + $oConfig->Set('db_name', static::DUMMY_DB_NAME); + $oConfig->Set('db_subname', static::DUMMY_DB_SUBNAME); + + $oDateTime = new DateTime(); + $sExpectedFilename = static::DUMMY_DB_NAME . '-' . $oDateTime->format("Y-m-d"); + + $oBackup = new DBBackup($oConfig); + + $sTestedFilename = $oBackup->MakeName(null); + $this->assertEquals($sExpectedFilename, $sTestedFilename, "Backup filename format doesn't match. Got '$sTestedFilename', expected '$sExpectedFilename'."); + + $sTestedFilename = $oBackup->MakeName(); + $this->assertEquals($sExpectedFilename, $sTestedFilename, "Backup filename format doesn't match. Got '$sTestedFilename', expected '$sExpectedFilename'."); + } } diff --git a/tests/php-unit-tests/unitary-tests/setup/MFCompilerMenuTest.php b/tests/php-unit-tests/unitary-tests/setup/MFCompilerMenuTest.php new file mode 100644 index 000000000..19f4e8b99 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/setup/MFCompilerMenuTest.php @@ -0,0 +1,139 @@ + [ 'sEnv' => 'legacy_algo', 'bLegacyMenuCompilation' => true ], + 'menu_compilation_fix' => [ 'sEnv' => 'menu_compilation_fix', 'bLegacyMenuCompilation' => false ], + ]; + } + + /** + * @dataProvider CompileMenusProvider + */ + public function testCompileMenus($sEnv, $bLegacyMenuCompilation){ + $sConfigFilePath = \utils::GetConfigFilePath($sEnv); + + //copy conf from production to phpunit context + $sDirPath = dirname($sConfigFilePath); + if (! is_dir($sDirPath)){ + mkdir($sDirPath); + } + $oConfig = new Config(\utils::GetConfigFilePath()); + $oConfig->WriteToFile($sConfigFilePath); + + $oConfig = new Config($sConfigFilePath); + if ($bLegacyMenuCompilation){ + ParentMenuNodeCompiler::UseLegacyMenuCompilation(); + } + $oConfig->WriteToFile(); + $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); + $oRunTimeEnvironment->CompileFrom(\utils::GetCurrentEnvironment()); + $oConfig->WriteToFile(); + + $sConfigFile = APPCONF.\utils::GetCurrentEnvironment().'/'.ITOP_CONFIG_FILE; + MetaModel::Startup($sConfigFile, false /* $bModelOnly */, true /* $bAllowCache */, false /* $bTraceSourceFiles */, $sEnv); + + $aMenuGroups = ApplicationMenu::GetMenuGroups(); + if (! is_null(static::$aPreviousEnvMenus)){ + $this->assertEquals(static::$aPreviousEnvMenus, $aMenuGroups); + } else { + $this->assertNotEquals([], $aMenuGroups); + } + static::$aPreviousEnvMenus = $aMenuGroups; + + $aMenuCount = ApplicationMenu::GetMenusCount(); + + if (! is_null(static::$aPreviousEnvMenuCount)){ + $this->assertEquals(static::$aPreviousEnvMenuCount, $aMenuCount); + } else { + $this->assertNotEquals([], $aMenuCount); + } + static::$aPreviousEnvMenuCount = $aMenuCount; + } + + public function CompileMenusWithDeltaProvider(){ + return [ + 'Menus are broken with specific delta XML using LEGACY algo' => [ 'sDeltaFile' => 'delta_broken_menus.xml', 'sEnv' => 'broken_menus', 'bLegacyMenuCompilation' => true ], + 'Menus repaired using same delta XML with NEW algo' => [ 'sDeltaFile' => 'delta_broken_menus.xml', 'sEnv' => 'fixed_menus', 'bLegacyMenuCompilation' => false ], + ]; + } + + /** + * @dataProvider CompileMenusWithDeltaProvider + */ + public function testCompileMenusWithDelta($sDeltaFile, $sEnv, $bLegacyMenuCompilation){ + $sProvidedDeltaPath = __DIR__.'/ressources/datamodels/'.$sDeltaFile; + if (is_file($sProvidedDeltaPath)){ + $sDeltaXmlPath = $this->GetCurrentEnvDeltaXmlPath($sEnv); + copy($sProvidedDeltaPath, $sDeltaXmlPath); + } + $sConfigFilePath = \utils::GetConfigFilePath($sEnv); + + //copy conf from production to phpunit context + $sDirPath = dirname($sConfigFilePath); + if (! is_dir($sDirPath)){ + mkdir($sDirPath); + } + $oConfig = new Config(\utils::GetConfigFilePath()); + $oConfig->WriteToFile($sConfigFilePath); + + $oConfig = new Config($sConfigFilePath); + if ($bLegacyMenuCompilation){ + ParentMenuNodeCompiler::UseLegacyMenuCompilation(); + } + $oConfig->WriteToFile(); + $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); + $oRunTimeEnvironment->CompileFrom(\utils::GetCurrentEnvironment()); + $oConfig->WriteToFile(); + + if ($bLegacyMenuCompilation){ + /** + * PHP Notice: Undefined index: ConfigManagement in /var/www/html/iTop/env-broken_menus/itop-structure/model.itop-structure.php on line 925 + */ + error_reporting(E_ALL & ~E_NOTICE); + $this->expectErrorMessage("Call to a member function GetIndex() on null"); + } + $sConfigFile = APPCONF.\utils::GetCurrentEnvironment().'/'.ITOP_CONFIG_FILE; + MetaModel::Startup($sConfigFile, false /* $bModelOnly */, true /* $bAllowCache */, false /* $bTraceSourceFiles */, $sEnv); + + $this->assertNotEquals([], ApplicationMenu::GetMenuGroups()); + $this->assertNotEquals([], ApplicationMenu::GetMenusCount()); + } +} diff --git a/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml b/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml new file mode 100644 index 000000000..73bbd5737 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml @@ -0,0 +1,14 @@ + + + + + ConfigManagementOverview + + + ConfigManagementOverview + + + ConfigManagementOverview + + +