pyhw 0.15.0__tar.gz → 0.15.2__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.
Files changed (136) hide show
  1. {pyhw-0.15.0/src/pyhw.egg-info → pyhw-0.15.2}/PKG-INFO +2 -2
  2. {pyhw-0.15.0 → pyhw-0.15.2}/pyproject.toml +2 -2
  3. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/__init__.py +1 -1
  4. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/frontendBase.py +76 -15
  5. {pyhw-0.15.0 → pyhw-0.15.2/src/pyhw.egg-info}/PKG-INFO +2 -2
  6. pyhw-0.15.2/src/pyhw.egg-info/requires.txt +1 -0
  7. pyhw-0.15.0/src/pyhw.egg-info/requires.txt +0 -1
  8. {pyhw-0.15.0 → pyhw-0.15.2}/LICENSE +0 -0
  9. {pyhw-0.15.0 → pyhw-0.15.2}/README.md +0 -0
  10. {pyhw-0.15.0 → pyhw-0.15.2}/setup.cfg +0 -0
  11. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/__main__.py +0 -0
  12. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/__init__.py +0 -0
  13. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/backendBase.py +0 -0
  14. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/__init__.py +0 -0
  15. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/bsd.py +0 -0
  16. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/cpuBase.py +0 -0
  17. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/cpuInfo.py +0 -0
  18. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/linux.py +0 -0
  19. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/macos.py +0 -0
  20. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/cpu/windows.py +0 -0
  21. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/__init__.py +0 -0
  22. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/bsd.py +0 -0
  23. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/gpuBase.py +0 -0
  24. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/gpuInfo.py +0 -0
  25. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/linux.py +0 -0
  26. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/macos.py +0 -0
  27. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/gpu/windows.py +0 -0
  28. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/__init__.py +0 -0
  29. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/bsd.py +0 -0
  30. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/hostBase.py +0 -0
  31. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/hostInfo.py +0 -0
  32. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/linux.py +0 -0
  33. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/macos.py +0 -0
  34. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/host/windows.py +0 -0
  35. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/kernel/__init__.py +0 -0
  36. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/kernel/kernelBase.py +0 -0
  37. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/kernel/kernelInfo.py +0 -0
  38. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/kernel/unix.py +0 -0
  39. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/kernel/windows.py +0 -0
  40. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/__init__.py +0 -0
  41. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/bsd.py +0 -0
  42. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/linux.py +0 -0
  43. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/macos.py +0 -0
  44. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/memoryBase.py +0 -0
  45. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/memoryInfo.py +0 -0
  46. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/memory/windows.py +0 -0
  47. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/__init__.py +0 -0
  48. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/bsd.py +0 -0
  49. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/linux.py +0 -0
  50. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/macos.py +0 -0
  51. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/nicBase.py +0 -0
  52. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/nicInfo.py +0 -0
  53. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/nic/windows.py +0 -0
  54. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/__init__.py +0 -0
  55. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/bsd.py +0 -0
  56. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/linux.py +0 -0
  57. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/macos.py +0 -0
  58. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/npuBase.py +0 -0
  59. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/npuInfo.py +0 -0
  60. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/npu/windows.py +0 -0
  61. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/__init__.py +0 -0
  62. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/bsd.py +0 -0
  63. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/linux.py +0 -0
  64. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/macos.py +0 -0
  65. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/osBase.py +0 -0
  66. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/osInfo.py +0 -0
  67. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/os/windows.py +0 -0
  68. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/shell/__init__.py +0 -0
  69. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/shell/shellBase.py +0 -0
  70. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/shell/shellInfo.py +0 -0
  71. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/shell/unix.py +0 -0
  72. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/shell/windows.py +0 -0
  73. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/title/__init__.py +0 -0
  74. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/title/titleBase.py +0 -0
  75. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/title/titleInfo.py +0 -0
  76. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/title/unix.py +0 -0
  77. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/title/windows.py +0 -0
  78. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/__init__.py +0 -0
  79. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/bsd.py +0 -0
  80. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/linux.py +0 -0
  81. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/macos.py +0 -0
  82. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/uptimeBase.py +0 -0
  83. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/uptimeInfo.py +0 -0
  84. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/backend/uptime/windows.py +0 -0
  85. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/__init__.py +0 -0
  86. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/color/__init__.py +0 -0
  87. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/color/colorConfig.py +0 -0
  88. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/color/colorSet.py +0 -0
  89. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/color/colorUtil.py +0 -0
  90. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/__init__.py +0 -0
  91. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/alpine.pyhw +0 -0
  92. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/arch.pyhw +0 -0
  93. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/armbian.pyhw +0 -0
  94. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/centos.pyhw +0 -0
  95. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/debian.pyhw +0 -0
  96. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/fedora.pyhw +0 -0
  97. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/fedora_small.pyhw +0 -0
  98. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/freebsd.pyhw +0 -0
  99. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/kali.pyhw +0 -0
  100. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/linux.pyhw +0 -0
  101. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/linuxmint.pyhw +0 -0
  102. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/macOS.pyhw +0 -0
  103. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/opensuse-leap.pyhw +0 -0
  104. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/opensuse-tumbleweed.pyhw +0 -0
  105. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/raspbian.pyhw +0 -0
  106. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/rhel.pyhw +0 -0
  107. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/ubuntu.pyhw +0 -0
  108. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/ubuntu_small.pyhw +0 -0
  109. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/windows_10.pyhw +0 -0
  110. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/windows_11.pyhw +0 -0
  111. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/windows_2025.pyhw +0 -0
  112. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/ascii/windows_old.pyhw +0 -0
  113. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/frontend/logo/logoBase.py +0 -0
  114. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/lib/iokitCPULib.dylib +0 -0
  115. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/lib/iokitGPULib.dylib +0 -0
  116. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/lib/iokitHostLib.dylib +0 -0
  117. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/lib/iokitNICLib.dylib +0 -0
  118. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/lib/nvmlGPULib_amd64.so +0 -0
  119. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/lib/nvmlGPULib_arm64.so +0 -0
  120. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/test/iokitCPULibTest.py +0 -0
  121. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/test/iokitGPULibTest.py +0 -0
  122. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/test/iokitHostLibTest.py +0 -0
  123. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/test/iokitNICLibTest.py +0 -0
  124. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/library/test/nvmlGPULibTest.py +0 -0
  125. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwException/__init__.py +0 -0
  126. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwException/pyhwException.py +0 -0
  127. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwUtil/__init__.py +0 -0
  128. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwUtil/cliUtil.py +0 -0
  129. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwUtil/pciUtil.py +0 -0
  130. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwUtil/pyhwUtil.py +0 -0
  131. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw/pyhwUtil/sysctlUtil.py +0 -0
  132. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw.egg-info/SOURCES.txt +0 -0
  133. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw.egg-info/dependency_links.txt +0 -0
  134. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw.egg-info/entry_points.txt +0 -0
  135. {pyhw-0.15.0 → pyhw-0.15.2}/src/pyhw.egg-info/top_level.txt +0 -0
  136. {pyhw-0.15.0 → pyhw-0.15.2}/test/test_cliUtil.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyhw
3
- Version: 0.15.0
3
+ Version: 0.15.2
4
4
  Summary: PyHw, a neofetch-like command line tool for fetching system information but written mostly in python.
5
5
  Author: Xiao Ran
6
6
  Maintainer-email: Xiao Ran <xiaoran.007@icloud.com>
@@ -13,7 +13,7 @@ Classifier: Operating System :: OS Independent
13
13
  Requires-Python: >=3.9
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: pypci-ng>=0.2.6
16
+ Requires-Dist: pypci-ng>=0.2.7
17
17
  Dynamic: license-file
18
18
 
19
19
  # PyHw, a neofetch-like system information fetching tool
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyhw"
7
- version = "0.15.0"
7
+ version = "0.15.2"
8
8
  description = "PyHw, a neofetch-like command line tool for fetching system information but written mostly in python."
9
9
  keywords = ["neofetch", "system information", "command line tool", "python", "hardware information", "fastfetch", "fetching"]
10
10
  authors = [
@@ -17,7 +17,7 @@ readme = "README.md"
17
17
  license = "BSD-3-Clause"
18
18
  requires-python = ">=3.9"
19
19
  dependencies = [
20
- "pypci-ng>=0.2.6"
20
+ "pypci-ng>=0.2.7"
21
21
  ]
22
22
  classifiers = [
23
23
  "Development Status :: 4 - Beta",
@@ -1,2 +1,2 @@
1
- __version__ = '0.15.0'
1
+ __version__ = '0.15.2'
2
2
  __author__ = 'xiaoran007'
@@ -4,6 +4,7 @@ from ..pyhwUtil import getOS
4
4
  from ..pyhwException import BackendException
5
5
  import subprocess
6
6
  import re
7
+ import os
7
8
 
8
9
 
9
10
  class Printer:
@@ -40,31 +41,91 @@ class Printer:
40
41
  print("\n".join(self.__combined_lines))
41
42
 
42
43
  def __dropLongString(self):
43
- # Need more accurate way to drop long strings
44
- if getOS() == "linux":
44
+ """
45
+ Truncate lines that exceed terminal width, accounting for ANSI escape sequences.
46
+ ANSI escape sequences don't contribute to visible width but are counted by len().
47
+ Enabled on both Linux and macOS.
48
+ """
49
+ if getOS() in ["linux", "macos"]:
45
50
  fixed_lines = list()
46
51
  for line in self.__combined_lines:
47
- if len(line) > self.__columns+20:
48
- fixed_lines.append(line[:self.__columns+20])
52
+ visible_length = self.__getVisibleLength(line)
53
+ if visible_length > self.__columns:
54
+ truncated_line = self.__truncateToWidth(line, self.__columns)
55
+ fixed_lines.append(truncated_line)
49
56
  else:
50
57
  fixed_lines.append(line)
51
58
  self.__combined_lines = fixed_lines
52
59
  else:
53
60
  pass
54
61
 
62
+ @staticmethod
63
+ def __getVisibleLength(text: str) -> int:
64
+ """
65
+ Calculate the visible length of a string, excluding ANSI escape sequences.
66
+ ANSI codes follow the pattern: \033[...m
67
+ """
68
+ ansi_pattern = re.compile(r'\033\[[0-9;]*m')
69
+ clean_text = ansi_pattern.sub('', text)
70
+ return len(clean_text)
71
+
72
+ @staticmethod
73
+ def __truncateToWidth(text: str, max_width: int) -> str:
74
+ """
75
+ Truncate a string to a maximum visible width while preserving ANSI escape sequences.
76
+ Ensures proper color reset at the end if truncated.
77
+ """
78
+ ansi_pattern = re.compile(r'(\033\[[0-9;]*m)')
79
+ parts = ansi_pattern.split(text)
80
+
81
+ result = []
82
+ visible_count = 0
83
+
84
+ for part in parts:
85
+ if ansi_pattern.match(part):
86
+ result.append(part)
87
+ else:
88
+ remaining = max_width - visible_count
89
+ if remaining <= 0:
90
+ break
91
+ if len(part) <= remaining:
92
+ result.append(part)
93
+ visible_count += len(part)
94
+ else:
95
+ result.append(part[:remaining])
96
+ visible_count += remaining
97
+ break
98
+
99
+ truncated = ''.join(result)
100
+ if not truncated.endswith('\033[0m'):
101
+ truncated += '\033[0m'
102
+
103
+ return truncated
104
+
55
105
  @staticmethod
56
106
  def __getColumns() -> int:
57
- if getOS() == "linux":
58
- try:
59
- result = subprocess.run(['stty', 'size'], capture_output=True, text=True)
60
- _, columns_str = result.stdout.split()
61
- columns = int(columns_str)
62
- except:
63
- columns = 80 # default terminal size is 80 columns
64
- else:
65
- # macOS default terminal size is 80 columns
66
- columns = 80
67
- return columns
107
+ try:
108
+ columns = os.get_terminal_size().columns
109
+ return columns
110
+ except (OSError, AttributeError):
111
+ pass
112
+
113
+ try:
114
+ result = subprocess.run(['stty', 'size'], capture_output=True, text=True, check=True)
115
+ _, columns_str = result.stdout.strip().split()
116
+ columns = int(columns_str)
117
+ return columns
118
+ except (subprocess.CalledProcessError, ValueError, FileNotFoundError):
119
+ pass
120
+
121
+ try:
122
+ columns = int(os.environ.get('COLUMNS', 0))
123
+ if columns > 0:
124
+ return columns
125
+ except (ValueError, TypeError):
126
+ pass
127
+
128
+ return 80
68
129
 
69
130
  def __LogoPreprocess(self):
70
131
  global_color = self.__config.get("colors")[0]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyhw
3
- Version: 0.15.0
3
+ Version: 0.15.2
4
4
  Summary: PyHw, a neofetch-like command line tool for fetching system information but written mostly in python.
5
5
  Author: Xiao Ran
6
6
  Maintainer-email: Xiao Ran <xiaoran.007@icloud.com>
@@ -13,7 +13,7 @@ Classifier: Operating System :: OS Independent
13
13
  Requires-Python: >=3.9
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: pypci-ng>=0.2.6
16
+ Requires-Dist: pypci-ng>=0.2.7
17
17
  Dynamic: license-file
18
18
 
19
19
  # PyHw, a neofetch-like system information fetching tool
@@ -0,0 +1 @@
1
+ pypci-ng>=0.2.7
@@ -1 +0,0 @@
1
- pypci-ng>=0.2.6
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