cycode 1.4.1.dev9__tar.gz → 1.4.1.dev11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/PKG-INFO +1 -1
- cycode-1.4.1.dev11/cycode/__init__.py +1 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/consts.py +3 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/sca_table_printer.py +60 -14
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/pyproject.toml +1 -1
- cycode-1.4.1.dev9/cycode/__init__.py +0 -1
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/README.md +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/auth/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/auth/auth_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/auth/auth_manager.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/ci_integrations.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/code_scanner.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/configure/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/configure/configure_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/ignore/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/ignore/ignore_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/report_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/common.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/handle_errors.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_path_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_report_file.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_repository_url_command.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/config.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/config.yaml +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/exceptions/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/exceptions/custom_exceptions.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/excluder.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/iac/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/models/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/path_documents.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/repository_documents.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/base_restore_maven_dependencies.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/sca_code_scanner.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/zip_documents.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/main.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/models.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/console_printer.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/json_printer.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/printer_base.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table_models.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table_printer.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table_printer_base.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/text_printer.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/base_file_manager.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/config_file_manager.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/configuration_manager.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/credentials_manager.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/enum_utils.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/get_api_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/path_utils.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/progress_bar.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/scan_batch.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/scan_utils.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/shell_executor.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/string_utils.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/task_timer.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/yaml_utils.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/__init__.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/auth_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/client_creator.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/config.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/config.yaml +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/config_dev.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_client_base.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_dev_based_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_token_based_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/models.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/report_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/scan_client.py +0 -0
- {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/scan_config_base.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '1.4.1.dev11' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
|
|
@@ -79,6 +79,8 @@ SCA_CONFIGURATION_SCAN_SUPPORTED_FILES = (
|
|
|
79
79
|
'pipfile.lock',
|
|
80
80
|
'requirements.txt',
|
|
81
81
|
'setup.py',
|
|
82
|
+
'mix.exs',
|
|
83
|
+
'mix.lock',
|
|
82
84
|
)
|
|
83
85
|
|
|
84
86
|
SCA_EXCLUDED_PATHS = ('node_modules',)
|
|
@@ -97,6 +99,7 @@ PROJECT_FILES_BY_ECOSYSTEM_MAP = {
|
|
|
97
99
|
'pypi_pipenv': ['Pipfile', 'Pipfile.lock'],
|
|
98
100
|
'pypi_requirements': ['requirements.txt'],
|
|
99
101
|
'pypi_setup': ['setup.py'],
|
|
102
|
+
'hex': ['mix.exs', 'mix.lock'],
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES = [SECRET_SCAN_TYPE, SCA_SCAN_TYPE]
|
|
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Dict, List
|
|
|
4
4
|
import click
|
|
5
5
|
|
|
6
6
|
from cycode.cli.consts import LICENSE_COMPLIANCE_POLICY_ID, PACKAGE_VULNERABILITY_POLICY_ID
|
|
7
|
-
from cycode.cli.models import Detection
|
|
7
|
+
from cycode.cli.models import Detection, Severity
|
|
8
8
|
from cycode.cli.printers.tables.table import Table
|
|
9
9
|
from cycode.cli.printers.tables.table_models import ColumnInfoBuilder, ColumnWidths
|
|
10
10
|
from cycode.cli.printers.tables.table_printer_base import TablePrinterBase
|
|
@@ -19,21 +19,21 @@ column_builder = ColumnInfoBuilder()
|
|
|
19
19
|
# Building must have strict order. Represents the order of the columns in the table (from left to right)
|
|
20
20
|
SEVERITY_COLUMN = column_builder.build(name='Severity')
|
|
21
21
|
REPOSITORY_COLUMN = column_builder.build(name='Repository')
|
|
22
|
-
|
|
23
|
-
FILE_PATH_COLUMN = column_builder.build(name='File Path')
|
|
22
|
+
CODE_PROJECT_COLUMN = column_builder.build(name='Code Project') # File path to manifest file
|
|
24
23
|
ECOSYSTEM_COLUMN = column_builder.build(name='Ecosystem')
|
|
25
|
-
|
|
26
|
-
DIRECT_DEPENDENCY_COLUMN = column_builder.build(name='Direct Dependency')
|
|
27
|
-
DEVELOPMENT_DEPENDENCY_COLUMN = column_builder.build(name='Development Dependency')
|
|
28
|
-
DEPENDENCY_PATHS_COLUMN = column_builder.build(name='Dependency Paths')
|
|
29
|
-
|
|
24
|
+
PACKAGE_COLUMN = column_builder.build(name='Package')
|
|
30
25
|
CVE_COLUMNS = column_builder.build(name='CVE')
|
|
26
|
+
DEPENDENCY_PATHS_COLUMN = column_builder.build(name='Dependency Paths')
|
|
31
27
|
UPGRADE_COLUMN = column_builder.build(name='Upgrade')
|
|
32
28
|
LICENSE_COLUMN = column_builder.build(name='License')
|
|
29
|
+
DIRECT_DEPENDENCY_COLUMN = column_builder.build(name='Direct Dependency')
|
|
30
|
+
DEVELOPMENT_DEPENDENCY_COLUMN = column_builder.build(name='Development Dependency')
|
|
31
|
+
|
|
33
32
|
|
|
34
33
|
COLUMN_WIDTHS_CONFIG: ColumnWidths = {
|
|
35
34
|
REPOSITORY_COLUMN: 2,
|
|
36
|
-
|
|
35
|
+
CODE_PROJECT_COLUMN: 2,
|
|
36
|
+
PACKAGE_COLUMN: 3,
|
|
37
37
|
CVE_COLUMNS: 5,
|
|
38
38
|
UPGRADE_COLUMN: 3,
|
|
39
39
|
LICENSE_COLUMN: 2,
|
|
@@ -47,7 +47,7 @@ class ScaTablePrinter(TablePrinterBase):
|
|
|
47
47
|
table = self._get_table(policy_id)
|
|
48
48
|
table.set_cols_width(COLUMN_WIDTHS_CONFIG)
|
|
49
49
|
|
|
50
|
-
for detection in detections:
|
|
50
|
+
for detection in self._sort_and_group_detections(detections):
|
|
51
51
|
self._enrich_table_with_values(table, detection)
|
|
52
52
|
|
|
53
53
|
self._print_summary_issues(len(detections), self._get_title(policy_id))
|
|
@@ -64,6 +64,52 @@ class ScaTablePrinter(TablePrinterBase):
|
|
|
64
64
|
|
|
65
65
|
return 'Unknown'
|
|
66
66
|
|
|
67
|
+
@staticmethod
|
|
68
|
+
def __group_by(detections: List[Detection], details_field_name: str) -> Dict[str, List[Detection]]:
|
|
69
|
+
grouped = defaultdict(list)
|
|
70
|
+
for detection in detections:
|
|
71
|
+
grouped[detection.detection_details.get(details_field_name)].append(detection)
|
|
72
|
+
return grouped
|
|
73
|
+
|
|
74
|
+
@staticmethod
|
|
75
|
+
def __severity_sort_key(detection: Detection) -> int:
|
|
76
|
+
severity = detection.detection_details.get('advisory_severity')
|
|
77
|
+
return Severity.try_get_value(severity)
|
|
78
|
+
|
|
79
|
+
def _sort_detections_by_severity(self, detections: List[Detection]) -> List[Detection]:
|
|
80
|
+
return sorted(detections, key=self.__severity_sort_key, reverse=True)
|
|
81
|
+
|
|
82
|
+
@staticmethod
|
|
83
|
+
def __package_sort_key(detection: Detection) -> int:
|
|
84
|
+
return detection.detection_details.get('package_name')
|
|
85
|
+
|
|
86
|
+
def _sort_detections_by_package(self, detections: List[Detection]) -> List[Detection]:
|
|
87
|
+
return sorted(detections, key=self.__package_sort_key)
|
|
88
|
+
|
|
89
|
+
def _sort_and_group_detections(self, detections: List[Detection]) -> List[Detection]:
|
|
90
|
+
"""Sort detections by severity and group by repository, code project and package name.
|
|
91
|
+
|
|
92
|
+
Note:
|
|
93
|
+
Code Project is path to manifest file.
|
|
94
|
+
|
|
95
|
+
Grouping by code projects also groups by ecosystem.
|
|
96
|
+
Because manifest files are unique per ecosystem.
|
|
97
|
+
"""
|
|
98
|
+
result = []
|
|
99
|
+
|
|
100
|
+
# we sort detections by package name to make persist output order
|
|
101
|
+
sorted_detections = self._sort_detections_by_package(detections)
|
|
102
|
+
|
|
103
|
+
grouped_by_repository = self.__group_by(sorted_detections, 'repository_name')
|
|
104
|
+
for repository_group in grouped_by_repository.values():
|
|
105
|
+
grouped_by_code_project = self.__group_by(repository_group, 'file_name')
|
|
106
|
+
for code_project_group in grouped_by_code_project.values():
|
|
107
|
+
grouped_by_package = self.__group_by(code_project_group, 'package_name')
|
|
108
|
+
for package_group in grouped_by_package.values():
|
|
109
|
+
result.extend(self._sort_detections_by_severity(package_group))
|
|
110
|
+
|
|
111
|
+
return result
|
|
112
|
+
|
|
67
113
|
def _get_table(self, policy_id: str) -> Table:
|
|
68
114
|
table = Table()
|
|
69
115
|
|
|
@@ -77,9 +123,9 @@ class ScaTablePrinter(TablePrinterBase):
|
|
|
77
123
|
if self._is_git_repository():
|
|
78
124
|
table.add(REPOSITORY_COLUMN)
|
|
79
125
|
|
|
80
|
-
table.add(
|
|
126
|
+
table.add(CODE_PROJECT_COLUMN)
|
|
81
127
|
table.add(ECOSYSTEM_COLUMN)
|
|
82
|
-
table.add(
|
|
128
|
+
table.add(PACKAGE_COLUMN)
|
|
83
129
|
table.add(DIRECT_DEPENDENCY_COLUMN)
|
|
84
130
|
table.add(DEVELOPMENT_DEPENDENCY_COLUMN)
|
|
85
131
|
table.add(DEPENDENCY_PATHS_COLUMN)
|
|
@@ -93,9 +139,9 @@ class ScaTablePrinter(TablePrinterBase):
|
|
|
93
139
|
table.set(SEVERITY_COLUMN, detection_details.get('advisory_severity'))
|
|
94
140
|
table.set(REPOSITORY_COLUMN, detection_details.get('repository_name'))
|
|
95
141
|
|
|
96
|
-
table.set(
|
|
142
|
+
table.set(CODE_PROJECT_COLUMN, detection_details.get('file_name'))
|
|
97
143
|
table.set(ECOSYSTEM_COLUMN, detection_details.get('ecosystem'))
|
|
98
|
-
table.set(
|
|
144
|
+
table.set(PACKAGE_COLUMN, detection_details.get('package_name'))
|
|
99
145
|
table.set(DIRECT_DEPENDENCY_COLUMN, detection_details.get('is_direct_dependency_str'))
|
|
100
146
|
table.set(DEVELOPMENT_DEPENDENCY_COLUMN, detection_details.get('is_dev_dependency_str'))
|
|
101
147
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "cycode"
|
|
3
|
-
version = "1.4.1.
|
|
3
|
+
version = "1.4.1.dev11" # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
|
|
4
4
|
description = "Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning."
|
|
5
5
|
keywords=["secret-scan", "cycode", "devops", "token", "secret", "security", "cycode", "code"]
|
|
6
6
|
authors = ["Cycode <support@cycode.com>"]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '1.4.1.dev9' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_path_command.py
RENAMED
|
File without changes
|
{cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_report_file.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/iac/tf_content_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|