commit 9001e4656ef98a2db76c25ddb149cea9ae197864 Author: GiacomoHome Date: Fri Sep 17 12:41:45 2021 +0200 Initial Commit diff --git a/.cpanel.yml b/.cpanel.yml new file mode 100644 index 0000000..df9c229 --- /dev/null +++ b/.cpanel.yml @@ -0,0 +1,25 @@ +# --- +# deployment: +# tasks: +# - export DEPLOYPATH=/home/gestionespiaggia/api.fatturab2b.net/ +# - export VENDORPATH=/home/gestionespiaggia/apidev.fatturab2b.net/vendor +# - export ADMIN_NODE_FOLDER=/home/fatturab2bnet/apidev.fatturab2b.net/public/admin/node_modules +# - /bin/rm -rf $DEPLOYPATH/application +# - /bin/cp -R application $DEPLOYPATH +# - /bin/rm -rf $DEPLOYPATH/emailtemplate +# - /bin/cp -R emailtemplate $DEPLOYPATH +# - /bin/rm -rf $DEPLOYPATH/languages +# - /bin/cp -R languages $DEPLOYPATH +# - /bin/rm -rf $DEPLOYPATH/library +# - /bin/cp -R library $DEPLOYPATH +# - /bin/rm -rf $DEPLOYPATH/public +# - /bin/cp -R public $DEPLOYPATH +# - /bin/rm -rf $DEPLOYPATH/rsa +# - /bin/cp -R rsa $DEPLOYPATH +# - /bin/rm $DEPLOYPATH/index.php +# - /bin/cp index.php $DEPLOYPATH +# - /bin/rm $DEPLOYPATH/robots.txt +# - /bin/cp robots.txt $DEPLOYPATH +# - /bin/rm -rf $DEPLOYPATH/vendor +# - /bin/cp -R $VENDORPATH $DEPLOYPATH +# - /bin/cp -R $ADMIN_NODE_FOLDER $DEPLOYPATH/public/admin diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f816dd --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +##### IDEA IGNORED FOLDER ##### +**/.idea +#**/.idea/workspace.xml +#**/.idea/tasks.xml +#.idea/dictionaries +#.idea/vcs.xml +#.idea/jsLibraryMappings.xml +#.idea/**.iws + +##### FOLDER TO IGNORE ##### +backup/bkconfig.json + +**/bower_components +**/node_modules +**/vendor +**/vendordev +**/init_project +**/imgrepo + +package-lock.json +composer.lock +desktop.ini + +/vendor/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..3b0cab0 --- /dev/null +++ b/.htaccess @@ -0,0 +1,26 @@ +#Cache Mensile + + Header set Cache-Control "max-age=7200" + + +SetEnv APPLICATION_ENV production +RewriteEngine On + +# RewriteCond %{SERVER_PORT} 80 +# RewriteRule ^(.*)$ https://apidev.fatturab2b.net/$1 [R,L] + +RewriteCond %{HTTP:Authorization} ^(.*) +RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] + +# force https:// for all except some selected URLs +RewriteCond %{HTTPS} off +#RewriteCond %{THE_REQUEST} !/v1/ [NC] +RewriteCond %{THE_REQUEST} !/services/ [NC] +RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +RewriteRule ^(application|library|languages|log|vendor|rsa)(/.*)?$ - [F] +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/application/Bootstrap.php b/application/Bootstrap.php new file mode 100644 index 0000000..36b9667 --- /dev/null +++ b/application/Bootstrap.php @@ -0,0 +1,231 @@ +bootstrap("frontController"); + // $frontController = Zend_Controller_Front::getInstance(); + $this->_frontController = Zend_Controller_Front::getInstance(); + + // add the REST route for the API module only + $restRoute = new Zend_Rest_Route($this->_frontController, array(), array('v1')); + $this->_frontController->getRouter()->addRoute('rest', $restRoute); + } + + protected function _initDefaultModuleAutoloader() + { + $loader = Zend_Loader_Autoloader::getInstance(); + $loader->registerNamespace('App_'); + + $this->getResourceLoader() + ->addResourceType('modelResource', 'models/resources', 'Resource') + ->addResourceType('controllerSection', 'controllerSections', 'ControllerSection'); + } + + protected function _initEnviromentIni() + { + $this->_enviroments = new Zend_Config_Ini(APPLICATION_PATH . '/configs/enviroment.ini', APPLICATION_ENV); + Zend_Registry::set('ENVIROMENTS', $this->_enviroments); + } + + protected function _initConfigIni() + { + //VARIABILI CONSTANTI PER TUTTO IL DOMINIO + Zend_Registry::set('VARIABILE_VERSION', $this->_enviroments->get('version')); + + $this->_config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/config.ini', null, array('skipExtends' => true, + 'allowModifications' => true)); + Zend_Registry::set('config', $this->_config); + } + + protected function _initLocale() + { + //Detect Browser language + $browserLang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); + $browserLang = ($browserLang != 'it' && $browserLang != 'en') ? 'it' : $browserLang; + + $locale = new Zend_Locale($browserLang); + Zend_Registry::set('Zend_Locale', $locale); + $this->_locale = $locale; + } + + protected function _initLanguage() + { + $localeValue = 'it'; + + $translationPath = dirname(APPLICATION_PATH) . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . $localeValue; + + $translate = new Zend_Translate('array', $translationPath, $localeValue); + + Zend_Registry::set('Zend_Translate', $translate); + Zend_Validate_Abstract::setDefaultTranslator($translate); + Zend_Form::setDefaultTranslator($translate); + } + + protected function _initFrontControllerPlugin() + { + $this->_frontController->registerPlugin(new App_Controller_Plugin_Acl()); + $this->_frontController->registerPlugin(new App_Controller_Plugin_LangSelector()); + } + + protected function _initViewSettings(){ + + $this->bootstrap('view'); + $view = $this->getResource('view'); + + $view->baseUrlSite = $this->_enviroments->get('baseUrlSite'); + $view->version = $this->_enviroments->get('version'); + } + + protected function _initMongoDbParms() + { + Zend_Registry::set('ENABLE_MONGODB', false); + + // per getire l'abilitazione inserire i dati necessari a mongo db connection + } + + protected function _initDbParms() + { + $mySqlDbParams = $this->_enviroments->get('mysql')->get('params'); + $db = new Zend_Db_Adapter_Pdo_Mysql($mySqlDbParams); + + Zend_Registry::set('db_adapter', $db); + Zend_Db_Table_Abstract::setDefaultAdapter($db); + + $this->_db = $db; + } + + + protected function _initLogging() + { + $logger = new Zend_Log(); + + /**** FIREBUG DEBUG LOG ****/ + // $logger->addWriter(new Zend_Log_Writer_Firebug()); + /****************************/ + + /**** GENERAL LOG ****/ + $stream = @fopen(APPLICATION_PATH . '/../log/log.txt', 'a', false); + if (!$stream) { + throw new Exception('Failed to open stream of log file'); + } + $writer = new Zend_Log_Writer_Stream($stream); + $logger->addWriter($writer); + Zend_Registry::set('log', $logger); + /****************************/ + + /**** MT LOG *** + $logger_mt = new Zend_Log(); + $stream_mt = @fopen(APPLICATION_PATH . '/../log/log_mt.txt', 'a', false); + if (!$stream_mt) { + throw new Exception('Failed to open stream of mt log file'); + } + $writer_mt = new Zend_Log_Writer_Stream($stream_mt); + $logger_mt->addWriter($writer_mt); + Zend_Registry::set('log_mt', $logger_mt); + /****************************/ + + /*** ERROR DB LOG ***/ + $columnMapping = array('lvl' => 'priority', 'msg' => 'message', 'url' => 'url', 'trace' => 'trace', 'params' => 'params', 'section' => 'section','db_name'=> 'db_name','username' => 'username', 'token'=>'token'); + $error_writer = new Zend_Log_Writer_Db($this->_db, 'error_log', $columnMapping); + $error_logger = new Zend_Log($error_writer); + Zend_Registry::set('error_log', $error_logger); + /****************************/ + + $this->_logger = $logger; + } + + public function _initPersonalRouter() + { + $router = $this->_frontController->getRouter(); + + $router->addRoute( + 'sitemap', + new Zend_Controller_Router_Route('sitemap', + array( + 'module' => 'default', + 'controller' => 'index', + 'action' => 'sitemap' + ) + ) + ); + + $router->addRoute( + 'it', + new Zend_Controller_Router_Route('it/:action/*', + array( + 'module' => 'default', + 'controller' => 'index', + 'action' => 'index' + ) + ) + ); + + $router->addRoute( + 'en', + new Zend_Controller_Router_Route('en/:action/*', + array( + 'module' => 'default', + 'controller' => 'index', + 'action' => 'index' + ) + ) + ); + + $router->addRoute( + 'language', + new Zend_Controller_Router_Route('/lang/:lang', + array( + 'module' => 'default', + 'controller' => 'index', + 'action' => 'index', + 'lang' => ':lang' + ) + ) + ); + + $router->addRoute( + 'offline', + new Zend_Controller_Router_Route('/offline', + array( + 'controller' => 'index', + 'action' => 'offline' + ) + ) + ); + + $router->addRoute( + 'filterpager', + new Zend_Controller_Router_Route('filter/:module/:action/:page/:count/*', + array( + 'module' => 'admin', + 'controller' => 'index' + ) + ) + ); + + $router->addRoute( + 'v1_login', + new Zend_Controller_Router_Route('v1/login', + array( + 'module' => 'auth', + 'controller' => 'index', + 'action' => 'post' + ) + ) + ); + + /*********************************************************/ + + } + +} + diff --git a/application/configs/application.ini b/application/configs/application.ini new file mode 100644 index 0000000..dd3cc27 --- /dev/null +++ b/application/configs/application.ini @@ -0,0 +1,31 @@ +[production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 +includePaths.library = APPLICATION_PATH "/../library" +bootstrap.path = APPLICATION_PATH "/Bootstrap.php" +bootstrap.class = "Bootstrap" +appnamespace = "Application" + +resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" +resources.frontController.params.prefixDefaultModule = true + +resources.frontController.params.displayExceptions = 0 + +resources.frontController.plugins.PutHandler = "Zend_Controller_Plugin_PutHandler" + +resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" +resources.frontController.actionhelperpaths.Application_Controller_Helper = APPLICATION_PATH "/../library/Helpers/Action" +resources.view.helperPath.My_View_Helper = APPLICATION_PATH "/../library/Helpers/View" + +resources.modules[] = "" + +[staging : production] + +[testing : production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 + +[development : production] +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 +resources.frontController.params.displayExceptions = 1 diff --git a/application/configs/config.ini b/application/configs/config.ini new file mode 100644 index 0000000..944b290 --- /dev/null +++ b/application/configs/config.ini @@ -0,0 +1,17 @@ +ip_master = "" +ip_alternativo = "185.31.65.102" +email_mittente = "info@adriaticasistemi.it" +email_mittente_nome = "Adriatica Sistemi" +email_primo_contatto = "info@adriaticasistemi.it" +default_footer_email = "Inserisci qui il footer che comparirà sotto alle email +puoi utilizzare %default_NomeSito% per inserire il nome del sito" +email_contatto_template = "CONTATTO" +test_email = "sviluppoweb@winfatt.com" +interrutore_sito = "off" +interrutore_webservices_v1 = "on" +interrutore_services = "on" +interrutore_testdb = "off" +interrutore_paypal_test = "off" +interrutore_stripe_test = "off" +ip_server = "185.31.65.139" +interrutore_email_services = "on" diff --git a/application/configs/dati_aziendali.json b/application/configs/dati_aziendali.json new file mode 100644 index 0000000..e5e8b8b --- /dev/null +++ b/application/configs/dati_aziendali.json @@ -0,0 +1,6 @@ +{ + "NomeSito":"GestioneSpiaggia.it", + "NomeBreve":"Gestione Spiaggia", + "RagioneSociale":"Adriatica Sistemi soc. coop.", + "PartitaIva":"" +} diff --git a/application/configs/enviroment.ini b/application/configs/enviroment.ini new file mode 100644 index 0000000..686b9a4 --- /dev/null +++ b/application/configs/enviroment.ini @@ -0,0 +1,26 @@ +[production] +version = "1.0.0" +baseUrlSite = "https://gestionespiaggia.it" + +password_salt = "gs108_" +site_short_id = "gs" + +mysql.params.host="localhost" +mysql.params.username = "gestionespiaggia_user" +mysql.params.password = "Winfatt108" +mysql.params.dbname = "gestionespiaggia_main" + +cpanel.username = "gestionespiaggia" +cpanel.password = "Winfatt108" +cpanel.host = "cpanel.gestionespiaggia.it" +cpanel.restusername = "admin" + +[staging : production] +version = "1.0.0" +baseUrlSite = "https://gestionespiaggia.it" + +[development : production] +version = "1.0.0" +baseUrlSite = "https://gestionespiaggia.it" + +mysql.params.dbname = "gestionespiaggia_main" diff --git a/application/configs/parametri_sito.json b/application/configs/parametri_sito.json new file mode 100644 index 0000000..8ffe3cd --- /dev/null +++ b/application/configs/parametri_sito.json @@ -0,0 +1,5 @@ +{ + "base_title":"GestioneSpiaggia", + "base_keywords":"", + "home_description":"" +} diff --git a/application/controllerSections/Admin/Index/Emailtemplate.php b/application/controllerSections/Admin/Index/Emailtemplate.php new file mode 100644 index 0000000..b4fbff0 --- /dev/null +++ b/application/controllerSections/Admin/Index/Emailtemplate.php @@ -0,0 +1,38 @@ +_resourceName = 'EmailTemplate'; + + //Usato per abilitare la sezione filtri + $this->_enableModalFilter = true; + + //Disable new insert of element + //$this->_enableNewInsert = false; + + parent::__construct($controller); + } + + public function lista(){ + parent::lista(); + + $this->_controller->_MENUITEM = "emailtemplate"; + $this->_controller->_EVENTLOADER = $this->_controller->getRequest()->getActionName(); + $this->_controller->_PAGETITLE = 'Elenco Template Email'; + $this->_controller->_ICONTITLE = 'fa-envelope'; + + $this->_controller->view->popover_default_param_content = $this->_controller->getDefaultParamsPopoverTemplate(); + } + + //Personalizzazione della funzione di delete Elemento singolo + /*protected function deleteElement($id){ + $this->_model->delete($this->_resourceName,$id); + }*/ + + + + + } diff --git a/application/controllerSections/Admin/Index/Generic.php b/application/controllerSections/Admin/Index/Generic.php new file mode 100644 index 0000000..e14b4b5 --- /dev/null +++ b/application/controllerSections/Admin/Index/Generic.php @@ -0,0 +1,38 @@ +_moduleName = 'admin'; + $this->_resourceName = 'NomeDellaRisorsa'; + + //Usato per abilitare la sezione filtri + $this->_enableModalFilter = true; + + //Disable new insert of element + //$this->_enableNewInsert = false; + + parent::__construct($controller); + } + + public function lista(){ + parent::lista(); + + $this->_controller->_MENUITEM = "nodellarisorsa"; + $this->_controller->_EVENTLOADER = $this->_controller->getRequest()->getActionName(); + $this->_controller->_PAGETITLE = 'Elenco Template ...'; + $this->_controller->_ICONTITLE = 'fa-'; + + } + + //Personalizzazione della funzione di delete Elemento singolo + /*protected function deleteElement($id){ + $this->_model->delete($this->_resourceName,$id); + }*/ + + + + +} diff --git a/application/controllerSections/Monitoring/Index/Accesslog.php b/application/controllerSections/Monitoring/Index/Accesslog.php new file mode 100644 index 0000000..e575b69 --- /dev/null +++ b/application/controllerSections/Monitoring/Index/Accesslog.php @@ -0,0 +1,53 @@ +_resourceName = 'Accesslog'; + + //Usato per abilitare la sezione filtri + $this->_enableModalFilter = false; + + //Disable new insert of element + $this->_enableNewInsert = false; + + //Disable new insert of element + //$this->_enableModalDetail = false; + + parent::__construct($controller); + } + + public function lista(){ + parent::lista(); + + $this->_controller->_EVENTLOADER = $this->_controller->getRequest()->getActionName(); + $this->_controller->_MENUITEM = "accesslog"; + $this->_controller->_PAGETITLE = 'Log Accessi al sito'; + $this->_controller->_ICONTITLE = 'fa-sign-in-alt'; + + } + + /** + * Questa funzione se dichiarata effettua la manipolazione sui dati prima di restiutirli nella get + * + * @param $data + * @return mixed + */ + protected function getElement($data){ + + $data['Data'] = $this->_helper->ExtractData($data['Data']); + $data['Descrizione'] = stripcslashes($data['Descrizione']); + + return $data; + } + + //Personalizzazione della funzione di delete Elemento singolo + /*protected function deleteElement($id){ + $this->_model->delete($this->_resourceName,$id); + }*/ + + + + +} diff --git a/application/controllerSections/Monitoring/Index/Errorlog.php b/application/controllerSections/Monitoring/Index/Errorlog.php new file mode 100644 index 0000000..da4f3d6 --- /dev/null +++ b/application/controllerSections/Monitoring/Index/Errorlog.php @@ -0,0 +1,60 @@ +_resourceName = 'Errorlog'; + + //Usato per abilitare la sezione filtri + $this->_enableModalFilter = false; + + //Disable new insert of element + $this->_enableNewInsert = false; + + parent::__construct($controller); + } + + public function lista() + { + parent::lista(); + + $this->_controller->_EVENTLOADER = $this->_controller->getRequest()->getActionName(); + $this->_controller->_MENUITEM = "errorlog"; + $this->_controller->_PAGETITLE = 'Elenco Errori'; + $this->_controller->_ICONTITLE = 'fa-hashtag'; + + } + + /** + * Questa funzione se dichiarata effettua la manipolazione sui dati prima di restiutirli nella get + * + * @param $data + * @return mixed + */ + protected function getElement($data) + { + + $data['params'] = Zend_Json::decode($data['params']); + $data['trace'] = Zend_Json::decode($data['trace']); + + $data['baseUrl'] = $this->_controller->getRequest()->getScheme() . '://' . $this->_controller->getRequest()->getHttpHost(); + + $this->_controller->view->assign($data); + + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setScriptAction(strtolower($this->_resourceName) . '/get'); + + $this->_controller->render(); + $data['text'] = $this->_controller->getResponse()->getBody(); + + return $data; + } + + //Personalizzazione della funzione di delete Elemento singolo + /*protected function deleteElement($id){ + $this->_model->delete($this->_resourceName,$id); + }*/ + + +} diff --git a/application/forms/Admin/Index/EmailTemplate/Add.php b/application/forms/Admin/Index/EmailTemplate/Add.php new file mode 100644 index 0000000..7c0d6b7 --- /dev/null +++ b/application/forms/Admin/Index/EmailTemplate/Add.php @@ -0,0 +1,52 @@ +addElement('text', 'Codice', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'Nome', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'Oggetto', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'Testo', + array( + 'filters' => array('StringTrim'), + ) + ); + + $this->addElement('text', 'Tipologia', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'Footer', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + } + +} diff --git a/application/forms/Admin/Index/Users/Add.php b/application/forms/Admin/Index/Users/Add.php new file mode 100644 index 0000000..92655a4 --- /dev/null +++ b/application/forms/Admin/Index/Users/Add.php @@ -0,0 +1,111 @@ +addElement('text', 'RagioneSociale', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'Indirizzo', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'Comune', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'Provincia', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'Cap', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'PartitaIva', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'CodiceFiscale', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'Telefono', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'Email', + array( + 'filters' => array('StringTrim'), + 'validators' => array(new Zend_Validate_EmailAddress(), + /*new Zend_Validate_Db_NoRecordExists(array('table' => 'users', 'field' => 'Email', 'adapter' => Zend_Registry::get('db_adapter')))*/ + ) + ) + ); + + $this->addElement('text', 'Pec', + array( + 'filters' => array('StringTrim') + ) + ); + + $this->addElement('text', 'username', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'password', + array( + 'filters' => array('StringTrim'), + 'validators' => array( + array('StringLength', true, array(6)) + ) + ) + ); + + $this->addElement('text', 'role', + array( + 'filters' => array('StringTrim'), + 'required' => true + ) + ); + + $this->addElement('text', 'stato', + array( + 'filters' => array('StringTrim', new App_Form_Filters_MyBoolean()), + 'required' => true + ) + ); + + $this->addElement('text', 'Nota', + array( + 'filters' => array('StringTrim') + ) + ); + + } + +} diff --git a/application/forms/Default/Index/Auth/Login.php b/application/forms/Default/Index/Auth/Login.php new file mode 100644 index 0000000..37d71a1 --- /dev/null +++ b/application/forms/Default/Index/Auth/Login.php @@ -0,0 +1,29 @@ +addElement('text', 'username', array( + 'filters' => array('StringTrim'), + 'validators' => array( + array('StringLength', true, array(3, 150)) + ), + 'required' => true, + )); + + $this->addElement('password', 'password', array( + 'filters' => array('StringTrim'), + 'validators' => array( + array('StringLength', true, array(3, 50)) + ), + 'required' => true, + )); + + $this->addElement('text', 'ricorda_password', array( + 'filters' => array('StringTrim') + )); + + } +} diff --git a/application/forms/Default/Index/Auth/ResetPw.php b/application/forms/Default/Index/Auth/ResetPw.php new file mode 100644 index 0000000..0fb2ec7 --- /dev/null +++ b/application/forms/Default/Index/Auth/ResetPw.php @@ -0,0 +1,24 @@ +addElement('text', 'password', array( + 'filters' => array('StringTrim'), + 'required'=>true, + 'validators' => array(array('StringLength', true, array(6, 25))) + )); + + $this->addElement('text', 'password2', array( + 'filters' => array('StringTrim'), + 'required'=>true, + 'validators' => array(array('StringLength', true, + array(6, 25)), + array('identical', false, array('token' => 'password'))), + )); + + } +} diff --git a/application/forms/V1/Test/Add.php b/application/forms/V1/Test/Add.php new file mode 100644 index 0000000..45883a5 --- /dev/null +++ b/application/forms/V1/Test/Add.php @@ -0,0 +1,31 @@ +setMethod('post'); + $this->setName('testForm'); + $this->setAction(''); + + //$this->addElement('hidden', 'id'); + + $this->addElement('text', 'Nome', + array( + 'filters' => array('StringTrim'), + 'validators'=>array('Alnum'), + 'required' => true + ) + ); + + $this->addElement('text', 'Descrizione', + array( + 'filters' => array('StringTrim') + ) + ); + + } + +} diff --git a/application/layouts/scripts/admin.phtml b/application/layouts/scripts/admin.phtml new file mode 100644 index 0000000..24cfaf6 --- /dev/null +++ b/application/layouts/scripts/admin.phtml @@ -0,0 +1,173 @@ + + + + + + + + + + + + Admin | Dashboard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + customCssScript): ?> + + customCssScript as $script): ?> + + + + + + + + + + +action, array('login', 'authenticate', 'resetpassword'))): ?> + + + action) { + default: + case 'login': + echo $this->render('admin/baseSection/_loginPage.phtml'); + break; + case 'resetpassword': + echo $this->render('admin/baseSection/_resetPage.phtml'); + break; + } ?> + + + + render('admin/baseSection/_default.phtml') ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +customJsScript): ?> + + customJsScript as $script): ?> + + + + + +angularModuleName): ?> + + + + + + + + + + + + + + + + + + + + + + + + + + +eventLoader): ?> + + + + + + diff --git a/application/layouts/scripts/admin/_contentHeaderAdmin.phtml b/application/layouts/scripts/admin/_contentHeaderAdmin.phtml new file mode 100644 index 0000000..27233c4 --- /dev/null +++ b/application/layouts/scripts/admin/_contentHeaderAdmin.phtml @@ -0,0 +1,21 @@ +
+
+
+
+

+ + pageTitle; ?> subTitle) ? ' - ' . $this->subTitle : ''; ?> +

+
+
+ +
+
+
+
diff --git a/application/layouts/scripts/admin/_footerAdmin.phtml b/application/layouts/scripts/admin/_footerAdmin.phtml new file mode 100644 index 0000000..7aaa7dc --- /dev/null +++ b/application/layouts/scripts/admin/_footerAdmin.phtml @@ -0,0 +1,10 @@ + diff --git a/application/layouts/scripts/admin/_navbarAdmin.phtml b/application/layouts/scripts/admin/_navbarAdmin.phtml new file mode 100644 index 0000000..4d96a04 --- /dev/null +++ b/application/layouts/scripts/admin/_navbarAdmin.phtml @@ -0,0 +1,61 @@ + diff --git a/application/layouts/scripts/admin/_sidebarAdmin.phtml b/application/layouts/scripts/admin/_sidebarAdmin.phtml new file mode 100644 index 0000000..7c645a6 --- /dev/null +++ b/application/layouts/scripts/admin/_sidebarAdmin.phtml @@ -0,0 +1,52 @@ + + + diff --git a/application/layouts/scripts/admin/_sidebarMonitoring.phtml b/application/layouts/scripts/admin/_sidebarMonitoring.phtml new file mode 100644 index 0000000..cefc796 --- /dev/null +++ b/application/layouts/scripts/admin/_sidebarMonitoring.phtml @@ -0,0 +1,52 @@ + + diff --git a/application/layouts/scripts/admin/baseSection/_default.phtml b/application/layouts/scripts/admin/baseSection/_default.phtml new file mode 100644 index 0000000..489b627 --- /dev/null +++ b/application/layouts/scripts/admin/baseSection/_default.phtml @@ -0,0 +1,49 @@ +
+ + + render('admin/_navbarAdmin.phtml') ?> + + + + + +
+ + action != 'index'): ?> + render('admin/_contentHeaderAdmin.phtml') ?> + + + +
+ + layout()->content ?> + +
+ +
+ + + + action)): ?> + render('admin/_footerAdmin.phtml'); ?> + + + +
diff --git a/application/layouts/scripts/admin/baseSection/_loginPage.phtml b/application/layouts/scripts/admin/baseSection/_loginPage.phtml new file mode 100644 index 0000000..2a82c47 --- /dev/null +++ b/application/layouts/scripts/admin/baseSection/_loginPage.phtml @@ -0,0 +1,72 @@ +
+ + + + + +
diff --git a/application/layouts/scripts/admin/baseSection/_resetPage.phtml b/application/layouts/scripts/admin/baseSection/_resetPage.phtml new file mode 100644 index 0000000..cdfa868 --- /dev/null +++ b/application/layouts/scripts/admin/baseSection/_resetPage.phtml @@ -0,0 +1,100 @@ +
+ + + + +
diff --git a/application/layouts/scripts/layout.phtml b/application/layouts/scripts/layout.phtml new file mode 100644 index 0000000..f34e63a --- /dev/null +++ b/application/layouts/scripts/layout.phtml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + <?= $this->title; ?> + + action == 'downloadsoftware'): ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +render('public/_header.phtml'); ?> + + +layout()->content ?> + + +render('public/_footer.phtml'); ?> + + + + + + + + + + + + + + + + + + render('public/_privacyPolicy.phtml'); ?> + + + + diff --git a/application/layouts/scripts/layout_old.phtml b/application/layouts/scripts/layout_old.phtml new file mode 100644 index 0000000..81873f2 --- /dev/null +++ b/application/layouts/scripts/layout_old.phtml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + <?= $this->title; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +render('public/_header.phtml'); ?> + + +layout()->content ?> + + +render('public/_footer.phtml'); ?> + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +enableTestSdk): ?> + + render('public/_devBanner.phtml') ?> + + + + + diff --git a/application/layouts/scripts/public/_devBanner.phtml b/application/layouts/scripts/public/_devBanner.phtml new file mode 100644 index 0000000..32c55de --- /dev/null +++ b/application/layouts/scripts/public/_devBanner.phtml @@ -0,0 +1,15 @@ +
+
+
+ STAI VISUALIZZANDO L'AMBIENTE DI SVILUPPO + CHIUDI +
+
+
+ + \ No newline at end of file diff --git a/application/layouts/scripts/public/_footer.phtml b/application/layouts/scripts/public/_footer.phtml new file mode 100644 index 0000000..76e7d4c --- /dev/null +++ b/application/layouts/scripts/public/_footer.phtml @@ -0,0 +1,143 @@ + + diff --git a/application/layouts/scripts/public/_header.phtml b/application/layouts/scripts/public/_header.phtml new file mode 100644 index 0000000..910a090 --- /dev/null +++ b/application/layouts/scripts/public/_header.phtml @@ -0,0 +1,55 @@ + + diff --git a/application/layouts/scripts/public/_privacyPolicy.phtml b/application/layouts/scripts/public/_privacyPolicy.phtml new file mode 100644 index 0000000..fc3527e --- /dev/null +++ b/application/layouts/scripts/public/_privacyPolicy.phtml @@ -0,0 +1,60 @@ + + +
+
+
+ Questo sito o gli strumenti terzi da questo utilizzati si avvalgono di cookie necessari al funzionamento + ed utili alle finalità illustrate nella privacy policy e cookie policy + Ok,acconsento +
+
+
+ + diff --git a/application/models/FcmFirebase.php b/application/models/FcmFirebase.php new file mode 100644 index 0000000..b0c55fb --- /dev/null +++ b/application/models/FcmFirebase.php @@ -0,0 +1,35 @@ + array( + 'title' => $dati['Title'], + 'body' => $dati['Message'], + 'sound' => 'default', + //'badge' => '1' + ), + 'to' => $token + ); + + if($dati){ + $corpoNotifica['data'] = array( + 'action' => '', + 'url' => '' + ); + } + + $this->postCall($corpoNotifica); + } + + +} diff --git a/application/models/Generic.php b/application/models/Generic.php new file mode 100644 index 0000000..73bda64 --- /dev/null +++ b/application/models/Generic.php @@ -0,0 +1,17 @@ + _db -> query("SELECT 'error' as 'tipo',msg as 'text',id FROM `error_log` WHERE state = '1'"); + return $stmt -> fetchAll(); + } + + public function getNotifyList(){ + $stmt = $this -> _db -> query("SELECT 'error' as 'tipo',id,notify FROM `error_log` WHERE state = '1' AND notify = '0'"); + return $stmt -> fetchAll(); + } + +} diff --git a/application/models/Resources/Users.php b/application/models/Resources/Users.php new file mode 100644 index 0000000..73b3ad9 --- /dev/null +++ b/application/models/Resources/Users.php @@ -0,0 +1,15 @@ +init($this->_risorsa); + } + + public function getById($id){ + return parent::getById($id); + } + + public function deleteById($id){ + return parent::deleteById($id); + } + + public function getList($paged = null,$count = null,$order = null){ + return parent::getList($paged,$count,$order); + } + + public function getFiltered($paged = null,$count = null,$order = null,$where = null){ + return parent::getFiltered($paged,$count,$order,$where); + } + + public function updateAccessoCloud($params){ + $data = parent::getByMethod('nomeMetodoCustom',$params); + return $data['data']; + } + +} diff --git a/application/modules/admin/Bootstrap.php b/application/modules/admin/Bootstrap.php new file mode 100644 index 0000000..480cc45 --- /dev/null +++ b/application/modules/admin/Bootstrap.php @@ -0,0 +1,29 @@ +getRouter(); + + $router->addRoute( + 'admin', + new Zend_Controller_Router_Route('admin/:controller/:action', + array( + 'module'=>'admin', + 'controller'=>'index', + 'action'=>'index' + ) + ) + ); + + } + +} diff --git a/application/modules/admin/controllers/ErrorController.php b/application/modules/admin/controllers/ErrorController.php new file mode 100644 index 0000000..17573c2 --- /dev/null +++ b/application/modules/admin/controllers/ErrorController.php @@ -0,0 +1,64 @@ +view->menuitem = 'home'; + $this->view->pageName = 'Ops, si è verificato un errore'; + + $errors = $this->_getParam('error_handler'); + + if (!$errors || !$errors instanceof ArrayObject) { + $this->view->message = 'You have reached the error page'; + return; + } + + switch ($errors->type) { + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: + // 404 error -- controller or action not found + $this->getResponse()->setHttpResponseCode(404); + $priority = Zend_Log::NOTICE; + $this->view->error_code = '404'; + $this->view->message = 'La pagina richiesta non è stata trovata'; + break; + default: + // application error + $this->getResponse()->setHttpResponseCode(500); + $priority = Zend_Log::CRIT; + $this->view->error_code = '500'; + $this->view->message = 'Errore Applicazione'; + break; + } + + // Log exception, if logger available + if ($log = $this->getLog()) { + $log->log($this->view->message, $priority, $errors->exception); + $log->log('Request Parameters', $priority, $errors->request->getParams()); + } + + // conditionally display exceptions + if ($this->getInvokeArg('displayExceptions') == true) { + $this->view->exception = $errors->exception; + } + print_r($errors->exception->getMessage()); + + $this->view->request = $errors->request; + } + + public function getLog() + { + $bootstrap = $this->getInvokeArg('bootstrap'); + if (!$bootstrap->hasResource('Log')) { + return false; + } + $log = $bootstrap->getResource('Log'); + return $log; + } + + +} + diff --git a/application/modules/admin/controllers/IndexController.php b/application/modules/admin/controllers/IndexController.php new file mode 100644 index 0000000..f02a887 --- /dev/null +++ b/application/modules/admin/controllers/IndexController.php @@ -0,0 +1,280 @@ +_helper->layout->setLayout('admin'); + + $this->_authService = new App_Service_Auth(); + $this->_genericModel = new Application_Model_Generic(); + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + + $this->_parametriSito = new App_Service_JsonConfiguration('parametri_sito'); + $this->_datiAziendali = new App_Service_JsonConfiguration('dati_aziendali'); + $this->_VariabiliSito = new App_Service_VariabiliSito(); + + $this->_MENUITEM = 'dashboard'; + $this->_PAGETITLE = 'DashBoard'; + $this->_ICONTITLE = 'fa-dashboard'; + + $this->_SECONDLEVEL = null; + $this->_SECONDLEVEL_ACTION = null; + + $this->_EVENTLOADER = FALSE; + $this->_ANGULARJS_MODULE_NAME = false; + + } + + public function preDispatch() + { + $this->_SIDEBAR_COLLAPSED = boolval($_COOKIE['ui_sidebar_collapsed']) || false; + + $this->view->enableTestSdk = $this->_ipManager->controllaAbilitazioneTestSdk(); + } + + public function postDispatch() + { + $this->view->controller = $this->getRequest()->getControllerName(); + $this->view->action = $this->getRequest()->getActionName(); + + $this->view->menu = $this->_MENUITEM; + $this->view->pageTitle = $this->_PAGETITLE; + $this->view->iconTitle = $this->_ICONTITLE; + + $this->view->secondLevel = $this->_SECONDLEVEL; + $this->view->secondLevelAction = $this->_SECONDLEVEL_ACTION; + + $this->view->eventLoader = $this->_EVENTLOADER; + $this->view->sideBarCollapsed = $this->_SIDEBAR_COLLAPSED; + + $this->view->angularModuleName = $this->_ANGULARJS_MODULE_NAME; + + $this->view->parametriSito = $this->_parametriSito->getAllParams(); + $this->view->datiAziendali = $this->_datiAziendali->getAllParams(); + } + + public function logoutAction() + { + $this->_authService->clear(); + + return $this->_helper->redirector('index', 'index', 'default'); + } + + public function indexAction() + { + $this->_EVENTLOADER = 'dashboard'; + // $this->_ANGULARJS_MODULE_NAME = 'dashboard'; + + $this->render('dashboard'); + } + + public function infoAction(){ + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + + phpinfo(); + } + + /*=============================================================================================== + * =========================== GESTIONE SETTINGS ============================ + * =============================================================================================*/ + + public function settingsAction() + { + + $this->_MENUITEM = "settings"; + $this->_PAGETITLE = 'Impostazioni'; + $this->_ICONTITLE = 'fa-cogs'; + + $this->_EVENTLOADER = 'settings'; + $this->view->assign($this->_configs->getAllParam()); + $this->view->assign($this->_parametriSito->getAllParams()); + + $this->view->tabname = (!$_COOKIE['settings_tabname']) ? 'generico' : $_COOKIE['settings_tabname']; + $this->view->email_templates = $this->_genericModel->getList('EmailTemplate', null, null); + + $this->view->popover_default_param_content = $this->getDefaultParamsPopoverTemplate(); + } + + public function savesettingsAction() + { + + if ($this->getRequest()->isXmlHttpRequest()) { + + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + + $params = $this->getAllParams(); + + unset($params['controller']); + unset($params['module']); + unset($params['action']); + unset($params['section']); + + $response = array(); + switch ($this->_getParam('section')) { + case 'generico': + $params['interrutore_sito'] = (isset($params['interrutore_sito'])) ? 'on' : 'off'; + $params['interrutore_services'] = (isset($params['interrutore_services'])) ? 'on' : 'off'; + $params['interrutore_webservices_v1'] = (isset($params['interrutore_webservices_v1'])) ? 'on' : 'off'; + $response = $this->saveConfigParams($params); + break; + case 'sito': + foreach ($params as $key => $value) { + $this->_parametriSito->set($key, $value); + $response[$key] = 'OK'; + } + break; + case 'test': + $params['interrutore_testdb'] = (isset($params['interrutore_testdb'])) ? 'on' : 'off'; + $params['interrutore_paypal_test'] = (isset($params['interrutore_paypal_test'])) ? 'on' : 'off'; + $params['interrutore_stripe_test'] = (isset($params['interrutore_stripe_test'])) ? 'on' : 'off'; + $response = $this->saveConfigParams($params); + break; + case 'accesso': + $response = $this->saveConfigParams($params); + break; + } + + if ($this->check_has_error_value($response)) { + $response['stato'] = 'success'; + } else { + $response['stato'] = 'error'; + } + + $response = Zend_Json::encode($response); + $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody($response); + } + } + + public function savenewpasswordAction() + { + + if ($this->getRequest()->isXmlHttpRequest()) { + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + $params = $this->getAllParams(); + unset($params['controller']); + unset($params['module']); + unset($params['action']); + $response = array(); + if (!$params['vecchia_pwd']) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => false, 'message' => 'Inserire la vecchia password'))); + } + if (!$params['nuova_pwd']) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => false, 'message' => 'Inserire la nuova password'))); + } + if (!$params['nuova_pwd2']) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => false, 'message' => 'Ripeti la nuova password'))); + } + if (strtolower($params['nuova_pwd']) == strtolower($params['vecchia_pwd'])) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => false, 'message' => 'La nuova password non può essere uguale a quella corrente'))); + } + if (strtolower($params['nuova_pwd']) != strtolower($params['nuova_pwd2'])) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => false, 'message' => 'Le password non coincidono'))); + } + $admin = $this->_genericModel->getByColumnName('Users', 'username', 'admin'); + //Confronto le password + $passwordSalt = Zend_Registry::get('ENVIROMENTS')->get('password_salt'); + if (md5($passwordSalt . $params['vecchia_pwd']) != $admin['password']) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => false, 'message' => 'La vecchia password è errata', 'resetForm' => true))); + } + //Salvo la nuova password + $this->_genericModel->update('Users', $admin['id'], array('password' => md5($passwordSalt . $params['nuova_pwd']))); + $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('status' => true))); + } + } + + private function checkNullValue($value) + { + return (!$value || strtolower($value) === 'null') ? null : $value; + } + + + /*=============================================================================================== + * =========================== FUNZIONI PRIVATE DEL CONTROLLER ========================= + * =============================================================================================*/ + + public function getMainModel() + { + return $this->_genericModel; + } + + protected function saveConfigParams($params) + { + + $response = array(); + foreach ($params as $key => $value) { + $valori_non_null = array(); + if (!$value && in_array($key, $valori_non_null)) { + $response[$key] = 'Errore'; + } else { + $this->_configs->set($key, $value); + $response[$key] = 'OK'; + } + } + $this->_configs->write(); + + return $response; + } + + /** + * Scorre l'array se trova un valore riconosciuto come errore restituisce false altrimenti true + * @param array $array + * @return boolean + */ + protected function check_has_error_value($array) + { + + foreach ($array as $key => $value) { + if ($value == 'Error' || $value == 'Errore' || $value == '0') { + return FALSE; + } + } + + return true; + } + + /** + * Funzione che genera le indicazioni dei valori dei parametri di default leggendoli dal file di configurazione + * @return string + */ + public function getDefaultParamsPopoverTemplate() + { + + $html = '
Inserire il nome variabile senza gli apici
'; + //$html .= ''; + $params = $this->_datiAziendali->getAllParams(); + foreach ($params as $key => $val) { + $html .= "%default_" . $key . "%
- " . $val . "
"; + } + $html .= ''; + + return $html; + } + + +} //Close Class diff --git a/application/modules/admin/views/scripts/error/error.phtml b/application/modules/admin/views/scripts/error/error.phtml new file mode 100644 index 0000000..0120b48 --- /dev/null +++ b/application/modules/admin/views/scripts/error/error.phtml @@ -0,0 +1,36 @@ +
+
+ +
+ + error_code)): ?> +

+ error_code; ?> + +

+ + +
Clicca qui per tornare alla home del sito.
+ + exception)): ?> + +
Exception information:
+
+ Message: exception->getMessage() ?> +
+ +

Stack trace:

+
exception->getTraceAsString() ?>
+ +

Request Parameters:

+
escape(var_export($this->request->getParams(), true)) ?>
+ + + +
+
+
+ + + + diff --git a/application/modules/admin/views/scripts/index/_paginator.phtml b/application/modules/admin/views/scripts/index/_paginator.phtml new file mode 100644 index 0000000..466bbe2 --- /dev/null +++ b/application/modules/admin/views/scripts/index/_paginator.phtml @@ -0,0 +1,47 @@ +pageCount > 1): ?> +
    + + previous)): ?> +
  • + +
  • + + + + previous)): ?> +
  • + + + + + + pagesInRange as $page): ?> + current): ?> +
  • + +
  • + +
  • + + + + + next)): ?> +
  • + + + + + + next)): ?> +
  • + +
  • + + +
    + dal: firstItemNumber; ?> - lastItemNumber; ?> di totalItemCount; ?> +
    + +
+ diff --git a/application/modules/admin/views/scripts/index/dashboard.phtml b/application/modules/admin/views/scripts/index/dashboard.phtml new file mode 100644 index 0000000..b85672b --- /dev/null +++ b/application/modules/admin/views/scripts/index/dashboard.phtml @@ -0,0 +1,20 @@ +
+ +
+

+ Gestione Spiaggia + Version version; ?> +

+ +
+ +
+ +
+ +
+ + diff --git a/application/modules/admin/views/scripts/index/emailtemplate/_modal.phtml b/application/modules/admin/views/scripts/index/emailtemplate/_modal.phtml new file mode 100644 index 0000000..627d647 --- /dev/null +++ b/application/modules/admin/views/scripts/index/emailtemplate/_modal.phtml @@ -0,0 +1,125 @@ + diff --git a/application/modules/admin/views/scripts/index/emailtemplate/_modalFilter.phtml b/application/modules/admin/views/scripts/index/emailtemplate/_modalFilter.phtml new file mode 100644 index 0000000..094cbf0 --- /dev/null +++ b/application/modules/admin/views/scripts/index/emailtemplate/_modalFilter.phtml @@ -0,0 +1,95 @@ + + diff --git a/application/modules/admin/views/scripts/index/emailtemplate/_searchBlock.phtml b/application/modules/admin/views/scripts/index/emailtemplate/_searchBlock.phtml new file mode 100644 index 0000000..a5a9f73 --- /dev/null +++ b/application/modules/admin/views/scripts/index/emailtemplate/_searchBlock.phtml @@ -0,0 +1,23 @@ +
+ +
+ +
+ +
+ +
+ CleanFiltersParam($this->search_params)); ?> +
+ + +
+
diff --git a/application/modules/admin/views/scripts/index/emailtemplate/list.phtml b/application/modules/admin/views/scripts/index/emailtemplate/list.phtml new file mode 100644 index 0000000..d172c0f --- /dev/null +++ b/application/modules/admin/views/scripts/index/emailtemplate/list.phtml @@ -0,0 +1,170 @@ +
+ +
+ +
+ + + + + +
+ +
+ + isActiveNewInsert): ?> + + + + isActiveFilterModal): ?> + + + + + +
+ +
+ +
+ +
+
+ + + +
+
VariabileValore
+ + + render("index/$this->resourceName/th.phtml") ?> + + + + table) > 0): ?> + table as $key => $value): ?> + partial("index/$this->resourceName/td.phtml", $value) ?> + + + + + + + + + + + + +
+ + Nessun record presente + + + Nessun risultato trovato in base alla ricerca +
+
+ + + + + +isActiveModalDetail): ?> + render("index/$this->resourceName/_modal.phtml"); ?> + + +isActiveFilterModal): ?> + render("index/$this->resourceName/_modalFilter.phtml"); ?> + + +idDetail > 0): ?> + + + diff --git a/application/modules/admin/views/scripts/index/emailtemplate/td.phtml b/application/modules/admin/views/scripts/index/emailtemplate/td.phtml new file mode 100644 index 0000000..511d2ec --- /dev/null +++ b/application/modules/admin/views/scripts/index/emailtemplate/td.phtml @@ -0,0 +1,28 @@ + + + + + Codice; ?> + + + + Codice; ?> + + + +
+ + +
+ + + + + diff --git a/application/modules/admin/views/scripts/index/emailtemplate/th.phtml b/application/modules/admin/views/scripts/index/emailtemplate/th.phtml new file mode 100644 index 0000000..d24ae72 --- /dev/null +++ b/application/modules/admin/views/scripts/index/emailtemplate/th.phtml @@ -0,0 +1,17 @@ + + + + + Codice + Nome + + diff --git a/application/modules/admin/views/scripts/index/index.phtml b/application/modules/admin/views/scripts/index/index.phtml new file mode 100644 index 0000000..e69de29 diff --git a/application/modules/admin/views/scripts/index/settings.phtml b/application/modules/admin/views/scripts/index/settings.phtml new file mode 100644 index 0000000..21969dd --- /dev/null +++ b/application/modules/admin/views/scripts/index/settings.phtml @@ -0,0 +1,59 @@ +
+
+
+ +
+
+ + + +
+
+ +
+ render("index/settings_tabs/generali.phtml") ?> +
+ +
+ render("index/settings_tabs/sito.phtml") ?> +
+ +
+ render("index/settings_tabs/accesso.phtml") ?> +
+ +
+ render("index/settings_tabs/test.phtml") ?> +
+ +
+ +
+ + +
+ +
+ +
+ +
+
diff --git a/application/modules/admin/views/scripts/index/settings_tabs/accesso.phtml b/application/modules/admin/views/scripts/index/settings_tabs/accesso.phtml new file mode 100644 index 0000000..0c012a2 --- /dev/null +++ b/application/modules/admin/views/scripts/index/settings_tabs/accesso.phtml @@ -0,0 +1,52 @@ +
+ +

Password accesso amministratore

+ +
+
+
+ + + +
+ +
+

+ + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + +
+ +
diff --git a/application/modules/admin/views/scripts/index/settings_tabs/generali.phtml b/application/modules/admin/views/scripts/index/settings_tabs/generali.phtml new file mode 100644 index 0000000..0960b71 --- /dev/null +++ b/application/modules/admin/views/scripts/index/settings_tabs/generali.phtml @@ -0,0 +1,150 @@ +
+
+ +

Configurazioni

+ + + +
+
+
+
+ + +
+ interrutore_sito == 'on') ? 'checked' : ''; ?>> +
+ +

+ + +
+ interrutore_services == 'on') ? 'checked' : ''; ?>> +
+ +
+ + +
+ interrutore_webservices_v1 == 'on') ? 'checked' : ''; ?>> +
+ +
+
+ +
+
+ + + +
+ +
+ +

+ + + +
+ +
+ +

+ + + +
+ +
+
+
+
+ +
+ +

Email

+ +
+
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ +
+ +
+ +
+
diff --git a/application/modules/admin/views/scripts/index/settings_tabs/sito.phtml b/application/modules/admin/views/scripts/index/settings_tabs/sito.phtml new file mode 100644 index 0000000..e5a6399 --- /dev/null +++ b/application/modules/admin/views/scripts/index/settings_tabs/sito.phtml @@ -0,0 +1,43 @@ +
+
+ + + +

MetaTag del sito:

+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
diff --git a/application/modules/admin/views/scripts/index/settings_tabs/test.phtml b/application/modules/admin/views/scripts/index/settings_tabs/test.phtml new file mode 100644 index 0000000..cdc4a10 --- /dev/null +++ b/application/modules/admin/views/scripts/index/settings_tabs/test.phtml @@ -0,0 +1,54 @@ +
+
+ + + +

Ambiente di Test:

+ +
+
+ + + +
+ interrutore_testdb == 'on') ? 'checked' : ''; ?>> +
+ + + +
+ +
+ +
+ +
+ + + + +
+ + +
diff --git a/application/modules/auth/Bootstrap.php b/application/modules/auth/Bootstrap.php new file mode 100644 index 0000000..ef91ed3 --- /dev/null +++ b/application/modules/auth/Bootstrap.php @@ -0,0 +1,13 @@ +registerPlugin(new Zend_Controller_Plugin_PutHandler()); + + } + + +} diff --git a/application/modules/auth/controllers/IndexController.php b/application/modules/auth/controllers/IndexController.php new file mode 100644 index 0000000..4528ed5 --- /dev/null +++ b/application/modules/auth/controllers/IndexController.php @@ -0,0 +1,141 @@ +_resourceName = 'Users'; + + $this->_authService = new App_Service_WebServiceV1Auth(); + $this->_model = new Application_Model_Generic(); + $this->_configs = new App_Service_ConfigManager(); + + parent::init(); + } + + public function getAction() + { + + try { + switch ($this->_getParam('method')) { + case'check-connection': + $this->_responseData->data = []; + $this->_inArray = true; + break; + case'ora-server': + $format = $this->_getParam('format', 'd/m/Y H:i'); + $this->_responseData->data = array('data' => date($format)); + break; + default: + $this->disableCallAction(); + break; + } + + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + $this->_status = false; + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function postAction() + { + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + + if (preg_match('/application\/json/', $this->getFrontController()->getRequest()->getHeader('Content-Type'))) { + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + } else { + $params = $this->getAllParams(); + } + + if (isset($params['username']) && isset($params['password'])) { + $this->authuser($params['username'], trim($params['password']), $params['staylogin']); + } + + } + + public function putAction() + { + $this->disableCallAction(); + } + + public function deleteAction() + { + + $this->disableCallAction(); + } + + //################ FUNZIONI PRIVATE ################################################################################ + + private function authuser($username, $password, $staylogin = null) + { + $staylogin = ($staylogin == null) ? 0 : $staylogin; + + if ($username == null || $password == null) { + return $this->sendErrorResponse("Username e/o password non ricevuti.", App_Service_WebServiceV1Auth::NO_CREDENTIAL_CLOUDUSER); + } else { + $user = $this->_authService->authenticate($username, $password, $staylogin); + switch ($user) { + case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND: + $this->sendErrorResponse("Username inserito inesistente", App_Service_WebServiceV1Auth::FAILURE_IDENTITY_NOT_FOUND); + break; + case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID: + $this->sendErrorResponse("Le credenziali inserite non sono valide", App_Service_WebServiceV1Auth::FAILURE_CREDENTIAL_INVALID); + break; + case App_Service_WebServiceV1Auth::ACCOUNT_DEACTIVATED: + $this->sendErrorResponse("Account disattivato. Per informazioni contattare l'amministratore.", App_Service_WebServiceV1Auth::ACCOUNT_DEACTIVATED); + break; + case Zend_Auth_Result::FAILURE: + default: + $this->sendErrorResponse("Errore durante l'autenticazione", App_Service_WebServiceV1Auth::FAILURE); + break; + case Zend_Auth_Result::SUCCESS: + case is_array($user): + break; + } + } + + $userData = array_diff_key($user, array_flip(array('password','staylogin','rcode','DataRichiestaResetPw','NumeroResetPw'))); + + //Aggiungo i dati sull'area di consegna associata all'attività + $userData = $this->getDataByRole($userData); + + $this->_responseData->data = $userData; + $this->_status = true; + + $this->sendResponse(); + } + + private function getDataByRole($userData){ + + switch ($userData['role']){ + case 'user': + $userData = array_diff_key($userData, array_flip(array('secret_token', 'rcode', + 'Indirizzo', 'Comune', 'Cap', 'Provincia', 'PartitaIva', 'CodiceFiscale', + 'Pec', 'Telefono', 'UltimoAccesso', 'Nota', 'Descrizione'))); + break; + default: + break; + } + + return $userData; + } + +}//END CLASS diff --git a/application/modules/default/Bootstrap.php b/application/modules/default/Bootstrap.php new file mode 100644 index 0000000..558c9c0 --- /dev/null +++ b/application/modules/default/Bootstrap.php @@ -0,0 +1,42 @@ +getRouter(); + + $router->addRoute( + 'authenticate', + new Zend_Controller_Router_Route('/authenticate', + array( + 'module'=>'default', + 'controller'=>'index', + 'action'=>'authenticate' + ) + ) + ); + + $router->addRoute( + 'resetpassword', + new Zend_Controller_Router_Route('/resetpassword/:rcode', + array( + 'module'=>'default', + 'controller'=>'index', + 'action'=>'resetpassword', + 'rcode' => null + ) + ) + ); + + + } + +} diff --git a/application/modules/default/controllers/ErrorController.php b/application/modules/default/controllers/ErrorController.php new file mode 100644 index 0000000..23291e7 --- /dev/null +++ b/application/modules/default/controllers/ErrorController.php @@ -0,0 +1,194 @@ +_allowedController = array('admin', 'index', 'error', 'services'); + $this->_allowedModule = array('admin', 'default', 'v1', 'monitoring', 'user'); + $this->_restModule = array('v1','auth'); + $this->_ignoredMessages = array( + "Accesso Scaduto", + "Username e/o password non ricevuti.", + "I dati inseriti non sono validi", + "Le credenziali inserite non sono valide", + "Account disattivato. Per informazioni contattare l'amministratore.", + "Username inserito inesistente" + ); + $this->_ipManager = new App_Service_IpManager(); + } + + public function preDispatch() + { + $this->_response->clearHeader('Access-Control-Allow-Headers'); + $this->_response->setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Authorization,x-requested-with,Content-Type,X-As-Dev-On,,X-As-Dev-Pw,MongoDbName'); + + $this->_response->clearHeader('Access-Control-Allow-Methods'); + $this->_response->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, PATCH, DELETE'); + + $this->_response->clearHeader('Access-Control-Allow-Origin'); + $this->_response->setHeader('Access-Control-Allow-Origin', '*'); + + $this->_response->clearHeader('Access-Control-Allow-Credentials'); + $this->_response->setHeader('Access-Control-Allow-Credentials', 'true'); + + $this->view->allowedIp = $this->_ipManager->allowedIp(); + + $this->view->responseCode = null; + } + + public function errorAction() + { + $errors = $this->_getParam('error_handler'); + if ($this->_getParam('module') != 'default') { + $content = array('status' => false); + } + + if (!$errors || !$errors instanceof ArrayObject) { + $content['message'] = 'You have reached the error page'; + return; + } + + switch ($errors->type) { + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: + // 404 error -- controller or action not found + $this->getResponse()->setHttpResponseCode(404); + $this->view->responseCode = 404; + $this->view->title = "Adriatica Sistemi soc. coop. - Pagina non trovata - Errore 404"; + + $priority = Zend_Log::NOTICE; + if (in_array($this->_getParam('module'), $this->_restModule)) { + $content['message'] = 'Page not found'; + } else { + $this->view->message = 'Page not found'; + } + break; + default: + if ($errors->exception instanceof App_Controller_Errors_WebServiceError) { + // web services error + $content['message'] = $errors->exception->getMyMessage(); + $content['errorCode'] = $errors->exception->getErrorCode(); + + if ($errors->exception->getErrorDetail()) { + $content['errorDetail'] = $errors->exception->getErrorDetail(); + } + + //Recupero tutti i parametri disponibili sulla richiesta + $allParams = $this->getRequest()->getRawBody(); + if(!$allParams){ + $allParams = Zend_Json::encode($errors->request->getParams()); + } + + $dbName = '';$token = ''; $username = ''; + if(Zend_Registry::isRegistered('TOKEN')){ + $model = new Application_Model_Generic(); + $token = Zend_Registry::get('TOKEN'); + $user = $model->getByColumnName('users', 'token', $token); + if($user){ + $dbName = $user['NomeDB']; + $username = $user['username']; + } + } + + $this->getResponse()->setHttpResponseCode(400); + + //Zend_Registry::get('log')->info(print_r($errors,true)); + + if (!in_array($errors->exception->getMessage(), $this->_ignoredMessages)) + Zend_Registry::get('error_log') + ->setEventItem('url', $errors->request->getRequestUri()) + ->setEventItem('trace', Zend_Json::encode($errors->exception->getTrace())) + ->setEventItem('params', $allParams) + ->setEventItem('db_name', $dbName) + ->setEventItem('username', $username) + ->setEventItem('token', $token) + ->setEventItem('section', 'web_service') + ->info($content['message']); + + } else { + // application error + $this->getResponse()->setHttpResponseCode(500); + $priority = Zend_Log::CRIT; + if (in_array($this->_getParam('module'), $this->_restModule)) { + $content['message'] = $errors->exception->getMessage(); + } else { + $this->view->message = $errors->exception->getMessage(); + } + } + break; + } + + // Log exception, if logger available + if ($log = $this->getLog()) { + $log->log($this->view->message, $priority, $errors->exception); + $log->log('Request Parameters', $priority, $errors->request->getParams()); + } + + // conditionally display exceptions + if ($this->getInvokeArg('displayExceptions') == true || in_array($this->_getParam('module'), array('admin','monitoring'))) { + if (in_array($this->_getParam('module'), $this->_restModule)) { + $content['exception_trace'] = (array)$errors->exception->getTrace(); + } else { + $this->view->exception = $errors->exception; + } + } + + if (in_array($this->_getParam('module'), $this->_restModule) && APPLICATION_ENV != 'production') { + $content['request'] = (array)$errors->request; + } else { + $this->view->request = $errors->request; + } + + if (in_array($this->_getParam('module'), $this->_restModule)) { + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + $this->getResponse() + ->setHeader('Content-Type', 'json') + ->setBody($this->_helper->Globalfunction->safeJsonEncode($content)) + ->sendResponse(); + exit(1); + } + + //Registro il log dell'errore + //Zend_Registry::get('log')->info(print_r($errors,true)); + if (in_array($this->_getParam('module'), $this->_allowedModule) + && in_array($this->_getParam('controller'), $this->_allowedController) + && !in_array($errors->exception->getMessage(), $this->_ignoredMessages)) + Zend_Registry::get('error_log')->setEventItem('url', $errors->request->getRequestUri()) + ->setEventItem('trace', Zend_Json::encode($errors->exception->getTrace())) + ->setEventItem('params', Zend_Json::encode($errors->request->getParams())) + ->setEventItem('section', $this->_getParam('module')) + ->info($errors->exception->getMessage()); + } + + public function getLog() + { + $bootstrap = $this->getInvokeArg('bootstrap'); + if (!$bootstrap->hasResource('Log')) { + return false; + } + $log = $bootstrap->getResource('Log'); + return $log; + } + + public function invalidAction() + { + $content = $this->_helper->json(array('status' => 'error', 'message' => $this->_getParam('message'))); + $this->getResponse() + ->setHeader('Content-Type', 'json') + ->setBody($content) + ->sendResponse(); + } + + +} + diff --git a/application/modules/default/controllers/IndexController.php b/application/modules/default/controllers/IndexController.php new file mode 100644 index 0000000..0c1af7e --- /dev/null +++ b/application/modules/default/controllers/IndexController.php @@ -0,0 +1,436 @@ +_helper->layout->setLayout('layout'); + $this->_urlHelper = $this->_helper->getHelper('url'); + $this->_authService = new App_Service_Auth(); + $this->_genericModel = new Application_Model_Generic(); + $this->_restModel = new Application_Model_Rest(); + $this->_configs = new App_Service_ConfigManager(); + $this->_translate = Zend_Form::getDefaultTranslator(); + $this->_ipManager = new App_Service_IpManager(); + $this->_rsaCryptor = new App_Service_RsaCryptor(); + + $this->_VariabiliSito = new App_Service_VariabiliSito(); + $this->_datiAziendali = new App_Service_JsonConfiguration('dati_aziendali'); + $this->_parametriSito = new App_Service_JsonConfiguration("parametri_sito"); + + $this->_TITLE = "home"; + $this->_DESCRIPTION = ""; + $this->_KEYWORDS = ""; + + $this->_TITLE = $this->_parametriSito->get('base_title'); + $this->_DESCRIPTION = ""; + $this->_KEYWORDS = $this->_parametriSito->get('base_keywords'); + + $BASE_COOKIE_STRING = strtolower(Zend_Registry::get('ENVIROMENTS')->get('site_short_id')) . '_'; + + $this->_COOKIE_EXPIRE_TIME = time() + (86400 * 30); + $this->_COOKIE_SITE_CREDENTIALS = $BASE_COOKIE_STRING . "CREDENTIALS"; + } + + public function preDispatch() + { + + $action = $this->getRequest()->getActionName(); + if ($this->_configs->get('interrutore_sito') == 'off' && $action != 'login' && $action != 'authenticate' && $action != 'offline' && !$this->_ipManager->allowedIp()) { + $this->_helper->redirector('offline', 'index', 'default'); + } + + if (Zend_Registry::get('Zend_Locale') == 'it') { + $this->view->lang = 'it'; + } else { + $this->view->lang = 'en'; + } + + $this->view->action = $action; + $this->view->controller = $this->getRequest()->getControllerName(); + + $this->view->enableTestSdk = $this->_ipManager->controllaAbilitazioneTestSdk(); + } + + public function postDispatch() + { + $this->view->title = $this->_TITLE; + $this->view->keywords = $this->_KEYWORDS; + $this->view->description = $this->_DESCRIPTION; + + $this->view->menuitem = $this->_MENUITEM; + $this->view->pagename = $this->_PAGENAME; + $this->view->subtitle = $this->_SUBTITLE; + + $this->view->parametriSito = $this->_parametriSito->getAllParams(); + $this->view->datiAziendali = $this->_datiAziendali->getAllParams(); + } + + public function offlineAction() + { + $this->_DESCRIPTION .= "Il Sito è in manutenzuione"; + if ($this->_configs->get('interrutore_sito') == 'off') { + $this->_helper->getHelper('layout')->disableLayout(); + } else { + $this->_helper->redirector('index', 'index'); + } + } + + public function loginAction() + { + $this->_helper->layout->setLayout('admin'); + + $this->view->moduleName = 'default'; + $this->view->eventLoader = 'login'; + $this->view->formData = $this->recuperaCredenziali(); + + if (isset($this->_authService->getAuth()->getIdentity()->username)) + $this->_helper->redirector('index', $this->_authService->getAuth()->getIdentity()->role); + } + + public function authenticateAction() + { + $this->_helper->layout->setLayout('admin'); + + $this->view->moduleName = 'default'; + $this->view->eventLoader = 'login'; + $this->view->formData = $this->recuperaCredenziali(); + + if (!$this->getRequest()->isPost()) { + return $this->_helper->redirector('index'); + } + + $form = new Application_Form_Default_Index_Auth_Login(); + if (!$form->isValid($this->getRequest()->getPost())) { + $this->view->error = 'I campi sono richiesti'; + + $this->render('login'); + return false; + } + + if (false === $this->_authService->authenticate($form->getValues())) { + $this->view->error = 'Le credenziali non sono valide!'; + $this->render('login'); + return false; + } + + //memorizzo le credenziali se necessario + $data = $form->getValues(); + if ($data['ricorda_password'] == 'on') { + try { + $data['password'] = $this->_rsaCryptor->cripta($data['password']); + setcookie($this->_COOKIE_SITE_CREDENTIALS, Zend_Json::encode($data), $this->_COOKIE_EXPIRE_TIME, "/"); + } catch (Exception $e) { + } + } else { + setcookie($this->_COOKIE_SITE_CREDENTIALS, "", $this->_COOKIE_EXPIRE_TIME, "/"); + } + + //Accesso andato a buon fine + + //Generazione del Token temporaneo per l'accesso + $user = $this->_authService->getIdentity(); + + if ($user->role !== 'admin') { + if ($user->token != null) { + $token = $user->token; //Esistente uso quello già presente + } else { + do { //se non esiste ne genero uno nuovo e controllo che sia univoco + $token = hash('sha1', $user->username . date('YmdHis') . mt_rand(5, 10)); + if ($this->_genericModel->getByColumnName('Users', 'token', $token)) { + $exist = true; + } else { + $exist = false; + } + $user->token = $token; + } while ($exist); + } + + $this->_genericModel->update('Users', $user->id, array('UltimoLogin' => date('Y-m-d H:i:s'), 'token' => $token)); + } else { + $this->_genericModel->update('Users', $user->id, array('UltimoLogin' => date('Y-m-d H:i:s'))); + } + + $this->_genericModel->insert('Accesslog', array('ip' => $_SERVER['REMOTE_ADDR'], 'tipo' => $this->_authService->getIdentity()->role)); + + return $this->_helper->redirector('index', 'index', $this->_authService->getIdentity()->role); + } + + public function indexAction() + { + // $this->_helper->getHelper('layout')->disableLayout(); + + /*if (isset($this->_authService->getAuth()->getIdentity()->username)) + $this->_helper->redirector('index', $this->_authService->getAuth()->getIdentity()->role); + else + $this->_helper->redirector('login', 'index', 'default');*/ + } + + /** + * ===================================================================================================================== + * ========= ELENCO PAGINE STATIC ACTION =============================================== + * ===================================================================================================================== + */ + + public function assistenzaAction() + { + + } + + public function caratteristicheAction() + { + + } + + public function acquistaAction() + { + + } + + public function downloadsoftwareAction() + { + + } + + public function copyrightAction() + { + + } + + public function privacyAction() + { + $this->redirect("https://www.iubenda.com/privacy-policy/70038880"); + } + + public function cookiepolicyAction() + { + $this->redirect("https://www.iubenda.com/privacy-policy/70038880/cookie-policy"); + } + + /** + * ===================================================================================================================== + * ========= ACTION SPECIALI =========================================================== + * ===================================================================================================================== + */ + + public function resetpasswordAction() + { + $this->_helper->layout->setLayout('admin'); + + $this->view->moduleName = 'default'; + $rcode = $this->getParam('rcode', null); + $this->view->hideForm = false; + $this->view->rcode = $rcode; + + if (!$rcode && $this->getRequest()->isPost()) { + + $email = $this->_getParam('Email', null); + if (!$email) { + $this->view->errorMessage = "Inserire un email corretta!"; + return; + } + + $users = $this->_genericModel->getByColumnName('Users', 'Email', $email); + if (!$users || !$users['stato'] || $users['role'] === 'admin') { + $this->view->warningMessage = "Nessuna corrispondenza per l'email inserita."; + $this->view->hideForm = true; + return; + } + + if ($users['NumeroResetPw'] > 5) { + $this->view->warningMessage = "Hai effettuato troppe richieste per il reseet password, attendi 48 ore o contatta l'amministrazione su xxxx"; + $this->view->hideForm = true; + return; + } + + //Genero rcode e incremento il numero di richieste già effettuate per il limite max + $numeroReset = ($users['NumeroResetPw']) ? $users['NumeroResetPw'] : 0; + $numeroReset += 1; + $rcode = md5($users['PartitaIva'] . date('YmdHis')); + $this->_genericModel->update('Users', $users['id'], array('DataRichiestaResetPw' => date('Y-m-d H:i:s'), 'rcode' => $rcode, 'NumeroResetPw' => $numeroReset)); + $users['rcode'] = $rcode; + + //Invio email di recupero + $this->inviaEmailDiRecuperoPassword($users); + + $this->view->successMessage = "Ti è stata inviata una email per effettuare il reset della password, consulta la tua casella di posta e segui le istruzioni."; + $this->view->hideForm = true; + return; + } + + // FINE RICHIESTA + + // INIZIO RESET PASSWORD + + if ($rcode) { + + //Controllo del codice rcode + $utente = $this->_genericModel->getByColumnName('Users', 'rcode', $rcode); + if (!$utente) { + $this->view->warningMessage = "La richiesta è scaduta, effettuare una nuova richiesta!"; + $this->view->rcode = false; + return; + } + + + if ($this->getRequest()->isPost()) { + $form = new Application_Form_Default_Index_Auth_ResetPw(); + if (!$form->isValid($this->getAllParams())) { + $this->view->errorMessage = "Ci sono errori di compilazione, controllare i campi!"; + $this->view->errorForm = $form->getMessages(); + $this->view->formData = $form->getValues(); + return; + } + + $data = $form->getValues(); + $nuovaPassword = md5(Zend_Registry::get('ENVIROMENTS')->get('password_salt') . $data['password']); + + //Inserimento nuova password nel db + $this->_genericModel->update('Users', $utente['id'], array('password' => $nuovaPassword, 'rcode' => null, 'NumeroResetPw' => 0)); + $this->view->successMessage = 'La password è stata reimpostata correttamente, effettua un nuovo login cliccando qui.'; + $this->view->hideForm = true; + return; + } + + } + + } + + public function sendcontactAction() + { + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + if ($this->getRequest()->isXmlHttpRequest()) { + + $form = new Application_Form_Index_Contact_Add(); + if (!$form->isValid($this->getAllParams())) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array( + 'success' => false, + 'message' => $form->getMessages(), + ))); + } + + try { + $emailTemplate = $this->_genericModel->getByColumnName('EmailTemplate', 'Codice', $this->_configs->get('email_contatto_template')); + if (!$emailTemplate) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array( + 'success' => false, + 'message' => "Email template non trovato o non assegnato", + ))); + } + + $this->_helper->Email->sendEmailByTemplate($this->_configs->get('email_primo_contatto'), $emailTemplate, $form->getValues()); + + //Incremento il contatore contatti email + $numContatti = $this->_VariabiliSito->get('I_Numero_Contatti_Email'); + $this->_VariabiliSito->set('I_Numero_Contatti_Email', ++$numContatti); + + $response['success'] = true; + } catch (Zend_Exception $e) { + return $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array( + 'success' => false, + 'message' => "si è verificato un errore durante l'invio del messaggio", + ))); + } + + $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode($response)); + } else { + $this->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('success' => false, 'errore' => 'Operazione non consentita'))); + } + } + + public function sitemapAction() + { + + $this->_helper->getHelper('layout')->disableLayout(); + $this->_helper->viewRenderer->setNoRender(); + header('Content-type: text/xml'); + header('Pragma: public'); + header('Cache-control: private'); + header('Expires: -1'); + echo ''; + echo ''; + + /*echo ''; + echo 'https://sfdasdas.com/'; + echo 'monthly'; + echo '';*/ + + echo ''; + } + + /** + * ===================================================================================================================== + * ========= FUNZIONI PRIVATE DEL CONTROLLER =========================================== + * ===================================================================================================================== + */ + + private function recuperaCredenziali() + { + //Recupero eventuali credenziali memorizzate + if (isset($_COOKIE[$this->_COOKIE_SITE_CREDENTIALS])) { + $credentials = Zend_Json::decode($_COOKIE[$this->_COOKIE_SITE_CREDENTIALS]); + if ($credentials['ricorda_password'] == 'on') { + try { + $credentials['password'] = $this->_rsaCryptor->decripta($credentials['password']); + } catch (Exception $e) { + $credentials = array('ricorda_password' => 'off'); + } + return $credentials; + } + } + + return array('ricorda_password' => 'on'); + } + + private function inviaEmailDiRecuperoPassword($user) + { + + //Invio email per conferma + $emailTemplate = $this->_genericModel->getByColumnName('EmailTemplate', 'Codice', 'EMAIL_RECUPERO_PASSWORD'); + if (!$emailTemplate) { + throw new Exception("Errore invio email richiesta recupero password"); + } + + $params = $user; + $params['link'] = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() + . $this->_urlHelper->url(array('rcode' => $params['rcode']), 'resetpassword', true); + $this->_helper->Email->sendEmailByTemplate($params['Email'], $emailTemplate, $params); + } + +} + diff --git a/application/modules/default/controllers/ServicesController.php b/application/modules/default/controllers/ServicesController.php new file mode 100644 index 0000000..c0a73d4 --- /dev/null +++ b/application/modules/default/controllers/ServicesController.php @@ -0,0 +1,73 @@ +_helper->getHelper('layout')->disableLayout(); + + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + $this->_genericModel = new Application_Model_Generic(); + } + + public function preDispatch() + { + $action = $this->getRequest()->getActionName(); + if ($this->_configs->get('interrutore_services') == 'off' && $action != 'offline') { + $this->_helper->redirector('offline', 'services'); + } + } + + public function postDispatch() + { + + } + + public function offlineAction() + { + $this->_helper->viewRenderer->setNoRender(); + echo 'I servizi sono al momento disabilitati.'; + } + + public function indexAction() + { + $this->_helper->redirector('index', 'index'); + } + + /** + * ===================================================================================================================== + * ================ SERVIZI ================================================ + * ===================================================================================================================== + */ + + /** + * ===================================================================================================================== + * ========= FUNZIONI CRON DEL CPANEL =================================================== + * ===================================================================================================================== + */ + + /** + * ===================================================================================================================== + * ========= FUNZIONI PRIVATE DEL CONTROLLER =========================================== + * ===================================================================================================================== + */ + + private function _errorToLog($e, $message) + { + Zend_Registry::get('error_log')->setEventItem('url', $this->getRequest()->getRequestUri()) + ->setEventItem('trace', Zend_Json::encode($e->getTrace())) + ->setEventItem('params', Zend_Json::encode([])) + ->setEventItem('section', 'services') + ->info($message); + } + +} + diff --git a/application/modules/default/views/scripts/error/error.phtml b/application/modules/default/views/scripts/error/error.phtml new file mode 100644 index 0000000..33541d8 --- /dev/null +++ b/application/modules/default/views/scripts/error/error.phtml @@ -0,0 +1,34 @@ +responseCode == 404): ?> + +
+
+

404 - Pagina non Trovata

+

La pagina che stavi cercando di raggiungere a questo indirizzo sembra non esistere.
+ Questo è di solito il risultato di un link errato o non aggiornato.

+ Vai alla home del sito! +
+
+ + + +

Si è verificato un errore

+

message ?>

+ + + +exception) && $this->allowedIp): ?> + +

Exception information:

+

+ Message: exception->getMessage() ?> +

+ +

Stack trace:

+
exception->getTraceAsString() ?>
+  
+ +

Request Parameters:

+
escape(var_export($this->request->getParams(), true)) ?>
+  
+ + \ No newline at end of file diff --git a/application/modules/default/views/scripts/index/acquista.phtml b/application/modules/default/views/scripts/index/acquista.phtml new file mode 100644 index 0000000..039a319 --- /dev/null +++ b/application/modules/default/views/scripts/index/acquista.phtml @@ -0,0 +1,365 @@ +
+ + +
+ + + + + + + + + +
+ + +
+
+
+ + +

+ Acquista Gestione Spiaggia +

+ +
+
+
+ +
+ + +
+
+ + + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+ + Licenza Gestione Spiaggia Enterprise + +
+ + +
+ € + 185 + + iva +
+ + +

+ Annuali +

+ + +
+ + +
+ +
+ + +

+ Tutte le funzionalità +

+ +
+
+ + +
+ +
+ + +

+ 1000 Fatture elettroniche incluse +

+ +
+ +
+ + +
+ +
+ + +

+ 15 Ticket di assistenza telefonica +

+ +
+ + + + Acquista + + +
+
+ +
+ +
+
+ +
+
+ + +

+ - Pacchetti e Servizi Aggiuntivi - +

+ + +

+ I pacchetti e servizi aggiuntivi sono acquistabili solo in abbinamento ad una licenza valida +

+ +
+
+ +
+
+ +
+ + +
+
+ + +
+ + Assistenza Telefonica + +
+ + +
+ € + 80 + + iva +
+ + +

+ Pacchetto Aggiuntivo +

+ + +
+ + +
+ +
+ + +

+ 100 Minuti / 10 Ticket +

+ +
+ + + + Acquista + + +
+
+ +
+ +
+ + +
+
+ + +
+ + Fatture Elettroniche + +
+ + +
+ € + 70 + + iva +
+ + +

+ Pacchetto Aggiuntivo +

+ + +
+ + +
+ +
+ + +

+ 1000 Fatture Elettroniche +

+ +
+ + + + Acquista + + +
+
+ +
+
+
+
+ + +
+
+ + + +
+
+ + +
+
+
+
+ + + + FAQ + + + +

+ Domande Frequenti +

+ + +

+ Rispondiamo alle domande più comuni che potresti avere. +

+ +
+
+
+
+ + +

+ Come procedo all'acquisto? +

+ + +

+ Per acquistare la licenza o un pacchetto aggiuntivo ti basta cliccare sul prodotto e una volta + aperto il carrello seguire la semplice procedura di acquisto, al termine del pagamento riceverei una + mail con i dati di attivzione entro 24 ore. +

+ + +

+ Come attivo la licenza d'uso? +

+ + +

+ Una volta terminata la procedura d'acquisto invieremo tramite e-mail (solitamente in giornata + all'email indicata) la fattura contenente i codici licenza necessari per l'attivazione + del software.
+ + I codici delle licenze sono calcolati in base alla partita iva della + vostra azienda, ed una volta concessa non può più essere modificata. + +

+ +
+
+ + +

+ Quanto dura la licenza? +

+ + +

+ La licenza ha una durata di 365 gg dalla data di acquisto; in caso l'acquisto venga effettuato prima + della scadenza la licenza verrà ricalcolata dalla data di scadenza. +

+ + +

+ Quali metodi di pagamenti sono accettati? +

+ + +

+ I metodi di pagamento accettati sono: carta di credito, carte prepagate o conto PayPal, altrimenti + tramite bonifico bancario.
+ In caso di pagamento tramite bonifico bancario al termine della procedura è consigliato stampare + l'ordine contenente tutti i dati necessari all'acquisto (Coordinate Bancarie ecc..) che dovrà + poi essere inviato insieme alla ricevuta di effettuato pagamento tramite email. + +

    +
  • + ... +
  • +
  • + ... +
  • +
  • + ... +
  • +
  • + ... +
  • +
  • + ... +
  • +
  • + ... +
  • +
+

+ +
+
+
+
diff --git a/application/modules/default/views/scripts/index/assistenza.phtml b/application/modules/default/views/scripts/index/assistenza.phtml new file mode 100644 index 0000000..8b91c48 --- /dev/null +++ b/application/modules/default/views/scripts/index/assistenza.phtml @@ -0,0 +1,269 @@ +
+
+
+
+ + +

+ Assistenza +

+ +
+
+ + + + Chiamaci + + +
+
+
+
+ + +
+ +
+
+
+
+ + +

+ L'Adriatica Sistemi fornisce assistenza dal lunedì al venerdì dalle ore 9:00 alle ore 13:00 nei + giorni lavorativi (con possibilità di tele-assistenza se si dispone di una linea ADSL). +

+ +

+ Per Fattura Facile l'assistenza è inclusa per tutta la durata della licenza. +

+ +

+ Per maggiori informazioni sull'assistenza clicca qui. +

+ + +

+ AGGIORNAMENTI +

+ +

+ I nostri software principali hanno la funzione di aggiornamento automatico. Se non è possibile + utilizzare l'aggiornamento automatico o il software non dispone di questa funzione è sufficiente + scaricare il programma completo ed installarlo sul computer da aggiornare (è importante non + disinstallare la versione precedentemente installata, l'installazione del pacchetto completo non + sovrascriverà mai i dati esistenti). +

+ + + +

+ MANUALI: +

+ + + + + + + + + + + + + + + + + + + + + + +

+ GUIDE: +

+ + + + + + + + + + + + +

+ DRIVER & UTILITY: +

+ + + + + +
+
+ + +
+
+ + +

+ Richiedi Assistenza Tecnica +

+ + +

+ Tramite il pulsante in basso portrai scaricare il software che permetterà ai nosstri tecnici + di collegarsi in teleassistenza. +

+ + Teleassistenza + + +
+ Telefono +
+ + +

+ +39 085 65690 +

+ + +
+ Email +
+ + +

+ info@adriaticasistetmi.it +

+ +
+
+ +
+
+
+
diff --git a/application/modules/default/views/scripts/index/caratteristiche.phtml b/application/modules/default/views/scripts/index/caratteristiche.phtml new file mode 100644 index 0000000..79ce878 --- /dev/null +++ b/application/modules/default/views/scripts/index/caratteristiche.phtml @@ -0,0 +1,578 @@ +
+
+
+
+ + + + Caratteristiche + + + +

+ Scopri tutte le funzionalità di Fattura Facile. +

+ +
+
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Caratteristica + + + + + +
+ +

+ GESTIONE DOCUMENTI +

+ +
    +
  • Fatture,D.D.T.,Preventivi
  • +
  • Ordini clienti / fornitori
  • +
  • Documenti da fornitore
  • +
  • Documenti parametrici
  • +
  • Creazione automatica e/o manuale della scadenze dei pagamenti
  • +
  • Gestione allegati
  • +
  • Creazione autotmatica articoli ed aggiornamento listino
  • +
  • Esportazione / importazione documenti
  • +
  • Fatture o altro documento direttamente da preventivi, DDT, ordini ...
  • +
  • Raggruppamento documenti
  • +
  • Ricerca avanzata documenti
  • +
  • Ri.Ba.
  • +
+ +
+ +
+ +

+ FATTURA ELETTRONICA +

+ +

+ Esportazione fatture in formato XML +

+ +

+ Funzionalità integrate nel software per: +

    +
  • Invio fatture elettroniche a clienti
  • +
  • Possivilità di invio automatico email di cortesia per le Fattura Elettroniche accettate dall'AdE
  • +
  • Ricezione fattura elettroniche da fornitore
  • +
  • Importazione fatture elettroniche
  • +
  • Firma automatica su tutti i documenti
  • +
  • Conservazione sostitutiva per 10 anni delle fatture elettroniche e notifiche +
  • Download massivo fatture elettroniche in formato xml
  • + +
+

+ +

+ Note: +

    +
  • 1.000 Fatture Elettroniche (attive + passive) incluse nella licenza d'uso, + cumulabili e senza scadenza. +
  • +
  • Il Codice Destinatario viene fornito all'attivazione del servizio di + Fatturazione Elettronica incluso nella licenza + (il Codice Destinatario deve essere inserito nel Cassetto Fiscale e comunicato + ai propri fornitori) +
  • +
  • Compatibile con sistemi successivi a Windows XP
  • +
  • Richiesta connessione ad Internet
  • +
  • Dimensione massima del file fattura elettronica con allegati: +
    < 500 kb invio verso privati +
    < 5.000 Kb verso Pubblica Amministrazione +
  • +
+

+ +
+ +
+ +

+ CONTATTI +

+ +
    +
  • Anagrafiche clienti/fornitori
  • +
  • Ricerca avanzata anagrafiche
  • +
  • Gestione allegati
  • +
  • Banca e pagamenti
  • +
  • Destinazione
  • +
  • Documenti
  • +
  • Crediti
  • +
  • Articoli
  • +
  • Stampa etichette
  • +
+ +
+ +
+ +

+ MAGAZZINO +

+ +
    +
  • Scheda articolo
  • +
  • Stampa etichette
  • +
  • Storico movimenti articoli
  • +
  • Lista articoli / sottoscora / ordinati
  • +
  • Creazione documento inventario / ordine
  • +
  • Calcolo valore magazzino
  • +
  • Listini (modifica, aggiornamento e stampa)
  • +
  • Notifica articoli sottoscorta
  • +
  • Gestione lotti
  • +
  • Gestione allegati
  • +
  • Inventario con riallineamento giacenze
  • +
+ +
+ +
+ +

+ SCADENZARIO +

+ +
    +
  • Scadenze pagamenti clienti e fornitori
  • +
  • Saldo parziale / totale scadenze
  • +
  • Notifica crediti in scadenza e/o scaduti
  • +
+ +
+ +
+ +

+ STATISTICHE +

+ +
    +
  • Lista documenti e totali per cliente
  • +
  • Totali e dettaglio articoli
  • +
  • Totali articoli per gruppi appartenenza
  • +
  • Totali per iva
  • +
  • Elenco clienti / fornitori
  • +
+ +
+ +
+ +

+ AGENDA +

+ +
    +
  • Gestione semplificata di appuntamenti ed impegni
  • +
+ +
+ +
+ +

+ CALENDARIO APPUNTAMENTI +

+ +
    +
  • Calendario e agenda professionale per la gestione degli appuntamenti
  • +
  • Ricerca avanzata e gestione stati appuntamento
  • +
  • Campi ed intervalli orari parametrici
  • +
+ +
+ +
+ +

+ PROMEMORIA +

+ +
    +
  • Gestione appunti
  • +
+ +
+ +
+ +

+ PRIMA NOTA +

+ +
    +
  • Inserimento manuale movimenti
  • +
  • Creazione automatica movimenti da registrazione documenti e saldo pagamenti.
  • +
  • (gestione regole per la creazione automatica dei movimenti)
  • +
+ +
+ +
+ +

+ AGENDA PAGAMENTI +

+ +
    +
  • Agenda indipendente per l'inserimento semplificato delle scadenze dei pagamenti
  • +
+ +
+ +
+ +

+ DIARIO PRESENZE +

+ +
    +
  • Agenda per memorizzare le ore di presenza dei collaboratori
  • +
+ +
+ +
+ +

+ AGENTI +

+ +
    +
  • Gestione agenti
  • +
  • Calcolo provvigioni con % su importo fatture
  • +
  • Calcolo provvigioni con tabella provvigioni (su articoli e sconti applicati)
  • +
  • Stampa e saldo provvigioni agenti
  • +
+ +
+ +
+ +

+ BANCO +

+ +
    +
  • Interfaccia grafica "vendita al banco"
  • +
  • Collegabile con misuratori fiscali*
  • +
  • Compatibile con monitor touch screen
  • +
  • Compatibile con stampantine termiche**
  • +
+ +

+ + *Tutti i misuratori che utilizzano il protocollo Xon-Xoff (per maggiori informazioni è consigliabile contattarci telefonicamente). +
**Stampanti dotati di driver per Windows. +
+

+ +
+ +
+ +

+ GESTIONE UTENTI +

+ +
    +
  • Gestione utenti e permessi
  • +
+ +
+ +
+ +

+ GESTIONE ARCHIVI +

+ +
    +
  • Creazione e manutenzione archivi
  • +
  • Backup manuale e/o automatico
  • +
  • Ottimizzazione archivio
  • +
+ +
+ +
+ +

+ UTILITY E VERTICALIZZAZIONI +

+ +
    +
  • Calcolatrice
  • +
  • Importazione anagrafiche contatti
  • +
  • Importazione anagrafiche articoli
  • +
  • Controllo e download automatico aggiornamenti software
  • +
  • Verticalizzazioni (carrozzeria, vetreria, panificio, mercato ittico)
  • +
  • Utility (calcolo superficie marmo, calcolo litri, calcolo quantità da prezzo totale)
  • +
  • Varie (lettere di sollecito, stampa bollettino postale td123)
  • +
+ +
+ +
+ +

+ PDF E INVIO EMAIL +

+ +
    +
  • Esportazione documenti in formato PDF ***
  • +
  • Invio automatico email di cortesia per le Fattura Elettroniche
  • +
+ +

+ + *** per sistemi precedenti a Window 10 è necessario utilizzare PDFCreator + +

+ +
+ +
+ +

+ ALTRO +

+ +
    +
  • Prezzi unitari fino a 6 decimali
  • +
  • Quantità fino a 4 decimali
  • +
  • Modalità prezzi iva inclusa / iva esclusa
  • +
  • Ritenuta d'acconto
  • +
  • Acconto, bollo, incentivo
  • +
  • Spese incasso, trasporto e varie
  • +
  • Gestione lotti
  • +
  • Campi aggiuntivi per matricole, colli
  • +
+ +
+ +
+ +

+ GESTIONE INTERVENTI +

+ +
    +
  • Interventi, calendario interventi, storico interventi (per la programmazione esterna delle assistenze)
  • +
  • Riparazioni, storico riparazioni (per la gestione interna delle riparazioni)
  • +
  • Apparecchiature clienti
  • +
  • Contratti, calendario contratti
  • +
  • Programmazione interventi
  • +
  • Ticket
  • +
+ +
+ +
+ +

+ MULTIPOSTAZIONE +

+ +
    +
  • Possibilità di lavorare contemporaneamente da più postazioni sullo stesso archivio (condiviso su rete ethernet con massimo 5 postazioni attive simultaneamente).
  • +
  • Possibilità' di utilizzare la licenza su tutti i computer dell'azienda (con stessa Partita IVA)
  • +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+ + +

+ Prova tutte le caratteristiche ... +

+ + +

+ Scarica il software gratuitamente e prova tutte le sue funzionalità +

+ + + + Provalo Ora + + +
+
+
+
+ + +
+
+ + + +
+
diff --git a/application/modules/default/views/scripts/index/copyright.phtml b/application/modules/default/views/scripts/index/copyright.phtml new file mode 100644 index 0000000..f92c3f5 --- /dev/null +++ b/application/modules/default/views/scripts/index/copyright.phtml @@ -0,0 +1,94 @@ +
+
+
+
+ + +

+ Copyright +

+ +
+
+
+
+ + +
+ +
+
+
+
+ + +

+ OGGETTO +

+ + +

+ Il servizio di assistenza telefonica, esclusivamente sui software della Adriatica Sistemi che la + prevedono, viene fornito dalle ore 8.30 alle 13.00 e dal lunedì al venerdì, esclusi i giorni festivi + e feriali non lavorativi per un massimo di 150 minuti annui, suddivisi in scatti da dieci minuti + ciascuno. Per le telefonate di durata inferiore a dieci minuti, verrà in ogni caso conteggiato uno + scatto o una chiamata, con un massimo di n. 15 telefonate annue. É esclusa la presenza in loco di + personale tecnico ed ogni fornitura di materiali o pezzi di ricambio. Il servizio di assistenza + telefonica fornisce al Cliente la possibilità di parlare al telefono con un tecnico che potrà anche + operare in teleassistenza (se il computer su cui bisogna intervenire dispone di una connessione + internet) e riguarda la risoluzione di problemi o la consulenza circa l'utilizzo di tutti i software + prodotti da Adriatica Sistemi, regolarmente acquistati e licenziati. Sono esclusi dal servizio i + prodotti in versione DEMO e i prodotti di terzi. Il mancato utilizzo delle telefonate a + disposizione, sia esso totale o parziale, non dà diritto alla restituzione del prezzo pattuito. +

+ + +

+ RISERVATEZZA +

+ +

+ La Adriatica Sistemi si impegna a prendere ogni ragionevole misura per assicurare che tutte le + informazioni di carattere segreto o riservato conosciute dal Cliente che rimangano tali, come pure + tutti i dati elaborati in ordine a quelle informazioni. +

+ + +

+ COPYRIGHT +

+ +

+ La Adriatica Sistemi rimane l'unica titolare dei diritti proprietari e di sfruttamento economico + relativi a invenzioni e programmi (inclusi software, documentazione e programmi scritti, studi, ecc) + e a quant'altro sia stato preparato, realizzato, sviluppato in funzione dei servizi acquistati dal + Cliente, al quale è concesso solo un diritto d'uso limitato e non trasferibile. +

+ +

RESPONSABILITA'

+ +

+ La Adriatica Sistemi si impegna ad impiegare la migliore tecnologia di cui è a conoscenza e le + migliori risorse a sua disposizione per fornire i Servizi oggetto del presente contratto. Il Cliente + conviene e concorda che Adriatica Sistemi non potrà in alcun caso essere ritenuta responsabile dei + ritardi o malfunzionamenti nella prestazione dei Servizi dipendenti da eventi fuori dal ragionevole + controllo della stessa quali, a titolo esemplificativo: (i) eventi di forza maggiore; (ii) eventi + dipendenti da fatto di terzi quali, a titolo meramente esemplificativo, l'interruzione o il + malfunzionamento dei servizi degli operatori di telecomunicazioni e/o delle linee elettriche; (iii) + malfunzionamento dei terminali o degli altri sistemi di comunicazione utilizzati dal Cliente. In + caso di interruzione del Servizio la Adriatica Sistemi si impegna a ripristinare il Servizio nel + minor tempo possibile. Il Cliente, inoltre, conviene e concorda che Adriatica Sistemi non potrà in + alcun caso essere ritenuta responsabile per atti od omissioni compiuti dal Cliente e in contrasto + con le obbligazioni da questi assunte ai sensi delle presenti condizioni o di quelle del singolo + software acquistato, così come non potrà essere ritenuta responsabile per malfunzionamenti dovuti a + vizi dei mezzi indispensabili all'accesso, ad un uso improprio degli stessi e/o delle modalità di + accesso al servizio da parte del Cliente o di terzi. La Adriatica Sistemi non potrà essere in nessun + caso ritenuta responsabile nei confronti del Cliente o di terzi per perdita di profitto, mancato + guadagno, né per qualsiasi altra forma di lucro cessante o danno indiretto e consequenziale connesso + all'esecuzione del presente contratto. +

+ +
+
+
+
diff --git a/application/modules/default/views/scripts/index/downloadsoftware.phtml b/application/modules/default/views/scripts/index/downloadsoftware.phtml new file mode 100644 index 0000000..7d4a849 --- /dev/null +++ b/application/modules/default/views/scripts/index/downloadsoftware.phtml @@ -0,0 +1,26 @@ + +
+
+
+
+ + +

+ Avvio del download ... +

+ + +

+ è in corso il download del software Fattura Facile
+ in caso non dovesse avviarsi automaticamente utilizzare il pulsante. +

+ + + + Scarica + + +
+
+
+
diff --git a/application/modules/default/views/scripts/index/index.phtml b/application/modules/default/views/scripts/index/index.phtml new file mode 100644 index 0000000..009e373 --- /dev/null +++ b/application/modules/default/views/scripts/index/index.phtml @@ -0,0 +1,380 @@ + +
+ + +
+ + + +
+ + +
+
+
+ + +
+ ... +
+ +
+
+ + +

+ Fattura + Facile +

+ + +

+ Il software gestionale che permette di gestire con estrema semplicità fatture, fatture elettroniche, + d.d.t., preventivi, magazzino e scadenze. +

+ + + + Download + + + Acquista + + +
+
+
+ +
+ + +
+
+
+
+ + +
+ + + + + + + +
+ + +

+ Gestione Documenti +

+ + +

+ Crea rapidamente e facilemente tutti i documenti di cui hai bisogno Fatture,Fatture Elettroniche, + D.D.T., Preventivi, Ordini clienti / fornitori, Documenti da fornitore +

+ +
+
+ + +
+ + + + + + + +
+ + +

+ Fattura Elettronica +

+ + +

+ Senza avvalersi di nessun altro strumento o servizio, inviare, firmare, ricevere e conservare le + Fatture Elettroniche, il tutto rapidamente e dall'interno del software. +

+ +
+
+ + +
+ + + + + + + +
+ + +

+ Contatti +

+ + +

+ Gestisci le anagrafiche clienti e sfrutta tutte le funzionalità di Ricerca avanzata, Gestione + allegati, Banca e pagamenti, Destinazioni, Articoli, Stampa etichette +

+ +
+
+ +
+
+ + +
+ + + + + + + +
+ + +

+ Magazzino +

+ + +

+ Gestione degli articoli di magazzino e generazione automatica dello storico dei movimenti, gestione + listini, e calcolo del valore di magazzino, lotti e allegati. +

+ +
+
+ + +
+ + + + + + + +
+ + +

+ Scadenzario +

+ + +

+ Consulta le scadenza dei pagamenti di clienti e fornotori, effettua un saldo parziale della + scadenza, notifica crediti in scadenza o scaduti. +

+ +
+
+ + +
+ + + + + + + + + +
+ + +

+ Statistiche +

+ + +

+ Consulta le statistiche per visualizzare la lista documenti e totali per cliente, o il dettaglio + articoli, totali iva ed elenco clienti / fornitori. +

+ +
+
+ + + +
+
+ +
+
+
+
+ + +
+
+
+
+ + +

+ Prezzi +

+ + +

+ Un unica licenza annuale con tutte le funzionalità incluse +

+ +
+
+
+
+ + +
+
+ + +
Enterprise
+ + +
+ € + 185 + + iva +
+ + +

+ Annuali +

+ + +
+ + + + + + + +

+ Gestione documenti +

+ +
+
+ + + + + + + +

+ Fatturazione elettronica con 1000 fatture incluse +

+ +
+
+ + + + + + + +

+ Gestione anagrafiche clienti e articoli +

+ +
+
+ + + + + + + +

+ Assistenza telefonica inclusa per un anno qui tutti i + dettagli +

+ +
+ +
+
+ +
+ +
+
+
+ + +
+
+
+
+ + +

+ Scopri tutte le caratteristiche ... +

+ + +

+ Scarica il software gratuitamente e prova tutte le sue funzionalità +

+ + + + Provalo Ora + + +
+
+
+
+ + +
+
+ + + +
+
diff --git a/application/modules/default/views/scripts/index/login.phtml b/application/modules/default/views/scripts/index/login.phtml new file mode 100644 index 0000000..e69de29 diff --git a/application/modules/default/views/scripts/index/offline.phtml b/application/modules/default/views/scripts/index/offline.phtml new file mode 100644 index 0000000..14be58a --- /dev/null +++ b/application/modules/default/views/scripts/index/offline.phtml @@ -0,0 +1,71 @@ + + + + + + + <?= $this->datiAziendali['NomeSito']; ?> + + + + + + + + + + diff --git a/application/modules/default/views/scripts/index/privacy.phtml b/application/modules/default/views/scripts/index/privacy.phtml new file mode 100644 index 0000000..e69de29 diff --git a/application/modules/default/views/scripts/index/resetpassword.phtml b/application/modules/default/views/scripts/index/resetpassword.phtml new file mode 100644 index 0000000..e69de29 diff --git a/application/modules/monitoring/Bootstrap.php b/application/modules/monitoring/Bootstrap.php new file mode 100644 index 0000000..444acfc --- /dev/null +++ b/application/modules/monitoring/Bootstrap.php @@ -0,0 +1,29 @@ +getRouter(); + + $router->addRoute( + 'monitoring', + new Zend_Controller_Router_Route('monitoring/:controller/:action', + array( + 'module'=>'monitoring', + 'controller'=>'index', + 'action'=>'index' + ) + ) + ); + + } + +} diff --git a/application/modules/monitoring/controllers/IndexController.php b/application/modules/monitoring/controllers/IndexController.php new file mode 100644 index 0000000..d6889da --- /dev/null +++ b/application/modules/monitoring/controllers/IndexController.php @@ -0,0 +1,115 @@ +_helper->layout->setLayout('admin'); + $this->_authService = new App_Service_Auth(); + $this->_genericModel = new Application_Model_Generic(); + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + + $this->_parametriSito = new App_Service_JsonConfiguration('parametri_sito'); + $this->_datiAziendali = new App_Service_JsonConfiguration('dati_aziendali'); + + $this->_MENUITEM = 'dashboard'; + $this->_PAGETITLE = 'DashBoard'; + $this->_ICONTITLE = 'fa-dashboard'; + + $this->_SECONDLEVEL = null; + $this->_SECONDLEVEL_ACTION = null; + + $this->_EVENTLOADER = FALSE; + + } + + public function preDispatch() + { + $this->view->moduleName = 'monitoring'; + + if ($this->_getParam('update')) { + $this->view->update = $this->_getParam('update'); + } else { + $this->view->update = '0'; + } + + if ($this->_getParam('err')) { + $this->view->error = $this->_getParam('err'); + } else { + $this->view->error = '0'; + } + + //Controllo delle notifiche + $nNot = $this->_genericModel->countFiltered('Errorlog', array('state = ?' => 1)); + $this->view->notification = $nNot; + if ($nNot > 0) { + $this->view->notificationlist = $this->_genericModel->customQuery("SELECT COUNT(*) as tot, section, state FROM `error_log` WHERE state = '1' GROUP BY section"); + } + + $this->_SIDEBAR_COLLAPSED = $_COOKIE['ui_sidebar_collapsed']; + + $this->view->enableTestSdk = $this->_ipManager->controllaAbilitazioneTestSdk(); + } + + public function postDispatch() + { + $this->view->action = $this->getRequest()->getActionName(); + + $this->view->menu = $this->_MENUITEM; + $this->view->pageTitle = $this->_PAGETITLE; + $this->view->iconTitle = $this->_ICONTITLE; + + $this->view->secondLevel = $this->_SECONDLEVEL; + $this->view->secondLevelAction = $this->_SECONDLEVEL_ACTION; + + $this->view->sideBarCollapsed = $this->_SIDEBAR_COLLAPSED; + + $this->view->eventLoader = $this->_EVENTLOADER; + + $this->view->parametriSito = $this->_parametriSito->getAllParams(); + $this->view->datiAziendali = $this->_datiAziendali->getAllParams(); + } + + public function logoutAction() + { + $this->_authService->clear(); + + return $this->_helper->redirector('index', 'index', 'default'); + } + + public function indexAction() + { + + } + + /*=============================================================================================== + * =========================== FUNZIONI PRIVATE DEL CONTROLLER ========================= + * =============================================================================================*/ + + public function getMainModel() + { + return $this->_genericModel; + } + + +} //Close Class diff --git a/application/modules/monitoring/views/scripts/index/_paginator.phtml b/application/modules/monitoring/views/scripts/index/_paginator.phtml new file mode 100644 index 0000000..c4fb69a --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/_paginator.phtml @@ -0,0 +1,47 @@ +pageCount > 1): ?> + + diff --git a/application/modules/monitoring/views/scripts/index/accesslog/_modal.phtml b/application/modules/monitoring/views/scripts/index/accesslog/_modal.phtml new file mode 100644 index 0000000..358c741 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/accesslog/_modal.phtml @@ -0,0 +1,54 @@ + diff --git a/application/modules/monitoring/views/scripts/index/accesslog/_searchBlock.phtml b/application/modules/monitoring/views/scripts/index/accesslog/_searchBlock.phtml new file mode 100644 index 0000000..24d42c2 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/accesslog/_searchBlock.phtml @@ -0,0 +1,26 @@ + +
+ + +
+ +
+ + +
+ +
+ CleanFiltersParam($this->search_params)); ?> +
+ + +
+
diff --git a/application/modules/monitoring/views/scripts/index/accesslog/list.phtml b/application/modules/monitoring/views/scripts/index/accesslog/list.phtml new file mode 100644 index 0000000..61aceaa --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/accesslog/list.phtml @@ -0,0 +1,170 @@ +
+ +
+ +
+ + + + + +
+ +
+ + isActiveNewInsert): ?> + + + + isActiveFilterModal): ?> + + + + + +
+ +
+ +
+ +
+
+ + + +
+ + + + render("index/$this->resourceName/th.phtml") ?> + + + + table) > 0): ?> + table as $key => $value): ?> + partial("index/$this->resourceName/td.phtml", $value) ?> + + + + + + + + + + + + +
+ + Nessun record presente + + + Nessun risultato trovato in base alla ricerca +
+
+ + + +
+ +isActiveModalDetail): ?> + render("index/$this->resourceName/_modal.phtml"); ?> + + +isActiveFilterModal): ?> + render("index/$this->resourceName/_modalFilter.phtml"); ?> + + +idDetail > 0): ?> + + + diff --git a/application/modules/monitoring/views/scripts/index/accesslog/td.phtml b/application/modules/monitoring/views/scripts/index/accesslog/td.phtml new file mode 100644 index 0000000..ce9ebf6 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/accesslog/td.phtml @@ -0,0 +1,41 @@ + + + + ExtractData($this->data, 'withtime', true); ?> + ip; ?> + + tipo): + case'admin': ?> + + + + + + + + + + + + + + tipo); ?> + + + +
+ +
+ + + + diff --git a/application/modules/monitoring/views/scripts/index/accesslog/th.phtml b/application/modules/monitoring/views/scripts/index/accesslog/th.phtml new file mode 100644 index 0000000..86546c2 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/accesslog/th.phtml @@ -0,0 +1,22 @@ + + + + + + Data + Ip + Tipo + + + diff --git a/application/modules/monitoring/views/scripts/index/errorlog/_modal.phtml b/application/modules/monitoring/views/scripts/index/errorlog/_modal.phtml new file mode 100644 index 0000000..42fb0d8 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/errorlog/_modal.phtml @@ -0,0 +1,45 @@ + diff --git a/application/modules/monitoring/views/scripts/index/errorlog/_searchBlock.phtml b/application/modules/monitoring/views/scripts/index/errorlog/_searchBlock.phtml new file mode 100644 index 0000000..171253a --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/errorlog/_searchBlock.phtml @@ -0,0 +1,32 @@ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ CleanFiltersParam($this->search_params)); ?> +
+ + +
+
diff --git a/application/modules/monitoring/views/scripts/index/errorlog/get.phtml b/application/modules/monitoring/views/scripts/index/errorlog/get.phtml new file mode 100644 index 0000000..f54ff60 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/errorlog/get.phtml @@ -0,0 +1,63 @@ + +

Url:
baseUrl; ?>url; ?>

+ +section === 'web_service'): ?> +
+
+

NomeDB:
db_name; ?>

+
+
+

Username:
username; ?>

+
+
+

Token:
token; ?>

+
+
+ + +
Messaggio:
+
+ msg; ?> +
+ + + +
Stack Trace:
+
+ + + + + + + + + trace as $key => $value): ?> + + + + + + + + +
FileLineFunctionClass
+
+
+
Parametri:
+
+ + + + + + + params as $key => $value): ?> + + + + + + +
ParametroValore
+
diff --git a/application/modules/monitoring/views/scripts/index/errorlog/list.phtml b/application/modules/monitoring/views/scripts/index/errorlog/list.phtml new file mode 100644 index 0000000..251dab9 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/errorlog/list.phtml @@ -0,0 +1,173 @@ +
+ +
+ +
+ + + + + +
+ +
+ + isActiveNewInsert): ?> + + + + isActiveFilterModal): ?> + + + + + +
+ +
+ +
+ +
+
+ + + +
+ + + + render("index/$this->resourceName/th.phtml") ?> + + + + table) > 0): ?> + table as $key => $value): ?> + partial("index/$this->resourceName/td.phtml", $value) ?> + + + + + + + + + + + + +
+ + Nessun record presente + + + Nessun risultato trovato in base alla ricerca +
+
+ + + +
+ +isActiveModalDetail): ?> + render("index/$this->resourceName/_modal.phtml"); ?> + + +isActiveFilterModal): ?> + render("index/$this->resourceName/_modalFilter.phtml"); ?> + + +idDetail > 0): ?> + + + diff --git a/application/modules/monitoring/views/scripts/index/errorlog/td.phtml b/application/modules/monitoring/views/scripts/index/errorlog/td.phtml new file mode 100644 index 0000000..d811a88 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/errorlog/td.phtml @@ -0,0 +1,60 @@ + + + + ExtractData($this->data,'withtime',true); ?> + msg); ?> + username); ?> + db_name); ?> + state): + case'1': ?> + New + + Pending + + Viewed + + Resolved + + + + section; ?> + +
+ + + state): + case'1': ?> + + + + + + + + + + + +
+ + + + diff --git a/application/modules/monitoring/views/scripts/index/errorlog/th.phtml b/application/modules/monitoring/views/scripts/index/errorlog/th.phtml new file mode 100644 index 0000000..6a76ceb --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/errorlog/th.phtml @@ -0,0 +1,25 @@ + + + + + + Data + Messaggio di errore + Username + Db Name + Stato + Section + + + diff --git a/application/modules/monitoring/views/scripts/index/index.phtml b/application/modules/monitoring/views/scripts/index/index.phtml new file mode 100644 index 0000000..e69de29 diff --git a/application/modules/monitoring/views/scripts/index/loginviiemails/_modal.phtml b/application/modules/monitoring/views/scripts/index/loginviiemails/_modal.phtml new file mode 100644 index 0000000..e7a8727 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/loginviiemails/_modal.phtml @@ -0,0 +1,45 @@ + diff --git a/application/modules/monitoring/views/scripts/index/loginviiemails/_searchBlock.phtml b/application/modules/monitoring/views/scripts/index/loginviiemails/_searchBlock.phtml new file mode 100644 index 0000000..2dd12af --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/loginviiemails/_searchBlock.phtml @@ -0,0 +1,27 @@ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ CleanFiltersParam($this->search_params)); ?> +
+ + +
+
diff --git a/application/modules/monitoring/views/scripts/index/loginviiemails/get.phtml b/application/modules/monitoring/views/scripts/index/loginviiemails/get.phtml new file mode 100644 index 0000000..b776523 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/loginviiemails/get.phtml @@ -0,0 +1,64 @@ + +

Data:
DataInvio; ?>

+ +
Messaggio:
+
+ message; ?> +
+ +
Processed:
+
+ + + + + + + + + processed_emails) <= 0): ?> + + + + + processed_emails as $key => $value): ?> + + + + + + + + + +
IdEmailStato PrecedenteNuovo Stato
Nessun invio
+
+
+
Errori:
+
+ + + + + + + + + errors) <= 0): ?> + + + + + errors as $key => $value): ?> + + + + + + + + + + +
EmailIdEmailStatoPrecedenteMessage
Nessun errore
+
diff --git a/application/modules/monitoring/views/scripts/index/loginviiemails/list.phtml b/application/modules/monitoring/views/scripts/index/loginviiemails/list.phtml new file mode 100644 index 0000000..1afef2a --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/loginviiemails/list.phtml @@ -0,0 +1,173 @@ +
+ +
+ +
+ + + + + +
+ +
+ + isActiveNewInsert): ?> + + + + isActiveFilterModal): ?> + + + + + +
+ +
+ +
+ +
+
+ + + +
+ + + + render("index/$this->resourceName/th.phtml") ?> + + + + table) > 0): ?> + table as $key => $value): ?> + partial("index/$this->resourceName/td.phtml", $value) ?> + + + + + + + + + + + + +
+ + Nessun record presente + + + Nessun risultato trovato in base alla ricerca +
+
+ + + +
+ +isActiveModalDetail): ?> + render("index/$this->resourceName/_modal.phtml"); ?> + + +isActiveFilterModal): ?> + render("index/$this->resourceName/_modalFilter.phtml"); ?> + + +idDetail > 0): ?> + + + diff --git a/application/modules/monitoring/views/scripts/index/loginviiemails/td.phtml b/application/modules/monitoring/views/scripts/index/loginviiemails/td.phtml new file mode 100644 index 0000000..8eaadbd --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/loginviiemails/td.phtml @@ -0,0 +1,19 @@ + + + + ExtractData($this->DataInvio,'withtime',true); ?> + message); ?> + + +
+ + +
+ + + + diff --git a/application/modules/monitoring/views/scripts/index/loginviiemails/th.phtml b/application/modules/monitoring/views/scripts/index/loginviiemails/th.phtml new file mode 100644 index 0000000..2425153 --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/loginviiemails/th.phtml @@ -0,0 +1,21 @@ + + + + + + Data + Messaggio + + + diff --git a/application/modules/monitoring/views/scripts/index/partial/notify.phtml b/application/modules/monitoring/views/scripts/index/partial/notify.phtml new file mode 100644 index 0000000..64751bc --- /dev/null +++ b/application/modules/monitoring/views/scripts/index/partial/notify.phtml @@ -0,0 +1,6 @@ + + + tot ?> errori per la sezione section ?> + + diff --git a/application/modules/v1/Bootstrap.php b/application/modules/v1/Bootstrap.php new file mode 100644 index 0000000..afc9102 --- /dev/null +++ b/application/modules/v1/Bootstrap.php @@ -0,0 +1,37 @@ +registerPlugin(new Zend_Controller_Plugin_PutHandler()); + } + + public function _initPersonalRouter() + { + $router = Zend_Controller_Front::getInstance()->getRouter(); + + $router->addRoute( + 'paginator', + new Zend_Controller_Router_Route('/:module/:controller/list/:page/:count/*', + array( + 'module' => 'v1', + 'action' => 'get' + ) + ) + ); + + $router->addRoute( + 'getmethod', + new Zend_Controller_Router_Route('/:module/:controller/m/:method/*', + array( + 'module' => 'v1', + 'action' => 'get' + ) + ) + ); + + } + +} diff --git a/application/modules/v1/controllers/IndexController.php b/application/modules/v1/controllers/IndexController.php new file mode 100644 index 0000000..a53831e --- /dev/null +++ b/application/modules/v1/controllers/IndexController.php @@ -0,0 +1,50 @@ +_resourceName = 'Abstract'; + parent::init(); + } + + public function indexAction() + { + try { + $this->_responseData->message = 'As Fb2b.net WS'; + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + $this->_responseData->message = $e->getMessage(); + $this->_responseData->trace = $e->getTrace(); + $this->sendResponse(); + } + } + + public function getAction() + { + $this->_responseData->message = 'Funzione non disponibile'; + $this->sendResponse(); + } + + public function postAction() + { + $this->_responseData->message = 'Funzione non disponibile'; + $this->sendResponse(); + } + + public function putAction() + { + $this->_responseData->message = 'Funzione non disponibile'; + $this->sendResponse(); + } + + public function deleteAction() + { + $this->_responseData->message = 'Funzione non disponibile'; + $this->sendResponse(); + } + + +}//END CLASS diff --git a/application/modules/v1/controllers/UsersController.php b/application/modules/v1/controllers/UsersController.php new file mode 100644 index 0000000..0e48a11 --- /dev/null +++ b/application/modules/v1/controllers/UsersController.php @@ -0,0 +1,48 @@ +_resourceName = 'Users'; + $this->_authInfo = new App_Service_Auth(); + parent::init(); + } + + public function postAction() + { + $this->disableCallAction(); + } + + public function putAction() + { + $this->disableCallAction(); + } + + public function deleteAction() + { + $this->disableCallAction(); + } + + //----------------------------------------------- + + public function switchMethodFunction($method) + { + switch ($method) { + default: + $this->defaultGetList(); + break; + } + } + + public function getSingleElementManipulate($data) + { + return array_diff_key($data, array_flip(array('token', 'password', 'staylogin'))); + } + + + +}//END CLASS diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..73695d0 --- /dev/null +++ b/composer.json @@ -0,0 +1,16 @@ +{ + "name": "adriaticasistemi/gestionespiaggia.it", + "description": "GestioneSpiaggia.it", + "type": "project", + "license": "proprietary", + "require": { + "shardj/zf1-future": "^1.19.5" + }, + "authors": [ + { + "name": "Adriatica Sistemi", + "email": "info@adriaticasistemi.it" + } + ], + "minimum-stability": "stable" +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..83c9814 --- /dev/null +++ b/index.php @@ -0,0 +1,3 @@ + "Tipo di dato non valido: il dato dev'essere di tipo float, stringa o intero.", + "'%value%' contains characters which are non alphabetic and no digits" => "'%value%' contiene caratteri che non sono alfanumerici", + "'%value%' is an empty string" => "'%value%' è una stringa vuota", + + // Zend_Validate_Alpha + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' contains non alphabetic characters" => "'%value%' contiene caratteri non alfabetici", + "'%value%' is an empty string" => "'%value%' è una stringa vuota", + + // Zend_Validate_Barcode + "'%value%' failed checksum validation" => "'%value%' non ha un checksum valido", + "'%value%' contains invalid characters" => "'%value%' contiene caratteri non permessi", + "'%value%' should have a length of %length% characters" => "'%value%' non ha la lunghezza corretta di %length% caratteri", + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + + // Zend_Validate_Between + "'%value%' is not between '%min%' and '%max%', inclusively" => "'%value%' non è compreso tra '%min%' e '%max%', inclusi", + "'%value%' is not strictly between '%min%' and '%max%'" => "'%value%' non è strettamente compreso tra '%min%' e '%max%'", + + // Zend_Validate_Callback + "'%value%' is not valid" => "'%value%' non è valido", + "Failure within the callback, exception returned" => "Callback fallita, eccezione ritornata", + + // Zend_Validate_Ccnum + "'%value%' must contain between 13 and 19 digits" => "'%value%' deve contenere tra 13 e 19 cifre", + "Luhn algorithm (mod-10 checksum) failed on '%value%'" => "L'algoritmo di Luhn (checksum mod-10) è fallito su '%value%'", + + // Zend_Validate_CreditCard + "Luhn algorithm (mod-10 checksum) failed on '%value%'" => "L'algoritmo di Luhn (checksum mod-10) è fallito su '%value%'", + "'%value%' must contain only digits" => "'%value%' deve contenere solo cifre", + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' contains an invalid amount of digits" => "'%value%' contiene un numero non valido di cifre", + "'%value%' is not from an allowed institute" => "'%value%' proviene da un istituto non supportato", + "Validation of '%value%' has been failed by the service" => "'%value%' non è stato validato dal servizio", + "The service returned a failure while validating '%value%'" => "Il servizio ha ritornato validazione negativa per '%value%'", + + // Zend_Validate_Date + "Invalid type given, value should be string, integer, array or Zend_Date" => "Tipo di dato non valido, il dato dev'essere di tipo stringa, intero, array o Zend_Date", + "'%value%' does not appear to be a valid date" => "'%value%' non sembra essere una data valida", + "'%value%' does not fit the date format '%format%'" => "'%value%' non corrisponde al formato data '%format%'", + + // Zend_Validate_Db_Abstract + "No record matching %value% was found" => "Non è stato trovato un record con valore %value%", + "A record matching %value% was found" => "E' già presente un record con valore %value%", + + // Zend_Validate_Digits + "Invalid type given, value should be float, string, or integer" => "Tipo di dato non valido: il dato dev'essere di tipo float, stringa o intero.", + "'%value%' contains characters which are not digits; but only digits are allowed" => "'%value%' contiene caratteri che non sono cifre, ma solo le cifre sono ammesse", + "'%value%' is an empty string" => "'%value%' è una stringa vuota", + + // Zend_Validate_EmailAddress + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' is not a valid email address in the basic format local-part@hostname" => "'%value%' non è un indirizzo email valido nel formato base local-part@hostname", + "'%hostname%' is not a valid hostname for email address '%value%'" => "'%hostname%' non è un hostname valido nell'indirizzo email '%value%'", + "'%hostname%' does not appear to have a valid MX record for the email address '%value%'" => "'%hostname%' non sembra avere un record MX DNS valido nell'indirizzo email %value%'", + "'%hostname%' is not in a routable network segment. The email address '%value%' should not be resolved from public network." => "'%hostname%' non è in un segmento di rete routabile. L'indirizzo email '%value%' non può essere risolto nella rete pubblica.", + "'%localPart%' can not be matched against dot-atom format" => "'%localPart%' non può essere validato nel formato dot-atom", + "'%localPart%' can not be matched against quoted-string format" => "'%localPart%' non può essere validato nel formato quoted-string", + "'%localPart%' is no valid local part for email address '%value%'" => "'%localPart%' non è una local part valida nell'indirizzo email '%value%'", + "'%value%' exceeds the allowed length" => "'%value%' supera la lunghezza consentita", + + // Zend_Validate_File_Count + "Too many files, maximum '%max%' are allowed but '%count%' are given" => "Troppi file, sono consentiti massimo '%max%' file ma ne sono stati passati '%count%'", + "Too few files, minimum '%min%' are expected but '%count%' are given" => "Troppi pochi file, sono attesi minimo '%min%' file ma ne sono stato passati solo '%count%'", + + // Zend_Validate_File_Crc32 + "File '%value%' does not match the given crc32 hashes" => "Il file '%value%' non ha un hash crc32 tra quelli consentiti", + "A crc32 hash could not be evaluated for the given file" => "L'hash crc32 non può essere calcolato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_ExcludeExtension + "File '%value%' has a false extension" => "Il file '%value%' ha un'estensione invalida", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_ExcludeMimeType + "File '%value%' has a false mimetype of '%type%'" => " Il file '%value%' ha un mimetype non consentito: '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere individuato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_Exists + "File '%value%' does not exist" => "Il file '%value%' non esiste", + + // Zend_Validate_File_Extension + "File '%value%' has a false extension" => "Il file '%value%' ha un'estensione invalida", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_FilesSize + "All files in sum should have a maximum size of '%max%' but '%size%' were detected" => "I file devono avere in totale una dimensione massima di '%max%' ma è stata rilevata una dimensione di '%size%'", + "All files in sum should have a minimum size of '%min%' but '%size%' were detected" => "I file devono avere in totale una dimensione minima di '%min%' ma è stata rilevata una dimensione di '%size%'", + "One or more files can not be read" => "Uno o più file non possono essere letti", + + // Zend_Validate_File_Hash + "File '%value%' does not match the given hashes" => "I file '%value%' non corrisponde agli hash dati", + "A hash could not be evaluated for the given file" => "Un hash non può essere valutato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_ImageSize + "Maximum allowed width for image '%value%' should be '%maxwidth%' but '%width%' detected" => "La larghezza massima consentita per l'immagine '%value%' è '%maxwidth%' ma è stata rilevata una larghezza di '%width%'", + "Minimum expected width for image '%value%' should be '%minwidth%' but '%width%' detected" => "La larghezza minima consentita per l'immagine '%value%' è '%minwidth%' ma è stata rilevata una larghezza di '%width%'", + "Maximum allowed height for image '%value%' should be '%maxheight%' but '%height%' detected" => "L'altezza massima consentita per l'immagine '%value%' è '%maxheight%' ma è stata rilevata un'altezza di '%height%'", + "Minimum expected height for image '%value%' should be '%minheight%' but '%height%' detected" => "L'altezza minima consentita per l'immagine '%value%' è '%minheight%' ma è stata rilevata un'altezza di '%height%'", + "The size of image '%value%' could not be detected" => "Le dimensioni dell'immagine '%value%' non possono essere rilevate", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_IsCompressed + "File '%value%' is not compressed, '%type%' detected" => "Il file '%value%' non è un file compresso, ma un file di tipo '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere rilevato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_IsImage + "File '%value%' is no image, '%type%' detected" => "Il file '%value%' non è un'immagine, ma un file di tipo '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere rilevato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_Md5 + "File '%value%' does not match the given md5 hashes" => "Il file '%value%' non corrisponde agli hash md5 dati", + "A md5 hash could not be evaluated for the given file" => "Un hash md5 non può essere valutato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_MimeType + "File '%value%' has a false mimetype of '%type%'" => "Il file '%value%' ha un mimetype invalido: '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere rilevato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_NotExists + "File '%value%' exists" => "Il file '%value%' esiste già", + + // Zend_Validate_File_Sha1 + "File '%value%' does not match the given sha1 hashes" => "Il file '%value%' non corrisponde agli hash sha1 dati", + "A sha1 hash could not be evaluated for the given file" => "Un hash sha1 non può essere valutato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_Size + "Maximum allowed size for file '%value%' is '%max%' but '%size%' detected" => "La dimensione massima consentita per il file '%value%' è '%max%' ma è stata rilevata una dimensione di '%size%'", + "Minimum expected size for file '%value%' is '%min%' but '%size%' detected" => "La dimensione minima consentita per il file '%value%' è '%min%' ma è stata rilevata una dimensione di '%size%'", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_Upload + "File '%value%' exceeds the defined ini size" => "Il file '%value%' eccede la dimensione definita nell'ini", + "File '%value%' exceeds the defined form size" => "Il file '%value%' eccede la dimensione definita nella form", + "File '%value%' was only partially uploaded" => "Il file '%value%' è stato caricato solo parzialmente", + "File '%value%' was not uploaded" => "Il file '%value%' non è stato caricato", + "No temporary directory was found for file '%value%'" => "Non è stata trovata una directory temporanea per il file '%value%'", + "File '%value%' can't be written" => "Il file '%value%' non può essere scritto", + "A PHP extension returned an error while uploading the file '%value%'" => "Un'estensione di PHP ha generato un errore durante il caricamento del file '%value%'", + "File '%value%' was illegally uploaded. This could be a possible attack" => "Il file '%value%' è stato caricato irregolarmente. Potrebbe trattarsi di un attacco", + "File '%value%' was not found" => "Il file '%value%' non è stato trovato", + "Unknown error while uploading file '%value%'" => "Errore sconosciuto durante il caricamento del file '%value%'", + + // Zend_Validate_File_WordCount + "Too much words, maximum '%max%' are allowed but '%count%' were counted" => "Il file contiene troppe parole, ne sono consentite massimo '%max%' ma ne sono state contate '%count%'", + "Too less words, minimum '%min%' are expected but '%count%' were counted" => "Il file contiene troppe poche parole, ne sono consentite minimo '%min%' ma ne sono state contate '%count%'", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_Float + "Invalid type given, value should be float, string, or integer" => "Tipo di dato non valido: il dato dev'essere di tipo float, stringa o intero.", + "'%value%' does not appear to be a float" => "'%value%' non sembra essere un dato di tipo float", + + // Zend_Validate_GreaterThan + "'%value%' is not greater than '%min%'" => "'%value%' non è maggiore di '%min%'", + + // Zend_Validate_Hex + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' has not only hexadecimal digit characters" => "'%value%' non è composto solo da caratteri esadecimali", + + // Zend_Validate_Hostname + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' appears to be an IP address, but IP addresses are not allowed" => "'%value%' sembra essere un indirizzo IP, ma gli indirizzi IP non sono consentiti", + "'%value%' appears to be a DNS hostname but cannot match TLD against known list" => "'%value%' sembra essere un hostname DNS ma il suo TLD è sconosciuto", + "'%value%' appears to be a DNS hostname but contains a dash in an invalid position" => "'%value%' sembra essere un hostname DNS ma contiene un trattino in una posizione non valida", + "'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'" => "'%value%' sembra essere un hostname DNS ma non rispetta lo schema per il TLD '%tld%'", + "'%value%' appears to be a DNS hostname but cannot extract TLD part" => "'%value%' sembra essere un hostname DNS ma non è possibile estrarne il TLD", + "'%value%' does not match the expected structure for a DNS hostname" => "'%value%' non sembra rispettare la struttura attesa per un hostname DNS", + "'%value%' does not appear to be a valid local network name" => "'%value%' non sembra essere un local network name valido", + "'%value%' appears to be a local network name but local network names are not allowed" => "'%value%' sembra essere un local network name, ma i local network names non sono consentiti", + "'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded" => "'%value%' sembra essere un hostname DNS ma la notazione punycode data non può essere decodificata", + + // Zend_Validate_Iban + "Unknown country within the IBAN '%value%'" => "Country Code sconosciuto nell'IBAN '%value%'", + "'%value%' has a false IBAN format" => "'%value%' ha un formato IBAN non valido", + "'%value%' has failed the IBAN check" => "'%value%' ha fallito il controllo IBAN", + + // Zend_Validate_Identical + "The token '%token%' does not match the given token '%value%'" => "Il token '%token%' non corrisponde al token dato '%value%'", + "No token was provided to match against" => "Non è stato dato nessun token per il confronto", + "The two given tokens do not match" => "I due campi non corrispondono", + + // Zend_Validate_InArray + "'%value%' was not found in the haystack" => "'%value%' non è stato trovato nell'array", + + // Zend_Validate_Int + "Invalid type given, value should be string or integer" => "Tipo di dato non valido, il dato dev'essere una stringa o un intero", + "'%value%' does not appear to be an integer" => "'%value%' non sembra essere un intero", + + // Zend_Validate_Ip + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' does not appear to be a valid IP address" => "'%value%' non sembra essere un indirizzo IP valido", + + // Zend_Validate_Isbn + "Invalid type given, value should be string or integer" => "Tipo di dato non valido, il dato dev'essere una stringa o un intero", + "'%value%' is no valid ISBN number" => "'%value%' non è un numero ISBN valido", + + // Zend_Validate_LessThan + "'%value%' is not less than '%max%'" => "'%value%' non è minore di '%max%'", + + // Zend_Validate_NotEmpty + "Invalid type given, value should be float, string, array, boolean or integer" => "Tipo di dato non valido, il dato dev'essere di tipo float, stringa, array, booleano o intero", + "Value is required and can't be empty" => "Campo obbligatorio", + + // Zend_Validate_PostCode + "Invalid type given. The value should be a string or a integer" => "Tipo di dato non valido. Il dato dev'essere una stringa o un intero", + "'%value%' does not appear to be a postal code" => "'%value%' non sembra essere un codice postale", + + // Zend_Validate_Regex + "Invalid type given, value should be string, integer or float" => "Tipo di dato non valido: il dato dev'essere di tipo stringa, intero o float.", + "'%value%' does not match against pattern '%pattern%'" => "'%value%' non corrisponde al pattern '%pattern%'", + "There was an internal error while using the pattern '%pattern%'" => "Si è verificato un errore interno usando il pattern '%pattern%'", + + // Zend_Validate_Sitemap_Changefreq + "'%value%' is no valid sitemap changefreq" => "'%value%' non è una sitemap changefreq valida", + "Invalid type given, the value should be a string" => "Invalid type given, the value should be a string", + + // Zend_Validate_Sitemap_Lastmod + "'%value%' is no valid sitemap lastmod" => "'%value%' non è un sitemap lastmod valido", + "Invalid type given, the value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + + // Zend_Validate_Sitemap_Loc + "'%value%' is no valid sitemap location" => "'%value%' non è una sitemap location valida", + "Invalid type given, the value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + + // Zend_Validate_Sitemap_Priority + "'%value%' is no valid sitemap priority" => "'%value%' non è una sitemap priority valida", + "Invalid type given, the value should be a integer, a float or a numeric string" => "Tipo di dato non valido, il dato dev'essere di tipo intero, float o una stringa numerica", + + // Zend_Validate_StringLength + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' is less than %min% characters long" => "'%value%' è meno lungo di %min% caratteri", + "'%value%' is more than %max% characters long" => "'%value%' è più lungo di %max% caratteri", + + // Zend_Validate_DbRecordExist + "No record matching '%value%' was found"=>"Il valore '%value%' non risulta valido" +); diff --git a/languages/it/Zend_Validate.php b/languages/it/Zend_Validate.php new file mode 100644 index 0000000..9b1fb19 --- /dev/null +++ b/languages/it/Zend_Validate.php @@ -0,0 +1,269 @@ + "Tipo di dato non valido: il dato dev'essere di tipo float, stringa o intero.", + "'%value%' contains characters which are non alphabetic and no digits" => "'%value%' contiene caratteri che non sono alfanumerici", + "'%value%' is an empty string" => "'%value%' è una stringa vuota", + + // Zend_Validate_Alpha + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' contains non alphabetic characters" => "'%value%' contiene caratteri non alfabetici", + "'%value%' is an empty string" => "'%value%' è una stringa vuota", + + // Zend_Validate_Barcode + "'%value%' failed checksum validation" => "'%value%' non ha un checksum valido", + "'%value%' contains invalid characters" => "'%value%' contiene caratteri non permessi", + "'%value%' should have a length of %length% characters" => "'%value%' non ha la lunghezza corretta di %length% caratteri", + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + + // Zend_Validate_Between + "'%value%' is not between '%min%' and '%max%', inclusively" => "'%value%' non è compreso tra '%min%' e '%max%', inclusi", + "'%value%' is not strictly between '%min%' and '%max%'" => "'%value%' non è strettamente compreso tra '%min%' e '%max%'", + + // Zend_Validate_Callback + "'%value%' is not valid" => "'%value%' non è valido", + "Failure within the callback, exception returned" => "Callback fallita, eccezione ritornata", + + // Zend_Validate_Ccnum + "'%value%' must contain between 13 and 19 digits" => "'%value%' deve contenere tra 13 e 19 cifre", + "Luhn algorithm (mod-10 checksum) failed on '%value%'" => "L'algoritmo di Luhn (checksum mod-10) è fallito su '%value%'", + + // Zend_Validate_CreditCard + "Luhn algorithm (mod-10 checksum) failed on '%value%'" => "L'algoritmo di Luhn (checksum mod-10) è fallito su '%value%'", + "'%value%' must contain only digits" => "'%value%' deve contenere solo cifre", + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' contains an invalid amount of digits" => "'%value%' contiene un numero non valido di cifre", + "'%value%' is not from an allowed institute" => "'%value%' proviene da un istituto non supportato", + "Validation of '%value%' has been failed by the service" => "'%value%' non è stato validato dal servizio", + "The service returned a failure while validating '%value%'" => "Il servizio ha ritornato validazione negativa per '%value%'", + + // Zend_Validate_Date + "Invalid type given, value should be string, integer, array or Zend_Date" => "Tipo di dato non valido, il dato dev'essere di tipo stringa, intero, array o Zend_Date", + "'%value%' does not appear to be a valid date" => "'%value%' non sembra essere una data valida", + "'%value%' does not fit the date format '%format%'" => "'%value%' non corrisponde al formato data '%format%'", + + // Zend_Validate_Db_Abstract + "No record matching %value% was found" => "Non è stato trovato un record con valore %value%", + "A record matching %value% was found" => "E' già presente un record con valore %value%", + + // Zend_Validate_Digits + "Invalid type given, value should be float, string, or integer" => "Tipo di dato non valido: il dato dev'essere di tipo float, stringa o intero.", + "'%value%' contains characters which are not digits; but only digits are allowed" => "'%value%' contiene caratteri che non sono cifre, ma solo le cifre sono ammesse", + "'%value%' is an empty string" => "'%value%' è una stringa vuota", + + // Zend_Validate_EmailAddress + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' is not a valid email address in the basic format local-part@hostname" => "'%value%' non è un indirizzo email valido nel formato base local-part@hostname", + "'%hostname%' is not a valid hostname for email address '%value%'" => "'%hostname%' non è un hostname valido nell'indirizzo email '%value%'", + "'%hostname%' does not appear to have a valid MX record for the email address '%value%'" => "'%hostname%' non sembra avere un record MX DNS valido nell'indirizzo email %value%'", + "'%hostname%' is not in a routable network segment. The email address '%value%' should not be resolved from public network." => "'%hostname%' non è in un segmento di rete routabile. L'indirizzo email '%value%' non può essere risolto nella rete pubblica.", + "'%localPart%' can not be matched against dot-atom format" => "'%localPart%' non può essere validato nel formato dot-atom", + "'%localPart%' can not be matched against quoted-string format" => "'%localPart%' non può essere validato nel formato quoted-string", + "'%localPart%' is no valid local part for email address '%value%'" => "'%localPart%' non è una local part valida nell'indirizzo email '%value%'", + "'%value%' exceeds the allowed length" => "'%value%' supera la lunghezza consentita", + + // Zend_Validate_File_Count + "Too many files, maximum '%max%' are allowed but '%count%' are given" => "Troppi file, sono consentiti massimo '%max%' file ma ne sono stati passati '%count%'", + "Too few files, minimum '%min%' are expected but '%count%' are given" => "Troppi pochi file, sono attesi minimo '%min%' file ma ne sono stato passati solo '%count%'", + + // Zend_Validate_File_Crc32 + "File '%value%' does not match the given crc32 hashes" => "Il file '%value%' non ha un hash crc32 tra quelli consentiti", + "A crc32 hash could not be evaluated for the given file" => "L'hash crc32 non può essere calcolato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_ExcludeExtension + "File '%value%' has a false extension" => "Il file '%value%' ha un'estensione invalida", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_ExcludeMimeType + "File '%value%' has a false mimetype of '%type%'" => " Il file '%value%' ha un mimetype non consentito: '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere individuato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_Exists + "File '%value%' does not exist" => "Il file '%value%' non esiste", + + // Zend_Validate_File_Extension + "File '%value%' has a false extension" => "Il file '%value%' ha un'estensione invalida", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_FilesSize + "All files in sum should have a maximum size of '%max%' but '%size%' were detected" => "I file devono avere in totale una dimensione massima di '%max%' ma è stata rilevata una dimensione di '%size%'", + "All files in sum should have a minimum size of '%min%' but '%size%' were detected" => "I file devono avere in totale una dimensione minima di '%min%' ma è stata rilevata una dimensione di '%size%'", + "One or more files can not be read" => "Uno o più file non possono essere letti", + + // Zend_Validate_File_Hash + "File '%value%' does not match the given hashes" => "I file '%value%' non corrisponde agli hash dati", + "A hash could not be evaluated for the given file" => "Un hash non può essere valutato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_ImageSize + "Maximum allowed width for image '%value%' should be '%maxwidth%' but '%width%' detected" => "La larghezza massima consentita per l'immagine '%value%' è '%maxwidth%' ma è stata rilevata una larghezza di '%width%'", + "Minimum expected width for image '%value%' should be '%minwidth%' but '%width%' detected" => "La larghezza minima consentita per l'immagine '%value%' è '%minwidth%' ma è stata rilevata una larghezza di '%width%'", + "Maximum allowed height for image '%value%' should be '%maxheight%' but '%height%' detected" => "L'altezza massima consentita per l'immagine '%value%' è '%maxheight%' ma è stata rilevata un'altezza di '%height%'", + "Minimum expected height for image '%value%' should be '%minheight%' but '%height%' detected" => "L'altezza minima consentita per l'immagine '%value%' è '%minheight%' ma è stata rilevata un'altezza di '%height%'", + "The size of image '%value%' could not be detected" => "Le dimensioni dell'immagine '%value%' non possono essere rilevate", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_IsCompressed + "File '%value%' is not compressed, '%type%' detected" => "Il file '%value%' non è un file compresso, ma un file di tipo '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere rilevato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_IsImage + "File '%value%' is no image, '%type%' detected" => "Il file '%value%' non è un'immagine, ma un file di tipo '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere rilevato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_Md5 + "File '%value%' does not match the given md5 hashes" => "Il file '%value%' non corrisponde agli hash md5 dati", + "A md5 hash could not be evaluated for the given file" => "Un hash md5 non può essere valutato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_MimeType + "File '%value%' has a false mimetype of '%type%'" => "Il file '%value%' ha un mimetype invalido: '%type%'", + "The mimetype of file '%value%' could not be detected" => "Il mimetype del file '%value%' non può essere rilevato", + "File '%value%' can not be read" => "Il file '%value%' non può essere letto", + + // Zend_Validate_File_NotExists + "File '%value%' exists" => "Il file '%value%' esiste già", + + // Zend_Validate_File_Sha1 + "File '%value%' does not match the given sha1 hashes" => "Il file '%value%' non corrisponde agli hash sha1 dati", + "A sha1 hash could not be evaluated for the given file" => "Un hash sha1 non può essere valutato per il file dato", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_Size + "Maximum allowed size for file '%value%' is '%max%' but '%size%' detected" => "La dimensione massima consentita per il file '%value%' è '%max%' ma è stata rilevata una dimensione di '%size%'", + "Minimum expected size for file '%value%' is '%min%' but '%size%' detected" => "La dimensione minima consentita per il file '%value%' è '%min%' ma è stata rilevata una dimensione di '%size%'", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_File_Upload + "File '%value%' exceeds the defined ini size" => "Il file '%value%' eccede la dimensione definita nell'ini", + "File '%value%' exceeds the defined form size" => "Il file '%value%' eccede la dimensione definita nella form", + "File '%value%' was only partially uploaded" => "Il file '%value%' è stato caricato solo parzialmente", + "File '%value%' was not uploaded" => "Il file '%value%' non è stato caricato", + "No temporary directory was found for file '%value%'" => "Non è stata trovata una directory temporanea per il file '%value%'", + "File '%value%' can't be written" => "Il file '%value%' non può essere scritto", + "A PHP extension returned an error while uploading the file '%value%'" => "Un'estensione di PHP ha generato un errore durante il caricamento del file '%value%'", + "File '%value%' was illegally uploaded. This could be a possible attack" => "Il file '%value%' è stato caricato irregolarmente. Potrebbe trattarsi di un attacco", + "File '%value%' was not found" => "Il file '%value%' non è stato trovato", + "Unknown error while uploading file '%value%'" => "Errore sconosciuto durante il caricamento del file '%value%'", + + // Zend_Validate_File_WordCount + "Too much words, maximum '%max%' are allowed but '%count%' were counted" => "Il file contiene troppe parole, ne sono consentite massimo '%max%' ma ne sono state contate '%count%'", + "Too less words, minimum '%min%' are expected but '%count%' were counted" => "Il file contiene troppe poche parole, ne sono consentite minimo '%min%' ma ne sono state contate '%count%'", + "File '%value%' could not be found" => "Il file '%value%' non può essere trovato", + + // Zend_Validate_Float + "Invalid type given, value should be float, string, or integer" => "Tipo di dato non valido: il dato dev'essere di tipo float, stringa o intero.", + "'%value%' does not appear to be a float" => "'%value%' non sembra essere un dato di tipo float", + + // Zend_Validate_GreaterThan + "'%value%' is not greater than '%min%'" => "'%value%' non è maggiore di '%min%'", + + // Zend_Validate_Hex + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' has not only hexadecimal digit characters" => "'%value%' non è composto solo da caratteri esadecimali", + + // Zend_Validate_Hostname + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' appears to be an IP address, but IP addresses are not allowed" => "'%value%' sembra essere un indirizzo IP, ma gli indirizzi IP non sono consentiti", + "'%value%' appears to be a DNS hostname but cannot match TLD against known list" => "'%value%' sembra essere un hostname DNS ma il suo TLD è sconosciuto", + "'%value%' appears to be a DNS hostname but contains a dash in an invalid position" => "'%value%' sembra essere un hostname DNS ma contiene un trattino in una posizione non valida", + "'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'" => "'%value%' sembra essere un hostname DNS ma non rispetta lo schema per il TLD '%tld%'", + "'%value%' appears to be a DNS hostname but cannot extract TLD part" => "'%value%' sembra essere un hostname DNS ma non è possibile estrarne il TLD", + "'%value%' does not match the expected structure for a DNS hostname" => "'%value%' non sembra rispettare la struttura attesa per un hostname DNS", + "'%value%' does not appear to be a valid local network name" => "'%value%' non sembra essere un local network name valido", + "'%value%' appears to be a local network name but local network names are not allowed" => "'%value%' sembra essere un local network name, ma i local network names non sono consentiti", + "'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded" => "'%value%' sembra essere un hostname DNS ma la notazione punycode data non può essere decodificata", + + // Zend_Validate_Iban + "Unknown country within the IBAN '%value%'" => "Country Code sconosciuto nell'IBAN '%value%'", + "'%value%' has a false IBAN format" => "'%value%' ha un formato IBAN non valido", + "'%value%' has failed the IBAN check" => "'%value%' ha fallito il controllo IBAN", + + // Zend_Validate_Identical + "The token '%token%' does not match the given token '%value%'" => "Il token '%token%' non corrisponde al token dato '%value%'", + "No token was provided to match against" => "Non è stato dato nessun token per il confronto", + "The two given tokens do not match" => "I due campi non corrispondono", + + // Zend_Validate_InArray + "'%value%' was not found in the haystack" => "'%value%' non è stato trovato nell'array", + + // Zend_Validate_Int + "Invalid type given, value should be string or integer" => "Tipo di dato non valido, il dato dev'essere una stringa o un intero", + "'%value%' does not appear to be an integer" => "'%value%' non sembra essere un intero", + + // Zend_Validate_Ip + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' does not appear to be a valid IP address" => "'%value%' non sembra essere un indirizzo IP valido", + + // Zend_Validate_Isbn + "Invalid type given, value should be string or integer" => "Tipo di dato non valido, il dato dev'essere una stringa o un intero", + "'%value%' is no valid ISBN number" => "'%value%' non è un numero ISBN valido", + + // Zend_Validate_LessThan + "'%value%' is not less than '%max%'" => "'%value%' non è minore di '%max%'", + + // Zend_Validate_NotEmpty + "Invalid type given, value should be float, string, array, boolean or integer" => "Tipo di dato non valido, il dato dev'essere di tipo float, stringa, array, booleano o intero", + "Value is required and can't be empty" => "Campo obbligatorio", + + // Zend_Validate_PostCode + "Invalid type given. The value should be a string or a integer" => "Tipo di dato non valido. Il dato dev'essere una stringa o un intero", + "'%value%' does not appear to be a postal code" => "'%value%' non sembra essere un codice postale", + + // Zend_Validate_Regex + "Invalid type given, value should be string, integer or float" => "Tipo di dato non valido: il dato dev'essere di tipo stringa, intero o float.", + "'%value%' does not match against pattern '%pattern%'" => "'%value%' non corrisponde al pattern '%pattern%'", + "There was an internal error while using the pattern '%pattern%'" => "Si è verificato un errore interno usando il pattern '%pattern%'", + + // Zend_Validate_Sitemap_Changefreq + "'%value%' is no valid sitemap changefreq" => "'%value%' non è una sitemap changefreq valida", + "Invalid type given, the value should be a string" => "Invalid type given, the value should be a string", + + // Zend_Validate_Sitemap_Lastmod + "'%value%' is no valid sitemap lastmod" => "'%value%' non è un sitemap lastmod valido", + "Invalid type given, the value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + + // Zend_Validate_Sitemap_Loc + "'%value%' is no valid sitemap location" => "'%value%' non è una sitemap location valida", + "Invalid type given, the value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + + // Zend_Validate_Sitemap_Priority + "'%value%' is no valid sitemap priority" => "'%value%' non è una sitemap priority valida", + "Invalid type given, the value should be a integer, a float or a numeric string" => "Tipo di dato non valido, il dato dev'essere di tipo intero, float o una stringa numerica", + + // Zend_Validate_StringLength + "Invalid type given, value should be a string" => "Tipo di dato non valido, il dato dev'essere una stringa", + "'%value%' is less than %min% characters long" => "'%value%' è meno lungo di %min% caratteri", + "'%value%' is more than %max% characters long" => "'%value%' è più lungo di %max% caratteri", + + // Zend_Validate_DbRecordExist + "No record matching '%value%' was found"=>"Il valore '%value%' non risulta valido" +); diff --git a/library/App/Constants/Domains.php b/library/App/Constants/Domains.php new file mode 100644 index 0000000..d2e9865 --- /dev/null +++ b/library/App/Constants/Domains.php @@ -0,0 +1,42 @@ + + [ + 'admin' => ['name' => 'Amministratore', 'icon' => 'user-cog', 'color' => ''], + 'user' => ['name' => 'Utente', 'icon' => 'user', 'color' => ''] + ], + self::DOMAIN_SOFTWARE => + [ + 'Winfatt' => ['name' => 'Winfatt', 'icon' => '', 'color' => ''], + 'GestioneSpiaggia' => ['name' => 'Gestione Spiaggia', 'icon' => '', 'color' => ''], + 'Webfatt' => ['name' => 'Webfatt', 'icon' => '', 'color' => ''] + ], + self::DOMAIN_NAME_STATI_INVIO_EMAILS => + [ + 'DaInviare' => ['name' => 'Da Inviare', 'icon' => 'user-cog', 'color' => 'gray'], + 'InElaborazione' => ['name' => 'In Elaborazione', 'icon' => 'user-cog', 'color' => 'warning'], + 'Inviato' => ['name' => 'Inviato', 'icon' => 'user-cog', 'color' => 'success'], + 'Annullato' => ['name' => 'Annullato', 'icon' => 'user-cog', 'color' => 'danger'], + ], + self::DOMAIN_NAME_STATIFE => + [ + 'AC' => ['name' => 'In Attesa Consegna', 'icon' => '', 'color' => 'gray'], + 'RC' => ['name' => 'Consegnata', 'icon' => '', 'color' => 'success'], + 'NS' => ['name' => 'Scartata', 'icon' => '', 'color' => 'danger'], + 'MC' => ['name' => 'Mancata Consegna', 'icon' => '', 'color' => 'warning'], + // 'DT' => ['name' => 'Decorrenza Termini', 'icon' => '', 'color' => ''], + // 'EC_ACCETTAZIONE' => ['name' => 'Accettata', 'icon' => '', 'color' => ''], + // 'EC_RIFIUTO' => ['name' => 'Rifiutata', 'icon' => '', 'color' => ''], + ], + ]; + +} diff --git a/library/App/Controller/Errors/WebServiceError.php b/library/App/Controller/Errors/WebServiceError.php new file mode 100644 index 0000000..f934f8d --- /dev/null +++ b/library/App/Controller/Errors/WebServiceError.php @@ -0,0 +1,53 @@ +_message = $message; + $this->_errorDetail = $errorDetail; + $this->_errorCode = $errorCode; + } + + public function getMyMessage() + { + return $this->_message; + } + + public function getErrorDetail() + { + return $this->_errorDetail; + } + + public function getErrorCode() + { + return $this->_errorCode; + } + +} diff --git a/library/App/Controller/Plugin/Acl.php b/library/App/Controller/Plugin/Acl.php new file mode 100644 index 0000000..fcf6994 --- /dev/null +++ b/library/App/Controller/Plugin/Acl.php @@ -0,0 +1,264 @@ +_genericModel = new Application_Model_Generic(); + $this->_auth = Zend_Auth::getInstance(); + $this->_acl = new App_Model_Acl_Acl(); + $this->_aclRestV1 = new App_Model_Acl_AclRestV1(); + + $this->_role = !$this->_auth->hasIdentity() ? 'unregistered' : $this->_auth->getIdentity()->role; + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + + } + + public function preDispatch(Zend_Controller_Request_Abstract $request) + { + + //Gestione degli accessi separati per i vari moduli + /** + * V1 = Web Service di tipo REST per interfacciarsi verso lesterno [Accesso Tramite TOKEN] + * DEFAULT | AUTH: Accesso normale del sito + * ADMIN: Accesso solo per l'utente admin + */ + + switch ($request->getModuleName()) { + //Il modulo default e auth non hanno bisogno di autenticazione quindi imposto user come 'unregistered' e vado avanti + case'default': + case'auth': + $this->_role = 'unregistered'; + if (!$this->_acl->isAllowed($this->_role, $request->getModuleName())) { + $this->denyAccess(); + } + return; + case 'admin': + case 'user': + case 'monitoring': + if (!$this->_acl->isAllowed($this->_role, $request->getModuleName())) { + $this->_auth->clearIdentity(); + $this->_redirectLogin($request); + } + return; + case'v1': + //controllo se il web services non è offline + if ($this->_configs->get('interrutore_webservices_v1') == 'off' && !$this->_ipManager->allowedIp()) { + $this->_redirectOffline($request); + } + + //controllo il web services ad accesso libero + $this->_role = 'unregistered'; + if (!$this->_aclRestV1->isAllowed(trim($this->_role), $request->getControllerName())) { + //Se il controller non è abilitato all'accesso libero allora procedo con l'autenticazione server v1 tramite token + $this->accessoV1($request, $request->getHeader(self::AUTHORIZATION_HEADER)); + } else { + if (Zend_Registry::get('ENABLE_MONGODB')) { + // controllo se settare il parametro per il nome DB nel caso non sono autenticato utilizzo un db mongo di default + $mongoDbName = $request->getHeader(self::MONGO_DB_NAME); + if ($mongoDbName) { + $mongoDbName = $this->_ipManager->getMongoDbName($mongoDbName); + $this->setMongoDbRegistryName($mongoDbName); + } + } + } + + break; + default: + break; + } + + //Controllo i permessi prima sul modulo e poi sul controller in caso sia un webservices + if (!$this->_acl->isAllowed(trim($this->_role), $request->getModuleName())) { + $this->denyAccess(); + } else { + switch ($request->getModuleName()) { + case'v1': + if (!$this->_aclRestV1->isAllowed(trim($this->_role), $request->getControllerName())) + $this->denyAccess(); + break; + } + } + + } + + private function accessoV1(Zend_Controller_Request_Abstract $request, $token) + { + if (!$token) return $this->_redirectNoAuth($request); + + //Controllo che nell'autorization header sia contenuto anche il metodo di autorizazzione lo scompongo e ottendo il codice + $authorizationHeaderParts = explode(' ', $token); + if (count($authorizationHeaderParts) > 1) { + $type = strtoupper($authorizationHeaderParts[0]); + $token = $authorizationHeaderParts[1]; + } else { + $token = $authorizationHeaderParts[0]; + } + + $user = null; + switch ($type) { + case self::AUTH_TYPE_SECRET_ID: + $user = $this->authenticateV1SecretToken($token); + break; + default: + $user = $this->authenticateV1($token); + break; + } + + // Salvo il token nel registry + Zend_Registry::set('TOKEN', $token); + + if ($user != null) + $this->_role = $user['role']; + else + $this->_redirectTokenScaduto($request); + + if (!$user['stato']) { + $this->_redirectDeactiveUserState($request); + } + + if (Zend_Registry::get('ENABLE_MONGODB')) { + $mongoDbName = $this->_ipManager->getMongoDbName($user['NomeDB']); + if ($user['role'] === 'admin') { + $mongoDbName = $request->getHeader(self::MONGO_DB_NAME); + if (!$mongoDbName) { + $mongoDbName = $this->_ipManager->getMongoAdminDbName(); + } else { + $mongoDbName = $this->_ipManager->getMongoDbName($mongoDbName); + } + } + + $this->setMongoDbRegistryName($mongoDbName); + } + + } + + private function setMongoDbRegistryName($mongoDbName) + { + if (Zend_Registry::isRegistered(App_Model_Mongo_Adapter::MONGO_DB_ADAPTER_REG_NAME)) + Zend_Registry::get(App_Model_Mongo_Adapter::MONGO_DB_ADAPTER_REG_NAME)->setDbname($mongoDbName); + else + Zend_Registry::set(App_Model_Mongo_Adapter::MONGO_DB_NAME, $mongoDbName); + } + + private function authenticateV1($token) + { + $user = $this->_genericModel->getByColumnName('Users', 'token', $token, '=', true); + if (!$user) { + return null; + } + + //Aggiornamento del campo UltimoAccesso + $this->_genericModel->update('Users', $user['id'], array('UltimoAccesso' => date('Y-m-d H:i:s'))); + + return $user; + } + + private function authenticateV1SecretToken($token) + { + $user = $this->_genericModel->getByColumnName('Users', 'secret_token', $token, '=', true); + if (!$user) { + return null; + } + + //Aggiornamento del campo UltimoAccesso + $this->_genericModel->update('Users', $user['id'], array('UltimoAccesso' => date('Y-m-d H:i:s'))); + + return $user; + } + + public function denyAccess() + { + $this->_request->setModuleName('default') + ->setControllerName('error') + ->setActionName('invalid') + ->setParam('message', 'L\'utente non ha i permessi per accedere alla risorsa.'); + } + + protected function _invalidCredential() + { + $this->_request->setModuleName('default') + ->setControllerName('error') + ->setActionName('invalid') + ->setParam('message', 'Username e/o password errati.'); + } + + protected function _redirectInvalidRequest(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + $request->setModuleName('default') + ->setControllerName('error') + ->setActionName('invalid') + ->setParam('message', 'Invalid authentication header.'); + } + + protected function _redirectNoAuth(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + $request->setModuleName('default') + ->setControllerName('error') + ->setActionName('invalid') + ->setParam('message', 'Authentication header not found'); + } + + protected function _redirectUrlScaduto(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + $request->setModuleName('default') + ->setControllerName('error') + ->setActionName('invalid') + ->setParam('message', 'Url Scaduto'); + } + + protected function _redirectTokenScaduto(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + throw new App_Controller_Errors_WebServiceError(utf8_encode("Accesso Scaduto"), null, App_Controller_Errors_WebServiceError::WEBSERVICE_SESSION_EXPIRED); + } + + protected function _redirectOffline(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + $request->setModuleName('default') + ->setControllerName('error') + ->setActionName('invalid') + ->setParam('message', 'Il web services è offline'); + } + + protected function _redirectDeactiveUserState(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + throw new App_Controller_Errors_WebServiceError(utf8_encode("Account Api Disattivato"), null, App_Controller_Errors_WebServiceError::WEBSERVICE_SESSION_EXPIRED); + } + + protected function _redirectNoMongoDBName(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + throw new App_Controller_Errors_WebServiceError(utf8_encode("Nomd DB Mongo non specificato"), null, App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR); + } + + protected function _redirectLogin(\Zend_Controller_Request_Abstract $request) + { + // Forward the request to the noauth error page. + $request->setParam('section', $request->getModuleName()) + ->setModuleName('default') + ->setControllerName('index') + ->setActionName('login'); + } + +} diff --git a/library/App/Controller/Plugin/CPanel/Xmlapi.php b/library/App/Controller/Plugin/CPanel/Xmlapi.php new file mode 100644 index 0000000..f67d223 --- /dev/null +++ b/library/App/Controller/Plugin/CPanel/Xmlapi.php @@ -0,0 +1,2470 @@ +set_hash("username", $accessHash); +* $xmlapi->set_password("username", "password"); +* +* 3.) Execute a function +* $xmlapi->listaccts(); +* +* @category Cpanel +* @package xmlapi +* @copyright 2012 cPanel, Inc. +* @license http://sdk.cpanel.net/license/bsd.html +* @version Release: 1.0.13 +* @link http://twiki.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/XmlApi +* @since Class available since release 0.1 +**/ + +class App_Controller_Plugin_CPanel_Xmlapi extends Zend_Controller_Plugin_Abstract +{ + // should debugging statements be printed? + private $debug = false; + + // The host to connect to + private $host = '127.0.0.1'; + + // the port to connect to + private $port = '2087'; + + // should be the literal strings http or https + private $protocol = 'https'; + + // output that should be given by the xml-api + private $output = 'simplexml'; + + // literal strings hash or password + private $auth_type = null; + + // the actual password or hash + private $auth = null; + + // username to authenticate as + private $user = null; + + // The HTTP Client to use + + private $http_client = 'curl'; + + /** + * Instantiate the XML-API Object + * All parameters to this function are optional and can be set via the accessor functions or constants + * This defaults to password auth, however set_hash can be used to use hash authentication + * + * @param string $host The host to perform queries on + * @param string $user The username to authenticate as + * @param string $password The password to authenticate with + * @return Xml_Api object + */ + public function __construct($host = null, $user = null, $password = null ) + { + // Check if debugging must be enabled + if ( (defined('XMLAPI_DEBUG')) && (XMLAPI_DEBUG == '1') ) { + $this->debug = true; + } + + // Check if raw xml output must be enabled + if ( (defined('XMLAPI_RAW_XML')) && (XMLAPI_RAW_XML == '1') ) { + $this->raw_xml = true; + } + + /** + * Authentication + * This can either be passed at this point or by using the set_hash or set_password functions + **/ + + if ( ( defined('XMLAPI_USER') ) && ( strlen(XMLAPI_USER) > 0 ) ) { + $this->user = XMLAPI_USER; + + // set the authtype to pass and place the password in $this->pass + if ( ( defined('XMLAPI_PASS') ) && ( strlen(XMLAPI_PASS) > 0 ) ) { + $this->auth_type = 'pass'; + $this->auth = XMLAPI_PASS; + } + + // set the authtype to hash and place the hash in $this->auth + if ( ( defined('XMLAPI_HASH') ) && ( strlen(XMLAPI_HASH) > 0 ) ) { + $this->auth_type = 'hash'; + $this->auth = preg_replace("/(\n|\r|\s)/", '', XMLAPI_HASH); + } + + // Throw warning if XMLAPI_HASH and XMLAPI_PASS are defined + if ( ( ( defined('XMLAPI_HASH') ) && ( strlen(XMLAPI_HASH) > 0 ) ) + && ( ( defined('XMLAPI_PASS') ) && ( strlen(XMLAPI_PASS) > 0 ) ) ) { + error_log('warning: both XMLAPI_HASH and XMLAPI_PASS are defined, defaulting to XMLAPI_HASH'); + } + + + // Throw a warning if XMLAPI_HASH and XMLAPI_PASS are undefined and XMLAPI_USER is defined + if ( !(defined('XMLAPI_HASH') ) || !defined('XMLAPI_PASS') ) { + error_log('warning: XMLAPI_USER set but neither XMLAPI_HASH or XMLAPI_PASS have not been defined'); + } + + } + + if ( ( $user != null ) && ( strlen( $user ) < 9 ) ) { + $this->user = $user; + } + + if ($password != null) { + $this->set_password($password); + } + + /** + * Connection + * + * $host/XMLAPI_HOST should always be equal to either the IP of the server or it's hostname + */ + + // Set the host, error if not defined + if ($host == null) { + if ( (defined('XMLAPI_HOST')) && (strlen(XMLAPI_HOST) > 0) ) { + $this->host = XMLAPI_HOST; + } else { + throw new Exception("No host defined"); + } + } else { + $this->host = $host; + } + + // disabling SSL is probably a bad idea.. just saying. + if ( defined('XMLAPI_USE_SSL' ) && (XMLAPI_USE_SSL == '0' ) ) { + $this->protocol = "http"; + } + + // Detemine what the default http client should be. + if ( function_exists('curl_setopt') ) { + $this->http_client = "curl"; + } elseif ( ini_get('allow_url_fopen') ) { + $this->http_client = "fopen"; + } else { + throw new Exception('allow_url_fopen and curl are neither available in this PHP configuration'); + } + + } + + /** + * Accessor Functions + **/ + /** + * Return whether the debug option is set within the object + * + * @return boolean + * @see set_debug() + */ + public function get_debug() + { + return $this->debug; + } + + /** + * Turn on debug mode + * + * Enabling this option will cause this script to print debug information such as + * the queries made, the response XML/JSON and other such pertinent information. + * Calling this function without any parameters will enable debug mode. + * + * @param bool $debug turn on or off debug mode + * @see get_debug() + */ + public function set_debug( $debug = 1 ) + { + $this->debug = $debug; + } + + /** + * Get the host being connected to + * + * This function will return the host being connected to + * @return string host + * @see set_host() + */ + public function get_host() + { + return $this->host; + } + + /** + * Set the host to query + * + * Setting this will set the host to be queried + * @param string $host The host to query + * @see get_host() + */ + public function set_host( $host ) + { + $this->host = $host; + } + + /** + * Get the port to connect to + * + * This will return which port the class is connecting to + * @return int $port + * @see set_port() + */ + public function get_port() + { + return $this->port; + } + + /** + * Set the port to connect to + * + * This will allow a user to define which port needs to be connected to. + * The default port set within the class is 2087 (WHM-SSL) however other ports are optional + * this function will automatically set the protocol to http if the port is equal to: + * - 2082 + * - 2086 + * - 2095 + * - 80 + * @param int $port the port to connect to + * @see set_protocol() + * @see get_port() + */ + public function set_port( $port ) + { + if ( !is_int( $port ) ) { + $port = intval($port); + } + + if ($port < 1 || $port > 65535) { + throw new Exception('non integer or negative integer passed to set_port'); + } + + // Account for ports that are non-ssl + if ($port == '2086' || $port == '2082' || $port == '80' || $port == '2095') { + $this->set_protocol('http'); + } + + $this->port = $port; + } + + /** + * Return the protocol being used to query + * + * This will return the protocol being connected to + * @return string + * @see set_protocol() + */ + public function get_protocol() + { + return $this->protocol; + } + + /** + * Set the protocol to use to query + * + * This will allow you to set the protocol to query cpsrvd with. The only to acceptable values + * to be passed to this function are 'http' or 'https'. Anything else will cause the class to throw + * an Exception. + * @param string $proto the protocol to use to connect to cpsrvd + * @see get_protocol() + */ + public function set_protocol( $proto ) + { + if ($proto != 'https' && $proto != 'http') { + throw new Exception('https and http are the only protocols that can be passed to set_protocol'); + } + $this->protocol = $proto; + } + + /** + * Return what format calls with be returned in + * + * This function will return the currently set output format + * @see set_output() + * @return string + */ + public function get_output() + { + return $this->output; + } + + /** + * Set the output format for call functions + * + * This class is capable of returning data in numerous formats including: + * - json + * - xml + * - {@link http://php.net/simplexml SimpleXML} + * - {@link http://us.php.net/manual/en/language.types.array.php Associative Arrays} + * + * These can be set by passing this class any of the following values: + * - json - return JSON string + * - xml - return XML string + * - simplexml - return SimpleXML object + * - array - Return an associative array + * + * Passing any value other than these to this class will cause an Exception to be thrown. + * @param string $output the output type to be set + * @see get_output() + */ + public function set_output( $output ) + { + if ($output != 'json' && $output != 'xml' && $output != 'array' && $output != 'simplexml') { + throw new Exception('json, xml, array and simplexml are the only allowed values for set_output'); + } + $this->output = $output; + } + + /** + * Return the auth_type being used + * + * This function will return a string containing the auth type in use + * @return string auth type + * @see set_auth_type() + */ + public function get_auth_type() + { + return $this->auth_type; + } + + /** + * Set the auth type + * + * This class is capable of authenticating with both hash auth and password auth + * This function will allow you to manually set which auth_type you are using. + * + * the only accepted parameters for this function are "hash" and "pass" anything else will cuase + * an exception to be thrown + * + * @see set_password() + * @see set_hash() + * @see get_auth_type() + * @param string auth_type the auth type to be set + */ + public function set_auth_type( $auth_type ) + { + if ($auth_type != 'hash' && $auth_type != 'pass') { + throw new Exception('the only two allowable auth types arehash and path'); + } + $this->auth_type = $auth_type; + } + + /** + * Set the password to be autenticated with + * + * This will set the password to be authenticated with, the auth_type will be automatically adjusted + * when this function is used + * + * @param string $pass the password to authenticate with + * @see set_hash() + * @see set_auth_type() + * @see set_user() + */ + public function set_password( $pass ) + { + $this->auth_type = 'pass'; + $this->auth = $pass; + } + + /** + * Set the hash to authenticate with + * + * This will set the hash to authenticate with, the auth_type will automatically be set when this function + * is used. This function will automatically strip the newlines from the hash. + * @param string $hash the hash to autenticate with + * @see set_password() + * @see set_auth_type() + * @see set_user() + */ + public function set_hash( $hash ) + { + $this->auth_type = 'hash'; + $this->auth = preg_replace("/(\n|\r|\s)/", '', $hash); + } + + /** + * Return the user being used for authtication + * + * This will return the username being authenticated against. + * + * @return string + */ + public function get_user() + { + return $this->user; + } + + /** + * Set the user to authenticate against + * + * This will set the user being authenticated against. + * @param string $user username + * @see set_password() + * @see set_hash() + * @see get_user() + */ + public function set_user( $user ) + { + $this->user = $user; + } + + /** + * Set the user and hash to be used for authentication + * + * This function will allow one to set the user AND hash to be authenticated with + * + * @param string $user username + * @param string $hash WHM Access Hash + * @see set_hash() + * @see set_user() + */ + public function hash_auth( $user, $hash ) + { + $this->set_hash( $hash ); + $this->set_user( $user ); + } + + /** + * Set the user and password to be used for authentication + * + * This function will allow one to set the user AND password to be authenticated with + * @param string $user username + * @param string $pass password + * @see set_pass() + * @see set_user() + */ + public function password_auth( $user, $pass ) + { + $this->set_password( $pass ); + $this->set_user( $user ); + } + + /** + * Return XML format + * + * this function will cause call functions to return XML format, this is the same as doing: + * set_output('xml') + * + * @see set_output() + */ + public function return_xml() + { + $this->set_output('xml'); + } + + /** + * Return simplexml format + * + * this function will cause all call functions to return simplexml format, this is the same as doing: + * set_output('simplexml') + * + * @see set_output() + */ + public function return_object() + { + $this->set_output('simplexml'); + } + + /** + * Set the HTTP client to use + * + * This class is capable of two types of HTTP Clients: + * - curl + * - fopen + * + * When using allow url fopen the class will use get_file_contents to perform the query + * The only two acceptable parameters for this function are 'curl' and 'fopen'. + * This will default to fopen, however if allow_url_fopen is disabled inside of php.ini + * it will switch to curl + * + * @param string client The http client to use + * @see get_http_client() + */ + + public function set_http_client( $client ) + { + if ( ( $client != 'curl' ) && ( $client != 'fopen' ) ) { + throw new Exception('only curl and fopen and allowed http clients'); + } + $this->http_client = $client; + } + + /** + * Get the HTTP Client in use + * + * This will return a string containing the HTTP client currently in use + * + * @see set_http_client() + * @return string + */ + public function get_http_client() + { + return $this->http_client; + } + + /* + * Query Functions + * -- + * This is where the actual calling of the XML-API, building API1 & API2 calls happens + */ + + /** + * Perform an XML-API Query + * + * This function will perform an XML-API Query and return the specified output format of the call being made + * + * @param string $function The XML-API call to execute + * @param array $vars An associative array of the parameters to be passed to the XML-API Calls + * @return mixed + */ + public function xmlapi_query( $function, $vars = array() ) + { + // Check to make sure all the data needed to perform the query is in place + if (!$function) { + throw new Exception('xmlapi_query() requires a function to be passed to it'); + } + + if ($this->user == null) { + throw new Exception('no user has been set'); + } + + if ($this->auth ==null) { + throw new Exception('no authentication information has been set'); + } + + // Build the query: + + $query_type = '/xml-api/'; + + if ($this->output == 'json') { + $query_type = '/json-api/'; + } + + $args = http_build_query($vars, '', '&'); + $url = $this->protocol . '://' . $this->host . ':' . $this->port . $query_type . $function; + + if ($this->debug) { + error_log('URL: ' . $url); + error_log('DATA: ' . $args); + } + + // Set the $auth string + + $authstr = NULL; + if ($this->auth_type == 'hash') { + $authstr = 'Authorization: WHM ' . $this->user . ':' . $this->auth . "\r\n"; + } elseif ($this->auth_type == 'pass') { + $authstr = 'Authorization: Basic ' . base64_encode($this->user .':'. $this->auth) . "\r\n"; + } else { + throw new Exception('invalid auth_type set'); + } + + if ($this->debug) { + error_log("Authentication Header: " . $authstr ."\n"); + } + + // Perform the query (or pass the info to the functions that actually do perform the query) + + $response = NULL; + if ($this->http_client == 'curl') { + $response = $this->curl_query($url, $args, $authstr); + } elseif ($this->http_client == 'fopen') { + $response = $this->fopen_query($url, $args, $authstr); + } + + /* + * Post-Query Block + * Handle response, return proper data types, debug, etc + */ + + // print out the response if debug mode is enabled. + if ($this->debug) { + error_log("RESPONSE:\n " . $response); + } + + // The only time a response should contain is in the case of authentication error + // cPanel 11.25 fixes this issue, but if is in the response, we'll error out. + + if (stristr($response, '') == true) { + if (stristr($response, 'Login Attempt Failed') == true) { + error_log("Login Attempt Failed"); + + return; + } + if (stristr($response, 'action="/login/"') == true) { + error_log("Authentication Error"); + + return; + } + + return; + } + + + // perform simplexml transformation (array relies on this) + if ( ($this->output == 'simplexml') || $this->output == 'array') { + $response = simplexml_load_string($response, null, LIBXML_NOERROR | LIBXML_NOWARNING); + if (!$response) { + error_log("Some error message here"); + + return; + } + if ($this->debug) { + error_log("SimpleXML var_dump:\n" . print_r($response, true)); + } + } + + // perform array tranformation + if ($this->output == 'array') { + $response = $this->unserialize_xml($response); + if ($this->debug) { + error_log("Associative Array var_dump:\n" . print_r($response, true)); + } + } + + return $response; + } + + private function curl_query( $url, $postdata, $authstr ) + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + // Return contents of transfer on curl_exec + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + // Allow self-signed certs + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); + // Set the URL + curl_setopt($curl, CURLOPT_URL, $url); + // Increase buffer size to avoid "funny output" exception + curl_setopt($curl, CURLOPT_BUFFERSIZE, 131072); + + // Pass authentication header + $header[0] =$authstr . + "Content-Type: application/x-www-form-urlencoded\r\n" . + "Content-Length: " . strlen($postdata) . "\r\n" . "\r\n" . $postdata; + + curl_setopt($curl, CURLOPT_HTTPHEADER, $header); + + curl_setopt($curl, CURLOPT_POST, 1); + + $result = curl_exec($curl); + if ($result == false) { + throw new Exception("curl_exec threw error \"" . curl_error($curl) . "\" for " . $url . "?" . $postdata ); + } + curl_close($curl); + + return $result; + } + + private function fopen_query( $url, $postdata, $authstr ) + { + if ( !(ini_get('allow_url_fopen') ) ) { + throw new Exception('fopen_query called on system without allow_url_fopen enabled in php.ini'); + } + + $opts = array( + 'http' => array( + 'allow_self_signed' => true, + 'method' => 'POST', + 'header' => $authstr . + "Content-Type: application/x-www-form-urlencoded\r\n" . + "Content-Length: " . strlen($postdata) . "\r\n" . + "\r\n" . $postdata + ) + ); + $context = stream_context_create($opts); + + return file_get_contents($url, false, $context); + } + + + /* + * Convert simplexml to associative arrays + * + * This function will convert simplexml to associative arrays. + */ + private function unserialize_xml($input, $callback = null, $recurse = false) + { + // Get input, loading an xml string with simplexml if its the top level of recursion + $data = ( (!$recurse) && is_string($input) ) ? simplexml_load_string($input) : $input; + // Convert SimpleXMLElements to array + if ($data instanceof SimpleXMLElement) { + $data = (array) $data; + } + // Recurse into arrays + if (is_array($data)) { + foreach ($data as &$item) { + $item = $this->unserialize_xml($item, $callback, true); + } + } + // Run callback and return + return (!is_array($data) && is_callable($callback)) ? call_user_func($callback, $data) : $data; + } + + + /* TO DO: + Implement API1 and API2 query functions!!!!! + */ + /** + * Call an API1 function + * + * This function allows you to call API1 from within the XML-API, This allowes a user to peform actions + * such as adding ftp accounts, etc + * + * @param string $user The username of the account to perform API1 actions on + * @param string $module The module of the API1 call to use + * @param string $function The function of the API1 call + * @param array $args The arguments for the API1 function, this should be a non-associative array + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CallingAPIFunctions XML API Call documentation + * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiRef/WebHome API1 & API2 Call documentation + * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiBasics/CallingApiOne API1 Documentation + */ + public function api1_query($user, $module, $function, $args = array() ) + { + if ( !isset($module) || !isset($function) || !isset($user) ) { + error_log("api1_query requires that a module and function are passed to it"); + + return false; + } + + if (!is_array($args)) { + error_log('api1_query requires that it is passed an array as the 4th parameter'); + + return false; + } + + $cpuser = 'cpanel_xmlapi_user'; + $module_type = 'cpanel_xmlapi_module'; + $func_type = 'cpanel_xmlapi_func'; + $api_type = 'cpanel_xmlapi_apiversion'; + + if ( $this->get_output() == 'json' ) { + $cpuser = 'cpanel_jsonapi_user'; + $module_type = 'cpanel_jsonapi_module'; + $func_type = 'cpanel_jsonapi_func'; + $api_type = 'cpanel_jsonapi_apiversion'; + } + + $call = array( + $cpuser => $user, + $module_type => $module, + $func_type => $function, + $api_type => '1' + ); + for ($int = 0; $int < count($args); $int++) { + $call['arg-' . $int] = $args[$int]; + } + + return $this->xmlapi_query('cpanel', $call); + } + + /** + * Call an API2 Function + * + * This function allows you to call an API2 function, this is the modern API for cPanel and should be used in preference over + * API1 when possible + * + * @param string $user The username of the account to perform API2 actions on + * @param string $module The module of the API2 call to use + * @param string $function The function of the API2 call + * @param array $args An associative array containing the arguments for the API2 call + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CallingAPIFunctions XML API Call documentation + * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiRef/WebHome API1 & API2 Call documentation + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ApiTwo Legacy API2 Documentation + * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiBasics/CallingApiTwo API2 Documentation + */ + + public function api2_query($user, $module, $function, $args = array()) + { + if (!isset($user) || !isset($module) || !isset($function) ) { + error_log("api2_query requires that a username, module and function are passed to it"); + + return false; + } + if (!is_array($args)) { + error_log("api2_query requires that an array is passed to it as the 4th parameter"); + + return false; + } + + $cpuser = 'cpanel_xmlapi_user'; + $module_type = 'cpanel_xmlapi_module'; + $func_type = 'cpanel_xmlapi_func'; + $api_type = 'cpanel_xmlapi_apiversion'; + + if ( $this->get_output() == 'json' ) { + $cpuser = 'cpanel_jsonapi_user'; + $module_type = 'cpanel_jsonapi_module'; + $func_type = 'cpanel_jsonapi_func'; + $api_type = 'cpanel_jsonapi_apiversion'; + } + + $args[$cpuser] = $user; + $args[$module_type] = $module; + $args[$func_type] = $function; + $args[$api_type] = '2'; + + return $this->xmlapi_query('cpanel', $args); + } + + #### + # XML API Functions + #### + + /** + * Return a list of available XML-API calls + * + * This function will return an array containing all applications available within the XML-API + * + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListAvailableCalls XML API Call documentation + */ + public function applist() + { + return $this->xmlapi_query('applist'); + } + + #### + # Account functions + #### + + /** + * Create a cPanel Account + * + * This function will allow one to create an account, the $acctconf parameter requires that the follow + * three associations are defined: + * - username + * - password + * - domain + * + * Failure to prive these will cause an error to be logged. Any other key/value pairs as defined by the createaccount call + * documentation are allowed parameters for this call. + * + * @param array $acctconf + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CreateAccount XML API Call documentation + */ + + public function createacct($acctconf) + { + if (!is_array($acctconf)) { + error_log("createacct requires that first parameter passed to it is an array"); + + return false; + } + if (!isset($acctconf['username']) || !isset($acctconf['password']) || !isset($acctconf['domain'])) { + error_log("createacct requires that username, password & domain elements are in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('createacct', $acctconf); + } + + /** + * Change a cPanel Account's Password + * + * This function will allow you to change the password of a cpanel account + * + * @param string $username The username to change the password of + * @param string $pass The new password for the cPanel Account + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ChangePassword XML API Call documentation + */ + public function passwd($username, $pass) + { + if (!isset($username) || !isset($pass)) { + error_log("passwd requires that an username and password are passed to it"); + + return false; + } + + return $this->xmlapi_query('passwd', array('user' => $username, 'pass' => $pass)); + } + + /** + * Limit an account's monthly bandwidth usage + * + * This function will set an account's bandwidth limit. + * + * @param string $username The username of the cPanel account to modify + * @param int $bwlimit The new bandwidth limit in megabytes + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/LimitBandwidth XML API Call documentation + */ + public function limitbw($username, $bwlimit) + { + if (!isset($username) || !isset($bwlimit)) { + error_log("limitbw requires that an username and bwlimit are passed to it"); + + return false; + } + + return $this->xmlapi_query('limitbw', array('user' => $username, 'bwlimit' => $bwlimit)); + } + + /** + * List accounts on Server + * + * This call will return a list of account on a server, either no parameters or both parameters may be passed to this function. + * + * @param string $searchtype Type of account search to use, allowed values: domain, owner, user, ip or package + * @param string $search the string to search against + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListAccounts XML API Call documentation + */ + public function listaccts($searchtype = null, $search = null) + { + if ($search) { + return $this->xmlapi_query('listaccts', array('searchtype' => $searchtype, 'search' => $search )); + } + + return $this->xmlapi_query('listaccts'); + } + + /** + * Modify a cPanel account + * + * This call will allow you to change limitations and information about an account. See the XML API call documentation for a list of + * acceptable values for args. + * + * @param string $username The username to modify + * @param array $args the new values for the modified account (see {@link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ModifyAccount modifyacct documentation}) + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ModifyAccount XML API Call documentation + */ + public function modifyacct($username, $args = array()) + { + if (!isset($username)) { + error_log("modifyacct requires that username is passed to it"); + + return false; + } + $args['user'] = $username; + if (sizeof($args) < 2) { + error_log("modifyacct requires that at least one attribute is passed to it"); + + return false; + } + + return $this->xmlapi_query('modifyacct', $args); + } + + /** + * Edit a cPanel Account's Quota + * + * This call will allow you to change a cPanel account's quota + * + * @param string $username The username of the account to modify the quota. + * @param int $quota the new quota in megabytes + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditQuota XML API Call documentation + */ + public function editquota($username, $quota) + { + if (!isset($username) || !isset($quota)) { + error_log("editquota requires that an username and quota are passed to it"); + + return false; + } + + return $this->xmlapi_query('editquota', array('user' => $username, 'quota' => $quota)); + } + + /** + * Return a summary of the account's information + * + * This call will return a brief report of information about an account, such as: + * - Disk Limit + * - Disk Used + * - Domain + * - Account Email + * - Theme + * - Start Data + * + * Please see the XML API Call documentation for more information on what is returned by this call + * + * @param string $username The username to retrieve a summary of + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ShowAccountInformation XML API Call documenation + */ + public function accountsummary($username) + { + if (!isset($username)) { + error_log("accountsummary requires that an username is passed to it"); + + return false; + } + + return $this->xmlapi_query('accountsummary', array('user' => $username)); + } + + /** + * Suspend a User's Account + * + * This function will suspend the specified cPanel users account. + * The $reason parameter is optional, but can contain a string of any length + * + * @param string $username The username to suspend + * @param string $reason The reason for the suspension + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SuspendAccount XML API Call documentation + */ + public function suspendacct($username, $reason = null) + { + if (!isset($username)) { + error_log("suspendacct requires that an username is passed to it"); + + return false; + } + if ($reason) { + return $this->xmlapi_query('suspendacct', array('user' => $username, 'reason' => $reason )); + } + + return $this->xmlapi_query('suspendacct', array('user' => $username)); + } + + /** + * List suspended accounts on a server + * + * This function will return an array containing all the suspended accounts on a server + * + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListSuspended XML API Call documentation + */ + public function listsuspended() + { + return $this->xmlapi_query('listsuspended'); + } + + /** + * Remove an Account + * + * This XML API call will remove an account on the server + * The $keepdns parameter is optional, when enabled this will leave the DNS zone on the server + * + * @param string $username The usename to delete + * @param bool $keepdns When pass a true value, the DNS zone will be retained + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/TerminateAccount + */ + public function removeacct($username, $keepdns = false) + { + if (!isset($username)) { + error_log("removeacct requires that a username is passed to it"); + + return false; + } + if ($keepdns) { + return $this->xmlapi_query('removeacct', array('user' => $username, 'keepdns' => '1')); + } + + return $this->xmlapi_query('removeacct', array('user' => $username)); + } + + /** + * Unsuspend an Account + * + * This XML API call will unsuspend an account + * + * @param string $username The username to unsuspend + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/UnsuspendAcount XML API Call documentation + */ + public function unsuspendacct($username) + { + if (!isset($username)) { + error_log("unsuspendacct requires that a username is passed to it"); + + return false; + } + + return $this->xmlapi_query('unsuspendacct', array('user' => $username)); + } + + /** + * Change an Account's Package + * + * This XML API will change the package associated account. + * + * @param string $username the username to change the package of + * @param string $pkg The package to change the account to. + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ChangePackage XML API Call documentation + */ + public function changepackage($username, $pkg) + { + if (!isset($username) || !isset($pkg)) { + error_log("changepackage requires that username and pkg are passed to it"); + + return false; + } + + return $this->xmlapi_query('changepackage', array('user' => $username, 'pkg' => $pkg)); + } + + /** + * Return the privileges a reseller has in WHM + * + * This will return a list of the privileges that a reseller has to WHM + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ViewPrivileges XML API Call documentation + */ + public function myprivs() + { + return $this->xmlapi_query('myprivs'); + } + + + /** + * Display Data about a Virtual Host + * + * This function will return information about a specific domain. This data is essentially a representation of the data + * Contained in the httpd.conf VirtualHost for the domain. + * + * @return mixed + * @param string $domain The domain to fetch information for + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DomainUserData + */ + + public function domainuserdata( $domain ) + { + if (!isset( $domain ) ) { + error_log("domainuserdata requires that domain is passed to it"); + + return false; + } + + return $this->xmlapi_query("domainuserdata", array( 'domain' => $domain ) ); + } + + /** + * Change a site's IP Address + * + * This function will allow you to change the IP address that a domain listens on. + * In order to properly call this function Either $user or $domain parameters must be defined + * @param string $ip The $ip address to change the account or domain to + * @param string $user The username to change the IP of + * @param string $domain The domain to change the IP of + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetSiteIp XML API Call documentation + */ + public function setsiteip ( $ip, $user = null, $domain = null ) + { + if ( !isset($ip) ) { + error_log("setsiteip requires that ip is passed to it"); + + return false; + } + + if ($user == null && $domain == null) { + error_log("setsiteip requires that either domain or user is passed to it"); + + return false; + } + + if ($user == null) { + return $this->xmlapi_query( "setsiteip", array( "ip" => $ip, "domain" => $domain ) ); + } else { + return $this->xmlapi_query( "setsiteip", array( "ip" => $ip, "user" => $user ) ); + } + } + + #### + # DNS Functions + #### + + // This API function lets you create a DNS zone. + /** + * Add a DNS Zone + * + * This XML API function will create a DNS Zone. This will use the "standard" template when + * creating the zone. + * + * @param string $domain The DNS Domain that you wish to create a zone for + * @param string $ip The IP you want the domain to resolve to + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddDNSZone XML API Call documentation + */ + public function adddns($domain, $ip) + { + if (!isset($domain) || !isset($ip)) { + error_log("adddns require that domain, ip are passed to it"); + + return false; + } + + return $this->xmlapi_query('adddns', array('domain' => $domain, 'ip' => $ip)); + } + + /** + * Add a record to a zone + * + * This will append a record to a DNS Zone. The $args argument to this function + * must be an associative array containing information about the DNS zone, please + * see the XML API Call documentation for more info + * + * @param string $zone The DNS zone that you want to add the record to + * @param array $args Associative array representing the record to be added + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddZoneRecord XML API Call documentation + */ + public function addzonerecord( $zone, $args ) + { + if (!is_array($args)) { + error_log("addzonerecord requires that $args passed to it is an array"); + + return; + } + + $args['zone'] = $zone; + + return $this->xmlapi_query('addzonerecord', $args); + } + + /** + * Edit a Zone Record + * + * This XML API Function will allow you to edit an existing DNS Zone Record. + * This works by passing in the line number of the record you wish to edit. + * Line numbers can be retrieved with dumpzone() + * + * @param string $zone The zone to edit + * @param int $line The line number of the zone to edit + * @param array $args An associative array representing the zone record + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditZoneRecord XML API Call documentation + * @see dumpzone() + */ + + public function editzonerecord( $zone, $line, $args ) + { + if (!is_array($args)) { + error_log("editzone requires that $args passed to it is an array"); + + return; + } + + $args['domain'] = $zone; + $args['Line'] = $line; + + return $this->xmlapi_query('editzonerecord', $args); + } + + /** + * Retrieve a DNS Record + * + * This function will return a data structure representing a DNS record, to + * retrieve all lines see dumpzone. + * @param string $zone The zone that you want to retrieve a record from + * @param string $line The line of the zone that you want to retrieve + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/GetZoneRecord XML API Call documentation + */ + public function getzonerecord( $zone, $line ) + { + return $this->xmlapi_query('getzonerecord', array( 'domain' => $zone, 'Line' => $line ) ); + } + + /** + * Remove a DNS Zone + * + * This function will remove a DNS Zone from the server + * + * @param string $domain The domain to be remove + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeleteDNSZone XML API Call documentation + */ + public function killdns($domain) + { + if (!isset($domain)) { + error_log("killdns requires that domain is passed to it"); + + return false; + } + + return $this->xmlapi_query('killdns', array('domain' => $domain)); + } + + /** + * Return a List of all DNS Zones on the server + * + * This XML API function will return an array containing all the DNS Zones on the server + * + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListDNSZone XML API Call documentation + */ + public function listzones() + { + return $this->xmlapi_query('listzones'); + } + + /** + * Return all records in a zone + * + * This function will return all records within a zone. + * @param string $domain The domain to return the records from. + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListOneZone XML API Call documentation + * @see editdnsrecord() + * @see getdnsrecord() + */ + public function dumpzone($domain) + { + if (!isset($domain)) { + error_log("dumpzone requires that a domain is passed to it"); + + return false; + } + + return $this->xmlapi_query('dumpzone', array('domain' => $domain)); + } + + /** + * Return a Nameserver's IP + * + * This function will return a nameserver's IP + * + * @param string $nameserver The nameserver to lookup + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/LookupIP XML API Call documentation + */ + public function lookupnsip($nameserver) + { + if (!isset($nameserver)) { + error_log("lookupnsip requres that a nameserver is passed to it"); + + return false; + } + + return $this->xmlapi_query('lookupnsip', array('nameserver' => $nameserver)); + } + + /** + * Remove a line from a zone + * + * This function will remove the specified line from a zone + * @param string $zone The zone to remove a line from + * @param int $line The line to remove from the zone + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RemoveZone XML API Call documentation + */ + public function removezonerecord($zone, $line) + { + if ( !isset($zone) || !isset($line) ) { + error_log("removezone record requires that a zone and line number is passed to it"); + + return false; + } + + return $this->xmlapi_query('removezonerecord', array('zone' => $zone, 'Line' => $line) ); + } + + /** + * Reset a zone + * + * This function will reset a zone removing all custom records. Subdomain records will be readded by scanning the userdata datastore. + * @param string $domain the domain name of the zone to reset + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ResetZone XML API Call documentation + */ + public function resetzone($domain) + { + if ( !isset($domain) ) { + error_log("resetzone requires that a domain name is passed to it"); + + return false; + } + + return $this->xmlapi_query('resetzone', array('domain' => $domain)); + } + + #### + # Package Functions + #### + + /** + * Add a new package + * + * This function will allow you to add a new package + * This function should be passed an associative array containing elements that define package parameters. + * These variables map directly to the parameters for the XML-API Call, please refer to the link below for a complete + * list of possible variable. The "name" element is required. + * @param array $pkg an associative array containing package parameters + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddPackage XML API Call documentation + */ + public function addpkg($pkg) + { + if (!isset($pkg['name'])) { + error_log("addpkg requires that name is defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('addpkg', $pkg); + } + + /** + * Remove a package + * + * This function allow you to delete a package + * @param string $pkgname The package you wish to delete + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeletePackage XML API Call documentation + */ + public function killpkg($pkgname) + { + if (!isset($pkgname)) { + error_log("killpkg requires that the package name is passed to it"); + + return false; + } + + return $this->xmlapi_query('killpkg', array('pkg' => $pkgname)); + } + + /** + * Edit a package + * + * This function allows you to change a package's paremeters. This is passed an associative array defining + * the parameters for the package. The keys within this array map directly to the XML-API call, please see the link + * below for a list of possible keys within this package. The name element is required. + * @param array $pkg An associative array containing new parameters for the package + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditPackage XML API Call documentation + */ + public function editpkg($pkg) + { + if (!isset($pkg['name'])) { + error_log("editpkg requires that name is defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('editpkg', $pkg); + } + + /** + * List Packages + * + * This function will list all packages available to the user + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListPackages XML API Call documentation + */ + public function listpkgs() + { + return $this->xmlapi_query('listpkgs'); + } + + #### + # Reseller functions + #### + + /** + * Make a user a reseller + * + * This function will allow you to mark an account as having reseller privileges + * @param string $username The username of the account you wish to add reseller privileges to + * @param int $makeowner Boolean 1 or 0 defining whether the account should own itself or not + * @see setacls() + * @see setresellerlimits() + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddResellerPrivileges XML API Call documentation + */ + public function setupreseller($username, $makeowner = true) + { + if (!isset($username)) { + error_log("setupreseller requires that username is passed to it"); + + return false; + } + if ($makeowner) { + return $this->xmlapi_query('setupreseller', array('user' => $username, 'makeowner' => '1')); + } + + return $this->xmlapi_query('setupreseller', array('user' => $username, 'makeowner' => '0')); + } + + /** + * Create a New ACL List + * + * This function allows you to create a new privilege set for reseller accounts. This is passed an + * Associative Array containing the configuration information for this variable. Please see the XML API Call documentation + * For more information. "acllist" is a required element within this array + * @param array $acl an associative array describing the parameters for the ACL to be create + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CreateResellerACLList XML API Call documentation + */ + public function saveacllist($acl) + { + if (!isset($acl['acllist'])) { + error_log("saveacllist requires that acllist is defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('saveacllist', $acl); + } + + + /** + * List available saved ACLs + * + * This function will return a list of Saved ACLs for reseller accounts + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListCurrentResellerACLLists XML API Call documentation + */ + public function listacls() + { + return $this->xmlapi_query('listacls'); + } + + /** + * List Resellers + * + * This function will return a list of resellers on the server + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListResellerAccounts XML API Call documentation + */ + public function listresellers() + { + return $this->xmlapi_query('listresellers'); + } + + /** + * Get a reseller's statistics + * + * This function will return general information on a reseller and all it's account individually such as disk usage and bandwidth usage + * + * @param string $username The reseller to be checked + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListResellersAccountsInformation XML API Call documentation + */ + public function resellerstats($username) + { + if (!isset($username)) { + error_log("resellerstats requires that a username is passed to it"); + + return false; + } + + return $this->xmlapi_query('resellerstats', array('reseller' => $username)); + } + + /** + * Remove Reseller Privileges + * + * This function will remove an account's reseller privileges, this does not remove the account. + * + * @param string $username The username to remove reseller privileges from + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RemoveResellerPrivileges XML API Call documentation + */ + public function unsetupreseller($username) + { + if (!isset($username)) { + error_log("unsetupreseller requires that a username is passed to it"); + + return false; + } + + return $this->xmlapi_query('unsetupreseller', array('user' => $username)); + } + + /** + * Set a reseller's privileges + * + * This function will allow you to set what parts of WHM a reseller has access to. This is passed an associative array + * containing the privleges that this reseller should have access to. These map directly to the parameters passed to the XML API Call + * Please view the XML API Call documentation for more information. "reseller" is the only required element within this array + * @param array $acl An associative array containing all the ACL information for the reseller + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellersACLList XML API Call documentation + */ + public function setacls($acl) + { + if (!isset($acl['reseller'])) { + error_log("setacls requires that reseller is defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('setacls', $acl); + } + + /** + * Terminate a Reseller's Account + * + * This function will terminate a reseller's account and all accounts owned by the reseller + * + * @param string $reseller the name of the reseller to terminate + * @param boolean $terminatereseller Passing this as true will terminate the the reseller's account as well as all the accounts owned by the reseller + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/TerminateResellerandAccounts XML API Call documentation + * + **/ + public function terminatereseller($reseller, $terminatereseller = true) + { + if (!isset($reseller)) { + error_log("terminatereseller requires that username is passed to it"); + + return false; + } + $verify = 'I understand this will irrevocably remove all the accounts owned by the reseller ' . $reseller; + if ($terminatereseller) { + return $this->xmlapi_query('terminatereseller', array('reseller' => $reseller, 'terminatereseller' => '1', 'verify' => $verify)); + } + + return $this->xmlapi_query('terminatereseller', array('reseller' => $reseller, 'terminatereseller' => '0', 'verify' => $verify)); + } + + /** + * Set a reseller's dedicated IP addresses + * + * This function will set a reseller's dedicated IP addresses. If an IP is not passed to this function, + * it will reset the reseller to use the server's main shared IP address. + * @param string $user The username of the reseller to change dedicated IPs for + * @param string $ip The IP to assign to the reseller, this can be a comma-seperated list of IPs to allow for multiple IP addresses + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerIps XML API Call documentation + */ + public function setresellerips($user, $ip = null) + { + if (!isset($user) ) { + error_log("setresellerips requires that a username is passed to it"); + + return false; + } + $params = array("user" => $user); + if ($ip != null) { + $params['ip'] = $ip; + } + + return $this->xmlapi_query('setresellerips',$params); + } + + /** + * Set Accounting Limits for a reseller account + * + * This function allows you to define limits for reseller accounts not included with in access control such as + * the number of accounts a reseller is allowed to create, the amount of disk space to use. + * This function is passed an associative array defining these limits, these map directly to the parameters for the XML API + * Call, please refer to the XML API Call documentation for more information. The only required parameters is "user" + * + * @param array $reseller_cfg An associative array containing configuration information for the specified reseller + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerLimits XML API Call documentation + * + */ + public function setresellerlimits( $reseller_cfg ) + { + if ( !isset($reseller_cfg['user'] ) ) { + error_log("setresellerlimits requires that a user is defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('setresellerlimits',$reseller_cfg); + } + + /** + * Set a reseller's main IP + * + * This function will allow you to set a reseller's main IP. By default all accounts created by this reseller + * will be created on this IP + * @param string $reseller the username of the reseller to change the main IP of + * @param string $ip The ip you would like this reseller to create accounts on by default + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerMainIp XML API Call documentation + */ + public function setresellermainip($reseller, $ip) + { + if ( !isset($reseller) || !isset($ip) ) { + error_log("setresellermainip requires that an reseller and ip are passed to it"); + + return false; + } + + return $this->xmlapi_query("setresellermainip", array('user' => $reseller, 'ip' => $ip)); + } + + /** + * Set reseller package limits + * + * This function allows you to define which packages a reseller has access to use + * @param string $user The reseller you wish to define package limits for + * @param boolean $no_limit Whether or not you wish this reseller to have packages limits + * @param string $package if $no_limit is false, then the package you wish to modify privileges for + * @param boolean $allowed if $no_limit is false, then defines if the reseller should have access to the package or not + * @param int $number if $no_limit is false, then defines the number of account a reseller can create of a specific package + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerPkgLimit XML API Call documentation + */ + public function setresellerpackagelimits($user, $no_limit, $package = null, $allowed = null, $number = null) + { + if (!isset($user) || !isset($no_limit) ) { + error_log("setresellerpackagelimits requires that a username and no_limit are passed to it by default"); + + return false; + } + if ($no_limit) { + return $this->xmlapi_query("setresellerpackagelimits", array( 'user' => $user, "no_limit" => '1') ); + } else { + if ( is_null($package) || is_null($allowed) ) { + error_log('setresellerpackagelimits requires that package and allowed are passed to it if no_limit eq 0'); + + return false; + } + $params = array( + 'user' => $user, + 'no_limit' => '0', + 'package' => $package, + ); + if ($allowed) { + $params['allowed'] = 1; + } else { + $params['allowed'] = 0; + } + if ( !is_null($number) ) { + $params['number'] = $number; + } + + return $this->xmlapi_query('setresellerpackagelimits', $params); + } + } + + /** + * Suspend a reseller and all accounts owned by a reseller + * + * This function, when called will suspend a reseller account and all account owned by said reseller + * @param string $reseller The reseller account to be suspended + * @param string $reason (optional) The reason for suspending the reseller account + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SuspendReseller XML API Call documentation + */ + public function suspendreseller($reseller, $reason = null) + { + if (!isset($reseller) ) { + error_log("suspendreseller requires that the reseller's username is passed to it"); + + return false; + } + $params = array("user" => $reseller); + if ($reason) { + $params['reason'] = $reason; + } + + return $this->xmlapi_query('suspendreseller', $params); + } + + + /** + * Unsuspend a Reseller Account + * + * This function will unsuspend a reseller account and all accounts owned by the reseller in question + * @param string $user The username of the reseller to be unsuspended + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/UnsuspendReseller XML API Call documentation + */ + public function unsuspendreseller($user) + { + if (!isset($user) ) { + error_log("unsuspendreseller requires that a username is passed to it"); + + return false; + } + + return $this->xmlapi_query('unsuspendreseller', array('user' => $user)); + } + + /** + * Get the number of accounts owned by a reseller + * + * This function will return the number of accounts owned by a reseller account, along with information such as the number of active, suspended and accounting limits + * @param string $user The username of the reseller to get account information from + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AcctCounts XML API Call documentation + */ + public function acctcounts($user) + { + if (!isset($user)) { + error_log('acctcounts requires that a username is passed to it'); + + return false; + } + + return $this->xmlapi_query('acctcounts', array('user' => $user) ); + } + + /** + * Set a reseller's nameservers + * + * This function allows you to change the nameservers that account created by a specific reseller account will use. + * If this function is not passed a $nameservers parameter, it will reset the nameservers for the reseller to the servers's default + * @param string $user The username of the reseller account to grab reseller accounts from + * @param string $nameservers A comma seperate list of nameservers + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerNameservers XML API Call documentation + */ + public function setresellernameservers($user, $nameservers = null) + { + if (!isset($user)) { + error_log("setresellernameservers requires that a username is passed to it"); + + return false; + } + $params = array('user' => $user); + if ($nameservers) { + $params['nameservers'] = $nameservers; + } + + return $this->xmlapi_query('setresellernameservers', $params); + } + + #### + # Server information + #### + + /** + * Get a server's hostname + * + * This function will return a server's hostname + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DisplayServerHostname XML API Call documentation + */ + public function gethostname() + { + return $this->xmlapi_query('gethostname'); + } + + /** + * Get the version of cPanel running on the server + * + * This function will return the version of cPanel/WHM running on the remote system + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DisplaycPanelWHMVersion XML API Call documentation + */ + public function version() + { + return $this->xmlapi_query('version'); + } + + + /** + * Get Load Average + * + * This function will return the loadavg of the remote system + * + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/LoadAvg XML API Call documentation + */ + public function loadavg() + { + return $this->xmlapi_query('loadavg'); + } + + /** + * Get a list of languages on the remote system + * + * This function will return a list of available langauges for the cPanel interface + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/GetLangList XML API Call documentation + * + */ + public function getlanglist() + { + return $this->xmlapi_query('getlanglist'); + } + + #### + # Server administration + #### + + /** + * Reboot server + * + * This function will reboot the server + * @param boolean $force This will determine if the server should be given a graceful or forceful reboot + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RebootServer XML API Call documentation + */ + public function reboot($force = false) + { + if ($force) { + return $this->xmlapi_query('reboot', array('force' => '1')); + } + + return $this->xmlapi_query('reboot'); + } + + /** + * Add an IP to a server + * + * This function will add an IP alias to your server + * @param string $ip The IP to be added + * @param string $netmask The netmask of the IP to be added + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddIPAddress XML API Call documentation + */ + public function addip($ip, $netmask) + { + if (!isset($ip) || !isset($netmask)) { + error_log("addip requires that an IP address and Netmask are passed to it"); + + return false; + } + + return $this->xmlapi_query('addip', array('ip' => $ip, 'netmask' => $netmask)); + } + + // This function allows you to delete an IP address from your server. + /** + * Delete an IP from a server + * + * Remove an IP from the server + * @param string $ip The IP to remove + * @param string $ethernetdev The ethernet device that the IP is bound to + * @param bool $skipifshutdown Whether the function should remove the IP even if the ethernet interface is down + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeleteIPAddress XML API Call documentation + */ + public function delip($ip, $ethernetdev = null, $skipifshutdown = false) + { + $args = array(); + if (!isset($ip)) { + error_log("delip requires that an IP is defined in the array passed to it"); + + return false; + } + $args['ip'] = $ip; + if ($ethernetdev) { + $args['ethernetdev'] = $ethernetdev; + } + $args['skipifshutdown'] = ($skipifshutdown) ? '1' : '0'; + + return $this->xmlapi_query('delip', $args); + } + + /** + * List IPs + * + * This should return a list of IPs on a server + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeleteIPAddress XML API Call documentation + */ + public function listips() + { + return $this->xmlapi_query('listips'); + } + + /** + * Set Hostname + * + * This function will allow you to set the hostname of the server + * @param string $hostname the hostname that should be assigned to the serve + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetHostname XML API Call documentation + */ + public function sethostname($hostname) + { + if (!isset($hostname)) { + error_log("sethostname requires that hostname is passed to it"); + + return false; + } + + return $this->xmlapi_query('sethostname', array('hostname' => $hostname)); + } + + /** + * Set the resolvers used by the server + * + * This function will set the resolvers in /etc/resolv.conf for the server + * @param string $nameserver1 The IP of the first nameserver to use + * @param string $nameserver2 The IP of the second namesever to use + * @param string $nameserver3 The IP of the third nameserver to use + * @param string $nameserver4 The IP of the forth nameserver to use + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResolvers XML API Call documentation + */ + public function setresolvers($nameserver1, $nameserver2 = null, $nameserver3 = null) + { + $args = array(); + if (!isset($nameserver1)) { + error_log("setresolvers requires that nameserver1 is defined in the array passed to it"); + + return false; + } + $args['nameserver1'] = $nameserver1; + if ($nameserver2) { + $args['nameserver2'] = $nameserver2; + } + if ($nameserver3) { + $args['nameserver3'] = $nameserver3; + } + + return $this->xmlapi_query('setresolvers', $args); + } + + /** + * Display bandwidth Usage + * + * This function will return all bandwidth usage information for the server, + * The arguments for this can be passed in via an associative array, the elements of this array map directly to the + * parameters of the call, please see the XML API Call documentation for more information + * @param array $args The configuration for what bandwidth information to display + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ShowBw XML API Call documentation + */ + public function showbw($args = null) + { + if (is_array($args)) { + return $this->xmlapi_query('showbw', $args); + } + + return $this->xmlapi_query('showbw'); + } + + public function nvset($key, $value) + { + if (!isset($key) || !isset($value)) { + error_log("nvset requires that key and value are passed to it"); + + return false; + } + + return $this->xmlapi_query('nvset', array('key' => $key, 'value' => $value)); + } + + // This function allows you to retrieve and view a non-volatile variable's value. + public function nvget($key) + { + if (!isset($key)) { + error_log("nvget requires that key is passed to it"); + + return false; + } + + return $this->xmlapi_query('nvget', array('key' => $key)); + } + + #### + # Service functions + #### + + /** + * Restart a Service + * + * This function allows you to restart a service on the server + * @param string $service the service that you wish to restart please view the XML API Call documentation for acceptable values to this parameters + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RestartService XML API Call documentation + */ + public function restartsrv($service) + { + if (!isset($service)) { + error_log("restartsrv requires that service is passed to it"); + + return false; + } + + return $this->xmlapi_query('restartservice', array('service' => $service)); + } + + /** + * Service Status + * + * This function will return the status of all services on the and whether they are running or not + * @param string $service A single service to filter for. + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ServiceStatus XML API Call documentation + */ + public function servicestatus($args=array()) + { + if (!empty($args) && !is_array($args)) { + $args = array('service'=>$args); + } elseif (!is_array($args)) { + $args = array(); + } + + return $this->xmlapi_query('servicestatus', $args); + } + + /** + * Configure A Service + * + * This function will allow you to enabled or disable services along with their monitoring by chkservd + * @param string $service The service to be monitored + * @param bool $enabled Whether the service should be enabled or not + * @param bool $monitored Whether the service should be monitored or not + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ConfigureService XML API Call documentation + */ + public function configureservice($service, $enabled = true, $monitored = true) + { + if (!isset($service)) { + error_log("configure service requires that a service is passed to it"); + + return false; + } + $params = array('service' => $service); + + if ($enabled) { + $params['enabled'] = 1; + } else { + $params['enabled'] = 0; + } + + if ($monitored) { + $params['monitored'] = 1; + } else { + $params['monitored'] = 0; + } + + return $this->xmlapi_query('configureservice', $params); + + } + + #### + # SSL functions + #### + + /** + * Display information on an SSL host + * + * This function will return information on an SSL Certificate, CSR, cabundle and SSL key for a specified domain + * @param array $args Configuration information for the SSL certificate, please see XML API Call documentation for required values + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/FetchSSL XML API Call documentation + */ + public function fetchsslinfo($args) + { + if ( (isset($args['domain']) && isset($args['crtdata'])) || (!isset($args['domain']) && !isset($args['crtdata'])) ) { + error_log("fetchsslinfo requires domain OR crtdata is passed to it"); + } + if (isset($args['crtdata'])) { + // crtdata must be URL-encoded! + $args['crtdata'] = urlencode(trim($args['crtdata'])); + } + + return $this->xmlapi_query('fetchsslinfo', $args); + } + + /** + * Generate an SSL Certificate + * + * This function will generate an SSL Certificate, the arguments for this map directly to the call for the XML API call. Please consult the XML API Call documentation for more information + * @param array $args the configuration for the SSL Certificate being generated + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/GenerateSSL XML API Call documentation + */ + public function generatessl($args) + { + if (!isset($args['xemail']) || !isset($args['host']) || !isset($args['country']) || !isset($args['state']) || !isset($args['city']) || !isset($args['co']) || !isset($args['cod']) || !isset($args['email']) || !isset($args['pass'])) { + error_log("generatessl requires that xemail, host, country, state, city, co, cod, email and pass are defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('generatessl', $args); + } + + /** + * Install an SSL certificate + * + * This function will allow you to install an SSL certificate that is uploaded via the $argument parameter to this call. The arguments for this call map directly to the parameters for the XML API call, + * please consult the XML API Call documentation for more information. + * @param array $args The configuration for the SSL certificate + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/InstallSSL XML API Call documentation + */ + public function installssl($args) + { + if (!isset($args['user']) || !isset($args['domain']) || !isset($args['cert']) || !isset($args['key']) || !isset($args['cab']) || !isset($args['ip'])) { + error_log("installssl requires that user, domain, cert, key, cab and ip are defined in the array passed to it"); + + return false; + } + + return $this->xmlapi_query('installssl', $args); + } + + /** + * List SSL Certs + * + * This function will list all SSL certificates installed on the server + * @return mixed + * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListSSL XML API Call documentation + */ + public function listcrts() + { + return $this->xmlapi_query('listcrts'); + } + + #### + # cPanel API1 functions + # Note: A cPanel account username is required + # Some cPanel features must be enabled to be able to use some function (f.e. park, unpark) + #### + + // This API1 function adds a emailaccount for a specific user. + public function addpop($username, $args) + { + if (!isset($username) || !isset($args)) { + error_log("addpop requires that a user and args are passed to it"); + + return false; + } + if (is_array($args) && (sizeof($args) < 3)) { + error_log("addpop requires that args at least contains an email_username, email_password and email_domain"); + + return false; + } + + return $this->api1_query($username, 'Email', 'addpop', $args); + } + + // This API function parks a domain onto this user's account + public function park($username, $newdomain, $topdomain) + { + $args = array(); + if ( (!isset($username)) && (!isset($newdomain)) ) { + error_log("park requires that a username and new domain are passed to it"); + + return false; + } + $args['domain'] = $newdomain; + if ($topdomain) { + $args['topdomain'] = $topdomain; + } + + return $this->api2_query($username, 'Park', 'park', $args); + } + + // This API function unparks a domain from this user's account. + public function unpark($username, $domain) + { + $args = array(); + if ( (!isset($username)) && (!isset($domain)) ) { + error_log("unpark requires that a username and domain are passed to it"); + + return false; + } + $args['domain'] = $domain; + + return $this->api2_query($username, 'Park', 'unpark', $args); + } + + #### + # cPanel API2 functions + # Note: A cPanel account username is required + # Some cPanel features must be enabled to be able to use some function + #### + + // This API2 function allows you to view the diskusage of a emailaccount. + public function getdiskusage($username, $args) + { + if (!isset($username) || !isset($args)) { + error_log("getdiskusage requires that a username and args are passed to it"); + + return false; + } + if (is_array($args) && (!isset($args['domain']) || !isset($args['login']))) { + error_log("getdiskusage requires that args at least contains an email_domain and email_username"); + + return false; + } + + return $this->api2_query($username, 'Email', 'getdiskusage', $args); + } + + // This API2 function allows you to list ftp-users associated with a cPanel account including disk information. + public function listftpwithdisk($username) + { + if (!isset($username)) { + error_log("listftpwithdisk requires that user is passed to it"); + + return false; + } + + return $this->api2_query($username, 'Ftp', 'listftpwithdisk'); + } + + // This API2 function allows you to list ftp-users associated with a cPanel account. + public function listftp($username) + { + if (!isset($username)) { + error_log("listftp requires that user is passed to it"); + + return false; + } + + return $this->api2_query($username, 'Ftp', 'listftp'); + } + + // This API function displays a list of all parked domains for a specific user. + public function listparkeddomains($username, $domain = null) + { + $args = array(); + if (!isset($username)) { + error_log("listparkeddomains requires that a user is passed to it"); + + return false; + } + if (isset($domain)) { + $args['regex'] = $domain; + + return $this->api2_query($username, 'Park', 'listparkeddomains', $args); + } + + return $this->api2_query($username, 'Park', 'listparkeddomains'); + } + + // This API function displays a list of all addon domains for a specific user. + public function listaddondomains($username, $domain = null) + { + $args = array(); + if (!isset($username)) { + error_log("listaddondomains requires that a user is passed to it"); + + return false; + } + if (isset($domain)) { + $args['regex'] = $domain; + + return $this->api2_query($username, 'AddonDomain', 'listaddondomains', $args); + } + + return $this->api2_query($username, 'Park', 'listaddondomains'); + } + + // This API function displays a list of all selected stats for a specific user. + public function stat($username, $args = null) + { + if ( (!isset($username)) || (!isset($args)) ) { + error_log("stat requires that a username and options are passed to it"); + + return false; + } + if (is_array($args)) { + $display = ''; + foreach ($args as $key => $value) { + $display .= $value . '|'; + } + $values['display'] = substr($display, 0, -1); + } else { + $values['display'] = substr($args, 0, -1); + } + + return $this->api2_query($username, 'StatsBar', 'stat', $values); + } + +} diff --git a/library/App/Controller/Plugin/LangSelector.php b/library/App/Controller/Plugin/LangSelector.php new file mode 100644 index 0000000..0f0616f --- /dev/null +++ b/library/App/Controller/Plugin/LangSelector.php @@ -0,0 +1,34 @@ +getParam('lang',''); + $langLocale = ''; + + switch($lang) { + case "it": + $langLocale = 'it'; break; + case "en": + $langLocale = 'en'; break; + default: + $langLocale = isset($session->lang) ? $session->lang : Zend_Registry::get('Zend_Locale')->getLanguage(); + } + + $locale = new Zend_Locale($langLocale); + Zend_Registry::set('Zend_Locale', $locale); + + $translationPath = dirname( APPLICATION_PATH ) . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . $langLocale; + $translate = new Zend_Translate('array', $translationPath, $locale); + + $session->lang = $langLocale; + + Zend_Registry::set('Zend_Translate', $translate); + Zend_Validate_Abstract::setDefaultTranslator($translate); + Zend_Form::setDefaultTranslator($translate); + + } +} diff --git a/library/App/Controller/Rest/Controller.php b/library/App/Controller/Rest/Controller.php new file mode 100644 index 0000000..01f04b0 --- /dev/null +++ b/library/App/Controller/Rest/Controller.php @@ -0,0 +1,572 @@ +_helper->viewRenderer->setNoRender(true); + $this->_helper->AjaxContext() + ->addActionContext('get', 'json') + ->addActionContext('post', 'json') + ->addActionContext('put', 'json') + ->addActionContext('patch', 'json') + ->addActionContext('delete', 'json') + ->addActionContext('options', 'json') + ->addActionContext('head', 'json') + ->initContext('json'); + + $this->_responseData = new stdClass(); + $this->_status = false; + $this->_inArray = false; + + if (!$this->_resourceFormName) { + $this->_resourceFormName = $this->_resourceName; + } + + if (!$this->_patchResourceName) { + $this->_patchResourceName = $this->_resourceName; + } + + $this->_genericModel = new Application_Model_Generic(); + $this->_dbAdapter = $this->_genericModel->getResource($this->_resourceName)->getDbAdapter(); + } + + public function preDispatch() + { + $this->_response->setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Authorization,x-requested-with,Content-Type,Cache-Control,X-As-Dev-On,X-As-Dev-Pw,MongoDbName'); + $this->_response->setHeader('Access-Control-Expose-Headers', 'X-Tot-Items,X-Page,X-Count,X-Tot-Filtered'); + $this->_response->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, PATCH, DELETE'); + $this->_response->setHeader('Access-Control-Allow-Origin', '*'); + $this->_response->setHeader('Access-Control-Allow-Credentials', 'true'); + + // Controllo sui metodi di prefetch + if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { + return $this->optionsAction(); + } + + if ($_SERVER['REQUEST_METHOD'] === 'HEAD') { + return $this->optionsAction(); + } + + if ($_SERVER['REQUEST_METHOD'] === 'PATCH') { + return $this->patchAction(); + } + } + + //##################################### CRUD FUNCTIONS ############################################################# + + public function indexAction() + { + $this->getAction(); + } + + public function getAction() + { + try { + $this->switchMethodFunction($this->_getParam('method')); + } catch (Exception $e) { + $this->_status = false; + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function postAction() + { + + try { + + $this->_dbAdapter->beginTransaction(); + + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + + $form = $this->getAddFormForResource(); + + //Inserimento di batch + if (is_array($params[0])) { + $failedElements = array(); + foreach ($params as $key => $riga) { + if ($form->isValid($riga)) { + $dati = $form->getValues(); + $this->insertSingleElement($dati); + } else { + array_push($failedElements, $key); + } + } + + $this->_dbAdapter->commit(); + + $this->_status = true; + $this->_responseData->data = array('failed_elements_index' => $failedElements); + return $this->sendResponse(); + } + + //Inserimento di un singolo elemento + if (!$form->isValid($params)) { + $this->_status = false; + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID; + $this->_responseData->message = 'I dati inseriti non sono validi'; + $this->_responseData->errorDetails = $form->getMessages(); + $this->sendResponse(); + } + + $dati = $form->getValues(); + + $dati = $this->preInsertElement($dati); + + $dati['id'] = $this->insertSingleElement($dati); + + $this->_dbAdapter->commit(); + + $dati = $this->afterInsertElement($dati); + + $this->_responseData->data = ($this->_returnWithDataObject) ? array('data' => $dati) : $dati; + $this->_status = true; + + $this->sendResponse(); + } catch (Exception $e) { + try{ + $this->_dbAdapter->rollBack(); + }catch (Exception $e2){} + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function putAction() + { + try { + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + + $this->_dbAdapter->beginTransaction(); + $form = $this->getAddFormForResource(); + + //Aggiornamento di batch + if (is_array($params[0])) { + $failedElements = array(); + $resolvedElements = array(); + foreach ($params as $key => $riga) { + if ($form->isValid($riga) && $riga['id']) { + $this->updateSingleElement($riga['id'], $form->getValues()); + array_push($resolvedElements, $riga['id']); + } else { + array_push($failedElements, $riga['id']); + } + } + + $this->_dbAdapter->commit(); + + $this->_status = true; + $this->_responseData->data = array('failed_elements_id' => $failedElements, 'resolved_elements_id' => $resolvedElements); + return $this->sendResponse(); + } + + //Aggiornamento singolo + if (!$form->isValidPartial($params)) { + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID; + $this->_responseData->message = 'I dati inseriti non sono validi'; + $this->_responseData->errorDetails = $form->getMessages(); + $this->sendResponse(); + } + + $dati = $form->getValues(); + + if (!$this->_getParam('id')) { + $this->_responseData->message = 'Id elemento non trovato'; + $this->sendResponse(); + } + + $dati = $this->preUpdateElement($dati, $this->_getParam('id')); + + $this->updateSingleElement($this->_getParam('id'), $dati); + $dati['id'] = $this->_getParam('id'); + + $this->_dbAdapter->commit(); + + $dati = $this->afterUpdateElement($dati); + + $this->_responseData->data = ($this->_returnWithDataObject) ? array('data' => $dati) : $dati; + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + try{ + $this->_dbAdapter->rollBack(); + }catch (Exception $e2){} + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function patchAction() + { + try { + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + + $this->_dbAdapter->beginTransaction(); + $form = $this->getAddFormForResource(); + + //Aggiornamento singolo + if (!$form->isValidPartial($params)) { + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID; + $this->_responseData->message = 'I dati inseriti non sono validi'; + $this->_responseData->errorDetails = $form->getMessages(); + $this->sendResponse(); + } + + $formData = $form->getValues(); + + //rimuovo i valori vuoti che non devono essere sovrascritti + foreach ($formData as $key => $val) { + if (!$val) unset($formData[$key]); + } + + $id = $this->_getParam('id'); + if (!$id) { + $this->_responseData->message = 'Id elemento non trovato'; + $this->sendResponse(); + } + + $oldElement = $this->_genericModel->getById($this->_resourceName, $id); + $dati = array_merge($oldElement, $formData); + + $dati = $this->preUpdateElement($dati, $this->_getParam('id')); + + $dati = $this->updateSingleElement($this->_getParam('id'), $dati); + + $this->_dbAdapter->commit(); + + $dati = $this->afterUpdateElement($dati); + + $this->_responseData->data = $dati; + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + try{ + $this->_dbAdapter->rollBack(); + }catch (Exception $e2){} + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function deleteAction() + { + try { + + $this->_dbAdapter->beginTransaction(); + + if (!$this->_getParam('id')) { + $this->_status = false; + $this->_responseData->message = "Errore id non trovato"; + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_NOIDERROR; + return $this->sendResponse(); + } + + $toDelete = explode(',', $this->_getParam('id')); + //Eliminazione batch + if (is_array($toDelete) && count($toDelete) > 1) { + $failedElements = array(); + $resolvedElements = array(); + foreach ($toDelete as $key => $id) { + try { + $this->deleteSingleElement($id); + array_push($resolvedElements, $id); + } catch (Exception $e) { + array_push($failedElements, $id); + } + } + + $this->_dbAdapter->commit(); + $this->_responseData->data = $resolvedElements; + $this->_status = true; + + return $this->sendResponse(); + } + + $id = $this->_getParam('id', null); + if (!$id) { + $this->_responseData->message = 'Id non ricevuto'; + $this->sendResponse(); + } + + // Pre delete + $this->preDeleteElement($id); + + //Eliminazione Singola + $this->deleteSingleElement($id); + + // After delete + $this->afterDeleteElement($id); + + $this->_dbAdapter->commit(); + $this->_status = true; + return $this->sendResponse(); + } catch (Exception $e) { + try{ + $this->_dbAdapter->rollBack(); + }catch (Exception $e2){} + $this->_responseData->message = $e->getMessage(); + return $this->sendResponse(); + } + } + + public function headAction() + { + $this->_status = true; + $this->sendResponse(); + } + + public function optionsAction() + { + $this->_status = true; + $this->sendResponse(); + } + + //##################################### SINGLE ELEMENT FUNCTIONS ################################################### + + public function getSingleElement($id) + { + return $this->getSingleElementManipulate($this->_genericModel->getById($this->_resourceName, $id)); + } + + public function insertSingleElement($dati) + { + return $this->_genericModel->insert($this->_resourceName, $dati); + } + + public function updateSingleElement($id, $dati) + { + return $this->_genericModel->update($this->_resourceName, $id, $dati); + } + + public function deleteSingleElement($id) + { + return $this->_genericModel->delete($this->_resourceName, $id); + } + + public function insertDataToRowList($list) + { + return $list; + } + + //##################################### SWITCH METHOD FUNCTIONS ################################################### + + public function switchMethodFunction($method) + { + switch ($method) { + case'bycolumn': + $this->defaultGetByColumnName(); + break; + default: + $this->defaultGetList(); + break; + } + } + + protected function defaultGetList() + { + if ($this->_getParam('id') != null) { + $this->_responseData->data = $this->getSingleElement($this->_getParam('id')); + } else { + $this->_inArray = true; + + $page = $this->_getParam('page', $this->_defaultPageNumber); + $count = $this->_getParam('count', $this->_defaultPageCount); + $order = $this->_getParam('order', $this->_defaultOrder); + $select = $this->_getParam('select', null); + + $this->checkIfSetJoinData($this->getAllParams()); + $this->checkIfSetGroupBy($this->getAllParams()); + + $where = $this->_helper->FilterFunctions($this->getAllParams()); + + $where = $this->setFixedSelectWhere($where); + $data = $this->_genericModel->getList($this->_resourceName, $page, $count, $where, $order, $select, $this->_joinData, $this->_groupBy); + + $data = $this->insertDataToRowList($data); + + $this->_responseData->data = $data; + } + + $this->_status = true; + $this->sendResponse(); + } + + public function defaultGetByColumnName() + { + $columnName = $this->_getParam('name', ''); + $val = $this->_getParam('val', ''); + + $data = $this->_genericModel->getByColumnName($this->_resourceName, $columnName, $val); + + $this->_responseData->data = $data; + $this->_status = true; + $this->sendResponse(); + } + + /** + * Serve per applicare eventuali filtri fissi + * @param $where + * @return mixed + */ + public function setFixedSelectWhere($where) + { + return $where; + } + + /** + * Serve ad applicare un eventuale joinData + * @param $params + */ + public function checkIfSetJoinData($params) + { + + } + + /** + * Serve ad applicare un eventuale groupBy + * @param $params + */ + public function checkIfSetGroupBy($params) + { + + } + + //##################################### HELPERS FUNCTIONS ################################################### + + public function getSingleElementManipulate($data) + { + return $data; + } + + public function preInsertElement($data) + { + return $data; + } + + public function afterInsertElement($data) + { + return $data; + } + + public function preUpdateElement($data, $id) + { + return $data; + } + + public function afterUpdateElement($data) + { + return $data; + } + + public function preDeleteElement($id) + { + return; + } + + public function afterDeleteElement($id) + { + return; + } + + //##################################### GENERIC FUNCTIONS ########################################################## + + public function sendResponse() + { + + if (!$this->_status) { + $message = (!$this->_responseData->message) ? "Errore non identificato sul web service risorsa: '$this->_resourceName'" : $this->_responseData->message; + $errorCode = (!$this->_responseData->errorCode) ? App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR : $this->_responseData->errorCode; + + $this->sendErrorResponse($message, $errorCode); + } + + if (isset($this->_responseData->data)) { + if ($this->_responseData->data instanceof Zend_Paginator) { + $this->_responseData->totalItems = $this->_genericModel->getCountTotal($this->_resourceName); + $this->_responseData->currentItemsCount = $this->_responseData->data->getTotalItemCount(); + $this->_responseData->data = (array)$this->_responseData->data->getCurrentItems(); + } else if (is_array($this->_responseData->data)) { + $this->_responseData->totalItems = $this->_genericModel->getCountTotal($this->_resourceName); + $this->_responseData->currentItemsCount = count($this->_responseData->data); + } else if (is_string($this->_responseData->data)) { + $this->_responseData->data = array('message' => $this->_responseData->data); + } + } + + if ($this->_inArray) { + $content = $this->_responseData->data; + $this->getResponse() + ->setHeader('X-Page', $this->getParam('page')) + ->setHeader('X-Count', $this->getParam('count')) + ->setHeader('X-Tot-Filtered', $this->_responseData->currentItemsCount) + ->setHeader('X-Tot-Items', $this->_responseData->totalItems); + } else { + $content = ($this->_responseData->data); + } + + $this->getResponse() + ->setHeader('Content-Type', 'application/json;charset=utf-8') + ->setBody($this->_helper->Globalfunction->safeJsonEncode($content)) + ->sendResponse(); + + exit; + } + + public function sendErrorResponse($message, $errorCode, $dbName = null) + { + + $message = (!$message) ? "Errore non identificato sul web service risorsa: '$this->_resourceName'" : $message; + $errorCode = (!$errorCode) ? App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR : $errorCode; + + throw new App_Controller_Errors_WebServiceError(utf8_encode($message), $dbName, $errorCode); + } + + public function disableCallAction() + { + // Disabilito la risorsa + $this->sendErrorResponse("Funzione non disponibile", App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_NOPERMISSION); + } + + public function getAddFormForResource() + { + + $class = implode('_', array( + 'Application_Form', + strtoupper($this->getRequest()->getModuleName()), + ucfirst($this->_resourceFormName), + 'Add')); + + if (!class_exists($class)) { + throw new App_Controller_Errors_WebServiceError("Classe '$class' potrebbe non esistere"); + } + + return new $class(); + } + +} + diff --git a/library/App/Controller/Rest/MongoController.php b/library/App/Controller/Rest/MongoController.php new file mode 100644 index 0000000..3db0643 --- /dev/null +++ b/library/App/Controller/Rest/MongoController.php @@ -0,0 +1,393 @@ +_helper->viewRenderer->setNoRender(true); + $this->_helper->AjaxContext() + ->addActionContext('get', 'json') + ->addActionContext('post', 'json') + ->addActionContext('put', 'json') + ->addActionContext('patch', 'json') + ->addActionContext('delete', 'json') + ->addActionContext('options', 'json') + ->addActionContext('head', 'json') + ->initContext('json'); + + } + + public function preDispatch() + { + $this->_responseData = new stdClass(); + $this->_status = false; + $this->_inArray = false; + + $this->_mongoModel = new App_Model_Mongo_Client(); + + $this->_response->setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Authorization,x-requested-with,Content-Type,Cache-Control,X-As-Dev-On,X-As-Dev-Pw'); + $this->_response->setHeader('Access-Control-Expose-Headers', 'X-Tot-Items, X-Page,X-Count,X-Tot-Filtered'); + $this->_response->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, PATCH, DELETE'); + $this->_response->setHeader('Access-Control-Allow-Origin', '*'); + $this->_response->setHeader('Access-Control-Allow-Credentials', 'true'); + + // Controllo sui metodi di prefetch + if($_SERVER['REQUEST_METHOD'] === 'OPTIONS'){ + return $this->optionsAction(); + } + + if($_SERVER['REQUEST_METHOD'] === 'HEAD'){ + return $this->optionsAction(); + } + + if($_SERVER['REQUEST_METHOD'] === 'PATCH'){ + return $this->patchAction(); + } + } + + //##################################### CRUD FUNCTIONS ############################################################# + + public function indexAction() + { + $this->getAction(); + } + + public function getAction() + { + + try { + switch ($this->_getParam('method')) { + default: + if ($this->_getParam('id') != null) { + $this->_responseData->data = $this->getSingleElement($this->_getParam('id')); + } else { + $this->_inArray = true; + + $page = intval($this->_getParam('page', null)); + $count = intval($this->_getParam('count', null)); + $order = $this->_getParam('order', null); + //$projection = $this->_helper->MongoProjectionFunctions($this->_getParam('select', null), $this->_defaultProjection); + $projection = $this->_getParam('select', null); + $addFields = null; + + $where = $this->_helper->MongoFilterFunctions($this->getAllParams()); + + $where = $this->handleGetListFilters($where); + + $data = $this->_mongoModel->getListAggregation($this->_resourceName, $page, $count, $where, $order, $projection, $addFields); + + // Zend_Registry::get('log')->info(print_r($data,true)); + + $this->_responseData->data = $data; + } + break; + } + + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + $this->_status = false; + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function postAction() + { + + try { + + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + + $form = $this->getAddFormForResource(); + + //Inserimento di un singolo elemento + if (!$form->isValid($params)) { + $this->_status = false; + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID; + $this->_responseData->message = 'I dati inseriti non sono validi'; + $this->_responseData->errorDetails = $form->getMessages(); + $this->sendResponse(); + } + + $dati = $form->getValues(); + + $dati = $this->preInsertElement($dati); + + $dati['id'] = $this->insertSingleElement($dati); + + $dati = $this->afterInsertElement($dati); + + $this->_responseData->data = array('data' => $dati); + $this->_status = true; + + $this->sendResponse(); + } catch (Exception $e) { + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function putAction() + { + try { + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + + $form = $this->getAddFormForResource(); + + //Aggiornamento singolo + if (!$form->isValidPartial($params)) { + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID; + $this->_responseData->message = 'I dati inseriti non sono validi'; + $this->_responseData->errorDetails = $form->getMessages(); + $this->sendResponse(); + } + + $dati = $form->getValues(); + + if (!$this->_getParam('id')) { + $this->_responseData->message = 'Id elemento non trovato'; + $this->sendResponse(); + } + + $dati = $this->preUpdateElement($dati, $this->_getParam('id')); + + $this->updateSingleElement($this->_getParam('id'), $dati); + $dati['id'] = $this->_getParam('id'); + + $dati = $this->afterUpdateElement($dati); + + $this->_responseData->data = array('data' => $dati); + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function patchAction() + { + try { + $params = Zend_Json::decode($this->getRequest()->getRawBody()); + + // Zend_Registry::get('log')->info(print_r($params,true)); + + $form = $this->getAddFormForResource(); + + //Aggiornamento singolo + if (!$form->isValidPartial($params)) { + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID; + $this->_responseData->message = 'I dati inseriti non sono validi'; + $this->_responseData->errorDetails = $form->getMessages(); + $this->sendResponse(); + } + + $dati = $form->getValues(); + + //rimuovo i valori vuoti che non devono essere sovrascritti + foreach ($dati as $key => $val){ + if(!$val) unset($dati[$key]); + } + + $id = $this->_getParam('id'); + if (!$id) { + $this->_responseData->message = 'Id elemento non trovato'; + $this->sendResponse(); + } + + // Zend_Registry::get('log')->info(print_r($dati,true)); + + $oldElement = (array) $this->_mongoModel->getById($this->_resourceName, $id); + $dati = array_merge($oldElement, $dati); + + // Zend_Registry::get('log')->info(print_r($oldElement,true)); + + $dati = $this->preUpdateElement($dati, $id); + + // Zend_Registry::get('log')->info(print_r($dati,true)); + + $this->updateSingleElement($id, $dati); + $dati['id'] = $id; + + $dati = $this->afterUpdateElement($dati); + + $this->_responseData->data = array('data' => $dati); + $this->_status = true; + $this->sendResponse(); + } catch (Exception $e) { + $this->_responseData->message = $e->getMessage(); + $this->sendResponse(); + } + } + + public function deleteAction() + { + try { + + if (!$this->_getParam('id')) { + $this->_status = false; + $this->_responseData->message = "Errore id non trovato"; + $this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_NOIDERROR; + return $this->sendResponse(); + } + + //Eliminazione Singola + $this->deleteSingleElement($this->_getParam('id')); + + $this->_status = true; + return $this->sendResponse(); + } catch (Exception $e) { + $this->_responseData->message = $e->getMessage(); + return $this->sendResponse(); + } + } + + public function headAction() + { + $this->_status = true; + $this->sendResponse(); + } + + public function optionsAction() + { + $this->_status = true; + $this->sendResponse(); + } + + //##################################### SINGLE ELEMENT FUNCTIONS ################################################### + + public function getSingleElement($id) + { + return $this->getSingleElementManipulate($this->_mongoModel->getById($this->_resourceName, $id)); + } + + public function insertSingleElement($dati) + { + return $this->_mongoModel->insert($this->_resourceName, $dati); + } + + public function updateSingleElement($id, $dati) + { + return $this->_mongoModel->update($this->_resourceName, $id, $dati); + } + + public function deleteSingleElement($id) + { + return $this->_mongoModel->delete($this->_resourceName, $id); + } + + //##################################### HELPERS FUNCTIONS ################################################### + + public function getSingleElementManipulate($data) + { + return $data; + } + + public function preInsertElement($data) + { + return $data; + } + + public function afterInsertElement($data) + { + return $data; + } + + public function preUpdateElement($data, $id) + { + return $data; + } + + public function afterUpdateElement($data) + { + return $data; + } + + public function handleGetListFilters($where){ + return $where; + } + + //##################################### GENERIC FUNCTIONS ########################################################## + + public function sendResponse() + { + + if (!$this->_status) { + $message = (!$this->_responseData->message) ? "Errore non identificato sul web service risorsa: '$this->_resourceName'" : $this->_responseData->message; + $errorCode = (!$this->_responseData->errorCode) ? App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR : $this->_responseData->errorCode; + + $this->sendErrorResponse($message, $errorCode); + } + + if (isset($this->_responseData->data) && is_array($this->_responseData->data)) { + $this->_responseData->totalItems = $this->_mongoModel->getCountTotal($this->_resourceName); + + if (Zend_Registry::isRegistered(App_Model_Mongo_Client::WHERE_MONGO_REG_NAME)) { + $this->_responseData->currentItemsCount = $this->_mongoModel->getCountFilteredTotal($this->_resourceName, Zend_Registry::get(App_Model_Mongo_Client::WHERE_MONGO_REG_NAME)); + } else { + $this->_responseData->currentItemsCount = $this->_responseData->totalItems; + } + } + + if ($this->_inArray) { + $content = $this->_responseData->data; + $this->getResponse() + ->setHeader('X-Page', $this->getParam('page')) + ->setHeader('X-Count', $this->getParam('count')) + ->setHeader('X-Tot-Filtered', $this->_responseData->currentItemsCount) + ->setHeader('X-Tot-Items', $this->_responseData->totalItems); + } else { + $content = ($this->_responseData->data); + } + + $this->getResponse() + ->setHeader('Content-Type', 'application/json;charset=utf-8') + ->setBody($this->_helper->Globalfunction->safeJsonEncode($content)) + ->sendResponse(); + + exit; + } + + public function sendErrorResponse($message, $errorCode, $dbName = null) + { + + $message = (!$message) ? "Errore non identificato sul web service risorsa: '$this->_resourceName'" : $message; + $errorCode = (!$errorCode) ? App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR : $errorCode; + + throw new App_Controller_Errors_WebServiceError(utf8_encode($message), $dbName, $errorCode); + } + + public function disableCallAction() + { + // Disabilito la risorsa + $this->sendErrorResponse("Funzione non disponibile", App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_NOPERMISSION); + } + + protected function getAddFormForResource() + { + + $class = implode('_', array( + 'Application_Form', + strtoupper($this->getRequest()->getModuleName()), + ucfirst($this->_resourceName), + 'Add')); + + if (!class_exists($class)) { + throw new App_Controller_Errors_WebServiceError("Classe '$class' potrebbe non esistere"); + } + + return new $class(); + } + +} + diff --git a/library/App/Controller/Sections/AbstractSection.php b/library/App/Controller/Sections/AbstractSection.php new file mode 100644 index 0000000..40cfa6b --- /dev/null +++ b/library/App/Controller/Sections/AbstractSection.php @@ -0,0 +1,552 @@ +_controller = $controller; + $this->_model = $controller->getMainModel(); + + if (!($this->_controller->_configs instanceof App_Service_ConfigManager)) + throw new Exception("E' necessario instanziare nella classe " . get_class($this->_controller) . " la proprietà '_configs' come App_Service_ConfigManager"); + + $this->_COOKIE_EXPIRE_TIME = time() + (86400 * 30); + + $BASE_COOKIE_STRING = str_replace('#module#', strtolower($this->_controller->getRequest()->getModuleName()), + str_replace('#site#', strtolower(Zend_Registry::get('ENVIROMENTS')->get('site_short_id')), + str_replace('#resource#', strtolower($this->_resourceName), self::COOKIE_BASE_STRING_VARIABLE_NAME))); + + $this->_COUNT_VARIABLE_NAME = $BASE_COOKIE_STRING . "count"; + $this->_ORDER_VARIABLE_NAME = $BASE_COOKIE_STRING . "order"; + $this->_ORDERTYPE_VARIABLE_NAME = $BASE_COOKIE_STRING . "ordertype"; + $this->_SEARCHPARAMS_VARIABLE_NAME = $BASE_COOKIE_STRING . "searchparams"; + } + + /*************************************************************************************************************** + ************************************** FUNZIONI CRUD *********************************************** + **************************************************************************************************************/ + + public function lista() + { + + $this->listPreDispatch(); + + $this->handleSearchListParams(); + + $this->checkIfSetJoinData($this->_SEARCH_PARAMS); + $this->checkIfSetGroupBy($this->_SEARCH_PARAMS); + + $orderString = $this->_ORDERLIST . ' ' . $this->_ORDERLIST_TYPE; + + $where = $this->_controller->getHelper('FilterFunctions')->direct($this->_SEARCH_PARAMS, true); + $list = $this->_model->getList($this->_resourceName, $this->_PAGE, $this->_COUNT, $where, $orderString, '*', $this->_joinData, $this->_groupBy); + + if ($list instanceof Zend_Paginator) { + $list->setPageRange(5); + $this->_controller->view->totFiltrati = $list->getTotalItemCount(); + } else { + $this->_controller->view->totFiltrati = count($list); + } + + $this->_controller->view->totElementi = $this->_model->getCountTotal($this->_resourceName); + $this->_controller->view->table = $list; + + $this->listPostDispatch(); + } + + public function get() + { + $this->_controller->getHelper('layout')->disableLayout(); + $this->_controller->getHelper('viewRenderer')->setNoRender(); + + if ($this->_controller->getRequest()->isXmlHttpRequest()) { + if (!$this->_controller->getParam('id')) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => false, 'message' => 'Id non ricevuto'))); + } + $element = $this->_model->getById($this->_resourceName, $this->_controller->getParam('id')); + if (!$element) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => false, 'message' => $this->_resourceName . ' non trovato'), false)); + } + + if (method_exists($this, 'getElement')) { + $element = $this->getElement($element); + } + + $response = Zend_Json::encode(array_merge($element, array('success' => true))); + $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody($response); + } + } + + public function save() + { + $this->_controller->getHelper('layout')->disableLayout(); + $this->_controller->getHelper('viewRenderer')->setNoRender(); + + if ($this->_controller->getRequest()->isXmlHttpRequest()) { + + if (!$this->_controller->getRequest()->isPost()) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => FALSE, 'message' => 'Errore durante la richiesta.'))); + } + + $form = $this->getDefaultSaveFormClassName(); + if (!$form->isValid($_POST)) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => 'invalid', + 'message' => 'Controllare i dati inseriti nei campi sono presenti errori.', + 'errors' => $form->getMessages()))); + } + + try { + + $dati = $form->getValues(); + $id = $this->_controller->getParam('id'); + $op = $this->_controller->getParam('op'); + + $response = array(); + $response['id'] = $id; + $response['op'] = $op; + + if ($op == 'insert') { + $dati = $this->preInsertFunction($dati); + + $dati['id'] = $this->insertFunction($dati); + + $dati = $this->afterInsertFunction($dati); + } else { + + if (!$id) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('success' => FALSE, + 'message' => 'Errore id non ricevuto'))); + } + + $dati = $this->preUpdateFunction($dati, $id); + + $this->updateFunction($id, $dati); + $dati['id'] = $id; + + $dati = $this->afterUpdateFunction($dati, $id); + } + + $this->_controller->view->assign($dati); + $this->_controller->render(strtolower($this->_resourceName) . '/td'); + + $response['text'] = $this->_controller->getResponse()->getBody(); + $response['data'] = $dati; + + $response['success'] = true; + $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode($response)); + } catch (Exception $e) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('stato' => false, + 'shortMessage' => 'Si è verificato un errore durante il salvataggio dei dati', + 'message' => $e->getMessage()) + )); + } + } + } + + public function delete() + { + if ($this->_controller->getRequest()->isXmlHttpRequest()) { + + $this->_controller->getHelper('layout')->disableLayout(); + $this->_controller->getHelper('viewRenderer')->setNoRender(); + + if (!$this->_controller->getParam('id') || !$this->_controller->getParam('cod')) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('success' => false, + 'message' => 'Id o codice non trovato.'))); + } + + try { + $this->deleteSingleElement($this->_controller->getParam('id')); + + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('success' => true))); + } catch (Exception $e) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('success' => false, + 'message' => 'Si è verificato un errore durante l\'eliminazione.' . $e->getMessage()))); + } + + } + } + + public function deleteSelect() + { + $this->_controller->getHelper('layout')->disableLayout(); + $this->_controller->getHelper('viewRenderer')->setNoRender(); + if ($this->_controller->getRequest()->isXmlHttpRequest()) { + if ($this->_controller->getParam('data')) { + $data = $this->_controller->getParam('data'); + if (count($data) <= 0) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode(array('success' => FALSE, 'message' => 'Nessun elemento selezionato'))); + } + $response['success'] = 'TRUE'; + $response['id'] = array(); + foreach ($data as $key => $value) { + array_push($response['id'], $value); + $this->deleteSingleElement($value); + } + } else { + $response['success'] = FALSE; + $response['message'] = "Si è verificato un errore durante l'eliminazione"; + } + $response = Zend_Json::encode($response); + $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody($response); + } + } + + public function setstate() + { + if ($this->_controller->getRequest()->isXmlHttpRequest()) { + + $this->_controller->getHelper('layout')->disableLayout(); + $this->_controller->getHelper('viewRenderer')->setNoRender(); + + if (!$this->_controller->getParam('id')) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => FALSE, 'message' => 'Id non trovato.'))); + } + + try { + $this->_model->update('Errorlog', $this->_controller->getParam('id'), array('state' => $this->_controller->getParam('state'))); + + $this->_controller->view->assign($this->_model->getById('Errorlog', $this->_controller->getParam('id'))); + + $this->_controller->render('errorlog/td'); + $response['text'] = $this->_controller->getResponse()->getBody(); + $response['success'] = true; + + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody(Zend_Json::encode($response)); + } catch (Exception $e) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => FALSE, 'message' => 'Si è verificato un errore durante l\'eliminazione.'))); + } + } + } + + public function setstateSelect() + { + + $this->_controller->getHelper('layout')->disableLayout(); + $this->_controller->getHelper('viewRenderer')->setNoRender(); + + if ($this->_controller->getRequest()->isXmlHttpRequest()) { + + if ($this->_controller->getParam('data')) { + + $data = $this->_controller->getParam('data'); + + if (count($data) <= 0) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => FALSE, 'message' => 'Nessun elemento selezionato'))); + } + + $state = $this->_controller->getParam('state'); + if (!$state) { + return $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8') + ->setBody(Zend_Json::encode(array('success' => FALSE, 'message' => 'Stato da impostare non selezionato'))); + } + + $response['rows'] = array(); + foreach ($data as $key => $value) { + + $this->_controller->getResponse()->setBody(""); + + $this->_model->update($this->_resourceName, $value, array('state' => $state)); + + $this->_controller->view->assign($this->_model->getById($this->_resourceName, $value)); + + $this->_controller->render('errorlog/td'); + $tdRow = array( + 'id' => $value, + 'tdRow' => $this->_controller->getResponse()->getBody() + ); + + array_push($response['rows'], $tdRow); + } + + $response['success'] = true; + + } else { + $response['success'] = FALSE; + $response['message'] = "Si è verificato un errore durante l'aggiornamento dei dati"; + } + + $response = Zend_Json::encode($response); + $this->_controller->getResponse()->setHeader('Content-type', 'application/json;charset=UTF-8')->setBody($response); + } + } + + /*************************************************************************************************************** + *********************************** FUNZIONI SPECIALIZZATE ***************************************** + **************************************************************************************************************/ + + /** + * Serve a manipolare i search params dopo che sono stati recuperati dallo storage e ad esempio a fissare dei parametri fissi + */ + public function handleSearchListParams(){ + } + + /** + * Serve a impostare il joinData i params vengono passati per essere utilizzati per eventuali condizioni + * @param $params + */ + public function checkIfSetJoinData($params){ + + } + + /** + * Serve a impostare il groupBy i params vengono passati per essere utilizzati per eventuali condizioni + * @param $params + */ + public function checkIfSetGroupBy($params){ + + } + + //Funzione di eliminazione singolo elemento personalizzarabile definendo il metodo deleteElement + protected function deleteSingleElement($id) + { + $this->preDeleteFunction($id); + + if (method_exists($this, 'deleteElement')) { + $this->deleteElement($id); + } else { + $this->_model->delete($this->_resourceName, $id); + } + + $this->afterDeleteFunction($id); + } + + /** + * Funzione da sovrascrivere che viene eseguita prima l'inserimento dell'elemento nel db; (deve restiuire i dati) + * @param $data + * @return mixed + */ + public function preInsertFunction($data) + { + return $data; + } + + /** + * Funzione che effettua il singolo inserimento dell'elemento + * + * @param array $dati + * @return mixed + */ + public function insertFunction(array $dati){ + return $this->_model->insert($this->_resourceName, $dati); + } + + /** + * Funzione da sovrascrivere che viene eseguita dopo l'inserimento dell'elemento nel db; (deve restiuire i dati) + * @param $data + * @return mixed + */ + public function afterInsertFunction($data) + { + return $data; + } + + /** + * Funzione da sovrascrivere che viene eseguita prima l'aggiornamento dei dati nel db; (deve restiuire i dati) + * @param $data + * @return mixed + */ + public function preUpdateFunction($data, $id) + { + return $data; + } + + /** + * Funzione che effettua il singolo update dell'elemento + * @param $id + * @param array $dati + */ + public function updateFunction($id, array $dati){ + $this->_model->update($this->_resourceName, $id, $dati); + } + + /** + * Funzione da sovrascrivere che viene eseguita dopo l'aggiornamento dei dati nel db; (deve restiuire i dati) + * @param $data + * @return mixed + */ + public function afterUpdateFunction($data, $id) + { + return $data; + } + + /** + * Funzione da sovrascrivere che viene eseguita prima dell'eliminazione dell'elemento nel db; (più che altro è una funzione di controllo) + * @param $id + * @return mixed + */ + public function preDeleteFunction($id) + { + return null; + } + + /** Funzione che viene eseguita appena dopo l'eliminazione + * @param $id + * @return null + */ + public function afterDeleteFunction($id) + { + return null; + } + + /** + * @return mixed + * + * Restituisce la classe Form generica "Add" per la sezione + */ + public function getDefaultSaveFormClassName() + { + $class = implode('_', array( + 'Application', + 'Form', + ucfirst($this->_controller->getRequest()->getModuleName()), + ucfirst($this->_controller->getRequest()->getControllerName()), + $this->_resourceName, + 'Add')); + return new $class(); + } + + private function listPreDispatch() + { + + $this->_controller->view->resourceName = strtolower($this->_resourceName); + $this->_controller->view->isActiveModalDetail = $this->_enableModalDetail; + $this->_controller->view->isActiveFilterModal = $this->_enableModalFilter; + $this->_controller->view->isActiveNewInsert = $this->_enableNewInsert; + $this->_controller->view->customJsScript = $this->_customJsSectionScripts; + $this->_controller->view->customCssScript = $this->_customCssSectionScripts; + + $count = $this->_controller->getParam('count'); + if ($count !== null && intval($count) != 0) { + $this->_COUNT = intval($count); + setcookie($this->_COUNT_VARIABLE_NAME, intval($count), $this->_COOKIE_EXPIRE_TIME, "/"); + } else { + if (isset($_COOKIE[$this->_COUNT_VARIABLE_NAME])) { + $this->_COUNT = intval($_COOKIE[$this->_COUNT_VARIABLE_NAME]); + } else { + $this->_COUNT = $this->_defaultCount; + } + } + + if ($this->_controller->getParam('reset')) { + $this->_PAGE = 1; + //$this->_COUNT = $this->_defaultCount; + $this->_ORDERLIST = $this->_model->getResource($this->_resourceName)->getDefaultOrder(); + $this->_ORDERLIST_TYPE = $this->_model->getResource($this->_resourceName)->getDefaultTipoOrder(); + $this->_SEARCH_PARAMS = array(); + + //Resetto anche i cookie + //setcookie($this->_COUNT_VARIABLE_NAME, intval($this->_COUNT), $this->_COOKIE_EXPIRE_TIME, "/"); + setcookie($this->_ORDER_VARIABLE_NAME, $this->_ORDERLIST, $this->_COOKIE_EXPIRE_TIME, "/"); + setcookie($this->_ORDERTYPE_VARIABLE_NAME, $this->_ORDERLIST_TYPE, $this->_COOKIE_EXPIRE_TIME, "/"); + setcookie($this->_SEARCHPARAMS_VARIABLE_NAME, Zend_Json::encode($this->_SEARCH_PARAMS), $this->_COOKIE_EXPIRE_TIME, "/"); + + return; + } + + $this->_PAGE = $this->_controller->getParam('page', 1); + + if (isset($_COOKIE[$this->_ORDER_VARIABLE_NAME]) && !$this->_controller->getParam('order')) { + $this->_ORDERLIST = $_COOKIE[$this->_ORDER_VARIABLE_NAME]; + //Zend_Registry::get('log')->info(print_r("ORDERLIST_COOKIE_PARAM: ".$this->_ORDERLIST,true)); + } else { + $this->_ORDERLIST = $this->_controller->getParam('order', $this->_model->getResource($this->_resourceName)->getDefaultOrder()); + //Zend_Registry::get('log')->info(print_r("ORDERLIST_NEW_PARAM: ".$this->_ORDERLIST,true)); + setcookie($this->_ORDER_VARIABLE_NAME, $this->_ORDERLIST, $this->_COOKIE_EXPIRE_TIME, "/"); + } + + if (isset($_COOKIE[$this->_ORDERTYPE_VARIABLE_NAME]) && !$this->_controller->getParam('tipoOrder')) { + $this->_ORDERLIST_TYPE = $_COOKIE[$this->_ORDERTYPE_VARIABLE_NAME]; + //Zend_Registry::get('log')->info(print_r("ORDERLISTTYPE_COOKIE_PARAM: ".$this->_ORDERLIST_TYPE,true)); + } else { + $this->_ORDERLIST_TYPE = $this->_controller->getParam('tipoOrder', $this->_model->getResource($this->_resourceName)->getDefaultTipoOrder()); + //Zend_Registry::get('log')->info(print_r("ORDERLISTTYPE_NEW_PARAM: ".$this->_ORDERLIST_TYPE,true)); + setcookie($this->_ORDERTYPE_VARIABLE_NAME, $this->_ORDERLIST_TYPE, $this->_COOKIE_EXPIRE_TIME, "/"); + } + + if (isset($_COOKIE[$this->_SEARCHPARAMS_VARIABLE_NAME])) { + $this->_SEARCH_PARAMS = Zend_Json::Decode($_COOKIE[$this->_SEARCHPARAMS_VARIABLE_NAME]); + } else { + $this->_SEARCH_PARAMS = array(); + } + + //Aggiungo eventuali nuovi parametri + $params = $this->_controller->getHelper('FilterFunctions')->cleanParams($this->_controller->getAllParams(), false); + + //Riunisco i parametri gia esistenti con i nuovi + $this->_SEARCH_PARAMS = array_replace($this->_SEARCH_PARAMS, $params); + } + + private function listPostDispatch() + { + $this->_controller->view->moduleName = $this->_controller->getRequest()->getModuleName(); + + $this->_controller->view->count = $this->_COUNT; + $this->_controller->view->page = $this->_PAGE; + $this->_controller->view->order = $this->_ORDERLIST; + $this->_controller->view->tipoOrder = $this->_ORDERLIST_TYPE; + $this->_controller->view->search_params = $this->_SEARCH_PARAMS; + + //Elimino i parametri vuoti dalle searchparams + $this->_SEARCH_PARAMS = $this->_controller->getHelper('FilterFunctions')->cleanParams($this->_controller->getAllParams()); + + setcookie($this->_SEARCHPARAMS_VARIABLE_NAME, Zend_Json::encode($this->_SEARCH_PARAMS), $this->_COOKIE_EXPIRE_TIME, '/'); + + //Cambio il nome dello script view in 'list' + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setScriptAction(strtolower($this->_resourceName) . '/list'); + } + +} diff --git a/library/App/Controller/Sections/Section.php b/library/App/Controller/Sections/Section.php new file mode 100644 index 0000000..c02847d --- /dev/null +++ b/library/App/Controller/Sections/Section.php @@ -0,0 +1,93 @@ +getRequest()->getActionName(); + $sectionName = null; + try { + + if (preg_match("/^list/", $actionName)) { + $sectionName = preg_replace("/list/", "", $actionName); + return $this->generaSectionClass($sectionName)->lista(); + } + + if (preg_match("/^get/", $actionName)) { + $sectionName = preg_replace("/get/", "", $actionName); + return $this->generaSectionClass($sectionName)->get(); + } + + if (preg_match("/^save|^salva/", $actionName)) { + $sectionName = preg_replace("/save|salva/", "", $actionName); + return $this->generaSectionClass($sectionName)->save(); + } + + if (preg_match("/^(?=.*?delete)(?!.*?select).*$/", $actionName)) { + $sectionName = preg_replace("/delete/", "", $actionName); + return $this->generaSectionClass($sectionName)->delete(); + } + + if (preg_match("/^deleteselect/", $actionName)) { + $sectionName = preg_replace("/deleteselect/", "", $actionName); + return $this->generaSectionClass($sectionName)->deleteSelect(); + } + + if (preg_match("/^(?=.*?setstate)(?!.*?select).*$/", $actionName)) { + $sectionName = preg_replace("/setstate/", "", $actionName); + return $this->generaSectionClass($sectionName)->setstate(); + } + + if (preg_match("/^setstateselect/", $actionName)) { + $sectionName = preg_replace("/setstateselect/", "", $actionName); + return $this->generaSectionClass($sectionName)->setstateSelect(); + } + + /** + * Gestisce le funzione custom di un report se vengono separate dal trattino + * con la stringa composta cosi: "-" + */ + if (preg_match("/-/", $actionName)) { + + $sectionName = explode('-', $actionName)[0]; + $functionName = explode('-', $actionName)[1]; + + // non funzionante con php 5 + // [$sectionName, $functionName] = explode('-', $actionName); + + return $this->generaSectionClass($sectionName)->$functionName(); + } + + } catch (Exception $e) { + try { + parent::__call($actionName, null); + } catch (Exception $e2) { + throw new Exception($e->getMessage()); + } + } + + } + + private function generaSectionClass($sectionName) + { + if (!isset($this->_sections[$sectionName])) { + $className = $this->getSectionClassName($sectionName); + $this->_sections[$sectionName] = new $className($this); + } + return $this->_sections[$sectionName]; + } + + private function getSectionClassName($sectionName) + { + return implode('_', array( + 'Application', + 'ControllerSection', + ucfirst($this->getRequest()->getModuleName()), + ucfirst($this->getRequest()->getControllerName()), + ucfirst($sectionName))); + } + +} diff --git a/library/App/Exception/MessageException.php b/library/App/Exception/MessageException.php new file mode 100644 index 0000000..6a8da0e --- /dev/null +++ b/library/App/Exception/MessageException.php @@ -0,0 +1,28 @@ +message = $message; + $this->_appMessage=$message; + $this->_appCode=$code; + } + + public function getAppMessage(){ + return $this->_appMessage; + } + + public function getAppCode(){ + return $this->_appCode; + } + +} diff --git a/library/App/Exception/ResponseCloudException.php b/library/App/Exception/ResponseCloudException.php new file mode 100644 index 0000000..6d49484 --- /dev/null +++ b/library/App/Exception/ResponseCloudException.php @@ -0,0 +1,23 @@ +_message = $message; + $this->_errorCode=$errorCode; + } + + public function getMyMessage(){ + return $this->_message; + } + + public function getErrorCode(){ + return $this->_errorCode; + } + +} \ No newline at end of file diff --git a/library/App/Form/Filters/MongoFormatBoolean.php b/library/App/Form/Filters/MongoFormatBoolean.php new file mode 100644 index 0000000..aa1a2e4 --- /dev/null +++ b/library/App/Form/Filters/MongoFormatBoolean.php @@ -0,0 +1,13 @@ +info(print_r('FormatData: '.$data,true)); + + $dateValidatorSlash = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy')); + $dateValidatorSlashWithTime = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy HH:ii:ss')); + $dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + + if($dateValidatorSlashWithTime->isValid($data)){ + $data = explode(' ', $data); + $dataString = implode('-', array_reverse(explode("/", $data[0]))) ." ".$data[1]; + }else if ($dateValidatorSlash->isValid($data)) { + $dataString = implode('-', array_reverse(explode("/", $data))) . $this->checkTimeString($data); + }else if($dateValidatorTrattino->isValid($data)){ + $dataString = $data.$this->checkTimeString($data); + }else{ + return $data; + } + + $orig_date = new DateTime($dataString); + return new MongoDB\BSON\UTCDateTime($orig_date->getTimestamp() * 1000); + } + + //Controlla se aggiungere o no l'ora alla stringa + private function checkTimeString($data) + { + return (preg_match('/[0-9]{2}:[0-9]{2}:[0-9]{2}/', $data)) ? '' : " 00:00:00"; + } + +} diff --git a/library/App/Form/Filters/MongoFormatTimezone.php b/library/App/Form/Filters/MongoFormatTimezone.php new file mode 100644 index 0000000..bd42cc0 --- /dev/null +++ b/library/App/Form/Filters/MongoFormatTimezone.php @@ -0,0 +1,28 @@ + 'dd/mm/yyyy')); + $dateValidatorSlashWithTime = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy HH:ii:ss')); + $dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + + if($dateValidatorSlashWithTime->isValid($data)){ + $data = explode(' ', $data); + $dataString = implode('-', array_reverse(explode("/", $data[0]))) ." ".$data[1]; + }else if ($dateValidatorSlash->isValid($data)) { + $dataString = implode('-', array_reverse(explode("/", $data))) . " 00:00:00"; + }else if($dateValidatorTrattino->isValid($data)){ + $dataString = $data." 00:00:00"; + }else{ + return $data; + } + + $orig_date = new DateTime($dataString); + //Zend_Registry::get('log')->info(print_r($orig_date,true)); + return new MongoDB\BSON\Timestamp(1,$orig_date->getTimestamp()); + } + +} diff --git a/library/App/Form/Filters/MyBoolean.php b/library/App/Form/Filters/MyBoolean.php new file mode 100644 index 0000000..c0e5627 --- /dev/null +++ b/library/App/Form/Filters/MyBoolean.php @@ -0,0 +1,13 @@ +_enableNull = false; + if (is_array($options) && array_key_exists('enable_null', $options)) { + $this->_enableNull = $options['enable_null']; + } + } + + public function filter($value) + { + if(!is_numeric($value)){ + return ($this->_enableNull) ? null : 0; + } + + return floatval($value); + } +} diff --git a/library/App/Form/Filters/MyFormatData.php b/library/App/Form/Filters/MyFormatData.php new file mode 100644 index 0000000..373f62e --- /dev/null +++ b/library/App/Form/Filters/MyFormatData.php @@ -0,0 +1,39 @@ + 'dd/mm/yyyy')); + $dateValidatorSlashWithTime = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy HH:ii:ss')); + $dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + + switch (true){ + case ($dateValidatorSlashWithTime->isValid($data) && !$this->isTimestamp($data)): + $data = explode(' ',$data); + $date = $data[0]; + $time = $data[1]; + return implode('-', array_reverse(explode("/", $date))) . " ". $time; + case ($dateValidatorSlash->isValid($data) && !$this->isTimestamp($data)): + return implode('-', array_reverse(explode("/", $data))); + /*case ($this->isTimestamp($data)): + $data = new DateTime('@' . $data); + return $data->format('Y-m-d H:i:s');*/ + case ($dateValidatorTrattino->isValid($data) && !$this->isTimestamp($data)): + default: + return $data; + } + } + + private function isTimestamp($string) + { + try { + new DateTime('@' . $string); + } catch(Exception $e) { + return false; + } + return true; + } + +} diff --git a/library/App/Form/Filters/MyJsonEncode.php b/library/App/Form/Filters/MyJsonEncode.php new file mode 100644 index 0000000..9f0afc2 --- /dev/null +++ b/library/App/Form/Filters/MyJsonEncode.php @@ -0,0 +1,13 @@ +info($data); + $data = new DateTime($data['date']); + return $data -> format("Y-m-d"); + }elseif(is_string($data)){ + $dateValidatorSlash = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy')); + $dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + if ($dateValidatorSlash->isValid($data)) { + return implode('-', array_reverse(explode("/", $data))); + }else if($dateValidatorTrattino->isValid($data)){ + return $data; + }else{ + return null; + } + } + + return $data; + } + +} \ No newline at end of file diff --git a/library/App/Form/Validators/EmailPec.php b/library/App/Form/Validators/EmailPec.php new file mode 100644 index 0000000..f3ff99a --- /dev/null +++ b/library/App/Form/Validators/EmailPec.php @@ -0,0 +1,35 @@ +'Valore non presente ', + self::EMAIL_ISPEC=>"L'Email inserita sembra essere una PEC, si prega di inserire un email privata" + ); + + public function isValid($value) + { + $this->_setValue($value); + + $isValid = true; + + if ($value === ''){ + $this->_error(self::EMAIL_NULL); + $isValid = false; + } + + $domain = explode('@',$value); + $domain = $domain[1]; + + if(in_array($domain,$this->_PEC_DOMAINS)){ + $this->_error(self::EMAIL_ISPEC); + $isValid = false; + } + + return $isValid; + } + } \ No newline at end of file diff --git a/library/App/Form/Validators/InDomain.php b/library/App/Form/Validators/InDomain.php new file mode 100644 index 0000000..84b616c --- /dev/null +++ b/library/App/Form/Validators/InDomain.php @@ -0,0 +1,49 @@ + 'Dominio non specificato', + self::DOMAIN_NO_VALUE => "Il valore non è compreso nel dominio specificato" + ); + + protected $_domain; + protected $_domainName; + + public function __construct($domainName) + { + $this->_domainName = $domainName; + $this->setDomain($domainName); + } + + public function isValid($value) + { + $this->_setValue($value); + + $isValid = true; + if (!in_array($value, $this->_domain)) { + $this->_error(self::DOMAIN_NO_VALUE); + $isValid = false; + } + + return $isValid; + } + + private function setDomain($domainName) + { + + if (!$domainName) { + throw new Zend_Validate_Exception('Nome di dominio non specificato'); + } + + $this->_domain = array_keys(App_Constants_Domains::DOMAINS[$domainName]); + + if(!$this->_domain){ + throw new Zend_Validate_Exception('Nome di dominio non trovato'); + } + + } +} diff --git a/library/App/Form/Validators/MongoBooleanRequired.php b/library/App/Form/Validators/MongoBooleanRequired.php new file mode 100644 index 0000000..d5e05e0 --- /dev/null +++ b/library/App/Form/Validators/MongoBooleanRequired.php @@ -0,0 +1,23 @@ + "Il campo deve essere di true o false" + ); + + public function isValid($value) + { + $this->_setValue($value); + + $isValid = true; + + if($value !== true && $value !== false){ + $this->_error(self::REQUIRED_VALUE); + $isValid = false; + } + + return $isValid; + } + } diff --git a/library/App/Form/Validators/MyData.php b/library/App/Form/Validators/MyData.php new file mode 100644 index 0000000..111c21d --- /dev/null +++ b/library/App/Form/Validators/MyData.php @@ -0,0 +1,24 @@ +'Formato data non valido' + ); + + public function isValid($value) + { + $this->_setValue($value); + + $isValid = true; + + $dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + if(!$dateValidatorTrattino->isValid($value)){ + $this->_error(self::INVALID_DATA_FORMAT); + $isValid = false; + } + + return $isValid; + } + } \ No newline at end of file diff --git a/library/App/Form/Validators/Piva.php b/library/App/Form/Validators/Piva.php new file mode 100644 index 0000000..284f72c --- /dev/null +++ b/library/App/Form/Validators/Piva.php @@ -0,0 +1,70 @@ +'Valore non presente ', + self::PIVA_LENGHT=>'La lunghezza della partita iva "%value%" non è corretta: la partita IVA dovrebbe essere lunga esattamente 11 caratteri', + self::PIVA_MATCH=>'La partita iva "%value%" contiene dei caratteri non ammessi: la partita IVA dovrebbe contenere solo cifre', + self::PIVA_INVALID=>'La partita iva "%value%" non è valida', + self::PIVA_INVALID_ME=>'La partita iva "%value%" non è valida: non puoi inserire la nostra p.iva', + self::PIVA_INVALID_ZERO=>'Sei sicuro che "%value%" sia la tua partita iva?', + ); + + public function isValid($value,$checkPivaInterna = true) + { + $this->_setValue($value); + + $isValid = true; + + if ($value === ''){ + $this->_error(self::PIVA_NULL); + $isValid = false; + } + + if(strlen($value) != 11){ + $this->_error(self::PIVA_LENGHT); + $isValid = false; + } + + /*Controllo personalizzato sulla propria partita iva */ + if ($value === '01999590688' && $checkPivaInterna){ + $this->_error(self::PIVA_INVALID_ME); + $isValid = false; + } + + if ($value === '00000000000'){ + $this->_error(self::PIVA_INVALID_ZERO); + $isValid = false; + } + + if(preg_match("/^[0-9]+\$/", $value) != 1){ + $this->_error(self::PIVA_MATCH); + $isValid = false; + } + + $s = 0; + for ($i = 0; $i <= 9; $i += 2) + $s += ord($value[$i]) - ord('0'); + + for ($i = 1; $i <= 9; $i += 2) { + $c = 2 * (ord($value[$i]) - ord('0')); + if ($c > 9) + $c = $c - 9; + $s += $c; + } + + if ((10 - $s % 10) % 10 != ord($value[10]) - ord('0')){ + $this->_error(self::PIVA_INVALID); + $isValid = false; + } + + return $isValid; + } + } diff --git a/library/App/Model/AbstractGeneric.php b/library/App/Model/AbstractGeneric.php new file mode 100644 index 0000000..04f2ff7 --- /dev/null +++ b/library/App/Model/AbstractGeneric.php @@ -0,0 +1,485 @@ +_resources[$name])) { + $class = implode('_', array( + $this->_getNamespace(), + 'Model_Resources', + ucfirst($name))); + + //Controllo l'esistenza della classe + if (!class_exists($class)) { + throw new App_Controller_Errors_WebServiceError("Errore generazione la classe risorsa '$class' potrebbe non esistere"); + } + + $this->_resources[$name] = new $class(); + } + + return $this->_resources[$name]; + } + + private function _getNamespace() + { + $ns = explode('_', get_class($this)); + return $ns[0]; + } + + /*==================================================================================================== + *======================= FUNZIONI GENERICHE PER OGNI TABELLA ========================== + *====================================================================================================*/ + + /** + * @param $resourceName + * @param $info + * @return mixed + * @throws App_Controller_Errors_WebServiceError + */ + public function insert($resourceName, $info) + { + + return $this->getResource($resourceName)->insert($info); + } + + public function update($resourceName, $id, $info) + { + + $resource = $this->getResource($resourceName); + $idString = (is_int($id)) ? " = $id" : " = '$id'"; + return $resource->update($info, $resource->getPrimaryKey() . $idString); + } + + public function updateWhere($resourceName, $condition, $info) + { + //Se passo un array di condizioni viene construita la stringa + if (is_array($condition)) { + $last_key = key(array_slice($condition, -1, 1, TRUE)); + $str = ""; + foreach ($condition as $key => $val) { + $str .= str_replace('?', $val, $key); + if ($key != $last_key) $str .= " AND "; + } + $condition = $str; + } + + $resource = $this->getResource($resourceName); + return $resource->update($info, $condition); + } + + public function delete($resourceName, $id) + { + $resource = $this->getResource($resourceName); + $idString = (is_int($id)) ? " = $id" : " = '$id'"; + return $resource->delete($resource->getPrimaryKey() . $idString); + } + + public function deleteWhere($resourceName, $condition) + { + //Se passo un array di condizioni viene construita la stringa + if (is_array($condition)) { + $last_key = key(array_slice($condition, -1, 1, TRUE)); + $str = ""; + foreach ($condition as $key => $val) { + $str .= str_replace('?', $val, $key); + if ($key != $last_key) $str .= " AND "; + } + $condition = $str; + } + + $resource = $this->getResource($resourceName); + return $resource->delete($condition); + } + + public function getById($resourceName, $id) + { + + $resource = $this->getResource($resourceName); + return $resource->getAdapter()->query('SELECT * FROM ' . $resource->getTableName() . ' WHERE ' . $resource->getPrimaryKey() . ' = ?', array($id))->fetch(); + } + + public function getLastId($resourceName) + { + + $resource = $this->getResource($resourceName); + return $resource->getAdapter()->query('SELECT id FROM ' . $resource->getTableName() . ' ORDER BY ' . $resource->getPrimaryKey() . ' DESC LIMIT 1')->fetchColumn(0); + } + + public function getCountTotal($resourceName) + { + + $resource = $this->getResource($resourceName); + return $resource->getAdapter()->query('SELECT COUNT(*) as num FROM ' . $resource->getTableName())->fetchColumn(0); + } + + // FUNZIONE GET LIST CON OVERLOAD + + public function getList() + { + $args = func_get_args(); + $functionName = (func_num_args() === 2 && is_array($args[1])) ? 'getListOptions' : 'getListDefault'; + return call_user_func_array(array(&$this, $functionName), $args); + } + + /** + * #Overload + * Funzione get list che accetta i parametri inseriti in un array in modo da non dover più rispettare l'ordine di inserimento + * + * @param $resourceName + * @param array $options + * @return Zend_Paginator + * @throws Zend_Exception + * @throws Zend_Paginator_Exception + */ + public function getListOptions($resourceName, array $options = []) + { + foreach ($options as $optionKey => $val) { + if (!in_array($optionKey, self::ALLOWED_GETLIST_ARRAY_OPTIONS)) { + throw new App_Controller_Errors_WebServiceError("'$optionKey' non e' una opzione valida per la funzione getList()"); + } + } + + return $this->getListDefault($resourceName, + $options['page'], $options['count'], $options['where'], + $options['order'], $options['selectList'], $options['joinOptions'], + $options['groupBy'], $options['fetchRow'], $options['having']); + } + + /** + * Funzione getList completa (può sostituire anche la funzione getFilteredList) + * + * @param $resourceName + * @param null $paged + * @param null $count + * @param array $where + * @param null $order + * @param string $selectList + * @param null $joinData + * @param null $groupBy + * @param bool $fetchRow + * @return Zend_Paginator + * @throws Zend_Exception + * @throws Zend_Paginator_Exception + */ + public function getListDefault($resourceName, $paged = null, $count = null, $where = array(), $order = null, $selectList = '*', $joinData = null, $groupBy = null, $fetchRow = false, $having = false) + { + $resource = $this->getResource($resourceName); + + // definizione della select list + $selectList = (!is_null($selectList)) ? $selectList : $resource->getDefaultSelectColumns(); + if (is_string($selectList)) { + $selectList = explode(',', $selectList); + } + $select = $resource->getAdapter()->select()->from($resource->getTableName(), $selectList); + + //Gestione dell'eventuale Join + $joinData = (!is_null($joinData)) ? $joinData : $resource->getDefaultJoinData(); + if (is_array($joinData)) { + $select = $this->applicateJoinData($select, $joinData); + } + + //gestione dei parametri di ricerca + if (is_array($where)) { + foreach ($where as $key => $value) { + // se trovo l'operatore '#OR' o '#ANDOR' significa che devo applicare l'or per gli elementi passati nel campo value, NB: il value deve essere una string separata da virgole + if (preg_match("/#OR/", $key)) { // #ANDOR accoda la query es: WHERE ... OR (nome_campo = ?) + $select = $this->applicateOrWhere($select, $key, $value, '#OR'); + } else if (preg_match("/#ANDOR/", $key)) { // #ANDOR compone la query es: WHERE ... AND ( campo1 = ? OR campo2 = ?) + + //salvo le condizioni presenti e resetto temporaneamente le condizini + $oldWhereConditions = $select->getPart(Zend_Db_Select::WHERE); + $select->reset(Zend_Db_Select::WHERE); + + // genero le condizioni or + $select = $this->applicateOrWhere($select, $key, $value, '#ANDOR'); + + // recupero le condizioni or generate e resetto di nuovo tutte le condizioni + $orWhereConditions = $select->getPart(Zend_Db_Select::WHERE); + $select->reset(Zend_Db_Select::WHERE); + + // reimposto le vecchie condizioni e accodo le nuove condizioni or + if ($oldWhereConditions) $select->where(implode(' ', $oldWhereConditions)); + $select->where(implode(' ', $orWhereConditions)); + + } else { + //Di default utilizzo where con la AND + $select->where($key, $value); + } + } + } + + //Gestione dell'eventuale grouBy + if ($groupBy) { + $select->group($groupBy); + } + + //gestione dell'ordinamento + $order = (!$order) ? $resource->getDefaultOrder() : $order; + if (is_string($order)) { + $tmpOrder = explode(',', $order); + foreach ($tmpOrder as &$ord) { + // il '.' serve a definire il nome della tabella altrimenti imposto quella di default della risorsa che chiama la query + if (!preg_match("/\./", $ord)) { + $ord = $resource->getTableName() . "." . trim($ord); + } + + // Se non esiste un verso di ordinamento assegno quello di default della risorsa per ogni campo ordinamento passato + if (!preg_match("/(ASC|DESC|desc|asc)$/", $ord)) { + $ord = explode(' ', trim($ord))[0] . ' ' . strtoupper($resource->getDefaultTipoOrder()); + } + } + + $order = $tmpOrder; + } + + $select->order($order); + + //Gestione dell'eventuale grouBy + if ($having && is_array($having)) { + foreach (array_keys($having) as $key) { + $select->having($key, $having[$key]); + } + } + + // Zend_Registry::get('log')->info(print_r($select->__toString(), true)); + + //Esecuzione della query di ricerca + if (null !== $paged && null !== $count) { + $adapter = new Zend_Paginator_Adapter_DbSelect($select); + $paginator = new Zend_Paginator($adapter); + $paginator->setItemCountPerPage($count)->setCurrentPageNumber((int)$paged); + + return $paginator; + } + $stmt = $resource->getAdapter()->query($select->__toString()); + + //Gestione del Fetch + if ($fetchRow) + return $stmt->fetch(); + else + return $stmt->fetchAll(); + } + + /** + * @param $resourceName + * @param $where + * @param null $order + * @param null $selectList + * @param null $joinData + * @param null $groupBy + * @return Zend_Paginator + * @throws Zend_Exception + * @throws Zend_Paginator_Exception + */ + public function getFiltered($resourceName, $where, $order = null, $selectList = null, $joinData = null, $groupBy = null) + { + return $this->getList($resourceName, null, null, $where, $order, $selectList, $joinData, $groupBy, true); + } + + /** + * Con questa funzione posso recuperare il numero di elementi di una tabella in base a parametri + * @param $resourceName + * @param $where + * + * @return Zend_Paginator + */ + public function countFiltered($resourceName, $where) + { + //Definizione della risorsa + $resource = $this->getResource($resourceName); + $select = $resource->getAdapter()->select()->from($resource->getTableName(), 'COUNT(*) as num'); + + //Applico le eventuali condizioni di ricerca + foreach ($where as $key => $value) { + $select->where($key, $value); + } + + $stmt = $resource->getAdapter()->query($select->__toString()); + + return $stmt->fetchColumn(0); + } + + /** + * Questa funzione passato il nome della colonna su cui cercare cerca il valore scelto; + * l'operatore di default è 'uguale' + * altriemnti è possibile specificarne un altro trimete il parametro @op + * + * @param $resourceName + * @param $columnName + * @param $value + * @param $fetchRow | Se impostato a true ritorna la riga come oggetto + * @param $op + * @param $joinData | per eseguire un join con altre tabelle + * + * @return mixed + */ + public function getByColumnName($resourceName, $columnName, $value, $op = "=", $fetchRow = false, $order = null, $joinData = null) + { + + $resource = $this->getResource($resourceName); + + //GESTIONE OPERATORI + switch ($op) { + case'LIKE': + $value = "%" . $value . "%"; + break; + case'LIKEPRE': + $value = "%" . $value; + break; + case'LIKEPOST': + $value = $value . "%"; + break; + default: + break; + } + + $select = $resource->getAdapter()->select()->from($resource->getTableName()); + + //Gestione dell'eventuale Join + if (is_array($joinData)) { + $select = $this->applicateJoinData($select, $joinData); + } + + $select->where($columnName . ' ' . $op . ' ?', $value); + + if ($order != null && (is_array($order) || is_string($order))) { + $select->order($order); + } + + if ($fetchRow) { + if ($order != null && (is_array($order) || is_string($order))) { + return $resource->fetchRow($resource->select()->where($columnName . ' ' . $op . ' ?', $value)->order($order)); + } else { + return $resource->fetchRow($resource->select()->where($columnName . ' ' . $op . ' ?', $value)); + } + } else { + return $resource->getAdapter()->query($select->__toString())->fetch(); + } + } + + /** + * @param $query + * @param null $params + * @param bool $fetchRow + * @return mixed + * + * @throws App_Controller_Errors_WebServiceError + */ + public function customQuery($query, $params = null, $fetchRow = false) + { + + $resource = $this->getResource('Abstract'); + $stmt = $resource->getAdapter()->query($query, $params); + + //Gestione del Fetch + if ($fetchRow) + return $stmt->fetch(); + else + return $stmt->fetchAll(); + } + + /** + * @param $select + * @param $joinData + * @return mixed + * + * @throws App_Controller_Errors_WebServiceError + */ + private function applicateJoinData($select, $joinData) + { + + if (!isset($joinData[0])) { + if (!array_key_exists(self::JOIN_TABLE_NAME, $joinData)) + throw new App_Controller_Errors_WebServiceError("Nome tabella per il join non trovato"); + + if (!array_key_exists(self::JOIN_CONDITION_NAME, $joinData)) + throw new App_Controller_Errors_WebServiceError("Nome del campo di condizione per il join non trovato"); + + $colonne = (!$joinData[self::JOIN_COLUMNS_NAME]) ? array('*') : $joinData[self::JOIN_COLUMNS_NAME]; + $joinFunctionName = (in_array($joinData[self::JOIN_TYPE], self::JOIN_FUNCTION_NAME_ALLOWED)) ? $joinData[self::JOIN_TYPE] : 'join'; + + return $select->$joinFunctionName($joinData[self::JOIN_TABLE_NAME], $joinData[self::JOIN_CONDITION_NAME], $colonne); + } else { // Gestione di più join contemporanei + foreach ($joinData as $key => $join) { + if (!array_key_exists(self::JOIN_TABLE_NAME, $join)) + throw new App_Controller_Errors_WebServiceError("Nome tabella per il join non trovato per il join index: [$key]"); + + if (!array_key_exists(self::JOIN_CONDITION_NAME, $join)) + throw new App_Controller_Errors_WebServiceError("Nome del campo di condizione per il join non trovato per il join index: [$key]"); + + $colonne = (!$join[self::JOIN_COLUMNS_NAME]) ? array('*') : $join[self::JOIN_COLUMNS_NAME]; + $joinFunctionName = (in_array($join[self::JOIN_TYPE], self::JOIN_FUNCTION_NAME_ALLOWED)) ? $join[self::JOIN_TYPE] : 'join'; + + $select->$joinFunctionName($join[self::JOIN_TABLE_NAME], $join[self::JOIN_CONDITION_NAME], $colonne); + } + return $select; + } + + } + + private function applicateOrWhere($select, string $keyNomeCampo, $valoriOr, string $op = '#OR') + { + + $valueOrDaApplicare = null; + if (is_string($valoriOr)) + $valueOrDaApplicare = explode(',', $valoriOr); + elseif (is_array($valoriOr)) + $valueOrDaApplicare = $valoriOr; + + if (!$valueOrDaApplicare) { + throw new App_Controller_Errors_WebServiceError("Valori per la condizione '$op' non validi per generare la query", App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR); + } + + $keyDaApplicare = str_replace($op, '=', $keyNomeCampo); + + if (is_array($valueOrDaApplicare) && count($valueOrDaApplicare) > 0) { + foreach ($valueOrDaApplicare as $val) { + $select->orwhere($keyDaApplicare, $val); + } + } + + return $select; + } + +} diff --git a/library/App/Model/AbstractRest.php b/library/App/Model/AbstractRest.php new file mode 100644 index 0000000..6f058aa --- /dev/null +++ b/library/App/Model/AbstractRest.php @@ -0,0 +1,80 @@ +_resources[$name])) { + $class = implode('_', array( + $this->_getNamespace(), + 'Model', + 'RestResources', + ucfirst($name))); + + //Controllo l'esistenza della classe [commentato perchè genera errore su alcune risorse] + if (!class_exists($class)) { + throw new App_Controller_Errors_WebServiceError("Errore di generazione per la classe risorsa rest '$class'. Potrebbe non esistere!"); + } + + $this->_resources[$name] = new $class(); + } + + return $this->_resources[$name]; + } + + private function _getNamespace() + { + $ns = explode('_', get_class($this)); + return $ns[0]; + } + + /** + * @param $results + * @param $page + * @param $count + * @return Zend_Paginator + * + * Questa funzione pasato un array lo converte in un oggetto Zend Paginator + */ + public function converResultsToZendPaginator($results,$page,$count){ + $dati = $this->getOffsetPaginatedArray($results['data'],$results['totalItem'],$page,$count); + $results = Zend_Paginator::factory($dati); + $results->setItemCountPerPage($count); + $results->setCurrentPageNumber($page); + return $results; + } + + /** + * @param $results + * @param $totalItems + * @param $page + * @param $count + * @return array + * Funzione che crea un offset di oggetti per far si che il paginator conosca il numero totale di elemnti presenti + */ + public function getOffsetPaginatedArray($results,$totalItems,$page,$count){ + $dati = array(); + $rangeStart = (($page * $count) - $count) + 1; + $rangeEnd = $page * $count; + $rangeX = 0; + + for($i = 0; $i < $totalItems ;$i++){ + if($i >= $rangeStart -1 && $i <= $rangeEnd -1){ + $dati[$i] = $results[$rangeX]; + $rangeX++; + }else{ + $dati[$i] = array(); + } + } + + return $dati; + } + +} diff --git a/library/App/Model/Acl/Acl.php b/library/App/Model/Acl/Acl.php new file mode 100644 index 0000000..903e31f --- /dev/null +++ b/library/App/Model/Acl/Acl.php @@ -0,0 +1,26 @@ +addRole(new Zend_Acl_Role('unregistered')) + ->add(new Zend_Acl_Resource('default')) + ->add(new Zend_Acl_Resource('auth')) + ->add(new Zend_Acl_Resource('v1')) + ->allow('unregistered', array('default', 'auth', 'v1')); + + // ACL for user + $this->addRole(new Zend_Acl_Role('user'), 'unregistered') + ->add(new Zend_Acl_Resource('user')) + ->allow('user', array('user')); + + // ACL for administrator + $this->addRole(new Zend_Acl_Role('admin'), array('user')) + ->add(new Zend_Acl_Resource('admin')) + ->add(new Zend_Acl_Resource('monitoring')) + ->allow('admin', array('admin', 'monitoring')); + } + +} diff --git a/library/App/Model/Acl/AclRestV1.php b/library/App/Model/Acl/AclRestV1.php new file mode 100644 index 0000000..fe7c653 --- /dev/null +++ b/library/App/Model/Acl/AclRestV1.php @@ -0,0 +1,29 @@ +addRole(new Zend_Acl_Role('unregistered')) + ->add(new Zend_Acl_Resource('index')) + ->add(new Zend_Acl_Resource('error')) + ->add(new Zend_Acl_Resource('services')) + ->allow('unregistered', array('index','error','services')); + + // ACL for user + $this->addRole(new Zend_Acl_Role('user'), 'unregistered') + ->add(new Zend_Acl_Resource('emails')) + ->allow('user', array('emails')); + + // ACL for administrator + $this->addRole(new Zend_Acl_Role('admin'), 'user') + ->add(new Zend_Acl_Resource('users')) + ->allow('admin', array('users')); + } +} diff --git a/library/App/Model/CurlHttpClient.php b/library/App/Model/CurlHttpClient.php new file mode 100644 index 0000000..007fcdf --- /dev/null +++ b/library/App/Model/CurlHttpClient.php @@ -0,0 +1,84 @@ +_urlNameServices = $urlName; + + $this->_httpClient = new Zend_Http_Client($urlName); + $this->_httpClient->setConfig(array( + 'adapter' => 'Zend_Http_Client_Adapter_Curl', + 'maxredirects' => 0, + 'timeout' => 60, + 'ssltransport' => 'ssl' + )); + } + + /***** METODI COMUNI DELLE CHIMATE *****/ + + public function getCall($params){ + $this->_httpClient->setMethod('GET'); + $this->_httpClient->setParameterGet($params); + return $this->executeCall(); + } + + public function postCall($dati,$formatJson = false){ + $this->_httpClient->setMethod('POST'); + if($formatJson) + $this->_httpClient->setRawData(json_encode($dati),'application/json;charset=utf-8'); + else + $this->_httpClient->setParameterPost($dati); + return $this->executeCall(); + } + + public function putCall($dati,$formatJson = false){ + $this->_httpClient->setMethod('PUT'); + if($formatJson) + $this->_httpClient->setRawData(json_encode($dati),'application/json;charset=utf-8'); + else + $this->_httpClient->setParameterPost($dati); + return $this->executeCall(); + } + + public function deleteCall($params){ + $this->_httpClient->setMethod('DELETE'); + $this->_httpClient->setParameterGet($params); + return $this->executeCall(); + } + + /***** METODI PRIVATI PER GESTIRE LE CHIAMATE *****/ + + private function executeCall(){ + $httpResponse = $this->_httpClient->request(); + $headerResponse = $httpResponse->getHeaders(); + + if(preg_match('/application\/json/',$headerResponse['Content-type'])){ + $httpResponseBody = json_decode($httpResponse->getBody(),1); + + if(json_last_error() !== JSON_ERROR_NONE){ + Zend_Registry::get('log')->info($this->_httpClient->getUri()); + Zend_Registry::get('log')->info("Errore codifica JSON:"); + Zend_Registry::get('log')->info(print_r($httpResponse,true)); + return null; + } + + if (!$httpResponseBody['status'] && !$httpResponseBody['success']) { + Zend_Registry::get('log')->info($this->_httpClient->getUri()); + Zend_Registry::get('log')->info("Errore 'httpResponse' no status or success code:"); + Zend_Registry::get('log')->info(print_r($httpResponseBody,true)); + throw new Exception($httpResponseBody['message'],$httpResponseBody['errorCode']); + } + }else{ + $httpResponseBody = $httpResponse->getBody(); + } + + return $httpResponseBody; + } + + } diff --git a/library/App/Model/FcmFirebase.php b/library/App/Model/FcmFirebase.php new file mode 100644 index 0000000..591643a --- /dev/null +++ b/library/App/Model/FcmFirebase.php @@ -0,0 +1,78 @@ +_httpClient instanceof Zend_Http_Client) { + //$this->_httpClient = $this->_httpClient; + } else { + $this->_httpClient = new Zend_Http_Client(); + $this->_httpClient->setConfig(array( + 'adapter' => 'Zend_Http_Client_Adapter_Curl', + 'maxredirects' => 0, + 'timeout' => 60, + 'ssltransport' => 'ssl' + )); + $this->_httpClient->setHeaders('Authorization', 'key=' . self::SECRET_ID); + } + } + + /***** METODI COMUNI DELLE CHIMATE *****/ + + public function postCall($dati) + { + $this->_httpClient->setMethod('POST'); + $this->_httpClient->setUri($this->getBaseUrl() . '/send'); + $this->_httpClient->setRawData(Zend_Json::encode($dati), 'application/json;charset=utf-8'); + return $this->executeCall(); + } + + /***** METODI PRIVATI PER GESTIRE LE CHIAMATE *****/ + + private function getBaseUrl() + { + return self::BASE_API_URL . "/" . self::API_VERSION; + } + + private function executeCall() + { + $httpResponse = $this->_httpClient->request(); + + /*if($this->_ipManager->allowedIp()){ + Zend_Registry::get('log')->info(print_r($httpResponse,true)); + }*/ + + // Zend_Registry::get('log')->info(print_r($this->_httpClient->getLastRequest(), true)); + + $httpResponseEncoded = json_decode($httpResponse->getBody(), 1); + + // Zend_Registry::get('log')->info(print_r($httpResponseEncoded, true)); + + if (json_last_error() !== JSON_ERROR_NONE) { + Zend_Registry::get('log')->info($this->_httpClient->getUri()); + Zend_Registry::get('log')->info("Errore codifica JSON:"); + Zend_Registry::get('log')->info(print_r($httpResponse, true)); + return null; + } + + if ($this->_httpClient->getLastResponse()->getStatus() != '200' || $httpResponseEncoded['status'] == 'error') { + Zend_Registry::get('log')->info($this->_httpClient->getUri()); + Zend_Registry::get('log')->info("Errore status response " . $this->_httpClient->getLastResponse()->getStatus()); + Zend_Registry::get('log')->info(print_r($httpResponseEncoded, true)); + throw new App_Exception_ResponseCloudException($httpResponseEncoded['message'], $httpResponseEncoded['errorCode']); + } + + return $httpResponseEncoded; + } + +} diff --git a/library/App/Model/Mail.php b/library/App/Model/Mail.php new file mode 100644 index 0000000..685589d --- /dev/null +++ b/library/App/Model/Mail.php @@ -0,0 +1,59 @@ +setType(Zend_Mime::MULTIPART_RELATED); + + $dom = new DOMDocument(null, $this->getCharset()); + @$dom->loadHTML($html); + + $images = $dom->getElementsByTagName('img'); + + for ($i = 0; $i < $images->length; $i++) { + $img = $images->item($i); + $url = $img->getAttribute('src'); + + $image_http = new Zend_Http_Client($url); + $image_http->setAdapter('Zend_Http_Client_Adapter_Curl'); + + $response = $image_http->request(); + + if ($response->getStatus() == 200) { + $image_content = $response->getBody(); + + $pathinfo = pathinfo($url); + $mime_type = $response->getHeader('Content-Type'); + + $mime = new Zend_Mime_Part($image_content); + $mime->id = $url; + $mime->location = $url; + $mime->type = $mime_type; + $mime->disposition = Zend_Mime::DISPOSITION_INLINE; + $mime->encoding = Zend_Mime::ENCODING_BASE64; + $mime->filename = $pathinfo['basename']; + + $this->addAttachment($mime); + } + } + } + } catch (ZendException $e) { + Zend_Registry::get('error_log')->setEventItem('url', $this->getRequest()->getRequestUri())->setEventItem('trace', Zend_Json::encode($e->getTrace()))->setEventItem('params', Zend_Json::encode($this->getRequest()->getParams()))->info($e->getMessage()); + } + + return parent::setBodyHtml($html, $charset, $encoding); + } +} \ No newline at end of file diff --git a/library/App/Model/Mongo/Adapter.php b/library/App/Model/Mongo/Adapter.php new file mode 100644 index 0000000..6baf87e --- /dev/null +++ b/library/App/Model/Mongo/Adapter.php @@ -0,0 +1,75 @@ +_connectionUri = "mongodb://$this->_host:$this->_port"; + + //Autenticazione mongoDB + if ($connectionData['user'] && ['password']) { + + $this->_username = $connectionData['user']; + $this->_password = $connectionData['password']; + + $this->_host = ($connectionData['host']) ? $connectionData['host'] : $this->_host; + $this->_port = ($connectionData['port']) ? $connectionData['port'] : $this->_port; + + $mongoAuth = "$this->_username:$this->_password"; + $mongoHost = "$this->_host:$this->_port"; + + //AuthMongoUri + $this->_connectionUri = "mongodb://$mongoAuth@$mongoHost"; + } + + if($connectionData['dbname']){ + $this->_dbname = $connectionData['dbname']; + } + } + + /** + * @return \MongoDB\Client + */ + public function getMongoClient(): \MongoDB\Client + { + if(!$this->_mongoClient){ + $this->_mongoClient = new MongoDB\Client($this->_connectionUri); + } + return $this->_mongoClient; + } + + /** + * @return string|null + */ + public function getDbname(): string + { + return $this->_dbname; + } + + /** + * @param string $dbname + */ + public function setDbname(string $dbname): void + { + $this->_dbname = $dbname; + Zend_Registry::set(self::MONGO_DB_ADAPTER_REG_NAME,$this); + } + + + +} diff --git a/library/App/Model/Mongo/Client.php b/library/App/Model/Mongo/Client.php new file mode 100644 index 0000000..0430191 --- /dev/null +++ b/library/App/Model/Mongo/Client.php @@ -0,0 +1,254 @@ +setDbname(Zend_Registry::get(App_Model_Mongo_Adapter::MONGO_DB_NAME)); + } + + $this->_mongoClient = $mongoAdapter->getMongoClient(); + $dbName = $mongoAdapter->getDbname(); + + $this->_db = $this->_mongoClient->selectDatabase($dbName); + } + + /** + * @param $name + * @return App_Model_MongoResource_Abstract + * @throws App_Controller_Errors_WebServiceError + */ + public function getResource($name) + { + + if (!isset($this->_resources[$name])) { + $class = implode('_', array( + 'Application', + 'Model', + 'MongoResources', + ucfirst($name))); + + //Controllo l'esistenza della classe + if (!class_exists($class)) { + throw new App_Controller_Errors_WebServiceError("Errore generazione la classe risorsa mongo '$class' potrebbe non esistere"); + } + + $this->_resources[$name] = new $class(); + } + + return $this->_resources[$name]; + } + + public function test() + { + return $this->_mongoClient->test; + } + + public function setDatabase($dbName) + { + return $this->_db = $this->_mongoClient->selectDatabase($dbName); + } + + public function listDatabases() + { + return $this->_mongoClient->listDatabases(); + } + + public function getDatabase() + { + return $this->_db; + } + + public function deleteDatabase() + { + return $this->_mongoClient->dropDatabase($this->getDatabase()); + } + + public function getCollection($resourceName) + { + $collection = $this->getResource($resourceName)->getCollectionName(); + return $this->getDatabase()->$collection; + } + + public function emptyCollection($resourceName) + { + return $this->getCollection($resourceName)->deleteMany(['id' => array('$gt'=>0)]); + } + + // FUNZIONI PER INTERROGARE IL DB + + public function getById($name, $id) + { + $optionsParams['projection'] = ['_id' => 0]; + return $this->getCollection($name)->findOne([$this->getResource($name)->getPrimaryKey() => $id], $optionsParams); + } + + public function insert($name, $data) + { + $id = uniqid(); + $this->getCollection($name)->insertOne(array_merge([$this->getResource($name)->getPrimaryKey() => $id], $data)); + return $id; + } + + public function update($name, $id, $data) + { + return $this->getCollection($name)->updateOne([$this->getResource($name)->getPrimaryKey() => $id], ['$set' => $data]); + } + + public function delete($name, $id) + { + return $this->getCollection($name)->deleteOne([$this->getResource($name)->getPrimaryKey() => $id]); + } + + public function getCountTotal($name) + { + return $this->getCollection($name)->countDocuments(); + } + + public function getCountFilteredTotal($name, $filter) + { + return $this->getCollection($name)->countDocuments($filter); + } + + public function getList($name, $paged = null, $count = null, $where = null, $order = null, $projection = null) + { + $findParams = array(); + + if (null !== $paged && null !== $count && $count > 0 && $paged > 0) { + if ($paged > 1) $findParams['skip'] = (($paged - 1) * $count); + $findParams['limit'] = $count; + } + + $order = (!$order) ? $this->getResource($name)->getDefaultOrder($order) : $order; + if ($order && is_array($order)) { + $findParams['sort'] = $order; + } + + $projection = (!$projection) ? $this->getResource($name)->getDefaultProjection($projection) : $projection; + if ($projection && is_array($projection)) { + $findParams['projection'] = $projection; + } + + if ($where === null) $where = array(); + + $cursor = $this->getCollection($name)->find($where, $findParams); + + return $cursor->toArray(); + } + + public function getListAggregation($name, $paged = null, $count = null, $where = null, $order = null, $projection = null, $addFields = null, $extraAggregation = null) + { + $aggregations = array(); + + if ($where === null) $where = array(); + if (count($where) > 0) { + array_push($aggregations, ['$match' => $where]); + } + + $order = $this->getResource($name)->getDefaultOrder($order); + if ($order && is_array($order)) { + array_push($aggregations, ['$sort' => $order]); + } + + if (null !== $paged && null !== $count && $count > 0 && $paged > 0) { + if ($paged > 1) + array_push($aggregations, ['$skip' => (($paged - 1) * $count)]); + array_push($aggregations, ['$limit' => $count]); + } + + $projection = $this->getResource($name)->getDefaultProjection($projection); + if ($projection && is_array($projection)) { + array_push($aggregations, ['$project' => $projection]); + } + + //$totElements = $this->getCountTotal($name); + $addFields = $this->getResource($name)->getDefaultAddFields(); + if ($addFields && is_array($addFields)) { + + /*if($totElements <= 0){ + unset($addFields['Data']); + }*/ + + array_push($aggregations, ['$addFields' => $addFields]); + } + + if ($extraAggregation && is_array($extraAggregation)) { + if(count($extraAggregation) > 1){ + $aggregations = array_merge($aggregations, $extraAggregation); + }else{ + array_push($aggregations, $extraAggregation); + } + } + + // Zend_Registry::get('log')->info(print_r($aggregations,true)); + + $cursor = $this->getCollection($name)->aggregate($aggregations); + + return $cursor->toArray(); + } + + public function getByColumnName($name, $columnName, $value, $op = "=", $all = false) + { + + switch ($op) { + case'=': + default: + $params = array($columnName => $value); + break; + case 'LIKE': + $params = array($columnName => ['$regex' => $value, '$options' => 'i']); + break; + } + + if ($all) { + return $this->getCollection($name)->find($params)->toArray(); + } else { + return $this->getCollection($name)->findOne($params); + } + } + + public function find($name, $params = array()) + { + return $this->getCollection($name)->find($params)->toArray(); + } + + public function aggregate($name, $aggregate) + { + return $this->getCollection($name)->aggregate($aggregate); + } + + // CRUD FUNCTION WITH OBJECTID + + public function getByObjectId($name, $id) + { + return $this->getCollection($name)->find([$this->getResource($name)->getPrimaryKey() => new MongoDB\BSON\ObjectID($id)])->toArray(); + } + + public function insertWithObjectId($name, $data) + { + unset($data['_id']); + return $this->getCollection($name)->insertOne($data); + } + + public function updateByObjectId($name, $id, $data) + { + return $this->getCollection($name)->updateOne([$this->getResource($name)->getPrimaryKey() => new MongoDB\BSON\ObjectID($id)], ['$set' => $data]); + } + + public function deleteByObjectId($name, $id) + { + return $this->getCollection($name)->deleteOne([$this->getResource($name)->getPrimaryKey() => new MongoDB\BSON\ObjectID($id)]); + } + +} diff --git a/library/App/Model/Mongo/PaginatorAdapter.php b/library/App/Model/Mongo/PaginatorAdapter.php new file mode 100644 index 0000000..49ccb80 --- /dev/null +++ b/library/App/Model/Mongo/PaginatorAdapter.php @@ -0,0 +1,41 @@ +_cursor = $cursor; + } + + /** + * Returns an cursor limited to items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return MongoDB\Driver\Cursor + */ + public function getItems($offset, $itemCountPerPage) + { + $cursor = $this->_cursor->skip($offset)->limit($itemCountPerPage); + return $cursor; + } + + /** + * Returns the total number of rows in the cursor. + * + * @return integer + */ + public function count() + { + return count($this->_cursor->toArray()); + } +} diff --git a/library/App/Model/MongoResource/Abstract.php b/library/App/Model/MongoResource/Abstract.php new file mode 100644 index 0000000..08bf6e8 --- /dev/null +++ b/library/App/Model/MongoResource/Abstract.php @@ -0,0 +1,115 @@ + ' + protected $_defaultTipoOrder; + + public $_defaultProjection; // array di projection mongo db + public $_defaultAddFields; // array di addFileds con el regole di mongoDb + + public function __construct() + { + if(!$this->_defaultOrder){ + throw new App_Controller_Errors_WebServiceError("'_defaultOrder' non definito per la risorsa ". get_class($this)); + } + + if(!$this->_defaultTipoOrder){ + throw new App_Controller_Errors_WebServiceError("'_defaultTipoOrder' non definito per la risorsa " . get_class($this)); + } + + parent::__construct(); + } + + //Funzione che restituisce il nome della collezione + public function getCollectionName() + { + return $this->_name; + } + + //Funzione che restituisce la chiave primaria sicura + public function getPrimaryKey() + { + if (is_array($this->_primary)) return $this->_primary[1]; + return $this->_primary; + } + + //Funzione che restituisce il campo ordinamento di default + public function getDefaultOrder($order) + { + $order = (!$order) ? $this->_defaultOrder : $order; + + if (!is_array($order)) { + $order = explode(',', $order); + } + + $sort = array(); + if (count($order) > 0) + foreach ($order as $val) { + $tmp = explode(' ', trim($val)); + $orderType = strtoupper(trim($tmp[1])); + $orderType = ($tmp[1] && ($orderType == 'ASC' || $orderType == 'DESC')) ? $orderType : 'ASC'; + $sort[trim($tmp[0])] = ($orderType == 'ASC') ? 1 : -1; + } + return $sort; + } + + //Funzione che restituisce il tipo di ordinamento di default + public function getDefaultTipoOrder() + { + if (isset($this->_defaultTipoOrder) && $this->_defaultTipoOrder) return $this->_defaultTipoOrder; + return "ASC"; + } + + public function getDefaultAddFields() + { + if($this->_defaultAddFields) return $this->_defaultAddFields; + + return null; + } + + public function getDefaultProjection($projection, $defaultProjection = null, $hideObjectId = true) + { + $defaultProjection = ($this->_defaultProjection === null) ? (($hideObjectId) ? ['_id'=>0] : []) : $this->_defaultProjection; + $projectionArray = ($hideObjectId) ? ['_id'=>0] : []; + + if (is_null($projection) || $projection === '*' || (is_array($projection) && count($projection) <= 0)) { + return $defaultProjection; + } + + if (is_string($projection)) { + $projection = explode(',', $projection); + } + + // aggiungendo '#0' tra i valori della proiezione eseguo la proiezione negativa + $projectionType = in_array('#0', $projection) ? 0 : 1; + + if (is_array($projection) && count($projection) > 0) { + foreach ($projection as $column) { + $projectionArray[$column] = $projectionType; + } + } + + return $projectionArray; + } + + public function getDefaultOrderString() + { + return $this->getDefaultOrder() . ' ' . $this->getDefaultTipoOrder(); + } + + //--------------- FUNZIONI PER LA GESTIONE DI DATABASE MULTIPLI ------------------------------------------ + + public function _setDbName($nomedb) + { + Zend_Registry::set(App_Model_Mongo_Adapter::MONGO_DB_NAME, $nomedb); + } + + public function getDbName() + { + return Zend_Registry::get(App_Model_Mongo_Adapter::MONGO_DB_NAME); + } + +} diff --git a/library/App/Model/Resource/Abstract.php b/library/App/Model/Resource/Abstract.php new file mode 100644 index 0000000..4abfe1b --- /dev/null +++ b/library/App/Model/Resource/Abstract.php @@ -0,0 +1,95 @@ +_defaultOrder){ + throw new App_Controller_Errors_WebServiceError("'_defaultOrder' non definito per la risorsa ". get_class($this)); + } + + if(!$this->_defaultTipoOrder){ + throw new App_Controller_Errors_WebServiceError("'_defaultTipoOrder' non definito per la risorsa " . get_class($this)); + } + + parent::__construct(); + } + + //Funzione che restituisce il nome della tabella + public function getTableName() + { + return $this->_name; + } + + //Funzione che restituisce la chiave primaria sicura + public function getPrimaryKey() + { + if (is_array($this->_primary)) return $this->_primary[1]; + return $this->_primary; + } + + //Funzione che restituisce il campo ordinamento di default + public function getDefaultOrder() + { + if (isset($this->_defaultOrder) && $this->_defaultOrder) return $this->_defaultOrder; + return $this->getPrimaryKey(); + } + + //Funzione che restituisce il tipo di ordinamento di default + public function getDefaultTipoOrder() + { + if (isset($this->_defaultTipoOrder) && $this->_defaultTipoOrder) return $this->_defaultTipoOrder; + return "ASC"; + } + + //Funzione che restituisce il tipo di select default + public function getDefaultSelectColumns() + { + if (isset($this->_defaultSelectColumns) && $this->_defaultSelectColumns) return $this->_defaultSelectColumns; + return "*"; + } + + //Funzione che restituisce il campo joinData di default + public function getDefaultJoinData() + { + if (isset($this->_defaultJoinData) && $this->_defaultJoinData) return $this->_defaultJoinData; + return null; + } + + public function getDefaultOrderString() + { + return $this->getDefaultOrder() . ' ' . $this->getDefaultTipoOrder(); + } + + //--------------- FUNZIONI PER LA GESTIONE DI DATABASE MULTIPLI ------------------------------------------ + + public function _setDbName($nomedb) + { + $dbparam = $this->_db->getConfig(); + $dbparam['dbname'] = $nomedb; + $this->_db = Zend_Db::factory('Pdo_Mysql', $dbparam); + } + + /** + * @return Zend_Db_Adapter_Abstract + */ + public function getDbAdapter() + { + return $this->_db; + } + + public function setDBConnection($nomeDB) + { + $this->_db->query('USE ' . $nomeDB); + } + +} diff --git a/library/App/Model/RestResource/Abstract.php b/library/App/Model/RestResource/Abstract.php new file mode 100644 index 0000000..d69cc36 --- /dev/null +++ b/library/App/Model/RestResource/Abstract.php @@ -0,0 +1,220 @@ +_risorsa || !$this->_apiUrl || !$this->_apiVersion) + throw new Exception("Non sono stati specificati tutti i parametri necessari alla risorsa (_risorsa,_apiUrl,_apiVersion)"); + + if ($this->_httpClient instanceof Zend_Http_Client) { + //$this->_httpClient = $this->_httpClient; + } else { + $this->_httpClient = new Zend_Http_Client(); + $this->_httpClient->setConfig(array( + 'adapter' => 'Zend_Http_Client_Adapter_Curl', + 'maxredirects' => 0, + 'timeout' => 60, + 'ssltransport' => 'ssl' + )); + } + } + + /***** METODI COMUNI DELLE CHIMATE *****/ + + public function postCall($dati) + { + $this->_httpClient->setMethod('POST'); + $this->_httpClient->setUri($this->getBaseUrl()); + $this->_httpClient->setRawData(json_encode($dati), 'application/json;charset=utf-8'); + return $this->executeCall(); + } + + public function updateById($id, $item) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('PUT'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_BY_ID, array('id' => $id))); + $this->_httpClient->setRawData(json_encode($item), 'application/json;charset=utf-8'); + return $this->executeCall(); + } + + public function deleteById($id) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('DELETE'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_BY_ID, array('id' => $id))); + return $this->executeCall(); + } + + public function getById($id) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('GET'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_BY_ID, array('id' => $id))); + return $this->executeCall(); + } + + public function getByColumnName($column, $value) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('GET'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_BY_COLUMNNAME, array('colname' => $column, 'value' => $value))); + return $this->executeCall(); + } + + public function getList($paged = null, $count = null, $order = null) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('GET'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_ALL_LIST)); + $this->_httpClient->setParameterGet(array('page' => $paged, 'count' => $count, 'order' => $order)); + + return $this->executeCall(); + } + + public function getFiltered($paged = null, $count = null, $order = null, $where = null) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('GET'); + + if (is_array($order)) { + $orderStr = ""; + $last_key = key(array_slice($order, -1, 1, TRUE)); + foreach ($order as $k => $val) { + $orderStr .= $val; + if ($k !== $last_key) $orderStr .= ","; + } + } + if ($orderStr) $order = $orderStr; + + $this->_httpClient->setParameterGet(array('page' => $paged, 'count' => $count, 'order' => $order)); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_FILTER, $where)); + + return $this->executeCall(); + } + + public function getByMethod($method, $params = null) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('GET'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_GENERIC, $method)); + $this->_httpClient->setParameterGet($params); + return $this->executeCall(); + } + + public function getByCustomUrl($url, $params = null) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('GET'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_CUSTOM_URL, $url)); + $this->_httpClient->setParameterGet($params); + return $this->executeCall(); + } + + public function postByCustomUrl($url, $dati = null) + { + $this->_httpClient->resetParameters(); + $this->_httpClient->setMethod('POST'); + $this->_httpClient->setUri($this->getMethodUrl(self::METHOD_CUSTOM_URL, $url)); + $this->_httpClient->setRawData(json_encode($dati), 'application/json;charset=utf-8'); + return $this->executeCall(); + } + + /***** METODI PRIVATI PER GESTIRE LE CHIAMATE *****/ + + private function getMethodUrl($method, $params = null) + { + $url = $this->getBaseUrl(!(self::METHOD_CUSTOM_URL === $method)); + switch ($method) { + case self::METHOD_BY_ID: + if (!isset($params['id'])) throw new Exception("Id Richiesto"); + $url .= "/" . $params['id']; + break; + case self::METHOD_ALL_LIST: + break; + case self::METHOD_FILTER: + $url .= "/method/filtra"; + $this->_httpClient->setParameterGet($params); + break; + case self::METHOD_GENERIC: + if (!$params) throw new Exception("Nome del metodo non valido"); + $url .= "/method/$params"; + break; + case self::METHOD_BY_COLUMNNAME: + if (!isset($params['colname'])) throw new Exception("Nome Colonna Richiesto"); + if (!isset($params['value'])) throw new Exception("Valore Richiesto"); + $url .= "/method/bycolumn/colname/" . $params['colname'] . "/val/" . $params['value']; + break; + case self::METHOD_CUSTOM_URL: + if (!$params) throw new Exception("Nome dell'url non valido"); + $url .= "$params"; + break; + default: + break; + } + return $url; + } + + private function getBaseUrl($withResouces = true) + { + if ($withResouces) { + return $this->_apiUrl . "/" . $this->_apiVersion . "/" . strtolower($this->_risorsa); + } else { + return $this->_apiUrl . "/" . $this->_apiVersion; + } + } + + private function executeCall() + { + + if ($this->_secretId) { + $this->_httpClient->setHeaders('Authorization', $this->_secretId); + } + + if ($this->_testHeader) { + $this->_httpClient->setHeaders('X-As-Dev-On', '1'); + } + + $httpResponse = $this->_httpClient->request(); + + //Zend_Registry::get('log')->info(print_r($this->_httpClient->getLastRequest(),true)); + //Zend_Registry::get('log')->info(print_r($httpResponse,true)); + + $httpResponseEncoded = json_decode($httpResponse->getBody(), 1); + + if (json_last_error() !== JSON_ERROR_NONE) { + Zend_Registry::get('log')->info($this->_httpClient->getUri()); + Zend_Registry::get('log')->info("Errore codifica JSON:"); + Zend_Registry::get('log')->info(print_r($httpResponse, true)); + return null; + } + + if ($this->_httpClient->getLastResponse()->getStatus() != '200') { + Zend_Registry::get('log')->info($this->_httpClient->getUri()); + Zend_Registry::get('log')->info("Errore status response " . $this->_httpClient->getLastResponse()->getStatus()); + Zend_Registry::get('log')->info(print_r($httpResponseEncoded, true)); + throw new App_Exception_ResponseCloudException($httpResponseEncoded['message'], $httpResponseEncoded['errorCode']); + } + + return $httpResponseEncoded; + } + +} diff --git a/library/App/PayPal/PayPalApi.php b/library/App/PayPal/PayPalApi.php new file mode 100644 index 0000000..d69394d --- /dev/null +++ b/library/App/PayPal/PayPalApi.php @@ -0,0 +1,147 @@ +_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + + //La modalita Test o Sandbox viene impostata dal parametro delle configurazioni e solo se la chiamata avviene da un IP abilitato + $this->_apiPayPalTestAccount = false; + if($this->_ipManager->allowedDevMode()){ + $this->_apiPayPalTestAccount = ($this->_configs->get('interrutore_paypal_test') == 'on') ? 1:0; + } + + if($this->_apiPayPalTestAccount){ + $this->_apiMode = "sandbox"; + $this->_logLevel = "DEBUG"; + $this->_clientId = self::TEST_CLIENT_ID; + $this->_clientSecret = self::TEST_CLIENT_SECRET; + } + + //Controlla se il log è abilitato che esista anche il file su cui salvare altrimenti lo disabilita + if($this->_logEnabled) + $this->_logEnabled = file_exists($this->_logFileName); + + $this->_apiContext = $this->setApiContext($this->_clientId, $this->_clientSecret); + } + + public function getPayPalContext() + { + return $this->_apiContext; + } + + public function getWebProfile(){ + + $webProfile = new WebProfile(); + + try { + $webProfileList = $webProfile->get_list($this->_apiContext); + } catch (Exception $ex) { + return null; + } + + //Controlla se gia esiste un web profile con il nome assegnato + if($webProfileList){ + foreach($webProfileList as $profile){ + if($profile->name == self::WEBPROFILE_NAME){ + $webProfile = $profile; + return $webProfile; + } + } + } + + //Altrimenti lo creo con questi parametri specifici + $webProfile->setName(self::WEBPROFILE_NAME); + $webProfile->setTemporary(false); + + $presentation = new Presentation(); + $presentation->setLogoImage(self::LOGO_URL_IMAGE); + $webProfile->setPresentation($presentation); + + $inputFields = new InputFields(); + $inputFields->setNoShipping(1); + $webProfile->setInputFields($inputFields); + + try { + $webProfile = $webProfile->create($this->_apiContext); + } catch (Exception $ex) { + return null; + } + + return $webProfile; + + } + + public function deleteWebProfile(){ + + $webProfile = $this->getWebProfile(); + //Elimina questo web profile + try { + $webProfileRes = $webProfile->delete($this->_apiContext); + } catch (Exception $ex) { + exit(1); + } + + ResultPrinter::printResult("", "WebProfile", "", $webProfile, $webProfileRes); + + return null; + } + + private function setApiContext($clientId, $clientSecret) + { + + $apiContext = new ApiContext( + new OAuthTokenCredential( + $clientId, + $clientSecret + ) + ); + + $apiContext->setConfig( + array( + 'mode' => $this->_apiMode, + 'log.LogEnabled' => $this->_logEnabled, + 'log.FileName' => $this->_logFileName, + 'log.LogLevel' => $this->_logLevel, + 'cache.enabled' => true + ) + ); + + return $apiContext; + } + +} diff --git a/library/App/Service/Auth.php b/library/App/Service/Auth.php new file mode 100644 index 0000000..ad4d231 --- /dev/null +++ b/library/App/Service/Auth.php @@ -0,0 +1,74 @@ +_configs = new App_Service_ConfigManager(); + $this->_acl = new App_Model_Acl_Acl(); + } + + public function authenticate($credentials) + { + $adapter = $this->getAuthAdapter($credentials); + $auth = $this->getAuth(); + $result = $auth->authenticate($adapter); + + if (!$result->isValid()) { + return false; + } + + $user = $adapter->getResultRowObject(); + Zend_Registry::set("username",$user->username); + Zend_Registry::set("role",$user->role); + + $auth->getStorage()->write($user); + + return true; + } + + public function getAuth() + { + if (null === $this->_auth) { + $this->_auth = Zend_Auth::getInstance(); + } + return $this->_auth; + } + + public function getIdentity() + { + $auth = $this->getAuth(); + if ($auth->hasIdentity()) { + return $auth->getIdentity(); + } + return false; + } + + public function checkPermission($resourceName){ + return $this->_acl->isAllowed($this->getIdentity()->role, $resourceName); + } + + public function clear() + { + $this->getAuth()->clearIdentity(); + } + + public function getAuthAdapter($values) + { + $salt = Zend_Registry::get('ENVIROMENTS')->get('password_salt'); + $authAdapter = new Zend_Auth_Adapter_DbTable( + Zend_Db_Table_Abstract::getDefaultAdapter(), + 'users', + 'username', + 'password', + "MD5(CONCAT('$salt',?))" + ); + $authAdapter->setIdentity($values['username']); + $authAdapter->setCredential($values['password']); + return $authAdapter; + } +} diff --git a/library/App/Service/CodificaPiva.php b/library/App/Service/CodificaPiva.php new file mode 100644 index 0000000..b8405f9 --- /dev/null +++ b/library/App/Service/CodificaPiva.php @@ -0,0 +1,81 @@ +".intval($packs[$i]) . "-$charpos-17=$x"; + $strDecript .= chr(intval($packs[$i]) - $charpos - 17); + }else{ + //echo "
".intval($packs[$i]) . "-$charpos-177=$x"; + $strDecript .= chr(intval($packs[$i]) - $charpos - 177); + } + } + + return $strDecript; + } + +} diff --git a/library/App/Service/ConfigManager.php b/library/App/Service/ConfigManager.php new file mode 100644 index 0000000..657a417 --- /dev/null +++ b/library/App/Service/ConfigManager.php @@ -0,0 +1,87 @@ +_config = Zend_Registry::get('config'); + $this->_writer = new Zend_Config_Writer_Ini(array('config'=> $this->_config,'filename' => APPLICATION_PATH.'/configs/config.ini')); + $this->_ipManager = new App_Service_IpManager(); + } + + /** + * Aggiorna l'oggetto config ricaricando tutte le impostazioni memorizzate + * nel file config.ini + */ + public function update() + { + $this->_config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/config.ini', null, array('skipExtends'=> true, + 'allowModifications' => true)); + Zend_Registry::set('config',$this->_config); + } + + /** + * Inserisci nel file di configurazione il parametro passato memorizzandolo + * + * @param string $param + * @param string $value + * @return void + */ + public function insert($param,$value) + { + if($param==null||$param==''){ + return; + } + $this->_config->__set($param, $value); + $this->write(); + } + + public function set($key,$value){ + $this->_config->__set($key, $value); + } + + /** + * Restituisce il valore del parametro richiesto + * + * @param string $name + * @return string + */ + public function get($name){ + return $this->_config->get($name); + } + + /** + * Elimina il parametro richiesto se esistente + * + * @param string $param + * @return boolean + */ + public function delete($param){ + if($this->_config->get($param)){ + $this->_config->__unset($param); + $this->write(); + return TRUE; + }else{ + return FALSE; + } + } + + public function write(){ + $this->_writer->config=$this->_config; + $this->_writer->write(); + $this->update(); + } + + public function getAllParam(){ + $data=array(); + foreach ($this->_config as $key => $value) { + $data[$key]=$value; + } + return $data; + } + +} diff --git a/library/App/Service/Cpanel.php b/library/App/Service/Cpanel.php new file mode 100644 index 0000000..455fce1 --- /dev/null +++ b/library/App/Service/Cpanel.php @@ -0,0 +1,157 @@ + /dev/null'; + + public function __construct() + { + $this->_configs = Zend_Registry::get('config'); + $this->_enviroments = Zend_Registry::get('ENVIROMENTS'); + + $this->_cronCommandBase = str_replace('%baseUrlSite%', $this->_enviroments->get('baseUrlSite'), $this->_cronCommandBase); + + $this->_CPANEL_HOST = $this->_enviroments->get('cpanel')->get('host'); + $this->_CPANEL_USERNAME = $this->_enviroments->get('cpanel')->get('username'); + $this->_CPANEL_PASSWORD = $this->_enviroments->get('cpanel')->get('password'); + $this->_RESTUSERNAME = $this->_enviroments->get('cpanel')->get('restusername'); + + $this->_cpanelApi = new App_Service_CpanelApi($this->_CPANEL_USERNAME, $this->_CPANEL_PASSWORD, $this->_CPANEL_HOST); + } + + public function listCron() + { + + try { + + $res = $this->_cpanelApi->api2->Cron->listcron(); + + if ($res->errors) { + if (is_array($res->errors)) + return implode(';', $res->errors); + else + return "ERRORE: richiesta elenco funzioni cron --- " . $res->errors; + } + + return $res; + + } catch (Exception $e) { + return $e; + } + + } + + public function attivaFunzioneCron() + { + + try { + + $res = $this->_cpanelApi->api2->Cron->add_line(array( + 'command' => $this->_cronCommandBase, + 'day' => '*', + 'hour' => '*', + 'minute' => '*/2', // Una volta ogni due minuti + 'month' => '*', + 'weekday' => '*', + )); + + if ($res->errors) { + if (is_array($res->errors)) + return implode(';', $res->errors); + else + return "ERRORE: attivazione cron sync ordini --- " . $res->errors; + } + + $data = $res->cpanelresult->data[0]; + + if($data->status == 1){ + return ['stato'=>true,'message'=>'Sincronizzazione attivata']; + }elseif($data->status === 0 && $data->statusmsg == "This cron job already exists.") { + return ['stato'=>true,'message'=>'Sincronizzazione già attiva']; + }else{ + return ['stato'=>false,'message'=>'Errore durante l\'operazione di sincronizzazione']; + } + + } catch (Exception $e) { + return $e; + } + + } + + public function disattivaFunzioneCron() + { + + try { + + $res = null; + $cronList = $this->listCron(); + + $x = 0; + foreach ($cronList->cpanelresult->data as $cron) { + $x++; + if ($cron->command === $this->_cronCommandBase) { + $res = $this->removeCron($x); + } + } + + $data = $res->cpanelresult->data[0]; + + if($data !== null && $data->status === 1){ + return ['stato'=>false,'message'=>'Sincronizzazione disattivata']; + }else{ + return ['stato'=>false,'message'=>'Sincronizzazione non attiva']; + } + + } catch (Exception $e) { + return $e; + } + + } + + public function removeCron($lineKey) + { + + try { + + $res = $this->_cpanelApi->api2->Cron->remove_line(array('line' => $lineKey)); + + if ($res->errors) { + if (is_array($res->errors)) + return implode(';', $res->errors); + else + return "ERRORE: rimozione funzione cron --- " . $res->errors; + } + + return $res; + + } catch (Exception $e) { + return $e; + } + + } + + public function checkFunzioneCronIsActive() + { + try { + $listCron = $this->listCron(); + foreach ($listCron->cpanelresult->data as $cron){ + if($cron->command === $this->_cronCommandBase) return true; + } + return false; + } catch (Exception $e) { + return $e; + } + } + + +} diff --git a/library/App/Service/CpanelApi.php b/library/App/Service/CpanelApi.php new file mode 100644 index 0000000..26ee283 --- /dev/null +++ b/library/App/Service/CpanelApi.php @@ -0,0 +1,263 @@ +user = $user; + $this->pass = $pass; + $this->server = $server; + if ($this->secret) { + $this->secret = $secret; + $this->set2Fa(); + } + } + + /** + * Include the ot class so we can generate a valid token for 2FA + */ + protected function set2Fa() + { + require 'otphp/lib/otphp.php'; + $totp = new \OTPHP\TOTP($this->secret); + $this->token = $totp->now(); + } + + public function __get($name) + { + switch (strtolower($name)) { + case 'get': + $this->httpMethod = 'GET'; + break; + case 'post': + $this->httpMethod = 'POST'; + break; + case 'api2': + $this->setApi('api2'); + break; + case 'uapi': + $this->setApi('uapi'); + break; + default: + $this->scope = $name; + } + return $this; + } + + /** + * Set the api to use for connections. + * @param $api + * @return $this + * @throws Exception + */ + protected function setApi($api) + { + $this->api = $api; + $this->setMethod(); + return $this; + } + + /** + * Function to set the method used to communicate with the chosen api. + * @return $this + * @throws Exception + */ + protected function setMethod() + { + switch ($this->api) { + case 'uapi': + $this->method = '/execute/'; + break; + case 'api2': + $this->method = '/json-api/cpanel/'; + break; + default: + throw new Exception('$this->api is not set or is incorrectly set. The only available options are \'uapi\' or \'api2\''); + } + return $this; + } + + /** + * Magic __toSting() method, allows us to return the result as raw json + * @return mixed + */ + public function __toString() + { + return $this->json; + } + + /** + * Magic __call method, will translate all function calls to object to API requests + * @param $name - name of the function + * @param $arguments - an array of arguments + * @return mixed + * @throws Exception + */ + public function __call($name, $arguments) + { + if (count($arguments) < 1 || !is_array($arguments[0])) + $arguments[0] = []; + $this->json = $this->APIcall($name, $arguments[0]); + return json_decode($this->json); + } + + /** + * @param $name + * @param $arguments + * @return bool|mixed + * @throws Exception + */ + protected function APIcall($name, $arguments) + { + $this->auth = base64_encode($this->user . ":" . $this->pass); + $this->type = $this->ssl == 1 ? "https://" : "http://"; + $this->requestUrl = $this->type . $this->server . ':' . $this->port . $this->method; + switch ($this->api) { + case 'uapi': + $this->requestUrl .= ($this->scope != '' ? $this->scope . "/" : '') . $name . '?'; + break; + case 'api2': + if ($this->scope == '') { + throw new Exception('Scope must be set.'); + } + $this->requestUrl .= '?cpanel_jsonapi_user=' . $this->user . '&cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=' . $this->scope . '&cpanel_jsonapi_func=' . $name . '&'; + break; + default: + throw new Exception('$this->api is not set or is incorrectly set. The only available options are \'uapi\' or \'api2\''); + } + if($this->httpMethod == 'GET') { + $this->requestUrl .= http_build_query($arguments); + } + if($this->httpMethod == 'POST'){ + $this->postData = $arguments; + } + + return $this->curl_request($this->requestUrl); + } + + /** + * @param $url + * @return bool|mixed + */ + protected function curl_request($url) + { + $httpHeaders = array("Authorization: Basic " . $this->auth); + //If we have a token then send that with the request for 2FA. + if ($this->token) { + $httpHeaders[] = "X-CPANEL-OTP: " . $this->token; + } + $ch = curl_init(); + if($this->httpMethod == 'POST'){ + $httpHeaders[] = "Content-type: multipart/form-data"; + curl_setopt($ch,CURLOPT_POSTFIELDS, $this->postData); + } + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders); + curl_setopt($ch, CURLOPT_TIMEOUT, 100020); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + + $content = $this->curl_exec_follow($ch, $this->maxredirect); + $this->eno = curl_errno($ch); + $this->emes = curl_error($ch); + + curl_close($ch); + + return $content; + } + + /** + * @param $ch + * @param null $maxredirect + * @return bool|mixed + */ + protected function curl_exec_follow($ch, &$maxredirect = null) + { + // we emulate a browser here since some websites detect + // us as a bot and don't let us do our job + $user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5)" . + " Gecko/20041107 Firefox/1.0"; + curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); + + $mr = $maxredirect === null ? 5 : intval($maxredirect); + + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0); + curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + return curl_exec($ch); + } + + /** + * Function to get the last request made + * @return mixed + */ + public function getLastRequest() + { + return $this->requestUrl; + } + + /** + * Function to return the error if there was one, or FALSE if not. + * @return array|bool + */ + public function getError() + { + if (!empty($this->eno)) { + return ['no' => $this->eno, 'message' => $this->emes]; + } + return FALSE; + } + } \ No newline at end of file diff --git a/library/App/Service/Emails.php b/library/App/Service/Emails.php new file mode 100644 index 0000000..a9523db --- /dev/null +++ b/library/App/Service/Emails.php @@ -0,0 +1,80 @@ +_configs = Zend_Registry::get('config'); + $this->_ipManager = new App_Service_IpManager(); + $this->_genericModel = new Application_Model_Generic(); + } + + public function sendEmailByTemplateHtml($email, $oggetto, $templateName, $params = array(), $nomeMittente = null, $filename = null) + { + $mail = new App_Model_Mail('UTF-8'); + + $templateFileName = self::EMAIL_TEMPLATE_PATH.$templateName; + + if(!file_exists($templateFileName)){ + throw new Exception("Email template non trovato impossibile inviare l'email"); + } + + $testoEmail = file_get_contents($templateFileName); + + $params = $this->preparaDatiPerSostituzione($params); + + if (count($params) > 0) { + foreach ($params as $key => $val) { + $oggetto = str_replace($key, $val, $oggetto); + $testoEmail = str_replace($key, $val, $testoEmail); + } + } + + if ($filename != null) { + if (file_exists($filename)) + $mail->createAttachment(file_get_contents($filename), 'application/pdf', Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $filename); + } + + $nomeMittente = ($nomeMittente) ? $nomeMittente : $this->_configs->get('email_mittente_nome'); + + $mail->setFrom('noreply@fatturab2b.net', $nomeMittente)->setSubject($oggetto); + + $mail->setBodyHtml($testoEmail); + + //Inserisco il o i destinatari/o + if (is_string($email)) { + $mail->addTo($email, $email); + } else if (is_array($email)) { + foreach ($email as $val) { + $mail->addTo($val); + } + } + + $mail->send(); + } + + /** + * Questa funzione presi i parametri passati nell array ne aggiunge i simboli + * percentuale per farli riconoscere popi nel testo e sostituirli + * @param $dati + * @return array + */ + private function preparaDatiPerSostituzione($dati){ + $newParams = array(); + + foreach($dati as $key => $val){ + $newParams['%'.$key.'%'] = $val; + } + + return $newParams; + } + +} diff --git a/library/App/Service/ExternalApiService.php b/library/App/Service/ExternalApiService.php new file mode 100644 index 0000000..ee46a4b --- /dev/null +++ b/library/App/Service/ExternalApiService.php @@ -0,0 +1,119 @@ +_configs = Zend_Registry::get('config'); + $this->_ipManager = new App_Service_IpManager(); + $this->_genericModel = new Application_Model_Generic(); + + $this->_httpClient = new Zend_Http_Client(); + $this->_httpClient->setConfig(array( + 'adapter' => 'Zend_Http_Client_Adapter_Curl', + 'maxredirects' => 0, + 'timeout' => 60, + 'ssltransport' => 'ssl' + )); + + } + + public function setConnectionParams($codiceAttivita, $tipoApi) + { + + //Recupero se presenti i dati per la comunicazione con un eventuale endpoint + $api = $this->_genericModel->getFiltered('ExternalApi', array('CodiceAttivita = ?' => $codiceAttivita, 'TipoApi = ?' => $tipoApi, 'Attivo = ?' => 1)); + + if (!$api) { + $this->_authToken = null; + $this->_endPoint = null; + } else { + $this->_authToken = $api['AuthToken']; + $this->_endPoint = $api['Endpoint']; + } + + } + + public function checkConnectionParams() + { + if (!$this->_authToken || !$this->_endPoint) { + throw new App_Controller_Errors_WebServiceError('Parametri per la connessione non impostati correttamente', App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR); + } + } + + public function postCall($dati = array()) + { + + $this->checkConnectionParams(); + + $this->_httpClient->setMethod('POST'); + $this->_httpClient->setUri($this->_endPoint); + $this->_httpClient->setRawData(json_encode($dati), 'application/json;charset=utf-8'); + + return $this->executeCall(); + } + + public function putCall($dati = array()) + { + + $this->checkConnectionParams(); + + $this->_httpClient->setMethod('PUT'); + $this->_httpClient->setUri($this->_endPoint); + $this->_httpClient->setRawData(json_encode($dati), 'application/json;charset=utf-8'); + + return $this->executeCall(); + } + + private function executeCall() + { + + $this->_httpClient->setHeaders('Authorization', 'Secret ' . $this->_authToken); + + if ($this->_ipManager->allowedDevMode()) { + $this->_httpClient->setHeaders('X-As-Dev-On', '1'); + $this->_httpClient->setHeaders('X-As-Dev-Pw', 'JackDev2590'); + } + + $httpResponse = $this->_httpClient->request(); + $httpResponse->getStatus(); + + $headerResponse = $httpResponse->getHeaders(); + + // Zend_Registry::get('log')->info(print_r($this->_httpClient->getLastRequest(),true)); + // Zend_Registry::get('log')->info(print_r($this->_httpClient->getLastResponse(),true)); + + // Zend_Registry::get('log')->info(print_r($headerResponse,true)); + // Zend_Registry::get('log')->info(print_r($httpResponse->getStatus(),true)); + + if (preg_match('/application\/json|json/', $headerResponse['Content-type'])) { + $httpResponseBody = json_decode($httpResponse->getBody(), 1); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new App_Controller_Errors_WebServiceError("Errore di decodifica json per la chiamata: " . $this->_httpClient->getUri(), App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR); + } + + if ($httpResponse->getStatus() >= 400 && $httpResponse->getStatus() < 500) { + throw new App_Controller_Errors_WebServiceError($httpResponseBody['message'], App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR); + } + + } else { + $httpResponseBody = $httpResponse->getBody(); + } + + return $httpResponseBody; + } + +} diff --git a/library/App/Service/FatturaElettronica.php b/library/App/Service/FatturaElettronica.php new file mode 100644 index 0000000..7808183 --- /dev/null +++ b/library/App/Service/FatturaElettronica.php @@ -0,0 +1,345 @@ + array('Codice' => 'TD01', 'Descrizione' => 'Fattura'), + 'TD02' => array('Codice' => 'TD02', 'Descrizione' => 'Acconto/Anticipo su fattura'), + 'TD03' => array('Codice' => 'TD03', 'Descrizione' => 'Acconto/Anticipo su parcella'), + 'TD04' => array('Codice' => 'TD04', 'Descrizione' => 'Nota di credito'), + 'TD05' => array('Codice' => 'TD05', 'Descrizione' => 'Nota di debito'), + 'TD06' => array('Codice' => 'TD06', 'Descrizione' => 'Parcella') + ); + + public function __construct() + { + $this->_ipManager = new App_Service_IpManager(); + } + + public function getCredenzialiUtente() + { + return $this->_credenzialiUtente; + } + + public function setCredenzialiUtente($credenzialiUtente) + { + if (!isset($credenzialiUtente['CustomerCode'])) throw new Exception("Errore campo 'customerCode' non impostato nelle credenziali"); + if (!isset($credenzialiUtente['Password'])) throw new Exception("Errore campo 'Password' non impostato nelle credenziali"); + + $this->_credenzialiUtente = $credenzialiUtente; + } + + /************************ FUNZIONI FATTURE INVIATE ********************************************************/ + + public function verificaStatoServizioFeInviateServer() + { + + $this->setCredenzialiUtente(array( + 'CustomerCode' => '', + 'Password' => '' + )); + $this->_soapClient = new App_Service_SoapFeInviate($this->getCredenzialiUtente()); + + $result = $this->_soapClient->ContattoHub(); + + //Controllo eventuali errori sulla rispsota + if ($result->ContattoHubResult != '0') { + return false; + } else { + return true; + } + + } + + public function getFatturaInviata($idSdi){ + + $this->_soapClient = new App_Service_SoapFeInviate($this->getCredenzialiUtente()); + + $params = array( + 'paramFilter' => array( + 'IdSdi' => $idSdi, + 'DataCustomerServicesConsumption' => false, + 'DataFullInvoices' => true + )); + + $result = $this->_soapClient->GetElectronicInvoices($this->_soapClient->mergeParamsCredenziali($params)); + + //Controllo eventuali errori sulla rispsota + if ($result->GetElectronicInvoicesResult->ResultCode != 'Success') { + $this->SoapErrorResultHandler($result->GetElectronicInvoicesResult); + } + + if (is_object($result->GetElectronicInvoicesResult->ElectronicInvoices->ElectronicInvoice)) { + $data = array(0 => (array)$result->GetElectronicInvoicesResult->ElectronicInvoices->ElectronicInvoice); + } elseif (is_array($result->GetElectronicInvoicesResult->ElectronicInvoices->ElectronicInvoice)) { + $data = $result->GetElectronicInvoicesResult->ElectronicInvoices->ElectronicInvoice; + } else { + $data = array(); + } + + // Zend_Registry::get('log')->info(print_r($this->_soapClient->getLastRequest(),true)); + // Zend_Registry::get('log')->info(print_r($data,true)); + + return $data; + } + + public function getEsitoFatturaInviata($idEsito, $tipoMessaggiOEsito, $getXmlData = false) + { + $this->_soapClient = new App_Service_SoapFeInviate($this->getCredenzialiUtente()); + + $params = array( + 'paramFileOutcome' => array( + 'IdOutcome' => $idEsito + )); + + $result = $this->_soapClient->GetFileElectronicInvoiceOutcome($this->_soapClient->mergeParamsCredenziali($params)); + + //Controllo eventuali errori sulla rispsota + if ($result->GetFileElectronicInvoiceOutcomeResult->ResultCode != 'Success') { + $this->SoapErrorResultHandler($result->GetFileElectronicInvoiceOutcomeResult); + } + + $xmlCode = $result->GetFileElectronicInvoiceOutcomeResult->File; + + $responseData = array( + 'xmlFile' => $this->addXslTagToXml($xmlCode, $this->getXslByTipoMessaggioEsito($tipoMessaggiOEsito)), + 'filename' => $result->GetFileElectronicInvoiceOutcomeResult->Filename + ); + + if ($getXmlData) { + $responseData['xmlData'] = simplexml_load_string($xmlCode); + } + + return $responseData; + } + + /** + * @param $idFatt - Id della fattura da recuparare dai server della 2C + * @param bool $xmlData - true: restiuisce i dati in formato xml della fattura elettronica | false: non li restituisce (DEFAULT: false) + * @param bool $onlyXmlData - restituisce solo i dati xml della fattura elettronica (DEFAULT: false) + * @param bool $fileFirmato - true: resituisce il file firmato .p7m (DEFAULT: false) + * @param bool $getXslProcessed - restituisce l'html della fattura elettronica elaborato con il foglio di stile (DEFAULT: false) + * @param string $xslFile - Indica il file del foglio di stile da utilizzare (DEFAULT: "fatturaordinaria_v1_2_1.xsl") + * @return array|bool|SimpleXMLElement + * @throws App_Controller_Errors_WebServiceError + * @throws Zend_Exception + */ + public function getFatturaInviataXml($idFatt, $xmlData = false, $onlyXmlData = false, $fileFirmato = false, $getXslProcessed = false, $xslFile = "fatturaordinaria_v1_2_1.xsl") + { + $this->_soapClient = new App_Service_SoapFeInviate($this->getCredenzialiUtente()); + + $params = array( + 'paramFileInvoice' => array( + 'IdInvoice' => $idFatt, + 'ExtractionP7M' => !$fileFirmato + )); + + $result = $this->_soapClient->GetFileElectronicInvoice($this->_soapClient->mergeParamsCredenziali($params)); + + Zend_Registry::get('log')->info(print_r($result,true)); + + //Controllo eventuali errori sulla rispsota + if ($result->GetFileElectronicInvoiceResult->ResultCode != 'Success') { + $this->SoapErrorResultHandler($result->GetFileElectronicInvoiceResult); + } + + if ($xmlData && !$fileFirmato) { + $xmlData = simplexml_load_string($result->GetFileElectronicInvoiceResult->File); + + //Elimino eventuali allegati dall'xml data per non appesantire la chiamata + foreach ($xmlData->FatturaElettronicaBody as $body) { + if (isset($body->Allegati)) { + foreach ($body->Allegati as $allegato) { + unset($allegato->Attachment); + } + } + } + } + + if (!$fileFirmato) + $filename = $xmlData->FatturaElettronicaHeader->DatiTrasmissione->IdTrasmittente->IdPaese . $xmlData->FatturaElettronicaHeader->DatiTrasmissione->IdTrasmittente->IdCodice . '_' . $xmlData->FatturaElettronicaHeader->DatiTrasmissione->ProgressivoInvio . ".xml"; + else + $filename = $result->GetFileElectronicInvoiceResult->Filename; + + if ($onlyXmlData && !$getXslProcessed) { + return $xmlData; + } + + if ($getXslProcessed) { + $tipoFattura = self::TipiDocumentoFatturaElettronica[$xmlData->FatturaElettronicaBody->DatiGenerali->DatiGeneraliDocumento->TipoDocumento . ""]; + $dataDocumento = implode('/', array_reverse(explode("-", $xmlData->FatturaElettronicaBody->DatiGenerali->DatiGeneraliDocumento->Data . ""))); + $nomeFileFattura = $tipoFattura['Descrizione'] . " " . $xmlData->FatturaElettronicaBody->DatiGenerali->DatiGeneraliDocumento->Numero . " del " . $dataDocumento; + return array( + 'htmlProcessed' => $this->getXslCodeProcessed($result->GetFileElectronicInvoiceResult->File, $xslFile), + 'Filename' => $nomeFileFattura + ); + } + + //Se il file è firmato (p7m) allora non elaboro il file xml per aggiungere il foglio di stile altrimenti si + $elaboraXml = !preg_match('/.p7m/', $filename); + if ($elaboraXml) { + $file = $this->addXslTagToXml($result->GetFileElectronicInvoiceResult->File, $xslFile); + $allegati = $this->estraiAllegatoDaXml($result->GetFileElectronicInvoiceResult->File); + } else { + $file = $result->GetFileElectronicInvoiceResult->File; + $allegati = array(); + } + + return array( + 'File' => $file, + 'Filename' => $filename, + 'XmlData' => $xmlData, + 'Allegati' => $allegati, + ); + + } + + /**********************************************************/ + + private function getXslByTipoMessaggioEsito($tipo) + { + switch ($tipo) { + case'MC': + case'MT': + case'NS': + case'RC': + return $tipo . "_v1_1.xsl"; + break; + case'DT': + return $tipo . "_v1_0.xsl"; + break; + default: + return "NE_v1_0.xsl"; + break; + } + } + + private function addXslTagToXml($xmlCode, $xslFileName) + { + $doc = new DOMDocument(); + $doc->loadXML($xmlCode); + + if ($doc->firstChild->nodeName == 'xml-stylesheet') { + $doc->firstChild->nodeValue = 'type="text/xsl" href="' . $xslFileName . '"'; + return $doc->saveXML(); + } + + $newDoc = new DOMDocument('1.0', 'UTF-8'); + $newDoc->preserveWhiteSpace = true; + $newDoc->formatOutput = true; + + $newDoc->createElement("xml"); + + $styleSheet = $newDoc->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="' . $xslFileName . '"'); + $newDoc->appendChild($styleSheet); + $newNode = $newDoc->importNode($doc->firstChild, true); + $newDoc->appendChild($newNode); + + return $newDoc->saveXML(); + } + + private function estraiAllegatoDaXml($xmlCode) + { + $doc = new DOMDocument(); + $doc->loadXML($xmlCode); + + $allegati = $doc->getElementsByTagName('Allegati'); + + $allegatiTmp = array(); + foreach ($allegati as $allegato) { + array_push($allegatiTmp, array( + 'NomeFile' => $allegato->getElementsByTagName('NomeAttachment')[0]->nodeValue, + 'FormatoAttachment' => $allegato->getElementsByTagName('FormatoAttachment')[0]->nodeValue, + 'File' => $allegato->getElementsByTagName('Attachment')[0]->nodeValue + )); + } + + return $allegatiTmp; + } + + private function SoapErrorResultHandler($result) + { + if (trim(str_replace('Errore -->', '', trim($result->ResultMessage))) == 'Impossibile recuperare il cliente') { + throw new Exception("Credenziali servizio FatturaFE non valide"); + } else + throw new Exception(trim($result->ResultMessage)); + + } + + private function xml2array($xmlObject, $out = array()) + { + foreach ((array)$xmlObject as $index => $node) + $out[$index] = (is_object($node)) ? $this->xml2array($node) : $node; + + return $out; + } + + private function getXslCodeProcessed($xmlCode, $xslFile) + { + + $xslPath = APPLICATION_PATH . "/../../docs/xsl/"; + $tmpFile = APPLICATION_PATH . "/../../docs/tmp/" . date('d_m_Hisu') . ".xml"; + + $myfile = fopen($tmpFile, "w"); + fwrite($myfile, $xmlCode); + fclose($myfile); + + // Load the XML source + $xml = new DOMDocument; + $xml->load($tmpFile); + + unlink($tmpFile); + + $xsl = new DOMDocument; + $XslPath = $xslPath . $xslFile; + + if (!file_exists($XslPath)) { + throw new Exception("File xsl non trovato"); + } + $xsl->load($XslPath); + + // Configure the transformer + $proc = new XSLTProcessor; + $proc->importStyleSheet($xsl); // attach the xsl rules + + return $proc->transformToXML($xml); + } + + /** + * Questa funzione passato un filename e un array contente i filename già utilizzati ne rinomina i duplicati aggiungendo "(incremento)" alla fine del nomefile + * + * @param $filename + * @param $listFileNamePresent + * @param int $x + * @param null $filenameOriginal + * @return string + */ + private function checkDuplicatedFileName($filename, &$listFileNamePresent, $x = 0, $filenameOriginal = null) + { + + if (!in_array(strtolower($filename), $listFileNamePresent)) { + array_push($listFileNamePresent, strtolower($filename)); + return $filename; + } + + if ($x == 0) $filenameOriginal = pathinfo($filename, PATHINFO_FILENAME); + + $x++; + $filename = $filenameOriginal . "($x)." . pathinfo($filename, PATHINFO_EXTENSION); + + //Ricorsione + return $this->checkDuplicatedFileName($filename, $listFileNamePresent, $x, $filenameOriginal); + } + + private function getFileSizeInByte($base64string) + { + $bytes = strlen(base64_decode($base64string)); + return round($bytes, 2); + } + +} diff --git a/library/App/Service/FeAuthInfo.php b/library/App/Service/FeAuthInfo.php new file mode 100644 index 0000000..39e7c65 --- /dev/null +++ b/library/App/Service/FeAuthInfo.php @@ -0,0 +1,94 @@ +_model = new Application_Model_Generic(); + } + + /** + * Funzione per il recupero delle credenziali di accesso al servizio fatturaB2B + * + * Le cerca prima nella tabella di appoggio interna fe_authdata + * se non le trova le cerca tramite il collegamento al sito fattuab2b.it e le memorizza per i successvi utilizzi + * + * @param string $piva + * @return mixed + * @throws App_Controller_Errors_WebServiceError + */ + public function getFeAuthCredential(string $piva) + { + $piva = str_replace('IT','', $piva); + $credenziali = $this->_model->getByColumnName('FeAuthData', 'PartitaIva', $piva); + + if (!$credenziali) { // se non le trovo le cerco sul servizio del sito fattura b2b + $credenziali = $this->getFeAuthFatturaB2B($piva); + } + + return $this->decriptaCredenziali($credenziali); + } + + /** + * Recuper le credenziali dal sito fatturab2b.it e nel caso non sono presenti le memorizza sulla tabella delle credenziali + * @param $piva + * @return array|array[] + * @throws App_Controller_Errors_WebServiceError + */ + private function getFeAuthFatturaB2B($piva) + { + + //Controllo se il cliente ha il servizio di fatturazione elettronica attivo sul sito FatturaB2B + $ApiFatturaB2B = new App_Model_CurlHttpClient('https://www.fatturab2b.it/services/checkserviziofe'); + $credenzialiFe = $ApiFatturaB2B->getCall(array('piva' => $piva, 'info' => 1)); + + if (!$credenzialiFe || !$credenzialiFe['success'] || !$credenzialiFe['data']['StatoServizio']) { + throw new App_Controller_Errors_WebServiceError("Credenziali non esistenti o servizio non attivo per la partita iva $piva"); + } + + $credenziali = $credenzialiFe['data']; + $credenziali['PartitaIva'] = str_replace('IT','', $credenziali['PartitaIva']); + + return $this->insertUpdateFeAuthRecord($credenziali); + } + + /** + * Memorizza le credenziali nella tabella di appoggio fe_authdata + * + * @param $credenziali + * @return array|array[] + * @throws App_Controller_Errors_WebServiceError + * @throws Zend_Form_Exception + */ + private function insertUpdateFeAuthRecord($credenziali) + { + + $feAuthDataForm = new Application_Form_Admin_Index_FeAuthData_Add(); + if(!$feAuthDataForm->isValid($credenziali)){ + throw new App_Controller_Errors_WebServiceError("Dati da inserire nel fe auth data non validi"); + } + + $credenziali = $feAuthDataForm->getValues(); + $credenziali['DataUpdate'] = date('Y-m-d H:i:s'); + + $this->_model->deleteWhere('FeAuthData', array("PartitaIva = '?'" => $credenziali['PartitaIva'])); + $credenziali['id'] = $this->_model->insert('FeAuthData', $credenziali); + + return $credenziali; + } + + /** + * Decripta le credenziali e le restituisce + * + * @param $credenziali + * @return mixed + */ + private function decriptaCredenziali($credenziali){ + $credenziali['Password'] = App_Service_CodificaPiva::decriptaHex($credenziali['Password']); + return $credenziali; + } + + +} diff --git a/library/App/Service/IpManager.php b/library/App/Service/IpManager.php new file mode 100644 index 0000000..aff3f29 --- /dev/null +++ b/library/App/Service/IpManager.php @@ -0,0 +1,73 @@ +_configs = Zend_Registry::get('config'); + $this->_enviroments = Zend_Registry::get('ENVIROMENTS'); + $this->_allowedHostList = array(); + } + + /** + * Aggiorna l'oggetto config ricaricando tutte le impostazioni memorizzate + * nel file config.ini + */ + public function allowedIp() + { + + $ip_consentiti = explode(',',$this->_configs->get('ip_alternativo')); + $ip_master = trim($this->_configs->get('ip_master')); + $ip_server = trim($this->_configs->get('ip_server')); + + if(in_array($_SERVER['REMOTE_ADDR'], array_merge([$ip_master], [$ip_server], $ip_consentiti))){ + return true; + } + + return false; + } + + public function allowedHost(Zend_Controller_Request_Http $request){ + $host = $request->getServer(); + $host = $host['SERVER_NAME']; + + if(preg_match('/'.implode('|', $this->_allowedHostList).'/',$host)){ + return true; + } + + return false; + } + + public function allowedDevMode(){ + return (APPLICATION_ENV === 'development'); + } + + public function allowedDevAndStagingMode(){ + return (APPLICATION_ENV === 'development' || APPLICATION_ENV === 'staging'); + } + + public function controllaAbilitazioneTestSdk(){ + return $this->allowedDevMode(); + } + + public function getMongoAdminDbName(){ + return $this->_enviroments->get('mongodb')->get('params')->get('dbname'); + } + + public function getMongoDbName($nomeDb){ + switch (APPLICATION_ENV){ + case 'development': + return $nomeDb.'_dev'; + case 'staging': + return $nomeDb.'_test'; + default: + case 'production': + return $nomeDb; + } + } + +} diff --git a/library/App/Service/JsonConfiguration.php b/library/App/Service/JsonConfiguration.php new file mode 100644 index 0000000..3d13b1f --- /dev/null +++ b/library/App/Service/JsonConfiguration.php @@ -0,0 +1,107 @@ +initializeConfigurationFile($nomeFile); + } + + private function initializeConfigurationFile($name) + { + + $filePath = self::CONFIGURATION_FOLDER_PATH . $name . ".json"; + if (!file_exists($filePath)) throw new Zend_Exception("File di configurazione \"$name.json\" non trovato"); + $readerName = strtoupper($name) . '_CONFIG' . '_READER'; + $writerName = strtoupper($name) . '_CONFIG' . '_WRITER'; + //READER CONFIG FILE + if (Zend_Registry::isRegistered($readerName)){ + $this->_config = Zend_Registry::get($readerName); + + return; + } + $this->_config = new Zend_Config_Json($filePath, null, array('skipExtends' => true, 'allowModifications' => true)); + Zend_Registry::set($readerName, $this->_config); + //WRITER + if (Zend_Registry::isRegistered($writerName)){ + $this->_writer = Zend_Registry::get($writerName); + + return; + } + $this->_writer = new Zend_Config_Writer_Json(array('config' => $this->_config, 'filename' => $filePath)); + $this->_writer->setPrettyPrint(true); + Zend_Registry::set($writerName, $this->_writer); + } + + /** + * Aggiorna l'oggetto config ricaricando tutte le impostazioni memorizzate + * nel file config.ini + */ + public function update() + { + + $this->_config = new Zend_Config_Json(APPLICATION_PATH . '/configs/config.ini', null, array('skipExtends' => true, 'allowModifications' => true)); + Zend_Registry::set('config', $this->_config); + } + + public function write() + { + + $this->_writer->config = $this->_config; + $this->_writer->write(); + } + + public function set($key, $value) + { + + $this->_config->__set($key, $value); + $this->_writer->write(); + } + + /** + * Restituisce il valore del parametro richiesto + * + * @param string $name + * + * @return string + */ + public function get($name) + { + + return $this->_config->get($name); + } + + /** + * Elimina il parametro richiesto se esistente + * + * @param string $param + * + * @return boolean + */ + public function delete($param) + { + if (!$this->_config->get($param)) return false; + $this->_config->__unset($param); + $this->write(); + + return true; + } + + public function getAllParams() + { + + $data = array(); + foreach ($this->_config as $key => $value){ + $data[$key] = $value; + } + + return $data; + } + + } diff --git a/library/App/Service/NotifyError.php b/library/App/Service/NotifyError.php new file mode 100644 index 0000000..1f1119e --- /dev/null +++ b/library/App/Service/NotifyError.php @@ -0,0 +1,89 @@ +_configs = Zend_Registry::get('config'); + $this->_variabiliService = new App_Service_VariabiliSito(); + } + + /** + * Notifica l'errore critico solo se il parametro memorizzato nelle variabili del sito è settato a zero + * Serve a notificarlo una volta sola fin quando non riattivo la notifica + * + * @param $nomeVariabileErrore + * @param $message + * @param $exception + * @param null $params + * @param bool $inviaEmail + * @throws Zend_Exception + */ + public function notificaErroreCritico($nomeVariabileErrore, $message, $exception, $params = null, $inviaEmail = true){ + $variabileCheckNotififyError = $this->_variabiliService->get($nomeVariabileErrore); + if(!$variabileCheckNotififyError){ + + // Zend_Registry::get('log')->info(print_r($exception, true)); + + if($inviaEmail){ + $this->inviaEmailDiErrore($message, $exception, $params); + } + + $this->_variabiliService->set('I_CheckNotify_LoadMtTasks_Error', 1); + } + } + + public function inviaEmailDiErrore($shortdesc, Exception $e = null, $params = null, $email = null) + { + $mail = new Zend_Mail('UTF-8'); + + if(!$email) $email = $this->_configs->get('test_email'); + + $subject = '--- SERVER AS Fatturab2b.net --- NOTIFICA ERRORE ---'; + + $message = '
ERROR MESSAGE: ' . $shortdesc; + + if ($e != null) { + $message .= '

STACK TRACE ERRORE:
'; + + foreach ($e->getTrace() as $key => $value) { + $message .= "
[ " . $key . "] = " . $value; + if (is_array($value)) { + $message .= '
['; + foreach ($value as $key2 => $value2) { + $message .= "[ " . $key2 . "] = " . $value2 . "
"; + } + $message .= ']
'; + } + } + + $message .= '
EXCEPTION STAMP:
'; + + $message .= "
";
+            $message .= print_r($e,true);
+            $message .= "
"; + } + + if($params){ + $message .= '

PARAMETRI:
'; + + $message .= "
";
+            $message .= print_r($params,true);
+            $message .= "
"; + + $message .= '
'; + } + + $message .= '

Errore inviato dal server il ' . date('d/m/Y H:i:s'); + + $mail->setFrom($this->_configs->get('email_mittente'), $this->_configs->get('email_mittente_nome')) + ->setSubject($subject) + ->addTo($email, '') + ->setBodyHtml($message) + ->send(); + } + +} diff --git a/library/App/Service/RsaCryptor.php b/library/App/Service/RsaCryptor.php new file mode 100644 index 0000000..c8a2cbe --- /dev/null +++ b/library/App/Service/RsaCryptor.php @@ -0,0 +1,47 @@ + self::RSA_PATH."private_key.pem", + 'certificatePath' => self::RSA_PATH. 'public_key.pub', + 'passPhrase' => self::PASS_PHRASE, + 'hashAlgorithm' => OPENSSL_ALGO_SHA1 + ); + + public function __construct() + { + + if(Zend_Registry::isRegistered(self::RSA_OBJECT_REGISTRY_NAME)){ + $this->_cryptor = Zend_Registry::get(self::RSA_OBJECT_REGISTRY_NAME); + }else{ + $this->_cryptor = new Zend_Crypt_Rsa(self::RSA_KEY_OPTIONS); + Zend_Registry::set(self::RSA_OBJECT_REGISTRY_NAME, $this->_cryptor); + } + + } + + public function getPrivateKey(){ + return new Zend_Crypt_Rsa_Key_Private($this->_cryptor->getPemString(), self::RSA_KEY_OPTIONS['passPhrase']); + } + + public function getPublicKey(){ + return new Zend_Crypt_Rsa_Key_Public($this->_cryptor->getCertificateString(), self::RSA_KEY_OPTIONS['passPhrase']); + } + + public function cripta($data){ + return $this->_cryptor->encrypt($data, $this->getPrivateKey(), 'base64'); + } + + public function decripta($data){ + return $this->_cryptor->decrypt($data, $this->getPublicKey(), 'base64'); + } + + } diff --git a/library/App/Service/SoapFeInviate.php b/library/App/Service/SoapFeInviate.php new file mode 100644 index 0000000..38cc9d4 --- /dev/null +++ b/library/App/Service/SoapFeInviate.php @@ -0,0 +1,81 @@ +'0000001Test0000463', + 'Password'=>'B13144FA3D9E11D70079B2C929B549D2' + ); + + protected $_configs; + protected $_ipManager; + + private $_credenziali; + private $_testSDK; + + public function __construct(array $credenziali = null) + { + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + + if($this->_ipManager->allowedDevMode()) + $this->_testSDK = true; + else + $this->_testSDK = false; + + if($this->_testSDK){ + parent::__construct(self::TEST_URL); + if(!$credenziali) + $this->_credenziali = self::TEST_CRED; + else + $this->_credenziali = $credenziali; + }else{ + parent::__construct(self::PROD_URL); + if(!$credenziali){ + throw new Zend_Exception("Errore credenziali non presenti nell'inizializzione del SOAP FEInviate"); + } + + $this->_credenziali = $credenziali; + } + } + + public function getCredenziali() + { + return $this->_credenziali; + } + + public function getOldCredenziali() + { + return array( + 'codiceCliente'=>$this->_credenziali['CustomerCode'], + 'passwordServizi'=>$this->_credenziali['Password'] + ); + } + + public function mergeParamsCredenziali($params = array()){ + return array_merge_recursive(array('paramAuth'=>$this->_credenziali),$params); + } + + public function mergeParamsOldCredenziali($params = array()){ + return array_merge_recursive(array( + 'codiceCliente'=>$this->_credenziali['CustomerCode'], + 'passwordServizi'=>$this->_credenziali['Password'] + ),$params); + } + + public static function strToBytesArray($str){ + $tmp = array(); + for($i = 0; $i < mb_strlen($str, 'ASCII'); $i++) { + $tmp[$i] = ord($str[$i]); + } + return $tmp; + } + + public static function BytesArrayToStr($arrayOfBytes){ + return implode(array_map("chr", $arrayOfBytes)); + } + +} diff --git a/library/App/Service/V1Auth.php b/library/App/Service/V1Auth.php new file mode 100644 index 0000000..718cb48 --- /dev/null +++ b/library/App/Service/V1Auth.php @@ -0,0 +1,80 @@ +_genericModel = new Application_Model_Generic(); + } + + public function getUser() + { + if (Zend_Registry::isRegistered('TOKEN')) { + return $this->_genericModel->getByColumnName('Users', 'token', Zend_Registry::get('TOKEN')); + } else { + return null; + } + } + + public function controllaPermessiSuOrdine($ordineMapping, $user = null) + { + + if (!$user) { + $user = $this->getUser(); + } + + switch ($user['role']) { + case 'admin': + return true; + case 'user': + return $user['id'] === $ordineMapping['ID_Utente']; + case 'attivita': + return $user['id'] === $ordineMapping['ID_Attivita']; + case 'rider': + return $user['id'] === $ordineMapping['ID_UserRider']; + default: + return false; + } + + } + + /** + * Controlla se il permesso passatto o i permessi sono validi per l'utente loggato + * @param array $role + * @param null $user + * @return bool + */ + public function controllaPermessiByRole(array $role, $user = null) + { + + if (!$user) { + $user = $this->getUser(); + } + + return in_array($user['role'], $role); + } + + public function getPermissionWhere($user = null) + { + + if (!$user) { + $user = $this->getUser(); + } + + switch ($user['role']) { + case 'admin': + return []; + case 'user': + return ['ID_Utente = ?' => $user['id']]; + case 'attivita': + return ['ID_Attivita = ?' => $user['id']]; + case 'rider': + return ['ID_UserRider = ?' => $user['id']]; + default: + return ['id < ?' => '0']; // forza a non restituire nulla + } + + } +} diff --git a/library/App/Service/VariabiliSito.php b/library/App/Service/VariabiliSito.php new file mode 100644 index 0000000..07eeb32 --- /dev/null +++ b/library/App/Service/VariabiliSito.php @@ -0,0 +1,89 @@ +_genericModel = new Application_Model_Generic(); + $this->initialize(); + + } + + private function initialize() + { + + if (Zend_Registry::isRegistered(self::VARIABILI_SITO_REGISTRY_NAME)){ + $this->_variabili = Zend_Registry::get(self::VARIABILI_SITO_REGISTRY_NAME); + return; + } + + $tmp = $this->_genericModel->getList('VariabiliSito'); + $variabili = array(); + + foreach($tmp as $key => $val){ + $tipo = explode('_',$val['Nome'])[0]; + switch($tipo){ + case'I': + $variabili[$val['Nome']] = $val['ValoreInteger']; + break; + case'D': + $variabili[$val['Nome']] = $val['ValoreDouble']; + break; + case'S': + $variabili[$val['Nome']] = $val['ValoreString']; + break; + case'TJ': + $variabili[$val['Nome']] = Zend_Json::decode($val['ValoreString']); + break; + } + } + + $this->_variabili = $variabili; + Zend_Registry::set(self::VARIABILI_SITO_REGISTRY_NAME, $this->_variabili); + } + + public function get($key) + { + return $this->_variabili[$key]; + } + + public function set($key,$value){ + + $tipo = explode('_',$key)[0]; + switch($tipo){ + case'I': + $data = array('ValoreInteger'=>$value); + break; + case'D': + $data = array('ValoreDouble'=>$value); + break; + case'T': + $data = array('ValoreString'=>$value); + break; + case'TJ': + $data = array('ValoreString'=>Zend_Json::encode($value)); + break; + default: + throw new Exception("Tipo del valore da inserire non specificato"); + break; + } + + if(array_key_exists($key,$this->_variabili)) //update + $this->_genericModel->updateWhere('VariabiliSito',"Nome = '$key'",$data); + else //Inserimento + $this->_genericModel->insert('VariabiliSito',array_merge(array('Nome'=>$key),$data)); + + $this->_variabili[$key] = $value; + Zend_Registry::set(self::VARIABILI_SITO_REGISTRY_NAME, $this->_variabili); + } + + public function getAll(){ + return $this->_variabili; + } + +} diff --git a/library/App/Service/WebServiceV1Auth.php b/library/App/Service/WebServiceV1Auth.php new file mode 100644 index 0000000..24da257 --- /dev/null +++ b/library/App/Service/WebServiceV1Auth.php @@ -0,0 +1,111 @@ +_model = new Application_Model_Generic(); + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + } + + public function authenticate($username, $password, $staylogin = 0) + { + $adapter = $this->getAuthAdapter(array('username' => $username, 'password' => $password)); + $auth = $this->getAuth(); + $result = $auth->authenticate($adapter); + + if (!$result->isValid()) { + return $result->getCode(); + } + + $user = (array)$adapter->getResultRowObject(); + if (!$user['stato']) { + return self::ACCOUNT_DEACTIVATED; + } + + //Generazione del Token temporaneo per l'accesso + if ($user['token'] != null) { + $token = $user['token']; //Esistente uso quello già presente + } else { + do { //se non esiste ne genero uno nuovo e controllo che sia univoco + $token = hash('sha1', $user['username'] . date('H:i:s') . mt_rand(5, 10)); + if ($this->_model->getByColumnName('Users', 'token', $token)) { + $exist = true; + } else { + $exist = false; + } + $user['token'] = $token; + } while ($exist); + } + + //Imposto il DB MONGO dell'utente + $mongoDbName = $this->_ipManager->getMongoDbName($user['NomeDB']); + if(Zend_Registry::isRegistered(App_Model_Mongo_Adapter::MONGO_DB_ADAPTER_REG_NAME)) + Zend_Registry::get(App_Model_Mongo_Adapter::MONGO_DB_ADAPTER_REG_NAME)->setDbname($mongoDbName); + else + Zend_Registry::set(App_Model_Mongo_Adapter::MONGO_DB_NAME, $mongoDbName); + + //Memorizzo l'ultimo accesso dell'utente + $this->_model->update('Users', $user['id'], array( + 'token' => $token, + 'UltimoLogin' => date('Y-m-d H:i:s'), + 'staylogin' => $staylogin) + ); + + $auth->getStorage()->write($user); + + return $user; + } + + public function getAuth() + { + if (null === $this->_auth) { + $this->_auth = Zend_Auth::getInstance(); + $this->_auth->setStorage(new Zend_Auth_Storage_Session('Web_Auth')); + } + return $this->_auth; + } + + public function getIdentity() + { + $auth = $this->getAuth(); + if ($auth->hasIdentity()) { + return $auth->getIdentity(); + } + return false; + } + + public function clear() + { + $this->getAuth()->clearIdentity(); + } + + public function getAuthAdapter($values) + { + $salt = Zend_Registry::get('ENVIROMENTS')->get('password_salt'); + $authAdapter = new Zend_Auth_Adapter_DbTable( + Zend_Db_Table_Abstract::getDefaultAdapter(), + 'users', + 'username', + 'password', + "MD5(CONCAT('$salt',?))" + ); + $authAdapter->setIdentity($values['username']); + $authAdapter->setCredential($values['password']); + return $authAdapter; + } +} diff --git a/library/App/Stripe/StripeApi.php b/library/App/Stripe/StripeApi.php new file mode 100644 index 0000000..9f4fed0 --- /dev/null +++ b/library/App/Stripe/StripeApi.php @@ -0,0 +1,107 @@ +_currency = 'eur'; + $this->_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + + $this->_apiStripeTestAccount = false; + if($this->_ipManager->allowedDevMode()){ + $this->_apiStripeTestAccount = ($this->_configs->get('interrutore_stripe_test') == 'on') ? 1:0; + } + + if ($this->_apiStripeTestAccount){ + $this->_secretKey = self::TEST_SECRECT_KEY; + $this->_publishableKey = self::TEST_PUBLISHABLE_KEY; + } else{ + $this->_secretKey = self::LIVE_SECRET_KEY; + $this->_publishableKey = self::LIVE_PUBLISHABLE_KEY; + } + $this->_Stripe = new Stripe(); + $this->_Stripe->setApiKey($this->_secretKey); + } + + /** + * @param $number + * @param $exp_month + * @param $exp_year + * @param $cvc + * @param null $extraData + * + * @return \Stripe\ApiOperations\ApiResource + */ + public function createToken($number, $exp_month, $exp_year, $cvc,$extraData = null) + { + $card = array( + 'number' => $number, + 'exp_month' => $exp_month, + 'exp_year' => $exp_year, + 'cvc' => $cvc + ); + + //Nel caso in cui passo dei dati extra li aggiungo alla chiamata per la creazionde del token + if($extraData && (is_array($extraData) || is_object($extraData))){ + foreach($extraData as $key => $val){ + $card[$key] = $val; + } + } + + $token = Token::create(array('card' => $card)); + + return $token; + } + + /** + * @param $amount + * @param $token + * @param string $description + * + * @return \Stripe\ApiOperations\ApiResource + * @throws Exception + */ + public function createCharge($amount, $token,$description = self::DEFAULT_DESCRIPTION_TEXT) + { + + if(!$token) + throw new Exception("Il Token non è stato generato correttamente"); + + $charge = Charge::create(array( + "amount" => $amount, + "currency" => $this->_currency, + "card" => $token, + "description"=>$description + )); + return $charge; + } + + } diff --git a/library/Helpers/Action/Base64Image.php b/library/Helpers/Action/Base64Image.php new file mode 100644 index 0000000..bfd6a0a --- /dev/null +++ b/library/Helpers/Action/Base64Image.php @@ -0,0 +1,60 @@ +_genericModel = new Application_Model_Generic(); + } + + public function direct() + { + + } + +} diff --git a/library/Helpers/Action/Currency.php b/library/Helpers/Action/Currency.php new file mode 100644 index 0000000..faf0447 --- /dev/null +++ b/library/Helpers/Action/Currency.php @@ -0,0 +1,15 @@ +toCurrency($number); + + } + +} diff --git a/library/Helpers/Action/Docsmaker.php b/library/Helpers/Action/Docsmaker.php new file mode 100644 index 0000000..ec07cde --- /dev/null +++ b/library/Helpers/Action/Docsmaker.php @@ -0,0 +1,178 @@ +_dataHelper = $this->getActionController()->getHelper('ExtractData'); + $this->_formatDataHelper = $this->getActionController()->getHelper('FormatData'); + $this->_globalFunction = $this->getActionController()->getHelper('Globalfunction'); + $this->_view = null; + } + + public function direct() + { + } + + public function reportAttivita(Zend_View &$view, $dati, $mode = 'I', $autoprint = false, $returnHtml = false) + { + + $this->_view = $view; + $preOutputScript = ""; + + if (!$this->_view) { + throw new Zend_Exception("Errore view non presente"); + } + + if (!$dati) { + throw new Zend_Exception("Errore dati non ricevuti"); + } + + /********************************************* Calcolo dei dati necessari **********************************************/ + + $totali = array_merge($dati['ElencoLicenze']); + end($totali); + $this->_view->lastRigaKey = key($totali); + + //$stringa_periodo = ($data[0] === $data[1]) ? 'del ' . $this->_formatDataHelper->direct($data[0], 'd/m/Y') : 'dal ' . $this->_formatDataHelper->direct($data[0], 'd/m/Y') . ' al ' . $this->_formatDataHelper->direct($data[1], 'd/m/Y'); + + $this->_view->assign(array( + 'Data' => $dati['Data'], + 'Periodo' => $dati['Periodo'], + 'ElencoLicenze' => $dati['ElencoLicenze'], + 'TotaliAttivazioni' => $dati['TotaliAttivazioni'], + 'TotaleFe' => $dati['TotaleFe'], + 'Rivenditore' => $dati['Rivenditore'] + )); + + $this->_view->setScriptPath(APPLICATION_PATH . "/modules/default/views/scripts/"); + + $filename = 'Report ' . str_replace('/', '', $dati['Periodo']) . ' - ' . $dati['Rivenditore']['RagioneSociale']; + + if ($mode == 'F') { + $preOutputScript = APPLICATION_PATH . "/../public/doctmp/"; + } + + $this->getResponse()->setBody(''); + $html = $this->_view->render('index/print/reportattivita.phtml'); + + $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4', + 'margin_top' => 38, 'margin_right' => 10, 'margin_bottom' => 5, 'margin_left' => 10, + 'margin_header' => 5, 'margin_footer' => 5]); + $mpdf->setAutoTopMargin = 'stretch'; + $mpdf->setAutoBottomMargin = 'stretch'; + $mpdf->keep_table_proportions = true; + + $mpdf->SetTitle($filename); + $mpdf->SetAuthor("Adriatica Sistemi soc. coop."); + $mpdf->SetDisplayMode('fullpage'); + + //Funzione che avvia la stampa direttamente + if ($autoprint == 'true') { + $mpdf->SetJS('this.print();'); + } + + if (!$returnHtml) { + $mpdf->WriteHTML($html); + //Il Mode 'S' restituisce il contenuto del file che codifico in base64 e lo retituisco + if ($mode == 'S') { + $res = array(); + $res['filename'] = $filename . ".pdf"; + $res['filecontent'] = $mpdf->Output($preOutputScript . $filename . ".pdf", $mode); + return $res; + } else { + //Gestione per gli altri mode 'I' o 'F' o 'D' + $mpdf->Output($preOutputScript . $filename . ".pdf", $mode); + $res = array(); + $res['filename'] = $filename . ".pdf"; + $res['path'] = $preOutputScript; + $res['completeFilePath'] = $preOutputScript . $filename . '.pdf'; + return $res; + } + } + + return $html; + } + + public function reportAttivitaAdmin(Zend_View &$view, $dati, $mode = 'I', $autoprint = false, $returnHtml = false) + { + + $this->_view = $view; + $preOutputScript = ""; + + if (!$this->_view) { + throw new Zend_Exception("Errore view non presente"); + } + + if (!$dati) { + throw new Zend_Exception("Errore dati non ricevuti"); + } + + /********************************************* Calcolo dei dati necessari **********************************************/ + + $tmp = $dati['ElencoRivenditori']; + end($tmp); + $this->_view->lastRigaKey = key($tmp); + + $this->_view->assign(array( + 'Data' => $dati['Data'], + 'Periodo' => $dati['Periodo'], + 'ElencoAttivita' => $dati['ElencoAttivita'] + )); + + $this->_view->setScriptPath(APPLICATION_PATH . "/modules/default/views/scripts/"); + + $filename = 'Report Riepilogo per Attività ' . str_replace('/', '-', $dati['Periodo']); + + if ($mode == 'F') { + $preOutputScript = APPLICATION_PATH . "/../public/doctmp/"; + } + + $this->getResponse()->setBody(''); + $html = $this->_view->render('index/print/reportattivitaadmin.phtml'); + + $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4', + 'margin_top' => 28, 'margin_right' => 10, 'margin_bottom' => 5, 'margin_left' => 10, + 'margin_header' => 5, 'margin_footer' => 5]); + $mpdf->setAutoTopMargin = 'stretch'; + $mpdf->setAutoBottomMargin = 'stretch'; + $mpdf->keep_table_proportions = true; + + $mpdf->SetTitle($filename); + $mpdf->SetAuthor("Adriatica Sistemi soc. coop."); + $mpdf->SetDisplayMode('fullpage'); + + //Funzione che avvia la stampa direttamente + if ($autoprint == 'true') { + $mpdf->SetJS('this.print();'); + } + + if (!$returnHtml) { + $mpdf->WriteHTML($html); + //Il Mode 'S' restituisce il contenuto del file che codifico in base64 e lo retituisco + if ($mode == 'S') { + $res = array(); + $res['filename'] = $filename . ".pdf"; + $res['filecontent'] = $mpdf->Output($preOutputScript . $filename . ".pdf", $mode); + return $res; + } else { + //Gestione per gli altri mode 'I' o 'F' o 'D' + $mpdf->Output($preOutputScript . $filename . ".pdf", $mode); + $res = array(); + $res['filename'] = $filename . ".pdf"; + $res['path'] = $preOutputScript; + $res['completeFilePath'] = $preOutputScript . $filename . '.pdf'; + return $res; + } + } + + return $html; + } + +} diff --git a/library/Helpers/Action/Email.php b/library/Helpers/Action/Email.php new file mode 100644 index 0000000..938e92f --- /dev/null +++ b/library/Helpers/Action/Email.php @@ -0,0 +1,222 @@ +_configs = new App_Service_ConfigManager(); + $this->_ipManager = new App_Service_IpManager(); + } + + /** + * Invia un email all'utente con i parametri scelti + * + * @param String $message | $subject | $email + * @param boolean $text | $footer + * @return void + */ + public function direct($message, $subject, $email, $text = false, $footer = false) + { + $mail = new App_Model_Mail('UTF-8'); + + if ($footer) { + $message .= $this->addFooter(); + } + + $mail->setFrom($this->_configs->get('email_mittente'), $this->_configs->get('email_mittente_nome'))->setSubject($subject)->addTo($email, 'Fatturab2b.net'); + + if ($text == false) { + $mail->setBodyHtml($message); + } else { + $mail->setBodyText($message); + } + + $mail->send(); + } + + /** + * Invia un email all'utente in base a un template memorizzato nel DB. + * @param $email + * @param $template + * @param array $params + * @param null $filename + * @throws Zend_Mail_Exception + */ + public function sendEmailByTemplate($email, $template, $params = array(), $nomeMittente = null, $filename = null,$fileNameInterno = null) + { + $mail = new App_Model_Mail('UTF-8'); + + if(!$template){ + throw new Exception("Email template non trovato impossibile inviare l'email"); + } + + $params = $this->preparaDatiPerSostituzione($params); + + if (count($params) > 0) { + foreach ($params as $key => $val) { + $template['Oggetto'] = str_replace($key, $val, $template['Oggetto']); + $template['Testo'] = str_replace($key, $val, $template['Testo']); + } + } + + if ($template['Footer']) + $template['Testo'] .= $this->addFooter(); + + if ($filename != null) { + if (file_exists($filename)) + $mail->createAttachment(file_get_contents($filename), 'application/pdf', Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $filename); + } + + $nomeMittente = ($nomeMittente) ? $nomeMittente : $this->_configs->get('email_mittente_nome'); + + $mail->setFrom($this->_configs->get('email_mittente'), $nomeMittente)->setSubject($template['Oggetto']); + + if ($template['Tipologia'] == 'HTML') { + $mail->setBodyHtml($template['Testo']); + } else if ($template['Tipologia'] == 'TEXT') { + $mail->setBodyText($template['Testo']); + } + + //Nel caso in cui sono in test le email vengono inviate solo a sviluppoweb + if($this->_ipManager->controllaAbilitazioneTestSdk()){ + $email=$this->_configs->get('test_email'); + if($template['Resend']) + $template['Resend'] = 'TEST'; + } + + //Inserisco il o i destinatari/o + if(is_string($email)){ + $mail->addTo($email, $email); + }else if(is_array($email)){ + foreach($email as $val){ + $mail->addTo($val); + } + } + + $mail->send(); + + //INVIO COAPIA AL NOSTRO STISTEMA + if($template['Resend']){ + + $mail->clearRecipients(); + + //Controllo se devo reinviare la mail anche al nostro server + if ($template['Resend'] == 'INFO') + $mail->addTo($this->_configs->get('email_mittente'), $this->_configs->get('email_mittente_nome')); + if ($template['Resend'] == 'ACQUISTI') + $mail->addTo($this->_configs->get('email_ordine'), $this->_configs->get('email_mittente_nome')); + if ($template['Resend'] == 'TEST') + $mail->addTo($this->_configs->get('test_email'), $this->_configs->get('email_mittente_nome')); + + if($fileNameInterno){ + $mail->setParts(array()); + if (file_exists($fileNameInterno)) + $mail->createAttachment(file_get_contents($fileNameInterno), 'application/pdf', Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $fileNameInterno); + } + + $mail->send(); + + //CANCELLO IL FILE DEL PDF + if ($fileNameInterno != null) { + if (file_exists($fileNameInterno)) + @unlink($fileNameInterno); + } + } + + //Invio l'email per la stampante con il testo vuoto + if ($template['Resend'] == 'ACQUISTI' && !$this->_ipManager->controllaAbilitazioneTestSdk()){ + $mail->clearRecipients(); + $mail->setBodyHtml(""); + $mail->setBodyText(""); + $mail->addTo("", $this->_configs->get('email_mittente_nome')); + $mail->send(); + } + + } + + public function reportErrorToEmail($error, $shortdesc, Exception $e = null,$email = null) + { + $mail = new Zend_Mail('UTF-8'); + + if(!$email) $email = $this->_configs->get('test_email'); + + $subject = '--- SERVER Fatturab2b.net [EMAIL] --- ERRORE ---'; + + $message = '
ERROR-MESSAGE: ' . $shortdesc; + + if ($e != null) { + $message .= '

STACK TRACE ERRORE:
'; + + foreach ($e->getTrace() as $key => $value) { + $message .= "
[ " . $key . "] = " . $value; + if (is_array($value)) { + $message .= '
['; + foreach ($value as $key2 => $value2) { + $message .= "[ " . $key2 . "] = " . $value2 . "
"; + } + $message .= ']
'; + } + } + + $message .= '
EXCEPTION STAMP:
'; + + $message .= "
";
+            $message .= print_r($e,true);
+            $message .= "
"; + } + + $message .= '

PARAMETRI RICEVUTI:
'; + + $message .= "
";
+        $message .= print_r($error,true);
+        $message .= "
"; + + $message .= '
'; + + $message .= '

Errore inviato dal server il ' . date('d/m/Y H:i:s'); + + $mail->setFrom($this->_configs->get('email_mittente'), $this->_configs->get('email_mittente_nome')) + ->setSubject($subject) + ->addTo($email, '') + ->setBodyHtml($message) + ->send(); + } + + /** + * Funzione che restituisce il footer per ogni email + * + * @param String $ragsoc | $email + * @return void + */ + public function addFooter() + { + $footer = '

'; + $footer .= ''; + return $footer; + } + + /**************************** + *** FUNZIONI PRIVATE ****** + ***************************/ + + /** + * Questa funzione presi i parametri passati nell array ne aggiunge i simboli + * percentuale per farli riconoscere popi nel testo e sostituirli + * @param $dati + * @return array + */ + private function preparaDatiPerSostituzione($dati){ + $newParams = array(); + + foreach($dati as $key => $val){ + $newParams['%'.$key.'%'] = $val; + } + + return $newParams; + } + +} diff --git a/library/Helpers/Action/ExtractData.php b/library/Helpers/Action/ExtractData.php new file mode 100644 index 0000000..1d92f80 --- /dev/null +++ b/library/Helpers/Action/ExtractData.php @@ -0,0 +1,253 @@ + diff($datetime2); + return $interval -> days; + } + + /** + * Funzione che passate due date nel formato aaaa-mm-dd ne calcola i giorni di differenza formatti col segno + * + * @param string $data1|string $data2 + * @return string $days + */ + public function diff_date_segno($data1, $data2) { + if(is_string($data1)) + $datetime1 = new DateTime($data1); + else + $datetime1 = $data1; + + if(is_string($data2)) + $datetime2 = new DateTime($data2); + else + $datetime2 = $data2; + + $interval = $datetime1 -> diff($datetime2); + return $interval -> format('%R%a'); + } + + /** + * Funzione che passata una data e i giorni da sommare restituisce la data somma + * + * @param string $data + * @return string $days + */ + public function add_days_date($data,$days){ + $data = explode('/',$data); + array_reverse($data); + $data = implode('-', $data); + $date = new DateTime($data); + $date->add(new DateInterval('P'.$days.'D')); + return $date->format('d/m/Y'); + } + + /** + * Funzione che passata una data e i giorni da sottrarre e restituisce la data calcolata + * + * @param $data + * @param $days + * @param bool|false $slashed + * + * @return string + */ + public function sub_days_date($data,$days,$slashed = false){ + $data = $this->getDataForDb($data); + $date = new DateTime($data); + $date->sub(new DateInterval('P'.$days.'D')); + if($slashed) + return $date->format('d/m/Y'); + else + return $date->format('Y-m-d'); + } + + /** + * Funzione che passata una data e gli anni da sottrarre restituisce la data sottratta + * + * @param string $data + * @return string $days + */ + public function diff_days_year($data,$years){ + $data = explode('/',$data); + array_reverse($data); + $data = implode('-', $data); + $date = new DateTime($data); + $date->sub(new DateInterval('P'.$years.'Y')); + return $date->format('d/m/Y'); + } + + /** + * Funzione che passata una data e i giorni da sottrarre restituisce la data sottratta + * + * @param string $data + * @return string $days + */ + public function diff_days($data,$days){ + + $this->_dateValidatorSlash = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy')); + $this->_dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + + if ($this->_dateValidatorSlash->isValid($data)) { + $data = implode('-',array_reverse(explode('/',$data))); + } + + if(!$this->_dateValidatorTrattino->isValid($data)){ + return null; + } + + $date = new DateTime($data); + $date->sub(new DateInterval('P'.$days.'D')); + return $date->format('d/m/Y'); + } + + /** + * Funzione che passata una data la ritorna pronta per l'inserimento sul db false se non � una data valida + * + * @param $data + * + * @return bool|string + */ + public function getDataForDb($data){ + + if(is_array($data)){ + $data = new DateTime(substr($data['date'],0,10)); + return $data -> format('Y-d-m'); + }elseif(is_string($data)){ + $this->_dateValidatorSlash = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy')); + $this->_dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + if ($this->_dateValidatorSlash->isValid($data)) { + return $this->unslashData($data); + }else if($this->_dateValidatorTrattino->isValid($data)){ + return $data; + }else{ + return null; + } + }else{ + return $data; + } + + } + +} diff --git a/library/Helpers/Action/FilterFunctions.php b/library/Helpers/Action/FilterFunctions.php new file mode 100644 index 0000000..31f5836 --- /dev/null +++ b/library/Helpers/Action/FilterFunctions.php @@ -0,0 +1,249 @@ +_dataHelper = $this->getActionController()->getHelper('ExtractData'); + $this->_filterOperators = array('>','<','>=','<=','=','ISNULL','NONULL'); + } + + /** + * Questa funzione ricevuti i parametri restitisce l'array contenente tutti i valori per eseguire la ricerca da passare alla query + * @param $filter + * @param bool|false $analizzaOperatori + * @return array + */ + public function direct($filter, $analizzaOperatori = false) + { + + if ($analizzaOperatori) { + $filter = $this->getFilterParamsWithOperator($filter); + } + + $where = array(); + + $filter = $this->cleanParams($filter,false); + + foreach ($filter as $key => $val) { + + if (substr($key, -2) == 'OP') continue; + + $nomeCampo = explode('-', $key)[0]; + $nomeCampo = str_replace('#','.',$nomeCampo); + + if (array_key_exists($key . 'OP', $filter)) + $op = $filter[$key . 'OP']; + else + $op = 'EQUAL'; + + switch ($op) { + case'ICHECK': + $where[$nomeCampo . ' = ?'] = ($val == 'on') ? '1':'0'; + break; + case'EQUAL': + $where[$nomeCampo . ' = ?'] = $val; + break; + case'NOTEQUAL': + $where[$nomeCampo . ' <> ?'] = $val; + break; + case'MIN': + $where[$nomeCampo . ' < ?'] = $val; + break; + case'MAX': + $where[$nomeCampo . ' > ?'] = $val; + break; + case'EQUALMIN': + $where[$nomeCampo . ' <= ?'] = $val; + break; + case'EQUALMAX': + $where[$nomeCampo . ' >= ?'] = $val; + break; + case'LIKE': + $val = '%' . $val . '%'; + $where[$nomeCampo . ' ' . $op . ' ?'] = $val; + break; + case'LIKEPRE': + $val = '%' . $val; + $where[$nomeCampo . ' LIKE ?'] = $val; + break; + case'LIKEPOST': + $val = $val . '%'; + $where[$nomeCampo . ' LIKE ?'] = $val; + break; + case'DATEEQUAL': + $where[$nomeCampo . ' = ?'] = $this->_dataHelper->unslashData($val); + break; + case'DATEEQUALMIN': //Inserisco anche l'ora perchè cosi le query funzionano sia sui i tipi "date" che "datetime" + $where[$nomeCampo . ' <= ?'] = trim($this->_dataHelper->unslashData($val)) . ' 23:59:59'; + break; + case'DATEEQUALMAX': + $where[$nomeCampo . ' >= ?'] = trim($this->_dataHelper->unslashData($val)) . ' 00:00:00'; + break; + case'DATEMIN': + $where[$nomeCampo . ' < ?'] = trim($this->_dataHelper->unslashData($val)) . ' 23:59:59'; + break; + case'DATEMAX': + $where[$nomeCampo . ' > ?'] = trim($this->_dataHelper->unslashData($val)) . ' 00:00:00'; + break; + case'DATERANGE': + $val = explode('|', $val); + if (trim($val[0]) && trim($val[0]) != 'undefined') $where[$nomeCampo . ' >= ?'] = $this->_dataHelper->unslashData(trim($val[0])) . ' 00:00:00'; + if (trim($val[1]) && trim($val[1]) != 'undefined') $where[$nomeCampo . ' <= ?'] = $this->_dataHelper->unslashData(trim($val[1])) . ' 23:59:59'; + break; + case'ISNULL': + $where[$nomeCampo . ' IS NULL'] = ""; + break; + case'NONULL': + $where[$nomeCampo . ' IS NOT NULL'] = ""; + break; + case'ORWHERE': + $where[$nomeCampo . ' #OR ?'] = $val; + break; + case'ANDORWHERE': + $where[$nomeCampo . ' #ANDOR ?'] = $val; + break; + case'IN': + if(!is_array($val)){ + $val = explode(',', $val); + } + $where[$nomeCampo . ' IN ( ? )'] = $val; + break; + default: + throw new Exception("'$op' non è un operatore di filtro valido"); + } + } + + return $where; + } + + /** + * Questa funzione riceve i parametri di ricerca in ingresso gli analizza per applicare eventuali operatori applicati + * @param $params + * @return array + */ + public function getFilterParamsWithOperator($params) + { + + $params = $this->cleanParams($params); + + $newParams = array(); + + foreach ($params as $key => $val) { + if (substr($key, -2) == 'OP') continue; + if (substr($key, -9) == 'OPDEFAULT') continue; + if (!array_key_exists($key . "OP", $params)) { + + $op = $this->findOperator($val); + switch ($op) { + case'>=': + $newParams[$key . 'OP'] = 'EQUALMAX'; + $newParams[$key] = trim(substr($val, 2)); + break; + case'<=': + $newParams[$key . 'OP'] = 'EQUALMIN'; + $newParams[$key] = trim(substr($val, 2)); + break; + case'<': + $newParams[$key . 'OP'] = 'MIN'; + $newParams[$key] = trim(substr($val, 1)); + break; + case'>': + $newParams[$key . 'OP'] = 'MAX'; + $newParams[$key] = trim(substr($val, 1)); + break; + case'=': + $newParams[$key . 'OP'] = 'EQUAL'; + $newParams[$key] = trim(substr($val, 1)); + break; + case'<>': + $newParams[$key . 'OP'] = 'NOTEQUAL'; + $newParams[$key] = trim(substr($val, 2)); + break; + case'ISNULL': + $newParams[$key . 'OP'] = 'ISNULL'; + $newParams[$key] = ""; + break; + case'NONULL': + $newParams[$key . 'OP'] = 'NONULL'; + $newParams[$key] = ""; + break; + default: + if(isset($params[$key.'OPDEFAULT'])){ + $newParams[$key . 'OP'] = $params[$key.'OPDEFAULT']; + }else{ + $newParams[$key . 'OP'] = 'EQUAL'; + } + $newParams[$key] = $val; + break; + } + + } else { + $newParams[$key] = $val; + $newParams[$key . "OP"] = $params[$key . "OP"]; + } + } + + return $newParams; + + } + + /** + * Funzione che passata una stringa cerca se viene applicato un operatore e lo restuisce + * @param $val + * @return string + */ + private function findOperator($val) + { + $op = trim(explode(' ', $val)[0]); + if (in_array($op, $this->_filterOperators)) return $op; + + $op = trim(substr($val, 0, 6)); + if (in_array($op, $this->_filterOperators)) return $op; + + $op = $op = trim(substr($val, 0, 2)); + if (in_array($op, $this->_filterOperators)) return $op; + + $op = $op = trim(substr($val, 0, 1)); + if (in_array($op, $this->_filterOperators)) return $op; + + return 'EQUAL'; + } + + public function cleanParams($params,$removeEmptyValue = true,$removeOperator = false){ + unset($params['controller']); + unset($params['module']); + unset($params['action']); + unset($params['method']); + unset($params['page']); + unset($params['count']); + unset($params['order']); + unset($params['tipoOrder']); + unset($params['filtrato']); + unset($params['orwhere']); + unset($params['reset']); + unset($params['iddet']); + unset($params['select']); + unset($params['compactlist']); + unset($params['deliveryinfo']); + + if($removeEmptyValue){ + //Elimino i campi vuoti tranne le select vuote + foreach ($params as $key => $val) { + if (empty($val) && $val !== '0') unset($params[$key]); + + //Elimino anche i paramtri di operazione + if ($removeOperator && preg_match('/OP$/',$key)){ + unset($params[$key]); + } + } + } + + return $params; + } + + +} diff --git a/library/Helpers/Action/FormatData.php b/library/Helpers/Action/FormatData.php new file mode 100644 index 0000000..c31da92 --- /dev/null +++ b/library/Helpers/Action/FormatData.php @@ -0,0 +1,11 @@ + format($format); + } + +} diff --git a/library/Helpers/Action/Globalfunction.php b/library/Helpers/Action/Globalfunction.php new file mode 100644 index 0000000..a8eb5be --- /dev/null +++ b/library/Helpers/Action/Globalfunction.php @@ -0,0 +1,228 @@ +_configs = new App_Service_ConfigManager(); + $this->_dataHelper = $this->getActionController()->getHelper('ExtractData'); + $this->_genericModel = new Application_Model_Generic(); + } + + public function direct() + { + } + + /** + * ===================================================================================================================== + * ========= FUNZIONI RELATIVE ALLA SCADENZA + * =========================================== + * ===================================================================================================================== + */ + + /** + * Funzione che restituisce il numero fattura successivo per l'inserimento di una nuova fattura + * in base alla data scelta + * + * @param string $data (YYYY-mm-dd) + * @return int $num + */ + public function getNumFatturaSucc($data,$serie = null) + { + $num = $this->_genericModel->getNumFatturaSucc($data,$serie); + if ($num == NULL || $num == '' || $num == 0 || $num == FALSE) + return 1; + return $num; + } + + /** + * Funzione che restituisce il numero fattura successivo per l'inserimento di una nuova fattura + * in base alla data scelta + * @return int $num + */ + public function getProgressivoInvioSucc() + { + + $lastProgressivo = strtoupper($this->_genericModel->getLastProgressivoInvio()); + + if(!$lastProgressivo) $lastProgressivo = $this->_configs->get('lettera_progressivo_invio'); + + $pad = 5; + + $char = preg_replace("/[0-9]/",'',$lastProgressivo); + if(strlen($char) > 0) $pad -= strlen($char); + + $num = preg_replace("/[A-Za-z]/",'',$lastProgressivo); + + $num = intval($num); + if (!$num) $num = 0; + + $maxNum = intval(str_repeat("9", $pad)); + + $num += 1; + if($num > $maxNum){ + //Incremento dell'ultimo carattere + if(!$char) + $char = 'A'; + else + ++$char; + + $pad = 5 - strlen($char); + $num = 1; + } + + $num = str_pad($num, $pad, "0", STR_PAD_LEFT); + if($pad < 5) $num = $char.$num; + + return $num; + } + + public function formattaNumeroFatturaXml($numero, $decimali = 2) + { + if ($decimali < 2) $decimali = 2; + return number_format($numero, $decimali, '.', ''); + } + + /** + * Funzione di validazione di una partita iva + * @param $pi + * @return string + */ + public function ControllaPIVA($pi) + { + if ($pi === '') + return ''; + if (strlen($pi) != 11) + return "La lunghezza della partita IVA non è\n" . "corretta: la partita IVA dovrebbe essere lunga\n" . "esattamente 11 caratteri.\n"; + if (preg_match("/^[0-9]+\$/", $pi) != 1) + return "La partita IVA contiene dei caratteri non ammessi:\n" . "la partita IVA dovrebbe contenere solo cifre.\n"; + $s = 0; + for ($i = 0; $i <= 9; $i += 2) + $s += ord($pi[$i]) - ord('0'); + for ($i = 1; $i <= 9; $i += 2) { + $c = 2 * (ord($pi[$i]) - ord('0')); + if ($c > 9) + $c = $c - 9; + $s += $c; + } + if ((10 - $s % 10) % 10 != ord($pi[10]) - ord('0')) + return "La partita IVA non è valida:\n" . "il codice di controllo non corrisponde."; + return ''; + } + + /** + * @param $value + * @return string + * Funzione ricorsiva per codificare un array di valori in Json in modo sicuro comreso i caratteri utf-8 + */ + public function safeJsonEncode($value) + { + if (version_compare(PHP_VERSION, '5.4.0') >= 0) { + $encoded = json_encode($value,JSON_PRETTY_PRINT); + } else { + $encoded = json_encode($value); + } + switch (json_last_error()) { + case JSON_ERROR_NONE: + return $encoded; + case JSON_ERROR_DEPTH: + return 'Maximum stack depth exceeded'; + case JSON_ERROR_STATE_MISMATCH: + return 'Underflow or the modes mismatch'; + case JSON_ERROR_CTRL_CHAR: + return 'Unexpected control character found'; + case JSON_ERROR_SYNTAX: + return 'Syntax error, malformed JSON'; + case JSON_ERROR_UTF8: + $clean = $this->utf8ize($value); + return $this->safeJsonEncode($clean); + default: + return 'Unknown error'; + } + } + + /** + * @param $value + * @return mixed|string + * Funzione ricorsiva per convertire in modo sicuro compreso i caratetteri utf-8 dal formato Json + */ + public function safeJsonDecode($value) + { + if (version_compare(PHP_VERSION, '5.4.0') >= 0) { + $encoded = json_decode($value,JSON_PRETTY_PRINT); + } else { + $encoded = json_decode($value); + } + switch (json_last_error()) { + case JSON_ERROR_NONE: + return $encoded; + case JSON_ERROR_DEPTH: + return 'Maximum stack depth exceeded'; + case JSON_ERROR_STATE_MISMATCH: + return 'Underflow or the modes mismatch'; + case JSON_ERROR_CTRL_CHAR: + return 'Unexpected control character found'; + case JSON_ERROR_SYNTAX: + return 'Syntax error, malformed JSON'; + case JSON_ERROR_UTF8: + $clean = $this->utf8decodize($value); + return $this->safeJsonDecode($clean); + default: + return 'Unknown error'; + } + } + + /** + * @param $mixed + * @return array|string + * Funzione ricorsiva per codificare un array di valori in utf-8 + */ + public function utf8ize($mixed) + { + if (is_array($mixed)) { + foreach ($mixed as $key => $value) { + $mixed[$key] = $this->utf8ize($value); + } + } else if (is_string($mixed)) { + return utf8_encode($mixed); + } + return $mixed; + } + + /** + * @param $mixed + * @return array|string + * Funzione ricorsiva per decodificare un array di valori in utf-8 + */ + public function utf8decodize($mixed) + { + if (is_array($mixed)) { + foreach ($mixed as $key => $value) { + $mixed[$key] = $this->utf8decodize($value); + } + } else if (is_string($mixed)) { + return utf8_decode($mixed); + } + return $mixed; + } + + /** + * @param $array + * @param $key + * @return array Questa funzione passato un array lo restituisce ragruppato per la chiave desiderata + */ + function groupArrayByKey($array, $key) { + $return = array(); + foreach($array as $val) { + $return[$val[$key]][] = $val; + } + return $return; + } + + } diff --git a/library/Helpers/Action/Image.php b/library/Helpers/Action/Image.php new file mode 100644 index 0000000..a92713a --- /dev/null +++ b/library/Helpers/Action/Image.php @@ -0,0 +1,245 @@ +saveImage($CurWidth, $CurHeight, $CreatedImage, $DestFolder, $Quality, $ImageType)) { + + /* + We have succesfully resized and created thumbnail image + We can now output image to user's browser or store information in the database + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
Thumbnail
Resized Image
';*/ + + } else { + return FALSE; //output error + } + + return TRUE; + } + + // This function will proportionally resize image + public function resizeImage($CurWidth, $CurHeight, $MaxSize, $DestFolder, $SrcImage, $Quality, $ImageType) + { + //Check Image size is not 0 + if ($CurWidth <= 0 || $CurHeight <= 0) { + return FALSE; + } + //Construct a proportional size of new image + $ImageScale = min($MaxSize / $CurWidth, $MaxSize / $CurHeight); + $NewWidth = ceil($ImageScale * $CurWidth); + $NewHeight = ceil($ImageScale * $CurHeight); + $NewCanves = imagecreatetruecolor($NewWidth, $NewHeight); + // Resize Image + if (imagecopyresampled($NewCanves, $SrcImage, 0, 0, 0, 0, $NewWidth, $NewHeight, $CurWidth, $CurHeight)) { + switch (strtolower($ImageType)) { + case 'image/png': + imagepng($NewCanves, $DestFolder); + break; + case 'image/gif': + imagegif($NewCanves, $DestFolder); + break; + case 'image/jpeg': + case 'image/pjpeg': + imagejpeg($NewCanves, $DestFolder, $Quality); + break; + default: + return FALSE; + } + //Destroy image, frees memory + if (is_resource($NewCanves)) { + imagedestroy($NewCanves); + } + + return TRUE; + } + + } + + //This function corps image to create exact square images, no matter what its original size! + public function cropImage($CurWidth, $CurHeight, $iSize, $DestFolder, $SrcImage, $Quality, $ImageType) + { + //Check Image size is not 0 + if ($CurWidth <= 0 || $CurHeight <= 0) { + return FALSE; + } + //abeautifulsite.net has excellent article about "Cropping an Image to Make Square bit.ly/1gTwXW9 + if ($CurWidth > $CurHeight) { + $y_offset = 0; + $x_offset = ($CurWidth - $CurHeight) / 2; + $square_size = $CurWidth - ($x_offset * 2); + } else { + $x_offset = 0; + $y_offset = ($CurHeight - $CurWidth) / 2; + $square_size = $CurHeight - ($y_offset * 2); + } + $NewCanves = imagecreatetruecolor($iSize, $iSize); + if (imagecopyresampled($NewCanves, $SrcImage, 0, 0, $x_offset, $y_offset, $iSize, $iSize, $square_size, $square_size)) { + switch (strtolower($ImageType)) { + case 'image/png': + imagepng($NewCanves, $DestFolder); + break; + case 'image/gif': + imagegif($NewCanves, $DestFolder); + break; + case 'image/jpeg': + case 'image/pjpeg': + imagejpeg($NewCanves, $DestFolder, $Quality); + break; + default: + return FALSE; + } + //Destroy image, frees memory + if (is_resource($NewCanves)) { + imagedestroy($NewCanves); + } + + return TRUE; + + } + + } + + public function saveImage($CurWidth, $CurHeight, $srcImage, $DestFolder, $Quality, $ImageType) + { + //Check Image size is not 0 + if ($CurWidth <= 0 || $CurHeight <= 0) { + return FALSE; + } + + $NewCanves = $srcImage; + + switch (strtolower($ImageType)) { + case 'image/png': + imagesavealpha($NewCanves, true); + $color = imagecolorallocatealpha($NewCanves, 0, 0, 0, 127); + imagefill($NewCanves, 0, 0, $color); + imagepng($NewCanves, $DestFolder); + break; + case 'image/gif': + imagegif($NewCanves, $DestFolder); + break; + case 'image/jpeg': + case 'image/pjpeg': + imagejpeg($NewCanves, $DestFolder, $Quality); + break; + default: + return FALSE; + + } + //Destroy image, frees memory + if (is_resource($NewCanves)) { + imagedestroy($NewCanves); + } + + return TRUE; + + } + + /** + * Funzione che passati i valori esegue l'operazione relativa in base all'analisi dei file attualmente presenti + * + * @param $inputFileName + * @param $formImageName + * @param $oldImageRecord + * @param $imagePath + * @param $nomeFile + * @param bool|true $randomizeImageName + * + * @return mixed|string + */ + public function image_operation($inputFileName, $formImageName, $oldImageRecord, $imagePath, $nomeFile, $randomizeImageName = true) + { + + //Controllo che il nome del file sia valido + if (!empty($_FILES[$inputFileName]) && $_FILES[$inputFileName]['name'] != '') { + if($randomizeImageName){ + $nomeFile = time() ."_". str_replace(' ', '-', strtolower($nomeFile)); + }else{ + $nomeFile = str_replace(' ', '-', strtolower($nomeFile)); + } + } + + //Vedo che operazione eseguire sul file immagine memorizzato nel file system + if (!empty($_FILES[$inputFileName]) && $nomeFile != '') { + if ($oldImageRecord != null) { //AGGIORNAMENTO + if ($oldImageRecord[$formImageName] != '' && file_exists($imagePath . $oldImageRecord[$formImageName])) { + unlink($imagePath . $oldImageRecord[$formImageName]); //Elimina la vecchia precendente dal file system + } + } + if (!$this->direct($imagePath, $inputFileName,$nomeFile)) { //Memorizza la nuova immagine + return 'error'; + } + } elseif (empty($_FILES[$inputFileName]) && $nomeFile == '') { //CANCELLO SOLO L'IMMAGINE + if ($oldImageRecord != null) { + if ($oldImageRecord[$formImageName] != '' && file_exists($imagePath . $oldImageRecord[$formImageName])) { + unlink($imagePath . $oldImageRecord[$formImageName]); + } + } + } + + return (!$nomeFile) ? null : $nomeFile; + } + + /** + * Controlla che l'immagine esiste e nel caso posistivo la elimina del fyle system + * @param $nomeFile + * @param $path + */ + public function deleteImage($nomeFile, $path) + { + if (file_exists($path . $nomeFile)) { + @unlink($path . $nomeFile); + } + } + + } diff --git a/library/Helpers/Action/MongoDateFunctions.php b/library/Helpers/Action/MongoDateFunctions.php new file mode 100644 index 0000000..7b3eb7e --- /dev/null +++ b/library/Helpers/Action/MongoDateFunctions.php @@ -0,0 +1,38 @@ + 'dd/mm/yyyy HH:ii:ss')); + $dateValidatorSlash = new Zend_Validate_Date(array('format' => 'dd/mm/yyyy')); + $dateValidatorTrattino = new Zend_Validate_Date(array('format' => 'yyyy-mm-dd')); + + if ($dateValidatorSlashWithTime->isValid($data)) { + $data = explode(' ', $data); + $dataString = implode('-', array_reverse(explode("/", $data[0]))) . " " . $data[1]; + } else if ($dateValidatorSlash->isValid($data)) { + $dataString = implode('-', array_reverse(explode("/", $data))) . $this->checkTimeString($data); + } else if ($dateValidatorTrattino->isValid($data)) { + $dataString = $data . $this->checkTimeString($data); + } else { + return null; + } + + $orig_date = new DateTime($dataString); + return new MongoDB\BSON\UTCDateTime($orig_date->getTimestamp() * 1000); + } + + private function checkTimeString($data) + { + return (preg_match('/[0-9]{2}:[0-9]{2}:[0-9]{2}/', $data)) ? '' : " 00:00:00"; + } + + +} diff --git a/library/Helpers/Action/MongoFilterFunctions.php b/library/Helpers/Action/MongoFilterFunctions.php new file mode 100644 index 0000000..b6ed193 --- /dev/null +++ b/library/Helpers/Action/MongoFilterFunctions.php @@ -0,0 +1,255 @@ +_dateHelper = $this->getActionController()->getHelper('ExtractData'); + $this->_mongoDate = $this->getActionController()->getHelper('MongoDateFunctions'); + $this->_filterOperators = array('>', '<', '>=', '<=', '=', 'ISNULL', 'NONULL'); + } + + /** + * Questa funzione ricevuti i parametri restitisce l'array contenente tutti i valori per eseguire la ricerca da passare alla query + * @param $filter + * @param bool|false $analizzaOperatori + * @return array + */ + public function direct($filter, $analizzaOperatori = false) + { + + if (is_null($filter)) return null; + + if ($analizzaOperatori) { + $filter = $this->getFilterParamsWithOperator($filter); + } + + $where = array(); + + $filter = $this->cleanParams($filter, false); + + foreach ($filter as $key => $val) { + + if (substr($key, -2) == 'OP') continue; + + $nomeCampo = explode('-', $key)[0]; + $nomeCampo = str_replace('#', '.', $nomeCampo); + + if (array_key_exists($key . 'OP', $filter)) + $op = $filter[$key . 'OP']; + else + $op = 'EQUAL'; + + switch ($op) { + case'ICHECK': + $where[$nomeCampo] = ($val == 'on') ? true : false; + break; + case'EQUAL': + $where[$nomeCampo] = $val; + break; + case'NOTEQUAL': + $where[$nomeCampo] = ['$ne' => $val]; + break; + case'MIN': + $where[$nomeCampo] = ['$lt' => intval($val)]; + break; + case'MAX': + $where[$nomeCampo] = ['$gt' => intval($val)]; + break; + case'EQUALMIN': + $where[$nomeCampo] = ['$lte' => intval($val)]; + break; + case'EQUALMAX': + $where[$nomeCampo] = ['$gte' => intval($val)]; + break; + case'LIKE': + //$where[$nomeCampo] = ['$regex' => new MongoDB\BSON\Regex("$val",'i')]; + $where[$nomeCampo] = ['$regex' => $val, '$options' => 'i']; + break; + case'LIKEPRE': + $where[$nomeCampo] = ['$regex' => "^$val", '$options' => 'i']; + break; + case'LIKEPOST': + $where[$nomeCampo] = ['$regex' => "$val$", '$options' => 'i']; + break; + case'DATEEQUAL': + $where[$nomeCampo] = $this->_mongoDate->direct(trim($val) . $this->checkTimeString($val)); + break; + case'DATEEQUALMIN': //Inserisco anche l'ora perchè cosi le query funzionano sia sui i tipi "date" che "datetime" + $where[$nomeCampo] = array('$gte' => $this->_mongoDate->direct(trim($val) . $this->checkTimeString($val))); + break; + case'DATEEQUALMAX': + $where[$nomeCampo] = array('$lte' => $this->_mongoDate->direct(trim($val) . $this->checkTimeString($val, true))); + break; + case'DATEMIN': + $where[$nomeCampo] = array('$gt' => $this->_mongoDate->direct(trim($val) . $this->checkTimeString($val))); + break; + case'DATEMAX': + $where[$nomeCampo] = array('$lt' => $this->_mongoDate->direct(trim($val) . $this->checkTimeString($val, true))); + break; + case'DATERANGE': + $val = explode('|', $val); + if ((trim($val[0]) && trim($val[0]) != 'undefined') && (trim($val[1]) && trim($val[1]) != 'undefined')) { + $where[$nomeCampo] = array( + '$gte' => $this->_mongoDate->direct(trim($val[0]) . $this->checkTimeString($val[0])), + '$lte' => $this->_mongoDate->direct(trim($val[1]) . $this->checkTimeString($val[1], true)) + ); + } + break; + case'ISNULL': + $where[$nomeCampo] = ['$exists' => 0]; + break; + case'NONULL': + $where[$nomeCampo] = ['$exists' => 1]; + break; + default: + throw new Exception("'$op' non è un operatore di filtro valido"); + break; + } + } + + //Salvo i dati della where in modo da poterli riutilizzare in caso di necessità durante la chiamata + if (count($where) > 0) { + Zend_Registry::set(App_Model_Mongo_Client::WHERE_MONGO_REG_NAME, $where); + } + + return $where; + } + + /** + * Questa funzione riceve i parametri di ricerca in ingresso gli analizza per applicare eventuali operatori applicati + * @param $params + * @return array + */ + public function getFilterParamsWithOperator($params) + { + + $params = $this->cleanParams($params); + + $newParams = array(); + + foreach ($params as $key => $val) { + if (substr($key, -2) == 'OP') continue; + if (substr($key, -9) == 'OPDEFAULT') continue; + if (!array_key_exists($key . "OP", $params)) { + + $op = $this->findOperator($val); + switch ($op) { + case'>=': + $newParams[$key . 'OP'] = 'EQUALMAX'; + $newParams[$key] = trim(substr($val, 2)); + break; + case'<=': + $newParams[$key . 'OP'] = 'EQUALMIN'; + $newParams[$key] = trim(substr($val, 2)); + break; + case'<': + $newParams[$key . 'OP'] = 'MIN'; + $newParams[$key] = trim(substr($val, 1)); + break; + case'>': + $newParams[$key . 'OP'] = 'MAX'; + $newParams[$key] = trim(substr($val, 1)); + break; + case'=': + $newParams[$key . 'OP'] = 'EQUAL'; + $newParams[$key] = trim(substr($val, 1)); + break; + case'<>': + $newParams[$key . 'OP'] = 'NOTEQUAL'; + $newParams[$key] = trim(substr($val, 2)); + break; + case'ISNULL': + $newParams[$key . 'OP'] = 'ISNULL'; + $newParams[$key] = ""; + break; + case'NONULL': + $newParams[$key . 'OP'] = 'NONULL'; + $newParams[$key] = ""; + break; + default: + if (isset($params[$key . 'OPDEFAULT'])) { + $newParams[$key . 'OP'] = $params[$key . 'OPDEFAULT']; + } else { + $newParams[$key . 'OP'] = 'EQUAL'; + } + $newParams[$key] = $val; + break; + } + + } else { + $newParams[$key] = $val; + $newParams[$key . "OP"] = $params[$key . "OP"]; + } + } + + return $newParams; + + } + + /** + * Funzione che passata una stringa cerca se viene applicato un operatore e lo restuisce + * @param $val + * @return string + */ + private function findOperator($val) + { + $op = trim(explode(' ', $val)[0]); + if (in_array($op, $this->_filterOperators)) return $op; + + $op = trim(substr($val, 0, 6)); + if (in_array($op, $this->_filterOperators)) return $op; + + $op = $op = trim(substr($val, 0, 2)); + if (in_array($op, $this->_filterOperators)) return $op; + + $op = $op = trim(substr($val, 0, 1)); + if (in_array($op, $this->_filterOperators)) return $op; + + return 'EQUAL'; + } + + public function cleanParams($params, $removeEmptyValue = true, $removeOperator = false) + { + unset($params['controller']); + unset($params['module']); + unset($params['action']); + unset($params['method']); + unset($params['page']); + unset($params['count']); + unset($params['order']); + unset($params['tipoOrder']); + unset($params['filtrato']); + unset($params['orwhere']); + unset($params['reset']); + unset($params['iddet']); + unset($params['select']); + + if ($removeEmptyValue) { + //Elimino i campi vuoti tranne le select vuote + foreach ($params as $key => $val) { + if (empty($val) && $val !== '0') unset($params[$key]); + + //Elimino anche i paramtri di operazione + if ($removeOperator && preg_match('/OP$/', $key)) { + unset($params[$key]); + } + } + } + + return $params; + } + + private function checkTimeString($data, $timeEnd = false) + { + $timeString = ($timeEnd) ? ' 23:59:59' : ' 00:00:00'; + return (preg_match('/[0-9]{2}:[0-9]{2}:[0-9]{2}/', $data)) ? '' : $timeString; + } + + +} diff --git a/library/Helpers/Action/Pdf.php b/library/Helpers/Action/Pdf.php new file mode 100644 index 0000000..a032f3c --- /dev/null +++ b/library/Helpers/Action/Pdf.php @@ -0,0 +1,152 @@ + _dataHelper = $this -> getActionController() -> getHelper('ExtractData'); + } + + public function creaPdf($row,$articolo, $filename) { + ///////////////////////////////////////////////////////// + + // operazioni preliminari fattorizzate in questo punto del codice + + ///////////////////////////////////////////////////////// + + $font = "Arial"; + + $font_size = 10; + + $pdf = new Fpdf(); + + $pdf -> AddPage(); + + $pdf -> SetFillColor(238, 238, 238); + + ///////////////////////////////////////////////////////// + + // Logo aziendale + + ///////////////////////////////////////////////////////// + + // col seguente codice siamo in grado di eseguire correttamente sia girando come ADMIN che come Utente (sia in modalità acquisto che reinvio-fatture) + try{ + if ($row['nome_logo'] && file_exists("public/front/img/".$row['nome_logo'])) { + if ($row['nome_logo'] == 'IntestazioneFattura.jpg') { + $pdf->Image("public/front/img/" . $row['nome_logo'], 10, 5, 80, 60); + } else { + $pdf->Image("public/front/img/" . $row['nome_logo'], 10, 10, 80, 60); + } + }else{ + $pdf -> Image("public/front/img/IntestazioneFattura2.jpg", 10, 10, 80, 60); + } + }catch(Exception $e){ + $pdf -> Image("public/front/img/IntestazioneFattura2.jpg", 10, 10, 80, 60); + } + + + ///////////////////////////////////////////////////////// + + // recupero dati + + ///////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////// + + // FINE + + ///////////////////////////////////////////////////////// + + $pdf -> Output($filename, "F"); + @chmod(0777, $filename); + + return $filename; + } + + private function printEuro($x) { + setlocale(LC_MONETARY, 'it_IT'); + $x = $this -> money_format('%.2n', $x + 0); + $x = str_replace("EUR", EURO, $x); + $x = trim($x); + return $x; + } + + private function money_format($format, $number) { + $regex = '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?' . '(?:#([0-9]+))?(?:\.([0-9]+))?([in%])/'; + if (setlocale(LC_MONETARY, 0) == 'C') { + setlocale(LC_MONETARY, ''); + } + $locale = localeconv(); + preg_match_all($regex, $format, $matches, PREG_SET_ORDER); + foreach ($matches as $fmatch) { + $value = floatval($number); + $flags = array('fillchar' => preg_match('/\=(.)/', $fmatch[1], $match) ? $match[1] : ' ', 'nogroup' => preg_match('/\^/', $fmatch[1]) > 0, 'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ? $match[0] : '+', 'nosimbol' => preg_match('/\!/', $fmatch[1]) > 0, 'isleft' => preg_match('/\-/', $fmatch[1]) > 0); + $width = trim($fmatch[2]) ? (int)$fmatch[2] : 0; + $left = trim($fmatch[3]) ? (int)$fmatch[3] : 0; + $right = trim($fmatch[4]) ? (int)$fmatch[4] : $locale['int_frac_digits']; + $conversion = $fmatch[5]; + + $positive = true; + if ($value < 0) { + $positive = false; + $value *= -1; + } + $letter = $positive ? 'p' : 'n'; + + $prefix = $suffix = $cprefix = $csuffix = $signal = ''; + + $signal = $positive ? $locale['positive_sign'] : $locale['negative_sign']; + switch (true) { + case $locale["{$letter}_sign_posn"] == 1 && $flags['usesignal'] == '+' : + $prefix = $signal; + break; + case $locale["{$letter}_sign_posn"] == 2 && $flags['usesignal'] == '+' : + $suffix = $signal; + break; + case $locale["{$letter}_sign_posn"] == 3 && $flags['usesignal'] == '+' : + $cprefix = $signal; + break; + case $locale["{$letter}_sign_posn"] == 4 && $flags['usesignal'] == '+' : + $csuffix = $signal; + break; + case $flags['usesignal'] == '(' : + case $locale["{$letter}_sign_posn"] == 0 : + $prefix = '('; + $suffix = ')'; + break; + } + if (!$flags['nosimbol']) { + $currency = $cprefix . ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']) . $csuffix; + } else { + $currency = ''; + } + $space = $locale["{$letter}_sep_by_space"] ? ' ' : ''; + + $value = number_format($value, $right, $locale['mon_decimal_point'], $flags['nogroup'] ? '' : $locale['mon_thousands_sep']); + $value = @explode($locale['mon_decimal_point'], $value); + + $n = strlen($prefix) + strlen($currency) + strlen($value[0]); + if ($left > 0 && $left > $n) { + $value[0] = str_repeat($flags['fillchar'], $left - $n) . $value[0]; + } + $value = implode($locale['mon_decimal_point'], $value); + if ($locale["{$letter}_cs_precedes"]) { + $value = $prefix . $currency . $space . $value . $suffix; + } else { + $value = $prefix . $value . $space . $currency . $suffix; + } + if ($width > 0) { + $value = str_pad($value, $width, $flags['fillchar'], $flags['isleft'] ? STR_PAD_RIGHT : STR_PAD_LEFT); + } + + $format = str_replace($fmatch[0], $value, $format); + } + return $format; + } + +} diff --git a/library/Helpers/View/AddressFormat.php b/library/Helpers/View/AddressFormat.php new file mode 100644 index 0000000..fdb2e80 --- /dev/null +++ b/library/Helpers/View/AddressFormat.php @@ -0,0 +1,33 @@ + 0){ + $str.= utf8_encode($indirizzo) . '
'; + } + + if(strlen(trim($comune)) > 0){ + $str .= utf8_encode($comune); + } + + if(strlen(trim($cap)) > 0){ + $str .= ' - '.$cap; + } + + if(strlen(trim($provincia)) > 0){ + $str .= ' ('.utf8_encode($provincia).')'; + } + + if(strlen(trim($regione)) > 0){ + $str .= ' - '.utf8_encode($regione); + } + + return $str; + } + +} diff --git a/library/Helpers/View/AllowedIp.php b/library/Helpers/View/AllowedIp.php new file mode 100644 index 0000000..006b24b --- /dev/null +++ b/library/Helpers/View/AllowedIp.php @@ -0,0 +1,16 @@ +_ipManager) { + $this->_ipManager = new App_Service_IpManager(); + } + + return $this->_ipManager->allowedIp(); + } + +} diff --git a/library/Helpers/View/AuthInfo.php b/library/Helpers/View/AuthInfo.php new file mode 100644 index 0000000..5628f0b --- /dev/null +++ b/library/Helpers/View/AuthInfo.php @@ -0,0 +1,33 @@ +_authService) { + $this->_authService = new App_Service_Auth(); + } + if (null === $info) { + return $this; + } + if (false === $this->isLoggedIn()) { + return null; + } + return $this->_authService->getIdentity()->$info; + } + + public function isLoggedIn() + { + return $this->_authService->getAuth()->hasIdentity(); + } + + public function checkPermission($resourceName) + { + if ($this->isLoggedIn()) { + return $this->_authService->checkPermission($resourceName); + } + return false; + } +} diff --git a/library/Helpers/View/CleanFiltersParam.php b/library/Helpers/View/CleanFiltersParam.php new file mode 100644 index 0000000..46d99de --- /dev/null +++ b/library/Helpers/View/CleanFiltersParam.php @@ -0,0 +1,34 @@ + $val) { + if (empty($val) && $val !== '0') unset($params[$key]); + + //Elimino anche i paramtri di operazione + if (preg_match('/OP$/',$key)){ + unset($params[$key]); + } + } + } + + return $params; + } + +} diff --git a/library/Helpers/View/Config.php b/library/Helpers/View/Config.php new file mode 100644 index 0000000..41f4209 --- /dev/null +++ b/library/Helpers/View/Config.php @@ -0,0 +1,18 @@ +_configService) { + $this->_configService = new App_Service_ConfigManager(); + } + if (null === $info) { + return $this; + } + return $this->_configService->get($info); + } + +} diff --git a/library/Helpers/View/Currency.php b/library/Helpers/View/Currency.php new file mode 100644 index 0000000..4faeea6 --- /dev/null +++ b/library/Helpers/View/Currency.php @@ -0,0 +1,12 @@ +toCurrency($number); + } + +} diff --git a/library/Helpers/View/EncodeText.php b/library/Helpers/View/EncodeText.php new file mode 100644 index 0000000..bcfdc2f --- /dev/null +++ b/library/Helpers/View/EncodeText.php @@ -0,0 +1,17 @@ +",utf8_encode($string)); + } + +} diff --git a/library/Helpers/View/ExtractData.php b/library/Helpers/View/ExtractData.php new file mode 100644 index 0000000..624ce2a --- /dev/null +++ b/library/Helpers/View/ExtractData.php @@ -0,0 +1,66 @@ + format($format); + } + +} diff --git a/library/Helpers/View/FormatData.php b/library/Helpers/View/FormatData.php new file mode 100644 index 0000000..5970794 --- /dev/null +++ b/library/Helpers/View/FormatData.php @@ -0,0 +1,10 @@ + format($format); + } + +} diff --git a/library/Helpers/View/GetDomainData.php b/library/Helpers/View/GetDomainData.php new file mode 100644 index 0000000..35c3c53 --- /dev/null +++ b/library/Helpers/View/GetDomainData.php @@ -0,0 +1,24 @@ +'.$pattern.'', $text); + } + } + return $text; + } + +} diff --git a/library/Helpers/View/SlashesText.php b/library/Helpers/View/SlashesText.php new file mode 100644 index 0000000..ad4a4a1 --- /dev/null +++ b/library/Helpers/View/SlashesText.php @@ -0,0 +1,17 @@ +_service) { + $this->_service = new App_Service_VariabiliSito(); + } + if (null === $info) { + return $this; + } + return $this->_service->get($info); + } + +} diff --git a/library/Helpers/View/WrapText.php b/library/Helpers/View/WrapText.php new file mode 100644 index 0000000..dd22af9 --- /dev/null +++ b/library/Helpers/View/WrapText.php @@ -0,0 +1,121 @@ +$lenght){ + return $this->truncateHtml($string,$lenght); + } + + return $string; + } + + /** + * truncateHtml can truncate a string up to a number of characters while preserving whole words and HTML tags + * + * @param string $text String to truncate. + * @param integer $length Length of returned string, including ellipsis. + * @param string $ending Ending to be appended to the trimmed string. + * @param boolean $exact If false, $text will not be cut mid-word + * @param boolean $considerHtml If true, HTML tags would be handled correctly + * + * @return string Trimmed string. + */ + function truncateHtml($text, $length = 100, $ending = '...', $exact = false, $considerHtml = true) { + if ($considerHtml) { + // if the plain text is shorter than the maximum length, return the whole text + if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) { + return $text; + } + // splits all html-tags to scanable lines + preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER); + $total_length = strlen($ending); + $open_tags = array(); + $truncate = ''; + foreach ($lines as $line_matchings) { + // if there is any html-tag in this line, handle it and add it (uncounted) to the output + if (!empty($line_matchings[1])) { + // if it's an "empty element" with or without xhtml-conform closing slash + if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) { + // do nothing + // if tag is a closing tag + } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) { + // delete tag from $open_tags list + $pos = array_search($tag_matchings[1], $open_tags); + if ($pos !== false) { + unset($open_tags[$pos]); + } + // if tag is an opening tag + } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) { + // add tag to the beginning of $open_tags list + array_unshift($open_tags, strtolower($tag_matchings[1])); + } + // add html-tag to $truncate'd text + $truncate .= $line_matchings[1]; + } + // calculate the length of the plain text part of the line; handle entities as one character + $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2])); + if ($total_length+$content_length> $length) { + // the number of characters which are left + $left = $length - $total_length; + $entities_length = 0; + // search for html entities + if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) { + // calculate the real length of all entities in the legal range + foreach ($entities[0] as $entity) { + if ($entity[1]+1-$entities_length <= $left) { + $left--; + $entities_length += strlen($entity[0]); + } else { + // no more characters left + break; + } + } + } + $truncate .= substr($line_matchings[2], 0, $left+$entities_length); + // maximum lenght is reached, so get off the loop + break; + } else { + $truncate .= $line_matchings[2]; + $total_length += $content_length; + }// if the maximum length is reached, get off the loop + if($total_length>= $length) { + break; + } + } + } else { + if (strlen($text) <= $length) { + return $text; + } else { + $truncate = substr($text, 0, $length - strlen($ending)); + } + } + // if the words shouldn't be cut in the middle... + if (!$exact) { + // ...search the last occurance of a space... + $spacepos = strrpos($truncate, ' '); + if (isset($spacepos)) { + // ...and cut the text in this position + $truncate = substr($truncate, 0, $spacepos); + } + } + // add the defined ending to the text + $truncate .= $ending; + if($considerHtml) { + // close all unclosed html-tags + foreach ($open_tags as $tag) { + $truncate .= ''; + } + } + return $truncate; + } + +} diff --git a/log/log.txt b/log/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..7a9766d --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,6 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/admin/css/custom.css b/public/admin/css/custom.css new file mode 100644 index 0000000..de09f49 --- /dev/null +++ b/public/admin/css/custom.css @@ -0,0 +1,1198 @@ +body { + font-size: 15px; +} + +.form-control { + font-size: 0.95rem; +} + +.text-sm .navbar { + font-size: 16px !important; + height: 50px; + border-bottom: 0; +} +.text-sm .btn-group .btn { + font-size: 1rem !important; +} +.text-sm .brand-link { + font-size: 1rem; +} + +.bg-brand { + background-color: #007BFF !important; +} + +a.bg-brand:hover, a.bg-brand:focus, +button.bg-brand:hover, +button.bg-brand:focus { + background-color: #0062cc !important; +} + +.alert-brand { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; +} +.alert-brand hr { + border-top-color: #9fcdff; +} +.alert-brand .alert-link { + color: #002752; +} + +.btn-brand { + color: #fff; + background-color: #007BFF; + border-color: #007BFF; +} +.btn-brand:hover { + color: #fff; + background-color: #0062cc; + border-color: #1a88ff; +} +.btn-brand:focus, .btn-brand.focus { + color: #fff; + background-color: #0062cc; + border-color: #1a88ff; + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} +.btn-brand.disabled, .btn-brand:disabled { + color: #fff; + background-color: #007BFF; + border-color: #007BFF; +} +.btn-brand:not(:disabled):not(.disabled):active, .btn-brand:not(:disabled):not(.disabled).active, .show > .btn-brand.dropdown-toggle { + color: #fff; + background-color: #3395ff; + border-color: #003166; +} +.btn-brand:not(:disabled):not(.disabled):active:focus, .btn-brand:not(:disabled):not(.disabled).active:focus, .show > .btn-brand.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.m0, .no-margin { + margin: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.m-5 { + margin: 5px !important; +} + +.mr-5 { + margin-right: 5px !important; +} + +.ml-5 { + margin-left: 5px !important; +} + +.mt-5 { + margin-top: 5px !important; +} + +.mb-5 { + margin-bottom: 5px !important; +} + +.m-10 { + margin: 10px !important; +} + +.mr-10 { + margin-right: 10px !important; +} + +.ml-10 { + margin-left: 10px !important; +} + +.mt-10 { + margin-top: 10px !important; +} + +.mb-10 { + margin-bottom: 10px !important; +} + +.m-15 { + margin: 15px !important; +} + +.mr-15 { + margin-right: 15px !important; +} + +.ml-15 { + margin-left: 15px !important; +} + +.mt-15 { + margin-top: 15px !important; +} + +.mb-15 { + margin-bottom: 15px !important; +} + +.m-20 { + margin: 20px !important; +} + +.mr-20 { + margin-right: 20px !important; +} + +.ml-20 { + margin-left: 20px !important; +} + +.mt-20 { + margin-top: 20px !important; +} + +.mb-20 { + margin-bottom: 20px !important; +} + +.pd0, .no-padding { + padding: 0 !important; +} + +.pd-0 { + padding: 0 !important; +} + +.pdr-0 { + padding-right: 0 !important; +} + +.pdl-0 { + padding-left: 0 !important; +} + +.pdt-0 { + padding-top: 0 !important; +} + +.pdb-0 { + padding-bottom: 0 !important; +} + +.pd-5 { + padding: 5px !important; +} + +.pdr-5 { + padding-right: 5px !important; +} + +.pdl-5 { + padding-left: 5px !important; +} + +.pdt-5 { + padding-top: 5px !important; +} + +.pdb-5 { + padding-bottom: 5px !important; +} + +.pd-10 { + padding: 10px !important; +} + +.pdr-10 { + padding-right: 10px !important; +} + +.pdl-10 { + padding-left: 10px !important; +} + +.pdt-10 { + padding-top: 10px !important; +} + +.pdb-10 { + padding-bottom: 10px !important; +} + +.pd-15 { + padding: 15px !important; +} + +.pdr-15 { + padding-right: 15px !important; +} + +.pdl-15 { + padding-left: 15px !important; +} + +.pdt-15 { + padding-top: 15px !important; +} + +.pdb-15 { + padding-bottom: 15px !important; +} + +.pd-20 { + padding: 20px !important; +} + +.pdr-20 { + padding-right: 20px !important; +} + +.pdl-20 { + padding-left: 20px !important; +} + +.pdt-20 { + padding-top: 20px !important; +} + +.pdb-20 { + padding-bottom: 20px !important; +} + +/*------------------------------------------*/ +.no-border-top { + border-top: 0; +} + +.no-padding-right { + padding-right: 0; +} + +.no-padding-left { + padding-left: 0; +} + +.no-padding-left > input { + border-left: 0; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 767px) { + .no-border-right-sm { + border-right: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .no-border-top-sm { + border-top: 0; + } + + .no-border-r-l-sm { + border-radius: 0; + } + + .no-padding-l-sm { + padding-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .no-padding-l-sm input { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .no-padding-r-sm { + padding-right: 0; + } + .no-padding-r-sm input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .no-padding-r-l-sm { + padding-right: 0; + padding-left: 0; + } + .no-padding-r-l-sm input { + border-radius: 0; + } +} +.filtratiLabel { + font-size: 13px; + padding-right: 10px; + vertical-align: bottom; + margin-top: 19px; + display: block; +} + +hr.white { + border-top: 1px solid #FFF; +} +hr.dark { + border-top: 1px solid #333; +} +hr.light { + border-top: 1px solid #DDD; +} + +/*------------------------------------------*/ +.border-top-white { + border-top: 1px solid #FFF; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.border-bottom-white { + border-bottom: 1px solid #FFF; +} + +.border-right-white { + border-right: 1px solid #FFF; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.border-left-white { + border-left: 1px solid #FFF; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.sidebar-menu li.divider-md { + border-top: 3px solid #1a2226; +} + +.note-editor.note-frame { + border-radius: 0 !important; +} + +.logo-img { + position: absolute; + top: 0; + right: 15px; + max-height: 100px; +} + +.btn > .badge { + position: absolute; + top: -6px; + right: -4px; + font-size: 10px; + font-weight: 400; + z-index: 100; +} + +.main-footer { + padding: 10px 15px; +} + +section.content.list { + padding: 12px 0 0 0; +} + +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: #f1f1f1; +} + +::-webkit-scrollbar-thumb { + background: #888; +} + +::-webkit-scrollbar-thumb:hover { + background: #555; +} + +@media (max-width: 575.98px) { + .content-wrapper, .main-sidebar { + padding-top: 50px !important; + } + + .box-footer { + padding: 8px 3px !important; + } + + section.content.list { + padding: 0; + } + + section.content-header { + padding: 10px 15px 8px; + } +} +.dropdown-menu { + z-index: 1100 !important; + font-size: 0.9rem; + padding: 5px 0; +} + +.content-header > .breadcrumb.top0 { + top: 0; +} + +.sidebar-dark-brand .nav-sidebar > .nav-item > .nav-link.active { + background-color: #007BFF; + color: #fff; +} +.sidebar-dark-brand .nav-sidebar.nav-legacy > .nav-item > .nav-link.active { + border-color: #007BFF; +} + +.accent-brand .btn-link, +.accent-brand a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn) { + color: #007BFF; +} +.accent-brand .btn-link:hover, +.accent-brand a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover { + color: #0056b3; +} +.accent-brand .dropdown-item:active, .accent-brand .dropdown-item.active { + background: #007BFF; + color: #fff; +} +.accent-brand .custom-control-input:checked ~ .custom-control-label::before { + background: #007BFF; + border-color: #004a99; +} +.accent-brand .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,"); +} +.accent-brand .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid), +.accent-brand .custom-select:focus, +.accent-brand .custom-control-input:focus:not(:checked) ~ .custom-control-label::before, +.accent-brand .custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; +} +.accent-brand .page-item .page-link { + color: #007BFF; +} +.accent-brand .page-item.active a, .accent-brand .page-item.active .page-link { + background-color: #007BFF; + border-color: #007BFF; + color: #fff; +} +.accent-brand .page-item.disabled a, .accent-brand .page-item.disabled .page-link { + background-color: #fff; + border-color: #dee2e6; + color: #6c757d; +} +.accent-brand [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link) { + color: #C2C7D0; +} +.accent-brand [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover { + color: #fff; +} +.accent-brand [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link) { + color: #343a40; +} +.accent-brand [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover { + color: #212529; +} + +[class*=accent-] a.btn-brand { + color: #fff; +} + +.bg-brand { + background-color: #007BFF !important; +} +.bg-brand, +.bg-brand > a { + color: #fff !important; +} +.bg-brand.btn:hover { + border-color: #0062cc; + color: #ececec; +} +.bg-brand.btn:not(:disabled):not(.disabled):active, .bg-brand.btn:not(:disabled):not(.disabled).active, .bg-brand.btn:active, .bg-brand.btn.active { + background-color: #0062cc !important; + border-color: #005cbf; + color: #fff; +} + +.navbar-dark-brand { + background-color: #007BFF; +} +.navbar-dark-brand .nav > li > a { + color: rgba(255, 255, 255, 0.8); +} +.navbar-dark-brand .nav > li > a:hover, +.navbar-dark-brand .nav > li > a:active, +.navbar-dark-brand .nav > li > a:focus, +.navbar-dark-brand .nav .open > a, +.navbar-dark-brand .nav .open > a:hover, +.navbar-dark-brand .nav .open > a:focus, +.navbar-dark-brand .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.navbar-dark-brand .sidebar-toggle { + color: rgba(255, 255, 255, 0.8); +} +.navbar-dark-brand .sidebar-toggle:hover, .navbar-dark-brand .sidebar-toggle:focus { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} + +.nav-item.dev-block { + margin-top: 6px !important; +} + +.card-brand:not(.card-outline) > .card-header { + background-color: #007BFF; +} +.card-brand:not(.card-outline) > .card-header, +.card-brand:not(.card-outline) > .card-header a { + color: #fff; +} +.card-brand:not(.card-outline) > .card-header a.active { + color: #212529; +} +.card-brand.card-outline { + border-top: 3px solid #007BFF; +} +.card-brand.card-outline-tabs > .card-header a:hover { + border-top: 3px solid #dee2e6; +} +.card-brand.card-outline-tabs > .card-header a.active { + border-top: 3px solid #007BFF; +} + +.bg-brand .btn-tool, +.bg-gradient-brand .btn-tool, +.card-brand:not(.card-outline) .btn-tool { + color: rgba(255, 255, 255, 0.8); +} +.bg-brand .btn-tool:hover, +.bg-gradient-brand .btn-tool:hover, +.card-brand:not(.card-outline) .btn-tool:hover { + color: #fff; +} + +.card.bg-brand .bootstrap-datetimepicker-widget .table td, +.card.bg-brand .bootstrap-datetimepicker-widget .table th, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget .table td, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget .table th { + border: none; +} +.card.bg-brand .bootstrap-datetimepicker-widget table thead tr:first-child th:hover, +.card.bg-brand .bootstrap-datetimepicker-widget table td.day:hover, +.card.bg-brand .bootstrap-datetimepicker-widget table td.hour:hover, +.card.bg-brand .bootstrap-datetimepicker-widget table td.minute:hover, +.card.bg-brand .bootstrap-datetimepicker-widget table td.second:hover, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table thead tr:first-child th:hover, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.day:hover, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.hour:hover, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.minute:hover, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.second:hover { + background: #0067d6; + color: #fff; +} +.card.bg-brand .bootstrap-datetimepicker-widget table td.today::before, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.today::before { + border-bottom-color: #fff; +} +.card.bg-brand .bootstrap-datetimepicker-widget table td.active, +.card.bg-brand .bootstrap-datetimepicker-widget table td.active:hover, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.active, +.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.active:hover { + background: #3395ff; + color: #fff; +} + +.card-brand.card-outline-tabs, .card-brand.card-outline { + border-top: 0 !important; +} +.card-brand.card-outline .card-header .nav-link.active { + color: #FFFFFF !important; + background: #007BFF; +} +.card-brand.card-outline.card-outline-tabs .card-header .nav-link.active { + color: inherit !important; + background: whitesmoke; + border-bottom-color: whitesmoke; +} +.card-brand.card-outline.card-outline-tabs .card-body { + background-color: whitesmoke; +} +.card-brand .card-header .nav-link { + color: #007BFF !important; +} + +.accordion-card { + box-shadow: none; + border: 1px solid #DDD; + border-radius: 4px; +} +.accordion-card.no-border { + border: 0; +} +.accordion-card.no-border-radius { + border-radius: 0; +} + +.delivery-card .card-header { + padding: 8px 4px; +} +.delivery-card .prodoti-list-item { + font-size: 13px; + color: #333333; +} +.delivery-card .riepilogo-list-item { + font-size: 14px; + color: #333333; +} +.delivery-card .totale-ordine { + margin-top: 5px; + font-weight: bold; +} +.delivery-card .metodo-pagamento { + color: #333333; +} + +.position-card { + margin-bottom: 0; + border-top: 1px solid #DDD; +} + +.table-border { + border: 1px solid #ddd; +} + +th[data-ord] { + cursor: pointer; +} + +.content.list { + padding: 0; +} + +.box-header { + margin-bottom: 8px; + margin-right: 8px; + margin-left: 8px; +} + +.floatThead-container { + overflow-x: inherit !important; +} + +.table-border.flot-header { + font-size: 0.95rem; + border-left: 0; + border-right: 0; +} +.table-border.flot-header tbody tr { + /*&:hover{ + td{ + background: transparent; + } + }*/ +} +.table-border.flot-header tbody tr td { + border-top: 1px solid #DDD; + vertical-align: middle; + padding: 5px; +} +.table-border.flot-header th { + background-color: #FFF; + border-bottom: 1px solid #DDD; +} + +.table-wrapper { + height: 729px; + transition: height ease 0.7s; +} + +.table-responsive { + padding: 0; +} + +.table-border td, .table-border th { + border-bottom: 1px solid #ddd; +} + +table.table-popover { + font-size: 12px; +} + +table { + margin-bottom: 0 !important; +} + +.table > thead > tr > th { + border-bottom: none !important; +} + +.popover.popover-default-variables { + border-radius: 0; + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; +} + +td.no-rows { + color: #6c757d !important; + height: 729px; + vertical-align: middle !important; + font-size: 1.1em; + text-transform: uppercase; + text-align: center; + border: none !important; +} +td.no-rows > i { + display: block; + font-size: 3em; + color: #6c757d !important; +} + +.ui-dialog { + z-index: 2000 !important; +} + +@media (min-width: 768px) { + .table-responsive { + border: none; + overflow-y: scroll; + margin: 0; + } +} +.table-wrapper-2, .table-wrapper-3 { + height: 200px; + overflow-y: scroll; + background: whitesmoke; +} +.table-wrapper-2 td.no-rows, .table-wrapper-3 td.no-rows { + height: 152px !important; +} +.table-wrapper-2 td.no-rows > i, .table-wrapper-3 td.no-rows > i { + font-size: 2em !important; +} + +.table-tickets { + border-top: 1px solid #EEE !important; + border-bottom: 1px solid #EEE !important; + border-left: none !important; + border-right: none !important; +} +.table-tickets td { + vertical-align: middle !important; + padding: 6px !important; +} + +.floatThead-table thead > tr > th { + background: #FFF; + z-index: 1001; + padding-left: 6px !important; + padding-right: 6px !important; +} + +.table-righe { + border-top: 1px solid #EEE !important; + border-bottom: 1px solid #EEE !important; + border-left: none !important; + border-right: none !important; +} +.table-righe td { + vertical-align: middle !important; + padding: 6px !important; +} + +table.sottoaree-table th { + border-top: none; + box-shadow: none !important; +} +table.sottoaree-table td.no-rows { + height: 303px !important; +} +table.sottoaree-table td.no-rows > i { + font-size: 2em !important; +} + +.modal-with-tabs .modal-header { + border-bottom: none; +} +.modal-with-tabs .modal-body .card { + box-shadow: none; + border-radius: 0; +} + +.modal.modal-second-level { + z-index: 2070 !important; + overflow: auto; +} + +body.modal-second .modal-backdrop { + z-index: 2069 !important; +} + +body.modal-second, body.modal-third { + overflow-y: hidden !important; +} + +.box-border { + border: 1px solid #DDD; +} + +.box-footer { + padding: 8px 10px; + border-top: 1px solid #DDD; +} + +/**** MODAL **/ +.modal-dialog > .overlay, .modal-dialog > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.modal-dialog .overlay { + z-index: 1010; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} + +.modal-dialog .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} + +.modal-dialog .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} + +.modal-body { + background-color: whitesmoke; +} + +.modal-body .label { + text-align: right; + margin-right: 3px; +} + +/**** TABELLA **/ +.table-border { + border: 1px solid #ddd; +} +.table-border th { + font-weight: 500; +} + +.table-border td, .table-border th { + border-bottom: 1px solid #ddd; +} + +/**** TABS **/ +.nav-tabs a.disabled { + color: #ddd; +} + +.modal.modal-second-level { + z-index: 2070 !important; + overflow: auto; +} + +body.modal-second, body.modal-third { + overflow-y: hidden !important; +} + +body.modal-second .modal-backdrop { + z-index: 2069 !important; +} + +/****** FORM *****/ +.form-box-container { + border: 1px solid #ddd; + margin: 10px 0; + padding: 15px; +} + +.note-editable { + min-height: 426px; +} + +.datepicker { + z-index: 1151 !important; +} + +/******* PREVIEW IMAGE *******/ +.image-preview-input { + background-color: #fff; + border-color: #ccc; + color: #333; + margin: 0; + overflow: hidden; + position: relative; +} +.image-preview-input input[type=file] { + cursor: pointer; + font-size: 20px; + margin: 0; + opacity: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; +} + +.image_preview_block_container .logo { + padding: 10px; + max-height: 149px; +} +.image_preview_block_container .banner { + padding: 10px; + max-height: 200px; +} + +.image-preview-clear-btn { + margin: 0; +} + +input.form-control:focus, select.form-control:focus { + border: 1px solid #3c8dbc; +} + +.form-group.has-error .form-control, .form-group.has-error .input-group-addon { + border: 1px solid #dd4b39; + box-shadow: none !important; +} + +.form-error > span { + color: #dd4b39 !important; +} + +.form-group .label-danger { + background: none repeat scroll 0 0 rgba(0, 0, 0, 0) !important; + color: #dd4b39 !important; + text-align: right !important; + overflow: hidden; + font-size: 12px; +} + +[elastic] { + min-height: 37px; +} + +textarea.resize-vertical { + resize: vertical; +} +textarea.resize-horizontal { + resize: horizontal; +} + +#modalForm label { + font-weight: normal; +} + +.compact-form.no-border-radius input, .compact-form.no-border-radius select, .compact-form.no-border-radius textarea { + border-radius: 0; +} +.compact-form .label-danger { + text-align: right; +} +.compact-form label { + font-size: 0.95rem; + margin-top: 7px; + font-weight: normal !important; +} +.compact-form .form-group { + margin-bottom: 5px; +} +.compact-form .form-group .form-control { + box-shadow: none !important; +} +.compact-form .form-group .has-error .form-control { + box-shadow: none !important; + border: 1px solid #dd4b39; +} + +/**** SUMMERNNOTE EDITOR ****/ +.panel.note-editor { + border-radius: 0; + border: 1px solid #DDD; + box-shadow: none; +} + +/**** BTN RADIo BOX ****/ +.btn-radiobox .btn-app { + text-transform: uppercase; +} +.btn-radiobox .btn-app:first-child { + margin-left: 0; +} +.btn-radiobox .btn-app.active { + border-color: #007BFF; +} +.btn-radiobox .btn-app.active i { + color: #007BFF; +} +.btn-radiobox .btn-app input { + display: none; +} + +.select2-fullwidth .select2-container { + min-width: 100%; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #007BFF; + border-color: #007BFF; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected], .select2-container--default .select2-results__option--highlighted[aria-selected]:hover { + background-color: #007BFF; +} + +.sw-icon-font-picker { + width: 28px; + padding: 4px; +} + +.fip-box .sw-icon-font-picker, .icons-selector .selected-icon .sw-icon-font-picker { + padding: 6px 4px; +} + +.icons-selector.fip-bootstrap span.current-icon, .icons-selector.fip-bootstrap span.current-icon:hover { + background-color: #007BFF; + color: #fff; + border: 1px solid #007BFF; +} + +.breadcrumb { + font-size: 14px; +} + +.dropdown-multifunction-down { + margin-top: 5px; +} + +.pagination { + margin-top: 5px; + margin-left: 5px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal !important; + vertical-align: middle; +} +.pagination .text-counter { + margin-top: 5px; +} + +.box-footer { + background: #FFFFFF; + padding: 4px 3px !important; +} + +.note-editor { + box-shadow: none; +} + +.bootstrap-modal-selector { + overflow-y: scroll; +} + +.pagination-counter { + font-size: 14px; +} +.pagination-counter label { + margin-right: 5px; + font-weight: normal !important; +} +.pagination-counter input.form-control { + border-radius: 0.2rem; +} + +@media (min-width: 768px) { + .box-title.search-left { + width: 65%; + } + .box-title.search-right { + width: 35%; + } + .box-title.search-right > * { + float: right; + } + + #orderSelect { + max-width: 150px; + } + + .pagination-counter { + max-width: 150px; + margin-top: 5px; + } + .pagination-counter label { + padding-top: 5px; + } + .pagination-counter > .form-group { + margin-bottom: 0; + } +} +.login-logo img { + display: block; + margin-left: auto; + margin-right: auto; + max-height: 150px; + max-width: 250px; +} + +.login-card-body { + border-radius: 5px; +} +.login-card-body .icheck-primary { + margin-top: 7px; +} + +.footer-login { + margin-top: 10px; + text-align: center; + font-size: 0.9em; +} + +/** TAB SETTINGS **/ +#settings-tab .panel-body { + border-top: 0; + border-right: 1px solid #DDD; + border-left: 1px solid #DDD; + border-bottom: 1px solid #DDD; +} +#settings-tab .panel-body .well { + box-shadow: none; +} + +.well { + border: 1px solid #DDD; + border-radius: 5px; + padding: 10px; +} + +/*# sourceMappingURL=custom.css.map */ diff --git a/public/admin/css/custom.css.map b/public/admin/css/custom.css.map new file mode 100644 index 0000000..bccd816 --- /dev/null +++ b/public/admin/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/general.scss","../node_modules/bootstrap/scss/mixins/_background-variant.scss","../node_modules/bootstrap/scss/mixins/_hover.scss","../node_modules/bootstrap/scss/mixins/_alert.scss","../node_modules/bootstrap/scss/mixins/_gradients.scss","../node_modules/bootstrap/scss/mixins/_buttons.scss","../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../node_modules/admin-lte/build/scss/mixins/_sidebar.scss","../scss/variables.scss","../node_modules/admin-lte/build/scss/mixins/_accent.scss","../node_modules/bootstrap/scss/_variables.scss","../node_modules/admin-lte/build/scss/_variables.scss","../scss/accent.scss","../node_modules/admin-lte/build/scss/mixins/_backgrounds.scss","../scss/navbar.scss","../node_modules/admin-lte/build/scss/mixins/_navbar.scss","../node_modules/admin-lte/build/scss/mixins/_cards.scss","../scss/cards.scss","../scss/table.scss","../scss/modal_e_tabs.scss","../scss/forms.scss","../scss/select2.scss","../scss/sw-icons.scss","../scss/listPage.scss","../scss/loginPage.scss","../scss/settingsPage.scss"],"names":[],"mappings":"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AKE;EACA;;AAGF;AAAA;EACE;;AAGF;AAAA;AAAA;AAAA;EAEE;EACA;;;ACrEN;EACE;;AAQI;EACE;EACA,YTjBM;;AS0BN;EACE;EACA;EACA;;AAKN;EACE;;AAOJ;EACE;;;AAMN;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AC5FF;EACE;;;AAGF;EACE;;;AASF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EAEE;EAEA;EACA;;AAGE;AAEE;AAAA;AAAA;AAAA;AAAA;;AAMA;EACE;EACA;EACA;;AAMN;EACE;EACA;;;AAKJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AZhDE;EYqDF;IACE;IACA;IACA;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;;;AAMN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAKF;EACE;EACA;;AAGF;EACE;;AAEA;EACE;;;AAMJ;EACE;;AAKA;EACE;EACA;;;AAKN;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;ACjNF;EACE;;;AAGF;EAEE;EACA;;;AAGF;AAEA;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;AAEA;EACE;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;AACA;EACE;;;AAIF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;AAEA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAEA;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AASF;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAIA;EACE;EACA;EACA;EACA;EACA;;;AAIJ;EACE;;;AAIA;EACE;;AAGF;EACE;;;AAIJ;EACE;;;AASE;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAEA;EACE;;AAIF;EACE;EACA;;;AAMN;AAEA;EACE;EACA;EACA;;;AAGF;AAGE;EAEE;;AAEA;EACE;;AAGF;EACE,cZ5JU;;AY6JV;EACE,OZ9JQ;;AYkKZ;EACE;;;ACnKJ;EACE;;;AAIJ;EACE,kBbNc;EaOd,cbPc;;;AaUhB;EACE,kBbXc;;;AcDhB;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE,kBdTc;EcUd;EACA;;;ACZF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AjBiBA;EiBTA;IACE;;EAGF;IACE;;EAEA;IACE;;;EAMN;IACE;;;EAGF;IACE;IACA;;EAEA;IACE;;EAGF;IACE;;;AC7EJ;EACE;EACA;EACA;EACA;EACA;;;AAIJ;EACE;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;;;ACrBF;AAIE;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAMN;EACE;EACA;EACA","file":"custom.css"} \ No newline at end of file diff --git a/public/admin/css/custom.min.css b/public/admin/css/custom.min.css new file mode 100644 index 0000000..fb4950e --- /dev/null +++ b/public/admin/css/custom.min.css @@ -0,0 +1 @@ +body{font-size:15px}.form-control{font-size:.95rem}.text-sm .navbar{font-size:16px !important;height:50px;border-bottom:0}.text-sm .btn-group .btn{font-size:1rem !important}.text-sm .brand-link{font-size:1rem}.bg-brand{background-color:#007bff !important}a.bg-brand:hover,a.bg-brand:focus,button.bg-brand:hover,button.bg-brand:focus{background-color:#0062cc !important}.alert-brand{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-brand hr{border-top-color:#9fcdff}.alert-brand .alert-link{color:#002752}.btn-brand{color:#fff;background-color:#007bff;border-color:#007bff}.btn-brand:hover{color:#fff;background-color:#0062cc;border-color:#1a88ff}.btn-brand:focus,.btn-brand.focus{color:#fff;background-color:#0062cc;border-color:#1a88ff;box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-brand.disabled,.btn-brand:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-brand:not(:disabled):not(.disabled):active,.btn-brand:not(:disabled):not(.disabled).active,.show>.btn-brand.dropdown-toggle{color:#fff;background-color:#3395ff;border-color:#003166}.btn-brand:not(:disabled):not(.disabled):active:focus,.btn-brand:not(:disabled):not(.disabled).active:focus,.show>.btn-brand.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.m0,.no-margin{margin:0 !important}.mr-0{margin-right:0 !important}.ml-0{margin-left:0 !important}.mt-0{margin-top:0 !important}.mb-0{margin-bottom:0 !important}.m-5{margin:5px !important}.mr-5{margin-right:5px !important}.ml-5{margin-left:5px !important}.mt-5{margin-top:5px !important}.mb-5{margin-bottom:5px !important}.m-10{margin:10px !important}.mr-10{margin-right:10px !important}.ml-10{margin-left:10px !important}.mt-10{margin-top:10px !important}.mb-10{margin-bottom:10px !important}.m-15{margin:15px !important}.mr-15{margin-right:15px !important}.ml-15{margin-left:15px !important}.mt-15{margin-top:15px !important}.mb-15{margin-bottom:15px !important}.m-20{margin:20px !important}.mr-20{margin-right:20px !important}.ml-20{margin-left:20px !important}.mt-20{margin-top:20px !important}.mb-20{margin-bottom:20px !important}.pd0,.no-padding{padding:0 !important}.pd-0{padding:0 !important}.pdr-0{padding-right:0 !important}.pdl-0{padding-left:0 !important}.pdt-0{padding-top:0 !important}.pdb-0{padding-bottom:0 !important}.pd-5{padding:5px !important}.pdr-5{padding-right:5px !important}.pdl-5{padding-left:5px !important}.pdt-5{padding-top:5px !important}.pdb-5{padding-bottom:5px !important}.pd-10{padding:10px !important}.pdr-10{padding-right:10px !important}.pdl-10{padding-left:10px !important}.pdt-10{padding-top:10px !important}.pdb-10{padding-bottom:10px !important}.pd-15{padding:15px !important}.pdr-15{padding-right:15px !important}.pdl-15{padding-left:15px !important}.pdt-15{padding-top:15px !important}.pdb-15{padding-bottom:15px !important}.pd-20{padding:20px !important}.pdr-20{padding-right:20px !important}.pdl-20{padding-left:20px !important}.pdt-20{padding-top:20px !important}.pdb-20{padding-bottom:20px !important}.no-border-top{border-top:0}.no-padding-right{padding-right:0}.no-padding-left{padding-left:0}.no-padding-left>input{border-left:0}.center-block{display:block;margin-left:auto;margin-right:auto}@media(min-width:767px){.no-border-right-sm{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.no-border-top-sm{border-top:0}.no-border-r-l-sm{border-radius:0}.no-padding-l-sm{padding-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.no-padding-l-sm input{border-top-left-radius:0;border-bottom-left-radius:0}.no-padding-r-sm{padding-right:0}.no-padding-r-sm input{border-top-right-radius:0;border-bottom-right-radius:0}.no-padding-r-l-sm{padding-right:0;padding-left:0}.no-padding-r-l-sm input{border-radius:0}}.filtratiLabel{font-size:13px;padding-right:10px;vertical-align:bottom;margin-top:19px;display:block}hr.white{border-top:1px solid #FFF}hr.dark{border-top:1px solid #333}hr.light{border-top:1px solid #DDD}.border-top-white{border-top:1px solid #FFF;border-top-right-radius:0;border-top-left-radius:0}.border-bottom-white{border-bottom:1px solid #FFF}.border-right-white{border-right:1px solid #FFF;border-top-right-radius:0;border-bottom-right-radius:0}.border-left-white{border-left:1px solid #FFF;border-top-left-radius:0;border-bottom-left-radius:0}.sidebar-menu li.divider-md{border-top:3px solid #1a2226}.note-editor.note-frame{border-radius:0 !important}.logo-img{position:absolute;top:0;right:15px;max-height:100px}.btn>.badge{position:absolute;top:-6px;right:-4px;font-size:10px;font-weight:400;z-index:100}.main-footer{padding:10px 15px}section.content.list{padding:12px 0 0 0}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888}::-webkit-scrollbar-thumb:hover{background:#555}@media(max-width:575.98px){.content-wrapper,.main-sidebar{padding-top:50px !important}.box-footer{padding:8px 3px !important}section.content.list{padding:0}section.content-header{padding:10px 15px 8px}}.dropdown-menu{z-index:1100 !important;font-size:.9rem;padding:5px 0}.content-header>.breadcrumb.top0{top:0}.sidebar-dark-brand .nav-sidebar>.nav-item>.nav-link.active{background-color:#007bff;color:#fff}.sidebar-dark-brand .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#007bff}.accent-brand .btn-link,.accent-brand a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#007bff}.accent-brand .btn-link:hover,.accent-brand a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0056b3}.accent-brand .dropdown-item:active,.accent-brand .dropdown-item.active{background:#007bff;color:#fff}.accent-brand .custom-control-input:checked ~ .custom-control-label::before{background:#007bff;border-color:#004a99}.accent-brand .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,")}.accent-brand .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid),.accent-brand .custom-select:focus,.accent-brand .custom-control-input:focus:not(:checked) ~ .custom-control-label::before,.accent-brand .custom-file-input:focus ~ .custom-file-label{border-color:#80bdff}.accent-brand .page-item .page-link{color:#007bff}.accent-brand .page-item.active a,.accent-brand .page-item.active .page-link{background-color:#007bff;border-color:#007bff;color:#fff}.accent-brand .page-item.disabled a,.accent-brand .page-item.disabled .page-link{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-brand [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-brand [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-brand [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-brand [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}[class*=accent-] a.btn-brand{color:#fff}.bg-brand{background-color:#007bff !important}.bg-brand,.bg-brand>a{color:#fff !important}.bg-brand.btn:hover{border-color:#0062cc;color:#ececec}.bg-brand.btn:not(:disabled):not(.disabled):active,.bg-brand.btn:not(:disabled):not(.disabled).active,.bg-brand.btn:active,.bg-brand.btn.active{background-color:#0062cc !important;border-color:#005cbf;color:#fff}.navbar-dark-brand{background-color:#007bff}.navbar-dark-brand .nav>li>a{color:rgba(255,255,255,0.8)}.navbar-dark-brand .nav>li>a:hover,.navbar-dark-brand .nav>li>a:active,.navbar-dark-brand .nav>li>a:focus,.navbar-dark-brand .nav .open>a,.navbar-dark-brand .nav .open>a:hover,.navbar-dark-brand .nav .open>a:focus,.navbar-dark-brand .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.navbar-dark-brand .sidebar-toggle{color:rgba(255,255,255,0.8)}.navbar-dark-brand .sidebar-toggle:hover,.navbar-dark-brand .sidebar-toggle:focus{background:rgba(0,0,0,0.1);color:#f6f6f6}.nav-item.dev-block{margin-top:6px !important}.card-brand:not(.card-outline)>.card-header{background-color:#007bff}.card-brand:not(.card-outline)>.card-header,.card-brand:not(.card-outline)>.card-header a{color:#fff}.card-brand:not(.card-outline)>.card-header a.active{color:#212529}.card-brand.card-outline{border-top:3px solid #007bff}.card-brand.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-brand.card-outline-tabs>.card-header a.active{border-top:3px solid #007bff}.bg-brand .btn-tool,.bg-gradient-brand .btn-tool,.card-brand:not(.card-outline) .btn-tool{color:rgba(255,255,255,0.8)}.bg-brand .btn-tool:hover,.bg-gradient-brand .btn-tool:hover,.card-brand:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-brand .bootstrap-datetimepicker-widget .table td,.card.bg-brand .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-brand .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-brand .bootstrap-datetimepicker-widget .table th{border:0}.card.bg-brand .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-brand .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-brand .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-brand .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-brand .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.second:hover{background:#0067d6;color:#fff}.card.bg-brand .bootstrap-datetimepicker-widget table td.today::before,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.today::before{border-bottom-color:#fff}.card.bg-brand .bootstrap-datetimepicker-widget table td.active,.card.bg-brand .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-brand .bootstrap-datetimepicker-widget table td.active:hover{background:#3395ff;color:#fff}.card-brand.card-outline-tabs,.card-brand.card-outline{border-top:0 !important}.card-brand.card-outline .card-header .nav-link.active{color:#fff !important;background:#007bff}.card-brand.card-outline.card-outline-tabs .card-header .nav-link.active{color:inherit !important;background:whitesmoke;border-bottom-color:whitesmoke}.card-brand.card-outline.card-outline-tabs .card-body{background-color:whitesmoke}.card-brand .card-header .nav-link{color:#007bff !important}.accordion-card{box-shadow:none;border:1px solid #DDD;border-radius:4px}.accordion-card.no-border{border:0}.accordion-card.no-border-radius{border-radius:0}.delivery-card .card-header{padding:8px 4px}.delivery-card .prodoti-list-item{font-size:13px;color:#333}.delivery-card .riepilogo-list-item{font-size:14px;color:#333}.delivery-card .totale-ordine{margin-top:5px;font-weight:bold}.delivery-card .metodo-pagamento{color:#333}.position-card{margin-bottom:0;border-top:1px solid #DDD}.table-border{border:1px solid #ddd}th[data-ord]{cursor:pointer}.content.list{padding:0}.box-header{margin-bottom:8px;margin-right:8px;margin-left:8px}.floatThead-container{overflow-x:inherit !important}.table-border.flot-header{font-size:.95rem;border-left:0;border-right:0}.table-border.flot-header tbody tr td{border-top:1px solid #DDD;vertical-align:middle;padding:5px}.table-border.flot-header th{background-color:#FFF;border-bottom:1px solid #DDD}.table-wrapper{height:729px;transition:height ease .7s}.table-responsive{padding:0}.table-border td,.table-border th{border-bottom:1px solid #ddd}table.table-popover{font-size:12px}table{margin-bottom:0 !important}.table>thead>tr>th{border-bottom:none !important}.popover.popover-default-variables{border-radius:0;font-family:"Helvetica Neue Light","HelveticaNeue-Light","Helvetica Neue",Calibri,Helvetica,Arial,sans-serif}td.no-rows{color:#6c757d !important;height:729px;vertical-align:middle !important;font-size:1.1em;text-transform:uppercase;text-align:center;border:none !important}td.no-rows>i{display:block;font-size:3em;color:#6c757d !important}.ui-dialog{z-index:2000 !important}@media(min-width:768px){.table-responsive{border:0;overflow-y:scroll;margin:0}}.table-wrapper-2,.table-wrapper-3{height:200px;overflow-y:scroll;background:whitesmoke}.table-wrapper-2 td.no-rows,.table-wrapper-3 td.no-rows{height:152px !important}.table-wrapper-2 td.no-rows>i,.table-wrapper-3 td.no-rows>i{font-size:2em !important}.table-tickets{border-top:1px solid #EEE !important;border-bottom:1px solid #EEE !important;border-left:none !important;border-right:none !important}.table-tickets td{vertical-align:middle !important;padding:6px !important}.floatThead-table thead>tr>th{background:#FFF;z-index:1001;padding-left:6px !important;padding-right:6px !important}.table-righe{border-top:1px solid #EEE !important;border-bottom:1px solid #EEE !important;border-left:none !important;border-right:none !important}.table-righe td{vertical-align:middle !important;padding:6px !important}table.sottoaree-table th{border-top:0;box-shadow:none !important}table.sottoaree-table td.no-rows{height:303px !important}table.sottoaree-table td.no-rows>i{font-size:2em !important}.modal-with-tabs .modal-header{border-bottom:0}.modal-with-tabs .modal-body .card{box-shadow:none;border-radius:0}.modal.modal-second-level{z-index:2070 !important;overflow:auto}body.modal-second .modal-backdrop{z-index:2069 !important}body.modal-second,body.modal-third{overflow-y:hidden !important}.box-border{border:1px solid #DDD}.box-footer{padding:8px 10px;border-top:1px solid #DDD}.modal-dialog>.overlay,.modal-dialog>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.modal-dialog .overlay{z-index:1010;background:rgba(255,255,255,0.7);border-radius:3px}.modal-dialog .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.modal-dialog .overlay.dark{background:rgba(0,0,0,0.5)}.modal-body{background-color:whitesmoke}.modal-body .label{text-align:right;margin-right:3px}.table-border{border:1px solid #ddd}.table-border th{font-weight:500}.table-border td,.table-border th{border-bottom:1px solid #ddd}.nav-tabs a.disabled{color:#ddd}.modal.modal-second-level{z-index:2070 !important;overflow:auto}body.modal-second,body.modal-third{overflow-y:hidden !important}body.modal-second .modal-backdrop{z-index:2069 !important}.form-box-container{border:1px solid #ddd;margin:10px 0;padding:15px}.note-editable{min-height:426px}.datepicker{z-index:1151 !important}.image-preview-input{background-color:#fff;border-color:#ccc;color:#333;margin:0;overflow:hidden;position:relative}.image-preview-input input[type=file]{cursor:pointer;font-size:20px;margin:0;opacity:0;padding:0;position:absolute;right:0;top:0}.image_preview_block_container .logo{padding:10px;max-height:149px}.image_preview_block_container .banner{padding:10px;max-height:200px}.image-preview-clear-btn{margin:0}input.form-control:focus,select.form-control:focus{border:1px solid #3c8dbc}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border:1px solid #dd4b39;box-shadow:none !important}.form-error>span{color:#dd4b39 !important}.form-group .label-danger{background:none repeat scroll 0 0 rgba(0,0,0,0) !important;color:#dd4b39 !important;text-align:right !important;overflow:hidden;font-size:12px}[elastic]{min-height:37px}textarea.resize-vertical{resize:vertical}textarea.resize-horizontal{resize:horizontal}#modalForm label{font-weight:normal}.compact-form.no-border-radius input,.compact-form.no-border-radius select,.compact-form.no-border-radius textarea{border-radius:0}.compact-form .label-danger{text-align:right}.compact-form label{font-size:.95rem;margin-top:7px;font-weight:normal !important}.compact-form .form-group{margin-bottom:5px}.compact-form .form-group .form-control{box-shadow:none !important}.compact-form .form-group .has-error .form-control{box-shadow:none !important;border:1px solid #dd4b39}.panel.note-editor{border-radius:0;border:1px solid #DDD;box-shadow:none}.btn-radiobox .btn-app{text-transform:uppercase}.btn-radiobox .btn-app:first-child{margin-left:0}.btn-radiobox .btn-app.active{border-color:#007bff}.btn-radiobox .btn-app.active i{color:#007bff}.btn-radiobox .btn-app input{display:none}.select2-fullwidth .select2-container{min-width:100%}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#007bff;border-color:#007bff}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[aria-selected]:hover{background-color:#007bff}.sw-icon-font-picker{width:28px;padding:4px}.fip-box .sw-icon-font-picker,.icons-selector .selected-icon .sw-icon-font-picker{padding:6px 4px}.icons-selector.fip-bootstrap span.current-icon,.icons-selector.fip-bootstrap span.current-icon:hover{background-color:#007bff;color:#fff;border:1px solid #007bff}.breadcrumb{font-size:14px}.dropdown-multifunction-down{margin-top:5px}.pagination{margin-top:5px;margin-left:5px;margin-bottom:0;font-size:14px;font-weight:normal !important;vertical-align:middle}.pagination .text-counter{margin-top:5px}.box-footer{background:#fff;padding:4px 3px !important}.note-editor{box-shadow:none}.bootstrap-modal-selector{overflow-y:scroll}.pagination-counter{font-size:14px}.pagination-counter label{margin-right:5px;font-weight:normal !important}.pagination-counter input.form-control{border-radius:.2rem}@media(min-width:768px){.box-title.search-left{width:65%}.box-title.search-right{width:35%}.box-title.search-right>*{float:right}#orderSelect{max-width:150px}.pagination-counter{max-width:150px;margin-top:5px}.pagination-counter label{padding-top:5px}.pagination-counter>.form-group{margin-bottom:0}}.login-logo img{display:block;margin-left:auto;margin-right:auto;max-height:150px;max-width:250px}.login-card-body{border-radius:5px}.login-card-body .icheck-primary{margin-top:7px}.footer-login{margin-top:10px;text-align:center;font-size:.9em}#settings-tab .panel-body{border-top:0;border-right:1px solid #DDD;border-left:1px solid #DDD;border-bottom:1px solid #DDD}#settings-tab .panel-body .well{box-shadow:none}.well{border:1px solid #DDD;border-radius:5px;padding:10px} \ No newline at end of file diff --git a/public/admin/img/admin.png b/public/admin/img/admin.png new file mode 100644 index 0000000..bd9a186 Binary files /dev/null and b/public/admin/img/admin.png differ diff --git a/public/admin/img/admin.svg b/public/admin/img/admin.svg new file mode 100644 index 0000000..f07f4ef --- /dev/null +++ b/public/admin/img/admin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/admin/img/icons.svg b/public/admin/img/icons.svg new file mode 100644 index 0000000..cc8298a --- /dev/null +++ b/public/admin/img/icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/admin/img/user.svg b/public/admin/img/user.svg new file mode 100644 index 0000000..977c621 --- /dev/null +++ b/public/admin/img/user.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/admin/js/angularjs/angularGlobalFunctions.js b/public/admin/js/angularjs/angularGlobalFunctions.js new file mode 100644 index 0000000..b62d837 --- /dev/null +++ b/public/admin/js/angularjs/angularGlobalFunctions.js @@ -0,0 +1,67 @@ +Number.prototype.toFixedDown = function (digits) { + var re = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)"); + var m = this.toString().match(re); + return m ? parseFloat(m[1]) : this.valueOf(); +}; + +Number.prototype.truncate = function (digits) { + var num = this.valueOf().toFixedDown(digits); + num = num.toString(); + var intero = String(num.split('.')[0]); + var fraction = String(num.split('.')[1]); + var padding = ''; + if (isNaN(intero)) return ''; + + if (fraction == 'undefined') { + fraction = ''; + padding = new Array(Math.max(digits - fraction.length, 0) + 1).join('0'); + if (digits > 0) { + num += '.' + padding; + } + } else { + padding = new Array(Math.max(digits - fraction.length, 0) + 1).join('0'); + num += padding; + } + return num; +}; + +//funzione per l'arrotondamento delle cifre decimali in eccesso dal 5 +Number.prototype.toFixedExcess = function(precision){ + precision = (parseInt(precision) == 0) ? 0:(parseInt(precision) || 2); + var num = this.valueOf(); + var pow = Math.pow(10,precision); + return (Math.round( num * pow ) / pow).toFixed(precision); +}; + +//Funzione per arrotondare correttamente i numeri in modo da correggere l'errore delle somme e differenze +function myParseFloat(number){ + //console.log("MyParseFloat-Old: "+number); + var newnumber = new Number(number+'').toFixed(12); + //console.log("MyParseFloat-New: "+newnumber); + return parseFloat(newnumber); +} + +//Funzione che implementa il pad left di una stringa +Number.prototype.padLeft = function (n,str) { + return (this < 0 ? '-' : '') + + Array(n-String(Math.abs(this)).length+1) + .join(str||'0') + + (Math.abs(this)); +}; + +const checkIfAddressIsInArea = (location, area) => { + if (google.maps.geometry.poly.containsLocation(location, area)){ + return true; + } else { + return false; + } +} + +const checkIfAddressIsInAreaLatLon = (lat, lon) => { + const location = new google.maps.LatLng(lat, lon); + if (google.maps.geometry.poly.containsLocation(location, area)){ + return true; + } else { + return false; + } +} diff --git a/public/admin/js/angularjs/app.js b/public/admin/js/angularjs/app.js new file mode 100644 index 0000000..28c2c0a --- /dev/null +++ b/public/admin/js/angularjs/app.js @@ -0,0 +1,1000 @@ +'use strict'; + +var basePath = `${BASE_URL_SITE}/v1/`; +var INTEGER_REGEXP = /^\-?\d+$/; +var PIVA_REGEXP = /^\d{11,11}$/; +var bootstrapDatepickerConfig = { + format: "dd/mm/yyyy", + todayBtn: "linked", + language: "it", + autoclose: true, + orientation: 'auto bottom', + startDate: '01-01-1900', + endDate: '31-12-9999' +}; + +var app = angular.module('app', ['ngResource', 'ngStorage', 'ngAnimate', 'ui.bootstrap', 'toaster', 'angularMoment','chart.js','daterangepicker']) + + .config(($sessionStorageProvider) => { + $sessionStorageProvider.setKeyPrefix('movedelivery_'); + }) + + .run(($rootScope, $http, $locale, amMoment, $sessionStorage, AuthService) => { + amMoment.changeLocale('it'); + + const token = $('body').attr('data-token'); + $sessionStorage.token = token; + $http.defaults.headers.common['Authorization'] = `Basic ${token}`; + + //Inizializzo i dati per cui l'utente è authenticato lato server + AuthService.Load(); + }) + + //services + .factory('AuthService', ($sessionStorage, $rootScope, Users, toaster) => { + const service = {}; + + service.Load = () => { + Users.getUserData().then((result) => { + service.setUserData(result.data); + }).catch((err) => { + toaster.error("Errore", "Non è stato possibile recuperare l'utente, conttatare l'amministrazione!") + }); + }; + + service.setUserData = function (user) { + $rootScope.authUser = user; + $sessionStorage.authUser = user; + }; + + service.getUserData = function () { + return $sessionStorage.authUser; + }; + + service.getInfo = function (param) { + return $sessionStorage.authUser[param]; + }; + + return service; + }) + .factory('socket', ($rootScope) => { + // const wsUrl = 'http://localhost:3000'; + const wsUrl = 'https://wsdev.movedelivery.it'; + const token = 'Secret a5addff3637fd153b1301b84f1c768a0'; + + let socket = io.connect(wsUrl, { + transportOptions: { + polling: { + extraHeaders: { + Authorization: token, + }, + }, + }, + }); + + return { + connection: function (callback) { + socket.on('connect', () => { + $rootScope.$apply(function () { + callback(socket.id); + }); + }); + }, + on: function (eventName, callback) { + socket.on(eventName, function () { + let args = arguments; + $rootScope.$apply(function () { + callback.apply(socket, args); + }); + }); + }, + emit: function (eventName, data, callback) { + socket.emit(eventName, data, function () { + let args = arguments; + $rootScope.$apply(function () { + if (callback) { + callback.apply(socket, args); + } + }); + }); + }, + }; + }) + + //Filters + .filter("isNumeric", function () { + return function (value) { + if (value == null || value == 'null' || value == '' || !angular.isDefined(value)) return false; + return (!isNaN(parseFloat(value)) && isFinite(value)); + }; + }) + .filter('getById', function () { + return function (input, id) { + var i = 0, len = input.length; + for (; i < len; i++) { + if (+input[i].id == +id) { + return input[i]; + } + } + return null; + } + }) + .filter('getBooleanValueOfCheck', function () { + return function (input) { + return input === '1' || input === true || input === 1; + } + }) + .filter('getElementByKeyValue', function () { + return function (elenco, chiaveDaCercare, valoraDaCercare) { + if (elenco == undefined) + return null; + + if (valoraDaCercare == null) return null; + + var value = null; + angular.forEach(elenco, function (val) { + if (val[chiaveDaCercare].toLowerCase() == valoraDaCercare.toLowerCase()) { + value = val; + } + }); + return value; + } + }) + .filter('sanitize', function ($sce) { + return function (htmlCode) { + return $sce.trustAsHtml(htmlCode); + } + }) + .filter("formattaInPrezzoUnitario", function ($filter) { + return function (value, valuta) { + value = String(value).replace(',', '.').replace(/[^\d.-]/g, ''); + var num = $filter('number')(value, 2); + if (valuta) + return num + " €"; + else + return num; + }; + }) + .filter('AddressEncode', function () { + return function (comune, cap, provincia) { + var str = ''; + if (cap) + str += cap; + if (cap && comune) + str += " - " + comune; + else if (cap) + str += comune; + if (provincia) + str += ' (' + provincia + ')'; + + return str; + } + }) + .filter('contaElementiOggetto', function () { + return function (input) { + if (!angular.isDefined(input)) + return 0; + + var i = 0; + angular.forEach(input, function (val) { + if (angular.isDefined(val) && val != '') + i++; + }); + return i; + } + }) + .filter("slashDataNoTime", function () { + return function (data) { + if (!angular.isDefined(data) || data == null) return; + data = data.split("-"); + data.reverse(); + return data.join("/"); + } + }) + .filter("unslashDataNoTime", function () { + return function (data) { + if (!angular.isDefined(data) || data == null) return; + data = data.split("/"); + data.reverse(); + return data.join("-"); + } + }) + .filter("slashDataWithTime", function () { + return function (data, withtime) { + withtime = (withtime === undefined) ? true : withtime; + if (!angular.isDefined(data) || data == null) return; + data = data.split(' '); + let time = data[1]; + data = data[0].split("-"); + data.reverse(); + if (withtime) + return data.join("/") + " " + time; + else + return data.join("/"); + } + }) + .filter("DataIsoFormat", function (moment) { + return function (data, formatString) { + if (angular.isUndefined(data)) return; + + formatString = formatString || 'DD/MM/YYYY'; + return moment(data).format(formatString); + } + }) + .filter("getTipoOperazione", function () { + return function (data) { + if (!angular.isDefined(data) || data == null) return ''; + switch (data) { + case 'NEW': + return 'Nuova Attivazione'; + case 'RINNOVO': + return 'Rinnovo Licenza'; + case 'CAMBIOVERSIONE': + return 'Cambio Versione Licenza'; + } + } + }) + .filter('cleanZero', function ($filter) { + return function (val) { + if (val === undefined) return; + if (!$filter('isNumeric')(parseFloat(val.replace(',', '.'))) || parseFloat(val.replace(',', '.')) == '0') + return ''; + else + return val; + } + }) + + //Factory + .factory('focus', function ($timeout, $window) { + return function (id, selectText) { + selectText = (angular.isDefined(selectText)) ? selectText : false; + $timeout(function () { + let element = $window.document.getElementById(id); + if (element) { + element.focus(); + if (selectText) { + element.select(); + } + } + }); + }; + }) + + //Directive + .directive('cleanZeroValue', function () { + return { + require: 'ngModel', + link: function (scope, element, attrs, ngModelCtrl) { + const value = parseFloat(ngModelCtrl.modelValue); + if (value === 0) { + ngModelCtrl.$setViewValue(''); + ngModelCtrl.$render(); + } + } + } + }) + .directive('integer', function () { + return { + require: 'ngModel', + link: function (scope, elm, attrs, ctrl) { + ctrl.$validators.integer = function (modelValue, viewValue) { + if (ctrl.$isEmpty(modelValue)) { + return true; + } + + if (!INTEGER_REGEXP.test(viewValue)) { + return false; + } + + // it is invalid + return true; + }; + } + }; + }) + .directive('limitInput', function () { + return { + require: 'ngModel', + link: function (scope, elem, attrs) { + var limit = parseInt(attrs.limitInput); + angular.element(elem).on("keypress", function (e) { + if (e.charCode >= 39 && e.charCode <= 249) { //il controllo viene effettuato solo sui caratteri stampabili + if (this.value.length >= limit) e.preventDefault(); + } + }); + } + }; + }) + .directive('partitaiva', function () { + return { + require: 'ngModel', + link: function (scope, elm, attrs, ctrl) { + ctrl.$validators.partitaiva = function (modelValue, viewValue) { + let isValid = true; + + if (ctrl.$isEmpty(modelValue)) { + return true; + } + + if (!PIVA_REGEXP.test(viewValue)) { + return false; + } + + let s = 0; + for (let i = 0; i <= 9; i += 2) + s += ord(viewValue[i]) - ord('0'); + + for (let i = 1; i <= 9; i += 2) { + let c = 2 * (ord(viewValue[i]) - ord('0')); + if (c > 9) + c = c - 9; + s += c; + } + + if ((10 - s % 10) % 10 !== ord(viewValue[10]) - ord('0')) { + isValid = false; + } + + return isValid; + }; + } + }; + + function ord(string) { + let str = string + '', + code = str.charCodeAt(0); + if (0xD800 <= code && code <= 0xDBFF) { + let hi = code; + if (str.length === 1) { + return code; + } + let low = str.charCodeAt(1); + return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; + } + if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate + return code; + } + return code; + } + }) + .directive('checkPiva', function (Licenze) { + return { + require: 'ngModel', + scope: {idLicenza: '=', ngModel: '&'}, + link: function (scope, elm, attrs, ctrl) { + ctrl.$validators.checkPiva = function (modelValue, viewValue) { + let isValid = true; + + const validFormat = ctrl.$validators.partitaiva(modelValue, viewValue); + if (modelValue && (ctrl.$isEmpty(modelValue) || (modelValue + '').length !== 11 || !validFormat)) { + return true; + } + + if (!scope.idLicenza && (modelValue + '').length === 11) { + Licenze.checkEsistenzaPiva(modelValue).then((res) => { + isValid = !res.isActive; + ctrl.$setValidity('checkPiva', isValid); + console.log('res set Valitidity', res); + }).catch(() => isValid = true); + } + + return isValid; + }; + } + }; + }) + .directive('identical', function () { + return { + require: "ngModel", + scope: { + otherModelValue: "=identical" + }, + link: function (scope, element, attributes, ngModel) { + + ngModel.$validators.identical = function (modelValue) { + return modelValue == scope.otherModelValue; + }; + + scope.$watch("otherModelValue", function () { + ngModel.$validate(); + }); + } + }; + }) + .directive('icheck', function icheck($timeout, $parse) { + return { + restrict: 'A', + require: 'ngModel', + link: function ($scope, element, $attrs) { + return $timeout(function () { + + let form = null; + const ngModelGetter = $parse($attrs['ngModel']); + // let value = $parse($attrs['ngModel'])($scope); + + //Controlli per settare il form collegato come dirty quando cambia il valore + if (angular.isDefined($attrs.form)) + form = $parse($attrs['form'])($scope); + + $(element).iCheck({ + checkboxClass: 'icheckbox_square-blue', + radioClass: 'iradio_square-blue' + }).on('ifChanged', function (event) { + if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) { + $scope.$apply(function () { + return ngModelGetter.assign($scope, (event.target.checked) ? 1 : 0); + }); + } + }).on('ifClicked', function (event) { + //Gestisco l'attributo ngClick se presente chiamo la funzione associata + if (angular.isDefined($attrs.ngClick)) { + var clickFunction = $parse($attrs['ngClick'])($scope); + if (angular.isDefined(clickFunction)) + $timeout(function () { + $scope.$apply(function () { + clickFunction(); + }); + }); + } + if (form != null) form.$setDirty(true); + }); + + $scope.$watch($attrs['ngModel'], function (value) { + $timeout(function () { + if (!value || value == '0') { + $(element).iCheck('uncheck'); + } else { + $(element).iCheck('check'); + } + }); + }); + + }); + } + }; + }) + .directive('onEnterKey', function onEnterKey() { + return function (scope, element, attrs) { + element.bind("keydown keypress", function (event) { + if (event.which === 13) { + scope.$apply(function () { + scope.$eval(attrs.onEnterKey); + }); + event.preventDefault(); + } + }); + }; + }) + .directive('numbersOnly', function () { + return { + require: 'ngModel', + link: function (scope, element, attrs, modelCtrl) { + modelCtrl.$parsers.push(function (inputValue) { + if (inputValue == undefined) return ''; + var transformedInput = inputValue.replace(/[^0-9]/g, ''); + if (transformedInput !== inputValue) { + modelCtrl.$setViewValue(transformedInput); + modelCtrl.$render(); + } + return transformedInput; + }); + } + }; + }) + .directive('quantityInput', function () { + return { + restrict: 'EA', + require: ['ngModel'], + replace: true, + template: ` +
+ +
+
+
+
-
+
+
`, + scope: { + quantita: "=ngModel", + step: "=", + min: "=", + max: "=", + onClickBtn: "=", + disabled: '=ngDisabled' + }, + link: function (scope, element, attrs, modelCtrl) { + + var input = element.find('input[type="number"]'); + + var btnUp = element.find('.quantity-up'), + btnDown = element.find('.quantity-down'), + min = scope.min || 1, + max = scope.max || undefined, + step = scope.step || 1; + + btnUp.click(function () { + if (scope.disabled) return; + var oldValue = parseFloat(scope.quantita); + if (oldValue >= max) { + var newVal = oldValue; + } else { + var newVal = oldValue + step; + } + element.find("input").val(newVal); + element.find("input").trigger("change"); + if (oldValue != newVal) + scope.onClickBtn(scope.quantita); + }); + + btnDown.click(function () { + if (scope.disabled) return; + var oldValue = parseFloat(input.val()); + if (oldValue <= min) { + var newVal = oldValue; + } else { + var newVal = oldValue - step; + } + element.find("input").val(newVal); + element.find("input").trigger("change"); + if (oldValue != newVal) + scope.onClickBtn(scope.quantita); + }); + + } + }; + }) + .directive("moveNextOnMaxlength", function () { + return { + restrict: "A", + link: function ($scope, element) { + var $nextElement; + + if (angular.isDefined(element.attr("next-element"))) { + $nextElement = $('#' + element.attr("next-element"))[0]; + } else { + $nextElement = element.next(); + } + + element.on("input", function (e) { + if (element.val().length === parseInt(element.attr("maxlength"))) { + if (angular.isDefined($nextElement)) { + $nextElement.focus(); + } + } + }); + } + } + }) + .directive('bootstrapDatepicker', function bootstrapDatepicker($parse) { + return { + require: '?ngModel', + restrict: 'A', + link: function ($scope, element, attrs, controller) { + var updateModel, form = null; + updateModel = function (ev) { + //element.datepicker('hide'); + //element.blur(); + return $scope.$apply(function () { + return controller.$setViewValue(ev.date); + }); + }; + + //Controlli per settare il form collegato come dirty quando cambia il valore + if (angular.isDefined(attrs.form)) + form = $parse(attrs['form'])($scope); + + if (controller != null) { + controller.$render = function () { + element.datepicker(bootstrapDatepickerConfig); + element.datepicker('update', controller.$viewValue); + element.datepicker('setValue'); + element.datepicker('update'); + return controller.$viewValue; + }; + } + + return attrs.$observe('bootstrapDatepicker', function (value) { + var options; + options = angular.copy(bootstrapDatepickerConfig); + if (angular.isObject(value)) { + options = value; + } + if (typeof (value) === "string" && value.length > 0) { + options = angular.fromJson(value); + } + if (angular.isDefined(attrs.dateOrientation)) { + options.orientation = attrs.dateOrientation; + } + return element.datepicker(options).on('changeDate', + function () { + updateModel; + if (form != null) form.$setDirty(true); + }); + }); + } + }; + }) + .directive('inputNumber', function ($locale) { + // Usage: + // + // Creates: + // + var directive = { + link: link, + require: 'ngModel', + restrict: 'A' + }; + return directive; + + + function link(scope, el, attrs, ngModelCtrl) { + el.addClass('text-right'); + if (angular.isDefined(attrs.noCleanzero)) { + var cleanzero = false; + } else { + var cleanzero = true; + } + + var decimalSeparator = $locale.NUMBER_FORMATS.DECIMAL_SEP; + var groupSeparator = $locale.NUMBER_FORMATS.GROUP_SEP; + + // Create new regular expression with current decimal separator. + var NUMBER_REGEXP = "^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$"; + var regex = new RegExp(NUMBER_REGEXP); + + var formatting = true; + var maxInputLength = 16; // Maximum input length. Default max ECMA script. + var max; // Maximum value. Default undefined. + var min; // Minimum value. Default undefined. + var lastValidValue; // Last valid value. + var decimals = 2; // Number of decimals. Default 2. + + /*switch (attrs.inputNumber) { + case'prezzo': + decimals = 2; + break; + case'prezzo_unitario': + decimals = ConfigParam.get('DecimaliPrezzoUnitario'); + break; + case'quantita': + decimals = ConfigParam.get('DecimaliQuantita'); + break; + }*/ + + // Create parsers and formatters. + ngModelCtrl.$parsers.push(parseViewValue); + ngModelCtrl.$parsers.push(minValidator); + ngModelCtrl.$parsers.push(maxValidator); + ngModelCtrl.$formatters.push(formatViewValue); + + el.bind('blur', onBlur); // Event handler for the leave event. + el.bind('focus', onFocus); // Event handler for the focus event. + + // Put a watch on the min, max and decimal value changes in the attribute. + scope.$watch(attrs.min, onMinChanged); + scope.$watch(attrs.max, onMaxChanged); + scope.$watch(attrs.decimals, onDecimalsChanged); + scope.$watch(attrs.formatting, onFormattingChanged); + + // Setup decimal formatting. + if (decimals > -1) { + ngModelCtrl.$parsers.push(function (value) { + return (value) ? round(value) : value; + }); + ngModelCtrl.$formatters.push(function (value) { + return (value) ? formatPrecision(value) : value; + }); + } + + function onMinChanged(value) { + if (!angular.isUndefined(value)) { + min = parseFloat(value); + lastValidValue = minValidator(ngModelCtrl.$modelValue); + ngModelCtrl.$setViewValue(formatPrecision(lastValidValue)); + ngModelCtrl.$render(); + } + } + + function onMaxChanged(value) { + if (!angular.isUndefined(value)) { + max = parseFloat(value); + maxInputLength = calculateMaxLength(max); + lastValidValue = maxValidator(ngModelCtrl.$modelValue); + ngModelCtrl.$setViewValue(formatPrecision(lastValidValue)); + ngModelCtrl.$render(); + } + } + + function onDecimalsChanged(value) { + if (!angular.isUndefined(value)) { + decimals = parseFloat(value); + maxInputLength = calculateMaxLength(max); + if (lastValidValue !== undefined) { + ngModelCtrl.$setViewValue(formatPrecision(lastValidValue)); + ngModelCtrl.$render(); + } + } + } + + function onFormattingChanged(value) { + if (!angular.isUndefined(value)) { + formatting = (value !== false); + ngModelCtrl.$setViewValue(formatPrecision(lastValidValue)); + ngModelCtrl.$render(); + } + } + + /** + * Round the value to the closest decimal. + */ + function round(value) { + var d = Math.pow(10, decimals); + return Math.round(value * d) / d; + } + + /** + * Format a number with the thousand group separator. + */ + function numberWithCommas(value) { + if (formatting) { + var parts = value.toString().split(decimalSeparator); + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, groupSeparator); + return parts.join(decimalSeparator); + } else { + // No formatting applies. + return value; + } + } + + /** + * Format a value with thousand group separator and correct decimal char. + */ + function formatPrecision(value, noComma) { + noComma = (angular.isDefined(noComma)) ? noComma : false; + if (!(value || value === 0)) { + return ''; + } + var formattedValue = parseFloat(value).toFixedExcess(decimals); + formattedValue = formattedValue.replace('.', decimalSeparator); + return (noComma) ? formattedValue : numberWithCommas(formattedValue); + } + + function formatViewValue(value) { + if (angular.isString(value) && (value == null || (cleanzero && parseFloat(value.replace(',', '.')) == 0))) return ''; + return ngModelCtrl.$isEmpty(value) ? '' : '' + value; + } + + /** + * Parse the view value. + */ + function parseViewValue(value) { + if (angular.isUndefined(value)) { + value = ''; + } + value = value.toString().replace(decimalSeparator, '.'); + + // Handle leading decimal point, like ".5" + if (value.indexOf('.') === 0) { + value = '0' + value; + } + + // Allow "-" inputs only when min < 0 + if (value.indexOf('-') === 0) { + if (min >= 0) { + value = null; + ngModelCtrl.$setViewValue(formatViewValue(lastValidValue)); + ngModelCtrl.$render(); + } else if (value === '-') { + value = ''; + } + } + + var empty = ngModelCtrl.$isEmpty(value); + if (empty) { + lastValidValue = ''; + //ngModelCtrl.$modelValue = undefined; + } else { + if (regex.test(value) && (value.length <= maxInputLength)) { + if (value > max) { + lastValidValue = max; + } else if (value < min) { + lastValidValue = min; + } else { + lastValidValue = (value === '') ? null : parseFloat(value); + } + } else { + // Render the last valid input in the field + ngModelCtrl.$setViewValue(formatViewValue(lastValidValue)); + ngModelCtrl.$render(); + } + } + + return lastValidValue; + } + + /** + * Calculate the maximum input length in characters. + * If no maximum the input will be limited to 16; the maximum ECMA script int. + */ + function calculateMaxLength(value) { + var length = 16; + if (!angular.isUndefined(value)) { + length = Math.floor(value).toString().length; + } + if (decimals > 0) { + // Add extra length for the decimals plus one for the decimal separator. + length += decimals + 1; + } + if (min < 0) { + // Add extra length for the - sign. + length++; + } + return length; + } + + /** + * Minimum value validator. + */ + function minValidator(value) { + if (!angular.isUndefined(min)) { + if (!ngModelCtrl.$isEmpty(value) && (value < min)) { + return min; + } else { + return value; + } + } else { + return value; + } + } + + /** + * Maximum value validator. + */ + function maxValidator(value) { + if (!angular.isUndefined(max)) { + if (!ngModelCtrl.$isEmpty(value) && (value > max)) { + return max; + } else { + return value; + } + } else { + return value; + } + } + + + /** + * Function for handeling the blur (leave) event on the control. + */ + function onBlur() { + var value = ngModelCtrl.$modelValue; + if (!angular.isUndefined(value)) { + if (value == null || (cleanzero && parseFloat(value) == 0)) { + ngModelCtrl.$viewValue = ""; + ngModelCtrl.$render(); + return; + } + // Format the model value. + ngModelCtrl.$viewValue = formatPrecision(value); + ngModelCtrl.$render(); + } + } + + /** + * Function for handeling the focus (enter) event on the control. + * On focus show the value without the group separators. + */ + function onFocus() { + var value = ngModelCtrl.$modelValue; + if (!angular.isUndefined(value)) { + if (value == null || (cleanzero && parseFloat(value) == 0)) { + ngModelCtrl.$viewValue = ""; + ngModelCtrl.$render(); + return; + } + ngModelCtrl.$viewValue = formatPrecision(value, true).toString().replace(".", decimalSeparator); + ngModelCtrl.$render(); + } + } + } + }) + .directive('elastic', function elastic($timeout, $rootScope) { + return { + restrict: 'A', + link: function ($scope, element, attrs) { + + $scope.initialHeight = $scope.initialHeight || element[0].style.height; + $scope.maxHeight = attrs.elasticMaxHeight || null; + + let resize = function () { + //Controllo che se impostato il param maxHeight e se viene superato blocco il resize + if ($scope.maxHeight && (element[0].scrollHeight > $scope.maxHeight)) { + return; + } + + element[0].style.height = $scope.initialHeight; + element[0].style.height = "" + element[0].scrollHeight + "px"; + }; + + element.on("input change focus", resize); + $timeout(resize, 1500); + + //Funzione per richiamare lo showhide esternamente + $rootScope.$on('resize-elastic-textbox', function (event) { + resize(); + }); + } + }; + }) + .directive('maxlines', function () { + return function (scope, element, attrs) { + element.bind("keydown keypress", function (event) { + if (event.which === 13) { + let text = element.val(), + numberOfLines = (text.match(/\n/g) || []).length + 1, + maxRows = parseInt(element.attr('maxlines')); + + if (event.which === 13 && numberOfLines === maxRows) { + return false; + } + } + }); + }; + }) + + .service('DateRangePickerService', function (moment) { + let service = {}; + + service.getDefaultOptions = function () { + return defaultDateRangePickerOptions; + }; + + service.getTrimestreCustomRangeOptions = function(){ + + let ranges = { + 'Ultimi 30 gg': [moment().subtract(29, 'days'), moment()], + 'Questo Mese': [moment().startOf('month'), moment().endOf('month')], + 'Mese Scorso': [moment().subtract(1,'month').startOf('month'), moment().subtract(1,'month').endOf('month')], + 'Anno in Corso': [moment().startOf('year'), moment().endOf('year')]}; + + let periodi ={ + 1:{start:0,end:2}, + 2:{start:3,end:5}, + 3:{start:6,end:8}, + 4:{start:9,end:11} + }; + + let Anno = moment().format('YYYY'); + for(let i=1;i<5;i++){ + let labelAnno = i+"° Trimestre "+Anno; + ranges[labelAnno] = [moment().month(periodi[i].start).startOf('month'), moment().month(periodi[i].end).endOf('month')]; + } + + ranges['Anno Scorso'] = [moment().subtract(1,'year').startOf('year'), moment().subtract(1,'year').endOf('year')]; + + return ranges; + }; + + /** + * Formatta le date dei filtri nel modo corretto prima di invairle alla richiesta del web service + * @param filtri + * @param nomeDateStart + * @param nomeDateEnd + * @returns {*} + */ + service.getFormattedFilterDate = function (filtri,nomeDateStart,nomeDateEnd,dateFormatString) { + + nomeDateStart = nomeDateStart || 'DateStart'; + nomeDateEnd = nomeDateEnd || 'DateEnd'; + dateFormatString = dateFormatString || 'DD/MM/YYYY'; + + var tmpFilter = angular.copy(filtri); + tmpFilter[nomeDateStart] = moment(tmpFilter[nomeDateStart]).format(dateFormatString); + tmpFilter[nomeDateEnd] = moment(tmpFilter[nomeDateEnd]).format(dateFormatString); + + return tmpFilter; + + }; + + return service; + }); diff --git a/public/admin/js/angularjs/dashboard.module.js b/public/admin/js/angularjs/dashboard.module.js new file mode 100644 index 0000000..c61a87f --- /dev/null +++ b/public/admin/js/angularjs/dashboard.module.js @@ -0,0 +1,82 @@ +'use strict'; + +function DashboardController($scope, Ordini, moment, toaster, AuthService, DateRangePickerService, $timeout, $window) { + + $scope.dateRangeOptions = { + ...defaultDateRangePickerOptions, + ranges: DateRangePickerService.getTrimestreCustomRangeOptions(), + autoApply: true + }; + + const stampaRapportoAdminUri = `${BASE_URL_SITE}/admin/index/stampareportattivita`; + + $scope.loading = true; + $scope.DataConsegna = {startDate: moment().subtract(29, 'days'), endDate: moment()}; + + $scope.Periodo = ''; + + $scope.series = ['Ordini ' + $scope.Periodo, '']; + $scope.colors = ['#44ABF1', '#DDDDDD']; + + $scope.labels = []; + $scope.data = []; + + $scope.TotOrdiniPeriodo = 0; + + $scope.graphOptions = { + legend: {display: false}, + scales: { + yAxes: [ + { + id: 'y-axis-1', + type: 'linear', + display: true, + position: 'left' + } + ] + } + }; + + $scope.$watch('DataConsegna', (oldVal, newVal) => { + $scope.Periodo = 'Dal ' + newVal.startDate.format('DD/MM/YYYY') + ' al ' + newVal.endDate.format('DD/MM/YYYY'); + $scope.refreshGraph(); + }); + + $scope.refreshGraph = () => { + $scope.loading = true; + const per = $scope.DataConsegna.startDate.format('YYYY-MM-DD') + '|' + $scope.DataConsegna.endDate.format('YYYY-MM-DD'); + Ordini.getGraphData(per).then((res) => { + $scope.labels = res.DatiGrafico.labels; + $scope.data = [res.DatiGrafico.data, []]; + $scope.TotOrdiniPeriodo = res.TotOrdini; + }).catch((err) => { + toaster.error("Attenzione", "Errore durante il recupero dei dati del grafico"); + }).finally(() => { + $timeout(() => { + $scope.loading = false + }, 300); + }); + }; + + $scope.stampaRapporto = () => { + + if (!$scope.DataConsegna) { + alert("Devi selezionare un periodo per la stampa rapporto"); + return; + } + + let periodo = $scope.DataConsegna.startDate.format('YYYY-MM-DD') + '|' + $scope.DataConsegna.endDate.format('YYYY-MM-DD'); + + /*if(!confirm(`Aprire la stampa report per il periodo scelto (${periodo}) ?`)){ + return; + }*/ + + let url = `${stampaRapportoAdminUri}/p/${periodo}`; + $window.open(url, '_blank'); + }; + + //$scope.refreshGraph(); + +} + +app.controller('DashboardController', DashboardController); diff --git a/public/admin/js/angularjs/model.js b/public/admin/js/angularjs/model.js new file mode 100644 index 0000000..3105508 --- /dev/null +++ b/public/admin/js/angularjs/model.js @@ -0,0 +1,271 @@ +angular.module('app') + + .factory('SottoAree', function ($resource) { + const resource = $resource(basePath + 'sottoaree/:id', {id: '@id'}, { + update: {method: 'PUT'}, + insert: {method: 'POST'}, + getList: { + method: 'GET', + url: basePath + 'sottoaree', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + }, + getByCodice: { + method: 'GET', + url: basePath + 'sottoaree/m/get-by-codice' + } + }); + return { + get: function (success, error) { + return resource.query(success, error); + }, + find: function (id) { + return resource.get({id: id}).$promise; + }, + insert: function (data) { + return resource.insert(data).$promise; + }, + update: function (data) { + return resource.update(data).$promise; + }, + delete: function (id) { + return resource.delete({id: id}).$promise; + }, + getList: function (data) { + return resource.getList(data).$promise; + }, + getByCodice: function (codice) { + return resource.getByCodice({Codice: codice}).$promise; + } + }; + }) + + .factory('Users', function ($resource) { + const resource = $resource(basePath + 'users/:id', {id: '@id'}, { + update: {method: 'PUT'}, + insert: {method: 'POST'}, + getUserData: { + method: 'GET', + url: basePath + 'users/m/get-user-info', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + }, + getList: { + method: 'GET', + url: basePath + 'users', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + }, + proponiCodiceUtente: { + method: 'GET', + url: basePath + 'users/m/get-codice' + }, + caricaRidersMt: { + method: 'GET', + url: basePath + 'users/m/get-riders-mt', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + }, + }); + return { + get: function (success, error) { + return resource.query(success, error); + }, + find: function (id) { + return resource.get({id: id}).$promise; + }, + getByToken: function (token) { + return resource.getList({token: token}).$promise; + }, + getUserData: function () { + return resource.getUserData().$promise; + }, + insert: function (data) { + return resource.insert(data).$promise; + }, + update: function (data) { + return resource.update(data).$promise; + }, + delete: function (id) { + return resource.delete({id: id}).$promise; + }, + getList: function (data) { + return resource.getList(data).$promise; + }, + proponiCodiceUtente: function (role) { + return resource.proponiCodiceUtente({role: role}).$promise; + }, + caricaRidersMt: function () { + return resource.caricaRidersMt().$promise; + } + }; + }) + + .factory('FasceOrarie', function ($resource) { + const resource = $resource(basePath + 'fasceorarie/:id', {id: '@id'}, { + update: {method: 'PUT'}, + insert: {method: 'POST'}, + getList: { + method: 'GET', + url: basePath + 'fasceorarie', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + } + }); + return { + get: function (success, error) { + return resource.query(success, error); + }, + find: function (id) { + return resource.get({id: id}).$promise; + }, + insert: function (data) { + return resource.insert(data).$promise; + }, + update: function (data) { + return resource.update(data).$promise; + }, + delete: function (id) { + return resource.delete({id: id}).$promise; + }, + getList: function (data) { + return resource.getList(data).$promise; + } + }; + }) + + .factory('TipologieAttivita', function ($resource) { + const resource = $resource(basePath + 'tipologieattivita/:id', {id: '@id'}, { + update: {method: 'PUT'}, + insert: {method: 'POST'}, + getList: { + method: 'GET', + url: basePath + 'tipologieattivita', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + } + }); + return { + get: function (success, error) { + return resource.query(success, error); + }, + find: function (id) { + return resource.get({id: id}).$promise; + }, + insert: function (data) { + return resource.insert(data).$promise; + }, + update: function (data) { + return resource.update(data).$promise; + }, + delete: function (id) { + return resource.delete({id: id}).$promise; + }, + getList: function (data) { + return resource.getList(data).$promise; + } + }; + }) + + .factory('Ordini', function ($resource) { + const resource = $resource(basePath + 'ordini/:id', {id: '@id'}, { + update: {method: 'PUT'}, + insert: {method: 'POST'}, + getList: { + method: 'GET', + url: basePath + 'ordini', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + }, + getOrdiniDaGestire: { + method: 'GET', + url: basePath + 'ordiniadmin', + transformResponse: function (result,headers) { + let res = {}; + res.data = angular.fromJson(result); + res.headers = headers(); + return res; + } + }, + checkStatoOrdiniSync: { + method: 'GET', + url: basePath + 'ordiniadmin/m/check-ordini-sync', + }, + setStatoOrdiniSync: { + method: 'GET', + url: basePath + 'ordiniadmin/m/set-ordini-sync', + }, + resetMtDashboard: { + method: 'GET', + url: basePath + 'ordiniadmin/m/reset-mt-dashboard', + }, + getGraphData: { + method: 'GET', + url: basePath + 'ordiniadmin/m/get-graph-data', + } + }); + return { + get: function (success, error) { + return resource.query(success, error); + }, + find: function (id) { + return resource.get({id: id}).$promise; + }, + insert: function (data) { + return resource.insert(data).$promise; + }, + update: function (data) { + return resource.update(data).$promise; + }, + delete: function (id) { + return resource.delete({id: id}).$promise; + }, + getList: function (data) { + return resource.getList(data).$promise; + }, + getOrdiniDaGestire: function (data) { + return resource.getOrdiniDaGestire(data).$promise; + }, + checkStatoOrdiniSync: function () { + return resource.checkStatoOrdiniSync().$promise; + }, + setStatoOrdiniSync: function (stato) { + return resource.setStatoOrdiniSync({s: stato}).$promise; + }, + resetMtDashboard: function () { + return resource.resetMtDashboard().$promise; + }, + getGraphData: function (periodo) { + return resource.getGraphData({p: periodo}).$promise; + } + }; + }); + diff --git a/public/admin/js/globalfunctions.js b/public/admin/js/globalfunctions.js new file mode 100644 index 0000000..48bdbac --- /dev/null +++ b/public/admin/js/globalfunctions.js @@ -0,0 +1,565 @@ +'use strict'; + +/******************** PARAMETRI ******************************/ +const BASE_URL_SITE = $('link[rel="canonical"]').attr('href'); +var modal_id = '#modal'; +var form_id = '#' + $(modal_id).attr('data-form'); +var form = $(form_id); +var filter_modal_id = '#filterModal'; +var filter_form_id = '#' + $(filter_modal_id).attr('data-form'); +var filter_form = $(filter_form_id); +var modalLoader = $('#modal-loader'); +/*********************************************************************************/ + +/**** FUNZIONI GLOBALI PERSONALIZZATE ***/ + +const defaultDatePickerOptions = { + language: 'it', + format: "dd/mm/yyyy", + autoclose: true +}; + +const defaultDateRangePickerOptions = { + autoApply: false, + autoUpdateInput: false, + linkedCalendars: false, + showCustomRangeLabel: false, + locale: { + "format": "DD/MM/YYYY", + "separator": " | ", + "applyLabel": "Ok", + "cancelLabel": "Reset", + "fromLabel": "Da", + "toLabel": "A", + "customRangeLabel": "Custom", + "weekLabel": "W", + "daysOfWeek": [ + "Dom", + "Lun", + "Mar", + "Mer", + "Gio", + "Ven", + "Sab" + ], + "monthNames": [ + "Gennaio", + "Febbraio", + "Marzo", + "Aprile", + "Maggio", + "Giugno", + "Luglio", + "Agosto", + "Settembre", + "Ottobre", + "Novembre", + "Dicembre" + ], + "firstDay": 1 + }, + alwaysShowCalendars: true, + ranges: { + 'Oggi': [moment(), moment()], + 'Ieri': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Ultimi 7 gg': [moment().subtract(6, 'days'), moment()], + 'Ultimi 30 gg': [moment().subtract(29, 'days'), moment()], + 'Questo Mese': [moment().startOf('month'), moment().endOf('month')], + 'Mese Scorso': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + } +}; + +let $table; + +String.prototype.capitalize = function () { + return this.charAt(0).toUpperCase() + this.slice(1) +} + +$('a[href="#"]').click(function (event) { + event.preventDefault(); +}); + +$('a[data-widget="pushmenu"]').click(function () { + let collapsed = ($('body').hasClass('sidebar-collapse')) ? 0 : 1; + $.cookie('ui_sidebar_collapsed', collapsed, {path: '/'}); + if (collapsed) { + $table.trigger('reflow'); + } +}); + +/**************************************** + ************* SEZIONE FORM ************* + ***************************************/ + +function populateForm(data, frm) { + $.each(data, function (key, value) { + var $ctrl = $('[name=' + key + ']', frm); + if ($ctrl.is('select')) { + $("option", $ctrl).each(function () { + if (this.value == value) { + this.selected = true; + } + }); + } else { + switch ($ctrl.attr("type")) { + case "text": + case "hidden": + case "number": + $ctrl.val(value); + break; + case "textarea": + $ctrl.val(value); + break; + case "radio": + case "checkbox": + $ctrl.each(function () { + if ($(this).attr('id') == key && value == '1') { + $(this).iCheck('check'); + } + }); + break; + default: + $ctrl.val(value); + break; + } + } + }); + $('input.datepicker').datepicker('update'); +} + +function resetForm(tipo, form_id) { + + $(form_id + ' #ErrorDescription').html('').addClass('d-none'); + $(form_id + ' div.form-group').removeClass('has-error'); + $(form_id + ' div.multi-line-field-label-error').removeClass('has-error'); + $(form_id + ' div.label-danger').addClass('d-none').html(''); + + if (tipo != 'errors') { + $(form_id).clearForm(); + } +} + +function getErrorHtml(formErrors, noBr) { + + if ((typeof (formErrors) === 'undefined') || (formErrors.length < 1)) return; + + noBr = (typeof (noBr) === 'undefined') ? false : noBr; + + var out = ''; + let brtxt = (noBr) ? '' : '
'; + for (let errorKey in formErrors) { + out += (formErrors[errorKey] + brtxt); + } + + return out; +} + +function showErrors(form_id, resp) { + resetForm('errors', form_id); + //$(form_id + ' #ErrorDescription').html(resp.message).removeClass('d-none'); + toastr.error(resp.message); + for (let key in resp.errors) { + + let errBlock = $(form_id + ' div#' + key); + let labelBlock = $(form_id + ' div#' + key + ' .label-danger'); + + errBlock.addClass('has-error'); + + if (labelBlock.length === 0) { + labelBlock = errBlock.parent().children(' .label-danger'); + labelBlock.html(labelBlock.html() + ' | ' + getErrorHtml(resp.errors[key], true)); + labelBlock.removeClass('d-none'); + } else { + labelBlock.html(getErrorHtml(resp.errors[key])).removeClass('d-none'); + } + + } +} + +function initDatePicker() { + $('.datepicker').datepicker(defaultDatePickerOptions); +} + +function initDateRangePicker(customRange) { + + let dateRangePickerOptions = defaultDateRangePickerOptions; + + if (customRange) { + dateRangePickerOptions.ranges = customRange; + } + + $('input[daterangepicker]').daterangepicker(dateRangePickerOptions); + + $('input[daterangepicker]').on('apply.daterangepicker', function (ev, picker) { + $(this).val(picker.startDate.format('DD/MM/YYYY') + ' | ' + picker.endDate.format('DD/MM/YYYY')); + }); + + $('input[daterangepicker]').on('cancel.daterangepicker', function (ev, picker) { + $(this).val(''); + }); +} + +function initSwitchButton() { + //Abilita gli swithc button + $("input[data-bootstrap-switch]").each(function () { + $(this).bootstrapSwitch('state', $(this).prop('checked')); + }); +} + +function initICheck() { + + var tableBody = $('#tablebody'); + + $('#select_all').click(function (link) { + link.preventDefault(); + tableBody.find(':checkbox').iCheck('check'); + }); + + $('#deselect_all').click(function (link) { + link.preventDefault(); + tableBody.find(':checkbox').iCheck('uncheck'); + }); + + $('#invert_all').click(function (link) { + link.preventDefault(); + tableBody.find(':checkbox').iCheck('toggle'); + }); +} + +function initTooltip() { + $('[data-toggle="tooltip"]').tooltip(); +} + +function initPopover() { + $('[data-toggle="popover"]').popover(); +} + +function initSummernote() { + $('.summernote').summernote({ + dialogsInBody: true + }); +} + +function initSelect2(){ + $('select[select2]').select2(); +} + +/*function initFontIconPicker(options){ + $('[font-icon-picker]').fontIconPicker(options); +}*/ + +function refreshFormComponents() { + $("input[type='checkbox'], input[type='radio']").not(".no-icheck").iCheck({ + checkboxClass: 'icheckbox_square-blue', + radioClass: 'iradio_square-blue' + }); + + initTooltip(); + initPopover(); +} + +function initFormComponents() { + + refreshFormComponents(); + + initICheck(); + initSwitchButton(); + initDatePicker(); + initDateRangePicker(); +} + +$(document).ready(() => { + setOrderThValue(); + fixHeghtOfTableList(); +}).delegate('a[href="#"]', 'click', function (link) { + link.preventDefault(); +}) + .delegate('#filterData', 'click', function (link) { + link.preventDefault(); + $(filter_modal_id).modal('show'); + }) + .delegate('#filtra', 'click', function (link) { + link.preventDefault(); + filter_form.submit(); + }) + .delegate('#resetFiltri', 'click', function (link) { + link.preventDefault(); + filter_form.clearForm(); + filter_form.find('select').val(''); + }) + .delegate('th[data-ord]', 'click', function (link) { + link.preventDefault(); + + const ordVal = $(this).attr('data-ord'); + const tipoOrderEl = $('#tipoOrder'); + const tipoOrder = (tipoOrderEl.val() === 'ASC') ? 'DESC' : 'ASC'; + + $('#order').val(ordVal); + tipoOrderEl.val(tipoOrder); + + $('#searchForm').submit(); + }) + .delegate('select[data-refresh-search-form]', 'change', function (link) { + link.preventDefault(); + $('#searchForm').submit(); + }) + +/******************************************* + ************* SEZIONE TABELLA ************* + ******************************************/ + +function setOrderThValue() { + const ordVal = $('#order').val(); + const tipoOrd = $('#tipoOrder').val(); + + $('th[data-ord]').find('i').remove(); + + const thOrd = $('th[data-ord="' + ordVal + '"]'); + + const icon = (tipoOrd === 'ASC') ? 'fa-chevron-up' : 'fa-chevron-down'; + const iconText = ``; + + thOrd.find('i').remove(); + const thText = thOrd.html() + ' ' + iconText; + + thOrd.html(thText); +} + +function initTableFlotHeader() { + + //Abilito l'header fisso + $table = $('.table.flot-header'); + $table.floatThead({ + autoReflow: true, + scrollContainer: function ($table) { + return $table.closest('.table-wrapper'); + }, + responsiveContainer: function ($table) { + return $table.closest('.table-responsive'); + } + }); + + //Imposta l'altezza del table-wrapper + fixHeghtOfTableList(); +} + +function refreshTable() { + if ($table) { + fixHeghtOfTableList(); + } +} + +function fixHeghtOfTableList() { + + let windowHeight = $(window).height(); + + let navbarHeight = $(".navbar").outerHeight() || 0; + let footerHeight = $(".main-footer").outerHeight() || 0; + + let contentHeaderHeight = $(".content-header").outerHeight() || 0; + let boxHeaderHeight = $(".box-header").outerHeight() || 0; + + let boxFooterHeight = $(".box-footer").outerHeight() || 0; + + let tableWrapperHeight = windowHeight - (navbarHeight + footerHeight + contentHeaderHeight + boxHeaderHeight + boxFooterHeight + 15); + $('.table-wrapper').css("height", tableWrapperHeight + "px"); + + let theadHeight = $('.table-wrapper thead').outerHeight() + 1; + + const totHeight = tableWrapperHeight - theadHeight; + + $('td.no-rows').css("height", (totHeight) + "px"); +} + +$(window).resize(function () { + fixHeghtOfTableList(); + $table.trigger('reflow'); +}); + +/************************************************** + ************* FUNZIONI SPECIALIZZATE ************* + *************************************************/ + +function password_generator(len) { + let length = (len) ? (len) : (10); + let string = "abcdefghijklmnopqrstuvwxyz"; //to upper + let numeric = '0123456789'; + let punctuation = '!@#$%^&*()_+~`|}{[]\:;?><,./-='; + let password = ""; + let character = ""; + let crunch = true; + while (password.length < length) { + let entity1 = Math.ceil(string.length * Math.random() * Math.random()); + let entity2 = Math.ceil(numeric.length * Math.random() * Math.random()); + let entity3 = Math.ceil(punctuation.length * Math.random() * Math.random()); + let hold = string.charAt(entity1); + hold = (entity1 % 2 == 0) ? (hold.toUpperCase()) : (hold); + character += hold; + character += numeric.charAt(entity2); + character += punctuation.charAt(entity3); + password = character; + } + return password; +} + +function copyToClipboard(elem) { + // create hidden text element, if it doesn't already exist + var targetId = "_hiddenCopyText_"; + var isInput = elem.tagName === "INPUT" || elem.tagName === "TEXTAREA"; + var origSelectionStart, origSelectionEnd; + if (isInput) { + // can just use the original source element for the selection and copy + target = elem; + origSelectionStart = elem.selectionStart; + origSelectionEnd = elem.selectionEnd; + } else { + // must use a temporary form element for the selection and copy + target = document.getElementById(targetId); + if (!target) { + var target = document.createElement("textarea"); + target.style.position = "absolute"; + target.style.left = "-9999px"; + target.style.top = "0"; + target.id = targetId; + document.body.appendChild(target); + } + target.textContent = elem.textContent; + } + // select the content + var currentFocus = document.activeElement; + target.focus(); + target.setSelectionRange(0, target.value.length); + + // copy the selection + var succeed; + try { + succeed = document.execCommand("copy"); + } catch (e) { + succeed = false; + } + // restore original focus + if (currentFocus && typeof currentFocus.focus === "function") { + currentFocus.focus(); + } + + if (isInput) { + // restore prior selection + elem.setSelectionRange(origSelectionStart, origSelectionEnd); + } else { + // clear temporary content + target.textContent = ""; + } + return succeed; +} + +/** + * Questa funzione passato un template html ne sostituisce i parametri + * @param template + * @param params + */ +function prepareHTMLWithParams(template, params) { + if (params instanceof Array) { + params.forEach(function (val, key) { + template = template.replace(new RegExp('%' + key + '%', 'g'), val); + }); + } else if (params instanceof Object) { + Object.keys(params).forEach(function (key) { + template = template.replace(new RegExp('%' + key + '%', 'g'), params[key]); + }); + } + + return template; +} + +/************************************************************************************ + ************* SEZIONE FUNZIONI GENRICHE PER LA GESTIONE DELLE IMMAGINI ************* + ************************************************************************************/ + +/** + * Questa funzione carica l'immagine nel box anteprima + * @param basePathImage + * @param nomeVaribileFile + * @param valFile + */ +function popolaImmagine(basePathImage, nomeVaribileFile, valFile, custom_class) { + + if (custom_class === undefined) { + custom_class = 'img-fluid img-thumbnail'; + } + + if (valFile) { + $('#preview_block_' + nomeVaribileFile).addClass(custom_class).attr('src', basePathImage + valFile); + $('#image-preview-filename-' + nomeVaribileFile).val(valFile); + $("#image-preview-input-title-" + nomeVaribileFile).text("Cambia"); + $("#image-preview-clear-" + nomeVaribileFile).show(); + } +} + +/** + * Questa funzione resetta il blocco immagine in base al parametro nome File che riceve + * @param nomeVariabileFile + * @param baseImagePath + */ +function resetImageInput(nomeVariabileFile, baseImagePath) { + // $('#preview_block_' + nomeVariabileFile).attr('src', baseImagePath + 'noimage.jpg'); + $('#preview_block_' + nomeVariabileFile).attr('src', baseImagePath + 'no_img.png'); + $('#image-preview-filename-' + nomeVariabileFile).val(''); + $('#image-preview-clear-' + nomeVariabileFile).hide(); + $('#image-preview-input-title-' + nomeVariabileFile).html('Carica ...'); + + var input_file = $('input#image_' + nomeVariabileFile); + input_file.replaceWith(input_file.val('').clone(true)); +} + +/** + * Questa funzione definisce gli event handler per il nome immagine che riceve in entrata + * + * @param nome_immagine + * @param base_image_path + * @param custom_class [default value: img-fluid img-thumbnail'] + * @param custom_style [default value: ''] + * + * '?' sta a indicare la Varibile NomeFile che si passa, dovrebbe corrispondere al nome del campo immagine + * image-preview-clear-? = Identificativo del pulsante "Cancella" + * image-preview-input-title-? = Identifica il testo del pusante "Scegli..." o "Cambia" + * image-preview-input-? = Identificativo del input di tipo FILE dove andra dell'immagine + * image-preview-filename-? = Identificativo dell'input che contiene il nome del file immagine caricato + * image_preview_block_? = Identificativo del blocco che contiene l'html con il tag + * preview_block_? = Identificatico dell'elemento immagine per visualizzare l'anteprima + */ +function defineEventHandlerForImageBlock(nome_immagine, base_image_path, custom_class, custom_style) { + + if (custom_class === undefined) { + custom_class = 'img-fluid img-thumbnail'; + } + + if (custom_style === undefined) { + custom_style = ''; + } + + //Evento click pulsante cancella + $('#image-preview-clear-' + nome_immagine).click(function () { + resetImageInput(nome_immagine, base_image_path); + }); + + //Evento che al caricamento dell'immgaine ne crea il blocco anteprima + $("#image-preview-input-" + nome_immagine + " input:file").change(function () { + let img = $('', { + id: 'preview_block_' + nome_immagine, + class: custom_class, + style: custom_style + }); + let nome_file_1 = this.files[0]; + let reader_file_1 = new FileReader(); + // Set preview image into the popover data-content + reader_file_1.onload = function (e) { + $("#image-preview-input-title-" + nome_immagine).text("Cambia"); + $("#image-preview-clear-" + nome_immagine).show(); + $("#image-preview-filename-" + nome_immagine).val(nome_file_1.name); + img.attr('src', e.target.result); + $("#image_preview_block_" + nome_immagine).html($(img)[0].outerHTML); + }; + reader_file_1.readAsDataURL(nome_file_1); + }); +} + diff --git a/public/admin/js/handler/admin/event_handler_dashboard.js b/public/admin/js/handler/admin/event_handler_dashboard.js new file mode 100644 index 0000000..c6247db --- /dev/null +++ b/public/admin/js/handler/admin/event_handler_dashboard.js @@ -0,0 +1,3 @@ +$('document').ready(function () { + +}); diff --git a/public/admin/js/handler/admin/event_handler_listemails.js b/public/admin/js/handler/admin/event_handler_listemails.js new file mode 100644 index 0000000..7510384 --- /dev/null +++ b/public/admin/js/handler/admin/event_handler_listemails.js @@ -0,0 +1,177 @@ +'use strict'; + +function beforeSubmit() { + modalLoader.removeClass('d-none').addClass('d-flex'); +} + +function errorOnSubmit() { + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +function afterSubmit(resp) { + if (resp.success === 'invalid') { + showErrors(form_id, resp); + } else if (resp.success === true) { + + let id; + let mex = ''; + if (resp.op === 'insert') { + $('#tablebody').prepend(resp.text); + $('input#id').val(resp.data.id); + mex = 'Inserimento effettuato con successo'; + id = resp.data.id; + } else { + $('tr[data-id=' + resp.id + ']').replaceWith(resp.text); + mex = 'Modifca effettuata con successo'; + id = resp.id; + } + + refreshFormComponents(); + $('#norows').remove(); + $(modal_id).modal('hide'); + $('#save').attr('op', 'insert'); + myResetForm('', form_id); + + toastr.success(mex); + } else { + toastr.error(resp.shortMessage); + console.error(resp.message); + } + + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +//Specializzo la funzione resetForm nel caso ci sia bisogno di campi TEXTAREA o immagini da resettare +function myResetForm(tipo, formid) { + resetForm(tipo, formid); +} + +function edit(id) { + $('#save').attr('op', 'edit'); + var dati = 'id=' + id; + var url = $(form_id).attr('data-get'); + myResetForm('all', form_id); + $.getJSON(url, dati, function (resp) { + if (resp.success) { + populateForm(resp, form); + + $(modal_id).modal('show'); + } else { + toastr.error(resp.message); + } + }); +} + +$(document).ready(function () { + initFormComponents(); + initTableFlotHeader(); +}) + .delegate('#new', 'click', function (link) { + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + $(modal_id).modal('show'); + }) + .delegate('#save', 'click', function (link) { + link.preventDefault(); + var operation = $(this).attr('op'); + var options = { + target: '#ErrorDescription', + beforeSubmit: beforeSubmit, + success: afterSubmit, + error: errorOnSubmit, + data: { + op: operation + }, + dataType: 'json', + resetForm: false + }; + $(form_id).ajaxSubmit(options); + }) + .delegate('#edit,#editLink', 'click', function (link) { + link.preventDefault(); + const id = $(this).parents('tr').attr('data-id'); + edit(id); + }) + .delegate('#delete', 'click', function (link) { + link.preventDefault(); + + const url = $(form_id).attr('data-delete'); + let tr = $(this).parents('tr'); + const cod = tr.attr('data-cod'); + let id = tr.attr('data-id'); + let message = 'Sei sicuro di voler eliminare definitivamente l\'elemento?'; + + if (confirm(message)) { + $.ajax({ + type: 'POST', + url: url, + data: 'id=' + id + "&cod=" + cod, + dataType: 'json', + complete: function (resp) { + + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + + toastr.success('Eliminazione effettuata con successo'); + + } else { + toastr.error(resp.message); + } + } + }); + } + }) + .delegate('#delete_select', 'click', function (link) { + link.preventDefault(); + + let message = 'Sei sicuro di voler eliminare definitivamente gli elementi selezionati?'; + + if (confirm(message)) { + let data = []; + $('#tablebody').find(':checkbox').each(function () { + if (this.checked) { + data.push($(this).val()); + } + }); + + let url = $(this).attr('href'); + + $.ajax({ + type: 'POST', + url: url, + data: { + data: data + }, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + var ids = resp.id; + for (var i = 0; i < ids.length; i++) { + var tr = $('#tablebody tr[data-id=' + ids[i] + ']'); + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + } + } else { + toastr.error(resp.message); + } + + $('#tablebody').find(':checkbox').iCheck('uncheck'); + } + }); + } + }) + .delegate(modal_id,'hidden.bs.modal',function(link){ + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + }); diff --git a/public/admin/js/handler/admin/event_handler_listemailtemplate.js b/public/admin/js/handler/admin/event_handler_listemailtemplate.js new file mode 100644 index 0000000..ffa95f7 --- /dev/null +++ b/public/admin/js/handler/admin/event_handler_listemailtemplate.js @@ -0,0 +1,181 @@ +'use strict'; + +function beforeSubmit() { + modalLoader.removeClass('d-none').addClass('d-flex'); +} + +function errorOnSubmit() { + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +function afterSubmit(resp) { + if (resp.success === 'invalid') { + showErrors(form_id, resp); + } else if (resp.success === true) { + + let id; + let mex = ''; + if (resp.op === 'insert') { + $('#tablebody').prepend(resp.text); + $('input#id').val(resp.data.id); + mex = 'Inserimento effettuato con successo'; + id = resp.data.id; + } else { + $('tr[data-id=' + resp.id + ']').replaceWith(resp.text); + mex = 'Modifca effettuata con successo'; + id = resp.id; + } + + refreshFormComponents(); + $('#norows').remove(); + $(modal_id).modal('hide'); + $('#save').attr('op', 'insert'); + myResetForm('', form_id); + + toastr.success(mex); + } else { + toastr.error(resp.shortMessage); + console.error(resp.message); + } + + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +//Specializzo la funzione resetForm nel caso ci sia bisogno di campi TEXTAREA o immagini da resettare +function myResetForm(tipo, formid) { + resetForm(tipo, formid); + $('textarea#Testo').summernote('code', ''); +} + +function edit(id) { + $('#save').attr('op', 'edit'); + var dati = 'id=' + id; + var url = $(form_id).attr('data-get'); + myResetForm('all', form_id); + $.getJSON(url, dati, function (resp) { + if (resp.success) { + populateForm(resp, form); + + $('textarea#Testo').summernote('code', resp.Testo); + + $(modal_id).modal('show'); + } else { + toastr.error(resp.message); + } + }); +} + +$(document).ready(function () { + initFormComponents(); + initTableFlotHeader(); + initSummernote(); +}) + .delegate('#new', 'click', function (link) { + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + $(modal_id).modal('show'); + }) + .delegate('#save', 'click', function (link) { + link.preventDefault(); + var operation = $(this).attr('op'); + var options = { + target: '#ErrorDescription', + beforeSubmit: beforeSubmit, + success: afterSubmit, + error: errorOnSubmit, + data: { + op: operation + }, + dataType: 'json', + resetForm: false + }; + $(form_id).ajaxSubmit(options); + }) + .delegate('#edit,#editLink', 'click', function (link) { + link.preventDefault(); + const id = $(this).parents('tr').attr('data-id'); + edit(id); + }) + .delegate('#delete', 'click', function (link) { + link.preventDefault(); + + const url = $(form_id).attr('data-delete'); + let tr = $(this).parents('tr'); + const cod = tr.attr('data-cod'); + let id = tr.attr('data-id'); + let message = 'Sei sicuro di voler eliminare definitivamente l\'elemento?'; + + if (confirm(message)) { + $.ajax({ + type: 'POST', + url: url, + data: 'id=' + id + "&cod=" + cod, + dataType: 'json', + complete: function (resp) { + + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + + toastr.success('Eliminazione effettuata con successo'); + + } else { + toastr.error(resp.message); + } + } + }); + } + }) + .delegate('#delete_select', 'click', function (link) { + link.preventDefault(); + + let message = 'Sei sicuro di voler eliminare definitivamente gli elementi selezionati?'; + + if (confirm(message)) { + let data = []; + $('#tablebody').find(':checkbox').each(function () { + if (this.checked) { + data.push($(this).val()); + } + }); + + let url = $(this).attr('href'); + + $.ajax({ + type: 'POST', + url: url, + data: { + data: data + }, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + var ids = resp.id; + for (var i = 0; i < ids.length; i++) { + var tr = $('#tablebody tr[data-id=' + ids[i] + ']'); + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + } + } else { + toastr.error(resp.message); + } + + $('#tablebody').find(':checkbox').iCheck('uncheck'); + } + }); + } + }) + .delegate(modal_id,'hidden.bs.modal',function(link){ + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + }); diff --git a/public/admin/js/handler/admin/event_handler_settings.js b/public/admin/js/handler/admin/event_handler_settings.js new file mode 100644 index 0000000..03e8069 --- /dev/null +++ b/public/admin/js/handler/admin/event_handler_settings.js @@ -0,0 +1,97 @@ +'use strict'; + +function resetForm(tipo) { + $('#Error_Description').html('').addClass('hidden'); + $('.input-group').removeClass('has-error'); + $('.form-control').removeClass('no-border'); + $('.error-icon').addClass('hidden'); + $('.label-error').addClass('hidden').html(''); + if (tipo != 'errors') { + $('.form-control').val(''); + } +} + +function beforeSubmit() { + +} + +function errorOnSubmit() { + $('#modal-loader').addClass('hidden'); +} + +function afterSubmit(resp) { + + $('.has-error').removeClass('has-error'); + $.each(resp, function (index, val) { + if (val == 'OK') $('#' + index).addClass('has-success'); + else $('#' + index).addClass('has-error'); + }); + + toastr.success('Parametri di configurazione aggiornati con successo.'); +} + +$(document).ready(function () { + + initDatePicker(); + initTooltip(); + initPopover(); + initSwitchButton(); + + var options = { + target: '#Error_Description', + beforeSubmit: beforeSubmit, + error: errorOnSubmit, + success: afterSubmit, + dataType: 'json', + resetForm: false + }; + + $('a.setting-tab').click(function () { + var tabname = $(this).attr('href'); + tabname = tabname.replace('#', ''); + $.cookie('settings_tabname', tabname); + }); + + $(".btn-save").click(function (link) { + link.preventDefault(); + const formID = $('.tab-pane.active').attr('id').capitalize(); + const form = $('form#settings' + formID); + form.ajaxSubmit(options); + return false; + }); + + $('#btn-new-passoword').click(function (e) { + e.preventDefault(); + var form = $('#password_form'); + form.ajaxSubmit({ + target: '#Error_Description', + success: function (resp) { + if (!resp.status) { + toastr.warning(" " + resp.message); + if (resp.resetForm) { + $('[form="password_form"]').val(''); + } + } else { + $('[form="password_form"]').val(''); + toastr.warning(" La password è stata reimpostata correttamente"); + } + }, + dataType: 'json', + resetForm: false + }); + return false; + }); + + $("#BtnGeneraPassword").click(function (event) { + event.preventDefault(); + $("#superPwd").val(password_generator(20)); + }); + + $("#BtnCopyToClipboard").click(function (event) { + event.preventDefault(); + $('#superPwd').attr('type', 'text'); + copyToClipboard($('#superPwd')[0]); + $('#superPwd').attr('type', 'password'); + }); + +}); diff --git a/public/admin/js/handler/default/event_handler_login.js b/public/admin/js/handler/default/event_handler_login.js new file mode 100644 index 0000000..a57beec --- /dev/null +++ b/public/admin/js/handler/default/event_handler_login.js @@ -0,0 +1,7 @@ +$(function () { + $('input').iCheck({ + checkboxClass: 'icheckbox_square-blue', + radioClass: 'iradio_square-blue', + increaseArea: '20%' // optional + }); +}); diff --git a/public/admin/js/handler/monitoring/event_handler_listaccesslog.js b/public/admin/js/handler/monitoring/event_handler_listaccesslog.js new file mode 100644 index 0000000..342de0e --- /dev/null +++ b/public/admin/js/handler/monitoring/event_handler_listaccesslog.js @@ -0,0 +1,177 @@ +'use strict'; + +function beforeSubmit() { + modalLoader.removeClass('d-none').addClass('d-flex'); +} + +function errorOnSubmit() { + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +function afterSubmit(resp) { + if (resp.success === 'invalid') { + showErrors(form_id, resp); + } else if (resp.success === true) { + + let id; + let mex = ''; + if (resp.op === 'insert') { + $('#tablebody').prepend(resp.text); + $('input#id').val(resp.data.id); + mex = 'Inserimento effettuato con successo'; + id = resp.data.id; + } else { + $('tr[data-id=' + resp.id + ']').replaceWith(resp.text); + mex = 'Modifca effettuata con successo'; + id = resp.id; + } + + refreshFormComponents(); + $('#norows').remove(); + $(modal_id).modal('hide'); + $('#save').attr('op', 'insert'); + myResetForm('', form_id); + + toastr.success(mex); + } else { + toastr.error(resp.shortMessage); + console.error(resp.message); + } + + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +//Specializzo la funzione resetForm nel caso ci sia bisogno di campi TEXTAREA o immagini da resettare +function myResetForm(tipo, formid) { + resetForm(tipo, formid); +} + +function edit(id) { + $('#save').attr('op', 'edit'); + let dati = 'id=' + id; + let url = $(form_id).attr('data-get'); + myResetForm('all', form_id); + $.getJSON(url, dati, function (resp) { + if (resp.success) { + populateForm(resp, form); + + $(modal_id).modal('show'); + } else { + toastr.error(resp.message); + } + }); +} + +$(document).ready(function () { + initFormComponents(); + initTableFlotHeader(); +}) + .delegate('#new', 'click', function (link) { + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + $(modal_id).modal('show'); + }) + .delegate('#save', 'click', function (link) { + link.preventDefault(); + let operation = $(this).attr('op'); + let options = { + target: '#ErrorDescription', + beforeSubmit: beforeSubmit, + success: afterSubmit, + error: errorOnSubmit, + data: { + op: operation + }, + dataType: 'json', + resetForm: false + }; + $(form_id).ajaxSubmit(options); + }) + .delegate('#edit,#editLink', 'click', function (link) { + link.preventDefault(); + const id = $(this).parents('tr').attr('data-id'); + edit(id); + }) + .delegate('#delete', 'click', function (link) { + link.preventDefault(); + + const url = $(form_id).attr('data-delete'); + let tr = $(this).parents('tr'); + const cod = tr.attr('data-cod'); + let id = tr.attr('data-id'); + let message = 'Sei sicuro di voler eliminare definitivamente l\'elemento?'; + + if (confirm(message)) { + $.ajax({ + type: 'POST', + url: url, + data: 'id=' + id + "&cod=" + cod, + dataType: 'json', + complete: function (resp) { + + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + + toastr.success('Eliminazione effettuata con successo'); + + } else { + toastr.error(resp.message); + } + } + }); + } + }) + .delegate('#delete_select', 'click', function (link) { + link.preventDefault(); + + let message = 'Sei sicuro di voler eliminare definitivamente gli elementi selezionati?'; + + if (confirm(message)) { + let data = []; + $('#tablebody').find(':checkbox').each(function () { + if (this.checked) { + data.push($(this).val()); + } + }); + + let url = $(this).attr('href'); + + $.ajax({ + type: 'POST', + url: url, + data: { + data: data + }, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + var ids = resp.id; + for (var i = 0; i < ids.length; i++) { + var tr = $('#tablebody tr[data-id=' + ids[i] + ']'); + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + } + } else { + toastr.error(resp.message); + } + + $('#tablebody').find(':checkbox').iCheck('uncheck'); + } + }); + } + }) + .delegate(modal_id,'hidden.bs.modal',function(link){ + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + }); diff --git a/public/admin/js/handler/monitoring/event_handler_listerrorlog.js b/public/admin/js/handler/monitoring/event_handler_listerrorlog.js new file mode 100644 index 0000000..a634584 --- /dev/null +++ b/public/admin/js/handler/monitoring/event_handler_listerrorlog.js @@ -0,0 +1,316 @@ +'use strict'; + +function beforeSubmit() { + modalLoader.removeClass('d-none').addClass('d-flex'); +} + +function errorOnSubmit() { + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +function afterSubmit(resp) { + if (resp.success === 'invalid') { + showErrors(form_id, resp); + } else if (resp.success === true) { + + let id; + let mex = ''; + if (resp.op === 'insert') { + $('#tablebody').prepend(resp.text); + $('input#id').val(resp.data.id); + mex = 'Inserimento effettuato con successo'; + id = resp.data.id; + } else { + $('tr[data-id=' + resp.id + ']').replaceWith(resp.text); + mex = 'Modifca effettuata con successo'; + id = resp.id; + } + + refreshFormComponents(); + $('#norows').remove(); + $(modal_id).modal('hide'); + $('#save').attr('op', 'insert'); + myResetForm('', form_id); + + toastr.success(mex); + } else { + toastr.error(resp.shortMessage); + console.error(resp.message); + } + + modalLoader.removeClass('d-flex').addClass('d-none'); +} + +//Specializzo la funzione resetForm nel caso ci sia bisogno di campi TEXTAREA o immagini da resettare +function myResetForm(tipo, formid) { + resetForm(tipo, formid); +} + +function edit(id) { + $('#save').attr('op', 'edit'); + let dati = 'id=' + id; + let url = $(form_id).attr('data-get'); + myResetForm('all', form_id); + $.getJSON(url, dati, function (resp) { + if (resp.success) { + $('#main_contenitor').html(resp.text); + + $(modal_id).modal('show'); + } else { + toastr.error(resp.message); + } + }); +} + +$(document).ready(function () { + initFormComponents(); + initTableFlotHeader(); +}) + .delegate('#new', 'click', function (link) { + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + $(modal_id).modal('show'); + }) + .delegate('#save', 'click', function (link) { + link.preventDefault(); + var operation = $(this).attr('op'); + var options = { + target: '#ErrorDescription', + beforeSubmit: beforeSubmit, + success: afterSubmit, + error: errorOnSubmit, + data: { + op: operation + }, + dataType: 'json', + resetForm: false + }; + $(form_id).ajaxSubmit(options); + }) + .delegate('#edit,#editLink', 'click', function (link) { + link.preventDefault(); + const id = $(this).parents('tr').attr('data-id'); + edit(id); + }) + .delegate('#delete', 'click', function (link) { + link.preventDefault(); + + const url = $(form_id).attr('data-delete'); + let tr = $(this).parents('tr'); + const cod = tr.attr('data-cod'); + let id = tr.attr('data-id'); + let message = 'Sei sicuro di voler eliminare definitivamente l\'elemento?'; + + if (confirm(message)) { + $.ajax({ + type: 'POST', + url: url, + data: 'id=' + id + "&cod=" + cod, + dataType: 'json', + complete: function (resp) { + + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + + toastr.success('Eliminazione effettuata con successo'); + + } else { + toastr.error(resp.message); + } + } + }); + } + }) + .delegate('#delete_select', 'click', function (link) { + link.preventDefault(); + + let message = 'Sei sicuro di voler eliminare definitivamente gli elementi selezionati?'; + + if (confirm(message)) { + let data = []; + $('#tablebody').find(':checkbox').each(function () { + if (this.checked) { + data.push($(this).val()); + } + }); + + let url = $(this).attr('href'); + + $.ajax({ + type: 'POST', + url: url, + data: { + data: data + }, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + var ids = resp.id; + for (var i = 0; i < ids.length; i++) { + var tr = $('#tablebody tr[data-id=' + ids[i] + ']'); + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + } + } else { + toastr.error(resp.message); + } + + $('#tablebody').find(':checkbox').iCheck('uncheck'); + } + }); + } + }) + .delegate('select#state', 'change', function (link) { + link.preventDefault(); + $('select#state').val($(this).val()); + $('#searchForm').submit(); + }) + .delegate('#set-state','click',function (link) { + link.preventDefault(); + + var url = $(this).attr('data-url'); + var tr = $(this).parents('tr'); + var state = $(this).attr('data-state'); + var id = tr.attr('data-id'); + var message = 'Sei sicuro di voler modificare lo stato dell\'elemento?'; + + if (confirm(message)) { + $.ajax({ + type: 'POST', + url: url, + data: 'id=' + id +'&state=' + state, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + tr.replaceWith(resp.text); + refreshFormComponents(); + } else { + alert(resp.message); + } + } + }); + } else { + return; + } + + }) + .delegate('#setstate_select', 'click', function (link) { + link.preventDefault(); + + var url = $(this).attr('href'); + var stateNum = null; + + var data = []; + $('#tablebody').find(':checkbox').each(function () { + if (this.checked) { + data.push($(this).val()); + } + }); + + if(data.length <= 0){ + alert("Nessun elemento selezioanto"); + return; + } + + function confirmChoice() { + var val = $('select#selectState').val(); + + if(!val){ + alert("E' necessario scegliere uno stato"); + return; + } + + stateNum = val; + dialog.dialog( "close" ); + + if (confirm("Sei sicuro di voler modificare lo stato degli elementi selezionati?")) { + + $.ajax({ + type: 'POST', + url: url, + data: { + data: data, + state:stateNum + }, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + var rows = resp.rows; + for (var i = 0; i < rows.length; i++) { + var tr = $('#tablebody tr[data-id=' + rows[i].id + ']'); + tr.replaceWith(rows[i].tdRow); + } + + $.growl({ + type: 'success', + message: "Elementi aggiornati", + icon: 'fa fa-check fa-fw' + }, grownl_my_default_options); + + } else { + $.growl({ + type: 'danger', + message: resp.message, + icon: 'fa fa-times fa-fw' + }, grownl_my_default_options); + } + + refreshFormComponents(); + $('#tablebody').find(':checkbox').iCheck('uncheck'); + } + }); + } + } + + var dialog = $('
') + .html(choicheHtmlModal) + .dialog({ + title:"Scegli lo stato da impostare:", + autoOpen: false, + height: 200, + width: 350, + modal: true, + buttons: { + "OK": confirmChoice, + Cancel: function() { + $(this).dialog( "close" ); + } + }, + close: function() { + $(this).dialog( "destroy" ); + } + }); + + dialog.dialog( "open" ); + + }) + .delegate(modal_id,'hidden.bs.modal',function(link){ + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + }); + + +var choicheHtmlModal = ` +
+
+ +
+
`; diff --git a/public/admin/js/handler/monitoring/event_handler_listloginviiemails.js b/public/admin/js/handler/monitoring/event_handler_listloginviiemails.js new file mode 100644 index 0000000..58b7752 --- /dev/null +++ b/public/admin/js/handler/monitoring/event_handler_listloginviiemails.js @@ -0,0 +1,114 @@ +'use strict'; + +//Specializzo la funzione resetForm nel caso ci sia bisogno di campi TEXTAREA o immagini da resettare +function myResetForm(tipo, formid) { + resetForm(tipo, formid); +} + +function edit(id) { + $('#save').attr('op', 'edit'); + let dati = 'id=' + id; + let url = $(form_id).attr('data-get'); + myResetForm('all', form_id); + $.getJSON(url, dati, function (resp) { + if (resp.success) { + $('#main_contenitor').html(resp.text); + + $(modal_id).modal('show'); + } else { + toastr.error(resp.message); + } + }); +} + +$(document).ready(function () { + initFormComponents(); + initTableFlotHeader(); +}) + .delegate('#edit,#editLink', 'click', function (link) { + link.preventDefault(); + const id = $(this).parents('tr').attr('data-id'); + edit(id); + }) + .delegate('#delete', 'click', function (link) { + link.preventDefault(); + + const url = $(form_id).attr('data-delete'); + let tr = $(this).parents('tr'); + const cod = tr.attr('data-cod'); + let id = tr.attr('data-id'); + let message = 'Sei sicuro di voler eliminare definitivamente l\'elemento?'; + + if (confirm(message)) { + $.ajax({ + type: 'POST', + url: url, + data: 'id=' + id + "&cod=" + cod, + dataType: 'json', + complete: function (resp) { + + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + + toastr.success('Eliminazione effettuata con successo'); + + } else { + toastr.error(resp.message); + } + } + }); + } + }) + .delegate('#delete_select', 'click', function (link) { + link.preventDefault(); + + let message = 'Sei sicuro di voler eliminare definitivamente gli elementi selezionati?'; + + if (confirm(message)) { + let data = []; + $('#tablebody').find(':checkbox').each(function () { + if (this.checked) { + data.push($(this).val()); + } + }); + + let url = $(this).attr('href'); + + $.ajax({ + type: 'POST', + url: url, + data: { + data: data + }, + dataType: 'json', + complete: function (resp) { + resp = jQuery.parseJSON(resp.responseText); + if (resp.success) { + var ids = resp.id; + for (var i = 0; i < ids.length; i++) { + var tr = $('#tablebody tr[data-id=' + ids[i] + ']'); + tr.animate({ + 'opacity': 'hide' + }, 500, function () { + tr.remove(); + }); + } + } else { + toastr.error(resp.message); + } + + $('#tablebody').find(':checkbox').iCheck('uncheck'); + } + }); + } + }) + .delegate(modal_id,'hidden.bs.modal',function(link){ + link.preventDefault(); + myResetForm('tutto', form_id); + $('#save').attr('op', 'insert'); + }); diff --git a/public/admin/package.json b/public/admin/package.json new file mode 100644 index 0000000..0dd4317 --- /dev/null +++ b/public/admin/package.json @@ -0,0 +1,26 @@ +{ + "name": "swadmin", + "version": "1.0.0", + "description": "SW Admin", + "dependencies": { + "@fonticonpicker/fonticonpicker": "^3.1.1", + "admin-lte": "~3.0.5", + "angular": "^1.8.0", + "angular-animate": "^1.8.0", + "angular-chart.js": "^1.1.1", + "angular-daterangepicker": "^0.2.3-alpha1", + "angular-moment": "^1.3.0", + "angular-resource": "^1.8.0", + "angularjs-toaster": "^3.0.0", + "bootstrap-datepicker": "^1.9.0", + "floatthead": "^2.2.1", + "icheck": "^1.0.2", + "jquery-form": "^4.3.0", + "jquery.cookie": "^1.4.1", + "ngstorage": "^0.3.11", + "select2": "^4.0.13", + "ui-bootstrap4": "^3.0.6" + }, + "devDependencies": {}, + "author": "" +} diff --git a/public/admin/scss/accent.scss b/public/admin/scss/accent.scss new file mode 100644 index 0000000..9d6a5a1 --- /dev/null +++ b/public/admin/scss/accent.scss @@ -0,0 +1,14 @@ + +@import "../node_modules/admin-lte/build/scss/mixins/accent"; +@import "../node_modules/admin-lte/build/scss/mixins/backgrounds"; + +$brandName: 'brand'; +@include accent-variant($brandName, $brandColor-01); + +[class*="accent-"] { + a.btn-brand { + color: color-yiq($brandColor-01); + } +} + +@include background-variant($brandName, $brandColor-01); diff --git a/public/admin/scss/cards.scss b/public/admin/scss/cards.scss new file mode 100644 index 0000000..6bedb6c --- /dev/null +++ b/public/admin/scss/cards.scss @@ -0,0 +1,95 @@ +@import "../node_modules/admin-lte/build/scss/mixins/cards"; + +$brandName: 'brand'; +@include cards-variant($brandName, $brandColor-01); + +.card-brand { + + &.card-outline-tabs, &.card-outline { + border-top: 0 !important; + } + + &.card-outline { + + .card-header { + + .nav-link { + &.active { + color: #FFFFFF !important; + background: $brandColor-01; + } + } + } + + &.card-outline-tabs { + .card-header { + + .nav-link { + &.active { + color: inherit !important; + background: whitesmoke; + border-bottom-color: whitesmoke; + } + } + } + + .card-body { + background-color: whitesmoke; + } + } + + } + + .card-header { + .nav-link { + color: $brandColor-01 !important; + } + } + +} + +.accordion-card { + box-shadow: none; + border: 1px solid #DDD; + border-radius: 4px; + + &.no-border { + border: 0; + } + + &.no-border-radius { + border-radius: 0; + } + +} + +.delivery-card { + .card-header { + padding: 8px 4px; + } + + .prodoti-list-item { + font-size: 13px; + color: #333333; + } + + .riepilogo-list-item { + font-size: 14px; + color: #333333; + } + + .totale-ordine { + margin-top: 5px; + font-weight: bold; + } + + .metodo-pagamento { + color: #333333; + } +} + +.position-card { + margin-bottom: 0; + border-top: 1px solid #DDD; +} + diff --git a/public/admin/scss/forms.scss b/public/admin/scss/forms.scss new file mode 100644 index 0000000..cec5c8a --- /dev/null +++ b/public/admin/scss/forms.scss @@ -0,0 +1,168 @@ +/****** FORM *****/ + +.form-box-container { + border: 1px solid #ddd; + margin: 10px 0; + padding: 15px; +} + +.note-editable { + min-height: 426px; +} + +.datepicker { + z-index: 1151 !important; +} + +/******* PREVIEW IMAGE *******/ + +.image-preview-input { + + background-color: #fff; + border-color: #ccc; + color: #333; + margin: 0; + overflow: hidden; + position: relative; + + input[type="file"] { + cursor: pointer; + font-size: 20px; + margin: 0; + opacity: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; + } +} + +.image-preview-input-title { + // margin-left: 2px; +} + +.image_preview_block_container{ + .logo{ + padding: 10px; + max-height: 149px; + } + + .banner{ + padding: 10px; + max-height: 200px; + } +} + +.image-preview-clear-btn{ + margin: 0; +} + +input.form-control:focus, select.form-control:focus { + border: 1px solid #3c8dbc; +} + +.form-group.has-error .form-control, .form-group.has-error .input-group-addon { + border: 1px solid #dd4b39; + box-shadow: none !important; +} + +.form-error > span { + color: #dd4b39 !important; +} + +.form-group { + .label-danger { + background: none repeat scroll 0 0 rgba(0, 0, 0, 0) !important; + color: #dd4b39 !important; + text-align: right !important; + overflow: hidden; + font-size: 12px; + } +} + +[elastic] { + min-height: 37px; +} + +textarea { + &.resize-vertical { + resize: vertical; + } + + &.resize-horizontal { + resize: horizontal; + } +} + +#modalForm label { + font-weight: normal; +} + +// ------------ COMPACT FORM ---------------------- + +.compact-form { + + &.no-border-radius { + + input, select, textarea { + border-radius: 0; + } + } + + .label-danger { + text-align: right; + } + + label { + font-size: 0.95rem; + margin-top: 7px; + font-weight: normal !important; + } + + .form-group { + margin-bottom: 5px; + + .form-control { + box-shadow: none !important; + //font-size: 0.95rem; + } + + .has-error .form-control { + box-shadow: none !important; + border: 1px solid #dd4b39; + } + + } +} + +/**** SUMMERNNOTE EDITOR ****/ + +.panel.note-editor { + border-radius: 0; + border: 1px solid #DDD; + box-shadow: none; +} + +/**** BTN RADIo BOX ****/ + +.btn-radiobox{ + .btn-app{ + + text-transform: uppercase; + + &:first-child{ + margin-left: 0; + } + + &.active{ + border-color: $brandColor-01; + i{ + color: $brandColor-01; + } + } + + input{ + display: none; + } + } +} diff --git a/public/admin/scss/general.scss b/public/admin/scss/general.scss new file mode 100644 index 0000000..d4ba3cf --- /dev/null +++ b/public/admin/scss/general.scss @@ -0,0 +1,448 @@ +body { + font-size: 15px; +} + +.form-control { + font-size: 0.95rem; +} + +//Redefine di alcuni componenti a text-sm sul body +.text-sm { + + .navbar{ + font-size: 16px !important; + height: 50px; + border-bottom: 0; + } + + .btn-group { + .btn { + font-size: 1rem !important; + } + } + + .brand-link { + font-size: 1rem; + } + +} + +$theme-colors: ( + "brand": $brandColor-01 +); + +// Generate alert modifier classes +@each $color, $value in $theme-colors { + + @include bg-variant('.bg-#{$color}', $value); + + .alert-#{$color} { + @include alert-variant(theme-color-level($color, -10), theme-color-level($color, -9), theme-color-level($color, 6)); + } + .btn-#{$color} { + @include button-variant(theme-color($color), theme-color($color), darken(theme-color($color), 10%), lighten(theme-color($color), 5%), lighten(theme-color($color), 10%), darken(theme-color($color), 30%)); + } +} + +.m0, .no-margin { + margin: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.m-5 { + margin: 5px !important; +} + +.mr-5 { + margin-right: 5px !important; +} + +.ml-5 { + margin-left: 5px !important; +} + +.mt-5 { + margin-top: 5px !important; +} + +.mb-5 { + margin-bottom: 5px !important; +} + +.m-10 { + margin: 10px !important; +} + +.mr-10 { + margin-right: 10px !important; +} + +.ml-10 { + margin-left: 10px !important; +} + +.mt-10 { + margin-top: 10px !important; +} + +.mb-10 { + margin-bottom: 10px !important; +} + +.m-15 { + margin: 15px !important; +} + +.mr-15 { + margin-right: 15px !important; +} + +.ml-15 { + margin-left: 15px !important; +} + +.mt-15 { + margin-top: 15px !important; +} + +.mb-15 { + margin-bottom: 15px !important; +} + +.m-20 { + margin: 20px !important; +} + +.mr-20 { + margin-right: 20px !important; +} + +.ml-20 { + margin-left: 20px !important; +} + +.mt-20 { + margin-top: 20px !important; +} + +.mb-20 { + margin-bottom: 20px !important; +} + + +.pd0, .no-padding { + padding: 0 !important; +} + +.pd-0 { + padding: 0 !important; +} + +.pdr-0 { + padding-right: 0 !important; +} + +.pdl-0 { + padding-left: 0 !important; +} + +.pdt-0 { + padding-top: 0 !important; +} + +.pdb-0 { + padding-bottom: 0 !important; +} + +.pd-5 { + padding: 5px !important; +} + +.pdr-5 { + padding-right: 5px !important; +} + +.pdl-5 { + padding-left: 5px !important; +} + +.pdt-5 { + padding-top: 5px !important; +} + +.pdb-5 { + padding-bottom: 5px !important; +} + +.pd-10 { + padding: 10px !important; +} + +.pdr-10 { + padding-right: 10px !important; +} + +.pdl-10 { + padding-left: 10px !important; +} + +.pdt-10 { + padding-top: 10px !important; +} + +.pdb-10 { + padding-bottom: 10px !important; +} + +.pd-15 { + padding: 15px !important; +} + +.pdr-15 { + padding-right: 15px !important; +} + +.pdl-15 { + padding-left: 15px !important; +} + +.pdt-15 { + padding-top: 15px !important; +} + +.pdb-15 { + padding-bottom: 15px !important; +} + +.pd-20 { + padding: 20px !important; +} + +.pdr-20 { + padding-right: 20px !important; +} + +.pdl-20 { + padding-left: 20px !important; +} + +.pdt-20 { + padding-top: 20px !important; +} + +.pdb-20 { + padding-bottom: 20px !important; +} + +/*------------------------------------------*/ + +.no-border-top { + border-top: 0; +} + +.no-padding-right { + padding-right: 0; +} + +.no-padding-left { + padding-left: 0; +} + +.no-padding-left > input { + border-left: 0; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 767px) { + + .no-border-right-sm { + border-right: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .no-border-top-sm { + border-top: 0; + } + + .no-border-r-l-sm { + border-radius: 0; + } + + .no-padding-l-sm { + padding-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + + input { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + + .no-padding-r-sm { + padding-right: 0; + + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + .no-padding-r-l-sm { + padding-right: 0; + padding-left: 0; + + input { + border-radius: 0; + } + } +} + +.filtratiLabel { + font-size: 13px; + padding-right: 10px; + vertical-align: bottom; + margin-top: 19px; + display: block; +} + +hr { + &.white { + border-top: 1px solid #FFF; + } + + &.dark { + border-top: 1px solid #333; + } + + &.light { + border-top: 1px solid #DDD; + } +} + + +/*------------------------------------------*/ + +.border-top-white { + border-top: 1px solid #FFF; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.border-bottom-white { + border-bottom: 1px solid #FFF; +} + +.border-right-white { + border-right: 1px solid #FFF; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.border-left-white { + border-left: 1px solid #FFF; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.sidebar-menu li.divider-md { + border-top: 3px solid #1a2226; +} + +.note-editor.note-frame { + border-radius: 0 !important; +} + +.logo-img { + position: absolute; + top: 0; + right: 15px; + max-height: 100px; +} + +.btn > .badge { + position: absolute; + top: -6px; + right: -4px; + font-size: 10px; + font-weight: 400; + z-index: 100; +} + +.main-footer { + padding: 10px 15px; +} + +//################################# CONTENT LIST ########################### + +section.content.list { + padding: 12px 0 0 0; + +} + +//Custom scroll bar +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: #f1f1f1; +} + +::-webkit-scrollbar-thumb { + background: #888; +} + +::-webkit-scrollbar-thumb:hover { + background: #555; +} + +@include media-breakpoint-down(xs) { + + .content-wrapper, .main-sidebar { + padding-top: 50px !important; + } + + .box-footer { + padding: 8px 3px !important; + } + + section.content.list { + padding: 0; + } + + section.content-header { + padding: 10px 15px 8px; + } +} + +.dropdown-menu { + z-index: 1100 !important; + font-size: 0.9rem; + padding: 5px 0; +} + +.content-header > .breadcrumb.top0 { + top: 0; +} diff --git a/public/admin/scss/index.scss b/public/admin/scss/index.scss new file mode 100644 index 0000000..ed57d3c --- /dev/null +++ b/public/admin/scss/index.scss @@ -0,0 +1,33 @@ +@import "../node_modules/bootstrap/scss/functions"; +@import "../node_modules/bootstrap/scss/_variables.scss"; +@import "../node_modules/bootstrap/scss/mixins/hover"; +@import "../node_modules/bootstrap/scss/mixins/gradients"; +@import "../node_modules/bootstrap/scss/mixins/background-variant"; +@import "../node_modules/bootstrap/scss/mixins/deprecate"; +@import "../node_modules/bootstrap/scss/mixins/box-shadow"; +@import "../node_modules/bootstrap/scss/mixins/alert"; +@import "../node_modules/bootstrap/scss/mixins/buttons"; +@import "../node_modules/bootstrap/scss/mixins/_breakpoints"; + +@import "../node_modules/admin-lte/build/scss/_variables.scss"; + +//************************ + +@import 'variables.scss'; +@import 'general.scss'; + +@import 'sidebar.scss'; +@import 'accent.scss'; +@import 'navbar.scss'; +@import 'cards.scss'; + +@import 'table.scss'; +@import 'modal_e_tabs.scss'; +// @import 'loaders.scss'; +@import 'forms.scss'; +@import 'select2.scss'; +@import 'sw-icons.scss'; + +@import 'listPage.scss'; +@import 'loginPage.scss'; +@import 'settingsPage.scss'; diff --git a/public/admin/scss/listPage.scss b/public/admin/scss/listPage.scss new file mode 100644 index 0000000..be41b3d --- /dev/null +++ b/public/admin/scss/listPage.scss @@ -0,0 +1,82 @@ +.breadcrumb{ + font-size: 14px; +} + +.dropdown-multifunction-down { + margin-top: 5px; +} + +.pagination{ + margin-top: 5px; + margin-left: 5px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal !important; + vertical-align: middle; + + .text-counter{ + margin-top:5px; + } +} + +.box-footer { + background: #FFFFFF; + padding: 4px 3px !important; +} + +.note-editor{ + box-shadow: none; +} + +.bootstrap-modal-selector { + overflow-y:scroll; +} + +.pagination-counter{ + font-size: 14px; + + label{ + margin-right:5px; + font-weight: normal !important; + } + + input.form-control{ + border-radius: 0.2rem; + } +} + +@include media-breakpoint-up(md) { + + .box-title { + + &.search-left { + width: 65%; + } + + &.search-right { + width: 35%; + + > * { + float: right; + } + } + + } + + #orderSelect { + max-width: 150px; + } + + .pagination-counter { + max-width: 150px; + margin-top: 5px; + + label { + padding-top: 5px; + } + + > .form-group { + margin-bottom: 0; + } + } +} diff --git a/public/admin/scss/loaders.scss b/public/admin/scss/loaders.scss new file mode 100644 index 0000000..e69de29 diff --git a/public/admin/scss/loginPage.scss b/public/admin/scss/loginPage.scss new file mode 100644 index 0000000..a875e03 --- /dev/null +++ b/public/admin/scss/loginPage.scss @@ -0,0 +1,23 @@ +.login-logo{ + img{ + display: block; + margin-left: auto; + margin-right:auto; + max-height: 150px; + max-width: 250px; + } +} + +.login-card-body{ + border-radius: 5px; + + .icheck-primary{ + margin-top:7px; + } +} + +.footer-login{ + margin-top:10px; + text-align: center; + font-size: 0.9em; +} diff --git a/public/admin/scss/modal_e_tabs.scss b/public/admin/scss/modal_e_tabs.scss new file mode 100644 index 0000000..fa808cf --- /dev/null +++ b/public/admin/scss/modal_e_tabs.scss @@ -0,0 +1,81 @@ +.box-border{ + border:1px solid #DDD; +} + +.box-footer{ + //min-height: 55px; + padding: 8px 10px; + border-top:1px solid #DDD; +} + +/**** MODAL **/ + +.modal-dialog > .overlay, .modal-dialog > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.modal-dialog .overlay { + z-index: 1010; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} + +.modal-dialog .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} + +.modal-dialog .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} + +.modal-body{ + background-color: whitesmoke; +} + +.modal-body .label{ + text-align: right; + margin-right: 3px; +} + +/**** TABELLA **/ + +.table-border{ + border: 1px solid #ddd; + + th{ + font-weight: 500; + } +} + +.table-border td,.table-border th{ + border-bottom: 1px solid #ddd; +} + +/**** TABS **/ +.nav-tabs a.disabled { + color: #ddd; +} + + +.modal.modal-second-level { + z-index: 2070 !important; + overflow: auto; +} + +body.modal-second,body.modal-third{ + overflow-y: hidden !important; +} + +body.modal-second .modal-backdrop { + z-index: 2069 !important; +} diff --git a/public/admin/scss/navbar.scss b/public/admin/scss/navbar.scss new file mode 100644 index 0000000..fdbc80d --- /dev/null +++ b/public/admin/scss/navbar.scss @@ -0,0 +1,9 @@ +@import "../node_modules/admin-lte/build/scss/mixins/navbar"; + +.navbar-dark-brand{ + @include navbar-variant($brandColor-01); +} + +.nav-item.dev-block{ + margin-top: 6px !important; +} diff --git a/public/admin/scss/select2.scss b/public/admin/scss/select2.scss new file mode 100644 index 0000000..fd2389b --- /dev/null +++ b/public/admin/scss/select2.scss @@ -0,0 +1,14 @@ +.select2-fullwidth{ + .select2-container{ + min-width: 100%; + } +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice{ + background-color: $brandColor-01; + border-color: $brandColor-01; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected], .select2-container--default .select2-results__option--highlighted[aria-selected]:hover{ + background-color: $brandColor-01; +} diff --git a/public/admin/scss/settingsPage.scss b/public/admin/scss/settingsPage.scss new file mode 100644 index 0000000..e462651 --- /dev/null +++ b/public/admin/scss/settingsPage.scss @@ -0,0 +1,22 @@ +/** TAB SETTINGS **/ + +#settings-tab{ + + .panel-body{ + border-top: 0; + border-right: 1px solid #DDD; + border-left: 1px solid #DDD; + border-bottom: 1px solid #DDD; + + .well{ + box-shadow: none; + } + } + +} + +.well{ + border: 1px solid #DDD; + border-radius: 5px; + padding: 10px; +} diff --git a/public/admin/scss/sidebar.scss b/public/admin/scss/sidebar.scss new file mode 100644 index 0000000..4cf6634 --- /dev/null +++ b/public/admin/scss/sidebar.scss @@ -0,0 +1,9 @@ +@import "../node_modules/admin-lte/build/scss/mixins/sidebar"; + +.sidebar-dark-brand{ + @include sidebar-color($brandColor-01); +} + + + + diff --git a/public/admin/scss/sw-icons.scss b/public/admin/scss/sw-icons.scss new file mode 100644 index 0000000..afccfae --- /dev/null +++ b/public/admin/scss/sw-icons.scss @@ -0,0 +1,14 @@ +.sw-icon-font-picker{ + width: 28px; + padding: 4px; +} + +.fip-box .sw-icon-font-picker, .icons-selector .selected-icon .sw-icon-font-picker{ + padding: 6px 4px; +} + +.icons-selector.fip-bootstrap span.current-icon, .icons-selector.fip-bootstrap span.current-icon:hover{ + background-color: $brandColor-01; + color: #fff; + border: 1px solid $brandColor-01; +} diff --git a/public/admin/scss/table.scss b/public/admin/scss/table.scss new file mode 100644 index 0000000..927c126 --- /dev/null +++ b/public/admin/scss/table.scss @@ -0,0 +1,215 @@ +.table-border { + border: 1px solid #ddd; +} + +th[data-ord] { + cursor: pointer; +} + +.floatThead-wrapper { + .box-body { + //background-color: #f5f5f5; + } +} + +.content.list { + padding: 0; +} + +.box-header { + margin-bottom: 8px; + margin-right: 8px; + margin-left: 8px; +} + +.floatThead-container{ + overflow-x: inherit !important; +} + +.table-border.flot-header { + + font-size: 0.95rem; + + border-left: 0; + border-right: 0; + + tbody { + tr { + + /*&:hover{ + td{ + background: transparent; + } + }*/ + + td { + border-top: 1px solid #DDD; + vertical-align: middle; + padding: 5px; + //background-color: #FFF; + } + } + } + + th { + background-color: #FFF; + border-bottom: 1px solid #DDD; + } + +} + +.table-wrapper { + height: 729px; + transition: height ease 0.7s; +} + +.table-responsive { + padding: 0; +} + +.table-border td, .table-border th { + border-bottom: 1px solid #ddd; +} + +table.table-popover { + font-size: 12px; +} + +table{ + margin-bottom: 0 !important; +} + +.table > thead > tr > th { + border-bottom: none !important; +} + +.popover.popover-default-variables { + border-radius: 0; + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; +} + +td.no-rows { + color: #6c757d !important; + height: 729px; + //background-color: #f5f5f5 !important; + vertical-align: middle !important; + font-size: 1.1em; + text-transform: uppercase; + text-align: center; + border: none !important; + + > i { + display: block; + font-size: 3em; + color: #6c757d !important; + } +} + +.ui-dialog { + z-index: 2000 !important; +} + +@include media-breakpoint-up(md) { + + .table-responsive { + border: none; + overflow-y: scroll; + margin: 0; + } + +} + +.table-wrapper-2,.table-wrapper-3{ + height: 200px; + overflow-y: scroll; + background: whitesmoke; + + td.no-rows{ + height: 152px !important; + + > i{ + font-size: 2em !important; + } + } +} + + +.table-tickets{ + border-top:1px solid #EEE !important; + border-bottom:1px solid #EEE !important; + border-left:none !important; + border-right:none !important; + + td{ + vertical-align: middle !important; + padding: 6px !important; + } +} + +.floatThead-table{ + + thead > tr > th{ + background: #FFF; + z-index: 1001; + padding-left: 6px !important; + padding-right: 6px !important; + } +} + +.table-righe { + border-top: 1px solid #EEE !important; + border-bottom: 1px solid #EEE !important; + border-left: none !important; + border-right: none !important; + + td { + vertical-align: middle !important; + padding: 6px !important; + } +} + +table.sottoaree-table{ + th{ + border-top:none; + box-shadow: none !important; + } + + td.no-rows{ + height: 303px !important; + + > i{ + font-size: 2em !important; + } + } +} + +.modal-with-tabs{ + .modal-header{ + border-bottom: none; + } + + .modal-body{ + + .card{ + box-shadow: none; + border-radius: 0; + } + } +} + +.modal.modal-second-level { + z-index: 2070 !important; + overflow: auto; +} + +body.modal-second .modal-backdrop { + z-index: 2069 !important; +} + +body.modal-second,body.modal-third{ + overflow-y: hidden !important; +} + + + + diff --git a/public/admin/scss/variables.scss b/public/admin/scss/variables.scss new file mode 100644 index 0000000..8a02bbb --- /dev/null +++ b/public/admin/scss/variables.scss @@ -0,0 +1,3 @@ + +$brandColor-01: #007BFF; +$logoColor: #F5B741; diff --git a/public/baseImg/NoImage.png b/public/baseImg/NoImage.png new file mode 100644 index 0000000..c9f045a Binary files /dev/null and b/public/baseImg/NoImage.png differ diff --git a/public/baseImg/logo.png b/public/baseImg/logo.png new file mode 100644 index 0000000..1624c92 Binary files /dev/null and b/public/baseImg/logo.png differ diff --git a/public/baseImg/logo_as.png b/public/baseImg/logo_as.png new file mode 100644 index 0000000..d43bb9a Binary files /dev/null and b/public/baseImg/logo_as.png differ diff --git a/public/baseImg/logo_as_full.png b/public/baseImg/logo_as_full.png new file mode 100644 index 0000000..d61fdf7 Binary files /dev/null and b/public/baseImg/logo_as_full.png differ diff --git a/public/baseImg/logo_as_medium.png b/public/baseImg/logo_as_medium.png new file mode 100644 index 0000000..f741e4d Binary files /dev/null and b/public/baseImg/logo_as_medium.png differ diff --git a/public/baseImg/logo_small.png b/public/baseImg/logo_small.png new file mode 100644 index 0000000..c015283 Binary files /dev/null and b/public/baseImg/logo_small.png differ diff --git a/public/baseImg/no_logo.png b/public/baseImg/no_logo.png new file mode 100644 index 0000000..58c88cb Binary files /dev/null and b/public/baseImg/no_logo.png differ diff --git a/public/favicons/android-icon-144x144.png b/public/favicons/android-icon-144x144.png new file mode 100644 index 0000000..c1bfcc1 Binary files /dev/null and b/public/favicons/android-icon-144x144.png differ diff --git a/public/favicons/android-icon-192x192.png b/public/favicons/android-icon-192x192.png new file mode 100644 index 0000000..d43bb9a Binary files /dev/null and b/public/favicons/android-icon-192x192.png differ diff --git a/public/favicons/android-icon-36x36.png b/public/favicons/android-icon-36x36.png new file mode 100644 index 0000000..db9ba16 Binary files /dev/null and b/public/favicons/android-icon-36x36.png differ diff --git a/public/favicons/android-icon-48x48.png b/public/favicons/android-icon-48x48.png new file mode 100644 index 0000000..bfa7235 Binary files /dev/null and b/public/favicons/android-icon-48x48.png differ diff --git a/public/favicons/android-icon-72x72.png b/public/favicons/android-icon-72x72.png new file mode 100644 index 0000000..cdc5714 Binary files /dev/null and b/public/favicons/android-icon-72x72.png differ diff --git a/public/favicons/android-icon-96x96.png b/public/favicons/android-icon-96x96.png new file mode 100644 index 0000000..bd9a186 Binary files /dev/null and b/public/favicons/android-icon-96x96.png differ diff --git a/public/favicons/apple-icon-114x114.png b/public/favicons/apple-icon-114x114.png new file mode 100644 index 0000000..4b8c2ed Binary files /dev/null and b/public/favicons/apple-icon-114x114.png differ diff --git a/public/favicons/apple-icon-120x120.png b/public/favicons/apple-icon-120x120.png new file mode 100644 index 0000000..b38a00e Binary files /dev/null and b/public/favicons/apple-icon-120x120.png differ diff --git a/public/favicons/apple-icon-144x144.png b/public/favicons/apple-icon-144x144.png new file mode 100644 index 0000000..c1bfcc1 Binary files /dev/null and b/public/favicons/apple-icon-144x144.png differ diff --git a/public/favicons/apple-icon-152x152.png b/public/favicons/apple-icon-152x152.png new file mode 100644 index 0000000..62fb5ea Binary files /dev/null and b/public/favicons/apple-icon-152x152.png differ diff --git a/public/favicons/apple-icon-180x180.png b/public/favicons/apple-icon-180x180.png new file mode 100644 index 0000000..73e3137 Binary files /dev/null and b/public/favicons/apple-icon-180x180.png differ diff --git a/public/favicons/apple-icon-57x57.png b/public/favicons/apple-icon-57x57.png new file mode 100644 index 0000000..576a151 Binary files /dev/null and b/public/favicons/apple-icon-57x57.png differ diff --git a/public/favicons/apple-icon-60x60.png b/public/favicons/apple-icon-60x60.png new file mode 100644 index 0000000..75b2e46 Binary files /dev/null and b/public/favicons/apple-icon-60x60.png differ diff --git a/public/favicons/apple-icon-72x72.png b/public/favicons/apple-icon-72x72.png new file mode 100644 index 0000000..cdc5714 Binary files /dev/null and b/public/favicons/apple-icon-72x72.png differ diff --git a/public/favicons/apple-icon-76x76.png b/public/favicons/apple-icon-76x76.png new file mode 100644 index 0000000..f7d9e18 Binary files /dev/null and b/public/favicons/apple-icon-76x76.png differ diff --git a/public/favicons/apple-icon-precomposed.png b/public/favicons/apple-icon-precomposed.png new file mode 100644 index 0000000..b261665 Binary files /dev/null and b/public/favicons/apple-icon-precomposed.png differ diff --git a/public/favicons/apple-icon.png b/public/favicons/apple-icon.png new file mode 100644 index 0000000..b261665 Binary files /dev/null and b/public/favicons/apple-icon.png differ diff --git a/public/favicons/browserconfig.xml b/public/favicons/browserconfig.xml new file mode 100644 index 0000000..c554148 --- /dev/null +++ b/public/favicons/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/public/favicons/favicon-16x16.png b/public/favicons/favicon-16x16.png new file mode 100644 index 0000000..db753a8 Binary files /dev/null and b/public/favicons/favicon-16x16.png differ diff --git a/public/favicons/favicon-32x32.png b/public/favicons/favicon-32x32.png new file mode 100644 index 0000000..4434f09 Binary files /dev/null and b/public/favicons/favicon-32x32.png differ diff --git a/public/favicons/favicon-96x96.png b/public/favicons/favicon-96x96.png new file mode 100644 index 0000000..bd9a186 Binary files /dev/null and b/public/favicons/favicon-96x96.png differ diff --git a/public/favicons/favicon.ico b/public/favicons/favicon.ico new file mode 100644 index 0000000..1d9cc4a Binary files /dev/null and b/public/favicons/favicon.ico differ diff --git a/public/favicons/manifest.json b/public/favicons/manifest.json new file mode 100644 index 0000000..013d4a6 --- /dev/null +++ b/public/favicons/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/public/favicons/ms-icon-144x144.png b/public/favicons/ms-icon-144x144.png new file mode 100644 index 0000000..c1bfcc1 Binary files /dev/null and b/public/favicons/ms-icon-144x144.png differ diff --git a/public/favicons/ms-icon-150x150.png b/public/favicons/ms-icon-150x150.png new file mode 100644 index 0000000..02171c8 Binary files /dev/null and b/public/favicons/ms-icon-150x150.png differ diff --git a/public/favicons/ms-icon-310x310.png b/public/favicons/ms-icon-310x310.png new file mode 100644 index 0000000..d3e6fdb Binary files /dev/null and b/public/favicons/ms-icon-310x310.png differ diff --git a/public/favicons/ms-icon-70x70.png b/public/favicons/ms-icon-70x70.png new file mode 100644 index 0000000..691e57c Binary files /dev/null and b/public/favicons/ms-icon-70x70.png differ diff --git a/public/front/assets/css/libs.bundle.css b/public/front/assets/css/libs.bundle.css new file mode 100644 index 0000000..7814d77 --- /dev/null +++ b/public/front/assets/css/libs.bundle.css @@ -0,0 +1,12 @@ +[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos]{pointer-events:none}[data-aos].aos-animate{pointer-events:auto}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}@media screen{html:not(.no-js) [data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}html:not(.no-js) [data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;-webkit-transform:none;transform:none}html:not(.no-js) [data-aos=fade-up]{-webkit-transform:translate3d(0,100px,0);transform:translate3d(0,100px,0)}html:not(.no-js) [data-aos=fade-down]{-webkit-transform:translate3d(0,-100px,0);transform:translate3d(0,-100px,0)}html:not(.no-js) [data-aos=fade-right]{-webkit-transform:translate3d(-100px,0,0);transform:translate3d(-100px,0,0)}html:not(.no-js) [data-aos=fade-left]{-webkit-transform:translate3d(100px,0,0);transform:translate3d(100px,0,0)}html:not(.no-js) [data-aos=fade-up-right]{-webkit-transform:translate3d(-100px,100px,0);transform:translate3d(-100px,100px,0)}html:not(.no-js) [data-aos=fade-up-left]{-webkit-transform:translate3d(100px,100px,0);transform:translate3d(100px,100px,0)}html:not(.no-js) [data-aos=fade-down-right]{-webkit-transform:translate3d(-100px,-100px,0);transform:translate3d(-100px,-100px,0)}html:not(.no-js) [data-aos=fade-down-left]{-webkit-transform:translate3d(100px,-100px,0);transform:translate3d(100px,-100px,0)}html:not(.no-js) [data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}html:not(.no-js) [data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;-webkit-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1)}html:not(.no-js) [data-aos=zoom-in]{-webkit-transform:scale(.6);transform:scale(.6)}html:not(.no-js) [data-aos=zoom-in-up]{-webkit-transform:translate3d(0,100px,0) scale(.6);transform:translate3d(0,100px,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-down]{-webkit-transform:translate3d(0,-100px,0) scale(.6);transform:translate3d(0,-100px,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-right]{-webkit-transform:translate3d(-100px,0,0) scale(.6);transform:translate3d(-100px,0,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-left]{-webkit-transform:translate3d(100px,0,0) scale(.6);transform:translate3d(100px,0,0) scale(.6)}html:not(.no-js) [data-aos=zoom-out]{-webkit-transform:scale(1.2);transform:scale(1.2)}html:not(.no-js) [data-aos=zoom-out-up]{-webkit-transform:translate3d(0,100px,0) scale(1.2);transform:translate3d(0,100px,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-down]{-webkit-transform:translate3d(0,-100px,0) scale(1.2);transform:translate3d(0,-100px,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-right]{-webkit-transform:translate3d(-100px,0,0) scale(1.2);transform:translate3d(-100px,0,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-left]{-webkit-transform:translate3d(100px,0,0) scale(1.2);transform:translate3d(100px,0,0) scale(1.2)}html:not(.no-js) [data-aos^=slide][data-aos^=slide]{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;visibility:hidden}html:not(.no-js) [data-aos^=slide][data-aos^=slide].aos-animate{-webkit-transform:translateZ(0);transform:translateZ(0);visibility:visible}html:not(.no-js) [data-aos=slide-up]{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}html:not(.no-js) [data-aos=slide-down]{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}html:not(.no-js) [data-aos=slide-right]{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}html:not(.no-js) [data-aos=slide-left]{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}html:not(.no-js) [data-aos^=flip][data-aos^=flip]{-webkit-backface-visibility:hidden;backface-visibility:hidden;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}html:not(.no-js) [data-aos=flip-left]{-webkit-transform:perspective(2500px) rotateY(-100deg);transform:perspective(2500px) rotateY(-100deg)}html:not(.no-js) [data-aos=flip-left].aos-animate{-webkit-transform:perspective(2500px) rotateY(0);transform:perspective(2500px) rotateY(0)}html:not(.no-js) [data-aos=flip-right]{-webkit-transform:perspective(2500px) rotateY(100deg);transform:perspective(2500px) rotateY(100deg)}html:not(.no-js) [data-aos=flip-right].aos-animate{-webkit-transform:perspective(2500px) rotateY(0);transform:perspective(2500px) rotateY(0)}html:not(.no-js) [data-aos=flip-up]{-webkit-transform:perspective(2500px) rotateX(-100deg);transform:perspective(2500px) rotateX(-100deg)}html:not(.no-js) [data-aos=flip-up].aos-animate{-webkit-transform:perspective(2500px) rotateX(0);transform:perspective(2500px) rotateX(0)}html:not(.no-js) [data-aos=flip-down]{-webkit-transform:perspective(2500px) rotateX(100deg);transform:perspective(2500px) rotateX(100deg)}html:not(.no-js) [data-aos=flip-down].aos-animate{-webkit-transform:perspective(2500px) rotateX(0);transform:perspective(2500px) rotateX(0)}} +/*! Flickity v2.2.2 +https://flickity.metafizzy.co +---------------------------------------------- */.flickity-enabled{position:relative}.flickity-enabled:focus{outline:0}.flickity-viewport{height:100%;overflow:hidden;position:relative}.flickity-slider{height:100%;position:absolute;width:100%}.flickity-enabled.is-draggable{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.flickity-enabled.is-draggable .flickity-viewport{cursor:move;cursor:-webkit-grab;cursor:grab}.flickity-enabled.is-draggable .flickity-viewport.is-pointer-down{cursor:-webkit-grabbing;cursor:grabbing}.flickity-button{background:hsla(0,0%,100%,.75);border:none;color:#333;position:absolute}.flickity-button:hover{background:#fff;cursor:pointer}.flickity-button:focus{box-shadow:0 0 0 5px #19f;outline:0}.flickity-button:active{opacity:.6}.flickity-button:disabled{cursor:auto;opacity:.3;pointer-events:none}.flickity-button-icon{fill:currentColor}.flickity-prev-next-button{border-radius:50%;height:44px;top:50%;transform:translateY(-50%);width:44px}.flickity-prev-next-button.previous{left:10px}.flickity-prev-next-button.next{right:10px}.flickity-rtl .flickity-prev-next-button.previous{left:auto;right:10px}.flickity-rtl .flickity-prev-next-button.next{left:10px;right:auto}.flickity-prev-next-button .flickity-button-icon{height:60%;left:20%;position:absolute;top:20%;width:60%}.flickity-page-dots{bottom:-25px;line-height:1;list-style:none;margin:0;padding:0;position:absolute;text-align:center;width:100%}.flickity-rtl .flickity-page-dots{direction:rtl}.flickity-page-dots .dot{background:#333;border-radius:50%;cursor:pointer;display:inline-block;height:10px;margin:0 8px;opacity:.25;width:10px}.flickity-page-dots .dot.is-selected{opacity:1}.flickity-enabled.is-fade .flickity-slider>*{pointer-events:none;z-index:0}.flickity-enabled.is-fade .flickity-slider>.is-selected{pointer-events:auto;z-index:1}.hljs{background:#1e1e1e;color:#dcdcdc;display:block;overflow-x:auto;padding:.5em}.hljs-keyword,.hljs-link,.hljs-literal,.hljs-name,.hljs-symbol{color:#569cd6}.hljs-link{text-decoration:underline}.hljs-built_in,.hljs-type{color:#4ec9b0}.hljs-class,.hljs-number{color:#b8d7a3}.hljs-meta-string,.hljs-string{color:#d69d85}.hljs-regexp,.hljs-template-tag{color:#9a5334}.hljs-formula,.hljs-function,.hljs-params,.hljs-subst,.hljs-title{color:#dcdcdc}.hljs-comment,.hljs-quote{color:#57a64a;font-style:italic}.hljs-doctag{color:#608b4e}.hljs-meta,.hljs-meta-keyword,.hljs-tag{color:#9b9b9b}.hljs-template-variable,.hljs-variable{color:#bd63c5}.hljs-attr,.hljs-attribute,.hljs-builtin-name{color:#9cdcfe}.hljs-section{color:gold}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-bullet,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{color:#d7ba7d}.hljs-addition{background-color:#144212}.hljs-addition,.hljs-deletion{display:inline-block;width:100%}.hljs-deletion{background-color:#600} + +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{height:1px;left:-100000px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{word-wrap:break-word;box-sizing:border-box;height:100%;line-height:1.42;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap}.ql-editor>*{cursor:text}.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6,.ql-editor ol,.ql-editor p,.ql-editor pre,.ql-editor ul{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;margin:0;padding:0}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:"\2022"}.ql-editor ul[data-checked=false],.ql-editor ul[data-checked=true]{pointer-events:none}.ql-editor ul[data-checked=false]>li *,.ql-editor ul[data-checked=true]>li *{pointer-events:all}.ql-editor ul[data-checked=false]>li:before,.ql-editor ul[data-checked=true]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:"\2611"}.ql-editor ul[data-checked=false]>li:before{content:"\2610"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-increment:list-0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li:before{content:counter(list-0,decimal) ". "}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) ". "}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) ". "}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) ". "}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) ". "}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) ". "}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) ". "}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) ". "}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) ". "}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) ". "}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:rgba(0,0,0,.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px} +/*# sourceMappingURL=libs.bundle.css.map*/ \ No newline at end of file diff --git a/public/front/assets/css/libs.bundle.css.map b/public/front/assets/css/libs.bundle.css.map new file mode 100644 index 0000000..8d9a075 --- /dev/null +++ b/public/front/assets/css/libs.bundle.css.map @@ -0,0 +1 @@ +{"version":3,"file":"./css/libs.bundle.css","mappings":"AAAA,qFAAqF,wBAAwB,CAAC,+EAA+E,mBAAmB,CAAC,uGAAuG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,uFAAuF,uBAAuB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,oBAAoB,CAAC,uFAAuF,wBAAwB,CAAC,iFAAiF,mBAAmB,CAAC,yGAAyG,qBAAqB,CAAC,yFAAyF,sBAAsB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,mBAAmB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,sBAAsB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,mBAAmB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,wBAAwB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,qBAAqB,CAAC,yFAAyF,yBAAyB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,sBAAsB,CAAC,yFAAyF,sBAAsB,CAAC,mFAAmF,mBAAmB,CAAC,2GAA2G,mBAAmB,CAAC,WAAW,mBAAmB,CAAC,uBAAuB,mBAAmB,CAAC,qFAAqF,wDAAwD,CAAC,iFAAiF,+BAA+B,CAAC,uFAAuF,kCAAkC,CAAC,yFAAyF,mCAAmC,CAAC,+FAA+F,sCAAsC,CAAC,iGAAiG,0DAA0D,CAAC,mGAAmG,4DAA4D,CAAC,yGAAyG,2DAA2D,CAAC,iGAAiG,wDAAwD,CAAC,mGAAmG,wDAAwD,CAAC,yGAAyG,yDAAyD,CAAC,iGAAiG,yDAAyD,CAAC,mGAAmG,wDAAwD,CAAC,yGAAyG,2DAA2D,CAAC,mGAAmG,yDAAyD,CAAC,qGAAqG,wDAAwD,CAAC,2GAA2G,2DAA2D,CAAC,mGAAmG,yDAAyD,CAAC,qGAAqG,wDAAwD,CAAC,2GAA2G,2DAA2D,CAAC,cAAc,kDAAkD,SAAS,CAAC,6CAA6C,CAAC,qCAAqC,CAAC,uDAAuD,CAAC,8DAA8D,SAAS,CAAC,sBAAsB,CAAC,cAAc,CAAC,oCAAoC,wCAAwC,CAAC,gCAAgC,CAAC,sCAAsC,yCAAyC,CAAC,iCAAiC,CAAC,uCAAuC,yCAAyC,CAAC,iCAAiC,CAAC,sCAAsC,wCAAwC,CAAC,gCAAgC,CAAC,0CAA0C,6CAA6C,CAAC,qCAAqC,CAAC,yCAAyC,4CAA4C,CAAC,oCAAoC,CAAC,4CAA4C,8CAA8C,CAAC,sCAAsC,CAAC,2CAA2C,6CAA6C,CAAC,qCAAqC,CAAC,kDAAkD,SAAS,CAAC,6CAA6C,CAAC,qCAAqC,CAAC,uDAAuD,CAAC,8DAA8D,SAAS,CAAC,wCAAwC,CAAC,gCAAgC,CAAC,oCAAoC,2BAA2B,CAAC,mBAAmB,CAAC,uCAAuC,kDAAkD,CAAC,0CAA0C,CAAC,yCAAyC,mDAAmD,CAAC,2CAA2C,CAAC,0CAA0C,mDAAmD,CAAC,2CAA2C,CAAC,yCAAyC,kDAAkD,CAAC,0CAA0C,CAAC,qCAAqC,4BAA4B,CAAC,oBAAoB,CAAC,wCAAwC,mDAAmD,CAAC,2CAA2C,CAAC,0CAA0C,oDAAoD,CAAC,4CAA4C,CAAC,2CAA2C,oDAAoD,CAAC,4CAA4C,CAAC,0CAA0C,mDAAmD,CAAC,2CAA2C,CAAC,oDAAoD,qCAAqC,CAAC,6BAA6B,CAAC,+CAA+C,CAAC,iBAAiB,CAAC,gEAAmF,+BAA+B,CAAC,wBAAnD,kBAA0E,CAAC,qCAAqC,uCAAuC,CAAC,+BAA+B,CAAC,uCAAuC,wCAAwC,CAAC,gCAAgC,CAAC,wCAAwC,wCAAwC,CAAC,gCAAgC,CAAC,uCAAuC,uCAAuC,CAAC,+BAA+B,CAAC,kDAAkD,kCAAkC,CAAC,0BAA0B,CAAC,qCAAqC,CAAC,6BAA6B,CAAC,+CAA+C,CAAC,sCAAsC,sDAAsD,CAAC,8CAA8C,CAAC,kDAAkD,gDAAgD,CAAC,wCAAwC,CAAC,uCAAuC,qDAAqD,CAAC,6CAA6C,CAAC,mDAAmD,gDAAgD,CAAC,wCAAwC,CAAC,oCAAoC,sDAAsD,CAAC,8CAA8C,CAAC,gDAAgD,gDAAgD,CAAC,wCAAwC,CAAC,sCAAsC,qDAAqD,CAAC,6CAA6C,CAAC,kDAAkD,gDAAgD,CAAC,wCAAwC,CAAC;ACA5l4B;;gDAEgD,CAChD,kBAAkB,iBAAiB,CAAC,wBAAwB,SAAS,CAAC,mBAAqD,YAAlC,eAAe,CAAC,iBAA6B,CAAC,iBAA8C,YAA7B,iBAAiB,CAAC,UAAsB,CAAC,+BAA+B,uCAAuC,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,kDAAkD,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,kEAAkE,uBAAuB,CAAC,eAAe,CAAC,iBAAmC,8BAA8B,CAAC,WAAW,CAAC,WAA7D,iBAAuE,CAAC,uBAAuB,eAAe,CAAC,cAAc,CAAC,uBAAiC,0BAAV,SAAmC,CAAC,wBAAwB,UAAU,CAAC,0BAAqC,WAAW,CAAtB,UAAU,CAAa,mBAAmB,CAAC,sBAAsB,iBAAiB,CAAC,2BAA0D,iBAAiB,CAA7B,WAAW,CAA9B,OAAO,CAA0C,2BAAzC,UAAmE,CAAC,oCAAoC,SAAS,CAAC,gCAAgC,UAAU,CAAC,kDAAkD,SAAS,CAAC,UAAU,CAAC,8CAAyD,UAAX,UAAoB,CAAC,iDAA8F,WAA3B,QAAQ,CAA1B,iBAAiB,CAAU,OAAO,CAAC,SAAoB,CAAC,oBAAiD,YAAY,CAAsD,cAAlC,eAAe,CAAxB,QAAQ,CAAlB,SAAS,CAAnD,iBAAiB,CAA4D,iBAAiB,CAA5E,UAA0F,CAAC,kCAAkC,aAAa,CAAC,yBAAkF,eAAe,CAAC,iBAAiB,CAAa,eAAvG,oBAAoB,CAAY,WAAW,CAAC,YAAY,CAAmC,WAAW,CAAjF,UAAgG,CAAC,qCAAqC,SAAS,CCDhqD,6CACE,mBAAoB,CACpB,SACF,CAEA,wDACE,mBAAoB,CACpB,SACF,CCLA,MAIE,kBAAmB,CACnB,aAAc,CAJd,aAAc,CACd,eAAgB,CAChB,YAGF,CAQA,+DAFE,aAKF,CAHA,WAEE,yBACF,CAEA,0BAEE,aACF,CAEA,yBAEE,aACF,CAEA,+BAEE,aACF,CAEA,gCAEE,aACF,CAEA,kEAKE,aACF,CAEA,0BAEE,aAAc,CACd,iBACF,CAEA,aACE,aACF,CAEA,wCAGE,aACF,CAEA,uCAEE,aACF,CAEA,8CAGE,aACF,CAEA,cACE,UACF,CAEA,eACE,iBACF,CAEA,aACE,eACF,CAMA,iHAME,aACF,CAEA,eACE,wBAGF,CAEA,8BAJE,oBAAqB,CACrB,UAOF,CAJA,eACE,qBAGF;;AClHA;;;;;EAKE,CACF,cACE,qBAAsB,CACtB,sCAAyC,CACzC,cAAe,CACf,WAAY,CACZ,QAAW,CACX,iBACF,CACA,sCACE,iBACF,CACA,gEACE,mBACF,CACA,cAEE,UAAW,CADX,cAAe,CAEf,iBAAkB,CAClB,iBAAkB,CAClB,OACF,CACA,gBACE,QAAS,CACT,SACF,CACA,WAWE,oBAAqB,CAVrB,qBAAsB,CAEtB,WAAY,CADZ,gBAAiB,CAEjB,YAAa,CACb,eAAgB,CAChB,iBAAkB,CAClB,UAAW,CACX,eAAgB,CAChB,eAAgB,CAChB,oBAEF,CACA,aACE,WACF,CACA,kKAaE,4EAA6E,CAF7E,QAAS,CACT,SAEF,CACA,4BAEE,kBACF,CACA,kCAEE,oBACF,CACA,wBACE,eACF,CACA,mEAEE,mBACF,CACA,6EAEE,kBACF,CACA,uFAEE,UAAW,CACX,cAAe,CACf,kBACF,CACA,2CACE,eACF,CACA,4CACE,eACF,CACA,qBACE,oBAAqB,CACrB,kBAAmB,CACnB,WACF,CACA,4CACE,kBAAmB,CACnB,iBAAmB,CACnB,gBACF,CACA,sCACE,gBAAkB,CAClB,mBACF,CACA,gFAEE,kBACF,CACA,oEAEE,mBACF,CACA,iBAEE,wBAAyB,CADzB,4EAEF,CACA,wBACE,oCACF,CACA,6BACE,wBACF,CACA,oCACE,wCACF,CACA,6BACE,qEACF,CACA,6BACE,wBACF,CACA,oCACE,wCACF,CACA,6BACE,8DACF,CACA,6BACE,wBACF,CACA,oCACE,oCACF,CACA,6BACE,uDACF,CACA,6BACE,wBACF,CACA,oCACE,wCACF,CACA,6BACE,gDACF,CACA,6BACE,wBACF,CACA,oCACE,wCACF,CACA,6BACE,yCACF,CACA,6BACE,wBACF,CACA,oCACE,oCACF,CACA,6BACE,kCACF,CACA,6BACE,wBACF,CACA,oCACE,wCACF,CACA,6BACE,2BACF,CACA,6BACE,wBACF,CACA,oCACE,wCACF,CACA,6BACE,oBACF,CACA,6BACE,wBACF,CACA,oCACE,oCACF,CACA,+CACE,gBACF,CACA,iDACE,kBACF,CACA,wDACE,iBACF,CACA,0DACE,mBACF,CACA,+CACE,gBACF,CACA,iDACE,kBACF,CACA,wDACE,iBACF,CACA,0DACE,mBACF,CACA,+CACE,gBACF,CACA,iDACE,mBACF,CACA,wDACE,iBACF,CACA,0DACE,oBACF,CACA,+CACE,iBACF,CACA,iDACE,mBACF,CACA,wDACE,kBACF,CACA,0DACE,oBACF,CACA,+CACE,iBACF,CACA,iDACE,mBACF,CACA,wDACE,kBACF,CACA,0DACE,oBACF,CACA,+CACE,iBACF,CACA,iDACE,mBACF,CACA,wDACE,kBACF,CACA,0DACE,oBACF,CACA,+CACE,iBACF,CACA,iDACE,mBACF,CACA,wDACE,kBACF,CACA,0DACE,oBACF,CACA,+CACE,iBACF,CACA,iDACE,mBACF,CACA,wDACE,kBACF,CACA,0DACE,oBACF,CACA,+CACE,iBACF,CACA,iDACE,mBACF,CACA,wDACE,kBACF,CACA,0DACE,oBACF,CACA,qBACE,aAAc,CACd,cACF,CACA,qCACE,aACF,CACA,oCACE,iBACF,CACA,wBACE,qBACF,CACA,sBACE,wBACF,CACA,yBACE,qBACF,CACA,yBACE,qBACF,CACA,wBACE,wBACF,CACA,uBACE,qBACF,CACA,yBACE,qBACF,CACA,2BACE,UACF,CACA,yBACE,aACF,CACA,4BACE,UACF,CACA,4BACE,UACF,CACA,2BACE,aACF,CACA,0BACE,UACF,CACA,4BACE,UACF,CACA,0BACE,yCACF,CACA,8BACE,wCACF,CACA,0BACE,eACF,CACA,0BACE,eACF,CACA,yBACE,eACF,CACA,6BACE,aAAc,CACd,kBACF,CACA,4BACE,iBACF,CACA,6BACE,kBACF,CACA,2BACE,gBACF,CACA,2BACE,oBAAsB,CACtB,8BAA+B,CAC/B,iBAAkB,CAClB,SAAU,CACV,mBAAoB,CACpB,iBAAkB,CAClB,UACF","sources":["webpack://landkit/./node_modules/aos/dist/aos.css","webpack://landkit/./node_modules/flickity/dist/flickity.min.css","webpack://landkit/./node_modules/flickity-fade/flickity-fade.css","webpack://landkit/./node_modules/highlight.js/styles/vs2015.css","webpack://landkit/./node_modules/quill/dist/quill.core.css"],"sourcesContent":["[data-aos][data-aos][data-aos-duration=\"50\"],body[data-aos-duration=\"50\"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay=\"50\"],body[data-aos-delay=\"50\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"50\"].aos-animate,body[data-aos-delay=\"50\"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration=\"100\"],body[data-aos-duration=\"100\"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay=\"100\"],body[data-aos-delay=\"100\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"100\"].aos-animate,body[data-aos-delay=\"100\"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration=\"150\"],body[data-aos-duration=\"150\"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay=\"150\"],body[data-aos-delay=\"150\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"150\"].aos-animate,body[data-aos-delay=\"150\"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration=\"200\"],body[data-aos-duration=\"200\"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay=\"200\"],body[data-aos-delay=\"200\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"200\"].aos-animate,body[data-aos-delay=\"200\"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration=\"250\"],body[data-aos-duration=\"250\"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay=\"250\"],body[data-aos-delay=\"250\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"250\"].aos-animate,body[data-aos-delay=\"250\"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration=\"300\"],body[data-aos-duration=\"300\"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay=\"300\"],body[data-aos-delay=\"300\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"300\"].aos-animate,body[data-aos-delay=\"300\"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration=\"350\"],body[data-aos-duration=\"350\"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay=\"350\"],body[data-aos-delay=\"350\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"350\"].aos-animate,body[data-aos-delay=\"350\"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration=\"400\"],body[data-aos-duration=\"400\"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay=\"400\"],body[data-aos-delay=\"400\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"400\"].aos-animate,body[data-aos-delay=\"400\"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration=\"450\"],body[data-aos-duration=\"450\"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay=\"450\"],body[data-aos-delay=\"450\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"450\"].aos-animate,body[data-aos-delay=\"450\"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration=\"500\"],body[data-aos-duration=\"500\"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay=\"500\"],body[data-aos-delay=\"500\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"500\"].aos-animate,body[data-aos-delay=\"500\"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration=\"550\"],body[data-aos-duration=\"550\"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay=\"550\"],body[data-aos-delay=\"550\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"550\"].aos-animate,body[data-aos-delay=\"550\"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration=\"600\"],body[data-aos-duration=\"600\"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay=\"600\"],body[data-aos-delay=\"600\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"600\"].aos-animate,body[data-aos-delay=\"600\"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration=\"650\"],body[data-aos-duration=\"650\"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay=\"650\"],body[data-aos-delay=\"650\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"650\"].aos-animate,body[data-aos-delay=\"650\"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration=\"700\"],body[data-aos-duration=\"700\"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay=\"700\"],body[data-aos-delay=\"700\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"700\"].aos-animate,body[data-aos-delay=\"700\"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration=\"750\"],body[data-aos-duration=\"750\"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay=\"750\"],body[data-aos-delay=\"750\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"750\"].aos-animate,body[data-aos-delay=\"750\"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration=\"800\"],body[data-aos-duration=\"800\"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay=\"800\"],body[data-aos-delay=\"800\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"800\"].aos-animate,body[data-aos-delay=\"800\"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration=\"850\"],body[data-aos-duration=\"850\"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay=\"850\"],body[data-aos-delay=\"850\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"850\"].aos-animate,body[data-aos-delay=\"850\"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration=\"900\"],body[data-aos-duration=\"900\"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay=\"900\"],body[data-aos-delay=\"900\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"900\"].aos-animate,body[data-aos-delay=\"900\"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration=\"950\"],body[data-aos-duration=\"950\"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay=\"950\"],body[data-aos-delay=\"950\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"950\"].aos-animate,body[data-aos-delay=\"950\"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration=\"1000\"],body[data-aos-duration=\"1000\"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay=\"1000\"],body[data-aos-delay=\"1000\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1000\"].aos-animate,body[data-aos-delay=\"1000\"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration=\"1050\"],body[data-aos-duration=\"1050\"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay=\"1050\"],body[data-aos-delay=\"1050\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1050\"].aos-animate,body[data-aos-delay=\"1050\"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration=\"1100\"],body[data-aos-duration=\"1100\"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay=\"1100\"],body[data-aos-delay=\"1100\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1100\"].aos-animate,body[data-aos-delay=\"1100\"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration=\"1150\"],body[data-aos-duration=\"1150\"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay=\"1150\"],body[data-aos-delay=\"1150\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1150\"].aos-animate,body[data-aos-delay=\"1150\"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration=\"1200\"],body[data-aos-duration=\"1200\"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay=\"1200\"],body[data-aos-delay=\"1200\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1200\"].aos-animate,body[data-aos-delay=\"1200\"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration=\"1250\"],body[data-aos-duration=\"1250\"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay=\"1250\"],body[data-aos-delay=\"1250\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1250\"].aos-animate,body[data-aos-delay=\"1250\"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration=\"1300\"],body[data-aos-duration=\"1300\"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay=\"1300\"],body[data-aos-delay=\"1300\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1300\"].aos-animate,body[data-aos-delay=\"1300\"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration=\"1350\"],body[data-aos-duration=\"1350\"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay=\"1350\"],body[data-aos-delay=\"1350\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1350\"].aos-animate,body[data-aos-delay=\"1350\"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration=\"1400\"],body[data-aos-duration=\"1400\"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay=\"1400\"],body[data-aos-delay=\"1400\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1400\"].aos-animate,body[data-aos-delay=\"1400\"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration=\"1450\"],body[data-aos-duration=\"1450\"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay=\"1450\"],body[data-aos-delay=\"1450\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1450\"].aos-animate,body[data-aos-delay=\"1450\"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration=\"1500\"],body[data-aos-duration=\"1500\"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay=\"1500\"],body[data-aos-delay=\"1500\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1500\"].aos-animate,body[data-aos-delay=\"1500\"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration=\"1550\"],body[data-aos-duration=\"1550\"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay=\"1550\"],body[data-aos-delay=\"1550\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1550\"].aos-animate,body[data-aos-delay=\"1550\"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration=\"1600\"],body[data-aos-duration=\"1600\"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay=\"1600\"],body[data-aos-delay=\"1600\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1600\"].aos-animate,body[data-aos-delay=\"1600\"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration=\"1650\"],body[data-aos-duration=\"1650\"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay=\"1650\"],body[data-aos-delay=\"1650\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1650\"].aos-animate,body[data-aos-delay=\"1650\"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration=\"1700\"],body[data-aos-duration=\"1700\"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay=\"1700\"],body[data-aos-delay=\"1700\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1700\"].aos-animate,body[data-aos-delay=\"1700\"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration=\"1750\"],body[data-aos-duration=\"1750\"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay=\"1750\"],body[data-aos-delay=\"1750\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1750\"].aos-animate,body[data-aos-delay=\"1750\"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration=\"1800\"],body[data-aos-duration=\"1800\"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay=\"1800\"],body[data-aos-delay=\"1800\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1800\"].aos-animate,body[data-aos-delay=\"1800\"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration=\"1850\"],body[data-aos-duration=\"1850\"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay=\"1850\"],body[data-aos-delay=\"1850\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1850\"].aos-animate,body[data-aos-delay=\"1850\"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration=\"1900\"],body[data-aos-duration=\"1900\"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay=\"1900\"],body[data-aos-delay=\"1900\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1900\"].aos-animate,body[data-aos-delay=\"1900\"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration=\"1950\"],body[data-aos-duration=\"1950\"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay=\"1950\"],body[data-aos-delay=\"1950\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"1950\"].aos-animate,body[data-aos-delay=\"1950\"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration=\"2000\"],body[data-aos-duration=\"2000\"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay=\"2000\"],body[data-aos-delay=\"2000\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2000\"].aos-animate,body[data-aos-delay=\"2000\"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration=\"2050\"],body[data-aos-duration=\"2050\"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay=\"2050\"],body[data-aos-delay=\"2050\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2050\"].aos-animate,body[data-aos-delay=\"2050\"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration=\"2100\"],body[data-aos-duration=\"2100\"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay=\"2100\"],body[data-aos-delay=\"2100\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2100\"].aos-animate,body[data-aos-delay=\"2100\"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration=\"2150\"],body[data-aos-duration=\"2150\"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay=\"2150\"],body[data-aos-delay=\"2150\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2150\"].aos-animate,body[data-aos-delay=\"2150\"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration=\"2200\"],body[data-aos-duration=\"2200\"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay=\"2200\"],body[data-aos-delay=\"2200\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2200\"].aos-animate,body[data-aos-delay=\"2200\"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration=\"2250\"],body[data-aos-duration=\"2250\"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay=\"2250\"],body[data-aos-delay=\"2250\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2250\"].aos-animate,body[data-aos-delay=\"2250\"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration=\"2300\"],body[data-aos-duration=\"2300\"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay=\"2300\"],body[data-aos-delay=\"2300\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2300\"].aos-animate,body[data-aos-delay=\"2300\"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration=\"2350\"],body[data-aos-duration=\"2350\"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay=\"2350\"],body[data-aos-delay=\"2350\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2350\"].aos-animate,body[data-aos-delay=\"2350\"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration=\"2400\"],body[data-aos-duration=\"2400\"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay=\"2400\"],body[data-aos-delay=\"2400\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2400\"].aos-animate,body[data-aos-delay=\"2400\"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration=\"2450\"],body[data-aos-duration=\"2450\"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay=\"2450\"],body[data-aos-delay=\"2450\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2450\"].aos-animate,body[data-aos-delay=\"2450\"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration=\"2500\"],body[data-aos-duration=\"2500\"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay=\"2500\"],body[data-aos-delay=\"2500\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2500\"].aos-animate,body[data-aos-delay=\"2500\"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration=\"2550\"],body[data-aos-duration=\"2550\"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay=\"2550\"],body[data-aos-delay=\"2550\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2550\"].aos-animate,body[data-aos-delay=\"2550\"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration=\"2600\"],body[data-aos-duration=\"2600\"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay=\"2600\"],body[data-aos-delay=\"2600\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2600\"].aos-animate,body[data-aos-delay=\"2600\"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration=\"2650\"],body[data-aos-duration=\"2650\"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay=\"2650\"],body[data-aos-delay=\"2650\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2650\"].aos-animate,body[data-aos-delay=\"2650\"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration=\"2700\"],body[data-aos-duration=\"2700\"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay=\"2700\"],body[data-aos-delay=\"2700\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2700\"].aos-animate,body[data-aos-delay=\"2700\"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration=\"2750\"],body[data-aos-duration=\"2750\"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay=\"2750\"],body[data-aos-delay=\"2750\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2750\"].aos-animate,body[data-aos-delay=\"2750\"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration=\"2800\"],body[data-aos-duration=\"2800\"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay=\"2800\"],body[data-aos-delay=\"2800\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2800\"].aos-animate,body[data-aos-delay=\"2800\"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration=\"2850\"],body[data-aos-duration=\"2850\"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay=\"2850\"],body[data-aos-delay=\"2850\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2850\"].aos-animate,body[data-aos-delay=\"2850\"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration=\"2900\"],body[data-aos-duration=\"2900\"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay=\"2900\"],body[data-aos-delay=\"2900\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2900\"].aos-animate,body[data-aos-delay=\"2900\"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration=\"2950\"],body[data-aos-duration=\"2950\"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay=\"2950\"],body[data-aos-delay=\"2950\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"2950\"].aos-animate,body[data-aos-delay=\"2950\"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration=\"3000\"],body[data-aos-duration=\"3000\"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay=\"3000\"],body[data-aos-delay=\"3000\"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay=\"3000\"].aos-animate,body[data-aos-delay=\"3000\"] [data-aos].aos-animate{transition-delay:3s}[data-aos]{pointer-events:none}[data-aos].aos-animate{pointer-events:auto}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}@media screen{html:not(.no-js) [data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}html:not(.no-js) [data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;-webkit-transform:none;transform:none}html:not(.no-js) [data-aos=fade-up]{-webkit-transform:translate3d(0,100px,0);transform:translate3d(0,100px,0)}html:not(.no-js) [data-aos=fade-down]{-webkit-transform:translate3d(0,-100px,0);transform:translate3d(0,-100px,0)}html:not(.no-js) [data-aos=fade-right]{-webkit-transform:translate3d(-100px,0,0);transform:translate3d(-100px,0,0)}html:not(.no-js) [data-aos=fade-left]{-webkit-transform:translate3d(100px,0,0);transform:translate3d(100px,0,0)}html:not(.no-js) [data-aos=fade-up-right]{-webkit-transform:translate3d(-100px,100px,0);transform:translate3d(-100px,100px,0)}html:not(.no-js) [data-aos=fade-up-left]{-webkit-transform:translate3d(100px,100px,0);transform:translate3d(100px,100px,0)}html:not(.no-js) [data-aos=fade-down-right]{-webkit-transform:translate3d(-100px,-100px,0);transform:translate3d(-100px,-100px,0)}html:not(.no-js) [data-aos=fade-down-left]{-webkit-transform:translate3d(100px,-100px,0);transform:translate3d(100px,-100px,0)}html:not(.no-js) [data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}html:not(.no-js) [data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;-webkit-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1)}html:not(.no-js) [data-aos=zoom-in]{-webkit-transform:scale(.6);transform:scale(.6)}html:not(.no-js) [data-aos=zoom-in-up]{-webkit-transform:translate3d(0,100px,0) scale(.6);transform:translate3d(0,100px,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-down]{-webkit-transform:translate3d(0,-100px,0) scale(.6);transform:translate3d(0,-100px,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-right]{-webkit-transform:translate3d(-100px,0,0) scale(.6);transform:translate3d(-100px,0,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-left]{-webkit-transform:translate3d(100px,0,0) scale(.6);transform:translate3d(100px,0,0) scale(.6)}html:not(.no-js) [data-aos=zoom-out]{-webkit-transform:scale(1.2);transform:scale(1.2)}html:not(.no-js) [data-aos=zoom-out-up]{-webkit-transform:translate3d(0,100px,0) scale(1.2);transform:translate3d(0,100px,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-down]{-webkit-transform:translate3d(0,-100px,0) scale(1.2);transform:translate3d(0,-100px,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-right]{-webkit-transform:translate3d(-100px,0,0) scale(1.2);transform:translate3d(-100px,0,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-left]{-webkit-transform:translate3d(100px,0,0) scale(1.2);transform:translate3d(100px,0,0) scale(1.2)}html:not(.no-js) [data-aos^=slide][data-aos^=slide]{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;visibility:hidden}html:not(.no-js) [data-aos^=slide][data-aos^=slide].aos-animate{visibility:visible;-webkit-transform:translateZ(0);transform:translateZ(0)}html:not(.no-js) [data-aos=slide-up]{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}html:not(.no-js) [data-aos=slide-down]{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}html:not(.no-js) [data-aos=slide-right]{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}html:not(.no-js) [data-aos=slide-left]{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}html:not(.no-js) [data-aos^=flip][data-aos^=flip]{-webkit-backface-visibility:hidden;backface-visibility:hidden;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}html:not(.no-js) [data-aos=flip-left]{-webkit-transform:perspective(2500px) rotateY(-100deg);transform:perspective(2500px) rotateY(-100deg)}html:not(.no-js) [data-aos=flip-left].aos-animate{-webkit-transform:perspective(2500px) rotateY(0);transform:perspective(2500px) rotateY(0)}html:not(.no-js) [data-aos=flip-right]{-webkit-transform:perspective(2500px) rotateY(100deg);transform:perspective(2500px) rotateY(100deg)}html:not(.no-js) [data-aos=flip-right].aos-animate{-webkit-transform:perspective(2500px) rotateY(0);transform:perspective(2500px) rotateY(0)}html:not(.no-js) [data-aos=flip-up]{-webkit-transform:perspective(2500px) rotateX(-100deg);transform:perspective(2500px) rotateX(-100deg)}html:not(.no-js) [data-aos=flip-up].aos-animate{-webkit-transform:perspective(2500px) rotateX(0);transform:perspective(2500px) rotateX(0)}html:not(.no-js) [data-aos=flip-down]{-webkit-transform:perspective(2500px) rotateX(100deg);transform:perspective(2500px) rotateX(100deg)}html:not(.no-js) [data-aos=flip-down].aos-animate{-webkit-transform:perspective(2500px) rotateX(0);transform:perspective(2500px) rotateX(0)}}","/*! Flickity v2.2.2\nhttps://flickity.metafizzy.co\n---------------------------------------------- */\n.flickity-enabled{position:relative}.flickity-enabled:focus{outline:0}.flickity-viewport{overflow:hidden;position:relative;height:100%}.flickity-slider{position:absolute;width:100%;height:100%}.flickity-enabled.is-draggable{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.flickity-enabled.is-draggable .flickity-viewport{cursor:move;cursor:-webkit-grab;cursor:grab}.flickity-enabled.is-draggable .flickity-viewport.is-pointer-down{cursor:-webkit-grabbing;cursor:grabbing}.flickity-button{position:absolute;background:hsla(0,0%,100%,.75);border:none;color:#333}.flickity-button:hover{background:#fff;cursor:pointer}.flickity-button:focus{outline:0;box-shadow:0 0 0 5px #19f}.flickity-button:active{opacity:.6}.flickity-button:disabled{opacity:.3;cursor:auto;pointer-events:none}.flickity-button-icon{fill:currentColor}.flickity-prev-next-button{top:50%;width:44px;height:44px;border-radius:50%;transform:translateY(-50%)}.flickity-prev-next-button.previous{left:10px}.flickity-prev-next-button.next{right:10px}.flickity-rtl .flickity-prev-next-button.previous{left:auto;right:10px}.flickity-rtl .flickity-prev-next-button.next{right:auto;left:10px}.flickity-prev-next-button .flickity-button-icon{position:absolute;left:20%;top:20%;width:60%;height:60%}.flickity-page-dots{position:absolute;width:100%;bottom:-25px;padding:0;margin:0;list-style:none;text-align:center;line-height:1}.flickity-rtl .flickity-page-dots{direction:rtl}.flickity-page-dots .dot{display:inline-block;width:10px;height:10px;margin:0 8px;background:#333;border-radius:50%;opacity:.25;cursor:pointer}.flickity-page-dots .dot.is-selected{opacity:1}","/* flickity-fade */\n\n.flickity-enabled.is-fade .flickity-slider > * {\n pointer-events: none;\n z-index: 0;\n}\n\n.flickity-enabled.is-fade .flickity-slider > .is-selected {\n pointer-events: auto;\n z-index: 1;\n}\n","/*\n * Visual Studio 2015 dark style\n * Author: Nicolas LLOBERA \n */\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #1E1E1E;\n color: #DCDCDC;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-symbol,\n.hljs-name {\n color: #569CD6;\n}\n.hljs-link {\n color: #569CD6;\n text-decoration: underline;\n}\n\n.hljs-built_in,\n.hljs-type {\n color: #4EC9B0;\n}\n\n.hljs-number,\n.hljs-class {\n color: #B8D7A3;\n}\n\n.hljs-string,\n.hljs-meta-string {\n color: #D69D85;\n}\n\n.hljs-regexp,\n.hljs-template-tag {\n color: #9A5334;\n}\n\n.hljs-subst,\n.hljs-function,\n.hljs-title,\n.hljs-params,\n.hljs-formula {\n color: #DCDCDC;\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #57A64A;\n font-style: italic;\n}\n\n.hljs-doctag {\n color: #608B4E;\n}\n\n.hljs-meta,\n.hljs-meta-keyword,\n.hljs-tag {\n color: #9B9B9B;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n color: #BD63C5;\n}\n\n.hljs-attr,\n.hljs-attribute,\n.hljs-builtin-name {\n color: #9CDCFE;\n}\n\n.hljs-section {\n color: gold;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n\n/*.hljs-code {\n font-family:'Monospace';\n}*/\n\n.hljs-bullet,\n.hljs-selector-tag,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n color: #D7BA7D;\n}\n\n.hljs-addition {\n background-color: #144212;\n display: inline-block;\n width: 100%;\n}\n\n.hljs-deletion {\n background-color: #600;\n display: inline-block;\n width: 100%;\n}\n","/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n.ql-container {\n box-sizing: border-box;\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n height: 100%;\n margin: 0px;\n position: relative;\n}\n.ql-container.ql-disabled .ql-tooltip {\n visibility: hidden;\n}\n.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before {\n pointer-events: none;\n}\n.ql-clipboard {\n left: -100000px;\n height: 1px;\n overflow-y: hidden;\n position: absolute;\n top: 50%;\n}\n.ql-clipboard p {\n margin: 0;\n padding: 0;\n}\n.ql-editor {\n box-sizing: border-box;\n line-height: 1.42;\n height: 100%;\n outline: none;\n overflow-y: auto;\n padding: 12px 15px;\n tab-size: 4;\n -moz-tab-size: 4;\n text-align: left;\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n.ql-editor > * {\n cursor: text;\n}\n.ql-editor p,\n.ql-editor ol,\n.ql-editor ul,\n.ql-editor pre,\n.ql-editor blockquote,\n.ql-editor h1,\n.ql-editor h2,\n.ql-editor h3,\n.ql-editor h4,\n.ql-editor h5,\n.ql-editor h6 {\n margin: 0;\n padding: 0;\n counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;\n}\n.ql-editor ol,\n.ql-editor ul {\n padding-left: 1.5em;\n}\n.ql-editor ol > li,\n.ql-editor ul > li {\n list-style-type: none;\n}\n.ql-editor ul > li::before {\n content: '\\2022';\n}\n.ql-editor ul[data-checked=true],\n.ql-editor ul[data-checked=false] {\n pointer-events: none;\n}\n.ql-editor ul[data-checked=true] > li *,\n.ql-editor ul[data-checked=false] > li * {\n pointer-events: all;\n}\n.ql-editor ul[data-checked=true] > li::before,\n.ql-editor ul[data-checked=false] > li::before {\n color: #777;\n cursor: pointer;\n pointer-events: all;\n}\n.ql-editor ul[data-checked=true] > li::before {\n content: '\\2611';\n}\n.ql-editor ul[data-checked=false] > li::before {\n content: '\\2610';\n}\n.ql-editor li::before {\n display: inline-block;\n white-space: nowrap;\n width: 1.2em;\n}\n.ql-editor li:not(.ql-direction-rtl)::before {\n margin-left: -1.5em;\n margin-right: 0.3em;\n text-align: right;\n}\n.ql-editor li.ql-direction-rtl::before {\n margin-left: 0.3em;\n margin-right: -1.5em;\n}\n.ql-editor ol li:not(.ql-direction-rtl),\n.ql-editor ul li:not(.ql-direction-rtl) {\n padding-left: 1.5em;\n}\n.ql-editor ol li.ql-direction-rtl,\n.ql-editor ul li.ql-direction-rtl {\n padding-right: 1.5em;\n}\n.ql-editor ol li {\n counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;\n counter-increment: list-0;\n}\n.ql-editor ol li:before {\n content: counter(list-0, decimal) '. ';\n}\n.ql-editor ol li.ql-indent-1 {\n counter-increment: list-1;\n}\n.ql-editor ol li.ql-indent-1:before {\n content: counter(list-1, lower-alpha) '. ';\n}\n.ql-editor ol li.ql-indent-1 {\n counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;\n}\n.ql-editor ol li.ql-indent-2 {\n counter-increment: list-2;\n}\n.ql-editor ol li.ql-indent-2:before {\n content: counter(list-2, lower-roman) '. ';\n}\n.ql-editor ol li.ql-indent-2 {\n counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9;\n}\n.ql-editor ol li.ql-indent-3 {\n counter-increment: list-3;\n}\n.ql-editor ol li.ql-indent-3:before {\n content: counter(list-3, decimal) '. ';\n}\n.ql-editor ol li.ql-indent-3 {\n counter-reset: list-4 list-5 list-6 list-7 list-8 list-9;\n}\n.ql-editor ol li.ql-indent-4 {\n counter-increment: list-4;\n}\n.ql-editor ol li.ql-indent-4:before {\n content: counter(list-4, lower-alpha) '. ';\n}\n.ql-editor ol li.ql-indent-4 {\n counter-reset: list-5 list-6 list-7 list-8 list-9;\n}\n.ql-editor ol li.ql-indent-5 {\n counter-increment: list-5;\n}\n.ql-editor ol li.ql-indent-5:before {\n content: counter(list-5, lower-roman) '. ';\n}\n.ql-editor ol li.ql-indent-5 {\n counter-reset: list-6 list-7 list-8 list-9;\n}\n.ql-editor ol li.ql-indent-6 {\n counter-increment: list-6;\n}\n.ql-editor ol li.ql-indent-6:before {\n content: counter(list-6, decimal) '. ';\n}\n.ql-editor ol li.ql-indent-6 {\n counter-reset: list-7 list-8 list-9;\n}\n.ql-editor ol li.ql-indent-7 {\n counter-increment: list-7;\n}\n.ql-editor ol li.ql-indent-7:before {\n content: counter(list-7, lower-alpha) '. ';\n}\n.ql-editor ol li.ql-indent-7 {\n counter-reset: list-8 list-9;\n}\n.ql-editor ol li.ql-indent-8 {\n counter-increment: list-8;\n}\n.ql-editor ol li.ql-indent-8:before {\n content: counter(list-8, lower-roman) '. ';\n}\n.ql-editor ol li.ql-indent-8 {\n counter-reset: list-9;\n}\n.ql-editor ol li.ql-indent-9 {\n counter-increment: list-9;\n}\n.ql-editor ol li.ql-indent-9:before {\n content: counter(list-9, decimal) '. ';\n}\n.ql-editor .ql-indent-1:not(.ql-direction-rtl) {\n padding-left: 3em;\n}\n.ql-editor li.ql-indent-1:not(.ql-direction-rtl) {\n padding-left: 4.5em;\n}\n.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right {\n padding-right: 3em;\n}\n.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right {\n padding-right: 4.5em;\n}\n.ql-editor .ql-indent-2:not(.ql-direction-rtl) {\n padding-left: 6em;\n}\n.ql-editor li.ql-indent-2:not(.ql-direction-rtl) {\n padding-left: 7.5em;\n}\n.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right {\n padding-right: 6em;\n}\n.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right {\n padding-right: 7.5em;\n}\n.ql-editor .ql-indent-3:not(.ql-direction-rtl) {\n padding-left: 9em;\n}\n.ql-editor li.ql-indent-3:not(.ql-direction-rtl) {\n padding-left: 10.5em;\n}\n.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right {\n padding-right: 9em;\n}\n.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right {\n padding-right: 10.5em;\n}\n.ql-editor .ql-indent-4:not(.ql-direction-rtl) {\n padding-left: 12em;\n}\n.ql-editor li.ql-indent-4:not(.ql-direction-rtl) {\n padding-left: 13.5em;\n}\n.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right {\n padding-right: 12em;\n}\n.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right {\n padding-right: 13.5em;\n}\n.ql-editor .ql-indent-5:not(.ql-direction-rtl) {\n padding-left: 15em;\n}\n.ql-editor li.ql-indent-5:not(.ql-direction-rtl) {\n padding-left: 16.5em;\n}\n.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right {\n padding-right: 15em;\n}\n.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right {\n padding-right: 16.5em;\n}\n.ql-editor .ql-indent-6:not(.ql-direction-rtl) {\n padding-left: 18em;\n}\n.ql-editor li.ql-indent-6:not(.ql-direction-rtl) {\n padding-left: 19.5em;\n}\n.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right {\n padding-right: 18em;\n}\n.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right {\n padding-right: 19.5em;\n}\n.ql-editor .ql-indent-7:not(.ql-direction-rtl) {\n padding-left: 21em;\n}\n.ql-editor li.ql-indent-7:not(.ql-direction-rtl) {\n padding-left: 22.5em;\n}\n.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right {\n padding-right: 21em;\n}\n.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right {\n padding-right: 22.5em;\n}\n.ql-editor .ql-indent-8:not(.ql-direction-rtl) {\n padding-left: 24em;\n}\n.ql-editor li.ql-indent-8:not(.ql-direction-rtl) {\n padding-left: 25.5em;\n}\n.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right {\n padding-right: 24em;\n}\n.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right {\n padding-right: 25.5em;\n}\n.ql-editor .ql-indent-9:not(.ql-direction-rtl) {\n padding-left: 27em;\n}\n.ql-editor li.ql-indent-9:not(.ql-direction-rtl) {\n padding-left: 28.5em;\n}\n.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right {\n padding-right: 27em;\n}\n.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right {\n padding-right: 28.5em;\n}\n.ql-editor .ql-video {\n display: block;\n max-width: 100%;\n}\n.ql-editor .ql-video.ql-align-center {\n margin: 0 auto;\n}\n.ql-editor .ql-video.ql-align-right {\n margin: 0 0 0 auto;\n}\n.ql-editor .ql-bg-black {\n background-color: #000;\n}\n.ql-editor .ql-bg-red {\n background-color: #e60000;\n}\n.ql-editor .ql-bg-orange {\n background-color: #f90;\n}\n.ql-editor .ql-bg-yellow {\n background-color: #ff0;\n}\n.ql-editor .ql-bg-green {\n background-color: #008a00;\n}\n.ql-editor .ql-bg-blue {\n background-color: #06c;\n}\n.ql-editor .ql-bg-purple {\n background-color: #93f;\n}\n.ql-editor .ql-color-white {\n color: #fff;\n}\n.ql-editor .ql-color-red {\n color: #e60000;\n}\n.ql-editor .ql-color-orange {\n color: #f90;\n}\n.ql-editor .ql-color-yellow {\n color: #ff0;\n}\n.ql-editor .ql-color-green {\n color: #008a00;\n}\n.ql-editor .ql-color-blue {\n color: #06c;\n}\n.ql-editor .ql-color-purple {\n color: #93f;\n}\n.ql-editor .ql-font-serif {\n font-family: Georgia, Times New Roman, serif;\n}\n.ql-editor .ql-font-monospace {\n font-family: Monaco, Courier New, monospace;\n}\n.ql-editor .ql-size-small {\n font-size: 0.75em;\n}\n.ql-editor .ql-size-large {\n font-size: 1.5em;\n}\n.ql-editor .ql-size-huge {\n font-size: 2.5em;\n}\n.ql-editor .ql-direction-rtl {\n direction: rtl;\n text-align: inherit;\n}\n.ql-editor .ql-align-center {\n text-align: center;\n}\n.ql-editor .ql-align-justify {\n text-align: justify;\n}\n.ql-editor .ql-align-right {\n text-align: right;\n}\n.ql-editor.ql-blank::before {\n color: rgba(0,0,0,0.6);\n content: attr(data-placeholder);\n font-style: italic;\n left: 15px;\n pointer-events: none;\n position: absolute;\n right: 15px;\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/front/assets/css/theme.bundle.css b/public/front/assets/css/theme.bundle.css new file mode 100644 index 0000000..84ab475 --- /dev/null +++ b/public/front/assets/css/theme.bundle.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.1.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-gray:#869ab8;--bs-gray-dark:#384c74;--bs-gray-100:#f9fbfd;--bs-gray-200:#f1f4f8;--bs-gray-300:#d9e2ef;--bs-gray-400:#c6d3e6;--bs-gray-500:#abbcd5;--bs-gray-600:#869ab8;--bs-gray-700:#506690;--bs-gray-800:#384c74;--bs-gray-900:#1b2a4e;--bs-primary:#335eea;--bs-secondary:#506690;--bs-success:#42ba96;--bs-info:#7c69ef;--bs-warning:#fad776;--bs-danger:#df4759;--bs-light:#f9fbfd;--bs-dark:#1b2a4e;--bs-primary-desat:#6c8aec;--bs-black:#161c2d;--bs-white:#fff;--bs-primary-rgb:51,94,234;--bs-secondary-rgb:80,102,144;--bs-success-rgb:66,186,150;--bs-info-rgb:124,105,239;--bs-warning-rgb:250,215,118;--bs-danger-rgb:223,71,89;--bs-light-rgb:249,251,253;--bs-dark-rgb:27,42,78;--bs-primary-desat-rgb:108,138,236;--bs-white-rgb:255,255,255;--bs-black-rgb:22,28,45;--bs-body-color-rgb:22,28,45;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,rgba(255,255,255,0.15),rgba(255,255,255,0));--bs-body-font-family:HKGroteskPro,serif;--bs-body-font-size:1.0625rem;--bs-body-font-weight:400;--bs-body-line-height:1.6;--bs-body-color:#161c2d;--bs-body-bg:#fff}*,:after,:before{box-sizing:border-box}body{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(22,28,45,0);background-color:var(--bs-body-bg);color:var(--bs-body-color);font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);margin:0;text-align:var(--bs-body-text-align)}hr{background-color:currentColor;border:0;color:#f1f4f8;margin:1rem 0;opacity:1}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1;margin-bottom:.5rem;margin-top:0}.h1,h1{font-size:2.3125rem}.h2,h2{font-size:1.9375rem}.h3,h3{font-size:1.3125rem}.h4,h4{font-size:1.1875rem}.h5,h5{font-size:1.0625rem}.h6,h6{font-size:.75rem}p{margin-bottom:1rem;margin-top:0}abbr[data-bs-original-title],abbr[title]{cursor:help;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-bottom:1rem;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:700}.small,small{font-size:88.2%}.mark,mark{background-color:#fcf8e3;padding:.2em}sub,sup{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#335eea;text-decoration:none}a:hover{color:#294bbb;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{direction:ltr;font-family:var(--bs-font-monospace);font-size:1em;unicode-bidi:bidi-override}pre{display:block;font-size:.8125rem;margin-bottom:1rem;margin-top:0;overflow:auto}pre code{color:inherit;font-size:inherit;word-break:normal}code{word-wrap:break-word;color:#d63384;font-size:.8125rem}a>code{color:inherit}kbd{background-color:#1b2a4e;border-radius:.25rem;color:#fff;font-size:.8125rem;padding:.2rem .4rem}kbd kbd{font-size:1em;font-weight:600;padding:0}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{border-collapse:collapse;caption-side:bottom}caption{color:#869ab8;padding-bottom:1.5rem;padding-top:1.5rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border:0 solid;border-color:inherit}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{float:left;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;padding:0;width:100%}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.3125rem;font-weight:400}.display-1{font-size:4.375rem;font-weight:400}.display-2{font-size:3.8125rem;font-weight:400}.display-3{font-size:3rem;font-weight:400}.display-4{font-size:2.6875rem;font-weight:400}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:88.2%;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#869ab8;font-size:.75rem;margin-bottom:1rem;margin-top:-1rem}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#fff;border:1px solid #d9e2ef;border-radius:.375rem;box-shadow:0 .125rem .25rem rgba(22,28,45,.075);padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#869ab8;font-size:88.2%}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:var(--bs-gutter-x,1.25rem);padding-right:var(--bs-gutter-x,1.25rem);width:100%}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1040px}}.row{--bs-gutter-x:2.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333%}.col-2{flex:0 0 auto;width:16.66667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333%}.col-5{flex:0 0 auto;width:41.66667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333%}.col-8{flex:0 0 auto;width:66.66667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333%}.col-11{flex:0 0 auto;width:91.66667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:.75rem}.g-3,.gy-3{--bs-gutter-y:.75rem}.g-4,.gx-4{--bs-gutter-x:1rem}.g-4,.gy-4{--bs-gutter-y:1rem}.g-5,.gx-5{--bs-gutter-x:1.5rem}.g-5,.gy-5{--bs-gutter-y:1.5rem}.g-6,.gx-6{--bs-gutter-x:2rem}.g-6,.gy-6{--bs-gutter-y:2rem}.g-7,.gx-7{--bs-gutter-x:2.5rem}.g-7,.gy-7{--bs-gutter-y:2.5rem}.g-8,.gx-8{--bs-gutter-x:3rem}.g-8,.gy-8{--bs-gutter-y:3rem}.g-9,.gx-9{--bs-gutter-x:4rem}.g-9,.gy-9{--bs-gutter-y:4rem}.g-10,.gx-10{--bs-gutter-x:5rem}.g-10,.gy-10{--bs-gutter-y:5rem}.g-11,.gx-11{--bs-gutter-x:6rem}.g-11,.gy-11{--bs-gutter-y:6rem}.g-12,.gx-12{--bs-gutter-x:8rem}.g-12,.gy-12{--bs-gutter-y:8rem}.g-13,.gx-13{--bs-gutter-x:10rem}.g-13,.gy-13{--bs-gutter-y:10rem}.g-14,.gx-14{--bs-gutter-x:12rem}.g-14,.gy-14{--bs-gutter-y:12rem}.g-15,.gx-15{--bs-gutter-x:16rem}.g-15,.gy-15{--bs-gutter-y:16rem}.g-16,.gx-16{--bs-gutter-x:25rem}.g-16,.gy-16{--bs-gutter-y:25rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333%}.col-sm-2{flex:0 0 auto;width:16.66667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333%}.col-sm-5{flex:0 0 auto;width:41.66667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333%}.col-sm-8{flex:0 0 auto;width:66.66667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333%}.col-sm-11{flex:0 0 auto;width:91.66667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:.75rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:.75rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:1.5rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:1.5rem}.g-sm-6,.gx-sm-6{--bs-gutter-x:2rem}.g-sm-6,.gy-sm-6{--bs-gutter-y:2rem}.g-sm-7,.gx-sm-7{--bs-gutter-x:2.5rem}.g-sm-7,.gy-sm-7{--bs-gutter-y:2.5rem}.g-sm-8,.gx-sm-8{--bs-gutter-x:3rem}.g-sm-8,.gy-sm-8{--bs-gutter-y:3rem}.g-sm-9,.gx-sm-9{--bs-gutter-x:4rem}.g-sm-9,.gy-sm-9{--bs-gutter-y:4rem}.g-sm-10,.gx-sm-10{--bs-gutter-x:5rem}.g-sm-10,.gy-sm-10{--bs-gutter-y:5rem}.g-sm-11,.gx-sm-11{--bs-gutter-x:6rem}.g-sm-11,.gy-sm-11{--bs-gutter-y:6rem}.g-sm-12,.gx-sm-12{--bs-gutter-x:8rem}.g-sm-12,.gy-sm-12{--bs-gutter-y:8rem}.g-sm-13,.gx-sm-13{--bs-gutter-x:10rem}.g-sm-13,.gy-sm-13{--bs-gutter-y:10rem}.g-sm-14,.gx-sm-14{--bs-gutter-x:12rem}.g-sm-14,.gy-sm-14{--bs-gutter-y:12rem}.g-sm-15,.gx-sm-15{--bs-gutter-x:16rem}.g-sm-15,.gy-sm-15{--bs-gutter-y:16rem}.g-sm-16,.gx-sm-16{--bs-gutter-x:25rem}.g-sm-16,.gy-sm-16{--bs-gutter-y:25rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333%}.col-md-2{flex:0 0 auto;width:16.66667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333%}.col-md-5{flex:0 0 auto;width:41.66667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333%}.col-md-8{flex:0 0 auto;width:66.66667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333%}.col-md-11{flex:0 0 auto;width:91.66667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:.75rem}.g-md-3,.gy-md-3{--bs-gutter-y:.75rem}.g-md-4,.gx-md-4{--bs-gutter-x:1rem}.g-md-4,.gy-md-4{--bs-gutter-y:1rem}.g-md-5,.gx-md-5{--bs-gutter-x:1.5rem}.g-md-5,.gy-md-5{--bs-gutter-y:1.5rem}.g-md-6,.gx-md-6{--bs-gutter-x:2rem}.g-md-6,.gy-md-6{--bs-gutter-y:2rem}.g-md-7,.gx-md-7{--bs-gutter-x:2.5rem}.g-md-7,.gy-md-7{--bs-gutter-y:2.5rem}.g-md-8,.gx-md-8{--bs-gutter-x:3rem}.g-md-8,.gy-md-8{--bs-gutter-y:3rem}.g-md-9,.gx-md-9{--bs-gutter-x:4rem}.g-md-9,.gy-md-9{--bs-gutter-y:4rem}.g-md-10,.gx-md-10{--bs-gutter-x:5rem}.g-md-10,.gy-md-10{--bs-gutter-y:5rem}.g-md-11,.gx-md-11{--bs-gutter-x:6rem}.g-md-11,.gy-md-11{--bs-gutter-y:6rem}.g-md-12,.gx-md-12{--bs-gutter-x:8rem}.g-md-12,.gy-md-12{--bs-gutter-y:8rem}.g-md-13,.gx-md-13{--bs-gutter-x:10rem}.g-md-13,.gy-md-13{--bs-gutter-y:10rem}.g-md-14,.gx-md-14{--bs-gutter-x:12rem}.g-md-14,.gy-md-14{--bs-gutter-y:12rem}.g-md-15,.gx-md-15{--bs-gutter-x:16rem}.g-md-15,.gy-md-15{--bs-gutter-y:16rem}.g-md-16,.gx-md-16{--bs-gutter-x:25rem}.g-md-16,.gy-md-16{--bs-gutter-y:25rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333%}.col-lg-2{flex:0 0 auto;width:16.66667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333%}.col-lg-5{flex:0 0 auto;width:41.66667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333%}.col-lg-8{flex:0 0 auto;width:66.66667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333%}.col-lg-11{flex:0 0 auto;width:91.66667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:.75rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:.75rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:1.5rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:1.5rem}.g-lg-6,.gx-lg-6{--bs-gutter-x:2rem}.g-lg-6,.gy-lg-6{--bs-gutter-y:2rem}.g-lg-7,.gx-lg-7{--bs-gutter-x:2.5rem}.g-lg-7,.gy-lg-7{--bs-gutter-y:2.5rem}.g-lg-8,.gx-lg-8{--bs-gutter-x:3rem}.g-lg-8,.gy-lg-8{--bs-gutter-y:3rem}.g-lg-9,.gx-lg-9{--bs-gutter-x:4rem}.g-lg-9,.gy-lg-9{--bs-gutter-y:4rem}.g-lg-10,.gx-lg-10{--bs-gutter-x:5rem}.g-lg-10,.gy-lg-10{--bs-gutter-y:5rem}.g-lg-11,.gx-lg-11{--bs-gutter-x:6rem}.g-lg-11,.gy-lg-11{--bs-gutter-y:6rem}.g-lg-12,.gx-lg-12{--bs-gutter-x:8rem}.g-lg-12,.gy-lg-12{--bs-gutter-y:8rem}.g-lg-13,.gx-lg-13{--bs-gutter-x:10rem}.g-lg-13,.gy-lg-13{--bs-gutter-y:10rem}.g-lg-14,.gx-lg-14{--bs-gutter-x:12rem}.g-lg-14,.gy-lg-14{--bs-gutter-y:12rem}.g-lg-15,.gx-lg-15{--bs-gutter-x:16rem}.g-lg-15,.gy-lg-15{--bs-gutter-y:16rem}.g-lg-16,.gx-lg-16{--bs-gutter-x:25rem}.g-lg-16,.gy-lg-16{--bs-gutter-y:25rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333%}.col-xl-2{flex:0 0 auto;width:16.66667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333%}.col-xl-5{flex:0 0 auto;width:41.66667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333%}.col-xl-8{flex:0 0 auto;width:66.66667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333%}.col-xl-11{flex:0 0 auto;width:91.66667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:.75rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:.75rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:1.5rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:1.5rem}.g-xl-6,.gx-xl-6{--bs-gutter-x:2rem}.g-xl-6,.gy-xl-6{--bs-gutter-y:2rem}.g-xl-7,.gx-xl-7{--bs-gutter-x:2.5rem}.g-xl-7,.gy-xl-7{--bs-gutter-y:2.5rem}.g-xl-8,.gx-xl-8{--bs-gutter-x:3rem}.g-xl-8,.gy-xl-8{--bs-gutter-y:3rem}.g-xl-9,.gx-xl-9{--bs-gutter-x:4rem}.g-xl-9,.gy-xl-9{--bs-gutter-y:4rem}.g-xl-10,.gx-xl-10{--bs-gutter-x:5rem}.g-xl-10,.gy-xl-10{--bs-gutter-y:5rem}.g-xl-11,.gx-xl-11{--bs-gutter-x:6rem}.g-xl-11,.gy-xl-11{--bs-gutter-y:6rem}.g-xl-12,.gx-xl-12{--bs-gutter-x:8rem}.g-xl-12,.gy-xl-12{--bs-gutter-y:8rem}.g-xl-13,.gx-xl-13{--bs-gutter-x:10rem}.g-xl-13,.gy-xl-13{--bs-gutter-y:10rem}.g-xl-14,.gx-xl-14{--bs-gutter-x:12rem}.g-xl-14,.gy-xl-14{--bs-gutter-y:12rem}.g-xl-15,.gx-xl-15{--bs-gutter-x:16rem}.g-xl-15,.gy-xl-15{--bs-gutter-y:16rem}.g-xl-16,.gx-xl-16{--bs-gutter-x:25rem}.g-xl-16,.gy-xl-16{--bs-gutter-y:25rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333%}.col-xxl-2{flex:0 0 auto;width:16.66667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333%}.col-xxl-5{flex:0 0 auto;width:41.66667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333%}.col-xxl-8{flex:0 0 auto;width:66.66667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333%}.col-xxl-11{flex:0 0 auto;width:91.66667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.66667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333%}.offset-xxl-5{margin-left:41.66667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333%}.offset-xxl-8{margin-left:66.66667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333%}.offset-xxl-11{margin-left:91.66667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:.75rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:.75rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:1.5rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:1.5rem}.g-xxl-6,.gx-xxl-6{--bs-gutter-x:2rem}.g-xxl-6,.gy-xxl-6{--bs-gutter-y:2rem}.g-xxl-7,.gx-xxl-7{--bs-gutter-x:2.5rem}.g-xxl-7,.gy-xxl-7{--bs-gutter-y:2.5rem}.g-xxl-8,.gx-xxl-8{--bs-gutter-x:3rem}.g-xxl-8,.gy-xxl-8{--bs-gutter-y:3rem}.g-xxl-9,.gx-xxl-9{--bs-gutter-x:4rem}.g-xxl-9,.gy-xxl-9{--bs-gutter-y:4rem}.g-xxl-10,.gx-xxl-10{--bs-gutter-x:5rem}.g-xxl-10,.gy-xxl-10{--bs-gutter-y:5rem}.g-xxl-11,.gx-xxl-11{--bs-gutter-x:6rem}.g-xxl-11,.gy-xxl-11{--bs-gutter-y:6rem}.g-xxl-12,.gx-xxl-12{--bs-gutter-x:8rem}.g-xxl-12,.gy-xxl-12{--bs-gutter-y:8rem}.g-xxl-13,.gx-xxl-13{--bs-gutter-x:10rem}.g-xxl-13,.gy-xxl-13{--bs-gutter-y:10rem}.g-xxl-14,.gx-xxl-14{--bs-gutter-x:12rem}.g-xxl-14,.gy-xxl-14{--bs-gutter-y:12rem}.g-xxl-15,.gx-xxl-15{--bs-gutter-x:16rem}.g-xxl-15,.gy-xxl-15{--bs-gutter-y:16rem}.g-xxl-16,.gx-xxl-16{--bs-gutter-x:25rem}.g-xxl-16,.gy-xxl-16{--bs-gutter-y:25rem}}.table{--bs-table-bg:#fff;--bs-table-accent-bg:transparent;--bs-table-striped-color:#161c2d;--bs-table-striped-bg:#f9fbfd;--bs-table-active-color:#161c2d;--bs-table-active-bg:#f9fbfd;--bs-table-hover-color:#161c2d;--bs-table-hover-bg:#f9fbfd;border-color:#f1f4f8;color:#161c2d;margin-bottom:1rem;vertical-align:top;width:100%}.table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);padding:1.5rem 2rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#ebeffd;--bs-table-striped-bg:#e1e5f4;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#d6dbec;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#dbe0f0;--bs-table-hover-color:#1b2a4e;border-color:#d6dbec;color:#1b2a4e}.table-secondary{--bs-table-bg:#eef0f4;--bs-table-striped-bg:#e3e6ec;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#d9dce3;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#dee1e8;--bs-table-hover-color:#1b2a4e;border-color:#d9dce3;color:#1b2a4e}.table-success{--bs-table-bg:#ecf8f5;--bs-table-striped-bg:#e2eeed;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#d7e3e4;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#dce9e8;--bs-table-hover-color:#1b2a4e;border-color:#d7e3e4;color:#1b2a4e}.table-info{--bs-table-bg:#f2f0fd;--bs-table-striped-bg:#e7e6f4;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#dddcec;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#e2e1f0;--bs-table-hover-color:#1b2a4e;border-color:#dddcec;color:#1b2a4e}.table-warning{--bs-table-bg:#fffbf1;--bs-table-striped-bg:#f4f1e9;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#e8e6e1;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#eeebe5;--bs-table-hover-color:#1b2a4e;border-color:#e8e6e1;color:#1b2a4e}.table-danger{--bs-table-bg:#fcedee;--bs-table-striped-bg:#f1e3e6;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#e6dade;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#ebdee2;--bs-table-hover-color:#1b2a4e;border-color:#e6dade;color:#1b2a4e}.table-light{--bs-table-bg:#f9fbfd;--bs-table-striped-bg:#eef1f4;--bs-table-striped-color:#1b2a4e;--bs-table-active-bg:#e3e6ec;--bs-table-active-color:#1b2a4e;--bs-table-hover-bg:#e8ebf0;--bs-table-hover-color:#1b2a4e;border-color:#e3e6ec;color:#1b2a4e}.table-dark{--bs-table-bg:#384c74;--bs-table-striped-bg:#42557b;--bs-table-striped-color:#fff;--bs-table-active-bg:#4c5e82;--bs-table-active-color:#fff;--bs-table-hover-bg:#47597e;--bs-table-hover-color:#fff;border-color:#4c5e82;color:#fff}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1399.98px){.table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{font-size:inherit;line-height:1.6;margin-bottom:0;padding-bottom:calc(.8125rem + 1px);padding-top:calc(.8125rem + 1px)}.col-form-label-lg{font-size:1.0625rem;padding-bottom:calc(1.122rem + 1px);padding-top:calc(1.122rem + 1px)}.col-form-label-sm{font-size:1.0625rem;padding-bottom:calc(.5625rem + 1px);padding-top:calc(.5625rem + 1px)}.form-text{color:#869ab8;font-size:88.2%;margin-top:.25rem}.form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-clip:padding-box;background-color:#fff;border:1px solid #f1f4f8;border-radius:.375rem;box-shadow:none;color:#161c2d;display:block;font-size:1.0625rem;font-weight:400;line-height:1.6;padding:.8125rem 1.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{background-color:#fff;border-color:#335eea;box-shadow:none,none;color:#161c2d;outline:0}.form-control::-webkit-date-and-time-value{height:1.6em}.form-control::-moz-placeholder{color:#869ab8;opacity:1}.form-control:-ms-input-placeholder{color:#869ab8;opacity:1}.form-control::placeholder{color:#869ab8;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#f1f4f8;opacity:1}.form-control::file-selector-button{-webkit-margin-end:1.25rem;background-color:#f9fbfd;border:0 solid;border-color:inherit;border-inline-end-width:1px;border-radius:0;color:#161c2d;margin:-.8125rem -1.25rem;margin-inline-end:1.25rem;padding:.8125rem 1.25rem;pointer-events:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#edeef0}.form-control::-webkit-file-upload-button{-webkit-margin-end:1.25rem;background-color:#f9fbfd;border:0 solid;border-color:inherit;border-inline-end-width:1px;border-radius:0;color:#161c2d;margin:-.8125rem -1.25rem;margin-inline-end:1.25rem;padding:.8125rem 1.25rem;pointer-events:none;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#edeef0}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#161c2d;display:block;line-height:1.6;margin-bottom:0;padding:.8125rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.375rem;font-size:1.0625rem;min-height:calc(1.6em + 1.125rem + 2px);padding:.5625rem 1rem}.form-control-sm::file-selector-button{-webkit-margin-end:1rem;margin:-.5625rem -1rem;margin-inline-end:1rem;padding:.5625rem 1rem}.form-control-sm::-webkit-file-upload-button{-webkit-margin-end:1rem;margin:-.5625rem -1rem;margin-inline-end:1rem;padding:.5625rem 1rem}.form-control-lg{border-radius:.375rem;font-size:1.0625rem;min-height:calc(1.6em + 2.244rem + 2px);padding:1.122rem 1.5rem}.form-control-lg::file-selector-button{-webkit-margin-end:1.5rem;margin:-1.122rem -1.5rem;margin-inline-end:1.5rem;padding:1.122rem 1.5rem}.form-control-lg::-webkit-file-upload-button{-webkit-margin-end:1.5rem;margin:-1.122rem -1.5rem;margin-inline-end:1.5rem;padding:1.122rem 1.5rem}textarea.form-control{min-height:calc(1.6em + 1.625rem + 2px)}textarea.form-control-sm{min-height:calc(1.6em + 1.125rem + 2px)}textarea.form-control-lg{min-height:calc(1.6em + 2.244rem + 2px)}.form-control-color{height:auto;padding:.8125rem;width:3rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border-radius:.375rem;height:1.6em}.form-control-color::-webkit-color-swatch{border-radius:.375rem;height:1.6em}.form-select{-moz-padding-start:calc(1.25rem - 3px);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 9 5' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m1 1 3.25 3.25L7.5 1' stroke='%23C6D3E6' stroke-width='1.083' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:right 1.25rem center;background-repeat:no-repeat;background-size:1em 1em;border:1px solid #f1f4f8;border-radius:.375rem;box-shadow:none;color:#161c2d;display:block;font-size:1.0625rem;font-weight:400;line-height:1.6;padding:.8125rem 1.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#335eea;box-shadow:none,none;outline:0}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:1.25rem}.form-select:disabled{background-color:#f1f4f8}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #161c2d}.form-select-sm{font-size:1.0625rem;padding-bottom:.5625rem;padding-left:1rem;padding-top:.5625rem}.form-select-lg{font-size:1.0625rem;padding-bottom:1.122rem;padding-left:1.5rem;padding-top:1.122rem}.form-check{display:block;margin-bottom:.125rem;min-height:1.7rem;padding-left:1.5rem}.form-check .form-check-input{float:left;margin-left:-1.5rem}.form-check-input{-webkit-print-color-adjust:exact;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#d9e2ef;background-position:50%;background-repeat:no-repeat;background-size:contain;border:transparent;color-adjust:exact;height:1em;margin-top:.3em;vertical-align:top;width:1em}.form-check-input[type=checkbox]{border-radius:.375rem}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:none}.form-check-input:focus{border-color:transparent;box-shadow:none;outline:0}.form-check-input:checked{background-color:#335eea;border-color:#335eea}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3E%3C/svg%3E")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E")}.form-check-input[type=checkbox]:indeterminate{background-color:#335eea;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3E%3C/svg%3E");border-color:#335eea}.form-check-input:disabled{filter:none;opacity:.5;pointer-events:none}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-check-label{cursor:pointer}.form-switch{padding-left:3rem}.form-switch .form-check-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");background-position:0;border-radius:2.5rem;margin-left:-3rem;transition:background-position .15s ease-in-out;width:2.5rem}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:checked,.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.form-switch .form-check-input:checked{background-position:100%}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{filter:none;opacity:.65;pointer-events:none}.form-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1rem;padding:0;width:100%}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,none}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,none}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#335eea;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(22,28,45,.1);height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c2cff9}.form-range::-webkit-slider-runnable-track{background-color:#d9e2ef;border-color:transparent;border-radius:1rem;box-shadow:inset 0 1px 2px rgba(22,28,45,.075);color:transparent;cursor:pointer;height:.5rem;width:100%}.form-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#335eea;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(22,28,45,.1);height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#c2cff9}.form-range::-moz-range-track{background-color:#d9e2ef;border-color:transparent;border-radius:1rem;box-shadow:inset 0 1px 2px rgba(22,28,45,.075);color:transparent;cursor:pointer;height:.5rem;width:100%}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#abbcd5}.form-range:disabled::-moz-range-thumb{background-color:#abbcd5}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{border:1px solid transparent;height:100%;left:0;padding:1rem 1.25rem;pointer-events:none;position:absolute;top:0;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem 1.25rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control:-ms-input-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control:not(:-ms-input-placeholder){padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control:-webkit-autofill{padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-select{padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:1;transform:translateY(-.5rem)}.form-floating>.form-control:not(:-ms-input-placeholder)~label{opacity:1;transform:translateY(-.5rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:1;transform:translateY(-.5rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:1;transform:translateY(-.5rem)}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.form-control,.input-group>.form-select{flex:1 1 auto;min-width:0;position:relative;width:1%}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{align-items:center;background-color:#fff;border:1px solid #f1f4f8;border-radius:.375rem;color:#869ab8;display:flex;font-size:1.0625rem;font-weight:400;line-height:1.6;padding:.8125rem 1.25rem;text-align:center;white-space:nowrap}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{border-radius:.375rem;font-size:1.0625rem;padding:1.122rem 1.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{border-radius:.375rem;font-size:1.0625rem;padding:.5625rem 1rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:2.5rem}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-bottom-right-radius:0;border-top-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.valid-feedback{color:#42ba96;display:none;font-size:88.2%;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(66,186,150,.9);border-radius:.375rem;color:#fff;display:none;font-size:.9375rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#42ba96}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#42ba96;box-shadow:0 0 0 0 rgba(66,186,150,.25)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#42ba96}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#42ba96;box-shadow:0 0 0 0 rgba(66,186,150,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#42ba96}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#42ba96}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 0 rgba(66,186,150,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#42ba96}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{color:#df4759;display:none;font-size:88.2%;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(223,71,89,.9);border-radius:.375rem;color:#fff;display:none;font-size:.9375rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#df4759}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#df4759;box-shadow:0 0 0 0 rgba(223,71,89,.25)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#df4759}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#df4759;box-shadow:0 0 0 0 rgba(223,71,89,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#df4759}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#df4759}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 0 rgba(223,71,89,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#df4759}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{background-color:transparent;border:1px solid transparent;border-radius:.375rem;color:#161c2d;cursor:pointer;display:inline-block;font-size:1.0625rem;font-weight:600;line-height:1.6;padding:.8125rem 1.25rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#161c2d;text-decoration:none}.btn-check:focus+.btn,.btn:focus{box-shadow:none;outline:0}.btn-check:active+.btn,.btn-check:checked+.btn,.btn.active,.btn:active{box-shadow:none}.btn-check:active+.btn:focus,.btn-check:checked+.btn:focus,.btn.active:focus,.btn:active:focus{box-shadow:none,none}.btn.disabled,.btn:disabled,fieldset:disabled .btn{box-shadow:none;opacity:.65;pointer-events:none}.btn-primary{background-color:#335eea;border-color:#335eea;box-shadow:none;color:#fff}.btn-check:focus+.btn-primary,.btn-primary:focus,.btn-primary:hover{background-color:#2b50c7;border-color:#294bbb;color:#fff}.btn-check:focus+.btn-primary,.btn-primary:focus{box-shadow:none,0 0 0 0 rgba(82,118,237,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{background-color:#294bbb;border-color:#2647b0;color:#fff}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(82,118,237,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#335eea;border-color:#335eea;color:#fff}.btn-secondary{background-color:#506690;border-color:#506690;box-shadow:none;color:#fff}.btn-check:focus+.btn-secondary,.btn-secondary:focus,.btn-secondary:hover{background-color:#44577a;border-color:#405273;color:#fff}.btn-check:focus+.btn-secondary,.btn-secondary:focus{box-shadow:none,0 0 0 0 rgba(106,125,161,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{background-color:#405273;border-color:#3c4d6c;color:#fff}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(106,125,161,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#506690;border-color:#506690;color:#fff}.btn-success{background-color:#42ba96;border-color:#42ba96;box-shadow:none;color:#fff}.btn-check:focus+.btn-success,.btn-success:focus,.btn-success:hover{background-color:#389e80;border-color:#359578;color:#fff}.btn-check:focus+.btn-success,.btn-success:focus{box-shadow:none,0 0 0 0 rgba(94,196,166,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{background-color:#359578;border-color:#328c71;color:#fff}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(94,196,166,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#42ba96;border-color:#42ba96;color:#fff}.btn-info{background-color:#7c69ef;border-color:#7c69ef;box-shadow:none;color:#fff}.btn-check:focus+.btn-info,.btn-info:focus,.btn-info:hover{background-color:#6959cb;border-color:#6354bf;color:#fff}.btn-check:focus+.btn-info,.btn-info:focus{box-shadow:none,0 0 0 0 rgba(144,128,241,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{background-color:#6354bf;border-color:#5d4fb3;color:#fff}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(144,128,241,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#7c69ef;border-color:#7c69ef;color:#fff}.btn-warning{background-color:#fad776;border-color:#fad776;box-shadow:none;color:#1b2a4e}.btn-check:focus+.btn-warning,.btn-warning:focus,.btn-warning:hover{background-color:#fbdd8b;border-color:#fbdb84;color:#1b2a4e}.btn-check:focus+.btn-warning,.btn-warning:focus{box-shadow:none,0 0 0 0 rgba(217,189,112,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{background-color:#fbdf91;border-color:#fbdb84;color:#1b2a4e}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(217,189,112,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#fad776;border-color:#fad776;color:#1b2a4e}.btn-danger{background-color:#df4759;border-color:#df4759;box-shadow:none;color:#fff}.btn-check:focus+.btn-danger,.btn-danger:focus,.btn-danger:hover{background-color:#be3c4c;border-color:#b23947;color:#fff}.btn-check:focus+.btn-danger,.btn-danger:focus{box-shadow:none,0 0 0 0 rgba(228,99,114,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{background-color:#b23947;border-color:#a73543;color:#fff}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(228,99,114,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#df4759;border-color:#df4759;color:#fff}.btn-light{background-color:#f9fbfd;border-color:#f9fbfd;box-shadow:none;color:#1b2a4e}.btn-check:focus+.btn-light,.btn-light:focus,.btn-light:hover{background-color:#fafcfd;border-color:#fafbfd;color:#1b2a4e}.btn-check:focus+.btn-light,.btn-light:focus{box-shadow:none,0 0 0 0 rgba(216,220,227,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{background-color:#fafcfd;border-color:#fafbfd;color:#1b2a4e}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(216,220,227,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f9fbfd;border-color:#f9fbfd;color:#1b2a4e}.btn-dark{background-color:#1b2a4e;border-color:#1b2a4e;box-shadow:none;color:#fff}.btn-check:focus+.btn-dark,.btn-dark:focus,.btn-dark:hover{background-color:#172442;border-color:#16223e;color:#fff}.btn-check:focus+.btn-dark,.btn-dark:focus{box-shadow:none,0 0 0 0 rgba(61,74,105,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{background-color:#16223e;border-color:#14203b;color:#fff}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(61,74,105,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#1b2a4e;border-color:#1b2a4e;color:#fff}.btn-primary-desat{background-color:#6c8aec;border-color:#6c8aec;box-shadow:none;color:#fff}.btn-primary-desat:hover{background-color:#5c75c9;border-color:#566ebd;color:#fff}.btn-check:focus+.btn-primary-desat,.btn-primary-desat:focus{background-color:#5c75c9;border-color:#566ebd;box-shadow:none,0 0 0 0 rgba(130,156,239,.5);color:#fff}.btn-check:active+.btn-primary-desat,.btn-check:checked+.btn-primary-desat,.btn-primary-desat.active,.btn-primary-desat:active,.show>.btn-primary-desat.dropdown-toggle{background-color:#566ebd;border-color:#5168b1;color:#fff}.btn-check:active+.btn-primary-desat:focus,.btn-check:checked+.btn-primary-desat:focus,.btn-primary-desat.active:focus,.btn-primary-desat:active:focus,.show>.btn-primary-desat.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(130,156,239,.5)}.btn-primary-desat.disabled,.btn-primary-desat:disabled{background-color:#6c8aec;border-color:#6c8aec;color:#fff}.btn-black{background-color:#161c2d;border-color:#161c2d;box-shadow:none;color:#fff}.btn-black:focus,.btn-black:hover,.btn-check:focus+.btn-black{background-color:#131826;border-color:#121624;color:#fff}.btn-black:focus,.btn-check:focus+.btn-black{box-shadow:none,0 0 0 0 rgba(57,62,77,.5)}.btn-black.active,.btn-black:active,.btn-check:active+.btn-black,.btn-check:checked+.btn-black,.show>.btn-black.dropdown-toggle{background-color:#121624;border-color:#111522;color:#fff}.btn-black.active:focus,.btn-black:active:focus,.btn-check:active+.btn-black:focus,.btn-check:checked+.btn-black:focus,.show>.btn-black.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(57,62,77,.5)}.btn-black.disabled,.btn-black:disabled{background-color:#161c2d;border-color:#161c2d;color:#fff}.btn-white{border-color:#fff;box-shadow:none;color:#1b2a4e}.btn-check:focus+.btn-white,.btn-white:focus,.btn-white:hover{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-check:focus+.btn-white,.btn-white:focus{box-shadow:none,0 0 0 0 rgba(221,223,228,.5)}.btn-check:active+.btn-white,.btn-check:checked+.btn-white,.btn-white.active,.btn-white:active,.show>.btn-white.dropdown-toggle{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-check:active+.btn-white:focus,.btn-check:checked+.btn-white:focus,.btn-white.active:focus,.btn-white:active:focus,.show>.btn-white.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(221,223,228,.5)}.btn-white.disabled,.btn-white:disabled{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-outline-primary{border-color:#335eea;color:#335eea}.btn-outline-primary:hover{background-color:#335eea;border-color:#335eea;color:#fff}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 0 rgba(51,94,234,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{background-color:#335eea;border-color:#335eea;color:#fff}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:none,0 0 0 0 rgba(51,94,234,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#335eea}.btn-outline-secondary{border-color:#506690;color:#506690}.btn-outline-secondary:hover{background-color:#506690;border-color:#506690;color:#fff}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 0 rgba(80,102,144,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{background-color:#506690;border-color:#506690;color:#fff}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:none,0 0 0 0 rgba(80,102,144,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#506690}.btn-outline-success{border-color:#42ba96;color:#42ba96}.btn-outline-success:hover{background-color:#42ba96;border-color:#42ba96;color:#fff}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 0 rgba(66,186,150,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{background-color:#42ba96;border-color:#42ba96;color:#fff}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:none,0 0 0 0 rgba(66,186,150,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#42ba96}.btn-outline-info{border-color:#7c69ef;color:#7c69ef}.btn-outline-info:hover{background-color:#7c69ef;border-color:#7c69ef;color:#fff}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 0 rgba(124,105,239,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{background-color:#7c69ef;border-color:#7c69ef;color:#fff}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:none,0 0 0 0 rgba(124,105,239,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#7c69ef}.btn-outline-warning{border-color:#fad776;color:#fad776}.btn-outline-warning:hover{background-color:#fad776;border-color:#fad776;color:#1b2a4e}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 0 rgba(250,215,118,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{background-color:#fad776;border-color:#fad776;color:#1b2a4e}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:none,0 0 0 0 rgba(250,215,118,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#fad776}.btn-outline-danger{border-color:#df4759;color:#df4759}.btn-outline-danger:hover{background-color:#df4759;border-color:#df4759;color:#fff}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 0 rgba(223,71,89,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{background-color:#df4759;border-color:#df4759;color:#fff}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:none,0 0 0 0 rgba(223,71,89,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#df4759}.btn-outline-light{border-color:#f9fbfd;color:#f9fbfd}.btn-outline-light:hover{background-color:#f9fbfd;border-color:#f9fbfd;color:#1b2a4e}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 0 rgba(249,251,253,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{background-color:#f9fbfd;border-color:#f9fbfd;color:#1b2a4e}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:none,0 0 0 0 rgba(249,251,253,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f9fbfd}.btn-outline-dark{border-color:#1b2a4e;color:#1b2a4e}.btn-outline-dark:hover{background-color:#1b2a4e;border-color:#1b2a4e;color:#fff}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 0 rgba(27,42,78,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{background-color:#1b2a4e;border-color:#1b2a4e;color:#fff}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:none,0 0 0 0 rgba(27,42,78,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#1b2a4e}.btn-outline-primary-desat{border-color:#6c8aec;color:#6c8aec}.btn-outline-primary-desat:hover{background-color:#6c8aec;border-color:#6c8aec;color:#fff}.btn-check:focus+.btn-outline-primary-desat,.btn-outline-primary-desat:focus{box-shadow:0 0 0 0 rgba(108,138,236,.5)}.btn-check:active+.btn-outline-primary-desat,.btn-check:checked+.btn-outline-primary-desat,.btn-outline-primary-desat.active,.btn-outline-primary-desat.dropdown-toggle.show,.btn-outline-primary-desat:active{background-color:#6c8aec;border-color:#6c8aec;color:#fff}.btn-check:active+.btn-outline-primary-desat:focus,.btn-check:checked+.btn-outline-primary-desat:focus,.btn-outline-primary-desat.active:focus,.btn-outline-primary-desat.dropdown-toggle.show:focus,.btn-outline-primary-desat:active:focus{box-shadow:none,0 0 0 0 rgba(108,138,236,.5)}.btn-outline-primary-desat.disabled,.btn-outline-primary-desat:disabled{background-color:transparent;color:#6c8aec}.btn-outline-black{border-color:#161c2d;color:#161c2d}.btn-outline-black:hover{background-color:#161c2d;border-color:#161c2d;color:#fff}.btn-check:focus+.btn-outline-black,.btn-outline-black:focus{box-shadow:0 0 0 0 rgba(22,28,45,.5)}.btn-check:active+.btn-outline-black,.btn-check:checked+.btn-outline-black,.btn-outline-black.active,.btn-outline-black.dropdown-toggle.show,.btn-outline-black:active{background-color:#161c2d;border-color:#161c2d;color:#fff}.btn-check:active+.btn-outline-black:focus,.btn-check:checked+.btn-outline-black:focus,.btn-outline-black.active:focus,.btn-outline-black.dropdown-toggle.show:focus,.btn-outline-black:active:focus{box-shadow:none,0 0 0 0 rgba(22,28,45,.5)}.btn-outline-black.disabled,.btn-outline-black:disabled{background-color:transparent;color:#161c2d}.btn-outline-white{border-color:#fff;color:#fff}.btn-outline-white:hover{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-check:focus+.btn-outline-white,.btn-outline-white:focus{box-shadow:0 0 0 0 rgba(255,255,255,.5)}.btn-check:active+.btn-outline-white,.btn-check:checked+.btn-outline-white,.btn-outline-white.active,.btn-outline-white.dropdown-toggle.show,.btn-outline-white:active{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-check:active+.btn-outline-white:focus,.btn-check:checked+.btn-outline-white:focus,.btn-outline-white.active:focus,.btn-outline-white.dropdown-toggle.show:focus,.btn-outline-white:active:focus{box-shadow:none,0 0 0 0 rgba(255,255,255,.5)}.btn-outline-white.disabled,.btn-outline-white:disabled{background-color:transparent;color:#fff}.btn-link{color:#335eea;font-weight:400;text-decoration:none}.btn-link:hover{color:#294bbb}.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#869ab8}.btn-group-lg>.btn,.btn-lg{border-radius:.375rem;font-size:1.0625rem;padding:1.122rem 1.5rem}.btn-group-sm>.btn,.btn-sm{border-radius:.375rem;font-size:1.0625rem;padding:.5625rem 1rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{height:auto;transition:width .35s ease;width:0}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:0 solid rgba(22,28,45,.15);border-radius:.375rem;box-shadow:0 .5rem 1.5rem rgba(22,28,45,.1);color:#161c2d;display:none;font-size:.9375rem;list-style:none;margin:0;min-width:14rem;padding:1.625rem 1.75rem;position:absolute;text-align:left;z-index:1000}.dropdown-menu[data-bs-popper]{left:0;margin-top:0;top:100%}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{bottom:100%;margin-bottom:0;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{left:100%;margin-left:0;margin-top:0;right:auto;top:0}.dropend .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{left:auto;margin-right:0;margin-top:0;right:100%;top:0}.dropstart .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropstart .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{border-top:1px solid rgba(22,28,45,.15);height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#506690;display:block;font-weight:400;padding:0 1.75rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item.active,.dropdown-item:active,.dropdown-item:focus,.dropdown-item:hover{background-color:none;color:#335eea;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#abbcd5;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#335eea;display:block;font-size:.9375rem;margin-bottom:0;padding:1.625rem 1.75rem;white-space:nowrap}.dropdown-item-text{color:#506690;display:block;padding:0 1.75rem}.dropdown-menu-dark{background-color:#384c74;border-color:rgba(22,28,45,.15);color:#d9e2ef}.dropdown-menu-dark .dropdown-item{color:#d9e2ef}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{background-color:rgba(255,255,255,.15);color:#fff}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{background-color:none;color:#335eea}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#abbcd5}.dropdown-menu-dark .dropdown-divider{border-color:rgba(22,28,45,.15)}.dropdown-menu-dark .dropdown-item-text{color:#d9e2ef}.dropdown-menu-dark .dropdown-header{color:#abbcd5}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.9375rem;padding-right:.9375rem}.dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:1.125rem;padding-right:1.125rem}.btn-group.show .dropdown-toggle,.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{color:#335eea;display:block;padding:.5rem 1rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#294bbb;text-decoration:none}.nav-link.disabled{color:#869ab8;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #d9e2ef}.nav-tabs .nav-link{background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#f1f4f8 #f1f4f8 #d9e2ef;isolation:isolate}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#869ab8}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#fff;border-color:#d9e2ef #d9e2ef #fff;color:#506690}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{background:none;border:0;border-radius:.375rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#335eea;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;padding:1.25rem 0;position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl{align-items:center;display:flex;flex-wrap:inherit;justify-content:space-between}.navbar-brand{font-size:1.5rem;margin-right:0;padding-bottom:.15rem;padding-top:.15rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.375rem;font-size:1.1875rem;line-height:1;padding:.25rem .75rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 0;outline:0;text-decoration:none}.navbar-toggler-icon{background-position:50%;background-repeat:no-repeat;background-size:100%;display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:1.5rem;padding-right:1.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler,.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{background-color:transparent;border-left:0;border-right:0;bottom:0;flex-grow:1;position:inherit;transform:none;transition:none;visibility:visible!important;z-index:1000}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{border-bottom:0;border-top:0;height:auto}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:1.5rem;padding-right:1.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler,.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{background-color:transparent;border-left:0;border-right:0;bottom:0;flex-grow:1;position:inherit;transform:none;transition:none;visibility:visible!important;z-index:1000}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{border-bottom:0;border-top:0;height:auto}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:1.5rem;padding-right:1.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler,.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{background-color:transparent;border-left:0;border-right:0;bottom:0;flex-grow:1;position:inherit;transform:none;transition:none;visibility:visible!important;z-index:1000}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{border-bottom:0;border-top:0;height:auto}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:1.5rem;padding-right:1.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler,.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{background-color:transparent;border-left:0;border-right:0;bottom:0;flex-grow:1;position:inherit;transform:none;transition:none;visibility:visible!important;z-index:1000}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{border-bottom:0;border-top:0;height:auto}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-left:1.5rem;padding-right:1.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler,.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{background-color:transparent;border-left:0;border-right:0;bottom:0;flex-grow:1;position:inherit;transform:none;transition:none;visibility:visible!important;z-index:1000}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{border-bottom:0;border-top:0;height:auto}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:1.5rem;padding-right:1.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler,.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{background-color:transparent;border-left:0;border-right:0;bottom:0;flex-grow:1;position:inherit;transform:none;transition:none;visibility:visible!important;z-index:1000}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{border-bottom:0;border-top:0;height:auto}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:#335eea}.navbar-light .navbar-nav .nav-link{color:#506690}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:#335eea}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(22,28,45,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:#335eea}.navbar-light .navbar-toggler{border-color:transparent;color:#506690}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='%23506690' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:#506690}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:#335eea}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-nav .nav-link,.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#fff}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:transparent;color:#fff}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text,.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#fff;border:0 solid #f1f4f8;border-radius:.375rem;display:flex;flex-direction:column;min-width:0}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:.375rem;border-top-right-radius:.375rem;border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:2rem}.card-title{margin-bottom:1.5rem}.card-subtitle{margin-top:-.75rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:2rem}.card-header{background-color:rgba(22,28,45,.03);border-bottom:0 solid #f1f4f8;margin-bottom:0;padding:1.5rem 2rem}.card-header:first-child{border-radius:.375rem .375rem 0 0}.card-footer{background-color:rgba(22,28,45,.03);border-top:0 solid #f1f4f8;padding:1.5rem 2rem}.card-footer:last-child{border-radius:0 0 .375rem .375rem}.card-header-tabs{border-bottom:0;margin-bottom:-1.5rem}.card-header-pills,.card-header-tabs{margin-left:-1rem;margin-right:-1rem}.card-img-overlay{border-radius:.375rem;bottom:0;left:0;padding:1rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.card-img,.card-img-bottom{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.card-group>.card{margin-bottom:1.25rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{align-items:center;background-color:#fff;border:0;border-radius:0;color:#161c2d;display:flex;font-size:1.0625rem;overflow-anchor:none;padding:1.5rem 2rem;position:relative;text-align:left;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease;width:100%}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){background-color:#fff;box-shadow:inset 0 -1px 0 #f1f4f8;color:#161c2d}.accordion-button:not(.collapsed):after{transform:rotate(-180deg)}.accordion-button:after,.accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23869AB8'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E")}.accordion-button:after{background-repeat:no-repeat;background-size:.85rem;content:"";flex-shrink:0;height:.85rem;margin-left:auto;transition:transform .2s ease-in-out;width:.85rem}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{border-color:#335eea;box-shadow:none;outline:0;z-index:3}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid #f1f4f8}.accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-left-radius:calc(.375rem - 1px);border-bottom-right-radius:calc(.375rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.accordion-body{padding:1.5rem 2rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-left:0;border-radius:0;border-right:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.breadcrumb{border-radius:0}.breadcrumb{background-color:transparent;display:flex;flex-wrap:wrap;font-size:.9375rem;list-style:none;margin-bottom:0;padding:.75rem 0}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#506690;content:var(--bs-breadcrumb-divider,"/");float:left;padding-right:.5rem}.breadcrumb-item.active{color:#506690}.pagination{display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #d9e2ef;color:#335eea;display:block;position:relative;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{border-color:#d9e2ef;text-decoration:none;z-index:2}.page-link:focus,.page-link:hover{background-color:#f1f4f8;color:#294bbb}.page-link:focus{box-shadow:none;outline:0;z-index:3}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{background-color:#335eea;border-color:#335eea;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#d9e2ef;color:#869ab8;pointer-events:none}.page-link{padding:.8125rem 1.25rem}.page-item:first-child .page-link{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem}.page-item:last-child .page-link{border-bottom-right-radius:.375rem;border-top-right-radius:.375rem}.pagination-lg .page-link{font-size:1.1875rem;padding:1.122rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.pagination-sm .page-link{font-size:.9375rem;padding:.5625rem 1rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.badge{border-radius:.375rem;color:#fff;display:inline-block;font-size:.75em;font-weight:600;line-height:1;padding:.25rem .75rem;text-align:center;vertical-align:baseline;white-space:nowrap}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{border:1px solid transparent;border-radius:.375rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:600}.alert-dismissible{padding-right:3.75rem}.alert-dismissible .btn-close{padding:.9375rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{color:#14265e}.alert-primary .alert-link{color:#101e4b}.alert-secondary{color:#20293a}.alert-secondary .alert-link{color:#1a212e}.alert-success{color:#1a4a3c}.alert-success .alert-link{color:#153b30}.alert-info{color:#322a60}.alert-info .alert-link{color:#28224d}.alert-warning{color:#64562f}.alert-warning .alert-link{color:#504526}.alert-danger{color:#591c24}.alert-danger .alert-link{color:#47161d}.alert-light{color:#646465}.alert-light .alert-link{color:#505051}.alert-dark{color:#767f95}.alert-dark .alert-link{color:#5e6677}.alert-primary-desat{color:#2b375e}.alert-primary-desat .alert-link{color:#222c4b}.alert-black{color:#737781}.alert-black .alert-link{color:#5c5f67}.alert-white{color:#666}.alert-white .alert-link{color:#525252}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{background-color:#f1f4f8;border-radius:.375rem;box-shadow:inset 0 1px 2px rgba(22,28,45,.075);font-size:.79688rem;height:1rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#335eea;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 0,transparent 50%,rgba(255,255,255,.15) 0,rgba(255,255,255,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{border-radius:.375rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{color:#506690;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f9fbfd;color:#506690;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#f1f4f8;color:#161c2d}.list-group-item{background-color:#fff;border:1px solid #f1f4f8;color:#1b2a4e;display:block;padding:1.5rem 2rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#869ab8;pointer-events:none}.list-group-item.active{background-color:#335eea;border-color:#335eea;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.375rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.375rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.375rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.375rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.375rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.375rem}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#d6dffb;color:#1f388c}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#c1c9e2;color:#1f388c}.list-group-item-primary.list-group-item-action.active{background-color:#1f388c;border-color:#1f388c;color:#fff}.list-group-item-secondary{background-color:#dce0e9;color:#303d56}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#c6cad2;color:#303d56}.list-group-item-secondary.list-group-item-action.active{background-color:#303d56;border-color:#303d56;color:#fff}.list-group-item-success{background-color:#d9f1ea;color:#28705a}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#c3d9d3;color:#28705a}.list-group-item-success.list-group-item-action.active{background-color:#28705a;border-color:#28705a;color:#fff}.list-group-item-info{background-color:#e5e1fc;color:#4a3f8f}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#cecbe3;color:#4a3f8f}.list-group-item-info.list-group-item-action.active{background-color:#4a3f8f;border-color:#4a3f8f;color:#fff}.list-group-item-warning{background-color:#fef7e4;color:#968147}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#e5decd;color:#968147}.list-group-item-warning.list-group-item-action.active{background-color:#968147;border-color:#968147;color:#fff}.list-group-item-danger{background-color:#f9dade;color:#862b35}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#e0c4c8;color:#862b35}.list-group-item-danger.list-group-item-action.active{background-color:#862b35;border-color:#862b35;color:#fff}.list-group-item-light{background-color:#fefeff;color:#959798}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#e5e5e6;color:#959798}.list-group-item-light.list-group-item-action.active{background-color:#959798;border-color:#959798;color:#fff}.list-group-item-dark{background-color:#d1d4dc;color:#10192f}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#bcbfc6;color:#10192f}.list-group-item-dark.list-group-item-action.active{background-color:#10192f;border-color:#10192f;color:#fff}.list-group-item-primary-desat{background-color:#e2e8fb;color:#41538e}.list-group-item-primary-desat.list-group-item-action:focus,.list-group-item-primary-desat.list-group-item-action:hover{background-color:#cbd1e2;color:#41538e}.list-group-item-primary-desat.list-group-item-action.active{background-color:#41538e;border-color:#41538e;color:#fff}.list-group-item-black{background-color:#d0d2d5;color:#0d111b}.list-group-item-black.list-group-item-action:focus,.list-group-item-black.list-group-item-action:hover{background-color:#bbbdc0;color:#0d111b}.list-group-item-black.list-group-item-action.active{background-color:#0d111b;border-color:#0d111b;color:#fff}.list-group-item-white{background-color:#fff;color:#999}.list-group-item-white.list-group-item-action:focus,.list-group-item-white.list-group-item-action:hover{background-color:#e6e6e6;color:#999}.list-group-item-white.list-group-item-action.active{background-color:#999;border-color:#999;color:#fff}.btn-close{background:transparent url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23869AB8'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3E%3C/svg%3E") 50%/.5em auto no-repeat;border:0;border-radius:.375rem;box-sizing:content-box;color:#869ab8;height:.5em;opacity:.5;padding:.25em;width:.5em}.btn-close:hover{color:#869ab8;opacity:.75;text-decoration:none}.btn-close:focus{box-shadow:none;opacity:1;outline:0}.btn-close.disabled,.btn-close:disabled{opacity:.25;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{background-clip:padding-box;background-color:rgba(255,255,255,.85);border:1px solid rgba(0,0,0,.1);border-radius:.375rem;box-shadow:0 .5rem 1.5rem rgba(22,28,45,.1);font-size:.875rem;max-width:100%;pointer-events:auto;width:350px}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{max-width:100%;pointer-events:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.toast-container>:not(:last-child){margin-bottom:1.25rem}.toast-header{align-items:center;background-clip:padding-box;background-color:rgba(255,255,255,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px);color:#869ab8;display:flex;padding:.5rem .75rem}.toast-header .btn-close{margin-left:.75rem;margin-right:-.375rem}.toast-body{word-wrap:break-word;padding:.75rem}.modal{display:none;height:100%;left:0;outline:0;overflow-x:hidden;overflow-y:auto;position:fixed;top:0;width:100%;z-index:1055}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(22,28,45,.2);border-radius:.5rem;box-shadow:0 .125rem .25rem rgba(22,28,45,.075);display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#161c2d;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1050}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.8}.modal-header{align-items:center;border-bottom:1px solid #f1f4f8;border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px);display:flex;flex-shrink:0;justify-content:space-between;padding:2.5rem}.modal-header .btn-close{margin:-1.25rem -1.25rem -1.25rem auto;padding:1.25rem}.modal-title{line-height:1.6;margin-bottom:0}.modal-body{flex:1 1 auto;padding:2.5rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:calc(.5rem - 1px);border-bottom-right-radius:calc(.5rem - 1px);border-top:1px solid #f1f4f8;display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;padding:2.25rem}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-content{box-shadow:0 .5rem 1.5rem rgba(22,28,45,.1)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{word-wrap:break-word;display:block;font-family:HKGroteskPro,serif;font-size:.9375rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.6;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1080}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .tooltip-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{border-top-color:#161c2d;border-width:.4rem .4rem 0;top:-1px}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{border-right-color:#161c2d;border-width:.4rem .4rem .4rem 0;right:-1px}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{border-bottom-color:#161c2d;border-width:0 .4rem .4rem;bottom:-1px}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{border-left-color:#161c2d;border-width:.4rem 0 .4rem .4rem;left:-1px}.tooltip-inner{background-color:#161c2d;border-radius:.375rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid transparent;border-radius:.375rem;box-shadow:0 1.5rem 4rem rgba(22,28,45,.1);display:block;font-family:HKGroteskPro,serif;font-size:.9375rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.6;max-width:380px;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.popover .popover-arrow{display:block;height:.625rem;position:absolute;width:1.25rem}.popover .popover-arrow:after,.popover .popover-arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.625rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:before{border-top-color:rgba(0,0,0,.05);border-width:.625rem .625rem 0;bottom:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{border-top-color:#fff;border-width:.625rem .625rem 0;bottom:1px}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{height:1.25rem;left:calc(-.625rem - 1px);width:.625rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:before{border-right-color:rgba(0,0,0,.05);border-width:.625rem .625rem .625rem 0;left:0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{border-right-color:#fff;border-width:.625rem .625rem .625rem 0;left:1px}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.625rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:before{border-bottom-color:rgba(0,0,0,.05);border-width:0 .625rem .625rem;top:0}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{border-bottom-color:#fff;border-width:0 .625rem .625rem;top:1px}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid transparent;content:"";display:block;left:50%;margin-left:-.625rem;position:absolute;top:0;width:1.25rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{height:1.25rem;right:calc(-.625rem - 1px);width:.625rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:before{border-left-color:rgba(0,0,0,.05);border-width:.625rem 0 .625rem .625rem;right:0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{border-left-color:#fff;border-width:.625rem 0 .625rem .625rem;right:1px}.popover-header{background-color:transparent;border-bottom:1px solid transparent;border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px);font-size:1.0625rem;margin-bottom:0;padding:1.5rem 2rem}.popover-header:empty{display:none}.popover-body{color:#869ab8;padding:1.5rem 2rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;display:inline-block;height:2rem;width:2rem}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;position:absolute;right:0;z-index:2}.carousel-indicators [data-bs-target]{background-clip:padding-box;background-color:#fff;border:0;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;padding:0;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:1.25rem;color:#fff;left:15%;padding-bottom:1.25rem;padding-top:1.25rem;position:absolute;right:15%;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#161c2d}.carousel-dark .carousel-caption{color:#161c2d}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite;background-color:currentColor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{background-clip:padding-box;background-color:#fff;bottom:0;box-shadow:0 .125rem .25rem rgba(22,28,45,.075);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:transform .3s ease-in-out;visibility:hidden;z-index:1045}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{background-color:#161c2d;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.8}.offcanvas-header{align-items:center;display:flex;justify-content:space-between;padding:2.5rem}.offcanvas-header .btn-close{margin-bottom:-1.25rem;margin-right:-1.25rem;margin-top:-1.25rem;padding:1.25rem}.offcanvas-title{line-height:1.6;margin-bottom:0}.offcanvas-body{flex-grow:1;overflow-y:auto;padding:2.5rem}.offcanvas-start{border-right:1px solid rgba(22,28,45,.2);left:0;top:0;transform:translateX(-100%);width:400px}.offcanvas-end{border-left:1px solid rgba(22,28,45,.2);right:0;top:0;transform:translateX(100%);width:400px}.offcanvas-top{border-bottom:1px solid rgba(22,28,45,.2);top:0;transform:translateY(-100%)}.offcanvas-bottom,.offcanvas-top{height:30vh;left:0;max-height:100%;right:0}.offcanvas-bottom{border-top:1px solid rgba(22,28,45,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{background-color:currentColor;cursor:wait;display:inline-block;min-height:1em;opacity:.5;vertical-align:middle}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite;-webkit-mask-image:linear-gradient(130deg,#161c2d 55%,rgba(0,0,0,.8) 75%,#161c2d 95%);mask-image:linear-gradient(130deg,#161c2d 55%,rgba(0,0,0,.8) 75%,#161c2d 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@-webkit-keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.link-primary{color:#335eea}.link-primary:focus,.link-primary:hover{color:#294bbb}.link-secondary{color:#506690}.link-secondary:focus,.link-secondary:hover{color:#405273}.link-success{color:#42ba96}.link-success:focus,.link-success:hover{color:#359578}.link-info{color:#7c69ef}.link-info:focus,.link-info:hover{color:#6354bf}.link-warning{color:#fad776}.link-warning:focus,.link-warning:hover{color:#fbdf91}.link-danger{color:#df4759}.link-danger:focus,.link-danger:hover{color:#b23947}.link-light{color:#f9fbfd}.link-light:focus,.link-light:hover{color:#fafcfd}.link-dark{color:#1b2a4e}.link-dark:focus,.link-dark:hover{color:#16223e}.link-primary-desat{color:#6c8aec}.link-primary-desat:focus,.link-primary-desat:hover{color:#566ebd}.link-black{color:#161c2d}.link-black:focus,.link-black:hover{color:#121624}.link-white,.link-white:focus,.link-white:hover{color:#fff}.ratio{position:relative;width:100%}.ratio:before{content:"";display:block;padding-top:var(--bs-aspect-ratio)}.ratio>*{height:100%;left:0;position:absolute;top:0;width:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.85714%}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}.sticky-top{position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.hstack{align-items:center;flex-direction:row}.hstack,.vstack{align-self:stretch;display:flex}.vstack{flex:1 1 auto;flex-direction:column}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.stretched-link:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{align-self:stretch;background-color:currentColor;display:inline-block;min-height:1em;opacity:1;width:1px}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-1{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1.5rem rgba(22,28,45,.1)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(22,28,45,.075)!important}.shadow-lg{box-shadow:0 1.5rem 4rem rgba(22,28,45,.1)!important}.shadow-light{box-shadow:0 .5rem 1.5rem rgba(22,28,45,.05)!important}.shadow-dark{box-shadow:0 .5rem 1.5rem rgba(22,28,45,.15)!important}.shadow-light-lg{box-shadow:0 1.5rem 4rem rgba(22,28,45,.05)!important}.shadow-dark-lg{box-shadow:0 1.5rem 4rem rgba(22,28,45,.15)!important}.shadow-lift{box-shadow:0 1rem 2.5rem rgba(22,28,45,.1),0 .5rem 1rem -.75rem rgba(22,28,45,.1)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.bottom-0{bottom:0!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #f1f4f8!important}.border-0{border:0!important}.border-top{border-top:1px solid #f1f4f8!important}.border-top-0{border-top:0!important}.border-right{border-right:1px solid #f1f4f8!important}.border-right-0{border-right:0!important}.border-bottom{border-bottom:1px solid #f1f4f8!important}.border-bottom-0{border-bottom:0!important}.border-left{border-left:1px solid #f1f4f8!important}.border-left-0{border-left:0!important}.border-primary{border-color:#335eea!important}.border-secondary{border-color:#506690!important}.border-success{border-color:#42ba96!important}.border-info{border-color:#7c69ef!important}.border-warning{border-color:#fad776!important}.border-danger{border-color:#df4759!important}.border-light{border-color:#f9fbfd!important}.border-dark{border-color:#1b2a4e!important}.border-primary-desat{border-color:#6c8aec!important}.border-black{border-color:#161c2d!important}.border-white{border-color:#fff!important}.border-white-10{border-color:rgba(255,255,255,.1)!important}.border-white-20{border-color:rgba(255,255,255,.2)!important}.border-gray-300{border-color:#d9e2ef!important}.border-gray-800{border-color:#384c74!important}.border-gray-800-50{border-color:rgba(56,76,116,.5)!important}.border-gray-900-50{border-color:rgba(27,42,78,.5)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-110{width:110%!important}.w-120{width:120%!important}.w-130{width:130%!important}.w-140{width:140%!important}.w-150{width:150%!important}.w-auto{width:auto!important}.mw-25{max-width:25%!important}.mw-50{max-width:50%!important}.mw-75{max-width:75%!important}.mw-100{max-width:100%!important}.mw-110{max-width:110%!important}.mw-120{max-width:120%!important}.mw-130{max-width:130%!important}.mw-140{max-width:140%!important}.mw-150{max-width:150%!important}.vw-25{width:25vw!important}.vw-50{width:50vw!important}.vw-75{width:75vw!important}.vw-100{width:100vw!important}.vw-110{width:110vw!important}.vw-120{width:120vw!important}.vw-130{width:130vw!important}.vw-140{width:140vw!important}.vw-150{width:150vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-110{height:110%!important}.h-120{height:120%!important}.h-130{height:130%!important}.h-140{height:140%!important}.h-150{height:150%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-25{height:25vh!important}.vh-50{height:50vh!important}.vh-75{height:75vh!important}.vh-100{height:100vh!important}.vh-110{height:110vh!important}.vh-120{height:120vh!important}.vh-130{height:130vh!important}.vh-140{height:140vh!important}.vh-150{height:150vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:.75rem!important}.gap-4{gap:1rem!important}.gap-5{gap:1.5rem!important}.gap-6{gap:2rem!important}.gap-7{gap:2.5rem!important}.gap-8{gap:3rem!important}.gap-9{gap:4rem!important}.gap-10{gap:5rem!important}.gap-11{gap:6rem!important}.gap-12{gap:8rem!important}.gap-13{gap:10rem!important}.gap-14{gap:12rem!important}.gap-15{gap:16rem!important}.gap-16{gap:25rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:.75rem!important}.m-4{margin:1rem!important}.m-5{margin:1.5rem!important}.m-6{margin:2rem!important}.m-7{margin:2.5rem!important}.m-8{margin:3rem!important}.m-9{margin:4rem!important}.m-10{margin:5rem!important}.m-11{margin:6rem!important}.m-12{margin:8rem!important}.m-13{margin:10rem!important}.m-14{margin:12rem!important}.m-15{margin:16rem!important}.m-16{margin:25rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-6{margin-left:2rem!important;margin-right:2rem!important}.mx-7{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-8{margin-left:3rem!important;margin-right:3rem!important}.mx-9{margin-left:4rem!important;margin-right:4rem!important}.mx-10{margin-left:5rem!important;margin-right:5rem!important}.mx-11{margin-left:6rem!important;margin-right:6rem!important}.mx-12{margin-left:8rem!important;margin-right:8rem!important}.mx-13{margin-left:10rem!important;margin-right:10rem!important}.mx-14{margin-left:12rem!important;margin-right:12rem!important}.mx-15{margin-left:16rem!important;margin-right:16rem!important}.mx-16{margin-left:25rem!important;margin-right:25rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-bottom:0!important;margin-top:0!important}.my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-5{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-6{margin-bottom:2rem!important;margin-top:2rem!important}.my-7{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-8{margin-bottom:3rem!important;margin-top:3rem!important}.my-9{margin-bottom:4rem!important;margin-top:4rem!important}.my-10{margin-bottom:5rem!important;margin-top:5rem!important}.my-11{margin-bottom:6rem!important;margin-top:6rem!important}.my-12{margin-bottom:8rem!important;margin-top:8rem!important}.my-13{margin-bottom:10rem!important;margin-top:10rem!important}.my-14{margin-bottom:12rem!important;margin-top:12rem!important}.my-15{margin-bottom:16rem!important;margin-top:16rem!important}.my-16{margin-bottom:25rem!important;margin-top:25rem!important}.my-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:.75rem!important}.mt-4{margin-top:1rem!important}.mt-5{margin-top:1.5rem!important}.mt-6{margin-top:2rem!important}.mt-7{margin-top:2.5rem!important}.mt-8{margin-top:3rem!important}.mt-9{margin-top:4rem!important}.mt-10{margin-top:5rem!important}.mt-11{margin-top:6rem!important}.mt-12{margin-top:8rem!important}.mt-13{margin-top:10rem!important}.mt-14{margin-top:12rem!important}.mt-15{margin-top:16rem!important}.mt-16{margin-top:25rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:.75rem!important}.me-4{margin-right:1rem!important}.me-5{margin-right:1.5rem!important}.me-6{margin-right:2rem!important}.me-7{margin-right:2.5rem!important}.me-8{margin-right:3rem!important}.me-9{margin-right:4rem!important}.me-10{margin-right:5rem!important}.me-11{margin-right:6rem!important}.me-12{margin-right:8rem!important}.me-13{margin-right:10rem!important}.me-14{margin-right:12rem!important}.me-15{margin-right:16rem!important}.me-16{margin-right:25rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:.75rem!important}.mb-4{margin-bottom:1rem!important}.mb-5{margin-bottom:1.5rem!important}.mb-6{margin-bottom:2rem!important}.mb-7{margin-bottom:2.5rem!important}.mb-8{margin-bottom:3rem!important}.mb-9{margin-bottom:4rem!important}.mb-10{margin-bottom:5rem!important}.mb-11{margin-bottom:6rem!important}.mb-12{margin-bottom:8rem!important}.mb-13{margin-bottom:10rem!important}.mb-14{margin-bottom:12rem!important}.mb-15{margin-bottom:16rem!important}.mb-16{margin-bottom:25rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:.75rem!important}.ms-4{margin-left:1rem!important}.ms-5{margin-left:1.5rem!important}.ms-6{margin-left:2rem!important}.ms-7{margin-left:2.5rem!important}.ms-8{margin-left:3rem!important}.ms-9{margin-left:4rem!important}.ms-10{margin-left:5rem!important}.ms-11{margin-left:6rem!important}.ms-12{margin-left:8rem!important}.ms-13{margin-left:10rem!important}.ms-14{margin-left:12rem!important}.ms-15{margin-left:16rem!important}.ms-16{margin-left:25rem!important}.ms-auto{margin-left:auto!important}.m-n1{margin:-.25rem!important}.m-n2{margin:-.5rem!important}.m-n3{margin:-.75rem!important}.m-n4{margin:-1rem!important}.m-n5{margin:-1.5rem!important}.m-n6{margin:-2rem!important}.m-n7{margin:-2.5rem!important}.m-n8{margin:-3rem!important}.m-n9{margin:-4rem!important}.m-n10{margin:-5rem!important}.m-n11{margin:-6rem!important}.m-n12{margin:-8rem!important}.m-n13{margin:-10rem!important}.m-n14{margin:-12rem!important}.m-n15{margin:-16rem!important}.m-n16{margin:-25rem!important}.mx-n1{margin-left:-.25rem!important;margin-right:-.25rem!important}.mx-n2{margin-left:-.5rem!important;margin-right:-.5rem!important}.mx-n3{margin-left:-.75rem!important;margin-right:-.75rem!important}.mx-n4{margin-left:-1rem!important;margin-right:-1rem!important}.mx-n5{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.mx-n6{margin-left:-2rem!important;margin-right:-2rem!important}.mx-n7{margin-left:-2.5rem!important;margin-right:-2.5rem!important}.mx-n8{margin-left:-3rem!important;margin-right:-3rem!important}.mx-n9{margin-left:-4rem!important;margin-right:-4rem!important}.mx-n10{margin-left:-5rem!important;margin-right:-5rem!important}.mx-n11{margin-left:-6rem!important;margin-right:-6rem!important}.mx-n12{margin-left:-8rem!important;margin-right:-8rem!important}.mx-n13{margin-left:-10rem!important;margin-right:-10rem!important}.mx-n14{margin-left:-12rem!important;margin-right:-12rem!important}.mx-n15{margin-left:-16rem!important;margin-right:-16rem!important}.mx-n16{margin-left:-25rem!important;margin-right:-25rem!important}.my-n1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.my-n2{margin-bottom:-.5rem!important;margin-top:-.5rem!important}.my-n3{margin-bottom:-.75rem!important;margin-top:-.75rem!important}.my-n4{margin-bottom:-1rem!important;margin-top:-1rem!important}.my-n5{margin-bottom:-1.5rem!important;margin-top:-1.5rem!important}.my-n6{margin-bottom:-2rem!important;margin-top:-2rem!important}.my-n7{margin-bottom:-2.5rem!important;margin-top:-2.5rem!important}.my-n8{margin-bottom:-3rem!important;margin-top:-3rem!important}.my-n9{margin-bottom:-4rem!important;margin-top:-4rem!important}.my-n10{margin-bottom:-5rem!important;margin-top:-5rem!important}.my-n11{margin-bottom:-6rem!important;margin-top:-6rem!important}.my-n12{margin-bottom:-8rem!important;margin-top:-8rem!important}.my-n13{margin-bottom:-10rem!important;margin-top:-10rem!important}.my-n14{margin-bottom:-12rem!important;margin-top:-12rem!important}.my-n15{margin-bottom:-16rem!important;margin-top:-16rem!important}.my-n16{margin-bottom:-25rem!important;margin-top:-25rem!important}.mt-n1{margin-top:-.25rem!important}.mt-n2{margin-top:-.5rem!important}.mt-n3{margin-top:-.75rem!important}.mt-n4{margin-top:-1rem!important}.mt-n5{margin-top:-1.5rem!important}.mt-n6{margin-top:-2rem!important}.mt-n7{margin-top:-2.5rem!important}.mt-n8{margin-top:-3rem!important}.mt-n9{margin-top:-4rem!important}.mt-n10{margin-top:-5rem!important}.mt-n11{margin-top:-6rem!important}.mt-n12{margin-top:-8rem!important}.mt-n13{margin-top:-10rem!important}.mt-n14{margin-top:-12rem!important}.mt-n15{margin-top:-16rem!important}.mt-n16{margin-top:-25rem!important}.me-n1{margin-right:-.25rem!important}.me-n2{margin-right:-.5rem!important}.me-n3{margin-right:-.75rem!important}.me-n4{margin-right:-1rem!important}.me-n5{margin-right:-1.5rem!important}.me-n6{margin-right:-2rem!important}.me-n7{margin-right:-2.5rem!important}.me-n8{margin-right:-3rem!important}.me-n9{margin-right:-4rem!important}.me-n10{margin-right:-5rem!important}.me-n11{margin-right:-6rem!important}.me-n12{margin-right:-8rem!important}.me-n13{margin-right:-10rem!important}.me-n14{margin-right:-12rem!important}.me-n15{margin-right:-16rem!important}.me-n16{margin-right:-25rem!important}.mb-n1{margin-bottom:-.25rem!important}.mb-n2{margin-bottom:-.5rem!important}.mb-n3{margin-bottom:-.75rem!important}.mb-n4{margin-bottom:-1rem!important}.mb-n5{margin-bottom:-1.5rem!important}.mb-n6{margin-bottom:-2rem!important}.mb-n7{margin-bottom:-2.5rem!important}.mb-n8{margin-bottom:-3rem!important}.mb-n9{margin-bottom:-4rem!important}.mb-n10{margin-bottom:-5rem!important}.mb-n11{margin-bottom:-6rem!important}.mb-n12{margin-bottom:-8rem!important}.mb-n13{margin-bottom:-10rem!important}.mb-n14{margin-bottom:-12rem!important}.mb-n15{margin-bottom:-16rem!important}.mb-n16{margin-bottom:-25rem!important}.ms-n1{margin-left:-.25rem!important}.ms-n2{margin-left:-.5rem!important}.ms-n3{margin-left:-.75rem!important}.ms-n4{margin-left:-1rem!important}.ms-n5{margin-left:-1.5rem!important}.ms-n6{margin-left:-2rem!important}.ms-n7{margin-left:-2.5rem!important}.ms-n8{margin-left:-3rem!important}.ms-n9{margin-left:-4rem!important}.ms-n10{margin-left:-5rem!important}.ms-n11{margin-left:-6rem!important}.ms-n12{margin-left:-8rem!important}.ms-n13{margin-left:-10rem!important}.ms-n14{margin-left:-12rem!important}.ms-n15{margin-left:-16rem!important}.ms-n16{margin-left:-25rem!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.p-5{padding:1.5rem!important}.p-6{padding:2rem!important}.p-7{padding:2.5rem!important}.p-8{padding:3rem!important}.p-9{padding:4rem!important}.p-10{padding:5rem!important}.p-11{padding:6rem!important}.p-12{padding:8rem!important}.p-13{padding:10rem!important}.p-14{padding:12rem!important}.p-15{padding:16rem!important}.p-16{padding:25rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-6{padding-left:2rem!important;padding-right:2rem!important}.px-7{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-8{padding-left:3rem!important;padding-right:3rem!important}.px-9{padding-left:4rem!important;padding-right:4rem!important}.px-10{padding-left:5rem!important;padding-right:5rem!important}.px-11{padding-left:6rem!important;padding-right:6rem!important}.px-12{padding-left:8rem!important;padding-right:8rem!important}.px-13{padding-left:10rem!important;padding-right:10rem!important}.px-14{padding-left:12rem!important;padding-right:12rem!important}.px-15{padding-left:16rem!important;padding-right:16rem!important}.px-16{padding-left:25rem!important;padding-right:25rem!important}.py-0{padding-bottom:0!important;padding-top:0!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-5{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-6{padding-bottom:2rem!important;padding-top:2rem!important}.py-7{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-8{padding-bottom:3rem!important;padding-top:3rem!important}.py-9{padding-bottom:4rem!important;padding-top:4rem!important}.py-10{padding-bottom:5rem!important;padding-top:5rem!important}.py-11{padding-bottom:6rem!important;padding-top:6rem!important}.py-12{padding-bottom:8rem!important;padding-top:8rem!important}.py-13{padding-bottom:10rem!important;padding-top:10rem!important}.py-14{padding-bottom:12rem!important;padding-top:12rem!important}.py-15{padding-bottom:16rem!important;padding-top:16rem!important}.py-16{padding-bottom:25rem!important;padding-top:25rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:.75rem!important}.pt-4{padding-top:1rem!important}.pt-5{padding-top:1.5rem!important}.pt-6{padding-top:2rem!important}.pt-7{padding-top:2.5rem!important}.pt-8{padding-top:3rem!important}.pt-9{padding-top:4rem!important}.pt-10{padding-top:5rem!important}.pt-11{padding-top:6rem!important}.pt-12{padding-top:8rem!important}.pt-13{padding-top:10rem!important}.pt-14{padding-top:12rem!important}.pt-15{padding-top:16rem!important}.pt-16{padding-top:25rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:.75rem!important}.pe-4{padding-right:1rem!important}.pe-5{padding-right:1.5rem!important}.pe-6{padding-right:2rem!important}.pe-7{padding-right:2.5rem!important}.pe-8{padding-right:3rem!important}.pe-9{padding-right:4rem!important}.pe-10{padding-right:5rem!important}.pe-11{padding-right:6rem!important}.pe-12{padding-right:8rem!important}.pe-13{padding-right:10rem!important}.pe-14{padding-right:12rem!important}.pe-15{padding-right:16rem!important}.pe-16{padding-right:25rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:.75rem!important}.pb-4{padding-bottom:1rem!important}.pb-5{padding-bottom:1.5rem!important}.pb-6{padding-bottom:2rem!important}.pb-7{padding-bottom:2.5rem!important}.pb-8{padding-bottom:3rem!important}.pb-9{padding-bottom:4rem!important}.pb-10{padding-bottom:5rem!important}.pb-11{padding-bottom:6rem!important}.pb-12{padding-bottom:8rem!important}.pb-13{padding-bottom:10rem!important}.pb-14{padding-bottom:12rem!important}.pb-15{padding-bottom:16rem!important}.pb-16{padding-bottom:25rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:.75rem!important}.ps-4{padding-left:1rem!important}.ps-5{padding-left:1.5rem!important}.ps-6{padding-left:2rem!important}.ps-7{padding-left:2.5rem!important}.ps-8{padding-left:3rem!important}.ps-9{padding-left:4rem!important}.ps-10{padding-left:5rem!important}.ps-11{padding-left:6rem!important}.ps-12{padding-left:8rem!important}.ps-13{padding-left:10rem!important}.ps-14{padding-left:12rem!important}.ps-15{padding-left:16rem!important}.ps-16{padding-left:25rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:2.3125rem!important}.fs-2{font-size:1.9375rem!important}.fs-3{font-size:1.3125rem!important}.fs-4{font-size:1.1875rem!important}.fs-5{font-size:1.0625rem!important}.fs-6{font-size:.75rem!important}.fs-sm{font-size:.9375rem!important}.fs-lg{font-size:1.1875rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:600!important}.fw-bolder{font-weight:700!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.3!important}.lh-base{line-height:1.6!important}.lh-lg{line-height:1.3!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#335eea!important}.text-secondary{color:#506690!important}.text-success{color:#42ba96!important}.text-info{color:#7c69ef!important}.text-warning{color:#fad776!important}.text-danger{color:#df4759!important}.text-light{color:#f9fbfd!important}.text-dark{color:#1b2a4e!important}.text-primary-desat{color:#6c8aec!important}.text-black{color:#161c2d!important}.text-white{color:#fff!important}.text-gray-100{color:#f9fbfd!important}.text-gray-200{color:#f1f4f8!important}.text-gray-300{color:#d9e2ef!important}.text-gray-400{color:#c6d3e6!important}.text-gray-500{color:#abbcd5!important}.text-gray-600{color:#869ab8!important}.text-gray-700{color:#506690!important}.text-gray-800{color:#384c74!important}.text-gray-900{color:#1b2a4e!important}.text-body{color:#161c2d!important}.text-muted{color:#869ab8!important}.text-muted-80{color:rgba(134,154,184,.8)!important}.text-black-50{color:rgba(22,28,45,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-white-70{color:rgba(255,255,255,.7)!important}.text-white-75{color:rgba(255,255,255,.75)!important}.text-white-80{color:rgba(255,255,255,.8)!important}.text-reset{color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{background-color:#335eea!important}.bg-secondary{background-color:#506690!important}.bg-success{background-color:#42ba96!important}.bg-info{background-color:#7c69ef!important}.bg-warning{background-color:#fad776!important}.bg-danger{background-color:#df4759!important}.bg-light{background-color:#f9fbfd!important}.bg-dark{background-color:#1b2a4e!important}.bg-primary-desat{background-color:#6c8aec!important}.bg-black{background-color:#161c2d!important}.bg-white{background-color:#fff!important}.bg-white-20{background-color:rgba(255,255,255,.2)!important}.bg-gray-200{background-color:#f1f4f8!important}.bg-gray-300{background-color:#d9e2ef!important}.bg-gray-800{background-color:#384c74!important}.bg-gray-900{background-color:#1b2a4e!important}.bg-gray-900-50{background-color:rgba(27,42,78,.5)!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.375rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.25rem!important}.rounded-2{border-radius:.375rem!important}.rounded-3{border-radius:.5rem!important}.rounded-4{border-radius:1rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.375rem!important}.rounded-end,.rounded-top{border-top-right-radius:.375rem!important}.rounded-bottom,.rounded-end{border-bottom-right-radius:.375rem!important}.rounded-bottom,.rounded-start{border-bottom-left-radius:.375rem!important}.rounded-start{border-top-left-radius:.375rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.right-0{right:0!important}.left-0{left:0!important}.letter-spacing-lg{letter-spacing:.08em!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.position-sm-static{position:static!important}.position-sm-relative{position:relative!important}.position-sm-absolute{position:absolute!important}.position-sm-fixed{position:fixed!important}.position-sm-sticky{position:sticky!important}.border-sm{border:1px solid #f1f4f8!important}.border-sm-0{border:0!important}.border-top-sm{border-top:1px solid #f1f4f8!important}.border-top-sm-0{border-top:0!important}.border-right-sm{border-right:1px solid #f1f4f8!important}.border-right-sm-0{border-right:0!important}.border-bottom-sm{border-bottom:1px solid #f1f4f8!important}.border-bottom-sm-0{border-bottom:0!important}.border-left-sm{border-left:1px solid #f1f4f8!important}.border-left-sm-0{border-left:0!important}.w-sm-25{width:25%!important}.w-sm-50{width:50%!important}.w-sm-75{width:75%!important}.w-sm-100{width:100%!important}.w-sm-110{width:110%!important}.w-sm-120{width:120%!important}.w-sm-130{width:130%!important}.w-sm-140{width:140%!important}.w-sm-150{width:150%!important}.w-sm-auto{width:auto!important}.mw-sm-25{max-width:25%!important}.mw-sm-50{max-width:50%!important}.mw-sm-75{max-width:75%!important}.mw-sm-100{max-width:100%!important}.mw-sm-110{max-width:110%!important}.mw-sm-120{max-width:120%!important}.mw-sm-130{max-width:130%!important}.mw-sm-140{max-width:140%!important}.mw-sm-150{max-width:150%!important}.vw-sm-25{width:25vw!important}.vw-sm-50{width:50vw!important}.vw-sm-75{width:75vw!important}.vw-sm-100{width:100vw!important}.vw-sm-110{width:110vw!important}.vw-sm-120{width:120vw!important}.vw-sm-130{width:130vw!important}.vw-sm-140{width:140vw!important}.vw-sm-150{width:150vw!important}.h-sm-25{height:25%!important}.h-sm-50{height:50%!important}.h-sm-75{height:75%!important}.h-sm-100{height:100%!important}.h-sm-110{height:110%!important}.h-sm-120{height:120%!important}.h-sm-130{height:130%!important}.h-sm-140{height:140%!important}.h-sm-150{height:150%!important}.h-sm-auto{height:auto!important}.vh-sm-25{height:25vh!important}.vh-sm-50{height:50vh!important}.vh-sm-75{height:75vh!important}.vh-sm-100{height:100vh!important}.vh-sm-110{height:110vh!important}.vh-sm-120{height:120vh!important}.vh-sm-130{height:130vh!important}.vh-sm-140{height:140vh!important}.vh-sm-150{height:150vh!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:.75rem!important}.gap-sm-4{gap:1rem!important}.gap-sm-5{gap:1.5rem!important}.gap-sm-6{gap:2rem!important}.gap-sm-7{gap:2.5rem!important}.gap-sm-8{gap:3rem!important}.gap-sm-9{gap:4rem!important}.gap-sm-10{gap:5rem!important}.gap-sm-11{gap:6rem!important}.gap-sm-12{gap:8rem!important}.gap-sm-13{gap:10rem!important}.gap-sm-14{gap:12rem!important}.gap-sm-15{gap:16rem!important}.gap-sm-16{gap:25rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:.75rem!important}.m-sm-4{margin:1rem!important}.m-sm-5{margin:1.5rem!important}.m-sm-6{margin:2rem!important}.m-sm-7{margin:2.5rem!important}.m-sm-8{margin:3rem!important}.m-sm-9{margin:4rem!important}.m-sm-10{margin:5rem!important}.m-sm-11{margin:6rem!important}.m-sm-12{margin:8rem!important}.m-sm-13{margin:10rem!important}.m-sm-14{margin:12rem!important}.m-sm-15{margin:16rem!important}.m-sm-16{margin:25rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-sm-4{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-6{margin-left:2rem!important;margin-right:2rem!important}.mx-sm-7{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-sm-8{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-9{margin-left:4rem!important;margin-right:4rem!important}.mx-sm-10{margin-left:5rem!important;margin-right:5rem!important}.mx-sm-11{margin-left:6rem!important;margin-right:6rem!important}.mx-sm-12{margin-left:8rem!important;margin-right:8rem!important}.mx-sm-13{margin-left:10rem!important;margin-right:10rem!important}.mx-sm-14{margin-left:12rem!important;margin-right:12rem!important}.mx-sm-15{margin-left:16rem!important;margin-right:16rem!important}.mx-sm-16{margin-left:25rem!important;margin-right:25rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-bottom:0!important;margin-top:0!important}.my-sm-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-sm-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-sm-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-sm-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-sm-5{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-sm-6{margin-bottom:2rem!important;margin-top:2rem!important}.my-sm-7{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-sm-8{margin-bottom:3rem!important;margin-top:3rem!important}.my-sm-9{margin-bottom:4rem!important;margin-top:4rem!important}.my-sm-10{margin-bottom:5rem!important;margin-top:5rem!important}.my-sm-11{margin-bottom:6rem!important;margin-top:6rem!important}.my-sm-12{margin-bottom:8rem!important;margin-top:8rem!important}.my-sm-13{margin-bottom:10rem!important;margin-top:10rem!important}.my-sm-14{margin-bottom:12rem!important;margin-top:12rem!important}.my-sm-15{margin-bottom:16rem!important;margin-top:16rem!important}.my-sm-16{margin-bottom:25rem!important;margin-top:25rem!important}.my-sm-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:.75rem!important}.mt-sm-4{margin-top:1rem!important}.mt-sm-5{margin-top:1.5rem!important}.mt-sm-6{margin-top:2rem!important}.mt-sm-7{margin-top:2.5rem!important}.mt-sm-8{margin-top:3rem!important}.mt-sm-9{margin-top:4rem!important}.mt-sm-10{margin-top:5rem!important}.mt-sm-11{margin-top:6rem!important}.mt-sm-12{margin-top:8rem!important}.mt-sm-13{margin-top:10rem!important}.mt-sm-14{margin-top:12rem!important}.mt-sm-15{margin-top:16rem!important}.mt-sm-16{margin-top:25rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:.75rem!important}.me-sm-4{margin-right:1rem!important}.me-sm-5{margin-right:1.5rem!important}.me-sm-6{margin-right:2rem!important}.me-sm-7{margin-right:2.5rem!important}.me-sm-8{margin-right:3rem!important}.me-sm-9{margin-right:4rem!important}.me-sm-10{margin-right:5rem!important}.me-sm-11{margin-right:6rem!important}.me-sm-12{margin-right:8rem!important}.me-sm-13{margin-right:10rem!important}.me-sm-14{margin-right:12rem!important}.me-sm-15{margin-right:16rem!important}.me-sm-16{margin-right:25rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:.75rem!important}.mb-sm-4{margin-bottom:1rem!important}.mb-sm-5{margin-bottom:1.5rem!important}.mb-sm-6{margin-bottom:2rem!important}.mb-sm-7{margin-bottom:2.5rem!important}.mb-sm-8{margin-bottom:3rem!important}.mb-sm-9{margin-bottom:4rem!important}.mb-sm-10{margin-bottom:5rem!important}.mb-sm-11{margin-bottom:6rem!important}.mb-sm-12{margin-bottom:8rem!important}.mb-sm-13{margin-bottom:10rem!important}.mb-sm-14{margin-bottom:12rem!important}.mb-sm-15{margin-bottom:16rem!important}.mb-sm-16{margin-bottom:25rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:.75rem!important}.ms-sm-4{margin-left:1rem!important}.ms-sm-5{margin-left:1.5rem!important}.ms-sm-6{margin-left:2rem!important}.ms-sm-7{margin-left:2.5rem!important}.ms-sm-8{margin-left:3rem!important}.ms-sm-9{margin-left:4rem!important}.ms-sm-10{margin-left:5rem!important}.ms-sm-11{margin-left:6rem!important}.ms-sm-12{margin-left:8rem!important}.ms-sm-13{margin-left:10rem!important}.ms-sm-14{margin-left:12rem!important}.ms-sm-15{margin-left:16rem!important}.ms-sm-16{margin-left:25rem!important}.ms-sm-auto{margin-left:auto!important}.m-sm-n1{margin:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.m-sm-n3{margin:-.75rem!important}.m-sm-n4{margin:-1rem!important}.m-sm-n5{margin:-1.5rem!important}.m-sm-n6{margin:-2rem!important}.m-sm-n7{margin:-2.5rem!important}.m-sm-n8{margin:-3rem!important}.m-sm-n9{margin:-4rem!important}.m-sm-n10{margin:-5rem!important}.m-sm-n11{margin:-6rem!important}.m-sm-n12{margin:-8rem!important}.m-sm-n13{margin:-10rem!important}.m-sm-n14{margin:-12rem!important}.m-sm-n15{margin:-16rem!important}.m-sm-n16{margin:-25rem!important}.mx-sm-n1{margin-left:-.25rem!important;margin-right:-.25rem!important}.mx-sm-n2{margin-left:-.5rem!important;margin-right:-.5rem!important}.mx-sm-n3{margin-left:-.75rem!important;margin-right:-.75rem!important}.mx-sm-n4{margin-left:-1rem!important;margin-right:-1rem!important}.mx-sm-n5{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.mx-sm-n6{margin-left:-2rem!important;margin-right:-2rem!important}.mx-sm-n7{margin-left:-2.5rem!important;margin-right:-2.5rem!important}.mx-sm-n8{margin-left:-3rem!important;margin-right:-3rem!important}.mx-sm-n9{margin-left:-4rem!important;margin-right:-4rem!important}.mx-sm-n10{margin-left:-5rem!important;margin-right:-5rem!important}.mx-sm-n11{margin-left:-6rem!important;margin-right:-6rem!important}.mx-sm-n12{margin-left:-8rem!important;margin-right:-8rem!important}.mx-sm-n13{margin-left:-10rem!important;margin-right:-10rem!important}.mx-sm-n14{margin-left:-12rem!important;margin-right:-12rem!important}.mx-sm-n15{margin-left:-16rem!important;margin-right:-16rem!important}.mx-sm-n16{margin-left:-25rem!important;margin-right:-25rem!important}.my-sm-n1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.my-sm-n2{margin-bottom:-.5rem!important;margin-top:-.5rem!important}.my-sm-n3{margin-bottom:-.75rem!important;margin-top:-.75rem!important}.my-sm-n4{margin-bottom:-1rem!important;margin-top:-1rem!important}.my-sm-n5{margin-bottom:-1.5rem!important;margin-top:-1.5rem!important}.my-sm-n6{margin-bottom:-2rem!important;margin-top:-2rem!important}.my-sm-n7{margin-bottom:-2.5rem!important;margin-top:-2.5rem!important}.my-sm-n8{margin-bottom:-3rem!important;margin-top:-3rem!important}.my-sm-n9{margin-bottom:-4rem!important;margin-top:-4rem!important}.my-sm-n10{margin-bottom:-5rem!important;margin-top:-5rem!important}.my-sm-n11{margin-bottom:-6rem!important;margin-top:-6rem!important}.my-sm-n12{margin-bottom:-8rem!important;margin-top:-8rem!important}.my-sm-n13{margin-bottom:-10rem!important;margin-top:-10rem!important}.my-sm-n14{margin-bottom:-12rem!important;margin-top:-12rem!important}.my-sm-n15{margin-bottom:-16rem!important;margin-top:-16rem!important}.my-sm-n16{margin-bottom:-25rem!important;margin-top:-25rem!important}.mt-sm-n1{margin-top:-.25rem!important}.mt-sm-n2{margin-top:-.5rem!important}.mt-sm-n3{margin-top:-.75rem!important}.mt-sm-n4{margin-top:-1rem!important}.mt-sm-n5{margin-top:-1.5rem!important}.mt-sm-n6{margin-top:-2rem!important}.mt-sm-n7{margin-top:-2.5rem!important}.mt-sm-n8{margin-top:-3rem!important}.mt-sm-n9{margin-top:-4rem!important}.mt-sm-n10{margin-top:-5rem!important}.mt-sm-n11{margin-top:-6rem!important}.mt-sm-n12{margin-top:-8rem!important}.mt-sm-n13{margin-top:-10rem!important}.mt-sm-n14{margin-top:-12rem!important}.mt-sm-n15{margin-top:-16rem!important}.mt-sm-n16{margin-top:-25rem!important}.me-sm-n1{margin-right:-.25rem!important}.me-sm-n2{margin-right:-.5rem!important}.me-sm-n3{margin-right:-.75rem!important}.me-sm-n4{margin-right:-1rem!important}.me-sm-n5{margin-right:-1.5rem!important}.me-sm-n6{margin-right:-2rem!important}.me-sm-n7{margin-right:-2.5rem!important}.me-sm-n8{margin-right:-3rem!important}.me-sm-n9{margin-right:-4rem!important}.me-sm-n10{margin-right:-5rem!important}.me-sm-n11{margin-right:-6rem!important}.me-sm-n12{margin-right:-8rem!important}.me-sm-n13{margin-right:-10rem!important}.me-sm-n14{margin-right:-12rem!important}.me-sm-n15{margin-right:-16rem!important}.me-sm-n16{margin-right:-25rem!important}.mb-sm-n1{margin-bottom:-.25rem!important}.mb-sm-n2{margin-bottom:-.5rem!important}.mb-sm-n3{margin-bottom:-.75rem!important}.mb-sm-n4{margin-bottom:-1rem!important}.mb-sm-n5{margin-bottom:-1.5rem!important}.mb-sm-n6{margin-bottom:-2rem!important}.mb-sm-n7{margin-bottom:-2.5rem!important}.mb-sm-n8{margin-bottom:-3rem!important}.mb-sm-n9{margin-bottom:-4rem!important}.mb-sm-n10{margin-bottom:-5rem!important}.mb-sm-n11{margin-bottom:-6rem!important}.mb-sm-n12{margin-bottom:-8rem!important}.mb-sm-n13{margin-bottom:-10rem!important}.mb-sm-n14{margin-bottom:-12rem!important}.mb-sm-n15{margin-bottom:-16rem!important}.mb-sm-n16{margin-bottom:-25rem!important}.ms-sm-n1{margin-left:-.25rem!important}.ms-sm-n2{margin-left:-.5rem!important}.ms-sm-n3{margin-left:-.75rem!important}.ms-sm-n4{margin-left:-1rem!important}.ms-sm-n5{margin-left:-1.5rem!important}.ms-sm-n6{margin-left:-2rem!important}.ms-sm-n7{margin-left:-2.5rem!important}.ms-sm-n8{margin-left:-3rem!important}.ms-sm-n9{margin-left:-4rem!important}.ms-sm-n10{margin-left:-5rem!important}.ms-sm-n11{margin-left:-6rem!important}.ms-sm-n12{margin-left:-8rem!important}.ms-sm-n13{margin-left:-10rem!important}.ms-sm-n14{margin-left:-12rem!important}.ms-sm-n15{margin-left:-16rem!important}.ms-sm-n16{margin-left:-25rem!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:.75rem!important}.p-sm-4{padding:1rem!important}.p-sm-5{padding:1.5rem!important}.p-sm-6{padding:2rem!important}.p-sm-7{padding:2.5rem!important}.p-sm-8{padding:3rem!important}.p-sm-9{padding:4rem!important}.p-sm-10{padding:5rem!important}.p-sm-11{padding:6rem!important}.p-sm-12{padding:8rem!important}.p-sm-13{padding:10rem!important}.p-sm-14{padding:12rem!important}.p-sm-15{padding:16rem!important}.p-sm-16{padding:25rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-sm-4{padding-left:1rem!important;padding-right:1rem!important}.px-sm-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-6{padding-left:2rem!important;padding-right:2rem!important}.px-sm-7{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-sm-8{padding-left:3rem!important;padding-right:3rem!important}.px-sm-9{padding-left:4rem!important;padding-right:4rem!important}.px-sm-10{padding-left:5rem!important;padding-right:5rem!important}.px-sm-11{padding-left:6rem!important;padding-right:6rem!important}.px-sm-12{padding-left:8rem!important;padding-right:8rem!important}.px-sm-13{padding-left:10rem!important;padding-right:10rem!important}.px-sm-14{padding-left:12rem!important;padding-right:12rem!important}.px-sm-15{padding-left:16rem!important;padding-right:16rem!important}.px-sm-16{padding-left:25rem!important;padding-right:25rem!important}.py-sm-0{padding-bottom:0!important;padding-top:0!important}.py-sm-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-sm-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-sm-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-sm-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-sm-5{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-sm-6{padding-bottom:2rem!important;padding-top:2rem!important}.py-sm-7{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-sm-8{padding-bottom:3rem!important;padding-top:3rem!important}.py-sm-9{padding-bottom:4rem!important;padding-top:4rem!important}.py-sm-10{padding-bottom:5rem!important;padding-top:5rem!important}.py-sm-11{padding-bottom:6rem!important;padding-top:6rem!important}.py-sm-12{padding-bottom:8rem!important;padding-top:8rem!important}.py-sm-13{padding-bottom:10rem!important;padding-top:10rem!important}.py-sm-14{padding-bottom:12rem!important;padding-top:12rem!important}.py-sm-15{padding-bottom:16rem!important;padding-top:16rem!important}.py-sm-16{padding-bottom:25rem!important;padding-top:25rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:.75rem!important}.pt-sm-4{padding-top:1rem!important}.pt-sm-5{padding-top:1.5rem!important}.pt-sm-6{padding-top:2rem!important}.pt-sm-7{padding-top:2.5rem!important}.pt-sm-8{padding-top:3rem!important}.pt-sm-9{padding-top:4rem!important}.pt-sm-10{padding-top:5rem!important}.pt-sm-11{padding-top:6rem!important}.pt-sm-12{padding-top:8rem!important}.pt-sm-13{padding-top:10rem!important}.pt-sm-14{padding-top:12rem!important}.pt-sm-15{padding-top:16rem!important}.pt-sm-16{padding-top:25rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:.75rem!important}.pe-sm-4{padding-right:1rem!important}.pe-sm-5{padding-right:1.5rem!important}.pe-sm-6{padding-right:2rem!important}.pe-sm-7{padding-right:2.5rem!important}.pe-sm-8{padding-right:3rem!important}.pe-sm-9{padding-right:4rem!important}.pe-sm-10{padding-right:5rem!important}.pe-sm-11{padding-right:6rem!important}.pe-sm-12{padding-right:8rem!important}.pe-sm-13{padding-right:10rem!important}.pe-sm-14{padding-right:12rem!important}.pe-sm-15{padding-right:16rem!important}.pe-sm-16{padding-right:25rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:.75rem!important}.pb-sm-4{padding-bottom:1rem!important}.pb-sm-5{padding-bottom:1.5rem!important}.pb-sm-6{padding-bottom:2rem!important}.pb-sm-7{padding-bottom:2.5rem!important}.pb-sm-8{padding-bottom:3rem!important}.pb-sm-9{padding-bottom:4rem!important}.pb-sm-10{padding-bottom:5rem!important}.pb-sm-11{padding-bottom:6rem!important}.pb-sm-12{padding-bottom:8rem!important}.pb-sm-13{padding-bottom:10rem!important}.pb-sm-14{padding-bottom:12rem!important}.pb-sm-15{padding-bottom:16rem!important}.pb-sm-16{padding-bottom:25rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:.75rem!important}.ps-sm-4{padding-left:1rem!important}.ps-sm-5{padding-left:1.5rem!important}.ps-sm-6{padding-left:2rem!important}.ps-sm-7{padding-left:2.5rem!important}.ps-sm-8{padding-left:3rem!important}.ps-sm-9{padding-left:4rem!important}.ps-sm-10{padding-left:5rem!important}.ps-sm-11{padding-left:6rem!important}.ps-sm-12{padding-left:8rem!important}.ps-sm-13{padding-left:10rem!important}.ps-sm-14{padding-left:12rem!important}.ps-sm-15{padding-left:16rem!important}.ps-sm-16{padding-left:25rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.position-md-static{position:static!important}.position-md-relative{position:relative!important}.position-md-absolute{position:absolute!important}.position-md-fixed{position:fixed!important}.position-md-sticky{position:sticky!important}.border-md{border:1px solid #f1f4f8!important}.border-md-0{border:0!important}.border-top-md{border-top:1px solid #f1f4f8!important}.border-top-md-0{border-top:0!important}.border-right-md{border-right:1px solid #f1f4f8!important}.border-right-md-0{border-right:0!important}.border-bottom-md{border-bottom:1px solid #f1f4f8!important}.border-bottom-md-0{border-bottom:0!important}.border-left-md{border-left:1px solid #f1f4f8!important}.border-left-md-0{border-left:0!important}.w-md-25{width:25%!important}.w-md-50{width:50%!important}.w-md-75{width:75%!important}.w-md-100{width:100%!important}.w-md-110{width:110%!important}.w-md-120{width:120%!important}.w-md-130{width:130%!important}.w-md-140{width:140%!important}.w-md-150{width:150%!important}.w-md-auto{width:auto!important}.mw-md-25{max-width:25%!important}.mw-md-50{max-width:50%!important}.mw-md-75{max-width:75%!important}.mw-md-100{max-width:100%!important}.mw-md-110{max-width:110%!important}.mw-md-120{max-width:120%!important}.mw-md-130{max-width:130%!important}.mw-md-140{max-width:140%!important}.mw-md-150{max-width:150%!important}.vw-md-25{width:25vw!important}.vw-md-50{width:50vw!important}.vw-md-75{width:75vw!important}.vw-md-100{width:100vw!important}.vw-md-110{width:110vw!important}.vw-md-120{width:120vw!important}.vw-md-130{width:130vw!important}.vw-md-140{width:140vw!important}.vw-md-150{width:150vw!important}.h-md-25{height:25%!important}.h-md-50{height:50%!important}.h-md-75{height:75%!important}.h-md-100{height:100%!important}.h-md-110{height:110%!important}.h-md-120{height:120%!important}.h-md-130{height:130%!important}.h-md-140{height:140%!important}.h-md-150{height:150%!important}.h-md-auto{height:auto!important}.vh-md-25{height:25vh!important}.vh-md-50{height:50vh!important}.vh-md-75{height:75vh!important}.vh-md-100{height:100vh!important}.vh-md-110{height:110vh!important}.vh-md-120{height:120vh!important}.vh-md-130{height:130vh!important}.vh-md-140{height:140vh!important}.vh-md-150{height:150vh!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:.75rem!important}.gap-md-4{gap:1rem!important}.gap-md-5{gap:1.5rem!important}.gap-md-6{gap:2rem!important}.gap-md-7{gap:2.5rem!important}.gap-md-8{gap:3rem!important}.gap-md-9{gap:4rem!important}.gap-md-10{gap:5rem!important}.gap-md-11{gap:6rem!important}.gap-md-12{gap:8rem!important}.gap-md-13{gap:10rem!important}.gap-md-14{gap:12rem!important}.gap-md-15{gap:16rem!important}.gap-md-16{gap:25rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:.75rem!important}.m-md-4{margin:1rem!important}.m-md-5{margin:1.5rem!important}.m-md-6{margin:2rem!important}.m-md-7{margin:2.5rem!important}.m-md-8{margin:3rem!important}.m-md-9{margin:4rem!important}.m-md-10{margin:5rem!important}.m-md-11{margin:6rem!important}.m-md-12{margin:8rem!important}.m-md-13{margin:10rem!important}.m-md-14{margin:12rem!important}.m-md-15{margin:16rem!important}.m-md-16{margin:25rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-md-4{margin-left:1rem!important;margin-right:1rem!important}.mx-md-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-6{margin-left:2rem!important;margin-right:2rem!important}.mx-md-7{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-md-8{margin-left:3rem!important;margin-right:3rem!important}.mx-md-9{margin-left:4rem!important;margin-right:4rem!important}.mx-md-10{margin-left:5rem!important;margin-right:5rem!important}.mx-md-11{margin-left:6rem!important;margin-right:6rem!important}.mx-md-12{margin-left:8rem!important;margin-right:8rem!important}.mx-md-13{margin-left:10rem!important;margin-right:10rem!important}.mx-md-14{margin-left:12rem!important;margin-right:12rem!important}.mx-md-15{margin-left:16rem!important;margin-right:16rem!important}.mx-md-16{margin-left:25rem!important;margin-right:25rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-bottom:0!important;margin-top:0!important}.my-md-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-md-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-md-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-md-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-md-5{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-md-6{margin-bottom:2rem!important;margin-top:2rem!important}.my-md-7{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-md-8{margin-bottom:3rem!important;margin-top:3rem!important}.my-md-9{margin-bottom:4rem!important;margin-top:4rem!important}.my-md-10{margin-bottom:5rem!important;margin-top:5rem!important}.my-md-11{margin-bottom:6rem!important;margin-top:6rem!important}.my-md-12{margin-bottom:8rem!important;margin-top:8rem!important}.my-md-13{margin-bottom:10rem!important;margin-top:10rem!important}.my-md-14{margin-bottom:12rem!important;margin-top:12rem!important}.my-md-15{margin-bottom:16rem!important;margin-top:16rem!important}.my-md-16{margin-bottom:25rem!important;margin-top:25rem!important}.my-md-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:.75rem!important}.mt-md-4{margin-top:1rem!important}.mt-md-5{margin-top:1.5rem!important}.mt-md-6{margin-top:2rem!important}.mt-md-7{margin-top:2.5rem!important}.mt-md-8{margin-top:3rem!important}.mt-md-9{margin-top:4rem!important}.mt-md-10{margin-top:5rem!important}.mt-md-11{margin-top:6rem!important}.mt-md-12{margin-top:8rem!important}.mt-md-13{margin-top:10rem!important}.mt-md-14{margin-top:12rem!important}.mt-md-15{margin-top:16rem!important}.mt-md-16{margin-top:25rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:.75rem!important}.me-md-4{margin-right:1rem!important}.me-md-5{margin-right:1.5rem!important}.me-md-6{margin-right:2rem!important}.me-md-7{margin-right:2.5rem!important}.me-md-8{margin-right:3rem!important}.me-md-9{margin-right:4rem!important}.me-md-10{margin-right:5rem!important}.me-md-11{margin-right:6rem!important}.me-md-12{margin-right:8rem!important}.me-md-13{margin-right:10rem!important}.me-md-14{margin-right:12rem!important}.me-md-15{margin-right:16rem!important}.me-md-16{margin-right:25rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:.75rem!important}.mb-md-4{margin-bottom:1rem!important}.mb-md-5{margin-bottom:1.5rem!important}.mb-md-6{margin-bottom:2rem!important}.mb-md-7{margin-bottom:2.5rem!important}.mb-md-8{margin-bottom:3rem!important}.mb-md-9{margin-bottom:4rem!important}.mb-md-10{margin-bottom:5rem!important}.mb-md-11{margin-bottom:6rem!important}.mb-md-12{margin-bottom:8rem!important}.mb-md-13{margin-bottom:10rem!important}.mb-md-14{margin-bottom:12rem!important}.mb-md-15{margin-bottom:16rem!important}.mb-md-16{margin-bottom:25rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:.75rem!important}.ms-md-4{margin-left:1rem!important}.ms-md-5{margin-left:1.5rem!important}.ms-md-6{margin-left:2rem!important}.ms-md-7{margin-left:2.5rem!important}.ms-md-8{margin-left:3rem!important}.ms-md-9{margin-left:4rem!important}.ms-md-10{margin-left:5rem!important}.ms-md-11{margin-left:6rem!important}.ms-md-12{margin-left:8rem!important}.ms-md-13{margin-left:10rem!important}.ms-md-14{margin-left:12rem!important}.ms-md-15{margin-left:16rem!important}.ms-md-16{margin-left:25rem!important}.ms-md-auto{margin-left:auto!important}.m-md-n1{margin:-.25rem!important}.m-md-n2{margin:-.5rem!important}.m-md-n3{margin:-.75rem!important}.m-md-n4{margin:-1rem!important}.m-md-n5{margin:-1.5rem!important}.m-md-n6{margin:-2rem!important}.m-md-n7{margin:-2.5rem!important}.m-md-n8{margin:-3rem!important}.m-md-n9{margin:-4rem!important}.m-md-n10{margin:-5rem!important}.m-md-n11{margin:-6rem!important}.m-md-n12{margin:-8rem!important}.m-md-n13{margin:-10rem!important}.m-md-n14{margin:-12rem!important}.m-md-n15{margin:-16rem!important}.m-md-n16{margin:-25rem!important}.mx-md-n1{margin-left:-.25rem!important;margin-right:-.25rem!important}.mx-md-n2{margin-left:-.5rem!important;margin-right:-.5rem!important}.mx-md-n3{margin-left:-.75rem!important;margin-right:-.75rem!important}.mx-md-n4{margin-left:-1rem!important;margin-right:-1rem!important}.mx-md-n5{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.mx-md-n6{margin-left:-2rem!important;margin-right:-2rem!important}.mx-md-n7{margin-left:-2.5rem!important;margin-right:-2.5rem!important}.mx-md-n8{margin-left:-3rem!important;margin-right:-3rem!important}.mx-md-n9{margin-left:-4rem!important;margin-right:-4rem!important}.mx-md-n10{margin-left:-5rem!important;margin-right:-5rem!important}.mx-md-n11{margin-left:-6rem!important;margin-right:-6rem!important}.mx-md-n12{margin-left:-8rem!important;margin-right:-8rem!important}.mx-md-n13{margin-left:-10rem!important;margin-right:-10rem!important}.mx-md-n14{margin-left:-12rem!important;margin-right:-12rem!important}.mx-md-n15{margin-left:-16rem!important;margin-right:-16rem!important}.mx-md-n16{margin-left:-25rem!important;margin-right:-25rem!important}.my-md-n1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.my-md-n2{margin-bottom:-.5rem!important;margin-top:-.5rem!important}.my-md-n3{margin-bottom:-.75rem!important;margin-top:-.75rem!important}.my-md-n4{margin-bottom:-1rem!important;margin-top:-1rem!important}.my-md-n5{margin-bottom:-1.5rem!important;margin-top:-1.5rem!important}.my-md-n6{margin-bottom:-2rem!important;margin-top:-2rem!important}.my-md-n7{margin-bottom:-2.5rem!important;margin-top:-2.5rem!important}.my-md-n8{margin-bottom:-3rem!important;margin-top:-3rem!important}.my-md-n9{margin-bottom:-4rem!important;margin-top:-4rem!important}.my-md-n10{margin-bottom:-5rem!important;margin-top:-5rem!important}.my-md-n11{margin-bottom:-6rem!important;margin-top:-6rem!important}.my-md-n12{margin-bottom:-8rem!important;margin-top:-8rem!important}.my-md-n13{margin-bottom:-10rem!important;margin-top:-10rem!important}.my-md-n14{margin-bottom:-12rem!important;margin-top:-12rem!important}.my-md-n15{margin-bottom:-16rem!important;margin-top:-16rem!important}.my-md-n16{margin-bottom:-25rem!important;margin-top:-25rem!important}.mt-md-n1{margin-top:-.25rem!important}.mt-md-n2{margin-top:-.5rem!important}.mt-md-n3{margin-top:-.75rem!important}.mt-md-n4{margin-top:-1rem!important}.mt-md-n5{margin-top:-1.5rem!important}.mt-md-n6{margin-top:-2rem!important}.mt-md-n7{margin-top:-2.5rem!important}.mt-md-n8{margin-top:-3rem!important}.mt-md-n9{margin-top:-4rem!important}.mt-md-n10{margin-top:-5rem!important}.mt-md-n11{margin-top:-6rem!important}.mt-md-n12{margin-top:-8rem!important}.mt-md-n13{margin-top:-10rem!important}.mt-md-n14{margin-top:-12rem!important}.mt-md-n15{margin-top:-16rem!important}.mt-md-n16{margin-top:-25rem!important}.me-md-n1{margin-right:-.25rem!important}.me-md-n2{margin-right:-.5rem!important}.me-md-n3{margin-right:-.75rem!important}.me-md-n4{margin-right:-1rem!important}.me-md-n5{margin-right:-1.5rem!important}.me-md-n6{margin-right:-2rem!important}.me-md-n7{margin-right:-2.5rem!important}.me-md-n8{margin-right:-3rem!important}.me-md-n9{margin-right:-4rem!important}.me-md-n10{margin-right:-5rem!important}.me-md-n11{margin-right:-6rem!important}.me-md-n12{margin-right:-8rem!important}.me-md-n13{margin-right:-10rem!important}.me-md-n14{margin-right:-12rem!important}.me-md-n15{margin-right:-16rem!important}.me-md-n16{margin-right:-25rem!important}.mb-md-n1{margin-bottom:-.25rem!important}.mb-md-n2{margin-bottom:-.5rem!important}.mb-md-n3{margin-bottom:-.75rem!important}.mb-md-n4{margin-bottom:-1rem!important}.mb-md-n5{margin-bottom:-1.5rem!important}.mb-md-n6{margin-bottom:-2rem!important}.mb-md-n7{margin-bottom:-2.5rem!important}.mb-md-n8{margin-bottom:-3rem!important}.mb-md-n9{margin-bottom:-4rem!important}.mb-md-n10{margin-bottom:-5rem!important}.mb-md-n11{margin-bottom:-6rem!important}.mb-md-n12{margin-bottom:-8rem!important}.mb-md-n13{margin-bottom:-10rem!important}.mb-md-n14{margin-bottom:-12rem!important}.mb-md-n15{margin-bottom:-16rem!important}.mb-md-n16{margin-bottom:-25rem!important}.ms-md-n1{margin-left:-.25rem!important}.ms-md-n2{margin-left:-.5rem!important}.ms-md-n3{margin-left:-.75rem!important}.ms-md-n4{margin-left:-1rem!important}.ms-md-n5{margin-left:-1.5rem!important}.ms-md-n6{margin-left:-2rem!important}.ms-md-n7{margin-left:-2.5rem!important}.ms-md-n8{margin-left:-3rem!important}.ms-md-n9{margin-left:-4rem!important}.ms-md-n10{margin-left:-5rem!important}.ms-md-n11{margin-left:-6rem!important}.ms-md-n12{margin-left:-8rem!important}.ms-md-n13{margin-left:-10rem!important}.ms-md-n14{margin-left:-12rem!important}.ms-md-n15{margin-left:-16rem!important}.ms-md-n16{margin-left:-25rem!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:.75rem!important}.p-md-4{padding:1rem!important}.p-md-5{padding:1.5rem!important}.p-md-6{padding:2rem!important}.p-md-7{padding:2.5rem!important}.p-md-8{padding:3rem!important}.p-md-9{padding:4rem!important}.p-md-10{padding:5rem!important}.p-md-11{padding:6rem!important}.p-md-12{padding:8rem!important}.p-md-13{padding:10rem!important}.p-md-14{padding:12rem!important}.p-md-15{padding:16rem!important}.p-md-16{padding:25rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-md-4{padding-left:1rem!important;padding-right:1rem!important}.px-md-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-6{padding-left:2rem!important;padding-right:2rem!important}.px-md-7{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-md-8{padding-left:3rem!important;padding-right:3rem!important}.px-md-9{padding-left:4rem!important;padding-right:4rem!important}.px-md-10{padding-left:5rem!important;padding-right:5rem!important}.px-md-11{padding-left:6rem!important;padding-right:6rem!important}.px-md-12{padding-left:8rem!important;padding-right:8rem!important}.px-md-13{padding-left:10rem!important;padding-right:10rem!important}.px-md-14{padding-left:12rem!important;padding-right:12rem!important}.px-md-15{padding-left:16rem!important;padding-right:16rem!important}.px-md-16{padding-left:25rem!important;padding-right:25rem!important}.py-md-0{padding-bottom:0!important;padding-top:0!important}.py-md-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-md-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-md-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-md-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-md-5{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-md-6{padding-bottom:2rem!important;padding-top:2rem!important}.py-md-7{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-md-8{padding-bottom:3rem!important;padding-top:3rem!important}.py-md-9{padding-bottom:4rem!important;padding-top:4rem!important}.py-md-10{padding-bottom:5rem!important;padding-top:5rem!important}.py-md-11{padding-bottom:6rem!important;padding-top:6rem!important}.py-md-12{padding-bottom:8rem!important;padding-top:8rem!important}.py-md-13{padding-bottom:10rem!important;padding-top:10rem!important}.py-md-14{padding-bottom:12rem!important;padding-top:12rem!important}.py-md-15{padding-bottom:16rem!important;padding-top:16rem!important}.py-md-16{padding-bottom:25rem!important;padding-top:25rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:.75rem!important}.pt-md-4{padding-top:1rem!important}.pt-md-5{padding-top:1.5rem!important}.pt-md-6{padding-top:2rem!important}.pt-md-7{padding-top:2.5rem!important}.pt-md-8{padding-top:3rem!important}.pt-md-9{padding-top:4rem!important}.pt-md-10{padding-top:5rem!important}.pt-md-11{padding-top:6rem!important}.pt-md-12{padding-top:8rem!important}.pt-md-13{padding-top:10rem!important}.pt-md-14{padding-top:12rem!important}.pt-md-15{padding-top:16rem!important}.pt-md-16{padding-top:25rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:.75rem!important}.pe-md-4{padding-right:1rem!important}.pe-md-5{padding-right:1.5rem!important}.pe-md-6{padding-right:2rem!important}.pe-md-7{padding-right:2.5rem!important}.pe-md-8{padding-right:3rem!important}.pe-md-9{padding-right:4rem!important}.pe-md-10{padding-right:5rem!important}.pe-md-11{padding-right:6rem!important}.pe-md-12{padding-right:8rem!important}.pe-md-13{padding-right:10rem!important}.pe-md-14{padding-right:12rem!important}.pe-md-15{padding-right:16rem!important}.pe-md-16{padding-right:25rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:.75rem!important}.pb-md-4{padding-bottom:1rem!important}.pb-md-5{padding-bottom:1.5rem!important}.pb-md-6{padding-bottom:2rem!important}.pb-md-7{padding-bottom:2.5rem!important}.pb-md-8{padding-bottom:3rem!important}.pb-md-9{padding-bottom:4rem!important}.pb-md-10{padding-bottom:5rem!important}.pb-md-11{padding-bottom:6rem!important}.pb-md-12{padding-bottom:8rem!important}.pb-md-13{padding-bottom:10rem!important}.pb-md-14{padding-bottom:12rem!important}.pb-md-15{padding-bottom:16rem!important}.pb-md-16{padding-bottom:25rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:.75rem!important}.ps-md-4{padding-left:1rem!important}.ps-md-5{padding-left:1.5rem!important}.ps-md-6{padding-left:2rem!important}.ps-md-7{padding-left:2.5rem!important}.ps-md-8{padding-left:3rem!important}.ps-md-9{padding-left:4rem!important}.ps-md-10{padding-left:5rem!important}.ps-md-11{padding-left:6rem!important}.ps-md-12{padding-left:8rem!important}.ps-md-13{padding-left:10rem!important}.ps-md-14{padding-left:12rem!important}.ps-md-15{padding-left:16rem!important}.ps-md-16{padding-left:25rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.position-lg-static{position:static!important}.position-lg-relative{position:relative!important}.position-lg-absolute{position:absolute!important}.position-lg-fixed{position:fixed!important}.position-lg-sticky{position:sticky!important}.border-lg{border:1px solid #f1f4f8!important}.border-lg-0{border:0!important}.border-top-lg{border-top:1px solid #f1f4f8!important}.border-top-lg-0{border-top:0!important}.border-right-lg{border-right:1px solid #f1f4f8!important}.border-right-lg-0{border-right:0!important}.border-bottom-lg{border-bottom:1px solid #f1f4f8!important}.border-bottom-lg-0{border-bottom:0!important}.border-left-lg{border-left:1px solid #f1f4f8!important}.border-left-lg-0{border-left:0!important}.w-lg-25{width:25%!important}.w-lg-50{width:50%!important}.w-lg-75{width:75%!important}.w-lg-100{width:100%!important}.w-lg-110{width:110%!important}.w-lg-120{width:120%!important}.w-lg-130{width:130%!important}.w-lg-140{width:140%!important}.w-lg-150{width:150%!important}.w-lg-auto{width:auto!important}.mw-lg-25{max-width:25%!important}.mw-lg-50{max-width:50%!important}.mw-lg-75{max-width:75%!important}.mw-lg-100{max-width:100%!important}.mw-lg-110{max-width:110%!important}.mw-lg-120{max-width:120%!important}.mw-lg-130{max-width:130%!important}.mw-lg-140{max-width:140%!important}.mw-lg-150{max-width:150%!important}.vw-lg-25{width:25vw!important}.vw-lg-50{width:50vw!important}.vw-lg-75{width:75vw!important}.vw-lg-100{width:100vw!important}.vw-lg-110{width:110vw!important}.vw-lg-120{width:120vw!important}.vw-lg-130{width:130vw!important}.vw-lg-140{width:140vw!important}.vw-lg-150{width:150vw!important}.h-lg-25{height:25%!important}.h-lg-50{height:50%!important}.h-lg-75{height:75%!important}.h-lg-100{height:100%!important}.h-lg-110{height:110%!important}.h-lg-120{height:120%!important}.h-lg-130{height:130%!important}.h-lg-140{height:140%!important}.h-lg-150{height:150%!important}.h-lg-auto{height:auto!important}.vh-lg-25{height:25vh!important}.vh-lg-50{height:50vh!important}.vh-lg-75{height:75vh!important}.vh-lg-100{height:100vh!important}.vh-lg-110{height:110vh!important}.vh-lg-120{height:120vh!important}.vh-lg-130{height:130vh!important}.vh-lg-140{height:140vh!important}.vh-lg-150{height:150vh!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:.75rem!important}.gap-lg-4{gap:1rem!important}.gap-lg-5{gap:1.5rem!important}.gap-lg-6{gap:2rem!important}.gap-lg-7{gap:2.5rem!important}.gap-lg-8{gap:3rem!important}.gap-lg-9{gap:4rem!important}.gap-lg-10{gap:5rem!important}.gap-lg-11{gap:6rem!important}.gap-lg-12{gap:8rem!important}.gap-lg-13{gap:10rem!important}.gap-lg-14{gap:12rem!important}.gap-lg-15{gap:16rem!important}.gap-lg-16{gap:25rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:.75rem!important}.m-lg-4{margin:1rem!important}.m-lg-5{margin:1.5rem!important}.m-lg-6{margin:2rem!important}.m-lg-7{margin:2.5rem!important}.m-lg-8{margin:3rem!important}.m-lg-9{margin:4rem!important}.m-lg-10{margin:5rem!important}.m-lg-11{margin:6rem!important}.m-lg-12{margin:8rem!important}.m-lg-13{margin:10rem!important}.m-lg-14{margin:12rem!important}.m-lg-15{margin:16rem!important}.m-lg-16{margin:25rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-lg-4{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-6{margin-left:2rem!important;margin-right:2rem!important}.mx-lg-7{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-lg-8{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-9{margin-left:4rem!important;margin-right:4rem!important}.mx-lg-10{margin-left:5rem!important;margin-right:5rem!important}.mx-lg-11{margin-left:6rem!important;margin-right:6rem!important}.mx-lg-12{margin-left:8rem!important;margin-right:8rem!important}.mx-lg-13{margin-left:10rem!important;margin-right:10rem!important}.mx-lg-14{margin-left:12rem!important;margin-right:12rem!important}.mx-lg-15{margin-left:16rem!important;margin-right:16rem!important}.mx-lg-16{margin-left:25rem!important;margin-right:25rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-bottom:0!important;margin-top:0!important}.my-lg-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-lg-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-lg-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-lg-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-lg-5{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-lg-6{margin-bottom:2rem!important;margin-top:2rem!important}.my-lg-7{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-lg-8{margin-bottom:3rem!important;margin-top:3rem!important}.my-lg-9{margin-bottom:4rem!important;margin-top:4rem!important}.my-lg-10{margin-bottom:5rem!important;margin-top:5rem!important}.my-lg-11{margin-bottom:6rem!important;margin-top:6rem!important}.my-lg-12{margin-bottom:8rem!important;margin-top:8rem!important}.my-lg-13{margin-bottom:10rem!important;margin-top:10rem!important}.my-lg-14{margin-bottom:12rem!important;margin-top:12rem!important}.my-lg-15{margin-bottom:16rem!important;margin-top:16rem!important}.my-lg-16{margin-bottom:25rem!important;margin-top:25rem!important}.my-lg-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:.75rem!important}.mt-lg-4{margin-top:1rem!important}.mt-lg-5{margin-top:1.5rem!important}.mt-lg-6{margin-top:2rem!important}.mt-lg-7{margin-top:2.5rem!important}.mt-lg-8{margin-top:3rem!important}.mt-lg-9{margin-top:4rem!important}.mt-lg-10{margin-top:5rem!important}.mt-lg-11{margin-top:6rem!important}.mt-lg-12{margin-top:8rem!important}.mt-lg-13{margin-top:10rem!important}.mt-lg-14{margin-top:12rem!important}.mt-lg-15{margin-top:16rem!important}.mt-lg-16{margin-top:25rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:.75rem!important}.me-lg-4{margin-right:1rem!important}.me-lg-5{margin-right:1.5rem!important}.me-lg-6{margin-right:2rem!important}.me-lg-7{margin-right:2.5rem!important}.me-lg-8{margin-right:3rem!important}.me-lg-9{margin-right:4rem!important}.me-lg-10{margin-right:5rem!important}.me-lg-11{margin-right:6rem!important}.me-lg-12{margin-right:8rem!important}.me-lg-13{margin-right:10rem!important}.me-lg-14{margin-right:12rem!important}.me-lg-15{margin-right:16rem!important}.me-lg-16{margin-right:25rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:.75rem!important}.mb-lg-4{margin-bottom:1rem!important}.mb-lg-5{margin-bottom:1.5rem!important}.mb-lg-6{margin-bottom:2rem!important}.mb-lg-7{margin-bottom:2.5rem!important}.mb-lg-8{margin-bottom:3rem!important}.mb-lg-9{margin-bottom:4rem!important}.mb-lg-10{margin-bottom:5rem!important}.mb-lg-11{margin-bottom:6rem!important}.mb-lg-12{margin-bottom:8rem!important}.mb-lg-13{margin-bottom:10rem!important}.mb-lg-14{margin-bottom:12rem!important}.mb-lg-15{margin-bottom:16rem!important}.mb-lg-16{margin-bottom:25rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:.75rem!important}.ms-lg-4{margin-left:1rem!important}.ms-lg-5{margin-left:1.5rem!important}.ms-lg-6{margin-left:2rem!important}.ms-lg-7{margin-left:2.5rem!important}.ms-lg-8{margin-left:3rem!important}.ms-lg-9{margin-left:4rem!important}.ms-lg-10{margin-left:5rem!important}.ms-lg-11{margin-left:6rem!important}.ms-lg-12{margin-left:8rem!important}.ms-lg-13{margin-left:10rem!important}.ms-lg-14{margin-left:12rem!important}.ms-lg-15{margin-left:16rem!important}.ms-lg-16{margin-left:25rem!important}.ms-lg-auto{margin-left:auto!important}.m-lg-n1{margin:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.m-lg-n3{margin:-.75rem!important}.m-lg-n4{margin:-1rem!important}.m-lg-n5{margin:-1.5rem!important}.m-lg-n6{margin:-2rem!important}.m-lg-n7{margin:-2.5rem!important}.m-lg-n8{margin:-3rem!important}.m-lg-n9{margin:-4rem!important}.m-lg-n10{margin:-5rem!important}.m-lg-n11{margin:-6rem!important}.m-lg-n12{margin:-8rem!important}.m-lg-n13{margin:-10rem!important}.m-lg-n14{margin:-12rem!important}.m-lg-n15{margin:-16rem!important}.m-lg-n16{margin:-25rem!important}.mx-lg-n1{margin-left:-.25rem!important;margin-right:-.25rem!important}.mx-lg-n2{margin-left:-.5rem!important;margin-right:-.5rem!important}.mx-lg-n3{margin-left:-.75rem!important;margin-right:-.75rem!important}.mx-lg-n4{margin-left:-1rem!important;margin-right:-1rem!important}.mx-lg-n5{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.mx-lg-n6{margin-left:-2rem!important;margin-right:-2rem!important}.mx-lg-n7{margin-left:-2.5rem!important;margin-right:-2.5rem!important}.mx-lg-n8{margin-left:-3rem!important;margin-right:-3rem!important}.mx-lg-n9{margin-left:-4rem!important;margin-right:-4rem!important}.mx-lg-n10{margin-left:-5rem!important;margin-right:-5rem!important}.mx-lg-n11{margin-left:-6rem!important;margin-right:-6rem!important}.mx-lg-n12{margin-left:-8rem!important;margin-right:-8rem!important}.mx-lg-n13{margin-left:-10rem!important;margin-right:-10rem!important}.mx-lg-n14{margin-left:-12rem!important;margin-right:-12rem!important}.mx-lg-n15{margin-left:-16rem!important;margin-right:-16rem!important}.mx-lg-n16{margin-left:-25rem!important;margin-right:-25rem!important}.my-lg-n1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.my-lg-n2{margin-bottom:-.5rem!important;margin-top:-.5rem!important}.my-lg-n3{margin-bottom:-.75rem!important;margin-top:-.75rem!important}.my-lg-n4{margin-bottom:-1rem!important;margin-top:-1rem!important}.my-lg-n5{margin-bottom:-1.5rem!important;margin-top:-1.5rem!important}.my-lg-n6{margin-bottom:-2rem!important;margin-top:-2rem!important}.my-lg-n7{margin-bottom:-2.5rem!important;margin-top:-2.5rem!important}.my-lg-n8{margin-bottom:-3rem!important;margin-top:-3rem!important}.my-lg-n9{margin-bottom:-4rem!important;margin-top:-4rem!important}.my-lg-n10{margin-bottom:-5rem!important;margin-top:-5rem!important}.my-lg-n11{margin-bottom:-6rem!important;margin-top:-6rem!important}.my-lg-n12{margin-bottom:-8rem!important;margin-top:-8rem!important}.my-lg-n13{margin-bottom:-10rem!important;margin-top:-10rem!important}.my-lg-n14{margin-bottom:-12rem!important;margin-top:-12rem!important}.my-lg-n15{margin-bottom:-16rem!important;margin-top:-16rem!important}.my-lg-n16{margin-bottom:-25rem!important;margin-top:-25rem!important}.mt-lg-n1{margin-top:-.25rem!important}.mt-lg-n2{margin-top:-.5rem!important}.mt-lg-n3{margin-top:-.75rem!important}.mt-lg-n4{margin-top:-1rem!important}.mt-lg-n5{margin-top:-1.5rem!important}.mt-lg-n6{margin-top:-2rem!important}.mt-lg-n7{margin-top:-2.5rem!important}.mt-lg-n8{margin-top:-3rem!important}.mt-lg-n9{margin-top:-4rem!important}.mt-lg-n10{margin-top:-5rem!important}.mt-lg-n11{margin-top:-6rem!important}.mt-lg-n12{margin-top:-8rem!important}.mt-lg-n13{margin-top:-10rem!important}.mt-lg-n14{margin-top:-12rem!important}.mt-lg-n15{margin-top:-16rem!important}.mt-lg-n16{margin-top:-25rem!important}.me-lg-n1{margin-right:-.25rem!important}.me-lg-n2{margin-right:-.5rem!important}.me-lg-n3{margin-right:-.75rem!important}.me-lg-n4{margin-right:-1rem!important}.me-lg-n5{margin-right:-1.5rem!important}.me-lg-n6{margin-right:-2rem!important}.me-lg-n7{margin-right:-2.5rem!important}.me-lg-n8{margin-right:-3rem!important}.me-lg-n9{margin-right:-4rem!important}.me-lg-n10{margin-right:-5rem!important}.me-lg-n11{margin-right:-6rem!important}.me-lg-n12{margin-right:-8rem!important}.me-lg-n13{margin-right:-10rem!important}.me-lg-n14{margin-right:-12rem!important}.me-lg-n15{margin-right:-16rem!important}.me-lg-n16{margin-right:-25rem!important}.mb-lg-n1{margin-bottom:-.25rem!important}.mb-lg-n2{margin-bottom:-.5rem!important}.mb-lg-n3{margin-bottom:-.75rem!important}.mb-lg-n4{margin-bottom:-1rem!important}.mb-lg-n5{margin-bottom:-1.5rem!important}.mb-lg-n6{margin-bottom:-2rem!important}.mb-lg-n7{margin-bottom:-2.5rem!important}.mb-lg-n8{margin-bottom:-3rem!important}.mb-lg-n9{margin-bottom:-4rem!important}.mb-lg-n10{margin-bottom:-5rem!important}.mb-lg-n11{margin-bottom:-6rem!important}.mb-lg-n12{margin-bottom:-8rem!important}.mb-lg-n13{margin-bottom:-10rem!important}.mb-lg-n14{margin-bottom:-12rem!important}.mb-lg-n15{margin-bottom:-16rem!important}.mb-lg-n16{margin-bottom:-25rem!important}.ms-lg-n1{margin-left:-.25rem!important}.ms-lg-n2{margin-left:-.5rem!important}.ms-lg-n3{margin-left:-.75rem!important}.ms-lg-n4{margin-left:-1rem!important}.ms-lg-n5{margin-left:-1.5rem!important}.ms-lg-n6{margin-left:-2rem!important}.ms-lg-n7{margin-left:-2.5rem!important}.ms-lg-n8{margin-left:-3rem!important}.ms-lg-n9{margin-left:-4rem!important}.ms-lg-n10{margin-left:-5rem!important}.ms-lg-n11{margin-left:-6rem!important}.ms-lg-n12{margin-left:-8rem!important}.ms-lg-n13{margin-left:-10rem!important}.ms-lg-n14{margin-left:-12rem!important}.ms-lg-n15{margin-left:-16rem!important}.ms-lg-n16{margin-left:-25rem!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:.75rem!important}.p-lg-4{padding:1rem!important}.p-lg-5{padding:1.5rem!important}.p-lg-6{padding:2rem!important}.p-lg-7{padding:2.5rem!important}.p-lg-8{padding:3rem!important}.p-lg-9{padding:4rem!important}.p-lg-10{padding:5rem!important}.p-lg-11{padding:6rem!important}.p-lg-12{padding:8rem!important}.p-lg-13{padding:10rem!important}.p-lg-14{padding:12rem!important}.p-lg-15{padding:16rem!important}.p-lg-16{padding:25rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-lg-4{padding-left:1rem!important;padding-right:1rem!important}.px-lg-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-6{padding-left:2rem!important;padding-right:2rem!important}.px-lg-7{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-lg-8{padding-left:3rem!important;padding-right:3rem!important}.px-lg-9{padding-left:4rem!important;padding-right:4rem!important}.px-lg-10{padding-left:5rem!important;padding-right:5rem!important}.px-lg-11{padding-left:6rem!important;padding-right:6rem!important}.px-lg-12{padding-left:8rem!important;padding-right:8rem!important}.px-lg-13{padding-left:10rem!important;padding-right:10rem!important}.px-lg-14{padding-left:12rem!important;padding-right:12rem!important}.px-lg-15{padding-left:16rem!important;padding-right:16rem!important}.px-lg-16{padding-left:25rem!important;padding-right:25rem!important}.py-lg-0{padding-bottom:0!important;padding-top:0!important}.py-lg-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-lg-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-lg-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-lg-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-lg-5{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-lg-6{padding-bottom:2rem!important;padding-top:2rem!important}.py-lg-7{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-lg-8{padding-bottom:3rem!important;padding-top:3rem!important}.py-lg-9{padding-bottom:4rem!important;padding-top:4rem!important}.py-lg-10{padding-bottom:5rem!important;padding-top:5rem!important}.py-lg-11{padding-bottom:6rem!important;padding-top:6rem!important}.py-lg-12{padding-bottom:8rem!important;padding-top:8rem!important}.py-lg-13{padding-bottom:10rem!important;padding-top:10rem!important}.py-lg-14{padding-bottom:12rem!important;padding-top:12rem!important}.py-lg-15{padding-bottom:16rem!important;padding-top:16rem!important}.py-lg-16{padding-bottom:25rem!important;padding-top:25rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:.75rem!important}.pt-lg-4{padding-top:1rem!important}.pt-lg-5{padding-top:1.5rem!important}.pt-lg-6{padding-top:2rem!important}.pt-lg-7{padding-top:2.5rem!important}.pt-lg-8{padding-top:3rem!important}.pt-lg-9{padding-top:4rem!important}.pt-lg-10{padding-top:5rem!important}.pt-lg-11{padding-top:6rem!important}.pt-lg-12{padding-top:8rem!important}.pt-lg-13{padding-top:10rem!important}.pt-lg-14{padding-top:12rem!important}.pt-lg-15{padding-top:16rem!important}.pt-lg-16{padding-top:25rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:.75rem!important}.pe-lg-4{padding-right:1rem!important}.pe-lg-5{padding-right:1.5rem!important}.pe-lg-6{padding-right:2rem!important}.pe-lg-7{padding-right:2.5rem!important}.pe-lg-8{padding-right:3rem!important}.pe-lg-9{padding-right:4rem!important}.pe-lg-10{padding-right:5rem!important}.pe-lg-11{padding-right:6rem!important}.pe-lg-12{padding-right:8rem!important}.pe-lg-13{padding-right:10rem!important}.pe-lg-14{padding-right:12rem!important}.pe-lg-15{padding-right:16rem!important}.pe-lg-16{padding-right:25rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:.75rem!important}.pb-lg-4{padding-bottom:1rem!important}.pb-lg-5{padding-bottom:1.5rem!important}.pb-lg-6{padding-bottom:2rem!important}.pb-lg-7{padding-bottom:2.5rem!important}.pb-lg-8{padding-bottom:3rem!important}.pb-lg-9{padding-bottom:4rem!important}.pb-lg-10{padding-bottom:5rem!important}.pb-lg-11{padding-bottom:6rem!important}.pb-lg-12{padding-bottom:8rem!important}.pb-lg-13{padding-bottom:10rem!important}.pb-lg-14{padding-bottom:12rem!important}.pb-lg-15{padding-bottom:16rem!important}.pb-lg-16{padding-bottom:25rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:.75rem!important}.ps-lg-4{padding-left:1rem!important}.ps-lg-5{padding-left:1.5rem!important}.ps-lg-6{padding-left:2rem!important}.ps-lg-7{padding-left:2.5rem!important}.ps-lg-8{padding-left:3rem!important}.ps-lg-9{padding-left:4rem!important}.ps-lg-10{padding-left:5rem!important}.ps-lg-11{padding-left:6rem!important}.ps-lg-12{padding-left:8rem!important}.ps-lg-13{padding-left:10rem!important}.ps-lg-14{padding-left:12rem!important}.ps-lg-15{padding-left:16rem!important}.ps-lg-16{padding-left:25rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.position-xl-static{position:static!important}.position-xl-relative{position:relative!important}.position-xl-absolute{position:absolute!important}.position-xl-fixed{position:fixed!important}.position-xl-sticky{position:sticky!important}.border-xl{border:1px solid #f1f4f8!important}.border-xl-0{border:0!important}.border-top-xl{border-top:1px solid #f1f4f8!important}.border-top-xl-0{border-top:0!important}.border-right-xl{border-right:1px solid #f1f4f8!important}.border-right-xl-0{border-right:0!important}.border-bottom-xl{border-bottom:1px solid #f1f4f8!important}.border-bottom-xl-0{border-bottom:0!important}.border-left-xl{border-left:1px solid #f1f4f8!important}.border-left-xl-0{border-left:0!important}.w-xl-25{width:25%!important}.w-xl-50{width:50%!important}.w-xl-75{width:75%!important}.w-xl-100{width:100%!important}.w-xl-110{width:110%!important}.w-xl-120{width:120%!important}.w-xl-130{width:130%!important}.w-xl-140{width:140%!important}.w-xl-150{width:150%!important}.w-xl-auto{width:auto!important}.mw-xl-25{max-width:25%!important}.mw-xl-50{max-width:50%!important}.mw-xl-75{max-width:75%!important}.mw-xl-100{max-width:100%!important}.mw-xl-110{max-width:110%!important}.mw-xl-120{max-width:120%!important}.mw-xl-130{max-width:130%!important}.mw-xl-140{max-width:140%!important}.mw-xl-150{max-width:150%!important}.vw-xl-25{width:25vw!important}.vw-xl-50{width:50vw!important}.vw-xl-75{width:75vw!important}.vw-xl-100{width:100vw!important}.vw-xl-110{width:110vw!important}.vw-xl-120{width:120vw!important}.vw-xl-130{width:130vw!important}.vw-xl-140{width:140vw!important}.vw-xl-150{width:150vw!important}.h-xl-25{height:25%!important}.h-xl-50{height:50%!important}.h-xl-75{height:75%!important}.h-xl-100{height:100%!important}.h-xl-110{height:110%!important}.h-xl-120{height:120%!important}.h-xl-130{height:130%!important}.h-xl-140{height:140%!important}.h-xl-150{height:150%!important}.h-xl-auto{height:auto!important}.vh-xl-25{height:25vh!important}.vh-xl-50{height:50vh!important}.vh-xl-75{height:75vh!important}.vh-xl-100{height:100vh!important}.vh-xl-110{height:110vh!important}.vh-xl-120{height:120vh!important}.vh-xl-130{height:130vh!important}.vh-xl-140{height:140vh!important}.vh-xl-150{height:150vh!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:.75rem!important}.gap-xl-4{gap:1rem!important}.gap-xl-5{gap:1.5rem!important}.gap-xl-6{gap:2rem!important}.gap-xl-7{gap:2.5rem!important}.gap-xl-8{gap:3rem!important}.gap-xl-9{gap:4rem!important}.gap-xl-10{gap:5rem!important}.gap-xl-11{gap:6rem!important}.gap-xl-12{gap:8rem!important}.gap-xl-13{gap:10rem!important}.gap-xl-14{gap:12rem!important}.gap-xl-15{gap:16rem!important}.gap-xl-16{gap:25rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:.75rem!important}.m-xl-4{margin:1rem!important}.m-xl-5{margin:1.5rem!important}.m-xl-6{margin:2rem!important}.m-xl-7{margin:2.5rem!important}.m-xl-8{margin:3rem!important}.m-xl-9{margin:4rem!important}.m-xl-10{margin:5rem!important}.m-xl-11{margin:6rem!important}.m-xl-12{margin:8rem!important}.m-xl-13{margin:10rem!important}.m-xl-14{margin:12rem!important}.m-xl-15{margin:16rem!important}.m-xl-16{margin:25rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-xl-4{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-6{margin-left:2rem!important;margin-right:2rem!important}.mx-xl-7{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-xl-8{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-9{margin-left:4rem!important;margin-right:4rem!important}.mx-xl-10{margin-left:5rem!important;margin-right:5rem!important}.mx-xl-11{margin-left:6rem!important;margin-right:6rem!important}.mx-xl-12{margin-left:8rem!important;margin-right:8rem!important}.mx-xl-13{margin-left:10rem!important;margin-right:10rem!important}.mx-xl-14{margin-left:12rem!important;margin-right:12rem!important}.mx-xl-15{margin-left:16rem!important;margin-right:16rem!important}.mx-xl-16{margin-left:25rem!important;margin-right:25rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-bottom:0!important;margin-top:0!important}.my-xl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-xl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-xl-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-xl-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-xl-5{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-xl-6{margin-bottom:2rem!important;margin-top:2rem!important}.my-xl-7{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-xl-8{margin-bottom:3rem!important;margin-top:3rem!important}.my-xl-9{margin-bottom:4rem!important;margin-top:4rem!important}.my-xl-10{margin-bottom:5rem!important;margin-top:5rem!important}.my-xl-11{margin-bottom:6rem!important;margin-top:6rem!important}.my-xl-12{margin-bottom:8rem!important;margin-top:8rem!important}.my-xl-13{margin-bottom:10rem!important;margin-top:10rem!important}.my-xl-14{margin-bottom:12rem!important;margin-top:12rem!important}.my-xl-15{margin-bottom:16rem!important;margin-top:16rem!important}.my-xl-16{margin-bottom:25rem!important;margin-top:25rem!important}.my-xl-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:.75rem!important}.mt-xl-4{margin-top:1rem!important}.mt-xl-5{margin-top:1.5rem!important}.mt-xl-6{margin-top:2rem!important}.mt-xl-7{margin-top:2.5rem!important}.mt-xl-8{margin-top:3rem!important}.mt-xl-9{margin-top:4rem!important}.mt-xl-10{margin-top:5rem!important}.mt-xl-11{margin-top:6rem!important}.mt-xl-12{margin-top:8rem!important}.mt-xl-13{margin-top:10rem!important}.mt-xl-14{margin-top:12rem!important}.mt-xl-15{margin-top:16rem!important}.mt-xl-16{margin-top:25rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:.75rem!important}.me-xl-4{margin-right:1rem!important}.me-xl-5{margin-right:1.5rem!important}.me-xl-6{margin-right:2rem!important}.me-xl-7{margin-right:2.5rem!important}.me-xl-8{margin-right:3rem!important}.me-xl-9{margin-right:4rem!important}.me-xl-10{margin-right:5rem!important}.me-xl-11{margin-right:6rem!important}.me-xl-12{margin-right:8rem!important}.me-xl-13{margin-right:10rem!important}.me-xl-14{margin-right:12rem!important}.me-xl-15{margin-right:16rem!important}.me-xl-16{margin-right:25rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:.75rem!important}.mb-xl-4{margin-bottom:1rem!important}.mb-xl-5{margin-bottom:1.5rem!important}.mb-xl-6{margin-bottom:2rem!important}.mb-xl-7{margin-bottom:2.5rem!important}.mb-xl-8{margin-bottom:3rem!important}.mb-xl-9{margin-bottom:4rem!important}.mb-xl-10{margin-bottom:5rem!important}.mb-xl-11{margin-bottom:6rem!important}.mb-xl-12{margin-bottom:8rem!important}.mb-xl-13{margin-bottom:10rem!important}.mb-xl-14{margin-bottom:12rem!important}.mb-xl-15{margin-bottom:16rem!important}.mb-xl-16{margin-bottom:25rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:.75rem!important}.ms-xl-4{margin-left:1rem!important}.ms-xl-5{margin-left:1.5rem!important}.ms-xl-6{margin-left:2rem!important}.ms-xl-7{margin-left:2.5rem!important}.ms-xl-8{margin-left:3rem!important}.ms-xl-9{margin-left:4rem!important}.ms-xl-10{margin-left:5rem!important}.ms-xl-11{margin-left:6rem!important}.ms-xl-12{margin-left:8rem!important}.ms-xl-13{margin-left:10rem!important}.ms-xl-14{margin-left:12rem!important}.ms-xl-15{margin-left:16rem!important}.ms-xl-16{margin-left:25rem!important}.ms-xl-auto{margin-left:auto!important}.m-xl-n1{margin:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.m-xl-n3{margin:-.75rem!important}.m-xl-n4{margin:-1rem!important}.m-xl-n5{margin:-1.5rem!important}.m-xl-n6{margin:-2rem!important}.m-xl-n7{margin:-2.5rem!important}.m-xl-n8{margin:-3rem!important}.m-xl-n9{margin:-4rem!important}.m-xl-n10{margin:-5rem!important}.m-xl-n11{margin:-6rem!important}.m-xl-n12{margin:-8rem!important}.m-xl-n13{margin:-10rem!important}.m-xl-n14{margin:-12rem!important}.m-xl-n15{margin:-16rem!important}.m-xl-n16{margin:-25rem!important}.mx-xl-n1{margin-left:-.25rem!important;margin-right:-.25rem!important}.mx-xl-n2{margin-left:-.5rem!important;margin-right:-.5rem!important}.mx-xl-n3{margin-left:-.75rem!important;margin-right:-.75rem!important}.mx-xl-n4{margin-left:-1rem!important;margin-right:-1rem!important}.mx-xl-n5{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.mx-xl-n6{margin-left:-2rem!important;margin-right:-2rem!important}.mx-xl-n7{margin-left:-2.5rem!important;margin-right:-2.5rem!important}.mx-xl-n8{margin-left:-3rem!important;margin-right:-3rem!important}.mx-xl-n9{margin-left:-4rem!important;margin-right:-4rem!important}.mx-xl-n10{margin-left:-5rem!important;margin-right:-5rem!important}.mx-xl-n11{margin-left:-6rem!important;margin-right:-6rem!important}.mx-xl-n12{margin-left:-8rem!important;margin-right:-8rem!important}.mx-xl-n13{margin-left:-10rem!important;margin-right:-10rem!important}.mx-xl-n14{margin-left:-12rem!important;margin-right:-12rem!important}.mx-xl-n15{margin-left:-16rem!important;margin-right:-16rem!important}.mx-xl-n16{margin-left:-25rem!important;margin-right:-25rem!important}.my-xl-n1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.my-xl-n2{margin-bottom:-.5rem!important;margin-top:-.5rem!important}.my-xl-n3{margin-bottom:-.75rem!important;margin-top:-.75rem!important}.my-xl-n4{margin-bottom:-1rem!important;margin-top:-1rem!important}.my-xl-n5{margin-bottom:-1.5rem!important;margin-top:-1.5rem!important}.my-xl-n6{margin-bottom:-2rem!important;margin-top:-2rem!important}.my-xl-n7{margin-bottom:-2.5rem!important;margin-top:-2.5rem!important}.my-xl-n8{margin-bottom:-3rem!important;margin-top:-3rem!important}.my-xl-n9{margin-bottom:-4rem!important;margin-top:-4rem!important}.my-xl-n10{margin-bottom:-5rem!important;margin-top:-5rem!important}.my-xl-n11{margin-bottom:-6rem!important;margin-top:-6rem!important}.my-xl-n12{margin-bottom:-8rem!important;margin-top:-8rem!important}.my-xl-n13{margin-bottom:-10rem!important;margin-top:-10rem!important}.my-xl-n14{margin-bottom:-12rem!important;margin-top:-12rem!important}.my-xl-n15{margin-bottom:-16rem!important;margin-top:-16rem!important}.my-xl-n16{margin-bottom:-25rem!important;margin-top:-25rem!important}.mt-xl-n1{margin-top:-.25rem!important}.mt-xl-n2{margin-top:-.5rem!important}.mt-xl-n3{margin-top:-.75rem!important}.mt-xl-n4{margin-top:-1rem!important}.mt-xl-n5{margin-top:-1.5rem!important}.mt-xl-n6{margin-top:-2rem!important}.mt-xl-n7{margin-top:-2.5rem!important}.mt-xl-n8{margin-top:-3rem!important}.mt-xl-n9{margin-top:-4rem!important}.mt-xl-n10{margin-top:-5rem!important}.mt-xl-n11{margin-top:-6rem!important}.mt-xl-n12{margin-top:-8rem!important}.mt-xl-n13{margin-top:-10rem!important}.mt-xl-n14{margin-top:-12rem!important}.mt-xl-n15{margin-top:-16rem!important}.mt-xl-n16{margin-top:-25rem!important}.me-xl-n1{margin-right:-.25rem!important}.me-xl-n2{margin-right:-.5rem!important}.me-xl-n3{margin-right:-.75rem!important}.me-xl-n4{margin-right:-1rem!important}.me-xl-n5{margin-right:-1.5rem!important}.me-xl-n6{margin-right:-2rem!important}.me-xl-n7{margin-right:-2.5rem!important}.me-xl-n8{margin-right:-3rem!important}.me-xl-n9{margin-right:-4rem!important}.me-xl-n10{margin-right:-5rem!important}.me-xl-n11{margin-right:-6rem!important}.me-xl-n12{margin-right:-8rem!important}.me-xl-n13{margin-right:-10rem!important}.me-xl-n14{margin-right:-12rem!important}.me-xl-n15{margin-right:-16rem!important}.me-xl-n16{margin-right:-25rem!important}.mb-xl-n1{margin-bottom:-.25rem!important}.mb-xl-n2{margin-bottom:-.5rem!important}.mb-xl-n3{margin-bottom:-.75rem!important}.mb-xl-n4{margin-bottom:-1rem!important}.mb-xl-n5{margin-bottom:-1.5rem!important}.mb-xl-n6{margin-bottom:-2rem!important}.mb-xl-n7{margin-bottom:-2.5rem!important}.mb-xl-n8{margin-bottom:-3rem!important}.mb-xl-n9{margin-bottom:-4rem!important}.mb-xl-n10{margin-bottom:-5rem!important}.mb-xl-n11{margin-bottom:-6rem!important}.mb-xl-n12{margin-bottom:-8rem!important}.mb-xl-n13{margin-bottom:-10rem!important}.mb-xl-n14{margin-bottom:-12rem!important}.mb-xl-n15{margin-bottom:-16rem!important}.mb-xl-n16{margin-bottom:-25rem!important}.ms-xl-n1{margin-left:-.25rem!important}.ms-xl-n2{margin-left:-.5rem!important}.ms-xl-n3{margin-left:-.75rem!important}.ms-xl-n4{margin-left:-1rem!important}.ms-xl-n5{margin-left:-1.5rem!important}.ms-xl-n6{margin-left:-2rem!important}.ms-xl-n7{margin-left:-2.5rem!important}.ms-xl-n8{margin-left:-3rem!important}.ms-xl-n9{margin-left:-4rem!important}.ms-xl-n10{margin-left:-5rem!important}.ms-xl-n11{margin-left:-6rem!important}.ms-xl-n12{margin-left:-8rem!important}.ms-xl-n13{margin-left:-10rem!important}.ms-xl-n14{margin-left:-12rem!important}.ms-xl-n15{margin-left:-16rem!important}.ms-xl-n16{margin-left:-25rem!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:.75rem!important}.p-xl-4{padding:1rem!important}.p-xl-5{padding:1.5rem!important}.p-xl-6{padding:2rem!important}.p-xl-7{padding:2.5rem!important}.p-xl-8{padding:3rem!important}.p-xl-9{padding:4rem!important}.p-xl-10{padding:5rem!important}.p-xl-11{padding:6rem!important}.p-xl-12{padding:8rem!important}.p-xl-13{padding:10rem!important}.p-xl-14{padding:12rem!important}.p-xl-15{padding:16rem!important}.p-xl-16{padding:25rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-xl-4{padding-left:1rem!important;padding-right:1rem!important}.px-xl-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-6{padding-left:2rem!important;padding-right:2rem!important}.px-xl-7{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-xl-8{padding-left:3rem!important;padding-right:3rem!important}.px-xl-9{padding-left:4rem!important;padding-right:4rem!important}.px-xl-10{padding-left:5rem!important;padding-right:5rem!important}.px-xl-11{padding-left:6rem!important;padding-right:6rem!important}.px-xl-12{padding-left:8rem!important;padding-right:8rem!important}.px-xl-13{padding-left:10rem!important;padding-right:10rem!important}.px-xl-14{padding-left:12rem!important;padding-right:12rem!important}.px-xl-15{padding-left:16rem!important;padding-right:16rem!important}.px-xl-16{padding-left:25rem!important;padding-right:25rem!important}.py-xl-0{padding-bottom:0!important;padding-top:0!important}.py-xl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-xl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-xl-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-xl-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-xl-5{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-xl-6{padding-bottom:2rem!important;padding-top:2rem!important}.py-xl-7{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-xl-8{padding-bottom:3rem!important;padding-top:3rem!important}.py-xl-9{padding-bottom:4rem!important;padding-top:4rem!important}.py-xl-10{padding-bottom:5rem!important;padding-top:5rem!important}.py-xl-11{padding-bottom:6rem!important;padding-top:6rem!important}.py-xl-12{padding-bottom:8rem!important;padding-top:8rem!important}.py-xl-13{padding-bottom:10rem!important;padding-top:10rem!important}.py-xl-14{padding-bottom:12rem!important;padding-top:12rem!important}.py-xl-15{padding-bottom:16rem!important;padding-top:16rem!important}.py-xl-16{padding-bottom:25rem!important;padding-top:25rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:.75rem!important}.pt-xl-4{padding-top:1rem!important}.pt-xl-5{padding-top:1.5rem!important}.pt-xl-6{padding-top:2rem!important}.pt-xl-7{padding-top:2.5rem!important}.pt-xl-8{padding-top:3rem!important}.pt-xl-9{padding-top:4rem!important}.pt-xl-10{padding-top:5rem!important}.pt-xl-11{padding-top:6rem!important}.pt-xl-12{padding-top:8rem!important}.pt-xl-13{padding-top:10rem!important}.pt-xl-14{padding-top:12rem!important}.pt-xl-15{padding-top:16rem!important}.pt-xl-16{padding-top:25rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:.75rem!important}.pe-xl-4{padding-right:1rem!important}.pe-xl-5{padding-right:1.5rem!important}.pe-xl-6{padding-right:2rem!important}.pe-xl-7{padding-right:2.5rem!important}.pe-xl-8{padding-right:3rem!important}.pe-xl-9{padding-right:4rem!important}.pe-xl-10{padding-right:5rem!important}.pe-xl-11{padding-right:6rem!important}.pe-xl-12{padding-right:8rem!important}.pe-xl-13{padding-right:10rem!important}.pe-xl-14{padding-right:12rem!important}.pe-xl-15{padding-right:16rem!important}.pe-xl-16{padding-right:25rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:.75rem!important}.pb-xl-4{padding-bottom:1rem!important}.pb-xl-5{padding-bottom:1.5rem!important}.pb-xl-6{padding-bottom:2rem!important}.pb-xl-7{padding-bottom:2.5rem!important}.pb-xl-8{padding-bottom:3rem!important}.pb-xl-9{padding-bottom:4rem!important}.pb-xl-10{padding-bottom:5rem!important}.pb-xl-11{padding-bottom:6rem!important}.pb-xl-12{padding-bottom:8rem!important}.pb-xl-13{padding-bottom:10rem!important}.pb-xl-14{padding-bottom:12rem!important}.pb-xl-15{padding-bottom:16rem!important}.pb-xl-16{padding-bottom:25rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:.75rem!important}.ps-xl-4{padding-left:1rem!important}.ps-xl-5{padding-left:1.5rem!important}.ps-xl-6{padding-left:2rem!important}.ps-xl-7{padding-left:2.5rem!important}.ps-xl-8{padding-left:3rem!important}.ps-xl-9{padding-left:4rem!important}.ps-xl-10{padding-left:5rem!important}.ps-xl-11{padding-left:6rem!important}.ps-xl-12{padding-left:8rem!important}.ps-xl-13{padding-left:10rem!important}.ps-xl-14{padding-left:12rem!important}.ps-xl-15{padding-left:16rem!important}.ps-xl-16{padding-left:25rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.position-xxl-static{position:static!important}.position-xxl-relative{position:relative!important}.position-xxl-absolute{position:absolute!important}.position-xxl-fixed{position:fixed!important}.position-xxl-sticky{position:sticky!important}.border-xxl{border:1px solid #f1f4f8!important}.border-xxl-0{border:0!important}.border-top-xxl{border-top:1px solid #f1f4f8!important}.border-top-xxl-0{border-top:0!important}.border-right-xxl{border-right:1px solid #f1f4f8!important}.border-right-xxl-0{border-right:0!important}.border-bottom-xxl{border-bottom:1px solid #f1f4f8!important}.border-bottom-xxl-0{border-bottom:0!important}.border-left-xxl{border-left:1px solid #f1f4f8!important}.border-left-xxl-0{border-left:0!important}.w-xxl-25{width:25%!important}.w-xxl-50{width:50%!important}.w-xxl-75{width:75%!important}.w-xxl-100{width:100%!important}.w-xxl-110{width:110%!important}.w-xxl-120{width:120%!important}.w-xxl-130{width:130%!important}.w-xxl-140{width:140%!important}.w-xxl-150{width:150%!important}.w-xxl-auto{width:auto!important}.mw-xxl-25{max-width:25%!important}.mw-xxl-50{max-width:50%!important}.mw-xxl-75{max-width:75%!important}.mw-xxl-100{max-width:100%!important}.mw-xxl-110{max-width:110%!important}.mw-xxl-120{max-width:120%!important}.mw-xxl-130{max-width:130%!important}.mw-xxl-140{max-width:140%!important}.mw-xxl-150{max-width:150%!important}.vw-xxl-25{width:25vw!important}.vw-xxl-50{width:50vw!important}.vw-xxl-75{width:75vw!important}.vw-xxl-100{width:100vw!important}.vw-xxl-110{width:110vw!important}.vw-xxl-120{width:120vw!important}.vw-xxl-130{width:130vw!important}.vw-xxl-140{width:140vw!important}.vw-xxl-150{width:150vw!important}.h-xxl-25{height:25%!important}.h-xxl-50{height:50%!important}.h-xxl-75{height:75%!important}.h-xxl-100{height:100%!important}.h-xxl-110{height:110%!important}.h-xxl-120{height:120%!important}.h-xxl-130{height:130%!important}.h-xxl-140{height:140%!important}.h-xxl-150{height:150%!important}.h-xxl-auto{height:auto!important}.vh-xxl-25{height:25vh!important}.vh-xxl-50{height:50vh!important}.vh-xxl-75{height:75vh!important}.vh-xxl-100{height:100vh!important}.vh-xxl-110{height:110vh!important}.vh-xxl-120{height:120vh!important}.vh-xxl-130{height:130vh!important}.vh-xxl-140{height:140vh!important}.vh-xxl-150{height:150vh!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:.75rem!important}.gap-xxl-4{gap:1rem!important}.gap-xxl-5{gap:1.5rem!important}.gap-xxl-6{gap:2rem!important}.gap-xxl-7{gap:2.5rem!important}.gap-xxl-8{gap:3rem!important}.gap-xxl-9{gap:4rem!important}.gap-xxl-10{gap:5rem!important}.gap-xxl-11{gap:6rem!important}.gap-xxl-12{gap:8rem!important}.gap-xxl-13{gap:10rem!important}.gap-xxl-14{gap:12rem!important}.gap-xxl-15{gap:16rem!important}.gap-xxl-16{gap:25rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:.75rem!important}.m-xxl-4{margin:1rem!important}.m-xxl-5{margin:1.5rem!important}.m-xxl-6{margin:2rem!important}.m-xxl-7{margin:2.5rem!important}.m-xxl-8{margin:3rem!important}.m-xxl-9{margin:4rem!important}.m-xxl-10{margin:5rem!important}.m-xxl-11{margin:6rem!important}.m-xxl-12{margin:8rem!important}.m-xxl-13{margin:10rem!important}.m-xxl-14{margin:12rem!important}.m-xxl-15{margin:16rem!important}.m-xxl-16{margin:25rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-xxl-4{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-6{margin-left:2rem!important;margin-right:2rem!important}.mx-xxl-7{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-xxl-8{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-9{margin-left:4rem!important;margin-right:4rem!important}.mx-xxl-10{margin-left:5rem!important;margin-right:5rem!important}.mx-xxl-11{margin-left:6rem!important;margin-right:6rem!important}.mx-xxl-12{margin-left:8rem!important;margin-right:8rem!important}.mx-xxl-13{margin-left:10rem!important;margin-right:10rem!important}.mx-xxl-14{margin-left:12rem!important;margin-right:12rem!important}.mx-xxl-15{margin-left:16rem!important;margin-right:16rem!important}.mx-xxl-16{margin-left:25rem!important;margin-right:25rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-bottom:0!important;margin-top:0!important}.my-xxl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-xxl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-xxl-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-xxl-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-xxl-5{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-xxl-6{margin-bottom:2rem!important;margin-top:2rem!important}.my-xxl-7{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-xxl-8{margin-bottom:3rem!important;margin-top:3rem!important}.my-xxl-9{margin-bottom:4rem!important;margin-top:4rem!important}.my-xxl-10{margin-bottom:5rem!important;margin-top:5rem!important}.my-xxl-11{margin-bottom:6rem!important;margin-top:6rem!important}.my-xxl-12{margin-bottom:8rem!important;margin-top:8rem!important}.my-xxl-13{margin-bottom:10rem!important;margin-top:10rem!important}.my-xxl-14{margin-bottom:12rem!important;margin-top:12rem!important}.my-xxl-15{margin-bottom:16rem!important;margin-top:16rem!important}.my-xxl-16{margin-bottom:25rem!important;margin-top:25rem!important}.my-xxl-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:.75rem!important}.mt-xxl-4{margin-top:1rem!important}.mt-xxl-5{margin-top:1.5rem!important}.mt-xxl-6{margin-top:2rem!important}.mt-xxl-7{margin-top:2.5rem!important}.mt-xxl-8{margin-top:3rem!important}.mt-xxl-9{margin-top:4rem!important}.mt-xxl-10{margin-top:5rem!important}.mt-xxl-11{margin-top:6rem!important}.mt-xxl-12{margin-top:8rem!important}.mt-xxl-13{margin-top:10rem!important}.mt-xxl-14{margin-top:12rem!important}.mt-xxl-15{margin-top:16rem!important}.mt-xxl-16{margin-top:25rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:.75rem!important}.me-xxl-4{margin-right:1rem!important}.me-xxl-5{margin-right:1.5rem!important}.me-xxl-6{margin-right:2rem!important}.me-xxl-7{margin-right:2.5rem!important}.me-xxl-8{margin-right:3rem!important}.me-xxl-9{margin-right:4rem!important}.me-xxl-10{margin-right:5rem!important}.me-xxl-11{margin-right:6rem!important}.me-xxl-12{margin-right:8rem!important}.me-xxl-13{margin-right:10rem!important}.me-xxl-14{margin-right:12rem!important}.me-xxl-15{margin-right:16rem!important}.me-xxl-16{margin-right:25rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:.75rem!important}.mb-xxl-4{margin-bottom:1rem!important}.mb-xxl-5{margin-bottom:1.5rem!important}.mb-xxl-6{margin-bottom:2rem!important}.mb-xxl-7{margin-bottom:2.5rem!important}.mb-xxl-8{margin-bottom:3rem!important}.mb-xxl-9{margin-bottom:4rem!important}.mb-xxl-10{margin-bottom:5rem!important}.mb-xxl-11{margin-bottom:6rem!important}.mb-xxl-12{margin-bottom:8rem!important}.mb-xxl-13{margin-bottom:10rem!important}.mb-xxl-14{margin-bottom:12rem!important}.mb-xxl-15{margin-bottom:16rem!important}.mb-xxl-16{margin-bottom:25rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:.75rem!important}.ms-xxl-4{margin-left:1rem!important}.ms-xxl-5{margin-left:1.5rem!important}.ms-xxl-6{margin-left:2rem!important}.ms-xxl-7{margin-left:2.5rem!important}.ms-xxl-8{margin-left:3rem!important}.ms-xxl-9{margin-left:4rem!important}.ms-xxl-10{margin-left:5rem!important}.ms-xxl-11{margin-left:6rem!important}.ms-xxl-12{margin-left:8rem!important}.ms-xxl-13{margin-left:10rem!important}.ms-xxl-14{margin-left:12rem!important}.ms-xxl-15{margin-left:16rem!important}.ms-xxl-16{margin-left:25rem!important}.ms-xxl-auto{margin-left:auto!important}.m-xxl-n1{margin:-.25rem!important}.m-xxl-n2{margin:-.5rem!important}.m-xxl-n3{margin:-.75rem!important}.m-xxl-n4{margin:-1rem!important}.m-xxl-n5{margin:-1.5rem!important}.m-xxl-n6{margin:-2rem!important}.m-xxl-n7{margin:-2.5rem!important}.m-xxl-n8{margin:-3rem!important}.m-xxl-n9{margin:-4rem!important}.m-xxl-n10{margin:-5rem!important}.m-xxl-n11{margin:-6rem!important}.m-xxl-n12{margin:-8rem!important}.m-xxl-n13{margin:-10rem!important}.m-xxl-n14{margin:-12rem!important}.m-xxl-n15{margin:-16rem!important}.m-xxl-n16{margin:-25rem!important}.mx-xxl-n1{margin-left:-.25rem!important;margin-right:-.25rem!important}.mx-xxl-n2{margin-left:-.5rem!important;margin-right:-.5rem!important}.mx-xxl-n3{margin-left:-.75rem!important;margin-right:-.75rem!important}.mx-xxl-n4{margin-left:-1rem!important;margin-right:-1rem!important}.mx-xxl-n5{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.mx-xxl-n6{margin-left:-2rem!important;margin-right:-2rem!important}.mx-xxl-n7{margin-left:-2.5rem!important;margin-right:-2.5rem!important}.mx-xxl-n8{margin-left:-3rem!important;margin-right:-3rem!important}.mx-xxl-n9{margin-left:-4rem!important;margin-right:-4rem!important}.mx-xxl-n10{margin-left:-5rem!important;margin-right:-5rem!important}.mx-xxl-n11{margin-left:-6rem!important;margin-right:-6rem!important}.mx-xxl-n12{margin-left:-8rem!important;margin-right:-8rem!important}.mx-xxl-n13{margin-left:-10rem!important;margin-right:-10rem!important}.mx-xxl-n14{margin-left:-12rem!important;margin-right:-12rem!important}.mx-xxl-n15{margin-left:-16rem!important;margin-right:-16rem!important}.mx-xxl-n16{margin-left:-25rem!important;margin-right:-25rem!important}.my-xxl-n1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.my-xxl-n2{margin-bottom:-.5rem!important;margin-top:-.5rem!important}.my-xxl-n3{margin-bottom:-.75rem!important;margin-top:-.75rem!important}.my-xxl-n4{margin-bottom:-1rem!important;margin-top:-1rem!important}.my-xxl-n5{margin-bottom:-1.5rem!important;margin-top:-1.5rem!important}.my-xxl-n6{margin-bottom:-2rem!important;margin-top:-2rem!important}.my-xxl-n7{margin-bottom:-2.5rem!important;margin-top:-2.5rem!important}.my-xxl-n8{margin-bottom:-3rem!important;margin-top:-3rem!important}.my-xxl-n9{margin-bottom:-4rem!important;margin-top:-4rem!important}.my-xxl-n10{margin-bottom:-5rem!important;margin-top:-5rem!important}.my-xxl-n11{margin-bottom:-6rem!important;margin-top:-6rem!important}.my-xxl-n12{margin-bottom:-8rem!important;margin-top:-8rem!important}.my-xxl-n13{margin-bottom:-10rem!important;margin-top:-10rem!important}.my-xxl-n14{margin-bottom:-12rem!important;margin-top:-12rem!important}.my-xxl-n15{margin-bottom:-16rem!important;margin-top:-16rem!important}.my-xxl-n16{margin-bottom:-25rem!important;margin-top:-25rem!important}.mt-xxl-n1{margin-top:-.25rem!important}.mt-xxl-n2{margin-top:-.5rem!important}.mt-xxl-n3{margin-top:-.75rem!important}.mt-xxl-n4{margin-top:-1rem!important}.mt-xxl-n5{margin-top:-1.5rem!important}.mt-xxl-n6{margin-top:-2rem!important}.mt-xxl-n7{margin-top:-2.5rem!important}.mt-xxl-n8{margin-top:-3rem!important}.mt-xxl-n9{margin-top:-4rem!important}.mt-xxl-n10{margin-top:-5rem!important}.mt-xxl-n11{margin-top:-6rem!important}.mt-xxl-n12{margin-top:-8rem!important}.mt-xxl-n13{margin-top:-10rem!important}.mt-xxl-n14{margin-top:-12rem!important}.mt-xxl-n15{margin-top:-16rem!important}.mt-xxl-n16{margin-top:-25rem!important}.me-xxl-n1{margin-right:-.25rem!important}.me-xxl-n2{margin-right:-.5rem!important}.me-xxl-n3{margin-right:-.75rem!important}.me-xxl-n4{margin-right:-1rem!important}.me-xxl-n5{margin-right:-1.5rem!important}.me-xxl-n6{margin-right:-2rem!important}.me-xxl-n7{margin-right:-2.5rem!important}.me-xxl-n8{margin-right:-3rem!important}.me-xxl-n9{margin-right:-4rem!important}.me-xxl-n10{margin-right:-5rem!important}.me-xxl-n11{margin-right:-6rem!important}.me-xxl-n12{margin-right:-8rem!important}.me-xxl-n13{margin-right:-10rem!important}.me-xxl-n14{margin-right:-12rem!important}.me-xxl-n15{margin-right:-16rem!important}.me-xxl-n16{margin-right:-25rem!important}.mb-xxl-n1{margin-bottom:-.25rem!important}.mb-xxl-n2{margin-bottom:-.5rem!important}.mb-xxl-n3{margin-bottom:-.75rem!important}.mb-xxl-n4{margin-bottom:-1rem!important}.mb-xxl-n5{margin-bottom:-1.5rem!important}.mb-xxl-n6{margin-bottom:-2rem!important}.mb-xxl-n7{margin-bottom:-2.5rem!important}.mb-xxl-n8{margin-bottom:-3rem!important}.mb-xxl-n9{margin-bottom:-4rem!important}.mb-xxl-n10{margin-bottom:-5rem!important}.mb-xxl-n11{margin-bottom:-6rem!important}.mb-xxl-n12{margin-bottom:-8rem!important}.mb-xxl-n13{margin-bottom:-10rem!important}.mb-xxl-n14{margin-bottom:-12rem!important}.mb-xxl-n15{margin-bottom:-16rem!important}.mb-xxl-n16{margin-bottom:-25rem!important}.ms-xxl-n1{margin-left:-.25rem!important}.ms-xxl-n2{margin-left:-.5rem!important}.ms-xxl-n3{margin-left:-.75rem!important}.ms-xxl-n4{margin-left:-1rem!important}.ms-xxl-n5{margin-left:-1.5rem!important}.ms-xxl-n6{margin-left:-2rem!important}.ms-xxl-n7{margin-left:-2.5rem!important}.ms-xxl-n8{margin-left:-3rem!important}.ms-xxl-n9{margin-left:-4rem!important}.ms-xxl-n10{margin-left:-5rem!important}.ms-xxl-n11{margin-left:-6rem!important}.ms-xxl-n12{margin-left:-8rem!important}.ms-xxl-n13{margin-left:-10rem!important}.ms-xxl-n14{margin-left:-12rem!important}.ms-xxl-n15{margin-left:-16rem!important}.ms-xxl-n16{margin-left:-25rem!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:.75rem!important}.p-xxl-4{padding:1rem!important}.p-xxl-5{padding:1.5rem!important}.p-xxl-6{padding:2rem!important}.p-xxl-7{padding:2.5rem!important}.p-xxl-8{padding:3rem!important}.p-xxl-9{padding:4rem!important}.p-xxl-10{padding:5rem!important}.p-xxl-11{padding:6rem!important}.p-xxl-12{padding:8rem!important}.p-xxl-13{padding:10rem!important}.p-xxl-14{padding:12rem!important}.p-xxl-15{padding:16rem!important}.p-xxl-16{padding:25rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-xxl-4{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-6{padding-left:2rem!important;padding-right:2rem!important}.px-xxl-7{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-xxl-8{padding-left:3rem!important;padding-right:3rem!important}.px-xxl-9{padding-left:4rem!important;padding-right:4rem!important}.px-xxl-10{padding-left:5rem!important;padding-right:5rem!important}.px-xxl-11{padding-left:6rem!important;padding-right:6rem!important}.px-xxl-12{padding-left:8rem!important;padding-right:8rem!important}.px-xxl-13{padding-left:10rem!important;padding-right:10rem!important}.px-xxl-14{padding-left:12rem!important;padding-right:12rem!important}.px-xxl-15{padding-left:16rem!important;padding-right:16rem!important}.px-xxl-16{padding-left:25rem!important;padding-right:25rem!important}.py-xxl-0{padding-bottom:0!important;padding-top:0!important}.py-xxl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-xxl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-xxl-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-xxl-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-xxl-5{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-xxl-6{padding-bottom:2rem!important;padding-top:2rem!important}.py-xxl-7{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-xxl-8{padding-bottom:3rem!important;padding-top:3rem!important}.py-xxl-9{padding-bottom:4rem!important;padding-top:4rem!important}.py-xxl-10{padding-bottom:5rem!important;padding-top:5rem!important}.py-xxl-11{padding-bottom:6rem!important;padding-top:6rem!important}.py-xxl-12{padding-bottom:8rem!important;padding-top:8rem!important}.py-xxl-13{padding-bottom:10rem!important;padding-top:10rem!important}.py-xxl-14{padding-bottom:12rem!important;padding-top:12rem!important}.py-xxl-15{padding-bottom:16rem!important;padding-top:16rem!important}.py-xxl-16{padding-bottom:25rem!important;padding-top:25rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:.75rem!important}.pt-xxl-4{padding-top:1rem!important}.pt-xxl-5{padding-top:1.5rem!important}.pt-xxl-6{padding-top:2rem!important}.pt-xxl-7{padding-top:2.5rem!important}.pt-xxl-8{padding-top:3rem!important}.pt-xxl-9{padding-top:4rem!important}.pt-xxl-10{padding-top:5rem!important}.pt-xxl-11{padding-top:6rem!important}.pt-xxl-12{padding-top:8rem!important}.pt-xxl-13{padding-top:10rem!important}.pt-xxl-14{padding-top:12rem!important}.pt-xxl-15{padding-top:16rem!important}.pt-xxl-16{padding-top:25rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:.75rem!important}.pe-xxl-4{padding-right:1rem!important}.pe-xxl-5{padding-right:1.5rem!important}.pe-xxl-6{padding-right:2rem!important}.pe-xxl-7{padding-right:2.5rem!important}.pe-xxl-8{padding-right:3rem!important}.pe-xxl-9{padding-right:4rem!important}.pe-xxl-10{padding-right:5rem!important}.pe-xxl-11{padding-right:6rem!important}.pe-xxl-12{padding-right:8rem!important}.pe-xxl-13{padding-right:10rem!important}.pe-xxl-14{padding-right:12rem!important}.pe-xxl-15{padding-right:16rem!important}.pe-xxl-16{padding-right:25rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:.75rem!important}.pb-xxl-4{padding-bottom:1rem!important}.pb-xxl-5{padding-bottom:1.5rem!important}.pb-xxl-6{padding-bottom:2rem!important}.pb-xxl-7{padding-bottom:2.5rem!important}.pb-xxl-8{padding-bottom:3rem!important}.pb-xxl-9{padding-bottom:4rem!important}.pb-xxl-10{padding-bottom:5rem!important}.pb-xxl-11{padding-bottom:6rem!important}.pb-xxl-12{padding-bottom:8rem!important}.pb-xxl-13{padding-bottom:10rem!important}.pb-xxl-14{padding-bottom:12rem!important}.pb-xxl-15{padding-bottom:16rem!important}.pb-xxl-16{padding-bottom:25rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:.75rem!important}.ps-xxl-4{padding-left:1rem!important}.ps-xxl-5{padding-left:1.5rem!important}.ps-xxl-6{padding-left:2rem!important}.ps-xxl-7{padding-left:2.5rem!important}.ps-xxl-8{padding-left:3rem!important}.ps-xxl-9{padding-left:4rem!important}.ps-xxl-10{padding-left:5rem!important}.ps-xxl-11{padding-left:6rem!important}.ps-xxl-12{padding-left:8rem!important}.ps-xxl-13{padding-left:10rem!important}.ps-xxl-14{padding-left:12rem!important}.ps-xxl-15{padding-left:16rem!important}.ps-xxl-16{padding-left:25rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.bg-cover{background:no-repeat 50%/cover}@media (max-width:991.98px){.bg-between{background-image:none!important}}@media (min-width:992px){.bg-between{background-position:0,100%;background-repeat:no-repeat;background-size:auto 70%}}.bg-gradient-light-white{background-image:linear-gradient(180deg,#f9fbfd 0,#fff)}.bg-gradient-dark-black{background-image:linear-gradient(180deg,#1b2a4e 0,#161c2d)}.bg-gradient-multicolor{background-image:conic-gradient(from 52deg at 50% 50%,#8024a0 0deg,#31eec1 33deg,#6924a0 222deg,#d6723b 264deg,#d5498c 295deg,#8024a0 1turn)}.bg-pattern-2{background-image:linear-gradient(180deg,transparent 0,#161c2d),url(../img/patterns/pattern-2.png)}.img-skewed{perspective:1500px;transform-style:preserve-3d}.img-skewed-start{perspective-origin:0}.img-skewed-start .img-skewed-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:rotateY(-35deg) rotateX(15deg)}.img-skewed-end{perspective-origin:100%}.img-skewed-end .img-skewed-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:rotateY(35deg) rotateX(15deg)}.lift{transition:box-shadow .25s ease,transform .25s ease}.lift:focus,.lift:hover{box-shadow:0 1rem 2.5rem rgba(22,28,45,.1),0 .5rem 1rem -.75rem rgba(22,28,45,.1)!important;transform:translate3d(0,-3px,0)}.lift-lg:focus,.lift-lg:hover{box-shadow:0 2rem 5rem rgba(22,28,45,.1),0 .5rem 1rem -.75rem rgba(22,28,45,.05)!important;transform:translate3d(0,-5px,0)}.overlay{position:relative}.overlay:before{border-radius:inherit;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.overlay-primary:before{background-color:#335eea}.overlay-gradient-primary-end:before{background-image:linear-gradient(180deg,transparent,#335eea)}@media (min-width:992px){.overlay-gradient-primary-end:before{background-image:linear-gradient(90deg,transparent,#335eea 50%,#335eea)}}.overlay-gradient-primary-down:before,.overlay-gradient-primary-start:before{background-image:linear-gradient(180deg,transparent,#335eea)}@media (min-width:992px){.overlay-gradient-primary-start:before{background-image:linear-gradient(270deg,transparent,#335eea 50%,#335eea)}}.overlay-secondary:before{background-color:#506690}.overlay-gradient-secondary-end:before{background-image:linear-gradient(180deg,transparent,#506690)}@media (min-width:992px){.overlay-gradient-secondary-end:before{background-image:linear-gradient(90deg,transparent,#506690 50%,#506690)}}.overlay-gradient-secondary-down:before,.overlay-gradient-secondary-start:before{background-image:linear-gradient(180deg,transparent,#506690)}@media (min-width:992px){.overlay-gradient-secondary-start:before{background-image:linear-gradient(270deg,transparent,#506690 50%,#506690)}}.overlay-success:before{background-color:#42ba96}.overlay-gradient-success-end:before{background-image:linear-gradient(180deg,transparent,#42ba96)}@media (min-width:992px){.overlay-gradient-success-end:before{background-image:linear-gradient(90deg,transparent,#42ba96 50%,#42ba96)}}.overlay-gradient-success-down:before,.overlay-gradient-success-start:before{background-image:linear-gradient(180deg,transparent,#42ba96)}@media (min-width:992px){.overlay-gradient-success-start:before{background-image:linear-gradient(270deg,transparent,#42ba96 50%,#42ba96)}}.overlay-info:before{background-color:#7c69ef}.overlay-gradient-info-end:before{background-image:linear-gradient(180deg,transparent,#7c69ef)}@media (min-width:992px){.overlay-gradient-info-end:before{background-image:linear-gradient(90deg,transparent,#7c69ef 50%,#7c69ef)}}.overlay-gradient-info-down:before,.overlay-gradient-info-start:before{background-image:linear-gradient(180deg,transparent,#7c69ef)}@media (min-width:992px){.overlay-gradient-info-start:before{background-image:linear-gradient(270deg,transparent,#7c69ef 50%,#7c69ef)}}.overlay-warning:before{background-color:#fad776}.overlay-gradient-warning-end:before{background-image:linear-gradient(180deg,transparent,#fad776)}@media (min-width:992px){.overlay-gradient-warning-end:before{background-image:linear-gradient(90deg,transparent,#fad776 50%,#fad776)}}.overlay-gradient-warning-down:before,.overlay-gradient-warning-start:before{background-image:linear-gradient(180deg,transparent,#fad776)}@media (min-width:992px){.overlay-gradient-warning-start:before{background-image:linear-gradient(270deg,transparent,#fad776 50%,#fad776)}}.overlay-danger:before{background-color:#df4759}.overlay-gradient-danger-end:before{background-image:linear-gradient(180deg,transparent,#df4759)}@media (min-width:992px){.overlay-gradient-danger-end:before{background-image:linear-gradient(90deg,transparent,#df4759 50%,#df4759)}}.overlay-gradient-danger-down:before,.overlay-gradient-danger-start:before{background-image:linear-gradient(180deg,transparent,#df4759)}@media (min-width:992px){.overlay-gradient-danger-start:before{background-image:linear-gradient(270deg,transparent,#df4759 50%,#df4759)}}.overlay-light:before{background-color:#f9fbfd}.overlay-gradient-light-end:before{background-image:linear-gradient(180deg,transparent,#f9fbfd)}@media (min-width:992px){.overlay-gradient-light-end:before{background-image:linear-gradient(90deg,transparent,#f9fbfd 50%,#f9fbfd)}}.overlay-gradient-light-down:before,.overlay-gradient-light-start:before{background-image:linear-gradient(180deg,transparent,#f9fbfd)}@media (min-width:992px){.overlay-gradient-light-start:before{background-image:linear-gradient(270deg,transparent,#f9fbfd 50%,#f9fbfd)}}.overlay-dark:before{background-color:#1b2a4e}.overlay-gradient-dark-end:before{background-image:linear-gradient(180deg,transparent,#1b2a4e)}@media (min-width:992px){.overlay-gradient-dark-end:before{background-image:linear-gradient(90deg,transparent,#1b2a4e 50%,#1b2a4e)}}.overlay-gradient-dark-down:before,.overlay-gradient-dark-start:before{background-image:linear-gradient(180deg,transparent,#1b2a4e)}@media (min-width:992px){.overlay-gradient-dark-start:before{background-image:linear-gradient(270deg,transparent,#1b2a4e 50%,#1b2a4e)}}.overlay-primary-desat:before{background-color:#6c8aec}.overlay-gradient-primary-desat-end:before{background-image:linear-gradient(180deg,transparent,#6c8aec)}@media (min-width:992px){.overlay-gradient-primary-desat-end:before{background-image:linear-gradient(90deg,transparent,#6c8aec 50%,#6c8aec)}}.overlay-gradient-primary-desat-down:before,.overlay-gradient-primary-desat-start:before{background-image:linear-gradient(180deg,transparent,#6c8aec)}@media (min-width:992px){.overlay-gradient-primary-desat-start:before{background-image:linear-gradient(270deg,transparent,#6c8aec 50%,#6c8aec)}}.overlay-black:before{background-color:#161c2d}.overlay-gradient-black-end:before{background-image:linear-gradient(180deg,transparent,#161c2d)}@media (min-width:992px){.overlay-gradient-black-end:before{background-image:linear-gradient(90deg,transparent,#161c2d 50%,#161c2d)}}.overlay-gradient-black-down:before,.overlay-gradient-black-start:before{background-image:linear-gradient(180deg,transparent,#161c2d)}@media (min-width:992px){.overlay-gradient-black-start:before{background-image:linear-gradient(270deg,transparent,#161c2d 50%,#161c2d)}}.overlay-white:before{background-color:#fff}.overlay-gradient-white-end:before{background-image:linear-gradient(180deg,transparent,#fff)}@media (min-width:992px){.overlay-gradient-white-end:before{background-image:linear-gradient(90deg,transparent,#fff 50%,#fff)}}.overlay-gradient-white-down:before,.overlay-gradient-white-start:before{background-image:linear-gradient(180deg,transparent,#fff)}@media (min-width:992px){.overlay-gradient-white-start:before{background-image:linear-gradient(270deg,transparent,#fff 50%,#fff)}}.overlay-10:before{opacity:.1}.overlay-20:before{opacity:.2}.overlay-30:before{opacity:.3}.overlay-40:before{opacity:.4}.overlay-50:before{opacity:.5}.overlay-60:before{opacity:.6}.overlay-70:before{opacity:.7}.overlay-80:before{opacity:.8}.overlay-90:before{opacity:.9}.center{left:50%;top:50%;transform:translate(-50%,-50%)}.shadow-multicolor{box-shadow:-300px 100px 300px rgba(80,26,232,.2),300px -100px 300px rgba(36,161,252,.2)}@media (min-width:576px){.w-cover{width:calc(100% + 50vw - 270px + 2.5rem)}}@media (min-width:768px){.w-cover{width:calc(100% + 50vw - 360px + 2.5rem)}}@media (min-width:992px){.w-cover{width:calc(100% + 50vw - 480px + 2.5rem)}}@media (min-width:1200px){.w-cover{width:calc(100% + 50vw - 520px + 2.5rem)}}@media (max-width:991.98px){.font-size-lg{font-size:1.0625rem!important}}html{overflow-x:hidden}@media (hover:none){body{overflow-x:hidden}}@font-face{font-family:HKGroteskPro;font-weight:400;src:url(../fonts/HK%20Grotesk%20Pro/HKGroteskPro-Regular.woff2) format("woff2"),url(../fonts/HK%20Grotesk%20Pro/HKGroteskPro-Regular.woff) format("woff")}@font-face{font-family:HKGroteskPro;font-weight:600;src:url(../fonts/HK%20Grotesk%20Pro/HKGroteskPro-Medium.woff2) format("woff2"),url(../fonts/HK%20Grotesk%20Pro/HKGroteskPro-Medium.woff) format("woff")}@font-face{font-family:HKGroteskPro;font-weight:700;src:url(../fonts/HK%20Grotesk%20Pro/HKGroteskPro-Bold.woff2) format("woff2"),url(../fonts/HK%20Grotesk%20Pro/HKGroteskPro-Bold.woff) format("woff")}@font-face{font-family:Feather;font-style:normal;font-weight:400;src:url(../fonts/Feather/Feather.ttf?sdxovp) format("truetype"),url(../fonts/Feather/Feather.woff?sdxovp) format("woff"),url(../fonts/Feather/Feather.svg?sdxovp#Feather) format("svg")}.h1,.h2,h1,h2{margin-bottom:1rem}.h1,.h2,.h3,.h4,h1,h2,h3,h4{letter-spacing:-.01em}.h1,h1{line-height:1.3}@media (max-width:991.98px){.h1,h1{font-size:1.875rem}}.h2,h2{line-height:1.35}@media (max-width:991.98px){.h2,h2{font-size:1.5rem}}.h3,h3{line-height:1.4}@media (max-width:991.98px){.h3,h3{font-size:1.125rem}}.h4,h4{line-height:1.45}@media (max-width:991.98px){.h4,h4{font-size:1.0625rem}}.h5,h5{line-height:1.5}.h6,h6{line-height:1.55}.h6.text-uppercase,.text-uppercase.h6,h6.text-uppercase{letter-spacing:.08em}.display-1,.display-2,.display-3,.display-4{letter-spacing:-.02em}.display-1{line-height:1.2}@media (max-width:991.98px){.display-1{font-size:3.125rem}}.display-2{line-height:1.2}@media (max-width:991.98px){.display-2{font-size:2.5rem}}.display-3{line-height:1.2}@media (max-width:991.98px){.display-3{font-size:2.25rem}}.display-4{line-height:1.2}@media (max-width:991.98px){.display-4{font-size:2rem}.lead{font-size:1.1875rem}}.blockquote-img{max-height:2.5rem;max-width:100%;width:auto}.blockquote-footer{margin-top:0}.blockquote-footer:before{display:none}.list-social-icon{height:auto;max-width:1.25rem}.hr-sm{width:60px}.hr-sm:not([size]){height:2px}.hr-md{width:100px}.hr-md:not([size]){height:2px}code{line-height:1.35}.img-cover{height:auto;margin-left:calc(50% - 50vw);width:100vw}.img-fluid>img,.img-fluid>svg{height:inherit;max-width:inherit}.figure{display:block}.figure-img{margin-bottom:1rem}[class^=container]{padding-left:1.25rem;padding-right:1.25rem;position:relative;z-index:1}[class^=col]{position:relative}.table-align-middle tbody>tr>td,.table-align-middle thead>tr>th{vertical-align:middle}.form-floating>label{color:#869ab8}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{font-size:.75rem}.form-floating>.form-control:not(:-ms-input-placeholder)~label{font-size:.75rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{font-size:.75rem}.form-check{margin-bottom:0}.form-check+.form-check{margin-top:.125rem}.form-check-dark .form-check-input{background-color:rgba(255,255,255,.2)}.form-check-dark .form-check-input:checked{background-color:#fff}.form-switch{min-height:1.375rem}.form-switch>.form-check-input{height:1.375rem}.form-switch>.form-check-label{margin-top:calc(.6875rem - .8em)}.form-check-dark.form-switch .form-check-input,.form-check-dark.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.form-check-dark.form-switch .form-check-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23335EEA'/%3E%3C/svg%3E")}.form-control-xs{font-size:.9375rem;line-height:1.6;min-height:calc(2rem + 2px);padding:.25rem .625rem}.form-control-flush,.form-floating>.form-control-flush{border-left-width:0;border-radius:0;border-right-width:0;border-top-width:0;padding-left:0;padding-right:0}.form-floating>.form-control-flush~label{border-width:0;padding-left:0;padding-right:0}.form-group{margin-bottom:1rem}.form-select-xs{background-position:right .625rem center;background-size:.75em;font-size:.9375rem;height:calc(2rem + 2px);line-height:1.6;padding:.25rem calc(1.25rem + .75em) .25rem .625rem}.input-group-xs .form-control{min-height:calc(2rem + 2px)}.input-group-xs .form-control,.input-group-xs .input-group-text{font-size:.9375rem;line-height:1.6;padding:.25rem .625rem}.btn>img{max-height:1em;width:auto}.btn:not([class*=btn-outline]){border-color:transparent!important}.btn-xs{font-size:.9375rem;padding:.25rem .625rem}.btn-white{background-color:#fff;color:#335eea}.btn-white:focus,.btn-white:hover{background-color:#fff;color:#1c4ce8}.btn-white.active{background-color:#f2f2f2;color:#1c4ce8}.btn-group .btn-white{border-color:#d9e2ef!important;color:#869ab8}.btn-group .btn-white.active{background-color:#f2f2f2;box-shadow:none;color:#768daf}.btn-gray-300-20{background-color:rgba(217,226,239,.2);color:#fff}.btn-gray-300-20.active,.btn-gray-300-20:focus,.btn-gray-300-20:hover{background-color:rgba(217,226,239,.25);color:#fff}.btn-gray-400{background-color:#c6d3e6;color:#fff}.btn-gray-400.active,.btn-gray-400:focus,.btn-gray-400:hover{background-color:#b4c5de;color:#f2f2f2}.btn-gray-400-10{background-color:rgba(198,211,230,.1);color:#fff}.btn-gray-400-10.active,.btn-gray-400-10:focus,.btn-gray-400-10:hover{background-color:rgba(198,211,230,.15);color:#fff}.btn-outline-white{border-color:#d9e2ef;color:#161c2d}.btn-outline-white.active,.btn-outline-white:focus,.btn-outline-white:hover{background-color:#f2f2f2;border-color:#c6d3e6;color:#161c2d}.btn-outline-gray-300{border-color:#d9e2ef;color:#335eea}.btn-outline-gray-300.active,.btn-outline-gray-300:focus,.btn-outline-gray-300:hover{background-color:#335eea;border-color:#335eea;color:#fff}.btn-primary-soft{background-color:rgba(51,94,234,.1);color:#335eea}.btn-primary-soft.active,.btn-primary-soft:focus,.btn-primary-soft:hover{background-color:rgba(51,94,234,.15);color:#335eea}.btn-secondary-soft{background-color:rgba(80,102,144,.1);color:#506690}.btn-secondary-soft.active,.btn-secondary-soft:focus,.btn-secondary-soft:hover{background-color:rgba(80,102,144,.15);color:#506690}.btn-success-soft{background-color:rgba(66,186,150,.1);color:#42ba96}.btn-success-soft.active,.btn-success-soft:focus,.btn-success-soft:hover{background-color:rgba(66,186,150,.15);color:#42ba96}.btn-info-soft{background-color:rgba(124,105,239,.1);color:#7c69ef}.btn-info-soft.active,.btn-info-soft:focus,.btn-info-soft:hover{background-color:rgba(124,105,239,.15);color:#7c69ef}.btn-warning-soft{background-color:rgba(250,215,118,.1);color:#fad776}.btn-warning-soft.active,.btn-warning-soft:focus,.btn-warning-soft:hover{background-color:rgba(250,215,118,.15);color:#fad776}.btn-danger-soft{background-color:rgba(223,71,89,.1);color:#df4759}.btn-danger-soft.active,.btn-danger-soft:focus,.btn-danger-soft:hover{background-color:rgba(223,71,89,.15);color:#df4759}.btn-light-soft{background-color:rgba(249,251,253,.1);color:#f9fbfd}.btn-light-soft.active,.btn-light-soft:focus,.btn-light-soft:hover{background-color:rgba(249,251,253,.15);color:#f9fbfd}.btn-dark-soft{background-color:rgba(27,42,78,.1);color:#1b2a4e}.btn-dark-soft.active,.btn-dark-soft:focus,.btn-dark-soft:hover{background-color:rgba(27,42,78,.15);color:#1b2a4e}.btn-primary-desat-soft{background-color:rgba(108,138,236,.1);color:#6c8aec}.btn-primary-desat-soft.active,.btn-primary-desat-soft:focus,.btn-primary-desat-soft:hover{background-color:rgba(108,138,236,.15);color:#6c8aec}.btn-black-soft{background-color:rgba(22,28,45,.1);color:#161c2d}.btn-black-soft.active,.btn-black-soft:focus,.btn-black-soft:hover{background-color:rgba(22,28,45,.15);color:#161c2d}.btn-white-soft{background-color:rgba(255,255,255,.1);color:#fff}.btn-white-soft.active,.btn-white-soft:focus,.btn-white-soft:hover{background-color:rgba(255,255,255,.15);color:#fff}.btn-pill{border-radius:50rem}.btn-rounded-circle{border-radius:50rem;padding-left:.8125rem;padding-right:.8125rem}.btn-rounded-circle>*{display:block;line-height:1;width:1em}.btn-group-lg>.btn-rounded-circle.btn,.btn-rounded-circle.btn-lg{padding-left:1.122rem;padding-right:1.122rem}.btn-group-sm>.btn-rounded-circle.btn,.btn-rounded-circle.btn-sm{padding-left:.5625rem;padding-right:.5625rem}.btn-rounded-circle.btn-xs{padding-left:.25rem;padding-right:.25rem}.dropdown-menu{padding-left:1.75rem;padding-right:1.75rem}.dropdown-item{margin-left:-1.75rem;margin-right:-1.75rem;min-width:100%;width:auto}.dropdown-item:focus,.dropdown-item:hover{outline:none}.dropdown-item+.dropdown-item{margin-top:.45rem}.dropdown-link{color:inherit}.dropdown-link:hover{text-decoration:inherit}.dropdown-link:focus,.dropdown-link:hover{outline:none}.dropdown-header{font-size:.75rem;font-weight:600;letter-spacing:.08em;line-height:1.55;margin-left:-1.75rem;margin-right:-1.75rem;padding-bottom:.5rem;padding-top:0;text-transform:uppercase}.dropdown-toggle:after{border:none!important;content:"\e92e";font-family:Feather;vertical-align:middle}.dropend>.dropdown-toggle:after{content:"\e930"}.dropdown-menu-xs{min-width:0;padding:1rem 1.25rem}.dropdown-menu-md{min-width:22rem}.dropdown-menu-lg{min-width:35rem}.dropdown-menu-xl{min-width:42rem}.dropdown-menu-lg,.dropdown-menu-xl{padding:2.375rem 2.5rem}.dropdown-menu-lg .dropdown-item,.dropdown-menu-xl .dropdown-header{margin-left:-2.5rem;margin-right:-2.5rem;padding-left:2.5rem;padding-right:2.5rem}.dropend>.dropdown-menu{top:-1.625rem}.navbar{transition:all .2s ease-in-out;transition-property:background-color,color;z-index:1030}@media (max-width:991.98px){.navbar-dark .navbar-nav .nav-item .nav-link{color:#506690}.navbar-dark .navbar-nav .nav-item.active .nav-link,.navbar-dark .navbar-nav .nav-item .nav-link.active,.navbar-dark .navbar-nav .nav-item .nav-link:focus,.navbar-dark .navbar-nav .nav-item .nav-link:hover{color:#335eea}.navbar-dark .navbar-collapse .navbar-toggler{color:#506690}}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl{padding-left:1.25rem!important;padding-right:1.25rem!important}.navbar-brand{font-weight:600}.navbar-brand-img{max-height:2.4rem;width:auto}.navbar-dark .navbar-brand{filter:brightness(0) invert(1)}@media (max-width:991.98px){.navbar-btn{border-top-left-radius:0;border-top-right-radius:0;font-size:1.0625rem;padding:.8125rem 1.25rem;width:100%}}.navbar-nav .nav-link{font-weight:600}.navbar-nav .nav-link:focus,.navbar-nav .nav-link:hover{outline:none}.navbar-dark.fixed-top>.container{position:relative}.navbar-dark.fixed-top>.container:after{border-top:1px solid rgba(255,255,255,.2);bottom:-1.25rem;content:"";left:0;position:absolute;right:0}@media (max-width:991.98px){.navbar-collapse{background-color:#fff;border-radius:.375rem;box-shadow:0 1.5rem 4rem rgba(22,28,45,.15);height:auto;left:1rem;max-height:calc(100% - 2rem)!important;overflow-x:hidden;overflow-y:scroll;position:fixed;top:1rem;width:calc(100% - 2rem)}.navbar-collapse.collapsing,.navbar-collapse.show{transform-origin:top right;transition:all .2s ease-in-out;transition-property:opacity,transform}.navbar-collapse.show{opacity:1;transform:scale(1)}.navbar-collapse.collapsing{opacity:0;transform:scale(.9)}}.navbar .navbar-toggler{margin-left:auto}.navbar-collapse .navbar-toggler{position:absolute;right:1rem;top:1rem;z-index:1}@media (min-width:992px){.navbar-collapse .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-collapse .navbar-nav .nav-item{padding:1.5rem}.navbar-collapse .navbar-nav .nav-item+.nav-item{border-top:1px solid #f1f4f8}.navbar-collapse .navbar-nav .nav-link{padding-bottom:0;padding-top:0}}.navbar-nav .dropdown-menu{box-shadow:none}@media (min-width:992px){.navbar-nav .dropdown-menu{box-shadow:0 1.5rem 4rem rgba(22,28,45,.15)}}@media (max-width:991.98px){.navbar-collapse .navbar-nav .dropdown-menu{min-width:0;padding:0}.navbar-collapse .navbar-nav .dropdown>.dropdown-menu{display:block!important}.navbar-collapse .navbar-nav .dropend>.dropdown-menu{padding-bottom:1rem;padding-left:.5rem;padding-top:1rem}}@media (min-width:992px){.navbar-collapse .navbar-nav .dropend>.dropdown-menu{left:100%;right:auto}}@media (max-width:991.98px){.navbar-collapse .navbar-nav .dropdown-header,.navbar-collapse .navbar-nav .dropdown-item{margin-left:0;margin-right:0;padding-left:0;padding-right:0}}.navbar-nav .dropdown>.dropdown-toggle:after{display:none}@media (max-width:991.98px){.navbar-collapse .navbar-nav .dropdown>.dropdown-toggle{margin-bottom:1.5rem;pointer-events:none}}.navbar-nav .dropend>.dropdown-toggle{display:flex}.navbar-nav .dropend>.dropdown-toggle:after{margin-left:auto}@media (max-width:991.98px){.navbar-collapse .navbar-nav .dropend>.dropdown-toggle:after{content:"\e92e"}.navbar-collapse .navbar-nav .dropend>.dropdown-toggle[aria-expanded=true]:after{transform:rotate(180deg);transform-origin:center center}}.navbar-nav .dropdown-img-start{align-items:center;background:no-repeat 50%/cover;border-bottom-left-radius:.375rem;border-top-left-radius:.375rem;display:none;flex-direction:column;height:100%;justify-content:center;padding:1.625rem 1.75rem}@media (min-width:992px){.navbar-nav .dropdown-img-start{display:flex}}.navbar-nav .dropdown-img-start:before{background-color:rgba(51,94,234,.8);border-radius:inherit;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.navbar-nav .dropdown-img-start *{position:relative}@media (min-width:992px){.navbar-nav .dropdown-menu-lg .dropdown-img-start,.navbar-nav .dropdown-menu-xl .dropdown-img-start{padding:2.375rem 2.5rem}.navbar-nav .dropdown-body{padding:1.625rem 1.75rem}.navbar-nav .dropdown-menu-lg .dropdown-body,.navbar-nav .dropdown-menu-xl .dropdown-body{padding:2.375rem 2.5rem}}.navbar-nav .dropdown-menu .list-group-item{align-items:center;color:inherit;display:flex;padding-bottom:1rem;padding-top:1rem}.navbar-nav .dropdown-menu .list-group-item:hover{text-decoration:none}@media (min-width:992px){.navbar-nav .dropdown-menu{display:none;opacity:0;transition:all .2s ease-in-out;transition-property:opacity,transform}.navbar-nav .dropend>.dropdown-menu{transform:translateY(10px)}.navbar-nav .dropdown>.dropdown-menu{left:50%;transform:translate(-50%,10px)}.navbar-nav .dropdown-menu.showing{display:block}.navbar-nav .dropdown-menu.show{display:block;opacity:1}.navbar-nav .dropend>.dropdown-menu.show{transform:translateY(0)}.navbar-nav .dropdown>.dropdown-menu.show{transform:translate(-50%)}}.card{position:relative;width:100%}.card-header{background-color:transparent;border-bottom:1px solid #f1f4f8}.card-body{display:block;flex-grow:0}.card-footer{background-color:unset}.card-body,.card-footer,.card-img,.card-img-end,.card-img-start,.card-img-top,.card-meta{min-height:1px;position:relative}a.card,a.card-body,a.card-footer,a.card-meta{color:inherit}a.card-body:hover,a.card-footer:hover,a.card-meta:hover,a.card:hover{text-decoration:none}.card-flush{background-color:unset}.card-flush>:not(.card-btn){padding-left:0;padding-right:0}.card-border{position:relative}.card-border:after{border-bottom:calc(.375rem - 2px) solid transparent;border-top-color:inherit;border-top-left-radius:.375rem;border-top-right-radius:.375rem;border-top-style:solid;border-top-width:2px;content:"";position:absolute;right:0;top:0;width:100%}.card-border-lg:after{border-bottom-width:calc(.375rem - 3px);border-top-width:3px}.card-border-xl:after{border-bottom-width:calc(.375rem - 3px);border-top-width:4px}@media (min-width:768px){.card-row .card-body{padding:4rem 2.5rem}.card-row .card-meta{padding-left:2.5rem;padding-right:2.5rem}}.card-img-end{border-radius:.375rem .375rem 0 0}@media (min-width:768px){.card-img-end{border-radius:0 .375rem .375rem 0}}.card-img-start{border-radius:.375rem .375rem 0 0}@media (min-width:768px){.card-img-start{border-radius:.375rem 0 0 .375rem}.card-img-slider{height:100%;width:100%}.card-img-slider *{height:inherit!important;width:inherit!important}}.card-img-overlay{display:flex;flex-direction:column;padding:2rem}.card-img-overlay .card-body{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;margin:auto -2rem -2rem}.card-img-overlay-hover{overflow:hidden}.card-img-overlay-hover .card-body{transform:translateY(110%);transition:all .3s ease}.card-img-overlay-hover:hover .card-body{transform:translateY(0)}@media (min-width:576px) and (max-width:767.98px){.card-group{flex-direction:column!important}.card-group>.card{flex:auto}}.card-meta{align-items:center;display:flex;flex-wrap:wrap;padding:0 2rem 1.5rem}.card-meta-divider{margin:0 0 1.5rem;width:100%}.card-btn:last-child{border-top-left-radius:0;border-top-right-radius:0}.card-zoom{border-radius:inherit;overflow:hidden!important}.card-zoom>[class*=card-img]{transform-origin:center center;transition:all .3s ease}.card:hover>.card-zoom>[class*=card-img]{transform:scale(1.1)}.card-list .list-link{position:relative}.card-list .list-link:before{border-right:2px solid #335eea;bottom:0;content:"";display:none;left:-2rem;position:absolute;top:0}.card-list .active .list-link,.card-list .list-link:hover{color:#161c2d!important}.card-list .active .list-link:before{display:block}@media (max-width:767.98px){.card-bleed{border-radius:0;margin-left:-1.25rem;margin-right:-1.25rem;min-width:100%;width:auto}.card-bleed .card-body,.card-bleed .card-footer,.card-bleed .card-header{border-radius:0;padding-left:1.25rem;padding-right:1.25rem}.card-bleed .card-list .list-link:before{left:-1.25rem}}.accordion-button:not(.collapsed){box-shadow:none}.accordion-button:not([data-bs-toggle=collapse]):after{display:none}.accordion-button:after{margin-left:1rem}.accordion-body{padding-top:0}.breadcrumb-item{font-size:.9375rem}.breadcrumb-item+.breadcrumb-item:before{content:"\e930";font-family:Feather}.breadcrumb-scroll{display:flex;flex-wrap:nowrap;overflow-y:auto}.breadcrumb-scroll .breadcrumb-item{white-space:nowrap}.breadcrumb-scroll::-webkit-scrollbar{display:none}.pagination-sm .page-link{font-size:1.0625rem;line-height:1.6}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.375rem;border-top-right-radius:.375rem}.pagination-lg .page-link{font-size:1.0625rem;line-height:1.6}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.375rem;border-top-right-radius:.375rem}.badge[href]:hover{text-decoration:none}.badge-lg{padding:.7em 1.15em}.badge-rounded-circle{border-radius:50rem;height:calc(1em + .5rem);padding-left:.25rem;padding-right:.25rem}.badge-rounded-circle>*{display:block;width:1em}.badge-rounded-circle.badge-lg{height:2.4em;padding-left:.7em;padding-right:.7em}.badge-float{position:absolute;z-index:1000}.badge-float-inside{right:1rem;top:1rem}.badge-float-outside{right:-.5rem;top:-.5rem}.badge.bg-white-soft.active{background-color:#fff!important;color:#335eea!important}.badge.bg-white-soft.active:focus,.badge.bg-white-soft.active:hover{background-color:#f2f2f2;color:#335eea}.badge.bg-secondary-soft.active{background-color:#335eea!important;color:#fff!important}.badge.bg-secondary-soft.active:focus,.badge.bg-secondary-soft.active:hover{background-color:#1c4ce8;color:#fff}.badge.bg-primary-soft{background-color:rgba(51,94,234,.1);color:#335eea}.badge.bg-primary-soft[href]:focus,.badge.bg-primary-soft[href]:hover{background-color:rgba(51,94,234,.2);color:#335eea}.badge.bg-secondary-soft{background-color:rgba(80,102,144,.1);color:#506690}.badge.bg-secondary-soft[href]:focus,.badge.bg-secondary-soft[href]:hover{background-color:rgba(80,102,144,.2);color:#506690}.badge.bg-success-soft{background-color:rgba(66,186,150,.1);color:#42ba96}.badge.bg-success-soft[href]:focus,.badge.bg-success-soft[href]:hover{background-color:rgba(66,186,150,.2);color:#42ba96}.badge.bg-info-soft{background-color:rgba(124,105,239,.1);color:#7c69ef}.badge.bg-info-soft[href]:focus,.badge.bg-info-soft[href]:hover{background-color:rgba(124,105,239,.2);color:#7c69ef}.badge.bg-warning-soft{background-color:rgba(250,215,118,.1);color:#fad776}.badge.bg-warning-soft[href]:focus,.badge.bg-warning-soft[href]:hover{background-color:rgba(250,215,118,.2);color:#fad776}.badge.bg-danger-soft{background-color:rgba(223,71,89,.1);color:#df4759}.badge.bg-danger-soft[href]:focus,.badge.bg-danger-soft[href]:hover{background-color:rgba(223,71,89,.2);color:#df4759}.badge.bg-light-soft{background-color:rgba(249,251,253,.1);color:#f9fbfd}.badge.bg-light-soft[href]:focus,.badge.bg-light-soft[href]:hover{background-color:rgba(249,251,253,.2);color:#f9fbfd}.badge.bg-dark-soft{background-color:rgba(27,42,78,.1);color:#1b2a4e}.badge.bg-dark-soft[href]:focus,.badge.bg-dark-soft[href]:hover{background-color:rgba(27,42,78,.2);color:#1b2a4e}.badge.bg-primary-desat-soft{background-color:rgba(108,138,236,.1);color:#6c8aec}.badge.bg-primary-desat-soft[href]:focus,.badge.bg-primary-desat-soft[href]:hover{background-color:rgba(108,138,236,.2);color:#6c8aec}.badge.bg-black-soft{background-color:rgba(22,28,45,.1);color:#161c2d}.badge.bg-black-soft[href]:focus,.badge.bg-black-soft[href]:hover{background-color:rgba(22,28,45,.2);color:#161c2d}.badge.bg-white-soft{background-color:rgba(255,255,255,.1);color:#fff}.badge.bg-white-soft[href]:focus,.badge.bg-white-soft[href]:hover{background-color:rgba(255,255,255,.2);color:#fff}.badge.bg-gray-700-soft{background-color:rgba(80,102,144,.1);color:#506690}.badge.bg-gray-700-soft[href]:focus,.badge.bg-gray-700-soft[href]:hover{background-color:rgba(80,102,144,.2);color:#506690}.badge.bg-gray-600{background-color:#869ab8;color:#fff}.badge.bg-info,.badge.bg-primary,.badge.bg-secondary,.badge.bg-success{color:#fff}.badge.bg-warning{color:#1b2a4e}.badge.bg-danger{color:#fff}.badge.bg-light{color:#1b2a4e}.badge.bg-black,.badge.bg-dark,.badge.bg-primary-desat{color:#fff}.badge.bg-white{color:#1b2a4e}.alert-primary{background-color:#335eea;border-color:#335eea;color:#fff}.alert-primary .alert-link{color:#ccc}.alert-primary .alert-link,.alert-primary .btn-close{color:#fff}.alert-primary hr{background-color:#1c4ce8}.alert-secondary{background-color:#506690;border-color:#506690;color:#fff}.alert-secondary .alert-link{color:#ccc}.alert-secondary .alert-link,.alert-secondary .btn-close{color:#fff}.alert-secondary hr{background-color:#475a80}.alert-success{background-color:#42ba96;border-color:#42ba96;color:#fff}.alert-success .alert-link{color:#ccc}.alert-success .alert-link,.alert-success .btn-close{color:#fff}.alert-success hr{background-color:#3ba787}.alert-info{background-color:#7c69ef;border-color:#7c69ef;color:#fff}.alert-info .alert-link{color:#ccc}.alert-info .alert-link,.alert-info .btn-close{color:#fff}.alert-info hr{background-color:#6852ed}.alert-warning{background-color:#fad776;border-color:#fad776;color:#1b2a4e}.alert-warning .alert-link{color:#16223e}.alert-warning .alert-link,.alert-warning .btn-close{color:#1b2a4e}.alert-warning hr{background-color:#f9d05d}.alert-danger{background-color:#df4759;border-color:#df4759;color:#fff}.alert-danger .alert-link{color:#ccc}.alert-danger .alert-link,.alert-danger .btn-close{color:#fff}.alert-danger hr{background-color:#db3145}.alert-light{background-color:#f9fbfd;border-color:#f9fbfd;color:#1b2a4e}.alert-light .alert-link{color:#16223e}.alert-light .alert-link,.alert-light .btn-close{color:#1b2a4e}.alert-light hr{background-color:#e6eef7}.alert-dark{background-color:#1b2a4e;border-color:#1b2a4e;color:#fff}.alert-dark .alert-link{color:#ccc}.alert-dark .alert-link,.alert-dark .btn-close{color:#fff}.alert-dark hr{background-color:#14203b}.alert-primary-desat{background-color:#6c8aec;border-color:#6c8aec;color:#fff}.alert-primary-desat .alert-link{color:#ccc}.alert-primary-desat .alert-link,.alert-primary-desat .btn-close{color:#fff}.alert-primary-desat hr{background-color:#5578e9}.alert-black{background-color:#161c2d;border-color:#161c2d;color:#fff}.alert-black .alert-link{color:#ccc}.alert-black .alert-link,.alert-black .btn-close{color:#fff}.alert-black hr{background-color:#0e111c}.alert-white{background-color:#fff;border-color:#fff;color:#1b2a4e}.alert-white .alert-link{color:#16223e}.alert-white .alert-link,.alert-white .btn-close{color:#1b2a4e}.alert-white hr{background-color:#f2f2f2}.list-group-flush .list-group-item{padding-left:0;padding-right:0}.list-group-flush .list-group-item:first-child{border-top:0;padding-top:0!important}.list-group-flush .list-group-item:last-child{border-bottom:0;padding-bottom:0!important}.btn-close:focus,.btn-close:hover{outline:none}.modal-open .navbar.fixed-top{padding-right:inherit}.modal .btn-close{position:absolute;right:1.5rem;top:1.5rem;z-index:1000}.popover-header{color:#335eea;font-size:.75rem;margin-bottom:.5rem;padding-bottom:0}.popover-header:not(:empty)~.popover-body{padding-top:0}.avatar{display:inline-block;font-size:.625rem;height:1.875rem;position:relative;width:1.875rem}.avatar:after{background-image:url(../img/masks/avatar-status.svg),url(../img/masks/avatar-group.svg),url(../img/masks/avatar-group-hover.svg),url(../img/masks/avatar-group-hover-last.svg);content:"";height:0;position:absolute;width:0}.avatar-img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.avatar-title{align-items:center;background-color:#abbcd5;color:#fff;display:flex;height:100%;justify-content:center;width:100%}.avatar-offline:before,.avatar-online:before{border-radius:50%;bottom:5%;content:"";height:20%;position:absolute;right:5%;width:20%}.avatar-offline .avatar-img,.avatar-online .avatar-img{-webkit-mask-image:url(../img/masks/avatar-status.svg);mask-image:url(../img/masks/avatar-status.svg);-webkit-mask-size:100% 100%;mask-size:100% 100%}.avatar-online:before{background-color:#42ba96}.avatar-offline:before{background-color:#abbcd5}.avatar-xs{font-size:.33333rem;height:1rem;width:1rem}.avatar-sm{font-size:.5rem;height:1.5rem;width:1.5rem}.avatar-lg,.avatar-xl{font-size:.75rem;height:2.25rem;width:2.25rem}@media (min-width:992px){.avatar-xl{font-size:1.33333rem;height:4rem;width:4rem}}.avatar-xxl{font-size:1.33333rem;height:4rem;width:4rem}@media (min-width:992px){.avatar-xxl{font-size:1.66667rem;height:5rem;width:5rem}}.avatar.avatar-4by3{width:2.5rem}.avatar-xs.avatar-4by3{width:1.33333rem}.avatar-sm.avatar-4by3{width:2rem}.avatar-lg.avatar-4by3{width:3rem}.avatar-xl.avatar-4by3{width:5.33333rem}.avatar-xxl.avatar-4by3{width:6.66667rem}.avatar-group{display:inline-flex}.avatar-group .avatar+.avatar{margin-left:-.46875rem}.avatar-group .avatar-xs+.avatar-xs{margin-left:-.25rem}.avatar-group .avatar-sm+.avatar-sm{margin-left:-.375rem}.avatar-group .avatar-lg+.avatar-lg{margin-left:-.5625rem}.avatar-group .avatar-xl+.avatar-xl{margin-left:-1rem}.avatar-group .avatar-xxl+.avatar-xxl{margin-left:-1.25rem}.avatar-group .avatar:not(:last-child){-webkit-mask-image:url(../img/masks/avatar-group.svg);mask-image:url(../img/masks/avatar-group.svg);-webkit-mask-size:100% 100%;mask-size:100% 100%}.avatar-group .avatar:hover{-webkit-mask-image:none;mask-image:none;z-index:1}.avatar-group .avatar:hover+.avatar{-webkit-mask-image:url(../img/masks/avatar-group-hover.svg);mask-image:url(../img/masks/avatar-group-hover.svg);-webkit-mask-size:100% 100%;mask-size:100% 100%}.avatar-group .avatar:hover+.avatar:last-child{-webkit-mask-image:url(../img/masks/avatar-group-hover-last.svg);mask-image:url(../img/masks/avatar-group-hover-last.svg)}.device,.device>.img-fluid{position:relative}.device:before{background-color:#f9fbfd;content:""}.device-screen,.device:before{-o-object-fit:cover;object-fit:cover;position:absolute}.device-iphonex:before,.device-iphonex>.device-screen{height:80.838323353%;left:16.4021164%;top:7.784431138%;width:66.137566137%}.device-macbook:before,.device-macbook>.device-screen{height:73.076923076%;left:13.38709677%;top:11.53846154%;width:73.548387096%}.device-combo{position:relative}.device-combo>.device{position:absolute}.device-combo-iphonex-iphonex{padding-bottom:130.250482%}.device-combo-iphonex-iphonex>.device-iphonex:first-child{bottom:0;left:0;width:65.5260116%;z-index:1}.device-combo-iphonex-iphonex>.device-iphonex:last-child{right:0;top:0;width:72.8323699%}.device-combo-iphonex-macbook,.device-combo-macbook-iphonex{padding-bottom:62.4260355%}.device-combo-iphonex-macbook>.device-macbook,.device-combo-macbook-iphonex>.device-macbook{width:91.7159763%}.device-combo-iphonex-macbook>.device-iphonex,.device-combo-macbook-iphonex>.device-iphonex{width:27.9585799%;z-index:1}.device-combo-macbook-iphonex>.device-macbook{left:0;top:0}.device-combo-iphonex-macbook>.device-macbook{right:0;top:0}.device-combo-macbook-iphonex>.device-iphonex{bottom:0;right:0}.device-combo-iphonex-macbook>.device-iphonex{bottom:0;left:0}.bg-dark .footer-brand{filter:brightness(0) invert(1)}.icon>svg{height:3rem;width:3rem}.icon[class*=text-]>svg [fill]:not([fill=none]){fill:currentColor!important}.icon-xs>svg{height:1.5rem;width:1.5rem}.icon-sm>svg{height:2.25rem;width:2.25rem}.icon-lg>svg{height:4rem;width:4rem}.icon-xl>svg{height:5rem;width:5rem}.icon-circle{align-items:center;border-radius:50%;display:inline-flex;height:4.1875rem;justify-content:center;width:4.1875rem}.icon-circle>.fe{font-size:1.875rem}.list{list-style-type:none;margin-bottom:0;padding-left:0}.list-item+.list-item{margin-top:.35rem}.list-link{align-items:center;color:#506690;display:flex;flex-wrap:nowrap;font-size:.9375rem}.list-link:focus,.list-link:hover{color:#335eea;text-decoration:none}.screenshot{border-radius:.625rem;box-shadow:25px 60px 125px -25px rgba(80,102,144,.1),16px 40px 75px -40px rgba(0,0,0,.2)}.section-border{position:relative}.section-border:before{border-color:inherit;border-style:solid;border-width:2px 0 0;content:"";left:0;position:absolute;right:0;top:0}.shape{pointer-events:none;position:absolute}.shape>*{display:block}.shape:not([class*=shape-blur]){overflow:hidden}.shape:not([class*=shape-blur])>*{transform:scale(2)}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.shape>svg{display:none}}.shape-top{left:0;right:0;top:0}.shape-top>*{transform-origin:bottom center}.shape-end{bottom:0;left:0;right:0;top:0}.shape-end>*{bottom:inherit;position:inherit;right:inherit;top:inherit;transform-origin:center left}.shape-bottom{bottom:0;left:0;right:0}.shape-bottom>*{transform-origin:top center}.shape-bottom-100{bottom:100%;left:0;right:0}.shape-bottom-100>*{transform-origin:top center}.shape-start{bottom:0;left:0;right:0;top:0}.shape-start>*{bottom:inherit;left:inherit;position:inherit;top:inherit;transform-origin:center right}.shape-fluid-x>*{height:auto;width:100%}.shape-fluid-y>*{height:100%;width:auto}.shape-flip-x{transform:scaleX(-1)}.shape-blur-1{left:0;right:0;top:0}@media (min-width:992px){.shape-blur-1{bottom:0;left:50%;right:auto}}.shape-blur-1>*{height:auto;width:100%}@media (min-width:992px){.shape-blur-1>*{height:100%;width:auto}}.shape-blur-2{left:0;right:0;top:0}@media (min-width:992px){.shape-blur-2{bottom:0;left:auto;right:50%}}.shape-blur-2>*{height:auto;width:100%}@media (min-width:992px){.shape-blur-2>*{float:right;height:100%;width:auto}}.shape-blur-3{left:0;right:0;top:0}.shape-blur-3>*{height:auto;width:100%}.shape-blur-4{bottom:0;left:50%;top:0;transform:translateX(-50%) scale(1.3);width:100%}.shape-blur-4>*{height:100%;margin-left:auto;margin-right:auto;width:auto}@media (min-width:992px){.sidenav{height:calc(100vh - 84px);overflow:auto;position:fixed;top:84px}.sidenav-start{left:0}.sidenav-end{right:0}}[data-aos=img-skewed-item-end],[data-aos=img-skewed-item-start]{-webkit-backface-visibility:hidden;backface-visibility:hidden;opacity:0;transition-property:opacity,transform;will-change:opacity,transform,-webkit-transform}[data-aos=img-skewed-item-end].aos-animate,[data-aos=img-skewed-item-start].aos-animate{opacity:1}[data-aos=img-skewed-item-start]{transform:rotateY(-20deg) rotateX(5deg) translate3d(0,100px,0)}[data-aos=img-skewed-item-start].aos-animate{transform:rotateY(-35deg) rotateX(15deg) translateZ(0)}[data-aos=img-skewed-item-end]{transform:rotateY(20deg) rotateX(5deg) translate3d(0,100px,0)}[data-aos=img-skewed-item-end].aos-animate{transform:rotateY(35deg) rotateX(15deg) translateZ(0)}#bp_container{background:rgba(255,255,255,.873)!important}#bp_container>*{box-shadow:none!important}.bp-x{display:none}.choices{cursor:pointer;position:relative}.choices:focus{outline:none}.choices:after{display:none}.choices>.dropdown-menu{width:100%}.choices>.dropdown-menu [class^=form-control]{margin-bottom:1rem;width:100%}.choices>.dropdown-menu>.dropdown-item.is-highlighted{color:#335eea}.choices>.form-control-xs+.dropdown-menu,.choices>.form-select-xs+.dropdown-menu{min-width:100%;padding:1rem 1.25rem;padding-left:1.25rem;padding-right:1.25rem;width:auto}.choices>.form-control-xs+.dropdown-menu>.dropdown-item,.choices>.form-select-xs+.dropdown-menu>.dropdown-item{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:-1.25rem}.choices>.form-control-lg+.dropdown-menu,.choices>.form-select-lg+.dropdown-menu{padding-left:2.5rem;padding-right:2.5rem}.choices>.form-control-lg+.dropdown-menu>.dropdown-item,.choices>.form-select-lg+.dropdown-menu>.dropdown-item{margin-left:-2.5rem;margin-right:-2.5rem;padding-left:-2.5rem}.choices__placeholder{color:#869ab8;opacity:1}.choices.is-open>.form-control,.choices.is-open>.form-select{border-bottom-left-radius:0;border-bottom-right-radius:0}.choices.is-open>.form-control+.dropdown-menu,.choices.is-open>.form-select+.dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:0}.choices__list--multiple+.form-control{background-color:transparent;border-radius:0;border-width:0;display:inline-block;font-size:1.0625rem;min-height:0;padding:0;width:auto}.form-control-lg+.choices__list--multiple+.form-control,.form-control-sm+.choices__list--multiple+.form-control,.form-select-lg+.choices__list--multiple+.form-control,.form-select-sm+.choices__list--multiple+.form-control{font-size:1.0625rem}.choices__list--multiple{display:inline}.choices__list--multiple>.choices__item{background-color:#f9fbfd;border-radius:.25rem;display:inline-block;font-size:.9375rem;margin-right:.2rem;padding-left:.375rem;padding-right:.375rem}.choices__list--multiple>.choices__item>.choices__button{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23161C2D' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% auto;border-width:0;margin-left:.5rem;opacity:.5;outline:none;padding:0;text-indent:-9999px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:.5rem}.choices__list--multiple>.choices__item:hover>.choices__button{opacity:1}.dropzone{display:flex;flex-direction:column;position:relative}.dz-message{background-color:#fff;border:1px dashed #c6d3e6;border-radius:.375rem;color:#869ab8;cursor:pointer;order:-1;padding:5rem 1rem;text-align:center;transition:all .2s ease-in-out;z-index:999}.dz-message:hover{border-color:#869ab8;color:#161c2d}.dz-button{background:none;border:0;color:inherit;font-size:inherit}.dz-drag-hover .dz-message{border-color:#335eea;color:#335eea}.dropzone-multiple .dz-message{padding-bottom:2rem;padding-top:2rem}.dropzone-single.dz-max-files-reached .dz-message{background-color:rgba(22,28,45,.9);color:#fff;opacity:0}.dropzone-single.dz-max-files-reached .dz-message:hover{opacity:1}.dz-preview-cover,.dz-preview-single{border-radius:.375rem;bottom:0;left:0;position:absolute;right:0;top:0}.dz-preview-img{border-radius:.375rem;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dz-preview-multiple .list-group-item:last-child{border-bottom:0;padding-bottom:0}.fe,[data-dz-size] strong{font-weight:400}.fe{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Feather!important;font-style:normal;font-variant:normal;line-height:1;text-transform:none}.fe-activity:before{content:"\e900"}.fe-airplay:before{content:"\e901"}.fe-alert-circle:before{content:"\e902"}.fe-alert-octagon:before{content:"\e903"}.fe-alert-triangle:before{content:"\e904"}.fe-align-center:before{content:"\e905"}.fe-align-justify:before{content:"\e906"}.fe-align-left:before{content:"\e907"}.fe-align-right:before{content:"\e908"}.fe-anchor:before{content:"\e909"}.fe-aperture:before{content:"\e90a"}.fe-archive:before{content:"\e90b"}.fe-arrow-down:before{content:"\e90c"}.fe-arrow-down-circle:before{content:"\e90d"}.fe-arrow-down-left:before{content:"\e90e"}.fe-arrow-down-right:before{content:"\e90f"}.fe-arrow-left:before{content:"\e910"}.fe-arrow-left-circle:before{content:"\e911"}.fe-arrow-right:before{content:"\e912"}.fe-arrow-right-circle:before{content:"\e913"}.fe-arrow-up:before{content:"\e914"}.fe-arrow-up-circle:before{content:"\e915"}.fe-arrow-up-left:before{content:"\e916"}.fe-arrow-up-right:before{content:"\e917"}.fe-at-sign:before{content:"\e918"}.fe-award:before{content:"\e919"}.fe-bar-chart:before{content:"\e91a"}.fe-bar-chart-2:before{content:"\e91b"}.fe-battery:before{content:"\e91c"}.fe-battery-charging:before{content:"\e91d"}.fe-bell:before{content:"\e91e"}.fe-bell-off:before{content:"\e91f"}.fe-bluetooth:before{content:"\e920"}.fe-bold:before{content:"\e921"}.fe-book:before{content:"\e922"}.fe-book-open:before{content:"\e923"}.fe-bookmark:before{content:"\e924"}.fe-box:before{content:"\e925"}.fe-briefcase:before{content:"\e926"}.fe-calendar:before{content:"\e927"}.fe-camera:before{content:"\e928"}.fe-camera-off:before{content:"\e929"}.fe-cast:before{content:"\e92a"}.fe-check:before{content:"\e92b"}.fe-check-circle:before{content:"\e92c"}.fe-check-square:before{content:"\e92d"}.fe-chevron-down:before{content:"\e92e"}.fe-chevron-left:before{content:"\e92f"}.fe-chevron-right:before{content:"\e930"}.fe-chevron-up:before{content:"\e931"}.fe-chevrons-down:before{content:"\e932"}.fe-chevrons-left:before{content:"\e933"}.fe-chevrons-right:before{content:"\e934"}.fe-chevrons-up:before{content:"\e935"}.fe-chrome:before{content:"\e936"}.fe-circle:before{content:"\e937"}.fe-clipboard:before{content:"\e938"}.fe-clock:before{content:"\e939"}.fe-cloud:before{content:"\e93a"}.fe-cloud-drizzle:before{content:"\e93b"}.fe-cloud-lightning:before{content:"\e93c"}.fe-cloud-off:before{content:"\e93d"}.fe-cloud-rain:before{content:"\e93e"}.fe-cloud-snow:before{content:"\e93f"}.fe-code:before{content:"\e940"}.fe-codepen:before{content:"\e941"}.fe-command:before{content:"\e942"}.fe-compass:before{content:"\e943"}.fe-copy:before{content:"\e944"}.fe-corner-down-left:before{content:"\e945"}.fe-corner-down-right:before{content:"\e946"}.fe-corner-left-down:before{content:"\e947"}.fe-corner-left-up:before{content:"\e948"}.fe-corner-right-down:before{content:"\e949"}.fe-corner-right-up:before{content:"\e94a"}.fe-corner-up-left:before{content:"\e94b"}.fe-corner-up-right:before{content:"\e94c"}.fe-cpu:before{content:"\e94d"}.fe-credit-card:before{content:"\e94e"}.fe-crop:before{content:"\e94f"}.fe-crosshair:before{content:"\e950"}.fe-database:before{content:"\e951"}.fe-delete:before{content:"\e952"}.fe-disc:before{content:"\e953"}.fe-dollar-sign:before{content:"\e954"}.fe-download:before{content:"\e955"}.fe-download-cloud:before{content:"\e956"}.fe-droplet:before{content:"\e957"}.fe-edit:before{content:"\e958"}.fe-edit-2:before{content:"\e959"}.fe-edit-3:before{content:"\e95a"}.fe-external-link:before{content:"\e95b"}.fe-eye:before{content:"\e95c"}.fe-eye-off:before{content:"\e95d"}.fe-facebook:before{content:"\e95e"}.fe-fast-forward:before{content:"\e95f"}.fe-feather:before{content:"\e960"}.fe-file:before{content:"\e961"}.fe-file-minus:before{content:"\e962"}.fe-file-plus:before{content:"\e963"}.fe-file-text:before{content:"\e964"}.fe-film:before{content:"\e965"}.fe-filter:before{content:"\e966"}.fe-flag:before{content:"\e967"}.fe-folder:before{content:"\e968"}.fe-folder-minus:before{content:"\e969"}.fe-folder-plus:before{content:"\e96a"}.fe-gift:before{content:"\e96b"}.fe-git-branch:before{content:"\e96c"}.fe-git-commit:before{content:"\e96d"}.fe-git-merge:before{content:"\e96e"}.fe-git-pull-request:before{content:"\e96f"}.fe-github:before{content:"\e970"}.fe-gitlab:before{content:"\e971"}.fe-globe:before{content:"\e972"}.fe-grid:before{content:"\e973"}.fe-hard-drive:before{content:"\e974"}.fe-hash:before{content:"\e975"}.fe-headphones:before{content:"\e976"}.fe-heart:before{content:"\e977"}.fe-help-circle:before{content:"\e978"}.fe-home:before{content:"\e979"}.fe-image:before{content:"\e97a"}.fe-inbox:before{content:"\e97b"}.fe-info:before{content:"\e97c"}.fe-instagram:before{content:"\e97d"}.fe-italic:before{content:"\e97e"}.fe-layers:before{content:"\e97f"}.fe-layout:before{content:"\e980"}.fe-life-buoy:before{content:"\e981"}.fe-link:before{content:"\e982"}.fe-link-2:before{content:"\e983"}.fe-linkedin:before{content:"\e984"}.fe-list:before{content:"\e985"}.fe-loader:before{content:"\e986"}.fe-lock:before{content:"\e987"}.fe-log-in:before{content:"\e988"}.fe-log-out:before{content:"\e989"}.fe-mail:before{content:"\e98a"}.fe-map:before{content:"\e98b"}.fe-map-pin:before{content:"\e98c"}.fe-maximize:before{content:"\e98d"}.fe-maximize-2:before{content:"\e98e"}.fe-menu:before{content:"\e98f"}.fe-message-circle:before{content:"\e990"}.fe-message-square:before{content:"\e991"}.fe-mic:before{content:"\e992"}.fe-mic-off:before{content:"\e993"}.fe-minimize:before{content:"\e994"}.fe-minimize-2:before{content:"\e995"}.fe-minus:before{content:"\e996"}.fe-minus-circle:before{content:"\e997"}.fe-minus-square:before{content:"\e998"}.fe-monitor:before{content:"\e999"}.fe-moon:before{content:"\e99a"}.fe-more-horizontal:before{content:"\e99b"}.fe-more-vertical:before{content:"\e99c"}.fe-move:before{content:"\e99d"}.fe-music:before{content:"\e99e"}.fe-navigation:before{content:"\e99f"}.fe-navigation-2:before{content:"\e9a0"}.fe-octagon:before{content:"\e9a1"}.fe-package:before{content:"\e9a2"}.fe-paperclip:before{content:"\e9a3"}.fe-pause:before{content:"\e9a4"}.fe-pause-circle:before{content:"\e9a5"}.fe-percent:before{content:"\e9a6"}.fe-phone:before{content:"\e9a7"}.fe-phone-call:before{content:"\e9a8"}.fe-phone-forwarded:before{content:"\e9a9"}.fe-phone-incoming:before{content:"\e9aa"}.fe-phone-missed:before{content:"\e9ab"}.fe-phone-off:before{content:"\e9ac"}.fe-phone-outgoing:before{content:"\e9ad"}.fe-pie-chart:before{content:"\e9ae"}.fe-play:before{content:"\e9af"}.fe-play-circle:before{content:"\e9b0"}.fe-plus:before{content:"\e9b1"}.fe-plus-circle:before{content:"\e9b2"}.fe-plus-square:before{content:"\e9b3"}.fe-pocket:before{content:"\e9b4"}.fe-power:before{content:"\e9b5"}.fe-printer:before{content:"\e9b6"}.fe-radio:before{content:"\e9b7"}.fe-refresh-ccw:before{content:"\e9b8"}.fe-refresh-cw:before{content:"\e9b9"}.fe-repeat:before{content:"\e9ba"}.fe-rewind:before{content:"\e9bb"}.fe-rotate-ccw:before{content:"\e9bc"}.fe-rotate-cw:before{content:"\e9bd"}.fe-rss:before{content:"\e9be"}.fe-save:before{content:"\e9bf"}.fe-scissors:before{content:"\e9c0"}.fe-search:before{content:"\e9c1"}.fe-send:before{content:"\e9c2"}.fe-server:before{content:"\e9c3"}.fe-settings:before{content:"\e9c4"}.fe-share:before{content:"\e9c5"}.fe-share-2:before{content:"\e9c6"}.fe-shield:before{content:"\e9c7"}.fe-shield-off:before{content:"\e9c8"}.fe-shopping-bag:before{content:"\e9c9"}.fe-shopping-cart:before{content:"\e9ca"}.fe-shuffle:before{content:"\e9cb"}.fe-sidebar:before{content:"\e9cc"}.fe-skip-back:before{content:"\e9cd"}.fe-skip-forward:before{content:"\e9ce"}.fe-slack:before{content:"\e9cf"}.fe-slash:before{content:"\e9d0"}.fe-sliders:before{content:"\e9d1"}.fe-smartphone:before{content:"\e9d2"}.fe-speaker:before{content:"\e9d3"}.fe-square:before{content:"\e9d4"}.fe-star:before{content:"\e9d5"}.fe-stop-circle:before{content:"\e9d6"}.fe-sun:before{content:"\e9d7"}.fe-sunrise:before{content:"\e9d8"}.fe-sunset:before{content:"\e9d9"}.fe-tablet:before{content:"\e9da"}.fe-tag:before{content:"\e9db"}.fe-target:before{content:"\e9dc"}.fe-terminal:before{content:"\e9dd"}.fe-thermometer:before{content:"\e9de"}.fe-thumbs-down:before{content:"\e9df"}.fe-thumbs-up:before{content:"\e9e0"}.fe-toggle-left:before{content:"\e9e1"}.fe-toggle-right:before{content:"\e9e2"}.fe-trash:before{content:"\e9e3"}.fe-trash-2:before{content:"\e9e4"}.fe-trending-down:before{content:"\e9e5"}.fe-trending-up:before{content:"\e9e6"}.fe-triangle:before{content:"\e9e7"}.fe-truck:before{content:"\e9e8"}.fe-tv:before{content:"\e9e9"}.fe-twitter:before{content:"\e9ea"}.fe-type:before{content:"\e9eb"}.fe-umbrella:before{content:"\e9ec"}.fe-underline:before{content:"\e9ed"}.fe-unlock:before{content:"\e9ee"}.fe-upload:before{content:"\e9ef"}.fe-upload-cloud:before{content:"\e9f0"}.fe-user:before{content:"\e9f1"}.fe-user-check:before{content:"\e9f2"}.fe-user-minus:before{content:"\e9f3"}.fe-user-plus:before{content:"\e9f4"}.fe-user-x:before{content:"\e9f5"}.fe-users:before{content:"\e9f6"}.fe-video:before{content:"\e9f7"}.fe-video-off:before{content:"\e9f8"}.fe-voicemail:before{content:"\e9f9"}.fe-volume:before{content:"\e9fa"}.fe-volume-1:before{content:"\e9fb"}.fe-volume-2:before{content:"\e9fc"}.fe-volume-x:before{content:"\e9fd"}.fe-watch:before{content:"\e9fe"}.fe-wifi:before{content:"\e9ff"}.fe-wifi-off:before{content:"\ea00"}.fe-wind:before{content:"\ea01"}.fe-x:before{content:"\ea02"}.fe-x-circle:before{content:"\ea03"}.fe-x-square:before{content:"\ea04"}.fe-youtube:before{content:"\ea05"}.fe-zap:before{content:"\ea06"}.fe-zap-off:before{content:"\ea07"}.fe-zoom-in:before{content:"\ea08"}.fe-zoom-out:before{content:"\ea09"}.fe-lg{font-size:1.3125rem}@media (min-width:992px){.fe-lg{font-size:1.125rem}}.flickity-prev-next-button{align-items:center;background-color:#335eea;box-shadow:0 .5rem 1.5rem rgba(22,28,45,.05);color:#fff;display:flex;height:calc(1.6em + 1.625rem + 2px);justify-content:center;width:calc(1.6em + 1.625rem + 2px)}.flickity-prev-next-button:after,.flickity-prev-next-button:before{font-family:Feather}.flickity-prev-next-button:focus,.flickity-prev-next-button:hover{background-color:#335eea;box-shadow:0 .5rem 1.5rem rgba(22,28,45,.1)}.flickity-prev-next-button.previous{left:0;transform:translate(calc(-50% + .625rem),-50%)}@media (min-width:992px){.flickity-prev-next-button.previous{transform:translate(-50%,-50%)}}.flickity-prev-next-button.previous:before{content:"\e910"}.flickity-prev-next-button.next{right:0;transform:translate(calc(50% - .625rem),-50%)}@media (min-width:992px){.flickity-prev-next-button.next{transform:translate(50%,-50%)}}.flickity-prev-next-button.next:before{content:"\e912"}.flickity-button-icon{display:none}.flickity-button-white .flickity-prev-next-button{background-color:#fff;color:#335eea}.flickity-button-bottom .flickity-prev-next-button{bottom:1.5rem;top:auto;transform:none}.flickity-button-bottom .flickity-prev-next-button.previous{left:auto;right:6.375rem}.flickity-button-bottom .flickity-prev-next-button.next{left:auto;right:2.5rem}.flickity-button-inset .flickity-prev-next-button{transform:translateY(-50%)}.flickity-button-inset .flickity-prev-next-button.previous{left:1.5rem}.flickity-button-inset .flickity-prev-next-button.next{right:1.5rem}.flickity-viewport-visible .flickity-viewport{overflow:visible}[data-flickity*='"adaptiveHeight": true'] .flickity-viewport{transition:all .5s ease}.flickity-slider>[class^=col]{padding-left:1.25rem;padding-right:1.25rem}.hljs{background-color:transparent}.ql-container{font-family:HKGroteskPro,serif}.ql-toolbar{background-color:#fff;border:1px solid #f1f4f8;border-radius:.375rem .375rem 0 0;color:#161c2d;padding:.8125rem 1.25rem;position:relative}.ql-toolbar+.ql-container{margin-top:-1px}.ql-toolbar+.ql-container .ql-editor{border-top-left-radius:0;border-top-right-radius:0}.ql-editor{background-clip:padding-box;background-color:#fff;border:1px solid #f1f4f8;border-radius:.375rem;box-shadow:none;color:#161c2d;display:block;font-size:1.0625rem;line-height:1.6;min-height:6.8rem;padding:.8125rem 1.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.ql-editor{transition:none}}.ql-editor::-ms-expand{background-color:transparent;border:0}.ql-editor:focus{border-color:#335eea}.ql-hidden{position:absolute;transform:scale(0)}.ql-editor.ql-blank:before{color:#869ab8;font-style:normal;left:1.25rem;top:.8125rem}.ql-editor:focus:before{display:none}.ql-formats{padding-left:.5rem;padding-right:.5rem}.ql-formats:first-child{padding-left:0}.ql-formats:last-child{padding-right:0}.ql-toolbar button{background:none;border:none;color:#161c2d;cursor:pointer;padding:0 .25rem;transition:all .2s ease-in-out}.ql-toolbar button:hover{color:#335eea}.ql-toolbar button:first-child{margin-left:-.25rem}.ql-toolbar .ql-active{color:#335eea}.ql-toolbar button svg{height:1.1875rem;width:1.1875rem}.ql-toolbar .ql-stroke{stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;fill:none}.ql-toolbar .ql-thin{stroke-width:1}.ql-toolbar .ql-fill{fill:currentColor}.ql-toolbar input.ql-image{position:absolute;transform:scale(0)}.ql-tooltip{background-color:#fff;border:1px solid transparent;border-radius:.375rem;box-shadow:0 1.5rem 4rem rgba(22,28,45,.1);display:flex;flex-wrap:nowrap;margin-top:.6rem;padding:.8125rem 1.25rem;position:absolute;width:18.5rem}.ql-tooltip:after,.ql-tooltip:before{bottom:100%;content:"";left:50%;position:absolute;transform:translateX(-50%)}.ql-tooltip:before{border-bottom:.6rem solid transparent;border-left:.6rem solid transparent;border-right:.6rem solid transparent}.ql-tooltip:after{border-bottom:.5rem solid #fff;border-left:.5rem solid transparent;border-right:.5rem solid transparent}.ql-container .ql-tooltip:hover{display:flex!important}.ql-tooltip .ql-preview{border-radius:.375rem;font-size:.9375rem;padding:.5625rem 1rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.ql-tooltip .ql-preview{transition:none}}.ql-tooltip.ql-editing .ql-preview{display:none}.ql-tooltip input{background-color:transparent;border:none;color:#161c2d;display:none;font-size:.9375rem;line-height:1.6;padding-bottom:calc(.5625rem + 1px);padding-top:calc(.5625rem + 1px);width:100%}.ql-tooltip input:focus{outline:none}.ql-tooltip.ql-editing input{display:block}.ql-tooltip .ql-action,.ql-tooltip .ql-remove{margin-left:.25rem}.ql-tooltip .ql-action:before,.ql-tooltip .ql-remove:before{border:1px solid transparent;border-radius:.375rem;cursor:pointer;display:inline-block;font-size:.9375rem;font-weight:600;padding:.5625rem 1rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}@media (prefers-reduced-motion:reduce){.ql-tooltip .ql-action:before,.ql-tooltip .ql-remove:before{transition:none}}.ql-tooltip .ql-action:before:focus,.ql-tooltip .ql-action:before:hover,.ql-tooltip .ql-remove:before:focus,.ql-tooltip .ql-remove:before:hover{text-decoration:none}.ql-tooltip .ql-action:before.focus,.ql-tooltip .ql-action:before:focus,.ql-tooltip .ql-remove:before.focus,.ql-tooltip .ql-remove:before:focus{box-shadow:none;outline:0}.ql-tooltip .ql-action:before,.ql-tooltip.ql-editing .ql-action:before{background-color:#335eea;border-color:#335eea;box-shadow:none;color:#fff}.ql-tooltip .ql-action:before:hover,.ql-tooltip.ql-editing .ql-action:before:hover{background-color:#2b50c7;border-color:#294bbb;color:#fff}.btn-check:focus+.ql-tooltip .ql-action:before,.btn-check:focus+.ql-tooltip.ql-editing .ql-action:before,.ql-tooltip .ql-action:before:focus,.ql-tooltip.ql-editing .ql-action:before:focus{background-color:#2b50c7;border-color:#294bbb;box-shadow:none,0 0 0 0 rgba(82,118,237,.5);color:#fff}.btn-check:active+.ql-tooltip .ql-action:before,.btn-check:active+.ql-tooltip.ql-editing .ql-action:before,.btn-check:checked+.ql-tooltip .ql-action:before,.btn-check:checked+.ql-tooltip.ql-editing .ql-action:before,.ql-tooltip .ql-action:before.active,.ql-tooltip .ql-action:before:active,.ql-tooltip.ql-editing .ql-action:before.active,.ql-tooltip.ql-editing .ql-action:before:active,.show>.ql-tooltip .ql-action:before.dropdown-toggle,.show>.ql-tooltip.ql-editing .ql-action:before.dropdown-toggle{background-color:#294bbb;border-color:#2647b0;color:#fff}.btn-check:active+.ql-tooltip .ql-action:before:focus,.btn-check:active+.ql-tooltip.ql-editing .ql-action:before:focus,.btn-check:checked+.ql-tooltip .ql-action:before:focus,.btn-check:checked+.ql-tooltip.ql-editing .ql-action:before:focus,.ql-tooltip .ql-action:before.active:focus,.ql-tooltip .ql-action:before:active:focus,.ql-tooltip.ql-editing .ql-action:before.active:focus,.ql-tooltip.ql-editing .ql-action:before:active:focus,.show>.ql-tooltip .ql-action:before.dropdown-toggle:focus,.show>.ql-tooltip.ql-editing .ql-action:before.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(82,118,237,.5)}.ql-tooltip .ql-action:before.disabled,.ql-tooltip .ql-action:before:disabled,.ql-tooltip.ql-editing .ql-action:before.disabled,.ql-tooltip.ql-editing .ql-action:before:disabled{background-color:#335eea;border-color:#335eea;color:#fff}.ql-tooltip .ql-action:before{content:"Edit"}.ql-tooltip.ql-editing .ql-action:before{content:"Save"}.ql-tooltip .ql-remove:before{background-color:#fff;border-color:#d9e2ef;box-shadow:none;color:#1b2a4e;content:"Remove"}.ql-tooltip .ql-remove:before:hover{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-check:focus+.ql-tooltip .ql-remove:before,.ql-tooltip .ql-remove:before:focus{background-color:#fff;border-color:#fff;box-shadow:none,0 0 0 0 rgba(221,223,228,.5);color:#1b2a4e}.btn-check:active+.ql-tooltip .ql-remove:before,.btn-check:checked+.ql-tooltip .ql-remove:before,.ql-tooltip .ql-remove:before.active,.ql-tooltip .ql-remove:before:active,.show>.ql-tooltip .ql-remove:before.dropdown-toggle{background-color:#fff;border-color:#fff;color:#1b2a4e}.btn-check:active+.ql-tooltip .ql-remove:before:focus,.btn-check:checked+.ql-tooltip .ql-remove:before:focus,.ql-tooltip .ql-remove:before.active:focus,.ql-tooltip .ql-remove:before:active:focus,.show>.ql-tooltip .ql-remove:before.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(221,223,228,.5)}.ql-tooltip .ql-remove:before.disabled,.ql-tooltip .ql-remove:before:disabled{background-color:#fff;border-color:#fff;color:#1b2a4e}.ql-tooltip.ql-editing .ql-remove:before{display:none}.ql-editor blockquote{font-size:1.25rem;margin-bottom:1rem}.ql-editor img{height:auto;max-width:100%}.navbar-brand-img{max-height:3rem}.list-payment-icon{max-width:2.5rem} +/*# sourceMappingURL=theme.bundle.css.map*/ \ No newline at end of file diff --git a/public/front/assets/css/theme.bundle.css.map b/public/front/assets/css/theme.bundle.css.map new file mode 100644 index 0000000..554a4d2 --- /dev/null +++ b/public/front/assets/css/theme.bundle.css.map @@ -0,0 +1 @@ +{"version":3,"file":"./css/theme.bundle.css","mappings":"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,CkBIb,wBlBFgB,CGMd,qBHyIoB,CQ9IlB,eR0TiB,CkB5TrB,alBSa,CkBhBb,aAAc,CnBgSV,mBAvE+B,CmBpNnC,elBmLsB,CkBlLtB,elBsLoB,CkB1LpB,wBlB2R2B,CmBlRvB,qEDVJ,UjB82BgG,CkBh2B5F,uCDhBN,cCiBQ,eAAgB,CD2FvB,CA5GD,yBAqBI,eAAgB,CArBpB,wDAwBM,cAAe,CAxBrB,oBA+BI,qBlBxBW,CkByBX,oBlBba,CQTX,qBUoBF,alBbW,CkBgBX,SlBmQ6B,CkBpSjC,2CA+CI,YAAmE,CA/CvE,gCAoDI,alBvCc,CkByCd,SAAU,CAtDd,oCAoDI,alBvCc,CkByCd,SAAU,CAtDd,2BAoDI,alBvCc,CkByCd,SAAU,CAtDd,+CAgEI,wBlBvDc,CkB0Dd,SAAU,CAnEd,oCA0EI,0BlBoNyB,CoB9R3B,wBpBQgB,CkBwEd,cAAe,CAFf,oBAAqB,CAGrB,2BlBmEc,CkBlEd,eAAgB,CAPhB,alB1DW,CkBwDX,yBlBqNyB,CkBpNzB,yBlBoNyB,CkBtNzB,wBlBsNyB,CkBjNzB,mBAAoB,CCjElB,6HlBqxB6I,CkBjxB7I,uCDhBN,0CCiBQ,uBAAY,CAAZ,eAAgB,CDjBxB,oCCiBQ,eAAgB,CDmErB,CApFH,yEAuFI,wBhBwHiC,CgB/MrC,0CA6FI,0BlBiMyB,CoB9R3B,wBpBQgB,CkB2Fd,cAAe,CAFf,oBAAqB,CAGrB,2BlBgDc,CkB/Cd,eAAgB,CAPhB,alB7EW,CkB2EX,yBlBkMyB,CkBjMzB,yBlBiMyB,CkBnMzB,wBlBmMyB,CkB9LzB,mBAAoB,CCpFlB,qIlBqxBkI,CkBrxBlI,6HlBqxB6I,CkBjxB7I,uCDhBN,0CCiBQ,uBAAY,CAAZ,eAAgB,CDsFrB,CAvGH,+EA0GI,wBhBqGiC,CgBpGlC,wBAeD,4BAA6B,CAE7B,4CAHA,alBxGa,CkBmGb,aAAc,CAId,elBqEoB,CkBtEpB,eAAgB,CADhB,kBAA2B,CAD3B,UAOmC,CATrC,gFAcI,eADA,eACe,CAChB,iBfnHC,sBJkRE,mBAvE+B,CmB7EnC,uChByF8D,CgBxF9D,qBlBUsB,CkBZxB,uCASI,uBlBkJqB,CkBnJrB,sBlBmJyB,CkBlJzB,uBAFA,qBlBoJyB,CkB3J7B,6CAeI,uBlB4IqB,CkB7IrB,sBlB6IyB,CkB5IzB,uBAFA,qBlB8IyB,CkB3I1B,iBf7IC,sBJkRE,mBAvE+B,CmB1DnC,uChBsE8D,CgBrE9D,uBlBTsB,CkBOxB,uCASI,yBlBoIqB,CkBrIrB,wBlBqI2B,CkBpI3B,yBAFA,uBlBsI2B,CkB7I/B,6CAeI,yBlB8HqB,CkB/HrB,wBlB+H2B,CkB9H3B,yBAFA,uBlBgI2B,CkB7H5B,sBAQC,uChB+C4D,CgBjDhE,yBAMI,uChB2C4D,CgBjDhE,yBAUI,uChBuC4D,CgBtC7D,oBAMD,WAAY,CACZ,iBAFA,UlBwF4B,CkBzF9B,mDAMI,cAAe,CANnB,uCfrLI,sBe+LA,YlBtDoB,CkB4CxB,0CfrLI,sBeoMA,YlB3DoB,CkB6DrB,aG/MD,sCnBwP8D,CmBzO9D,uBAAY,CAAZ,oBAAY,CAAZ,gBATA,qBrBLa,CqBMb,wQnBsHgF,CmBpHhF,wCpBg7BqE,CoBj7BrE,2BAA4B,CAE5B,uBrB+V2B,CqB9V3B,wBrBRgB,CGMd,qBHyIoB,CQ9IlB,eR0TiB,CqBzTrB,arBMa,CqBfb,aAAc,CtB+RV,mBAvE+B,CsBjNnC,erBgLsB,CqB/KtB,erBmLoB,CqBzLpB,wBrB0R2B,CmBlRvB,oElBo2B4F,CoB72BhG,UAkBgB,CFLZ,uCEfN,aFgBQ,eAAgB,CEkCvB,CAlDD,mBAuBI,oBrBLa,CQTX,qBaeF,SrB2Q6B,CqBnSjC,0DAoCI,sBADA,qBACsB,CApC1B,sBAyCI,wBrBjCc,CqBRlB,4BA+CI,iBAAkB,CAClB,yBrBhCW,CqBiCZ,gBtB+OG,oBsB1OJ,uBrB+O+B,CqB9O/B,iBrB+O2B,CqBjP3B,oBtBoKmC,CsBhKpC,gBtBuOK,oBsBnOJ,uBrB6O+B,CqB5O/B,mBrB6O6B,CqB/O7B,oBtB6JmC,CsBzJpC,YChEC,aAAc,CAGd,sBAFA,iBrBq3B2E,CqBp3B3E,mBrBs3B+C,CqBz3BjD,8BAOI,UAAW,CACX,mBAA2C,CAC5C,kBAcD,gCAAc,CADd,uBAAgB,CAAhB,oBAAgB,CAAhB,eAAgB,CALhB,wBtBPgB,CsBShB,uBAA2B,CAD3B,2BAA4B,CAE5B,uBAAwB,CACxB,kBtB+TmC,CsB7TnC,mBATA,UrBw2B2C,CqBv2B3C,eAA8D,CAC9D,kBAAmB,CAHnB,SAUmB,CAXrB,iCnBGI,qBHyIoB,CsB5IxB,8BAoBI,iBrBm2ByC,CqBv3B7C,yBAwBI,WtB0SiC,CsBlUrC,wBA4BI,wBtB4SiC,CsB1SjC,gBADA,StB8SoC,CsB3UxC,0BAkCI,wBtB3Ba,CsB4Bb,oBtB5Ba,CsBPjB,yCAyCQ,4PpB8E0E,CoBvHlF,sCAiDQ,oKpBsE0E,CoBvHlF,+CAuDI,wBtBhDa,CsBsDX,uPALF,oBpB+D8E,CoBvHlF,2BAmEI,WAAY,CACZ,WAFA,mBrBo0ByC,CqBt4B7C,2FA4EM,UrB0zBuC,CqBzzBxC,kBAMH,ctBkP+B,CsBjPhC,aAOC,iBtB2PoD,CsB5PtD,+BAMI,oKpBuB8E,CoBtB9E,qBAAgC,CnB9FhC,oBHkVsB,CsBtPtB,iBAA4C,CH/F1C,gDG8FF,YrBqzBkE,CkB/4BhE,uCGsFN,+BHrFQ,eAAgB,CG6GrB,CAxBH,4EAYM,oKpBiB4E,CoB7BlF,uCAgBM,wBpBa4E,CoBN7E,mBAKH,oBAAqB,CACrB,iBrBmxBoC,CqBlxBrC,WAIC,kBAAsB,CACtB,oBAFA,iBAEoB,CAHtB,mDASM,WAAY,CACZ,YAFA,mBrBuoB2B,CqBpoB5B,YC1IH,uBAAY,CAAZ,oBAAY,CAAZ,gBADA,4BAA6B,CAF7B,WrB+N2B,CqB9N3B,SAAU,CAFV,UAIgB,CALlB,kBAQI,SAAU,CARd,wCAY8B,8BvBsRG,CuBlSjC,oCAa8B,8BvBqRG,CuBlSjC,8BAiBI,QAAS,CAjBb,kCA6BI,uBAAY,CAAZ,gBH/BF,wBpBmBe,CuBQb,QtB48BwC,CEx9BxC,kBFy9B2C,CO99BzC,2CROS,CuBOX,WtB48B2C,CsB38B3C,kBAAsE,CJbpE,8GlBk+BkI,CkBl+BlI,sGlBk+BkI,CsBv9BpI,UAQgB,CJfd,uCIdN,kCJeQ,uBAAY,CAAZ,eAAgB,CImBrB,CAlCH,yCHFE,wBlB0MmC,CqBxMrC,2CAyCI,wBvBjCc,CuBkCd,wBAAyB,CpB7BzB,kBFk9BkC,COv9BhC,+Ce+BF,iBAAkB,CAClB,ctBq7BqC,CsBv7BrC,YtBs7BmC,CsBv7BnC,UvBtBW,CuBff,8BAuDI,oBAAY,CAAZ,gBHzDF,wBpBmBe,CuBkCb,QtBk7BwC,CEx9BxC,kBFy9B2C,CO99BzC,2CROS,CuBkCX,WtBi7B2C,CkBx9BzC,2GlBk+BkI,CkBl+BlI,sGlBk+BkI,CsB57BpI,UAOgB,CJzCd,uCIdN,8BJeQ,oBAAY,CAAZ,eAAgB,CI6CrB,CA5DH,qCHFE,wBlB0MmC,CqBxMrC,8BAmEI,wBvB3Dc,CuB4Dd,wBAAyB,CpBvDzB,kBFk9BkC,COv9BhC,+CeyDF,iBAAkB,CAClB,ctB25BqC,CsB75BrC,YtB45BmC,CsB75BnC,UvBhDW,CuBff,qBA0EI,mBAAoB,CA1ExB,2CA6EM,wBvBnEY,CuBVlB,uCAiFM,wBvBvEY,CuBwEb,eCvFH,iBAAkB,CADpB,yDAKI,yBtBqO4D,CsBpO5D,gBvBu/BkC,CuB7/BtC,qBAgBI,4BAA6C,CAH7C,WAAY,CADZ,MAAO,CAEP,oBxBoRyB,CwBnRzB,mBAAoB,CALpB,iBAAkB,CAClB,KAAM,CAMN,oBAAqB,CLDnB,4DlBo/B8E,CkBh/B9E,uCKpBN,qBLqBQ,eAAgB,CKFrB,CAnBH,6BAuBI,oBxB2QyB,CwBlS7B,+CA0BM,iBAAkB,CA1BxB,mDA0BM,iBAAkB,CA1BxB,0CA0BM,iBAAkB,CA1BxB,0DAgCM,uBADA,oBvBk+BmC,CuBjgCzC,yDAgCM,uBADA,oBvBk+BmC,CuBjgCzC,wFAgCM,uBADA,oBvBk+BmC,CuBjgCzC,8CAqCM,uBADA,oBvB69BmC,CuBjgCzC,4BA2CI,uBADA,oBvBu9BqC,CuBjgCzC,gEAkDM,SxB4UyB,CwB3UzB,4BxB4U4C,CwB/XlD,+DAkDM,SxB4UyB,CwB3UzB,4BxB4U4C,CwB/XlD,sIAkDM,SxB4UyB,CwB3UzB,4BxB4U4C,CwB/XlD,oDAyDM,SxBqUyB,CwBpUzB,4BxBqU4C,CwBpU7C,aCnDH,mBAAoB,CAFpB,YAAa,CACb,cAAe,CAFf,iBAAkB,CAIlB,UAAW,CALb,qDAUI,aAAc,CAEd,YAHA,iBAAkB,CAElB,QACY,CAZhB,iEAkBI,SAAU,CAlBd,kBAyBI,iBAAkB,CAClB,SAAU,CA1Bd,wBA6BM,SAAU,CACX,kBAYH,kBAAmB,CAQnB,qBzB3Ca,CyB4Cb,wBzB1CgB,CGMd,sBsBgCF,azBlCgB,CyB4BhB,YAAa,C1BwPT,mBAvE+B,C0B7KnC,ezB4IsB,CyB3ItB,ezB+IoB,CyBlJpB,wBzBmP2B,CyB9O3B,iBAAkB,CAClB,kBzBuGsB,CyBnGvB,kHtBtCG,sBJkRE,mBAvE+B,C0BzJnC,uBzBuFsB,CyBpFvB,kHtBrDG,sBJkRE,mBAvE+B,C0BhJnC,qBzB8EsB,CyB3EvB,0DAIC,oBAAsE,CAWxE,iUtB5DI,6BADA,yBsBwE8B,CAXlC,0ItB9CI,4BADA,wBsBqE8B,CAD9B,gBAC8B,CAF4B,gBCrF1D,cALA,YAAa,C3B2QX,eAvE+B,C2BlMjC,iBzByxB0C,CyB1xB1C,U1BDa,C0BMd,eAaC,oC1BnBa,CGPb,sBuByBA,U1BjCW,C0B2BX,YAAa,C3B+PX,kBAvE+B,C2BrLjC,gBAAiB,CAFjB,cAAe,CACf,oBzB4vC4C,CyBjwC5C,iBAAkB,CAClB,QAAS,CACT,S1BuHoB,C0BtJpB,8HA8CE,aAAc,CA9ChB,0DAoDE,oB1BhCW,C0BpBb,sEA+DI,oB1B3CS,C0B4CT,uC1B5CS,C0BpBb,wDAiFE,oB1B7DW,C0BpBb,oEA8FI,oB1B1ES,C0B2ET,uC1B3ES,C0BpBb,kEAsGE,oB1BlFW,C0BpBb,kFAyGI,wB1BrFS,C0BpBb,8EA6GI,uC1BzFS,C0BpBb,sGAiHI,a1B7FS,C0B8FV,qDAKD,gBAAiB,CAvHnB,sKA+HI,SAAU,CA/Hd,8LAoII,SAAU,CACX,kBA5GH,cALA,YAAa,C3B2QX,eAvE+B,C2BlMjC,iBzByxB0C,CyB1xB1C,U1BEY,C0BGb,iBAaC,mC1BhBY,CGVZ,sBuByBA,U1BjCW,C0B2BX,YAAa,C3B+PX,kBAvE+B,C2BrLjC,gBAAiB,CAFjB,cAAe,CACf,oBzB4vC4C,CyBjwC5C,iBAAkB,CAClB,QAAS,CACT,S1BuHoB,C0BtJpB,8IA8CE,aAAc,CA9ChB,8DAoDE,oB1B7BU,C0BvBZ,0EA+DI,oB1BxCQ,C0ByCR,sC1BzCQ,C0BvBZ,4DAiFE,oB1B1DU,C0BvBZ,wEA8FI,oB1BvEQ,C0BwER,sC1BxEQ,C0BvBZ,sEAsGE,oB1B/EU,C0BvBZ,sFAyGI,wB1BlFQ,C0BvBZ,kFA6GI,sC1BtFQ,C0BvBZ,0GAiHI,a1B1FQ,C0B2FT,uDAKD,gBAAiB,CAvHnB,8KAiII,SAAU,CAjId,sMAoII,SAAU,CACX,KC3HL,4BAA6B,CAC7B,4BAA2C,CxBEzC,qBHyIoB,C2BnJtB,a3BYa,C2BPb,cAA2C,CAT3C,oBAAqB,C5BgSjB,mBAvE+B,C4BvNnC,e3BuLoB,C2BtLpB,e3ByLoB,C4BlEpB,wB5BmK2B,C2BxR3B,iBAAkB,CRMd,8HQDJ,wBAAiB,CAAjB,qBAAiB,CAAjB,oBAAiB,CAAjB,gBAAiB,CAFjB,qB1BwxBiJ,CkBjxB7I,uCQhBN,KRiBQ,eAAgB,CQ6BvB,CA9CD,WAkBI,a3BDW,C2BEX,oBAA6D,CAC9D,iCAKC,gBADA,S3B4Q6B,C2B1Q9B,uEnBhBG,eR6SsB,C2B3R1B,+FnBlBI,oBR6SsB,C2BvT5B,mDnBUM,gBmBiCF,W1B0uB6B,C0B3uB7B,mBAEwB,CACzB,aP7CD,wBpBmBe,C4BDf,oB5BCe,CQTX,gBoBMJ,U5BsSmB,C4B7RlB,oERzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,iDpBfG,2CoBuB0F,CAK7F,0IAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,wKpB9BI,2CoB2CmG,CAKpG,4CAMD,wB5B7Ca,C4BgDb,qBAJA,U5B5Ca,C4BiDd,eRpED,wBpBcgB,C4BIhB,oB5BJgB,CQJZ,gBoBMJ,U5BsSmB,C4B7RlB,0ERzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,qDpBfG,4CoBuB0F,CAK7F,oJAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,kLpB9BI,4CoB2CmG,CAKpG,gDAMD,wB5BlDc,C4BqDd,qBAJA,U5BjDc,C4BsDf,aRpED,wBpBsBe,C4BJf,oB5BIe,CQZX,gBoBMJ,U5BsSmB,C4B7RlB,oERzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,iDpBfG,2CoBuB0F,CAK7F,0IAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,wKpB9BI,2CoB2CmG,CAKpG,4CAMD,wB5B1Ca,C4B6Cb,qBAJA,U5BzCa,C4B8Cd,URpED,wBpBuBY,C4BLZ,oB5BKY,CQbR,gBoBMJ,U5BsSmB,C4B7RlB,2DRzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,2CpBfG,4CoBuB0F,CAK7F,2HAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,yJpB9BI,4CoB2CmG,CAKpG,sCAMD,wB5BzCU,C4B4CV,qBAJA,U5BxCU,C4B6CX,aRpED,wBpBwBe,C4BNf,oB5BMe,CQdX,gBoBMJ,a5BsSmB,C4B7RlB,oERzBD,wBlB0MmC,C0BlLjC,qBAFA,aAW4F,CAR7F,iDpBfG,4CoBuB0F,CAK7F,0IAQC,wB1B4JiC,C0BzJjC,qBAJA,a1B6JiC,C0BlKnC,wKpB9BI,4CoB2CmG,CAKpG,4CAMD,wB5BxCa,C4B2Cb,qBAJA,a5BvCa,C4B4Cd,YRpED,wBpByBc,C4BPd,oB5BOc,CQfV,gBoBMJ,U5BsSmB,C4B7RlB,iERzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,+CpBfG,2CoBuB0F,CAK7F,qIAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,mKpB9BI,2CoB2CmG,CAKpG,0CAMD,wB5BvCY,C4B0CZ,qBAJA,U5BtCY,C4B2Cb,WRpED,wBpBQgB,C4BUhB,oB5BVgB,CQEZ,gBoBMJ,a5BsSmB,C4B7RlB,8DRzBD,wBlB0MmC,C0BlLjC,qBAFA,aAW4F,CAR7F,6CpBfG,4CoBuB0F,CAK7F,gIAQC,wB1B4JiC,C0BzJjC,qBAJA,a1B6JiC,C0BlKnC,8JpB9BI,4CoB2CmG,CAKpG,wCAMD,wB5BxDc,C4B2Dd,qBAJA,a5BvDc,C4B4Df,URpED,wBpBgBgB,C4BEhB,oB5BFgB,CQNZ,gBoBMJ,U5BsSmB,C4B7RlB,2DRzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,2CpBfG,0CoBuB0F,CAK7F,2HAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,yJpB9BI,0CoB2CmG,CAKpG,sCAMD,wB5BhDc,C4BmDd,qBAJA,U5B/Cc,C4BoDf,mBRpED,wBpBqBqB,C4BHrB,oB5BGqB,CQXjB,gBoBMJ,U5BsSmB,C4BjSnB,yBRrBA,wBlB+MmC,C0BvLjC,qBAFA,U1ByLiC,C0BtLlC,6DRzBD,wBlB+MmC,C0BhLjC,oB1BgLiC,CMrM/B,6CoBmBF,UAI4F,CAK7F,wKAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,sMpB9BI,4CoB2CmG,CAKpG,wDAMD,wB5B3CmB,C4B8CnB,qBAJA,U5B1CmB,C4B+CpB,WRpED,wBpBiBa,C4BCb,oB5BDa,CQPT,gBoBMJ,U5BsSmB,C4B7RlB,8DRzBD,wBlB+MmC,C0BvLjC,qBAFA,UAW4F,CAR7F,6CpBfG,yCoBuB0F,CAK7F,gIAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,8JpB9BI,yCoB2CmG,CAKpG,wCAMD,wB5B/CW,C4BkDX,qBAJA,U5B9CW,C4BmDZ,WAlDD,iB5BXa,CQGT,gBoBMJ,a5BsSmB,C4B7RlB,8DRzBD,qBlB0MmC,C0BlLjC,kBAFA,aAW4F,CAR7F,6CpBfG,4CoBuB0F,CAK7F,gIAQC,qB1B4JiC,C0BzJjC,kBAJA,a1B6JiC,C0BlKnC,8JpB9BI,4CoB2CmG,CAKpG,wCAMD,qB5BzDW,C4B4DX,kBAJA,a5BxDW,C4B6DZ,qBAaD,qBADA,a5B7De,C4BgEf,2BAEE,wB5BlEa,C4BmEb,qBAFA,U5BjEa,C4BoEd,iEAIC,qC5BxEa,C4ByEd,iLAQC,wB5BjFa,C4BkFb,qBAFA,U5BhFa,C4B2Ef,+MpBpFI,0CRSW,C4B2FZ,4DAMD,6BADA,aAC6B,CAC9B,uBApCD,qBADA,a5BlEgB,C4BqEhB,6BAEE,wB5BvEc,C4BwEd,qBAFA,U5BtEc,C4ByEf,qEAIC,sC5B7Ec,C4B8Ef,2LAQC,wB5BtFc,C4BuFd,qBAFA,U5BrFc,C4BgFhB,yNpBpFI,2CRIY,C4BgGb,gEAMD,6BADA,aAC6B,CAC9B,qBApCD,qBADA,a5B1De,C4B6Df,2BAEE,wB5B/Da,C4BgEb,qBAFA,U5B9Da,C4BiEd,iEAIC,sC5BrEa,C4BsEd,iLAQC,wB5B9Ea,C4B+Eb,qBAFA,U5B7Ea,C4BwEf,+MpBpFI,2CRYW,C4BwFZ,4DAMD,6BADA,aAC6B,CAC9B,kBApCD,qBADA,a5BzDY,C4B4DZ,wBAEE,wB5B9DU,C4B+DV,qBAFA,U5B7DU,C4BgEX,2DAIC,uC5BpEU,C4BqEX,kKAQC,wB5B7EU,C4B8EV,qBAFA,U5B5EU,C4BuEZ,gMpBpFI,4CRaQ,C4BuFT,sDAMD,6BADA,aAC6B,CAC9B,qBApCD,qBADA,a5BxDe,C4B2Df,2BAEE,wB5B7Da,C4B8Db,qBAFA,a5B5Da,C4B+Dd,iEAIC,uC5BnEa,C4BoEd,iLAQC,wB5B5Ea,C4B6Eb,qBAFA,a5B3Ea,C4BsEf,+MpBpFI,4CRcW,C4BsFZ,4DAMD,6BADA,aAC6B,CAC9B,oBApCD,qBADA,a5BvDc,C4B0Dd,0BAEE,wB5B5DY,C4B6DZ,qBAFA,U5B3DY,C4B8Db,+DAIC,qC5BlEY,C4BmEb,4KAQC,wB5B3EY,C4B4EZ,qBAFA,U5B1EY,C4BqEd,0MpBpFI,0CReU,C4BqFX,0DAMD,6BADA,aAC6B,CAC9B,mBApCD,qBADA,a5BxEgB,C4B2EhB,yBAEE,wB5B7Ec,C4B8Ed,qBAFA,a5B5Ec,C4B+Ef,6DAIC,uC5BnFc,C4BoFf,uKAQC,wB5B5Fc,C4B6Fd,qBAFA,a5B3Fc,C4BsFhB,qMpBpFI,4CRFY,C4BsGb,wDAMD,6BADA,aAC6B,CAC9B,kBApCD,qBADA,a5BhEgB,C4BmEhB,wBAEE,wB5BrEc,C4BsEd,qBAFA,U5BpEc,C4BuEf,2DAIC,oC5B3Ec,C4B4Ef,kKAQC,wB5BpFc,C4BqFd,qBAFA,U5BnFc,C4B8EhB,gMpBpFI,yCRMY,C4B8Fb,sDAMD,6BADA,aAC6B,CAC9B,2BApCD,qBADA,a5B3DqB,C4B8DrB,iCAEE,wB5BhEmB,C4BiEnB,qBAFA,U5B/DmB,C4BkEpB,6EAIC,uC5BtEmB,C4BuEpB,+MAQC,wB5B/EmB,C4BgFnB,qBAFA,U5B9EmB,C4ByErB,6OpBpFI,4CRWiB,C4ByFlB,wEAMD,6BADA,aAC6B,CAC9B,mBApCD,qBADA,a5B/Da,C4BkEb,yBAEE,wB5BpEW,C4BqEX,qBAFA,U5BnEW,C4BsEZ,6DAIC,oC5B1EW,C4B2EZ,uKAQC,wB5BnFW,C4BoFX,qBAFA,U5BlFW,C4B6Eb,qMpBpFI,yCROS,C4B6FV,wDAMD,6BADA,aAC6B,CAC9B,mBApCD,kBADA,U5BzEa,C4B4Eb,yBAEE,qB5B9EW,C4B+EX,kBAFA,a5B7EW,C4BgFZ,6DAIC,uC5BpFW,C4BqFZ,uKAQC,qB5B7FW,C4B8FX,kBAFA,a5B5FW,C4BuFb,qMpBpFI,4CRHS,C4BuGV,wDAMD,6BADA,UAC6B,CAC9B,UD1CD,a3BxDe,C2BuDf,e3B+GsB,C2B7GtB,oB3BoCoB,C2BvCtB,gBAMI,a3BkC6B,C2BxCjC,gCAOI,yB3BiC6B,C2BxCjC,sCAgBI,a3B5Ec,C2B6Ef,2BxB3EC,sBJkRE,mBAvE+B,C6B/FnC,uB5B6BsB,C2BlDvB,2BxBvFG,sBJkRE,mBAvE+B,C6B/FnC,qB5B6BsB,C2B9CvB,MR9FK,8BlByhB2C,CkBrhB3C,uCUpBN,MVqBQ,eAAgB,CUfvB,CAND,iBAII,SAAU,CACX,qBAMC,YAAa,CACd,YAID,QAAS,CACT,eAAgB,CVDZ,2BlB2hBwC,CkBvhBxC,uCULN,YVMQ,eAAgB,CUIvB,CAVD,gCAOI,WAAY,CVNV,2BUKF,O5BuhByC,CkBxhBvC,uCULN,gCVMQ,eAAgB,CUGrB,CCvBH,sCAIE,iBAAkB,CL6FG,iBKzFrB,kBAAmB,CCqBjB,uBA1BF,eAAgB,CAChB,mCAFA,mCAA4C,CAD5C,qBAA8B,CAgC1B,UAAW,CAHX,oBAAqB,CACrB,kB9BqgB0C,C8BpgB1C,qBA5BuC,CAqCxC,6BAiBC,aAAc,CACf,eDhCH,2BAA4B,CAD5B,qB9BhBa,C8BkBb,iC9BRa,CGFX,qBHyIoB,CQ9IlB,4CsBUJ,a9BHa,C8BFb,YAAa,C/BkRT,kBAvE+B,C+BpMnC,eAAgB,CAJhB,QAAS,CAFT,e9ByYwB,C8BxYxB,wB9BuZ+B,C8B3Z/B,iBAAkB,CAQlB,eAAgB,CAPh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ftB,wBAmBQ,cADA,aACc,CAnBtB,mChC3HI,6BADA,yBgCqJkC,CAzBtC,iGA8BY,yBAA0B,CA9BtC,oGAmCY,4BAA6B,CAnCzC,oChC7GI,4BADA,wBgCsJoC,CAxCxC,mGA6CY,wBAAyB,CA7CrC,sGAkDY,2BAA4B,CAC7B,CC9MX,kBAGE,kBAAmB,CAMnB,qBpCFa,CoCGb,QAAS,CjCKP,eiCJsB,CAJxB,apCUa,CoCfb,YAAa,CrC+RT,mBAvE+B,CqC9MnC,oBAAqB,CAPrB,mBpCicwB,CoCrcxB,iBAAkB,CAOlB,eAAgB,CjBIZ,sJiBRJ,UnCiwCgF,CkBrvC5E,uCiBhBN,kBjBiBQ,eAAgB,CiBgCvB,CAjDD,kCAiBI,qBpCVW,CoCWX,kCAFA,apCPc,CoCTlB,wCAsBM,yBnC0vCmD,CmChxCzD,gEAqBM,8SnC0vC6D,CmC/wCnE,wBAkCI,2BAA4B,CAC5B,sBpC0ayB,CoC7azB,UAAW,CAJX,aAAc,CAEd,apC+ayB,CoC9azB,gBAAiB,CjBnBf,qCiBiBF,YnCkvC+D,CkB/vC7D,uCiBhBN,wBjBiBQ,eAAgB,CiBoBrB,CArCH,wBAwCI,SAAU,CAxCd,wBA6CI,oBpC1Ba,CoC4Bb,gBADA,SAAU,CAFV,SpC+ZoC,CoC3ZrC,kBAID,eAAgB,CACjB,gBAGC,qBpCjDa,CoCkDb,wBpChDgB,CoC8ClB,8BjC/BI,8BHgIoB,CG/HpB,+BH+HoB,CoCjGxB,gDjC/BI,0CDsO4D,CCrO5D,2CDqO4D,CkCvMhE,oCAaI,YAAa,CAbjB,6BjChBI,kCADA,kCHkHoB,CoCjGxB,yDjChBI,8CADA,8CDwN4D,CkCvMhE,iDjChBI,kCADA,kCHkHoB,CoCrEnB,gBAKH,mBpC8WwB,CoC7WzB,qCASG,cAAe,CAFnB,iCAOI,aAAc,CjCxFd,gBiCuFA,cAEwB,CAR5B,6CAUoB,YAAa,CAVjC,4CAWmB,eAAgB,CAI9B,+DjChGD,eHygBwB,CoCzavB,YC5GH,4BrCkhByB,CqCxhBzB,YAAa,CACb,cAAe,CtCmSX,kBAvE+B,CsCxNnC,eAAgB,CAFhB,erCohB0B,CqCrhB1B,gBrCyhB0B,CqCnhB3B,kCAKG,kBpC2+CqC,CoC9+CzC,yCAQM,arCDY,CqCEZ,wCAAS,CAHT,UAAW,CACX,mBAEyO,CAT/O,wBAcI,arCPc,CqCQf,YCzBD,YAAa,CjCIb,gBADA,cACgB,CiCFjB,WAOC,qBtCCa,CsCAb,wBtCGgB,CsCNhB,atCee,CsChBf,aAAc,CADd,iBAAkB,CnBUd,6HlBksCoJ,CkB9rCpJ,uCmBfN,WnBgBQ,eAAgB,CmBQvB,CAxBD,iBAcI,qBAFA,oBAA6D,CAF7D,StCDc,CsCTlB,kCAaI,wBtCLc,CsCGd,atCwR6B,CsCnSjC,iBAsBI,gBADA,SrC0qCiC,CqC7qCjC,StCiR6B,CsC5Q9B,wCAKC,gBtCuHc,CsCzHlB,6BlB3BE,wBpBmBe,CsCiBb,qBAFA,UtC3BW,CsC0BX,StCda,CsCQjB,+BAeI,qBtCnCW,CsCoCX,qBAHA,atC3Bc,CsC4Bd,mBtC/Bc,CsCTlB,WCAI,wBvC6RyB,CuC3R1B,kCpC2CC,kCADA,8BH2GoB,CuCnJtB,iCpC2BE,mCADA,+BHyHoB,CuCxJtB,0BxCiSI,oBwChSF,uBxCyNiC,CwCvNlC,iDpC2CC,gCADA,4BH4GqB,CuC/IhB,gDpCsBL,iCADA,6BH0HqB,CuCzJvB,0BxCiSI,mBwChSF,qBxCyNiC,CwCvNlC,iDpC2CC,iCADA,6BH0GqB,CuC7IhB,gDpCsBL,kCADA,8BHwHqB,CuCvIhB,OpCDL,sBqCRF,UxCAa,CwCLb,oBAAqB,CzC+RjB,eAvE+B,CyCrNnC,exCqLoB,CwCpLpB,aAAc,CAHd,qBxC0esB,CwCretB,iBAAkB,CAElB,uBAAwB,CADxB,kBxC+IsB,CwCvJxB,aAeI,YAAa,CACd,YAKD,iBAAkB,CAClB,QAAS,CACV,OCpBC,4BAA6C,CtCW3C,sBsCZF,kBxCg6CkC,CwCj6ClC,sBzC0fuB,CyC3fvB,iBzCuJsB,CyClJvB,eAKC,aAAc,CACf,YAIC,ezC0KoB,CyCzKrB,mBAQC,qBxCi5CkD,CwCl5CpD,8BASI,yBAJA,iBAAkB,CAElB,OAAQ,CADR,KAAM,CAEN,SzC4dqB,CyC1dtB,eCpCD,axC4MmC,CwCxMnC,2BACE,axC4MiC,CwC3MlC,iBAND,axC4MmC,CwCxMnC,6BACE,axC4MiC,CwC3MlC,eAND,axC4MmC,CwCxMnC,2BACE,axC4MiC,CwC3MlC,YAND,axC4MmC,CwCxMnC,wBACE,axC4MiC,CwC3MlC,eAND,axC4MmC,CwCxMnC,2BACE,axC4MiC,CwC3MlC,cAND,axC4MmC,CwCxMnC,0BACE,axC4MiC,CwC3MlC,aAND,axC4MmC,CwCxMnC,yBACE,axC4MiC,CwC3MlC,YAND,axC4MmC,CwCxMnC,wBACE,axC4MiC,CwC3MlC,qBAND,axC4MmC,CwCxMnC,iCACE,axC4MiC,CwC3MlC,aAND,axC4MmC,CwCxMnC,yBACE,axC4MiC,CwC3MlC,aAND,UxC4MmC,CwCxMnC,yBACE,axC4MiC,CwC3MlC,wCCHC,GAAK,0B1Cg7C+B,EyC76CrC,gCCHC,GAAK,0B1Cg7C+B,E0C36CxC,UAKE,wB3CFgB,CGMd,qBHyIoB,CQ9IlB,+CTuRA,mBAvE+B,C4ClNnC,W3CSa,C2CHd,wBAPC,YAAa,CAEb,e1Cg7CgD,C0C36CjD,cAUC,wB3CLe,C2CEf,U3Cda,C2CWb,qBAAsB,CACtB,sBAAuB,CAGvB,iBAAkB,CxBVd,0BwBWJ,kB1Ck6CgD,CkBz6C5C,uCwBAN,cxBCQ,eAAgB,CwBSvB,CAED,sBvBYE,2KAA6I,CuBV7I,yB1Cm5CsC,C0Cl5CvC,uBAIG,yDAA0C,CAA1C,iDAA8D,CAG5D,uCAJJ,uBAKM,sBAAW,CAAX,cAAe,CAGpB,CC1CH,YzCeI,sByCdF,YAAa,CACb,qBAAsB,CAItB,eAAgB,CADhB,c5CmJsB,C4ChJvB,qBAIC,sBADA,oBACsB,CAFxB,+BAMI,kCAAoC,CACpC,yBAA0B,CAC3B,wBAWD,a5CfgB,C4CgBhB,mBAFA,UAEmB,CAHrB,4DAWI,yBAFA,a5CtBc,C4CuBd,oBAAqB,CAFrB,S5C3Bc,C4CmBlB,+BAgBI,yBADA,a5CjCc,C4CmCf,iBAcD,qB5CnDa,C4CoDb,yBAHA,a5CxCgB,C4CsChB,aAAc,CACd,mB5Cgd8B,C4Cld9B,iB5C5CgB,C4C2ClB,6BzC5BI,8ByCsCkC,CzCrClC,+ByCqCkC,CAVtC,4BzCbI,kCADA,kCyC4BqC,CAdzC,oDAqBI,sBAFA,a5C1Dc,C4C2Dd,mB5CjEW,C4C6Cf,wBA4BI,wB5C7Da,C4C8Db,qBAFA,U5CxEW,C4CuEX,S5C3Da,C4CiCjB,kCAiCI,kBAAmB,CAjCvB,yCAqCM,qBADA,e5C4DY,C4C1Db,uBAcC,kBAAmB,CADrB,oDzCjCA,iCHkFoB,CG9FpB,yByCmDsC,CANtC,mDzCjCA,4BAZA,+ByCwD2C,CAX3C,+CAeM,YAAa,CAfnB,yDAoBM,oBADA,oBACoB,CApB1B,gEAwBQ,sBADA,gB5CsBM,CUzFd,yBkC4CA,0BACE,kBAAmB,CADrB,uDzCjCA,iCHkFoB,CG9FpB,yByCmDsC,CANtC,sDzCjCA,4BAZA,+ByCwD2C,CAX3C,kDAeM,YAAa,CAfnB,4DAoBM,oBADA,oBACoB,CApB1B,mEAwBQ,sBADA,gB5CsBM,C4CpBP,ClCrEP,yBkC4CA,0BACE,kBAAmB,CADrB,uDzCjCA,iCHkFoB,CG9FpB,yByCmDsC,CANtC,sDzCjCA,4BAZA,+ByCwD2C,CAX3C,kDAeM,YAAa,CAfnB,4DAoBM,oBADA,oBACoB,CApB1B,mEAwBQ,sBADA,gB5CsBM,C4CpBP,ClCrEP,yBkC4CA,0BACE,kBAAmB,CADrB,uDzCjCA,iCHkFoB,CG9FpB,yByCmDsC,CANtC,sDzCjCA,4BAZA,+ByCwD2C,CAX3C,kDAeM,YAAa,CAfnB,4DAoBM,oBADA,oBACoB,CApB1B,mEAwBQ,sBADA,gB5CsBM,C4CpBP,ClCrEP,0BkC4CA,0BACE,kBAAmB,CADrB,uDzCjCA,iCHkFoB,CG9FpB,yByCmDsC,CANtC,sDzCjCA,4BAZA,+ByCwD2C,CAX3C,kDAeM,YAAa,CAfnB,4DAoBM,oBADA,oBACoB,CApB1B,mEAwBQ,sBADA,gB5CsBM,C4CpBP,ClCrEP,0BkC4CA,2BACE,kBAAmB,CADrB,wDzCjCA,iCHkFoB,CG9FpB,yByCmDsC,CANtC,uDzCjCA,4BAZA,+ByCwD2C,CAX3C,mDAeM,YAAa,CAfnB,6DAoBM,oBADA,oBACoB,CApB1B,oEAwBQ,sBADA,gB5CsBM,C4CpBP,CAaX,kBzC9HI,eyC+HsB,CAD1B,mCAII,oB5CGc,C4CPlB,8CAOM,qBAAsB,CCpJ1B,yBAEE,yBADA,a3CyMiC,C2C1MnC,4GAQM,yBADA,a3CwM6B,C2C/MnC,uDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,2BAEE,yBADA,a3CyMiC,C2C1MnC,gHAQM,yBADA,a3CwM6B,C2C/MnC,yDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,yBAEE,yBADA,a3CyMiC,C2C1MnC,4GAQM,yBADA,a3CwM6B,C2C/MnC,uDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,sBAEE,yBADA,a3CyMiC,C2C1MnC,sGAQM,yBADA,a3CwM6B,C2C/MnC,oDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,yBAEE,yBADA,a3CyMiC,C2C1MnC,4GAQM,yBADA,a3CwM6B,C2C/MnC,uDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,wBAEE,yBADA,a3CyMiC,C2C1MnC,0GAQM,yBADA,a3CwM6B,C2C/MnC,sDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,uBAEE,yBADA,a3CyMiC,C2C1MnC,wGAQM,yBADA,a3CwM6B,C2C/MnC,qDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,sBAEE,yBADA,a3CyMiC,C2C1MnC,sGAQM,yBADA,a3CwM6B,C2C/MnC,oDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,+BAEE,yBADA,a3CyMiC,C2C1MnC,wHAQM,yBADA,a3CwM6B,C2C/MnC,6DAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,uBAEE,yBADA,a3CyMiC,C2C1MnC,wGAQM,yBADA,a3CwM6B,C2C/MnC,qDAaM,wB3CkM6B,C2CjM7B,qBAFA,U3CmM6B,C2C/MnC,uBAEE,sBADA,U3CyMiC,C2C1MnC,wGAQM,yBADA,U3CwM6B,C2C/MnC,qDAaM,qB3CkM6B,C2CjM7B,kBAFA,U3CmM6B,C2ChM9B,WCRL,iYAA0F,CAC1F,QAAS,C3COP,qBHyIo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4E0EA,ehFmduB,CUpfrB,4BNzCF,W4E6EE,gBhFyd0B,CgFvd7B,C5E/EC,W4EkFA,ehF2cuB,CUpfrB,4BNzCF,W4EqFE,iBhFkd2B,CgFhd9B,C5EvFC,W4E0FA,ehFmcuB,CUpfrB,4BNzCF,W4E6FE,chF2cwB,CI/iB5B,M4E8GI,mBhFocyB,CgF5c5B,CAeD,gBACE,iBAAkB,CAClB,cAAe,CACf,UAAW,C5EtDb,mB4E0DE,YAAa,C5E1Df,0B4E6DI,YAAa,CACd,kBAQD,YADA,iBACY,CACb,OAMC,UAAW,CACZ,mBAGC,UAAyB,CAC1B,OAGC,WAAY,CAEb,mBAGC,UAAyB,ClFyH3B,KkFlHE,gBhFugBqB,CgFtgBtB,WCrLC,WAAY,CACZ,6BAFA,WAE6B,CAC9B,8BAOC,eADA,iBACe,C3EQjB,Q2EFE,aAAc,C3EOhB,Y2EHE,kBjF6CW,CiF5CZ,mBCtBC,qBADA,qBAAqC,CAFrC,iBAAkB,CAClB,SAEoC,CACrC,aAGC,iBAAkB,CACnB,gECHG,qBAAsB,C3DX1B,qB4DME,apFWgB,CwBjBlB,gE4DYE,gBpF6KoB,CwBzLtB,+D4DYE,gBpF6KoB,CwBzLtB,sI4DYE,gBpF6KoB,CsBrLtB,Y+DME,eAAgB,CACjB,wBAGC,kBpF+2B+C,CoF92BhD,mCAKC,qCrFTa,CqFUd,2CAGC,qBrFba,CsB+Ff,a+DzEE,mBrFslB+B,CqFrlBhC,+BAGC,erFklB+B,CqFjlBhC,+BAGC,gCAA+E,CAOhF,oGAGC,oKnFoFgF,CmFnFjF,uDAGC,uKnFgFgF,CmF/EjF,iBC7CC,mBADA,etFuLoB,CsFzLpB,2BtF0mByI,CsFzmBzI,sBtFiLsB,CsF9KvB,uDAWC,mBAAoB,CACpB,gBAFA,oBAAqB,CADrB,kBAAmB,CAFnB,cAAe,CACf,eAIgB,CACjB,yCAKC,eAFA,cAAe,CACf,eACe,CAChB,YCzBC,kBvF2X6B,CuF1X9B,gBCMC,yCADA,qBxF2nB4B,CwF5nB5B,kBxF+KsB,CwFlLtB,uBxF0mByI,CwFxmBzI,exFuLoB,CwFxLpB,mDAI2D,CAC5D,8BCPC,2BzFmLsB,CyF/KvB,gEADC,mBADA,ezFwLoB,CyFzLpB,sBzFkLsB,CyFzKvB,SCXC,cAAe,CACf,UAAW,CACZ,+BAGC,kCAAoC,CACrC,QAOC,mBADA,sB1FwKsB,C2B/HtB,W+DjCA,qB1Ffa,C0FgBb,a1FJe,C0FEjB,kCAKI,qB1FnBW,C0FoBX,aAA2B,CAN/B,kBAUI,wBAAoC,CACpC,aAA2B,CAC5B,sBAID,8BAAkC,CAClC,a1FzBgB,C0FuBlB,6BAKI,wBAAoC,CAEpC,gBADA,aACgB,CACjB,iBAID,qC1FtCgB,C0FuChB,U1F1Ca,C0FwCf,sEAKI,sC1F1Cc,C0F2Cd,U1F9CW,C0FoDZ,cAID,wB1FpDgB,C0FqDhB,U1FzDa,C0FuDf,6DAUI,wBAAuC,CACvC,aAAyB,CAC1B,iBAID,qC1FnEgB,C0FoEhB,U1FxEa,C0FsEf,sEAKI,sC1FvEc,C0FwEd,U1F5EW,C2BsDb,mB+DgCA,oB1FnFgB,C0FoFhB,a1F7Ea,C0F2Ef,4EAKI,wBAAoC,CACpC,oB1FvFc,C0FwFd,a1FlFW,C0FyFZ,sBAID,oB1FpGgB,C0FqGhB,a1F5Fe,C0F0FjB,qFAWI,wB1FrGa,C0FsGb,oB1FtGa,C0FuGb,U1FnHW,C0FoHZ,kBCzHD,mC3FiBe,C2FhBf,a3FgBe,C2FXd,yEAFC,oCAAmC,CACnC,a3FYa,C2FNd,oBAXD,oC3FYgB,C2FXhB,a3FWgB,C2FNf,+EAFC,qCAAmC,CACnC,a3FOc,C2FDf,kBAXD,oC3FoBe,C2FnBf,a3FmBe,C2Fdd,yEAFC,qCAAmC,CACnC,a3Fea,C2FTd,eAXD,qC3FqBY,C2FpBZ,a3FoBY,C2FfX,gEAFC,sCAAmC,CACnC,a3FgBU,C2FVX,kBAXD,qC3FsBe,C2FrBf,a3FqBe,C2FhBd,yEAFC,sCAAmC,CACnC,a3FiBa,C2FXd,iBAXD,mC3FuBc,C2FtBd,a3FsBc,C2FjBb,sEAFC,oCAAmC,CACnC,a3FkBY,C2FZb,gBAXD,qC3FMgB,C2FLhB,a3FKgB,C2FAf,mEAFC,sCAAmC,CACnC,a3FCc,C2FKf,eAXD,kC3FcgB,C2FbhB,a3FagB,C2FRf,gEAFC,mCAAmC,CACnC,a3FSc,C2FHf,wBAXD,qC3FmBqB,C2FlBrB,a3FkBqB,C2FbpB,2FAFC,sCAAmC,CACnC,a3FcmB,C2FRpB,gBAXD,kC3Fea,C2Fdb,a3Fca,C2FTZ,mEAFC,mCAAmC,CACnC,a3FUW,C2FJZ,gBAXD,qC3FKa,C2FJb,U3FIa,C2FCZ,mEAFC,sCAAmC,CACnC,U3FAW,C2FMZ,UD8HD,mB1FgBwB,C0FfzB,oBAQC,oBAFA,qB1F2I4B,C0F1I5B,sB1FQwB,C0FNzB,sBAGC,aAAc,CACd,aAAc,CACd,SAAU,CACX,iEAGC,qB1F6I+B,C0F5I/B,sB1F4I+B,C0F3IhC,iEAGC,qB1FmI+B,C0FlI/B,sB1FkI+B,C0FjIhC,2BAGC,mB1F4a6B,C0F3a7B,oB1F2a6B,CyBtfc,emE5F3C,oB5Fsa+B,C4Fra/B,qB5Fqa+B,C8B1SjC,e8DlHE,oB5F4Z+B,C4F3Z/B,sBAFA,cAAe,CADf,U5F8Z+B,C8B1SjC,0C8D9GI,YAAa,CACd,8BAID,iB5FkoB8B,C4FjoB/B,eAMC,aAAc,CADhB,qBAII,uBAAwB,CAJ5B,0CAQI,YAAa,C9DiJjB,iB8DrIE,gB5FuJoB,C4FtJpB,e5F0IoB,C4FvIpB,qBAFA,gB5FygBmB,C4F/gBnB,oB5F6X+B,C4F5X/B,qB5F4X+B,C4F1X/B,oB5FuK4B,C4FxK5B,aAAc,CAKd,wBACqB,C7DzBnB,uB6DkCF,qBAAuB,CACvB,gBAHA,mBAAsB,CACtB,qBAEgB,CACjB,gCAGC,eAAgB,CACjB,kBAMC,W5FulBuB,C4FtlBvB,oB5FilB6B,C4FhlB9B,kBAGC,e5FmlB2B,C4FllB5B,kBAGC,e5FglB2B,C4F/kB5B,kBAGC,e5F6kB2B,C4F5kB5B,oCAIC,uB5F4jBiC,C4F3jBlC,oEAIC,mB5FujBiC,C4FtjBjC,oB5FsjBiC,C4FrjBjC,mB5FqjBiC,C4FpjBjC,oB5FojBiC,C4FnjBlC,wBAMC,a5FiT2B,CkC9Y7B,Q2DVE,8B5FkiB+C,C4FjiB/C,0CAA4C,CAC5C,Y5FmiCsC,CS/9BpC,4BmF9DJ,6CAKM,a7FDY,C6FJlB,8MAcM,a7FLW,C6FTjB,8CAkBM,a7FdY,C6Feb,CAOL,oIAEE,8BAA+C,CAC/C,+BAAgD,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BAA2C,CAC3C,mBlGsdsB,CkGrdtB,oBlGoIwB,CkGvI1B,wBAOI,aAAc,CACd,SAAU,CARd,+BAaI,YAA8C,CAC9C,iBlGmpBqB,CkGlpBrB,kBlGkpBqB,CkGjpBtB,aAOD,iBAAkB,CAClB,YjGy/BsC,CiGx/BvC,oBAIC,WADA,QACW,CACZ,qBAIC,aADA,UACa,CACd,4BAMC,+BAAmC,CACnC,uBAA0B,CAF5B,oEAKI,wBAAoC,CACpC,alG/Ca,CkGgDd,gCAID,kCAAqC,CACrC,oBAA0C,CAF5C,4EAKI,wBAAsC,CACtC,UlGrEW,CkGsEZ,uBC3ED,mCnGiBe,CmGhBf,anGgBe,CmGdf,sEAEE,mCnGYa,CmGXb,anGWa,CmGVd,yBAPD,oCnGYgB,CmGXhB,anGWgB,CmGThB,0EAEE,oCnGOc,CmGNd,anGMc,CmGLf,uBAPD,oCnGoBe,CmGnBf,anGmBe,CmGjBf,sEAEE,oCnGea,CmGdb,anGca,CmGbd,oBAPD,qCnGqBY,CmGpBZ,anGoBY,CmGlBZ,gEAEE,qCnGgBU,CmGfV,anGeU,CmGdX,uBAPD,qCnGsBe,CmGrBf,anGqBe,CmGnBf,sEAEE,qCnGiBa,CmGhBb,anGgBa,CmGfd,sBAPD,mCnGuBc,CmGtBd,anGsBc,CmGpBd,oEAEE,mCnGkBY,CmGjBZ,anGiBY,CmGhBb,qBAPD,qCnGMgB,CmGLhB,anGKgB,CmGHhB,kEAEE,qCnGCc,CmGAd,anGAc,CmGCf,oBAPD,kCnGcgB,CmGbhB,anGagB,CmGXhB,gEAEE,kCnGSc,CmGRd,anGQc,CmGPf,6BAPD,qCnGmBqB,CmGlBrB,anGkBqB,CmGhBrB,kFAEE,qCnGcmB,CmGbnB,anGamB,CmGZpB,qBAPD,kCnGea,CmGdb,anGca,CmGZb,kEAEE,kCnGUW,CmGTX,anGSW,CmGRZ,qBAPD,qCnGKa,CmGJb,UnGIa,CmGFb,kEAEE,qCnGAW,CmGCX,UnGDW,CmGEZ,wBAPD,oCnGYgB,CmGXhB,anGWgB,CmGThB,wEAEE,oCnGOc,CmGNd,anGMc,CmGLf,mBDwFD,wBlGpFgB,CkGqFhB,UlG3Fa,CkGoGb,uEACE,UlGrGW,CkGoGb,kBACE,alG5Fc,CkG2FhB,iBACE,UlGrGW,CkGoGb,gBACE,alG5Fc,CkG2FhB,uDACE,UlGrGW,CkGoGb,gBACE,alG5Fc,CyCgChB,erBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,2BACE,UxC4MiC,CwC3MlC,qD0DMG,UpGHS,CoGDb,kBAQI,wBAAsE,C3DkC1E,iBrBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,6BACE,UxC4MiC,CwC3MlC,yD0DMG,UpGHS,CoGDb,oBAQI,wBAAsE,C3DkC1E,erBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,2BACE,UxC4MiC,CwC3MlC,qD0DMG,UpGHS,CoGDb,kBAQI,wBAAsE,C3DkC1E,YrBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,wBACE,UxC4MiC,CwC3MlC,+C0DMG,UpGHS,CoGDb,eAQI,wBAAsE,C3DkC1E,erBhDA,wBlB0MmC,CwC1MnC,qBAFA,axC4MmC,CwCxMnC,2BACE,axC4MiC,CwC3MlC,qD0DMG,apGMY,CoGVhB,kBAQI,wBAAsE,C3DkC1E,crBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,0BACE,UxC4MiC,CwC3MlC,mD0DMG,UpGHS,CoGDb,iBAQI,wBAAsE,C3DkC1E,arBhDA,wBlB0MmC,CwC1MnC,qBAFA,axC4MmC,CwCxMnC,yBACE,axC4MiC,CwC3MlC,iD0DMG,apGMY,CoGVhB,gBAQI,wBAAsE,C3DkC1E,YrBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,wBACE,UxC4MiC,CwC3MlC,+C0DMG,UpGHS,CoGDb,eAQI,wBAAsE,C3DkC1E,qBrBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,iCACE,UxC4MiC,CwC3MlC,iE0DMG,UpGHS,CoGDb,wBAQI,wBAAsE,C3DkC1E,arBhDA,wBlB0MmC,CwC1MnC,qBAFA,UxC4MmC,CwCxMnC,yBACE,UxC4MiC,CwC3MlC,iD0DMG,UpGHS,CoGDb,gBAQI,wBAAsE,C3DkC1E,arBhDA,qBlB0MmC,CwC1M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6B/FnC,qB5B4K2B,CmB3RvB,8HsG6KJ,UxHwmBiJ,CkBjxB7I,uCsGwKN,wBtGvKQ,eAAgB,CsG2KvB,CAED,mCACE,YAAa,CACd,kBAOC,4BAA6B,CAG7B,WAAY,CACZ,cARA,YAAa,CAKb,kBzHlBsB,CyHmBtB,ezHZoB,CyHSpB,mCAAqE,CADrE,gCAAkE,CADlE,UzHnLa,CyHiLf,wBAYI,YAAa,CACd,6BAID,aAAc,CACf,8CAKC,kBAAmB,CACpB,4DAUC,4BAA2C,CtHrNzC,qBHyIoB,CyH6EtB,cAAe,CAPf,oBAAqB,C1HmEjB,kBAvE+B,C0HKnC,ezHrCoB,C4B/DpB,qB5B4K2B,CyHvE3B,iBAAkB,CtGpNd,8HsGuNJ,wBAAiB,CAAjB,qBAAiB,CAAjB,oBAAiB,CAAjB,gBAAiB,CADjB,qBAAsB,CADtB,kBxHgkBiJ,CkBjxB7I,uCsG4MN,4DtG3MQ,eAAgB,CsGkOvB,CAvBD,gJAeI,oBAAqB,CAfzB,gJAqBI,gBADA,SzHoD6B,CyHlD9B,uErGlPD,wBpBmBe,C4BDf,oB5BCe,CQTX,gBoBMJ,U5BsSmB,C4BjSnB,mFRrBA,wBlB+MmC,C0BvLjC,qBAFA,U1ByLiC,C0BtLlC,4LRzBD,wBlB+MmC,C0BhLjC,oB1BgLiC,CMrM/B,4CoBmBF,UAI4F,CAK7F,qfAQC,wB1BiKiC,C0B9JjC,qBAJA,U1BkKiC,C0BvKnC,ijBpB9BI,2CoB2CmG,CAKpG,kLAMD,wB5B7Ca,C4BgDb,qBAJA,U5B5Ca,C4BiDd,8B6FuLD,cAAe,CAChB,yCAGC,cAAe,CAChB,8BrGhQC,qBpBOa,CyH8Pb,qBjH3PI,eR4Se,C4BtSnB,a5BAgB,CyHoPhB,gBzH1PgB,C4BWhB,oCRrBA,qBlB0MmC,C0BlLjC,kBAFA,a1BoLiC,C0BjLlC,mFRzBD,qBlB0MmC,C0B3KjC,iB1B2KiC,CMhM/B,6CoBmBF,aAI4F,CAK7F,+NAQC,qB1B4JiC,C0BzJjC,kBAJA,a1B6JiC,C0BlKnC,6PpB9BI,4CoB2CmG,CAKpG,8EAMD,qB5BzDW,C4B4DX,kBAJA,a5BxDW,C4B6DZ,yC6FqMD,YAAa,CACd,sBAOC,kBADA,kBzHrC4B,CyHuC7B,eAIC,YADA,cACY,C5BrOd,kB6B/CE,eAAgB,CACjB,mBAGC,gBAAiB","sources":["webpack://landkit/./node_modules/bootstrap/scss/bootstrap.scss","webpack://landkit/./src/scss/theme.scss","webpack://landkit/./node_modules/bootstrap/scss/_root.scss","webpack://landkit/./node_modules/bootstrap/scss/_reboot.scss","webpack://landkit/./node_modules/bootstrap/scss/vendor/_rfs.scss","webpack://landkit/./src/scss/theme/_variables.scss","webpack://landkit/./node_modules/bootstrap/scss/_variables.scss","webpack://landkit/./node_modules/bootstrap/scss/_functions.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack://landkit/./node_modules/bootstrap/scss/_type.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_lists.scss","webpack://landkit/./node_modules/bootstrap/scss/_images.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_image.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_box-shadow.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_container.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://landkit/./node_modules/bootstrap/scss/_containers.scss","webpack://landkit/./node_modules/bootstrap/scss/_grid.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_grid.scss","webpack://landkit/./node_modules/bootstrap/scss/_tables.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_table-variants.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_labels.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_form-text.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_form-control.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_transition.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_gradients.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_form-select.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_form-check.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_form-range.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_floating-labels.scss","webpack://landkit/./node_modules/bootstrap/scss/forms/_input-group.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_forms.scss","webpack://landkit/./node_modules/bootstrap/scss/_buttons.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_buttons.scss","webpack://landkit/./node_modules/bootstrap/scss/_transitions.scss","webpack://landkit/./node_modules/bootstrap/scss/_dropdown.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_caret.scss","webpack://landkit/./node_modules/bootstrap/scss/_button-group.scss","webpack://landkit/./node_modules/bootstrap/scss/_nav.scss","webpack://landkit/./node_modules/bootstrap/scss/_navbar.scss","webpack://landkit/./node_modules/bootstrap/scss/_card.scss","webpack://landkit/./node_modules/bootstrap/scss/_accordion.scss","webpack://landkit/./node_modules/bootstrap/scss/_breadcrumb.scss","webpack://landkit/./node_modules/bootstrap/scss/_pagination.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_pagination.scss","webpack://landkit/./node_modules/bootstrap/scss/_badge.scss","webpack://landkit/./node_modules/bootstrap/scss/_alert.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_alert.scss","webpack://landkit/./node_modules/bootstrap/scss/_progress.scss","webpack://landkit/./node_modules/bootstrap/scss/_list-group.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_list-group.scss","webpack://landkit/./node_modules/bootstrap/scss/_close.scss","webpack://landkit/./node_modules/bootstrap/scss/_toasts.scss","webpack://landkit/./node_modules/bootstrap/scss/_modal.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_backdrop.scss","webpack://landkit/./node_modules/bootstrap/scss/_tooltip.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_reset-text.scss","webpack://landkit/./node_modules/bootstrap/scss/_popover.scss","webpack://landkit/./node_modules/bootstrap/scss/_carousel.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_clearfix.scss","webpack://landkit/./node_modules/bootstrap/scss/_spinners.scss","webpack://landkit/./node_modules/bootstrap/scss/_offcanvas.scss","webpack://landkit/./node_modules/bootstrap/scss/_placeholders.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_colored-links.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_ratio.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_position.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_stacks.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_visually-hidden.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_visually-hidden.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_stretched-link.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_text-truncate.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_text-truncation.scss","webpack://landkit/./node_modules/bootstrap/scss/helpers/_vr.scss","webpack://landkit/./node_modules/bootstrap/scss/mixins/_utilities.scss","webpack://landkit/./node_modules/bootstrap/scss/utilities/_api.scss","webpack://landkit/./src/scss/theme/utilities/_background.scss","webpack://landkit/./src/scss/theme/utilities/_images.scss","webpack://landkit/./src/scss/theme/utilities/_lift.scss","webpack://landkit/./src/scss/theme/utilities/_overlay.scss","webpack://landkit/./src/scss/theme/mixins/_overlay.scss","webpack://landkit/./src/scss/theme/utilities/_position.scss","webpack://landkit/./src/scss/theme/utilities/_shadows.scss","webpack://landkit/./src/scss/theme/utilities/_sizing.scss","webpack://landkit/./src/scss/theme/utilities/_type.scss","webpack://landkit/./src/scss/theme/_reboot.scss","webpack://landkit/./src/scss/theme/_type.scss","webpack://landkit/./src/scss/theme/_images.scss","webpack://landkit/./src/scss/theme/_grid.scss","webpack://landkit/./src/scss/theme/_tables.scss","webpack://landkit/./src/scss/theme/forms/_floating-labels.scss","webpack://landkit/./src/scss/theme/forms/_form-check.scss","webpack://landkit/./src/scss/theme/forms/_form-control.scss","webpack://landkit/./src/scss/theme/forms/_form-group.scss","webpack://landkit/./src/scss/theme/forms/_form-select.scss","webpack://landkit/./src/scss/theme/forms/_input-group.scss","webpack://landkit/./src/scss/theme/_buttons.scss","webpack://landkit/./src/scss/theme/mixins/_buttons.scss","webpack://landkit/./src/scss/theme/_dropdown.scss","webpack://landkit/./src/scss/theme/_navbar.scss","webpack://landkit/./src/scss/theme/_card.scss","webpack://landkit/./src/scss/theme/_accordion.scss","webpack://landkit/./src/scss/theme/_breadcrumb.scss","webpack://landkit/./src/scss/theme/_pagination.scss","webpack://landkit/./src/scss/theme/_badge.scss","webpack://landkit/./src/scss/theme/mixins/_badge.scss","webpack://landkit/./src/scss/theme/_alert.scss","webpack://landkit/./src/scss/theme/_list-group.scss","webpack://landkit/./src/scss/theme/_close.scss","webpack://landkit/./src/scss/theme/_modal.scss","webpack://landkit/./src/scss/theme/_popover.scss","webpack://landkit/./src/scss/theme/_avatar.scss","webpack://landkit/./src/scss/theme/_device.scss","webpack://landkit/./src/scss/theme/_footer.scss","webpack://landkit/./src/scss/theme/_icon.scss","webpack://landkit/./src/scss/theme/_list.scss","webpack://landkit/./src/scss/theme/_screenshot.scss","webpack://landkit/./src/scss/theme/_section.scss","webpack://landkit/./src/scss/theme/_shapes.scss","webpack://landkit/./src/scss/theme/_sidenav.scss","webpack://landkit/./src/scss/theme/vendor/_aos.scss","webpack://landkit/./src/scss/theme/vendor/_bigpicture.scss","webpack://landkit/./src/scss/theme/vendor/_choices.scss","webpack://landkit/./src/scss/theme/vendor/_dropzone.scss","webpack://landkit/./src/scss/theme/vendor/_feather.scss","webpack://landkit/./src/scss/theme/vendor/_flickity.scss","webpack://landkit/./src/scss/theme/vendor/_highlight.scss","webpack://landkit/./src/scss/theme/vendor/_quill.scss","webpack://landkit/./src/scss/_user.scss"],"sourcesContent":["/*!\n * Bootstrap v5.1.1 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n","/**\n * Custom variables followed by theme variables followed by Bootstrap variables\n * to ensure cascade of styles.\n */\n\n// Bootstrap functions\n@import '~bootstrap/scss/functions';\n\n// Theme functions\n@import 'theme/functions';\n\n// Custom variables\n@import 'user-variables';\n\n// Theme variables\n@import 'theme/variables';\n\n// Bootstrap core\n@import '~bootstrap/scss/bootstrap';\n\n// Theme core\n@import 'theme/theme';\n\n// Custom core\n@import 'user';",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`