diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index c0c98622327c..1e075ac95657 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -2,7 +2,7 @@ github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username -open_collective: yetiforcecrm +open_collective: # Replace with a single open_collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.md b/.github/ISSUE_TEMPLATE/1-bug-report.md index d9e5024d6cb2..2088d87aa2ff 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.md +++ b/.github/ISSUE_TEMPLATE/1-bug-report.md @@ -13,7 +13,7 @@ Oh hi there! 😄 To expedite issue processing please search open and closed issues before submitting a new one. Existing issues often contain information about workarounds, resolution, or progress updates. -Before you create a new issue, please check out our [manual] (https://yetiforce.com/en/knowledge-base/documentation/implementer-documentation/item/how-to-report-bugs) +Before you create a new issue, please check out our [manual] (https://doc.yetiforce.com/developer-guides/github/how-to-report-bugs) 🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅--> @@ -63,7 +63,7 @@ Please include a screenshot of your configuration. Here is an example: https://p @@ -57,7 +57,7 @@ Steps to reproduce the behavior: /u', function ($matches) { - return $matches[1] ?? ''; - }, $content); + $content = preg_replace_callback('//u', fn ($matches) => $matches[1] ?? '', $content); $twig = new \Twig\Environment(new \Twig\Loader\ArrayLoader(['index' => $content])); $sandbox = new \Twig\Extension\SandboxExtension(\App\Extension\Twig\SecurityPolicy::getPolicy(), true); $twig->addExtension($sandbox); @@ -560,20 +561,19 @@ protected function organization(string $params): string } else { [$id, $fieldName, $params] = array_pad(explode('|', $params, 3), 3, false); } - if (!Record::isExists($id, 'MultiCompany')) { - return ''; - } - $recordModel = \Vtiger_Record_Model::getInstanceById($id, 'MultiCompany'); - if ($recordModel->has($fieldName)) { - $value = $recordModel->get($fieldName); - $fieldModel = $recordModel->getModule()->getFieldByName($fieldName); - if ('' === $value || !$fieldModel || !$this->useValue($fieldModel, 'MultiCompany')) { - return ''; - } - if ($this->withoutTranslations) { - $returnVal = $this->getDisplayValueByType($value, $recordModel, $fieldModel, $params); - } else { - $returnVal = $fieldModel->getUITypeModel()->getTextParserDisplayValue($value, $recordModel, $params); + if (Record::isExists($id, 'MultiCompany')) { + $companyRecordModel = \Vtiger_Record_Model::getInstanceById($id, 'MultiCompany'); + if ($companyRecordModel->has($fieldName)) { + $value = $companyRecordModel->get($fieldName); + $fieldModel = $companyRecordModel->getModule()->getFieldByName($fieldName); + if ('' === $value || !$fieldModel || !$this->useValue($fieldModel, 'MultiCompany')) { + return ''; + } + if ($this->withoutTranslations) { + $returnVal = $this->getDisplayValueByType($value, $companyRecordModel, $fieldModel, $params); + } else { + $returnVal = $fieldModel->getUITypeModel()->getTextParserDisplayValue($value, $companyRecordModel, $params); + } } } return $returnVal; @@ -628,7 +628,7 @@ protected function general($key) return (new \DateTimeField(null))->getDisplayDate(); case 'CurrentTime': return \Vtiger_Util_Helper::convertTimeIntoUsersDisplayFormat(date('H:i:s')); - case 'CurrentDateTime': + case 'CurrentDateTime': return Fields\DateTime::formatToDisplay('now'); case 'SiteUrl': return Config::main('site_URL'); @@ -694,7 +694,8 @@ protected function record($params, $isPermitted = true) $oldValue = $this->getDisplayValueByField($fieldModel, $oldValue); $currentValue = $this->getDisplayValueByField($fieldModel); if ($this->withoutTranslations) { - $value .= "\$(translate : {$this->moduleName}|{$fieldModel->getFieldLabel()})\$ \$(translate : LBL_FROM)\$ $oldValue \$(translate : LBL_TO)\$ " . $currentValue . ($this->isHtml ? '
' : PHP_EOL); + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); + $value .= "\$(translate : {$this->moduleName}|{$label})\$ \$(translate : LBL_FROM)\$ $oldValue \$(translate : LBL_TO)\$ " . $currentValue . ($this->isHtml ? '
' : PHP_EOL); } else { $value .= Language::translate($fieldModel->getFieldLabel(), $this->moduleName, $this->language) . ' '; $value .= Language::translate('LBL_FROM') . " $oldValue " . Language::translate('LBL_TO') . " $currentValue" . ($this->isHtml ? '
' : PHP_EOL); @@ -715,7 +716,8 @@ protected function record($params, $isPermitted = true) } $currentValue = \in_array($fieldModel->getFieldDataType(), $this->largeDataUiTypes) ? '' : $this->getDisplayValueByField($fieldModel); if ($this->withoutTranslations) { - $value .= "\$(translate : {$this->moduleName}|{$fieldModel->getFieldLabel()})\$: $currentValue" . ($this->isHtml ? '
' : PHP_EOL); + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); + $value .= "\$(translate : {$this->moduleName}|{$label})\$: $currentValue" . ($this->isHtml ? '
' : PHP_EOL); } else { $value .= Language::translate($fieldModel->getFieldLabel(), $this->moduleName, $this->language) . ": $currentValue" . ($this->isHtml ? '
' : PHP_EOL); } @@ -728,7 +730,8 @@ protected function record($params, $isPermitted = true) foreach ($fields as $fieldName => $fieldModel) { $currentValue = $this->getDisplayValueByField($fieldModel); if ($this->withoutTranslations) { - $value .= "\$(translate : {$this->moduleName}|{$fieldModel->getFieldLabel()})\$: $currentValue" . ($this->isHtml ? '
' : PHP_EOL); + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); + $value .= "\$(translate : {$this->moduleName}|{$label})\$: $currentValue" . ($this->isHtml ? '
' : PHP_EOL); } else { $value .= Language::translate($fieldModel->getFieldLabel(), $this->moduleName, $this->language) . ": $currentValue" . ($this->isHtml ? '
' : PHP_EOL); } @@ -755,7 +758,11 @@ protected function record($params, $isPermitted = true) */ protected function relatedRecord($params) { - [$fieldName, $relatedField, $relatedModule] = array_pad(explode('|', $params, 3), 3, ''); + $params = explode('|', $params); + $fieldName = array_shift($params); + $relatedField = array_shift($params); + $relatedModule = array_shift($params); + $value = $params ? $relatedField . '|' . implode('|', $params) : $relatedField; if ( !isset($this->recordModel) || ($this->permissions && !Privilege::isPermitted($this->moduleName, 'DetailView', $this->record)) @@ -782,7 +789,7 @@ protected function relatedRecord($params) $instance->{$key} = $this->{$key}; } } - $return[] = $instance->record($relatedField, false); + $return[] = $instance->record($value, false); } continue; } @@ -795,7 +802,7 @@ protected function relatedRecord($params) $instance->{$key} = $this->{$key}; } } - $return[] = $instance->record($relatedField, false); + $return[] = $instance->record($value, false); } } } @@ -815,7 +822,7 @@ protected function relatedRecord($params) $instance->{$key} = $this->{$key}; } } - return $instance->record($relatedField); + return $instance->record($value); } /** @@ -925,6 +932,9 @@ protected function relatedRecordsList($params) } if ($columns) { $relationListView->setFields($columns); + } else { + $fields = array_filter($relationListView->getHeaders(), fn ($fieldModel) => !$fieldModel->get('fromOutsideList')); + $relationListView->setFields(array_keys($fields)); } if ($conditions) { $transformedSearchParams = $relationListView->getQueryGenerator()->parseBaseSearchParamsToCondition(Json::decode($conditions)); @@ -946,11 +956,12 @@ protected function relatedRecordsListPrinter(\Vtiger_RelationListView_Model $rel { $relatedModuleName = $relationListView->getRelationModel()->getRelationModuleName(); $rows = $headers = ''; - $fields = $relationListView->getHeaders(); + $fields = $relationListView->getRelationModel()->getQueryFields(); foreach ($fields as $fieldModel) { - if ($fieldModel->isViewable()) { + if ($fieldModel->isViewable() || $fieldModel->get('fromOutsideList')) { if ($this->withoutTranslations) { - $headers .= "getFieldType()}\">$(translate : {$fieldModel->getFieldLabel()}|$relatedModuleName)$"; + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); + $headers .= "getFieldType()}\">$(translate : {$label}|$relatedModuleName)$"; } else { $headers .= "getFieldType()}\">" . Language::translate($fieldModel->getFieldLabel(), $relatedModuleName) . ''; } @@ -964,7 +975,7 @@ protected function relatedRecordsListPrinter(\Vtiger_RelationListView_Model $rel $value = $this->getDisplayValueByField($fieldModel, $relatedRecordModel); if (false !== $value) { if ($maxLength) { - $value = $this->textTruncate($value, $maxLength); + $value = TextUtils::textTruncate($value, $maxLength); } $rows .= "getFieldType()}\">{$value}"; } @@ -1022,13 +1033,23 @@ protected function recordsList($params) $transformedSearchParams = $listView->getQueryGenerator()->parseBaseSearchParamsToCondition(Json::decode($conditions)); $listView->set('search_params', $transformedSearchParams); } - $rows = $headers = ''; + if (($pdf = $this->getParam('pdf')) && $pdf->get('module_name') === $moduleName && ($ids = $pdf->getVariable('recordsId'))) { + $listView->getQueryGenerator()->addCondition('id', $ids, 'e', 1); + } + $rows = $headers = $headerStyle = $borderStyle = ''; $fields = $listView->getListViewHeaders(); + if (isset($paramsArray['headerStyle']) && 'background' === $paramsArray['headerStyle']) { + $headerStyle = 'background-color:#ddd;'; + } + if (isset($paramsArray['table']) && 'border' === $paramsArray['table']) { + $borderStyle = 'border:1px solid #ddd;'; + } foreach ($fields as $fieldModel) { if ($this->withoutTranslations) { - $headers .= "getFieldType()}\">$(translate : {$fieldModel->getFieldLabel()}|$moduleName)$"; + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); + $headers .= "getFieldType()}\" style=\"{$headerStyle}\">$(translate : {$label}|$moduleName)$"; } else { - $headers .= "getFieldType()}\">" . Language::translate($fieldModel->getFieldLabel(), $moduleName) . ''; + $headers .= "getFieldType()}\" style=\"{$headerStyle}\">" . Language::translate($fieldModel->getFieldLabel(), $moduleName) . ''; } } $counter = 0; @@ -1039,9 +1060,9 @@ protected function recordsList($params) $value = $this->getDisplayValueByField($fieldModel, $relatedRecordModel, $params); if (false !== $value) { if ((int) $maxLength) { - $value = $this->textTruncate($value, (int) $maxLength); + $value = TextUtils::textTruncate($value, (int) $maxLength); } - $rows .= "getFieldType()}\">{$value}"; + $rows .= "getFieldType()}\" style=\"{$borderStyle}\">{$value}"; } } $rows .= ''; @@ -1050,10 +1071,7 @@ protected function recordsList($params) return ''; } $headers = "{$headers}"; - $table = 'class="records-list" style="border-collapse:collapse;width:100%"'; - if (isset($paramsArray['table']) && 'border' === $paramsArray['table']) { - $table .= 'border="1"'; - } + $table = "class=\"records-list\" style=\"border-collapse:collapse;width:100%;{$borderStyle}\""; if (isset($paramsArray['addCounter']) && '1' === $paramsArray['addCounter']) { $headers = '' . Language::translate('LBL_NUMBER_OF_ALL_ENTRIES') . ": $counter$headers"; } @@ -1074,13 +1092,13 @@ protected function getDisplayValueByField(\Vtiger_Field_Model $fieldModel, $valu $model = $this->recordModel; if (false === $value) { $value = \App\Utils\Completions::decode($this->recordModel->get($fieldModel->getName()), \App\Utils\Completions::FORMAT_TEXT); - if (!$fieldModel->isViewEnabled()) { + if (!$fieldModel->isViewEnabled() && !$fieldModel->get('fromOutsideList')) { return ''; } } elseif (\is_object($value)) { $model = $value; $value = $value->get($fieldModel->getName()); - if (!$fieldModel->isViewEnabled()) { + if (!$fieldModel->isViewEnabled() && !$fieldModel->get('fromOutsideList')) { return false; } } @@ -1150,12 +1168,10 @@ protected function getDisplayValueByType($value, \Vtiger_Record_Model $recordMod break; case 'tree': $template = $fieldModel->getFieldParams(); - $row = Fields\Tree::getValueByTreeId($template, $value); $value = $parentName = ''; - if ($row) { + if ($row = Fields\Tree::getValueByTreeId($template, $value)) { if ($row['depth'] > 0) { - $parentTree = $row['parentTree']; - $pieces = explode('::', $parentTree); + $pieces = explode('::', $row['parentTree']); end($pieces); $parent = prev($pieces); $parentRow = Fields\Tree::getValueByTreeId($template, $parent); @@ -1213,16 +1229,13 @@ protected function useValue($fieldModel, $moduleName) /** * Parsing params. * - * @param string $params + * @param string $key * * @return string */ - protected function params($params) + protected function params(string $key) { - if (isset($this->params[$params])) { - return $this->params[$params]; - } - return ''; + return isset($this->params[$key]) ? \App\Purifier::purifyHtml($this->params[$key]) : ''; } /** @@ -1291,9 +1304,10 @@ public function getRecordVariable($fieldType = false) foreach ($moduleModel->getBlocks() as $blockModel) { foreach ($blockModel->getFields() as $fieldModel) { if ($fieldModel->isViewable() && !($fieldType && $fieldModel->getFieldDataType() !== $fieldType)) { + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); $variables[Language::translate($blockModel->get('label'), $this->moduleName)][] = [ 'var_value' => "$(record : {$fieldModel->getName()})$", - 'var_label' => "$(translate : {$this->moduleName}|{$fieldModel->getFieldLabel()})$", + 'var_label' => "$(translate : {$this->moduleName}|{$label})$", 'label' => Language::translate($fieldModel->getFieldLabel(), $this->moduleName), ]; } @@ -1326,9 +1340,10 @@ public function getSourceVariable() foreach ($moduleModel->getBlocks() as $blockModel) { foreach ($blockModel->getFields() as $fieldModel) { if ($fieldModel->isViewable()) { + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); $variables[$moduleName][$blockModel->get('label')][] = [ 'var_value' => "$(sourceRecord : {$fieldModel->getName()})$", - 'var_label' => "$(translate : $moduleName|{$fieldModel->getFieldLabel()})$", + 'var_label' => "$(translate : $moduleName|{$label})$", 'label' => Language::translate($fieldModel->getFieldLabel(), $moduleName), ]; } @@ -1391,9 +1406,10 @@ public function getRelatedVariable($fieldType = false, $skipEmpty = false) && (!$relRecord || ($relRecord && !$relRecord->isEmpty($fieldModel->getName()))) ) { $labelGroup = "$parentFieldNameLabel: ($relatedModuleLang) " . Language::translate($blockModel->get('label'), $relatedModule); + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); $variables[$parentFieldName][$labelGroup][] = [ 'var_value' => "$(relatedRecord : $parentFieldName|$fieldName|$relatedModule)$", - 'var_label' => "$(translate : $relatedModule|{$fieldModel->getFieldLabel()})$", + 'var_label' => "$(translate : $relatedModule|{$label})$", 'label' => "$parentFieldNameLabel: ($relatedModuleLang) " . Language::translate($fieldModel->getFieldLabel(), $relatedModule), ]; } @@ -1442,9 +1458,10 @@ public function getRelatedLevelVariable($fieldType = false) foreach ($blockModel->getFields() as $fieldName => $fieldModel) { if ($fieldModel->isViewable() && !($fieldType && $fieldModel->getFieldDataType() !== $fieldType)) { $labelGroup = "{$parentFieldNameLabel}($relatedModuleLang) -> {$parentFieldNameLabelNextLevel}($relatedModuleLangNextLevel) " . Language::translate($blockModel->get('label'), $relatedModuleNextLevel); + $label = \App\Purifier::encodeHtml($fieldModel->getFieldLabel()); $variables[$labelGroup][] = [ 'var_value' => "$(relatedRecordLevel : $parentFieldName|$relatedModule|$parentFieldNameNextLevel|$fieldName|$relatedModuleNextLevel)$", - 'var_label' => "$(translate : $relatedModuleNextLevel|{$fieldModel->getFieldLabel()})$", + 'var_label' => "$(translate : $relatedModuleNextLevel|{$label})$", 'label' => "{$parentFieldNameLabel}($relatedModuleLang) -> {$parentFieldNameLabelNextLevel}($relatedModuleLangNextLevel) " . Language::translate($fieldModel->getFieldLabel(), $relatedModuleNextLevel), ]; } @@ -1466,9 +1483,7 @@ public function getRelatedLevelVariable($fieldType = false) public function getGeneralVariable() { $variables = [ - 'LBL_ENTITY_VARIABLES' => array_map(function ($value) { - return Language::translate($value, 'Other.TextParser'); - }, array_flip(static::$variableGeneral)), + 'LBL_ENTITY_VARIABLES' => array_map(fn ($value) => Language::translate($value, 'Other.TextParser'), array_flip(static::$variableGeneral)), ]; $variables['LBL_CUSTOM_VARIABLES'] = array_merge($this->getBaseGeneralVariable(), $this->getModuleGeneralVariable()); return $variables; @@ -1540,7 +1555,7 @@ public function getRelatedListVariable() $var = $relation->get('relation_id'); } $variables[] = [ - 'key' => "$(relatedRecordsList : $var)$", + 'key' => "$(relatedRecordsList : $var|__FIELDS_NAME__|__CONDITIONS__|__VIEW_ID_OR_NAME__|__LIMIT__|__MAX_LENGTH__)$", 'label' => Language::translate($relation->get('label'), $relation->get('relatedModuleName')), ]; } @@ -1564,114 +1579,6 @@ public function getBaseListVariable() return $variables; } - /** - * Truncating HTML. - * - * @param $html - * @param bool|int $length - * @param bool $addDots - * @param bool $isTruncated - * - * @throws \HTMLPurifier_Exception - * - * @return string - */ - public static function htmlTruncate($html, $length = false, $addDots = true, &$isTruncated = false) - { - if (!$length) { - $length = Config::main('listview_max_textlength'); - } - $encoding = Config::main('default_charset'); - $config = \HTMLPurifier_Config::create(null); - $config->set('Cache.SerializerPath', ROOT_DIRECTORY . \DIRECTORY_SEPARATOR . 'cache' . \DIRECTORY_SEPARATOR . 'vtlib'); - $lexer = \HTMLPurifier_Lexer::create($config); - $tokens = $lexer->tokenizeHTML($html, $config, new \HTMLPurifier_Context()); - $truncated = $openTokens = []; - $depth = $totalCount = 0; - foreach ($tokens as $token) { - if ($token instanceof \HTMLPurifier_Token_Start) { - $openTokens[$depth] = $token->name; - $truncated[] = $token; - ++$depth; - } elseif ($token instanceof \HTMLPurifier_Token_Text && $totalCount <= $length) { - if (false === $encoding) { - preg_match('/^(\s*)/um', $token->data, $prefixSpace) ?: $prefixSpace = ['', '']; - $token->data = $prefixSpace[1] . self::truncateWords(ltrim($token->data), $length - $totalCount, ''); - $currentCount = self::countWords($token->data); - } else { - if (mb_strlen($token->data, $encoding) > $length - $totalCount) { - $token->data = rtrim(mb_substr($token->data, 0, $length - $totalCount, $encoding)); - } - $currentCount = mb_strlen($token->data, $encoding); - } - $totalCount += $currentCount; - $truncated[] = $token; - } elseif ($token instanceof \HTMLPurifier_Token_End) { - if ($token->name === $openTokens[$depth - 1]) { - --$depth; - unset($openTokens[$depth]); - $truncated[] = $token; - } - } elseif ($token instanceof \HTMLPurifier_Token_Empty) { - $truncated[] = $token; - } - if ($totalCount >= $length) { - if (0 < \count($openTokens)) { - krsort($openTokens); - foreach ($openTokens as $name) { - $truncated[] = new \HTMLPurifier_Token_End($name); - } - } - break; - } - } - $generator = new \HTMLPurifier_Generator($config, new \HTMLPurifier_Context()); - $html = preg_replace_callback('/<*([A-Za-z_]\w*)\s\/>/', function ($matches) { - if (\in_array($matches[1], ['div'])) { - return "<{$matches[1]}>"; - } - return $matches[0]; - }, $generator->generateFromTokens($truncated)); - $isTruncated = $totalCount >= $length; - return $html . ($isTruncated ? ($addDots ? '...' : '') : ''); - } - - /** - * Truncating text. - * - * @param string $text - * @param bool|int $length - * @param bool $addDots - * - * @return string - */ - public static function textTruncate($text, $length = false, $addDots = true) - { - if (!$length) { - $length = Config::main('listview_max_textlength'); - } - $textLength = mb_strlen($text); - if ((!$addDots && $textLength > $length) || ($addDots && $textLength > $length + 2)) { - $text = mb_substr($text, 0, $length, Config::main('default_charset')); - if ($addDots) { - $text .= '...'; - } - } - return $text; - } - - /** - * Get text length. - * - * @param string $text - * - * @return int - */ - public static function getTextLength($text) - { - return mb_strlen($text); - } - /** * Gets user variables. * @@ -1824,7 +1731,9 @@ public function getInventoryTable(array $config): string $html .= ''; $columns = []; $customFieldClassSeq = 0; - foreach ($config['columns'] as $name) { + $labels = isset($config['labels']) ? explode(',', $config['labels']) : []; + $width = isset($config['width']) ? preg_replace('/[^[:alnum:]]/', '', explode(',', $config['width'])) : []; + foreach ($config['columns'] as $key => $name) { if (false !== strpos($name, '||')) { [$title,$value] = explode('||', $name, 2); if ('(' === $title[0] && ')' === substr($title, -1)) { @@ -1847,7 +1756,7 @@ public function getInventoryTable(array $config): string if (!$field->isVisible()) { continue; } - $html .= ''; + $html .= ''; $columns[$field->getColumnName()] = $field; } $html .= ''; diff --git a/app/TextParser/AllPages.php b/app/TextParser/AllPages.php index c115a089fe83..ab7567051739 100644 --- a/app/TextParser/AllPages.php +++ b/app/TextParser/AllPages.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Adrian Koń */ class AllPages extends Base diff --git a/app/TextParser/AmountToReturn.php b/app/TextParser/AmountToReturn.php index 947d24d7751b..a3555a399fd9 100644 --- a/app/TextParser/AmountToReturn.php +++ b/app/TextParser/AmountToReturn.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Tomasz Kur */ class AmountToReturn extends Base diff --git a/app/TextParser/Base.php b/app/TextParser/Base.php index 0a909cb50944..cb776598deae 100644 --- a/app/TextParser/Base.php +++ b/app/TextParser/Base.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class Base diff --git a/app/TextParser/CorectionAmountSummary.php b/app/TextParser/CorectionAmountSummary.php new file mode 100644 index 000000000000..9955708eddf5 --- /dev/null +++ b/app/TextParser/CorectionAmountSummary.php @@ -0,0 +1,55 @@ + + */ +class CorectionAmountSummary extends Base +{ + /** @var string */ + public $name = 'LBL_CORECTION_AMOUNT_SUMMARY'; + /** @var mixed Parser type */ + public $type = 'pdf'; + /** @var array Allowed modules */ + public $allowedModules = ['FCorectingInvoice']; + /** @var array Related modules fields */ + protected $relatedModulesFields = ['FCorectingInvoice' => 'finvoiceid']; + + /** + * Process. + * + * @return string + */ + public function process() + { + $relatedRecordModel = \Vtiger_Record_Model::getInstanceById($this->textParser->recordModel->get($this->relatedModulesFields[$this->textParser->recordModel->getModuleName()])); + $inventoryData = $this->textParser->recordModel->getInventoryData(); + $rows = reset($inventoryData); + $currency = \App\Fields\Currency::getById($rows['currency']); + $differenceOfAmounts = \App\Fields\Double::formatToDisplay($this->textParser->recordModel->get('sum_gross') -$relatedRecordModel->get('sum_gross') ) . ' ' . $currency['currency_symbol']; + $differenceOfAmountsDesciption = $differenceOfAmounts > 0 ? \App\Language::translate('LBL_SURCHARGE_AMOUNT', 'Other.PDF') : \App\Language::translate('LBL_SURCHARGE_AMOUNT', 'Other.PDF'); + + return '
' . Language::translate($field->get('label'), $this->moduleName) . '' . (empty($labels[$key]) ? Language::translate($field->get('label'), $this->moduleName) : Purifier::encodeHtml($labels[$key])) . '
+ + + + + + + + + + +
'.$differenceOfAmountsDesciption.'
'.$differenceOfAmounts .'
'; + + } + + +} diff --git a/app/TextParser/CurrentPage.php b/app/TextParser/CurrentPage.php index b77bb3660c0e..e13566e5cf2d 100644 --- a/app/TextParser/CurrentPage.php +++ b/app/TextParser/CurrentPage.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Adrian Koń */ class CurrentPage extends Base diff --git a/app/TextParser/DynamicInventoryColumnsTable.php b/app/TextParser/DynamicInventoryColumnsTable.php index 7a2df355857e..392e8bb13538 100644 --- a/app/TextParser/DynamicInventoryColumnsTable.php +++ b/app/TextParser/DynamicInventoryColumnsTable.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Rafal Pospiech * @author Radosław Skrzypczak */ diff --git a/app/TextParser/OverdueDeadlines.php b/app/TextParser/OverdueDeadlines.php index 66f9de30f805..09b8196d01a0 100644 --- a/app/TextParser/OverdueDeadlines.php +++ b/app/TextParser/OverdueDeadlines.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class OverdueDeadlines extends Base diff --git a/app/TextParser/ProductsTable.php b/app/TextParser/ProductsTable.php index 20b2bc141228..f7d469d237dc 100644 --- a/app/TextParser/ProductsTable.php +++ b/app/TextParser/ProductsTable.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class ProductsTable extends Base @@ -39,6 +39,8 @@ public function process() $currency = $inventoryRows && $firstRow['currency'] ? $firstRow['currency'] : $baseCurrency['id']; $currencyData = \App\Fields\Currency::getById($currency); $currencySymbol = $currencyData['currency_symbol']; + } else { + $currencyData = \App\Fields\Currency::getDefault(); } $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;'; diff --git a/app/TextParser/ProductsTableCorrectingBefore.php b/app/TextParser/ProductsTableCorrectingBefore.php index 5fbc11617b0b..e8da59e56ed3 100644 --- a/app/TextParser/ProductsTableCorrectingBefore.php +++ b/app/TextParser/ProductsTableCorrectingBefore.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Rafal Pospiech */ class ProductsTableCorrectingBefore extends Base @@ -41,14 +41,15 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); - $currencySymbol = $currencyData['currency_symbol']; + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } - $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; + $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;background-color:#ddd;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;'; $html .= ''; $groupModels = []; - foreach (['Name', 'Quantity', 'Discount', 'Currency', 'DiscountMode', 'TaxMode', 'UnitPrice', 'GrossPrice', 'NetPrice', 'Tax', 'TotalPrice', 'Value'] as $fieldType) { + foreach (['Name', 'Quantity', 'UnitPrice', 'TotalPrice', 'Discount', 'NetPrice', 'Currency', 'DiscountMode', 'Tax', 'TaxMode', 'GrossPrice', 'Value'] as $fieldType) { foreach ($inventory->getFieldsByType($fieldType) as $fieldModel) { $columnName = $fieldModel->getColumnName(); if (!$fieldModel->isVisible()) { @@ -102,7 +103,7 @@ public function process() } $html .= ''; foreach ($groupModels as $fieldModel) { - $html .= " - +
"; + $html .= ''; if ($fieldModel->isSummary()) { $sum = 0; foreach ($inventoryRows as $inventoryRow) { diff --git a/app/TextParser/ProductsTableDescription.php b/app/TextParser/ProductsTableDescription.php index a4faec1be340..18dcbe9ffeca 100644 --- a/app/TextParser/ProductsTableDescription.php +++ b/app/TextParser/ProductsTableDescription.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Tomasz Kur */ class ProductsTableDescription extends Base diff --git a/app/TextParser/ProductsTableImages.php b/app/TextParser/ProductsTableImages.php index 7dc8657449c5..ddd76ff9c3b0 100644 --- a/app/TextParser/ProductsTableImages.php +++ b/app/TextParser/ProductsTableImages.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Rafal Pospiech */ class ProductsTableImages extends Base @@ -40,10 +40,10 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); - $currencySymbol = $currencyData['currency_symbol']; + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } - $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;'; $displayFields = []; diff --git a/app/TextParser/ProductsTableLongVTwoLang.php b/app/TextParser/ProductsTableLongVTwoLang.php index 80df23175bbe..978b343efa24 100644 --- a/app/TextParser/ProductsTableLongVTwoLang.php +++ b/app/TextParser/ProductsTableLongVTwoLang.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class ProductsTableLongVTwoLang extends Base @@ -40,8 +40,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); - $currencySymbol = $currencyData['currency_symbol']; + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;'; diff --git a/app/TextParser/ProductsTableLongVersion.php b/app/TextParser/ProductsTableLongVersion.php index 5086d83b7178..a4ba847eb474 100644 --- a/app/TextParser/ProductsTableLongVersion.php +++ b/app/TextParser/ProductsTableLongVersion.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class ProductsTableLongVersion extends Base @@ -40,8 +40,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); - $currencySymbol = $currencyData['currency_symbol']; + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;'; diff --git a/app/TextParser/ProductsTableNew.php b/app/TextParser/ProductsTableNew.php index 878840eb4476..9b323b798846 100644 --- a/app/TextParser/ProductsTableNew.php +++ b/app/TextParser/ProductsTableNew.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class ProductsTableNew extends Base @@ -40,8 +40,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); - $currencySymbol = $currencyData['currency_symbol']; + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;text-align:center;'; diff --git a/app/TextParser/ProductsTableRelatedModule.php b/app/TextParser/ProductsTableRelatedModule.php index 0c66e14a2726..e5ad5ee521ca 100644 --- a/app/TextParser/ProductsTableRelatedModule.php +++ b/app/TextParser/ProductsTableRelatedModule.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class ProductsTableRelatedModule extends Base diff --git a/app/TextParser/ProductsTableShortVersion.php b/app/TextParser/ProductsTableShortVersion.php index 3c4a58e0a811..4d1436fd9812 100644 --- a/app/TextParser/ProductsTableShortVersion.php +++ b/app/TextParser/ProductsTableShortVersion.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class ProductsTableShortVersion extends Base @@ -40,10 +40,11 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); - $currencySymbol = $currencyData['currency_symbol']; + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } - $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; + $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;background-color:#ddd;'; $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px 4px;'; $html .= ' @@ -98,7 +99,7 @@ public function process() } $html .= ''; foreach ($groupModels as $fieldModel) { - $headerStyle = 'font-size:7px;padding:0px 4px;text-align:center;'; + $headerStyle = 'font-size:7px;padding:0px 4px;text-align:center;background-color:#ddd;'; $html .= " - + '; } $html .= ' - +
"; if ($fieldModel->isSummary()) { $sum = 0; diff --git a/app/TextParser/RecordsList.php b/app/TextParser/RecordsList.php index c11c49a65e2d..e0fb302c90dc 100644 --- a/app/TextParser/RecordsList.php +++ b/app/TextParser/RecordsList.php @@ -4,8 +4,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ @@ -65,15 +65,12 @@ public function process() ]; $html .= $this->parseConditions($conditions, $listView->getQueryGenerator()); } - - $html .= ''; - $headerStyle = 'font-size:9px;padding:0px 4px;text-align:center;'; - $bodyStyle = 'font-size:8px;border:1px solid #ddd;padding:0px4px;'; - + $html .= '
'; + $headerStyle = 'text-align:center;background-color:#ddd;'; + $bodyStyle = 'border:1px solid #ddd;padding:4px; '; foreach ($fields as $fieldModel) { $html .= "'; } - $html .= ''; foreach ($ids as $recordId) { $html .= ''; @@ -85,9 +82,9 @@ public function process() $value = ''; if (($sourceField = $fieldModel->get('source_field_name')) && !$recordModel->isEmpty($sourceField) && \App\Record::isExists($recordModel->get($sourceField))) { $sourceRecordModel = \Vtiger_Record_Model::getInstanceById($recordModel->get($sourceField)); - $value = $sourceRecordModel->getDisplayValue($fieldModel->getName(), $recordModel->getId(), true); + $value = $fieldModel->getUITypeModel()->getTextParserDisplayValue($sourceRecordModel->get($fieldModel->getName()), $sourceRecordModel, []); } elseif (!$fieldModel->get('source_field_name')) { - $value = $recordModel->getDisplayValue($fieldModel->getName(), $recordModel->getId(), true); + $value = $fieldModel->getUITypeModel()->getTextParserDisplayValue($recordModel->get($fieldModel->getName()), $recordModel, []); } $html .= "'; } diff --git a/app/TextParser/RelatedAttachments.php b/app/TextParser/RelatedAttachments.php index 411485ad32dd..21db975745aa 100644 --- a/app/TextParser/RelatedAttachments.php +++ b/app/TextParser/RelatedAttachments.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ diff --git a/app/TextParser/RelatedRecordsData.php b/app/TextParser/RelatedRecordsData.php index cb3a24458807..58558a7513e3 100644 --- a/app/TextParser/RelatedRecordsData.php +++ b/app/TextParser/RelatedRecordsData.php @@ -4,8 +4,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ diff --git a/app/TextParser/RelatedRecordsDataFromField.php b/app/TextParser/RelatedRecordsDataFromField.php index b1923c0ee1ab..bbcc95053790 100644 --- a/app/TextParser/RelatedRecordsDataFromField.php +++ b/app/TextParser/RelatedRecordsDataFromField.php @@ -4,8 +4,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ diff --git a/app/TextParser/TableCorrectTaxSummary.php b/app/TextParser/TableCorrectTaxSummary.php index b1c144ba0187..6f1f32d3dc27 100644 --- a/app/TextParser/TableCorrectTaxSummary.php +++ b/app/TextParser/TableCorrectTaxSummary.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Tomasz Kur */ class TableCorrectTaxSummary extends Base @@ -49,7 +49,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } if (!empty($fields[0])) { $taxes = $relatedTaxes = []; @@ -83,7 +85,7 @@ public function process() } $html .= ' - +
" . \App\Language::translate($fieldModel->getFieldLabel(), $this->textParser->moduleName) . '
" . $value . '
' . \App\Language::translate('LBL_AMOUNT', $this->textParser->moduleName) . '' . \CurrencyField::convertToUserFormat($relatedTaxAmount - $taxAmount, null, true) . ' ' . $currencyData['currency_symbol'] . '' . \CurrencyField::convertToUserFormat($relatedTaxAmount - $taxAmount, null, true) . ' ' . $currencySymbol . '
'; diff --git a/app/TextParser/TableCurrencySTwoLang.php b/app/TextParser/TableCurrencySTwoLang.php index af365ed7ff90..4de514ef9a09 100644 --- a/app/TextParser/TableCurrencySTwoLang.php +++ b/app/TextParser/TableCurrencySTwoLang.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class TableCurrencySTwoLang extends Base diff --git a/app/TextParser/TableCurrencySummary.php b/app/TextParser/TableCurrencySummary.php index 06e4dddb794c..56c353d9d64c 100644 --- a/app/TextParser/TableCurrencySummary.php +++ b/app/TextParser/TableCurrencySummary.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class TableCurrencySummary extends Base @@ -74,12 +74,12 @@ public function process() $currencyAmount += $tax; $html .= '
' . $key . '%' . \CurrencyField::convertToUserFormat($tax * $rate, null, true) . ' ' . $baseCurrency['currency_symbol'] . '' . \CurrencyField::convertToUserFormatSymbol($tax * $rate, true, $baseCurrency['currency_symbol']) . '
' . \App\Language::translate('LBL_AMOUNT', $this->textParser->moduleName) . '' . \CurrencyField::convertToUserFormat($currencyAmount * $rate, null, true) . ' ' . $baseCurrency['currency_symbol'] . '' . \CurrencyField::convertToUserFormatSymbol($currencyAmount * $rate, true, $baseCurrency['currency_symbol']) . '
'; diff --git a/app/TextParser/TableDiscountSTwoLang.php b/app/TextParser/TableDiscountSTwoLang.php index c1fe5b25c2d1..f84019cc9bd5 100644 --- a/app/TextParser/TableDiscountSTwoLang.php +++ b/app/TextParser/TableDiscountSTwoLang.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class TableDiscountSTwoLang extends Base @@ -41,7 +41,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } if (!empty($fields[0])) { $discount = 0; @@ -55,7 +57,7 @@ public function process()
' . \CurrencyField::convertToUserFormat($discount, null, true) . ' ' . $currencyData['currency_symbol'] . '' . \CurrencyField::convertToUserFormat($discount, null, true) . ' ' . $currencySymbol . '
'; diff --git a/app/TextParser/TableDiscountSummary.php b/app/TextParser/TableDiscountSummary.php index 1b203d1ecb5d..5f26f4745730 100644 --- a/app/TextParser/TableDiscountSummary.php +++ b/app/TextParser/TableDiscountSummary.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class TableDiscountSummary extends Base @@ -41,7 +41,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } if (!empty($fields[0])) { $discount = 0; @@ -49,15 +51,15 @@ public function process() foreach ($inventoryRows as $inventoryRow) { $discount += $inventoryRow['discount']; } - $html .= ' + $html .= '
- + - +
' . \App\Language::translate('LBL_DISCOUNTS_SUMMARY', $this->textParser->moduleName) . '' . \App\Language::translate('LBL_DISCOUNTS_SUMMARY', $this->textParser->moduleName) . '
' . \CurrencyField::convertToUserFormat($discount, null, true) . ' ' . $currencyData['currency_symbol'] . '' . \CurrencyField::convertToUserFormatSymbol($discount, true, $currencySymbol) . '
'; diff --git a/app/TextParser/TableTaxSTwoLang.php b/app/TextParser/TableTaxSTwoLang.php index 316ca6099c3d..cbf59e9b6b63 100644 --- a/app/TextParser/TableTaxSTwoLang.php +++ b/app/TextParser/TableTaxSTwoLang.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o. - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Sołek */ class TableTaxSTwoLang extends Base @@ -41,7 +41,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } if (!empty($fields[0])) { $taxes = []; @@ -66,12 +68,12 @@ public function process() $taxAmount += $tax; $html .= ' ' . $key . '% - ' . \CurrencyField::convertToUserFormat($tax, null, true) . ' ' . $currencyData['currency_symbol'] . ' + ' . \CurrencyField::convertToUserFormat($tax, null, true) . ' ' . $currencySymbol . ' '; } $html .= ' ' . \App\Language::translate('LBL_AMOUNT', $this->textParser->moduleName) . ' / ' . \App\Language::translate('LBL_AMOUNT', $this->textParser->moduleName, \App\Language::DEFAULT_LANG) . ' - ' . \CurrencyField::convertToUserFormat($taxAmount, null, true) . ' ' . $currencyData['currency_symbol'] . ' + ' . \CurrencyField::convertToUserFormat($taxAmount, null, true) . ' ' . $currencySymbol . ' '; diff --git a/app/TextParser/TableTaxSummary.php b/app/TextParser/TableTaxSummary.php index 0860a453abcf..736eedf32fc9 100644 --- a/app/TextParser/TableTaxSummary.php +++ b/app/TextParser/TableTaxSummary.php @@ -7,8 +7,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class TableTaxSummary extends Base @@ -41,7 +41,9 @@ public function process() } else { $currency = $baseCurrency['id']; } - $currencyData = \App\Fields\Currency::getById($currency); + $currencySymbol = \App\Fields\Currency::getById($currency)['currency_symbol']; + } else { + $currencySymbol = \App\Fields\Currency::getDefault()['currency_symbol']; } if (!empty($fields[0])) { $taxes = []; @@ -65,19 +67,19 @@ public function process() $html .= ' - + '; foreach ($taxes as $key => &$tax) { $taxAmount += $tax; $html .= ' - + '; } $html .= ' - - + +
' . \App\Language::translate('LBL_TAX_SUMMARY', $this->textParser->moduleName) . '' . \App\Language::translate('LBL_TAX_SUMMARY', $this->textParser->moduleName) . '
' . $key . '%' . \CurrencyField::convertToUserFormat($tax, null, true) . ' ' . $currencyData['currency_symbol'] . '' . \CurrencyField::convertToUserFormatSymbol($tax, true, $currencySymbol) . '
' . (\in_array('hideSumName', $this->params) ? '' : \App\Language::translate('LBL_AMOUNT', $this->textParser->moduleName)) . '' . \CurrencyField::convertToUserFormat($taxAmount, null, true) . ' ' . $currencyData['currency_symbol'] . '' . (\in_array('hideSumName', $this->params) ? '' : \App\Language::translate('LBL_AMOUNT', $this->textParser->moduleName)) . '' . \CurrencyField::convertToUserFormatSymbol($taxAmount, true, $currencySymbol) . '
'; diff --git a/app/TextParser/UserCalendar.php b/app/TextParser/UserCalendar.php index 8340b31a0779..95a2f24acf27 100644 --- a/app/TextParser/UserCalendar.php +++ b/app/TextParser/UserCalendar.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek */ diff --git a/app/TextParser/UserLoginHistory.php b/app/TextParser/UserLoginHistory.php index 31ba2284828d..1f1ec9961045 100644 --- a/app/TextParser/UserLoginHistory.php +++ b/app/TextParser/UserLoginHistory.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek */ diff --git a/app/TextParser/UserNewRecords.php b/app/TextParser/UserNewRecords.php index 16d3721754e0..6a92da8cf81f 100644 --- a/app/TextParser/UserNewRecords.php +++ b/app/TextParser/UserNewRecords.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek */ diff --git a/app/TextParser/UserOverdue.php b/app/TextParser/UserOverdue.php index b7200fb1bef8..deddedfe5beb 100644 --- a/app/TextParser/UserOverdue.php +++ b/app/TextParser/UserOverdue.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek */ diff --git a/app/TextParser/UserRecordsDuplicateList.php b/app/TextParser/UserRecordsDuplicateList.php index 32c3ed7d4ec2..f2a6c1207293 100644 --- a/app/TextParser/UserRecordsDuplicateList.php +++ b/app/TextParser/UserRecordsDuplicateList.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek */ diff --git a/app/TextParser/UserRecordsList.php b/app/TextParser/UserRecordsList.php index 716e15309784..956500476f31 100644 --- a/app/TextParser/UserRecordsList.php +++ b/app/TextParser/UserRecordsList.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ diff --git a/app/TextParser/UserSSalesProcesses.php b/app/TextParser/UserSSalesProcesses.php index 4c67e3e9a33f..9cd7e8f58a3d 100644 --- a/app/TextParser/UserSSalesProcesses.php +++ b/app/TextParser/UserSSalesProcesses.php @@ -5,8 +5,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek */ diff --git a/app/TextParser/UserVariable.php b/app/TextParser/UserVariable.php index 202281c0113f..d1d1407c8fc1 100644 --- a/app/TextParser/UserVariable.php +++ b/app/TextParser/UserVariable.php @@ -4,8 +4,8 @@ * * @package TextParser * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ diff --git a/app/TextUtils.php b/app/TextUtils.php new file mode 100644 index 000000000000..b836b21691f0 --- /dev/null +++ b/app/TextUtils.php @@ -0,0 +1,190 @@ + + */ + +namespace App; + +/** + * Text utils class. + */ +class TextUtils +{ + /** + * Get text length. + * + * @param string $text + * + * @return int + */ + public static function getTextLength($text) + { + return null !== $text ? mb_strlen($text) : 0; + } + + /** + * Truncating text. + * + * @param string $text + * @param bool|int $length + * @param bool $addDots + * + * @return string + */ + public static function textTruncate($text, $length = false, $addDots = true) + { + if (!$length) { + $length = Config::main('listview_max_textlength'); + } + $textLength = 0; + if (null !== $text) { + $textLength = mb_strlen($text); + } + if ((!$addDots && $textLength > $length) || ($addDots && $textLength > $length + 2)) { + $text = mb_substr($text, 0, $length, Config::main('default_charset')); + if ($addDots) { + $text .= '...'; + } + } + return $text; + } + + /** + * Truncating HTML by words. + * + * @param string $html + * @param int $length + * @param string $ending + * + * @return string + */ + public static function htmlTruncateByWords(string $html, int $length = 0, string $ending = '...'): string + { + if (!$length) { + $length = Config::main('listview_max_textlength'); + } + if (\strlen(strip_tags($html)) <= $length) { + return $html; + } + $totalLength = \mb_strlen($ending); + $openTagsLength = 0; + $openTags = []; + preg_match_all('/(<.+?>)?([^<>]*)/s', $html, $tags, PREG_SET_ORDER); + $html = ''; + foreach ($tags as $tag) { + $tagLength = \mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $tag[2])); + if (($totalLength + $tagLength + $openTagsLength) >= $length) { + if (empty($html)) { + preg_match('/^<\s*([^\s>!]+).*?>$/s', $tag[1], $tagName); + $openTags[] = $tagName[1]; + $html = $tag[1] . self::textTruncate($tag[2], $length - 3, false); + } + break; + } + if (!empty($tag[1])) { + if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $tag[1])) { + // if tag is a closing tag + } elseif (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $tag[1], $tagName)) { + $pos = array_search(strtolower($tagName[1]), $openTags); + if (false !== $pos) { + unset($openTags[$pos]); + $openTagsLength -= \mb_strlen(""); + } + } elseif (preg_match('/^<\s*([^\s>!]+).*?>$/s', $tag[1], $tagName)) { + array_unshift($openTags, strtolower($tagName[1])); + $openTagsLength += \mb_strlen(""); + } + } + $html .= $tag[0]; + $totalLength += $tagLength; + } + $html .= $ending; + if ($openTags) { + $html .= ''; + } + return $html; + } + + /** + * Truncating HTML. + * + * @param string $html + * @param int $length + * @param string $ending + * + * @return string + */ + public static function htmlTruncate(string $html, int $length = 255, string $ending = '...'): string + { + if (\strlen($html) <= $length) { + return $html; + } + $totalLength = \mb_strlen($ending); + $openTagsLength = 0; + $openTags = []; + preg_match_all('/(<.+?>)?([^<>]*)/s', $html, $tags, PREG_SET_ORDER); + $html = ''; + foreach ($tags as $tag) { + $tagLength = \mb_strlen($tag[0]); + if (($totalLength + $tagLength + $openTagsLength) >= $length) { + if (empty($html)) { + preg_match('/^<\s*([^\s>!]+).*?>$/s', $tag[1], $tagName); + $openTags[] = $tagName[1]; + $html = $tag[1] . self::textTruncate($tag[2], $length - 3, false); + } + break; + } + if (!empty($tag[1])) { + if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $tag[1])) { + // if tag is a closing tag + } elseif (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $tag[1], $tagName)) { + $pos = array_search(strtolower($tagName[1]), $openTags); + if (false !== $pos) { + unset($openTags[$pos]); + $openTagsLength -= \mb_strlen(""); + } + } elseif (preg_match('/^<\s*([^\s>!]+).*?>$/s', $tag[1], $tagName)) { + array_unshift($openTags, strtolower($tagName[1])); + $openTagsLength += \mb_strlen(""); + } + } + $html .= $tag[0]; + $totalLength += $tagLength; + } + $html .= $ending; + if ($openTags) { + $html .= ''; + } + return $html; + } + + /** + * Get all attributes of a tag. + * + * @param string $tag + * + * @return string[] + */ + public static function getTagAttributes(string $tag): array + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $previousValue = libxml_use_internal_errors(true); + $dom->loadHTML('' . $tag); + libxml_clear_errors(); + libxml_use_internal_errors($previousValue); + $tag = $dom->getElementsByTagName('*')->item(2); + $attributes = []; + if ($tag->hasAttributes()) { + foreach ($tag->attributes as $attr) { + $attributes[$attr->name] = $attr->value; + } + } + return $attributes; + } +} diff --git a/app/UpdateUtils.php b/app/UpdateUtils.php deleted file mode 100644 index f3cb9c1b5427..000000000000 --- a/app/UpdateUtils.php +++ /dev/null @@ -1,107 +0,0 @@ - - */ -class UpdateUtils -{ - /** - * Function to update configuration files. - * Requires optimization. - * - * @param array $params - */ - public static function updateConfigurationFiles($params) - { - $rootDirectory = ROOT_DIRECTORY . \DIRECTORY_SEPARATOR; - foreach ($params as $config) { - if (!$config) { - continue; - } - $fileName = $rootDirectory . $config['name']; - if (file_exists($fileName)) { - $baseContent = file_get_contents($fileName); - $configContent = $configContentClone = file($fileName); - $emptyLine = false; - $addContent = []; - $indexes = []; - foreach ($configContent as $key => $line) { - if ($emptyLine && 1 == \strlen($line)) { - unset($configContent[$key]); - $emptyLine = false; - continue; - } - $emptyLine = false; - foreach ($config['conditions'] as $index => $condition) { - if (empty($condition)) { - continue; - } - if ('add' === $condition['type'] && !\in_array($index, $indexes)) { - $addContent[$index] = $condition['value']; - $indexes[] = $index; - } - if (false !== strpos($line, $condition['search'])) { - switch ($condition['type']) { - case 'add': - if ($condition['checkInContents'] && false === strpos($baseContent, $condition['checkInContents'])) { - $configContent[$key] = 'before' === $condition['addingType'] ? $condition['value'] . $configContent[$key] : $configContent[$key] . $condition['value']; - } - unset($addContent[$index]); - break; - case 'remove': - if (!empty($condition['before'])) { - if (false !== strpos($configContentClone[$key - 1], $condition['before'])) { - unset($configContent[$key]); - $emptyLine = true; - } - } else { - unset($configContent[$key]); - $emptyLine = true; - } - break; - case 'removeTo': - unset($configContent[$key]); - $while = 0; - while (false !== $while) { - ++$while; - unset($configContent[$key + $while]); - if (false === strpos($configContent[$key + $while], $condition['end'])) { - $while = false; - } - } - $emptyLine = true; - break; - case 'update': - if ($condition['checkInLine'] && (false !== strpos($condition['checkInLine'], $configContent[$key]))) { - break; - } - if ($condition['replace']) { - $configContent[$key] = str_replace($condition['replace'][0], $condition['replace'][1], $configContent[$key]); - } else { - $configContent[$key] = $condition['value']; - } - break; - default: - break; - } - } - } - } - $content = implode('', $configContent); - if ($addContent) { - $addContentString = implode('', $addContent); - $content .= $addContentString; - } - file_put_contents($fileName, $content, LOCK_EX); - } - } - } -} diff --git a/app/User.php b/app/User.php index 2c7bf557d878..eada1d2e61ff 100644 --- a/app/User.php +++ b/app/User.php @@ -7,8 +7,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski * @author Radosław Skrzypczak */ @@ -20,6 +20,10 @@ class User protected static $userModelCache = []; protected $privileges = []; + protected static $userPrivilegesCache = []; + + protected static $userSharingCache = []; + /** * Get current user Id. * @@ -99,8 +103,6 @@ public static function &getUserModel($userId) return $userModel; } - protected static $userPrivilegesCache = false; - /** * Get base privileges from file by id. * @@ -108,13 +110,13 @@ public static function &getUserModel($userId) * * @return array */ - public static function getPrivilegesFile($userId) + public static function getPrivilegesFile($userId): array { if (isset(static::$userPrivilegesCache[$userId])) { return self::$userPrivilegesCache[$userId]; } if (!file_exists("user_privileges/user_privileges_{$userId}.php")) { - return null; + return []; } $privileges = require "user_privileges/user_privileges_{$userId}.php"; @@ -161,8 +163,6 @@ public static function clearCache($userId = false) } } - protected static $userSharingCache = []; - /** * Get sharing privileges from file by id. * @@ -243,9 +243,9 @@ public function getProfiles() * * @return array */ - public function getGroups() + public function getGroups(): array { - return $this->privileges['groups'] ?? null; + return $this->privileges['groups'] ?? []; } /** @@ -255,9 +255,7 @@ public function getGroups() */ public function getGroupNames() { - return array_filter(\App\Fields\Owner::getInstance('CustomView')->getGroups(false), function ($key) { - return \in_array($key, $this->getGroups()); - }, ARRAY_FILTER_USE_KEY); + return array_filter(\App\Fields\Owner::getInstance('CustomView')->getGroups(false), fn ($key) => \in_array($key, $this->getGroups()), ARRAY_FILTER_USE_KEY); } /** @@ -265,11 +263,21 @@ public function getGroupNames() * * @return string */ - public function getRole() + public function getRole(): string { return $this->privileges['details']['roleid']; } + /** + * Get user role Id. + * + * @return string + */ + public function getRoleName(): string + { + return $this->privileges['roleName']; + } + /** * Get user role instance. * @@ -479,11 +487,15 @@ public function getImage() return Cache::get('UserImageById', $this->getId()); } $image = Json::decode($this->getDetail('imagename')); - if (empty($image) || !($imageData = \current($image))) { + if (empty($image) || !($imageData = current($image))) { return []; } $imageData['path'] = ROOT_DIRECTORY . \DIRECTORY_SEPARATOR . $imageData['path']; - $imageData['url'] = "file.php?module=Users&action=MultiImage&field=imagename&record={$this->getId()}&key={$imageData['key']}"; + if (file_exists($imageData['path'])) { + $imageData['url'] = "file.php?module=Users&action=MultiImage&field=imagename&record={$this->getId()}&key={$imageData['key']}"; + } else { + $imageData = []; + } Cache::save('UserImageById', $this->getId(), $imageData); return $imageData; } @@ -537,7 +549,7 @@ public static function getNumberOfUsers(): int if (Cache::has('NumberOfUsers', '')) { return Cache::get('NumberOfUsers', ''); } - $count = (new Db\Query())->from('vtiger_users')->where(['status' => 'Active'])->andWhere(['<>', 'id', 1])->count(); + $count = (new Db\Query())->from('vtiger_users')->where(['status' => 'Active'])->count(); Cache::save('NumberOfUsers', '', $count, Cache::LONG); return $count; } diff --git a/app/UserPrivilegesFile.php b/app/UserPrivilegesFile.php index c70a3845b24a..e79da396c444 100644 --- a/app/UserPrivilegesFile.php +++ b/app/UserPrivilegesFile.php @@ -7,8 +7,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) */ class UserPrivilegesFile { diff --git a/app/Utils.php b/app/Utils.php index 0358a5a0b1e5..309fb1081fdb 100644 --- a/app/Utils.php +++ b/app/Utils.php @@ -7,8 +7,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class Utils @@ -29,7 +29,7 @@ public static function getInitials(string $name): string /** * Outputs or returns a parsable string representation of a variable. * - * @see http://php.net/manual/en/function.var-export.php + * @see https://php.net/manual/en/function.var-export.php * * @param mixed $variable * @@ -72,21 +72,59 @@ public static function isAssoc(array $arr) * Flatten a multi-dimensional array into a single level. * * @param array $array - * @param int $depth + * @param float $depth * * @return array */ - public static function flatten($array, $depth = INF) + public static function flatten(array $array, float $depth = INF): array { $result = []; foreach ($array as $item) { - if (!\is_array($item)) { - $result[] = $item; - } else { + if (\is_array($item)) { $values = 1 === $depth ? array_values($item) : static::flatten($item, $depth - 1); foreach ($values as $value) { $result[] = $value; } + } else { + $result[] = $item; + } + } + return $result; + } + + /** + * Flatten the multidimensional array on one level, keeping the key names unique. + * + * @param array $array + * @param string $type + * @param float $depth + * + * @return array + */ + public static function flattenKeys(array $array, string $type = '_', float $depth = INF): array + { + $result = []; + foreach ($array as $key => $item) { + if (\is_array($item)) { + if (1 === $depth) { + $values = array_values($item); + } else { + $values = static::flattenKeys($item, $type, $depth - 1); + } + foreach ($values as $keySec => $value) { + switch ($type) { + case 'ucfirst': + $keySec = \ucfirst($keySec); + $newKey = "{$key}{$keySec}"; + break; + default: + $newKey = "{$key}{$type}{$keySec}"; + break; + } + $result[$newKey] = $value; + } + } else { + $result[$key] = $item; } } return $result; diff --git a/app/Utils/Backup.php b/app/Utils/Backup.php index 82162889bf12..9442894f3419 100644 --- a/app/Utils/Backup.php +++ b/app/Utils/Backup.php @@ -4,9 +4,10 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Dudek + * @author Radosław Skrzypczak */ namespace App\Utils; @@ -49,22 +50,23 @@ public static function readCatalog(string $catalogToRead) if (!empty($catalogToReadArray) && empty($returnStructure['manage'])) { array_pop($catalogToReadArray); $parentUrl = implode(\DIRECTORY_SEPARATOR, $catalogToReadArray); - $returnStructure['manage'] = "{$requestUrl}&catalog={$parentUrl}"; + $returnStructure['manage'] = "{$requestUrl}&catalog=" . rawurlencode($parentUrl); } } else { $record = [ 'name' => $element->getBasename(), ]; if ($element->isDir()) { - if ($element->isReadable()) { - $record['url'] = "{$requestUrl}&catalog={$urlDirectory}{$record['name']}"; + if (!$element->isReadable() || !\App\Validator::dirName($element->getBasename())) { + continue; } + $record['url'] = "{$requestUrl}&catalog=" . rawurlencode($urlDirectory . $record['name']); $returnStructure['catalogs'][] = $record; } else { - if (!$element->isReadable() || !\in_array($element->getExtension(), $allowedExtensions)) { + if (!$element->isReadable() || !\in_array($element->getExtension(), $allowedExtensions) || !\App\Validator::dirName($element->getBasename())) { continue; } - $record['url'] = "{$requestUrl}&action=DownloadFile&file={$urlDirectory}{$record['name']}"; + $record['url'] = "{$requestUrl}&action=DownloadFile&file=" . rawurlencode($urlDirectory . $record['name']); $record['date'] = \App\Fields\DateTime::formatToDisplay(date('Y-m-d H:i:s', $element->getMTime())); $record['size'] = \vtlib\Functions::showBytes($element->getSize()); $returnStructure['files'][] = $record; diff --git a/app/Utils/Benchmarks.php b/app/Utils/Benchmarks.php index d31fcd72251c..c7357e387af1 100644 --- a/app/Utils/Benchmarks.php +++ b/app/Utils/Benchmarks.php @@ -5,8 +5,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ diff --git a/app/Utils/BusinessHours.php b/app/Utils/BusinessHours.php index 2770cb0613b0..1f393d543795 100644 --- a/app/Utils/BusinessHours.php +++ b/app/Utils/BusinessHours.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Radosław Skrzypczak */ diff --git a/app/Utils/Completions.php b/app/Utils/Completions.php index 740bc6eacc86..be21a4c71517 100644 --- a/app/Utils/Completions.php +++ b/app/Utils/Completions.php @@ -5,9 +5,10 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Arkadiusz Adach + * @author Mariusz Krzaczkowski */ namespace App\Utils; @@ -70,20 +71,12 @@ class Completions */ public static function decode(string $text, string $format = self::FORMAT_HTML): string { - $emojis = static::getEmojis(); - $textOut = \preg_replace_callback( - static::EMOJI_REGEX, - function (array $matches) use ($emojis) { - return $emojis[$matches[0]] ?? $matches[0]; - }, - $text - ); + $text = self::decodeEmoji($text); + $text = self::decodeCustomTag($text); return \preg_replace_callback( static::ROW_REGEX, - function (array $matches) use ($format) { - return static::decodeRow($matches[0], $matches[1], (int) $matches[2], $matches[3], $format); - }, - $textOut + fn (array $matches) => static::decodeRow($matches[0], $matches[1], (int) $matches[2], $matches[3], $format), + $text ); } @@ -99,13 +92,41 @@ public static function decodeEmoji(string $text): string $emojis = static::getEmojis(); return \preg_replace_callback( static::EMOJI_REGEX, - function (array $matches) use ($emojis) { - return $emojis[$matches[0]] ?? $matches[0]; - }, + fn (array $matches) => $emojis[$matches[0]] ?? $matches[0], $text ); } + /** + * Decode custom yetiforce tag. + * + * @see https://github.com/YetiForceCompany/lib_roundcube/tree/developer/plugins/yetiforce/yetiforce.php#:~:text=function%20decodeCustomTag Function: decodeCustomTag + * + * @param string $text + * + * @return string + */ + public static function decodeCustomTag(string $text): string + { + if (false !== strpos($text, '<\/yetiforce>/', function (array $matches) { + $attributes = \App\TextUtils::getTagAttributes($matches[0]); + $return = ''; + if (!empty($attributes['type'])) { + switch ($attributes['type']) { + case 'Documents': + $return = ''; + break; + default: + break; + } + } + return $return; + }, $text); + } + return $text; + } + /** * Get text to edit mode. * @@ -120,9 +141,7 @@ public static function encode(string $text): string $emojis = static::getEmojis(); $textOut = \preg_replace_callback( static::EMOJI_REGEX, - function (array $matches) use ($emojis) { - return $emojis[$matches[0]] ?? $matches[0]; - }, + fn (array $matches) => $emojis[$matches[0]] ?? $matches[0], $text ); return \preg_replace_callback( diff --git a/app/Utils/ConfReport.php b/app/Utils/ConfReport.php index 76b083dedbaf..257cc871b449 100644 --- a/app/Utils/ConfReport.php +++ b/app/Utils/ConfReport.php @@ -5,8 +5,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski * @author Radosław Skrzypczak */ @@ -33,7 +33,7 @@ class ConfReport ]; /** @var array Urls to check in request. */ - public static $urlsToCheck = ['root' => 'token.php', 'js' => 'layouts/resources/Tools.js', 'css' => 'layouts/resources/fonts/fonts.css']; + public static $urlsToCheck = ['root' => 'cron.php', 'js' => 'layouts/resources/Tools.js', 'css' => 'layouts/resources/fonts/fonts.css']; /** * List all variables. @@ -55,7 +55,7 @@ class ConfReport * @var array */ public static $stability = [ - 'phpVersion' => ['recommended' => '7.3.x, 7.4.x, 8.0.x', 'type' => 'Version', 'container' => 'env', 'testCli' => true, 'label' => 'PHP'], + 'phpVersion' => ['recommended' => '7.4.x, 8.0.x, 8.1.x (dev)', 'type' => 'Version', 'container' => 'env', 'testCli' => true, 'label' => 'PHP'], 'protocolVersion' => ['recommended' => '2.0, 1.x', 'type' => 'Version', 'container' => 'env', 'testCli' => false, 'label' => 'PROTOCOL_VERSION'], 'error_reporting' => ['recommended' => 'E_ALL & ~E_NOTICE', 'type' => 'ErrorReporting', 'container' => 'php', 'testCli' => true], 'output_buffering' => ['recommended' => 'On', 'type' => 'OnOffInt', 'container' => 'php', 'testCli' => true], @@ -74,11 +74,13 @@ class ConfReport 'session.gc_maxlifetime' => ['recommended' => 1440, 'type' => 'Greater', 'container' => 'php', 'testCli' => true], 'session.gc_divisor' => ['recommended' => 500, 'type' => 'Greater', 'container' => 'php', 'testCli' => true], 'session.gc_probability' => ['recommended' => 1, 'type' => 'Equal', 'container' => 'php', 'testCli' => true], - 'mbstring.func_overload' => ['recommended' => 'Off', 'type' => 'OnOff', 'container' => 'php', 'testCli' => true], //Roundcube + 'suhosin.session.encrypt' => ['recommended' => 'Off', 'type' => 'Equal', 'container' => 'php', 'testCli' => true], //Roundcube + 'mbstring.func_overload' => ['recommended' => 0, 'type' => 'Equal', 'container' => 'php', 'testCli' => true], //Roundcube + 'pcre.backtrack_limit' => ['recommended' => 100000, 'type' => 'Greater', 'container' => 'php', 'testCli' => true], //Roundcube 'date.timezone' => ['type' => 'TimeZone', 'container' => 'php', 'testCli' => true], //Roundcube 'allow_url_fopen' => ['recommended' => 'On', 'type' => 'OnOff', 'container' => 'php', 'testCli' => true], //Roundcube 'auto_detect_line_endings' => ['recommended' => 'On', 'type' => 'OnOff', 'container' => 'php', 'testCli' => true], //CSVReader - 'httpMethods' => ['recommended' => 'GET, POST, PUT, OPTIONS, PATCH, PROPFIND, REPORT, LOCK, DELETE, COPY, MOVE', 'type' => 'HttpMethods', 'container' => 'request', 'testCli' => true, 'label' => 'HTTP_METHODS'], + // 'httpMethods' => ['recommended' => 'GET, POST, PUT, OPTIONS, PATCH, PROPFIND, REPORT, LOCK, DELETE, COPY, MOVE', 'type' => 'HttpMethods', 'container' => 'request', 'testCli' => true, 'label' => 'HTTP_METHODS'], 'request_order' => ['recommended' => 'GP', 'type' => 'Equal', 'container' => 'php', 'testCli' => true], 'variables_order' => ['recommended' => 'GPCS', 'type' => 'Equal', 'container' => 'php', 'testCli' => true], 'opcache.jit' => ['container' => 'php', 'testCli' => true], @@ -114,7 +116,7 @@ class ConfReport * @var array */ public static $headers = [ - 'Header: server' => ['recommended' => '', 'type' => 'Header', 'container' => 'request', 'testCli' => false], + 'Header: server' => ['recommended' => '', 'type' => 'HeaderServer', 'container' => 'request', 'testCli' => false], 'Header: x-powered-by' => ['recommended' => '', 'type' => 'Header', 'contaiuse_only_cookiesner' => 'request', 'testCli' => false], 'Header: access-control-allow-methods' => ['recommended' => 'GET, POST', 'type' => 'Header', 'container' => 'request', 'testCli' => false, 'onlyPhp' => true], 'Header: access-control-allow-origin' => ['recommended' => '*', 'type' => 'Header', 'container' => 'request', 'testCli' => false, 'onlyPhp' => true], @@ -160,11 +162,12 @@ class ConfReport 'filter' => ['mandatory' => true, 'type' => 'ExtExist', 'extName' => 'filter', 'container' => 'ext', 'testCli' => true], 'ctype' => ['mandatory' => true, 'type' => 'ExtExist', 'extName' => 'ctype', 'container' => 'ext', 'testCli' => true], 'hash' => ['mandatory' => true, 'type' => 'ExtExist', 'extName' => 'hash', 'container' => 'ext', 'testCli' => true], - 'exif' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'exif', 'container' => 'ext', 'testCli' => true], - 'ldap' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'ldap', 'container' => 'ext', 'testCli' => true], - 'OPcache' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'Zend OPcache', 'container' => 'ext', 'testCli' => true], - 'apcu' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'apcu', 'container' => 'ext', 'testCli' => true, 'mode' => 'showWarnings'], - 'imagick' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'imagick', 'container' => 'ext', 'testCli' => true, 'mode' => 'showWarnings'], + 'exif' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'exif', 'container' => 'ext', 'testCli' => true, 'showHelp' => true, 'mode' => 'showWarnings'], + 'ldap' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'ldap', 'container' => 'ext', 'testCli' => true, 'showHelp' => true, 'mode' => 'showWarnings'], + 'OPcache' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'Zend OPcache', 'container' => 'ext', 'testCli' => true, 'showHelp' => true, 'mode' => 'showWarnings'], + 'apcu' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'apcu', 'container' => 'ext', 'testCli' => true, 'showHelp' => true, 'mode' => 'showWarnings'], + 'imagick' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'imagick', 'container' => 'ext', 'testCli' => true, 'showHelp' => true, 'mode' => 'showWarnings'], + 'pdo_sqlsrv' => ['mandatory' => false, 'type' => 'ExtExist', 'extName' => 'pdo_sqlsrv', 'container' => 'ext', 'testCli' => true, 'showHelp' => false, 'mode' => 'showWarnings'], 'allExt' => ['container' => 'ext', 'type' => 'AllExt', 'testCli' => true, 'label' => 'EXTENSIONS'], ]; @@ -181,16 +184,18 @@ class ConfReport 'version_comment' => ['container' => 'db', 'testCli' => true, 'label' => 'DB_VERSION_COMMENT'], 'connectionStatus' => ['container' => 'db', 'testCli' => true, 'label' => 'DB_CONNECTION_STATUS'], 'serverInfo' => ['container' => 'db', 'testCli' => true, 'label' => 'DB_SERVER_INFO'], - 'maximumMemorySize' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true, 'label' => 'DB_MAXIMUM_MEMORY_SIZE', 'showHelp' => true], + 'maxUsedMemory' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true, 'label' => 'DB_MAXIMUM_MEMORY_SIZE', 'showHelp' => true, 'desc' => 'maxUsedMemoryDesc'], 'key_buffer_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], + 'max_tmp_table_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], + 'aria_pagecache_buffer_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], 'have_query_cache' => ['container' => 'db', 'testCli' => true], 'query_cache_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], 'query_cache_type' => ['container' => 'db', 'testCli' => true], 'table_cache' => ['container' => 'db', 'testCli' => true], 'table_open_cache_instances' => ['container' => 'db', 'testCli' => true], - 'table_open_cache' => ['recommended' => 1000, 'type' => 'Greater', 'container' => 'db', 'testCli' => true], - 'table_definition_cache' => ['type' => 'DbTableDefinitionCache', 'container' => 'db', 'testCli' => true], - 'open_files_limit' => ['container' => 'db', 'testCli' => true], + 'table_open_cache' => ['recommended' => 1000, 'type' => 'Greater', 'container' => 'db', 'testCli' => true, 'mode' => 'showWarnings'], + 'table_definition_cache' => ['type' => 'DbTableDefinitionCache', 'container' => 'db', 'testCli' => true, 'mode' => 'showWarnings'], + 'open_files_limit' => ['container' => 'db', 'type' => 'DbOpenFilesLimit', 'testCli' => true], 'tmp_table_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], 'innodb_buffer_pool_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], 'innodb_additional_mem_pool_size' => ['container' => 'db', 'type' => 'ShowBytes', 'testCli' => true], @@ -218,8 +223,8 @@ class ConfReport 'innodb_ft_min_token_size' => ['container' => 'db', 'testCli' => true], 'innodb_default_row_format' => ['recommended' => 'dynamic', 'type' => 'Equal', 'container' => 'db', 'testCli' => true], 'innodb_strict_mode' => ['container' => 'db', 'testCli' => true], - 'innodb_large_prefix' => ['recommended' => 'On', 'type' => 'OnOff', 'container' => 'db', 'testCli' => true], - 'innodb_file_per_table' => ['recommended' => 'On', 'type' => 'OnOff', 'container' => 'db', 'testCli' => true], + 'innodb_large_prefix' => ['recommended' => 'On', 'type' => 'OnOff', 'container' => 'db', 'testCli' => true], //Roundcube + 'innodb_file_per_table' => ['recommended' => 'On', 'type' => 'OnOff', 'container' => 'db', 'testCli' => true], //Roundcube 'innodb_stats_on_metadata' => ['recommended' => 'Off', 'type' => 'OnOff', 'container' => 'db', 'testCli' => true], 'innodb_buffer_pool_instances' => ['container' => 'db', 'testCli' => true], 'innodb_buffer_pool_load_at_startup' => ['container' => 'db', 'testCli' => true], @@ -338,6 +343,7 @@ class ConfReport 'spaceBackup' => ['container' => 'env', 'type' => 'Space', 'testCli' => false, 'label' => 'SPACE_BACKUP'], 'lastCronStart' => ['container' => 'env', 'testCli' => false, 'label' => 'LAST_CRON_START', 'isHtml' => true], 'crmProvider' => ['container' => 'env', 'testCli' => true, 'label' => 'CRM_PROVIDER'], + 'appId' => ['container' => 'env', 'testCli' => true, 'label' => 'APP_ID'], 'open_basedir' => ['container' => 'php', 'type' => 'OpenBasedir', 'testCli' => true, 'mode' => 'showWarnings'], 'caCertBundle' => ['recommended' => 'On', 'container' => 'env', 'type' => 'OnOff', 'testCli' => true, 'label' => 'CACERTBUNDLE'], 'caCertBundlePath' => ['recommended' => 'On', 'container' => 'env', 'testCli' => true, 'label' => 'CACERTBUNDLE_PATH'], @@ -365,7 +371,7 @@ class ConfReport * @var array */ public static $pathVerification = [ - 'webservice/WebserviceStandard/' => ['type' => 'ExistsUrl', 'container' => 'request', 'testCli' => false], + 'webservice/WebserviceStandard/' => ['type' => 'Webservice', 'container' => 'request', 'testCli' => false], '.well-known/carddav' => ['type' => 'ExistsUrl', 'container' => 'request', 'testCli' => false], '.well-known/caldav' => ['type' => 'ExistsUrl', 'container' => 'request', 'testCli' => false], 'robots.txt' => ['type' => 'ExistsUrl', 'container' => 'request', 'testCli' => false], @@ -378,49 +384,50 @@ class ConfReport * @var array */ public static $writableFilesAndFolders = [ + 'cron.php' => ['type' => 'IsWritable', 'testCli' => true], 'app_data/cron.php' => ['type' => 'IsWritable', 'testCli' => true], 'app_data/registration.php' => ['type' => 'IsWritable', 'testCli' => true], - 'app_data/moduleHierarchy.php' => ['type' => 'IsWritable', 'testCli' => true], + 'app_data/moduleHierarchy.php' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'app_data/shop.php' => ['type' => 'IsWritable', 'testCli' => true], 'app_data/icons.php' => ['type' => 'IsWritable', 'testCli' => true], 'app_data/LanguagesUpdater.json' => ['type' => 'IsWritable', 'testCli' => true], 'app_data/SystemUpdater.json' => ['type' => 'IsWritable', 'testCli' => true], 'app_data/libraries.json' => ['type' => 'IsWritable', 'testCli' => true], - 'user_privileges/tabdata.php' => ['type' => 'IsWritable', 'testCli' => true], + 'user_privileges/tabdata.php' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'user_privileges/menu_0.php' => ['type' => 'IsWritable', 'testCli' => true], 'user_privileges/user_privileges_1.php' => ['type' => 'IsWritable', 'testCli' => true], 'cache/logs/system.log' => ['type' => 'IsWritable', 'testCli' => true], - 'app_data/' => ['type' => 'IsWritable', 'testCli' => true], + 'app_data/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'app_data/shop/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/' => ['type' => 'IsWritable', 'testCli' => true], + 'cache/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'cache/addressBook/' => ['type' => 'IsWritable', 'testCli' => true], 'cache/images/' => ['type' => 'IsWritable', 'testCli' => true], 'cache/import/' => ['type' => 'IsWritable', 'testCli' => true], 'cache/mail/' => ['type' => 'IsWritable', 'testCli' => true], 'cache/pdf/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/logs/' => ['type' => 'IsWritable', 'testCli' => true], + 'cache/logs/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'cache/logs/cron/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/session/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/templates_c/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/upload/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/vtlib/' => ['type' => 'IsWritable', 'testCli' => true], - 'cache/vtlib/HTML' => ['type' => 'IsWritable', 'testCli' => true], - 'config/' => ['type' => 'IsWritable', 'testCli' => true], - 'config/Components' => ['type' => 'IsWritable', 'testCli' => true], - 'config/Modules' => ['type' => 'IsWritable', 'testCli' => true], - 'user_privileges/' => ['type' => 'IsWritable', 'testCli' => true], + 'cache/session/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'cache/templates_c/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'cache/upload/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'cache/vtlib/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'cache/vtlib/HTML' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'config/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'config/Components' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'config/Modules' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'user_privileges/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'cron/modules/' => ['type' => 'IsWritable', 'testCli' => true], - 'languages/' => ['type' => 'IsWritable', 'testCli' => true], + 'languages/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'install/' => ['type' => 'IsWritable', 'testCli' => true], - 'modules/' => ['type' => 'IsWritable', 'testCli' => true], - 'storage/' => ['type' => 'IsWritable', 'testCli' => true], + 'modules/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'storage/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], 'storage/Products/' => ['type' => 'IsWritable', 'testCli' => true], 'storage/Users/' => ['type' => 'IsWritable', 'testCli' => true], 'storage/Contacts/' => ['type' => 'IsWritable', 'testCli' => true], 'storage/OSSMailView/' => ['type' => 'IsWritable', 'testCli' => true], - 'public_html/modules/OSSMail/' => ['type' => 'IsWritable', 'testCli' => true], - 'public_html/libraries/' => ['type' => 'IsWritable', 'testCli' => true], - 'public_html/layouts/resources/Logo/' => ['type' => 'IsWritable', 'testCli' => true], + 'public_html/modules/OSSMail/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'public_html/libraries/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], + 'public_html/layouts/resources/Logo/' => ['type' => 'IsWritable', 'testCli' => true, 'mustExist' => true], ]; /** * Functionality test map. @@ -429,7 +436,8 @@ class ConfReport */ public static $functionalVerification = [ 'branding' => ['type' => 'Branding', 'testCli' => false, 'label' => 'FOOTER', 'mode' => 'onlyText'], - 'shop' => ['type' => 'ShopProducts', 'testCli' => false, 'label' => 'PREMIUM_MODULES', 'mode' => 'onlyText'], + 'watchdog' => ['type' => 'Watchdog', 'testCli' => true, 'label' => 'WATCHDOG', 'mode' => 'onlyText'], + 'register' => ['type' => 'Register', 'testCli' => true, 'label' => 'REGISTER', 'mode' => 'onlyText'], ]; /** * Php variables. @@ -554,10 +562,10 @@ private static function init(string $type) break; case 'writableFilesAndFolders': if ($tmp = sys_get_temp_dir()) { - self::$writableFilesAndFolders[$tmp] = ['type' => 'IsWritable', 'testCli' => true, 'absolutePaths' => true]; + self::$writableFilesAndFolders[$tmp] = ['type' => 'IsWritable', 'testCli' => true, 'absolutePaths' => true, 'mustExist' => true]; } if ($tmp = ini_get('upload_tmp_dir')) { - self::$writableFilesAndFolders[$tmp] = ['type' => 'IsWritable', 'testCli' => true, 'absolutePaths' => true]; + self::$writableFilesAndFolders[$tmp] = ['type' => 'IsWritable', 'testCli' => true, 'absolutePaths' => true, 'mustExist' => true]; } break; default: @@ -610,13 +618,14 @@ public static function getConfig() 'crmDir' => ROOT_DIRECTORY, 'operatingSystem' => 'demo' === \App\Config::main('systemMode') ? php_uname('s') : php_uname(), 'serverSoftware' => $_SERVER['SERVER_SOFTWARE'] ?? '-', - 'currentUser' => (\function_exists('get_current_user') ? get_current_user() : '') . ((\function_exists('getmyuid') && getmyuid()) ? ' (uid:' . getmyuid() . ')' : '') . ((\function_exists('posix_getpwuid') && \function_exists('posix_geteuid')) ? ' (posix:' . posix_getpwuid(posix_geteuid())['name'] . ')' : ''), + 'currentUser' => (\function_exists('get_current_user') ? get_current_user() : '') . ((\function_exists('getmyuid') && getmyuid()) ? ' (uid:' . getmyuid() . ')' : ''), 'tempDir' => \App\Fields\File::getTmpPath(), 'spaceRoot' => '', 'spaceStorage' => '', 'spaceTemp' => '', 'spaceBackup' => '', 'crmProvider' => \App\YetiForce\Register::getProvider(), + 'appId' => substr(\App\YetiForce\Register::getInstanceKey(), -15), 'lastCronStart' => $lastCronStartText, 'lastCronStartDateTime' => $lastCronStart, 'protocolVersion' => isset($_SERVER['SERVER_PROTOCOL']) ? substr($_SERVER['SERVER_PROTOCOL'], strpos($_SERVER['SERVER_PROTOCOL'], '/') + 1) : '-', @@ -693,6 +702,10 @@ private static function validate(string $type) $item['status'] = true; if (isset($main[$key])) { $item[static::$sapi] = $main[$key]; + if ('--' === $main[$key]) { + $item['noParameter'] = true; + continue; + } } if (isset($cron[$key]['cron']) && (self::$testCli || ($item['testCli'] && 'www' === static::$sapi))) { $item['cron'] = $cron[$key]['cron']; @@ -706,6 +719,12 @@ private static function validate(string $type) if (self::$testCli || ($item['testCli'] && !empty($cron))) { $item = static::$methodName($key, $item, 'cron'); } + if (isset($item['desc'])) { + $container = $item['container']; + if (isset(static::${$container}[$item['desc']])) { + $item['desc'] = static::${$container}[$item['desc']]; + } + } } if (isset($item['mode']) && (('whenError' === $item['mode'] && !$item['status']) || 'skipParam' === $item['mode'])) { unset(static::${$type}[$key]); @@ -713,6 +732,7 @@ private static function validate(string $type) } } } + return static::${$type}; } @@ -765,6 +785,23 @@ public static function get(string $type, bool $onlyError = false) return static::validate($type); } + /** + * Check open_basedir restrictions. + * + * @param string $dir + * + * @return bool + */ + public static function validatePath(string $dir): bool + { + $paths = []; + if (\ini_get('open_basedir')) { + $paths = explode(PATH_SEPARATOR, \ini_get('open_basedir')); + } + + return !$paths || array_filter($paths, fn ($v) => 0 === strpos(rtrim($dir, '/') . '/', rtrim($v, '/') . '/')) ? is_dir($dir) && is_readable($dir) : true; + } + /** * Validate php version. * @@ -900,6 +937,28 @@ private static function validateDbTableDefinitionCache(string $name, array $row, return $row; } + /** + * Validate DB open_files_limit. + * + * @param string $name + * @param array $row + * @param string $sapi + * + * @return array + */ + private static function validateDbOpenFilesLimit(string $name, array $row, string $sapi) + { + unset($name); + $row['recommended'] = self::$db['table_open_cache'] * 2; + if (isset($row[$sapi]) && (int) $row[$sapi] < $row['recommended']) { + $row['status'] = false; + } + if (!isset($row[$sapi])) { + $row['noParameter'] = true; + } + return $row; + } + /** * Validate number in bytes greater than recommended. * @@ -1029,7 +1088,6 @@ private static function validateOnOff(string $name, array $row, string $sapi) } else { $row['noParameter'] = true; } - return $row; } @@ -1135,13 +1193,16 @@ private static function validateCookieSamesite(string $name, array $row, string * @param string $name * @param array $row * - * @return array + * @return string */ private static function parserOnOff(string $name, array $row) { $container = $row['container']; + if ('db' === $container && !isset(static::${$container}[\strtolower($name)])) { + return '--'; + } $current = static::${$container}[\strtolower($name)] ?? static::${$container}[$name] ?? ''; - static $map = ['on' => 'On', 'true' => 'On', 'off' => 'Off', 'false' => 'Off']; + $map = ['on' => 'On', 'true' => 'On', 'off' => 'Off', 'false' => 'Off']; return isset($map[strtolower($current)]) ? $map[strtolower($current)] : ($current ? 'On' : 'Off'); } @@ -1199,6 +1260,37 @@ private static function validateHeader(string $name, array $row, string $sapi) return $row; } + /** + * Validate header CSP. + * + * @param string $name + * @param array $row + * @param string $sapi + * + * @return array + */ + private static function validateHeaderServer(string $name, array $row, string $sapi) + { + unset($sapi); + $header = strtolower(\str_replace('Header: ', '', $name)); + $onlyPhp = empty($row['onlyPhp']); + if (isset(static::$request[$header])) { + $row['www'] = static::$request[$header]['root'] ?? '-'; + $row['js'] = static::$request[$header]['js'] ?? '-'; + $row['css'] = static::$request[$header]['css'] ?? '-'; + $row['status'] = empty($row['www']); + if ($onlyPhp) { + $row['status'] = $row['status'] && empty($row['js']) && empty($row['css']); + } + if (!$row['status'] && \App\Validator::standard($row['www'])) { + $row['mode'] = 'showWarnings'; + } + } else { + $row['status'] = true; + } + return $row; + } + /** * Validate header CSP. * @@ -1454,7 +1546,7 @@ private static function parserHttpMethods(string $name, array $row) { unset($name); $supported = []; - $requestUrl = static::$crmUrl . 'token.php'; + $requestUrl = static::$crmUrl . 'cron.php'; foreach (\explode(', ', $row['recommended']) as $type) { try { $response = (new \GuzzleHttp\Client(\App\RequestHttp::getOptions()))->request($type, $requestUrl, ['timeout' => 1, 'verify' => false]); @@ -1502,13 +1594,14 @@ private static function validateIsWritable(string $name, array $row, string $sap if (!$absolutePaths) { $path = ROOT_DIRECTORY . \DIRECTORY_SEPARATOR . $path; } - if (!file_exists($path)) { + $exists = file_exists($path); + if (empty($row['mustExist']) && !$exists) { $row['mode'] = 'skipParam'; } else { $row['status'] = \App\Fields\File::isWriteable($path, true); $row[$sapi] = $row['status'] ? 'LBL_YES' : 'LBL_NO'; - $row['owner'] = fileowner($path); - $row['perms'] = substr(sprintf('%o', fileperms($path)), -4); + $row['owner'] = $exists ? fileowner($path) : ''; + $row['perms'] = $exists ? substr(sprintf('%o', fileperms($path)), -4) : ''; } return $row; } @@ -1543,31 +1636,6 @@ private static function validateBranding(string $name, array $row, string $sapi) return $row; } - /** - * Validate shop products. - * - * @param string $name - * @param array $row - * @param string $sapi - * - * @return array - */ - public static function validateShopProducts(string $name, array $row, string $sapi) - { - unset($name); - $row['status'] = true; - $status = ''; - foreach (\App\YetiForce\Shop::getProducts() as $name => $product) { - $verify = $product->verify(); - if (!$verify['status']) { - $status .= $name . '(' . \strlen($verify['message']) . '), '; - $row['status'] = false; - } - } - $row[$sapi] = $status ? trim($status, ', ') : ('shop' === $sapi ? '' : \App\Language::translate('LBL_YES')); - return $row; - } - /** * Validate open_basedir. * @@ -1624,10 +1692,95 @@ private static function validateErrorLog(string $name, array $row, string $sapi) { $row = self::validateNotEmpty($name, $row, $sapi); if ($row['status']) { - $dir = \dirname($row[$sapi]); - if (!is_dir($dir) && !is_readable($dir)) { - $row['status'] = true; - } + $row['status'] = self::validatePath(\dirname($row[$sapi])); + } + + return $row; + } + + /** + * Validate watchdog. + * + * @param string $name + * @param array $row + * @param string $sapi + * + * @return array + */ + public static function validateWatchdog(string $name, array $row, string $sapi) + { + unset($name); + $row['status'] = true; + $row[$sapi] = \App\Language::translate('LBL_YES'); + if (!\App\Cron::$watchdogIsActive) { + $row['status'] = false; + $row[$sapi] = \App\Language::translate('LBL_NO'); + } + return $row; + } + + /** + * Validate register. + * + * @param string $name + * @param array $row + * @param string $sapi + * + * @return array + */ + public static function validateRegister(string $name, array $row, string $sapi) + { + unset($name); + $row['status'] = true; + $row[$sapi] = \App\Language::translate('LBL_YES'); + if (!\App\Cron::$registerIsActive) { + $row['status'] = false; + $row[$sapi] = \App\Language::translate('LBL_NO'); + } + return $row; + } + + /** + * Validate shop cache. + * + * @param string $name + * @param array $row + * @param string $sapi + * + * @return array + */ + public static function validateShopCache(string $name, array $row, string $sapi) + { + unset($name); + $row['status'] = true; + $row[$sapi] = \App\Language::translate('LBL_YES'); + if (!\App\Cron::$shopIsActive) { + $row['status'] = false; + $row[$sapi] = \App\Language::translate('LBL_NO'); + } + return $row; + } + + /** + * Validate webservice. + * + * @param string $name + * @param array $row + * @param string $sapi + * + * @return array + */ + private static function validateWebservice(string $name, array $row, string $sapi) + { + unset($sapi); + try { + $response = (new \GuzzleHttp\Client(\App\RequestHttp::getOptions()))->request('OPTIONS', static::$crmUrl . $name . 'Modules', ['timeout' => 1, 'connect_timeout' => 1, 'verify' => false, 'http_errors' => false, 'allow_redirects' => false]); + $row['status'] = 200 === $response->getStatusCode(); + } catch (\Throwable $th) { + $row['status'] = false; + } + if (!\in_array('webservice', \Config\Api::$enabledServices)) { + $row['mode'] = 'showWarnings'; } return $row; } @@ -1676,7 +1829,7 @@ public static function getErrors(string $type, bool $returnMore = false): array { $result = []; foreach (static::get($type, true) as $param => $data) { - if (!$data['status'] && (empty($data['mode']) || 'showErrors' === $data['mode'])) { + if (!$data['status'] && (empty($data['mode']) || 'showErrors' === $data['mode']) && empty($data['noParameter'])) { if (!isset($data['www']) && !isset($data['cron'])) { $val = $data['status']; } else { @@ -1710,16 +1863,23 @@ public static function getNewestPhpVersion() if (!\App\RequestUtil::isNetConnection()) { return false; } - $response = (new \GuzzleHttp\Client(\App\RequestHttp::getOptions()))->get('http://php.net/releases/index.php?json&max=7&version=7'); - $data = array_keys((array) \App\Json::decode($response->getBody())); + $data = []; + $versions = explode(',', self::$stability['phpVersion']['recommended']); + foreach ($versions as $version) { + $version = explode('.', $version, 3); + array_pop($version); + $response = (new \GuzzleHttp\Client(\App\RequestHttp::getOptions()))->get('http://php.net/releases/index.php?json&max=1&version=' . implode('.', $version)); + $response = array_keys((array) \App\Json::decode($response->getBody())); + $data = array_merge($data, $response); + } natsort($data); $ver = []; foreach (array_reverse($data) as $row) { $t = explode('.', $row); array_pop($t); $short = implode('.', $t); - if (!isset($ver[$short]) && version_compare($short, '7.2', '>') && version_compare($short, '8.0', '<')) { - $ver[$short] = $row; + if (!isset($ver[$short])) { + $ver[$short] = \App\Purifier::encodeHtml($row); } } return $ver; diff --git a/app/Utils/Kanban.php b/app/Utils/Kanban.php index 8555b61b5888..94a419fa56fe 100644 --- a/app/Utils/Kanban.php +++ b/app/Utils/Kanban.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski * @author Radosław Skrzypczak */ diff --git a/app/Utils/ServiceContracts.php b/app/Utils/ServiceContracts.php index 165588eac709..faed8d455483 100644 --- a/app/Utils/ServiceContracts.php +++ b/app/Utils/ServiceContracts.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -51,7 +51,7 @@ public static function businessTime(string $start, string $end, string $startHou } while ($date <= $end) { $datesEnd = (clone $date)->setTime(23, 59, 59); - if (isset($days[$date->format('N')]) || ($holidays && isset($holidaysDates[$date->format('Y-m-d')]))) { + if (isset($days[$date->format('N')]) && (!$holidays || ($holidays && !isset($holidaysDates[$date->format('Y-m-d')])))) { $dates[] = [ 'start' => clone $date, 'end' => clone ($end < $datesEnd ? $end : $datesEnd), @@ -181,15 +181,20 @@ public static function getSlaPolicyForServiceContracts(int $serviceContractId, ? /** * Delete sla policy for service contracts. * - * @param int $crmId - * @param int $sourceModuleId + * @param int $crmId + * @param int $sourceModuleId + * @param int|null $rowId * * @return void */ - public static function deleteSlaPolicy(int $crmId, int $sourceModuleId) + public static function deleteSlaPolicy(int $crmId, int $sourceModuleId, ?int $rowId = null) { + $where = ['crmid' => $crmId, 'tabid' => $sourceModuleId]; + if ($rowId) { + $where['id'] = $rowId; + } \App\Db::getInstance()->createCommand() - ->delete('u_#__servicecontracts_sla_policy', ['crmid' => $crmId, 'tabid' => $sourceModuleId])->execute(); + ->delete('u_#__servicecontracts_sla_policy', $where)->execute(); \App\Cache::delete('UtilsServiceContracts::getSlaPolicyForServiceContracts', $crmId); } @@ -287,8 +292,8 @@ public static function getSlaPolicyRulesForModule(\Vtiger_Record_Model $recordMo 'resolve_time' => $row['resolve_time'], ]; } + break; } - break; } if ($businessHours) { $result = []; @@ -399,7 +404,7 @@ public static function getDiff(string $start, \Vtiger_Record_Model $recordModel, if ($fieldModel && ($value = $recordModel->get($fieldModel->getName()))) { return self::getDiffFromServiceContracts($start, $end, $value, $recordModel); } - if ($diff = self::getDiffFromSlaPolicy($start, $end, $recordModel)) { + if (\is_int($diff = self::getDiffFromSlaPolicy($start, $end, $recordModel))) { return $diff; } if (!($diff = self::getDiffFromDefaultBusinessHours($start, $end))) { diff --git a/app/Utils/Tokens.php b/app/Utils/Tokens.php index 9837fea612b5..c7a2a21afc7f 100644 --- a/app/Utils/Tokens.php +++ b/app/Utils/Tokens.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ diff --git a/app/Validator.php b/app/Validator.php index 9870b747cfc2..abf0acc285f1 100644 --- a/app/Validator.php +++ b/app/Validator.php @@ -4,8 +4,8 @@ * * @package App * - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) - * @copyright YetiForce Sp. z o.o + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. * @author Radosław Skrzypczak */ @@ -330,10 +330,11 @@ public static function urlDomain(string $url): bool */ public static function url(string $url): bool { + if (!parse_url($url, PHP_URL_SCHEME)) { + $url = 'http://' . $url; + } if (mb_strlen($url) != \strlen($url) && \function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) { - $url = preg_replace_callback('/:\/\/([^\/]+)/', function ($matches) { - return '://' . idn_to_ascii($matches[1], IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); - }, $url); + $url = preg_replace_callback('/:\/\/([^\/]+)/', fn ($matches) => '://' . idn_to_ascii($matches[1], IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46), $url); } return false !== filter_var($url, FILTER_VALIDATE_URL); } @@ -445,6 +446,18 @@ public static function ip($input): bool return $result; } + /** + * Check if input is an ip or domain value. + * + * @param string $input + * + * @return bool + */ + public static function ipOrDomain($input): bool + { + return self::ip($input) || self::domain($input); + } + /** * Function verifies if given value is text. * @@ -456,4 +469,57 @@ public static function text(string $input): bool { return Purifier::decodeHtml(Purifier::purify($input)) === $input; } + + /** + * Check directory name. + * + * @param string $input + * + * @return bool + */ + public static function dirName(string $input): bool + { + return !preg_match('/[\\/:\*\?"<>|]/', $input) && false === strpos($input, '.', -1); + } + + /** + * Check path. + * + * @param string $input + * + * @return bool + */ + public static function path(string $input): bool + { + $parts = explode('/', trim(str_replace(\DIRECTORY_SEPARATOR, '/', $input), '/')); + return !array_filter($parts, fn ($dir) => !self::dirName($dir)); + } + + /** + * Check base64. + * + * @param string $input + * + * @return bool + */ + public static function base64(string $input): bool + { + if (empty($input)) { + return false; + } + $explode = explode(',', $input); + return 2 === \count($explode) && 1 === preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $explode[1]); + } + + /** + * Check font icon name. + * + * @param string $input + * + * @return bool + */ + public static function fontIcon(string $input): bool + { + return !empty($input) && preg_match('/^[[:alnum:]_\- ]+$/', $input); + } } diff --git a/app/Version.php b/app/Version.php index d30d0879035d..11da38cbbf10 100644 --- a/app/Version.php +++ b/app/Version.php @@ -7,8 +7,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ class Version diff --git a/app/YetiForce/AbstractBase.php b/app/YetiForce/AbstractBase.php new file mode 100644 index 000000000000..df88eff46caa --- /dev/null +++ b/app/YetiForce/AbstractBase.php @@ -0,0 +1,33 @@ + + */ + +namespace App\YetiForce; + +/** + * YetiForce shop AbstractBaseProduct class. + */ +abstract class AbstractBase +{ + /** @var string Last error. */ + protected ?string $error = null; + /** @var bool Response result */ + protected bool $success = false; + + /** + * Get last error. + * + * @return string + */ + public function getError(): string + { + return $this->error ?? ''; + } +} diff --git a/app/YetiForce/ApiClient.php b/app/YetiForce/ApiClient.php new file mode 100644 index 000000000000..5bbbe3090103 --- /dev/null +++ b/app/YetiForce/ApiClient.php @@ -0,0 +1,167 @@ + + */ + +namespace App\YetiForce; + +/** + * YetiForce register class. + */ +final class ApiClient +{ + /** @var string URL */ + public const URL = 'https://api.yetiforce.eu/registrations'; + + /** @var string Last error. */ + public ?string $error = null; + /** @var bool Response result */ + private bool $success; + + /** @var int|null Resopnse code */ + private ?int $responseCode = 0; + /** @var string Resopnse body */ + private $responseBody; + + /** @var int Total timeout of the request in seconds. */ + private int $timeout = 20; + /** @var int The number of seconds to wait while trying to connect to a server. */ + private int $connectTimeout = 10; + + /** + * Send registration data. + * + * @param string $url + * @param string $method + * @param array $option + * + * @return bool + */ + public function send(string $url, string $method, array $option = []): bool + { + $this->error = null; + $this->success = false; + $this->basicValidations($url); + if ($this->error) { + return $this->success; + } + + try { + \App\Log::beginProfile($method . '|' . __METHOD__ . "|{$url}", __NAMESPACE__); + $response = (new \GuzzleHttp\Client($this->getRequestOptions()))->request($method, $url, $option); + \App\Log::endProfile($method . '|' . __METHOD__ . "|{$url}", __NAMESPACE__); + + $this->responseCode = $response->getStatusCode(); + $this->responseBody = $response->getBody()->getContents(); + $this->success = true; + } catch (\GuzzleHttp\Exception\ClientException $e) { + $this->responseCode = $e->getResponse()->getStatusCode(); + $this->error = $e->getResponse()->getBody()->getContents(); + if (\App\Json::isJson($this->error) && ($error = \App\Json::decode($this->error)['errors'] ?? null)) { + $this->error = \is_array($error) ? implode(' | ', $error) : $error; + } + \App\Log::error($e->getMessage(), __METHOD__); + } catch (\GuzzleHttp\Exception\ServerException $e) { + $this->responseCode = $e->getResponse()->getStatusCode(); + $this->error = $this->responseCode . ' Internal Server Error'; + \App\Log::error($e->getMessage(), __METHOD__); + } catch (\Throwable $e) { + $this->error = \App\Language::translate("LBL_ERROR"); + \App\Log::error($e->getMessage(), __METHOD__); + } + + return $this->success; + } + + /** + * Get response status code. + * + * @return int + */ + public function getStatusCode() + { + return $this->responseCode; + } + + /** + * Get response content. + * + * @return mixed + */ + public function getResponseBody() + { + return $this->responseBody; + } + + /** + * Get last error. + * + * @return string + */ + public function getError(): string + { + return $this->error ?? ''; + } + + /** + * Get request options. + * + * @return array + */ + public function getRequestOptions(): array + { + $headers = [ + 'x-crm-id' => \App\Config::main('application_unique_key'), + 'x-app-id' => Register::getInstanceKey(), + 'accept-language' => \App\Language::getLanguage() ?: 'en' + ]; + if ($key = (new Config())->getToken()) { + $headers['x-api-key'] = $key; + } + + $options = \App\RequestHttp::getOptions(); + + return array_merge($options, [ + 'headers' => array_merge($options['headers'] ?? [], $headers), + 'timeout' => $this->timeout, + 'connect_timeout' => $this->connectTimeout + ]); + } + + /** + * Basic validations. + * + * @param string $url + * + * @return void + */ + private function basicValidations($url) + { + $hostName = parse_url($url, PHP_URL_HOST); + if (!\App\RequestUtil::isNetConnection() || $hostName === gethostbyname($hostName)) { + \App\Log::warning('ERR_NO_INTERNET_CONNECTION', __METHOD__); + $this->error = 'ERR_NO_INTERNET_CONNECTION'; + } elseif (!$this->isWritable()) { + \App\Log::warning('ERR_REGISTER_FILES_PERMISSIONS||app_data', __METHOD__); + $this->error = 'ERR_REGISTER_FILES_PERMISSIONS||app_data'; + } + } + + /** + * Check write permissions for the registry file. + * + * @return bool + */ + private function isWritable(): bool + { + $path = Register::REGISTRATION_FILE; + return (file_exists($path) && is_writable($path)) || (!file_exists($path) && is_writable(\dirname($path))); + } +} diff --git a/app/YetiForce/Config.php b/app/YetiForce/Config.php new file mode 100644 index 000000000000..35ccb82ffab7 --- /dev/null +++ b/app/YetiForce/Config.php @@ -0,0 +1,82 @@ + + */ + +namespace App\YetiForce; + +/** + * YetiForce register class. + */ +final class Config +{ + /** @var string URL */ + public const TABLE_NAME = 's_#__reg_data'; + + private const CACHE_NAME = 'YetiForce:config'; + + /** @var array Data */ + private array $data = []; + + /** Constructor */ + public function __construct() + { + if (!\App\Cache::has(self::CACHE_NAME, '')) { + $db = \App\Db::getInstance('admin'); + $this->data = (new \App\Db\Query())->from(self::TABLE_NAME)->one($db) ?: []; + if (!$this->data) { + $data = (new Encryption())->getDefaultData(); + $result = $db->createCommand()->insert(self::TABLE_NAME, $data)->execute(); + $this->data = $result ? $data : []; + \App\Cache::save(self::CACHE_NAME, '', $this->data, \App\Cache::LONG); + } + } else { + $this->data = \App\Cache::get(self::CACHE_NAME, ''); + } + } + + /** + * Get data. + * + * @return array + */ + public function getData(): array + { + return $this->data; + } + + /** + * Get token. + * + * @return string + */ + public function getToken(): string + { + return $this->data['key'] ?? ''; + } + + /** + * Set Token. + * + * @param string $token + * + * @return bool + */ + public function setToken(string $token): bool + { + \App\Purifier::purifyByType($token, \App\Purifier::ALNUM2); + $result = \App\Db::getInstance('admin')->createCommand()->update(self::TABLE_NAME, ['key' => $token])->execute(); + if ($result) { + \App\Cache::delete(self::CACHE_NAME, ''); + $this->data['key'] = $token; + } + return (bool) $result; + } +} diff --git a/app/YetiForce/EmailVerification.php b/app/YetiForce/EmailVerification.php new file mode 100644 index 000000000000..6244b9bd83be --- /dev/null +++ b/app/YetiForce/EmailVerification.php @@ -0,0 +1,170 @@ + + * @author Radosław Skrzypczak + */ + +namespace App\YetiForce; + +/** + * YetiForce admin email verification class. + */ +class EmailVerification +{ + /** @var string URL */ + public const URL = 'https://api.yetiforce.eu/emails'; + /** Process identificator - init */ + public const PROCESS_INIT = 0; + /** Process identificator - register */ + public const PROCESS_REGISTER = 1; + /** @var string Endpoints */ + private const TYPES = [ + self::PROCESS_INIT => 'POST', + self::PROCESS_REGISTER => 'PUT' + ]; + + /** @var string|null Last eroor */ + protected ?string $error; + /** @var int Type */ + protected int $type; + /** @var bool Response result */ + protected bool $success; + /** @var string E-mail address */ + private string $email; + /** @var bool Newsletter agreement */ + private bool $newsletter; + /** @var string Code */ + private string $token; + + /** + * Set type request. + * + * @param int $type Types {@see self::TYPES} + * + * @return $this + */ + public function setType(int $type): self + { + $this->type = $type; + return $this; + } + + /** + * Set e-mail address. + * + * @param string $email + * + * @return self + */ + public function setEmail(string $email): self + { + $this->email = $email; + + return $this; + } + + /** + * Set newsletter agreement. + * + * @param bool $newsletter + * + * @return self + */ + public function setNewsletter(bool $newsletter): self + { + $this->newsletter = $newsletter; + + return $this; + } + + /** + * Set code. + * + * @param string $code + * + * @return self + */ + public function setCode(string $code): self + { + $this->token = $code; + + return $this; + } + + /** + * Request sending an email with a verification token. + * + * @return bool + */ + public function send(): bool + { + $this->success = false; + $type = self::TYPES[$this->type]; + $client = new ApiClient(); + $client->send(self::URL, $type, ['form_params' => $this->getData()]); + $this->error = $client->getError(); + + if (409 === $client->getStatusCode() && false !== stripos($this->error, 'app')) { + (new \App\YetiForce\Register())->recreate(); + throw new \App\Exceptions\AppException('ERR_RECREATE_APP_ACCESS'); + } + + return $this->success = 204 === $client->getStatusCode(); + } + + /** + * Get last error. + * + * @return string + */ + public function getError(): string + { + return $this->error ?? ''; + } + + /** + * Post processes. + * + * @return void + */ + public function postProcess(): void + { + if ($this->success && self::PROCESS_REGISTER === $this->type) { + $fieldName = 'email'; + $recordModel = \Settings_Companies_Record_Model::getInstance(); + $fieldModel = $recordModel->getFieldInstanceByName($fieldName); + $fieldModel->getUITypeModel()->validate($this->email, true); + $recordModel->set($fieldName, $fieldModel->getDBValue($this->email)); + $recordModel->save(); + } + } + + /** + * Get data for request. + * + * @return array + */ + private function getData(): array + { + $data = [ + 'appId' => Register::getInstanceKey() + ]; + + $reflect = new \ReflectionClass($this); + foreach ($reflect->getProperties(\ReflectionProperty::IS_PRIVATE) as $property) { + $property->setAccessible(true); + if ($property->isInitialized($this) && null !== ($value = $property->getValue($this))) { + $data[$property->getName()] = $value; + } + } + + return $data; + } +} diff --git a/app/YetiForce/Encryption.php b/app/YetiForce/Encryption.php new file mode 100644 index 000000000000..956cfffaa374 --- /dev/null +++ b/app/YetiForce/Encryption.php @@ -0,0 +1,77 @@ + + */ + +namespace App\YetiForce; + +/** + * YetiForce register class. + */ +final class Encryption +{ + /** @var string Default encryption method */ + public const DEFAULT_METHOD = 'AES-128-CBC'; + + /** + * Data encryption function. + * + * @param array $data + * + * @return string + */ + public function encrypt(array $data): string + { + return (new \App\Encryption($this->getConfig()))->encrypt(\App\Json::encode($data), true); + } + + /** + * Data decryption function. + * + * @param string $data + * + * @return array + */ + public function decrypt(string $data): array + { + return \App\Json::decode((new \App\Encryption($this->getConfig()))->decrypt($data, true)) ?: []; + } + + /** + * Get default configuration data for encryption. + * + * @return array + */ + public function getDefaultData(): array + { + return [ + 'method' => self::DEFAULT_METHOD, + 'vector' => base64_encode(openssl_random_pseudo_bytes(openssl_cipher_iv_length(self::DEFAULT_METHOD))), + 'pass' => \App\Encryption::generatePassword(10), + ]; + } + + /** + * Configuration data for encryption. + * + * @return array + */ + private function getConfig(): array + { + $data = (new Config())->getData(); + unset($data['key']); + $iv = $data['vector'] ?? ''; + if ($iv) { + $data['vector'] = base64_decode($iv); + } + + return $data; + } +} diff --git a/app/YetiForce/Order.php b/app/YetiForce/Order.php new file mode 100644 index 000000000000..0d05fc723dde --- /dev/null +++ b/app/YetiForce/Order.php @@ -0,0 +1,196 @@ + + */ + +namespace App\YetiForce; + +/** + * YetiForce register class. + */ +final class Order +{ + /** @var string URL */ + public const URL = 'https://api.yetiforce.eu/registrations/orders'; + + /** + * Array of company form fields. + */ + private const COMPANY_FORM_FIELDS = [ + 'name', + 'vat_id', + 'country', + 'post_code', + 'city', + 'address', + ]; + + /** @var string Last error. */ + public ?string $error = null; + /** @var bool Response result */ + private bool $success; + /** @var string Order ID */ + private ?string $id; + + /** @var array Raw data */ + private array $data = []; + /** @var Product package ID */ + private string $packageId; + + /** + * Function determines fields available in payment view. + * + * @return \Settings_Vtiger_Field_Model[] + */ + public function getFieldInstances(): array + { + $company = \App\Company::getCompany(); + $fields = []; + foreach (self::COMPANY_FORM_FIELDS as $fieldName) { + $params = [ + 'uitype' => 1, + 'fieldvalue' => $company[$fieldName] ?? null, + 'displaytype' => 1, + 'typeofdata' => 'V~M', + 'presence' => '', + 'isEditableReadOnly' => false, + 'maximumlength' => '255', + 'column' => $fieldName, + 'name' => $fieldName, + 'label' => 'LBL_' . strtoupper($fieldName), + 'purifyType' => \App\Purifier::TEXT + ]; + + switch ($fieldName) { + case 'city': + $params['maximumlength'] = '100'; + break; + case 'country': + $params['uitype'] = 16; + $params['maximumlength'] = '100'; + $params['picklistValues'] = []; + foreach (\App\Fields\Country::getAll() as $country) { + $params['picklistValues'][$country['name']] = \App\Language::translateSingleMod( + $country['name'], + 'Other.Country' + ); + } + break; + default: + break; + } + + $fields[$fieldName] = \Settings_Vtiger_Field_Model::init('Vtiger', $params); + } + + return $fields; + } + + /** + * Set value. + * + * @param string $key + * @param mixed $value + * + * @return $this + */ + public function set(string $key, $value) + { + $this->data[$key] = $value; + return $this; + } + + /** + * Send order data. + * + * @return bool + */ + public function send(): bool + { + $this->success = false; + $client = new ApiClient(); + $client->send(self::URL, 'POST', ['form_params' => $this->getData()]); + $this->error = $client->getError(); + if (!$this->error && ($code = $client->getStatusCode())) { + $content = $client->getResponseBody(); + $this->success = \in_array($code, [200, 201]) && $content; + if ($this->success) { + $this->setId(\App\Json::decode($content)['id']); + } + } + + return $this->success; + } + + /** + * Get order ID. + * + * @return string + */ + public function getId() + { + return $this->id ?? ''; + } + + /** + * Get last error. + * + * @return string + */ + public function getError(): string + { + return $this->error ?? ''; + } + + /** + * Set product package ID. + * + * @param string $packageId + * + * @return self + */ + public function setPackageId(string $packageId): self + { + $this->packageId = $packageId; + + return $this; + } + + /** + * set order ID. + * + * @param string $id + * + * @return self + */ + private function setId(string $id): self + { + $this->id = $id; + return $this; + } + + /** + * Get registration data. + * + * @return string[] + */ + private function getData(): array + { + return [ + 'packageId' => $this->packageId, + 'company' => $this->data['name'], + 'city' => $this->data['city'], + 'vatId' => $this->data['vat_id'], + 'country' => $this->data['country'], + 'postCode' => $this->data['post_code'], + 'address' => $this->data['address'], + ]; + } +} diff --git a/app/YetiForce/Register.php b/app/YetiForce/Register.php index 0616645ae196..9add232b2911 100644 --- a/app/YetiForce/Register.php +++ b/app/YetiForce/Register.php @@ -5,9 +5,10 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski + * @author Radosław Skrzypczak */ namespace App\YetiForce; @@ -15,38 +16,12 @@ /** * YetiForce register class. */ -class Register +final class Register extends AbstractBase { - /** - * Registration config cache. - * - * @var - */ - private static $config; - /** - * Last error. - * - * @var string - */ - public $error; - /** - * Registration url. - * - * @var string - */ - private static $registrationUrl = 'https://api.yetiforce.com/registration/'; + /** @var string URL */ + public const URL = 'https://api.yetiforce.eu/registrations'; - /** - * Registration file path. - * - * @var string - */ - private const REGISTRATION_FILE = ROOT_DIRECTORY . \DIRECTORY_SEPARATOR . 'app_data' . \DIRECTORY_SEPARATOR . 'registration.php'; - /** - * Status messages. - * - * @var string[] - */ + /** @var string[] Status messages. */ public const STATUS_MESSAGES = [ -2 => 'ERR_NO_INTERNET_CONNECTION', -1 => 'ERR_IT_HAS_NO_BEEN_6_HOURS_SINCE_THE_LAST_CHECK', @@ -54,13 +29,26 @@ class Register 1 => 'LBL_WAITING_FOR_ACCEPTANCE', 2 => 'LBL_INCORRECT_DATA', 3 => 'LBL_INCOMPLETE_DATA', - 5 => 'LBL_OFFLINE_SERIAL_NOT_FOUND', - 6 => 'LBL_OFFLINE_SIGNED', - 7 => 'LBL_OFFLINE_SIGNED', 8 => 'LBL_SPECIAL_REGISTRATION', - 9 => 'LBL_ACCEPTED', + 9 => 'LBL_REGISTERED', ]; + /** @var string Registration file path. */ + public const REGISTRATION_FILE = ROOT_DIRECTORY . \DIRECTORY_SEPARATOR . 'app_data' . \DIRECTORY_SEPARATOR . 'registration.php'; + + /** @var array Products */ + private static $products; + + /** + * Registration config cache. + * + * @var array + */ + private static array $config; + + /** @var array Company data */ + private array $rawCompanyData = []; + /** * Generate a unique key for the crm. * @@ -78,329 +66,354 @@ public static function getCrmKey(): string */ public static function getInstanceKey(): string { - return sha1(\App\Config::main('application_unique_key') . \App\Config::main('site_URL') . gethostname()); + return sha1(\App\Config::main('application_unique_key') . trim(preg_replace("(^https?://)", '', \App\Config::main('site_URL')), '/')); } /** - * Get registration data. + * Send registration data. * - * @return string[] + * @return bool */ - private function getData(): array + public function register(): bool { - return [ - 'version' => \App\Version::get(), - 'language' => \App\Language::getLanguage(), - 'timezone' => date_default_timezone_get(), - 'insKey' => static::getInstanceKey(), - 'crmKey' => static::getCrmKey(), - 'package' => \App\Company::getSize(), - 'provider' => static::getProvider(), - 'companies' => \App\Company::getAll(), - ]; + $this->success = false; + $client = new ApiClient(); + $method = (new Config())->getToken() ? 'PUT' : 'POST'; + $client->send(self::URL, $method, ['form_params' => $this->getData()]); + $this->error = $client->getError(); + if (!$this->error && ($code = $client->getStatusCode())) { + $content = $client->getResponseBody(); + $this->success = 204 === $code || (\in_array($code, [200, 201]) && $content && (new Config())->setToken(\App\Json::decode($content))); + } elseif (409 === $client->getStatusCode() && false !== stripos($this->error, 'app')) { + throw new \App\Exceptions\AppException('ERR_RECREATE_APP_ACCESS'); + } + + return $this->success; } /** - * Send registration data. + * Check registration status. * * @return bool */ - public function register(): bool + public function check(): bool { - if (!\App\RequestUtil::isNetConnection() || 'api.yetiforce.com' === gethostbyname('api.yetiforce.com')) { - \App\Log::warning('ERR_NO_INTERNET_CONNECTION', __METHOD__); - $this->error = 'ERR_NO_INTERNET_CONNECTION'; - return false; - } - $result = false; try { - $url = static::$registrationUrl . 'add'; - \App\Log::beginProfile("POST|Register::register|{$url}", __NAMESPACE__); - $response = (new \GuzzleHttp\Client())->post($url, \App\Utils::merge(\App\RequestHttp::getOptions(), ['form_params' => $this->getData()])); - \App\Log::endProfile("POST|Register::register|{$url}", __NAMESPACE__); - $body = $response->getBody(); - if (!\App\Json::isEmpty($body)) { - $body = \App\Json::decode($body); - if ('OK' === $body['text']) { - static::updateMetaData([ - 'register_time' => date('Y-m-d H:i:s'), - 'status' => $body['status'], - 'text' => $body['text'], - 'serialKey' => $body['serialKey'] ?? '', - 'last_check_time' => '', - ]); - $result = true; - } + $client = new ApiClient(); + $this->success = $client->send(self::URL . '/status', 'GET'); + $this->error = $client->getError(); + if (!$this->error && 200 === $client->getStatusCode()) { + $this->updateMetaData(\App\Json::decode($client->getResponseBody())); + $this->success = true; + } elseif (409 === $client->getStatusCode() && false !== stripos($this->error, 'app')) { + (new self())->recreate(); + throw new \App\Exceptions\AppException('ERR_RECREATE_APP_ACCESS'); } } catch (\Throwable $e) { + $this->success = false; $this->error = $e->getMessage(); - \App\Log::warning($e->getMessage(), __METHOD__); + \App\Log::error($e->getMessage(), __METHOD__); } - \App\Company::statusUpdate(1); - return $result; + + return $this->success; } /** - * Checking registration status. + * Recreate access. * - * @param bool $force - * - * @return int + * @return void */ - public static function check($force = false): int + public function recreate() { - if (!\App\RequestUtil::isNetConnection() || 'api.yetiforce.com' === gethostbyname('api.yetiforce.com')) { - \App\Log::warning('ERR_NO_INTERNET_CONNECTION', __METHOD__); - static::updateMetaData(['last_error' => 'ERR_NO_INTERNET_CONNECTION', 'last_error_date' => date('Y-m-d H:i:s')]); - return -1; - } - $conf = static::getConf(); - if (!$force && (!empty($conf['last_check_time']) && (($conf['status'] < 6 && strtotime('+6 hours', strtotime($conf['last_check_time'])) > time()) || ($conf['status'] > 6 && strtotime('+7 day', strtotime($conf['last_check_time'])) > time())))) { - return -2; - } - $status = 0; try { - $data = ['last_check_time' => date('Y-m-d H:i:s')]; - $url = static::$registrationUrl . 'check'; - \App\Log::beginProfile("POST|Register::check|{$url}", __NAMESPACE__); - $response = (new \GuzzleHttp\Client(\App\RequestHttp::getOptions()))->post($url, [ - 'form_params' => \App\Utils::merge($conf, [ - 'version' => \App\Version::get(), - 'crmKey' => static::getCrmKey(), - 'insKey' => static::getInstanceKey(), - 'provider' => static::getProvider(), - 'package' => \App\Company::getSize(), - 'shop' => \App\Utils\ConfReport::validateShopProducts('check', [], 'shop')['shop'], - ]), - ]); - \App\Log::endProfile("POST|Register::check|{$url}", __NAMESPACE__); - $body = $response->getBody(); - if (!\App\Json::isEmpty($body)) { - $body = \App\Json::decode($body); - if ('OK' === $body['text'] && static::updateCompanies($body['companies'])) { - $data = [ - 'status' => $body['status'], - 'text' => $body['text'], - 'serialKey' => $body['serialKey'], - 'last_check_time' => date('Y-m-d H:i:s'), - 'products' => $body['activeProducts'], - ]; - $status = 1; - } else { - throw new \App\Exceptions\AppException($body['text'], 4); - } - } else { - throw new \App\Exceptions\AppException('ERR_BODY_IS_EMPTY', 0); + $client = new ApiClient(); + $this->success = $client->send(self::URL . '/copy', 'POST', ['form_params' => ['newAppId' => self::getInstanceKey()]]); + $this->error = $client->getError(); + if (!$this->error && ($code = $client->getStatusCode())) { + $content = $client->getResponseBody(); + $this->success = \in_array($code, [200, 201]) && $content && (new Config())->setToken(\App\Json::decode($content)); } - static::updateMetaData($data); } catch (\Throwable $e) { - \App\Log::warning($e->getMessage(), __METHOD__); - //Company details vary, re-registration is required. - static::updateMetaData([ - 'last_error' => $e->getMessage(), - 'last_error_date' => date('Y-m-d H:i:s'), - 'last_check_time' => date('Y-m-d H:i:s'), - ]); - $status = $e->getCode(); + $this->success = false; + $this->error = $e->getMessage(); + \App\Log::error($e->getMessage(), __METHOD__); } - return $status; } /** - * Registration verification. + * Set company data. * - * @param bool $timer + * @param array $data * - * @return bool + * @return self */ - public static function verify($timer = false): bool + public function setRawCompanyData(array $data): self { - if (\App\Cache::staticHas('RegisterVerify', $timer)) { - return \App\Cache::staticGet('RegisterVerify', $timer); - } - $conf = static::getConf(); - if (!$conf) { - \App\Cache::staticSave('RegisterVerify', $timer, false); - return false; - } - $status = $conf['status'] > 5; - if (!empty($conf['serialKey']) && $status && static::verifySerial($conf['serialKey'])) { - \App\Cache::staticSave('RegisterVerify', $timer, true); - return true; - } - if ($timer && !empty($conf['register_time']) && strtotime('+14 days', strtotime($conf['register_time'])) > time()) { - $status = true; - } - \App\Cache::staticSave('RegisterVerify', $timer, $status); - return $status; + $this->rawCompanyData = $data; + + return $this; } /** - * Update registration data. + * Get registration status. * - * @param string[] $data + * @param bool $force + * + * @return int */ - private static function updateMetaData(array $data): void + public function getStatus(bool $force = false): int { - $conf = static::getConf(); - static::$config = [ - 'last_check_time' => $data['last_check_time'] ?? '', - 'register_time' => $data['register_time'] ?? $conf['register_time'] ?? '', - 'status' => $data['status'] ?? $conf['status'] ?? 0, - 'text' => $data['text'] ?? $conf['text'] ?? '', - 'serialKey' => $data['serialKey'] ?? $conf['serialKey'] ?? '', - 'products' => $data['products'] ?? $conf['products'] ?? [], - 'last_error' => $data['last_error'] ?? '', - 'last_error_date' => $data['last_error_date'] ?? '', - ]; - \App\Utils::saveToFile(static::REGISTRATION_FILE, static::$config, 'Modifying this file or functions that affect the footer appearance will violate the license terms!!!', 0, true); - \App\YetiForce\Shop::generateCache(); + if ($force) { + $this->check(); + } + return (int) (self::getConf()['status'] ?? 0); } /** - * Set offline serial. - * - * @param string $serial + * Is the system is properly registered. * * @return bool */ - public static function setSerial($serial) + public static function isRegistered(): bool { - if (!static::verifySerial($serial)) { - return false; - } - static::updateMetaData([ - 'register_time' => date('Y-m-d H:i:s'), - 'status' => 6, - 'text' => 'OK', - 'insKey' => static::getInstanceKey(), - 'serialKey' => $serial, - ]); - \App\Company::statusUpdate(6); - return true; + return (new self())->getStatus() >= 6 && self::getConfValue('appId') === self::getInstanceKey(); } /** - * Verification of the serial number. + * Get registration product. * - * @param string $serial + * @param string $name * - * @return bool + * @return array */ - public static function verifySerial(string $serial): bool + public static function getProduct(string $name): array { - return hash_equals($serial, hash('sha1', self::getInstanceKey() . self::getCrmKey())); + if (!isset(self::$products)) { + self::$products = []; + foreach (self::getConf()['subscriptions'] ?? [] as $row) { + self::$products[$row['product']] = $row; + } + } + + return self::$products[$name] ?? []; } /** - * Get registration config. + * Gets products. * * @return array */ - private static function getConf(): array + public static function getProducts(): array { - if (isset(static::$config)) { - return static::$config; + $products = []; + foreach (self::getConf()['subscriptions'] ?? [] as $row) { + $products[] = array_intersect_key($row, array_flip(['product', 'expiresAt'])); } - if (!\file_exists(static::REGISTRATION_FILE)) { - return static::$config = []; + + return $products; + } + + /** + * Get provider. + * + * @return string + */ + public static function getProvider(): string + { + $path = ROOT_DIRECTORY . '/app_data/installSource.txt'; + if (file_exists($path)) { + return trim(file_get_contents($path)); } - return static::$config = require static::REGISTRATION_FILE; + return getenv('PROVIDER') ?: getenv('provider') ?: ''; } /** - * Get last check time. + * Should enforce registration. * - * @return mixed + * @return bool */ - public static function getLastCheckTime() + public static function shouldEnforceRegistration(): bool { - return static::getConf()['last_check_time'] ?? false; + $interval = null; + if ($registrationDate = (self::getConf()['last_forced_reg_time'] ?? null)) { + $interval = (new \DateTime('now', new \DateTimeZone('GMT')))->diff(new \DateTime($registrationDate, new \DateTimeZone('GMT'))); + } + + return !self::isRegistered() && (self::getInstanceKey() !== self::getConfValue('appId') || ($interval && $interval->days > 6)); } /** - * Get last check error. + * Was registration attempted. * - * @return bool|string + * @return bool */ - public static function getLastCheckError() + public static function isPreRegistered(): bool { - return static::getConf()['last_error'] ?? false; + return self::isRegistered() || self::getInstanceKey() === self::getConfValue('appId'); } /** - * Get registration status. + * Get parsed company registration data. * - * @return int + * @return array */ - public static function getStatus(): int + public function getCompanyData(): array { - return (int) (static::getConf()['status'] ?? 0); + if (!$this->rawCompanyData) { + $this->setRawCompanyData(\App\Company::getCompany()); + } + + return [ + 'name' => $this->rawCompanyData['name'] ?: null, + 'vatId' => $this->rawCompanyData['vat_id'] ?: null, + 'country' => $this->rawCompanyData['country'] ?: null, + 'industry' => $this->rawCompanyData['industry'] ?: null, + 'webpage' => $this->rawCompanyData['website'] ?: null, + ]; } /** - * Is the system is properly registered. + * Send statistics. * * @return bool */ - public static function isRegistered(): bool + public function sendStats(): bool { - return static::getStatus() > 6; + $this->success = false; + $client = new ApiClient(); + $client->send(self::URL . '/stats', 'PUT', ['form_params' => ['crmVersion' => \App\Version::get(), 'stats' => $this->getStats()]]); + $this->error = $client->getError(); + + return $this->success = !$this->error && \in_array($client->getStatusCode(), [200, 204]); } /** - * Get registration products. + * Check statuses and send statistics. * - * @param mixed $name + * @return void + */ + public function send() + { + if (($date = $this->getConfValue('last_check_time')) + && (new \DateTime(date('Y-m-d')))->diff(new \DateTime(date('Y-m-d', strtotime($date))))->days > 0 + && $this->check()) { + $this->sendStats(); + } + } + + /** + * Get the number of records by modules. * * @return array */ - public static function getProducts($name = ''): array + private function getStats(): array { - $rows = []; - foreach (static::getConf()['products'] ?? [] as $row) { - $rows[$row['product']] = $row; - } - if ($name) { - return $rows[$name] ?? []; - } - return $rows; + $modules = [ + 'Accounts', 'Campaigns', 'SSalesProcesses', 'SQuotes', 'SSingleOrders', 'Project', 'HelpDesk', 'FInvoice', 'PaymentsIn', 'PaymentsOut', 'FInvoiceCost', 'ISTN', 'IGRN', 'Products', 'Assets', 'Services', 'OSSMailView', 'Documents', 'Notification', 'Calendar' + ]; + $stats['Modules'] = (new \App\Db\Query())->select(['setype', 'count' => new \yii\db\Expression('count(1)'), 'last_create' => new \yii\db\Expression('MAX(CAST(createdtime AS DATE))')])->from('vtiger_crmentity')->where(['setype' => $modules])->groupBy('setype')->all(); + $stats['Crons'] = (new \App\Db\Query())->from('vtiger_cron_task')->count(); + $stats['Workflows'] = (new \App\Db\Query())->from('com_vtiger_workflows')->count(); + + $usersData = (new \App\Db\Query())->select(['count' => new \yii\db\Expression('COUNT(*)'), 'status', 'last_create' => new \yii\db\Expression('MAX(CAST(date_entered AS DATE))')])->from('vtiger_users')->groupBy(['status'])->all(); + $users = array_column($usersData, 'count', 'status'); + $dates = array_column($usersData, 'last_create'); + $users['last_create'] = max($dates); + $stats['Users'] = $users; + + return $stats; } /** - * Update company status. + * Get registration data. * - * @param array $companies + * @return string[] + */ + private function getData(): array + { + return array_merge([ + 'language' => \App\Language::getLanguage() ?: null, + 'timezone' => date_default_timezone_get(), + 'appId' => self::getInstanceKey(), + 'crmKey' => self::getCrmKey(), + 'crmVersion' => \App\Version::get(), + 'provider' => self::getProvider() ?: null, + ], $this->getCompanyData()); + } + + /** + * Update registration data. * - * @return bool + * @param string[] $data */ - private static function updateCompanies(array $companies): bool + private function updateMetaData(array $data): bool { - $status = false; - $names = \array_column(\App\Company::getAll(), 'name', 'name'); - foreach ($companies as $row) { - if (!empty($row['name']) && isset($names[$row['name']])) { - \App\Company::statusUpdate($row['status'], $row['name']); - $status = true; + $products = $data['subscriptions'] ?? []; + foreach ($products as $product) { + $children = $product['children'] ?? []; + ['product' => $product,'expiresAt' => $date] = $product; + foreach ($children as $child) { + $products[] = ['product' => $child['product'], 'expiresAt' => $date]; } } - if (!$status) { - throw new \App\Exceptions\AppException('ERR_COMPANY_DATA_IS_NOT_COMPATIBLE', 3); + $data['subscriptions'] = $products; + $conf = self::getConf(); + + self::$config = array_merge($conf, $data); + self::$config['last_check_time'] = date('Y-m-d H:i:s'); + self::$config['appId'] = self::getInstanceKey(); + + if (self::isRegistered()) { + unset(self::$config['last_forced_reg_time']); + } else { + self::$config['last_forced_reg_time'] ??= gmdate('Y-m-d H:i:s'); } - return $status; + + $data = (new Encryption())->encrypt(self::$config, true); + return \App\Utils::saveToFile( + self::REGISTRATION_FILE, + $data, + 'Modifying this file or functions that affect the footer appearance will violate the license terms!!!', + 0, + ); } /** - * Get provider. + * Get registration config. * - * @return string + * @return array */ - public static function getProvider(): string + private static function getConf(): array { - $path = ROOT_DIRECTORY . '/app_data/installSource.txt'; - if (\file_exists($path)) { - return trim(file_get_contents($path)); + if (isset(self::$config)) { + return self::$config; } - return getenv('PROVIDER') ?: getenv('provider') ?: ''; + if (!file_exists(self::REGISTRATION_FILE)) { + return self::$config = []; + } + \App\Cache::resetFileCache(self::REGISTRATION_FILE); + + try { + $data = file_get_contents(self::REGISTRATION_FILE); + [, ,$registyData] = explode("\n", $data); + self::$config = (new Encryption())->decrypt($registyData); + } catch (\Throwable $e) { + \App\Log::error($e->__toString()); + self::$config = []; + } + + return self::$config; + } + + /** + * Get configuration value by key. + * + * @param string $key + * + * @return mixed + */ + private static function getConfValue(string $key) + { + return self::getConf()[$key] ?? null; } } diff --git a/app/YetiForce/Shop.php b/app/YetiForce/Shop.php index 34c2eb489a97..90cfc66b04e3 100644 --- a/app/YetiForce/Shop.php +++ b/app/YetiForce/Shop.php @@ -6,9 +6,11 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski + * @author Radosław Skrzypczak + * @author Klaudia Łozowska */ namespace App\YetiForce; @@ -18,119 +20,64 @@ /** * YetiForce shop class. */ -class Shop +final class Shop extends AbstractBase { + /** @var string URL */ + public const URL = 'https://api.yetiforce.eu/store'; + /** @var string[] Premium icons. */ - const PREMIUM_ICONS = [ + public const PREMIUM_ICONS = [ 1 => 'yfi-premium color-red-600', 2 => 'yfi-enterprise color-yellow-600', 3 => 'yfi-partners color-grey-600', ]; + /** @var array Product categories. */ - const PRODUCT_CATEGORIES = [ + public const PRODUCT_CATEGORIES = [ 'All' => ['label' => 'LBL_CAT_ALL', 'icon' => 'yfi-all-shop'], - 'CloudHosting' => ['label' => 'LBL_CAT_CLOUD_HOSTING', 'icon' => 'yfi-hosting-cloud-shop'], - 'Support' => ['label' => 'LBL_CAT_SUPPORT', 'icon' => 'yfi-support-shop'], - 'Addons' => ['label' => 'LBL_CAT_ADDONS', 'icon' => 'yfi-adds-on-shop'], + 'Extensions' => ['label' => 'LBL_CAT_ADDONS', 'icon' => 'yfi-adds-on-shop'], 'Integrations' => ['label' => 'LBL_CAT_INTEGRATIONS', 'icon' => 'yfi-integration-shop'], - 'PartnerSolutions' => ['label' => 'LBL_CAT_PARTNER_SOLUTIONS', 'icon' => 'yfi-partner-solution-shop'], ]; /** * Product instance cache. * - * @var \App\YetiForce\Shop\AbstractBaseProduct[] + * @var array */ - public static $productCache = []; + public static array $productCache = []; /** * Get products. * * @param string $state - * @param string $department + * @param string $section * - * @return \App\YetiForce\Shop\AbstractBaseProduct[] + * @return Shop\AbstractBaseProduct[] */ - public static function getProducts(string $state = '', string $department = ''): array + public function getProducts(): array { - $products = []; - $path = ROOT_DIRECTORY . '/app/YetiForce/Shop/Product/' . $department; - foreach ((new \DirectoryIterator($path)) as $item) { - if (!$item->isDir()) { - $fileName = $item->getBasename('.php'); - $instance = static::getProduct($fileName, $department); - if (!$instance->active || ('featured' === $state && !$instance->featured)) { - continue; - } - $products[$fileName] = $instance; - } + if (empty(self::$productCache)) { + $this->load(); } - return $products; - } - /** - * Get products. - * - * @param string $name - * @param string $department - * - * @return Shop\AbstractBaseProduct - */ - public static function getProduct(string $name, string $department = ''): Shop\AbstractBaseProduct - { - if ($department) { - $className = "\\App\\YetiForce\\Shop\\Product\\$department\\$name"; - } else { - $className = "\\App\\YetiForce\\Shop\\Product\\$name"; - } - if (isset(self::$productCache[$className])) { - return self::$productCache[$className]; - } - $instance = new $className($name); - if ($config = self::getConfig($name)) { - $instance->loadConfig($config); - } - return self::$productCache[$className] = $instance; + return self::$productCache; } /** * Get variable payments. * - * @param bool $isCustom - * * @return array */ - public static function getVariablePayments($isCustom = false): array + public static function getVariablePayments(): array { - $crmData = []; - if (!$isCustom) { - $crmData = [ - 'return' => \Config\Main::$site_URL . 'index.php?module=YetiForce&parent=Settings&view=Shop&status=success', - 'cancel_return' => \Config\Main::$site_URL . 'index.php?module=YetiForce&parent=Settings&view=Shop&status=fail', - 'custom' => \App\YetiForce\Register::getInstanceKey() . '|' . \App\YetiForce\Register::getCrmKey(), - ]; - } - return array_merge([ + return [ 'business' => 'paypal@yetiforce.com', 'rm' => 2, 'image_url' => 'https://public.yetiforce.com/shop/logo.png', - ], $crmData); - } - - /** - * Get additional configuration. - * - * @param string $name - * - * @return array - */ - public static function getConfig(string $name): array - { - $config = \App\YetiForce\Register::getProducts($name); - if (!$config && \is_dir(ROOT_DIRECTORY . '/app_data/shop/') && \file_exists(ROOT_DIRECTORY . "/app_data/shop/{$name}.php")) { - $config = require ROOT_DIRECTORY . "/app_data/shop/{$name}.php"; - } - return $config; + 'return' => \Config\Main::$site_URL . 'index.php?module=YetiForce&parent=Settings&view=Shop&status=success', + 'cancel_return' => \Config\Main::$site_URL . 'index.php?module=YetiForce&parent=Settings&view=Shop&status=fail', + 'custom' => \App\YetiForce\Register::getInstanceKey() . '|' . \App\YetiForce\Register::getCrmKey(), + ]; } /** @@ -142,7 +89,9 @@ public static function getConfig(string $name): array */ public static function check(string $productName): bool { - return self::checkWithMessage($productName)[0] ?? false; + $className = self::getProductClass($productName); + $product = new $className($productName); + return $product->getStatus(); } /** @@ -158,26 +107,21 @@ public static function checkWithMessage(string $productName): array return Cache::staticGet('Shop|checkWithMessage', $productName); } $status = $message = false; - if ($productDetails = self::getConfig($productName)) { - $status = self::verifyProductKey($productDetails['key']); - if ($status) { - $status = strtotime(date('Y-m-d') . ' -1 day') <= strtotime($productDetails['date']); - if (!$status) { - $message = 'LBL_SUBSCRIPTION_HAS_EXPIRED'; - } - } - if ($status) { - $status = \App\Company::compareSize($productDetails['package']); - if (!$status) { - $message = 'LBL_SUBSCRIPTION_COMPANY_SIZE_HAS_CHANGED'; - } + $productDetails = \App\YetiForce\Register::getProduct($productName); + if ($productDetails) { + $interval = (new \DateTime('now', new \DateTimeZone('GMT')))->diff(new \DateTime($productDetails['expires_at'], new \DateTimeZone('GMT'))); + $status = $interval->invert && $interval->days > 0; + if (!$status) { + $message = 'LBL_SUBSCRIPTION_HAS_EXPIRED'; } } + Cache::staticSave('Shop|checkWithMessage', $productName, [$status, $message]); return [$status, $message]; } /** + * @todo remove or replace * Check alert to show for product. * * @param string $productName @@ -186,14 +130,9 @@ public static function checkWithMessage(string $productName): array */ public static function checkAlert(string $productName): string { - $message = ''; - $check = self::getProduct($productName)->verify(); - if (false === $check['status']) { - $message = $check['message']; - } elseif (!self::getConfig($productName)) { - $message = 'LBL_PAID_FUNCTIONALITY'; - } - return $message; + $className = self::getProductClass($productName); + $product = new $className($productName); + return $product->getAlertMessage(); } /** @@ -209,96 +148,134 @@ public static function getPaypalUrl(): string } /** - * Verification of the product key. + * Verify or show a message about invalid products. * - * @param string $key + * @param bool $onlyNames + * @param bool $getNames * - * @return bool + * @return string */ - public static function verifyProductKey(string $key): bool + public static function verify(bool $getNames = false): string { - $key = base64_decode($key); - $m = substr(substr($key, 5), 0, -2); - $p = substr($m, -5); - $m = substr($m, 0, -5); - $d = substr($m, -10); - $m = substr($m, 0, -10); - $s = substr($m, -5); - $m = substr($m, 0, -5); - return substr(crc32($m), 2, 5) === substr($key, 0, 5) - && substr(sha1($d . $p), 5, 5) === $s - && substr($key, -2) === substr(sha1(substr(crc32($m), 2, 5) . $m . substr(sha1($d . $p), 5, 5) . $d . $p), 1, 2); + $names = []; + $products = \App\YetiForce\Register::getProducts(); + foreach ($products ?? [] as $row) { + $productName = $row['product']; + $className = self::getProductClass($productName); + $product = new $className($productName); + if ($product->isExpired()) { + $names[$productName] = $productName; + if (!$getNames) { + $names[$productName] = \App\Language::translate($productName, 'Settings::YetiForce'); + } + } + } + + return implode(', ', $names); } /** - * Verify or show a message about invalid products. + * Get all available products. * - * @param bool $cache - * @param bool $onlyNames - * - * @return string + * @return void */ - public static function verify(bool $cache = true, bool $onlyNames = false): string + public function load() { - $products = ''; - if ($cache && ($cacheData = self::getFromCache())) { - foreach ($cacheData as $product => $verify) { - if (!$verify['status']) { - $products .= \App\Language::translate($product, 'Settings::YetiForce'); - if ($onlyNames) { - $products .= ','; - } else { - $products .= '
' . \App\Language::translate(($verify['message'] ?? 'LBL_YETIFORCE_SHOP_PRODUCT_CANCELED'), 'Settings::YetiForce') . '
'; - } - } + self::$productCache = []; + $this->success = false; + try { + $client = new ApiClient(); + $client->send(self::URL . '/' . \App\Version::get() . '/products', 'GET'); + $this->error = $client->getError(); + if (!$this->error && 200 === $client->getStatusCode() && !\App\Json::isEmpty($client->getResponseBody())) { + $this->setProducts(\App\Json::decode($client->getResponseBody())); + $this->success = true; } - } else { - foreach (self::getProducts() as $product) { - $verify = $product->verify(); - if (!$verify['status']) { - $products .= \App\Language::translate($product->getLabel(), 'Settings::YetiForce'); - if ($onlyNames) { - $products .= ','; - } else { - $products .= '
' . \App\Language::translate(($verify['message'] ?? 'LBL_YETIFORCE_SHOP_PRODUCT_CANCELED'), 'Settings::YetiForce') . '
'; - } - } + } catch (\Throwable $e) { + $this->success = false; + $this->error = $e->getMessage(); + \App\Log::error($e->getMessage(), __METHOD__); + } + } + + /** + * Get product by ID. + * + * @param string $productId + * + * @return void + */ + public function loadProduct(string $productId) + { + $this->success = false; + try { + $client = new ApiClient(); + $client->send(self::URL . '/' . \App\Version::get() . "/products/{$productId}", 'GET'); + $this->error = $client->getError(); + if (!$this->error && 200 === $client->getStatusCode() && !\App\Json::isEmpty($client->getResponseBody())) { + $this->setProducts([\App\Json::decode($client->getResponseBody())]); + $this->success = true; } + } catch (\Throwable $e) { + $this->success = false; + $this->error = $e->getMessage(); + \App\Log::error($e->getMessage(), __METHOD__); } - return rtrim($products, '
,'); } /** - * Generate cache. + * Get products. + * + * @param string $name + * @param string $section + * @param string $productId + * + * @return Shop\AbstractBaseProduct */ - public static function generateCache(): void + public static function getProduct(string $name, string $productId = ''): ?Shop\AbstractBaseProduct { - $content = []; - foreach (self::getProducts() as $product) { - $verify = $product->verify(); - if ($verify['status']) { - unset($verify['message']); + if (empty(self::$productCache[$name])) { + if ($productId) { + (new self())->loadProduct($productId); + } else { + (new self())->load(); } - $content['products'][$product->getLabel()] = $verify; } - $content['key'] = md5(json_encode($content['products'])); - \App\Utils::saveToFile(ROOT_DIRECTORY . '/app_data/shopCache.php', $content, 'Modifying this file will breach the licence terms!!!', 0, true); + + return self::$productCache[$name] ?? null; } /** - * Get from cache. + * Get product class. * - * @return array + * @param string $name + * + * @return string */ - public static function getFromCache(): array + private static function getProductClass(string $name): string { - $content = []; - if (\file_exists(ROOT_DIRECTORY . '/app_data/shopCache.php')) { - $content = include ROOT_DIRECTORY . '/app_data/shopCache.php'; + $className = '\\App\\YetiForce\\Shop\\Product\\' . $name; + if (!class_exists($className)) { + $className = '\\App\\YetiForce\\Shop\\Product\\YetiForceBase'; } - if (empty($content['products']) || ($content['key'] ?? '') !== md5(json_encode($content['products']))) { - $content['products'] = []; + return $className; + } + + /** + * Set Products to cache. + * + * @param array $products + * + * @return void + */ + private function setProducts(array $products) + { + foreach ($products as $productData) { + $name = $productData['name'] ?? ''; + $className = self::getProductClass($name); + if (!empty($productData['packages']) && ($product = $className::fromArray($productData)) && $product->isAvailable()) { + self::$productCache[$product->getName()] = $product; + } } - return $content['products']; } } diff --git a/app/YetiForce/Shop/AbstractBaseProduct.php b/app/YetiForce/Shop/AbstractBaseProduct.php index f547457a5857..66043123fbcf 100644 --- a/app/YetiForce/Shop/AbstractBaseProduct.php +++ b/app/YetiForce/Shop/AbstractBaseProduct.php @@ -1,13 +1,14 @@ + * @author Klaudia Łozowska + * @author Radosław Skrzypczak */ namespace App\YetiForce\Shop; @@ -17,129 +18,192 @@ */ abstract class AbstractBaseProduct { + private const DEFAULT_CURRENCY = 'EUR'; + + /** + * Product ID. + * + * @var string + */ + protected string $id; + /** * Product label. * * @var string */ - public $label; + protected string $label; + /** * Product name. * * @var string */ - public $name; + protected string $name; + /** - * Is the product featured. + * Is the product active. * * @var bool */ - public $active = true; + protected bool $active; + /** * Is the product featured. * * @var bool */ - public $featured = false; + protected bool $featured; + /** * Product category. * * @var string */ - public $category; + protected string $category; + /** * Product website. * * @var string */ - public $website; + protected string $website; + /** - * Price table depending on the size of the company. + * Price packages. * - * @var int[] + * @var Package[] */ - public $prices = []; + protected array $packages = []; /** - * Custom prices label. + * Fit package. * - * @var array + * @var Package */ - public $customPricesLabel = []; + protected $package; /** - * Price type (table,manual,selection). + * Expiration date. * - * @var string + * @var string|null */ - public $pricesType = 'table'; + protected ?string $expirationDate; /** - * Currency code. + * Introduction / short description. * * @var string */ - public $currencyCode = 'EUR'; + protected string $introduction; /** - * Expiration date. + * Description. * - * @var string|null + * @var string */ - public $expirationDate; + protected string $description; /** - * Paid package. + * Image. * - * @var string|null + * @var string */ - public $paidPackage; + protected ?string $image; + + /** @var bool Disabled product */ + protected bool $disabled = false; + + /** @var bool Status */ + private bool $status = false; /** - * Custom Fields. + * Constructor. * - * @var array + * @param string $productName */ - public $customFields = []; + public function __construct(string $productName) + { + $this->status = false; + $this->name = $productName; + + $statusData = \App\YetiForce\Register::getProduct($productName); + if ($statusData) { + $expiresAt = $statusData['expiresAt']; + $this->expirationDate = (new \DateTime($expiresAt, new \DateTimeZone('GMT')))->setTimezone(new \DateTimeZone(\App\Fields\DateTime::getTimeZone()))->format('Y-m-d'); + $this->status = strtotime($this->expirationDate) >= strtotime(date('Y-m-d')); + } else { + $this->expirationDate = null; + } + } /** - * Verify the product. + * Get subscription status. * - * @return array + * @return bool */ - public function verify(): array + public function getStatus(): bool { - return ['status' => true]; + return $this->status; } /** - * Construct. + * Check if the product is configured correctly. * - * @param string $name + * @return bool */ - public function __construct(string $name) + public function isConfigured(): bool { - $this->name = $name; + return true; } /** - * Get price type. + * Construct. * - * @return string + * @param array $data + * + * @return static */ - public function getPriceType(): string + public static function fromArray(array $data) { - return $this->pricesType; + $name = $data['name'] ?? ''; + $self = new static($name); + $self->label = \App\Purifier::purifyByType($data['label'] ?? '', \App\Purifier::TEXT); + $self->id = $data['id'] ?? ''; + $self->featured = $data['featured'] ?? false; + $self->category = $data['category'] ?? ''; + $self->website = $data['website'] ?? ''; + $self->introduction = \App\Purifier::purifyByType($data['shortDescription'] ?? '', \App\Purifier::TEXT); + $self->description = \App\Purifier::decodeHtml(\App\Purifier::purifyByType($data['description'] ?? '', \App\Purifier::HTML)); + $self->image = $data['imageUrl'] ?? ''; + + $packages = []; + $currencyCode = \App\Fields\Currency::getDefault()['currency_code']; + foreach ($data['packages'] as $packageData) { + $package = new Package($packageData); + if ($package->isAvailable()) { + $packages[$package->getCurrencyCode()][] = $package; + } + } + if (isset($packages[$currencyCode])) { + $self->packages = $packages[$currencyCode]; + } elseif (isset($packages[self::DEFAULT_CURRENCY])) { + $self->packages = $packages[self::DEFAULT_CURRENCY]; + } elseif ($packages) { + $self->packages = current($packages); + } + + return $self; } /** - * Get product price. + * Get product ID. * - * @return int + * @return string */ - public function getPrice(): int + public function getId(): string { - return $this->prices[\App\Company::getSize()] ?? $this->prices[0] ?? 0; + return $this->id; } /** @@ -149,10 +213,7 @@ public function getPrice(): int */ public function getLabel(): string { - if (!empty($this->label)) { - return $this->label; - } - return \App\Language::translate('LBL_SHOP_' . \strtoupper($this->name), 'Settings:YetiForce'); + return $this->label; } /** @@ -166,75 +227,114 @@ public function getName(): string } /** - * Get product description. + * Get category. * * @return string */ - public function getIntroduction(): string + public function getCategory(): string { - return \App\Language::translate('LBL_SHOP_' . \strtoupper($this->name) . '_INTRO', 'Settings:YetiForce'); + return $this->category; } /** - * Get product description. + * Price packages. * - * @return string + * @return Package[] */ - public function getDescription(): string + public function getPackages(): array { - return \App\Language::translate('LBL_SHOP_' . \strtoupper($this->name) . '_DESC', 'Settings:YetiForce'); + return $this->packages; } /** - * Get product image. + * Get product price. + * + * @return int + */ + public function getPrice(): int + { + return $this->package->getPrice(); + } + + /** + * Get currency code. * * @return string */ - public function getImage(): ?string + public function getCurrencyCode(): string + { + return $this->package->getCurrencyCode(); + } + + /** + * Get fit package. + * + * @return Package|null + */ + public function getFitPackage(): ?Package { - $filePath = null; - $file = 'modules/Settings/YetiForce/' . $this->name . '.png'; - if (\file_exists(ROOT_DIRECTORY . \DIRECTORY_SEPARATOR . 'public_html' . \DIRECTORY_SEPARATOR . $file)) { - $filePath = \App\Layout::getPublicUrl($file); + if (!$this->package) { + $packages = $this->getPackages(); + usort($packages, fn ($a, $b) => $a->getPriceNet() <=> $b->getPriceNet()); + $this->package = current($packages); } - return $filePath; + + return $this->package; } /** - * Get price label. + * Get product description. * - * @param string $key + * @return string + */ + public function getIntroduction(): string + { + return $this->introduction; + } + + /** + * Get product description. * * @return string */ - public function getPriceLabel($key): string + public function getDescription(): string + { + return $this->description; + } + + /** + * Get product image. + * + * @return ?string + */ + public function getImage(): ?string { - return \App\Language::translate('LBL_SHOP_COMPANY_SIZE_' . \strtoupper($key), 'Settings::YetiForce'); + return $this->image ?? ''; } /** * The period for which the service is purchased. * - * @return void + * @return string */ - public function getPeriodLabel(): string + public function getPaymentFrequency(): string { - return 'LBL_PERIOD_OF_MONTH'; + return $this->package->getPaymentFrequency(); } /** - * Loading configuration. - * - * @param array $config + * Get short period name for which the service is purchased. * - * @return void + * @return string */ - public function loadConfig(array $config) + public function getPaymentFrequencyShort(): string { - if (\App\YetiForce\Shop::verifyProductKey($config['key'])) { - $this->expirationDate = $config['date']; - $this->paidPackage = $config['package']; - } + return $this->package->getPaymentFrequencyShort(); + } + + public function isExpired(): bool + { + return isset($this->expirationDate) && !$this->status; } /** @@ -244,8 +344,7 @@ public function loadConfig(array $config) */ public function getVariable(): array { - $productSelection = 'selection' === $this->pricesType; - $data = [ + return array_merge([ 'cmd' => '_xclick-subscriptions', 'no_shipping' => 1, 'no_note' => 1, @@ -254,61 +353,35 @@ public function getVariable(): array 't3' => 'M', 'p3' => 1, 'item_name' => $this->name, - 'currency_code' => $this->currencyCode, + 'currency_code' => $this->getCurrencyCode(), 'on0' => 'Package', - ]; - if (!$productSelection) { - $data['os0'] = \App\Company::getSize(); - } - if ('manual' !== $this->pricesType && !$productSelection) { - $data['a3'] = $this->getPrice(); - } - return array_merge($data, \App\YetiForce\Shop::getVariablePayments($this->isCustom())); - } - - /** - * Get product custom fields. - * - * @return array - */ - public function getCustomFields(): array - { - return $this->customFields; + 'os0' => $this->package->getName(), + 'a3' => $this->package->getPriceGross() + ], \App\YetiForce\Shop::getVariablePayments()); } /** - * Is custom fields. + * Show alert in marketplace. * - * @return bool - */ - public function isCustom(): bool - { - return !empty($this->customFields); - } - - /** - * Show alert. + * @param bool $require * * @return array */ - public function showAlert(): array + public function getAlertMessage(bool $require = true): string { - $return = ['status' => false]; - if (isset($this->paidPackage, $this->expirationDate)) { - if (strtotime('now') > strtotime($this->expirationDate)) { - $return = ['status' => true, 'type' => 'LBL_SHOP_RENEW', 'message' => 'LBL_SUBSCRIPTION_HAS_EXPIRED']; - } elseif (!\App\Company::compareSize($this->paidPackage)) { - $return = ['status' => true, 'type' => 'LBL_SHOP_RENEW', 'message' => 'LBL_SIZE_OF_YOUR_COMPANY_HAS_CHANGED']; - } elseif ($analyze = $this->analyzeConfiguration()) { - $return = array_merge(['status' => true], $analyze); - } - } else { - $check = $this->verify(); - if (!$check['status']) { - $return = ['status' => true, 'type' => 'LBL_SHOP_RENEW', 'message' => $check['message']]; - } + $message = ''; + $status = $this->getStatus(); + if ($this->disabled) { + $message = 'LBL_FUNCTIONALITY_NOT_AVAILABLE'; + } elseif ($this->isExpired()) { + $message = 'LBL_SUBSCRIPTION_HAS_EXPIRED'; + } elseif ($status && !$this->isConfigured()) { + $message = 'LBL_FUNCTIONALITY_HAS_NOT_YET_BEEN_ACTIVATED'; + } elseif ($require && !$status) { + $message = 'LBL_PAID_FUNCTIONALITY'; } - return $return; + + return $message; } /** @@ -324,7 +397,7 @@ public function analyzeConfiguration(): array /** * Product modal additional buttons. * - * @return Vtiger_Link_Model[] + * @return \Vtiger_Link_Model[] */ public function getAdditionalButtons(): array { @@ -341,6 +414,16 @@ public function getSwitchButton(): ?\Vtiger_Link_Model return null; } + /** + * Get expiration date. + * + * @return string|null + */ + public function getExpirationDate(): ?string + { + return $this->expirationDate ?? null; + } + /** * Check if the service is active. * @@ -348,6 +431,16 @@ public function getSwitchButton(): ?\Vtiger_Link_Model */ public function isActive(): bool { - return false; + return $this->active; + } + + /** + * Check if product is available. + * + * @return bool + */ + public function isAvailable(): bool + { + return !empty($this->getFitPackage()); } } diff --git a/app/YetiForce/Shop/FormField.php b/app/YetiForce/Shop/FormField.php new file mode 100644 index 000000000000..43fd81abcd7c --- /dev/null +++ b/app/YetiForce/Shop/FormField.php @@ -0,0 +1,113 @@ + + */ + +namespace App\YetiForce\Shop; + +/** + * YetiForce shop form field class. + */ +class FormField +{ + /** + * Name + * + * @var string + */ + private string $name; + + /** + * Label + * + * @var ?string + */ + private ?string $label; + + /** + * Type + * + * @var string + */ + private string $type; + + /** + * Field attributes + * + * @var array + */ + private array $attributes = []; + + /** + * Construct + * + * @param string $name + * @param ?string $label + * @param string $type + */ + public function __construct(string $name, ?string $label, string $type) + { + $this->name = $name; + $this->label = $label; + $this->type = $type; + } + + /** + * Get name + * + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * Get label + * + * @return ?string + */ + public function getLabel(): ?string + { + return $this->label; + } + + /** + * Get type + * + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * Get field attributes + * + * @return array + */ + public function getAttributes(): array + { + return $this->attributes; + } + + /** + * Add field attribute + * + * @param string $name + * @param string $value + * + * @return void + */ + public function addAttribute(string $name, string $value): void + { + $this->attributes[$name] = $value; + } +} diff --git a/app/YetiForce/Shop/Package.php b/app/YetiForce/Shop/Package.php new file mode 100644 index 000000000000..f243997025d6 --- /dev/null +++ b/app/YetiForce/Shop/Package.php @@ -0,0 +1,179 @@ + + * @author Radosław Skrzypczak + */ + +namespace App\YetiForce\Shop; + +/** + * YetiForce shop product price Package class. + */ +class Package +{ + private const PAYMENT_FREQ_MAP = [ + 'monthly' => 'M', + 'yearly' => 'Y', + ]; + + /** @var string Package ID */ + private string $id; + + /** @var string Name. */ + private string $name; + + /** @var string Label. */ + private ?string $label; + + /** @var int Price net. */ + private $priceNet; + + /** @var float Price gross. */ + private $priceGross; + + /** @var string Currency code */ + private ?string $currencyCode; + + /** @var string Payment frequency. */ + private ?string $paymentFrequency; + + /** @var int[] User Terms. */ + private int $max = 0; + + /** + * Construct. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->id = $data['id'] ?? ''; + $this->priceNet = (int) ($data['priceNet'] ?? 0) / 100; + $this->priceGross = (int) ($data['priceGross'] ?? 0) / 100; + $this->currencyCode = $data['currencyCode'] ?? ''; + $this->paymentFrequency = $data['paymentFrequency'] ?? ''; + $this->name = $data['packageType']['name'] ?? ''; + $this->label = $data['packageType']['label'] ?? ''; + $this->name = $data['packageType']['name'] ?? ''; + $this->max = $data['packageType']['maxUsers'] ?? 0; + } + + /** + * Get name. + * + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * Get net price + * + * @param bool $format + * @return int|float|string + */ + public function getPriceNet(bool $format = false) + { + return $format ? number_format($this->priceNet, 2, '.', '') : $this->priceNet; + } + + /** + * Get gross price + * + * @param bool $format + * @return int|float|string + */ + public function getPriceGross(bool $format = false) + { + return $format ? number_format($this->priceGross, 2, '.', '') : $this->priceGross; + } + + /** + * Check if package is available. + * + * @return bool + */ + public function isAvailable(): bool + { + return !$this->max || \App\User::getNumberOfUsers() <= $this->max; + } + + /** + * Get label. + * + * @return ?string + */ + public function getLabel(): ?string + { + return $this->label; + } + + /** + * Get currency Code + * + * @return string + */ + public function getCurrencyCode(): string + { + return $this->currencyCode; + } + + /** + * Get payment frequency + * + * @return string + */ + public function getPaymentFrequency(): string + { + return $this->paymentFrequency; + } + + /** + * Get short name payment frequency + * + * @return string + */ + public function getPaymentFrequencyShort(): string + { + $value = $this->getPaymentFrequency(); + return self::PAYMENT_FREQ_MAP[$value] ?? $value; + } + + /** + * Get full name for payment frequency + * + * @return string + */ + public function getPaymentFrequencyLabel(): string + { + return 'LBL_SHOP_PAYMENT_FREQUENCY_' . $this->getPaymentFrequencyShort(); + } + + /** + * Get price. + * + * @return int + */ + public function getPrice(): int + { + return $this->getPriceNet(); + } + + /** + * Get package ID. + * + * @return string + */ + public function getId(): string + { + return $this->id; + } +} diff --git a/app/YetiForce/Shop/Product/Partner/Integrator.php b/app/YetiForce/Shop/Product/Partner/Integrator.php deleted file mode 100644 index 86448d24b3a4..000000000000 --- a/app/YetiForce/Shop/Product/Partner/Integrator.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product\Partner; - -/** - * YetiForce shop Integrator class. - */ -class Integrator extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $prices = [250]; - /** {@inheritdoc} */ - public $featured = true; -} diff --git a/app/YetiForce/Shop/Product/Partner/ModuleProducer.php b/app/YetiForce/Shop/Product/Partner/ModuleProducer.php deleted file mode 100644 index 0a33594d3956..000000000000 --- a/app/YetiForce/Shop/Product/Partner/ModuleProducer.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product\Partner; - -/** - * YetiForce shop ModuleProducer class. - */ -class ModuleProducer extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $prices = [100]; - /** {@inheritdoc} */ - public $featured = true; -} diff --git a/app/YetiForce/Shop/Product/Partner/Reseller.php b/app/YetiForce/Shop/Product/Partner/Reseller.php deleted file mode 100644 index 0e94a8cd2157..000000000000 --- a/app/YetiForce/Shop/Product/Partner/Reseller.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product\Partner; - -/** - * YetiForce shop Reseller class. - */ -class Reseller extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $prices = [100]; - /** {@inheritdoc} */ - public $featured = true; -} diff --git a/app/YetiForce/Shop/Product/YetiForceAutoAssignment.php b/app/YetiForce/Shop/Product/YetiForceAutoAssignment.php index c7b281943825..3f7a7369fc13 100644 --- a/app/YetiForce/Shop/Product/YetiForceAutoAssignment.php +++ b/app/YetiForce/Shop/Product/YetiForceAutoAssignment.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,40 +16,6 @@ */ class YetiForceAutoAssignment extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Automatic Assignment'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-automatic-assignment'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceAutoAssignment')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceAutoAssignment'); - } else { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = !(new \App\Db\Query())->from('s_#__auto_assign')->exists(); - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Shop/Product/YetiForceBase.php b/app/YetiForce/Shop/Product/YetiForceBase.php new file mode 100644 index 000000000000..4e96796153bd --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceBase.php @@ -0,0 +1,39 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForce Widgets Premium class. + */ +class YetiForceBase extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $links = []; + if ($this->website) { + $links[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]); + } + + return $links; + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceDav.php b/app/YetiForce/Shop/Product/YetiForceDav.php index 6bba97f279e3..9182a6471927 100644 --- a/app/YetiForce/Shop/Product/YetiForceDav.php +++ b/app/YetiForce/Shop/Product/YetiForceDav.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,40 +16,6 @@ */ class YetiForceDav extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce DAV Integration'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-dav-integration'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceDav')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceDav'); - } else { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = !(new \App\Db\Query())->from('dav_users')->exists(); - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Shop/Product/YetiForceDevelopmentSupport.php b/app/YetiForce/Shop/Product/YetiForceDevelopmentSupport.php deleted file mode 100644 index e44c0f5dc9e9..000000000000 --- a/app/YetiForce/Shop/Product/YetiForceDevelopmentSupport.php +++ /dev/null @@ -1,77 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product; - -/** - * YetiForce shop DevelopmentSupport class. - */ -class YetiForceDevelopmentSupport extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $label = 'YetiForce Development'; - - /** {@inheritdoc} */ - public $category = 'Support'; - - /** {@inheritdoc} */ - public $pricesType = 'selection'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/marketplace/development-support'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 225, - 'Small' => 432, - 'Medium' => 828, - 'Large' => 1611, - 'Corporation' => 3780, - 'ExtraLarge' => 7200, - ]; - - /** {@inheritdoc} */ - public $customPricesLabel = [ - 'Micro' => 5, - 'Small' => 10, - 'Medium' => 20, - 'Large' => 40, - 'Corporation' => 100, - 'ExtraLarge' => 200, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function getPriceLabel($key): string - { - return $this->customPricesLabel[$key] . ' ' . \App\Language::translate('LBL_HOURS'); - } - - /** {@inheritdoc} */ - public function getAdditionalButtons(): array - { - return [ - \Vtiger_Link_Model::getInstanceFromValues([ - 'linklabel' => 'Website', - 'relatedModuleName' => '_Base', - 'linkicon' => 'fas fa-globe mr-2', - 'linkhref' => true, - 'linkExternal' => true, - 'linktarget' => '_blank', - 'linkurl' => $this->website, - 'linkclass' => 'btn-info', - 'showLabel' => 1, - ]), - ]; - } -} diff --git a/app/YetiForce/Shop/Product/YetiForceDisableBranding.php b/app/YetiForce/Shop/Product/YetiForceDisableBranding.php index f544b874ea19..08a948570259 100644 --- a/app/YetiForce/Shop/Product/YetiForceDisableBranding.php +++ b/app/YetiForce/Shop/Product/YetiForceDisableBranding.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,37 +16,6 @@ */ class YetiForceDisableBranding extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Branding'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-branding-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 10, - 'Small' => 25, - 'Medium' => 50, - 'Large' => 100, - 'Corporation' => 500, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceDisableBranding')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceDisableBranding'); - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { @@ -69,7 +38,7 @@ public function getAdditionalButtons(): array 'relatedModuleName' => 'Settings:_Base', 'linkicon' => 'adminIcon-company-detlis', 'linkhref' => true, - 'linkurl' => 'index.php?parent=Settings&module=Companies&view=List', + 'linkurl' => \App\Company::EDIT_VIEW_URL, 'linkclass' => 'btn-primary', 'showLabel' => 1, ]); diff --git a/app/YetiForce/Shop/Product/YetiForceDonations.php b/app/YetiForce/Shop/Product/YetiForceDonations.php deleted file mode 100644 index 54a12636ab0f..000000000000 --- a/app/YetiForce/Shop/Product/YetiForceDonations.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product; - -/** - * YetiForce shop Donations class. - */ -class YetiForceDonations extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $label = 'Donate / Support our project'; - /** {@inheritdoc} */ - public $category = 'Support'; - /** {@inheritdoc} */ - public $pricesType = 'manual'; - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function getPrice(): int - { - return \App\User::getNumberOfUsers(); - } - - /** {@inheritdoc} */ - public function getAdditionalButtons(): array - { - return [ - \Vtiger_Link_Model::getInstanceFromValues([ - 'linklabel' => 'Website', - 'relatedModuleName' => '_Base', - 'linkicon' => 'fas fa-globe mr-2', - 'linkhref' => true, - 'linkExternal' => true, - 'linktarget' => '_blank', - 'linkurl' => $this->website, - 'linkclass' => 'btn-info', - 'showLabel' => 1, - ]), - ]; - } -} diff --git a/app/YetiForce/Shop/Product/YetiForceGeocoder.php b/app/YetiForce/Shop/Product/YetiForceGeocoder.php index 2c85beadb25e..8ea1450ba314 100644 --- a/app/YetiForce/Shop/Product/YetiForceGeocoder.php +++ b/app/YetiForce/Shop/Product/YetiForceGeocoder.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,45 +16,6 @@ */ class YetiForceGeocoder extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Address Search'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-address-search-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceGeocoder')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceGeocoder'); - } else { - $pwnedPassword = \App\Extension\PwnedPassword::getDefaultProvider(); - if ('\App\Extension\PwnedPassword\YetiForce' === \get_class($pwnedPassword)) { - if ($pwnedPassword->isActive()) { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = false; - } - } - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Shop/Product/YetiForceHelp.php b/app/YetiForce/Shop/Product/YetiForceHelp.php deleted file mode 100644 index 1f25bd1fedc3..000000000000 --- a/app/YetiForce/Shop/Product/YetiForceHelp.php +++ /dev/null @@ -1,56 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product; - -/** - * YetiForce shop PremiumSupport class. - */ -class YetiForceHelp extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $label = 'YetiForce Help'; - - /** {@inheritdoc} */ - public $category = 'Support'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/marketplace/support'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 50, - 'Small' => 80, - 'Medium' => 200, - 'Large' => 400, - 'Corporation' => 800, - ]; - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function getAdditionalButtons(): array - { - return [ - \Vtiger_Link_Model::getInstanceFromValues([ - 'linklabel' => 'Website', - 'relatedModuleName' => '_Base', - 'linkicon' => 'fas fa-globe mr-2', - 'linkhref' => true, - 'linkExternal' => true, - 'linktarget' => '_blank', - 'linkurl' => $this->website, - 'linkclass' => 'btn-info', - 'showLabel' => 1, - ]), - ]; - } -} diff --git a/app/YetiForce/Shop/Product/YetiForceInstallInCloud.php b/app/YetiForce/Shop/Product/YetiForceInstallInCloud.php deleted file mode 100644 index 6ebf50a4dbe8..000000000000 --- a/app/YetiForce/Shop/Product/YetiForceInstallInCloud.php +++ /dev/null @@ -1,79 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product; - -/** - * YetiForce shop InstallInCloud class. - */ -class YetiForceInstallInCloud extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $label = 'YetiForce Cloud'; - - /** {@inheritdoc} */ - public $category = 'CloudHosting'; - - /** {@inheritdoc} */ - public $pricesType = 'selection'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/marketplace/cloud'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 65, - 'Small' => 125, - 'Medium' => 245, - 'Large' => 485, - 'Corporation' => 965, - ]; - - /** {@inheritdoc} */ - public $customFields = [ - 'subdomain' => [ - 'label' => 'LBL_SHOP_DOMAIN_PREFIX', - 'type' => 'text', - 'append' => '.yetiforce.eu', - 'validator' => 'required,custom[onlyLetterNumber],minSize[3],maxSize[20]', - ], - 'email' => [ - 'label' => 'LBL_EMAIL', - 'type' => 'email', - 'info' => 'LBL_EMAIL_INFO', - 'validator' => 'required,funcCall[Vtiger_Email_Validator_Js.invokeValidation]', - ], - ]; - - /** {@inheritdoc} */ - public $companyDataForm = false; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function getAdditionalButtons(): array - { - return [ - \Vtiger_Link_Model::getInstanceFromValues([ - 'linklabel' => 'Website', - 'relatedModuleName' => '_Base', - 'linkicon' => 'fas fa-globe mr-2', - 'linkhref' => true, - 'linkExternal' => true, - 'linktarget' => '_blank', - 'linkurl' => $this->website, - 'linkclass' => 'btn-info', - 'showLabel' => 1, - ]), - ]; - } -} diff --git a/app/YetiForce/Shop/Product/YetiForceInstallInHosting.php b/app/YetiForce/Shop/Product/YetiForceInstallInHosting.php deleted file mode 100644 index d0466d195448..000000000000 --- a/app/YetiForce/Shop/Product/YetiForceInstallInHosting.php +++ /dev/null @@ -1,79 +0,0 @@ - - */ - -namespace App\YetiForce\Shop\Product; - -/** - * YetiForce shop InstallInHosting class. - */ -class YetiForceInstallInHosting extends \App\YetiForce\Shop\AbstractBaseProduct -{ - /** {@inheritdoc} */ - public $label = 'YetiForce Hosting'; - - /** {@inheritdoc} */ - public $category = 'CloudHosting'; - - /** {@inheritdoc} */ - public $pricesType = 'selection'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/marketplace/hosting-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 45, - 'Small' => 85, - 'Medium' => 165, - 'Large' => 325, - 'Corporation' => 645, - ]; - - /** {@inheritdoc} */ - public $customFields = [ - 'subdomain' => [ - 'label' => 'LBL_SHOP_DOMAIN_PREFIX', - 'type' => 'text', - 'append' => '.yetiforce.cloud', - 'validator' => 'required,custom[onlyLetterNumber],minSize[3],maxSize[20]', - ], - 'email' => [ - 'label' => 'LBL_EMAIL', - 'type' => 'email', - 'info' => 'LBL_EMAIL_INFO', - 'validator' => 'required,funcCall[Vtiger_Email_Validator_Js.invokeValidation]', - ], - ]; - - /** {@inheritdoc} */ - public $companyDataForm = false; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function getAdditionalButtons(): array - { - return [ - \Vtiger_Link_Model::getInstanceFromValues([ - 'linklabel' => 'Website', - 'relatedModuleName' => '_Base', - 'linkicon' => 'fas fa-globe mr-2', - 'linkhref' => true, - 'linkExternal' => true, - 'linktarget' => '_blank', - 'linkurl' => $this->website, - 'linkclass' => 'btn-info', - 'showLabel' => 1, - ]), - ]; - } -} diff --git a/app/YetiForce/Shop/Product/YetiForceKanban.php b/app/YetiForce/Shop/Product/YetiForceKanban.php index 3c01193d1ca5..c5de2865e8ca 100644 --- a/app/YetiForce/Shop/Product/YetiForceKanban.php +++ b/app/YetiForce/Shop/Product/YetiForceKanban.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,40 +16,6 @@ */ class YetiForceKanban extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Kanban Board'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-kanban'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceKanban')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceKanban'); - } else { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = !(new \App\Db\Query())->from('s_#__kanban_boards')->exists(); - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Shop/Product/YetiForceMagento.php b/app/YetiForce/Shop/Product/YetiForceMagento.php index 415dc781acf1..cf02a8635dc5 100644 --- a/app/YetiForce/Shop/Product/YetiForceMagento.php +++ b/app/YetiForce/Shop/Product/YetiForceMagento.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -17,50 +17,22 @@ class YetiForceMagento extends \App\YetiForce\Shop\AbstractBaseProduct { /** {@inheritdoc} */ - public $label = 'YetiForce Magento Integration'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-magento-integration-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 10, - 'Small' => 25, - 'Medium' => 50, - 'Large' => 100, - 'Corporation' => 500, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceMagento')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceMagento'); - } else { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = !(new \App\Db\Query())->from('i_#__magento_servers')->exists(); - } - return ['status' => $status, 'message' => $message]; - } + protected bool $disabled = true; /** {@inheritdoc} */ public function analyzeConfiguration(): array { - if (empty($this->expirationDate) || \Settings_Magento_Module_Model::isActive()) { - return []; - } - return [ + return !\Settings_Magento_Module_Model::isActive() ? [ 'message' => \App\Language::translateArgs('LBL_FUNCTIONALITY_HAS_NOT_YET_BEEN_ACTIVATED', 'Settings:Magento', 'Magento'), 'type' => 'LBL_REQUIRES_INTERVENTION', 'href' => 'index.php?parent=Settings&module=Magento&view=List', - ]; + ] : []; + } + + /** {@inheritdoc} */ + public function isConfigured(): bool + { + return \Settings_Magento_Module_Model::isActive(); } /** {@inheritdoc} */ diff --git a/app/YetiForce/Shop/Product/YetiForceMap.php b/app/YetiForce/Shop/Product/YetiForceMap.php index c039bdb40194..48823b2cda37 100644 --- a/app/YetiForce/Shop/Product/YetiForceMap.php +++ b/app/YetiForce/Shop/Product/YetiForceMap.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -17,35 +17,7 @@ class YetiForceMap extends \App\YetiForce\Shop\AbstractBaseProduct { /** {@inheritdoc} */ - public $label = 'YetiForce Map'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-map-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 20, - 'Small' => 50, - 'Medium' => 100, - 'Large' => 250, - 'Corporation' => 1250, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceMap')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceMap'); - } - return ['status' => $status, 'message' => $message]; - } + protected bool $disabled = true; /** {@inheritdoc} */ public function getAdditionalButtons(): array diff --git a/app/YetiForce/Shop/Product/YetiForceOutlook.php b/app/YetiForce/Shop/Product/YetiForceOutlook.php index d491fc0e6d56..8d39d8cf8006 100644 --- a/app/YetiForce/Shop/Product/YetiForceOutlook.php +++ b/app/YetiForce/Shop/Product/YetiForceOutlook.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,52 +16,20 @@ */ class YetiForceOutlook extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Outlook Integration Panel'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-outlook-integration-panel-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceOutlook')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceOutlook'); - } else { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = !\in_array('https://appsforoffice.microsoft.com', \Config\Security::$allowedScriptDomains) - && !\in_array('https://ajax.aspnetcdn.com', \Config\Security::$allowedScriptDomains); - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function analyzeConfiguration(): array { - if (empty($this->expirationDate) || \Settings_MailIntegration_Activate_Model::isActive('outlook')) { - return []; - } - return [ + return !\Settings_MailIntegration_Activate_Model::isActive('outlook') ? [ 'message' => \App\Language::translateArgs('LBL_FUNCTIONALITY_HAS_NOT_YET_BEEN_ACTIVATED', 'Settings:MailIntegration', 'Outlook'), 'type' => 'LBL_REQUIRES_INTERVENTION', 'href' => 'index.php?parent=Settings&module=MailIntegration&view=Index', - ]; + ] : []; + } + + /** {@inheritdoc} */ + public function isConfigured(): bool + { + return \Settings_MailIntegration_Activate_Model::isActive('outlook'); } /** {@inheritdoc} */ diff --git a/app/YetiForce/Shop/Product/YetiForcePassword.php b/app/YetiForce/Shop/Product/YetiForcePassword.php index 12f8be22cb28..6a57c7a9edd1 100644 --- a/app/YetiForce/Shop/Product/YetiForcePassword.php +++ b/app/YetiForce/Shop/Product/YetiForcePassword.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,37 +16,6 @@ */ class YetiForcePassword extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Password Security'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-password-security-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForcePassword')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForcePassword'); - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Shop/Product/YetiForcePdfPremium.php b/app/YetiForce/Shop/Product/YetiForcePdfPremium.php new file mode 100644 index 000000000000..5110bc607492 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForcePdfPremium.php @@ -0,0 +1,67 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop PDF Premium class. + */ +class YetiForcePdfPremium extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritDoc} */ + public function getAlertMessage(bool $require = true): string + { + $message = parent::getAlertMessage(); + if (!$this->getStatus() && $this->isConfigured()) { + $message = 'LBL_PAID_FUNCTIONALITY'; + } elseif (!$this->getStatus() && !$this->isConfigured()) { + $message = ''; + } + + return $message; + } + + /** {@inheritDoc} */ + public function isConfigured(): bool + { + return class_exists('HeadlessChromium\BrowserFactory') && !empty(\Config\Components\Pdf::$chromiumBinaryPath); + } + + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $links = [ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + ]; + if (\App\Security\AdminAccess::isPermitted('Companies')) { + $links[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'LBL_PDF', + 'relatedModuleName' => 'Settings:PDF', + 'linkicon' => 'adminIcon-modules-pdf-templates', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=PDF&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return $links; + } +} diff --git a/app/YetiForce/Shop/Product/YetiForcePlGus.php b/app/YetiForce/Shop/Product/YetiForcePlGus.php index 6f5f263554b5..b3309ba49d65 100644 --- a/app/YetiForce/Shop/Product/YetiForcePlGus.php +++ b/app/YetiForce/Shop/Product/YetiForcePlGus.php @@ -2,10 +2,12 @@ /** * YetiForce shop YetiForcePlGus file. * + * @see App\RecordCollectors\Gus + * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,48 +18,22 @@ */ class YetiForcePlGus extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce GUS'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-gus-en'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForcePlGus')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForcePlGus'); - } else { - $instance = new \App\RecordCollectors\Gus(); - $instance->moduleName = reset(\App\RecordCollectors\Gus::$allowedModules); - if ($instance->isActive()) { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = false; - } - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { - return [ + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ \Vtiger_Link_Model::getInstanceFromValues([ 'linklabel' => 'Website', 'relatedModuleName' => '_Base', @@ -72,14 +48,14 @@ public function getAdditionalButtons(): array \Vtiger_Link_Model::getInstanceFromValues([ 'linklabel' => 'api.stat.gov.pl', 'relatedModuleName' => 'Settings:_Base', - 'linkicon' => 'adminIcon-passwords-configuration', + 'linkicon' => 'fa-solid fa-link', 'linkhref' => true, 'linkExternal' => true, 'linktarget' => '_blank', 'linkurl' => 'https://api.stat.gov.pl/Home/RegonApi', - 'linkclass' => 'btn-primary', + 'linkclass' => 'btn-secondary', 'showLabel' => 1, ]), - ]; + ], $return); } } diff --git a/app/YetiForce/Shop/Product/YetiForceRbl.php b/app/YetiForce/Shop/Product/YetiForceRbl.php index 7a8e26366302..af8830aee12e 100644 --- a/app/YetiForce/Shop/Product/YetiForceRbl.php +++ b/app/YetiForce/Shop/Product/YetiForceRbl.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -17,35 +17,7 @@ class YetiForceRbl extends \App\YetiForce\Shop\AbstractBaseProduct { /** {@inheritdoc} */ - public $label = 'YetiForce RBL'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-rbl'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceRbl')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceRbl'); - } - return ['status' => $status, 'message' => $message]; - } + protected bool $disabled = true; /** {@inheritdoc} */ public function getAdditionalButtons(): array diff --git a/app/YetiForce/Shop/Product/YetiForceRcBrReceitaWsCnpj.php b/app/YetiForce/Shop/Product/YetiForceRcBrReceitaWsCnpj.php new file mode 100644 index 000000000000..8d5aeffdf3cd --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcBrReceitaWsCnpj.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcBrReceitaWsCnpj class. + */ +class YetiForceRcBrReceitaWsCnpj extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'receitaws.com.br', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://developers.receitaws.com.br/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcChZefix.php b/app/YetiForce/Shop/Product/YetiForceRcChZefix.php new file mode 100644 index 000000000000..beb8c5eecf16 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcChZefix.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcChZefix class. + */ +class YetiForceRcChZefix extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'zefix.admin.ch', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://www.zefix.admin.ch/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcDkCvr.php b/app/YetiForce/Shop/Product/YetiForceRcDkCvr.php new file mode 100644 index 000000000000..210ead698af8 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcDkCvr.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcDkCvr class. + */ +class YetiForceRcDkCvr extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'cvrtjek.dk', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://cvrtjek.dk/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcFrEnterpriseGouv.php b/app/YetiForce/Shop/Product/YetiForceRcFrEnterpriseGouv.php new file mode 100644 index 000000000000..fb2c461a026c --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcFrEnterpriseGouv.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcFrEnterpriseGouv class. + */ +class YetiForceRcFrEnterpriseGouv extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'api.gouv.fr', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://api.gouv.fr/les-api/api-entreprise', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcNoBrregEnhetsreg.php b/app/YetiForce/Shop/Product/YetiForceRcNoBrregEnhetsreg.php new file mode 100644 index 000000000000..5836ea444910 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcNoBrregEnhetsreg.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcNoBrregEnhetsreg class. + */ +class YetiForceRcNoBrregEnhetsreg extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'brreg.no', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://www.brreg.no/produkter-og-tjenester/apne-data/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcNorthData.php b/app/YetiForce/Shop/Product/YetiForceRcNorthData.php new file mode 100644 index 000000000000..1bcffa95cd5a --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcNorthData.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcNorthData class. + */ +class YetiForceRcNorthData extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'northdata.com', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://www.northdata.com/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcPlCeidg.php b/app/YetiForce/Shop/Product/YetiForceRcPlCeidg.php new file mode 100644 index 000000000000..9e33a2a62a38 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcPlCeidg.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcPlCeidg class. + */ +class YetiForceRcPlCeidg extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'dane.biznes.gov.pl', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://dane.biznes.gov.pl/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcPlKrs.php b/app/YetiForce/Shop/Product/YetiForceRcPlKrs.php new file mode 100644 index 000000000000..94a8179a329a --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcPlKrs.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcPlKrs class. + */ +class YetiForceRcPlKrs extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'prs.ms.gov.pl', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://prs.ms.gov.pl/krs/openApi', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcPlVatPayerStatus.php b/app/YetiForce/Shop/Product/YetiForceRcPlVatPayerStatus.php new file mode 100644 index 000000000000..da8915fe1439 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcPlVatPayerStatus.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcPlVatPayerStatus class. + */ +class YetiForceRcPlVatPayerStatus extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'podatki.gov.pl', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://www.podatki.gov.pl/e-deklaracje/dokumentacja-it/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcUkCompaniesHouse.php b/app/YetiForce/Shop/Product/YetiForceRcUkCompaniesHouse.php new file mode 100644 index 000000000000..56c0b5cd611f --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcUkCompaniesHouse.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcUkCompaniesHouse class. + */ +class YetiForceRcUkCompaniesHouse extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'company-information.service.gov.uk', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://developer.company-information.service.gov.uk/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcUkVatPayerStatus.php b/app/YetiForce/Shop/Product/YetiForceRcUkVatPayerStatus.php new file mode 100644 index 000000000000..63dac26e302f --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcUkVatPayerStatus.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcUkVatPayerStatus class. + */ +class YetiForceRcUkVatPayerStatus extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'gov.uk', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://developer.service.hmrc.gov.uk/api-documentation', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcUsaEdgar.php b/app/YetiForce/Shop/Product/YetiForceRcUsaEdgar.php new file mode 100644 index 000000000000..bbdc9e54c5d2 --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcUsaEdgar.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcUsaEdgar class. + */ +class YetiForceRcUsaEdgar extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'sec.gov', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://www.sec.gov/edgar/sec-api-documentation', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceRcVatifyEu.php b/app/YetiForce/Shop/Product/YetiForceRcVatifyEu.php new file mode 100644 index 000000000000..5247dbd199db --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceRcVatifyEu.php @@ -0,0 +1,61 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceRcVatifyEu class. + */ +class YetiForceRcVatifyEu extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $return = []; + if (\App\Security\AdminAccess::isPermitted('RecordCollector')) { + $return[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'RecordCollector', + 'relatedModuleName' => 'Settings:RecordCollector', + 'linkicon' => 'yfi-record-collectors mr-2', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=RecordCollector&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return array_merge([ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'vatify.eu', + 'relatedModuleName' => 'Settings:_Base', + 'linkicon' => 'fa-solid fa-link', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => 'https://www.vatify.eu/docs/api/getting-started/', + 'linkclass' => 'btn-secondary', + 'showLabel' => 1, + ]), + ], $return); + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceVulnerabilities.php b/app/YetiForce/Shop/Product/YetiForceVulnerabilities.php index d591bb59a836..316b0bd4f79a 100644 --- a/app/YetiForce/Shop/Product/YetiForceVulnerabilities.php +++ b/app/YetiForce/Shop/Product/YetiForceVulnerabilities.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -17,35 +17,7 @@ class YetiForceVulnerabilities extends \App\YetiForce\Shop\AbstractBaseProduct { /** {@inheritdoc} */ - public $label = 'YetiForce Vulnerabilities'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-vulnerabilities'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceVulnerabilities')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceVulnerabilities'); - } - return ['status' => $status, 'message' => $message]; - } + protected bool $disabled = true; /** {@inheritdoc} */ public function getAdditionalButtons(): array diff --git a/app/YetiForce/Shop/Product/YetiForceWaproERP.php b/app/YetiForce/Shop/Product/YetiForceWaproERP.php new file mode 100644 index 000000000000..b73fd60702ad --- /dev/null +++ b/app/YetiForce/Shop/Product/YetiForceWaproERP.php @@ -0,0 +1,64 @@ + + */ + +namespace App\YetiForce\Shop\Product; + +/** + * YetiForce shop YetiForceWaproERP class. + */ +class YetiForceWaproERP extends \App\YetiForce\Shop\AbstractBaseProduct +{ + /** {@inheritdoc} */ + protected bool $disabled = true; + + /** {@inheritdoc} */ + public function analyzeConfiguration(): array + { + if (empty($this->expirationDate) || \Settings_Wapro_Activation_Model::check()) { + return []; + } + return [ + 'message' => \App\Language::translateArgs('LBL_FUNCTIONALITY_HAS_NOT_YET_BEEN_ACTIVATED', 'Settings:Wapro', 'Wapro ERP'), + 'type' => 'LBL_REQUIRES_INTERVENTION', + 'href' => 'index.php?parent=Settings&module=Wapro&view=List', + ]; + } + + /** {@inheritdoc} */ + public function getAdditionalButtons(): array + { + $links = [ + \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'Website', + 'relatedModuleName' => '_Base', + 'linkicon' => 'fas fa-globe mr-2', + 'linkhref' => true, + 'linkExternal' => true, + 'linktarget' => '_blank', + 'linkurl' => $this->website, + 'linkclass' => 'btn-info', + 'showLabel' => 1, + ]), + ]; + if (\App\Security\AdminAccess::isPermitted('Wapro')) { + $links[] = \Vtiger_Link_Model::getInstanceFromValues([ + 'linklabel' => 'LBL_WAPRO_ERP', + 'relatedModuleName' => 'Settings:Wapro', + 'linkicon' => 'fab fa-connectdevelop', + 'linkhref' => true, + 'linkurl' => 'index.php?parent=Settings&module=Wapro&view=List', + 'linkclass' => 'btn-primary', + 'showLabel' => 1, + ]); + } + return $links; + } +} diff --git a/app/YetiForce/Shop/Product/YetiForceWebservicePremium.php b/app/YetiForce/Shop/Product/YetiForceWebservicePremium.php index 9c373ce5efda..2d8721f3e8d1 100644 --- a/app/YetiForce/Shop/Product/YetiForceWebservicePremium.php +++ b/app/YetiForce/Shop/Product/YetiForceWebservicePremium.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,42 +16,6 @@ */ class YetiForceWebservicePremium extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Webservice Premium'; - - /** {@inheritdoc} */ - public $category = 'Integrations'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-webservice-premium'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 45, - 'Small' => 85, - 'Medium' => 165, - 'Large' => 325, - 'Corporation' => 645, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceWebservicePremium')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceWebservicePremium'); - } else { - if ((new \App\Db\Query())->from('w_#__servers')->where(['type' => 'WebservicePremium'])->exists()) { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = false; - } - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Shop/Product/YetiForceWidgets.php b/app/YetiForce/Shop/Product/YetiForceWidgets.php index 0b9486db0e60..f7fd4ad325a5 100644 --- a/app/YetiForce/Shop/Product/YetiForceWidgets.php +++ b/app/YetiForce/Shop/Product/YetiForceWidgets.php @@ -4,8 +4,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ @@ -16,48 +16,6 @@ */ class YetiForceWidgets extends \App\YetiForce\Shop\AbstractBaseProduct { - /** {@inheritdoc} */ - public $label = 'YetiForce Premium Widgets'; - - /** {@inheritdoc} */ - public $category = 'Addons'; - - /** {@inheritdoc} */ - public $website = 'https://yetiforce.com/en/yetiforce-widgets-premium'; - - /** {@inheritdoc} */ - public $prices = [ - 'Micro' => 5, - 'Small' => 12, - 'Medium' => 25, - 'Large' => 50, - 'Corporation' => 100, - ]; - - /** {@inheritdoc} */ - public $featured = true; - - /** {@inheritdoc} */ - public function verify(): array - { - $message = $status = true; - if (\App\YetiForce\Register::getProducts('YetiForceWidgets')) { - [$status, $message] = \App\YetiForce\Shop::checkWithMessage('YetiForceWidgets'); - } else { - $dashboardUpdates = (new \App\Db\Query()) - ->from('vtiger_module_dashboard') - ->innerJoin('vtiger_links', 'vtiger_links.linkid = vtiger_module_dashboard.linkid') - ->where(['vtiger_links.linkurl' => 'index.php?module=ModTracker&view=ShowWidget&name=Updates']) - ->exists(); - $pdfViewer = (new \App\Db\Query())->from('vtiger_widgets')->where(['type' => 'PDFViewer'])->exists(); - if ($dashboardUpdates || $pdfViewer) { - $message = 'LBL_PAID_FUNCTIONALITY_ACTIVATED'; - $status = false; - } - } - return ['status' => $status, 'message' => $message]; - } - /** {@inheritdoc} */ public function getAdditionalButtons(): array { diff --git a/app/YetiForce/Updater.php b/app/YetiForce/Updater.php index fac2333a2ff6..d1edc7445d83 100644 --- a/app/YetiForce/Updater.php +++ b/app/YetiForce/Updater.php @@ -5,8 +5,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ diff --git a/app/YetiForce/Watchdog.php b/app/YetiForce/Watchdog.php index 265f296ae340..e627c57a9656 100644 --- a/app/YetiForce/Watchdog.php +++ b/app/YetiForce/Watchdog.php @@ -5,8 +5,8 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ diff --git a/app/Zip.php b/app/Zip.php index 938846e09d1f..3d02cbe82e0c 100644 --- a/app/Zip.php +++ b/app/Zip.php @@ -4,9 +4,10 @@ * * @package App * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski + * @author Radosław Skrzypczak */ namespace App; @@ -166,7 +167,7 @@ public function extract(string $toDir) */ public function validateFile(string $path) { - if (!Fields\File::checkFilePath($path)) { + if (!Validator::path($path)) { return true; } $validate = false; @@ -259,7 +260,7 @@ public function checkFreeSpace() public function addDirectory(string $dir, string $localName = '', bool $relativePath = false) { if ($localName) { - $localName .= \DIRECTORY_SEPARATOR; + $localName .= '/'; } $path = realpath($dir); $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::LEAVES_ONLY); @@ -267,7 +268,8 @@ public function addDirectory(string $dir, string $localName = '', bool $relative foreach ($files as $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); - $this->addFile($filePath, $localName . Fields\File::getLocalPath($filePath, $pathToTrim)); + $zipPath = str_replace(\DIRECTORY_SEPARATOR, '/', Fields\File::getLocalPath($filePath, $pathToTrim)); + $this->addFile($filePath, $localName . $zipPath); } } } diff --git a/app_data/icons.php b/app_data/icons.php index 602e89704bc7..062eafc46942 100644 --- a/app_data/icons.php +++ b/app_data/icons.php @@ -1,8 +1,5 @@ [ - 'Passwords', 'Queue', 'Approvals', 'BankAccounts', 'ProductCategory', 'PermissionInspector', 'MailIntegration', 'Faq', 'Locations', 'ApprovalsRegister', 'Occurrences', 'DefaultIcon', 'Announcements', 'ModTracker', 'Users', 'AuditRegister', 'ActivityRegister', 'Import', 'Password', 'Dashboard', 'MultiCompany', 'ApiAddress', 'LocationRegister', 'DataSetRegister', 'IncidentRegister', 'OpenStreetMap', 'Chat', 'OSSMailScanner', 'SCalculations', 'ProjectMilestones', 'NewOrders', 'TeamWork', 'Bookkeeping', 'OSSEmployees', 'Faktury', 'CInternalTickets', 'CMileageLogbook', 'FCorectingInvoice', 'FInvoiceCost', 'CFixedAssets', 'Announcement', 'SVendorEnquiries', 'ISTDN', 'IGRNC', 'IGDNC', 'ISTRN', 'ISTN', 'Notification', 'MeetingCards_old', 'IPreOrder', 'IStorages', 'IGDN', 'IGIN', 'IGRN', 'IIDN', 'KnowledgeBase', 'ShoppingCart', 'Target', 'Plane', 'WithoutOwnersAccounts', 'VendorsAccounts', 'CompanyAccounts', 'ShutdownAccounts', 'MyAccounts', 'UnassignedAccounts', 'AllAccounts', 'RecycleBin', 'FInvoice', 'Faktury_old', 'FInvoiceProforma', 'ModComments', 'FBookkeeping', 'Events', 'Activity', 'Marketing', 'SRecurringOrders', 'Competition', 'Accounts', 'CompaniesAndContact', 'HolidaysEntitlement', 'Assets', 'SCalculations_old', 'Calendar', 'CallHistory', 'Campaigns', 'Contacts', 'OSSMailView', 'Database', 'Documents', 'OSSEmployees_old', 'Home', 'HumanResources', 'Ideas', 'Leads', 'LettersIn', 'LettersOut', 'PBXManager', 'OSSMailTemplates', 'EmailTemplates', 'OSSMail', 'SSalesProcesses', 'Portal', 'OutsourcedProducts', 'OSSOutsourcedServices', 'Partners', 'OSSPasswords', 'PaymentsIn', 'PaymentsOut', 'PriceBooks', 'Products', 'ProjectMilestone', 'Project', 'ProjectTask', 'SQuotes', 'Realization', 'Reports', 'Reservations', 'Rss', 'Sales', 'SQuoteEnquiries', 'SSingleOrders', 'SRequirementsCards', 'Secretary', 'ServiceContracts', 'Services', 'OSSSoldServices', 'Support', 'SMSNotifier', 'HelpDesk', 'OSSTimeControl', 'Vendors', 'VirtualDesk' - ], 'admin' => [ 'Occurrences', 'Approvals', 'ApprovalsRegister', 'Locations', 'MailIntegration', 'system-monitoring', 'marketplace', 'my-shortcuts', 'branding-off', 'premium-support', 'filed-picklist-2', 'modules-relations-2', 'modules-installations-2', 'menu-configuration-2', 'workflows-2', 'modules-2', 'security-errors-2', 'users-2', 'system-warnings-2', 'modules-widgets-2', 'premium-modules', 'donate', 'hosting', 'footer-off', 'enterprise-modules', 'for-admin', 'for-partners', 'prodprouct-preview', 'buy', 'NotificationConfiguration', 'mail-queue', 'webservice-users', 'webservice-apps', 'automatic-assignment', 'shared-owner', 'owner', 'locks', 'system-warnings', 'advanced-permission', 'help', 'menu-summary', 'magento', 'system-incidents', 'github', 'sla-policy', 'business-hours', 'backup-manager', 'yetiforce-status', 'social-media', 'shop', 'password-encryption', 'countries', 'vendor-sms', 'permissions', 'user', 'roles', 'profiles', 'groups', 'module-access', 'special-access', 'standard-modules', 'modules-installation', 'modules-widgets', 'modules-fields', 'modules-relations', 'modules-track-chanegs', 'modules-prefixes', 'modules-pdf-templates', 'fields-quick-create', 'fields-picklists', 'fields-picklists-relations', 'field-folders', 'filed-hide-bloks', 'filed-mapping', 'menu-configuration', 'widgets-configuration', 'mapped-fields', 'advenced-modules', 'taxes-rates', 'discount-configuration', 'discount-base', 'taxes-caonfiguration', 'credit-limit-base_2', 'calendar-labels-colors', 'calendar-types', 'calendar-configuration', 'calendar-holidys', 'colors', 'search-and-filtres', 'search-configuration', 'filters-configuration', 'security', 'brute-force', 'passwords-configuration', 'passwords-encryption', 'backup', 'logs', 'server-configuration', 'server-updates', 'users-login', 'mail-download-history', 'integration', 'pbx-manager', 'currencies', 'customer-portal', 'online-forms', 'address', 'mobile-applications', 'dav-applications', 'automation', 'triggers', 'recording-control', 'cron', 'document_flow', 'document-templates', 'mail-tools', 'mail-configuration', 'mail-roundcube', 'mail-scanner', 'mail-auto-login', 'mail-smtp-server', 'oss_mailview', 'system-tools', 'languages-and-translations', 'system-messages', 'terms-and-conditions', 'system-configuration', 'users', 'company-information', 'company-detlis', 'processes', 'marketing', 'sales', 'realization', 'logistics', 'finances', 'support', 'workflow', 'yeti-force', 'about-yetiforce', 'about-yetiforce-ltd', 'contributors', 'license' ], @@ -10,15 +7,15 @@ 'Linkedin', 'Twitter', 'Facebook', 'Github', 'NetworkInterfaceCards', 'UtmNgf', 'Virtualization', 'Ups', 'Notebooks', 'VideoConference', 'Encryption', 'Servers', 'EmailProtection', 'Other', 'BackUpCopies', 'Matrixes', 'Monitoring', 'Antivirus' ], 'yfi' => [ - 'api-premium', 'hierarchy', 'api-webservice', 'tree-records', 'public-webservice', 'unshare-in-webservice', 'kanban', 'map', 'rbl', 'free-support', 'paid-sapport', 'twitter', 'partner-solution-shop', 'adds-on-shop', 'integration-shop', 'support-shop', 'hosting-cloud-shop', 'all-shop', 'report-list-rbl', 'public-rbl', 'analysis-details', 'dependent-fields', 'mail-integrator-panel', 'meeting-services', 'dav', 'address-serch', 'pbx', 'ldap', 'confirm-conflict', 'conflict-interests', 'event-handlers', 'admin-access', 'security-incidents', 'view-logs', 'change-passowrd', 'login-history', 'conflict-list', 'conference-details', 'copy-invitation', 'enter-guest', 'enter-moderator', 'guest-link', 'moderator-link', 'send-invitation', 'location', 'vies', 'merging-records', 'social-media', 'change-of-owner', 'adminIcon-menu-summary', 'adminIcon-advanced-permission', 'adminIcon-backup', 'adminIcon-countries', 'gus', 'adminIcon-sla-policy', 'adminIcon-time-control-processes', 'adminIcon-vendor-sms', 'quick-creation', 'full-editing-view', 'own-hosting', 'yetiforce-hosting', 'yetiforce-cloud', 'yeti-register-alert', 'newsletter-alert', 'shop-alert', 'partners', 'premium', 'enterprise', 'about-yetiforce', 'about-yetiforce-ltd', 'address', 'advanced-permission', 'advenced-modules', 'automatic-assignment', 'automation', 'backup', 'backup-manager', 'branding-off', 'brute-force', 'business-hours', 'buy', 'calendar-configuration', 'calendar-holidys', 'calendar-labels-colors', 'calendar-types', 'colors', 'company-detlis', 'company-information', 'contributors', 'countries', 'credit-limit-base_2', 'cron', 'currencies', 'customer-portal', 'dav-applications', 'discount-base', 'discount-configuration', 'document_flow', 'document-templates', 'donate', 'enterprise-modules', 'field-folders', 'fields-picklists', 'fields-picklists-relations', 'fields-quick-create', 'filed-hide-bloks', 'filed-mapping', 'filed-picklist-2', 'filters-configuration', 'finances', 'footer-off', 'for-admin', 'for-partners', 'github', 'groups', 'help', 'hosting', 'integration', 'languages-and-translations', 'license', 'locks', 'logistics', 'logs', 'magento', 'mail-auto-login', 'mail-configuration', 'mail-download-history', 'mail-queue', 'mail-roundcube', 'mail-scanner', 'mail-smtp-server', 'mail-tools', 'mapped-fields', 'marketing', 'marketplace', 'menu-configuration', 'menu-configuration-2', 'menu-summary', 'mobile-applications', 'module-access', 'modules-2', 'modules-fields', 'modules-installation', 'modules-installations-2', 'modules-pdf-templates', 'modules-prefixes', 'modules-relations', 'modules-relations-2', 'modules-track-chanegs', 'modules-widgets', 'modules-widgets-2', 'my-shortcuts', 'NotificationConfiguration', 'online-forms', 'oss_mailview', 'owner', 'password-encryption', 'passwords-configuration', 'passwords-encryption', 'pbx-manager', 'permissions', 'premium-modules', 'premium-support', 'processes', 'prodprouct-preview', 'profiles', 'realization', 'recording-control', 'roles', 'sales', 'search-and-filtres', 'search-configuration', 'security', 'security-errors-2', 'server-configuration', 'server-updates', 'shared-owner', 'shop', 'sla-policy', 'social-media1', 'special-access', 'standard-modules', 'support', 'system-configuration', 'system-incidents', 'system-messages', 'system-monitoring', 'system-tools', 'system-warnings', 'system-warnings-2', 'taxes-caonfiguration', 'taxes-rates', 'terms-and-conditions', 'triggers', 'user', 'users', 'users-2', 'users-login', 'vendor-sms', 'webservice-apps', 'webservice-users', 'widgets-configuration', 'workflow', 'workflows-2', 'yeti-force', 'yetiforce-status', 'menu-entrant', 'menu-group-room', 'chat-notification-off', 'register-offline', 'enter-on', 'virtual-desk', 'support-premium', 'user-part', 'admin-part', 'favorite-room', 'group-room', 'entrant-chat', 'global-room', 'hash-user', 'branding-chat', 'chat-notification-on', 'calendar-notifications', 'support-free', 'special-search', 'advanced-search', 'knowledge-base', 'register-online', 'unread-messages', 'enter-off' + 'cedig-pl', 'companies-house-uk', 'cvr-dk', 'edgar-usa', 'enhetsregisteret-no', 'entreprise-gouv-fr', 'gus-regon-pl', 'krs-pl', 'north-data', 'orb', 'portal-cloud', 'receita-cnpj-br', 'vatify-eu', 'vat-pl', 'vat-uk', 'vat-uk_1', 'wapro-erp', 'you-control', 'zefix-ch', 'record-collectors', 'advenced-custom-view-conditions', 'conditions-for-filtering-related-records', 'relationship-as-custom-column', 'share-portal-record', 'unshare-portal-record', 'api-premium', 'hierarchy', 'api-webservice', 'tree-records', 'public-webservice', 'unshare-in-webservice', 'kanban', 'map', 'rbl', 'free-support', 'paid-sapport', 'twitter', 'partner-solution-shop', 'adds-on-shop', 'integration-shop', 'support-shop', 'hosting-cloud-shop', 'all-shop', 'report-list-rbl', 'public-rbl', 'analysis-details', 'dependent-fields', 'mail-integrator-panel', 'meeting-services', 'dav', 'address-serch', 'pbx', 'ldap', 'confirm-conflict', 'conflict-interests', 'event-handlers', 'admin-access', 'security-incidents', 'view-logs', 'change-passowrd', 'login-history', 'conflict-list', 'conference-details', 'copy-invitation', 'enter-guest', 'enter-moderator', 'guest-link', 'moderator-link', 'send-invitation', 'location', 'vies', 'merging-records', 'social-media', 'change-of-owner', 'adminIcon-menu-summary', 'adminIcon-advanced-permission', 'adminIcon-backup', 'adminIcon-countries', 'gus', 'adminIcon-sla-policy', 'adminIcon-time-control-processes', 'adminIcon-vendor-sms', 'quick-creation', 'full-editing-view', 'own-hosting', 'yetiforce-hosting', 'yetiforce-cloud', 'yeti-register-alert', 'newsletter-alert', 'shop-alert', 'partners', 'premium', 'enterprise', 'about-yetiforce', 'about-yetiforce-ltd', 'address', 'advanced-permission', 'advenced-modules', 'automatic-assignment', 'automation', 'backup', 'backup-manager', 'branding-off', 'brute-force', 'business-hours', 'buy', 'calendar-configuration', 'calendar-holidys', 'calendar-labels-colors', 'calendar-types', 'colors', 'company-detlis', 'company-information', 'contributors', 'countries', 'credit-limit-base_2', 'cron', 'currencies', 'customer-portal', 'dav-applications', 'discount-base', 'discount-configuration', 'document_flow', 'document-templates', 'donate', 'enterprise-modules', 'field-folders', 'fields-picklists', 'fields-picklists-relations', 'fields-quick-create', 'filed-hide-bloks', 'filed-mapping', 'filed-picklist-2', 'filters-configuration', 'finances', 'footer-off', 'for-admin', 'for-partners', 'github', 'groups', 'help', 'hosting', 'integration', 'languages-and-translations', 'license', 'locks', 'logistics', 'logs', 'magento', 'mail-auto-login', 'mail-configuration', 'mail-download-history', 'mail-queue', 'mail-roundcube', 'mail-scanner', 'mail-smtp-server', 'mail-tools', 'mapped-fields', 'marketing', 'marketplace', 'menu-configuration', 'menu-configuration-2', 'menu-summary', 'mobile-applications', 'module-access', 'modules-2', 'modules-fields', 'modules-installation', 'modules-installations-2', 'modules-pdf-templates', 'modules-prefixes', 'modules-relations', 'modules-relations-2', 'modules-track-chanegs', 'modules-widgets', 'modules-widgets-2', 'my-shortcuts', 'NotificationConfiguration', 'online-forms', 'oss_mailview', 'owner', 'password-encryption', 'passwords-configuration', 'passwords-encryption', 'pbx-manager', 'permissions', 'premium-modules', 'premium-support', 'processes', 'prodprouct-preview', 'profiles', 'realization', 'recording-control', 'roles', 'sales', 'search-and-filtres', 'search-configuration', 'security', 'security-errors-2', 'server-configuration', 'server-updates', 'shared-owner', 'shop', 'sla-policy', 'social-media1', 'special-access', 'standard-modules', 'support', 'system-configuration', 'system-incidents', 'system-messages', 'system-monitoring', 'system-tools', 'system-warnings', 'system-warnings-2', 'taxes-caonfiguration', 'taxes-rates', 'terms-and-conditions', 'triggers', 'user', 'users', 'users-2', 'users-login', 'vendor-sms', 'webservice-apps', 'webservice-users', 'widgets-configuration', 'workflow', 'workflows-2', 'yeti-force', 'yetiforce-status', 'menu-entrant', 'menu-group-room', 'chat-notification-off', 'register-offline', 'enter-on', 'virtual-desk', 'support-premium', 'user-part', 'admin-part', 'favorite-room', 'group-room', 'entrant-chat', 'global-room', 'hash-user', 'branding-chat', 'chat-notification-on', 'calendar-notifications', 'support-free', 'special-search', 'advanced-search', 'knowledge-base', 'register-online', 'unread-messages', 'enter-off' ], 'yfm' => [ 'Passwords', 'Queue', 'Approvals', 'BankAccounts', 'ProductCategory', 'PermissionInspector', 'MailIntegration', 'Faq', 'Locations', 'ApprovalsRegister', 'Occurrences', 'DefaultIcon', 'Announcements', 'ModTracker', 'Users', 'AuditRegister', 'ActivityRegister', 'Import', 'Password', 'Dashboard', 'MultiCompany', 'ApiAddress', 'LocationRegister', 'DataSetRegister', 'IncidentRegister', 'OpenStreetMap', 'Chat', 'OSSMailScanner', 'SCalculations', 'ProjectMilestones', 'NewOrders', 'TeamWork', 'Bookkeeping', 'OSSEmployees', 'Faktury', 'CInternalTickets', 'CMileageLogbook', 'FCorectingInvoice', 'FInvoiceCost', 'CFixedAssets', 'Announcement', 'SVendorEnquiries', 'ISTDN', 'IGRNC', 'IGDNC', 'ISTRN', 'ISTN', 'Notification', 'MeetingCards_old', 'IPreOrder', 'IStorages', 'IGDN', 'IGIN', 'IGRN', 'IIDN', 'KnowledgeBase', 'ShoppingCart', 'Target', 'Plane', 'WithoutOwnersAccounts', 'VendorsAccounts', 'CompanyAccounts', 'ShutdownAccounts', 'MyAccounts', 'UnassignedAccounts', 'AllAccounts', 'RecycleBin', 'FInvoice', 'Faktury_old', 'FInvoiceProforma', 'ModComments', 'FBookkeeping', 'Events', 'Activity', 'Marketing', 'SRecurringOrders', 'Competition', 'Accounts', 'CompaniesAndContact', 'HolidaysEntitlement', 'Assets', 'SCalculations_old', 'Calendar', 'CallHistory', 'Campaigns', 'Contacts', 'OSSMailView', 'Database', 'Documents', 'OSSEmployees_old', 'Home', 'HumanResources', 'Ideas', 'Leads', 'LettersIn', 'LettersOut', 'PBXManager', 'OSSMailTemplates', 'EmailTemplates', 'OSSMail', 'SSalesProcesses', 'Portal', 'OutsourcedProducts', 'OSSOutsourcedServices', 'Partners', 'OSSPasswords', 'PaymentsIn', 'PaymentsOut', 'PriceBooks', 'Products', 'ProjectMilestone', 'Project', 'ProjectTask', 'SQuotes', 'Realization', 'Reports', 'Reservations', 'Rss', 'Sales', 'SQuoteEnquiries', 'SSingleOrders', 'SRequirementsCards', 'Secretary', 'ServiceContracts', 'Services', 'OSSSoldServices', 'Support', 'SMSNotifier', 'HelpDesk', 'OSSTimeControl', 'Vendors', 'VirtualDesk' ], 'mdi' => [ - 'ab-testing', 'abacus', 'abjad-arabic', 'abjad-hebrew', 'abugida-devanagari', 'abugida-thai', 'access-point', 'access-point-check', 'access-point-minus', 'access-point-network', 'access-point-network-off', 'access-point-off', 'access-point-plus', 'access-point-remove', 'account', 'account-alert', 'account-alert-outline', 'account-arrow-down', 'account-arrow-down-outline', 'account-arrow-left', 'account-arrow-left-outline', 'account-arrow-right', 'account-arrow-right-outline', 'account-arrow-up', 'account-arrow-up-outline', 'account-box', 'account-box-multiple', 'account-box-multiple-outline', 'account-box-outline', 'account-cancel', 'account-cancel-outline', 'account-cash', 'account-cash-outline', 'account-check', 'account-check-outline', 'account-child', 'account-child-circle', 'account-child-outline', 'account-circle', 'account-circle-outline', 'account-clock', 'account-clock-outline', 'account-cog', 'account-cog-outline', 'account-convert', 'account-convert-outline', 'account-cowboy-hat', 'account-cowboy-hat-outline', 'account-details', 'account-details-outline', 'account-edit', 'account-edit-outline', 'account-eye', 'account-eye-outline', 'account-filter', 'account-filter-outline', 'account-group', 'account-group-outline', 'account-hard-hat', 'account-heart', 'account-heart-outline', 'account-injury', 'account-injury-outline', 'account-key', 'account-key-outline', 'account-lock', 'account-lock-open', 'account-lock-open-outline', 'account-lock-outline', 'account-minus', 'account-minus-outline', 'account-multiple', 'account-multiple-check', 'account-multiple-check-outline', 'account-multiple-minus', 'account-multiple-minus-outline', 'account-multiple-outline', 'account-multiple-plus', 'account-multiple-plus-outline', 'account-multiple-remove', 'account-multiple-remove-outline', 'account-music', 'account-music-outline', 'account-network', 'account-network-outline', 'account-off', 'account-off-outline', 'account-outline', 'account-plus', 'account-plus-outline', 'account-question', 'account-question-outline', 'account-reactivate', 'account-reactivate-outline', 'account-remove', 'account-remove-outline', 'account-search', 'account-search-outline', 'account-settings', 'account-settings-outline', 'account-star', 'account-star-outline', 'account-supervisor', 'account-supervisor-circle', 'account-supervisor-circle-outline', 'account-supervisor-outline', 'account-switch', 'account-switch-outline', 'account-sync', 'account-sync-outline', 'account-tie', 'account-tie-hat', 'account-tie-hat-outline', 'account-tie-outline', 'account-tie-voice', 'account-tie-voice-off', 'account-tie-voice-off-outline', 'account-tie-voice-outline', 'account-voice', 'account-voice-off', 'account-wrench', 'account-wrench-outline', 'adjust', 'advertisements', 'advertisements-off', 'air-conditioner', 'air-filter', 'air-horn', 'air-humidifier', 'air-humidifier-off', 'air-purifier', 'airbag', 'airballoon', 'airballoon-outline', 'airplane', 'airplane-alert', 'airplane-check', 'airplane-clock', 'airplane-cog', 'airplane-edit', 'airplane-landing', 'airplane-marker', 'airplane-minus', 'airplane-off', 'airplane-plus', 'airplane-remove', 'airplane-search', 'airplane-settings', 'airplane-takeoff', 'airport', 'alarm', 'alarm-bell', 'alarm-check', 'alarm-light', 'alarm-light-off', 'alarm-light-off-outline', 'alarm-light-outline', 'alarm-multiple', 'alarm-note', 'alarm-note-off', 'alarm-off', 'alarm-panel', 'alarm-panel-outline', 'alarm-plus', 'alarm-snooze', 'album', 'alert', 'alert-box', 'alert-box-outline', 'alert-circle', 'alert-circle-check', 'alert-circle-check-outline', 'alert-circle-outline', 'alert-decagram', 'alert-decagram-outline', 'alert-minus', 'alert-minus-outline', 'alert-octagon', 'alert-octagon-outline', 'alert-octagram', 'alert-octagram-outline', 'alert-outline', 'alert-plus', 'alert-plus-outline', 'alert-remove', 'alert-remove-outline', 'alert-rhombus', 'alert-rhombus-outline', 'alien', 'alien-outline', 'align-horizontal-center', 'align-horizontal-distribute', 'align-horizontal-left', 'align-horizontal-right', 'align-vertical-bottom', 'align-vertical-center', 'align-vertical-distribute', 'align-vertical-top', 'all-inclusive', 'all-inclusive-box', 'all-inclusive-box-outline', 'allergy', 'alpha', 'alpha-a', 'alpha-a-box', 'alpha-a-box-outline', 'alpha-a-circle', 'alpha-a-circle-outline', 'alpha-b', 'alpha-b-box', 'alpha-b-box-outline', 'alpha-b-circle', 'alpha-b-circle-outline', 'alpha-c', 'alpha-c-box', 'alpha-c-box-outline', 'alpha-c-circle', 'alpha-c-circle-outline', 'alpha-d', 'alpha-d-box', 'alpha-d-box-outline', 'alpha-d-circle', 'alpha-d-circle-outline', 'alpha-e', 'alpha-e-box', 'alpha-e-box-outline', 'alpha-e-circle', 'alpha-e-circle-outline', 'alpha-f', 'alpha-f-box', 'alpha-f-box-outline', 'alpha-f-circle', 'alpha-f-circle-outline', 'alpha-g', 'alpha-g-box', 'alpha-g-box-outline', 'alpha-g-circle', 'alpha-g-circle-outline', 'alpha-h', 'alpha-h-box', 'alpha-h-box-outline', 'alpha-h-circle', 'alpha-h-circle-outline', 'alpha-i', 'alpha-i-box', 'alpha-i-box-outline', 'alpha-i-circle', 'alpha-i-circle-outline', 'alpha-j', 'alpha-j-box', 'alpha-j-box-outline', 'alpha-j-circle', 'alpha-j-circle-outline', 'alpha-k', 'alpha-k-box', 'alpha-k-box-outline', 'alpha-k-circle', 'alpha-k-circle-outline', 'alpha-l', 'alpha-l-box', 'alpha-l-box-outline', 'alpha-l-circle', 'alpha-l-circle-outline', 'alpha-m', 'alpha-m-box', 'alpha-m-box-outline', 'alpha-m-circle', 'alpha-m-circle-outline', 'alpha-n', 'alpha-n-box', 'alpha-n-box-outline', 'alpha-n-circle', 'alpha-n-circle-outline', 'alpha-o', 'alpha-o-box', 'alpha-o-box-outline', 'alpha-o-circle', 'alpha-o-circle-outline', 'alpha-p', 'alpha-p-box', 'alpha-p-box-outline', 'alpha-p-circle', 'alpha-p-circle-outline', 'alpha-q', 'alpha-q-box', 'alpha-q-box-outline', 'alpha-q-circle', 'alpha-q-circle-outline', 'alpha-r', 'alpha-r-box', 'alpha-r-box-outline', 'alpha-r-circle', 'alpha-r-circle-outline', 'alpha-s', 'alpha-s-box', 'alpha-s-box-outline', 'alpha-s-circle', 'alpha-s-circle-outline', 'alpha-t', 'alpha-t-box', 'alpha-t-box-outline', 'alpha-t-circle', 'alpha-t-circle-outline', 'alpha-u', 'alpha-u-box', 'alpha-u-box-outline', 'alpha-u-circle', 'alpha-u-circle-outline', 'alpha-v', 'alpha-v-box', 'alpha-v-box-outline', 'alpha-v-circle', 'alpha-v-circle-outline', 'alpha-w', 'alpha-w-box', 'alpha-w-box-outline', 'alpha-w-circle', 'alpha-w-circle-outline', 'alpha-x', 'alpha-x-box', 'alpha-x-box-outline', 'alpha-x-circle', 'alpha-x-circle-outline', 'alpha-y', 'alpha-y-box', 'alpha-y-box-outline', 'alpha-y-circle', 'alpha-y-circle-outline', 'alpha-z', 'alpha-z-box', 'alpha-z-box-outline', 'alpha-z-circle', 'alpha-z-circle-outline', 'alphabet-aurebesh', 'alphabet-cyrillic', 'alphabet-greek', 'alphabet-latin', 'alphabet-piqad', 'alphabet-tengwar', 'alphabetical', 'alphabetical-off', 'alphabetical-variant', 'alphabetical-variant-off', 'altimeter', 'ambulance', 'ammunition', 'ampersand', 'amplifier', 'amplifier-off', 'anchor', 'android', 'android-messages', 'android-studio', 'angle-acute', 'angle-obtuse', 'angle-right', 'angular', 'angularjs', 'animation', 'animation-outline', 'animation-play', 'animation-play-outline', 'ansible', 'antenna', 'anvil', 'apache-kafka', 'api', 'api-off', 'apple', 'apple-finder', 'apple-icloud', 'apple-ios', 'apple-keyboard-caps', 'apple-keyboard-command', 'apple-keyboard-control', 'apple-keyboard-option', 'apple-keyboard-shift', 'apple-safari', 'application', 'application-array', 'application-array-outline', 'application-braces', 'application-braces-outline', 'application-brackets', 'application-brackets-outline', 'application-cog', 'application-cog-outline', 'application-edit', 'application-edit-outline', 'application-export', 'application-import', 'application-outline', 'application-parentheses', 'application-parentheses-outline', 'application-settings', 'application-settings-outline', 'application-variable', 'application-variable-outline', 'approximately-equal', 'approximately-equal-box', 'apps', 'apps-box', 'arch', 'archive', 'archive-alert', 'archive-alert-outline', 'archive-arrow-down', 'archive-arrow-down-outline', 'archive-arrow-up', 'archive-arrow-up-outline', 'archive-cancel', 'archive-cancel-outline', 'archive-check', 'archive-check-outline', 'archive-clock', 'archive-clock-outline', 'archive-cog', 'archive-cog-outline', 'archive-edit', 'archive-edit-outline', 'archive-eye', 'archive-eye-outline', 'archive-lock', 'archive-lock-open', 'archive-lock-open-outline', 'archive-lock-outline', 'archive-marker', 'archive-marker-outline', 'archive-minus', 'archive-minus-outline', 'archive-music', 'archive-music-outline', 'archive-off', 'archive-off-outline', 'archive-outline', 'archive-plus', 'archive-plus-outline', 'archive-refresh', 'archive-refresh-outline', 'archive-remove', 'archive-remove-outline', 'archive-search', 'archive-search-outline', 'archive-settings', 'archive-settings-outline', 'archive-star', 'archive-star-outline', 'archive-sync', 'archive-sync-outline', 'arm-flex', 'arm-flex-outline', 'arrange-bring-forward', 'arrange-bring-to-front', 'arrange-send-backward', 'arrange-send-to-back', 'arrow-all', 'arrow-bottom-left', 'arrow-bottom-left-bold-box', 'arrow-bottom-left-bold-box-outline', 'arrow-bottom-left-bold-outline', 'arrow-bottom-left-thick', 'arrow-bottom-left-thin', 'arrow-bottom-left-thin-circle-outline', 'arrow-bottom-right', 'arrow-bottom-right-bold-box', 'arrow-bottom-right-bold-box-outline', 'arrow-bottom-right-bold-outline', 'arrow-bottom-right-thick', 'arrow-bottom-right-thin', 'arrow-bottom-right-thin-circle-outline', 'arrow-collapse', 'arrow-collapse-all', 'arrow-collapse-down', 'arrow-collapse-horizontal', 'arrow-collapse-left', 'arrow-collapse-right', 'arrow-collapse-up', 'arrow-collapse-vertical', 'arrow-decision', 'arrow-decision-auto', 'arrow-decision-auto-outline', 'arrow-decision-outline', 'arrow-down', 'arrow-down-bold', 'arrow-down-bold-box', 'arrow-down-bold-box-outline', 'arrow-down-bold-circle', 'arrow-down-bold-circle-outline', 'arrow-down-bold-hexagon-outline', 'arrow-down-bold-outline', 'arrow-down-box', 'arrow-down-circle', 'arrow-down-circle-outline', 'arrow-down-drop-circle', 'arrow-down-drop-circle-outline', 'arrow-down-left', 'arrow-down-left-bold', 'arrow-down-right', 'arrow-down-right-bold', 'arrow-down-thick', 'arrow-down-thin', 'arrow-down-thin-circle-outline', 'arrow-expand', 'arrow-expand-all', 'arrow-expand-down', 'arrow-expand-horizontal', 'arrow-expand-left', 'arrow-expand-right', 'arrow-expand-up', 'arrow-expand-vertical', 'arrow-horizontal-lock', 'arrow-left', 'arrow-left-bold', 'arrow-left-bold-box', 'arrow-left-bold-box-outline', 'arrow-left-bold-circle', 'arrow-left-bold-circle-outline', 'arrow-left-bold-hexagon-outline', 'arrow-left-bold-outline', 'arrow-left-bottom', 'arrow-left-bottom-bold', 'arrow-left-box', 'arrow-left-circle', 'arrow-left-circle-outline', 'arrow-left-drop-circle', 'arrow-left-drop-circle-outline', 'arrow-left-right', 'arrow-left-right-bold', 'arrow-left-right-bold-outline', 'arrow-left-thick', 'arrow-left-thin', 'arrow-left-thin-circle-outline', 'arrow-left-top', 'arrow-left-top-bold', 'arrow-projectile', 'arrow-projectile-multiple', 'arrow-right', 'arrow-right-bold', 'arrow-right-bold-box', 'arrow-right-bold-box-outline', 'arrow-right-bold-circle', 'arrow-right-bold-circle-outline', 'arrow-right-bold-hexagon-outline', 'arrow-right-bold-outline', 'arrow-right-bottom', 'arrow-right-bottom-bold', 'arrow-right-box', 'arrow-right-circle', 'arrow-right-circle-outline', 'arrow-right-drop-circle', 'arrow-right-drop-circle-outline', 'arrow-right-thick', 'arrow-right-thin', 'arrow-right-thin-circle-outline', 'arrow-right-top', 'arrow-right-top-bold', 'arrow-split-horizontal', 'arrow-split-vertical', 'arrow-top-left', 'arrow-top-left-bold-box', 'arrow-top-left-bold-box-outline', 'arrow-top-left-bold-outline', 'arrow-top-left-bottom-right', 'arrow-top-left-bottom-right-bold', 'arrow-top-left-thick', 'arrow-top-left-thin', 'arrow-top-left-thin-circle-outline', 'arrow-top-right', 'arrow-top-right-bold-box', 'arrow-top-right-bold-box-outline', 'arrow-top-right-bold-outline', 'arrow-top-right-bottom-left', 'arrow-top-right-bottom-left-bold', 'arrow-top-right-thick', 'arrow-top-right-thin', 'arrow-top-right-thin-circle-outline', 'arrow-u-down-left', 'arrow-u-down-left-bold', 'arrow-u-down-right', 'arrow-u-down-right-bold', 'arrow-u-left-bottom', 'arrow-u-left-bottom-bold', 'arrow-u-left-top', 'arrow-u-left-top-bold', 'arrow-u-right-bottom', 'arrow-u-right-bottom-bold', 'arrow-u-right-top', 'arrow-u-right-top-bold', 'arrow-u-up-left', 'arrow-u-up-left-bold', 'arrow-u-up-right', 'arrow-u-up-right-bold', 'arrow-up', 'arrow-up-bold', 'arrow-up-bold-box', 'arrow-up-bold-box-outline', 'arrow-up-bold-circle', 'arrow-up-bold-circle-outline', 'arrow-up-bold-hexagon-outline', 'arrow-up-bold-outline', 'arrow-up-box', 'arrow-up-circle', 'arrow-up-circle-outline', 'arrow-up-down', 'arrow-up-down-bold', 'arrow-up-down-bold-outline', 'arrow-up-drop-circle', 'arrow-up-drop-circle-outline', 'arrow-up-left', 'arrow-up-left-bold', 'arrow-up-right', 'arrow-up-right-bold', 'arrow-up-thick', 'arrow-up-thin', 'arrow-up-thin-circle-outline', 'arrow-vertical-lock', 'artstation', 'aspect-ratio', 'assistant', 'asterisk', 'at', 'atlassian', 'atm', 'atom', 'atom-variant', 'attachment', 'audio-input-rca', 'audio-input-stereo-minijack', 'audio-input-xlr', 'audio-video', 'audio-video-off', 'augmented-reality', 'auto-download', 'auto-fix', 'auto-upload', 'autorenew', 'av-timer', 'aws', 'axe', 'axe-battle', 'axis', 'axis-arrow', 'axis-arrow-info', 'axis-arrow-lock', 'axis-lock', 'axis-x-arrow', 'axis-x-arrow-lock', 'axis-x-rotate-clockwise', 'axis-x-rotate-counterclockwise', 'axis-x-y-arrow-lock', 'axis-y-arrow', 'axis-y-arrow-lock', 'axis-y-rotate-clockwise', 'axis-y-rotate-counterclockwise', 'axis-z-arrow', 'axis-z-arrow-lock', 'axis-z-rotate-clockwise', 'axis-z-rotate-counterclockwise', 'babel', 'baby', 'baby-bottle', 'baby-bottle-outline', 'baby-buggy', 'baby-carriage', 'baby-carriage-off', 'baby-face', 'baby-face-outline', 'backburger', 'backspace', 'backspace-outline', 'backspace-reverse', 'backspace-reverse-outline', 'backup-restore', 'bacteria', 'bacteria-outline', 'badge-account', 'badge-account-alert', 'badge-account-alert-outline', 'badge-account-horizontal', 'badge-account-horizontal-outline', 'badge-account-outline', 'badminton', 'bag-carry-on', 'bag-carry-on-check', 'bag-carry-on-off', 'bag-checked', 'bag-personal', 'bag-personal-off', 'bag-personal-off-outline', 'bag-personal-outline', 'bag-suitcase', 'bag-suitcase-off', 'bag-suitcase-off-outline', 'bag-suitcase-outline', 'baguette', 'balcony', 'balloon', 'ballot', 'ballot-outline', 'ballot-recount', 'ballot-recount-outline', 'bandage', 'bank', 'bank-check', 'bank-minus', 'bank-off', 'bank-off-outline', 'bank-outline', 'bank-plus', 'bank-remove', 'bank-transfer', 'bank-transfer-in', 'bank-transfer-out', 'barcode', 'barcode-off', 'barcode-scan', 'barley', 'barley-off', 'barn', 'barrel', 'baseball', 'baseball-bat', 'baseball-diamond', 'baseball-diamond-outline', 'bash', 'basket', 'basket-check', 'basket-check-outline', 'basket-fill', 'basket-minus', 'basket-minus-outline', 'basket-off', 'basket-off-outline', 'basket-outline', 'basket-plus', 'basket-plus-outline', 'basket-remove', 'basket-remove-outline', 'basket-unfill', 'basketball', 'basketball-hoop', 'basketball-hoop-outline', 'bat', 'bathtub', 'bathtub-outline', 'battery', 'battery-10', 'battery-10-bluetooth', 'battery-20', 'battery-20-bluetooth', 'battery-30', 'battery-30-bluetooth', 'battery-40', 'battery-40-bluetooth', 'battery-50', 'battery-50-bluetooth', 'battery-60', 'battery-60-bluetooth', 'battery-70', 'battery-70-bluetooth', 'battery-80', 'battery-80-bluetooth', 'battery-90', 'battery-90-bluetooth', 'battery-alert', 'battery-alert-bluetooth', 'battery-alert-variant', 'battery-alert-variant-outline', 'battery-arrow-down', 'battery-arrow-down-outline', 'battery-arrow-up', 'battery-arrow-up-outline', 'battery-bluetooth', 'battery-bluetooth-variant', 'battery-charging', 'battery-charging-10', 'battery-charging-100', 'battery-charging-20', 'battery-charging-30', 'battery-charging-40', 'battery-charging-50', 'battery-charging-60', 'battery-charging-70', 'battery-charging-80', 'battery-charging-90', 'battery-charging-high', 'battery-charging-low', 'battery-charging-medium', 'battery-charging-outline', 'battery-charging-wireless', 'battery-charging-wireless-10', 'battery-charging-wireless-20', 'battery-charging-wireless-30', 'battery-charging-wireless-40', 'battery-charging-wireless-50', 'battery-charging-wireless-60', 'battery-charging-wireless-70', 'battery-charging-wireless-80', 'battery-charging-wireless-90', 'battery-charging-wireless-alert', 'battery-charging-wireless-outline', 'battery-check', 'battery-check-outline', 'battery-heart', 'battery-heart-outline', 'battery-heart-variant', 'battery-high', 'battery-lock', 'battery-lock-open', 'battery-low', 'battery-medium', 'battery-minus', 'battery-minus-outline', 'battery-minus-variant', 'battery-negative', 'battery-off', 'battery-off-outline', 'battery-outline', 'battery-plus', 'battery-plus-outline', 'battery-plus-variant', 'battery-positive', 'battery-remove', 'battery-remove-outline', 'battery-sync', 'battery-sync-outline', 'battery-unknown', 'battery-unknown-bluetooth', 'beach', 'beaker', 'beaker-alert', 'beaker-alert-outline', 'beaker-check', 'beaker-check-outline', 'beaker-minus', 'beaker-minus-outline', 'beaker-outline', 'beaker-plus', 'beaker-plus-outline', 'beaker-question', 'beaker-question-outline', 'beaker-remove', 'beaker-remove-outline', 'bed', 'bed-double', 'bed-double-outline', 'bed-empty', 'bed-king', 'bed-king-outline', 'bed-outline', 'bed-queen', 'bed-queen-outline', 'bed-single', 'bed-single-outline', 'bee', 'bee-flower', 'beehive-off-outline', 'beehive-outline', 'beekeeper', 'beer', 'beer-outline', 'bell', 'bell-alert', 'bell-alert-outline', 'bell-badge', 'bell-badge-outline', 'bell-cancel', 'bell-cancel-outline', 'bell-check', 'bell-check-outline', 'bell-circle', 'bell-circle-outline', 'bell-minus', 'bell-minus-outline', 'bell-off', 'bell-off-outline', 'bell-outline', 'bell-plus', 'bell-plus-outline', 'bell-remove', 'bell-remove-outline', 'bell-ring', 'bell-ring-outline', 'bell-sleep', 'bell-sleep-outline', 'beta', 'betamax', 'biathlon', 'bicycle', 'bicycle-basket', 'bicycle-cargo', 'bicycle-electric', 'bicycle-penny-farthing', 'bike', 'bike-fast', 'billboard', 'billiards', 'billiards-rack', 'binoculars', 'bio', 'biohazard', 'bird', 'bitbucket', 'bitcoin', 'black-mesa', 'blender', 'blender-outline', 'blender-software', 'blinds', 'blinds-open', 'block-helper', 'blood-bag', 'bluetooth', 'bluetooth-audio', 'bluetooth-connect', 'bluetooth-off', 'bluetooth-settings', 'bluetooth-transfer', 'blur', 'blur-linear', 'blur-off', 'blur-radial', 'bolt', 'bomb', 'bomb-off', 'bone', 'book', 'book-account', 'book-account-outline', 'book-alert', 'book-alert-outline', 'book-alphabet', 'book-arrow-down', 'book-arrow-down-outline', 'book-arrow-left', 'book-arrow-left-outline', 'book-arrow-right', 'book-arrow-right-outline', 'book-arrow-up', 'book-arrow-up-outline', 'book-cancel', 'book-cancel-outline', 'book-check', 'book-check-outline', 'book-clock', 'book-clock-outline', 'book-cog', 'book-cog-outline', 'book-cross', 'book-edit', 'book-edit-outline', 'book-education', 'book-education-outline', 'book-information-variant', 'book-lock', 'book-lock-open', 'book-lock-open-outline', 'book-lock-outline', 'book-marker', 'book-marker-outline', 'book-minus', 'book-minus-multiple', 'book-minus-multiple-outline', 'book-minus-outline', 'book-multiple', 'book-multiple-outline', 'book-music', 'book-music-outline', 'book-off', 'book-off-outline', 'book-open', 'book-open-blank-variant', 'book-open-outline', 'book-open-page-variant', 'book-open-page-variant-outline', 'book-open-variant', 'book-outline', 'book-play', 'book-play-outline', 'book-plus', 'book-plus-multiple', 'book-plus-multiple-outline', 'book-plus-outline', 'book-refresh', 'book-refresh-outline', 'book-remove', 'book-remove-multiple', 'book-remove-multiple-outline', 'book-remove-outline', 'book-search', 'book-search-outline', 'book-settings', 'book-settings-outline', 'book-sync', 'book-sync-outline', 'book-variant', 'book-variant-multiple', 'bookmark', 'bookmark-box-multiple', 'bookmark-box-multiple-outline', 'bookmark-check', 'bookmark-check-outline', 'bookmark-minus', 'bookmark-minus-outline', 'bookmark-multiple', 'bookmark-multiple-outline', 'bookmark-music', 'bookmark-music-outline', 'bookmark-off', 'bookmark-off-outline', 'bookmark-outline', 'bookmark-plus', 'bookmark-plus-outline', 'bookmark-remove', 'bookmark-remove-outline', 'bookshelf', 'boom-gate', 'boom-gate-alert', 'boom-gate-alert-outline', 'boom-gate-arrow-down', 'boom-gate-arrow-down-outline', 'boom-gate-arrow-up', 'boom-gate-arrow-up-outline', 'boom-gate-outline', 'boom-gate-up', 'boom-gate-up-outline', 'boombox', 'boomerang', 'bootstrap', 'border-all', 'border-all-variant', 'border-bottom', 'border-bottom-variant', 'border-color', 'border-horizontal', 'border-inside', 'border-left', 'border-left-variant', 'border-none', 'border-none-variant', 'border-outside', 'border-right', 'border-right-variant', 'border-style', 'border-top', 'border-top-variant', 'border-vertical', 'bottle-soda', 'bottle-soda-classic', 'bottle-soda-classic-outline', 'bottle-soda-outline', 'bottle-tonic', 'bottle-tonic-outline', 'bottle-tonic-plus', 'bottle-tonic-plus-outline', 'bottle-tonic-skull', 'bottle-tonic-skull-outline', 'bottle-wine', 'bottle-wine-outline', 'bow-arrow', 'bow-tie', 'bowl', 'bowl-mix', 'bowl-mix-outline', 'bowl-outline', 'bowling', 'box', 'box-cutter', 'box-cutter-off', 'box-shadow', 'boxing-glove', 'braille', 'brain', 'bread-slice', 'bread-slice-outline', 'bridge', 'briefcase', 'briefcase-account', 'briefcase-account-outline', 'briefcase-check', 'briefcase-check-outline', 'briefcase-clock', 'briefcase-clock-outline', 'briefcase-download', 'briefcase-download-outline', 'briefcase-edit', 'briefcase-edit-outline', 'briefcase-eye', 'briefcase-eye-outline', 'briefcase-minus', 'briefcase-minus-outline', 'briefcase-off', 'briefcase-off-outline', 'briefcase-outline', 'briefcase-plus', 'briefcase-plus-outline', 'briefcase-remove', 'briefcase-remove-outline', 'briefcase-search', 'briefcase-search-outline', 'briefcase-upload', 'briefcase-upload-outline', 'briefcase-variant', 'briefcase-variant-off', 'briefcase-variant-off-outline', 'briefcase-variant-outline', 'brightness-1', 'brightness-2', 'brightness-3', 'brightness-4', 'brightness-5', 'brightness-6', 'brightness-7', 'brightness-auto', 'brightness-percent', 'broadcast', 'broadcast-off', 'broom', 'brush', 'brush-off', 'brush-variant', 'bucket', 'bucket-outline', 'buffet', 'bug', 'bug-check', 'bug-check-outline', 'bug-outline', 'bugle', 'bulldozer', 'bullet', 'bulletin-board', 'bullhorn', 'bullhorn-outline', 'bullhorn-variant', 'bullhorn-variant-outline', 'bullseye', 'bullseye-arrow', 'bulma', 'bunk-bed', 'bunk-bed-outline', 'bus', 'bus-alert', 'bus-articulated-end', 'bus-articulated-front', 'bus-clock', 'bus-double-decker', 'bus-electric', 'bus-marker', 'bus-multiple', 'bus-school', 'bus-side', 'bus-stop', 'bus-stop-covered', 'bus-stop-uncovered', 'butterfly', 'butterfly-outline', 'cabin-a-frame', 'cable-data', 'cached', 'cactus', 'cake', 'cake-layered', 'cake-variant', 'cake-variant-outline', 'calculator', 'calculator-variant', 'calculator-variant-outline', 'calendar', 'calendar-account', 'calendar-account-outline', 'calendar-alert', 'calendar-arrow-left', 'calendar-arrow-right', 'calendar-blank', 'calendar-blank-multiple', 'calendar-blank-outline', 'calendar-check', 'calendar-check-outline', 'calendar-clock', 'calendar-clock-outline', 'calendar-collapse-horizontal', 'calendar-cursor', 'calendar-edit', 'calendar-end', 'calendar-expand-horizontal', 'calendar-export', 'calendar-heart', 'calendar-import', 'calendar-lock', 'calendar-lock-outline', 'calendar-minus', 'calendar-month', 'calendar-month-outline', 'calendar-multiple', 'calendar-multiple-check', 'calendar-multiselect', 'calendar-outline', 'calendar-plus', 'calendar-question', 'calendar-range', 'calendar-range-outline', 'calendar-refresh', 'calendar-refresh-outline', 'calendar-remove', 'calendar-remove-outline', 'calendar-search', 'calendar-star', 'calendar-start', 'calendar-sync', 'calendar-sync-outline', 'calendar-text', 'calendar-text-outline', 'calendar-today', 'calendar-week', 'calendar-week-begin', 'calendar-weekend', 'calendar-weekend-outline', 'call-made', 'call-merge', 'call-missed', 'call-received', 'call-split', 'camcorder', 'camcorder-off', 'camera', 'camera-account', 'camera-burst', 'camera-control', 'camera-document', 'camera-document-off', 'camera-enhance', 'camera-enhance-outline', 'camera-flip', 'camera-flip-outline', 'camera-front', 'camera-front-variant', 'camera-gopro', 'camera-image', 'camera-iris', 'camera-marker', 'camera-marker-outline', 'camera-metering-center', 'camera-metering-matrix', 'camera-metering-partial', 'camera-metering-spot', 'camera-off', 'camera-off-outline', 'camera-outline', 'camera-party-mode', 'camera-plus', 'camera-plus-outline', 'camera-rear', 'camera-rear-variant', 'camera-retake', 'camera-retake-outline', 'camera-switch', 'camera-switch-outline', 'camera-timer', 'camera-wireless', 'camera-wireless-outline', 'campfire', 'cancel', 'candelabra', 'candelabra-fire', 'candle', 'candy', 'candy-off', 'candy-off-outline', 'candy-outline', 'candycane', 'cannabis', 'cannabis-off', 'caps-lock', 'car', 'car-2-plus', 'car-3-plus', 'car-arrow-left', 'car-arrow-right', 'car-back', 'car-battery', 'car-brake-abs', 'car-brake-alert', 'car-brake-fluid-level', 'car-brake-hold', 'car-brake-low-pressure', 'car-brake-parking', 'car-brake-retarder', 'car-brake-temperature', 'car-brake-worn-linings', 'car-child-seat', 'car-clock', 'car-clutch', 'car-cog', 'car-connected', 'car-convertible', 'car-coolant-level', 'car-cruise-control', 'car-defrost-front', 'car-defrost-rear', 'car-door', 'car-door-lock', 'car-electric', 'car-electric-outline', 'car-emergency', 'car-esp', 'car-estate', 'car-hatchback', 'car-info', 'car-key', 'car-lifted-pickup', 'car-light-alert', 'car-light-dimmed', 'car-light-fog', 'car-light-high', 'car-limousine', 'car-multiple', 'car-off', 'car-outline', 'car-parking-lights', 'car-pickup', 'car-seat', 'car-seat-cooler', 'car-seat-heater', 'car-select', 'car-settings', 'car-shift-pattern', 'car-side', 'car-speed-limiter', 'car-sports', 'car-tire-alert', 'car-traction-control', 'car-turbocharger', 'car-wash', 'car-windshield', 'car-windshield-outline', 'car-wireless', 'car-wrench', 'carabiner', 'caravan', 'card', 'card-account-details', 'card-account-details-outline', 'card-account-details-star', 'card-account-details-star-outline', 'card-account-mail', 'card-account-mail-outline', 'card-account-phone', 'card-account-phone-outline', 'card-bulleted', 'card-bulleted-off', 'card-bulleted-off-outline', 'card-bulleted-outline', 'card-bulleted-settings', 'card-bulleted-settings-outline', 'card-minus', 'card-minus-outline', 'card-multiple', 'card-multiple-outline', 'card-off', 'card-off-outline', 'card-outline', 'card-plus', 'card-plus-outline', 'card-remove', 'card-remove-outline', 'card-search', 'card-search-outline', 'card-text', 'card-text-outline', 'cards', 'cards-club', 'cards-club-outline', 'cards-diamond', 'cards-diamond-outline', 'cards-heart', 'cards-heart-outline', 'cards-outline', 'cards-playing', 'cards-playing-club', 'cards-playing-club-multiple', 'cards-playing-club-multiple-outline', 'cards-playing-club-outline', 'cards-playing-diamond', 'cards-playing-diamond-multiple', 'cards-playing-diamond-multiple-outline', 'cards-playing-diamond-outline', 'cards-playing-heart', 'cards-playing-heart-multiple', 'cards-playing-heart-multiple-outline', 'cards-playing-heart-outline', 'cards-playing-outline', 'cards-playing-spade', 'cards-playing-spade-multiple', 'cards-playing-spade-multiple-outline', 'cards-playing-spade-outline', 'cards-spade', 'cards-spade-outline', 'cards-variant', 'carrot', 'cart', 'cart-arrow-down', 'cart-arrow-right', 'cart-arrow-up', 'cart-check', 'cart-heart', 'cart-minus', 'cart-off', 'cart-outline', 'cart-plus', 'cart-remove', 'cart-variant', 'case-sensitive-alt', 'cash', 'cash-100', 'cash-check', 'cash-fast', 'cash-lock', 'cash-lock-open', 'cash-marker', 'cash-minus', 'cash-multiple', 'cash-plus', 'cash-refund', 'cash-register', 'cash-remove', 'cassette', 'cast', 'cast-audio', 'cast-audio-variant', 'cast-connected', 'cast-education', 'cast-off', 'cast-variant', 'castle', 'cat', 'cctv', 'cctv-off', 'ceiling-fan', 'ceiling-fan-light', 'ceiling-light', 'ceiling-light-multiple', 'ceiling-light-multiple-outline', 'ceiling-light-outline', 'cellphone', 'cellphone-arrow-down', 'cellphone-basic', 'cellphone-charging', 'cellphone-check', 'cellphone-cog', 'cellphone-dock', 'cellphone-information', 'cellphone-key', 'cellphone-link', 'cellphone-link-off', 'cellphone-lock', 'cellphone-marker', 'cellphone-message', 'cellphone-message-off', 'cellphone-nfc', 'cellphone-nfc-off', 'cellphone-off', 'cellphone-play', 'cellphone-remove', 'cellphone-screenshot', 'cellphone-settings', 'cellphone-sound', 'cellphone-text', 'cellphone-wireless', 'centos', 'certificate', 'certificate-outline', 'chair-rolling', 'chair-school', 'chandelier', 'charity', 'chart-arc', 'chart-areaspline', 'chart-areaspline-variant', 'chart-bar', 'chart-bar-stacked', 'chart-bell-curve', 'chart-bell-curve-cumulative', 'chart-box', 'chart-box-outline', 'chart-box-plus-outline', 'chart-bubble', 'chart-donut', 'chart-donut-variant', 'chart-gantt', 'chart-histogram', 'chart-line', 'chart-line-stacked', 'chart-line-variant', 'chart-multiline', 'chart-multiple', 'chart-pie', 'chart-ppf', 'chart-sankey', 'chart-sankey-variant', 'chart-scatter-plot', 'chart-scatter-plot-hexbin', 'chart-timeline', 'chart-timeline-variant', 'chart-timeline-variant-shimmer', 'chart-tree', 'chart-waterfall', 'chat', 'chat-alert', 'chat-alert-outline', 'chat-minus', 'chat-minus-outline', 'chat-outline', 'chat-plus', 'chat-plus-outline', 'chat-processing', 'chat-processing-outline', 'chat-question', 'chat-question-outline', 'chat-remove', 'chat-remove-outline', 'chat-sleep', 'chat-sleep-outline', 'check', 'check-all', 'check-bold', 'check-circle', 'check-circle-outline', 'check-decagram', 'check-decagram-outline', 'check-network', 'check-network-outline', 'check-outline', 'check-underline', 'check-underline-circle', 'check-underline-circle-outline', 'checkbook', 'checkbox-blank', 'checkbox-blank-badge', 'checkbox-blank-badge-outline', 'checkbox-blank-circle', 'checkbox-blank-circle-outline', 'checkbox-blank-off', 'checkbox-blank-off-outline', 'checkbox-blank-outline', 'checkbox-intermediate', 'checkbox-marked', 'checkbox-marked-circle', 'checkbox-marked-circle-outline', 'checkbox-marked-circle-plus-outline', 'checkbox-marked-outline', 'checkbox-multiple-blank', 'checkbox-multiple-blank-circle', 'checkbox-multiple-blank-circle-outline', 'checkbox-multiple-blank-outline', 'checkbox-multiple-marked', 'checkbox-multiple-marked-circle', 'checkbox-multiple-marked-circle-outline', 'checkbox-multiple-marked-outline', 'checkbox-multiple-outline', 'checkbox-outline', 'checkerboard', 'checkerboard-minus', 'checkerboard-plus', 'checkerboard-remove', 'cheese', 'cheese-off', 'chef-hat', 'chemical-weapon', 'chess-bishop', 'chess-king', 'chess-knight', 'chess-pawn', 'chess-queen', 'chess-rook', 'chevron-double-down', 'chevron-double-left', 'chevron-double-right', 'chevron-double-up', 'chevron-down', 'chevron-down-box', 'chevron-down-box-outline', 'chevron-down-circle', 'chevron-down-circle-outline', 'chevron-left', 'chevron-left-box', 'chevron-left-box-outline', 'chevron-left-circle', 'chevron-left-circle-outline', 'chevron-right', 'chevron-right-box', 'chevron-right-box-outline', 'chevron-right-circle', 'chevron-right-circle-outline', 'chevron-triple-down', 'chevron-triple-left', 'chevron-triple-right', 'chevron-triple-up', 'chevron-up', 'chevron-up-box', 'chevron-up-box-outline', 'chevron-up-circle', 'chevron-up-circle-outline', 'chili-alert', 'chili-alert-outline', 'chili-hot', 'chili-hot-outline', 'chili-medium', 'chili-medium-outline', 'chili-mild', 'chili-mild-outline', 'chili-off', 'chili-off-outline', 'chip', 'church', 'cigar', 'cigar-off', 'circle', 'circle-box', 'circle-box-outline', 'circle-double', 'circle-edit-outline', 'circle-expand', 'circle-half', 'circle-half-full', 'circle-medium', 'circle-multiple', 'circle-multiple-outline', 'circle-off-outline', 'circle-opacity', 'circle-outline', 'circle-slice-1', 'circle-slice-2', 'circle-slice-3', 'circle-slice-4', 'circle-slice-5', 'circle-slice-6', 'circle-slice-7', 'circle-slice-8', 'circle-small', 'circular-saw', 'city', 'city-variant', 'city-variant-outline', 'clipboard', 'clipboard-account', 'clipboard-account-outline', 'clipboard-alert', 'clipboard-alert-outline', 'clipboard-arrow-down', 'clipboard-arrow-down-outline', 'clipboard-arrow-left', 'clipboard-arrow-left-outline', 'clipboard-arrow-right', 'clipboard-arrow-right-outline', 'clipboard-arrow-up', 'clipboard-arrow-up-outline', 'clipboard-check', 'clipboard-check-multiple', 'clipboard-check-multiple-outline', 'clipboard-check-outline', 'clipboard-clock', 'clipboard-clock-outline', 'clipboard-edit', 'clipboard-edit-outline', 'clipboard-file', 'clipboard-file-outline', 'clipboard-flow', 'clipboard-flow-outline', 'clipboard-list', 'clipboard-list-outline', 'clipboard-minus', 'clipboard-minus-outline', 'clipboard-multiple', 'clipboard-multiple-outline', 'clipboard-off', 'clipboard-off-outline', 'clipboard-outline', 'clipboard-play', 'clipboard-play-multiple', 'clipboard-play-multiple-outline', 'clipboard-play-outline', 'clipboard-plus', 'clipboard-plus-outline', 'clipboard-pulse', 'clipboard-pulse-outline', 'clipboard-remove', 'clipboard-remove-outline', 'clipboard-search', 'clipboard-search-outline', 'clipboard-text', 'clipboard-text-clock', 'clipboard-text-clock-outline', 'clipboard-text-multiple', 'clipboard-text-multiple-outline', 'clipboard-text-off', 'clipboard-text-off-outline', 'clipboard-text-outline', 'clipboard-text-play', 'clipboard-text-play-outline', 'clipboard-text-search', 'clipboard-text-search-outline', 'clippy', 'clock', 'clock-alert', 'clock-alert-outline', 'clock-check', 'clock-check-outline', 'clock-digital', 'clock-edit', 'clock-edit-outline', 'clock-end', 'clock-fast', 'clock-in', 'clock-minus', 'clock-minus-outline', 'clock-out', 'clock-outline', 'clock-plus', 'clock-plus-outline', 'clock-remove', 'clock-remove-outline', 'clock-start', 'clock-time-eight', 'clock-time-eight-outline', 'clock-time-eleven', 'clock-time-eleven-outline', 'clock-time-five', 'clock-time-five-outline', 'clock-time-four', 'clock-time-four-outline', 'clock-time-nine', 'clock-time-nine-outline', 'clock-time-one', 'clock-time-one-outline', 'clock-time-seven', 'clock-time-seven-outline', 'clock-time-six', 'clock-time-six-outline', 'clock-time-ten', 'clock-time-ten-outline', 'clock-time-three', 'clock-time-three-outline', 'clock-time-twelve', 'clock-time-twelve-outline', 'clock-time-two', 'clock-time-two-outline', 'close', 'close-box', 'close-box-multiple', 'close-box-multiple-outline', 'close-box-outline', 'close-circle', 'close-circle-multiple', 'close-circle-multiple-outline', 'close-circle-outline', 'close-network', 'close-network-outline', 'close-octagon', 'close-octagon-outline', 'close-outline', 'close-thick', 'closed-caption', 'closed-caption-outline', 'cloud', 'cloud-alert', 'cloud-braces', 'cloud-check', 'cloud-check-outline', 'cloud-circle', 'cloud-download', 'cloud-download-outline', 'cloud-lock', 'cloud-lock-outline', 'cloud-off-outline', 'cloud-outline', 'cloud-print', 'cloud-print-outline', 'cloud-question', 'cloud-refresh', 'cloud-search', 'cloud-search-outline', 'cloud-sync', 'cloud-sync-outline', 'cloud-tags', 'cloud-upload', 'cloud-upload-outline', 'clover', 'coach-lamp', 'coat-rack', 'code-array', 'code-braces', 'code-braces-box', 'code-brackets', 'code-equal', 'code-greater-than', 'code-greater-than-or-equal', 'code-json', 'code-less-than', 'code-less-than-or-equal', 'code-not-equal', 'code-not-equal-variant', 'code-parentheses', 'code-parentheses-box', 'code-string', 'code-tags', 'code-tags-check', 'codepen', 'coffee', 'coffee-maker', 'coffee-maker-check', 'coffee-maker-check-outline', 'coffee-maker-outline', 'coffee-off', 'coffee-off-outline', 'coffee-outline', 'coffee-to-go', 'coffee-to-go-outline', 'coffin', 'cog', 'cog-box', 'cog-clockwise', 'cog-counterclockwise', 'cog-off', 'cog-off-outline', 'cog-outline', 'cog-pause', 'cog-pause-outline', 'cog-play', 'cog-play-outline', 'cog-refresh', 'cog-refresh-outline', 'cog-stop', 'cog-stop-outline', 'cog-sync', 'cog-sync-outline', 'cog-transfer', 'cog-transfer-outline', 'cogs', 'collage', 'collapse-all', 'collapse-all-outline', 'color-helper', 'comma', 'comma-box', 'comma-box-outline', 'comma-circle', 'comma-circle-outline', 'comment', 'comment-account', 'comment-account-outline', 'comment-alert', 'comment-alert-outline', 'comment-arrow-left', 'comment-arrow-left-outline', 'comment-arrow-right', 'comment-arrow-right-outline', 'comment-bookmark', 'comment-bookmark-outline', 'comment-check', 'comment-check-outline', 'comment-edit', 'comment-edit-outline', 'comment-eye', 'comment-eye-outline', 'comment-flash', 'comment-flash-outline', 'comment-minus', 'comment-minus-outline', 'comment-multiple', 'comment-multiple-outline', 'comment-off', 'comment-off-outline', 'comment-outline', 'comment-plus', 'comment-plus-outline', 'comment-processing', 'comment-processing-outline', 'comment-question', 'comment-question-outline', 'comment-quote', 'comment-quote-outline', 'comment-remove', 'comment-remove-outline', 'comment-search', 'comment-search-outline', 'comment-text', 'comment-text-multiple', 'comment-text-multiple-outline', 'comment-text-outline', 'compare', 'compare-horizontal', 'compare-remove', 'compare-vertical', 'compass', 'compass-off', 'compass-off-outline', 'compass-outline', 'compass-rose', 'cone', 'cone-off', 'connection', 'console', 'console-line', 'console-network', 'console-network-outline', 'consolidate', 'contactless-payment', 'contactless-payment-circle', 'contactless-payment-circle-outline', 'contacts', 'contacts-outline', 'contain', 'contain-end', 'contain-start', 'content-copy', 'content-cut', 'content-duplicate', 'content-paste', 'content-save', 'content-save-alert', 'content-save-alert-outline', 'content-save-all', 'content-save-all-outline', 'content-save-check', 'content-save-check-outline', 'content-save-cog', 'content-save-cog-outline', 'content-save-edit', 'content-save-edit-outline', 'content-save-move', 'content-save-move-outline', 'content-save-off', 'content-save-off-outline', 'content-save-outline', 'content-save-settings', 'content-save-settings-outline', 'contrast', 'contrast-box', 'contrast-circle', 'controller-classic', 'controller-classic-outline', 'cookie', 'cookie-alert', 'cookie-alert-outline', 'cookie-check', 'cookie-check-outline', 'cookie-clock', 'cookie-clock-outline', 'cookie-cog', 'cookie-cog-outline', 'cookie-edit', 'cookie-edit-outline', 'cookie-lock', 'cookie-lock-outline', 'cookie-minus', 'cookie-minus-outline', 'cookie-off', 'cookie-off-outline', 'cookie-outline', 'cookie-plus', 'cookie-plus-outline', 'cookie-refresh', 'cookie-refresh-outline', 'cookie-remove', 'cookie-remove-outline', 'cookie-settings', 'cookie-settings-outline', 'coolant-temperature', 'copyleft', 'copyright', 'cordova', 'corn', 'corn-off', 'cosine-wave', 'counter', 'countertop', 'countertop-outline', 'cow', 'cow-off', 'cpu-32-bit', 'cpu-64-bit', 'cradle', 'cradle-outline', 'crane', 'creation', 'creative-commons', 'credit-card', 'credit-card-check', 'credit-card-check-outline', 'credit-card-chip', 'credit-card-chip-outline', 'credit-card-clock', 'credit-card-clock-outline', 'credit-card-edit', 'credit-card-edit-outline', 'credit-card-fast', 'credit-card-fast-outline', 'credit-card-lock', 'credit-card-lock-outline', 'credit-card-marker', 'credit-card-marker-outline', 'credit-card-minus', 'credit-card-minus-outline', 'credit-card-multiple', 'credit-card-multiple-outline', 'credit-card-off', 'credit-card-off-outline', 'credit-card-outline', 'credit-card-plus', 'credit-card-plus-outline', 'credit-card-refresh', 'credit-card-refresh-outline', 'credit-card-refund', 'credit-card-refund-outline', 'credit-card-remove', 'credit-card-remove-outline', 'credit-card-scan', 'credit-card-scan-outline', 'credit-card-search', 'credit-card-search-outline', 'credit-card-settings', 'credit-card-settings-outline', 'credit-card-sync', 'credit-card-sync-outline', 'credit-card-wireless', 'credit-card-wireless-off', 'credit-card-wireless-off-outline', 'credit-card-wireless-outline', 'cricket', 'crop', 'crop-free', 'crop-landscape', 'crop-portrait', 'crop-rotate', 'crop-square', 'cross', 'cross-bolnisi', 'cross-celtic', 'cross-outline', 'crosshairs', 'crosshairs-gps', 'crosshairs-off', 'crosshairs-question', 'crowd', 'crown', 'crown-circle', 'crown-circle-outline', 'crown-outline', 'cryengine', 'crystal-ball', 'cube', 'cube-off', 'cube-off-outline', 'cube-outline', 'cube-scan', 'cube-send', 'cube-unfolded', 'cup', 'cup-off', 'cup-off-outline', 'cup-outline', 'cup-water', 'cupboard', 'cupboard-outline', 'cupcake', 'curling', 'currency-bdt', 'currency-brl', 'currency-btc', 'currency-cny', 'currency-eth', 'currency-eur', 'currency-eur-off', 'currency-gbp', 'currency-ils', 'currency-inr', 'currency-jpy', 'currency-krw', 'currency-kzt', 'currency-mnt', 'currency-ngn', 'currency-php', 'currency-rial', 'currency-rub', 'currency-rupee', 'currency-sign', 'currency-try', 'currency-twd', 'currency-usd', 'currency-usd-off', 'current-ac', 'current-dc', 'cursor-default', 'cursor-default-click', 'cursor-default-click-outline', 'cursor-default-gesture', 'cursor-default-gesture-outline', 'cursor-default-outline', 'cursor-move', 'cursor-pointer', 'cursor-text', 'curtains', 'curtains-closed', 'cylinder', 'cylinder-off', 'dance-ballroom', 'dance-pole', 'data-matrix', 'data-matrix-edit', 'data-matrix-minus', 'data-matrix-plus', 'data-matrix-remove', 'data-matrix-scan', 'database', 'database-alert', 'database-alert-outline', 'database-arrow-down', 'database-arrow-down-outline', 'database-arrow-left', 'database-arrow-left-outline', 'database-arrow-right', 'database-arrow-right-outline', 'database-arrow-up', 'database-arrow-up-outline', 'database-check', 'database-check-outline', 'database-clock', 'database-clock-outline', 'database-cog', 'database-cog-outline', 'database-edit', 'database-edit-outline', 'database-export', 'database-export-outline', 'database-eye', 'database-eye-off', 'database-eye-off-outline', 'database-eye-outline', 'database-import', 'database-import-outline', 'database-lock', 'database-lock-outline', 'database-marker', 'database-marker-outline', 'database-minus', 'database-minus-outline', 'database-off', 'database-off-outline', 'database-outline', 'database-plus', 'database-plus-outline', 'database-refresh', 'database-refresh-outline', 'database-remove', 'database-remove-outline', 'database-search', 'database-search-outline', 'database-settings', 'database-settings-outline', 'database-sync', 'database-sync-outline', 'death-star', 'death-star-variant', 'deathly-hallows', 'debian', 'debug-step-into', 'debug-step-out', 'debug-step-over', 'decagram', 'decagram-outline', 'decimal', 'decimal-comma', 'decimal-comma-decrease', 'decimal-comma-increase', 'decimal-decrease', 'decimal-increase', 'delete', 'delete-alert', 'delete-alert-outline', 'delete-circle', 'delete-circle-outline', 'delete-clock', 'delete-clock-outline', 'delete-empty', 'delete-empty-outline', 'delete-forever', 'delete-forever-outline', 'delete-off', 'delete-off-outline', 'delete-outline', 'delete-restore', 'delete-sweep', 'delete-sweep-outline', 'delete-variant', 'delta', 'desk', 'desk-lamp', 'deskphone', 'desktop-classic', 'desktop-mac', 'desktop-mac-dashboard', 'desktop-tower', 'desktop-tower-monitor', 'details', 'dev-to', 'developer-board', 'deviantart', 'devices', 'dharmachakra', 'diabetes', 'dialpad', 'diameter', 'diameter-outline', 'diameter-variant', 'diamond', 'diamond-outline', 'diamond-stone', 'dice-1', 'dice-1-outline', 'dice-2', 'dice-2-outline', 'dice-3', 'dice-3-outline', 'dice-4', 'dice-4-outline', 'dice-5', 'dice-5-outline', 'dice-6', 'dice-6-outline', 'dice-d10', 'dice-d10-outline', 'dice-d12', 'dice-d12-outline', 'dice-d20', 'dice-d20-outline', 'dice-d4', 'dice-d4-outline', 'dice-d6', 'dice-d6-outline', 'dice-d8', 'dice-d8-outline', 'dice-multiple', 'dice-multiple-outline', 'digital-ocean', 'dip-switch', 'directions', 'directions-fork', 'disc', 'disc-alert', 'disc-player', 'discord', 'dishwasher', 'dishwasher-alert', 'dishwasher-off', 'disqus', 'distribute-horizontal-center', 'distribute-horizontal-left', 'distribute-horizontal-right', 'distribute-vertical-bottom', 'distribute-vertical-center', 'distribute-vertical-top', 'diversify', 'diving', 'diving-flippers', 'diving-helmet', 'diving-scuba', 'diving-scuba-flag', 'diving-scuba-tank', 'diving-scuba-tank-multiple', 'diving-snorkel', 'division', 'division-box', 'dlna', 'dna', 'dns', 'dns-outline', 'dock-bottom', 'dock-left', 'dock-right', 'dock-top', 'dock-window', 'docker', 'doctor', 'dog', 'dog-service', 'dog-side', 'dog-side-off', 'dolby', 'dolly', 'dolphin', 'domain', 'domain-off', 'domain-plus', 'domain-remove', 'dome-light', 'domino-mask', 'donkey', 'door', 'door-closed', 'door-closed-lock', 'door-open', 'door-sliding', 'door-sliding-lock', 'door-sliding-open', 'doorbell', 'doorbell-video', 'dot-net', 'dots-circle', 'dots-grid', 'dots-hexagon', 'dots-horizontal', 'dots-horizontal-circle', 'dots-horizontal-circle-outline', 'dots-square', 'dots-triangle', 'dots-vertical', 'dots-vertical-circle', 'dots-vertical-circle-outline', 'download', 'download-box', 'download-box-outline', 'download-circle', 'download-circle-outline', 'download-lock', 'download-lock-outline', 'download-multiple', 'download-network', 'download-network-outline', 'download-off', 'download-off-outline', 'download-outline', 'drag', 'drag-horizontal', 'drag-horizontal-variant', 'drag-variant', 'drag-vertical', 'drag-vertical-variant', 'drama-masks', 'draw', 'draw-pen', 'drawing', 'drawing-box', 'dresser', 'dresser-outline', 'drone', 'dropbox', 'drupal', 'duck', 'dumbbell', 'dump-truck', 'ear-hearing', 'ear-hearing-off', 'earbuds', 'earbuds-off', 'earbuds-off-outline', 'earbuds-outline', 'earth', 'earth-arrow-right', 'earth-box', 'earth-box-minus', 'earth-box-off', 'earth-box-plus', 'earth-box-remove', 'earth-minus', 'earth-off', 'earth-plus', 'earth-remove', 'egg', 'egg-easter', 'egg-fried', 'egg-off', 'egg-off-outline', 'egg-outline', 'eiffel-tower', 'eight-track', 'eject', 'eject-outline', 'electric-switch', 'electric-switch-closed', 'electron-framework', 'elephant', 'elevation-decline', 'elevation-rise', 'elevator', 'elevator-down', 'elevator-passenger', 'elevator-passenger-off', 'elevator-passenger-off-outline', 'elevator-passenger-outline', 'elevator-up', 'ellipse', 'ellipse-outline', 'email', 'email-alert', 'email-alert-outline', 'email-box', 'email-check', 'email-check-outline', 'email-edit', 'email-edit-outline', 'email-fast', 'email-fast-outline', 'email-lock', 'email-mark-as-unread', 'email-minus', 'email-minus-outline', 'email-multiple', 'email-multiple-outline', 'email-newsletter', 'email-off', 'email-off-outline', 'email-open', 'email-open-multiple', 'email-open-multiple-outline', 'email-open-outline', 'email-outline', 'email-plus', 'email-plus-outline', 'email-receive', 'email-receive-outline', 'email-remove', 'email-remove-outline', 'email-seal', 'email-seal-outline', 'email-search', 'email-search-outline', 'email-send', 'email-send-outline', 'email-sync', 'email-sync-outline', 'email-variant', 'ember', 'emby', 'emoticon', 'emoticon-angry', 'emoticon-angry-outline', 'emoticon-confused', 'emoticon-confused-outline', 'emoticon-cool', 'emoticon-cool-outline', 'emoticon-cry', 'emoticon-cry-outline', 'emoticon-dead', 'emoticon-dead-outline', 'emoticon-devil', 'emoticon-devil-outline', 'emoticon-excited', 'emoticon-excited-outline', 'emoticon-frown', 'emoticon-frown-outline', 'emoticon-happy', 'emoticon-happy-outline', 'emoticon-kiss', 'emoticon-kiss-outline', 'emoticon-lol', 'emoticon-lol-outline', 'emoticon-neutral', 'emoticon-neutral-outline', 'emoticon-outline', 'emoticon-poop', 'emoticon-poop-outline', 'emoticon-sad', 'emoticon-sad-outline', 'emoticon-sick', 'emoticon-sick-outline', 'emoticon-tongue', 'emoticon-tongue-outline', 'emoticon-wink', 'emoticon-wink-outline', 'engine', 'engine-off', 'engine-off-outline', 'engine-outline', 'epsilon', 'equal', 'equal-box', 'equalizer', 'equalizer-outline', 'eraser', 'eraser-variant', 'escalator', 'escalator-box', 'escalator-down', 'escalator-up', 'eslint', 'et', 'ethereum', 'ethernet', 'ethernet-cable', 'ethernet-cable-off', 'ev-plug-ccs1', 'ev-plug-ccs2', 'ev-plug-chademo', 'ev-plug-tesla', 'ev-plug-type1', 'ev-plug-type2', 'ev-station', 'evernote', 'excavator', 'exclamation', 'exclamation-thick', 'exit-run', 'exit-to-app', 'expand-all', 'expand-all-outline', 'expansion-card', 'expansion-card-variant', 'exponent', 'exponent-box', 'export', 'export-variant', 'eye', 'eye-arrow-left', 'eye-arrow-left-outline', 'eye-arrow-right', 'eye-arrow-right-outline', 'eye-check', 'eye-check-outline', 'eye-circle', 'eye-circle-outline', 'eye-minus', 'eye-minus-outline', 'eye-off', 'eye-off-outline', 'eye-outline', 'eye-plus', 'eye-plus-outline', 'eye-refresh', 'eye-refresh-outline', 'eye-remove', 'eye-remove-outline', 'eye-settings', 'eye-settings-outline', 'eyedropper', 'eyedropper-minus', 'eyedropper-off', 'eyedropper-plus', 'eyedropper-remove', 'eyedropper-variant', 'face-agent', 'face-man', 'face-man-outline', 'face-man-profile', 'face-man-shimmer', 'face-man-shimmer-outline', 'face-mask', 'face-mask-outline', 'face-recognition', 'face-woman', 'face-woman-outline', 'face-woman-profile', 'face-woman-shimmer', 'face-woman-shimmer-outline', 'facebook', 'facebook-gaming', 'facebook-messenger', 'facebook-workplace', 'factory', 'family-tree', 'fan', 'fan-alert', 'fan-auto', 'fan-chevron-down', 'fan-chevron-up', 'fan-minus', 'fan-off', 'fan-plus', 'fan-remove', 'fan-speed-1', 'fan-speed-2', 'fan-speed-3', 'fast-forward', 'fast-forward-10', 'fast-forward-15', 'fast-forward-30', 'fast-forward-5', 'fast-forward-60', 'fast-forward-outline', 'fax', 'feather', 'feature-search', 'feature-search-outline', 'fedora', 'fence', 'fence-electric', 'fencing', 'ferris-wheel', 'ferry', 'file', 'file-account', 'file-account-outline', 'file-alert', 'file-alert-outline', 'file-cabinet', 'file-cad', 'file-cad-box', 'file-cancel', 'file-cancel-outline', 'file-certificate', 'file-certificate-outline', 'file-chart', 'file-chart-outline', 'file-check', 'file-check-outline', 'file-clock', 'file-clock-outline', 'file-cloud', 'file-cloud-outline', 'file-code', 'file-code-outline', 'file-cog', 'file-cog-outline', 'file-compare', 'file-delimited', 'file-delimited-outline', 'file-document', 'file-document-edit', 'file-document-edit-outline', 'file-document-multiple', 'file-document-multiple-outline', 'file-document-outline', 'file-download', 'file-download-outline', 'file-edit', 'file-edit-outline', 'file-excel', 'file-excel-box', 'file-excel-box-outline', 'file-excel-outline', 'file-export', 'file-export-outline', 'file-eye', 'file-eye-outline', 'file-find', 'file-find-outline', 'file-gif-box', 'file-hidden', 'file-image', 'file-image-marker', 'file-image-marker-outline', 'file-image-minus', 'file-image-minus-outline', 'file-image-outline', 'file-image-plus', 'file-image-plus-outline', 'file-image-remove', 'file-image-remove-outline', 'file-import', 'file-import-outline', 'file-jpg-box', 'file-key', 'file-key-outline', 'file-link', 'file-link-outline', 'file-lock', 'file-lock-outline', 'file-marker', 'file-marker-outline', 'file-move', 'file-move-outline', 'file-multiple', 'file-multiple-outline', 'file-music', 'file-music-outline', 'file-outline', 'file-pdf-box', 'file-percent', 'file-percent-outline', 'file-phone', 'file-phone-outline', 'file-plus', 'file-plus-outline', 'file-png-box', 'file-powerpoint', 'file-powerpoint-box', 'file-powerpoint-box-outline', 'file-powerpoint-outline', 'file-presentation-box', 'file-question', 'file-question-outline', 'file-refresh', 'file-refresh-outline', 'file-remove', 'file-remove-outline', 'file-replace', 'file-replace-outline', 'file-restore', 'file-restore-outline', 'file-search', 'file-search-outline', 'file-send', 'file-send-outline', 'file-settings', 'file-settings-outline', 'file-sign', 'file-star', 'file-star-outline', 'file-swap', 'file-swap-outline', 'file-sync', 'file-sync-outline', 'file-table', 'file-table-box', 'file-table-box-multiple', 'file-table-box-multiple-outline', 'file-table-box-outline', 'file-table-outline', 'file-tree', 'file-tree-outline', 'file-undo', 'file-undo-outline', 'file-upload', 'file-upload-outline', 'file-video', 'file-video-outline', 'file-word', 'file-word-box', 'file-word-box-outline', 'file-word-outline', 'film', 'filmstrip', 'filmstrip-box', 'filmstrip-box-multiple', 'filmstrip-off', 'filter', 'filter-check', 'filter-check-outline', 'filter-menu', 'filter-menu-outline', 'filter-minus', 'filter-minus-outline', 'filter-off', 'filter-off-outline', 'filter-outline', 'filter-plus', 'filter-plus-outline', 'filter-remove', 'filter-remove-outline', 'filter-variant', 'filter-variant-minus', 'filter-variant-plus', 'filter-variant-remove', 'finance', 'find-replace', 'fingerprint', 'fingerprint-off', 'fire', 'fire-alert', 'fire-circle', 'fire-extinguisher', 'fire-hydrant', 'fire-hydrant-alert', 'fire-hydrant-off', 'fire-off', 'fire-truck', 'firebase', 'firefox', 'fireplace', 'fireplace-off', 'firewire', 'firework', 'firework-off', 'fish', 'fish-off', 'fishbowl', 'fishbowl-outline', 'fit-to-page', 'fit-to-page-outline', 'fit-to-screen', 'fit-to-screen-outline', 'flag', 'flag-checkered', 'flag-minus', 'flag-minus-outline', 'flag-off', 'flag-off-outline', 'flag-outline', 'flag-plus', 'flag-plus-outline', 'flag-remove', 'flag-remove-outline', 'flag-triangle', 'flag-variant', 'flag-variant-outline', 'flare', 'flash', 'flash-alert', 'flash-alert-outline', 'flash-auto', 'flash-off', 'flash-outline', 'flash-red-eye', 'flashlight', 'flashlight-off', 'flask', 'flask-empty', 'flask-empty-minus', 'flask-empty-minus-outline', 'flask-empty-off', 'flask-empty-off-outline', 'flask-empty-outline', 'flask-empty-plus', 'flask-empty-plus-outline', 'flask-empty-remove', 'flask-empty-remove-outline', 'flask-minus', 'flask-minus-outline', 'flask-off', 'flask-off-outline', 'flask-outline', 'flask-plus', 'flask-plus-outline', 'flask-remove', 'flask-remove-outline', 'flask-round-bottom', 'flask-round-bottom-empty', 'flask-round-bottom-empty-outline', 'flask-round-bottom-outline', 'fleur-de-lis', 'flip-horizontal', 'flip-to-back', 'flip-to-front', 'flip-vertical', 'floor-lamp', 'floor-lamp-dual', 'floor-lamp-dual-outline', 'floor-lamp-outline', 'floor-lamp-torchiere', 'floor-lamp-torchiere-outline', 'floor-lamp-torchiere-variant', 'floor-lamp-torchiere-variant-outline', 'floor-plan', 'floppy', 'floppy-variant', 'flower', 'flower-outline', 'flower-pollen', 'flower-pollen-outline', 'flower-poppy', 'flower-tulip', 'flower-tulip-outline', 'focus-auto', 'focus-field', 'focus-field-horizontal', 'focus-field-vertical', 'folder', 'folder-account', 'folder-account-outline', 'folder-alert', 'folder-alert-outline', 'folder-check', 'folder-check-outline', 'folder-clock', 'folder-clock-outline', 'folder-cog', 'folder-cog-outline', 'folder-download', 'folder-download-outline', 'folder-edit', 'folder-edit-outline', 'folder-eye', 'folder-eye-outline', 'folder-google-drive', 'folder-heart', 'folder-heart-outline', 'folder-hidden', 'folder-home', 'folder-home-outline', 'folder-image', 'folder-information', 'folder-information-outline', 'folder-key', 'folder-key-network', 'folder-key-network-outline', 'folder-key-outline', 'folder-lock', 'folder-lock-open', 'folder-marker', 'folder-marker-outline', 'folder-move', 'folder-move-outline', 'folder-multiple', 'folder-multiple-image', 'folder-multiple-outline', 'folder-multiple-plus', 'folder-multiple-plus-outline', 'folder-music', 'folder-music-outline', 'folder-network', 'folder-network-outline', 'folder-open', 'folder-open-outline', 'folder-outline', 'folder-plus', 'folder-plus-outline', 'folder-pound', 'folder-pound-outline', 'folder-refresh', 'folder-refresh-outline', 'folder-remove', 'folder-remove-outline', 'folder-search', 'folder-search-outline', 'folder-settings', 'folder-settings-outline', 'folder-star', 'folder-star-multiple', 'folder-star-multiple-outline', 'folder-star-outline', 'folder-swap', 'folder-swap-outline', 'folder-sync', 'folder-sync-outline', 'folder-table', 'folder-table-outline', 'folder-text', 'folder-text-outline', 'folder-upload', 'folder-upload-outline', 'folder-zip', 'folder-zip-outline', 'font-awesome', 'food', 'food-apple', 'food-apple-outline', 'food-croissant', 'food-drumstick', 'food-drumstick-off', 'food-drumstick-off-outline', 'food-drumstick-outline', 'food-fork-drink', 'food-halal', 'food-hot-dog', 'food-kosher', 'food-off', 'food-off-outline', 'food-outline', 'food-steak', 'food-steak-off', 'food-takeout-box', 'food-takeout-box-outline', 'food-turkey', 'food-variant', 'food-variant-off', 'foot-print', 'football', 'football-australian', 'football-helmet', 'forest', 'forklift', 'form-dropdown', 'form-select', 'form-textarea', 'form-textbox', 'form-textbox-lock', 'form-textbox-password', 'format-align-bottom', 'format-align-center', 'format-align-justify', 'format-align-left', 'format-align-middle', 'format-align-right', 'format-align-top', 'format-annotation-minus', 'format-annotation-plus', 'format-bold', 'format-clear', 'format-color-fill', 'format-color-highlight', 'format-color-marker-cancel', 'format-color-text', 'format-columns', 'format-float-center', 'format-float-left', 'format-float-none', 'format-float-right', 'format-font', 'format-font-size-decrease', 'format-font-size-increase', 'format-header-1', 'format-header-2', 'format-header-3', 'format-header-4', 'format-header-5', 'format-header-6', 'format-header-decrease', 'format-header-equal', 'format-header-increase', 'format-header-pound', 'format-horizontal-align-center', 'format-horizontal-align-left', 'format-horizontal-align-right', 'format-indent-decrease', 'format-indent-increase', 'format-italic', 'format-letter-case', 'format-letter-case-lower', 'format-letter-case-upper', 'format-letter-ends-with', 'format-letter-matches', 'format-letter-spacing', 'format-letter-starts-with', 'format-line-spacing', 'format-line-style', 'format-line-weight', 'format-list-bulleted', 'format-list-bulleted-square', 'format-list-bulleted-triangle', 'format-list-bulleted-type', 'format-list-checkbox', 'format-list-checks', 'format-list-group', 'format-list-numbered', 'format-list-numbered-rtl', 'format-list-text', 'format-overline', 'format-page-break', 'format-page-split', 'format-paint', 'format-paragraph', 'format-pilcrow', 'format-quote-close', 'format-quote-close-outline', 'format-quote-open', 'format-quote-open-outline', 'format-rotate-90', 'format-section', 'format-size', 'format-strikethrough', 'format-strikethrough-variant', 'format-subscript', 'format-superscript', 'format-text', 'format-text-rotation-angle-down', 'format-text-rotation-angle-up', 'format-text-rotation-down', 'format-text-rotation-down-vertical', 'format-text-rotation-none', 'format-text-rotation-up', 'format-text-rotation-vertical', 'format-text-variant', 'format-text-variant-outline', 'format-text-wrapping-clip', 'format-text-wrapping-overflow', 'format-text-wrapping-wrap', 'format-textbox', 'format-textdirection-l-to-r', 'format-textdirection-r-to-l', 'format-title', 'format-underline', 'format-underline-wavy', 'format-vertical-align-bottom', 'format-vertical-align-center', 'format-vertical-align-top', 'format-wrap-inline', 'format-wrap-square', 'format-wrap-tight', 'format-wrap-top-bottom', 'forum', 'forum-outline', 'forward', 'forwardburger', 'fountain', 'fountain-pen', 'fountain-pen-tip', 'fraction-one-half', 'freebsd', 'french-fries', 'frequently-asked-questions', 'fridge', 'fridge-alert', 'fridge-alert-outline', 'fridge-bottom', 'fridge-industrial', 'fridge-industrial-alert', 'fridge-industrial-alert-outline', 'fridge-industrial-off', 'fridge-industrial-off-outline', 'fridge-industrial-outline', 'fridge-off', 'fridge-off-outline', 'fridge-outline', 'fridge-top', 'fridge-variant', 'fridge-variant-alert', 'fridge-variant-alert-outline', 'fridge-variant-off', 'fridge-variant-off-outline', 'fridge-variant-outline', 'fruit-cherries', 'fruit-cherries-off', 'fruit-citrus', 'fruit-citrus-off', 'fruit-grapes', 'fruit-grapes-outline', 'fruit-pineapple', 'fruit-watermelon', 'fuel', 'fuel-cell', 'fullscreen', 'fullscreen-exit', 'function', 'function-variant', 'furigana-horizontal', 'furigana-vertical', 'fuse', 'fuse-alert', 'fuse-blade', 'fuse-off', 'gamepad', 'gamepad-circle', 'gamepad-circle-down', 'gamepad-circle-left', 'gamepad-circle-outline', 'gamepad-circle-right', 'gamepad-circle-up', 'gamepad-down', 'gamepad-left', 'gamepad-outline', 'gamepad-right', 'gamepad-round', 'gamepad-round-down', 'gamepad-round-left', 'gamepad-round-outline', 'gamepad-round-right', 'gamepad-round-up', 'gamepad-square', 'gamepad-square-outline', 'gamepad-up', 'gamepad-variant', 'gamepad-variant-outline', 'gamma', 'gantry-crane', 'garage', 'garage-alert', 'garage-alert-variant', 'garage-lock', 'garage-open', 'garage-open-variant', 'garage-variant', 'garage-variant-lock', 'gas-cylinder', 'gas-station', 'gas-station-off', 'gas-station-off-outline', 'gas-station-outline', 'gate', 'gate-alert', 'gate-and', 'gate-arrow-left', 'gate-arrow-right', 'gate-nand', 'gate-nor', 'gate-not', 'gate-open', 'gate-or', 'gate-xnor', 'gate-xor', 'gatsby', 'gauge', 'gauge-empty', 'gauge-full', 'gauge-low', 'gavel', 'gender-female', 'gender-male', 'gender-male-female', 'gender-male-female-variant', 'gender-non-binary', 'gender-transgender', 'gentoo', 'gesture', 'gesture-double-tap', 'gesture-pinch', 'gesture-spread', 'gesture-swipe', 'gesture-swipe-down', 'gesture-swipe-horizontal', 'gesture-swipe-left', 'gesture-swipe-right', 'gesture-swipe-up', 'gesture-swipe-vertical', 'gesture-tap', 'gesture-tap-box', 'gesture-tap-button', 'gesture-tap-hold', 'gesture-two-double-tap', 'gesture-two-tap', 'ghost', 'ghost-off', 'ghost-off-outline', 'ghost-outline', 'gift', 'gift-off', 'gift-off-outline', 'gift-open', 'gift-open-outline', 'gift-outline', 'git', 'github', 'gitlab', 'glass-cocktail', 'glass-cocktail-off', 'glass-flute', 'glass-fragile', 'glass-mug', 'glass-mug-off', 'glass-mug-variant', 'glass-mug-variant-off', 'glass-pint-outline', 'glass-stange', 'glass-tulip', 'glass-wine', 'glasses', 'globe-light', 'globe-model', 'gmail', 'gnome', 'go-kart', 'go-kart-track', 'gog', 'gold', 'golf', 'golf-cart', 'golf-tee', 'gondola', 'goodreads', 'google', 'google-ads', 'google-analytics', 'google-assistant', 'google-cardboard', 'google-chrome', 'google-circles', 'google-circles-communities', 'google-circles-extended', 'google-circles-group', 'google-classroom', 'google-cloud', 'google-controller', 'google-controller-off', 'google-downasaur', 'google-drive', 'google-earth', 'google-fit', 'google-glass', 'google-hangouts', 'google-home', 'google-keep', 'google-lens', 'google-maps', 'google-my-business', 'google-nearby', 'google-play', 'google-plus', 'google-podcast', 'google-spreadsheet', 'google-street-view', 'google-translate', 'gradient-horizontal', 'gradient-vertical', 'grain', 'graph', 'graph-outline', 'graphql', 'grass', 'grave-stone', 'grease-pencil', 'greater-than', 'greater-than-or-equal', 'greenhouse', 'grid', 'grid-large', 'grid-off', 'grill', 'grill-outline', 'group', 'guitar-acoustic', 'guitar-electric', 'guitar-pick', 'guitar-pick-outline', 'guy-fawkes-mask', 'hail', 'hair-dryer', 'hair-dryer-outline', 'halloween', 'hamburger', 'hamburger-check', 'hamburger-minus', 'hamburger-off', 'hamburger-plus', 'hamburger-remove', 'hammer', 'hammer-screwdriver', 'hammer-sickle', 'hammer-wrench', 'hand-back-left', 'hand-back-left-off', 'hand-back-left-off-outline', 'hand-back-left-outline', 'hand-back-right', 'hand-back-right-off', 'hand-back-right-off-outline', 'hand-back-right-outline', 'hand-clap', 'hand-coin', 'hand-coin-outline', 'hand-extended', 'hand-extended-outline', 'hand-front-left', 'hand-front-left-outline', 'hand-front-right', 'hand-front-right-outline', 'hand-heart', 'hand-heart-outline', 'hand-okay', 'hand-peace', 'hand-peace-variant', 'hand-pointing-down', 'hand-pointing-left', 'hand-pointing-right', 'hand-pointing-up', 'hand-saw', 'hand-wash', 'hand-wash-outline', 'hand-water', 'hand-wave', 'hand-wave-outline', 'handball', 'handcuffs', 'hands-pray', 'handshake', 'handshake-outline', 'hanger', 'hard-hat', 'harddisk', 'harddisk-plus', 'harddisk-remove', 'hat-fedora', 'hazard-lights', 'hdr', 'hdr-off', 'head', 'head-alert', 'head-alert-outline', 'head-check', 'head-check-outline', 'head-cog', 'head-cog-outline', 'head-dots-horizontal', 'head-dots-horizontal-outline', 'head-flash', 'head-flash-outline', 'head-heart', 'head-heart-outline', 'head-lightbulb', 'head-lightbulb-outline', 'head-minus', 'head-minus-outline', 'head-outline', 'head-plus', 'head-plus-outline', 'head-question', 'head-question-outline', 'head-remove', 'head-remove-outline', 'head-snowflake', 'head-snowflake-outline', 'head-sync', 'head-sync-outline', 'headphones', 'headphones-bluetooth', 'headphones-box', 'headphones-off', 'headphones-settings', 'headset', 'headset-dock', 'headset-off', 'heart', 'heart-box', 'heart-box-outline', 'heart-broken', 'heart-broken-outline', 'heart-circle', 'heart-circle-outline', 'heart-cog', 'heart-cog-outline', 'heart-flash', 'heart-half', 'heart-half-full', 'heart-half-outline', 'heart-minus', 'heart-minus-outline', 'heart-multiple', 'heart-multiple-outline', 'heart-off', 'heart-off-outline', 'heart-outline', 'heart-plus', 'heart-plus-outline', 'heart-pulse', 'heart-remove', 'heart-remove-outline', 'heart-settings', 'heart-settings-outline', 'helicopter', 'help', 'help-box', 'help-circle', 'help-circle-outline', 'help-network', 'help-network-outline', 'help-rhombus', 'help-rhombus-outline', 'hexadecimal', 'hexagon', 'hexagon-multiple', 'hexagon-multiple-outline', 'hexagon-outline', 'hexagon-slice-1', 'hexagon-slice-2', 'hexagon-slice-3', 'hexagon-slice-4', 'hexagon-slice-5', 'hexagon-slice-6', 'hexagram', 'hexagram-outline', 'high-definition', 'high-definition-box', 'highway', 'hiking', 'history', 'hockey-puck', 'hockey-sticks', 'hololens', 'home', 'home-account', 'home-alert', 'home-alert-outline', 'home-analytics', 'home-assistant', 'home-automation', 'home-battery', 'home-battery-outline', 'home-circle', 'home-circle-outline', 'home-city', 'home-city-outline', 'home-edit', 'home-edit-outline', 'home-export-outline', 'home-flood', 'home-floor-0', 'home-floor-1', 'home-floor-2', 'home-floor-3', 'home-floor-a', 'home-floor-b', 'home-floor-g', 'home-floor-l', 'home-floor-negative-1', 'home-group', 'home-group-minus', 'home-group-plus', 'home-group-remove', 'home-heart', 'home-import-outline', 'home-lightbulb', 'home-lightbulb-outline', 'home-lightning-bolt', 'home-lightning-bolt-outline', 'home-lock', 'home-lock-open', 'home-map-marker', 'home-minus', 'home-minus-outline', 'home-modern', 'home-outline', 'home-plus', 'home-plus-outline', 'home-remove', 'home-remove-outline', 'home-roof', 'home-search', 'home-search-outline', 'home-switch', 'home-switch-outline', 'home-thermometer', 'home-thermometer-outline', 'home-variant', 'home-variant-outline', 'hook', 'hook-off', 'hoop-house', 'hops', 'horizontal-rotate-clockwise', 'horizontal-rotate-counterclockwise', 'horse', 'horse-human', 'horse-variant', 'horse-variant-fast', 'horseshoe', 'hospital', 'hospital-box', 'hospital-box-outline', 'hospital-building', 'hospital-marker', 'hot-tub', 'hours-24', 'hubspot', 'hulu', 'human', 'human-baby-changing-table', 'human-cane', 'human-capacity-decrease', 'human-capacity-increase', 'human-child', 'human-dolly', 'human-edit', 'human-female', 'human-female-boy', 'human-female-dance', 'human-female-female', 'human-female-girl', 'human-greeting', 'human-greeting-proximity', 'human-greeting-variant', 'human-handsdown', 'human-handsup', 'human-male', 'human-male-board', 'human-male-board-poll', 'human-male-boy', 'human-male-child', 'human-male-female', 'human-male-female-child', 'human-male-girl', 'human-male-height', 'human-male-height-variant', 'human-male-male', 'human-non-binary', 'human-pregnant', 'human-queue', 'human-scooter', 'human-wheelchair', 'human-white-cane', 'humble-bundle', 'hvac', 'hvac-off', 'hydraulic-oil-level', 'hydraulic-oil-temperature', 'hydro-power', 'hydrogen-station', 'ice-cream', 'ice-cream-off', 'ice-pop', 'id-card', 'identifier', 'ideogram-cjk', 'ideogram-cjk-variant', 'image', 'image-album', 'image-area', 'image-area-close', 'image-auto-adjust', 'image-broken', 'image-broken-variant', 'image-edit', 'image-edit-outline', 'image-filter-black-white', 'image-filter-center-focus', 'image-filter-center-focus-strong', 'image-filter-center-focus-strong-outline', 'image-filter-center-focus-weak', 'image-filter-drama', 'image-filter-frames', 'image-filter-hdr', 'image-filter-none', 'image-filter-tilt-shift', 'image-filter-vintage', 'image-frame', 'image-marker', 'image-marker-outline', 'image-minus', 'image-move', 'image-multiple', 'image-multiple-outline', 'image-off', 'image-off-outline', 'image-outline', 'image-plus', 'image-remove', 'image-search', 'image-search-outline', 'image-size-select-actual', 'image-size-select-large', 'image-size-select-small', 'image-text', 'import', 'inbox', 'inbox-arrow-down', 'inbox-arrow-down-outline', 'inbox-arrow-up', 'inbox-arrow-up-outline', 'inbox-full', 'inbox-full-outline', 'inbox-multiple', 'inbox-multiple-outline', 'inbox-outline', 'inbox-remove', 'inbox-remove-outline', 'incognito', 'incognito-circle', 'incognito-circle-off', 'incognito-off', 'induction', 'infinity', 'information', 'information-off', 'information-off-outline', 'information-outline', 'information-variant', 'instagram', 'instrument-triangle', 'integrated-circuit-chip', 'invert-colors', 'invert-colors-off', 'iobroker', 'ip', 'ip-network', 'ip-network-outline', 'ip-outline', 'ipod', 'iron', 'iron-board', 'iron-outline', 'island', 'iv-bag', 'jabber', 'jeepney', 'jellyfish', 'jellyfish-outline', 'jira', 'jquery', 'jsfiddle', 'jump-rope', 'kabaddi', 'kangaroo', 'karate', 'kayaking', 'keg', 'kettle', 'kettle-alert', 'kettle-alert-outline', 'kettle-off', 'kettle-off-outline', 'kettle-outline', 'kettle-pour-over', 'kettle-steam', 'kettle-steam-outline', 'kettlebell', 'key', 'key-alert', 'key-alert-outline', 'key-arrow-right', 'key-chain', 'key-chain-variant', 'key-change', 'key-link', 'key-minus', 'key-outline', 'key-plus', 'key-remove', 'key-star', 'key-variant', 'key-wireless', 'keyboard', 'keyboard-backspace', 'keyboard-caps', 'keyboard-close', 'keyboard-esc', 'keyboard-f1', 'keyboard-f10', 'keyboard-f11', 'keyboard-f12', 'keyboard-f2', 'keyboard-f3', 'keyboard-f4', 'keyboard-f5', 'keyboard-f6', 'keyboard-f7', 'keyboard-f8', 'keyboard-f9', 'keyboard-off', 'keyboard-off-outline', 'keyboard-outline', 'keyboard-return', 'keyboard-settings', 'keyboard-settings-outline', 'keyboard-space', 'keyboard-tab', 'keyboard-tab-reverse', 'keyboard-variant', 'khanda', 'kickstarter', 'kite', 'kite-outline', 'kitesurfing', 'klingon', 'knife', 'knife-military', 'koala', 'kodi', 'kubernetes', 'label', 'label-multiple', 'label-multiple-outline', 'label-off', 'label-off-outline', 'label-outline', 'label-percent', 'label-percent-outline', 'label-variant', 'label-variant-outline', 'ladder', 'ladybug', 'lambda', 'lamp', 'lamp-outline', 'lamps', 'lamps-outline', 'lan', 'lan-check', 'lan-connect', 'lan-disconnect', 'lan-pending', 'language-c', 'language-cpp', 'language-csharp', 'language-css3', 'language-fortran', 'language-go', 'language-haskell', 'language-html5', 'language-java', 'language-javascript', 'language-kotlin', 'language-lua', 'language-markdown', 'language-markdown-outline', 'language-php', 'language-python', 'language-r', 'language-ruby', 'language-ruby-on-rails', 'language-rust', 'language-swift', 'language-typescript', 'language-xaml', 'laptop', 'laptop-off', 'laravel', 'laser-pointer', 'lasso', 'lastpass', 'latitude', 'launch', 'lava-lamp', 'layers', 'layers-edit', 'layers-minus', 'layers-off', 'layers-off-outline', 'layers-outline', 'layers-plus', 'layers-remove', 'layers-search', 'layers-search-outline', 'layers-triple', 'layers-triple-outline', 'lead-pencil', 'leaf', 'leaf-circle', 'leaf-circle-outline', 'leaf-maple', 'leaf-maple-off', 'leaf-off', 'leak', 'leak-off', 'led-off', 'led-on', 'led-outline', 'led-strip', 'led-strip-variant', 'led-variant-off', 'led-variant-on', 'led-variant-outline', 'leek', 'less-than', 'less-than-or-equal', 'library', 'library-shelves', 'license', 'lifebuoy', 'light-flood-down', 'light-flood-up', 'light-recessed', 'light-switch', 'lightbulb', 'lightbulb-auto', 'lightbulb-auto-outline', 'lightbulb-cfl', 'lightbulb-cfl-off', 'lightbulb-cfl-spiral', 'lightbulb-cfl-spiral-off', 'lightbulb-fluorescent-tube', 'lightbulb-fluorescent-tube-outline', 'lightbulb-group', 'lightbulb-group-off', 'lightbulb-group-off-outline', 'lightbulb-group-outline', 'lightbulb-multiple', 'lightbulb-multiple-off', 'lightbulb-multiple-off-outline', 'lightbulb-multiple-outline', 'lightbulb-off', 'lightbulb-off-outline', 'lightbulb-on', 'lightbulb-on-outline', 'lightbulb-outline', 'lightbulb-spot', 'lightbulb-spot-off', 'lightbulb-variant', 'lightbulb-variant-outline', 'lighthouse', 'lighthouse-on', 'lightning-bolt', 'lightning-bolt-circle', 'lightning-bolt-outline', 'line-scan', 'lingerie', 'link', 'link-box', 'link-box-outline', 'link-box-variant', 'link-box-variant-outline', 'link-lock', 'link-off', 'link-plus', 'link-variant', 'link-variant-minus', 'link-variant-off', 'link-variant-plus', 'link-variant-remove', 'linkedin', 'linux', 'linux-mint', 'lipstick', 'liquid-spot', 'liquor', 'list-status', 'litecoin', 'loading', 'location-enter', 'location-exit', 'lock', 'lock-alert', 'lock-alert-outline', 'lock-check', 'lock-check-outline', 'lock-clock', 'lock-minus', 'lock-minus-outline', 'lock-off', 'lock-off-outline', 'lock-open', 'lock-open-alert', 'lock-open-alert-outline', 'lock-open-check', 'lock-open-check-outline', 'lock-open-minus', 'lock-open-minus-outline', 'lock-open-outline', 'lock-open-plus', 'lock-open-plus-outline', 'lock-open-remove', 'lock-open-remove-outline', 'lock-open-variant', 'lock-open-variant-outline', 'lock-outline', 'lock-pattern', 'lock-plus', 'lock-plus-outline', 'lock-question', 'lock-remove', 'lock-remove-outline', 'lock-reset', 'lock-smart', 'locker', 'locker-multiple', 'login', 'login-variant', 'logout', 'logout-variant', 'longitude', 'looks', 'lotion', 'lotion-outline', 'lotion-plus', 'lotion-plus-outline', 'loupe', 'lumx', 'lungs', 'mace', 'magazine-pistol', 'magazine-rifle', 'magic-staff', 'magnet', 'magnet-on', 'magnify', 'magnify-close', 'magnify-expand', 'magnify-minus', 'magnify-minus-cursor', 'magnify-minus-outline', 'magnify-plus', 'magnify-plus-cursor', 'magnify-plus-outline', 'magnify-remove-cursor', 'magnify-remove-outline', 'magnify-scan', 'mail', 'mailbox', 'mailbox-open', 'mailbox-open-outline', 'mailbox-open-up', 'mailbox-open-up-outline', 'mailbox-outline', 'mailbox-up', 'mailbox-up-outline', 'manjaro', 'map', 'map-check', 'map-check-outline', 'map-clock', 'map-clock-outline', 'map-legend', 'map-marker', 'map-marker-account', 'map-marker-account-outline', 'map-marker-alert', 'map-marker-alert-outline', 'map-marker-check', 'map-marker-check-outline', 'map-marker-circle', 'map-marker-distance', 'map-marker-down', 'map-marker-left', 'map-marker-left-outline', 'map-marker-minus', 'map-marker-minus-outline', 'map-marker-multiple', 'map-marker-multiple-outline', 'map-marker-off', 'map-marker-off-outline', 'map-marker-outline', 'map-marker-path', 'map-marker-plus', 'map-marker-plus-outline', 'map-marker-question', 'map-marker-question-outline', 'map-marker-radius', 'map-marker-radius-outline', 'map-marker-remove', 'map-marker-remove-outline', 'map-marker-remove-variant', 'map-marker-right', 'map-marker-right-outline', 'map-marker-star', 'map-marker-star-outline', 'map-marker-up', 'map-minus', 'map-outline', 'map-plus', 'map-search', 'map-search-outline', 'mapbox', 'margin', 'marker', 'marker-cancel', 'marker-check', 'mastodon', 'material-design', 'material-ui', 'math-compass', 'math-cos', 'math-integral', 'math-integral-box', 'math-log', 'math-norm', 'math-norm-box', 'math-sin', 'math-tan', 'matrix', 'medal', 'medal-outline', 'medical-bag', 'meditation', 'memory', 'menorah', 'menorah-fire', 'menu', 'menu-down', 'menu-down-outline', 'menu-left', 'menu-left-outline', 'menu-open', 'menu-right', 'menu-right-outline', 'menu-swap', 'menu-swap-outline', 'menu-up', 'menu-up-outline', 'merge', 'message', 'message-alert', 'message-alert-outline', 'message-arrow-left', 'message-arrow-left-outline', 'message-arrow-right', 'message-arrow-right-outline', 'message-badge', 'message-badge-outline', 'message-bookmark', 'message-bookmark-outline', 'message-bulleted', 'message-bulleted-off', 'message-cog', 'message-cog-outline', 'message-draw', 'message-flash', 'message-flash-outline', 'message-image', 'message-image-outline', 'message-lock', 'message-lock-outline', 'message-minus', 'message-minus-outline', 'message-off', 'message-off-outline', 'message-outline', 'message-plus', 'message-plus-outline', 'message-processing', 'message-processing-outline', 'message-question', 'message-question-outline', 'message-reply', 'message-reply-outline', 'message-reply-text', 'message-reply-text-outline', 'message-settings', 'message-settings-outline', 'message-star', 'message-star-outline', 'message-text', 'message-text-clock', 'message-text-clock-outline', 'message-text-lock', 'message-text-lock-outline', 'message-text-outline', 'message-video', 'meteor', 'metronome', 'metronome-tick', 'micro-sd', 'microphone', 'microphone-minus', 'microphone-off', 'microphone-outline', 'microphone-plus', 'microphone-question', 'microphone-question-outline', 'microphone-settings', 'microphone-variant', 'microphone-variant-off', 'microscope', 'microsoft', 'microsoft-access', 'microsoft-azure', 'microsoft-azure-devops', 'microsoft-bing', 'microsoft-dynamics-365', 'microsoft-edge', 'microsoft-excel', 'microsoft-internet-explorer', 'microsoft-office', 'microsoft-onedrive', 'microsoft-onenote', 'microsoft-outlook', 'microsoft-powerpoint', 'microsoft-sharepoint', 'microsoft-teams', 'microsoft-visual-studio', 'microsoft-visual-studio-code', 'microsoft-windows', 'microsoft-windows-classic', 'microsoft-word', 'microsoft-xbox', 'microsoft-xbox-controller', 'microsoft-xbox-controller-battery-alert', 'microsoft-xbox-controller-battery-charging', 'microsoft-xbox-controller-battery-empty', 'microsoft-xbox-controller-battery-full', 'microsoft-xbox-controller-battery-low', 'microsoft-xbox-controller-battery-medium', 'microsoft-xbox-controller-battery-unknown', 'microsoft-xbox-controller-menu', 'microsoft-xbox-controller-off', 'microsoft-xbox-controller-view', 'microwave', 'microwave-off', 'middleware', 'middleware-outline', 'midi', 'midi-port', 'mine', 'minecraft', 'mini-sd', 'minidisc', 'minus', 'minus-box', 'minus-box-multiple', 'minus-box-multiple-outline', 'minus-box-outline', 'minus-circle', 'minus-circle-multiple', 'minus-circle-multiple-outline', 'minus-circle-off', 'minus-circle-off-outline', 'minus-circle-outline', 'minus-network', 'minus-network-outline', 'minus-thick', 'mirror', 'mirror-rectangle', 'mirror-variant', 'mixed-martial-arts', 'mixed-reality', 'molecule', 'molecule-co', 'molecule-co2', 'monitor', 'monitor-cellphone', 'monitor-cellphone-star', 'monitor-dashboard', 'monitor-edit', 'monitor-eye', 'monitor-lock', 'monitor-multiple', 'monitor-off', 'monitor-screenshot', 'monitor-share', 'monitor-shimmer', 'monitor-small', 'monitor-speaker', 'monitor-speaker-off', 'monitor-star', 'moon-first-quarter', 'moon-full', 'moon-last-quarter', 'moon-new', 'moon-waning-crescent', 'moon-waning-gibbous', 'moon-waxing-crescent', 'moon-waxing-gibbous', 'moped', 'moped-electric', 'moped-electric-outline', 'moped-outline', 'more', 'mortar-pestle', 'mortar-pestle-plus', 'mosque', 'mother-heart', 'mother-nurse', 'motion', 'motion-outline', 'motion-pause', 'motion-pause-outline', 'motion-play', 'motion-play-outline', 'motion-sensor', 'motion-sensor-off', 'motorbike', 'motorbike-electric', 'mouse', 'mouse-bluetooth', 'mouse-move-down', 'mouse-move-up', 'mouse-move-vertical', 'mouse-off', 'mouse-variant', 'mouse-variant-off', 'move-resize', 'move-resize-variant', 'movie', 'movie-check', 'movie-check-outline', 'movie-cog', 'movie-cog-outline', 'movie-edit', 'movie-edit-outline', 'movie-filter', 'movie-filter-outline', 'movie-minus', 'movie-minus-outline', 'movie-off', 'movie-off-outline', 'movie-open', 'movie-open-check', 'movie-open-check-outline', 'movie-open-cog', 'movie-open-cog-outline', 'movie-open-edit', 'movie-open-edit-outline', 'movie-open-minus', 'movie-open-minus-outline', 'movie-open-off', 'movie-open-off-outline', 'movie-open-outline', 'movie-open-play', 'movie-open-play-outline', 'movie-open-plus', 'movie-open-plus-outline', 'movie-open-remove', 'movie-open-remove-outline', 'movie-open-settings', 'movie-open-settings-outline', 'movie-open-star', 'movie-open-star-outline', 'movie-outline', 'movie-play', 'movie-play-outline', 'movie-plus', 'movie-plus-outline', 'movie-remove', 'movie-remove-outline', 'movie-roll', 'movie-search', 'movie-search-outline', 'movie-settings', 'movie-settings-outline', 'movie-star', 'movie-star-outline', 'mower', 'mower-bag', 'muffin', 'multicast', 'multiplication', 'multiplication-box', 'mushroom', 'mushroom-off', 'mushroom-off-outline', 'mushroom-outline', 'music', 'music-accidental-double-flat', 'music-accidental-double-sharp', 'music-accidental-flat', 'music-accidental-natural', 'music-accidental-sharp', 'music-box', 'music-box-multiple', 'music-box-multiple-outline', 'music-box-outline', 'music-circle', 'music-circle-outline', 'music-clef-alto', 'music-clef-bass', 'music-clef-treble', 'music-note', 'music-note-bluetooth', 'music-note-bluetooth-off', 'music-note-eighth', 'music-note-eighth-dotted', 'music-note-half', 'music-note-half-dotted', 'music-note-off', 'music-note-off-outline', 'music-note-outline', 'music-note-plus', 'music-note-quarter', 'music-note-quarter-dotted', 'music-note-sixteenth', 'music-note-sixteenth-dotted', 'music-note-whole', 'music-note-whole-dotted', 'music-off', 'music-rest-eighth', 'music-rest-half', 'music-rest-quarter', 'music-rest-sixteenth', 'music-rest-whole', 'mustache', 'nail', 'nas', 'nativescript', 'nature', 'nature-people', 'navigation', 'navigation-outline', 'navigation-variant', 'navigation-variant-outline', 'near-me', 'necklace', 'needle', 'netflix', 'network', 'network-off', 'network-off-outline', 'network-outline', 'network-strength-1', 'network-strength-1-alert', 'network-strength-2', 'network-strength-2-alert', 'network-strength-3', 'network-strength-3-alert', 'network-strength-4', 'network-strength-4-alert', 'network-strength-4-cog', 'network-strength-off', 'network-strength-off-outline', 'network-strength-outline', 'new-box', 'newspaper', 'newspaper-check', 'newspaper-minus', 'newspaper-plus', 'newspaper-remove', 'newspaper-variant', 'newspaper-variant-multiple', 'newspaper-variant-multiple-outline', 'newspaper-variant-outline', 'nfc', 'nfc-search-variant', 'nfc-tap', 'nfc-variant', 'nfc-variant-off', 'ninja', 'nintendo-game-boy', 'nintendo-switch', 'nintendo-wii', 'nintendo-wiiu', 'nix', 'nodejs', 'noodles', 'not-equal', 'not-equal-variant', 'note', 'note-alert', 'note-alert-outline', 'note-check', 'note-check-outline', 'note-edit', 'note-edit-outline', 'note-minus', 'note-minus-outline', 'note-multiple', 'note-multiple-outline', 'note-off', 'note-off-outline', 'note-outline', 'note-plus', 'note-plus-outline', 'note-remove', 'note-remove-outline', 'note-search', 'note-search-outline', 'note-text', 'note-text-outline', 'notebook', 'notebook-check', 'notebook-check-outline', 'notebook-edit', 'notebook-edit-outline', 'notebook-minus', 'notebook-minus-outline', 'notebook-multiple', 'notebook-outline', 'notebook-plus', 'notebook-plus-outline', 'notebook-remove', 'notebook-remove-outline', 'notification-clear-all', 'npm', 'nuke', 'null', 'numeric', 'numeric-0', 'numeric-0-box', 'numeric-0-box-multiple', 'numeric-0-box-multiple-outline', 'numeric-0-box-outline', 'numeric-0-circle', 'numeric-0-circle-outline', 'numeric-1', 'numeric-1-box', 'numeric-1-box-multiple', 'numeric-1-box-multiple-outline', 'numeric-1-box-outline', 'numeric-1-circle', 'numeric-1-circle-outline', 'numeric-10', 'numeric-10-box', 'numeric-10-box-multiple', 'numeric-10-box-multiple-outline', 'numeric-10-box-outline', 'numeric-10-circle', 'numeric-10-circle-outline', 'numeric-2', 'numeric-2-box', 'numeric-2-box-multiple', 'numeric-2-box-multiple-outline', 'numeric-2-box-outline', 'numeric-2-circle', 'numeric-2-circle-outline', 'numeric-3', 'numeric-3-box', 'numeric-3-box-multiple', 'numeric-3-box-multiple-outline', 'numeric-3-box-outline', 'numeric-3-circle', 'numeric-3-circle-outline', 'numeric-4', 'numeric-4-box', 'numeric-4-box-multiple', 'numeric-4-box-multiple-outline', 'numeric-4-box-outline', 'numeric-4-circle', 'numeric-4-circle-outline', 'numeric-5', 'numeric-5-box', 'numeric-5-box-multiple', 'numeric-5-box-multiple-outline', 'numeric-5-box-outline', 'numeric-5-circle', 'numeric-5-circle-outline', 'numeric-6', 'numeric-6-box', 'numeric-6-box-multiple', 'numeric-6-box-multiple-outline', 'numeric-6-box-outline', 'numeric-6-circle', 'numeric-6-circle-outline', 'numeric-7', 'numeric-7-box', 'numeric-7-box-multiple', 'numeric-7-box-multiple-outline', 'numeric-7-box-outline', 'numeric-7-circle', 'numeric-7-circle-outline', 'numeric-8', 'numeric-8-box', 'numeric-8-box-multiple', 'numeric-8-box-multiple-outline', 'numeric-8-box-outline', 'numeric-8-circle', 'numeric-8-circle-outline', 'numeric-9', 'numeric-9-box', 'numeric-9-box-multiple', 'numeric-9-box-multiple-outline', 'numeric-9-box-outline', 'numeric-9-circle', 'numeric-9-circle-outline', 'numeric-9-plus', 'numeric-9-plus-box', 'numeric-9-plus-box-multiple', 'numeric-9-plus-box-multiple-outline', 'numeric-9-plus-box-outline', 'numeric-9-plus-circle', 'numeric-9-plus-circle-outline', 'numeric-negative-1', 'numeric-positive-1', 'nut', 'nutrition', 'nuxt', 'oar', 'ocarina', 'oci', 'ocr', 'octagon', 'octagon-outline', 'octagram', 'octagram-outline', 'octahedron', 'octahedron-off', 'odnoklassniki', 'offer', 'office-building', 'office-building-cog', 'office-building-cog-outline', 'office-building-marker', 'office-building-marker-outline', 'office-building-outline', 'oil', 'oil-lamp', 'oil-level', 'oil-temperature', 'om', 'omega', 'one-up', 'onepassword', 'opacity', 'open-in-app', 'open-in-new', 'open-source-initiative', 'openid', 'opera', 'orbit', 'orbit-variant', 'order-alphabetical-ascending', 'order-alphabetical-descending', 'order-bool-ascending', 'order-bool-ascending-variant', 'order-bool-descending', 'order-bool-descending-variant', 'order-numeric-ascending', 'order-numeric-descending', 'origin', 'ornament', 'ornament-variant', 'outdoor-lamp', 'overscan', 'owl', 'pac-man', 'package', 'package-down', 'package-up', 'package-variant', 'package-variant-closed', 'page-first', 'page-last', 'page-layout-body', 'page-layout-footer', 'page-layout-header', 'page-layout-header-footer', 'page-layout-sidebar-left', 'page-layout-sidebar-right', 'page-next', 'page-next-outline', 'page-previous', 'page-previous-outline', 'pail', 'pail-minus', 'pail-minus-outline', 'pail-off', 'pail-off-outline', 'pail-outline', 'pail-plus', 'pail-plus-outline', 'pail-remove', 'pail-remove-outline', 'palette', 'palette-advanced', 'palette-outline', 'palette-swatch', 'palette-swatch-outline', 'palette-swatch-variant', 'palm-tree', 'pan', 'pan-bottom-left', 'pan-bottom-right', 'pan-down', 'pan-horizontal', 'pan-left', 'pan-right', 'pan-top-left', 'pan-top-right', 'pan-up', 'pan-vertical', 'panda', 'pandora', 'panorama', 'panorama-fisheye', 'panorama-horizontal', 'panorama-horizontal-outline', 'panorama-outline', 'panorama-sphere', 'panorama-sphere-outline', 'panorama-variant', 'panorama-variant-outline', 'panorama-vertical', 'panorama-vertical-outline', 'panorama-wide-angle', 'panorama-wide-angle-outline', 'paper-cut-vertical', 'paper-roll', 'paper-roll-outline', 'paperclip', 'parachute', 'parachute-outline', 'paragliding', 'parking', 'party-popper', 'passport', 'passport-biometric', 'pasta', 'patio-heater', 'patreon', 'pause', 'pause-circle', 'pause-circle-outline', 'pause-octagon', 'pause-octagon-outline', 'paw', 'paw-off', 'paw-off-outline', 'paw-outline', 'peace', 'peanut', 'peanut-off', 'peanut-off-outline', 'peanut-outline', 'pen', 'pen-lock', 'pen-minus', 'pen-off', 'pen-plus', 'pen-remove', 'pencil', 'pencil-box', 'pencil-box-multiple', 'pencil-box-multiple-outline', 'pencil-box-outline', 'pencil-circle', 'pencil-circle-outline', 'pencil-lock', 'pencil-lock-outline', 'pencil-minus', 'pencil-minus-outline', 'pencil-off', 'pencil-off-outline', 'pencil-outline', 'pencil-plus', 'pencil-plus-outline', 'pencil-remove', 'pencil-remove-outline', 'pencil-ruler', 'penguin', 'pentagon', 'pentagon-outline', 'pentagram', 'percent', 'percent-outline', 'periodic-table', 'perspective-less', 'perspective-more', 'ph', 'phone', 'phone-alert', 'phone-alert-outline', 'phone-bluetooth', 'phone-bluetooth-outline', 'phone-cancel', 'phone-cancel-outline', 'phone-check', 'phone-check-outline', 'phone-classic', 'phone-classic-off', 'phone-dial', 'phone-dial-outline', 'phone-forward', 'phone-forward-outline', 'phone-hangup', 'phone-hangup-outline', 'phone-in-talk', 'phone-in-talk-outline', 'phone-incoming', 'phone-incoming-outline', 'phone-lock', 'phone-lock-outline', 'phone-log', 'phone-log-outline', 'phone-message', 'phone-message-outline', 'phone-minus', 'phone-minus-outline', 'phone-missed', 'phone-missed-outline', 'phone-off', 'phone-off-outline', 'phone-outgoing', 'phone-outgoing-outline', 'phone-outline', 'phone-paused', 'phone-paused-outline', 'phone-plus', 'phone-plus-outline', 'phone-refresh', 'phone-refresh-outline', 'phone-remove', 'phone-remove-outline', 'phone-return', 'phone-return-outline', 'phone-ring', 'phone-ring-outline', 'phone-rotate-landscape', 'phone-rotate-portrait', 'phone-settings', 'phone-settings-outline', 'phone-sync', 'phone-sync-outline', 'phone-voip', 'pi', 'pi-box', 'pi-hole', 'piano', 'piano-off', 'pickaxe', 'picture-in-picture-bottom-right', 'picture-in-picture-bottom-right-outline', 'picture-in-picture-top-right', 'picture-in-picture-top-right-outline', 'pier', 'pier-crane', 'pig', 'pig-variant', 'pig-variant-outline', 'piggy-bank', 'piggy-bank-outline', 'pill', 'pillar', 'pin', 'pin-off', 'pin-off-outline', 'pin-outline', 'pine-tree', 'pine-tree-box', 'pine-tree-fire', 'pinterest', 'pinwheel', 'pinwheel-outline', 'pipe', 'pipe-disconnected', 'pipe-leak', 'pipe-valve', 'pipe-wrench', 'pirate', 'pistol', 'piston', 'pitchfork', 'pizza', 'play', 'play-box', 'play-box-multiple', 'play-box-multiple-outline', 'play-box-outline', 'play-circle', 'play-circle-outline', 'play-network', 'play-network-outline', 'play-outline', 'play-pause', 'play-protected-content', 'play-speed', 'playlist-check', 'playlist-edit', 'playlist-minus', 'playlist-music', 'playlist-music-outline', 'playlist-play', 'playlist-plus', 'playlist-remove', 'playlist-star', 'plex', 'pliers', 'plus', 'plus-box', 'plus-box-multiple', 'plus-box-multiple-outline', 'plus-box-outline', 'plus-circle', 'plus-circle-multiple', 'plus-circle-multiple-outline', 'plus-circle-outline', 'plus-minus', 'plus-minus-box', 'plus-minus-variant', 'plus-network', 'plus-network-outline', 'plus-outline', 'plus-thick', 'podcast', 'podium', 'podium-bronze', 'podium-gold', 'podium-silver', 'point-of-sale', 'pokeball', 'pokemon-go', 'poker-chip', 'polaroid', 'police-badge', 'police-badge-outline', 'police-station', 'poll', 'polo', 'polymer', 'pool', 'popcorn', 'post', 'post-outline', 'postage-stamp', 'pot', 'pot-mix', 'pot-mix-outline', 'pot-outline', 'pot-steam', 'pot-steam-outline', 'pound', 'pound-box', 'pound-box-outline', 'power', 'power-cycle', 'power-off', 'power-on', 'power-plug', 'power-plug-off', 'power-plug-off-outline', 'power-plug-outline', 'power-settings', 'power-sleep', 'power-socket', 'power-socket-au', 'power-socket-ch', 'power-socket-de', 'power-socket-eu', 'power-socket-fr', 'power-socket-it', 'power-socket-jp', 'power-socket-uk', 'power-socket-us', 'power-standby', 'powershell', 'prescription', 'presentation', 'presentation-play', 'pretzel', 'printer', 'printer-3d', 'printer-3d-nozzle', 'printer-3d-nozzle-alert', 'printer-3d-nozzle-alert-outline', 'printer-3d-nozzle-heat', 'printer-3d-nozzle-heat-outline', 'printer-3d-nozzle-outline', 'printer-alert', 'printer-check', 'printer-eye', 'printer-off', 'printer-off-outline', 'printer-outline', 'printer-pos', 'printer-search', 'printer-settings', 'printer-wireless', 'priority-high', 'priority-low', 'professional-hexagon', 'progress-alert', 'progress-check', 'progress-clock', 'progress-close', 'progress-download', 'progress-pencil', 'progress-question', 'progress-star', 'progress-upload', 'progress-wrench', 'projector', 'projector-screen', 'projector-screen-off', 'projector-screen-off-outline', 'projector-screen-outline', 'projector-screen-variant', 'projector-screen-variant-off', 'projector-screen-variant-off-outline', 'projector-screen-variant-outline', 'propane-tank', 'propane-tank-outline', 'protocol', 'publish', 'publish-off', 'pulse', 'pump', 'pumpkin', 'purse', 'purse-outline', 'puzzle', 'puzzle-check', 'puzzle-check-outline', 'puzzle-edit', 'puzzle-edit-outline', 'puzzle-heart', 'puzzle-heart-outline', 'puzzle-minus', 'puzzle-minus-outline', 'puzzle-outline', 'puzzle-plus', 'puzzle-plus-outline', 'puzzle-remove', 'puzzle-remove-outline', 'puzzle-star', 'puzzle-star-outline', 'pyramid', 'pyramid-off', 'qi', 'qqchat', 'qrcode', 'qrcode-edit', 'qrcode-minus', 'qrcode-plus', 'qrcode-remove', 'qrcode-scan', 'quadcopter', 'quality-high', 'quality-low', 'quality-medium', 'quora', 'rabbit', 'racing-helmet', 'racquetball', 'radar', 'radiator', 'radiator-disabled', 'radiator-off', 'radio', 'radio-am', 'radio-fm', 'radio-handheld', 'radio-off', 'radio-tower', 'radioactive', 'radioactive-circle', 'radioactive-circle-outline', 'radioactive-off', 'radiobox-blank', 'radiobox-marked', 'radiology-box', 'radiology-box-outline', 'radius', 'radius-outline', 'railroad-light', 'rake', 'raspberry-pi', 'ray-end', 'ray-end-arrow', 'ray-start', 'ray-start-arrow', 'ray-start-end', 'ray-start-vertex-end', 'ray-vertex', 'razor-double-edge', 'razor-single-edge', 'react', 'read', 'receipt', 'record', 'record-circle', 'record-circle-outline', 'record-player', 'record-rec', 'rectangle', 'rectangle-outline', 'recycle', 'recycle-variant', 'reddit', 'redhat', 'redo', 'redo-variant', 'reflect-horizontal', 'reflect-vertical', 'refresh', 'refresh-auto', 'refresh-circle', 'regex', 'registered-trademark', 'reiterate', 'relation-many-to-many', 'relation-many-to-one', 'relation-many-to-one-or-many', 'relation-many-to-only-one', 'relation-many-to-zero-or-many', 'relation-many-to-zero-or-one', 'relation-one-or-many-to-many', 'relation-one-or-many-to-one', 'relation-one-or-many-to-one-or-many', 'relation-one-or-many-to-only-one', 'relation-one-or-many-to-zero-or-many', 'relation-one-or-many-to-zero-or-one', 'relation-one-to-many', 'relation-one-to-one', 'relation-one-to-one-or-many', 'relation-one-to-only-one', 'relation-one-to-zero-or-many', 'relation-one-to-zero-or-one', 'relation-only-one-to-many', 'relation-only-one-to-one', 'relation-only-one-to-one-or-many', 'relation-only-one-to-only-one', 'relation-only-one-to-zero-or-many', 'relation-only-one-to-zero-or-one', 'relation-zero-or-many-to-many', 'relation-zero-or-many-to-one', 'relation-zero-or-many-to-one-or-many', 'relation-zero-or-many-to-only-one', 'relation-zero-or-many-to-zero-or-many', 'relation-zero-or-many-to-zero-or-one', 'relation-zero-or-one-to-many', 'relation-zero-or-one-to-one', 'relation-zero-or-one-to-one-or-many', 'relation-zero-or-one-to-only-one', 'relation-zero-or-one-to-zero-or-many', 'relation-zero-or-one-to-zero-or-one', 'relative-scale', 'reload', 'reload-alert', 'reminder', 'remote', 'remote-desktop', 'remote-off', 'remote-tv', 'remote-tv-off', 'rename-box', 'reorder-horizontal', 'reorder-vertical', 'repeat', 'repeat-off', 'repeat-once', 'repeat-variant', 'replay', 'reply', 'reply-all', 'reply-all-outline', 'reply-circle', 'reply-outline', 'reproduction', 'resistor', 'resistor-nodes', 'resize', 'resize-bottom-right', 'responsive', 'restart', 'restart-alert', 'restart-off', 'restore', 'restore-alert', 'rewind', 'rewind-10', 'rewind-15', 'rewind-30', 'rewind-5', 'rewind-60', 'rewind-outline', 'rhombus', 'rhombus-medium', 'rhombus-medium-outline', 'rhombus-outline', 'rhombus-split', 'rhombus-split-outline', 'ribbon', 'rice', 'rickshaw', 'rickshaw-electric', 'ring', 'rivet', 'road', 'road-variant', 'robber', 'robot', 'robot-angry', 'robot-angry-outline', 'robot-confused', 'robot-confused-outline', 'robot-dead', 'robot-dead-outline', 'robot-excited', 'robot-excited-outline', 'robot-happy', 'robot-happy-outline', 'robot-industrial', 'robot-love', 'robot-love-outline', 'robot-mower', 'robot-mower-outline', 'robot-off', 'robot-off-outline', 'robot-outline', 'robot-vacuum', 'robot-vacuum-variant', 'rocket', 'rocket-launch', 'rocket-launch-outline', 'rocket-outline', 'rodent', 'roller-skate', 'roller-skate-off', 'rollerblade', 'rollerblade-off', 'rollupjs', 'roman-numeral-1', 'roman-numeral-10', 'roman-numeral-2', 'roman-numeral-3', 'roman-numeral-4', 'roman-numeral-5', 'roman-numeral-6', 'roman-numeral-7', 'roman-numeral-8', 'roman-numeral-9', 'room-service', 'room-service-outline', 'rotate-360', 'rotate-3d', 'rotate-3d-variant', 'rotate-left', 'rotate-left-variant', 'rotate-orbit', 'rotate-right', 'rotate-right-variant', 'rounded-corner', 'router', 'router-network', 'router-wireless', 'router-wireless-off', 'router-wireless-settings', 'routes', 'routes-clock', 'rowing', 'rss', 'rss-box', 'rss-off', 'rug', 'rugby', 'ruler', 'ruler-square', 'ruler-square-compass', 'run', 'run-fast', 'rv-truck', 'sack', 'sack-percent', 'safe', 'safe-square', 'safe-square-outline', 'safety-goggles', 'sail-boat', 'sale', 'salesforce', 'sass', 'satellite', 'satellite-uplink', 'satellite-variant', 'sausage', 'sausage-off', 'saw-blade', 'sawtooth-wave', 'saxophone', 'scale', 'scale-balance', 'scale-bathroom', 'scale-off', 'scale-unbalanced', 'scan-helper', 'scanner', 'scanner-off', 'scatter-plot', 'scatter-plot-outline', 'scent', 'scent-off', 'school', 'school-outline', 'scissors-cutting', 'scooter', 'scooter-electric', 'scoreboard', 'scoreboard-outline', 'screen-rotation', 'screen-rotation-lock', 'screw-flat-top', 'screw-lag', 'screw-machine-flat-top', 'screw-machine-round-top', 'screw-round-top', 'screwdriver', 'script', 'script-outline', 'script-text', 'script-text-key', 'script-text-key-outline', 'script-text-outline', 'script-text-play', 'script-text-play-outline', 'sd', 'seal', 'seal-variant', 'search-web', 'seat', 'seat-flat', 'seat-flat-angled', 'seat-individual-suite', 'seat-legroom-extra', 'seat-legroom-normal', 'seat-legroom-reduced', 'seat-outline', 'seat-passenger', 'seat-recline-extra', 'seat-recline-normal', 'seatbelt', 'security', 'security-network', 'seed', 'seed-off', 'seed-off-outline', 'seed-outline', 'seesaw', 'segment', 'select', 'select-all', 'select-color', 'select-compare', 'select-drag', 'select-group', 'select-inverse', 'select-marker', 'select-multiple', 'select-multiple-marker', 'select-off', 'select-place', 'select-remove', 'select-search', 'selection', 'selection-drag', 'selection-ellipse', 'selection-ellipse-arrow-inside', 'selection-ellipse-remove', 'selection-marker', 'selection-multiple', 'selection-multiple-marker', 'selection-off', 'selection-remove', 'selection-search', 'semantic-web', 'send', 'send-check', 'send-check-outline', 'send-circle', 'send-circle-outline', 'send-clock', 'send-clock-outline', 'send-lock', 'send-lock-outline', 'send-outline', 'serial-port', 'server', 'server-minus', 'server-network', 'server-network-off', 'server-off', 'server-plus', 'server-remove', 'server-security', 'set-all', 'set-center', 'set-center-right', 'set-left', 'set-left-center', 'set-left-right', 'set-merge', 'set-none', 'set-right', 'set-split', 'set-square', 'set-top-box', 'settings-helper', 'shaker', 'shaker-outline', 'shape', 'shape-circle-plus', 'shape-outline', 'shape-oval-plus', 'shape-plus', 'shape-polygon-plus', 'shape-rectangle-plus', 'shape-square-plus', 'shape-square-rounded-plus', 'share', 'share-all', 'share-all-outline', 'share-circle', 'share-off', 'share-off-outline', 'share-outline', 'share-variant', 'share-variant-outline', 'shark', 'shark-fin', 'shark-fin-outline', 'shark-off', 'sheep', 'shield', 'shield-account', 'shield-account-outline', 'shield-account-variant', 'shield-account-variant-outline', 'shield-airplane', 'shield-airplane-outline', 'shield-alert', 'shield-alert-outline', 'shield-bug', 'shield-bug-outline', 'shield-car', 'shield-check', 'shield-check-outline', 'shield-cross', 'shield-cross-outline', 'shield-crown', 'shield-crown-outline', 'shield-edit', 'shield-edit-outline', 'shield-half', 'shield-half-full', 'shield-home', 'shield-home-outline', 'shield-key', 'shield-key-outline', 'shield-link-variant', 'shield-link-variant-outline', 'shield-lock', 'shield-lock-open', 'shield-lock-open-outline', 'shield-lock-outline', 'shield-moon', 'shield-moon-outline', 'shield-off', 'shield-off-outline', 'shield-outline', 'shield-plus', 'shield-plus-outline', 'shield-refresh', 'shield-refresh-outline', 'shield-remove', 'shield-remove-outline', 'shield-search', 'shield-star', 'shield-star-outline', 'shield-sun', 'shield-sun-outline', 'shield-sword', 'shield-sword-outline', 'shield-sync', 'shield-sync-outline', 'shimmer', 'ship-wheel', 'shipping-pallet', 'shoe-ballet', 'shoe-cleat', 'shoe-formal', 'shoe-heel', 'shoe-print', 'shoe-sneaker', 'shopping', 'shopping-music', 'shopping-outline', 'shopping-search', 'shore', 'shovel', 'shovel-off', 'shower', 'shower-head', 'shredder', 'shuffle', 'shuffle-disabled', 'shuffle-variant', 'shuriken', 'sickle', 'sigma', 'sigma-lower', 'sign-caution', 'sign-direction', 'sign-direction-minus', 'sign-direction-plus', 'sign-direction-remove', 'sign-pole', 'sign-real-estate', 'sign-text', 'signal', 'signal-2g', 'signal-3g', 'signal-4g', 'signal-5g', 'signal-cellular-1', 'signal-cellular-2', 'signal-cellular-3', 'signal-cellular-outline', 'signal-distance-variant', 'signal-hspa', 'signal-hspa-plus', 'signal-off', 'signal-variant', 'signature', 'signature-freehand', 'signature-image', 'signature-text', 'silo', 'silverware', 'silverware-clean', 'silverware-fork', 'silverware-fork-knife', 'silverware-spoon', 'silverware-variant', 'sim', 'sim-alert', 'sim-alert-outline', 'sim-off', 'sim-off-outline', 'sim-outline', 'simple-icons', 'sina-weibo', 'sine-wave', 'sitemap', 'sitemap-outline', 'size-l', 'size-m', 'size-s', 'size-xl', 'size-xs', 'size-xxl', 'size-xxs', 'size-xxxl', 'skate', 'skate-off', 'skateboard', 'skateboarding', 'skew-less', 'skew-more', 'ski', 'ski-cross-country', 'ski-water', 'skip-backward', 'skip-backward-outline', 'skip-forward', 'skip-forward-outline', 'skip-next', 'skip-next-circle', 'skip-next-circle-outline', 'skip-next-outline', 'skip-previous', 'skip-previous-circle', 'skip-previous-circle-outline', 'skip-previous-outline', 'skull', 'skull-crossbones', 'skull-crossbones-outline', 'skull-outline', 'skull-scan', 'skull-scan-outline', 'skype', 'skype-business', 'slack', 'slash-forward', 'slash-forward-box', 'sledding', 'sleep', 'sleep-off', 'slide', 'slope-downhill', 'slope-uphill', 'slot-machine', 'slot-machine-outline', 'smart-card', 'smart-card-off', 'smart-card-off-outline', 'smart-card-outline', 'smart-card-reader', 'smart-card-reader-outline', 'smog', 'smoke', 'smoke-detector', 'smoke-detector-alert', 'smoke-detector-alert-outline', 'smoke-detector-off', 'smoke-detector-off-outline', 'smoke-detector-outline', 'smoke-detector-variant', 'smoke-detector-variant-alert', 'smoke-detector-variant-off', 'smoking', 'smoking-off', 'smoking-pipe', 'smoking-pipe-off', 'snail', 'snake', 'snapchat', 'snowboard', 'snowflake', 'snowflake-alert', 'snowflake-melt', 'snowflake-off', 'snowflake-variant', 'snowman', 'snowmobile', 'soccer', 'soccer-field', 'social-distance-2-meters', 'social-distance-6-feet', 'sofa', 'sofa-outline', 'sofa-single', 'sofa-single-outline', 'solar-panel', 'solar-panel-large', 'solar-power', 'soldering-iron', 'solid', 'sony-playstation', 'sort', 'sort-alphabetical-ascending', 'sort-alphabetical-ascending-variant', 'sort-alphabetical-descending', 'sort-alphabetical-descending-variant', 'sort-alphabetical-variant', 'sort-ascending', 'sort-bool-ascending', 'sort-bool-ascending-variant', 'sort-bool-descending', 'sort-bool-descending-variant', 'sort-calendar-ascending', 'sort-calendar-descending', 'sort-clock-ascending', 'sort-clock-ascending-outline', 'sort-clock-descending', 'sort-clock-descending-outline', 'sort-descending', 'sort-numeric-ascending', 'sort-numeric-ascending-variant', 'sort-numeric-descending', 'sort-numeric-descending-variant', 'sort-numeric-variant', 'sort-reverse-variant', 'sort-variant', 'sort-variant-lock', 'sort-variant-lock-open', 'sort-variant-remove', 'soundbar', 'soundcloud', 'source-branch', 'source-branch-check', 'source-branch-minus', 'source-branch-plus', 'source-branch-refresh', 'source-branch-remove', 'source-branch-sync', 'source-commit', 'source-commit-end', 'source-commit-end-local', 'source-commit-local', 'source-commit-next-local', 'source-commit-start', 'source-commit-start-next-local', 'source-fork', 'source-merge', 'source-pull', 'source-repository', 'source-repository-multiple', 'soy-sauce', 'soy-sauce-off', 'spa', 'spa-outline', 'space-invaders', 'space-station', 'spade', 'speaker', 'speaker-bluetooth', 'speaker-multiple', 'speaker-off', 'speaker-wireless', 'spear', 'speedometer', 'speedometer-medium', 'speedometer-slow', 'spellcheck', 'sphere', 'sphere-off', 'spider', 'spider-thread', 'spider-web', 'spirit-level', 'spoon-sugar', 'spotify', 'spotlight', 'spotlight-beam', 'spray', 'spray-bottle', 'sprinkler', 'sprinkler-fire', 'sprinkler-variant', 'sprout', 'sprout-outline', 'square', 'square-circle', 'square-edit-outline', 'square-medium', 'square-medium-outline', 'square-off', 'square-off-outline', 'square-opacity', 'square-outline', 'square-root', 'square-root-box', 'square-rounded', 'square-rounded-outline', 'square-small', 'square-wave', 'squeegee', 'ssh', 'stack-exchange', 'stack-overflow', 'stackpath', 'stadium', 'stadium-variant', 'stairs', 'stairs-box', 'stairs-down', 'stairs-up', 'stamper', 'standard-definition', 'star', 'star-box', 'star-box-multiple', 'star-box-multiple-outline', 'star-box-outline', 'star-check', 'star-check-outline', 'star-circle', 'star-circle-outline', 'star-cog', 'star-cog-outline', 'star-crescent', 'star-david', 'star-face', 'star-four-points', 'star-four-points-outline', 'star-half', 'star-half-full', 'star-minus', 'star-minus-outline', 'star-off', 'star-off-outline', 'star-outline', 'star-plus', 'star-plus-outline', 'star-remove', 'star-remove-outline', 'star-settings', 'star-settings-outline', 'star-shooting', 'star-shooting-outline', 'star-three-points', 'star-three-points-outline', 'state-machine', 'steam', 'steering', 'steering-off', 'step-backward', 'step-backward-2', 'step-forward', 'step-forward-2', 'stethoscope', 'sticker', 'sticker-alert', 'sticker-alert-outline', 'sticker-check', 'sticker-check-outline', 'sticker-circle-outline', 'sticker-emoji', 'sticker-minus', 'sticker-minus-outline', 'sticker-outline', 'sticker-plus', 'sticker-plus-outline', 'sticker-remove', 'sticker-remove-outline', 'sticker-text', 'sticker-text-outline', 'stocking', 'stomach', 'stool', 'stool-outline', 'stop', 'stop-circle', 'stop-circle-outline', 'store', 'store-24-hour', 'store-alert', 'store-alert-outline', 'store-check', 'store-check-outline', 'store-clock', 'store-clock-outline', 'store-cog', 'store-cog-outline', 'store-edit', 'store-edit-outline', 'store-marker', 'store-marker-outline', 'store-minus', 'store-minus-outline', 'store-off', 'store-off-outline', 'store-outline', 'store-plus', 'store-plus-outline', 'store-remove', 'store-remove-outline', 'store-search', 'store-search-outline', 'store-settings', 'store-settings-outline', 'storefront', 'storefront-outline', 'stove', 'strategy', 'stretch-to-page', 'stretch-to-page-outline', 'string-lights', 'string-lights-off', 'subdirectory-arrow-left', 'subdirectory-arrow-right', 'submarine', 'subtitles', 'subtitles-outline', 'subway', 'subway-alert-variant', 'subway-variant', 'summit', 'sun-compass', 'sun-snowflake', 'sun-thermometer', 'sun-thermometer-outline', 'sun-wireless', 'sun-wireless-outline', 'sunglasses', 'surfing', 'surround-sound', 'surround-sound-2-0', 'surround-sound-2-1', 'surround-sound-3-1', 'surround-sound-5-1', 'surround-sound-5-1-2', 'surround-sound-7-1', 'svg', 'swap-horizontal', 'swap-horizontal-bold', 'swap-horizontal-circle', 'swap-horizontal-circle-outline', 'swap-horizontal-variant', 'swap-vertical', 'swap-vertical-bold', 'swap-vertical-circle', 'swap-vertical-circle-outline', 'swap-vertical-variant', 'swim', 'switch', 'sword', 'sword-cross', 'syllabary-hangul', 'syllabary-hiragana', 'syllabary-katakana', 'syllabary-katakana-halfwidth', 'symbol', 'symfony', 'sync', 'sync-alert', 'sync-circle', 'sync-off', 'tab', 'tab-minus', 'tab-plus', 'tab-remove', 'tab-search', 'tab-unselected', 'table', 'table-account', 'table-alert', 'table-arrow-down', 'table-arrow-left', 'table-arrow-right', 'table-arrow-up', 'table-border', 'table-cancel', 'table-chair', 'table-check', 'table-clock', 'table-cog', 'table-column', 'table-column-plus-after', 'table-column-plus-before', 'table-column-remove', 'table-column-width', 'table-edit', 'table-eye', 'table-eye-off', 'table-furniture', 'table-headers-eye', 'table-headers-eye-off', 'table-heart', 'table-key', 'table-large', 'table-large-plus', 'table-large-remove', 'table-lock', 'table-merge-cells', 'table-minus', 'table-multiple', 'table-network', 'table-of-contents', 'table-off', 'table-picnic', 'table-pivot', 'table-plus', 'table-refresh', 'table-remove', 'table-row', 'table-row-height', 'table-row-plus-after', 'table-row-plus-before', 'table-row-remove', 'table-search', 'table-settings', 'table-split-cell', 'table-star', 'table-sync', 'table-tennis', 'tablet', 'tablet-android', 'tablet-cellphone', 'tablet-dashboard', 'taco', 'tag', 'tag-arrow-down', 'tag-arrow-down-outline', 'tag-arrow-left', 'tag-arrow-left-outline', 'tag-arrow-right', 'tag-arrow-right-outline', 'tag-arrow-up', 'tag-arrow-up-outline', 'tag-faces', 'tag-heart', 'tag-heart-outline', 'tag-minus', 'tag-minus-outline', 'tag-multiple', 'tag-multiple-outline', 'tag-off', 'tag-off-outline', 'tag-outline', 'tag-plus', 'tag-plus-outline', 'tag-remove', 'tag-remove-outline', 'tag-search', 'tag-search-outline', 'tag-text', 'tag-text-outline', 'tailwind', 'tangram', 'tank', 'tanker-truck', 'tape-drive', 'tape-measure', 'target', 'target-account', 'target-variant', 'taxi', 'tea', 'tea-outline', 'teamviewer', 'teddy-bear', 'telescope', 'television', 'television-ambient-light', 'television-box', 'television-classic', 'television-classic-off', 'television-guide', 'television-off', 'television-pause', 'television-play', 'television-shimmer', 'television-stop', 'temperature-celsius', 'temperature-fahrenheit', 'temperature-kelvin', 'tennis', 'tennis-ball', 'tent', 'terraform', 'terrain', 'test-tube', 'test-tube-empty', 'test-tube-off', 'text', 'text-account', 'text-box', 'text-box-check', 'text-box-check-outline', 'text-box-minus', 'text-box-minus-outline', 'text-box-multiple', 'text-box-multiple-outline', 'text-box-outline', 'text-box-plus', 'text-box-plus-outline', 'text-box-remove', 'text-box-remove-outline', 'text-box-search', 'text-box-search-outline', 'text-long', 'text-recognition', 'text-search', 'text-shadow', 'text-short', 'text-to-speech', 'text-to-speech-off', 'texture', 'texture-box', 'theater', 'theme-light-dark', 'thermometer', 'thermometer-alert', 'thermometer-bluetooth', 'thermometer-chevron-down', 'thermometer-chevron-up', 'thermometer-high', 'thermometer-lines', 'thermometer-low', 'thermometer-minus', 'thermometer-off', 'thermometer-plus', 'thermostat', 'thermostat-box', 'thought-bubble', 'thought-bubble-outline', 'thumb-down', 'thumb-down-outline', 'thumb-up', 'thumb-up-outline', 'thumbs-up-down', 'thumbs-up-down-outline', 'ticket', 'ticket-account', 'ticket-confirmation', 'ticket-confirmation-outline', 'ticket-outline', 'ticket-percent', 'ticket-percent-outline', 'tie', 'tilde', 'tilde-off', 'timelapse', 'timeline', 'timeline-alert', 'timeline-alert-outline', 'timeline-check', 'timeline-check-outline', 'timeline-clock', 'timeline-clock-outline', 'timeline-help', 'timeline-help-outline', 'timeline-minus', 'timeline-minus-outline', 'timeline-outline', 'timeline-plus', 'timeline-plus-outline', 'timeline-remove', 'timeline-remove-outline', 'timeline-text', 'timeline-text-outline', 'timer', 'timer-10', 'timer-3', 'timer-cog', 'timer-cog-outline', 'timer-off', 'timer-off-outline', 'timer-outline', 'timer-sand', 'timer-sand-complete', 'timer-sand-empty', 'timer-sand-full', 'timer-sand-paused', 'timer-settings', 'timer-settings-outline', 'timetable', 'tire', 'toaster', 'toaster-off', 'toaster-oven', 'toggle-switch', 'toggle-switch-off', 'toggle-switch-off-outline', 'toggle-switch-outline', 'toilet', 'toolbox', 'toolbox-outline', 'tools', 'tooltip', 'tooltip-account', 'tooltip-cellphone', 'tooltip-check', 'tooltip-check-outline', 'tooltip-edit', 'tooltip-edit-outline', 'tooltip-image', 'tooltip-image-outline', 'tooltip-minus', 'tooltip-minus-outline', 'tooltip-outline', 'tooltip-plus', 'tooltip-plus-outline', 'tooltip-remove', 'tooltip-remove-outline', 'tooltip-text', 'tooltip-text-outline', 'tooth', 'tooth-outline', 'toothbrush', 'toothbrush-electric', 'toothbrush-paste', 'torch', 'tortoise', 'toslink', 'tournament', 'tow-truck', 'tower-beach', 'tower-fire', 'town-hall', 'toy-brick', 'toy-brick-marker', 'toy-brick-marker-outline', 'toy-brick-minus', 'toy-brick-minus-outline', 'toy-brick-outline', 'toy-brick-plus', 'toy-brick-plus-outline', 'toy-brick-remove', 'toy-brick-remove-outline', 'toy-brick-search', 'toy-brick-search-outline', 'track-light', 'trackpad', 'trackpad-lock', 'tractor', 'tractor-variant', 'trademark', 'traffic-cone', 'traffic-light', 'traffic-light-outline', 'train', 'train-car', 'train-car-passenger', 'train-car-passenger-door', 'train-car-passenger-door-open', 'train-car-passenger-variant', 'train-variant', 'tram', 'tram-side', 'transcribe', 'transcribe-close', 'transfer', 'transfer-down', 'transfer-left', 'transfer-right', 'transfer-up', 'transit-connection', 'transit-connection-horizontal', 'transit-connection-variant', 'transit-detour', 'transit-skip', 'transit-transfer', 'transition', 'transition-masked', 'translate', 'translate-off', 'transmission-tower', 'transmission-tower-export', 'transmission-tower-import', 'trash-can', 'trash-can-outline', 'tray', 'tray-alert', 'tray-arrow-down', 'tray-arrow-up', 'tray-full', 'tray-minus', 'tray-plus', 'tray-remove', 'treasure-chest', 'tree', 'tree-outline', 'trello', 'trending-down', 'trending-neutral', 'trending-up', 'triangle', 'triangle-outline', 'triangle-wave', 'triforce', 'trophy', 'trophy-award', 'trophy-broken', 'trophy-outline', 'trophy-variant', 'trophy-variant-outline', 'truck', 'truck-cargo-container', 'truck-check', 'truck-check-outline', 'truck-delivery', 'truck-delivery-outline', 'truck-fast', 'truck-fast-outline', 'truck-flatbed', 'truck-minus', 'truck-minus-outline', 'truck-outline', 'truck-plus', 'truck-plus-outline', 'truck-remove', 'truck-remove-outline', 'truck-snowflake', 'truck-trailer', 'trumpet', 'tshirt-crew', 'tshirt-crew-outline', 'tshirt-v', 'tshirt-v-outline', 'tumble-dryer', 'tumble-dryer-alert', 'tumble-dryer-off', 'tune', 'tune-variant', 'tune-vertical', 'tune-vertical-variant', 'tunnel', 'tunnel-outline', 'turkey', 'turnstile', 'turnstile-outline', 'turtle', 'twitch', 'twitter', 'two-factor-authentication', 'typewriter', 'ubisoft', 'ubuntu', 'ufo', 'ufo-outline', 'ultra-high-definition', 'umbraco', 'umbrella', 'umbrella-beach', 'umbrella-beach-outline', 'umbrella-closed', 'umbrella-closed-outline', 'umbrella-closed-variant', 'umbrella-outline', 'undo', 'undo-variant', 'unfold-less-horizontal', 'unfold-less-vertical', 'unfold-more-horizontal', 'unfold-more-vertical', 'ungroup', 'unicode', 'unicorn', 'unicorn-variant', 'unicycle', 'unity', 'unreal', 'update', 'upload', 'upload-lock', 'upload-lock-outline', 'upload-multiple', 'upload-network', 'upload-network-outline', 'upload-off', 'upload-off-outline', 'upload-outline', 'usb', 'usb-flash-drive', 'usb-flash-drive-outline', 'usb-port', 'vacuum', 'vacuum-outline', 'valve', 'valve-closed', 'valve-open', 'van-passenger', 'van-utility', 'vanish', 'vanish-quarter', 'vanity-light', 'variable', 'variable-box', 'vector-arrange-above', 'vector-arrange-below', 'vector-bezier', 'vector-circle', 'vector-circle-variant', 'vector-combine', 'vector-curve', 'vector-difference', 'vector-difference-ab', 'vector-difference-ba', 'vector-ellipse', 'vector-intersection', 'vector-line', 'vector-link', 'vector-point', 'vector-polygon', 'vector-polygon-variant', 'vector-polyline', 'vector-polyline-edit', 'vector-polyline-minus', 'vector-polyline-plus', 'vector-polyline-remove', 'vector-radius', 'vector-rectangle', 'vector-selection', 'vector-square', 'vector-square-close', 'vector-square-edit', 'vector-square-minus', 'vector-square-open', 'vector-square-plus', 'vector-square-remove', 'vector-triangle', 'vector-union', 'vhs', 'vibrate', 'vibrate-off', 'video', 'video-3d', 'video-3d-off', 'video-3d-variant', 'video-4k-box', 'video-account', 'video-box', 'video-box-off', 'video-check', 'video-check-outline', 'video-high-definition', 'video-image', 'video-input-antenna', 'video-input-component', 'video-input-hdmi', 'video-input-scart', 'video-input-svideo', 'video-marker', 'video-marker-outline', 'video-minus', 'video-minus-outline', 'video-off', 'video-off-outline', 'video-outline', 'video-plus', 'video-plus-outline', 'video-stabilization', 'video-switch', 'video-switch-outline', 'video-vintage', 'video-wireless', 'video-wireless-outline', 'view-agenda', 'view-agenda-outline', 'view-array', 'view-array-outline', 'view-carousel', 'view-carousel-outline', 'view-column', 'view-column-outline', 'view-comfy', 'view-comfy-outline', 'view-compact', 'view-compact-outline', 'view-dashboard', 'view-dashboard-edit', 'view-dashboard-edit-outline', 'view-dashboard-outline', 'view-dashboard-variant', 'view-dashboard-variant-outline', 'view-day', 'view-day-outline', 'view-gallery', 'view-gallery-outline', 'view-grid', 'view-grid-outline', 'view-grid-plus', 'view-grid-plus-outline', 'view-headline', 'view-list', 'view-list-outline', 'view-module', 'view-module-outline', 'view-parallel', 'view-parallel-outline', 'view-quilt', 'view-quilt-outline', 'view-sequential', 'view-sequential-outline', 'view-split-horizontal', 'view-split-vertical', 'view-stream', 'view-stream-outline', 'view-week', 'view-week-outline', 'vimeo', 'violin', 'virtual-reality', 'virus', 'virus-off', 'virus-off-outline', 'virus-outline', 'vlc', 'voicemail', 'volleyball', 'volume-high', 'volume-low', 'volume-medium', 'volume-minus', 'volume-mute', 'volume-off', 'volume-plus', 'volume-source', 'volume-variant-off', 'volume-vibrate', 'vote', 'vote-outline', 'vpn', 'vuejs', 'vuetify', 'walk', 'wall', 'wall-sconce', 'wall-sconce-flat', 'wall-sconce-flat-outline', 'wall-sconce-flat-variant', 'wall-sconce-flat-variant-outline', 'wall-sconce-outline', 'wall-sconce-round', 'wall-sconce-round-outline', 'wall-sconce-round-variant', 'wall-sconce-round-variant-outline', 'wallet', 'wallet-giftcard', 'wallet-membership', 'wallet-outline', 'wallet-plus', 'wallet-plus-outline', 'wallet-travel', 'wallpaper', 'wan', 'wardrobe', 'wardrobe-outline', 'warehouse', 'washing-machine', 'washing-machine-alert', 'washing-machine-off', 'watch', 'watch-export', 'watch-export-variant', 'watch-import', 'watch-import-variant', 'watch-variant', 'watch-vibrate', 'watch-vibrate-off', 'water', 'water-alert', 'water-alert-outline', 'water-boiler', 'water-boiler-alert', 'water-boiler-off', 'water-check', 'water-check-outline', 'water-circle', 'water-minus', 'water-minus-outline', 'water-off', 'water-off-outline', 'water-opacity', 'water-outline', 'water-percent', 'water-percent-alert', 'water-plus', 'water-plus-outline', 'water-polo', 'water-pump', 'water-pump-off', 'water-remove', 'water-remove-outline', 'water-sync', 'water-well', 'water-well-outline', 'waterfall', 'watering-can', 'watering-can-outline', 'watermark', 'wave', 'waveform', 'waves', 'waves-arrow-left', 'waves-arrow-right', 'waves-arrow-up', 'waze', 'weather-cloudy', 'weather-cloudy-alert', 'weather-cloudy-arrow-right', 'weather-cloudy-clock', 'weather-fog', 'weather-hail', 'weather-hazy', 'weather-hurricane', 'weather-lightning', 'weather-lightning-rainy', 'weather-night', 'weather-night-partly-cloudy', 'weather-partly-cloudy', 'weather-partly-lightning', 'weather-partly-rainy', 'weather-partly-snowy', 'weather-partly-snowy-rainy', 'weather-pouring', 'weather-rainy', 'weather-snowy', 'weather-snowy-heavy', 'weather-snowy-rainy', 'weather-sunny', 'weather-sunny-alert', 'weather-sunny-off', 'weather-sunset', 'weather-sunset-down', 'weather-sunset-up', 'weather-tornado', 'weather-windy', 'weather-windy-variant', 'web', 'web-box', 'web-cancel', 'web-check', 'web-clock', 'web-minus', 'web-off', 'web-plus', 'web-refresh', 'web-remove', 'web-sync', 'webcam', 'webcam-off', 'webhook', 'webpack', 'webrtc', 'wechat', 'weight', 'weight-gram', 'weight-kilogram', 'weight-lifter', 'weight-pound', 'whatsapp', 'wheel-barrow', 'wheelchair-accessibility', 'whistle', 'whistle-outline', 'white-balance-auto', 'white-balance-incandescent', 'white-balance-iridescent', 'white-balance-sunny', 'widgets', 'widgets-outline', 'wifi', 'wifi-alert', 'wifi-arrow-down', 'wifi-arrow-left', 'wifi-arrow-left-right', 'wifi-arrow-right', 'wifi-arrow-up', 'wifi-arrow-up-down', 'wifi-cancel', 'wifi-check', 'wifi-cog', 'wifi-lock', 'wifi-lock-open', 'wifi-marker', 'wifi-minus', 'wifi-off', 'wifi-plus', 'wifi-refresh', 'wifi-remove', 'wifi-settings', 'wifi-star', 'wifi-strength-1', 'wifi-strength-1-alert', 'wifi-strength-1-lock', 'wifi-strength-1-lock-open', 'wifi-strength-2', 'wifi-strength-2-alert', 'wifi-strength-2-lock', 'wifi-strength-2-lock-open', 'wifi-strength-3', 'wifi-strength-3-alert', 'wifi-strength-3-lock', 'wifi-strength-3-lock-open', 'wifi-strength-4', 'wifi-strength-4-alert', 'wifi-strength-4-lock', 'wifi-strength-4-lock-open', 'wifi-strength-alert-outline', 'wifi-strength-lock-open-outline', 'wifi-strength-lock-outline', 'wifi-strength-off', 'wifi-strength-off-outline', 'wifi-strength-outline', 'wifi-sync', 'wikipedia', 'wind-turbine', 'wind-turbine-alert', 'wind-turbine-check', 'window-close', 'window-closed', 'window-closed-variant', 'window-maximize', 'window-minimize', 'window-open', 'window-open-variant', 'window-restore', 'window-shutter', 'window-shutter-alert', 'window-shutter-open', 'windsock', 'wiper', 'wiper-wash', 'wiper-wash-alert', 'wizard-hat', 'wordpress', 'wrap', 'wrap-disabled', 'wrench', 'wrench-clock', 'wrench-outline', 'xamarin', 'xml', 'xmpp', 'yahoo', 'yeast', 'yin-yang', 'yoga', 'youtube', 'youtube-gaming', 'youtube-studio', 'youtube-subscription', 'youtube-tv', 'yurt', 'z-wave', 'zend', 'zigbee', 'zip-box', 'zip-box-outline', 'zip-disk', 'zodiac-aquarius', 'zodiac-aries', 'zodiac-cancer', 'zodiac-capricorn', 'zodiac-gemini', 'zodiac-leo', 'zodiac-libra', 'zodiac-pisces', 'zodiac-sagittarius', 'zodiac-scorpio', 'zodiac-taurus', 'zodiac-virgo', 'blank' + 'ab-testing', 'abacus', 'abjad-arabic', 'abjad-hebrew', 'abugida-devanagari', 'abugida-thai', 'access-point', 'access-point-check', 'access-point-minus', 'access-point-network', 'access-point-network-off', 'access-point-off', 'access-point-plus', 'access-point-remove', 'account', 'account-alert', 'account-alert-outline', 'account-arrow-down', 'account-arrow-down-outline', 'account-arrow-left', 'account-arrow-left-outline', 'account-arrow-right', 'account-arrow-right-outline', 'account-arrow-up', 'account-arrow-up-outline', 'account-badge', 'account-badge-outline', 'account-box', 'account-box-multiple', 'account-box-multiple-outline', 'account-box-outline', 'account-cancel', 'account-cancel-outline', 'account-card', 'account-card-outline', 'account-cash', 'account-cash-outline', 'account-check', 'account-check-outline', 'account-child', 'account-child-circle', 'account-child-outline', 'account-circle', 'account-circle-outline', 'account-clock', 'account-clock-outline', 'account-cog', 'account-cog-outline', 'account-convert', 'account-convert-outline', 'account-cowboy-hat', 'account-cowboy-hat-outline', 'account-credit-card', 'account-credit-card-outline', 'account-details', 'account-details-outline', 'account-edit', 'account-edit-outline', 'account-eye', 'account-eye-outline', 'account-filter', 'account-filter-outline', 'account-group', 'account-group-outline', 'account-hard-hat', 'account-hard-hat-outline', 'account-heart', 'account-heart-outline', 'account-injury', 'account-injury-outline', 'account-key', 'account-key-outline', 'account-lock', 'account-lock-open', 'account-lock-open-outline', 'account-lock-outline', 'account-minus', 'account-minus-outline', 'account-multiple', 'account-multiple-check', 'account-multiple-check-outline', 'account-multiple-minus', 'account-multiple-minus-outline', 'account-multiple-outline', 'account-multiple-plus', 'account-multiple-plus-outline', 'account-multiple-remove', 'account-multiple-remove-outline', 'account-music', 'account-music-outline', 'account-network', 'account-network-off', 'account-network-off-outline', 'account-network-outline', 'account-off', 'account-off-outline', 'account-outline', 'account-plus', 'account-plus-outline', 'account-question', 'account-question-outline', 'account-reactivate', 'account-reactivate-outline', 'account-remove', 'account-remove-outline', 'account-school', 'account-school-outline', 'account-search', 'account-search-outline', 'account-settings', 'account-settings-outline', 'account-star', 'account-star-outline', 'account-supervisor', 'account-supervisor-circle', 'account-supervisor-circle-outline', 'account-supervisor-outline', 'account-switch', 'account-switch-outline', 'account-sync', 'account-sync-outline', 'account-tie', 'account-tie-hat', 'account-tie-hat-outline', 'account-tie-outline', 'account-tie-voice', 'account-tie-voice-off', 'account-tie-voice-off-outline', 'account-tie-voice-outline', 'account-tie-woman', 'account-voice', 'account-voice-off', 'account-wrench', 'account-wrench-outline', 'adjust', 'advertisements', 'advertisements-off', 'air-conditioner', 'air-filter', 'air-horn', 'air-humidifier', 'air-humidifier-off', 'air-purifier', 'air-purifier-off', 'airbag', 'airballoon', 'airballoon-outline', 'airplane', 'airplane-alert', 'airplane-check', 'airplane-clock', 'airplane-cog', 'airplane-edit', 'airplane-landing', 'airplane-marker', 'airplane-minus', 'airplane-off', 'airplane-plus', 'airplane-remove', 'airplane-search', 'airplane-settings', 'airplane-takeoff', 'airport', 'alarm', 'alarm-bell', 'alarm-check', 'alarm-light', 'alarm-light-off', 'alarm-light-off-outline', 'alarm-light-outline', 'alarm-multiple', 'alarm-note', 'alarm-note-off', 'alarm-off', 'alarm-panel', 'alarm-panel-outline', 'alarm-plus', 'alarm-snooze', 'album', 'alert', 'alert-box', 'alert-box-outline', 'alert-circle', 'alert-circle-check', 'alert-circle-check-outline', 'alert-circle-outline', 'alert-decagram', 'alert-decagram-outline', 'alert-minus', 'alert-minus-outline', 'alert-octagon', 'alert-octagon-outline', 'alert-octagram', 'alert-octagram-outline', 'alert-outline', 'alert-plus', 'alert-plus-outline', 'alert-remove', 'alert-remove-outline', 'alert-rhombus', 'alert-rhombus-outline', 'alien', 'alien-outline', 'align-horizontal-center', 'align-horizontal-distribute', 'align-horizontal-left', 'align-horizontal-right', 'align-vertical-bottom', 'align-vertical-center', 'align-vertical-distribute', 'align-vertical-top', 'all-inclusive', 'all-inclusive-box', 'all-inclusive-box-outline', 'allergy', 'alpha', 'alpha-a', 'alpha-a-box', 'alpha-a-box-outline', 'alpha-a-circle', 'alpha-a-circle-outline', 'alpha-b', 'alpha-b-box', 'alpha-b-box-outline', 'alpha-b-circle', 'alpha-b-circle-outline', 'alpha-c', 'alpha-c-box', 'alpha-c-box-outline', 'alpha-c-circle', 'alpha-c-circle-outline', 'alpha-d', 'alpha-d-box', 'alpha-d-box-outline', 'alpha-d-circle', 'alpha-d-circle-outline', 'alpha-e', 'alpha-e-box', 'alpha-e-box-outline', 'alpha-e-circle', 'alpha-e-circle-outline', 'alpha-f', 'alpha-f-box', 'alpha-f-box-outline', 'alpha-f-circle', 'alpha-f-circle-outline', 'alpha-g', 'alpha-g-box', 'alpha-g-box-outline', 'alpha-g-circle', 'alpha-g-circle-outline', 'alpha-h', 'alpha-h-box', 'alpha-h-box-outline', 'alpha-h-circle', 'alpha-h-circle-outline', 'alpha-i', 'alpha-i-box', 'alpha-i-box-outline', 'alpha-i-circle', 'alpha-i-circle-outline', 'alpha-j', 'alpha-j-box', 'alpha-j-box-outline', 'alpha-j-circle', 'alpha-j-circle-outline', 'alpha-k', 'alpha-k-box', 'alpha-k-box-outline', 'alpha-k-circle', 'alpha-k-circle-outline', 'alpha-l', 'alpha-l-box', 'alpha-l-box-outline', 'alpha-l-circle', 'alpha-l-circle-outline', 'alpha-m', 'alpha-m-box', 'alpha-m-box-outline', 'alpha-m-circle', 'alpha-m-circle-outline', 'alpha-n', 'alpha-n-box', 'alpha-n-box-outline', 'alpha-n-circle', 'alpha-n-circle-outline', 'alpha-o', 'alpha-o-box', 'alpha-o-box-outline', 'alpha-o-circle', 'alpha-o-circle-outline', 'alpha-p', 'alpha-p-box', 'alpha-p-box-outline', 'alpha-p-circle', 'alpha-p-circle-outline', 'alpha-q', 'alpha-q-box', 'alpha-q-box-outline', 'alpha-q-circle', 'alpha-q-circle-outline', 'alpha-r', 'alpha-r-box', 'alpha-r-box-outline', 'alpha-r-circle', 'alpha-r-circle-outline', 'alpha-s', 'alpha-s-box', 'alpha-s-box-outline', 'alpha-s-circle', 'alpha-s-circle-outline', 'alpha-t', 'alpha-t-box', 'alpha-t-box-outline', 'alpha-t-circle', 'alpha-t-circle-outline', 'alpha-u', 'alpha-u-box', 'alpha-u-box-outline', 'alpha-u-circle', 'alpha-u-circle-outline', 'alpha-v', 'alpha-v-box', 'alpha-v-box-outline', 'alpha-v-circle', 'alpha-v-circle-outline', 'alpha-w', 'alpha-w-box', 'alpha-w-box-outline', 'alpha-w-circle', 'alpha-w-circle-outline', 'alpha-x', 'alpha-x-box', 'alpha-x-box-outline', 'alpha-x-circle', 'alpha-x-circle-outline', 'alpha-y', 'alpha-y-box', 'alpha-y-box-outline', 'alpha-y-circle', 'alpha-y-circle-outline', 'alpha-z', 'alpha-z-box', 'alpha-z-box-outline', 'alpha-z-circle', 'alpha-z-circle-outline', 'alphabet-aurebesh', 'alphabet-cyrillic', 'alphabet-greek', 'alphabet-latin', 'alphabet-piqad', 'alphabet-tengwar', 'alphabetical', 'alphabetical-off', 'alphabetical-variant', 'alphabetical-variant-off', 'altimeter', 'ambulance', 'ammunition', 'ampersand', 'amplifier', 'amplifier-off', 'anchor', 'android', 'android-studio', 'angle-acute', 'angle-obtuse', 'angle-right', 'angular', 'angularjs', 'animation', 'animation-outline', 'animation-play', 'animation-play-outline', 'ansible', 'antenna', 'anvil', 'apache-kafka', 'api', 'api-off', 'apple', 'apple-finder', 'apple-icloud', 'apple-ios', 'apple-keyboard-caps', 'apple-keyboard-command', 'apple-keyboard-control', 'apple-keyboard-option', 'apple-keyboard-shift', 'apple-safari', 'application', 'application-array', 'application-array-outline', 'application-braces', 'application-braces-outline', 'application-brackets', 'application-brackets-outline', 'application-cog', 'application-cog-outline', 'application-edit', 'application-edit-outline', 'application-export', 'application-import', 'application-outline', 'application-parentheses', 'application-parentheses-outline', 'application-settings', 'application-settings-outline', 'application-variable', 'application-variable-outline', 'approximately-equal', 'approximately-equal-box', 'apps', 'apps-box', 'arch', 'archive', 'archive-alert', 'archive-alert-outline', 'archive-arrow-down', 'archive-arrow-down-outline', 'archive-arrow-up', 'archive-arrow-up-outline', 'archive-cancel', 'archive-cancel-outline', 'archive-check', 'archive-check-outline', 'archive-clock', 'archive-clock-outline', 'archive-cog', 'archive-cog-outline', 'archive-edit', 'archive-edit-outline', 'archive-eye', 'archive-eye-outline', 'archive-lock', 'archive-lock-open', 'archive-lock-open-outline', 'archive-lock-outline', 'archive-marker', 'archive-marker-outline', 'archive-minus', 'archive-minus-outline', 'archive-music', 'archive-music-outline', 'archive-off', 'archive-off-outline', 'archive-outline', 'archive-plus', 'archive-plus-outline', 'archive-refresh', 'archive-refresh-outline', 'archive-remove', 'archive-remove-outline', 'archive-search', 'archive-search-outline', 'archive-settings', 'archive-settings-outline', 'archive-star', 'archive-star-outline', 'archive-sync', 'archive-sync-outline', 'arm-flex', 'arm-flex-outline', 'arrange-bring-forward', 'arrange-bring-to-front', 'arrange-send-backward', 'arrange-send-to-back', 'arrow-all', 'arrow-bottom-left', 'arrow-bottom-left-bold-box', 'arrow-bottom-left-bold-box-outline', 'arrow-bottom-left-bold-outline', 'arrow-bottom-left-thick', 'arrow-bottom-left-thin', 'arrow-bottom-left-thin-circle-outline', 'arrow-bottom-right', 'arrow-bottom-right-bold-box', 'arrow-bottom-right-bold-box-outline', 'arrow-bottom-right-bold-outline', 'arrow-bottom-right-thick', 'arrow-bottom-right-thin', 'arrow-bottom-right-thin-circle-outline', 'arrow-collapse', 'arrow-collapse-all', 'arrow-collapse-down', 'arrow-collapse-horizontal', 'arrow-collapse-left', 'arrow-collapse-right', 'arrow-collapse-up', 'arrow-collapse-vertical', 'arrow-decision', 'arrow-decision-auto', 'arrow-decision-auto-outline', 'arrow-decision-outline', 'arrow-down', 'arrow-down-bold', 'arrow-down-bold-box', 'arrow-down-bold-box-outline', 'arrow-down-bold-circle', 'arrow-down-bold-circle-outline', 'arrow-down-bold-hexagon-outline', 'arrow-down-bold-outline', 'arrow-down-box', 'arrow-down-circle', 'arrow-down-circle-outline', 'arrow-down-drop-circle', 'arrow-down-drop-circle-outline', 'arrow-down-left', 'arrow-down-left-bold', 'arrow-down-right', 'arrow-down-right-bold', 'arrow-down-thick', 'arrow-down-thin', 'arrow-down-thin-circle-outline', 'arrow-expand', 'arrow-expand-all', 'arrow-expand-down', 'arrow-expand-horizontal', 'arrow-expand-left', 'arrow-expand-right', 'arrow-expand-up', 'arrow-expand-vertical', 'arrow-horizontal-lock', 'arrow-left', 'arrow-left-bold', 'arrow-left-bold-box', 'arrow-left-bold-box-outline', 'arrow-left-bold-circle', 'arrow-left-bold-circle-outline', 'arrow-left-bold-hexagon-outline', 'arrow-left-bold-outline', 'arrow-left-bottom', 'arrow-left-bottom-bold', 'arrow-left-box', 'arrow-left-circle', 'arrow-left-circle-outline', 'arrow-left-drop-circle', 'arrow-left-drop-circle-outline', 'arrow-left-right', 'arrow-left-right-bold', 'arrow-left-right-bold-outline', 'arrow-left-thick', 'arrow-left-thin', 'arrow-left-thin-circle-outline', 'arrow-left-top', 'arrow-left-top-bold', 'arrow-projectile', 'arrow-projectile-multiple', 'arrow-right', 'arrow-right-bold', 'arrow-right-bold-box', 'arrow-right-bold-box-outline', 'arrow-right-bold-circle', 'arrow-right-bold-circle-outline', 'arrow-right-bold-hexagon-outline', 'arrow-right-bold-outline', 'arrow-right-bottom', 'arrow-right-bottom-bold', 'arrow-right-box', 'arrow-right-circle', 'arrow-right-circle-outline', 'arrow-right-drop-circle', 'arrow-right-drop-circle-outline', 'arrow-right-thick', 'arrow-right-thin', 'arrow-right-thin-circle-outline', 'arrow-right-top', 'arrow-right-top-bold', 'arrow-split-horizontal', 'arrow-split-vertical', 'arrow-top-left', 'arrow-top-left-bold-box', 'arrow-top-left-bold-box-outline', 'arrow-top-left-bold-outline', 'arrow-top-left-bottom-right', 'arrow-top-left-bottom-right-bold', 'arrow-top-left-thick', 'arrow-top-left-thin', 'arrow-top-left-thin-circle-outline', 'arrow-top-right', 'arrow-top-right-bold-box', 'arrow-top-right-bold-box-outline', 'arrow-top-right-bold-outline', 'arrow-top-right-bottom-left', 'arrow-top-right-bottom-left-bold', 'arrow-top-right-thick', 'arrow-top-right-thin', 'arrow-top-right-thin-circle-outline', 'arrow-u-down-left', 'arrow-u-down-left-bold', 'arrow-u-down-right', 'arrow-u-down-right-bold', 'arrow-u-left-bottom', 'arrow-u-left-bottom-bold', 'arrow-u-left-top', 'arrow-u-left-top-bold', 'arrow-u-right-bottom', 'arrow-u-right-bottom-bold', 'arrow-u-right-top', 'arrow-u-right-top-bold', 'arrow-u-up-left', 'arrow-u-up-left-bold', 'arrow-u-up-right', 'arrow-u-up-right-bold', 'arrow-up', 'arrow-up-bold', 'arrow-up-bold-box', 'arrow-up-bold-box-outline', 'arrow-up-bold-circle', 'arrow-up-bold-circle-outline', 'arrow-up-bold-hexagon-outline', 'arrow-up-bold-outline', 'arrow-up-box', 'arrow-up-circle', 'arrow-up-circle-outline', 'arrow-up-down', 'arrow-up-down-bold', 'arrow-up-down-bold-outline', 'arrow-up-drop-circle', 'arrow-up-drop-circle-outline', 'arrow-up-left', 'arrow-up-left-bold', 'arrow-up-right', 'arrow-up-right-bold', 'arrow-up-thick', 'arrow-up-thin', 'arrow-up-thin-circle-outline', 'arrow-vertical-lock', 'artboard', 'artstation', 'aspect-ratio', 'assistant', 'asterisk', 'asterisk-circle-outline', 'at', 'atlassian', 'atm', 'atom', 'atom-variant', 'attachment', 'attachment-check', 'attachment-lock', 'attachment-minus', 'attachment-off', 'attachment-plus', 'attachment-remove', 'atv', 'audio-input-rca', 'audio-input-stereo-minijack', 'audio-input-xlr', 'audio-video', 'audio-video-off', 'augmented-reality', 'auto-download', 'auto-fix', 'auto-upload', 'autorenew', 'autorenew-off', 'av-timer', 'awning', 'awning-outline', 'aws', 'axe', 'axe-battle', 'axis', 'axis-arrow', 'axis-arrow-info', 'axis-arrow-lock', 'axis-lock', 'axis-x-arrow', 'axis-x-arrow-lock', 'axis-x-rotate-clockwise', 'axis-x-rotate-counterclockwise', 'axis-x-y-arrow-lock', 'axis-y-arrow', 'axis-y-arrow-lock', 'axis-y-rotate-clockwise', 'axis-y-rotate-counterclockwise', 'axis-z-arrow', 'axis-z-arrow-lock', 'axis-z-rotate-clockwise', 'axis-z-rotate-counterclockwise', 'babel', 'baby', 'baby-bottle', 'baby-bottle-outline', 'baby-buggy', 'baby-buggy-off', 'baby-carriage', 'baby-carriage-off', 'baby-face', 'baby-face-outline', 'backburger', 'backspace', 'backspace-outline', 'backspace-reverse', 'backspace-reverse-outline', 'backup-restore', 'bacteria', 'bacteria-outline', 'badge-account', 'badge-account-alert', 'badge-account-alert-outline', 'badge-account-horizontal', 'badge-account-horizontal-outline', 'badge-account-outline', 'badminton', 'bag-carry-on', 'bag-carry-on-check', 'bag-carry-on-off', 'bag-checked', 'bag-personal', 'bag-personal-off', 'bag-personal-off-outline', 'bag-personal-outline', 'bag-personal-tag', 'bag-personal-tag-outline', 'bag-suitcase', 'bag-suitcase-off', 'bag-suitcase-off-outline', 'bag-suitcase-outline', 'baguette', 'balcony', 'balloon', 'ballot', 'ballot-outline', 'ballot-recount', 'ballot-recount-outline', 'bandage', 'bank', 'bank-check', 'bank-minus', 'bank-off', 'bank-off-outline', 'bank-outline', 'bank-plus', 'bank-remove', 'bank-transfer', 'bank-transfer-in', 'bank-transfer-out', 'barcode', 'barcode-off', 'barcode-scan', 'barley', 'barley-off', 'barn', 'barrel', 'barrel-outline', 'baseball', 'baseball-bat', 'baseball-diamond', 'baseball-diamond-outline', 'bash', 'basket', 'basket-check', 'basket-check-outline', 'basket-fill', 'basket-minus', 'basket-minus-outline', 'basket-off', 'basket-off-outline', 'basket-outline', 'basket-plus', 'basket-plus-outline', 'basket-remove', 'basket-remove-outline', 'basket-unfill', 'basketball', 'basketball-hoop', 'basketball-hoop-outline', 'bat', 'bathtub', 'bathtub-outline', 'battery', 'battery-10', 'battery-10-bluetooth', 'battery-20', 'battery-20-bluetooth', 'battery-30', 'battery-30-bluetooth', 'battery-40', 'battery-40-bluetooth', 'battery-50', 'battery-50-bluetooth', 'battery-60', 'battery-60-bluetooth', 'battery-70', 'battery-70-bluetooth', 'battery-80', 'battery-80-bluetooth', 'battery-90', 'battery-90-bluetooth', 'battery-alert', 'battery-alert-bluetooth', 'battery-alert-variant', 'battery-alert-variant-outline', 'battery-arrow-down', 'battery-arrow-down-outline', 'battery-arrow-up', 'battery-arrow-up-outline', 'battery-bluetooth', 'battery-bluetooth-variant', 'battery-charging', 'battery-charging-10', 'battery-charging-100', 'battery-charging-20', 'battery-charging-30', 'battery-charging-40', 'battery-charging-50', 'battery-charging-60', 'battery-charging-70', 'battery-charging-80', 'battery-charging-90', 'battery-charging-high', 'battery-charging-low', 'battery-charging-medium', 'battery-charging-outline', 'battery-charging-wireless', 'battery-charging-wireless-10', 'battery-charging-wireless-20', 'battery-charging-wireless-30', 'battery-charging-wireless-40', 'battery-charging-wireless-50', 'battery-charging-wireless-60', 'battery-charging-wireless-70', 'battery-charging-wireless-80', 'battery-charging-wireless-90', 'battery-charging-wireless-alert', 'battery-charging-wireless-outline', 'battery-check', 'battery-check-outline', 'battery-clock', 'battery-clock-outline', 'battery-heart', 'battery-heart-outline', 'battery-heart-variant', 'battery-high', 'battery-lock', 'battery-lock-open', 'battery-low', 'battery-medium', 'battery-minus', 'battery-minus-outline', 'battery-minus-variant', 'battery-negative', 'battery-off', 'battery-off-outline', 'battery-outline', 'battery-plus', 'battery-plus-outline', 'battery-plus-variant', 'battery-positive', 'battery-remove', 'battery-remove-outline', 'battery-sync', 'battery-sync-outline', 'battery-unknown', 'battery-unknown-bluetooth', 'beach', 'beaker', 'beaker-alert', 'beaker-alert-outline', 'beaker-check', 'beaker-check-outline', 'beaker-minus', 'beaker-minus-outline', 'beaker-outline', 'beaker-plus', 'beaker-plus-outline', 'beaker-question', 'beaker-question-outline', 'beaker-remove', 'beaker-remove-outline', 'bed', 'bed-clock', 'bed-double', 'bed-double-outline', 'bed-empty', 'bed-king', 'bed-king-outline', 'bed-outline', 'bed-queen', 'bed-queen-outline', 'bed-single', 'bed-single-outline', 'bee', 'bee-flower', 'beehive-off-outline', 'beehive-outline', 'beekeeper', 'beer', 'beer-outline', 'bell', 'bell-alert', 'bell-alert-outline', 'bell-badge', 'bell-badge-outline', 'bell-cancel', 'bell-cancel-outline', 'bell-check', 'bell-check-outline', 'bell-circle', 'bell-circle-outline', 'bell-cog', 'bell-cog-outline', 'bell-minus', 'bell-minus-outline', 'bell-off', 'bell-off-outline', 'bell-outline', 'bell-plus', 'bell-plus-outline', 'bell-remove', 'bell-remove-outline', 'bell-ring', 'bell-ring-outline', 'bell-sleep', 'bell-sleep-outline', 'beta', 'betamax', 'biathlon', 'bicycle', 'bicycle-basket', 'bicycle-cargo', 'bicycle-electric', 'bicycle-penny-farthing', 'bike', 'bike-fast', 'billboard', 'billiards', 'billiards-rack', 'binoculars', 'bio', 'biohazard', 'bird', 'bitbucket', 'bitcoin', 'black-mesa', 'blender', 'blender-outline', 'blender-software', 'blinds', 'blinds-horizontal', 'blinds-horizontal-closed', 'blinds-open', 'blinds-vertical', 'blinds-vertical-closed', 'block-helper', 'blood-bag', 'bluetooth', 'bluetooth-audio', 'bluetooth-connect', 'bluetooth-off', 'bluetooth-settings', 'bluetooth-transfer', 'blur', 'blur-linear', 'blur-off', 'blur-radial', 'bolt', 'bomb', 'bomb-off', 'bone', 'bone-off', 'book', 'book-account', 'book-account-outline', 'book-alert', 'book-alert-outline', 'book-alphabet', 'book-arrow-down', 'book-arrow-down-outline', 'book-arrow-left', 'book-arrow-left-outline', 'book-arrow-right', 'book-arrow-right-outline', 'book-arrow-up', 'book-arrow-up-outline', 'book-cancel', 'book-cancel-outline', 'book-check', 'book-check-outline', 'book-clock', 'book-clock-outline', 'book-cog', 'book-cog-outline', 'book-cross', 'book-edit', 'book-edit-outline', 'book-education', 'book-education-outline', 'book-heart', 'book-heart-outline', 'book-information-variant', 'book-lock', 'book-lock-open', 'book-lock-open-outline', 'book-lock-outline', 'book-marker', 'book-marker-outline', 'book-minus', 'book-minus-multiple', 'book-minus-multiple-outline', 'book-minus-outline', 'book-multiple', 'book-multiple-outline', 'book-music', 'book-music-outline', 'book-off', 'book-off-outline', 'book-open', 'book-open-blank-variant', 'book-open-outline', 'book-open-page-variant', 'book-open-page-variant-outline', 'book-open-variant', 'book-outline', 'book-play', 'book-play-outline', 'book-plus', 'book-plus-multiple', 'book-plus-multiple-outline', 'book-plus-outline', 'book-refresh', 'book-refresh-outline', 'book-remove', 'book-remove-multiple', 'book-remove-multiple-outline', 'book-remove-outline', 'book-search', 'book-search-outline', 'book-settings', 'book-settings-outline', 'book-sync', 'book-sync-outline', 'book-variant', 'bookmark', 'bookmark-box', 'bookmark-box-multiple', 'bookmark-box-multiple-outline', 'bookmark-box-outline', 'bookmark-check', 'bookmark-check-outline', 'bookmark-minus', 'bookmark-minus-outline', 'bookmark-multiple', 'bookmark-multiple-outline', 'bookmark-music', 'bookmark-music-outline', 'bookmark-off', 'bookmark-off-outline', 'bookmark-outline', 'bookmark-plus', 'bookmark-plus-outline', 'bookmark-remove', 'bookmark-remove-outline', 'bookshelf', 'boom-gate', 'boom-gate-alert', 'boom-gate-alert-outline', 'boom-gate-arrow-down', 'boom-gate-arrow-down-outline', 'boom-gate-arrow-up', 'boom-gate-arrow-up-outline', 'boom-gate-outline', 'boom-gate-up', 'boom-gate-up-outline', 'boombox', 'boomerang', 'bootstrap', 'border-all', 'border-all-variant', 'border-bottom', 'border-bottom-variant', 'border-color', 'border-horizontal', 'border-inside', 'border-left', 'border-left-variant', 'border-none', 'border-none-variant', 'border-outside', 'border-radius', 'border-right', 'border-right-variant', 'border-style', 'border-top', 'border-top-variant', 'border-vertical', 'bottle-soda', 'bottle-soda-classic', 'bottle-soda-classic-outline', 'bottle-soda-outline', 'bottle-tonic', 'bottle-tonic-outline', 'bottle-tonic-plus', 'bottle-tonic-plus-outline', 'bottle-tonic-skull', 'bottle-tonic-skull-outline', 'bottle-wine', 'bottle-wine-outline', 'bow-arrow', 'bow-tie', 'bowl', 'bowl-mix', 'bowl-mix-outline', 'bowl-outline', 'bowling', 'box', 'box-cutter', 'box-cutter-off', 'box-shadow', 'boxing-glove', 'braille', 'brain', 'bread-slice', 'bread-slice-outline', 'bridge', 'briefcase', 'briefcase-account', 'briefcase-account-outline', 'briefcase-arrow-left-right', 'briefcase-arrow-left-right-outline', 'briefcase-arrow-up-down', 'briefcase-arrow-up-down-outline', 'briefcase-check', 'briefcase-check-outline', 'briefcase-clock', 'briefcase-clock-outline', 'briefcase-download', 'briefcase-download-outline', 'briefcase-edit', 'briefcase-edit-outline', 'briefcase-eye', 'briefcase-eye-outline', 'briefcase-minus', 'briefcase-minus-outline', 'briefcase-off', 'briefcase-off-outline', 'briefcase-outline', 'briefcase-plus', 'briefcase-plus-outline', 'briefcase-remove', 'briefcase-remove-outline', 'briefcase-search', 'briefcase-search-outline', 'briefcase-upload', 'briefcase-upload-outline', 'briefcase-variant', 'briefcase-variant-off', 'briefcase-variant-off-outline', 'briefcase-variant-outline', 'brightness-1', 'brightness-2', 'brightness-3', 'brightness-4', 'brightness-5', 'brightness-6', 'brightness-7', 'brightness-auto', 'brightness-percent', 'broadcast', 'broadcast-off', 'broom', 'brush', 'brush-off', 'brush-outline', 'brush-variant', 'bucket', 'bucket-outline', 'buffet', 'bug', 'bug-check', 'bug-check-outline', 'bug-outline', 'bug-pause', 'bug-pause-outline', 'bug-play', 'bug-play-outline', 'bug-stop', 'bug-stop-outline', 'bugle', 'bulkhead-light', 'bulldozer', 'bullet', 'bulletin-board', 'bullhorn', 'bullhorn-outline', 'bullhorn-variant', 'bullhorn-variant-outline', 'bullseye', 'bullseye-arrow', 'bulma', 'bunk-bed', 'bunk-bed-outline', 'bus', 'bus-alert', 'bus-articulated-end', 'bus-articulated-front', 'bus-clock', 'bus-double-decker', 'bus-electric', 'bus-marker', 'bus-multiple', 'bus-school', 'bus-side', 'bus-stop', 'bus-stop-covered', 'bus-stop-uncovered', 'butterfly', 'butterfly-outline', 'button-cursor', 'button-pointer', 'cabin-a-frame', 'cable-data', 'cached', 'cactus', 'cake', 'cake-layered', 'cake-variant', 'cake-variant-outline', 'calculator', 'calculator-variant', 'calculator-variant-outline', 'calendar', 'calendar-account', 'calendar-account-outline', 'calendar-alert', 'calendar-alert-outline', 'calendar-arrow-left', 'calendar-arrow-right', 'calendar-badge', 'calendar-badge-outline', 'calendar-blank', 'calendar-blank-multiple', 'calendar-blank-outline', 'calendar-check', 'calendar-check-outline', 'calendar-clock', 'calendar-clock-outline', 'calendar-collapse-horizontal', 'calendar-collapse-horizontal-outline', 'calendar-cursor', 'calendar-cursor-outline', 'calendar-edit', 'calendar-edit-outline', 'calendar-end', 'calendar-end-outline', 'calendar-expand-horizontal', 'calendar-expand-horizontal-outline', 'calendar-export', 'calendar-export-outline', 'calendar-filter', 'calendar-filter-outline', 'calendar-heart', 'calendar-heart-outline', 'calendar-import', 'calendar-import-outline', 'calendar-lock', 'calendar-lock-open', 'calendar-lock-open-outline', 'calendar-lock-outline', 'calendar-minus', 'calendar-minus-outline', 'calendar-month', 'calendar-month-outline', 'calendar-multiple', 'calendar-multiple-check', 'calendar-multiselect', 'calendar-multiselect-outline', 'calendar-outline', 'calendar-plus', 'calendar-plus-outline', 'calendar-question', 'calendar-question-outline', 'calendar-range', 'calendar-range-outline', 'calendar-refresh', 'calendar-refresh-outline', 'calendar-remove', 'calendar-remove-outline', 'calendar-search', 'calendar-search-outline', 'calendar-star', 'calendar-star-outline', 'calendar-start', 'calendar-start-outline', 'calendar-sync', 'calendar-sync-outline', 'calendar-text', 'calendar-text-outline', 'calendar-today', 'calendar-today-outline', 'calendar-week', 'calendar-week-begin', 'calendar-week-begin-outline', 'calendar-week-outline', 'calendar-weekend', 'calendar-weekend-outline', 'call-made', 'call-merge', 'call-missed', 'call-received', 'call-split', 'camcorder', 'camcorder-off', 'camera', 'camera-account', 'camera-burst', 'camera-control', 'camera-document', 'camera-document-off', 'camera-enhance', 'camera-enhance-outline', 'camera-flip', 'camera-flip-outline', 'camera-front', 'camera-front-variant', 'camera-gopro', 'camera-image', 'camera-iris', 'camera-lock', 'camera-lock-outline', 'camera-marker', 'camera-marker-outline', 'camera-metering-center', 'camera-metering-matrix', 'camera-metering-partial', 'camera-metering-spot', 'camera-off', 'camera-off-outline', 'camera-outline', 'camera-party-mode', 'camera-plus', 'camera-plus-outline', 'camera-rear', 'camera-rear-variant', 'camera-retake', 'camera-retake-outline', 'camera-switch', 'camera-switch-outline', 'camera-timer', 'camera-wireless', 'camera-wireless-outline', 'campfire', 'cancel', 'candelabra', 'candelabra-fire', 'candle', 'candy', 'candy-off', 'candy-off-outline', 'candy-outline', 'candycane', 'cannabis', 'cannabis-off', 'caps-lock', 'car', 'car-2-plus', 'car-3-plus', 'car-arrow-left', 'car-arrow-right', 'car-back', 'car-battery', 'car-brake-abs', 'car-brake-alert', 'car-brake-fluid-level', 'car-brake-hold', 'car-brake-low-pressure', 'car-brake-parking', 'car-brake-retarder', 'car-brake-temperature', 'car-brake-worn-linings', 'car-child-seat', 'car-clock', 'car-clutch', 'car-cog', 'car-connected', 'car-convertible', 'car-coolant-level', 'car-cruise-control', 'car-defrost-front', 'car-defrost-rear', 'car-door', 'car-door-lock', 'car-electric', 'car-electric-outline', 'car-emergency', 'car-esp', 'car-estate', 'car-hatchback', 'car-info', 'car-key', 'car-lifted-pickup', 'car-light-alert', 'car-light-dimmed', 'car-light-fog', 'car-light-high', 'car-limousine', 'car-multiple', 'car-off', 'car-outline', 'car-parking-lights', 'car-pickup', 'car-search', 'car-search-outline', 'car-seat', 'car-seat-cooler', 'car-seat-heater', 'car-select', 'car-settings', 'car-shift-pattern', 'car-side', 'car-speed-limiter', 'car-sports', 'car-tire-alert', 'car-traction-control', 'car-turbocharger', 'car-wash', 'car-windshield', 'car-windshield-outline', 'car-wireless', 'car-wrench', 'carabiner', 'caravan', 'card', 'card-account-details', 'card-account-details-outline', 'card-account-details-star', 'card-account-details-star-outline', 'card-account-mail', 'card-account-mail-outline', 'card-account-phone', 'card-account-phone-outline', 'card-bulleted', 'card-bulleted-off', 'card-bulleted-off-outline', 'card-bulleted-outline', 'card-bulleted-settings', 'card-bulleted-settings-outline', 'card-minus', 'card-minus-outline', 'card-multiple', 'card-multiple-outline', 'card-off', 'card-off-outline', 'card-outline', 'card-plus', 'card-plus-outline', 'card-remove', 'card-remove-outline', 'card-search', 'card-search-outline', 'card-text', 'card-text-outline', 'cards', 'cards-club', 'cards-club-outline', 'cards-diamond', 'cards-diamond-outline', 'cards-heart', 'cards-heart-outline', 'cards-outline', 'cards-playing', 'cards-playing-club', 'cards-playing-club-multiple', 'cards-playing-club-multiple-outline', 'cards-playing-club-outline', 'cards-playing-diamond', 'cards-playing-diamond-multiple', 'cards-playing-diamond-multiple-outline', 'cards-playing-diamond-outline', 'cards-playing-heart', 'cards-playing-heart-multiple', 'cards-playing-heart-multiple-outline', 'cards-playing-heart-outline', 'cards-playing-outline', 'cards-playing-spade', 'cards-playing-spade-multiple', 'cards-playing-spade-multiple-outline', 'cards-playing-spade-outline', 'cards-spade', 'cards-spade-outline', 'cards-variant', 'carrot', 'cart', 'cart-arrow-down', 'cart-arrow-right', 'cart-arrow-up', 'cart-check', 'cart-heart', 'cart-minus', 'cart-off', 'cart-outline', 'cart-percent', 'cart-plus', 'cart-remove', 'cart-variant', 'case-sensitive-alt', 'cash', 'cash-100', 'cash-check', 'cash-clock', 'cash-fast', 'cash-lock', 'cash-lock-open', 'cash-marker', 'cash-minus', 'cash-multiple', 'cash-plus', 'cash-refund', 'cash-register', 'cash-remove', 'cash-sync', 'cassette', 'cast', 'cast-audio', 'cast-audio-variant', 'cast-connected', 'cast-education', 'cast-off', 'cast-variant', 'castle', 'cat', 'cctv', 'cctv-off', 'ceiling-fan', 'ceiling-fan-light', 'ceiling-light', 'ceiling-light-multiple', 'ceiling-light-multiple-outline', 'ceiling-light-outline', 'cellphone', 'cellphone-arrow-down', 'cellphone-arrow-down-variant', 'cellphone-basic', 'cellphone-charging', 'cellphone-check', 'cellphone-cog', 'cellphone-dock', 'cellphone-information', 'cellphone-key', 'cellphone-link', 'cellphone-link-off', 'cellphone-lock', 'cellphone-marker', 'cellphone-message', 'cellphone-message-off', 'cellphone-nfc', 'cellphone-nfc-off', 'cellphone-off', 'cellphone-play', 'cellphone-remove', 'cellphone-screenshot', 'cellphone-settings', 'cellphone-sound', 'cellphone-text', 'cellphone-wireless', 'centos', 'certificate', 'certificate-outline', 'chair-rolling', 'chair-school', 'chandelier', 'charity', 'chart-arc', 'chart-areaspline', 'chart-areaspline-variant', 'chart-bar', 'chart-bar-stacked', 'chart-bell-curve', 'chart-bell-curve-cumulative', 'chart-box', 'chart-box-outline', 'chart-box-plus-outline', 'chart-bubble', 'chart-donut', 'chart-donut-variant', 'chart-gantt', 'chart-histogram', 'chart-line', 'chart-line-stacked', 'chart-line-variant', 'chart-multiline', 'chart-multiple', 'chart-pie', 'chart-ppf', 'chart-sankey', 'chart-sankey-variant', 'chart-scatter-plot', 'chart-scatter-plot-hexbin', 'chart-timeline', 'chart-timeline-variant', 'chart-timeline-variant-shimmer', 'chart-tree', 'chart-waterfall', 'chat', 'chat-alert', 'chat-alert-outline', 'chat-minus', 'chat-minus-outline', 'chat-outline', 'chat-plus', 'chat-plus-outline', 'chat-processing', 'chat-processing-outline', 'chat-question', 'chat-question-outline', 'chat-remove', 'chat-remove-outline', 'chat-sleep', 'chat-sleep-outline', 'check', 'check-all', 'check-bold', 'check-circle', 'check-circle-outline', 'check-decagram', 'check-decagram-outline', 'check-network', 'check-network-outline', 'check-outline', 'check-underline', 'check-underline-circle', 'check-underline-circle-outline', 'checkbook', 'checkbox-blank', 'checkbox-blank-badge', 'checkbox-blank-badge-outline', 'checkbox-blank-circle', 'checkbox-blank-circle-outline', 'checkbox-blank-off', 'checkbox-blank-off-outline', 'checkbox-blank-outline', 'checkbox-intermediate', 'checkbox-intermediate-variant', 'checkbox-marked', 'checkbox-marked-circle', 'checkbox-marked-circle-outline', 'checkbox-marked-circle-plus-outline', 'checkbox-marked-outline', 'checkbox-multiple-blank', 'checkbox-multiple-blank-circle', 'checkbox-multiple-blank-circle-outline', 'checkbox-multiple-blank-outline', 'checkbox-multiple-marked', 'checkbox-multiple-marked-circle', 'checkbox-multiple-marked-circle-outline', 'checkbox-multiple-marked-outline', 'checkbox-multiple-outline', 'checkbox-outline', 'checkerboard', 'checkerboard-minus', 'checkerboard-plus', 'checkerboard-remove', 'cheese', 'cheese-off', 'chef-hat', 'chemical-weapon', 'chess-bishop', 'chess-king', 'chess-knight', 'chess-pawn', 'chess-queen', 'chess-rook', 'chevron-double-down', 'chevron-double-left', 'chevron-double-right', 'chevron-double-up', 'chevron-down', 'chevron-down-box', 'chevron-down-box-outline', 'chevron-down-circle', 'chevron-down-circle-outline', 'chevron-left', 'chevron-left-box', 'chevron-left-box-outline', 'chevron-left-circle', 'chevron-left-circle-outline', 'chevron-right', 'chevron-right-box', 'chevron-right-box-outline', 'chevron-right-circle', 'chevron-right-circle-outline', 'chevron-triple-down', 'chevron-triple-left', 'chevron-triple-right', 'chevron-triple-up', 'chevron-up', 'chevron-up-box', 'chevron-up-box-outline', 'chevron-up-circle', 'chevron-up-circle-outline', 'chili-alert', 'chili-alert-outline', 'chili-hot', 'chili-hot-outline', 'chili-medium', 'chili-medium-outline', 'chili-mild', 'chili-mild-outline', 'chili-off', 'chili-off-outline', 'chip', 'church', 'church-outline', 'cigar', 'cigar-off', 'circle', 'circle-box', 'circle-box-outline', 'circle-double', 'circle-edit-outline', 'circle-expand', 'circle-half', 'circle-half-full', 'circle-medium', 'circle-multiple', 'circle-multiple-outline', 'circle-off-outline', 'circle-opacity', 'circle-outline', 'circle-slice-1', 'circle-slice-2', 'circle-slice-3', 'circle-slice-4', 'circle-slice-5', 'circle-slice-6', 'circle-slice-7', 'circle-slice-8', 'circle-small', 'circular-saw', 'city', 'city-variant', 'city-variant-outline', 'clipboard', 'clipboard-account', 'clipboard-account-outline', 'clipboard-alert', 'clipboard-alert-outline', 'clipboard-arrow-down', 'clipboard-arrow-down-outline', 'clipboard-arrow-left', 'clipboard-arrow-left-outline', 'clipboard-arrow-right', 'clipboard-arrow-right-outline', 'clipboard-arrow-up', 'clipboard-arrow-up-outline', 'clipboard-check', 'clipboard-check-multiple', 'clipboard-check-multiple-outline', 'clipboard-check-outline', 'clipboard-clock', 'clipboard-clock-outline', 'clipboard-edit', 'clipboard-edit-outline', 'clipboard-file', 'clipboard-file-outline', 'clipboard-flow', 'clipboard-flow-outline', 'clipboard-list', 'clipboard-list-outline', 'clipboard-minus', 'clipboard-minus-outline', 'clipboard-multiple', 'clipboard-multiple-outline', 'clipboard-off', 'clipboard-off-outline', 'clipboard-outline', 'clipboard-play', 'clipboard-play-multiple', 'clipboard-play-multiple-outline', 'clipboard-play-outline', 'clipboard-plus', 'clipboard-plus-outline', 'clipboard-pulse', 'clipboard-pulse-outline', 'clipboard-remove', 'clipboard-remove-outline', 'clipboard-search', 'clipboard-search-outline', 'clipboard-text', 'clipboard-text-clock', 'clipboard-text-clock-outline', 'clipboard-text-multiple', 'clipboard-text-multiple-outline', 'clipboard-text-off', 'clipboard-text-off-outline', 'clipboard-text-outline', 'clipboard-text-play', 'clipboard-text-play-outline', 'clipboard-text-search', 'clipboard-text-search-outline', 'clippy', 'clock', 'clock-alert', 'clock-alert-outline', 'clock-check', 'clock-check-outline', 'clock-digital', 'clock-edit', 'clock-edit-outline', 'clock-end', 'clock-fast', 'clock-in', 'clock-minus', 'clock-minus-outline', 'clock-out', 'clock-outline', 'clock-plus', 'clock-plus-outline', 'clock-remove', 'clock-remove-outline', 'clock-start', 'clock-time-eight', 'clock-time-eight-outline', 'clock-time-eleven', 'clock-time-eleven-outline', 'clock-time-five', 'clock-time-five-outline', 'clock-time-four', 'clock-time-four-outline', 'clock-time-nine', 'clock-time-nine-outline', 'clock-time-one', 'clock-time-one-outline', 'clock-time-seven', 'clock-time-seven-outline', 'clock-time-six', 'clock-time-six-outline', 'clock-time-ten', 'clock-time-ten-outline', 'clock-time-three', 'clock-time-three-outline', 'clock-time-twelve', 'clock-time-twelve-outline', 'clock-time-two', 'clock-time-two-outline', 'close', 'close-box', 'close-box-multiple', 'close-box-multiple-outline', 'close-box-outline', 'close-circle', 'close-circle-multiple', 'close-circle-multiple-outline', 'close-circle-outline', 'close-network', 'close-network-outline', 'close-octagon', 'close-octagon-outline', 'close-outline', 'close-thick', 'closed-caption', 'closed-caption-outline', 'cloud', 'cloud-alert', 'cloud-braces', 'cloud-check', 'cloud-check-outline', 'cloud-circle', 'cloud-download', 'cloud-download-outline', 'cloud-lock', 'cloud-lock-outline', 'cloud-off-outline', 'cloud-outline', 'cloud-percent', 'cloud-percent-outline', 'cloud-print', 'cloud-print-outline', 'cloud-question', 'cloud-refresh', 'cloud-search', 'cloud-search-outline', 'cloud-sync', 'cloud-sync-outline', 'cloud-tags', 'cloud-upload', 'cloud-upload-outline', 'clouds', 'clover', 'coach-lamp', 'coach-lamp-variant', 'coat-rack', 'code-array', 'code-braces', 'code-braces-box', 'code-brackets', 'code-equal', 'code-greater-than', 'code-greater-than-or-equal', 'code-json', 'code-less-than', 'code-less-than-or-equal', 'code-not-equal', 'code-not-equal-variant', 'code-parentheses', 'code-parentheses-box', 'code-string', 'code-tags', 'code-tags-check', 'codepen', 'coffee', 'coffee-maker', 'coffee-maker-check', 'coffee-maker-check-outline', 'coffee-maker-outline', 'coffee-off', 'coffee-off-outline', 'coffee-outline', 'coffee-to-go', 'coffee-to-go-outline', 'coffin', 'cog', 'cog-box', 'cog-clockwise', 'cog-counterclockwise', 'cog-off', 'cog-off-outline', 'cog-outline', 'cog-pause', 'cog-pause-outline', 'cog-play', 'cog-play-outline', 'cog-refresh', 'cog-refresh-outline', 'cog-stop', 'cog-stop-outline', 'cog-sync', 'cog-sync-outline', 'cog-transfer', 'cog-transfer-outline', 'cogs', 'collage', 'collapse-all', 'collapse-all-outline', 'color-helper', 'comma', 'comma-box', 'comma-box-outline', 'comma-circle', 'comma-circle-outline', 'comment', 'comment-account', 'comment-account-outline', 'comment-alert', 'comment-alert-outline', 'comment-arrow-left', 'comment-arrow-left-outline', 'comment-arrow-right', 'comment-arrow-right-outline', 'comment-bookmark', 'comment-bookmark-outline', 'comment-check', 'comment-check-outline', 'comment-edit', 'comment-edit-outline', 'comment-eye', 'comment-eye-outline', 'comment-flash', 'comment-flash-outline', 'comment-minus', 'comment-minus-outline', 'comment-multiple', 'comment-multiple-outline', 'comment-off', 'comment-off-outline', 'comment-outline', 'comment-plus', 'comment-plus-outline', 'comment-processing', 'comment-processing-outline', 'comment-question', 'comment-question-outline', 'comment-quote', 'comment-quote-outline', 'comment-remove', 'comment-remove-outline', 'comment-search', 'comment-search-outline', 'comment-text', 'comment-text-multiple', 'comment-text-multiple-outline', 'comment-text-outline', 'compare', 'compare-horizontal', 'compare-remove', 'compare-vertical', 'compass', 'compass-off', 'compass-off-outline', 'compass-outline', 'compass-rose', 'compost', 'cone', 'cone-off', 'connection', 'console', 'console-line', 'console-network', 'console-network-outline', 'consolidate', 'contactless-payment', 'contactless-payment-circle', 'contactless-payment-circle-outline', 'contacts', 'contacts-outline', 'contain', 'contain-end', 'contain-start', 'content-copy', 'content-cut', 'content-duplicate', 'content-paste', 'content-save', 'content-save-alert', 'content-save-alert-outline', 'content-save-all', 'content-save-all-outline', 'content-save-check', 'content-save-check-outline', 'content-save-cog', 'content-save-cog-outline', 'content-save-edit', 'content-save-edit-outline', 'content-save-minus', 'content-save-minus-outline', 'content-save-move', 'content-save-move-outline', 'content-save-off', 'content-save-off-outline', 'content-save-outline', 'content-save-plus', 'content-save-plus-outline', 'content-save-settings', 'content-save-settings-outline', 'contrast', 'contrast-box', 'contrast-circle', 'controller', 'controller-classic', 'controller-classic-outline', 'controller-off', 'cookie', 'cookie-alert', 'cookie-alert-outline', 'cookie-check', 'cookie-check-outline', 'cookie-clock', 'cookie-clock-outline', 'cookie-cog', 'cookie-cog-outline', 'cookie-edit', 'cookie-edit-outline', 'cookie-lock', 'cookie-lock-outline', 'cookie-minus', 'cookie-minus-outline', 'cookie-off', 'cookie-off-outline', 'cookie-outline', 'cookie-plus', 'cookie-plus-outline', 'cookie-refresh', 'cookie-refresh-outline', 'cookie-remove', 'cookie-remove-outline', 'cookie-settings', 'cookie-settings-outline', 'coolant-temperature', 'copyleft', 'copyright', 'cordova', 'corn', 'corn-off', 'cosine-wave', 'counter', 'countertop', 'countertop-outline', 'cow', 'cow-off', 'cpu-32-bit', 'cpu-64-bit', 'cradle', 'cradle-outline', 'crane', 'creation', 'creative-commons', 'credit-card', 'credit-card-check', 'credit-card-check-outline', 'credit-card-chip', 'credit-card-chip-outline', 'credit-card-clock', 'credit-card-clock-outline', 'credit-card-edit', 'credit-card-edit-outline', 'credit-card-fast', 'credit-card-fast-outline', 'credit-card-lock', 'credit-card-lock-outline', 'credit-card-marker', 'credit-card-marker-outline', 'credit-card-minus', 'credit-card-minus-outline', 'credit-card-multiple', 'credit-card-multiple-outline', 'credit-card-off', 'credit-card-off-outline', 'credit-card-outline', 'credit-card-plus', 'credit-card-plus-outline', 'credit-card-refresh', 'credit-card-refresh-outline', 'credit-card-refund', 'credit-card-refund-outline', 'credit-card-remove', 'credit-card-remove-outline', 'credit-card-scan', 'credit-card-scan-outline', 'credit-card-search', 'credit-card-search-outline', 'credit-card-settings', 'credit-card-settings-outline', 'credit-card-sync', 'credit-card-sync-outline', 'credit-card-wireless', 'credit-card-wireless-off', 'credit-card-wireless-off-outline', 'credit-card-wireless-outline', 'cricket', 'crop', 'crop-free', 'crop-landscape', 'crop-portrait', 'crop-rotate', 'crop-square', 'cross', 'cross-bolnisi', 'cross-celtic', 'cross-outline', 'crosshairs', 'crosshairs-gps', 'crosshairs-off', 'crosshairs-question', 'crowd', 'crown', 'crown-circle', 'crown-circle-outline', 'crown-outline', 'cryengine', 'crystal-ball', 'cube', 'cube-off', 'cube-off-outline', 'cube-outline', 'cube-scan', 'cube-send', 'cube-unfolded', 'cup', 'cup-off', 'cup-off-outline', 'cup-outline', 'cup-water', 'cupboard', 'cupboard-outline', 'cupcake', 'curling', 'currency-bdt', 'currency-brl', 'currency-btc', 'currency-cny', 'currency-eth', 'currency-eur', 'currency-eur-off', 'currency-fra', 'currency-gbp', 'currency-ils', 'currency-inr', 'currency-jpy', 'currency-krw', 'currency-kzt', 'currency-mnt', 'currency-ngn', 'currency-php', 'currency-rial', 'currency-rub', 'currency-rupee', 'currency-sign', 'currency-try', 'currency-twd', 'currency-uah', 'currency-usd', 'currency-usd-off', 'current-ac', 'current-dc', 'cursor-default', 'cursor-default-click', 'cursor-default-click-outline', 'cursor-default-gesture', 'cursor-default-gesture-outline', 'cursor-default-outline', 'cursor-move', 'cursor-pointer', 'cursor-text', 'curtains', 'curtains-closed', 'cylinder', 'cylinder-off', 'dance-ballroom', 'dance-pole', 'data-matrix', 'data-matrix-edit', 'data-matrix-minus', 'data-matrix-plus', 'data-matrix-remove', 'data-matrix-scan', 'database', 'database-alert', 'database-alert-outline', 'database-arrow-down', 'database-arrow-down-outline', 'database-arrow-left', 'database-arrow-left-outline', 'database-arrow-right', 'database-arrow-right-outline', 'database-arrow-up', 'database-arrow-up-outline', 'database-check', 'database-check-outline', 'database-clock', 'database-clock-outline', 'database-cog', 'database-cog-outline', 'database-edit', 'database-edit-outline', 'database-export', 'database-export-outline', 'database-eye', 'database-eye-off', 'database-eye-off-outline', 'database-eye-outline', 'database-import', 'database-import-outline', 'database-lock', 'database-lock-outline', 'database-marker', 'database-marker-outline', 'database-minus', 'database-minus-outline', 'database-off', 'database-off-outline', 'database-outline', 'database-plus', 'database-plus-outline', 'database-refresh', 'database-refresh-outline', 'database-remove', 'database-remove-outline', 'database-search', 'database-search-outline', 'database-settings', 'database-settings-outline', 'database-sync', 'database-sync-outline', 'death-star', 'death-star-variant', 'deathly-hallows', 'debian', 'debug-step-into', 'debug-step-out', 'debug-step-over', 'decagram', 'decagram-outline', 'decimal', 'decimal-comma', 'decimal-comma-decrease', 'decimal-comma-increase', 'decimal-decrease', 'decimal-increase', 'delete', 'delete-alert', 'delete-alert-outline', 'delete-circle', 'delete-circle-outline', 'delete-clock', 'delete-clock-outline', 'delete-empty', 'delete-empty-outline', 'delete-forever', 'delete-forever-outline', 'delete-off', 'delete-off-outline', 'delete-outline', 'delete-restore', 'delete-sweep', 'delete-sweep-outline', 'delete-variant', 'delta', 'desk', 'desk-lamp', 'desk-lamp-off', 'desk-lamp-on', 'deskphone', 'desktop-classic', 'desktop-tower', 'desktop-tower-monitor', 'details', 'dev-to', 'developer-board', 'deviantart', 'devices', 'dharmachakra', 'diabetes', 'dialpad', 'diameter', 'diameter-outline', 'diameter-variant', 'diamond', 'diamond-outline', 'diamond-stone', 'dice-1', 'dice-1-outline', 'dice-2', 'dice-2-outline', 'dice-3', 'dice-3-outline', 'dice-4', 'dice-4-outline', 'dice-5', 'dice-5-outline', 'dice-6', 'dice-6-outline', 'dice-d10', 'dice-d10-outline', 'dice-d12', 'dice-d12-outline', 'dice-d20', 'dice-d20-outline', 'dice-d4', 'dice-d4-outline', 'dice-d6', 'dice-d6-outline', 'dice-d8', 'dice-d8-outline', 'dice-multiple', 'dice-multiple-outline', 'digital-ocean', 'dip-switch', 'directions', 'directions-fork', 'disc', 'disc-alert', 'disc-player', 'dishwasher', 'dishwasher-alert', 'dishwasher-off', 'disqus', 'distribute-horizontal-center', 'distribute-horizontal-left', 'distribute-horizontal-right', 'distribute-vertical-bottom', 'distribute-vertical-center', 'distribute-vertical-top', 'diversify', 'diving', 'diving-flippers', 'diving-helmet', 'diving-scuba', 'diving-scuba-flag', 'diving-scuba-mask', 'diving-scuba-tank', 'diving-scuba-tank-multiple', 'diving-snorkel', 'division', 'division-box', 'dlna', 'dna', 'dns', 'dns-outline', 'dock-bottom', 'dock-left', 'dock-right', 'dock-top', 'dock-window', 'docker', 'doctor', 'dog', 'dog-service', 'dog-side', 'dog-side-off', 'dolby', 'dolly', 'dolphin', 'domain', 'domain-off', 'domain-plus', 'domain-remove', 'dome-light', 'domino-mask', 'donkey', 'door', 'door-closed', 'door-closed-lock', 'door-open', 'door-sliding', 'door-sliding-lock', 'door-sliding-open', 'doorbell', 'doorbell-video', 'dot-net', 'dots-circle', 'dots-grid', 'dots-hexagon', 'dots-horizontal', 'dots-horizontal-circle', 'dots-horizontal-circle-outline', 'dots-square', 'dots-triangle', 'dots-vertical', 'dots-vertical-circle', 'dots-vertical-circle-outline', 'download', 'download-box', 'download-box-outline', 'download-circle', 'download-circle-outline', 'download-lock', 'download-lock-outline', 'download-multiple', 'download-network', 'download-network-outline', 'download-off', 'download-off-outline', 'download-outline', 'drag', 'drag-horizontal', 'drag-horizontal-variant', 'drag-variant', 'drag-vertical', 'drag-vertical-variant', 'drama-masks', 'draw', 'draw-pen', 'drawing', 'drawing-box', 'dresser', 'dresser-outline', 'drone', 'dropbox', 'drupal', 'duck', 'dumbbell', 'dump-truck', 'ear-hearing', 'ear-hearing-loop', 'ear-hearing-off', 'earbuds', 'earbuds-off', 'earbuds-off-outline', 'earbuds-outline', 'earth', 'earth-arrow-right', 'earth-box', 'earth-box-minus', 'earth-box-off', 'earth-box-plus', 'earth-box-remove', 'earth-minus', 'earth-off', 'earth-plus', 'earth-remove', 'egg', 'egg-easter', 'egg-fried', 'egg-off', 'egg-off-outline', 'egg-outline', 'eiffel-tower', 'eight-track', 'eject', 'eject-circle', 'eject-circle-outline', 'eject-outline', 'electric-switch', 'electric-switch-closed', 'electron-framework', 'elephant', 'elevation-decline', 'elevation-rise', 'elevator', 'elevator-down', 'elevator-passenger', 'elevator-passenger-off', 'elevator-passenger-off-outline', 'elevator-passenger-outline', 'elevator-up', 'ellipse', 'ellipse-outline', 'email', 'email-alert', 'email-alert-outline', 'email-arrow-left', 'email-arrow-left-outline', 'email-arrow-right', 'email-arrow-right-outline', 'email-box', 'email-check', 'email-check-outline', 'email-edit', 'email-edit-outline', 'email-fast', 'email-fast-outline', 'email-lock', 'email-lock-outline', 'email-mark-as-unread', 'email-minus', 'email-minus-outline', 'email-multiple', 'email-multiple-outline', 'email-newsletter', 'email-off', 'email-off-outline', 'email-open', 'email-open-multiple', 'email-open-multiple-outline', 'email-open-outline', 'email-outline', 'email-plus', 'email-plus-outline', 'email-remove', 'email-remove-outline', 'email-seal', 'email-seal-outline', 'email-search', 'email-search-outline', 'email-sync', 'email-sync-outline', 'email-variant', 'ember', 'emby', 'emoticon', 'emoticon-angry', 'emoticon-angry-outline', 'emoticon-confused', 'emoticon-confused-outline', 'emoticon-cool', 'emoticon-cool-outline', 'emoticon-cry', 'emoticon-cry-outline', 'emoticon-dead', 'emoticon-dead-outline', 'emoticon-devil', 'emoticon-devil-outline', 'emoticon-excited', 'emoticon-excited-outline', 'emoticon-frown', 'emoticon-frown-outline', 'emoticon-happy', 'emoticon-happy-outline', 'emoticon-kiss', 'emoticon-kiss-outline', 'emoticon-lol', 'emoticon-lol-outline', 'emoticon-neutral', 'emoticon-neutral-outline', 'emoticon-outline', 'emoticon-poop', 'emoticon-poop-outline', 'emoticon-sad', 'emoticon-sad-outline', 'emoticon-sick', 'emoticon-sick-outline', 'emoticon-tongue', 'emoticon-tongue-outline', 'emoticon-wink', 'emoticon-wink-outline', 'engine', 'engine-off', 'engine-off-outline', 'engine-outline', 'epsilon', 'equal', 'equal-box', 'equalizer', 'equalizer-outline', 'eraser', 'eraser-variant', 'escalator', 'escalator-box', 'escalator-down', 'escalator-up', 'eslint', 'et', 'ethereum', 'ethernet', 'ethernet-cable', 'ethernet-cable-off', 'ev-plug-ccs1', 'ev-plug-ccs2', 'ev-plug-chademo', 'ev-plug-tesla', 'ev-plug-type1', 'ev-plug-type2', 'ev-station', 'evernote', 'excavator', 'exclamation', 'exclamation-thick', 'exit-run', 'exit-to-app', 'expand-all', 'expand-all-outline', 'expansion-card', 'expansion-card-variant', 'exponent', 'exponent-box', 'export', 'export-variant', 'eye', 'eye-arrow-left', 'eye-arrow-left-outline', 'eye-arrow-right', 'eye-arrow-right-outline', 'eye-check', 'eye-check-outline', 'eye-circle', 'eye-circle-outline', 'eye-minus', 'eye-minus-outline', 'eye-off', 'eye-off-outline', 'eye-outline', 'eye-plus', 'eye-plus-outline', 'eye-refresh', 'eye-refresh-outline', 'eye-remove', 'eye-remove-outline', 'eye-settings', 'eye-settings-outline', 'eyedropper', 'eyedropper-minus', 'eyedropper-off', 'eyedropper-plus', 'eyedropper-remove', 'eyedropper-variant', 'face-agent', 'face-man', 'face-man-outline', 'face-man-profile', 'face-man-shimmer', 'face-man-shimmer-outline', 'face-mask', 'face-mask-outline', 'face-recognition', 'face-woman', 'face-woman-outline', 'face-woman-profile', 'face-woman-shimmer', 'face-woman-shimmer-outline', 'facebook', 'facebook-gaming', 'facebook-messenger', 'facebook-workplace', 'factory', 'family-tree', 'fan', 'fan-alert', 'fan-auto', 'fan-chevron-down', 'fan-chevron-up', 'fan-clock', 'fan-minus', 'fan-off', 'fan-plus', 'fan-remove', 'fan-speed-1', 'fan-speed-2', 'fan-speed-3', 'fast-forward', 'fast-forward-10', 'fast-forward-15', 'fast-forward-30', 'fast-forward-45', 'fast-forward-5', 'fast-forward-60', 'fast-forward-outline', 'faucet', 'faucet-variant', 'fax', 'feather', 'feature-search', 'feature-search-outline', 'fedora', 'fence', 'fence-electric', 'fencing', 'ferris-wheel', 'ferry', 'file', 'file-account', 'file-account-outline', 'file-alert', 'file-alert-outline', 'file-arrow-left-right', 'file-arrow-left-right-outline', 'file-arrow-up-down', 'file-arrow-up-down-outline', 'file-cabinet', 'file-cad', 'file-cad-box', 'file-cancel', 'file-cancel-outline', 'file-certificate', 'file-certificate-outline', 'file-chart', 'file-chart-check', 'file-chart-check-outline', 'file-chart-outline', 'file-check', 'file-check-outline', 'file-clock', 'file-clock-outline', 'file-cloud', 'file-cloud-outline', 'file-code', 'file-code-outline', 'file-cog', 'file-cog-outline', 'file-compare', 'file-delimited', 'file-delimited-outline', 'file-document', 'file-document-alert', 'file-document-alert-outline', 'file-document-check', 'file-document-check-outline', 'file-document-edit', 'file-document-edit-outline', 'file-document-minus', 'file-document-minus-outline', 'file-document-multiple', 'file-document-multiple-outline', 'file-document-outline', 'file-document-plus', 'file-document-plus-outline', 'file-document-remove', 'file-document-remove-outline', 'file-download', 'file-download-outline', 'file-edit', 'file-edit-outline', 'file-excel', 'file-excel-box', 'file-excel-box-outline', 'file-excel-outline', 'file-export', 'file-export-outline', 'file-eye', 'file-eye-outline', 'file-find', 'file-find-outline', 'file-gif-box', 'file-hidden', 'file-image', 'file-image-marker', 'file-image-marker-outline', 'file-image-minus', 'file-image-minus-outline', 'file-image-outline', 'file-image-plus', 'file-image-plus-outline', 'file-image-remove', 'file-image-remove-outline', 'file-import', 'file-import-outline', 'file-jpg-box', 'file-key', 'file-key-outline', 'file-link', 'file-link-outline', 'file-lock', 'file-lock-open', 'file-lock-open-outline', 'file-lock-outline', 'file-marker', 'file-marker-outline', 'file-minus', 'file-minus-outline', 'file-move', 'file-move-outline', 'file-multiple', 'file-multiple-outline', 'file-music', 'file-music-outline', 'file-outline', 'file-pdf-box', 'file-percent', 'file-percent-outline', 'file-phone', 'file-phone-outline', 'file-plus', 'file-plus-outline', 'file-png-box', 'file-powerpoint', 'file-powerpoint-box', 'file-powerpoint-box-outline', 'file-powerpoint-outline', 'file-presentation-box', 'file-question', 'file-question-outline', 'file-refresh', 'file-refresh-outline', 'file-remove', 'file-remove-outline', 'file-replace', 'file-replace-outline', 'file-restore', 'file-restore-outline', 'file-rotate-left', 'file-rotate-left-outline', 'file-rotate-right', 'file-rotate-right-outline', 'file-search', 'file-search-outline', 'file-send', 'file-send-outline', 'file-settings', 'file-settings-outline', 'file-sign', 'file-star', 'file-star-outline', 'file-swap', 'file-swap-outline', 'file-sync', 'file-sync-outline', 'file-table', 'file-table-box', 'file-table-box-multiple', 'file-table-box-multiple-outline', 'file-table-box-outline', 'file-table-outline', 'file-tree', 'file-tree-outline', 'file-undo', 'file-undo-outline', 'file-upload', 'file-upload-outline', 'file-video', 'file-video-outline', 'file-word', 'file-word-box', 'file-word-box-outline', 'file-word-outline', 'file-xml-box', 'film', 'filmstrip', 'filmstrip-box', 'filmstrip-box-multiple', 'filmstrip-off', 'filter', 'filter-check', 'filter-check-outline', 'filter-cog', 'filter-cog-outline', 'filter-menu', 'filter-menu-outline', 'filter-minus', 'filter-minus-outline', 'filter-multiple', 'filter-multiple-outline', 'filter-off', 'filter-off-outline', 'filter-outline', 'filter-plus', 'filter-plus-outline', 'filter-remove', 'filter-remove-outline', 'filter-settings', 'filter-settings-outline', 'filter-variant', 'filter-variant-minus', 'filter-variant-plus', 'filter-variant-remove', 'finance', 'find-replace', 'fingerprint', 'fingerprint-off', 'fire', 'fire-alert', 'fire-circle', 'fire-extinguisher', 'fire-hydrant', 'fire-hydrant-alert', 'fire-hydrant-off', 'fire-off', 'fire-truck', 'firebase', 'firefox', 'fireplace', 'fireplace-off', 'firewire', 'firework', 'firework-off', 'fish', 'fish-off', 'fishbowl', 'fishbowl-outline', 'fit-to-page', 'fit-to-page-outline', 'fit-to-screen', 'fit-to-screen-outline', 'flag', 'flag-checkered', 'flag-minus', 'flag-minus-outline', 'flag-off', 'flag-off-outline', 'flag-outline', 'flag-plus', 'flag-plus-outline', 'flag-remove', 'flag-remove-outline', 'flag-triangle', 'flag-variant', 'flag-variant-minus', 'flag-variant-minus-outline', 'flag-variant-off', 'flag-variant-off-outline', 'flag-variant-outline', 'flag-variant-plus', 'flag-variant-plus-outline', 'flag-variant-remove', 'flag-variant-remove-outline', 'flare', 'flash', 'flash-alert', 'flash-alert-outline', 'flash-auto', 'flash-off', 'flash-off-outline', 'flash-outline', 'flash-red-eye', 'flash-triangle', 'flash-triangle-outline', 'flashlight', 'flashlight-off', 'flask', 'flask-empty', 'flask-empty-minus', 'flask-empty-minus-outline', 'flask-empty-off', 'flask-empty-off-outline', 'flask-empty-outline', 'flask-empty-plus', 'flask-empty-plus-outline', 'flask-empty-remove', 'flask-empty-remove-outline', 'flask-minus', 'flask-minus-outline', 'flask-off', 'flask-off-outline', 'flask-outline', 'flask-plus', 'flask-plus-outline', 'flask-remove', 'flask-remove-outline', 'flask-round-bottom', 'flask-round-bottom-empty', 'flask-round-bottom-empty-outline', 'flask-round-bottom-outline', 'fleur-de-lis', 'flip-horizontal', 'flip-to-back', 'flip-to-front', 'flip-vertical', 'floor-lamp', 'floor-lamp-dual', 'floor-lamp-dual-outline', 'floor-lamp-outline', 'floor-lamp-torchiere', 'floor-lamp-torchiere-outline', 'floor-lamp-torchiere-variant', 'floor-lamp-torchiere-variant-outline', 'floor-plan', 'floppy', 'floppy-variant', 'flower', 'flower-outline', 'flower-pollen', 'flower-pollen-outline', 'flower-poppy', 'flower-tulip', 'flower-tulip-outline', 'focus-auto', 'focus-field', 'focus-field-horizontal', 'focus-field-vertical', 'folder', 'folder-account', 'folder-account-outline', 'folder-alert', 'folder-alert-outline', 'folder-arrow-down', 'folder-arrow-down-outline', 'folder-arrow-left', 'folder-arrow-left-outline', 'folder-arrow-left-right', 'folder-arrow-left-right-outline', 'folder-arrow-right', 'folder-arrow-right-outline', 'folder-arrow-up', 'folder-arrow-up-down', 'folder-arrow-up-down-outline', 'folder-arrow-up-outline', 'folder-cancel', 'folder-cancel-outline', 'folder-check', 'folder-check-outline', 'folder-clock', 'folder-clock-outline', 'folder-cog', 'folder-cog-outline', 'folder-download', 'folder-download-outline', 'folder-edit', 'folder-edit-outline', 'folder-eye', 'folder-eye-outline', 'folder-file', 'folder-file-outline', 'folder-google-drive', 'folder-heart', 'folder-heart-outline', 'folder-hidden', 'folder-home', 'folder-home-outline', 'folder-image', 'folder-information', 'folder-information-outline', 'folder-key', 'folder-key-network', 'folder-key-network-outline', 'folder-key-outline', 'folder-lock', 'folder-lock-open', 'folder-lock-open-outline', 'folder-lock-outline', 'folder-marker', 'folder-marker-outline', 'folder-minus', 'folder-minus-outline', 'folder-move', 'folder-move-outline', 'folder-multiple', 'folder-multiple-image', 'folder-multiple-outline', 'folder-multiple-plus', 'folder-multiple-plus-outline', 'folder-music', 'folder-music-outline', 'folder-network', 'folder-network-outline', 'folder-off', 'folder-off-outline', 'folder-open', 'folder-open-outline', 'folder-outline', 'folder-play', 'folder-play-outline', 'folder-plus', 'folder-plus-outline', 'folder-pound', 'folder-pound-outline', 'folder-question', 'folder-question-outline', 'folder-refresh', 'folder-refresh-outline', 'folder-remove', 'folder-remove-outline', 'folder-search', 'folder-search-outline', 'folder-settings', 'folder-settings-outline', 'folder-star', 'folder-star-multiple', 'folder-star-multiple-outline', 'folder-star-outline', 'folder-swap', 'folder-swap-outline', 'folder-sync', 'folder-sync-outline', 'folder-table', 'folder-table-outline', 'folder-text', 'folder-text-outline', 'folder-upload', 'folder-upload-outline', 'folder-wrench', 'folder-wrench-outline', 'folder-zip', 'folder-zip-outline', 'font-awesome', 'food', 'food-apple', 'food-apple-outline', 'food-croissant', 'food-drumstick', 'food-drumstick-off', 'food-drumstick-off-outline', 'food-drumstick-outline', 'food-fork-drink', 'food-halal', 'food-hot-dog', 'food-kosher', 'food-off', 'food-off-outline', 'food-outline', 'food-steak', 'food-steak-off', 'food-takeout-box', 'food-takeout-box-outline', 'food-turkey', 'food-variant', 'food-variant-off', 'foot-print', 'football', 'football-australian', 'football-helmet', 'forest', 'forklift', 'form-dropdown', 'form-select', 'form-textarea', 'form-textbox', 'form-textbox-lock', 'form-textbox-password', 'format-align-bottom', 'format-align-center', 'format-align-justify', 'format-align-left', 'format-align-middle', 'format-align-right', 'format-align-top', 'format-annotation-minus', 'format-annotation-plus', 'format-bold', 'format-clear', 'format-color-fill', 'format-color-highlight', 'format-color-marker-cancel', 'format-color-text', 'format-columns', 'format-float-center', 'format-float-left', 'format-float-none', 'format-float-right', 'format-font', 'format-font-size-decrease', 'format-font-size-increase', 'format-header-1', 'format-header-2', 'format-header-3', 'format-header-4', 'format-header-5', 'format-header-6', 'format-header-decrease', 'format-header-equal', 'format-header-increase', 'format-header-pound', 'format-horizontal-align-center', 'format-horizontal-align-left', 'format-horizontal-align-right', 'format-indent-decrease', 'format-indent-increase', 'format-italic', 'format-letter-case', 'format-letter-case-lower', 'format-letter-case-upper', 'format-letter-ends-with', 'format-letter-matches', 'format-letter-spacing', 'format-letter-spacing-variant', 'format-letter-starts-with', 'format-line-height', 'format-line-spacing', 'format-line-style', 'format-line-weight', 'format-list-bulleted', 'format-list-bulleted-square', 'format-list-bulleted-triangle', 'format-list-bulleted-type', 'format-list-checkbox', 'format-list-checks', 'format-list-group', 'format-list-group-plus', 'format-list-numbered', 'format-list-numbered-rtl', 'format-list-text', 'format-overline', 'format-page-break', 'format-page-split', 'format-paint', 'format-paragraph', 'format-paragraph-spacing', 'format-pilcrow', 'format-pilcrow-arrow-left', 'format-pilcrow-arrow-right', 'format-quote-close', 'format-quote-close-outline', 'format-quote-open', 'format-quote-open-outline', 'format-rotate-90', 'format-section', 'format-size', 'format-strikethrough', 'format-strikethrough-variant', 'format-subscript', 'format-superscript', 'format-text', 'format-text-rotation-angle-down', 'format-text-rotation-angle-up', 'format-text-rotation-down', 'format-text-rotation-down-vertical', 'format-text-rotation-none', 'format-text-rotation-up', 'format-text-rotation-vertical', 'format-text-variant', 'format-text-variant-outline', 'format-text-wrapping-clip', 'format-text-wrapping-overflow', 'format-text-wrapping-wrap', 'format-textbox', 'format-title', 'format-underline', 'format-underline-wavy', 'format-vertical-align-bottom', 'format-vertical-align-center', 'format-vertical-align-top', 'format-wrap-inline', 'format-wrap-square', 'format-wrap-tight', 'format-wrap-top-bottom', 'forum', 'forum-minus', 'forum-minus-outline', 'forum-outline', 'forum-plus', 'forum-plus-outline', 'forum-remove', 'forum-remove-outline', 'forward', 'forwardburger', 'fountain', 'fountain-pen', 'fountain-pen-tip', 'fraction-one-half', 'freebsd', 'french-fries', 'frequently-asked-questions', 'fridge', 'fridge-alert', 'fridge-alert-outline', 'fridge-bottom', 'fridge-industrial', 'fridge-industrial-alert', 'fridge-industrial-alert-outline', 'fridge-industrial-off', 'fridge-industrial-off-outline', 'fridge-industrial-outline', 'fridge-off', 'fridge-off-outline', 'fridge-outline', 'fridge-top', 'fridge-variant', 'fridge-variant-alert', 'fridge-variant-alert-outline', 'fridge-variant-off', 'fridge-variant-off-outline', 'fridge-variant-outline', 'fruit-cherries', 'fruit-cherries-off', 'fruit-citrus', 'fruit-citrus-off', 'fruit-grapes', 'fruit-grapes-outline', 'fruit-pear', 'fruit-pineapple', 'fruit-watermelon', 'fuel', 'fuel-cell', 'fullscreen', 'fullscreen-exit', 'function', 'function-variant', 'furigana-horizontal', 'furigana-vertical', 'fuse', 'fuse-alert', 'fuse-blade', 'fuse-off', 'gamepad', 'gamepad-circle', 'gamepad-circle-down', 'gamepad-circle-left', 'gamepad-circle-outline', 'gamepad-circle-right', 'gamepad-circle-up', 'gamepad-down', 'gamepad-left', 'gamepad-outline', 'gamepad-right', 'gamepad-round', 'gamepad-round-down', 'gamepad-round-left', 'gamepad-round-outline', 'gamepad-round-right', 'gamepad-round-up', 'gamepad-square', 'gamepad-square-outline', 'gamepad-up', 'gamepad-variant', 'gamepad-variant-outline', 'gamma', 'gantry-crane', 'garage', 'garage-alert', 'garage-alert-variant', 'garage-lock', 'garage-open', 'garage-open-variant', 'garage-variant', 'garage-variant-lock', 'gas-burner', 'gas-cylinder', 'gas-station', 'gas-station-off', 'gas-station-off-outline', 'gas-station-outline', 'gate', 'gate-alert', 'gate-and', 'gate-arrow-left', 'gate-arrow-right', 'gate-buffer', 'gate-nand', 'gate-nor', 'gate-not', 'gate-open', 'gate-or', 'gate-xnor', 'gate-xor', 'gatsby', 'gauge', 'gauge-empty', 'gauge-full', 'gauge-low', 'gavel', 'gender-female', 'gender-male', 'gender-male-female', 'gender-male-female-variant', 'gender-non-binary', 'gender-transgender', 'gentoo', 'gesture', 'gesture-double-tap', 'gesture-pinch', 'gesture-spread', 'gesture-swipe', 'gesture-swipe-down', 'gesture-swipe-horizontal', 'gesture-swipe-left', 'gesture-swipe-right', 'gesture-swipe-up', 'gesture-swipe-vertical', 'gesture-tap', 'gesture-tap-box', 'gesture-tap-button', 'gesture-tap-hold', 'gesture-two-double-tap', 'gesture-two-tap', 'ghost', 'ghost-off', 'ghost-off-outline', 'ghost-outline', 'gift', 'gift-off', 'gift-off-outline', 'gift-open', 'gift-open-outline', 'gift-outline', 'git', 'github', 'gitlab', 'glass-cocktail', 'glass-cocktail-off', 'glass-flute', 'glass-fragile', 'glass-mug', 'glass-mug-off', 'glass-mug-variant', 'glass-mug-variant-off', 'glass-pint-outline', 'glass-stange', 'glass-tulip', 'glass-wine', 'glasses', 'globe-light', 'globe-light-outline', 'globe-model', 'gmail', 'gnome', 'go-kart', 'go-kart-track', 'gog', 'gold', 'golf', 'golf-cart', 'golf-tee', 'gondola', 'goodreads', 'google', 'google-ads', 'google-analytics', 'google-assistant', 'google-cardboard', 'google-chrome', 'google-circles', 'google-circles-communities', 'google-circles-extended', 'google-circles-group', 'google-classroom', 'google-cloud', 'google-downasaur', 'google-drive', 'google-earth', 'google-fit', 'google-glass', 'google-hangouts', 'google-keep', 'google-lens', 'google-maps', 'google-my-business', 'google-nearby', 'google-play', 'google-plus', 'google-podcast', 'google-spreadsheet', 'google-street-view', 'google-translate', 'gradient-horizontal', 'gradient-vertical', 'grain', 'graph', 'graph-outline', 'graphql', 'grass', 'grave-stone', 'grease-pencil', 'greater-than', 'greater-than-or-equal', 'greenhouse', 'grid', 'grid-large', 'grid-off', 'grill', 'grill-outline', 'group', 'guitar-acoustic', 'guitar-electric', 'guitar-pick', 'guitar-pick-outline', 'guy-fawkes-mask', 'gymnastics', 'hail', 'hair-dryer', 'hair-dryer-outline', 'halloween', 'hamburger', 'hamburger-check', 'hamburger-minus', 'hamburger-off', 'hamburger-plus', 'hamburger-remove', 'hammer', 'hammer-screwdriver', 'hammer-sickle', 'hammer-wrench', 'hand-back-left', 'hand-back-left-off', 'hand-back-left-off-outline', 'hand-back-left-outline', 'hand-back-right', 'hand-back-right-off', 'hand-back-right-off-outline', 'hand-back-right-outline', 'hand-clap', 'hand-clap-off', 'hand-coin', 'hand-coin-outline', 'hand-cycle', 'hand-extended', 'hand-extended-outline', 'hand-front-left', 'hand-front-left-outline', 'hand-front-right', 'hand-front-right-outline', 'hand-heart', 'hand-heart-outline', 'hand-okay', 'hand-peace', 'hand-peace-variant', 'hand-pointing-down', 'hand-pointing-left', 'hand-pointing-right', 'hand-pointing-up', 'hand-saw', 'hand-wash', 'hand-wash-outline', 'hand-water', 'hand-wave', 'hand-wave-outline', 'handball', 'handcuffs', 'hands-pray', 'handshake', 'handshake-outline', 'hanger', 'hard-hat', 'harddisk', 'harddisk-plus', 'harddisk-remove', 'hat-fedora', 'hazard-lights', 'hdmi-port', 'hdr', 'hdr-off', 'head', 'head-alert', 'head-alert-outline', 'head-check', 'head-check-outline', 'head-cog', 'head-cog-outline', 'head-dots-horizontal', 'head-dots-horizontal-outline', 'head-flash', 'head-flash-outline', 'head-heart', 'head-heart-outline', 'head-lightbulb', 'head-lightbulb-outline', 'head-minus', 'head-minus-outline', 'head-outline', 'head-plus', 'head-plus-outline', 'head-question', 'head-question-outline', 'head-remove', 'head-remove-outline', 'head-snowflake', 'head-snowflake-outline', 'head-sync', 'head-sync-outline', 'headphones', 'headphones-bluetooth', 'headphones-box', 'headphones-off', 'headphones-settings', 'headset', 'headset-dock', 'headset-off', 'heart', 'heart-box', 'heart-box-outline', 'heart-broken', 'heart-broken-outline', 'heart-circle', 'heart-circle-outline', 'heart-cog', 'heart-cog-outline', 'heart-flash', 'heart-half', 'heart-half-full', 'heart-half-outline', 'heart-minus', 'heart-minus-outline', 'heart-multiple', 'heart-multiple-outline', 'heart-off', 'heart-off-outline', 'heart-outline', 'heart-plus', 'heart-plus-outline', 'heart-pulse', 'heart-remove', 'heart-remove-outline', 'heart-settings', 'heart-settings-outline', 'heat-pump', 'heat-pump-outline', 'heat-wave', 'heating-coil', 'helicopter', 'help', 'help-box', 'help-circle', 'help-circle-outline', 'help-network', 'help-network-outline', 'help-rhombus', 'help-rhombus-outline', 'hexadecimal', 'hexagon', 'hexagon-multiple', 'hexagon-multiple-outline', 'hexagon-outline', 'hexagon-slice-1', 'hexagon-slice-2', 'hexagon-slice-3', 'hexagon-slice-4', 'hexagon-slice-5', 'hexagon-slice-6', 'hexagram', 'hexagram-outline', 'high-definition', 'high-definition-box', 'highway', 'hiking', 'history', 'hockey-puck', 'hockey-sticks', 'hololens', 'home', 'home-account', 'home-alert', 'home-alert-outline', 'home-analytics', 'home-assistant', 'home-automation', 'home-battery', 'home-battery-outline', 'home-circle', 'home-circle-outline', 'home-city', 'home-city-outline', 'home-clock', 'home-clock-outline', 'home-edit', 'home-edit-outline', 'home-export-outline', 'home-flood', 'home-floor-0', 'home-floor-1', 'home-floor-2', 'home-floor-3', 'home-floor-a', 'home-floor-b', 'home-floor-g', 'home-floor-l', 'home-floor-negative-1', 'home-group', 'home-group-minus', 'home-group-plus', 'home-group-remove', 'home-heart', 'home-import-outline', 'home-lightbulb', 'home-lightbulb-outline', 'home-lightning-bolt', 'home-lightning-bolt-outline', 'home-lock', 'home-lock-open', 'home-map-marker', 'home-minus', 'home-minus-outline', 'home-modern', 'home-off', 'home-off-outline', 'home-outline', 'home-plus', 'home-plus-outline', 'home-remove', 'home-remove-outline', 'home-roof', 'home-search', 'home-search-outline', 'home-silo', 'home-silo-outline', 'home-switch', 'home-switch-outline', 'home-thermometer', 'home-thermometer-outline', 'home-variant', 'home-variant-outline', 'hook', 'hook-off', 'hoop-house', 'hops', 'horizontal-rotate-clockwise', 'horizontal-rotate-counterclockwise', 'horse', 'horse-human', 'horse-variant', 'horse-variant-fast', 'horseshoe', 'hospital', 'hospital-box', 'hospital-box-outline', 'hospital-building', 'hospital-marker', 'hot-tub', 'hours-24', 'hubspot', 'hulu', 'human', 'human-baby-changing-table', 'human-cane', 'human-capacity-decrease', 'human-capacity-increase', 'human-child', 'human-dolly', 'human-edit', 'human-female', 'human-female-boy', 'human-female-dance', 'human-female-female', 'human-female-girl', 'human-greeting', 'human-greeting-proximity', 'human-greeting-variant', 'human-handsdown', 'human-handsup', 'human-male', 'human-male-board', 'human-male-board-poll', 'human-male-boy', 'human-male-child', 'human-male-female', 'human-male-female-child', 'human-male-girl', 'human-male-height', 'human-male-height-variant', 'human-male-male', 'human-non-binary', 'human-pregnant', 'human-queue', 'human-scooter', 'human-walker', 'human-wheelchair', 'human-white-cane', 'humble-bundle', 'hvac', 'hvac-off', 'hydraulic-oil-level', 'hydraulic-oil-temperature', 'hydro-power', 'hydrogen-station', 'ice-cream', 'ice-cream-off', 'ice-pop', 'id-card', 'identifier', 'ideogram-cjk', 'ideogram-cjk-variant', 'image', 'image-album', 'image-area', 'image-area-close', 'image-auto-adjust', 'image-broken', 'image-broken-variant', 'image-check', 'image-check-outline', 'image-edit', 'image-edit-outline', 'image-filter-black-white', 'image-filter-center-focus', 'image-filter-center-focus-strong', 'image-filter-center-focus-strong-outline', 'image-filter-center-focus-weak', 'image-filter-drama', 'image-filter-frames', 'image-filter-hdr', 'image-filter-none', 'image-filter-tilt-shift', 'image-filter-vintage', 'image-frame', 'image-lock', 'image-lock-outline', 'image-marker', 'image-marker-outline', 'image-minus', 'image-minus-outline', 'image-move', 'image-multiple', 'image-multiple-outline', 'image-off', 'image-off-outline', 'image-outline', 'image-plus', 'image-plus-outline', 'image-refresh', 'image-refresh-outline', 'image-remove', 'image-remove-outline', 'image-search', 'image-search-outline', 'image-size-select-actual', 'image-size-select-large', 'image-size-select-small', 'image-sync', 'image-sync-outline', 'image-text', 'import', 'inbox', 'inbox-arrow-down', 'inbox-arrow-down-outline', 'inbox-arrow-up', 'inbox-arrow-up-outline', 'inbox-full', 'inbox-full-outline', 'inbox-multiple', 'inbox-multiple-outline', 'inbox-outline', 'inbox-remove', 'inbox-remove-outline', 'incognito', 'incognito-circle', 'incognito-circle-off', 'incognito-off', 'induction', 'infinity', 'information', 'information-off', 'information-off-outline', 'information-outline', 'information-variant', 'instagram', 'instrument-triangle', 'integrated-circuit-chip', 'invert-colors', 'invert-colors-off', 'iobroker', 'ip', 'ip-network', 'ip-network-outline', 'ip-outline', 'ipod', 'iron', 'iron-board', 'iron-outline', 'island', 'iv-bag', 'jabber', 'jeepney', 'jellyfish', 'jellyfish-outline', 'jira', 'jquery', 'jsfiddle', 'jump-rope', 'kabaddi', 'kangaroo', 'karate', 'kayaking', 'keg', 'kettle', 'kettle-alert', 'kettle-alert-outline', 'kettle-off', 'kettle-off-outline', 'kettle-outline', 'kettle-pour-over', 'kettle-steam', 'kettle-steam-outline', 'kettlebell', 'key', 'key-alert', 'key-alert-outline', 'key-arrow-right', 'key-chain', 'key-chain-variant', 'key-change', 'key-link', 'key-minus', 'key-outline', 'key-plus', 'key-remove', 'key-star', 'key-variant', 'key-wireless', 'keyboard', 'keyboard-backspace', 'keyboard-caps', 'keyboard-close', 'keyboard-esc', 'keyboard-f1', 'keyboard-f10', 'keyboard-f11', 'keyboard-f12', 'keyboard-f2', 'keyboard-f3', 'keyboard-f4', 'keyboard-f5', 'keyboard-f6', 'keyboard-f7', 'keyboard-f8', 'keyboard-f9', 'keyboard-off', 'keyboard-off-outline', 'keyboard-outline', 'keyboard-return', 'keyboard-settings', 'keyboard-settings-outline', 'keyboard-space', 'keyboard-tab', 'keyboard-tab-reverse', 'keyboard-variant', 'khanda', 'kickstarter', 'kite', 'kite-outline', 'kitesurfing', 'klingon', 'knife', 'knife-military', 'knob', 'koala', 'kodi', 'kubernetes', 'label', 'label-multiple', 'label-multiple-outline', 'label-off', 'label-off-outline', 'label-outline', 'label-percent', 'label-percent-outline', 'label-variant', 'label-variant-outline', 'ladder', 'ladybug', 'lambda', 'lamp', 'lamp-outline', 'lamps', 'lamps-outline', 'lan', 'lan-check', 'lan-connect', 'lan-disconnect', 'lan-pending', 'land-fields', 'land-plots', 'land-plots-circle', 'land-plots-circle-variant', 'land-rows-horizontal', 'land-rows-vertical', 'landslide', 'landslide-outline', 'language-c', 'language-cpp', 'language-csharp', 'language-css3', 'language-fortran', 'language-go', 'language-haskell', 'language-html5', 'language-java', 'language-javascript', 'language-kotlin', 'language-lua', 'language-markdown', 'language-markdown-outline', 'language-php', 'language-python', 'language-r', 'language-ruby', 'language-ruby-on-rails', 'language-rust', 'language-swift', 'language-typescript', 'language-xaml', 'laptop', 'laptop-account', 'laptop-off', 'laravel', 'laser-pointer', 'lasso', 'lastpass', 'latitude', 'launch', 'lava-lamp', 'layers', 'layers-edit', 'layers-minus', 'layers-off', 'layers-off-outline', 'layers-outline', 'layers-plus', 'layers-remove', 'layers-search', 'layers-search-outline', 'layers-triple', 'layers-triple-outline', 'lead-pencil', 'leaf', 'leaf-circle', 'leaf-circle-outline', 'leaf-maple', 'leaf-maple-off', 'leaf-off', 'leak', 'leak-off', 'lectern', 'led-off', 'led-on', 'led-outline', 'led-strip', 'led-strip-variant', 'led-strip-variant-off', 'led-variant-off', 'led-variant-on', 'led-variant-outline', 'leek', 'less-than', 'less-than-or-equal', 'library', 'library-outline', 'library-shelves', 'license', 'lifebuoy', 'light-flood-down', 'light-flood-up', 'light-recessed', 'light-switch', 'light-switch-off', 'lightbulb', 'lightbulb-alert', 'lightbulb-alert-outline', 'lightbulb-auto', 'lightbulb-auto-outline', 'lightbulb-cfl', 'lightbulb-cfl-off', 'lightbulb-cfl-spiral', 'lightbulb-cfl-spiral-off', 'lightbulb-fluorescent-tube', 'lightbulb-fluorescent-tube-outline', 'lightbulb-group', 'lightbulb-group-off', 'lightbulb-group-off-outline', 'lightbulb-group-outline', 'lightbulb-multiple', 'lightbulb-multiple-off', 'lightbulb-multiple-off-outline', 'lightbulb-multiple-outline', 'lightbulb-night', 'lightbulb-night-outline', 'lightbulb-off', 'lightbulb-off-outline', 'lightbulb-on', 'lightbulb-on-10', 'lightbulb-on-20', 'lightbulb-on-30', 'lightbulb-on-40', 'lightbulb-on-50', 'lightbulb-on-60', 'lightbulb-on-70', 'lightbulb-on-80', 'lightbulb-on-90', 'lightbulb-on-outline', 'lightbulb-outline', 'lightbulb-question', 'lightbulb-question-outline', 'lightbulb-spot', 'lightbulb-spot-off', 'lightbulb-variant', 'lightbulb-variant-outline', 'lighthouse', 'lighthouse-on', 'lightning-bolt', 'lightning-bolt-circle', 'lightning-bolt-outline', 'line-scan', 'lingerie', 'link', 'link-box', 'link-box-outline', 'link-box-variant', 'link-box-variant-outline', 'link-lock', 'link-off', 'link-plus', 'link-variant', 'link-variant-minus', 'link-variant-off', 'link-variant-plus', 'link-variant-remove', 'linkedin', 'linux', 'linux-mint', 'lipstick', 'liquid-spot', 'liquor', 'list-box', 'list-box-outline', 'list-status', 'litecoin', 'loading', 'location-enter', 'location-exit', 'lock', 'lock-alert', 'lock-alert-outline', 'lock-check', 'lock-check-outline', 'lock-clock', 'lock-minus', 'lock-minus-outline', 'lock-off', 'lock-off-outline', 'lock-open', 'lock-open-alert', 'lock-open-alert-outline', 'lock-open-check', 'lock-open-check-outline', 'lock-open-minus', 'lock-open-minus-outline', 'lock-open-outline', 'lock-open-plus', 'lock-open-plus-outline', 'lock-open-remove', 'lock-open-remove-outline', 'lock-open-variant', 'lock-open-variant-outline', 'lock-outline', 'lock-pattern', 'lock-plus', 'lock-plus-outline', 'lock-question', 'lock-remove', 'lock-remove-outline', 'lock-reset', 'lock-smart', 'locker', 'locker-multiple', 'login', 'login-variant', 'logout', 'logout-variant', 'longitude', 'looks', 'lotion', 'lotion-outline', 'lotion-plus', 'lotion-plus-outline', 'loupe', 'lumx', 'lungs', 'mace', 'magazine-pistol', 'magazine-rifle', 'magic-staff', 'magnet', 'magnet-on', 'magnify', 'magnify-close', 'magnify-expand', 'magnify-minus', 'magnify-minus-cursor', 'magnify-minus-outline', 'magnify-plus', 'magnify-plus-cursor', 'magnify-plus-outline', 'magnify-remove-cursor', 'magnify-remove-outline', 'magnify-scan', 'mail', 'mailbox', 'mailbox-open', 'mailbox-open-outline', 'mailbox-open-up', 'mailbox-open-up-outline', 'mailbox-outline', 'mailbox-up', 'mailbox-up-outline', 'manjaro', 'map', 'map-check', 'map-check-outline', 'map-clock', 'map-clock-outline', 'map-legend', 'map-marker', 'map-marker-account', 'map-marker-account-outline', 'map-marker-alert', 'map-marker-alert-outline', 'map-marker-check', 'map-marker-check-outline', 'map-marker-circle', 'map-marker-distance', 'map-marker-down', 'map-marker-left', 'map-marker-left-outline', 'map-marker-minus', 'map-marker-minus-outline', 'map-marker-multiple', 'map-marker-multiple-outline', 'map-marker-off', 'map-marker-off-outline', 'map-marker-outline', 'map-marker-path', 'map-marker-plus', 'map-marker-plus-outline', 'map-marker-question', 'map-marker-question-outline', 'map-marker-radius', 'map-marker-radius-outline', 'map-marker-remove', 'map-marker-remove-outline', 'map-marker-remove-variant', 'map-marker-right', 'map-marker-right-outline', 'map-marker-star', 'map-marker-star-outline', 'map-marker-up', 'map-minus', 'map-outline', 'map-plus', 'map-search', 'map-search-outline', 'mapbox', 'margin', 'marker', 'marker-cancel', 'marker-check', 'mastodon', 'material-design', 'material-ui', 'math-compass', 'math-cos', 'math-integral', 'math-integral-box', 'math-log', 'math-norm', 'math-norm-box', 'math-sin', 'math-tan', 'matrix', 'medal', 'medal-outline', 'medical-bag', 'medical-cotton-swab', 'medication', 'medication-outline', 'meditation', 'memory', 'menorah', 'menorah-fire', 'menu', 'menu-down', 'menu-down-outline', 'menu-left', 'menu-left-outline', 'menu-open', 'menu-right', 'menu-right-outline', 'menu-swap', 'menu-swap-outline', 'menu-up', 'menu-up-outline', 'merge', 'message', 'message-alert', 'message-alert-outline', 'message-arrow-left', 'message-arrow-left-outline', 'message-arrow-right', 'message-arrow-right-outline', 'message-badge', 'message-badge-outline', 'message-bookmark', 'message-bookmark-outline', 'message-bulleted', 'message-bulleted-off', 'message-check', 'message-check-outline', 'message-cog', 'message-cog-outline', 'message-draw', 'message-fast', 'message-fast-outline', 'message-flash', 'message-flash-outline', 'message-image', 'message-image-outline', 'message-lock', 'message-lock-outline', 'message-minus', 'message-minus-outline', 'message-off', 'message-off-outline', 'message-outline', 'message-plus', 'message-plus-outline', 'message-processing', 'message-processing-outline', 'message-question', 'message-question-outline', 'message-reply', 'message-reply-outline', 'message-reply-text', 'message-reply-text-outline', 'message-settings', 'message-settings-outline', 'message-star', 'message-star-outline', 'message-text', 'message-text-clock', 'message-text-clock-outline', 'message-text-fast', 'message-text-fast-outline', 'message-text-lock', 'message-text-lock-outline', 'message-text-outline', 'message-video', 'meteor', 'meter-electric', 'meter-electric-outline', 'meter-gas', 'meter-gas-outline', 'metronome', 'metronome-tick', 'micro-sd', 'microphone', 'microphone-message', 'microphone-message-off', 'microphone-minus', 'microphone-off', 'microphone-outline', 'microphone-plus', 'microphone-question', 'microphone-question-outline', 'microphone-settings', 'microphone-variant', 'microphone-variant-off', 'microscope', 'microsoft', 'microsoft-access', 'microsoft-azure', 'microsoft-azure-devops', 'microsoft-bing', 'microsoft-dynamics-365', 'microsoft-edge', 'microsoft-excel', 'microsoft-internet-explorer', 'microsoft-office', 'microsoft-onedrive', 'microsoft-onenote', 'microsoft-outlook', 'microsoft-powerpoint', 'microsoft-sharepoint', 'microsoft-teams', 'microsoft-visual-studio', 'microsoft-visual-studio-code', 'microsoft-windows', 'microsoft-windows-classic', 'microsoft-word', 'microsoft-xbox', 'microsoft-xbox-controller', 'microsoft-xbox-controller-battery-alert', 'microsoft-xbox-controller-battery-charging', 'microsoft-xbox-controller-battery-empty', 'microsoft-xbox-controller-battery-full', 'microsoft-xbox-controller-battery-low', 'microsoft-xbox-controller-battery-medium', 'microsoft-xbox-controller-battery-unknown', 'microsoft-xbox-controller-menu', 'microsoft-xbox-controller-off', 'microsoft-xbox-controller-view', 'microwave', 'microwave-off', 'middleware', 'middleware-outline', 'midi', 'midi-port', 'mine', 'minecraft', 'mini-sd', 'minidisc', 'minus', 'minus-box', 'minus-box-multiple', 'minus-box-multiple-outline', 'minus-box-outline', 'minus-circle', 'minus-circle-multiple', 'minus-circle-multiple-outline', 'minus-circle-off', 'minus-circle-off-outline', 'minus-circle-outline', 'minus-network', 'minus-network-outline', 'minus-thick', 'mirror', 'mirror-rectangle', 'mirror-variant', 'mixed-martial-arts', 'mixed-reality', 'molecule', 'molecule-co', 'molecule-co2', 'monitor', 'monitor-account', 'monitor-arrow-down', 'monitor-arrow-down-variant', 'monitor-cellphone', 'monitor-cellphone-star', 'monitor-dashboard', 'monitor-edit', 'monitor-eye', 'monitor-lock', 'monitor-multiple', 'monitor-off', 'monitor-screenshot', 'monitor-share', 'monitor-shimmer', 'monitor-small', 'monitor-speaker', 'monitor-speaker-off', 'monitor-star', 'moon-first-quarter', 'moon-full', 'moon-last-quarter', 'moon-new', 'moon-waning-crescent', 'moon-waning-gibbous', 'moon-waxing-crescent', 'moon-waxing-gibbous', 'moped', 'moped-electric', 'moped-electric-outline', 'moped-outline', 'more', 'mortar-pestle', 'mortar-pestle-plus', 'mosque', 'mosque-outline', 'mother-heart', 'mother-nurse', 'motion', 'motion-outline', 'motion-pause', 'motion-pause-outline', 'motion-play', 'motion-play-outline', 'motion-sensor', 'motion-sensor-off', 'motorbike', 'motorbike-electric', 'motorbike-off', 'mouse', 'mouse-bluetooth', 'mouse-move-down', 'mouse-move-up', 'mouse-move-vertical', 'mouse-off', 'mouse-variant', 'mouse-variant-off', 'move-resize', 'move-resize-variant', 'movie', 'movie-check', 'movie-check-outline', 'movie-cog', 'movie-cog-outline', 'movie-edit', 'movie-edit-outline', 'movie-filter', 'movie-filter-outline', 'movie-minus', 'movie-minus-outline', 'movie-off', 'movie-off-outline', 'movie-open', 'movie-open-check', 'movie-open-check-outline', 'movie-open-cog', 'movie-open-cog-outline', 'movie-open-edit', 'movie-open-edit-outline', 'movie-open-minus', 'movie-open-minus-outline', 'movie-open-off', 'movie-open-off-outline', 'movie-open-outline', 'movie-open-play', 'movie-open-play-outline', 'movie-open-plus', 'movie-open-plus-outline', 'movie-open-remove', 'movie-open-remove-outline', 'movie-open-settings', 'movie-open-settings-outline', 'movie-open-star', 'movie-open-star-outline', 'movie-outline', 'movie-play', 'movie-play-outline', 'movie-plus', 'movie-plus-outline', 'movie-remove', 'movie-remove-outline', 'movie-roll', 'movie-search', 'movie-search-outline', 'movie-settings', 'movie-settings-outline', 'movie-star', 'movie-star-outline', 'mower', 'mower-bag', 'mower-bag-on', 'mower-on', 'muffin', 'multicast', 'multimedia', 'multiplication', 'multiplication-box', 'mushroom', 'mushroom-off', 'mushroom-off-outline', 'mushroom-outline', 'music', 'music-accidental-double-flat', 'music-accidental-double-sharp', 'music-accidental-flat', 'music-accidental-natural', 'music-accidental-sharp', 'music-box', 'music-box-multiple', 'music-box-multiple-outline', 'music-box-outline', 'music-circle', 'music-circle-outline', 'music-clef-alto', 'music-clef-bass', 'music-clef-treble', 'music-note', 'music-note-bluetooth', 'music-note-bluetooth-off', 'music-note-eighth', 'music-note-eighth-dotted', 'music-note-half', 'music-note-half-dotted', 'music-note-minus', 'music-note-off', 'music-note-off-outline', 'music-note-outline', 'music-note-plus', 'music-note-quarter', 'music-note-quarter-dotted', 'music-note-sixteenth', 'music-note-sixteenth-dotted', 'music-note-whole', 'music-note-whole-dotted', 'music-off', 'music-rest-eighth', 'music-rest-half', 'music-rest-quarter', 'music-rest-sixteenth', 'music-rest-whole', 'mustache', 'nail', 'nas', 'nativescript', 'nature', 'nature-people', 'navigation', 'navigation-outline', 'navigation-variant', 'navigation-variant-outline', 'near-me', 'necklace', 'needle', 'needle-off', 'netflix', 'network', 'network-off', 'network-off-outline', 'network-outline', 'network-pos', 'network-strength-1', 'network-strength-1-alert', 'network-strength-2', 'network-strength-2-alert', 'network-strength-3', 'network-strength-3-alert', 'network-strength-4', 'network-strength-4-alert', 'network-strength-4-cog', 'network-strength-off', 'network-strength-off-outline', 'network-strength-outline', 'new-box', 'newspaper', 'newspaper-check', 'newspaper-minus', 'newspaper-plus', 'newspaper-remove', 'newspaper-variant', 'newspaper-variant-multiple', 'newspaper-variant-multiple-outline', 'newspaper-variant-outline', 'nfc', 'nfc-search-variant', 'nfc-tap', 'nfc-variant', 'nfc-variant-off', 'ninja', 'nintendo-game-boy', 'nintendo-switch', 'nintendo-wii', 'nintendo-wiiu', 'nix', 'nodejs', 'noodles', 'not-equal', 'not-equal-variant', 'note', 'note-alert', 'note-alert-outline', 'note-check', 'note-check-outline', 'note-edit', 'note-edit-outline', 'note-minus', 'note-minus-outline', 'note-multiple', 'note-multiple-outline', 'note-off', 'note-off-outline', 'note-outline', 'note-plus', 'note-plus-outline', 'note-remove', 'note-remove-outline', 'note-search', 'note-search-outline', 'note-text', 'note-text-outline', 'notebook', 'notebook-check', 'notebook-check-outline', 'notebook-edit', 'notebook-edit-outline', 'notebook-heart', 'notebook-heart-outline', 'notebook-minus', 'notebook-minus-outline', 'notebook-multiple', 'notebook-outline', 'notebook-plus', 'notebook-plus-outline', 'notebook-remove', 'notebook-remove-outline', 'notification-clear-all', 'npm', 'nuke', 'null', 'numeric', 'numeric-0', 'numeric-0-box', 'numeric-0-box-multiple', 'numeric-0-box-multiple-outline', 'numeric-0-box-outline', 'numeric-0-circle', 'numeric-0-circle-outline', 'numeric-1', 'numeric-1-box', 'numeric-1-box-multiple', 'numeric-1-box-multiple-outline', 'numeric-1-box-outline', 'numeric-1-circle', 'numeric-1-circle-outline', 'numeric-10', 'numeric-10-box', 'numeric-10-box-multiple', 'numeric-10-box-multiple-outline', 'numeric-10-box-outline', 'numeric-10-circle', 'numeric-10-circle-outline', 'numeric-2', 'numeric-2-box', 'numeric-2-box-multiple', 'numeric-2-box-multiple-outline', 'numeric-2-box-outline', 'numeric-2-circle', 'numeric-2-circle-outline', 'numeric-3', 'numeric-3-box', 'numeric-3-box-multiple', 'numeric-3-box-multiple-outline', 'numeric-3-box-outline', 'numeric-3-circle', 'numeric-3-circle-outline', 'numeric-4', 'numeric-4-box', 'numeric-4-box-multiple', 'numeric-4-box-multiple-outline', 'numeric-4-box-outline', 'numeric-4-circle', 'numeric-4-circle-outline', 'numeric-5', 'numeric-5-box', 'numeric-5-box-multiple', 'numeric-5-box-multiple-outline', 'numeric-5-box-outline', 'numeric-5-circle', 'numeric-5-circle-outline', 'numeric-6', 'numeric-6-box', 'numeric-6-box-multiple', 'numeric-6-box-multiple-outline', 'numeric-6-box-outline', 'numeric-6-circle', 'numeric-6-circle-outline', 'numeric-7', 'numeric-7-box', 'numeric-7-box-multiple', 'numeric-7-box-multiple-outline', 'numeric-7-box-outline', 'numeric-7-circle', 'numeric-7-circle-outline', 'numeric-8', 'numeric-8-box', 'numeric-8-box-multiple', 'numeric-8-box-multiple-outline', 'numeric-8-box-outline', 'numeric-8-circle', 'numeric-8-circle-outline', 'numeric-9', 'numeric-9-box', 'numeric-9-box-multiple', 'numeric-9-box-multiple-outline', 'numeric-9-box-outline', 'numeric-9-circle', 'numeric-9-circle-outline', 'numeric-9-plus', 'numeric-9-plus-box', 'numeric-9-plus-box-multiple', 'numeric-9-plus-box-multiple-outline', 'numeric-9-plus-box-outline', 'numeric-9-plus-circle', 'numeric-9-plus-circle-outline', 'numeric-negative-1', 'numeric-off', 'numeric-positive-1', 'nut', 'nutrition', 'nuxt', 'oar', 'ocarina', 'oci', 'ocr', 'octagon', 'octagon-outline', 'octagram', 'octagram-outline', 'octahedron', 'octahedron-off', 'odnoklassniki', 'offer', 'office-building', 'office-building-cog', 'office-building-cog-outline', 'office-building-marker', 'office-building-marker-outline', 'office-building-minus', 'office-building-minus-outline', 'office-building-outline', 'office-building-plus', 'office-building-plus-outline', 'office-building-remove', 'office-building-remove-outline', 'oil', 'oil-lamp', 'oil-level', 'oil-temperature', 'om', 'omega', 'one-up', 'onepassword', 'opacity', 'open-in-app', 'open-in-new', 'open-source-initiative', 'openid', 'opera', 'orbit', 'orbit-variant', 'order-alphabetical-ascending', 'order-alphabetical-descending', 'order-bool-ascending', 'order-bool-ascending-variant', 'order-bool-descending', 'order-bool-descending-variant', 'order-numeric-ascending', 'order-numeric-descending', 'origin', 'ornament', 'ornament-variant', 'outdoor-lamp', 'overscan', 'owl', 'pac-man', 'package', 'package-check', 'package-down', 'package-up', 'package-variant', 'package-variant-closed', 'package-variant-closed-check', 'package-variant-closed-minus', 'package-variant-closed-plus', 'package-variant-closed-remove', 'package-variant-minus', 'package-variant-plus', 'package-variant-remove', 'page-first', 'page-last', 'page-layout-body', 'page-layout-footer', 'page-layout-header', 'page-layout-header-footer', 'page-layout-sidebar-left', 'page-layout-sidebar-right', 'page-next', 'page-next-outline', 'page-previous', 'page-previous-outline', 'pail', 'pail-minus', 'pail-minus-outline', 'pail-off', 'pail-off-outline', 'pail-outline', 'pail-plus', 'pail-plus-outline', 'pail-remove', 'pail-remove-outline', 'palette', 'palette-advanced', 'palette-outline', 'palette-swatch', 'palette-swatch-outline', 'palette-swatch-variant', 'palm-tree', 'pan', 'pan-bottom-left', 'pan-bottom-right', 'pan-down', 'pan-horizontal', 'pan-left', 'pan-right', 'pan-top-left', 'pan-top-right', 'pan-up', 'pan-vertical', 'panda', 'pandora', 'panorama', 'panorama-fisheye', 'panorama-horizontal', 'panorama-horizontal-outline', 'panorama-outline', 'panorama-sphere', 'panorama-sphere-outline', 'panorama-variant', 'panorama-variant-outline', 'panorama-vertical', 'panorama-vertical-outline', 'panorama-wide-angle', 'panorama-wide-angle-outline', 'paper-cut-vertical', 'paper-roll', 'paper-roll-outline', 'paperclip', 'paperclip-check', 'paperclip-lock', 'paperclip-minus', 'paperclip-off', 'paperclip-plus', 'paperclip-remove', 'parachute', 'parachute-outline', 'paragliding', 'parking', 'party-popper', 'passport', 'passport-biometric', 'pasta', 'patio-heater', 'patreon', 'pause', 'pause-box', 'pause-box-outline', 'pause-circle', 'pause-circle-outline', 'pause-octagon', 'pause-octagon-outline', 'paw', 'paw-off', 'paw-off-outline', 'paw-outline', 'peace', 'peanut', 'peanut-off', 'peanut-off-outline', 'peanut-outline', 'pen', 'pen-lock', 'pen-minus', 'pen-off', 'pen-plus', 'pen-remove', 'pencil', 'pencil-box', 'pencil-box-multiple', 'pencil-box-multiple-outline', 'pencil-box-outline', 'pencil-circle', 'pencil-circle-outline', 'pencil-lock', 'pencil-lock-outline', 'pencil-minus', 'pencil-minus-outline', 'pencil-off', 'pencil-off-outline', 'pencil-outline', 'pencil-plus', 'pencil-plus-outline', 'pencil-remove', 'pencil-remove-outline', 'pencil-ruler', 'penguin', 'pentagon', 'pentagon-outline', 'pentagram', 'percent', 'percent-box', 'percent-box-outline', 'percent-circle', 'percent-circle-outline', 'percent-outline', 'periodic-table', 'perspective-less', 'perspective-more', 'ph', 'phone', 'phone-alert', 'phone-alert-outline', 'phone-bluetooth', 'phone-bluetooth-outline', 'phone-cancel', 'phone-cancel-outline', 'phone-check', 'phone-check-outline', 'phone-classic', 'phone-classic-off', 'phone-clock', 'phone-dial', 'phone-dial-outline', 'phone-forward', 'phone-forward-outline', 'phone-hangup', 'phone-hangup-outline', 'phone-in-talk', 'phone-in-talk-outline', 'phone-incoming', 'phone-incoming-outgoing', 'phone-incoming-outgoing-outline', 'phone-incoming-outline', 'phone-lock', 'phone-lock-outline', 'phone-log', 'phone-log-outline', 'phone-message', 'phone-message-outline', 'phone-minus', 'phone-minus-outline', 'phone-missed', 'phone-missed-outline', 'phone-off', 'phone-off-outline', 'phone-outgoing', 'phone-outgoing-outline', 'phone-outline', 'phone-paused', 'phone-paused-outline', 'phone-plus', 'phone-plus-outline', 'phone-refresh', 'phone-refresh-outline', 'phone-remove', 'phone-remove-outline', 'phone-return', 'phone-return-outline', 'phone-ring', 'phone-ring-outline', 'phone-rotate-landscape', 'phone-rotate-portrait', 'phone-settings', 'phone-settings-outline', 'phone-sync', 'phone-sync-outline', 'phone-voip', 'pi', 'pi-box', 'pi-hole', 'piano', 'piano-off', 'pickaxe', 'picture-in-picture-bottom-right', 'picture-in-picture-bottom-right-outline', 'picture-in-picture-top-right', 'picture-in-picture-top-right-outline', 'pier', 'pier-crane', 'pig', 'pig-variant', 'pig-variant-outline', 'piggy-bank', 'piggy-bank-outline', 'pill', 'pill-multiple', 'pill-off', 'pillar', 'pin', 'pin-off', 'pin-off-outline', 'pin-outline', 'pine-tree', 'pine-tree-box', 'pine-tree-fire', 'pinterest', 'pinwheel', 'pinwheel-outline', 'pipe', 'pipe-disconnected', 'pipe-leak', 'pipe-valve', 'pipe-wrench', 'pirate', 'pistol', 'piston', 'pitchfork', 'pizza', 'plane-car', 'plane-train', 'play', 'play-box', 'play-box-lock', 'play-box-lock-open', 'play-box-lock-open-outline', 'play-box-lock-outline', 'play-box-multiple', 'play-box-multiple-outline', 'play-box-outline', 'play-circle', 'play-circle-outline', 'play-network', 'play-network-outline', 'play-outline', 'play-pause', 'play-protected-content', 'play-speed', 'playlist-check', 'playlist-edit', 'playlist-minus', 'playlist-music', 'playlist-music-outline', 'playlist-play', 'playlist-plus', 'playlist-remove', 'playlist-star', 'plex', 'pliers', 'plus', 'plus-box', 'plus-box-multiple', 'plus-box-multiple-outline', 'plus-box-outline', 'plus-circle', 'plus-circle-multiple', 'plus-circle-multiple-outline', 'plus-circle-outline', 'plus-lock', 'plus-lock-open', 'plus-minus', 'plus-minus-box', 'plus-minus-variant', 'plus-network', 'plus-network-outline', 'plus-outline', 'plus-thick', 'podcast', 'podium', 'podium-bronze', 'podium-gold', 'podium-silver', 'point-of-sale', 'pokeball', 'pokemon-go', 'poker-chip', 'polaroid', 'police-badge', 'police-badge-outline', 'police-station', 'poll', 'polo', 'polymer', 'pool', 'pool-thermometer', 'popcorn', 'post', 'post-lamp', 'post-outline', 'postage-stamp', 'pot', 'pot-mix', 'pot-mix-outline', 'pot-outline', 'pot-steam', 'pot-steam-outline', 'pound', 'pound-box', 'pound-box-outline', 'power', 'power-cycle', 'power-off', 'power-on', 'power-plug', 'power-plug-off', 'power-plug-off-outline', 'power-plug-outline', 'power-settings', 'power-sleep', 'power-socket', 'power-socket-au', 'power-socket-ch', 'power-socket-de', 'power-socket-eu', 'power-socket-fr', 'power-socket-it', 'power-socket-jp', 'power-socket-uk', 'power-socket-us', 'power-standby', 'powershell', 'prescription', 'presentation', 'presentation-play', 'pretzel', 'printer', 'printer-3d', 'printer-3d-nozzle', 'printer-3d-nozzle-alert', 'printer-3d-nozzle-alert-outline', 'printer-3d-nozzle-heat', 'printer-3d-nozzle-heat-outline', 'printer-3d-nozzle-off', 'printer-3d-nozzle-off-outline', 'printer-3d-nozzle-outline', 'printer-3d-off', 'printer-alert', 'printer-check', 'printer-eye', 'printer-off', 'printer-off-outline', 'printer-outline', 'printer-pos', 'printer-search', 'printer-settings', 'printer-wireless', 'priority-high', 'priority-low', 'professional-hexagon', 'progress-alert', 'progress-check', 'progress-clock', 'progress-close', 'progress-download', 'progress-helper', 'progress-pencil', 'progress-question', 'progress-star', 'progress-upload', 'progress-wrench', 'projector', 'projector-off', 'projector-screen', 'projector-screen-off', 'projector-screen-off-outline', 'projector-screen-outline', 'projector-screen-variant', 'projector-screen-variant-off', 'projector-screen-variant-off-outline', 'projector-screen-variant-outline', 'propane-tank', 'propane-tank-outline', 'protocol', 'publish', 'publish-off', 'pulse', 'pump', 'pump-off', 'pumpkin', 'purse', 'purse-outline', 'puzzle', 'puzzle-check', 'puzzle-check-outline', 'puzzle-edit', 'puzzle-edit-outline', 'puzzle-heart', 'puzzle-heart-outline', 'puzzle-minus', 'puzzle-minus-outline', 'puzzle-outline', 'puzzle-plus', 'puzzle-plus-outline', 'puzzle-remove', 'puzzle-remove-outline', 'puzzle-star', 'puzzle-star-outline', 'pyramid', 'pyramid-off', 'qi', 'qqchat', 'qrcode', 'qrcode-edit', 'qrcode-minus', 'qrcode-plus', 'qrcode-remove', 'qrcode-scan', 'quadcopter', 'quality-high', 'quality-low', 'quality-medium', 'quora', 'rabbit', 'rabbit-variant', 'rabbit-variant-outline', 'racing-helmet', 'racquetball', 'radar', 'radiator', 'radiator-disabled', 'radiator-off', 'radio', 'radio-am', 'radio-fm', 'radio-handheld', 'radio-off', 'radio-tower', 'radioactive', 'radioactive-circle', 'radioactive-circle-outline', 'radioactive-off', 'radiobox-blank', 'radiobox-marked', 'radiology-box', 'radiology-box-outline', 'radius', 'radius-outline', 'railroad-light', 'rake', 'raspberry-pi', 'raw', 'raw-off', 'ray-end', 'ray-end-arrow', 'ray-start', 'ray-start-arrow', 'ray-start-end', 'ray-start-vertex-end', 'ray-vertex', 'razor-double-edge', 'razor-single-edge', 'react', 'read', 'receipt', 'receipt-outline', 'receipt-text', 'receipt-text-check', 'receipt-text-check-outline', 'receipt-text-minus', 'receipt-text-minus-outline', 'receipt-text-outline', 'receipt-text-plus', 'receipt-text-plus-outline', 'receipt-text-remove', 'receipt-text-remove-outline', 'record', 'record-circle', 'record-circle-outline', 'record-player', 'record-rec', 'rectangle', 'rectangle-outline', 'recycle', 'recycle-variant', 'reddit', 'redhat', 'redo', 'redo-variant', 'reflect-horizontal', 'reflect-vertical', 'refresh', 'refresh-auto', 'refresh-circle', 'regex', 'registered-trademark', 'reiterate', 'relation-many-to-many', 'relation-many-to-one', 'relation-many-to-one-or-many', 'relation-many-to-only-one', 'relation-many-to-zero-or-many', 'relation-many-to-zero-or-one', 'relation-one-or-many-to-many', 'relation-one-or-many-to-one', 'relation-one-or-many-to-one-or-many', 'relation-one-or-many-to-only-one', 'relation-one-or-many-to-zero-or-many', 'relation-one-or-many-to-zero-or-one', 'relation-one-to-many', 'relation-one-to-one', 'relation-one-to-one-or-many', 'relation-one-to-only-one', 'relation-one-to-zero-or-many', 'relation-one-to-zero-or-one', 'relation-only-one-to-many', 'relation-only-one-to-one', 'relation-only-one-to-one-or-many', 'relation-only-one-to-only-one', 'relation-only-one-to-zero-or-many', 'relation-only-one-to-zero-or-one', 'relation-zero-or-many-to-many', 'relation-zero-or-many-to-one', 'relation-zero-or-many-to-one-or-many', 'relation-zero-or-many-to-only-one', 'relation-zero-or-many-to-zero-or-many', 'relation-zero-or-many-to-zero-or-one', 'relation-zero-or-one-to-many', 'relation-zero-or-one-to-one', 'relation-zero-or-one-to-one-or-many', 'relation-zero-or-one-to-only-one', 'relation-zero-or-one-to-zero-or-many', 'relation-zero-or-one-to-zero-or-one', 'relative-scale', 'reload', 'reload-alert', 'reminder', 'remote', 'remote-desktop', 'remote-off', 'remote-tv', 'remote-tv-off', 'rename-box', 'reorder-horizontal', 'reorder-vertical', 'repeat', 'repeat-off', 'repeat-once', 'repeat-variant', 'replay', 'reply', 'reply-all', 'reply-all-outline', 'reply-circle', 'reply-outline', 'reproduction', 'resistor', 'resistor-nodes', 'resize', 'resize-bottom-right', 'responsive', 'restart', 'restart-alert', 'restart-off', 'restore', 'restore-alert', 'rewind', 'rewind-10', 'rewind-15', 'rewind-30', 'rewind-45', 'rewind-5', 'rewind-60', 'rewind-outline', 'rhombus', 'rhombus-medium', 'rhombus-medium-outline', 'rhombus-outline', 'rhombus-split', 'rhombus-split-outline', 'ribbon', 'rice', 'rickshaw', 'rickshaw-electric', 'ring', 'rivet', 'road', 'road-variant', 'robber', 'robot', 'robot-angry', 'robot-angry-outline', 'robot-confused', 'robot-confused-outline', 'robot-dead', 'robot-dead-outline', 'robot-excited', 'robot-excited-outline', 'robot-happy', 'robot-happy-outline', 'robot-industrial', 'robot-industrial-outline', 'robot-love', 'robot-love-outline', 'robot-mower', 'robot-mower-outline', 'robot-off', 'robot-off-outline', 'robot-outline', 'robot-vacuum', 'robot-vacuum-alert', 'robot-vacuum-variant', 'robot-vacuum-variant-alert', 'rocket', 'rocket-launch', 'rocket-launch-outline', 'rocket-outline', 'rodent', 'roller-shade', 'roller-shade-closed', 'roller-skate', 'roller-skate-off', 'rollerblade', 'rollerblade-off', 'rollupjs', 'rolodex', 'rolodex-outline', 'roman-numeral-1', 'roman-numeral-10', 'roman-numeral-2', 'roman-numeral-3', 'roman-numeral-4', 'roman-numeral-5', 'roman-numeral-6', 'roman-numeral-7', 'roman-numeral-8', 'roman-numeral-9', 'room-service', 'room-service-outline', 'rotate-360', 'rotate-3d', 'rotate-3d-variant', 'rotate-left', 'rotate-left-variant', 'rotate-orbit', 'rotate-right', 'rotate-right-variant', 'rounded-corner', 'router', 'router-network', 'router-wireless', 'router-wireless-off', 'router-wireless-settings', 'routes', 'routes-clock', 'rowing', 'rss', 'rss-box', 'rss-off', 'rug', 'rugby', 'ruler', 'ruler-square', 'ruler-square-compass', 'run', 'run-fast', 'rv-truck', 'sack', 'sack-percent', 'safe', 'safe-square', 'safe-square-outline', 'safety-goggles', 'sail-boat', 'sail-boat-sink', 'sale', 'sale-outline', 'salesforce', 'sass', 'satellite', 'satellite-uplink', 'satellite-variant', 'sausage', 'sausage-off', 'saw-blade', 'sawtooth-wave', 'saxophone', 'scale', 'scale-balance', 'scale-bathroom', 'scale-off', 'scale-unbalanced', 'scan-helper', 'scanner', 'scanner-off', 'scatter-plot', 'scatter-plot-outline', 'scent', 'scent-off', 'school', 'school-outline', 'scissors-cutting', 'scooter', 'scooter-electric', 'scoreboard', 'scoreboard-outline', 'screen-rotation', 'screen-rotation-lock', 'screw-flat-top', 'screw-lag', 'screw-machine-flat-top', 'screw-machine-round-top', 'screw-round-top', 'screwdriver', 'script', 'script-outline', 'script-text', 'script-text-key', 'script-text-key-outline', 'script-text-outline', 'script-text-play', 'script-text-play-outline', 'sd', 'seal', 'seal-variant', 'search-web', 'seat', 'seat-flat', 'seat-flat-angled', 'seat-individual-suite', 'seat-legroom-extra', 'seat-legroom-normal', 'seat-legroom-reduced', 'seat-outline', 'seat-passenger', 'seat-recline-extra', 'seat-recline-normal', 'seatbelt', 'security', 'security-network', 'seed', 'seed-off', 'seed-off-outline', 'seed-outline', 'seed-plus', 'seed-plus-outline', 'seesaw', 'segment', 'select', 'select-all', 'select-arrow-down', 'select-arrow-up', 'select-color', 'select-compare', 'select-drag', 'select-group', 'select-inverse', 'select-marker', 'select-multiple', 'select-multiple-marker', 'select-off', 'select-place', 'select-remove', 'select-search', 'selection', 'selection-drag', 'selection-ellipse', 'selection-ellipse-arrow-inside', 'selection-ellipse-remove', 'selection-marker', 'selection-multiple', 'selection-multiple-marker', 'selection-off', 'selection-remove', 'selection-search', 'semantic-web', 'send', 'send-check', 'send-check-outline', 'send-circle', 'send-circle-outline', 'send-clock', 'send-clock-outline', 'send-lock', 'send-lock-outline', 'send-outline', 'serial-port', 'server', 'server-minus', 'server-network', 'server-network-off', 'server-off', 'server-plus', 'server-remove', 'server-security', 'set-all', 'set-center', 'set-center-right', 'set-left', 'set-left-center', 'set-left-right', 'set-merge', 'set-none', 'set-right', 'set-split', 'set-square', 'set-top-box', 'settings-helper', 'shaker', 'shaker-outline', 'shape', 'shape-circle-plus', 'shape-outline', 'shape-oval-plus', 'shape-plus', 'shape-polygon-plus', 'shape-rectangle-plus', 'shape-square-plus', 'shape-square-rounded-plus', 'share', 'share-all', 'share-all-outline', 'share-circle', 'share-off', 'share-off-outline', 'share-outline', 'share-variant', 'share-variant-outline', 'shark', 'shark-fin', 'shark-fin-outline', 'shark-off', 'sheep', 'shield', 'shield-account', 'shield-account-outline', 'shield-account-variant', 'shield-account-variant-outline', 'shield-airplane', 'shield-airplane-outline', 'shield-alert', 'shield-alert-outline', 'shield-bug', 'shield-bug-outline', 'shield-car', 'shield-check', 'shield-check-outline', 'shield-cross', 'shield-cross-outline', 'shield-crown', 'shield-crown-outline', 'shield-edit', 'shield-edit-outline', 'shield-half', 'shield-half-full', 'shield-home', 'shield-home-outline', 'shield-key', 'shield-key-outline', 'shield-link-variant', 'shield-link-variant-outline', 'shield-lock', 'shield-lock-open', 'shield-lock-open-outline', 'shield-lock-outline', 'shield-moon', 'shield-moon-outline', 'shield-off', 'shield-off-outline', 'shield-outline', 'shield-plus', 'shield-plus-outline', 'shield-refresh', 'shield-refresh-outline', 'shield-remove', 'shield-remove-outline', 'shield-search', 'shield-star', 'shield-star-outline', 'shield-sun', 'shield-sun-outline', 'shield-sword', 'shield-sword-outline', 'shield-sync', 'shield-sync-outline', 'shimmer', 'ship-wheel', 'shipping-pallet', 'shoe-ballet', 'shoe-cleat', 'shoe-formal', 'shoe-heel', 'shoe-print', 'shoe-sneaker', 'shopping', 'shopping-music', 'shopping-outline', 'shopping-search', 'shopping-search-outline', 'shore', 'shovel', 'shovel-off', 'shower', 'shower-head', 'shredder', 'shuffle', 'shuffle-disabled', 'shuffle-variant', 'shuriken', 'sickle', 'sigma', 'sigma-lower', 'sign-caution', 'sign-direction', 'sign-direction-minus', 'sign-direction-plus', 'sign-direction-remove', 'sign-language', 'sign-language-outline', 'sign-pole', 'sign-real-estate', 'sign-text', 'sign-yield', 'signal', 'signal-2g', 'signal-3g', 'signal-4g', 'signal-5g', 'signal-cellular-1', 'signal-cellular-2', 'signal-cellular-3', 'signal-cellular-outline', 'signal-distance-variant', 'signal-hspa', 'signal-hspa-plus', 'signal-off', 'signal-variant', 'signature', 'signature-freehand', 'signature-image', 'signature-text', 'silo', 'silo-outline', 'silverware', 'silverware-clean', 'silverware-fork', 'silverware-fork-knife', 'silverware-spoon', 'silverware-variant', 'sim', 'sim-alert', 'sim-alert-outline', 'sim-off', 'sim-off-outline', 'sim-outline', 'simple-icons', 'sina-weibo', 'sine-wave', 'sitemap', 'sitemap-outline', 'size-l', 'size-m', 'size-s', 'size-xl', 'size-xs', 'size-xxl', 'size-xxs', 'size-xxxl', 'skate', 'skate-off', 'skateboard', 'skateboarding', 'skew-less', 'skew-more', 'ski', 'ski-cross-country', 'ski-water', 'skip-backward', 'skip-backward-outline', 'skip-forward', 'skip-forward-outline', 'skip-next', 'skip-next-circle', 'skip-next-circle-outline', 'skip-next-outline', 'skip-previous', 'skip-previous-circle', 'skip-previous-circle-outline', 'skip-previous-outline', 'skull', 'skull-crossbones', 'skull-crossbones-outline', 'skull-outline', 'skull-scan', 'skull-scan-outline', 'skype', 'skype-business', 'slack', 'slash-forward', 'slash-forward-box', 'sledding', 'sleep', 'sleep-off', 'slide', 'slope-downhill', 'slope-uphill', 'slot-machine', 'slot-machine-outline', 'smart-card', 'smart-card-off', 'smart-card-off-outline', 'smart-card-outline', 'smart-card-reader', 'smart-card-reader-outline', 'smog', 'smoke', 'smoke-detector', 'smoke-detector-alert', 'smoke-detector-alert-outline', 'smoke-detector-off', 'smoke-detector-off-outline', 'smoke-detector-outline', 'smoke-detector-variant', 'smoke-detector-variant-alert', 'smoke-detector-variant-off', 'smoking', 'smoking-off', 'smoking-pipe', 'smoking-pipe-off', 'snail', 'snake', 'snapchat', 'snowboard', 'snowflake', 'snowflake-alert', 'snowflake-check', 'snowflake-melt', 'snowflake-off', 'snowflake-thermometer', 'snowflake-variant', 'snowman', 'snowmobile', 'snowshoeing', 'soccer', 'soccer-field', 'social-distance-2-meters', 'social-distance-6-feet', 'sofa', 'sofa-outline', 'sofa-single', 'sofa-single-outline', 'solar-panel', 'solar-panel-large', 'solar-power', 'solar-power-variant', 'solar-power-variant-outline', 'soldering-iron', 'solid', 'sony-playstation', 'sort', 'sort-alphabetical-ascending', 'sort-alphabetical-ascending-variant', 'sort-alphabetical-descending', 'sort-alphabetical-descending-variant', 'sort-alphabetical-variant', 'sort-ascending', 'sort-bool-ascending', 'sort-bool-ascending-variant', 'sort-bool-descending', 'sort-bool-descending-variant', 'sort-calendar-ascending', 'sort-calendar-descending', 'sort-clock-ascending', 'sort-clock-ascending-outline', 'sort-clock-descending', 'sort-clock-descending-outline', 'sort-descending', 'sort-numeric-ascending', 'sort-numeric-ascending-variant', 'sort-numeric-descending', 'sort-numeric-descending-variant', 'sort-numeric-variant', 'sort-reverse-variant', 'sort-variant', 'sort-variant-lock', 'sort-variant-lock-open', 'sort-variant-off', 'sort-variant-remove', 'soundbar', 'soundcloud', 'source-branch', 'source-branch-check', 'source-branch-minus', 'source-branch-plus', 'source-branch-refresh', 'source-branch-remove', 'source-branch-sync', 'source-commit', 'source-commit-end', 'source-commit-end-local', 'source-commit-local', 'source-commit-next-local', 'source-commit-start', 'source-commit-start-next-local', 'source-fork', 'source-merge', 'source-pull', 'source-repository', 'source-repository-multiple', 'soy-sauce', 'soy-sauce-off', 'spa', 'spa-outline', 'space-invaders', 'space-station', 'spade', 'speaker', 'speaker-bluetooth', 'speaker-message', 'speaker-multiple', 'speaker-off', 'speaker-pause', 'speaker-play', 'speaker-stop', 'speaker-wireless', 'spear', 'speedometer', 'speedometer-medium', 'speedometer-slow', 'spellcheck', 'sphere', 'sphere-off', 'spider', 'spider-thread', 'spider-web', 'spirit-level', 'spoon-sugar', 'spotify', 'spotlight', 'spotlight-beam', 'spray', 'spray-bottle', 'sprinkler', 'sprinkler-fire', 'sprinkler-variant', 'sprout', 'sprout-outline', 'square', 'square-circle', 'square-edit-outline', 'square-medium', 'square-medium-outline', 'square-off', 'square-off-outline', 'square-opacity', 'square-outline', 'square-root', 'square-root-box', 'square-rounded', 'square-rounded-badge', 'square-rounded-badge-outline', 'square-rounded-outline', 'square-small', 'square-wave', 'squeegee', 'ssh', 'stack-exchange', 'stack-overflow', 'stackpath', 'stadium', 'stadium-outline', 'stadium-variant', 'stairs', 'stairs-box', 'stairs-down', 'stairs-up', 'stamper', 'standard-definition', 'star', 'star-box', 'star-box-multiple', 'star-box-multiple-outline', 'star-box-outline', 'star-check', 'star-check-outline', 'star-circle', 'star-circle-outline', 'star-cog', 'star-cog-outline', 'star-crescent', 'star-david', 'star-face', 'star-four-points', 'star-four-points-outline', 'star-half', 'star-half-full', 'star-minus', 'star-minus-outline', 'star-off', 'star-off-outline', 'star-outline', 'star-plus', 'star-plus-outline', 'star-remove', 'star-remove-outline', 'star-settings', 'star-settings-outline', 'star-shooting', 'star-shooting-outline', 'star-three-points', 'star-three-points-outline', 'state-machine', 'steam', 'steering', 'steering-off', 'step-backward', 'step-backward-2', 'step-forward', 'step-forward-2', 'stethoscope', 'sticker', 'sticker-alert', 'sticker-alert-outline', 'sticker-check', 'sticker-check-outline', 'sticker-circle-outline', 'sticker-emoji', 'sticker-minus', 'sticker-minus-outline', 'sticker-outline', 'sticker-plus', 'sticker-plus-outline', 'sticker-remove', 'sticker-remove-outline', 'sticker-text', 'sticker-text-outline', 'stocking', 'stomach', 'stool', 'stool-outline', 'stop', 'stop-circle', 'stop-circle-outline', 'storage-tank', 'storage-tank-outline', 'store', 'store-24-hour', 'store-alert', 'store-alert-outline', 'store-check', 'store-check-outline', 'store-clock', 'store-clock-outline', 'store-cog', 'store-cog-outline', 'store-edit', 'store-edit-outline', 'store-marker', 'store-marker-outline', 'store-minus', 'store-minus-outline', 'store-off', 'store-off-outline', 'store-outline', 'store-plus', 'store-plus-outline', 'store-remove', 'store-remove-outline', 'store-search', 'store-search-outline', 'store-settings', 'store-settings-outline', 'storefront', 'storefront-check', 'storefront-check-outline', 'storefront-edit', 'storefront-edit-outline', 'storefront-minus', 'storefront-minus-outline', 'storefront-outline', 'storefront-plus', 'storefront-plus-outline', 'storefront-remove', 'storefront-remove-outline', 'stove', 'strategy', 'stretch-to-page', 'stretch-to-page-outline', 'string-lights', 'string-lights-off', 'subdirectory-arrow-left', 'subdirectory-arrow-right', 'submarine', 'subtitles', 'subtitles-outline', 'subway', 'subway-alert-variant', 'subway-variant', 'summit', 'sun-angle', 'sun-angle-outline', 'sun-clock', 'sun-clock-outline', 'sun-compass', 'sun-snowflake', 'sun-snowflake-variant', 'sun-thermometer', 'sun-thermometer-outline', 'sun-wireless', 'sun-wireless-outline', 'sunglasses', 'surfing', 'surround-sound', 'surround-sound-2-0', 'surround-sound-2-1', 'surround-sound-3-1', 'surround-sound-5-1', 'surround-sound-5-1-2', 'surround-sound-7-1', 'svg', 'swap-horizontal', 'swap-horizontal-bold', 'swap-horizontal-circle', 'swap-horizontal-circle-outline', 'swap-horizontal-variant', 'swap-vertical', 'swap-vertical-bold', 'swap-vertical-circle', 'swap-vertical-circle-outline', 'swap-vertical-variant', 'swim', 'switch', 'sword', 'sword-cross', 'syllabary-hangul', 'syllabary-hiragana', 'syllabary-katakana', 'syllabary-katakana-halfwidth', 'symbol', 'symfony', 'synagogue', 'synagogue-outline', 'sync', 'sync-alert', 'sync-circle', 'sync-off', 'tab', 'tab-minus', 'tab-plus', 'tab-remove', 'tab-search', 'tab-unselected', 'table', 'table-account', 'table-alert', 'table-arrow-down', 'table-arrow-left', 'table-arrow-right', 'table-arrow-up', 'table-border', 'table-cancel', 'table-chair', 'table-check', 'table-clock', 'table-cog', 'table-column', 'table-column-plus-after', 'table-column-plus-before', 'table-column-remove', 'table-column-width', 'table-edit', 'table-eye', 'table-eye-off', 'table-filter', 'table-furniture', 'table-headers-eye', 'table-headers-eye-off', 'table-heart', 'table-key', 'table-large', 'table-large-plus', 'table-large-remove', 'table-lock', 'table-merge-cells', 'table-minus', 'table-multiple', 'table-network', 'table-of-contents', 'table-off', 'table-picnic', 'table-pivot', 'table-plus', 'table-question', 'table-refresh', 'table-remove', 'table-row', 'table-row-height', 'table-row-plus-after', 'table-row-plus-before', 'table-row-remove', 'table-search', 'table-settings', 'table-split-cell', 'table-star', 'table-sync', 'table-tennis', 'tablet', 'tablet-cellphone', 'tablet-dashboard', 'taco', 'tag', 'tag-arrow-down', 'tag-arrow-down-outline', 'tag-arrow-left', 'tag-arrow-left-outline', 'tag-arrow-right', 'tag-arrow-right-outline', 'tag-arrow-up', 'tag-arrow-up-outline', 'tag-check', 'tag-check-outline', 'tag-faces', 'tag-heart', 'tag-heart-outline', 'tag-minus', 'tag-minus-outline', 'tag-multiple', 'tag-multiple-outline', 'tag-off', 'tag-off-outline', 'tag-outline', 'tag-plus', 'tag-plus-outline', 'tag-remove', 'tag-remove-outline', 'tag-search', 'tag-search-outline', 'tag-text', 'tag-text-outline', 'tailwind', 'tally-mark-1', 'tally-mark-2', 'tally-mark-3', 'tally-mark-4', 'tally-mark-5', 'tangram', 'tank', 'tanker-truck', 'tape-drive', 'tape-measure', 'target', 'target-account', 'target-variant', 'taxi', 'tea', 'tea-outline', 'teamviewer', 'teddy-bear', 'telescope', 'television', 'television-ambient-light', 'television-box', 'television-classic', 'television-classic-off', 'television-guide', 'television-off', 'television-pause', 'television-play', 'television-shimmer', 'television-speaker', 'television-speaker-off', 'television-stop', 'temperature-celsius', 'temperature-fahrenheit', 'temperature-kelvin', 'temple-buddhist', 'temple-buddhist-outline', 'temple-hindu', 'temple-hindu-outline', 'tennis', 'tennis-ball', 'tent', 'terraform', 'terrain', 'test-tube', 'test-tube-empty', 'test-tube-off', 'text', 'text-account', 'text-box', 'text-box-check', 'text-box-check-outline', 'text-box-edit', 'text-box-edit-outline', 'text-box-minus', 'text-box-minus-outline', 'text-box-multiple', 'text-box-multiple-outline', 'text-box-outline', 'text-box-plus', 'text-box-plus-outline', 'text-box-remove', 'text-box-remove-outline', 'text-box-search', 'text-box-search-outline', 'text-long', 'text-recognition', 'text-search', 'text-search-variant', 'text-shadow', 'text-short', 'texture', 'texture-box', 'theater', 'theme-light-dark', 'thermometer', 'thermometer-alert', 'thermometer-auto', 'thermometer-bluetooth', 'thermometer-check', 'thermometer-chevron-down', 'thermometer-chevron-up', 'thermometer-high', 'thermometer-lines', 'thermometer-low', 'thermometer-minus', 'thermometer-off', 'thermometer-plus', 'thermometer-probe', 'thermometer-probe-off', 'thermometer-water', 'thermostat', 'thermostat-auto', 'thermostat-box', 'thermostat-box-auto', 'thought-bubble', 'thought-bubble-outline', 'thumb-down', 'thumb-down-outline', 'thumb-up', 'thumb-up-outline', 'thumbs-up-down', 'thumbs-up-down-outline', 'ticket', 'ticket-account', 'ticket-confirmation', 'ticket-confirmation-outline', 'ticket-outline', 'ticket-percent', 'ticket-percent-outline', 'tie', 'tilde', 'tilde-off', 'timelapse', 'timeline', 'timeline-alert', 'timeline-alert-outline', 'timeline-check', 'timeline-check-outline', 'timeline-clock', 'timeline-clock-outline', 'timeline-minus', 'timeline-minus-outline', 'timeline-outline', 'timeline-plus', 'timeline-plus-outline', 'timeline-question', 'timeline-question-outline', 'timeline-remove', 'timeline-remove-outline', 'timeline-text', 'timeline-text-outline', 'timer', 'timer-10', 'timer-3', 'timer-alert', 'timer-alert-outline', 'timer-cancel', 'timer-cancel-outline', 'timer-check', 'timer-check-outline', 'timer-cog', 'timer-cog-outline', 'timer-edit', 'timer-edit-outline', 'timer-lock', 'timer-lock-open', 'timer-lock-open-outline', 'timer-lock-outline', 'timer-marker', 'timer-marker-outline', 'timer-minus', 'timer-minus-outline', 'timer-music', 'timer-music-outline', 'timer-off', 'timer-off-outline', 'timer-outline', 'timer-pause', 'timer-pause-outline', 'timer-play', 'timer-play-outline', 'timer-plus', 'timer-plus-outline', 'timer-refresh', 'timer-refresh-outline', 'timer-remove', 'timer-remove-outline', 'timer-sand', 'timer-sand-complete', 'timer-sand-empty', 'timer-sand-full', 'timer-sand-paused', 'timer-settings', 'timer-settings-outline', 'timer-star', 'timer-star-outline', 'timer-stop', 'timer-stop-outline', 'timer-sync', 'timer-sync-outline', 'timetable', 'tire', 'toaster', 'toaster-off', 'toaster-oven', 'toggle-switch', 'toggle-switch-off', 'toggle-switch-off-outline', 'toggle-switch-outline', 'toggle-switch-variant', 'toggle-switch-variant-off', 'toilet', 'toolbox', 'toolbox-outline', 'tools', 'tooltip', 'tooltip-account', 'tooltip-cellphone', 'tooltip-check', 'tooltip-check-outline', 'tooltip-edit', 'tooltip-edit-outline', 'tooltip-image', 'tooltip-image-outline', 'tooltip-minus', 'tooltip-minus-outline', 'tooltip-outline', 'tooltip-plus', 'tooltip-plus-outline', 'tooltip-remove', 'tooltip-remove-outline', 'tooltip-text', 'tooltip-text-outline', 'tooth', 'tooth-outline', 'toothbrush', 'toothbrush-electric', 'toothbrush-paste', 'torch', 'tortoise', 'toslink', 'tournament', 'tow-truck', 'tower-beach', 'tower-fire', 'town-hall', 'toy-brick', 'toy-brick-marker', 'toy-brick-marker-outline', 'toy-brick-minus', 'toy-brick-minus-outline', 'toy-brick-outline', 'toy-brick-plus', 'toy-brick-plus-outline', 'toy-brick-remove', 'toy-brick-remove-outline', 'toy-brick-search', 'toy-brick-search-outline', 'track-light', 'track-light-off', 'trackpad', 'trackpad-lock', 'tractor', 'tractor-variant', 'trademark', 'traffic-cone', 'traffic-light', 'traffic-light-outline', 'train', 'train-car', 'train-car-autorack', 'train-car-box', 'train-car-box-full', 'train-car-box-open', 'train-car-caboose', 'train-car-centerbeam', 'train-car-centerbeam-full', 'train-car-container', 'train-car-flatbed', 'train-car-flatbed-car', 'train-car-flatbed-tank', 'train-car-gondola', 'train-car-gondola-full', 'train-car-hopper', 'train-car-hopper-covered', 'train-car-hopper-full', 'train-car-intermodal', 'train-car-passenger', 'train-car-passenger-door', 'train-car-passenger-door-open', 'train-car-passenger-variant', 'train-car-tank', 'train-variant', 'tram', 'tram-side', 'transcribe', 'transcribe-close', 'transfer', 'transfer-down', 'transfer-left', 'transfer-right', 'transfer-up', 'transit-connection', 'transit-connection-horizontal', 'transit-connection-variant', 'transit-detour', 'transit-skip', 'transit-transfer', 'transition', 'transition-masked', 'translate', 'translate-off', 'translate-variant', 'transmission-tower', 'transmission-tower-export', 'transmission-tower-import', 'transmission-tower-off', 'trash-can', 'trash-can-outline', 'tray', 'tray-alert', 'tray-arrow-down', 'tray-arrow-up', 'tray-full', 'tray-minus', 'tray-plus', 'tray-remove', 'treasure-chest', 'tree', 'tree-outline', 'trello', 'trending-down', 'trending-neutral', 'trending-up', 'triangle', 'triangle-outline', 'triangle-small-down', 'triangle-small-up', 'triangle-wave', 'triforce', 'trophy', 'trophy-award', 'trophy-broken', 'trophy-outline', 'trophy-variant', 'trophy-variant-outline', 'truck', 'truck-alert', 'truck-alert-outline', 'truck-cargo-container', 'truck-check', 'truck-check-outline', 'truck-delivery', 'truck-delivery-outline', 'truck-fast', 'truck-fast-outline', 'truck-flatbed', 'truck-minus', 'truck-minus-outline', 'truck-outline', 'truck-plus', 'truck-plus-outline', 'truck-remove', 'truck-remove-outline', 'truck-snowflake', 'truck-trailer', 'trumpet', 'tshirt-crew', 'tshirt-crew-outline', 'tshirt-v', 'tshirt-v-outline', 'tsunami', 'tumble-dryer', 'tumble-dryer-alert', 'tumble-dryer-off', 'tune', 'tune-variant', 'tune-vertical', 'tune-vertical-variant', 'tunnel', 'tunnel-outline', 'turbine', 'turkey', 'turnstile', 'turnstile-outline', 'turtle', 'twitch', 'twitter', 'two-factor-authentication', 'typewriter', 'ubisoft', 'ubuntu', 'ufo', 'ufo-outline', 'ultra-high-definition', 'umbraco', 'umbrella', 'umbrella-beach', 'umbrella-beach-outline', 'umbrella-closed', 'umbrella-closed-outline', 'umbrella-closed-variant', 'umbrella-outline', 'undo', 'undo-variant', 'unfold-less-horizontal', 'unfold-less-vertical', 'unfold-more-horizontal', 'unfold-more-vertical', 'ungroup', 'unicode', 'unicorn', 'unicorn-variant', 'unicycle', 'unity', 'unreal', 'update', 'upload', 'upload-lock', 'upload-lock-outline', 'upload-multiple', 'upload-network', 'upload-network-outline', 'upload-off', 'upload-off-outline', 'upload-outline', 'usb', 'usb-flash-drive', 'usb-flash-drive-outline', 'usb-port', 'vacuum', 'vacuum-outline', 'valve', 'valve-closed', 'valve-open', 'van-passenger', 'van-utility', 'vanish', 'vanish-quarter', 'vanity-light', 'variable', 'variable-box', 'vector-arrange-above', 'vector-arrange-below', 'vector-bezier', 'vector-circle', 'vector-circle-variant', 'vector-combine', 'vector-curve', 'vector-difference', 'vector-difference-ab', 'vector-difference-ba', 'vector-ellipse', 'vector-intersection', 'vector-line', 'vector-link', 'vector-point', 'vector-point-edit', 'vector-point-minus', 'vector-point-plus', 'vector-point-select', 'vector-polygon', 'vector-polygon-variant', 'vector-polyline', 'vector-polyline-edit', 'vector-polyline-minus', 'vector-polyline-plus', 'vector-polyline-remove', 'vector-radius', 'vector-rectangle', 'vector-selection', 'vector-square', 'vector-square-close', 'vector-square-edit', 'vector-square-minus', 'vector-square-open', 'vector-square-plus', 'vector-square-remove', 'vector-triangle', 'vector-union', 'vhs', 'vibrate', 'vibrate-off', 'video', 'video-2d', 'video-3d', 'video-3d-off', 'video-3d-variant', 'video-4k-box', 'video-account', 'video-box', 'video-box-off', 'video-check', 'video-check-outline', 'video-high-definition', 'video-image', 'video-input-antenna', 'video-input-component', 'video-input-hdmi', 'video-input-scart', 'video-input-svideo', 'video-marker', 'video-marker-outline', 'video-minus', 'video-minus-outline', 'video-off', 'video-off-outline', 'video-outline', 'video-plus', 'video-plus-outline', 'video-stabilization', 'video-switch', 'video-switch-outline', 'video-vintage', 'video-wireless', 'video-wireless-outline', 'view-agenda', 'view-agenda-outline', 'view-array', 'view-array-outline', 'view-carousel', 'view-carousel-outline', 'view-column', 'view-column-outline', 'view-comfy', 'view-comfy-outline', 'view-compact', 'view-compact-outline', 'view-dashboard', 'view-dashboard-edit', 'view-dashboard-edit-outline', 'view-dashboard-outline', 'view-dashboard-variant', 'view-dashboard-variant-outline', 'view-day', 'view-day-outline', 'view-gallery', 'view-gallery-outline', 'view-grid', 'view-grid-outline', 'view-grid-plus', 'view-grid-plus-outline', 'view-headline', 'view-list', 'view-list-outline', 'view-module', 'view-module-outline', 'view-parallel', 'view-parallel-outline', 'view-quilt', 'view-quilt-outline', 'view-sequential', 'view-sequential-outline', 'view-split-horizontal', 'view-split-vertical', 'view-stream', 'view-stream-outline', 'view-week', 'view-week-outline', 'vimeo', 'violin', 'virtual-reality', 'virus', 'virus-off', 'virus-off-outline', 'virus-outline', 'vlc', 'voicemail', 'volcano', 'volcano-outline', 'volleyball', 'volume-equal', 'volume-high', 'volume-low', 'volume-medium', 'volume-minus', 'volume-mute', 'volume-off', 'volume-plus', 'volume-source', 'volume-variant-off', 'volume-vibrate', 'vote', 'vote-outline', 'vpn', 'vuejs', 'vuetify', 'walk', 'wall', 'wall-fire', 'wall-sconce', 'wall-sconce-flat', 'wall-sconce-flat-outline', 'wall-sconce-flat-variant', 'wall-sconce-flat-variant-outline', 'wall-sconce-outline', 'wall-sconce-round', 'wall-sconce-round-outline', 'wall-sconce-round-variant', 'wall-sconce-round-variant-outline', 'wallet', 'wallet-giftcard', 'wallet-membership', 'wallet-outline', 'wallet-plus', 'wallet-plus-outline', 'wallet-travel', 'wallpaper', 'wan', 'wardrobe', 'wardrobe-outline', 'warehouse', 'washing-machine', 'washing-machine-alert', 'washing-machine-off', 'watch', 'watch-export', 'watch-export-variant', 'watch-import', 'watch-import-variant', 'watch-variant', 'watch-vibrate', 'watch-vibrate-off', 'water', 'water-alert', 'water-alert-outline', 'water-boiler', 'water-boiler-alert', 'water-boiler-auto', 'water-boiler-off', 'water-check', 'water-check-outline', 'water-circle', 'water-minus', 'water-minus-outline', 'water-off', 'water-off-outline', 'water-opacity', 'water-outline', 'water-percent', 'water-percent-alert', 'water-plus', 'water-plus-outline', 'water-polo', 'water-pump', 'water-pump-off', 'water-remove', 'water-remove-outline', 'water-sync', 'water-thermometer', 'water-thermometer-outline', 'water-well', 'water-well-outline', 'waterfall', 'watering-can', 'watering-can-outline', 'watermark', 'wave', 'waveform', 'waves', 'waves-arrow-left', 'waves-arrow-right', 'waves-arrow-up', 'waze', 'weather-cloudy', 'weather-cloudy-alert', 'weather-cloudy-arrow-right', 'weather-cloudy-clock', 'weather-dust', 'weather-fog', 'weather-hail', 'weather-hazy', 'weather-hurricane', 'weather-lightning', 'weather-lightning-rainy', 'weather-night', 'weather-night-partly-cloudy', 'weather-partly-cloudy', 'weather-partly-lightning', 'weather-partly-rainy', 'weather-partly-snowy', 'weather-partly-snowy-rainy', 'weather-pouring', 'weather-rainy', 'weather-snowy', 'weather-snowy-heavy', 'weather-snowy-rainy', 'weather-sunny', 'weather-sunny-alert', 'weather-sunny-off', 'weather-sunset', 'weather-sunset-down', 'weather-sunset-up', 'weather-tornado', 'weather-windy', 'weather-windy-variant', 'web', 'web-box', 'web-cancel', 'web-check', 'web-clock', 'web-minus', 'web-off', 'web-plus', 'web-refresh', 'web-remove', 'web-sync', 'webcam', 'webcam-off', 'webhook', 'webpack', 'webrtc', 'wechat', 'weight', 'weight-gram', 'weight-kilogram', 'weight-lifter', 'weight-pound', 'whatsapp', 'wheel-barrow', 'wheelchair', 'wheelchair-accessibility', 'whistle', 'whistle-outline', 'white-balance-auto', 'white-balance-incandescent', 'white-balance-iridescent', 'white-balance-sunny', 'widgets', 'widgets-outline', 'wifi', 'wifi-alert', 'wifi-arrow-down', 'wifi-arrow-left', 'wifi-arrow-left-right', 'wifi-arrow-right', 'wifi-arrow-up', 'wifi-arrow-up-down', 'wifi-cancel', 'wifi-check', 'wifi-cog', 'wifi-lock', 'wifi-lock-open', 'wifi-marker', 'wifi-minus', 'wifi-off', 'wifi-plus', 'wifi-refresh', 'wifi-remove', 'wifi-settings', 'wifi-star', 'wifi-strength-1', 'wifi-strength-1-alert', 'wifi-strength-1-lock', 'wifi-strength-1-lock-open', 'wifi-strength-2', 'wifi-strength-2-alert', 'wifi-strength-2-lock', 'wifi-strength-2-lock-open', 'wifi-strength-3', 'wifi-strength-3-alert', 'wifi-strength-3-lock', 'wifi-strength-3-lock-open', 'wifi-strength-4', 'wifi-strength-4-alert', 'wifi-strength-4-lock', 'wifi-strength-4-lock-open', 'wifi-strength-alert-outline', 'wifi-strength-lock-open-outline', 'wifi-strength-lock-outline', 'wifi-strength-off', 'wifi-strength-off-outline', 'wifi-strength-outline', 'wifi-sync', 'wikipedia', 'wind-power', 'wind-power-outline', 'wind-turbine', 'wind-turbine-alert', 'wind-turbine-check', 'window-close', 'window-closed', 'window-closed-variant', 'window-maximize', 'window-minimize', 'window-open', 'window-open-variant', 'window-restore', 'window-shutter', 'window-shutter-alert', 'window-shutter-auto', 'window-shutter-cog', 'window-shutter-open', 'window-shutter-settings', 'windsock', 'wiper', 'wiper-wash', 'wiper-wash-alert', 'wizard-hat', 'wordpress', 'wrap', 'wrap-disabled', 'wrench', 'wrench-check', 'wrench-check-outline', 'wrench-clock', 'wrench-clock-outline', 'wrench-cog', 'wrench-cog-outline', 'wrench-outline', 'xamarin', 'xml', 'xmpp', 'yahoo', 'yeast', 'yin-yang', 'yoga', 'youtube', 'youtube-gaming', 'youtube-studio', 'youtube-subscription', 'youtube-tv', 'yurt', 'z-wave', 'zend', 'zigbee', 'zip-box', 'zip-box-outline', 'zip-disk', 'zodiac-aquarius', 'zodiac-aries', 'zodiac-cancer', 'zodiac-capricorn', 'zodiac-gemini', 'zodiac-leo', 'zodiac-libra', 'zodiac-pisces', 'zodiac-sagittarius', 'zodiac-scorpio', 'zodiac-taurus', 'zodiac-virgo', 'blank' ], 'fa' => [ - 'fab fa-500px', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fab fa-acquisitions-incorporated', 'fas fa-ad', 'far fa-address-book', 'far fa-address-card', 'fas fa-adjust', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fas fa-air-freshener', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fas fa-allergies', 'fab fa-amazon', 'fab fa-amazon-pay', 'fas fa-ambulance', 'fas fa-american-sign-language-interpreting', 'fab fa-amilia', 'fas fa-anchor', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-double-down', 'fas fa-angle-double-left', 'fas fa-angle-double-right', 'fas fa-angle-double-up', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'far fa-angry', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fas fa-apple-alt', 'fab fa-apple-pay', 'fas fa-archive', 'fas fa-archway', 'far fa-arrow-alt-circle-down', 'far fa-arrow-alt-circle-left', 'far fa-arrow-alt-circle-right', 'far fa-arrow-alt-circle-up', 'fas fa-arrow-circle-down', 'fas fa-arrow-circle-left', 'fas fa-arrow-circle-right', 'fas fa-arrow-circle-up', 'fas fa-arrow-down', 'fas fa-arrow-left', 'fas fa-arrow-right', 'fas fa-arrow-up', 'fas fa-arrows-alt', 'fas fa-arrows-alt-h', 'fas fa-arrows-alt-v', 'fab fa-artstation', 'fas fa-assistive-listening-systems', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fas fa-atlas', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backspace', 'fas fa-backward', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bahai', 'fas fa-balance-scale', 'fas fa-balance-scale-left', 'fas fa-balance-scale-right', 'fas fa-ban', 'fas fa-band-aid', 'fab fa-bandcamp', 'fas fa-barcode', 'fas fa-bars', 'fas fa-baseball-ball', 'fas fa-basketball-ball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-beer', 'fab fa-behance', 'fab fa-behance-square', 'far fa-bell', 'far fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bible', 'fas fa-bicycle', 'fas fa-biking', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fas fa-birthday-cake', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blind', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-dead', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-reader', 'far fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-style', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes', 'fas fa-braille', 'fas fa-brain', 'fas fa-bread-slice', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broadcast-tower', 'fas fa-broom', 'fas fa-brush', 'fab fa-btc', 'fab fa-buffer', 'fas fa-bug', 'far fa-building', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burn', 'fab fa-buromobelexperte', 'fas fa-bus', 'fas fa-bus-alt', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-calculator', 'far fa-calendar', 'far fa-calendar-alt', 'far fa-calendar-check', 'fas fa-calendar-day', 'far fa-calendar-minus', 'far fa-calendar-plus', 'far fa-calendar-times', 'fas fa-calendar-week', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-alt', 'fas fa-car-battery', 'fas fa-car-crash', 'fas fa-car-side', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'far fa-caret-square-down', 'far fa-caret-square-left', 'far fa-caret-square-right', 'far fa-caret-square-up', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-plus', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-teacher', 'fas fa-charging-station', 'fas fa-chart-area', 'far fa-chart-bar', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-check', 'far fa-check-circle', 'fas fa-check-double', 'far fa-check-square', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'fas fa-chess-knight', 'fas fa-chess-pawn', 'fas fa-chess-queen', 'fas fa-chess-rook', 'fas fa-chevron-circle-down', 'fas fa-chevron-circle-left', 'fas fa-chevron-circle-right', 'fas fa-chevron-circle-up', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'far fa-circle', 'fas fa-circle-notch', 'fas fa-city', 'fas fa-clinic-medical', 'far fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'far fa-clock', 'far fa-clone', 'far fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-download-alt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fas fa-cloud-upload-alt', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-cocktail', 'fas fa-code', 'fas fa-code-branch', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coffee', 'fas fa-cog', 'fas fa-cogs', 'fas fa-coins', 'fas fa-columns', 'far fa-comment', 'far fa-comment-alt', 'fas fa-comment-dollar', 'far fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-slash', 'far fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'far fa-compass', 'fas fa-compress', 'fas fa-compress-alt', 'fas fa-compress-arrows-alt', 'fas fa-concierge-bell', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'far fa-copy', 'far fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'far fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-alt', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cut', 'fab fa-cuttlefish', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dashcube', 'fas fa-database', 'fas fa-deaf', 'fab fa-deezer', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagnoses', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fas fa-digital-tachograph', 'fas fa-directions', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-divide', 'far fa-dizzy', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dolly-flatbed', 'fas fa-donate', 'fas fa-door-closed', 'fas fa-door-open', 'far fa-dot-circle', 'fas fa-dove', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-drafting-compass', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dribbble-square', 'fab fa-dropbox', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fab fa-earlybirds', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'far fa-edit', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-ellipsis-h', 'fas fa-ellipsis-v', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'far fa-envelope', 'far fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelope-square', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exchange-alt', 'fas fa-exclamation', 'fas fa-exclamation-circle', 'fas fa-exclamation-triangle', 'fas fa-expand', 'fas fa-expand-alt', 'fas fa-expand-arrows-alt', 'fab fa-expeditedssl', 'fas fa-external-link-alt', 'fas fa-external-link-square-alt', 'far fa-eye', 'fas fa-eye-dropper', 'far fa-eye-slash', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fab fa-facebook-square', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-fast-backward', 'fas fa-fast-forward', 'fas fa-faucet', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-alt', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-female', 'fas fa-fighter-jet', 'fab fa-figma', 'far fa-file', 'far fa-file-alt', 'far fa-file-archive', 'far fa-file-audio', 'far fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-download', 'far fa-file-excel', 'fas fa-file-export', 'far fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-medical', 'fas fa-file-medical-alt', 'far fa-file-pdf', 'far fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-signature', 'fas fa-file-upload', 'far fa-file-video', 'far fa-file-word', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-alt', 'fas fa-fire-extinguisher', 'fab fa-firefox', 'fab fa-firefox-browser', 'fas fa-first-aid', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fist-raised', 'far fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fab fa-flickr', 'fab fa-flipboard', 'far fa-flushed', 'fab fa-fly', 'far fa-folder', 'fas fa-folder-minus', 'far fa-folder-open', 'fas fa-folder-plus', 'fas fa-font', 'fab fa-font-awesome', 'fab fa-font-awesome-alt', 'fab fa-font-awesome-flag', 'fab fa-font-awesome-logo-full', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football-ball', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fab fa-foursquare', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'far fa-frown', 'far fa-frown-open', 'fab fa-fulcrum', 'fas fa-funnel-dollar', 'far fa-futbol', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gavel', 'far fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-git-square', 'fab fa-github', 'fab fa-github-alt', 'fab fa-github-square', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-cheers', 'fas fa-glass-martini', 'fas fa-glass-martini-alt', 'fas fa-glass-whiskey', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fas fa-globe-africa', 'fas fa-globe-americas', 'fas fa-globe-asia', 'fas fa-globe-europe', 'fab fa-gofore', 'fas fa-golf-ball', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-plus-square', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'far fa-grimace', 'far fa-grin', 'far fa-grin-alt', 'far fa-grin-beam', 'far fa-grin-beam-sweat', 'far fa-grin-hearts', 'far fa-grin-squint', 'far fa-grin-squint-tears', 'far fa-grin-stars', 'far fa-grin-tears', 'far fa-grin-tongue', 'far fa-grin-tongue-squint', 'far fa-grin-tongue-wink', 'far fa-grin-wink', 'fas fa-grip-horizontal', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fab fa-grunt', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-h-square', 'fab fa-hacker-news', 'fab fa-hacker-news-square', 'fab fa-hackerrank', 'fas fa-hamburger', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand-holding', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-holding-usd', 'fas fa-hand-holding-water', 'far fa-hand-lizard', 'fas fa-hand-middle-finger', 'far fa-hand-paper', 'far fa-hand-peace', 'far fa-hand-point-down', 'far fa-hand-point-left', 'far fa-hand-point-right', 'far fa-hand-point-up', 'far fa-hand-pointer', 'far fa-hand-rock', 'far fa-hand-scissors', 'fas fa-hand-sparkles', 'far fa-hand-spock', 'fas fa-hands', 'fas fa-hands-helping', 'fas fa-hands-wash', 'far fa-handshake', 'fas fa-handshake-alt-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-hat', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'far fa-hdd', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-alt', 'fas fa-headset', 'far fa-heart', 'fas fa-heart-broken', 'fas fa-heartbeat', 'fas fa-helicopter', 'fas fa-highlighter', 'fas fa-hiking', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fas fa-history', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fas fa-home', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'far fa-hospital', 'fas fa-hospital-alt', 'fas fa-hospital-symbol', 'fas fa-hospital-user', 'fas fa-hot-tub', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'far fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house-damage', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'far fa-id-badge', 'far fa-id-card', 'fas fa-id-card-alt', 'fab fa-ideal', 'fas fa-igloo', 'far fa-image', 'far fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fas fa-info-circle', 'fab fa-innosoft', 'fab fa-instagram', 'fab fa-instagram-square', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fas fa-journal-whills', 'fab fa-js', 'fab fa-js-square', 'fab fa-jsfiddle', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'far fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'far fa-kiss', 'far fa-kiss-beam', 'far fa-kiss-wink-heart', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-landmark', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-house', 'fas fa-laptop-medical', 'fab fa-laravel', 'fab fa-lastfm', 'fab fa-lastfm-square', 'far fa-laugh', 'far fa-laugh-beam', 'far fa-laugh-squint', 'far fa-laugh-wink', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'far fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fas fa-level-down-alt', 'fas fa-level-up-alt', 'far fa-life-ring', 'far fa-lightbulb', 'fab fa-line', 'fas fa-link', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'far fa-list-alt', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-location-arrow', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-long-arrow-alt-down', 'fas fa-long-arrow-alt-left', 'fas fa-long-arrow-alt-right', 'fas fa-long-arrow-alt-up', 'fas fa-low-vision', 'fas fa-luggage-cart', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fab fa-magento', 'fas fa-magic', 'fas fa-magnet', 'fas fa-mail-bulk', 'fab fa-mailchimp', 'fas fa-male', 'fab fa-mandalorian', 'far fa-map', 'fas fa-map-marked', 'fas fa-map-marked-alt', 'fas fa-map-marker', 'fas fa-map-marker-alt', 'fas fa-map-pin', 'fas fa-map-signs', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-h', 'fas fa-mars-stroke-v', 'fas fa-mask', 'fab fa-mastodon', 'fab fa-maxcdn', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medium-m', 'fas fa-medkit', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'far fa-meh', 'far fa-meh-blank', 'far fa-meh-rolling-eyes', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-alt', 'fas fa-microphone-alt-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-minus', 'fas fa-minus-circle', 'far fa-minus-square', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-alt', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'far fa-money-bill-alt', 'fas fa-money-bill-wave', 'fas fa-money-bill-wave-alt', 'fas fa-money-check', 'fas fa-money-check-alt', 'fas fa-monument', 'far fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-motorcycle', 'fas fa-mountain', 'fas fa-mouse', 'fas fa-mouse-pointer', 'fas fa-mug-hot', 'fas fa-music', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'far fa-newspaper', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'far fa-object-group', 'far fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odnoklassniki-square', 'fas fa-oil-can', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-brush', 'fas fa-paint-roller', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'far fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-parking', 'fas fa-passport', 'fas fa-pastafarianism', 'fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'far fa-pause-circle', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-alt', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-square', 'fas fa-pencil-alt', 'fas fa-pencil-ruler', 'fab fa-penny-arcade', 'fas fa-people-arrows', 'fas fa-people-carry', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fas fa-percentage', 'fab fa-periscope', 'fas fa-person-booth', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-alt', 'fas fa-phone-slash', 'fas fa-phone-square', 'fas fa-phone-square-alt', 'fas fa-phone-volume', 'fas fa-photo-video', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fab fa-pied-piper-square', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pinterest-square', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-departure', 'fas fa-plane-slash', 'fas fa-play', 'far fa-play-circle', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plus', 'fas fa-plus-circle', 'far fa-plus-square', 'fas fa-podcast', 'fas fa-poll', 'fas fa-poll-h', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-portrait', 'fas fa-pound-sign', 'fas fa-power-off', 'fas fa-pray', 'fas fa-praying-hands', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-alt', 'fas fa-print', 'fas fa-procedures', 'fab fa-product-hunt', 'fas fa-project-diagram', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'far fa-question-circle', 'fas fa-quidditch', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-quran', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radiation-alt', 'fas fa-rainbow', 'fas fa-random', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-reddit-square', 'fab fa-redhat', 'fas fa-redo', 'fas fa-redo-alt', 'far fa-registered', 'fas fa-remove-format', 'fab fa-renren', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-ring', 'fas fa-road', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-route', 'fas fa-rss', 'fas fa-rss-square', 'fas fa-ruble-sign', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-running', 'fas fa-rupee-sign', 'fab fa-rust', 'far fa-sad-cry', 'far fa-sad-tear', 'fab fa-safari', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'far fa-save', 'fab fa-schlix', 'fas fa-school', 'fas fa-screwdriver', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-sd-card', 'fas fa-search', 'fas fa-search-dollar', 'fas fa-search-location', 'fas fa-search-minus', 'fas fa-search-plus', 'fab fa-searchengin', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-alt', 'fas fa-share-alt-square', 'far fa-share-square', 'fas fa-shekel-sign', 'fas fa-shield-alt', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shipping-fast', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shopify', 'fas fa-shopping-bag', 'fas fa-shopping-basket', 'fas fa-shopping-cart', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shuttle-van', 'fas fa-sign', 'fas fa-sign-in-alt', 'fas fa-sign-language', 'fas fa-sign-out-alt', 'fas fa-signal', 'fas fa-signature', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fas fa-skating', 'fab fa-sketch', 'fas fa-skiing', 'fas fa-skiing-nordic', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fab fa-slack-hash', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders-h', 'fab fa-slideshare', 'far fa-smile', 'far fa-smile-beam', 'far fa-smile-wink', 'fas fa-smog', 'fas fa-smoking', 'fas fa-smoking-ban', 'fas fa-sms', 'fab fa-snapchat', 'fab fa-snapchat-ghost', 'fab fa-snapchat-square', 'fas fa-snowboarding', 'far fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-alpha-down', 'fas fa-sort-alpha-down-alt', 'fas fa-sort-alpha-up', 'fas fa-sort-alpha-up-alt', 'fas fa-sort-amount-down', 'fas fa-sort-amount-down-alt', 'fas fa-sort-amount-up', 'fas fa-sort-amount-up-alt', 'fas fa-sort-down', 'fas fa-sort-numeric-down', 'fas fa-sort-numeric-down-alt', 'fas fa-sort-numeric-up', 'fas fa-sort-numeric-up-alt', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fas fa-space-shuttle', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fab fa-spotify', 'fas fa-spray-can', 'far fa-square', 'fas fa-square-full', 'fas fa-square-root-alt', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-stamp', 'far fa-star', 'fas fa-star-and-crescent', 'far fa-star-half', 'fas fa-star-half-alt', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-square', 'fab fa-steam-symbol', 'fas fa-step-backward', 'fas fa-step-forward', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'far fa-sticky-note', 'fas fa-stop', 'far fa-stop-circle', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-alt', 'fas fa-store-alt-slash', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-stream', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-subway', 'fas fa-suitcase', 'fas fa-suitcase-rolling', 'far fa-sun', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'far fa-surprise', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fas fa-swimmer', 'fas fa-swimming-pool', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-sync', 'fas fa-sync-alt', 'fas fa-syringe', 'fas fa-table', 'fas fa-table-tennis', 'fas fa-tablet', 'fas fa-tablet-alt', 'fas fa-tablets', 'fas fa-tachometer-alt', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tasks', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fab fa-telegram-plane', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fab fa-tencent-weibo', 'fas fa-tenge', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-width', 'fas fa-th', 'fas fa-th-large', 'fas fa-th-list', 'fab fa-the-red-yeti', 'fas fa-theater-masks', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fas fa-thermometer-empty', 'fas fa-thermometer-full', 'fas fa-thermometer-half', 'fas fa-thermometer-quarter', 'fas fa-thermometer-three-quarters', 'fab fa-think-peaks', 'far fa-thumbs-down', 'far fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-ticket-alt', 'fab fa-tiktok', 'fas fa-times', 'far fa-times-circle', 'fas fa-tint', 'fas fa-tint-slash', 'far fa-tired', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toolbox', 'fas fa-tools', 'fas fa-tooth', 'fas fa-torah', 'fas fa-torii-gate', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-tram', 'fas fa-transgender', 'fas fa-transgender-alt', 'fas fa-trash', 'far fa-trash-alt', 'fas fa-trash-restore', 'fas fa-trash-restore-alt', 'fas fa-tree', 'fab fa-trello', 'fas fa-trophy', 'fas fa-truck', 'fas fa-truck-loading', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-tshirt', 'fas fa-tty', 'fab fa-tumblr', 'fab fa-tumblr-square', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-twitter-square', 'fab fa-typo3', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fas fa-undo', 'fas fa-undo-alt', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-university', 'fas fa-unlink', 'fas fa-unlock', 'fas fa-unlock-alt', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-upload', 'fab fa-ups', 'fab fa-usb', 'far fa-user', 'fas fa-user-alt', 'fas fa-user-alt-slash', 'fas fa-user-astronaut', 'fas fa-user-check', 'far fa-user-circle', 'fas fa-user-clock', 'fas fa-user-cog', 'fas fa-user-edit', 'fas fa-user-friends', 'fas fa-user-graduate', 'fas fa-user-injured', 'fas fa-user-lock', 'fas fa-user-md', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-times', 'fas fa-users', 'fas fa-users-cog', 'fas fa-users-slash', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensil-spoon', 'fas fa-utensils', 'fab fa-vaadin', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fab fa-viadeo-square', 'fas fa-vial', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-square', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volleyball-ball', 'fas fa-volume-down', 'fas fa-volume-mute', 'fas fa-volume-off', 'fas fa-volume-up', 'fas fa-vote-yea', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-walking', 'fas fa-wallet', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-wave-square', 'fab fa-waze', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight', 'fas fa-weight-hanging', 'fab fa-weixin', 'fab fa-whatsapp', 'fab fa-whatsapp-square', 'fas fa-wheelchair', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'far fa-window-close', 'far fa-window-maximize', 'far fa-window-minimize', 'far fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-alt', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x-ray', 'fab fa-xbox', 'fab fa-xing', 'fab fa-xing-square', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fab fa-youtube-square', 'fab fa-zhihu' + 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'far fa-address-book', 'far fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'far fa-bell', 'fas fa-bell-concierge', 'far fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'far fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'far fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'far fa-calendar', 'far fa-calendar-check', 'fas fa-calendar-day', 'far fa-calendar-days', 'far fa-calendar-minus', 'far fa-calendar-plus', 'fas fa-calendar-week', 'far fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'far fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'far fa-chess-bishop', 'fas fa-chess-board', 'far fa-chess-king', 'far fa-chess-knight', 'far fa-chess-pawn', 'far fa-chess-queen', 'far fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-child-rifle', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'far fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'far fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'far fa-circle-dot', 'far fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'far fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'far fa-circle-pause', 'far fa-circle-play', 'fas fa-circle-plus', 'far fa-circle-question', 'fas fa-circle-radiation', 'far fa-circle-right', 'far fa-circle-stop', 'far fa-circle-up', 'far fa-circle-user', 'far fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'far fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'far fa-clock', 'fas fa-clock-rotate-left', 'far fa-clone', 'far fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'far fa-comment', 'fas fa-comment-dollar', 'far fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-slash', 'fas fa-comment-sms', 'far fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'far fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'far fa-copy', 'far fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'far fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dashcube', 'fas fa-database', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'far fa-envelope', 'fas fa-envelope-circle-check', 'far fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'far fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'far fa-eye-slash', 'fas fa-f', 'far fa-face-angry', 'far fa-face-dizzy', 'far fa-face-flushed', 'far fa-face-frown', 'far fa-face-frown-open', 'far fa-face-grimace', 'far fa-face-grin', 'far fa-face-grin-beam', 'far fa-face-grin-beam-sweat', 'far fa-face-grin-hearts', 'far fa-face-grin-squint', 'far fa-face-grin-squint-tears', 'far fa-face-grin-stars', 'far fa-face-grin-tears', 'far fa-face-grin-tongue', 'far fa-face-grin-tongue-squint', 'far fa-face-grin-tongue-wink', 'far fa-face-grin-wide', 'far fa-face-grin-wink', 'far fa-face-kiss', 'far fa-face-kiss-beam', 'far fa-face-kiss-wink-heart', 'far fa-face-laugh', 'far fa-face-laugh-beam', 'far fa-face-laugh-squint', 'far fa-face-laugh-wink', 'far fa-face-meh', 'far fa-face-meh-blank', 'far fa-face-rolling-eyes', 'far fa-face-sad-cry', 'far fa-face-sad-tear', 'far fa-face-smile', 'far fa-face-smile-beam', 'far fa-face-smile-wink', 'far fa-face-surprise', 'far fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'far fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'far fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'far fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'far fa-file-excel', 'fas fa-file-export', 'far fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'far fa-file-lines', 'fas fa-file-medical', 'far fa-file-pdf', 'fas fa-file-pen', 'far fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'far fa-file-video', 'fas fa-file-waveform', 'far fa-file-word', 'far fa-file-zipper', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'far fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'far fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-fly', 'far fa-folder', 'far fa-folder-closed', 'fas fa-folder-minus', 'far fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fab fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'far fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'far fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'far fa-hand', 'far fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'far fa-hand-lizard', 'fas fa-hand-middle-finger', 'far fa-hand-peace', 'far fa-hand-point-down', 'far fa-hand-point-left', 'far fa-hand-point-right', 'far fa-hand-point-up', 'far fa-hand-pointer', 'far fa-hand-scissors', 'fas fa-hand-sparkles', 'far fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'far fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'far fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'far fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'far fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'far fa-hourglass', 'fas fa-hourglass-end', 'far fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'far fa-id-badge', 'far fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'far fa-image', 'fas fa-image-portrait', 'far fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'far fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'far fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'far fa-life-ring', 'far fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'far fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'far fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'far fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'far fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'far fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'far fa-notdef', 'far fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'far fa-object-group', 'far fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'far fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'far fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'far fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'far fa-rectangle-list', 'far fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'far fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'far fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'far fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'far fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'far fa-square-caret-down', 'far fa-square-caret-left', 'far fa-square-caret-right', 'far fa-square-caret-up', 'far fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'far fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'far fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'far fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-whatsapp', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'far fa-star', 'fas fa-star-and-crescent', 'far fa-star-half', 'far fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'far fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-large', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'far fa-thumbs-down', 'far fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'far fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-usb', 'far fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'far fa-window-maximize', 'far fa-window-minimize', 'far fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ], ]; diff --git a/app_data/libraries.json b/app_data/libraries.json index 9f27bd9de9bc..d56d979a91cb 100644 --- a/app_data/libraries.json +++ b/app_data/libraries.json @@ -64,7 +64,7 @@ }, "tinycolor2": { "name": "tinycolor2", - "version": "1.4.2", + "version": "1.6.0", "license": "MIT", "homepage": "https:\/\/yarnpkg.com\/en\/package\/tinycolor2", "licenseError": false, diff --git a/app_data/moduleHierarchy.php b/app_data/moduleHierarchy.php index 6a5e283fb092..ae09d6d989a1 100644 --- a/app_data/moduleHierarchy.php +++ b/app_data/moduleHierarchy.php @@ -29,57 +29,83 @@ 'modulesMapRelatedFields' => [//Map links between modules 'ProjectTask' => [ 'projectmilestoneid' => ['ProjectMilestone' => ['projectid' => ['projectid']]], - 'parentid' => ['ProjectTask' => ['projectid' => ['projectid'], 'projectmilestoneid' => ['projectmilestoneid']]] + 'parentid' => ['ProjectTask' => ['projectid' => ['projectid'], 'projectmilestoneid' => ['projectmilestoneid']]], ], 'HelpDesk' => [ 'projectid' => ['Project' => ['parent_id' => ['linktoaccountscontacts']]], 'contact_id' => ['Contacts' => ['parent_id' => ['parent_id']]], 'pssold_id' => ['Assets' => ['product_id' => ['product', 'Products'], 'parent_id' => ['parent_id', 'Accounts']], 'OSSSoldServices' => ['product_id' => ['serviceid', 'Services']]], - 'servicecontractsid' => ['ServiceContracts' => ['parent_id' => ['sc_related_to', 'Accounts'], 'ticketpriorities' => ['contract_priority']]] + 'servicecontractsid' => ['ServiceContracts' => ['parent_id' => ['sc_related_to', 'Accounts'], 'ticketpriorities' => ['contract_priority']]], ], 'OSSTimeControl' => [ 'process' => ['Project' => ['link' => ['linktoaccountscontacts']]], - 'subprocess' => ['HelpDesk' => ['name' => ['ticket_title']]] + 'subprocess' => ['HelpDesk' => ['name' => ['ticket_title'], 'link' => ['parent_id'], 'process' => ['servicecontractsid'], 'linkextend' => ['contact_id']]] ], 'SRequirementsCards' => [ - 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]] + 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], ], 'SCalculations' => [ - 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]] + 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], ], 'SVendorEnquiries' => [ - 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]] + 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], ], 'SQuotes' => [ 'accountid' => ['Accounts' => ['company' => ['accountname']]], - 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]] + 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], ], 'SSingleOrders' => [ 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], - 'squotesid' => ['SQuotes' => ['accountid' => ['accountid']]] + 'squotesid' => ['SQuotes' => ['accountid' => ['accountid']]], + 'accountid' => [ + 'Accounts' => [ + 'company_name_a' => ['accountname'], + 'vat_id_a' => ['vat_id'], + 'addresslevel8a' => ['addresslevel8a'], + 'addresslevel7a' => ['addresslevel7a'], + 'addresslevel6a' => ['addresslevel6a'], + 'addresslevel5a' => ['addresslevel5a'], + 'addresslevel4a' => ['addresslevel4a'], + 'addresslevel3a' => ['addresslevel3a'], + 'addresslevel2a' => ['addresslevel2a'], + 'addresslevel1a' => ['addresslevel1a'], + ], + ], ], 'SRecurringOrders' => [ 'accountid' => ['Accounts' => ['company' => ['accountname']]], - 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]] + 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], + 'accountid' => [ + 'Accounts' => [ + 'addresslevel8a' => ['addresslevel8a'], + 'addresslevel7a' => ['addresslevel7a'], + 'addresslevel6a' => ['addresslevel6a'], + 'addresslevel5a' => ['addresslevel5a'], + 'addresslevel4a' => ['addresslevel4a'], + 'addresslevel3a' => ['addresslevel3a'], + 'addresslevel2a' => ['addresslevel2a'], + 'addresslevel1a' => ['addresslevel1a'], + ], + ], ], 'SQuoteEnquiries' => [ - 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]] + 'salesprocessid' => ['SSalesProcesses' => ['accountid' => ['related_to']]], ], 'SSalesProcesses' => [ - 'projectid' => ['Project' => ['accountid' => ['linktoaccountscontacts']]] + 'projectid' => ['Project' => ['accountid' => ['linktoaccountscontacts']]], ], 'IGRNC' => [ - 'igrnid' => ['IGRN' => ['vendorid' => ['vendorid'], 'storageid' => ['storageid']]] + 'igrnid' => ['IGRN' => ['vendorid' => ['vendorid'], 'storageid' => ['storageid']]], ], 'IGDNC' => [ - 'igdnid' => ['IGDN' => ['storageid' => ['storageid'], 'accountid' => ['accountid']]] + 'igdnid' => ['IGDN' => ['storageid' => ['storageid'], 'accountid' => ['accountid']]], ], 'Assets' => [ 'contactid' => ['Contacts' => ['parent_id' => ['parent_id']]], ], 'FCorectingInvoice' => [ - 'finvoiceid' => ['FInvoice' => ['accountid' => ['accountid']]] - ] + 'finvoiceid' => ['FInvoice' => ['accountid' => ['accountid']]], + ], ], 'modulesMap1M' => [// Base => Parent 'OSSEmployees' => ['MultiCompany'], @@ -104,7 +130,6 @@ 'OSSOutsourcedServices' => ['Accounts', 'Leads'], 'Assets' => ['Accounts', 'Leads'], 'OutsourcedProducts' => ['Accounts', 'Leads'], - 'OSSPasswords' => ['Accounts', 'Leads', 'HelpDesk', 'Vendors'], 'Calendar' => ['Accounts', 'Contacts', 'OSSEmployees', 'Leads', 'Vendors', 'HelpDesk', 'Project', 'HelpDesk', 'ServiceContracts', 'Campaigns'], ], 'modulesMapMMBase' => ['Services', 'Reservations'], @@ -112,5 +137,5 @@ 'Documents' => ['table' => 'vtiger_senotesrel', 'rel' => 'crmid', 'base' => 'notesid'], 'Products' => ['table' => 'vtiger_seproductsrel', 'rel' => 'crmid', 'base' => 'productid'], 'OSSMailView' => ['table' => 'vtiger_ossmailview_relation', 'rel' => 'crmid', 'base' => 'ossmailviewid'], - ] + ], ]; diff --git a/cli.php b/cli.php index 722ba1635880..2267a35568bf 100644 --- a/cli.php +++ b/cli.php @@ -2,13 +2,24 @@ /** * YetiForce CLI. * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @package Cli + * + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) * @author Mariusz Krzaczkowski */ chdir(__DIR__); +try { + require __DIR__ . '/include/RequirementsValidation.php'; +} catch (\Exception $th) { + echo str_repeat('--', 40) . PHP_EOL; + echo $th->getMessage() . PHP_EOL; + echo str_repeat('--', 40) . PHP_EOL; + echo "Examples:\nphp74 cli.php\n/usr/local/php74/bin/php74 cli.php\n/usr/local/php80/bin/php80 cli.php\n"; + echo str_repeat('--', 40) . PHP_EOL; + return; +} -require __DIR__ . '/include/RequirementsValidation.php'; require __DIR__ . '/include/main/WebUI.php'; \App\Process::$requestMode = 'Cli'; @@ -20,9 +31,12 @@ }, E_ALL); try { + if (PHP_SAPI !== 'cli') { + throw new \Exception('Console access only from the operating system CLI.'); + } new \App\Cli(); } catch (Throwable $e) { - echo $e->__toString(); + echo rtrim(str_replace(ROOT_DIRECTORY . \DIRECTORY_SEPARATOR, '', $e->__toString()), PHP_EOL); if ('test' === \App\Config::main('systemMode')) { throw $e; } diff --git a/codecov.yml b/codecov.yml index 04f3d0575877..9e087b743b14 100644 --- a/codecov.yml +++ b/codecov.yml @@ -10,19 +10,19 @@ coverage: status: project: default: - target: 29% + target: 20% tests: target: 100% paths: - 'tests/' app: - target: 37% + target: 35% paths: - 'app/' api: - target: 64% + target: 60% paths: - 'api/' patch: off diff --git a/composer.json b/composer.json index 735ee90ded77..3a37f98c4e99 100644 --- a/composer.json +++ b/composer.json @@ -12,27 +12,23 @@ "Customer Relation Management", "System CRM" ], + "type": "project", + "license": "proprietary", "homepage": "https://yetiforce.com/", "support": { "issues": "https://github.com/YetiForceCompany/YetiForceCRM/issues", - "wiki": "https://yetiforce.com/en/documentation.html", + "wiki": "https://doc.yetiforce.com/", "source": "https://github.com/YetiForceCompany/YetiForceCRM" }, "authors": [ { "name": "YetiForceCompany", - "email": "info@yetiforce.com", + "email": "hello@yetiforce.com", "homepage": "https://yetiforce.com/" } ], - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/yetiforcecrm" - } - ], "require": { - "php": ">=7.3", + "php": ">=7.4", "ext-imap": "*", "ext-pdo": "*", "ext-pdo_mysql": "*", @@ -64,18 +60,18 @@ "ezyang/htmlpurifier": "^v4.11.0", "simshaun/recurr": "^v5.0", "giggsey/libphonenumber-for-php": "^8.8.11", - "dg/rss-php": "^1.2", + "simplepie/simplepie": "^1", "phpoffice/phpspreadsheet": "^1.3.1", - "sonata-project/google-authenticator": "^2.3.0", - "milon/barcode": "^8.0.0", - "ckeditor/ckeditor": "^4.9.2", + "pragmarx/google2fa": "^v8", + "milon/barcode": "^9.0.0", + "ckeditor/ckeditor": "4.22.1", "parsecsv/php-parsecsv": "^1.1.0", "guzzlehttp/guzzle": "^7.0", "nette/php-generator": "^3.2.1", "yetiforce/csrf-magic": "^v1.1.1", "maximebf/debugbar": "1.*", "yetiforce/yii2": "^2.0.43", - "yetiforce/yetiforcepdf": "0.1.33", + "yetiforce/yetiforcepdf": "0.1.40", "adhocore/jwt": "^1.0", "zbateson/mail-mime-parser": "^2.0", "mlocati/spf-lib": "^3", @@ -83,7 +79,12 @@ "league/climate": "^3.6", "twig/twig": "^3.0", "illuminate/support": "^8.0", - "globalcitizen/php-iban": "^4.0.0" + "globalcitizen/php-iban": "^4.0.0", + "chrome-php/chrome": "^v1.4.0", + "setasign/fpdf": "1.8.*", + "setasign/fpdi": "^v2.3.6", + "notihnio/php-multipart-form-data-parser": "*", + "symfony/filesystem": "^v5.4.3" }, "suggest": { "ext-imagick": "Library recommended for securing potentially dangerous graphic files", diff --git a/composer.lock b/composer.lock index d49581d01d60..fbbd1161c933 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8868f0e6e4fd96060c17a125918bc3f9", + "content-hash": "7a2fcacabe3aaf114bbbfa21d78a1dc2", "packages": [ { "name": "adhocore/jwt", @@ -63,18 +63,154 @@ ], "time": "2021-02-20T09:56:44+00:00" }, + { + "name": "chrome-php/chrome", + "version": "v1.9.1", + "source": { + "type": "git", + "url": "https://github.com/chrome-php/chrome.git", + "reference": "8df3b31ef0d1021c6ee40d8d31da32363a241244" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chrome-php/chrome/zipball/8df3b31ef0d1021c6ee40d8d31da32363a241244", + "reference": "8df3b31ef0d1021c6ee40d8d31da32363a241244", + "shasum": "" + }, + "require": { + "chrome-php/wrench": "^1.5", + "evenement/evenement": "^3.0.1", + "monolog/monolog": "^1.27.1 || ^2.8 || ^3.2", + "php": "^7.4.15 || ^8.0.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/filesystem": "^4.4 || ^5.0 || ^6.0", + "symfony/polyfill-mbstring": "^1.26", + "symfony/process": "^4.4 || ^5.0 || ^6.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^9.6.3 || ^10.0.12", + "symfony/var-dumper": "^4.4 || ^5.0 || ^6.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "HeadlessChromium\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Enrico Dias", + "email": "enrico@enricodias.com", + "homepage": "https://github.com/enricodias" + } + ], + "description": "Instrument headless chrome/chromium instances from PHP", + "keywords": [ + "browser", + "chrome", + "chromium", + "crawl", + "headless", + "pdf", + "puppeteer", + "screenshot" + ], + "support": { + "issues": "https://github.com/chrome-php/chrome/issues", + "source": "https://github.com/chrome-php/chrome/tree/v1.9.1" + }, + "time": "2023-10-08T14:48:21+00:00" + }, + { + "name": "chrome-php/wrench", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/chrome-php/wrench.git", + "reference": "725246324339e5fd5d798361b561e81004324f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chrome-php/wrench/zipball/725246324339e5fd5d798361b561e81004324f96", + "reference": "725246324339e5fd5d798361b561e81004324f96", + "shasum": "" + }, + "require": { + "ext-sockets": "*", + "php": "^7.4.15 || ^8.0.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/polyfill-php80": "^1.26" + }, + "conflict": { + "wrench/wrench": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "Wrench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "A simple PHP WebSocket implementation", + "keywords": [ + "WebSockets", + "hybi", + "websocket" + ], + "support": { + "issues": "https://github.com/chrome-php/wrench/issues", + "source": "https://github.com/chrome-php/wrench/tree/v1.5.0" + }, + "time": "2023-03-11T18:12:56+00:00" + }, { "name": "ckeditor/ckeditor", - "version": "4.17.1", + "version": "4.22.1", "source": { "type": "git", "url": "https://github.com/ckeditor/ckeditor4-releases.git", - "reference": "b71b8bf724174f2feaf53f64ee424bf1f5ba61fa" + "reference": "0d51138b0a258165ac09724e8f5cda67cf9126a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ckeditor/ckeditor4-releases/zipball/b71b8bf724174f2feaf53f64ee424bf1f5ba61fa", - "reference": "b71b8bf724174f2feaf53f64ee424bf1f5ba61fa", + "url": "https://api.github.com/repos/ckeditor/ckeditor4-releases/zipball/0d51138b0a258165ac09724e8f5cda67cf9126a3", + "reference": "0d51138b0a258165ac09724e8f5cda67cf9126a3", "shasum": "" }, "type": "library", @@ -109,20 +245,20 @@ "source": "https://github.com/ckeditor/ckeditor4", "wiki": "https://ckeditor.com/docs/ckeditor4/latest/" }, - "time": "2021-11-17T16:15:01+00:00" + "time": "2023-06-30T13:35:30+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.1", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -169,7 +305,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.1" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -185,76 +321,31 @@ "type": "tidelift" } ], - "time": "2021-10-28T20:44:15+00:00" - }, - { - "name": "dg/rss-php", - "version": "v1.5", - "source": { - "type": "git", - "url": "https://github.com/dg/rss-php.git", - "reference": "18f00ab1828948a8cfe107729ca1f11c20129b47" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dg/rss-php/zipball/18f00ab1828948a8cfe107729ca1f11c20129b47", - "reference": "18f00ab1828948a8cfe107729ca1f11c20129b47", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": ">=5.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - } - ], - "description": "RSS & Atom Feeds for PHP is a very small and easy-to-use library for consuming an RSS and Atom feed", - "homepage": "https://github.com/dg/rss-php", - "keywords": [ - "atom", - "feed", - "rss" - ], - "support": { - "source": "https://github.com/dg/rss-php/tree/v1.5" - }, - "time": "2020-11-25T22:57:16+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "doctrine/collections", - "version": "1.6.8", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", + "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^0.12", + "doctrine/coding-standard": "^9.0 || ^10.0", + "phpstan/phpstan": "^1.4.8", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", - "vimeo/psalm": "^4.2.1" + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -298,34 +389,81 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.8" + "source": "https://github.com/doctrine/collections/tree/1.8.0" + }, + "time": "2022-09-01T20:12:10+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, - "time": "2021-08-10T18:51:53+00:00" + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + }, + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.4", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", "autoload": { @@ -375,7 +513,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" + "source": "https://github.com/doctrine/inflector/tree/2.0.8" }, "funding": [ { @@ -391,36 +529,90 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:16:43+00:00" + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" }, { "name": "ezyang/htmlpurifier", - "version": "v4.13.0", + "version": "v4.16.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", "shasum": "" }, "require": { - "php": ">=5.2" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" }, "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" }, "type": "library", "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, "files": [ "library/HTMLPurifier.composer.php" ], + "psr-0": { + "HTMLPurifier": "library/" + }, "exclude-from-classmap": [ "/library/HTMLPurifier/Language/" ] @@ -443,22 +635,22 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/master" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" }, - "time": "2020-06-29T00:56:53+00:00" + "time": "2022-09-18T07:06:19+00:00" }, { "name": "giggsey/libphonenumber-for-php", - "version": "8.12.39", + "version": "8.13.23", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "6ae517989e96f069141ffeb56ccbbd849520f6ff" + "reference": "b2dff83693cb46eb4478b193e9d94e2ff6258480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/6ae517989e96f069141ffeb56ccbbd849520f6ff", - "reference": "6ae517989e96f069141ffeb56ccbbd849520f6ff", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/b2dff83693cb46eb4478b193e9d94e2ff6258480", + "reference": "b2dff83693cb46eb4478b193e9d94e2ff6258480", "shasum": "" }, "require": { @@ -514,24 +706,23 @@ "validation" ], "support": { - "irc": "irc://irc.appliedirc.com/lobby", "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", "source": "https://github.com/giggsey/libphonenumber-for-php" }, - "time": "2021-12-07T08:51:54+00:00" + "time": "2023-10-11T07:12:56+00:00" }, { "name": "giggsey/locale", - "version": "2.1", + "version": "2.4", "source": { "type": "git", "url": "https://github.com/giggsey/Locale.git", - "reference": "8d324583b5899e6280a875c43bf1fc9658bc6962" + "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/8d324583b5899e6280a875c43bf1fc9658bc6962", - "reference": "8d324583b5899e6280a875c43bf1fc9658bc6962", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", + "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", "shasum": "" }, "require": { @@ -545,10 +736,10 @@ "phing/phing": "^2.7", "php-coveralls/php-coveralls": "^2.0", "phpunit/phpunit": "^8.5|^9.5", - "symfony/console": "^5.0", - "symfony/filesystem": "^5.0", - "symfony/finder": "^5.0", - "symfony/process": "^5.0" + "symfony/console": "^5.0|^6.0", + "symfony/filesystem": "^5.0|^6.0", + "symfony/finder": "^5.0|^6.0", + "symfony/process": "^5.0|^6.0" }, "type": "library", "autoload": { @@ -570,24 +761,27 @@ "description": "Locale functions required by libphonenumber-for-php", "support": { "issues": "https://github.com/giggsey/Locale/issues", - "source": "https://github.com/giggsey/Locale/tree/2.1" + "source": "https://github.com/giggsey/Locale/tree/2.4" }, - "time": "2021-11-04T19:12:22+00:00" + "time": "2023-04-13T07:40:58+00:00" }, { "name": "globalcitizen/php-iban", - "version": "v4.1.0", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/globalcitizen/php-iban.git", - "reference": "5bf5d7df0bd0158460897f2b9c26eda91bbf9b7d" + "reference": "148b3c37c81c6bc525705de6dd44ea322963bd10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/globalcitizen/php-iban/zipball/5bf5d7df0bd0158460897f2b9c26eda91bbf9b7d", - "reference": "5bf5d7df0bd0158460897f2b9c26eda91bbf9b7d", + "url": "https://api.github.com/repos/globalcitizen/php-iban/zipball/148b3c37c81c6bc525705de6dd44ea322963bd10", + "reference": "148b3c37c81c6bc525705de6dd44ea322963bd10", "shasum": "" }, + "require": { + "php": "^5.4 || ^5.5 || ^5.6 || ^7.0 || ^7.4 || ^8.0 || ^8.1" + }, "type": "library", "autoload": { "files": [ @@ -602,28 +796,28 @@ "description": "php-iban is a library for parsing and validating IBAN (and IIBAN) bank account information.", "support": { "issues": "https://github.com/globalcitizen/php-iban/issues", - "source": "https://github.com/globalcitizen/php-iban/tree/v4.1.0" + "source": "https://github.com/globalcitizen/php-iban/tree/v4.2.1" }, - "time": "2021-07-01T23:55:02+00:00" + "time": "2023-01-08T12:29:37+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.4.1", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -632,10 +826,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -645,17 +840,18 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "7.4-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -712,7 +908,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.1" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -728,41 +924,40 @@ "type": "tidelift" } ], - "time": "2021-12-06T18:43:05+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -796,7 +991,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -812,26 +1007,26 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.1.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -839,17 +1034,18 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.1-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -911,7 +1107,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.1.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -927,20 +1123,20 @@ "type": "tidelift" } ], - "time": "2021-10-06T17:43:30+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "illuminate/collections", - "version": "v8.75.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "5a018387352afa2af30fd2be0a78c31e93295720" + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/5a018387352afa2af30fd2be0a78c31e93295720", - "reference": "5a018387352afa2af30fd2be0a78c31e93295720", + "url": "https://api.github.com/repos/illuminate/collections/zipball/705a4e1ef93cd492c45b9b3e7911cccc990a07f4", + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4", "shasum": "" }, "require": { @@ -958,12 +1154,12 @@ } }, "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, "files": [ "helpers.php" - ] + ], + "psr-4": { + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -981,20 +1177,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-12-07T14:48:29+00:00" + "time": "2022-06-23T15:29:49+00:00" }, { "name": "illuminate/contracts", - "version": "v8.75.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "b07755f7c456cf587dfbfd6f0854f9f7c1a34b2f" + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/b07755f7c456cf587dfbfd6f0854f9f7c1a34b2f", - "reference": "b07755f7c456cf587dfbfd6f0854f9f7c1a34b2f", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", "shasum": "" }, "require": { @@ -1029,11 +1225,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-12-07T08:18:44+00:00" + "time": "2022-01-13T14:47:47+00:00" }, { "name": "illuminate/macroable", - "version": "v8.75.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -1079,16 +1275,16 @@ }, { "name": "illuminate/support", - "version": "v8.75.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "f542bb78a8a1013ab33fbe14974c45b2a88993d0" + "reference": "1c79242468d3bbd9a0f7477df34f9647dde2a09b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/f542bb78a8a1013ab33fbe14974c45b2a88993d0", - "reference": "f542bb78a8a1013ab33fbe14974c45b2a88993d0", + "url": "https://api.github.com/repos/illuminate/support/zipball/1c79242468d3bbd9a0f7477df34f9647dde2a09b", + "reference": "1c79242468d3bbd9a0f7477df34f9647dde2a09b", "shasum": "" }, "require": { @@ -1100,7 +1296,7 @@ "illuminate/macroable": "^8.0", "nesbot/carbon": "^2.53.1", "php": "^7.3|^8.0", - "voku/portable-ascii": "^1.4.8" + "voku/portable-ascii": "^1.6.1" }, "conflict": { "tightenco/collect": "<5.5.33" @@ -1111,7 +1307,7 @@ "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", "symfony/process": "Required to use the composer class (^5.4).", "symfony/var-dumper": "Required to use the dd function (^5.4).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." }, "type": "library", "extra": { @@ -1120,12 +1316,12 @@ } }, "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, "files": [ "helpers.php" - ] + ], + "psr-4": { + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1143,31 +1339,31 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-12-03T15:33:45+00:00" + "time": "2022-09-21T21:30:03+00:00" }, { "name": "league/climate", - "version": "3.7.0", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/climate.git", - "reference": "5c717c3032c5118be7ad2395dbe0813d9894e8c7" + "reference": "a785a3ac8f584eed4abd45e4e16fe64c46659a28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/climate/zipball/5c717c3032c5118be7ad2395dbe0813d9894e8c7", - "reference": "5c717c3032c5118be7ad2395dbe0813d9894e8c7", + "url": "https://api.github.com/repos/thephpleague/climate/zipball/a785a3ac8f584eed4abd45e4e16fe64c46659a28", + "reference": "a785a3ac8f584eed4abd45e4e16fe64c46659a28", "shasum": "" }, "require": { "php": "^7.3 || ^8.0", - "psr/log": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", "seld/cli-prompt": "^1.0" }, "require-dev": { - "mikey179/vfsstream": "^1.4", + "mikey179/vfsstream": "^1.6.10", "mockery/mockery": "^1.4.2", - "phpunit/phpunit": "^9.5.0" + "phpunit/phpunit": "^9.5.10" }, "suggest": { "ext-mbstring": "If ext-mbstring is not available you MUST install symfony/polyfill-mbstring" @@ -1206,35 +1402,38 @@ ], "support": { "issues": "https://github.com/thephpleague/climate/issues", - "source": "https://github.com/thephpleague/climate/tree/3.7.0" + "source": "https://github.com/thephpleague/climate/tree/3.8.2" }, - "time": "2021-01-10T20:18:52+00:00" + "time": "2022-06-18T14:42:08+00:00" }, { "name": "maennchen/zipstream-php", - "version": "2.1.0", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", "shasum": "" }, "require": { "myclabs/php-enum": "^1.5", - "php": ">= 7.1", + "php": "^7.4 || ^8.0", "psr/http-message": "^1.0", "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { "ext-zip": "*", - "guzzlehttp/guzzle": ">= 6.3", + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": ">= 7.5" + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5.8 || ^9.4.2", + "vimeo/psalm": "^4.1" }, "type": "library", "autoload": { @@ -1271,38 +1470,42 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6" }, "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + }, { "url": "https://opencollective.com/zipstream", "type": "open_collective" } ], - "time": "2020-05-30T13:11:16+00:00" + "time": "2022-11-25T18:57:19+00:00" }, { "name": "markbaker/complex", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22" + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/ab8bc271e404909db09ff2d5ffa1e538085c0f22", - "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "squizlabs/php_codesniffer": "^3.4" + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" }, "type": "library", "autoload": { @@ -1328,36 +1531,36 @@ ], "support": { "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.1" + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" }, - "time": "2021-06-29T15:32:53+00:00" + "time": "2022-12-06T16:21:08+00:00" }, { "name": "markbaker/matrix", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576" + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/c66aefcafb4f6c269510e9ac46b82619a904c576", - "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", "phpdocumentor/phpdocumentor": "2.*", "phploc/phploc": "^4.0", "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" + "squizlabs/php_codesniffer": "^3.7" }, "type": "library", "autoload": { @@ -1384,31 +1587,32 @@ ], "support": { "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.0" + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" }, - "time": "2021-07-01T19:01:15+00:00" + "time": "2022-12-02T22:17:43+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.17.3", + "version": "v1.19.1", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "e8ac3499af0ea5b440908e06cc0abe5898008b3c" + "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/e8ac3499af0ea5b440908e06cc0abe5898008b3c", - "reference": "e8ac3499af0ea5b440908e06cc0abe5898008b3c", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/03dd40a1826f4d585ef93ef83afa2a9874a00523", + "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523", "shasum": "" }, "require": { "php": "^7.1|^8", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^2.6|^3|^4|^5" + "symfony/var-dumper": "^4|^5|^6" }, "require-dev": { - "phpunit/phpunit": "^7.5.20 || ^9.4.2" + "phpunit/phpunit": ">=7.5.20 <10.0", + "twig/twig": "^1.38|^2.7|^3.0" }, "suggest": { "kriswallsmith/assetic": "The best way to manage assets", @@ -1418,7 +1622,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" } }, "autoload": { @@ -1449,26 +1653,26 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.17.3" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.1" }, - "time": "2021-10-19T12:33:27+00:00" + "time": "2023-10-12T08:10:52+00:00" }, { "name": "milon/barcode", - "version": "8.0.1", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/milon/barcode.git", - "reference": "a1b1ee1a743c1368597f1742e6ee4765333a15a1" + "reference": "a35005eb88d08807058dec0c4cba150ec6b432b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/milon/barcode/zipball/a1b1ee1a743c1368597f1742e6ee4765333a15a1", - "reference": "a1b1ee1a743c1368597f1742e6ee4765333a15a1", + "url": "https://api.github.com/repos/milon/barcode/zipball/a35005eb88d08807058dec0c4cba150ec6b432b8", + "reference": "a35005eb88d08807058dec0c4cba150ec6b432b8", "shasum": "" }, "require": { - "illuminate/support": "^8.0", + "illuminate/support": "^7.0|^8.0|^9.0", "php": "^7.3 | ^8.0" }, "type": "library", @@ -1513,7 +1717,7 @@ ], "support": { "issues": "https://github.com/milon/barcode/issues", - "source": "https://github.com/milon/barcode/tree/8.0.1" + "source": "https://github.com/milon/barcode/tree/9.0.1" }, "funding": [ { @@ -1525,28 +1729,31 @@ "type": "github" } ], - "time": "2021-01-08T11:36:07+00:00" + "time": "2022-06-28T11:18:28+00:00" }, { "name": "mlocati/idna", - "version": "1.0.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/mlocati/idna.git", - "reference": "2c8eeff3e27cf137eb0ed82eefb64535c2367005" + "reference": "6ae05443a4204e3dfb497109d94f85be453f4af5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/idna/zipball/2c8eeff3e27cf137eb0ed82eefb64535c2367005", - "reference": "2c8eeff3e27cf137eb0ed82eefb64535c2367005", + "url": "https://api.github.com/repos/mlocati/idna/zipball/6ae05443a4204e3dfb497109d94f85be453f4af5", + "reference": "6ae05443a4204e3dfb497109d94f85be453f4af5", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.6 || ^10" }, + "bin": [ + "bin/create-idnamap" + ], "type": "library", "autoload": { "psr-4": { @@ -1603,20 +1810,30 @@ "issues": "https://github.com/mlocati/idna/issues", "source": "https://github.com/mlocati/idna" }, - "time": "2019-09-02T15:52:28+00:00" + "funding": [ + { + "url": "https://paypal.me/mlocati", + "type": "custom" + }, + { + "url": "https://github.com/mlocati", + "type": "github" + } + ], + "time": "2023-04-04T16:14:10+00:00" }, { "name": "mlocati/ip-lib", - "version": "1.17.1", + "version": "1.18.0", "source": { "type": "git", "url": "https://github.com/mlocati/ip-lib.git", - "reference": "28763c87f9a3e24ff4df9258ec4e8375d8fa6523" + "reference": "c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/ip-lib/zipball/28763c87f9a3e24ff4df9258ec4e8375d8fa6523", - "reference": "28763c87f9a3e24ff4df9258ec4e8375d8fa6523", + "url": "https://api.github.com/repos/mlocati/ip-lib/zipball/c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2", + "reference": "c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2", "shasum": "" }, "require": { @@ -1662,7 +1879,7 @@ ], "support": { "issues": "https://github.com/mlocati/ip-lib/issues", - "source": "https://github.com/mlocati/ip-lib/tree/1.17.1" + "source": "https://github.com/mlocati/ip-lib/tree/1.18.0" }, "funding": [ { @@ -1674,20 +1891,20 @@ "type": "other" } ], - "time": "2021-11-10T15:24:32+00:00" + "time": "2022-01-13T18:05:33+00:00" }, { "name": "mlocati/spf-lib", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/mlocati/spf-lib.git", - "reference": "ec49c332fcf684716e00f234013af5e01f001993" + "reference": "8a4e52bf1c9d60ba9773a590ddc416f145c4fc57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/spf-lib/zipball/ec49c332fcf684716e00f234013af5e01f001993", - "reference": "ec49c332fcf684716e00f234013af5e01f001993", + "url": "https://api.github.com/repos/mlocati/spf-lib/zipball/8a4e52bf1c9d60ba9773a590ddc416f145c4fc57", + "reference": "8a4e52bf1c9d60ba9773a590ddc416f145c4fc57", "shasum": "" }, "require": { @@ -1743,36 +1960,141 @@ "type": "other" } ], - "time": "2021-02-07T15:13:08+00:00" + "time": "2022-09-09T09:05:31+00:00" }, { - "name": "myclabs/php-enum", - "version": "1.8.3", + "name": "monolog/monolog", + "version": "2.9.2", "source": { "type": "git", - "url": "https://github.com/myclabs/php-enum.git", - "reference": "b942d263c641ddb5190929ff840c68f78713e937" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", - "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.3 || ^8.0" + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "require-dev": { - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^4.6.2" + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "MyCLabs\\Enum\\": "src/" + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" } + ], + "time": "2023-10-27T15:25:26+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1791,7 +2113,7 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" }, "funding": [ { @@ -1803,38 +2125,44 @@ "type": "tidelift" } ], - "time": "2021-07-05T08:18:36+00:00" + "time": "2022-08-04T09:53:51+00:00" }, { "name": "nesbot/carbon", - "version": "2.55.2", + "version": "2.71.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2" + "reference": "98276233188583f2ff845a0f992a235472d9466a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8c2a18ce3e67c34efc1b29f64fe61304368259a2", - "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, "bin": [ @@ -1891,33 +2219,37 @@ }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2021-12-03T14:59:52+00:00" + "time": "2023-09-25T11:31:05+00:00" }, { "name": "nette/php-generator", - "version": "v3.6.5", + "version": "v3.6.9", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "9370403f9d9c25b51c4596ded1fbfe70347f7c82" + "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/9370403f9d9c25b51c4596ded1fbfe70347f7c82", - "reference": "9370403f9d9c25b51c4596ded1fbfe70347f7c82", + "url": "https://api.github.com/repos/nette/php-generator/zipball/d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6", + "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6", "shasum": "" }, "require": { "nette/utils": "^3.1.2", - "php": ">=7.2 <8.2" + "php": ">=7.2 <8.3" }, "require-dev": { "nette/tester": "^2.4", @@ -1965,31 +2297,32 @@ ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v3.6.5" + "source": "https://github.com/nette/php-generator/tree/v3.6.9" }, - "time": "2021-11-24T16:23:44+00:00" + "time": "2022-10-04T11:49:47+00:00" }, { "name": "nette/utils", - "version": "v3.2.6", + "version": "v3.2.10", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "2f261e55bd6a12057442045bf2c249806abc1d02" + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/2f261e55bd6a12057442045bf2c249806abc1d02", - "reference": "2f261e55bd6a12057442045bf2c249806abc1d02", + "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", "shasum": "" }, "require": { - "php": ">=7.2 <8.2" + "php": ">=7.2 <8.4" }, "conflict": { "nette/di": "<3.0.6" }, "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", "nette/tester": "~2.0", "phpstan/phpstan": "^1.0", "tracy/tracy": "^2.3" @@ -2050,9 +2383,116 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.6" + "source": "https://github.com/nette/utils/tree/v3.2.10" + }, + "time": "2023-07-30T15:38:18+00:00" + }, + { + "name": "notihnio/php-multipart-form-data-parser", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/notihnio/php-multipart-form-data-parser.git", + "reference": "78be265f45804401e14dd4cd76479957fbda2058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/notihnio/php-multipart-form-data-parser/zipball/78be265f45804401e14dd4cd76479957fbda2058", + "reference": "78be265f45804401e14dd4cd76479957fbda2058", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Notihnio\\MultipartFormDataParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Notis Mastrandrikos", + "email": "pmastrandrikos@gmail.com" + } + ], + "description": "The missing php functionality to support put, patch, delete, etc multipart requests handling", + "support": { + "issues": "https://github.com/notihnio/php-multipart-form-data-parser/issues", + "source": "https://github.com/notihnio/php-multipart-form-data-parser/tree/1.0.0" + }, + "time": "2019-03-10T13:10:12+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2021-11-24T15:47:23+00:00" + "time": "2022-06-14T06:56:20+00:00" }, { "name": "parsecsv/php-parsecsv", @@ -2120,20 +2560,23 @@ }, { "name": "phenx/php-font-lib", - "version": "0.5.2", + "version": "0.5.4", "source": { "type": "git", - "url": "https://github.com/PhenX/php-font-lib.git", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/dd448ad1ce34c63d09baccd05415e361300c35b4", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4", "shasum": "" }, + "require": { + "ext-mbstring": "*" + }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" + "symfony/phpunit-bridge": "^3 || ^4 || ^5" }, "type": "library", "autoload": { @@ -2154,10 +2597,10 @@ "description": "A library to read, parse, export and make subsets of different types of font files.", "homepage": "https://github.com/PhenX/php-font-lib", "support": { - "issues": "https://github.com/PhenX/php-font-lib/issues", - "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2" + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.4" }, - "time": "2020-03-08T15:31:32+00:00" + "time": "2021-12-17T19:44:54+00:00" }, { "name": "phpmailer/dkimvalidator", @@ -2212,16 +2655,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.5.3", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "baeb7cde6b60b1286912690ab0693c7789a31e71" + "reference": "e88da8d679acc3824ff231fdc553565b802ac016" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/baeb7cde6b60b1286912690ab0693c7789a31e71", - "reference": "baeb7cde6b60b1286912690ab0693c7789a31e71", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e88da8d679acc3824ff231fdc553565b802ac016", + "reference": "e88da8d679acc3824ff231fdc553565b802ac016", "shasum": "" }, "require": { @@ -2231,22 +2674,24 @@ "php": ">=5.5.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.6.0", - "yoast/phpunit-polyfills": "^1.0.0" + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" }, "type": "library", "autoload": { @@ -2278,7 +2723,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.3" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.1" }, "funding": [ { @@ -2286,20 +2731,20 @@ "type": "github" } ], - "time": "2021-11-25T16:34:11+00:00" + "time": "2023-08-29T08:26:30+00:00" }, { "name": "phpoffice/phpspreadsheet", - "version": "1.20.0", + "version": "1.29.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "44436f270bb134b4a94670f3d020a85dfa0a3c02" + "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/44436f270bb134b4a94670f3d020a85dfa0a3c02", - "reference": "44436f270bb134b4a94670f3d020a85dfa0a3c02", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fde2ccf55eaef7e86021ff1acce26479160a0fa0", + "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0", "shasum": "" }, "require": { @@ -2316,33 +2761,34 @@ "ext-xmlwriter": "*", "ext-zip": "*", "ext-zlib": "*", - "ezyang/htmlpurifier": "^4.13", - "maennchen/zipstream-php": "^2.1", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", "markbaker/complex": "^3.0", "markbaker/matrix": "^3.0", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0" + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "dompdf/dompdf": "^1.0", + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0", "friendsofphp/php-cs-fixer": "^3.2", - "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", "phpcompatibility/php-compatibility": "^9.3", "phpstan/phpstan": "^1.1", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.6", - "tecnickcom/tcpdf": "^6.4" + "phpunit/phpunit": "^8.5 || ^9.0 || ^10.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" }, "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" }, "type": "library", "autoload": { @@ -2388,9 +2834,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.20.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.0" }, - "time": "2021-11-23T15:23:42+00:00" + "time": "2023-06-14T22:48:31+00:00" }, { "name": "pimple/pimple", @@ -2445,22 +2891,122 @@ }, "time": "2021-10-28T11:13:42+00:00" }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + }, + "time": "2022-06-13T21:57:56+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -2489,27 +3035,27 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2529,7 +3075,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -2541,27 +3087,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2581,7 +3127,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -2596,31 +3142,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -2649,9 +3195,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/log", @@ -2800,29 +3346,33 @@ }, { "name": "sabberworm/php-css-parser", - "version": "8.3.1", + "version": "8.4.0", "source": { "type": "git", "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", "shasum": "" }, "require": { - "php": ">=5.3.2" + "ext-iconv": "*", + "php": ">=5.6.20" }, "require-dev": { "codacy/coverage": "^1.4", - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^4.8.36" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" }, "type": "library", "autoload": { - "psr-0": { - "Sabberworm\\CSS": "lib/" + "psr-4": { + "Sabberworm\\CSS\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2835,7 +3385,7 @@ } ], "description": "Parser for CSS Files written in PHP", - "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", "keywords": [ "css", "parser", @@ -2843,22 +3393,22 @@ ], "support": { "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", - "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1" + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" }, - "time": "2020-06-01T09:10:00+00:00" + "time": "2021-12-11T13:40:54+00:00" }, { "name": "sabre/dav", - "version": "4.2.3", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/sabre-io/dav.git", - "reference": "6703fb74952cd4e2d8135a71b4f78ce2eecc37bc" + "reference": "b65362abc926520eda2c57e219f022a6c288069d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/dav/zipball/6703fb74952cd4e2d8135a71b4f78ce2eecc37bc", - "reference": "6703fb74952cd4e2d8135a71b4f78ce2eecc37bc", + "url": "https://api.github.com/repos/sabre-io/dav/zipball/b65362abc926520eda2c57e219f022a6c288069d", + "reference": "b65362abc926520eda2c57e219f022a6c288069d", "shasum": "" }, "require": { @@ -2900,8 +3450,8 @@ "autoload": { "psr-4": { "Sabre\\DAV\\": "lib/DAV/", - "Sabre\\DAVACL\\": "lib/DAVACL/", "Sabre\\CalDAV\\": "lib/CalDAV/", + "Sabre\\DAVACL\\": "lib/DAVACL/", "Sabre\\CardDAV\\": "lib/CardDAV/" } }, @@ -2931,7 +3481,7 @@ "issues": "https://github.com/sabre-io/dav/issues", "source": "https://github.com/fruux/sabre-dav" }, - "time": "2021-12-09T10:08:58+00:00" + "time": "2022-06-27T09:07:55+00:00" }, { "name": "sabre/event", @@ -2957,14 +3507,14 @@ }, "type": "library", "autoload": { - "psr-4": { - "Sabre\\Event\\": "lib/" - }, "files": [ "lib/coroutine.php", "lib/Loop/functions.php", "lib/Promise/functions.php" - ] + ], + "psr-4": { + "Sabre\\Event\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3001,16 +3551,16 @@ }, { "name": "sabre/http", - "version": "5.1.3", + "version": "5.1.10", "source": { "type": "git", "url": "https://github.com/sabre-io/http.git", - "reference": "315f592adfcba8aeb73c2fd64285205747acbbd7" + "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/http/zipball/315f592adfcba8aeb73c2fd64285205747acbbd7", - "reference": "315f592adfcba8aeb73c2fd64285205747acbbd7", + "url": "https://api.github.com/repos/sabre-io/http/zipball/f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", + "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", "shasum": "" }, "require": { @@ -3060,29 +3610,32 @@ "issues": "https://github.com/sabre-io/http/issues", "source": "https://github.com/fruux/sabre-http" }, - "time": "2021-11-04T07:02:36+00:00" + "time": "2023-08-18T01:55:28+00:00" }, { "name": "sabre/uri", - "version": "2.2.2", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/sabre-io/uri.git", - "reference": "7cb0f489578afad5006e85cd60f18ff33f2d440d" + "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/uri/zipball/7cb0f489578afad5006e85cd60f18ff33f2d440d", - "reference": "7cb0f489578afad5006e85cd60f18ff33f2d440d", + "url": "https://api.github.com/repos/sabre-io/uri/zipball/7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", + "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "friendsofphp/php-cs-fixer": "^3.17", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "^9.6" }, "type": "library", "autoload": { @@ -3117,26 +3670,26 @@ "issues": "https://github.com/sabre-io/uri/issues", "source": "https://github.com/fruux/sabre-uri" }, - "time": "2021-11-04T09:29:58+00:00" + "time": "2023-06-09T06:54:04+00:00" }, { "name": "sabre/vobject", - "version": "4.4.1", + "version": "4.5.3", "source": { "type": "git", "url": "https://github.com/sabre-io/vobject.git", - "reference": "06feff370141fd3118609f808e86d9315864bf14" + "reference": "fe6d9183154ed6f2f913f2b568d3d51d8ae9b308" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/06feff370141fd3118609f808e86d9315864bf14", - "reference": "06feff370141fd3118609f808e86d9315864bf14", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/fe6d9183154ed6f2f913f2b568d3d51d8ae9b308", + "reference": "fe6d9183154ed6f2f913f2b568d3d51d8ae9b308", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^7.1 || ^8.0", - "sabre/xml": "^2.1" + "sabre/xml": "^2.1 || ^3.0 || ^4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.17.1", @@ -3221,20 +3774,20 @@ "issues": "https://github.com/sabre-io/vobject/issues", "source": "https://github.com/fruux/sabre-vobject" }, - "time": "2021-12-07T09:45:33+00:00" + "time": "2023-01-22T12:21:50+00:00" }, { "name": "sabre/xml", - "version": "2.2.5", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/sabre-io/xml.git", - "reference": "a6af111850e7536d200d9637c34885cd3c77a86c" + "reference": "9cde7cdab1e50893cc83b037b40cd47bfde42a2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/xml/zipball/a6af111850e7536d200d9637c34885cd3c77a86c", - "reference": "a6af111850e7536d200d9637c34885cd3c77a86c", + "url": "https://api.github.com/repos/sabre-io/xml/zipball/9cde7cdab1e50893cc83b037b40cd47bfde42a2b", + "reference": "9cde7cdab1e50893cc83b037b40cd47bfde42a2b", "shasum": "" }, "require": { @@ -3252,13 +3805,13 @@ }, "type": "library", "autoload": { - "psr-4": { - "Sabre\\Xml\\": "lib/" - }, "files": [ "lib/Deserializer/functions.php", "lib/Serializer/functions.php" - ] + ], + "psr-4": { + "Sabre\\Xml\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3290,7 +3843,7 @@ "issues": "https://github.com/sabre-io/xml/issues", "source": "https://github.com/fruux/sabre-xml" }, - "time": "2021-11-04T06:37:27+00:00" + "time": "2023-06-28T12:56:05+00:00" }, { "name": "seld/cli-prompt", @@ -3347,22 +3900,216 @@ }, "time": "2020-12-15T21:32:01+00:00" }, + { + "name": "setasign/fpdf", + "version": "1.8.6", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDF.git", + "reference": "0838e0ee4925716fcbbc50ad9e1799b5edfae0a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDF/zipball/0838e0ee4925716fcbbc50ad9e1799b5edfae0a0", + "reference": "0838e0ee4925716fcbbc50ad9e1799b5edfae0a0", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-zlib": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "fpdf.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Olivier Plathey", + "email": "oliver@fpdf.org", + "homepage": "http://fpdf.org/" + } + ], + "description": "FPDF is a PHP class which allows to generate PDF files with pure PHP. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.", + "homepage": "http://www.fpdf.org", + "keywords": [ + "fpdf", + "pdf" + ], + "support": { + "source": "https://github.com/Setasign/FPDF/tree/1.8.6" + }, + "time": "2023-06-26T14:44:25+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4", + "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "~5.7", + "setasign/fpdf": "~1.8", + "setasign/tfpdf": "~1.31", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "~6.2" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2023-09-28T10:46:27+00:00" + }, + { + "name": "simplepie/simplepie", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/simplepie/simplepie.git", + "reference": "65b095d87bc00898d8fa7737bdbcda93a3fbcc55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplepie/simplepie/zipball/65b095d87bc00898d8fa7737bdbcda93a3fbcc55", + "reference": "65b095d87bc00898d8fa7737bdbcda93a3fbcc55", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19 || ^3.8", + "psr/simple-cache": "^1 || ^2 || ^3", + "yoast/phpunit-polyfills": "^1.0.1" + }, + "suggest": { + "ext-curl": "", + "ext-iconv": "", + "ext-intl": "", + "ext-mbstring": "", + "mf2/mf2": "Microformat module that allows for parsing HTML for microformats" + }, + "type": "library", + "autoload": { + "psr-0": { + "SimplePie": "library" + }, + "psr-4": { + "SimplePie\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Ryan Parman", + "homepage": "http://ryanparman.com/", + "role": "Creator, alumnus developer" + }, + { + "name": "Sam Sneddon", + "homepage": "https://gsnedders.com/", + "role": "Alumnus developer" + }, + { + "name": "Ryan McCue", + "email": "me@ryanmccue.info", + "homepage": "http://ryanmccue.info/", + "role": "Developer" + } + ], + "description": "A simple Atom/RSS parsing library for PHP", + "homepage": "http://simplepie.org/", + "keywords": [ + "atom", + "feeds", + "rss" + ], + "support": { + "issues": "https://github.com/simplepie/simplepie/issues", + "source": "https://github.com/simplepie/simplepie/tree/1.8.0" + }, + "time": "2023-01-20T08:37:35+00:00" + }, { "name": "simshaun/recurr", - "version": "v5.0.0", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/simshaun/recurr.git", - "reference": "b5aa5b07a595023b67a558b810390dfa7160e3f5" + "reference": "1aff62e6e0ee875b3f2487352542605123ee9172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simshaun/recurr/zipball/b5aa5b07a595023b67a558b810390dfa7160e3f5", - "reference": "b5aa5b07a595023b67a558b810390dfa7160e3f5", + "url": "https://api.github.com/repos/simshaun/recurr/zipball/1aff62e6e0ee875b3f2487352542605123ee9172", + "reference": "1aff62e6e0ee875b3f2487352542605123ee9172", "shasum": "" }, "require": { - "doctrine/collections": "~1.6", + "doctrine/collections": "~1.6||^2.0", "php": "^7.2||^8.0" }, "require-dev": { @@ -3402,22 +4149,22 @@ ], "support": { "issues": "https://github.com/simshaun/recurr/issues", - "source": "https://github.com/simshaun/recurr/tree/v5.0.0" + "source": "https://github.com/simshaun/recurr/tree/v5.0.2" }, - "time": "2021-09-09T03:42:57+00:00" + "time": "2023-09-26T20:31:33+00:00" }, { "name": "smarty/smarty", - "version": "v4.0.0", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "baebd59bb4da9fca89da382811b38c8313949c49" + "reference": "3931d8f54b8f7a4ffab538582d34d4397ba8daa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/baebd59bb4da9fca89da382811b38c8313949c49", - "reference": "baebd59bb4da9fca89da382811b38c8313949c49", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/3931d8f54b8f7a4ffab538582d34d4397ba8daa5", + "reference": "3931d8f54b8f7a4ffab538582d34d4397ba8daa5", "shasum": "" }, "require": { @@ -3461,48 +4208,48 @@ } ], "description": "Smarty - the compiling PHP template engine", - "homepage": "https://www.smarty.net", + "homepage": "https://smarty-php.github.io/smarty/", "keywords": [ "templating" ], "support": { - "forum": "https://www.smarty.net/forums/", + "forum": "https://github.com/smarty-php/smarty/discussions", "issues": "https://github.com/smarty-php/smarty/issues", - "source": "https://github.com/smarty-php/smarty/tree/v4.0.0" + "source": "https://github.com/smarty-php/smarty/tree/v4.3.4" }, - "time": "2021-11-25T21:18:25+00:00" + "time": "2023-09-14T10:59:08+00:00" }, { - "name": "sonata-project/google-authenticator", - "version": "2.3.1", + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", "source": { "type": "git", - "url": "https://github.com/sonata-project/GoogleAuthenticator.git", - "reference": "71a4189228f93a9662574dc8c65e77ef55061b59" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sonata-project/GoogleAuthenticator/zipball/71a4189228f93a9662574dc8c65e77ef55061b59", - "reference": "71a4189228f93a9662574dc8c65e77ef55061b59", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5.1.8" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "psr-4": { - "Google\\Authenticator\\": "src/", - "Sonata\\GoogleAuthenticator\\": "src/" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3510,78 +4257,62 @@ ], "authors": [ { - "name": "Thomas Rabaix", - "email": "thomas.rabaix@gmail.com" - }, - { - "name": "Christian Stocker", - "email": "me@chregu.tv" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Andre DeMarre", - "homepage": "http://www.devnetwork.net/viewtopic.php?f=50&t=94989" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library to integrate Google Authenticator into a PHP project", - "homepage": "https://github.com/sonata-project/GoogleAuthenticator", - "keywords": [ - "google authenticator" - ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sonata-project/GoogleAuthenticator/issues", - "source": "https://github.com/sonata-project/GoogleAuthenticator/tree/2.3.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { - "url": "https://github.com/OskarStark", - "type": "github" - }, - { - "url": "https://github.com/VincentLanglet", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://github.com/core23", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://github.com/wbloszyk", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "abandoned": true, - "time": "2021-02-15T19:23:18+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v2.5.0", + "name": "symfony/filesystem", + "version": "v5.4.25", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + "url": "https://github.com/symfony/filesystem.git", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { - "files": [ - "function.php" + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3590,18 +4321,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" }, "funding": [ { @@ -3617,32 +4348,35 @@ "type": "tidelift" } ], - "time": "2021-07-12T14:48:14+00:00" + "time": "2023-05-31T13:04:02+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3650,12 +4384,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3680,7 +4414,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -3696,32 +4430,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.23.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6de50471469b8c9afc38164452ab2b6170ee71c1", + "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-iconv": "*" + }, "suggest": { "ext-iconv": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3729,12 +4466,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3760,7 +4497,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.28.0" }, "funding": [ { @@ -3776,32 +4513,35 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3809,12 +4549,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3840,7 +4580,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -3856,20 +4596,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -3878,7 +4618,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3886,12 +4626,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -3923,7 +4663,69 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.28", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.28" }, "funding": [ { @@ -3939,20 +4741,20 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2023-08-07T10:36:04+00:00" }, { "name": "symfony/translation", - "version": "v5.4.0", + "version": "v5.4.30", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "6fe32b10e912a518805bc9eafc2a87145773cf13" + "reference": "8560dc532e4e48d331937532a7cbfd2a9f9f53ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/6fe32b10e912a518805bc9eafc2a87145773cf13", - "reference": "6fe32b10e912a518805bc9eafc2a87145773cf13", + "url": "https://api.github.com/repos/symfony/translation/zipball/8560dc532e4e48d331937532a7cbfd2a9f9f53ce", + "reference": "8560dc532e4e48d331937532a7cbfd2a9f9f53ce", "shasum": "" }, "require": { @@ -4020,7 +4822,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.0" + "source": "https://github.com/symfony/translation/tree/v5.4.30" }, "funding": [ { @@ -4036,20 +4838,20 @@ "type": "tidelift" } ], - "time": "2021-11-29T15:30:56+00:00" + "time": "2023-10-28T09:19:54+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -4098,7 +4900,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -4114,20 +4916,20 @@ "type": "tidelift" } ], - "time": "2021-08-17T14:20:01+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.0", + "version": "v5.4.29", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "89ab66eaef230c9cd1992de2e9a1b26652b127b9" + "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89ab66eaef230c9cd1992de2e9a1b26652b127b9", - "reference": "89ab66eaef230c9cd1992de2e9a1b26652b127b9", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6172e4ae3534d25ee9e07eb487c20be7760fcc65", + "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65", "shasum": "" }, "require": { @@ -4136,12 +4938,12 @@ "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" @@ -4187,7 +4989,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.29" }, "funding": [ { @@ -4203,20 +5005,20 @@ "type": "tidelift" } ], - "time": "2021-11-29T15:30:56+00:00" + "time": "2023-09-12T10:09:58+00:00" }, { "name": "twig/twig", - "version": "v3.3.4", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "65cb6f0b956485e1664f13d023c55298a4bb59ca" + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/65cb6f0b956485e1664f13d023c55298a4bb59ca", - "reference": "65cb6f0b956485e1664f13d023c55298a4bb59ca", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", "shasum": "" }, "require": { @@ -4225,15 +5027,10 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, "autoload": { "psr-4": { "Twig\\": "src/" @@ -4267,7 +5064,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.3.4" + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" }, "funding": [ { @@ -4279,20 +5076,20 @@ "type": "tidelift" } ], - "time": "2021-11-25T13:46:55+00:00" + "time": "2023-08-28T11:09:02+00:00" }, { "name": "voku/portable-ascii", - "version": "1.5.6", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "80953678b19901e5165c56752d087fc11526017c" + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", - "reference": "80953678b19901e5165c56752d087fc11526017c", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", "shasum": "" }, "require": { @@ -4329,7 +5126,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + "source": "https://github.com/voku/portable-ascii/tree/1.6.1" }, "funding": [ { @@ -4353,20 +5150,20 @@ "type": "tidelift" } ], - "time": "2020-11-12T00:07:28+00:00" + "time": "2022-01-24T18:55:24+00:00" }, { "name": "yetiforce/csrf-magic", - "version": "v1.1.2", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/YetiForceCompany/csrf-magic.git", - "reference": "f0da3a6f986def4e06b4a1d27b13005a59d172dd" + "reference": "aecd6d438962d8f6dbef8749ca8821caea01d7af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YetiForceCompany/csrf-magic/zipball/f0da3a6f986def4e06b4a1d27b13005a59d172dd", - "reference": "f0da3a6f986def4e06b4a1d27b13005a59d172dd", + "url": "https://api.github.com/repos/YetiForceCompany/csrf-magic/zipball/aecd6d438962d8f6dbef8749ca8821caea01d7af", + "reference": "aecd6d438962d8f6dbef8749ca8821caea01d7af", "shasum": "" }, "require": { @@ -4402,26 +5199,26 @@ "security" ], "support": { - "source": "https://github.com/YetiForceCompany/csrf-magic/tree/v1.1.2" + "source": "https://github.com/YetiForceCompany/csrf-magic/tree/v1.1.3" }, - "time": "2021-02-05T12:04:07+00:00" + "time": "2023-06-23T05:14:55+00:00" }, { "name": "yetiforce/yetiforcepdf", - "version": "0.1.33", + "version": "0.1.40", "source": { "type": "git", "url": "https://github.com/YetiForceCompany/YetiForcePDF.git", - "reference": "ba6173d036ee1c1c53746400112d6e579d9ca24f" + "reference": "0f5f451b85855cb57e9ee8f8fff4a0bce5cc3672" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YetiForceCompany/YetiForcePDF/zipball/ba6173d036ee1c1c53746400112d6e579d9ca24f", - "reference": "ba6173d036ee1c1c53746400112d6e579d9ca24f", + "url": "https://api.github.com/repos/YetiForceCompany/YetiForcePDF/zipball/0f5f451b85855cb57e9ee8f8fff4a0bce5cc3672", + "reference": "0f5f451b85855cb57e9ee8f8fff4a0bce5cc3672", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.1", + "composer/ca-bundle": "^1", "ext-bcmath": "*", "ext-dom": "*", "ext-filter": "*", @@ -4429,11 +5226,11 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-zlib": "*", - "guzzlehttp/guzzle": "^7.0", - "milon/barcode": "^8.0.0", - "phenx/php-font-lib": "^0.5.1", - "php": ">=7.3", - "sabberworm/php-css-parser": "^8.3" + "guzzlehttp/guzzle": "^7", + "milon/barcode": "^9", + "phenx/php-font-lib": "^0.5", + "php": ">=7.4", + "sabberworm/php-css-parser": "^8" }, "type": "library", "autoload": { @@ -4461,7 +5258,7 @@ ], "support": { "issues": "https://github.com/YetiForceCompany/YetiForcePDF/issues", - "source": "https://github.com/YetiForceCompany/YetiForcePDF/tree/0.1.33" + "source": "https://github.com/YetiForceCompany/YetiForcePDF/tree/0.1.40" }, "funding": [ { @@ -4469,20 +5266,20 @@ "type": "open_collective" } ], - "time": "2021-10-28T12:41:50+00:00" + "time": "2022-08-16T06:22:44+00:00" }, { "name": "yetiforce/yii2", - "version": "2.0.43", + "version": "2.0.45", "source": { "type": "git", "url": "https://github.com/YetiForceCompany/yii2-framework.git", - "reference": "672f0123882f71bf3cc3515c2cca2db6e91db21c" + "reference": "a9d87cfcb2a8d801c4e2d1e3f0eab0db934124ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YetiForceCompany/yii2-framework/zipball/672f0123882f71bf3cc3515c2cca2db6e91db21c", - "reference": "672f0123882f71bf3cc3515c2cca2db6e91db21c", + "url": "https://api.github.com/repos/YetiForceCompany/yii2-framework/zipball/a9d87cfcb2a8d801c4e2d1e3f0eab0db934124ba", + "reference": "a9d87cfcb2a8d801c4e2d1e3f0eab0db934124ba", "shasum": "" }, "require": { @@ -4505,13 +5302,13 @@ { "name": "Qiang Xue", "email": "qiang.xue@gmail.com", - "homepage": "http://www.yiiframework.com/", + "homepage": "https://www.yiiframework.com/", "role": "Founder and project lead" }, { "name": "Alexander Makarov", "email": "sam@rmcreative.ru", - "homepage": "http://rmcreative.ru/", + "homepage": "https://rmcreative.ru/", "role": "Core framework development" }, { @@ -4522,7 +5319,7 @@ { "name": "Carsten Brandt", "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", + "homepage": "https://www.cebe.cc/", "role": "Core framework development" }, { @@ -4561,34 +5358,36 @@ "yii2" ], "support": { - "source": "https://github.com/YetiForceCompany/yii2-framework/tree/2.0.43" + "source": "https://github.com/YetiForceCompany/yii2-framework/tree/2.0.45" }, - "time": "2021-10-29T10:44:56+00:00" + "time": "2022-03-29T11:16:44+00:00" }, { "name": "zbateson/mail-mime-parser", - "version": "2.1.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "0ef2d7de2577ea0a339d34720451c8ba8cd9dbb4" + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/0ef2d7de2577ea0a339d34720451c8ba8cd9dbb4", - "reference": "0ef2d7de2577ea0a339d34720451c8ba8cd9dbb4", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/20b3e48eb799537683780bc8782fbbe9bc25934a", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a", "shasum": "" }, "require": { "guzzlehttp/psr7": "^1.7.0|^2.0", - "php": ">=5.4", + "php": ">=7.1", "pimple/pimple": "^3.0", "zbateson/mb-wrapper": "^1.0.1", "zbateson/stream-decorators": "^1.0.6" }, "require-dev": { + "friendsofphp/php-cs-fixer": "*", "mikey179/vfsstream": "^1.6.0", - "sanmai/phpunit-legacy-adapter": "^6.3 || ^8.2" + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10" }, "suggest": { "ext-iconv": "For best support/performance", @@ -4636,29 +5435,31 @@ "type": "github" } ], - "time": "2021-11-09T18:24:41+00:00" + "time": "2023-02-14T22:58:03+00:00" }, { "name": "zbateson/mb-wrapper", - "version": "1.1.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/zbateson/mb-wrapper.git", - "reference": "bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498" + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498", - "reference": "bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334", "shasum": "" }, "require": { - "php": ">=5.4", + "php": ">=7.1", "symfony/polyfill-iconv": "^1.9", "symfony/polyfill-mbstring": "^1.9" }, "require-dev": { - "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<=9.0" }, "suggest": { "ext-iconv": "For best support/performance", @@ -4695,7 +5496,7 @@ ], "support": { "issues": "https://github.com/zbateson/mb-wrapper/issues", - "source": "https://github.com/zbateson/mb-wrapper/tree/1.1.1" + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.0" }, "funding": [ { @@ -4703,29 +5504,31 @@ "type": "github" } ], - "time": "2021-11-22T21:59:45+00:00" + "time": "2023-01-11T23:05:44+00:00" }, { "name": "zbateson/stream-decorators", - "version": "1.0.6", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/zbateson/stream-decorators.git", - "reference": "3403c4323bd1cd15fe54348b031b26b064c706af" + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/3403c4323bd1cd15fe54348b031b26b064c706af", - "reference": "3403c4323bd1cd15fe54348b031b26b064c706af", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9", "shasum": "" }, "require": { - "guzzlehttp/psr7": "^1.7.0|^2.0", - "php": ">=5.4", + "guzzlehttp/psr7": "^1.9 | ^2.0", + "php": ">=7.2", "zbateson/mb-wrapper": "^1.0.0" }, "require-dev": { - "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" }, "type": "library", "autoload": { @@ -4756,7 +5559,7 @@ ], "support": { "issues": "https://github.com/zbateson/stream-decorators/issues", - "source": "https://github.com/zbateson/stream-decorators/tree/1.0.6" + "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1" }, "funding": [ { @@ -4764,7 +5567,7 @@ "type": "github" } ], - "time": "2021-07-08T19:01:59+00:00" + "time": "2023-05-30T22:51:52+00:00" } ], "packages-dev": [], @@ -4774,7 +5577,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.3", + "php": ">=7.4", "ext-imap": "*", "ext-pdo": "*", "ext-pdo_mysql": "*", @@ -4801,5 +5604,5 @@ "ext-hash": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.3.0" } diff --git a/composer_dev.json b/composer_dev.json index 5011516b109f..9c27be9eff55 100644 --- a/composer_dev.json +++ b/composer_dev.json @@ -12,6 +12,7 @@ "Customer Relation Management", "System CRM" ], + "type": "project", "homepage": "https://yetiforce.com/", "support": { "issues": "https://github.com/YetiForceCompany/YetiForceCRM/issues", @@ -32,7 +33,7 @@ } ], "require": { - "php": ">=7.3", + "php": ">=7.4", "ext-imap": "*", "ext-pdo": "*", "ext-pdo_mysql": "*", @@ -59,23 +60,23 @@ "ext-hash": "*", "composer/ca-bundle": "^1.1", "sabre/dav": "^4.1", - "smarty/smarty": "^v3.1.39", + "smarty/smarty": "^v4", "phpmailer/phpmailer": "^v6.1", "ezyang/htmlpurifier": "^v4.11.0", "simshaun/recurr": "^v5.0", "giggsey/libphonenumber-for-php": "^8.8.11", - "dg/rss-php": "^1.2", + "simplepie/simplepie": "^1", "phpoffice/phpspreadsheet": "^1.3.1", - "sonata-project/google-authenticator": "^2.3.0", - "milon/barcode": "^8.0.0", - "ckeditor/ckeditor": "^4.9.2", + "pragmarx/google2fa": "^v8", + "milon/barcode": "^9.0.0", + "ckeditor/ckeditor": "4.22.1", "parsecsv/php-parsecsv": "^1.1.0", "guzzlehttp/guzzle": "^7.0", "nette/php-generator": "^3.2.1", "yetiforce/csrf-magic": "^v1.1.1", "maximebf/debugbar": "1.*", "yetiforce/yii2": "^2.0.43", - "yetiforce/yetiforcepdf": "0.1.33", + "yetiforce/yetiforcepdf": "0.1.40", "adhocore/jwt": "^1.0", "zbateson/mail-mime-parser": "^2.0", "mlocati/spf-lib": "^3", @@ -83,13 +84,18 @@ "league/climate": "^3.6", "twig/twig": "^3.0", "illuminate/support": "^8.0", - "globalcitizen/php-iban": "^4.0.0" + "globalcitizen/php-iban": "^4.0.0", + "chrome-php/chrome": "^v1.4.0", + "setasign/fpdf": "1.8.*", + "setasign/fpdi": "^v2.3.6", + "notihnio/php-multipart-form-data-parser": "*", + "symfony/filesystem": "^v5.4.3" }, "require-dev": { - "zircote/swagger-php": "^3.0", + "zircote/swagger-php": "^4.0", "php-webdriver/webdriver": "^1.8", - "phpunit/phpunit": "^9.5.4", - "phpunit/php-code-coverage": "^9.2.6", + "phpunit/phpunit": "^9.5", + "phpunit/php-code-coverage": "^9.2", "seld/jsonlint": "*", "php-console/php-console": "^3.1", "fr3d/swagger-assertions": "*" @@ -102,7 +108,9 @@ "ext-opcache": "Improve system performance" }, "archive": { - "exclude": ["tests"] + "exclude": [ + "tests" + ] }, "config": { "autoloader-suffix": "YT", @@ -110,7 +118,9 @@ "classmap-authoritative": false }, "autoload": { - "files": ["app/Loader.php"], + "files": [ + "app/Loader.php" + ], "psr-4": { "vtlib\\": "vtlib/Vtiger/", "includes\\": "include/", diff --git a/composer_dev.lock b/composer_dev.lock index c6fc8e1e20d8..dd03aff4dc2a 100644 --- a/composer_dev.lock +++ b/composer_dev.lock @@ -4,38 +4,32 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "79fd22d4e1d9b41fd9489e1836862b86", + "content-hash": "a8a079e7cfdf1ad9347e18fe99ca32d1", "packages": [ { - "name": "abraham/twitteroauth", - "version": "2.0.2", + "name": "adhocore/jwt", + "version": "1.1.2", "source": { "type": "git", - "url": "https://github.com/abraham/twitteroauth.git", - "reference": "5a424e80a1200674451844fbaae8a0098a316a01" + "url": "https://github.com/adhocore/php-jwt.git", + "reference": "6c434af7170090bb7a8880d2bc220a2254ba7899" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/5a424e80a1200674451844fbaae8a0098a316a01", - "reference": "5a424e80a1200674451844fbaae8a0098a316a01", + "url": "https://api.github.com/repos/adhocore/php-jwt/zipball/6c434af7170090bb7a8880d2bc220a2254ba7899", + "reference": "6c434af7170090bb7a8880d2bc220a2254ba7899", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.2", - "ext-curl": "*", - "php": "^7.3 || ^7.4 || ^8.0" + "php": "^7.0 || ^8.0" }, "require-dev": { - "php-vcr/php-vcr": "^1", - "php-vcr/phpunit-testlistener-vcr": "dev-php-8", - "phpmd/phpmd": "^2", - "phpunit/phpunit": "^8 || ^9", - "squizlabs/php_codesniffer": "^3" + "phpunit/phpunit": "^6.5 || ^7.5" }, "type": "library", "autoload": { "psr-4": { - "Abraham\\TwitterOAuth\\": "src" + "Ahc\\Jwt\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -44,53 +38,70 @@ ], "authors": [ { - "name": "Abraham Williams", - "email": "abraham@abrah.am", - "homepage": "https://abrah.am", - "role": "Developer" + "name": "Jitendra Adhikari", + "email": "jiten.adhikary@gmail.com" } ], - "description": "The most popular PHP library for use with the Twitter OAuth REST API.", - "homepage": "https://twitteroauth.com", + "description": "Ultra lightweight JSON web token (JWT) library for PHP5.5+.", "keywords": [ - "Twitter API", - "Twitter oAuth", - "api", - "oauth", - "rest", - "social", - "twitter" + "auth", + "json-web-token", + "jwt", + "jwt-auth", + "jwt-php", + "token" ], "support": { - "issues": "https://github.com/abraham/twitteroauth/issues", - "source": "https://github.com/abraham/twitteroauth" + "issues": "https://github.com/adhocore/php-jwt/issues", + "source": "https://github.com/adhocore/php-jwt/tree/1.1.2" }, - "time": "2021-06-11T02:56:14+00:00" + "funding": [ + { + "url": "https://paypal.me/ji10", + "type": "custom" + } + ], + "time": "2021-02-20T09:56:44+00:00" }, { - "name": "adhocore/jwt", - "version": "1.1.2", + "name": "chrome-php/chrome", + "version": "v1.9.1", "source": { "type": "git", - "url": "https://github.com/adhocore/php-jwt.git", - "reference": "6c434af7170090bb7a8880d2bc220a2254ba7899" + "url": "https://github.com/chrome-php/chrome.git", + "reference": "8df3b31ef0d1021c6ee40d8d31da32363a241244" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/adhocore/php-jwt/zipball/6c434af7170090bb7a8880d2bc220a2254ba7899", - "reference": "6c434af7170090bb7a8880d2bc220a2254ba7899", + "url": "https://api.github.com/repos/chrome-php/chrome/zipball/8df3b31ef0d1021c6ee40d8d31da32363a241244", + "reference": "8df3b31ef0d1021c6ee40d8d31da32363a241244", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "chrome-php/wrench": "^1.5", + "evenement/evenement": "^3.0.1", + "monolog/monolog": "^1.27.1 || ^2.8 || ^3.2", + "php": "^7.4.15 || ^8.0.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/filesystem": "^4.4 || ^5.0 || ^6.0", + "symfony/polyfill-mbstring": "^1.26", + "symfony/process": "^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.5" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^9.6.3 || ^10.0.12", + "symfony/var-dumper": "^4.4 || ^5.0 || ^6.0" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "psr-4": { - "Ahc\\Jwt\\": "src/" + "HeadlessChromium\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -99,43 +110,107 @@ ], "authors": [ { - "name": "Jitendra Adhikari", - "email": "jiten.adhikary@gmail.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Enrico Dias", + "email": "enrico@enricodias.com", + "homepage": "https://github.com/enricodias" } ], - "description": "Ultra lightweight JSON web token (JWT) library for PHP5.5+.", + "description": "Instrument headless chrome/chromium instances from PHP", "keywords": [ - "auth", - "json-web-token", - "jwt", - "jwt-auth", - "jwt-php", - "token" + "browser", + "chrome", + "chromium", + "crawl", + "headless", + "pdf", + "puppeteer", + "screenshot" ], "support": { - "issues": "https://github.com/adhocore/php-jwt/issues", - "source": "https://github.com/adhocore/php-jwt/tree/1.1.2" + "issues": "https://github.com/chrome-php/chrome/issues", + "source": "https://github.com/chrome-php/chrome/tree/v1.9.1" }, - "funding": [ + "time": "2023-10-08T14:48:21+00:00" + }, + { + "name": "chrome-php/wrench", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/chrome-php/wrench.git", + "reference": "725246324339e5fd5d798361b561e81004324f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chrome-php/wrench/zipball/725246324339e5fd5d798361b561e81004324f96", + "reference": "725246324339e5fd5d798361b561e81004324f96", + "shasum": "" + }, + "require": { + "ext-sockets": "*", + "php": "^7.4.15 || ^8.0.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/polyfill-php80": "^1.26" + }, + "conflict": { + "wrench/wrench": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "Wrench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://paypal.me/ji10", - "type": "custom" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "time": "2021-02-20T09:56:44+00:00" + "description": "A simple PHP WebSocket implementation", + "keywords": [ + "WebSockets", + "hybi", + "websocket" + ], + "support": { + "issues": "https://github.com/chrome-php/wrench/issues", + "source": "https://github.com/chrome-php/wrench/tree/v1.5.0" + }, + "time": "2023-03-11T18:12:56+00:00" }, { "name": "ckeditor/ckeditor", - "version": "4.16.1", + "version": "4.22.1", "source": { "type": "git", "url": "https://github.com/ckeditor/ckeditor4-releases.git", - "reference": "814c5891714b9de2aaf0d44ca4a5538e9596275c" + "reference": "0d51138b0a258165ac09724e8f5cda67cf9126a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ckeditor/ckeditor4-releases/zipball/814c5891714b9de2aaf0d44ca4a5538e9596275c", - "reference": "814c5891714b9de2aaf0d44ca4a5538e9596275c", + "url": "https://api.github.com/repos/ckeditor/ckeditor4-releases/zipball/0d51138b0a258165ac09724e8f5cda67cf9126a3", + "reference": "0d51138b0a258165ac09724e8f5cda67cf9126a3", "shasum": "" }, "type": "library", @@ -170,20 +245,20 @@ "source": "https://github.com/ckeditor/ckeditor4", "wiki": "https://ckeditor.com/docs/ckeditor4/latest/" }, - "time": "2021-05-20T12:10:08+00:00" + "time": "2023-06-30T13:35:30+00:00" }, { "name": "composer/ca-bundle", - "version": "1.2.10", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8", - "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -195,7 +270,7 @@ "phpstan/phpstan": "^0.12.55", "psr/log": "^1.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "type": "library", "extra": { @@ -230,7 +305,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.2.10" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -246,76 +321,31 @@ "type": "tidelift" } ], - "time": "2021-06-07T13:58:28+00:00" - }, - { - "name": "dg/rss-php", - "version": "v1.5", - "source": { - "type": "git", - "url": "https://github.com/dg/rss-php.git", - "reference": "18f00ab1828948a8cfe107729ca1f11c20129b47" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dg/rss-php/zipball/18f00ab1828948a8cfe107729ca1f11c20129b47", - "reference": "18f00ab1828948a8cfe107729ca1f11c20129b47", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": ">=5.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - } - ], - "description": "RSS & Atom Feeds for PHP is a very small and easy-to-use library for consuming an RSS and Atom feed", - "homepage": "https://github.com/dg/rss-php", - "keywords": [ - "atom", - "feed", - "rss" - ], - "support": { - "source": "https://github.com/dg/rss-php/tree/v1.5" - }, - "time": "2020-11-25T22:57:16+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "doctrine/collections", - "version": "1.6.7", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" + "doctrine/coding-standard": "^9.0 || ^10.0", + "phpstan/phpstan": "^1.4.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -359,40 +389,83 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.7" + "source": "https://github.com/doctrine/collections/tree/1.8.0" + }, + "time": "2022-09-01T20:12:10+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, - "time": "2020-07-27T17:53:49+00:00" + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + }, + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.3", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" @@ -440,7 +513,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.x" + "source": "https://github.com/doctrine/inflector/tree/2.0.8" }, "funding": [ { @@ -456,36 +529,90 @@ "type": "tidelift" } ], - "time": "2020-05-29T15:13:26+00:00" + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" }, { "name": "ezyang/htmlpurifier", - "version": "v4.13.0", + "version": "v4.16.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", "shasum": "" }, "require": { - "php": ">=5.2" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" }, "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" }, "type": "library", "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, "files": [ "library/HTMLPurifier.composer.php" ], + "psr-0": { + "HTMLPurifier": "library/" + }, "exclude-from-classmap": [ "/library/HTMLPurifier/Language/" ] @@ -508,26 +635,26 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/master" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" }, - "time": "2020-06-29T00:56:53+00:00" + "time": "2022-09-18T07:06:19+00:00" }, { "name": "giggsey/libphonenumber-for-php", - "version": "8.12.28", + "version": "8.13.23", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "f503d56d269e9b8572440820ef029e296dadaa1e" + "reference": "b2dff83693cb46eb4478b193e9d94e2ff6258480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/f503d56d269e9b8572440820ef029e296dadaa1e", - "reference": "f503d56d269e9b8572440820ef029e296dadaa1e", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/b2dff83693cb46eb4478b193e9d94e2ff6258480", + "reference": "b2dff83693cb46eb4478b193e9d94e2ff6258480", "shasum": "" }, "require": { - "giggsey/locale": "^1.7", + "giggsey/locale": "^1.7|^2.0", "php": ">=5.3.2", "symfony/polyfill-mbstring": "^1.17" }, @@ -579,40 +706,40 @@ "validation" ], "support": { - "irc": "irc://irc.appliedirc.com/lobby", "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", "source": "https://github.com/giggsey/libphonenumber-for-php" }, - "time": "2021-07-20T13:33:24+00:00" + "time": "2023-10-11T07:12:56+00:00" }, { "name": "giggsey/locale", - "version": "1.9", + "version": "2.4", "source": { "type": "git", "url": "https://github.com/giggsey/Locale.git", - "reference": "b07f1eace8072ccc61445ad8fbd493ff9d783043" + "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/b07f1eace8072ccc61445ad8fbd493ff9d783043", - "reference": "b07f1eace8072ccc61445ad8fbd493ff9d783043", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", + "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=7.2" }, "require-dev": { + "ext-json": "*", "pear/pear-core-minimal": "^1.9", "pear/pear_exception": "^1.0", "pear/versioncontrol_git": "^0.5", - "phing/phing": "~2.7", - "php-coveralls/php-coveralls": "^1.0|^2.0", - "phpunit/phpunit": "^4.8|^5.0", - "symfony/console": "^2.8|^3.0|^4.0", - "symfony/filesystem": "^2.8|^3.0|^4.0", - "symfony/finder": "^2.8|^3.0|^4.0", - "symfony/process": "^2.8|^3.0|^4.0" + "phing/phing": "^2.7", + "php-coveralls/php-coveralls": "^2.0", + "phpunit/phpunit": "^8.5|^9.5", + "symfony/console": "^5.0|^6.0", + "symfony/filesystem": "^5.0|^6.0", + "symfony/finder": "^5.0|^6.0", + "symfony/process": "^5.0|^6.0" }, "type": "library", "autoload": { @@ -628,30 +755,33 @@ { "name": "Joshua Gigg", "email": "giggsey@gmail.com", - "homepage": "http://giggsey.com/" + "homepage": "https://giggsey.com/" } ], "description": "Locale functions required by libphonenumber-for-php", "support": { "issues": "https://github.com/giggsey/Locale/issues", - "source": "https://github.com/giggsey/Locale/tree/master" + "source": "https://github.com/giggsey/Locale/tree/2.4" }, - "time": "2020-07-07T11:16:24+00:00" + "time": "2023-04-13T07:40:58+00:00" }, { "name": "globalcitizen/php-iban", - "version": "v4.1.0", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/globalcitizen/php-iban.git", - "reference": "5bf5d7df0bd0158460897f2b9c26eda91bbf9b7d" + "reference": "148b3c37c81c6bc525705de6dd44ea322963bd10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/globalcitizen/php-iban/zipball/5bf5d7df0bd0158460897f2b9c26eda91bbf9b7d", - "reference": "5bf5d7df0bd0158460897f2b9c26eda91bbf9b7d", + "url": "https://api.github.com/repos/globalcitizen/php-iban/zipball/148b3c37c81c6bc525705de6dd44ea322963bd10", + "reference": "148b3c37c81c6bc525705de6dd44ea322963bd10", "shasum": "" }, + "require": { + "php": "^5.4 || ^5.5 || ^5.6 || ^7.0 || ^7.4 || ^8.0 || ^8.1" + }, "type": "library", "autoload": { "files": [ @@ -666,40 +796,42 @@ "description": "php-iban is a library for parsing and validating IBAN (and IIBAN) bank account information.", "support": { "issues": "https://github.com/globalcitizen/php-iban/issues", - "source": "https://github.com/globalcitizen/php-iban/tree/v4.1.0" + "source": "https://github.com/globalcitizen/php-iban/tree/v4.2.1" }, - "time": "2021-07-01T23:55:02+00:00" + "time": "2023-01-08T12:29:37+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.3.0", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7008573787b430c1c1f650e3722d9bba59967628" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", - "reference": "7008573787b430c1c1f650e3722d9bba59967628", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7 || ^2.0", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0" + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1" + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", @@ -708,36 +840,61 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "7.3-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", @@ -751,7 +908,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.3.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -763,59 +920,69 @@ "type": "github" }, { - "url": "https://github.com/alexeyshockov", - "type": "github" - }, - { - "url": "https://github.com/gmponos", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" } ], - "time": "2021-03-23T11:33:13+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.4.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.4-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", @@ -824,28 +991,42 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.1" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, - "time": "2021-03-07T09:25:29+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.0.0", + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-08-03T15:11:55+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", - "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -853,17 +1034,18 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.0-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -876,13 +1058,34 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, { "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" }, { @@ -904,22 +1107,36 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.0.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, - "time": "2021-06-30T20:03:07+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:13:57+00:00" }, { "name": "illuminate/collections", - "version": "v8.51.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "7942bc71aca503d2f2721469c650fce38b1058e3" + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/7942bc71aca503d2f2721469c650fce38b1058e3", - "reference": "7942bc71aca503d2f2721469c650fce38b1058e3", + "url": "https://api.github.com/repos/illuminate/collections/zipball/705a4e1ef93cd492c45b9b3e7911cccc990a07f4", + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4", "shasum": "" }, "require": { @@ -928,7 +1145,7 @@ "php": "^7.3|^8.0" }, "suggest": { - "symfony/var-dumper": "Required to use the dump method (^5.1.4)." + "symfony/var-dumper": "Required to use the dump method (^5.4)." }, "type": "library", "extra": { @@ -937,12 +1154,12 @@ } }, "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, "files": [ "helpers.php" - ] + ], + "psr-4": { + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -960,20 +1177,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-07-15T14:07:19+00:00" + "time": "2022-06-23T15:29:49+00:00" }, { "name": "illuminate/contracts", - "version": "v8.51.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "199fcedc161ba4a0b83feaddc4629f395dbf1641" + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/199fcedc161ba4a0b83feaddc4629f395dbf1641", - "reference": "199fcedc161ba4a0b83feaddc4629f395dbf1641", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", "shasum": "" }, "require": { @@ -1008,20 +1225,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-01T14:53:38+00:00" + "time": "2022-01-13T14:47:47+00:00" }, { "name": "illuminate/macroable", - "version": "v8.51.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", - "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05" + "reference": "aed81891a6e046fdee72edd497f822190f61c162" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05", - "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/aed81891a6e046fdee72edd497f822190f61c162", + "reference": "aed81891a6e046fdee72edd497f822190f61c162", "shasum": "" }, "require": { @@ -1054,20 +1271,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2020-10-27T15:20:30+00:00" + "time": "2021-11-16T13:57:03+00:00" }, { "name": "illuminate/support", - "version": "v8.51.0", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "ee397b851a411ad490363a47df7476a24f93ca2e" + "reference": "1c79242468d3bbd9a0f7477df34f9647dde2a09b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/ee397b851a411ad490363a47df7476a24f93ca2e", - "reference": "ee397b851a411ad490363a47df7476a24f93ca2e", + "url": "https://api.github.com/repos/illuminate/support/zipball/1c79242468d3bbd9a0f7477df34f9647dde2a09b", + "reference": "1c79242468d3bbd9a0f7477df34f9647dde2a09b", "shasum": "" }, "require": { @@ -1077,20 +1294,20 @@ "illuminate/collections": "^8.0", "illuminate/contracts": "^8.0", "illuminate/macroable": "^8.0", - "nesbot/carbon": "^2.31", + "nesbot/carbon": "^2.53.1", "php": "^7.3|^8.0", - "voku/portable-ascii": "^1.4.8" + "voku/portable-ascii": "^1.6.1" }, "conflict": { "tightenco/collect": "<5.5.33" }, "suggest": { "illuminate/filesystem": "Required to use the composer class (^8.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0).", - "ramsey/uuid": "Required to use Str::uuid() (^4.0).", - "symfony/process": "Required to use the composer class (^5.1.4).", - "symfony/var-dumper": "Required to use the dd function (^5.1.4).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.4).", + "symfony/var-dumper": "Required to use the dd function (^5.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." }, "type": "library", "extra": { @@ -1099,12 +1316,12 @@ } }, "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, "files": [ "helpers.php" - ] + ], + "psr-4": { + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1122,31 +1339,31 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-07-16T12:34:54+00:00" + "time": "2022-09-21T21:30:03+00:00" }, { "name": "league/climate", - "version": "3.7.0", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/climate.git", - "reference": "5c717c3032c5118be7ad2395dbe0813d9894e8c7" + "reference": "a785a3ac8f584eed4abd45e4e16fe64c46659a28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/climate/zipball/5c717c3032c5118be7ad2395dbe0813d9894e8c7", - "reference": "5c717c3032c5118be7ad2395dbe0813d9894e8c7", + "url": "https://api.github.com/repos/thephpleague/climate/zipball/a785a3ac8f584eed4abd45e4e16fe64c46659a28", + "reference": "a785a3ac8f584eed4abd45e4e16fe64c46659a28", "shasum": "" }, "require": { "php": "^7.3 || ^8.0", - "psr/log": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", "seld/cli-prompt": "^1.0" }, "require-dev": { - "mikey179/vfsstream": "^1.4", + "mikey179/vfsstream": "^1.6.10", "mockery/mockery": "^1.4.2", - "phpunit/phpunit": "^9.5.0" + "phpunit/phpunit": "^9.5.10" }, "suggest": { "ext-mbstring": "If ext-mbstring is not available you MUST install symfony/polyfill-mbstring" @@ -1185,35 +1402,38 @@ ], "support": { "issues": "https://github.com/thephpleague/climate/issues", - "source": "https://github.com/thephpleague/climate/tree/3.7.0" + "source": "https://github.com/thephpleague/climate/tree/3.8.2" }, - "time": "2021-01-10T20:18:52+00:00" + "time": "2022-06-18T14:42:08+00:00" }, { "name": "maennchen/zipstream-php", - "version": "2.1.0", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", "shasum": "" }, "require": { "myclabs/php-enum": "^1.5", - "php": ">= 7.1", + "php": "^7.4 || ^8.0", "psr/http-message": "^1.0", "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { "ext-zip": "*", - "guzzlehttp/guzzle": ">= 6.3", + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": ">= 7.5" + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5.8 || ^9.4.2", + "vimeo/psalm": "^4.1" }, "type": "library", "autoload": { @@ -1250,88 +1470,48 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6" }, "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + }, { "url": "https://opencollective.com/zipstream", "type": "open_collective" } ], - "time": "2020-05-30T13:11:16+00:00" + "time": "2022-11-25T18:57:19+00:00" }, { "name": "markbaker/complex", - "version": "2.0.3", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946" + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/6f724d7e04606fd8adaa4e3bb381c3e9db09c946", - "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "squizlabs/php_codesniffer": "^3.4" + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" }, "type": "library", "autoload": { "psr-4": { "Complex\\": "classes/src/" - }, - "files": [ - "classes/src/functions/abs.php", - "classes/src/functions/acos.php", - "classes/src/functions/acosh.php", - "classes/src/functions/acot.php", - "classes/src/functions/acoth.php", - "classes/src/functions/acsc.php", - "classes/src/functions/acsch.php", - "classes/src/functions/argument.php", - "classes/src/functions/asec.php", - "classes/src/functions/asech.php", - "classes/src/functions/asin.php", - "classes/src/functions/asinh.php", - "classes/src/functions/atan.php", - "classes/src/functions/atanh.php", - "classes/src/functions/conjugate.php", - "classes/src/functions/cos.php", - "classes/src/functions/cosh.php", - "classes/src/functions/cot.php", - "classes/src/functions/coth.php", - "classes/src/functions/csc.php", - "classes/src/functions/csch.php", - "classes/src/functions/exp.php", - "classes/src/functions/inverse.php", - "classes/src/functions/ln.php", - "classes/src/functions/log2.php", - "classes/src/functions/log10.php", - "classes/src/functions/negative.php", - "classes/src/functions/pow.php", - "classes/src/functions/rho.php", - "classes/src/functions/sec.php", - "classes/src/functions/sech.php", - "classes/src/functions/sin.php", - "classes/src/functions/sinh.php", - "classes/src/functions/sqrt.php", - "classes/src/functions/tan.php", - "classes/src/functions/tanh.php", - "classes/src/functions/theta.php", - "classes/src/operations/add.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1351,60 +1531,42 @@ ], "support": { "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/2.0.3" + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" }, - "time": "2021-06-02T09:44:11+00:00" + "time": "2022-12-06T16:21:08+00:00" }, { "name": "markbaker/matrix", - "version": "2.1.3", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "174395a901b5ba0925f1d790fa91bab531074b61" + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/174395a901b5ba0925f1d790fa91bab531074b61", - "reference": "174395a901b5ba0925f1d790fa91bab531074b61", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", "phpdocumentor/phpdocumentor": "2.*", "phploc/phploc": "^4.0", "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" + "squizlabs/php_codesniffer": "^3.7" }, "type": "library", "autoload": { "psr-4": { "Matrix\\": "classes/src/" - }, - "files": [ - "classes/src/Functions/adjoint.php", - "classes/src/Functions/antidiagonal.php", - "classes/src/Functions/cofactors.php", - "classes/src/Functions/determinant.php", - "classes/src/Functions/diagonal.php", - "classes/src/Functions/identity.php", - "classes/src/Functions/inverse.php", - "classes/src/Functions/minors.php", - "classes/src/Functions/trace.php", - "classes/src/Functions/transpose.php", - "classes/src/Operations/add.php", - "classes/src/Operations/directsum.php", - "classes/src/Operations/subtract.php", - "classes/src/Operations/multiply.php", - "classes/src/Operations/divideby.php", - "classes/src/Operations/divideinto.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1425,31 +1587,32 @@ ], "support": { "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.3" + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" }, - "time": "2021-05-25T15:42:17+00:00" + "time": "2022-12-02T22:17:43+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.16.5", + "version": "v1.19.1", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "6d51ee9e94cff14412783785e79a4e7ef97b9d62" + "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/6d51ee9e94cff14412783785e79a4e7ef97b9d62", - "reference": "6d51ee9e94cff14412783785e79a4e7ef97b9d62", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/03dd40a1826f4d585ef93ef83afa2a9874a00523", + "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523", "shasum": "" }, "require": { "php": "^7.1|^8", - "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3|^4|^5" + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6" }, "require-dev": { - "phpunit/phpunit": "^7.5.20 || ^9.4.2" + "phpunit/phpunit": ">=7.5.20 <10.0", + "twig/twig": "^1.38|^2.7|^3.0" }, "suggest": { "kriswallsmith/assetic": "The best way to manage assets", @@ -1459,7 +1622,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16-dev" + "dev-master": "1.18-dev" } }, "autoload": { @@ -1490,26 +1653,26 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.16.5" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.1" }, - "time": "2020-12-07T11:07:24+00:00" + "time": "2023-10-12T08:10:52+00:00" }, { "name": "milon/barcode", - "version": "8.0.1", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/milon/barcode.git", - "reference": "a1b1ee1a743c1368597f1742e6ee4765333a15a1" + "reference": "a35005eb88d08807058dec0c4cba150ec6b432b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/milon/barcode/zipball/a1b1ee1a743c1368597f1742e6ee4765333a15a1", - "reference": "a1b1ee1a743c1368597f1742e6ee4765333a15a1", + "url": "https://api.github.com/repos/milon/barcode/zipball/a35005eb88d08807058dec0c4cba150ec6b432b8", + "reference": "a35005eb88d08807058dec0c4cba150ec6b432b8", "shasum": "" }, "require": { - "illuminate/support": "^8.0", + "illuminate/support": "^7.0|^8.0|^9.0", "php": "^7.3 | ^8.0" }, "type": "library", @@ -1554,7 +1717,7 @@ ], "support": { "issues": "https://github.com/milon/barcode/issues", - "source": "https://github.com/milon/barcode/tree/8.0.1" + "source": "https://github.com/milon/barcode/tree/9.0.1" }, "funding": [ { @@ -1566,28 +1729,31 @@ "type": "github" } ], - "time": "2021-01-08T11:36:07+00:00" + "time": "2022-06-28T11:18:28+00:00" }, { "name": "mlocati/idna", - "version": "1.0.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/mlocati/idna.git", - "reference": "2c8eeff3e27cf137eb0ed82eefb64535c2367005" + "reference": "6ae05443a4204e3dfb497109d94f85be453f4af5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/idna/zipball/2c8eeff3e27cf137eb0ed82eefb64535c2367005", - "reference": "2c8eeff3e27cf137eb0ed82eefb64535c2367005", + "url": "https://api.github.com/repos/mlocati/idna/zipball/6ae05443a4204e3dfb497109d94f85be453f4af5", + "reference": "6ae05443a4204e3dfb497109d94f85be453f4af5", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.6 || ^10" }, + "bin": [ + "bin/create-idnamap" + ], "type": "library", "autoload": { "psr-4": { @@ -1644,20 +1810,30 @@ "issues": "https://github.com/mlocati/idna/issues", "source": "https://github.com/mlocati/idna" }, - "time": "2019-09-02T15:52:28+00:00" + "funding": [ + { + "url": "https://paypal.me/mlocati", + "type": "custom" + }, + { + "url": "https://github.com/mlocati", + "type": "github" + } + ], + "time": "2023-04-04T16:14:10+00:00" }, { "name": "mlocati/ip-lib", - "version": "1.16.0", + "version": "1.18.0", "source": { "type": "git", "url": "https://github.com/mlocati/ip-lib.git", - "reference": "f3db91bff131b8c6a83d27a9f4dbbe768397ce47" + "reference": "c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/ip-lib/zipball/f3db91bff131b8c6a83d27a9f4dbbe768397ce47", - "reference": "f3db91bff131b8c6a83d27a9f4dbbe768397ce47", + "url": "https://api.github.com/repos/mlocati/ip-lib/zipball/c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2", + "reference": "c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2", "shasum": "" }, "require": { @@ -1703,7 +1879,7 @@ ], "support": { "issues": "https://github.com/mlocati/ip-lib/issues", - "source": "https://github.com/mlocati/ip-lib/tree/1.16.0" + "source": "https://github.com/mlocati/ip-lib/tree/1.18.0" }, "funding": [ { @@ -1715,20 +1891,20 @@ "type": "other" } ], - "time": "2021-05-31T20:43:23+00:00" + "time": "2022-01-13T18:05:33+00:00" }, { "name": "mlocati/spf-lib", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/mlocati/spf-lib.git", - "reference": "ec49c332fcf684716e00f234013af5e01f001993" + "reference": "8a4e52bf1c9d60ba9773a590ddc416f145c4fc57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/spf-lib/zipball/ec49c332fcf684716e00f234013af5e01f001993", - "reference": "ec49c332fcf684716e00f234013af5e01f001993", + "url": "https://api.github.com/repos/mlocati/spf-lib/zipball/8a4e52bf1c9d60ba9773a590ddc416f145c4fc57", + "reference": "8a4e52bf1c9d60ba9773a590ddc416f145c4fc57", "shasum": "" }, "require": { @@ -1784,20 +1960,122 @@ "type": "other" } ], - "time": "2021-02-07T15:13:08+00:00" + "time": "2022-09-09T09:05:31+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-10-27T15:25:26+00:00" }, { "name": "myclabs/php-enum", - "version": "1.8.3", + "version": "1.8.4", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "b942d263c641ddb5190929ff840c68f78713e937" + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", - "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", "shasum": "" }, "require": { @@ -1813,7 +2091,10 @@ "autoload": { "psr-4": { "MyCLabs\\Enum\\": "src/" - } + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1832,7 +2113,7 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" }, "funding": [ { @@ -1844,36 +2125,44 @@ "type": "tidelift" } ], - "time": "2021-07-05T08:18:36+00:00" + "time": "2022-08-04T09:53:51+00:00" }, { "name": "nesbot/carbon", - "version": "2.50.0", + "version": "2.71.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb" + "reference": "98276233188583f2ff845a0f992a235472d9466a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f47f17d17602b2243414a44ad53d9f8b9ada5fdb", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^3.4 || ^4.0 || ^5.0" + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, "bin": [ @@ -1882,8 +2171,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" }, "laravel": { "providers": [ @@ -1924,44 +2213,49 @@ "time" ], "support": { + "docs": "https://carbon.nesbot.com/docs", "issues": "https://github.com/briannesbitt/Carbon/issues", "source": "https://github.com/briannesbitt/Carbon" }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2021-06-28T22:38:45+00:00" + "time": "2023-09-25T11:31:05+00:00" }, { "name": "nette/php-generator", - "version": "v3.5.4", + "version": "v3.6.9", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "59bb35ed6e8da95854fbf7b7d47dce6156b42915" + "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/59bb35ed6e8da95854fbf7b7d47dce6156b42915", - "reference": "59bb35ed6e8da95854fbf7b7d47dce6156b42915", + "url": "https://api.github.com/repos/nette/php-generator/zipball/d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6", + "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6", "shasum": "" }, "require": { "nette/utils": "^3.1.2", - "php": ">=7.1" + "php": ">=7.2 <8.3" }, "require-dev": { - "nette/tester": "^2.0", - "nikic/php-parser": "^4.4", + "nette/tester": "^2.4", + "nikic/php-parser": "^4.13", "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" + "tracy/tracy": "^2.8" }, "suggest": { "nikic/php-parser": "to use ClassType::withBodiesFrom() & GlobalFunction::withBodyFrom()" @@ -1969,7 +2263,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.5-dev" + "dev-master": "3.6-dev" } }, "autoload": { @@ -1993,7 +2287,7 @@ "homepage": "https://nette.org/contributors" } ], - "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.0 features.", + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.1 features.", "homepage": "https://nette.org", "keywords": [ "code", @@ -2003,33 +2297,34 @@ ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v3.5.4" + "source": "https://github.com/nette/php-generator/tree/v3.6.9" }, - "time": "2021-07-05T12:02:42+00:00" + "time": "2022-10-04T11:49:47+00:00" }, { "name": "nette/utils", - "version": "v3.2.2", + "version": "v3.2.10", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c" + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/967cfc4f9a1acd5f1058d76715a424c53343c20c", - "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c", + "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", "shasum": "" }, "require": { - "php": ">=7.2 <8.1" + "php": ">=7.2 <8.4" }, "conflict": { "nette/di": "<3.0.6" }, "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", "nette/tester": "~2.0", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "^1.0", "tracy/tracy": "^2.3" }, "suggest": { @@ -2088,22 +2383,129 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.2" + "source": "https://github.com/nette/utils/tree/v3.2.10" + }, + "time": "2023-07-30T15:38:18+00:00" + }, + { + "name": "notihnio/php-multipart-form-data-parser", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/notihnio/php-multipart-form-data-parser.git", + "reference": "78be265f45804401e14dd4cd76479957fbda2058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/notihnio/php-multipart-form-data-parser/zipball/78be265f45804401e14dd4cd76479957fbda2058", + "reference": "78be265f45804401e14dd4cd76479957fbda2058", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Notihnio\\MultipartFormDataParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Notis Mastrandrikos", + "email": "pmastrandrikos@gmail.com" + } + ], + "description": "The missing php functionality to support put, patch, delete, etc multipart requests handling", + "support": { + "issues": "https://github.com/notihnio/php-multipart-form-data-parser/issues", + "source": "https://github.com/notihnio/php-multipart-form-data-parser/tree/1.0.0" + }, + "time": "2019-03-10T13:10:12+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2021-03-03T22:53:25+00:00" + "time": "2022-06-14T06:56:20+00:00" }, { "name": "parsecsv/php-parsecsv", - "version": "1.3.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/parsecsv/parsecsv-for-php.git", - "reference": "009820d190342581c05ce84a71237153d09e754d" + "reference": "2d6236cae09133e0533d34ed45ba1e1ecafffebb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/parsecsv/parsecsv-for-php/zipball/009820d190342581c05ce84a71237153d09e754d", - "reference": "009820d190342581c05ce84a71237153d09e754d", + "url": "https://api.github.com/repos/parsecsv/parsecsv-for-php/zipball/2d6236cae09133e0533d34ed45ba1e1ecafffebb", + "reference": "2d6236cae09133e0533d34ed45ba1e1ecafffebb", "shasum": "" }, "require": { @@ -2154,24 +2556,27 @@ "issues": "https://github.com/parsecsv/parsecsv-for-php/issues", "source": "https://github.com/parsecsv/parsecsv-for-php" }, - "time": "2021-06-20T21:25:35+00:00" + "time": "2021-11-07T14:15:46+00:00" }, { "name": "phenx/php-font-lib", - "version": "0.5.2", + "version": "0.5.4", "source": { "type": "git", - "url": "https://github.com/PhenX/php-font-lib.git", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/dd448ad1ce34c63d09baccd05415e361300c35b4", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4", "shasum": "" }, + "require": { + "ext-mbstring": "*" + }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" + "symfony/phpunit-bridge": "^3 || ^4 || ^5" }, "type": "library", "autoload": { @@ -2192,10 +2597,10 @@ "description": "A library to read, parse, export and make subsets of different types of font files.", "homepage": "https://github.com/PhenX/php-font-lib", "support": { - "issues": "https://github.com/PhenX/php-font-lib/issues", - "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2" + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.4" }, - "time": "2020-03-08T15:31:32+00:00" + "time": "2021-12-17T19:44:54+00:00" }, { "name": "phpmailer/dkimvalidator", @@ -2250,16 +2655,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.5.0", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "a5b5c43e50b7fba655f793ad27303cd74c57363c" + "reference": "e88da8d679acc3824ff231fdc553565b802ac016" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a5b5c43e50b7fba655f793ad27303cd74c57363c", - "reference": "a5b5c43e50b7fba655f793ad27303cd74c57363c", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e88da8d679acc3824ff231fdc553565b802ac016", + "reference": "e88da8d679acc3824ff231fdc553565b802ac016", "shasum": "" }, "require": { @@ -2269,20 +2674,24 @@ "php": ">=5.5.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.5.6", - "yoast/phpunit-polyfills": "^0.2.0" + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" }, "type": "library", "autoload": { @@ -2314,7 +2723,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.0" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.1" }, "funding": [ { @@ -2322,20 +2731,20 @@ "type": "github" } ], - "time": "2021-06-16T14:33:43+00:00" + "time": "2023-08-29T08:26:30+00:00" }, { "name": "phpoffice/phpspreadsheet", - "version": "1.18.0", + "version": "1.29.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c" + "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/418cd304e8e6b417ea79c3b29126a25dc4b1170c", - "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fde2ccf55eaef7e86021ff1acce26479160a0fa0", + "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0", "shasum": "" }, "require": { @@ -2352,33 +2761,34 @@ "ext-xmlwriter": "*", "ext-zip": "*", "ext-zlib": "*", - "ezyang/htmlpurifier": "^4.13", - "maennchen/zipstream-php": "^2.1", - "markbaker/complex": "^2.0", - "markbaker/matrix": "^2.0", - "php": "^7.2 || ^8.0", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0" + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "dompdf/dompdf": "^1.0", - "friendsofphp/php-cs-fixer": "^2.18", - "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^0.12.82", - "phpstan/phpstan-phpunit": "^0.12.18", - "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.3" + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0 || ^10.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" }, "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" }, "type": "library", "autoload": { @@ -2424,31 +2834,40 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.18.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.0" }, - "time": "2021-05-31T18:21:15+00:00" + "time": "2023-06-14T22:48:31+00:00" }, { - "name": "psr/container", - "version": "1.1.1", + "name": "pimple/pimple", + "version": "v3.5.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" + "psr-0": { + "Pimple": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2457,42 +2876,186 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", "keywords": [ - "PSR-11", "container", - "container-interface", - "container-interop", - "psr" + "dependency injection" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + }, + "time": "2022-06-13T21:57:56+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2512,7 +3075,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -2524,27 +3087,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2564,7 +3127,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -2579,31 +3142,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -2632,9 +3195,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/log", @@ -2783,29 +3346,33 @@ }, { "name": "sabberworm/php-css-parser", - "version": "8.3.1", + "version": "8.4.0", "source": { "type": "git", "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", "shasum": "" }, "require": { - "php": ">=5.3.2" + "ext-iconv": "*", + "php": ">=5.6.20" }, "require-dev": { "codacy/coverage": "^1.4", - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^4.8.36" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" }, "type": "library", "autoload": { - "psr-0": { - "Sabberworm\\CSS": "lib/" + "psr-4": { + "Sabberworm\\CSS\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2818,7 +3385,7 @@ } ], "description": "Parser for CSS Files written in PHP", - "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", "keywords": [ "css", "parser", @@ -2826,22 +3393,22 @@ ], "support": { "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", - "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1" + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" }, - "time": "2020-06-01T09:10:00+00:00" + "time": "2021-12-11T13:40:54+00:00" }, { "name": "sabre/dav", - "version": "4.1.5", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/sabre-io/dav.git", - "reference": "c1afdc77a95efea6ee40c03c45f57c3c0c80ec22" + "reference": "b65362abc926520eda2c57e219f022a6c288069d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/dav/zipball/c1afdc77a95efea6ee40c03c45f57c3c0c80ec22", - "reference": "c1afdc77a95efea6ee40c03c45f57c3c0c80ec22", + "url": "https://api.github.com/repos/sabre-io/dav/zipball/b65362abc926520eda2c57e219f022a6c288069d", + "reference": "b65362abc926520eda2c57e219f022a6c288069d", "shasum": "" }, "require": { @@ -2856,7 +3423,7 @@ "ext-spl": "*", "lib-libxml": ">=2.7.0", "php": "^7.1.0 || ^8.0", - "psr/log": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", "sabre/event": "^5.0", "sabre/http": "^5.0.5", "sabre/uri": "^2.0", @@ -2883,8 +3450,8 @@ "autoload": { "psr-4": { "Sabre\\DAV\\": "lib/DAV/", - "Sabre\\DAVACL\\": "lib/DAVACL/", "Sabre\\CalDAV\\": "lib/CalDAV/", + "Sabre\\DAVACL\\": "lib/DAVACL/", "Sabre\\CardDAV\\": "lib/CardDAV/" } }, @@ -2914,40 +3481,40 @@ "issues": "https://github.com/sabre-io/dav/issues", "source": "https://github.com/fruux/sabre-dav" }, - "time": "2021-02-12T07:54:23+00:00" + "time": "2022-06-27T09:07:55+00:00" }, { "name": "sabre/event", - "version": "5.1.2", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sabre-io/event.git", - "reference": "c120bec57c17b6251a496efc82b732418b49d50a" + "reference": "d7da22897125d34d7eddf7977758191c06a74497" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/c120bec57c17b6251a496efc82b732418b49d50a", - "reference": "c120bec57c17b6251a496efc82b732418b49d50a", + "url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497", + "reference": "d7da22897125d34d7eddf7977758191c06a74497", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.16.1", + "friendsofphp/php-cs-fixer": "~2.17.1", "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" }, "type": "library", "autoload": { - "psr-4": { - "Sabre\\Event\\": "lib/" - }, "files": [ "lib/coroutine.php", "lib/Loop/functions.php", "lib/Promise/functions.php" - ] + ], + "psr-4": { + "Sabre\\Event\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2980,20 +3547,20 @@ "issues": "https://github.com/sabre-io/event/issues", "source": "https://github.com/fruux/sabre-event" }, - "time": "2020-10-03T11:02:22+00:00" + "time": "2021-11-04T06:51:17+00:00" }, { "name": "sabre/http", - "version": "5.1.1", + "version": "5.1.10", "source": { "type": "git", "url": "https://github.com/sabre-io/http.git", - "reference": "d0aafede6961df6195ce7a8dad49296b0aaee22e" + "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/http/zipball/d0aafede6961df6195ce7a8dad49296b0aaee22e", - "reference": "d0aafede6961df6195ce7a8dad49296b0aaee22e", + "url": "https://api.github.com/repos/sabre-io/http/zipball/f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", + "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", "shasum": "" }, "require": { @@ -3005,7 +3572,7 @@ "sabre/uri": "^2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.16.1", + "friendsofphp/php-cs-fixer": "~2.17.1", "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" }, @@ -3043,29 +3610,32 @@ "issues": "https://github.com/sabre-io/http/issues", "source": "https://github.com/fruux/sabre-http" }, - "time": "2020-10-03T11:27:32+00:00" + "time": "2023-08-18T01:55:28+00:00" }, { "name": "sabre/uri", - "version": "2.2.1", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/sabre-io/uri.git", - "reference": "f502edffafea8d746825bd5f0b923a60fd2715ff" + "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/uri/zipball/f502edffafea8d746825bd5f0b923a60fd2715ff", - "reference": "f502edffafea8d746825bd5f0b923a60fd2715ff", + "url": "https://api.github.com/repos/sabre-io/uri/zipball/7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", + "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.16.1", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "friendsofphp/php-cs-fixer": "^3.17", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "^9.6" }, "type": "library", "autoload": { @@ -3100,26 +3670,26 @@ "issues": "https://github.com/sabre-io/uri/issues", "source": "https://github.com/fruux/sabre-uri" }, - "time": "2020-10-03T10:33:23+00:00" + "time": "2023-06-09T06:54:04+00:00" }, { "name": "sabre/vobject", - "version": "4.3.5", + "version": "4.5.3", "source": { "type": "git", "url": "https://github.com/sabre-io/vobject.git", - "reference": "d8a0a9ae215a8acfb51afc29101c7344670b9c83" + "reference": "fe6d9183154ed6f2f913f2b568d3d51d8ae9b308" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/d8a0a9ae215a8acfb51afc29101c7344670b9c83", - "reference": "d8a0a9ae215a8acfb51afc29101c7344670b9c83", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/fe6d9183154ed6f2f913f2b568d3d51d8ae9b308", + "reference": "fe6d9183154ed6f2f913f2b568d3d51d8ae9b308", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^7.1 || ^8.0", - "sabre/xml": "^2.1" + "sabre/xml": "^2.1 || ^3.0 || ^4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.17.1", @@ -3204,20 +3774,20 @@ "issues": "https://github.com/sabre-io/vobject/issues", "source": "https://github.com/fruux/sabre-vobject" }, - "time": "2021-02-12T06:28:04+00:00" + "time": "2023-01-22T12:21:50+00:00" }, { "name": "sabre/xml", - "version": "2.2.3", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/sabre-io/xml.git", - "reference": "c3b959f821c19b36952ec4a595edd695c216bfc6" + "reference": "9cde7cdab1e50893cc83b037b40cd47bfde42a2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/xml/zipball/c3b959f821c19b36952ec4a595edd695c216bfc6", - "reference": "c3b959f821c19b36952ec4a595edd695c216bfc6", + "url": "https://api.github.com/repos/sabre-io/xml/zipball/9cde7cdab1e50893cc83b037b40cd47bfde42a2b", + "reference": "9cde7cdab1e50893cc83b037b40cd47bfde42a2b", "shasum": "" }, "require": { @@ -3229,19 +3799,19 @@ "sabre/uri": ">=1.0,<3.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.16.1", + "friendsofphp/php-cs-fixer": "~2.17.1", "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" }, "type": "library", "autoload": { - "psr-4": { - "Sabre\\Xml\\": "lib/" - }, "files": [ "lib/Deserializer/functions.php", "lib/Serializer/functions.php" - ] + ], + "psr-4": { + "Sabre\\Xml\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3273,7 +3843,7 @@ "issues": "https://github.com/sabre-io/xml/issues", "source": "https://github.com/fruux/sabre-xml" }, - "time": "2020-10-03T10:08:14+00:00" + "time": "2023-06-28T12:56:05+00:00" }, { "name": "seld/cli-prompt", @@ -3330,26 +3900,221 @@ }, "time": "2020-12-15T21:32:01+00:00" }, + { + "name": "setasign/fpdf", + "version": "1.8.6", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDF.git", + "reference": "0838e0ee4925716fcbbc50ad9e1799b5edfae0a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDF/zipball/0838e0ee4925716fcbbc50ad9e1799b5edfae0a0", + "reference": "0838e0ee4925716fcbbc50ad9e1799b5edfae0a0", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-zlib": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "fpdf.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Olivier Plathey", + "email": "oliver@fpdf.org", + "homepage": "http://fpdf.org/" + } + ], + "description": "FPDF is a PHP class which allows to generate PDF files with pure PHP. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.", + "homepage": "http://www.fpdf.org", + "keywords": [ + "fpdf", + "pdf" + ], + "support": { + "source": "https://github.com/Setasign/FPDF/tree/1.8.6" + }, + "time": "2023-06-26T14:44:25+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4", + "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "~5.7", + "setasign/fpdf": "~1.8", + "setasign/tfpdf": "~1.31", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "~6.2" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2023-09-28T10:46:27+00:00" + }, + { + "name": "simplepie/simplepie", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/simplepie/simplepie.git", + "reference": "65b095d87bc00898d8fa7737bdbcda93a3fbcc55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplepie/simplepie/zipball/65b095d87bc00898d8fa7737bdbcda93a3fbcc55", + "reference": "65b095d87bc00898d8fa7737bdbcda93a3fbcc55", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19 || ^3.8", + "psr/simple-cache": "^1 || ^2 || ^3", + "yoast/phpunit-polyfills": "^1.0.1" + }, + "suggest": { + "ext-curl": "", + "ext-iconv": "", + "ext-intl": "", + "ext-mbstring": "", + "mf2/mf2": "Microformat module that allows for parsing HTML for microformats" + }, + "type": "library", + "autoload": { + "psr-0": { + "SimplePie": "library" + }, + "psr-4": { + "SimplePie\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Ryan Parman", + "homepage": "http://ryanparman.com/", + "role": "Creator, alumnus developer" + }, + { + "name": "Sam Sneddon", + "homepage": "https://gsnedders.com/", + "role": "Alumnus developer" + }, + { + "name": "Ryan McCue", + "email": "me@ryanmccue.info", + "homepage": "http://ryanmccue.info/", + "role": "Developer" + } + ], + "description": "A simple Atom/RSS parsing library for PHP", + "homepage": "http://simplepie.org/", + "keywords": [ + "atom", + "feeds", + "rss" + ], + "support": { + "issues": "https://github.com/simplepie/simplepie/issues", + "source": "https://github.com/simplepie/simplepie/tree/1.8.0" + }, + "time": "2023-01-20T08:37:35+00:00" + }, { "name": "simshaun/recurr", - "version": "v4.0.5", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/simshaun/recurr.git", - "reference": "08b0b46879f598cd11dd42b4c1a9c221a0562749" + "reference": "1aff62e6e0ee875b3f2487352542605123ee9172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simshaun/recurr/zipball/08b0b46879f598cd11dd42b4c1a9c221a0562749", - "reference": "08b0b46879f598cd11dd42b4c1a9c221a0562749", + "url": "https://api.github.com/repos/simshaun/recurr/zipball/1aff62e6e0ee875b3f2487352542605123ee9172", + "reference": "1aff62e6e0ee875b3f2487352542605123ee9172", "shasum": "" }, "require": { - "doctrine/collections": "~1.3", - "php": ">=5.5.0" + "doctrine/collections": "~1.6||^2.0", + "php": "^7.2||^8.0" }, "require-dev": { - "phpunit/phpunit": "~5.7" + "phpunit/phpunit": "^8.5.16", + "symfony/yaml": "^5.3" }, "type": "library", "extra": { @@ -3384,35 +4149,35 @@ ], "support": { "issues": "https://github.com/simshaun/recurr/issues", - "source": "https://github.com/simshaun/recurr/tree/v4.0.5" + "source": "https://github.com/simshaun/recurr/tree/v5.0.2" }, - "time": "2021-03-25T23:00:49+00:00" + "time": "2023-09-26T20:31:33+00:00" }, { "name": "smarty/smarty", - "version": "v3.1.39", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "e27da524f7bcd7361e3ea5cdfa99c4378a7b5419" + "reference": "3931d8f54b8f7a4ffab538582d34d4397ba8daa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/e27da524f7bcd7361e3ea5cdfa99c4378a7b5419", - "reference": "e27da524f7bcd7361e3ea5cdfa99c4378a7b5419", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/3931d8f54b8f7a4ffab538582d34d4397ba8daa5", + "reference": "3931d8f54b8f7a4ffab538582d34d4397ba8daa5", "shasum": "" }, "require": { - "php": ">=5.2" + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^6.5 || ^5.7 || ^4.8", + "phpunit/phpunit": "^8.5 || ^7.5", "smarty/smarty-lexer": "^3.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -3436,52 +4201,55 @@ { "name": "Rodney Rehm", "email": "rodney.rehm@medialize.de" + }, + { + "name": "Simon Wisselink", + "homepage": "https://www.iwink.nl/" } ], "description": "Smarty - the compiling PHP template engine", - "homepage": "http://www.smarty.net", + "homepage": "https://smarty-php.github.io/smarty/", "keywords": [ "templating" ], "support": { - "forum": "http://www.smarty.net/forums/", - "irc": "irc://irc.freenode.org/smarty", + "forum": "https://github.com/smarty-php/smarty/discussions", "issues": "https://github.com/smarty-php/smarty/issues", - "source": "https://github.com/smarty-php/smarty/tree/v3.1.39" + "source": "https://github.com/smarty-php/smarty/tree/v4.3.4" }, - "time": "2021-02-17T21:57:51+00:00" + "time": "2023-09-14T10:59:08+00:00" }, { - "name": "sonata-project/google-authenticator", - "version": "2.3.1", + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", "source": { "type": "git", - "url": "https://github.com/sonata-project/GoogleAuthenticator.git", - "reference": "71a4189228f93a9662574dc8c65e77ef55061b59" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sonata-project/GoogleAuthenticator/zipball/71a4189228f93a9662574dc8c65e77ef55061b59", - "reference": "71a4189228f93a9662574dc8c65e77ef55061b59", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5.1.8" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "psr-4": { - "Google\\Authenticator\\": "src/", - "Sonata\\GoogleAuthenticator\\": "src/" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3489,77 +4257,62 @@ ], "authors": [ { - "name": "Thomas Rabaix", - "email": "thomas.rabaix@gmail.com" - }, - { - "name": "Christian Stocker", - "email": "me@chregu.tv" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Andre DeMarre", - "homepage": "http://www.devnetwork.net/viewtopic.php?f=50&t=94989" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library to integrate Google Authenticator into a PHP project", - "homepage": "https://github.com/sonata-project/GoogleAuthenticator", - "keywords": [ - "google authenticator" - ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sonata-project/GoogleAuthenticator/issues", - "source": "https://github.com/sonata-project/GoogleAuthenticator/tree/2.3.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { - "url": "https://github.com/OskarStark", - "type": "github" - }, - { - "url": "https://github.com/VincentLanglet", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://github.com/core23", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://github.com/wbloszyk", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2021-02-15T19:23:18+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "name": "symfony/filesystem", + "version": "v5.4.25", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "url": "https://github.com/symfony/filesystem.git", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { - "files": [ - "function.php" + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3568,18 +4321,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" }, "funding": [ { @@ -3595,32 +4348,35 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2023-05-31T13:04:02+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3628,12 +4384,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3658,7 +4414,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -3674,32 +4430,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.23.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6de50471469b8c9afc38164452ab2b6170ee71c1", + "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-iconv": "*" + }, "suggest": { "ext-iconv": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3707,12 +4466,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3738,7 +4497,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.28.0" }, "funding": [ { @@ -3754,32 +4513,35 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3787,12 +4549,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3818,7 +4580,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -3834,20 +4596,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -3856,7 +4618,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3864,12 +4626,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -3880,28 +4642,90 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.28", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + "source": "https://github.com/symfony/process/tree/v5.4.28" }, "funding": [ { @@ -3917,31 +4741,32 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2023-08-07T10:36:04+00:00" }, { "name": "symfony/translation", - "version": "v5.3.3", + "version": "v5.4.30", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "380b8c9e944d0e364b25f28e8e555241eb49c01c" + "reference": "8560dc532e4e48d331937532a7cbfd2a9f9f53ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/380b8c9e944d0e364b25f28e8e555241eb49c01c", - "reference": "380b8c9e944d0e364b25f28e8e555241eb49c01c", + "url": "https://api.github.com/repos/symfony/translation/zipball/8560dc532e4e48d331937532a7cbfd2a9f9f53ce", + "reference": "8560dc532e4e48d331937532a7cbfd2a9f9f53ce", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/translation-contracts": "^2.3" }, "conflict": { "symfony/config": "<4.4", + "symfony/console": "<5.3", "symfony/dependency-injection": "<5.0", "symfony/http-kernel": "<5.0", "symfony/twig-bundle": "<5.0", @@ -3951,16 +4776,17 @@ "symfony/translation-implementation": "2.3" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/intl": "^4.4|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^4.4|^5.0" + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log-implementation": "To use logging capability in translator", @@ -3996,7 +4822,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.3.3" + "source": "https://github.com/symfony/translation/tree/v5.4.30" }, "funding": [ { @@ -4012,20 +4838,20 @@ "type": "tidelift" } ], - "time": "2021-06-27T12:22:47+00:00" + "time": "2023-10-28T09:19:54+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", - "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -4037,7 +4863,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -4074,7 +4900,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -4090,35 +4916,36 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.3.3", + "version": "v5.4.29", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "46aa709affb9ad3355bd7a810f9662d71025c384" + "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46aa709affb9ad3355bd7a810f9662d71025c384", - "reference": "46aa709affb9ad3355bd7a810f9662d71025c384", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6172e4ae3534d25ee9e07eb487c20be7760fcc65", + "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -4162,7 +4989,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.29" }, "funding": [ { @@ -4178,20 +5005,20 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2023-09-12T10:09:58+00:00" }, { "name": "twig/twig", - "version": "v3.3.2", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "21578f00e83d4a82ecfa3d50752b609f13de6790" + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/21578f00e83d4a82ecfa3d50752b609f13de6790", - "reference": "21578f00e83d4a82ecfa3d50752b609f13de6790", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", "shasum": "" }, "require": { @@ -4200,15 +5027,10 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, "autoload": { "psr-4": { "Twig\\": "src/" @@ -4242,7 +5064,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.3.2" + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" }, "funding": [ { @@ -4254,20 +5076,20 @@ "type": "tidelift" } ], - "time": "2021-05-16T12:14:13+00:00" + "time": "2023-08-28T11:09:02+00:00" }, { "name": "voku/portable-ascii", - "version": "1.5.6", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "80953678b19901e5165c56752d087fc11526017c" + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", - "reference": "80953678b19901e5165c56752d087fc11526017c", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", "shasum": "" }, "require": { @@ -4304,7 +5126,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + "source": "https://github.com/voku/portable-ascii/tree/1.6.1" }, "funding": [ { @@ -4328,20 +5150,20 @@ "type": "tidelift" } ], - "time": "2020-11-12T00:07:28+00:00" + "time": "2022-01-24T18:55:24+00:00" }, { "name": "yetiforce/csrf-magic", - "version": "v1.1.2", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/YetiForceCompany/csrf-magic.git", - "reference": "f0da3a6f986def4e06b4a1d27b13005a59d172dd" + "reference": "aecd6d438962d8f6dbef8749ca8821caea01d7af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YetiForceCompany/csrf-magic/zipball/f0da3a6f986def4e06b4a1d27b13005a59d172dd", - "reference": "f0da3a6f986def4e06b4a1d27b13005a59d172dd", + "url": "https://api.github.com/repos/YetiForceCompany/csrf-magic/zipball/aecd6d438962d8f6dbef8749ca8821caea01d7af", + "reference": "aecd6d438962d8f6dbef8749ca8821caea01d7af", "shasum": "" }, "require": { @@ -4377,26 +5199,26 @@ "security" ], "support": { - "source": "https://github.com/YetiForceCompany/csrf-magic/tree/v1.1.2" + "source": "https://github.com/YetiForceCompany/csrf-magic/tree/v1.1.3" }, - "time": "2021-02-05T12:04:07+00:00" + "time": "2023-06-23T05:14:55+00:00" }, { "name": "yetiforce/yetiforcepdf", - "version": "0.1.32", + "version": "0.1.40", "source": { "type": "git", "url": "https://github.com/YetiForceCompany/YetiForcePDF.git", - "reference": "39e817135c14198b474275e21ae109a74c72a517" + "reference": "0f5f451b85855cb57e9ee8f8fff4a0bce5cc3672" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YetiForceCompany/YetiForcePDF/zipball/39e817135c14198b474275e21ae109a74c72a517", - "reference": "39e817135c14198b474275e21ae109a74c72a517", + "url": "https://api.github.com/repos/YetiForceCompany/YetiForcePDF/zipball/0f5f451b85855cb57e9ee8f8fff4a0bce5cc3672", + "reference": "0f5f451b85855cb57e9ee8f8fff4a0bce5cc3672", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.1", + "composer/ca-bundle": "^1", "ext-bcmath": "*", "ext-dom": "*", "ext-filter": "*", @@ -4404,11 +5226,11 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-zlib": "*", - "guzzlehttp/guzzle": "^7.0", - "milon/barcode": "^8.0.0", - "phenx/php-font-lib": "^0.5.1", - "php": ">=7.3", - "sabberworm/php-css-parser": "^8.3" + "guzzlehttp/guzzle": "^7", + "milon/barcode": "^9", + "phenx/php-font-lib": "^0.5", + "php": ">=7.4", + "sabberworm/php-css-parser": "^8" }, "type": "library", "autoload": { @@ -4417,10 +5239,13 @@ } }, "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], "authors": [ { "name": "YetiForceCompany", - "email": "info@yetiforce.com", + "email": "devs@yetiforce.com", "homepage": "https://yetiforce.com/" } ], @@ -4433,7 +5258,7 @@ ], "support": { "issues": "https://github.com/YetiForceCompany/YetiForcePDF/issues", - "source": "https://github.com/YetiForceCompany/YetiForcePDF/tree/0.1.32" + "source": "https://github.com/YetiForceCompany/YetiForcePDF/tree/0.1.40" }, "funding": [ { @@ -4441,20 +5266,20 @@ "type": "open_collective" } ], - "time": "2021-04-09T09:59:12+00:00" + "time": "2022-08-16T06:22:44+00:00" }, { "name": "yetiforce/yii2", - "version": "2.0.39.2", + "version": "2.0.45", "source": { "type": "git", "url": "https://github.com/YetiForceCompany/yii2-framework.git", - "reference": "d905788b495ef5832387cabe975949f5155544a2" + "reference": "a9d87cfcb2a8d801c4e2d1e3f0eab0db934124ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YetiForceCompany/yii2-framework/zipball/d905788b495ef5832387cabe975949f5155544a2", - "reference": "d905788b495ef5832387cabe975949f5155544a2", + "url": "https://api.github.com/repos/YetiForceCompany/yii2-framework/zipball/a9d87cfcb2a8d801c4e2d1e3f0eab0db934124ba", + "reference": "a9d87cfcb2a8d801c4e2d1e3f0eab0db934124ba", "shasum": "" }, "require": { @@ -4477,13 +5302,13 @@ { "name": "Qiang Xue", "email": "qiang.xue@gmail.com", - "homepage": "http://www.yiiframework.com/", + "homepage": "https://www.yiiframework.com/", "role": "Founder and project lead" }, { "name": "Alexander Makarov", "email": "sam@rmcreative.ru", - "homepage": "http://rmcreative.ru/", + "homepage": "https://rmcreative.ru/", "role": "Core framework development" }, { @@ -4494,7 +5319,7 @@ { "name": "Carsten Brandt", "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", + "homepage": "https://www.cebe.cc/", "role": "Core framework development" }, { @@ -4533,33 +5358,36 @@ "yii2" ], "support": { - "source": "https://github.com/YetiForceCompany/yii2-framework/tree/2.0.39.2" + "source": "https://github.com/YetiForceCompany/yii2-framework/tree/2.0.45" }, - "time": "2020-11-19T07:05:31+00:00" + "time": "2022-03-29T11:16:44+00:00" }, { "name": "zbateson/mail-mime-parser", - "version": "1.3.2", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "8eb590750772849189c7fa30ed52bcdcd2c9d1ef" + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/8eb590750772849189c7fa30ed52bcdcd2c9d1ef", - "reference": "8eb590750772849189c7fa30ed52bcdcd2c9d1ef", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/20b3e48eb799537683780bc8782fbbe9bc25934a", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a", "shasum": "" }, "require": { "guzzlehttp/psr7": "^1.7.0|^2.0", - "php": ">=5.4", + "php": ">=7.1", + "pimple/pimple": "^3.0", "zbateson/mb-wrapper": "^1.0.1", "zbateson/stream-decorators": "^1.0.6" }, "require-dev": { + "friendsofphp/php-cs-fixer": "*", "mikey179/vfsstream": "^1.6.0", - "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10" }, "suggest": { "ext-iconv": "For best support/performance", @@ -4607,29 +5435,31 @@ "type": "github" } ], - "time": "2021-07-08T19:06:28+00:00" + "time": "2023-02-14T22:58:03+00:00" }, { "name": "zbateson/mb-wrapper", - "version": "1.0.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/zbateson/mb-wrapper.git", - "reference": "721b3dfbf7ab75fee5ac60a542d7923ffe59ef6d" + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/721b3dfbf7ab75fee5ac60a542d7923ffe59ef6d", - "reference": "721b3dfbf7ab75fee5ac60a542d7923ffe59ef6d", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334", "shasum": "" }, "require": { - "php": ">=5.4", + "php": ">=7.1", "symfony/polyfill-iconv": "^1.9", "symfony/polyfill-mbstring": "^1.9" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5" + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<=9.0" }, "suggest": { "ext-iconv": "For best support/performance", @@ -4666,7 +5496,7 @@ ], "support": { "issues": "https://github.com/zbateson/mb-wrapper/issues", - "source": "https://github.com/zbateson/mb-wrapper/tree/1.0.1" + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.0" }, "funding": [ { @@ -4674,29 +5504,31 @@ "type": "github" } ], - "time": "2020-10-21T22:14:27+00:00" + "time": "2023-01-11T23:05:44+00:00" }, { "name": "zbateson/stream-decorators", - "version": "1.0.6", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/zbateson/stream-decorators.git", - "reference": "3403c4323bd1cd15fe54348b031b26b064c706af" + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/3403c4323bd1cd15fe54348b031b26b064c706af", - "reference": "3403c4323bd1cd15fe54348b031b26b064c706af", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9", "shasum": "" }, "require": { - "guzzlehttp/psr7": "^1.7.0|^2.0", - "php": ">=5.4", + "guzzlehttp/psr7": "^1.9 | ^2.0", + "php": ">=7.2", "zbateson/mb-wrapper": "^1.0.0" }, "require-dev": { - "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" }, "type": "library", "autoload": { @@ -4727,7 +5559,7 @@ ], "support": { "issues": "https://github.com/zbateson/stream-decorators/issues", - "source": "https://github.com/zbateson/stream-decorators/tree/1.0.6" + "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1" }, "funding": [ { @@ -4735,36 +5567,40 @@ "type": "github" } ], - "time": "2021-07-08T19:01:59+00:00" + "time": "2023-05-30T22:51:52+00:00" } ], "packages-dev": [ { "name": "doctrine/annotations", - "version": "1.13.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^2 || ^3", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", + "php": "^7.2 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" }, "type": "library", "autoload": { @@ -4807,35 +5643,36 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.1" + "source": "https://github.com/doctrine/annotations/tree/2.0.1" }, - "time": "2021-05-16T18:07:53+00:00" + "time": "2023-02-02T22:02:53+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -4862,7 +5699,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -4878,39 +5715,37 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4942,7 +5777,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { @@ -4958,7 +5793,7 @@ "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { "name": "fr3d/swagger-assertions", @@ -5018,16 +5853,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "v5.2.13", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", "shasum": "" }, "require": { @@ -5082,43 +5917,44 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2023-09-26T02:20:38+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, "files": [ "src/DeepCopy/deep_copy.php" - ] + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5134,7 +5970,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -5142,20 +5978,20 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.12.0", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -5196,9 +6032,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2021-07-21T10:44:31+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phar-io/manifest", @@ -5241,336 +6077,102 @@ "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, - "time": "2021-02-23T14:00:09+00:00" - }, - { - "name": "php-console/php-console", - "version": "3.1.8", - "source": { - "type": "git", - "url": "https://github.com/barbushin/php-console.git", - "reference": "aa1d71d4ea3dc91e126edc9aa4f3c10eb8559cff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barbushin/php-console/zipball/aa1d71d4ea3dc91e126edc9aa4f3c10eb8559cff", - "reference": "aa1d71d4ea3dc91e126edc9aa4f3c10eb8559cff", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^4.8", - "psr/log": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "PhpConsole\\": "src/PhpConsole" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sergey Barbushin", - "email": "barbushin@gmail.com", - "homepage": "http://linkedin.com/in/barbushin" - } - ], - "description": "PHP library for Google Chrome extension \"PHP Console\".", - "homepage": "https://github.com/barbushin/php-console", - "keywords": [ - "chrome", - "debug", - "error handler", - "errors", - "google chrome", - "php" - ], - "support": { - "issues": "https://github.com/barbushin/php-console/issues", - "source": "https://github.com/barbushin/php-console/tree/master" - }, - "time": "2019-07-25T03:43:28+00:00" - }, - { - "name": "php-webdriver/webdriver", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "da16e39968f8dd5cfb7d07eef91dc2b731c69880" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/da16e39968f8dd5cfb7d07eef91dc2b731c69880", - "reference": "da16e39968f8dd5cfb7d07eef91dc2b731c69880", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-zip": "*", - "php": "^5.6 || ~7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0" - }, - "replace": { - "facebook/webdriver": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", - "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^1.1 || ^2.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", - "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0" - }, - "suggest": { - "ext-SimpleXML": "For Firefox profile creation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facebook\\WebDriver\\": "lib/" - }, - "files": [ - "lib/Exception/TimeoutException.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", - "homepage": "https://github.com/php-webdriver/php-webdriver", - "keywords": [ - "Chromedriver", - "geckodriver", - "php", - "selenium", - "webdriver" - ], - "support": { - "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.11.1" - }, - "time": "2021-05-21T15:12:49+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2020-06-27T09:03:43+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2020-09-03T19:13:55+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "name": "php-console/php-console", + "version": "3.1.8", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "url": "https://github.com/barbushin/php-console.git", + "reference": "aa1d71d4ea3dc91e126edc9aa4f3c10eb8559cff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/barbushin/php-console/zipball/aa1d71d4ea3dc91e126edc9aa4f3c10eb8559cff", + "reference": "aa1d71d4ea3dc91e126edc9aa4f3c10eb8559cff", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "php": ">=5.3.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-mbstring": "*", + "phpunit/phpunit": "^4.8", + "psr/log": "^1.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "PhpConsole\\": "src/PhpConsole" } }, "notification-url": "https://packagist.org/downloads/", @@ -5579,103 +6181,112 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Sergey Barbushin", + "email": "barbushin@gmail.com", + "homepage": "http://linkedin.com/in/barbushin" } ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "description": "PHP library for Google Chrome extension \"PHP Console\".", + "homepage": "https://github.com/barbushin/php-console", + "keywords": [ + "chrome", + "debug", + "error handler", + "errors", + "google chrome", + "php" + ], "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + "issues": "https://github.com/barbushin/php-console/issues", + "source": "https://github.com/barbushin/php-console/tree/master" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2019-07-25T03:43:28+00:00" }, { - "name": "phpspec/prophecy", - "version": "1.13.0", + "name": "php-webdriver/webdriver", + "version": "1.15.1", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "url": "https://github.com/php-webdriver/php-webdriver.git", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "php": "^7.3 || ^8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/process": "^5.0 || ^6.0 || ^7.0" + }, + "replace": { + "facebook/webdriver": "*" }, "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", + "php-coveralls/php-coveralls": "^2.4", + "php-mock/php-mock-phpunit": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^9.3", + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^5.0 || ^6.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" }, + "type": "library", "autoload": { + "files": [ + "lib/Exception/TimeoutException.php" + ], "psr-4": { - "Prophecy\\": "src/Prophecy" + "Facebook\\WebDriver\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", + "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", + "homepage": "https://github.com/php-webdriver/php-webdriver", "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" + "Chromedriver", + "geckodriver", + "php", + "selenium", + "webdriver" ], "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1" }, - "time": "2021-03-17T13:42:18+00:00" + "time": "2023-10-20T12:21:20+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.6", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -5690,8 +6301,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -5724,7 +6335,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -5732,20 +6344,20 @@ "type": "github" } ], - "time": "2021-03-28T07:26:59+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -5784,7 +6396,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -5792,7 +6404,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -5977,20 +6589,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.7", + "version": "9.6.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d0dc8b6999c937616df4fb046792004b33fd31c5" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0dc8b6999c937616df4fb046792004b33fd31c5", - "reference": "d0dc8b6999c937616df4fb046792004b33fd31c5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -5998,34 +6610,29 @@ "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", + "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -6033,15 +6640,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { - "classmap": [ - "src/" - ], "files": [ "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -6064,19 +6671,24 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.7" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2021-07-19T06:14:47+00:00" + "time": "2023-09-19T05:39:22+00:00" }, { "name": "psr/cache", @@ -6129,16 +6741,16 @@ }, { "name": "rize/uri-template", - "version": "0.3.3", + "version": "0.3.5", "source": { "type": "git", "url": "https://github.com/rize/UriTemplate.git", - "reference": "6e0b97e00e0f36c652dd3c37b194ef07de669b82" + "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rize/UriTemplate/zipball/6e0b97e00e0f36c652dd3c37b194ef07de669b82", - "reference": "6e0b97e00e0f36c652dd3c37b194ef07de669b82", + "url": "https://api.github.com/repos/rize/UriTemplate/zipball/5ed4ba8ea34af84485dea815d4b6b620794d1168", + "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168", "shasum": "" }, "require": { @@ -6171,9 +6783,23 @@ ], "support": { "issues": "https://github.com/rize/UriTemplate/issues", - "source": "https://github.com/rize/UriTemplate/tree/0.3.3" + "source": "https://github.com/rize/UriTemplate/tree/0.3.5" }, - "time": "2021-02-22T15:03:38+00:00" + "funding": [ + { + "url": "https://www.paypal.me/rezigned", + "type": "custom" + }, + { + "url": "https://github.com/rezigned", + "type": "github" + }, + { + "url": "https://opencollective.com/rize-uri-template", + "type": "open_collective" + } + ], + "time": "2022-10-12T17:22:51+00:00" }, { "name": "sebastian/cli-parser", @@ -6344,16 +6970,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -6406,7 +7032,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -6414,7 +7040,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -6475,16 +7101,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -6529,7 +7155,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -6537,20 +7163,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -6592,7 +7218,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -6600,20 +7226,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.3", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -6662,14 +7288,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -6677,20 +7303,20 @@ "type": "github" } ], - "time": "2020-09-28T05:24:23+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.3", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -6733,7 +7359,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -6741,7 +7367,7 @@ "type": "github" } ], - "time": "2021-06-11T13:31:12+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -6914,16 +7540,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -6962,10 +7588,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -6973,7 +7599,7 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", @@ -7028,33 +7654,32 @@ "type": "github" } ], - "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -7077,7 +7702,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -7085,7 +7710,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -7142,23 +7767,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -7189,7 +7815,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" }, "funding": [ { @@ -7201,24 +7827,26 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2023-05-11T13:16:46+00:00" }, { "name": "symfony/finder", - "version": "v5.3.0", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -7246,69 +7874,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-26T12:52:38+00:00" - }, - { - "name": "symfony/process", - "version": "v5.3.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.3.2" + "source": "https://github.com/symfony/finder/tree/v5.4.27" }, "funding": [ { @@ -7324,32 +7890,32 @@ "type": "tidelift" } ], - "time": "2021-06-12T10:15:01+00:00" + "time": "2023-07-31T08:02:31+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.3", + "version": "v5.4.30", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229" + "reference": "c6980e82a6656f6ebfabfd82f7585794cb122554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", - "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c6980e82a6656f6ebfabfd82f7585794cb122554", + "reference": "c6980e82a6656f6ebfabfd82f7585794cb122554", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.3" }, "require-dev": { - "symfony/console": "^4.4|^5.0" + "symfony/console": "^5.3|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -7383,7 +7949,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.3" + "source": "https://github.com/symfony/yaml/tree/v5.4.30" }, "funding": [ { @@ -7399,20 +7965,20 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2023-10-27T18:36:14+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -7441,7 +8007,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -7449,102 +8015,51 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" + "time": "2021-07-28T10:34:58+00:00" }, { "name": "zircote/swagger-php", - "version": "3.2.3", + "version": "4.7.15", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "41ed0eb1dacebe2c365623b3f9ab13d1531a03da" + "reference": "df8de8e484003f68cd2fa68db1e6cfb47a3a92cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/41ed0eb1dacebe2c365623b3f9ab13d1531a03da", - "reference": "41ed0eb1dacebe2c365623b3f9ab13d1531a03da", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/df8de8e484003f68cd2fa68db1e6cfb47a3a92cb", + "reference": "df8de8e484003f68cd2fa68db1e6cfb47a3a92cb", "shasum": "" }, "require": { - "doctrine/annotations": "^1.7", + "doctrine/annotations": "^1.7 || ^2.0", "ext-json": "*", "php": ">=7.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^2 || ^3", "symfony/finder": ">=2.2", "symfony/yaml": ">=3.3" }, "require-dev": { + "composer/package-versions-deprecated": "^1.11", "friendsofphp/php-cs-fixer": "^2.17 || ^3.0", - "phpunit/phpunit": ">=8" + "phpstan/phpstan": "^1.6", + "phpunit/phpunit": ">=8", + "vimeo/psalm": "^4.23" }, "bin": [ "bin/openapi" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, "autoload": { "psr-4": { "OpenApi\\": "src" - }, - "files": [ - "src/functions.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7576,9 +8091,9 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/3.2.3" + "source": "https://github.com/zircote/swagger-php/tree/4.7.15" }, - "time": "2021-06-25T04:08:57+00:00" + "time": "2023-10-12T20:26:34+00:00" } ], "aliases": [], @@ -7587,7 +8102,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.3", + "php": ">=7.4", "ext-imap": "*", "ext-pdo": "*", "ext-pdo_mysql": "*", @@ -7614,5 +8129,5 @@ "ext-hash": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.3.0" } diff --git a/config/Components/ConfigTemplates.php b/config/Components/ConfigTemplates.php index f458cf611107..04f0009bee05 100644 --- a/config/Components/ConfigTemplates.php +++ b/config/Components/ConfigTemplates.php @@ -2,17 +2,17 @@ /** * Components config. * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) */ return [ 'AddressFinder' => [ - 'REMAPPING_OPENCAGE' => [ + 'remappingOpenCage' => [ 'type' => 'function', 'default' => 'return null;', 'description' => 'The main function to remapping fields for OpenCage. It should be a function.', ], - 'REMAPPING_OPENCAGE_FOR_COUNTRY' => [ + 'remappingOpenCageForCountry' => [ 'type' => 'function', 'default' => "return [ 'Australia' => function (\$row) { @@ -339,42 +339,26 @@ 'footerName' => [ 'default' => '', 'description' => 'Footer\'s name', - 'validation' => function () { - return true; - }, - 'sanitization' => function () { - return \App\Purifier::purify(func_get_arg(0)); - }, + 'validation' => fn () => true, + 'sanitization' => fn () => \App\Purifier::purify(func_get_arg(0)), ], 'urlLinkedIn' => [ 'default' => 'https://www.linkedin.com/groups/8177576', 'description' => 'LinkedIn URL', - 'validation' => function () { - return true; - }, - 'sanitization' => function () { - return \App\Purifier::purify(func_get_arg(0)); - }, + 'validation' => fn () => true, + 'sanitization' => fn () => \App\Purifier::purify(func_get_arg(0)), ], 'urlTwitter' => [ 'default' => 'https://twitter.com/YetiForceEN', 'description' => 'Twitter URL', - 'validation' => function () { - return true; - }, - 'sanitization' => function () { - return \App\Purifier::purify(func_get_arg(0)); - }, + 'validation' => fn () => true, + 'sanitization' => fn () => \App\Purifier::purify(func_get_arg(0)), ], 'urlFacebook' => [ 'default' => 'https://www.facebook.com/YetiForce-CRM-158646854306054/', 'description' => 'Facebook URL', - 'validation' => function () { - return true; - }, - 'sanitization' => function () { - return \App\Purifier::purify(func_get_arg(0)); - }, + 'validation' => fn () => true, + 'sanitization' => fn () => \App\Purifier::purify(func_get_arg(0)), ], ], 'MeetingService' => [ @@ -439,9 +423,19 @@ 'modules' => [ 'default' => [], 'description' => 'List of modules where the conflict of interests mechanism is enabled.', - 'validation' => function () { - return true; - }, + 'validation' => fn () => true, + ], + ], + 'Pdf' => [ + 'chromiumBinaryPath' => [ + 'default' => '', + 'description' => 'The name or path of the chrome/chromium engine.', + 'docTags' => ['see' => 'https://www.chromium.org/getting-involved/download-chromium', 'var' => 'string'], + ], + 'chromiumBrowserOptions' => [ + 'default' => ['noSandbox' => true], + 'description' => 'Chromium browser options available for the browser factory.', + 'docTags' => ['see' => 'https://github.com/chrome-php/chrome#available-options', 'var' => 'array'], ], ], ]; diff --git a/config/ConfigTemplates.php b/config/ConfigTemplates.php index c72c6f67cc03..327b5b7fb76f 100644 --- a/config/ConfigTemplates.php +++ b/config/ConfigTemplates.php @@ -2,8 +2,8 @@ /** * Main config. * - * @copyright YetiForce Sp. z o.o - * @license YetiForce Public License 4.0 (licenses/LicenseEN.txt or yetiforce.com) + * @copyright YetiForce S.A. + * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) */ return [ 'api' => [ @@ -13,59 +13,57 @@ 'validation' => function () { $arg = func_get_arg(0); return \is_array($arg) && empty(array_diff($arg, ['dav', 'webservice'])); - } + }, ], 'enableBrowser' => [ 'default' => false, 'description' => 'Dav configuration. Available: false, true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'enableCardDAV' => [ 'default' => false, 'description' => 'Dav configuration. Available: false, true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'enableCalDAV' => [ 'default' => false, 'description' => 'Dav configuration. Available: false, true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'enableWebDAV' => [ 'default' => false, 'description' => 'Dav configuration. Available: false, true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'enableEmailPortal' => [ 'default' => true, 'description' => 'Webservice config. Enabling contact notifications about the new account in the portal. Available: false, true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'ENCRYPT_DATA_TRANSFER' => [ 'default' => false, 'description' => 'Webservice config. Available: false, true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'AUTH_METHOD' => [ 'default' => 'Basic', 'description' => 'Webservice config.', - 'validation' => function () { - return 'Basic' === func_get_arg(0); - } + 'validation' => fn () => 'Basic' === func_get_arg(0), ], 'PRIVATE_KEY' => [ 'default' => 'config/private.key', - 'description' => 'Webservice config.' + 'description' => 'Webservice config.', ], 'PUBLIC_KEY' => [ 'default' => 'config/public.key', - 'description' => 'Webservice config.' - ] + 'description' => 'Webservice config.', + ], ], 'main' => [ 'USE_RTE' => [ @@ -88,11 +86,11 @@ 'site_URL' => [ 'default' => '', 'description' => 'Backslash is required at the end of URL', - 'validation' => '\App\Validator::url' + 'validation' => '\App\Validator::url', ], 'cache_dir' => [ 'default' => 'cache/', - 'description' => 'Cache directory path' + 'description' => 'Cache directory path', ], 'tmp_dir' => [ 'type' => 'function', @@ -104,11 +102,9 @@ 'description' => 'Maximum file size for uploaded files in bytes also used when uploading import files: upload_maxsize default value = 52428800 (50MB)', 'validation' => function () { $arg = func_get_arg(0); - return $arg && \App\Validator::naturalNumber($arg) && ($arg * 1048576) <= \vtlib\Functions::getMaxUploadSize(); + return $arg && \App\Validator::naturalNumber($arg) && ($arg * 1048576) <= \App\Config::getMaxUploadSize(false); }, - 'sanitization' => function () { - return (int) func_get_arg(0) * 1048576; - } + 'sanitization' => fn () => (int) func_get_arg(0) * 1048576, ], 'allow_exports' => [ 'default' => 'all', @@ -116,11 +112,11 @@ 'validation' => function () { $arg = func_get_arg(0); return \in_array($arg, ['all', 'admin', 'none']); - } + }, ], 'upload_badext' => [ 'default' => ['php', 'php3', 'php4', 'php5', 'pl', 'cgi', 'py', 'asp', 'cfm', 'js', 'vbs', 'html', 'htm', 'exe', 'bin', 'bat', 'sh', 'dll', 'phps', 'phtml', 'xhtml', 'rb', 'msi', 'jsp', 'shtml', 'sth', 'shtm'], - 'description' => 'Files with one of these extensions will have ".txt" appended to their filename on upload.' + 'description' => 'Files with one of these extensions will have ".txt" appended to their filename on upload.', ], 'list_max_entries_per_page' => [ 'default' => 20, @@ -129,9 +125,7 @@ $arg = func_get_arg(0); return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg); }, - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'default_module' => [ 'default' => 'Home', @@ -139,14 +133,12 @@ 'validation' => function () { $arg = func_get_arg(0); return true === \App\Module::isModuleActive($arg); - } + }, ], 'default_charset' => [ 'default' => 'UTF-8', 'description' => 'Default charset: default value = "UTF-8"', - 'validation' => function () { - return 'UTF-8' === func_get_arg(0); - } + 'validation' => fn () => 'UTF-8' === func_get_arg(0), ], 'default_language' => [ 'default' => 'en-US', @@ -154,14 +146,10 @@ 'validation' => '\App\Validator::languageTag', ], 'application_unique_key' => [ - 'default' => sha1(time() + random_int(1, 9999999)), + 'default' => sha1(time() . '' . random_int(1, 9999999)), 'description' => 'Unique Application Key', - 'validation' => function () { - return !class_exists('\\Config\\Main'); - }, - 'sanitization' => function () { - return sha1(time() + random_int(1, 9999999)); - } + 'validation' => fn () => !class_exists('\\Config\\Main'), + 'sanitization' => fn () => sha1(time() . '' . random_int(1, 9999999)), ], 'listview_max_textlength' => [ 'default' => 40, @@ -170,13 +158,11 @@ $arg = func_get_arg(0); return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg); }, - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'php_max_execution_time' => [ 'default' => 0, - 'description' => 'Maximum time limit for PHP script execution (in seconds)' + 'description' => 'Maximum time limit for PHP script execution (in seconds)', ], 'default_timezone' => [ 'default' => '_TIMEZONE_', @@ -184,7 +170,7 @@ 'validation' => function () { $arg = func_get_arg(0); return \in_array($arg, timezone_identifiers_list()); - } + }, ], 'title_max_length' => [ 'default' => 60, @@ -193,20 +179,16 @@ $arg = func_get_arg(0); return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg); }, - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'href_max_length' => [ - 'default' => 35, + 'default' => 50, 'description' => 'Maximum length for href tag', 'validation' => function () { $arg = func_get_arg(0); return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg); }, - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'MINIMUM_CRON_FREQUENCY' => [ 'default' => 1, @@ -215,9 +197,7 @@ $arg = func_get_arg(0); return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg); }, - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'davStorageDir' => [ 'default' => 'storage/Files', @@ -226,7 +206,7 @@ 'systemMode' => [ 'default' => 'prod', 'description' => 'System mode. Available: prod, demo, test', - 'validationValues' => ['prod', 'demo', 'test'] + 'validationValues' => ['prod', 'demo', 'test'], ], 'listMaxEntriesMassEdit' => [ 'default' => 500, @@ -235,99 +215,72 @@ $arg = func_get_arg(0); return $arg && \App\Validator::naturalNumber($arg) && (5000 >= $arg); }, - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'backgroundClosingModal' => [ 'default' => true, 'description' => 'Enable closing of modal window by clicking on the background', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'isActiveSendingMails' => [ 'default' => true, - 'description' => 'Is sending emails active?' + 'description' => 'Is sending emails active?', ], 'isActiveRecordTemplate' => [ 'default' => false, 'description' => 'Activates / deactivates batch adding of records', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'unblockedTimeoutCronTasks' => [ 'default' => true, - 'description' => 'Should the task in cron be unblocked if the script execution time was exceeded?' + 'description' => 'Should the task in cron be unblocked if the script execution time was exceeded?', ], 'maxExecutionCronTime' => [ 'default' => 3600, - 'description' => 'The maximum time of executing a cron. Recommended the same as the max_exacution_time parameter value.' + 'description' => 'The maximum time of executing a cron. Recommended the same as the max_exacution_time parameter value.', ], 'langInLoginView' => [ 'default' => false, 'description' => "System's language selection in the login window (true/false).", 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'layoutInLoginView' => [ 'default' => false, 'description' => "System's layout selection in the login window (true/false)", 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'defaultLayout' => [ 'default' => 'basic', 'description' => 'Set the default layout', - 'validation' => function () { - return isset(\App\Layout::getAllLayouts()[func_get_arg(0)]); - } - ], - 'phoneFieldAdvancedVerification' => [ - 'default' => true, - 'description' => 'Enable advanced phone number validation. Enabling it will block saving invalid phone number.' - ], - 'phoneFieldAdvancedHrefFormat' => [ - 'default' => new \Nette\PhpGenerator\PhpLiteral('\libphonenumber\PhoneNumberFormat::RFC3966'), - 'description' => "Phone number display format. Values:\nfalse - formatting is disabled \n\\libphonenumber\\PhoneNumberFormat::RFC3966 - +48-44-668-18-00\n\\libphonenumber\\PhoneNumberFormat::E164 - +48446681800 \n\\libphonenumber\\PhoneNumberFormat::INTERNATIONAL - 044 668 18 00\n\\libphonenumber\\PhoneNumberFormat::NATIONAL - +48 44 668 18 00", - 'validation' => function () { - return \in_array(func_get_arg(0), [ - false, - \libphonenumber\PhoneNumberFormat::RFC3966, - \libphonenumber\PhoneNumberFormat::E164, - \libphonenumber\PhoneNumberFormat::INTERNATIONAL, - \libphonenumber\PhoneNumberFormat::NATIONAL - ]); - } + 'validation' => fn () => isset(\App\Layout::getAllLayouts()[func_get_arg(0)]), ], 'headerAlertMessage' => [ 'default' => '', - 'description' => 'Header alert message' + 'description' => 'Header alert message', ], 'headerAlertType' => [ 'default' => '', - 'description' => 'Header alert type, ex. alert-primary, alert-danger, alert-warning, alert-info' + 'description' => 'Header alert type, ex. alert-primary, alert-danger, alert-warning, alert-info', ], 'headerAlertIcon' => [ 'default' => '', - 'description' => 'Header alert icon, ex. fas fa-exclamation-triangle, fas fa-exclamation-circle, fas fa-exclamation, far fa-question-circle, fas fa-info-circle' + 'description' => 'Header alert icon, ex. fas fa-exclamation-triangle, fas fa-exclamation-circle, fas fa-exclamation, far fa-question-circle, fas fa-info-circle', ], 'loginPageAlertMessage' => [ 'default' => '', - 'description' => 'Login page alert message' + 'description' => 'Login page alert message', ], 'loginPageAlertType' => [ 'default' => '', - 'description' => 'Login page alert type, ex. alert-primary, alert-danger, alert-warning, alert-info' + 'description' => 'Login page alert type, ex. alert-primary, alert-danger, alert-warning, alert-info', ], 'loginPageAlertIcon' => [ 'default' => '', - 'description' => 'Login page alert icon, ex. fas fa-exclamation-triangle, fas fa-exclamation-circle, fas fa-exclamation, far fa-question-circle, fas fa-info-circle' - ], - 'showRegistrationAlert' => [ - 'default' => true, - 'description' => 'Show the alert when the system is incorrectly registered', - 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'description' => 'Login page alert icon, ex. fas fa-exclamation-triangle, fas fa-exclamation-circle, fas fa-exclamation, far fa-question-circle, fas fa-info-circle', ], ], 'debug' => [ @@ -335,7 +288,7 @@ 'default' => false, 'description' => 'Enable saving logs to file. Values: false/true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'LOG_TO_PROFILE' => [ 'default' => false, @@ -343,7 +296,7 @@ ], 'LOG_PROFILE_CATEGORIES' => [ 'default' => [], - 'description' => 'Categories to be registered in profiling, an empty value means all categories. ex. "yii\db\Command::query", "Integrations/MagentoApi"' + 'description' => 'Categories to be registered in profiling, an empty value means all categories. ex. "yii\db\Command::query", "Integrations/MagentoApi"', ], 'LOG_LEVELS' => [ 'default' => false, @@ -360,49 +313,49 @@ ], 'SQL_DIE_ON_ERROR' => [ 'default' => false, - 'description' => 'Stop the running process of the system if there is an error in sql query' + 'description' => 'Stop the running process of the system if there is an error in sql query', ], 'EXCEPTION_ERROR_TO_SHOW' => [ 'default' => false, 'description' => 'Display errors', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'DISPLAY_EXCEPTION_BACKTRACE' => [ 'default' => false, 'description' => 'Displays information about the tracking code when an error occurs. Available only with the active SQL_DIE_ON_ERROR = true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'DISPLAY_EXCEPTION_LOGS' => [ 'default' => false, 'description' => 'Display logs when error exception occurs', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'EXCEPTION_ERROR_HANDLER' => [ 'default' => false, 'description' => 'Turn on/off the error handler', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'EXCEPTION_ERROR_TO_FILE' => [ 'default' => false, 'description' => 'Save logs to file (cache/logs/errors.log)', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'DISPLAY_DEBUG_CONSOLE' => [ 'default' => false, - 'description' => 'Display main debug console' + 'description' => 'Display main debug console', ], 'DISPLAY_LOGS_IN_CONSOLE' => [ 'default' => false, - 'description' => 'Enable displaying logs in debug console. Values: false/true' + 'description' => 'Enable displaying logs in debug console. Values: false/true', ], 'DISPLAY_CONFIG_IN_CONSOLE' => [ 'default' => false, - 'description' => 'Enable displaying logs in debug console. Values: false/true' + 'description' => 'Enable displaying logs in debug console. Values: false/true', ], 'DEBUG_CONSOLE_ALLOWED_IPS' => [ 'default' => false, @@ -416,15 +369,15 @@ 'default' => false, 'description' => 'Debug cron => cache/logs/cron/', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'DEBUG_VIEWER' => [ 'default' => false, - 'description' => 'Debug Viewer => cache/logs/viewer-debug.log' + 'description' => 'Debug Viewer => cache/logs/viewer-debug.log', ], 'DISPLAY_DEBUG_VIEWER' => [ 'default' => false, - 'description' => 'Display Smarty Debug Console' + 'description' => 'Display Smarty Debug Console', ], 'SMARTY_ERROR_REPORTING' => [ 'default' => new \Nette\PhpGenerator\PhpLiteral('E_ALL & ~E_NOTICE'), @@ -446,95 +399,95 @@ 'default' => true, 'description' => 'Turn on/off error debugging in javascript', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'apiShowExceptionMessages' => [ 'default' => false, 'description' => '[WebServices/API] Show exception messages in response body', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'apiShowExceptionReasonPhrase' => [ 'default' => false, 'description' => '[WebServices/API] Show exception reason phrase in response header', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'apiShowExceptionBacktrace' => [ 'default' => false, 'description' => '[WebServices/API] Show exception backtrace in response body', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'apiLogException' => [ 'default' => false, 'description' => '[WebServices/API] Log to file only exception errors in the logs', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'apiLogAllRequests' => [ 'default' => false, 'description' => '[WebServices/API] Log to file all communications data (request + response)', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], - 'DAV_DEBUG_EXCEPTIONS' => [ + 'davDebugExceptions' => [ 'default' => false, 'description' => 'API - Sabre dav - This is a flag that allows (or not) showing file, line, and code of the exception in the returned XML', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], - 'DAV_DEBUG_PLUGIN' => [ + 'davDebugPlugin' => [ 'default' => false, 'description' => 'Activate the plugin recording log in DAV', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'MAILER_DEBUG' => [ 'default' => false, 'description' => 'Mailer debug', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'ROUNDCUBE_DEBUG_LEVEL' => [ 'default' => 1, - 'description' => 'System error reporting, sum of: 1 = log; 4 = show, 8 = trace' + 'description' => 'System error reporting, sum of: 1 = log; 4 = show, 8 = trace', ], 'ROUNDCUBE_DEVEL_MODE' => [ 'default' => false, - 'description' => 'Devel_mode this will print real PHP memory usage into logs/console and do not compress JS libraries' + 'description' => 'Devel_mode this will print real PHP memory usage into logs/console and do not compress JS libraries', ], 'ROUNDCUBE_PER_USER_LOGGING' => [ 'default' => false, - 'description' => "Activate this option if logs should be written to per-user directories.\nData will only be logged if a directory cache/logs// exists and is writable." + 'description' => "Activate this option if logs should be written to per-user directories.\nData will only be logged if a directory cache/logs// exists and is writable.", ], 'ROUNDCUBE_SMTP_LOG' => [ 'default' => false, - 'description' => 'Log sent messages to cache/logs/sendmail or to syslog' + 'description' => 'Log sent messages to cache/logs/sendmail or to syslog', ], 'ROUNDCUBE_LOG_LOGINS' => [ 'default' => false, - 'description' => 'Log successful/failed logins to cache/logs/userlogins or to syslog' + 'description' => 'Log successful/failed logins to cache/logs/userlogins or to syslog', ], 'ROUNDCUBE_LOG_SESSION' => [ 'default' => false, - 'description' => 'Log session authentication errors to cache/logs/session or to syslog' + 'description' => 'Log session authentication errors to cache/logs/session or to syslog', ], 'ROUNDCUBE_SQL_DEBUG' => [ 'default' => false, - 'description' => 'Log SQL queries to cache/logs/sql or to syslog' + 'description' => 'Log SQL queries to cache/logs/sql or to syslog', ], 'ROUNDCUBE_IMAP_DEBUG' => [ 'default' => false, - 'description' => 'Log IMAP conversation to cache/logs/imap or to syslog' + 'description' => 'Log IMAP conversation to cache/logs/imap or to syslog', ], 'ROUNDCUBE_LDAP_DEBUG' => [ 'default' => false, - 'description' => 'Log LDAP conversation to cache/logs/ldap or to syslog' + 'description' => 'Log LDAP conversation to cache/logs/ldap or to syslog', ], 'ROUNDCUBE_SMTP_DEBUG' => [ 'default' => false, - 'description' => 'Log SMTP conversation to cache/logs/smtp or to syslog' + 'description' => 'Log SMTP conversation to cache/logs/smtp or to syslog', ], ], 'developer' => [ @@ -542,64 +495,68 @@ 'default' => false, 'description' => 'Turn the possibility to change generatedtype', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'MINIMIZE_JS' => [ 'default' => true, 'description' => 'Enable minimize JS files', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'MINIMIZE_CSS' => [ 'default' => true, 'description' => ' Enable minimize CSS files', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'CHANGE_VISIBILITY' => [ 'default' => false, 'description' => 'Change of fields visibility', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'CHANGE_RELATIONS' => [ 'default' => false, 'description' => 'Adding/Deleting relations between modules.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'MISSING_LIBRARY_DEV_MODE' => [ 'default' => false, 'description' => 'Developer libraries update mode', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'LANGUAGES_UPDATE_DEV_MODE' => [ 'default' => false, 'description' => 'Developer libraries update mode', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'updaterDevMode' => [ 'default' => false, 'description' => 'Developer updater mode', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' - ] + 'sanitization' => '\App\Purifier::bool', + ], ], 'layout' => [ 'breadcrumbs' => [ 'default' => true, 'description' => 'Should menu breadcrumbs be visible? true = show, false = hide', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'breadcrumbsHref' => [ 'default' => true, 'description' => 'Should the breadcrumb menu have href enabled? true = enabled, false = off', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' - ] + 'sanitization' => '\App\Purifier::bool', + ], + 'tileDefaultSize' => [ + 'default' => 'very_small', + 'description' => 'Default tile size. Available sizes: very_small, small, medium, big', + ], ], 'performance' => [ 'CACHING_DRIVER' => [ @@ -608,71 +565,71 @@ 'validation' => function () { $arg = func_get_arg(0); return 'Basic' === $arg || 'Apcu' === $arg; - } + }, ], 'ENABLE_CACHING_USERS' => [ 'default' => false, 'description' => 'Enable caching of user data', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'ENABLE_CACHING_DB_CONNECTION' => [ 'default' => false, 'description' => 'Enable caching database instance, accelerate time database connection', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'DB_DEFAULT_CHARSET_UTF8' => [ 'default' => true, 'description' => 'If database default charset is UTF-8, set this to true. This avoids executing the SET NAMES SQL for each query!', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'LISTVIEW_COMPUTE_PAGE_COUNT' => [ 'default' => false, 'description' => 'Compute list view record count while loading listview each time. Recommended value false', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'AUTO_REFRESH_RECORD_LIST_ON_SELECT_CHANGE' => [ 'default' => true, 'description' => 'Enable automatic records list refreshing while changing the value of the selection list', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SEARCH_SHOW_OWNER_ONLY_IN_LIST' => [ 'default' => false, 'description' => 'Show in search engine/filters only users and groups available in records list. It might result in a longer search time.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'INTERVAL_FOR_NOTIFICATION_NUMBER_CHECK' => [ 'default' => 100, 'description' => 'Time to update number of notifications in seconds', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'SEARCH_OWNERS_BY_AJAX' => [ 'default' => false, 'description' => 'Search owners by AJAX. We recommend selecting the "true" value if there are numerous users in the system.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SEARCH_ROLES_BY_AJAX' => [ 'default' => false, 'description' => 'Search roles by AJAX', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SEARCH_REFERENCE_BY_AJAX' => [ 'default' => false, 'description' => 'Search reference by AJAX. We recommend selecting the "true" value if there are numerous users in the system.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'MAX_NUMBER_EXPORT_RECORDS' => [ 'default' => 500, 'description' => 'Max number of exported records', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'maxMassDeleteRecords' => [ 'default' => 1000, @@ -685,125 +642,120 @@ 'OWNER_MINIMUM_INPUT_LENGTH' => [ 'default' => 2, 'description' => 'Minimum number of characters to search for record owner', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'ROLE_MINIMUM_INPUT_LENGTH' => [ 'default' => 2, 'description' => 'Minimum number of characters to search for role', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'NUMBERS_EMAILS_DOWNLOADED_DURING_ONE_SCANNING' => [ 'default' => 100, 'description' => 'The numbers of emails downloaded during one scanning', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CRON_MAX_NUMBERS_RECORD_PRIVILEGES_UPDATER' => [ 'default' => 1000000, 'description' => 'The maximum number of global search permissions that cron can update during a single execution', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CRON_MAX_NUMBERS_RECORD_ADDRESS_BOOK_UPDATER' => [ 'default' => 10000, 'description' => 'The maximum number of records in address book to be updated in cron', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CRON_MAX_NUMBERS_RECORD_LABELS_UPDATER' => [ 'default' => 10000, 'description' => 'The maximum number of record labels that cron can update during a single execution', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CRON_MAX_NUMBERS_SENDING_MAILS' => [ 'default' => 1000, 'description' => 'The maximum number of emails that cron can send during a single execution. Pay attention to the server limits.', - 'validation' => '\App\Validator::naturalNumber' - ], - 'CRON_MAX_NUMBERS_SENDING_SMS' => [ - 'default' => 10, - 'description' => 'The maximum number of sms that cron can send during a single execution', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CRON_MAX_ATACHMENTS_DELETE' => [ 'default' => 1000, 'description' => 'The maximum number of attachments that cron can delete during a single execution', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'LOAD_CUSTOM_FILES' => [ 'default' => false, 'description' => "Parameter that allows to disable file overwriting.\nAfter enabling it the system will additionally check whether the file exists in the custom directory. Ex. custom/modules/Assets/Assets.php.", 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SHOW_ADMIN_PANEL' => [ 'default' => false, 'description' => 'Parameter that determines whether admin panel should be available to admin by default', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SHOW_ADMINISTRATORS_IN_USERS_LIST' => [ 'default' => true, 'description' => 'Display administrators in the list of users (Assigned To)', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'GLOBAL_SEARCH' => [ 'default' => true, 'description' => 'Global search: true/false', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'BROWSING_HISTORY_WORKING' => [ 'default' => true, 'description' => 'Browsing history working if true', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'BROWSING_HISTORY_VIEW_LIMIT' => [ 'default' => 20, 'description' => 'Number of browsing history steps', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'BROWSING_HISTORY_DELETE_AFTER' => [ 'default' => 7, 'description' => 'Number of days after which browsing history will be deleted', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'SESSION_DRIVER' => [ 'default' => 'File', 'description' => 'Session handler name, handler dir: app/Session/', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CHART_MULTI_FILTER_LIMIT' => [ 'default' => 5, 'description' => 'Charts multi filter limit', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'CHART_ADDITIONAL_FILTERS_LIMIT' => [ 'default' => 6, 'description' => "Additional filters limit for ChartFilter's", - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'MAX_MERGE_RECORDS' => [ 'default' => 4, 'description' => 'Maximum number of merged records', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'ACCESS_TO_INTERNET' => [ 'default' => true, 'description' => 'Can CRM have access to the Internet?', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'CHANGE_LOCALE' => [ 'default' => true, 'description' => 'Change the locale for sort the data', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'INVENTORY_EDIT_VIEW_LAYOUT' => [ 'default' => true, 'description' => 'Is divided layout style on edit view in modules with products', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'MODULES_SPLITTED_EDIT_VIEW_LAYOUT' => [ 'default' => [], @@ -811,18 +763,12 @@ 'validation' => function () { $arg = func_get_arg(0); return \is_array($arg) && array_diff($arg, App\Module::getAllModuleNames()); - } + }, ], 'RECORD_POPOVER_DELAY' => [ 'default' => 500, 'description' => "Popover record's trigger delay in ms", - 'validation' => '\App\Validator::naturalNumber' - ], - 'PICKLIST_DEPENDENCY_DEFAULT_EMPTY' => [ - 'default' => true, - 'description' => 'Empty value when there is selected item in picklist dependency', - 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'validation' => '\App\Validator::naturalNumber', ], 'picklistLimit' => [ 'default' => 50, @@ -831,27 +777,41 @@ ], 'recursiveTranslate' => [ 'default' => false, - 'description' => 'If there is no translation in the chosen language, then get from the default language.' + 'description' => 'If there is no translation in the chosen language, then get from the default language.', ], 'quickEditLayout' => [ 'default' => 'blocks', 'description' => 'Parameter defining how fields are displayed in quick edit. Available values: standard,blocks,vertical', - 'validationValues' => ['blocks', 'standard', 'vertical'] + 'validationValues' => ['blocks', 'standard', 'vertical'], ], 'quickCreateLayout' => [ 'default' => 'blocks', 'description' => 'Parameter defining how fields are displayed in quick create. Available values: blocks,standard', - 'validationValues' => ['blocks', 'standard'] + 'validationValues' => ['blocks', 'standard'], ], 'REPORT_RECORD_NUMBERS' => [ 'default' => 10, 'description' => 'Number of records that can be shown in report mail', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'LOGIN_HISTORY_VIEW_LIMIT' => [ 'default' => 30, 'description' => 'Number of records that can be shown in history login modal', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', + ], + 'recordActivityNotifier' => [ + 'default' => false, + 'description' => 'Functionality notifying about activity on the record', + 'validation' => '\App\Validator::bool', + 'sanitization' => '\App\Purifier::bool', + 'docTags' => ['var' => 'bool'], + ], + 'recordActivityNotifierInterval' => [ + 'default' => 5, + 'description' => 'Interval for Record activity notifier', + 'validation' => '\App\Validator::naturalNumber', + 'sanitization' => '\App\Purifier::naturalNumber', + 'docTags' => ['var' => 'int Number of seconds'], ], ], 'relation' => [ @@ -859,39 +819,37 @@ 'default' => 20, 'description' => 'Maximum length of a comment visible in the related module', 'validation' => '\App\Validator::naturalNumber', - 'sanitization' => function () { - return (int) func_get_arg(0); - } + 'sanitization' => fn () => (int) func_get_arg(0), ], 'SHOW_RELATED_MODULE_NAME' => [ 'default' => true, 'description' => 'Show related modules names', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SHOW_RELATED_ICON' => [ 'default' => true, 'description' => 'Show related modules icon', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SHOW_RECORDS_COUNT' => [ 'default' => false, 'description' => 'Show record count in tabs of related modules', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'addSearchParamsToCreateView' => [ 'default' => true, 'description' => 'Fill in the record creation form with the data used in filtering (search_params)', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'separateChangeRelationButton' => [ 'default' => false, 'description' => 'Separate change relation button in related module', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], ], 'search' => [ @@ -899,7 +857,7 @@ 'default' => true, 'description' => 'Auto select current module in global search (true/false)', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'GLOBAL_SEARCH_MODAL_MAX_NUMBER_RESULT' => [ 'default' => 100, @@ -912,13 +870,13 @@ 'validation' => function () { $arg = func_get_arg(0); return \is_int($arg) && \in_array($arg, [0, 1, 2]); - } + }, ], 'GLOBAL_SEARCH_CURRENT_MODULE_TO_TOP' => [ 'default' => true, 'description' => 'Global search - Show current module as first in search results (true/false).', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'GLOBAL_SEARCH_AUTOCOMPLETE' => [ 'default' => 1, @@ -926,23 +884,23 @@ 'validation' => function () { $arg = func_get_arg(0); return \is_int($arg) && \in_array($arg, [0, 1]); - } + }, ], 'GLOBAL_SEARCH_AUTOCOMPLETE_LIMIT' => [ 'default' => 15, 'description' => 'Global search - Max number of displayed results. The parameter impacts system efficiency.', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'GLOBAL_SEARCH_AUTOCOMPLETE_MIN_LENGTH' => [ 'default' => 3, 'description' => 'Global search - The minimum number of characters a user must type before a search is performed. The parameter impacts system efficiency', - 'validation' => '\App\Validator::naturalNumber' + 'validation' => '\App\Validator::naturalNumber', ], 'GLOBAL_SEARCH_OPERATOR_SELECT' => [ 'default' => true, 'description' => 'Global search - Show operator list.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'LIST_ENTITY_STATE_COLOR' => [ 'default' => [ @@ -957,9 +915,7 @@ 'encryptionPass' => [ 'default' => 'yeti', 'description' => 'Key to encrypt passwords, changing the key results in the loss of all encrypted data.', - 'validation' => function () { - return true; - } + 'validation' => fn () => true, ], 'encryptionMethod' => [ 'default' => 'aes-256-cbc', @@ -967,67 +923,67 @@ 'validation' => function () { $arg = func_get_arg(0); return empty($arg) || ($arg && \in_array($arg, \App\Encryption::getMethods())); - } + }, ], ], 'security' => [ 'USER_ENCRYPT_PASSWORD_COST' => [ 'default' => 10, - 'description' => "Password encrypt algorithmic cost. Numeric values - we recommend values greater than 10.\nThe greater the value, the longer it takes to encrypt the password." + 'description' => "Password encrypt algorithmic cost. Numeric values - we recommend values greater than 10.\nThe greater the value, the longer it takes to encrypt the password.", ], 'RESET_LOGIN_PASSWORD' => [ 'default' => false, 'description' => 'Possible to reset the password while logging in (true/false)', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'SHOW_MY_PREFERENCES' => [ 'default' => true, 'description' => 'Show my preferences', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'CHANGE_LOGIN_PASSWORD' => [ 'default' => true, 'description' => 'Changing the settings by the user is possible true/false', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'PERMITTED_BY_ROLES' => [ 'default' => true, 'description' => 'Permitted by roles.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'PERMITTED_BY_SHARING' => [ 'default' => true, 'description' => 'Permitted by sharing.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'PERMITTED_BY_SHARED_OWNERS' => [ 'default' => true, 'description' => 'Permitted by shared owners.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'PERMITTED_BY_RECORD_HIERARCHY' => [ 'default' => true, 'description' => 'Permitted by record hierarchy.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'PERMITTED_BY_ADVANCED_PERMISSION' => [ 'default' => true, 'description' => 'Permitted by advanced permission.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'PERMITTED_BY_PRIVATE_FIELD' => [ 'default' => true, 'description' => 'Permitted by private field.', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'permittedModulesByCreatorField' => [ 'default' => [], @@ -1035,25 +991,25 @@ 'validation' => function () { $arg = func_get_arg(0); return \is_array($arg) && array_diff($arg, App\Module::getAllModuleNames()); - } + }, ], 'permittedWriteAccessByCreatorField' => [ 'default' => false, 'description' => 'Permission level access based on the record creation', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'CACHING_PERMISSION_TO_RECORD' => [ 'default' => false, 'description' => "Configuration of the permission mechanism on records list.\ntrue - Permissions based on the users column in vtiger_crmentity.\n Permissions are not verified in real time. They are updated via cron.\n We do not recommend using this option in production environments.\nfalse - Permissions based on adding tables with permissions to query (old mechanism).", 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'EMAIL_FIELD_RESTRICTED_DOMAINS_ACTIVE' => [ 'default' => false, 'description' => "Restricted domains allow you to block saving an email address from a given domain in the system.\nRestricted domains work only for email address type fields.", 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'EMAIL_FIELD_RESTRICTED_DOMAINS_VALUES' => [ 'default' => [], @@ -1071,34 +1027,34 @@ 'default' => false, 'description' => 'Remember user credentials', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'fieldsReferencesDependent' => [ 'default' => false, 'description' => 'Interdependent reference fields', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'maxLifetimeSession' => [ 'default' => 900, 'description' => 'Lifetime session (in seconds)', - 'validation' => '\App\Validator::integer' + 'validation' => '\App\Validator::integer', ], 'maxLifetimeSessionCookie' => [ 'default' => 0, 'description' => "Specifies the lifetime of the cookie in seconds which is sent to the browser. The value 0 means 'until the browser is closed.'\nHow much time can someone be logged in to the browser. Defaults to 0.", - 'validation' => '\App\Validator::integer' + 'validation' => '\App\Validator::integer', ], 'loginSessionRegenerate' => [ 'default' => true, 'description' => 'Update the current session id with a newly generated one after login and logout', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'cookieSameSite' => [ 'default' => 'Strict', 'description' => "Same-site cookie attribute allows a web application to advise the browser that cookies should only be sent if the request originates from the website the cookie came from.\nValues: None, Lax, Strict", - 'validationValues' => ['None', 'Lax', 'Strict'] + 'validationValues' => ['None', 'Lax', 'Strict'], ], 'cookieForceHttpOnly' => [ 'default' => true, @@ -1106,17 +1062,17 @@ 'validation' => function () { $arg = func_get_arg(0); return null === $arg ? $arg : \is_bool($arg); - } + }, ], 'apiLifetimeSessionCreate' => [ 'default' => 1440, 'description' => 'Maximum session lifetime from the time it was created (in minutes)', - 'validation' => '\App\Validator::integer' + 'validation' => '\App\Validator::integer', ], 'apiLifetimeSessionUpdate' => [ 'default' => 240, 'description' => 'Maximum session lifetime since the last modification (in minutes)', - 'validation' => '\App\Validator::integer' + 'validation' => '\App\Validator::integer', ], 'USER_AUTHY_MODE' => [ 'default' => 'TOTP_OPTIONAL', @@ -1124,12 +1080,12 @@ 'validation' => function () { $arg = func_get_arg(0); return \in_array($arg, \Users_Totp_Authmethod::ALLOWED_USER_AUTHY_MODE); - } + }, ], 'whitelistIp2fa' => [ 'default' => [], 'description' => "IP address whitelisting.\nAllow access without 2FA.", - 'validation' => '\App\Validator::ip' + 'validation' => '\App\Validator::ip', ], 'CACHE_LIFETIME_SENSIOLABS_SECURITY_CHECKER' => [ 'default' => 3600, @@ -1138,43 +1094,53 @@ ], 'forceHttpsRedirection' => [ 'default' => false, - 'description' => 'Force site access to always occur under SSL (https) for selected areas. You will not be able to access selected areas under non-ssl. Note, you must have SSL enabled on your server to utilise this option.' + 'description' => 'Force site access to always occur under SSL (https) for selected areas. You will not be able to access selected areas under non-ssl. Note, you must have SSL enabled on your server to utilise this option.', ], 'forceUrlRedirection' => [ 'default' => true, - 'description' => 'Redirect to proper url when wrong url is entered.' + 'description' => 'Redirect to proper url when wrong url is entered.', ], 'hpkpKeysHeader' => [ 'default' => [], 'description' => "HTTP Public-Key-Pins (HPKP) pin-sha256 For HPKP to work properly at least 2 keys are needed.\nhttps://scotthelme.co.uk/hpkp-http-public-key-pinning/, https://sekurak.pl/mechanizm-http-public-key-pinning/.", ], + 'verifyRefererHeader' => [ + 'default' => true, + 'description' => 'Verify referer header', + ], 'csrfActive' => [ 'default' => true, 'description' => 'Enable CSRF protection', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', + ], + 'csrfLifetimeToken' => [ + 'default' => 28800, + 'description' => 'Default expire time of CSRF token in seconds', + 'validation' => '\App\Validator::naturalNumber', + 'sanitization' => '\App\Purifier::naturalNumber', ], 'csrfFrameBreaker' => [ 'default' => true, 'description' => 'Enable verified frame protection, used in CSRF', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'csrfFrameBreakerWindow' => [ 'default' => 'top', 'description' => 'Which window should be verified? It is used to check if the system is loaded in the frame, used in CSRF.', - 'validationValues' => ['top', 'parent'] + 'validationValues' => ['top', 'parent'], ], 'cspHeaderActive' => [ 'default' => true, 'description' => 'HTTP Content Security Policy response header allows website administrators to control resources the user agent is allowed to load for a given page', - 'validation' => '\App\Validator::alnumSpace' + 'validation' => '\App\Validator::alnumSpace', ], 'cspHeaderTokenTime' => [ 'default' => '5 minutes', 'description' => 'HTTP Content Security Policy time interval for generating a new nonce token', 'validation' => '\App\Validator::bool', - 'sanitization' => '\App\Purifier::bool' + 'sanitization' => '\App\Purifier::bool', ], 'allowedImageDomains' => [ 'default' => [], @@ -1184,7 +1150,7 @@ ], 'allowedFrameDomains' => [ 'default' => [], - 'description' => 'Allowed domains for loading frame, used in CSP and validate referer.', + 'description' => "Specifies valid parents that may embed a page using , + {/if}
-
{\App\Language::translate('LBL_MAIL_CONTENT', $LANG_MODULE_NAME)}
+
{\App\Language::translate('LBL_MAIL_HEADERS', $LANG_MODULE_NAME)}
- - {/if} -
-
{\App\Language::translate('LBL_MAIL_HEADERS', $LANG_MODULE_NAME)}
-
-
{\App\Purifier::encodeHtml(trim($RECORD->get('header')))}
+
{\App\Purifier::encodeHtml(trim($RECORD->get('header')))}
- - + + {/strip} diff --git a/layouts/basic/components/MailMessageAnalysisModalHeader.tpl b/layouts/basic/components/MailMessageAnalysisModalHeader.tpl index 7aa809d2b45b..67fc19211cc2 100644 --- a/layouts/basic/components/MailMessageAnalysisModalHeader.tpl +++ b/layouts/basic/components/MailMessageAnalysisModalHeader.tpl @@ -1,51 +1,53 @@ -{**} +{**} {strip} - -