csc-cia-stne 0.0.46__py3-none-any.whl → 0.0.48__py3-none-any.whl

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.
csc_cia_stne/__init__.py CHANGED
@@ -12,6 +12,7 @@ from .email import Email
12
12
  from .provio import Provio
13
13
  from .google_drive import GoogleDrive
14
14
  from .slack import Slack
15
+ from .web import web_screen
15
16
 
16
17
  # Define os itens disponíveis para importação
17
18
  __all__ = [
@@ -26,7 +27,8 @@ __all__ = [
26
27
  "Provio",
27
28
  "Email",
28
29
  "GoogleDrive",
29
- "Slack"
30
+ "Slack",
31
+ "web_screen"
30
32
  ]
31
33
 
32
34
  _diretorio_inicial = os.getcwd()
@@ -3,13 +3,13 @@ import os
3
3
  import sys
4
4
 
5
5
 
6
- def get_config(file_path:str="settings.yaml",file_path_local:str=None,prod:bool=False) -> dict:
6
+ def get_config(file_path:str="settings.yaml",file_path_local:str=None,env:str='dev') -> dict:
7
7
  """
8
8
  Retorna as configurações carregadas a partir de um arquivo YAML.
9
9
  Parâmetros:
10
10
  - file_path (str): O caminho do arquivo YAML.
11
11
  - file_path_local (str, opcional): O caminho local do arquivo YAML, caso exista.
12
- - prod (bool, opcional): Indica se as configurações de produção devem ser carregadas.
12
+ - prod (str, opcional): Indica se as configurações de produção devem ser carregadas.
13
13
  Retorna:
14
14
  - dict: Um dicionário contendo as configurações carregadas do arquivo YAML.
15
15
  Lança:
@@ -51,13 +51,34 @@ def get_config(file_path:str="settings.yaml",file_path_local:str=None,prod:bool=
51
51
 
52
52
  config = yaml.safe_load(f)
53
53
 
54
- if prod:
54
+ if env.lower() == "prod":
55
+ try:
56
+
57
+ config['env'] = config['prod']
55
58
 
56
- config['env'] = config['prod']
59
+ except:
57
60
 
61
+ config['env'] = {}
62
+
63
+ elif env.lower() == "qa":
64
+
65
+ try:
66
+
67
+ config['env'] = config['qa']
68
+
69
+ except:
70
+
71
+ config['env'] = {}
72
+
58
73
  else:
59
74
 
60
- config['env'] = config['prod']
75
+ try:
76
+
77
+ config['env'] = config['dev']
78
+
79
+ except:
80
+
81
+ config['env'] = {}
61
82
 
62
83
  return config
63
84
 
@@ -0,0 +1,103 @@
1
+ from pydantic import BaseModel, field_validator
2
+
3
+
4
+ class InitParamsValidator(BaseModel):
5
+ """
6
+ Classe para validar os parâmetros de inicialização.
7
+ Atributos:
8
+ model (str): O modelo a ser utilizado. Deve ser uma string e pode ser 'selenium' ou 'boticy'.
9
+ headless (bool): Define se o navegador será executado em modo headless.
10
+ disable_gpu (bool): Define se a aceleração de hardware será desabilitada.
11
+ no_sandbox (bool): Define se o sandbox do navegador será desabilitado.
12
+ timeout (int): O tempo limite para a execução de operações.
13
+ Métodos:
14
+ check_str_basic(cls, value, info): Valida se o valor é uma string não vazia e se está dentro das opções permitidas.
15
+ check_bool_input(cls, value, info): Valida se o valor é um booleano.
16
+ """
17
+
18
+ model:str
19
+ headless:bool
20
+ disable_gpu:bool
21
+ no_sandbox:bool
22
+ timeout:int
23
+
24
+ @field_validator('model')
25
+ def check_str_basic(cls, value, info):
26
+ if not isinstance(value, str) or not value.strip():
27
+ raise ValueError(f"O parametro 'model' deve ser uma string e não um {type(value)} e não vazio")
28
+ if value.upper() not in ['SELENIUM', 'BOTCITY']:
29
+ raise ValueError(f"O parametro 'model' deve ser 'selenium' ou 'boticy' e não {value}")
30
+ return value
31
+
32
+ @field_validator('timeout')
33
+ def check_str_basic(cls, value, info):
34
+ if not isinstance(value, int):
35
+ raise ValueError(f"O parametro 'model' deve ser um int e não um {type(value)} e não vazio")
36
+ return value
37
+
38
+ @field_validator('headless','disable_gpu','no_sandbox')
39
+ def check_bool_input(cls, value, info):
40
+ if not isinstance(value, bool):
41
+ raise ValueError(f"O parametro '{info.field_name}' deve ser um boleano")
42
+
43
+ return value
44
+
45
+
46
+ class ClickOnScreenValidator():
47
+ """
48
+ Classe para validar os parâmetros 'target' e 'timeout' da classe ClickOnScreenValidator.
49
+ Atributos:
50
+ target (str): O alvo a ser validado.
51
+ Métodos:
52
+ check_str_basic(value, info): Valida se o valor do parâmetro 'target' é uma string não vazia.
53
+ """
54
+ target:str
55
+
56
+ @field_validator('target')
57
+ def check_str_basic(cls, value, info):
58
+ if not isinstance(value, str) or not value.strip():
59
+ raise ValueError(f"O parametro 'target' deve ser uma string e não um {type(value)} e não vazio")
60
+ return value
61
+
62
+ class InputValueValidator():
63
+ """
64
+ Classe para validar os valores de entrada.
65
+ Atributos:
66
+ target (str): O valor de destino a ser validado.
67
+ clear (bool): Indica se o valor deve ser limpo.
68
+ Métodos:
69
+ check_str_basic(value, info): Valida se o valor fornecido é uma string não vazia.
70
+ check_bool_input(value, info): Valida se o valor fornecido é um booleano.
71
+ """
72
+ target:str
73
+ clear:bool
74
+
75
+ @field_validator('target')
76
+ def check_str_basic(cls, value, info):
77
+ if not isinstance(value, str) or not value.strip():
78
+ raise ValueError(f"O parametro 'target' deve ser uma string e não um {type(value)} e não vazio")
79
+ return value
80
+
81
+ @field_validator('clear')
82
+ def check_bool_input(cls, value, info):
83
+ if not isinstance(value, bool):
84
+ raise ValueError(f"O parametro 'clear' deve ser um boleano")
85
+ return value
86
+
87
+
88
+ class SelectValueValidator():
89
+ """
90
+ Classe para validação de valores do seletor.
91
+ Atributos:
92
+ target (str): O valor do seletor.
93
+ Métodos:
94
+ check_str_basic(value, info): Valida se o valor do seletor é uma string não vazia.
95
+ """
96
+
97
+ target:str
98
+
99
+ @field_validator('target')
100
+ def check_str_basic(cls, value, info):
101
+ if not isinstance(value, str) or not value.strip():
102
+ raise ValueError(f"O parametro 'target' deve ser uma string e não um {type(value)} e não vazio")
103
+ return value
csc_cia_stne/web.py ADDED
@@ -0,0 +1,364 @@
1
+ # Selenium
2
+ from selenium import webdriver
3
+ from webdriver_manager.chrome import ChromeDriverManager
4
+ from selenium.webdriver.chrome.service import Service as ChromeService
5
+ from selenium.webdriver.chrome.options import Options
6
+ from selenium.webdriver.support.ui import Select,WebDriverWait
7
+ from selenium.webdriver.common.by import By
8
+ from selenium.webdriver.support import expected_conditions as EC
9
+
10
+ # Botcity
11
+ from botcity.web import WebBot, Browser
12
+ from botcity.web.util import element_as_select
13
+
14
+ # Validador
15
+ from pydantic import ValidationError
16
+
17
+ # Validadores de parametros
18
+ from .utilitarios.validations.web_validator import InitParamsValidator,ClickOnScreenValidator,InputValueValidator,SelectValueValidator
19
+
20
+
21
+ class web_screen():
22
+
23
+
24
+ def __init__(self,model:str="selenium",timeout:int=60,headless:bool=True,disable_gpu:bool=True,no_sandbox:bool=True):
25
+ """
26
+ Inicializa a instância da classe Web.
27
+ Parâmetros:
28
+ - model (str): O modelo a ser utilizado, pode ser "selenium" ou outro modelo suportado.
29
+ - timeout (int): O tempo limite em segundos para aguardar a resposta do navegador.
30
+ - headless (bool): Define se o navegador será executado em modo headless (sem interface gráfica).
31
+ - disable_gpu (bool): Define se a aceleração de hardware do GPU será desabilitada.
32
+ - no_sandbox (bool): Define se o sandbox do navegador será desabilitado.
33
+ Retorna:
34
+ Um dicionário com as seguintes chaves:
35
+ - "success" (bool): Indica se a inicialização foi bem-sucedida.
36
+ - "result" (object): O objeto do navegador (webdriver) ou do botcity, dependendo do modelo escolhido.
37
+ - "error" (Exception): O erro ocorrido durante a inicialização, caso a inicialização tenha falhado.
38
+ Raises:
39
+ - ValueError: Se ocorrer um erro na validação dos dados de entrada da inicialização da instância.
40
+ """
41
+
42
+ self.model = model
43
+ self.timeout = timeout
44
+
45
+ try:
46
+
47
+ InitParamsValidator(model=model,timeout=timeout, headless=headless, disable_gpu=disable_gpu, no_sandbox=no_sandbox)
48
+
49
+ except ValidationError as e:
50
+
51
+ raise ValueError("Erro na validação dos dados de input da inicialização da instância:", e.errors())
52
+
53
+ if self.model.upper() == "SELENIUM":
54
+
55
+ try:
56
+
57
+ chrome_options = Options()
58
+
59
+ if headless:
60
+ chrome_options.add_argument('--headless')
61
+ if disable_gpu:
62
+ chrome_options.add_argument('--disable-gpu')
63
+ if no_sandbox:
64
+ chrome_options.add_argument('--no-sandbox')
65
+
66
+ # Criação do drive para selenium
67
+ service = ChromeService(executable_path=ChromeDriverManager().install())
68
+
69
+ self.web_bot = webdriver.Chrome(service=service, options=chrome_options)
70
+
71
+ return {
72
+ "success": True,
73
+ "result": self.web_bot
74
+ }
75
+
76
+ except Exception as e:
77
+
78
+ return {
79
+ "success": False,
80
+ "error": e
81
+ }
82
+
83
+ else:
84
+
85
+ try:
86
+
87
+ # Criação do drive para botcity
88
+
89
+ self.web_bot = WebBot()
90
+
91
+ # Configurar o navegador (por exemplo, Chrome)
92
+ self.web_bot.browser = Browser.CHROME
93
+
94
+ self.web_bot.driver_path = ChromeDriverManager().install()
95
+
96
+ # Configurar as opções do Chrome
97
+ self.web_bot.headless = headless
98
+ self.web_bot.disable_gpu = disable_gpu
99
+ self.web_bot.no_sandbox = no_sandbox
100
+
101
+ return {
102
+ "success": True,
103
+ "result": self.web_bot
104
+ }
105
+
106
+ except Exception as e:
107
+
108
+ return {
109
+ "success": False,
110
+ "error": e
111
+ }
112
+
113
+
114
+ def click_on_screen(self, target:str):
115
+ """
116
+ Clica em um elemento na tela.
117
+ Parâmetros:
118
+ - target (str): O elemento alvo a ser clicado.
119
+ Retorna:
120
+ Um dicionário com as seguintes chaves:
121
+ - success (bool): Indica se o clique foi realizado com sucesso.
122
+ - details (str): Detalhes adicionais em caso de erro.
123
+ - error (Exception): A exceção ocorrida, se houver.
124
+ Raises:
125
+ Nenhum.
126
+ """
127
+
128
+ try:
129
+
130
+ ClickOnScreenValidator(target=target)
131
+
132
+ except ValidationError as e:
133
+
134
+ raise ValueError("Erro na validação dos dados de input para o click na tela:", e.errors())
135
+
136
+
137
+ if self.model.upper() == "SELENIUM":
138
+
139
+ try:
140
+
141
+ WebDriverWait(self.web_bot, self.timeout).until(EC.element_to_be_clickable((By.XPATH, target))).click()
142
+
143
+ return {
144
+ "success": True,
145
+ "error": None
146
+ }
147
+
148
+ except EC.NoSuchElementException:
149
+
150
+ return {
151
+ "success": False,
152
+ "details": f"Elemento {target} não encontrado.",
153
+ "error": None
154
+ }
155
+
156
+ except EC.TimeoutException:
157
+
158
+ return {
159
+ "success": False,
160
+ "details": f"O elemento {target} não foi encontrado dentro do tempo definido",
161
+ "error": None
162
+ }
163
+
164
+ except Exception as e:
165
+
166
+ return {
167
+ "success": False,
168
+ "details":None,
169
+ "error": e
170
+ }
171
+
172
+ else:
173
+
174
+ try:
175
+
176
+ element_click = self.web_bot.find_element(target, By.XPATH)
177
+
178
+ self.web_bot.wait_for_stale_element(
179
+ element=element_click,
180
+ timeout=self.timeout
181
+ )
182
+
183
+ element_click.click()
184
+
185
+ return {
186
+ "success": True,
187
+ "error": None
188
+ }
189
+
190
+ except Exception as e:
191
+
192
+ return {
193
+ "success": False,
194
+ "details": None,
195
+ "error": e
196
+ }
197
+
198
+
199
+ def input_value(self, target:str, value, clear:bool=True):
200
+ """
201
+ Insere um valor em um elemento de entrada na página web.
202
+ Parâmetros:
203
+ - target (str): O XPath do elemento de entrada.
204
+ - value: O valor a ser inserido no elemento de entrada.
205
+ - clear (bool): Indica se o elemento de entrada deve ser limpo antes de inserir o valor (padrão: True).
206
+ Retorna:
207
+ Um dicionário com as seguintes chaves:
208
+ - "success" (bool): Indica se a operação foi bem-sucedida.
209
+ - "details" (str): Detalhes adicionais sobre o resultado da operação.
210
+ - "error" (Exception): A exceção ocorrida, se houver.
211
+ """
212
+
213
+ try:
214
+
215
+ InputValueValidator(target=target,clear=clear)
216
+
217
+ except ValidationError as e:
218
+
219
+ raise ValueError("Erro na validação dos dados de input para realizar o input na tela:", e.errors())
220
+
221
+ if self.model.upper() == "SELENIUM":
222
+
223
+ try:
224
+
225
+ element_input = WebDriverWait(self.web_bot, self.timeout).until(EC.EC.visibility_of_element_located(By.XPATH,target))
226
+
227
+ if clear:
228
+
229
+ element_input.clear()
230
+
231
+ element_input.send_keys(value)
232
+
233
+ except EC.NoSuchElementException:
234
+
235
+ return {
236
+ "success": False,
237
+ "details": f"Elemento {target} não encontrado.",
238
+ "error": None
239
+ }
240
+
241
+ except EC.TimeoutException:
242
+
243
+ return {
244
+ "success": False,
245
+ "details": f"O elemento {target} não foi encontrado dentro do tempo definido",
246
+ "error": None
247
+ }
248
+
249
+ except Exception as e:
250
+
251
+ return {
252
+ "success": False,
253
+ "details":None,
254
+ "error": e
255
+ }
256
+
257
+ else:
258
+
259
+ try:
260
+
261
+ element_input = self.web_bot.find_element(target, By.XPATH)
262
+
263
+ self.web_bot.wait_for_stale_element(
264
+ element=element_input,
265
+ timeout=self.timeout
266
+ )
267
+
268
+ if clear:
269
+
270
+ element_input.clear()
271
+
272
+ element_input.send_keys(value)
273
+
274
+ except Exception as e:
275
+
276
+ return {
277
+ "success": False,
278
+ "details":None,
279
+ "error": e
280
+ }
281
+
282
+
283
+ def select_value(self, target:str, value):
284
+ """
285
+ Seleciona um valor em um elemento de seleção (select) na página web.
286
+ Args:
287
+ target (str): O seletor XPath do elemento de seleção.
288
+ value: O valor a ser selecionado.
289
+ Returns:
290
+ dict: Um dicionário com as seguintes chaves:
291
+ - "success" (bool): Indica se a seleção foi bem-sucedida.
292
+ - "details" (str): Detalhes adicionais sobre o resultado da seleção.
293
+ - "error" (Exception): A exceção ocorrida, se houver.
294
+ Raises:
295
+ ValueError: Se ocorrer um erro na validação dos dados para realizar o select na tela.
296
+ Note:
297
+ - Se o modelo for "SELENIUM", o método usará a biblioteca Selenium para realizar a seleção.
298
+ - Caso contrário, o método usará a biblioteca web_bot para realizar a seleção.
299
+ """
300
+
301
+ try:
302
+
303
+ SelectValueValidator(target=target)
304
+
305
+ except ValidationError as e:
306
+
307
+ raise ValueError("Erro na validação dos dados para realizar o select na tela:", e.errors())
308
+
309
+ if self.model.upper() == "SELENIUM":
310
+
311
+ try:
312
+
313
+ element_select = WebDriverWait(self.web_bot, self.timeout).until(EC.element_to_be_clickable((By.XPATH, target)))
314
+
315
+ element_select = Select(element_select)
316
+
317
+ element_select.select_by_value(value)
318
+
319
+ except EC.NoSuchElementException:
320
+
321
+ return {
322
+ "success": False,
323
+ "details": f"Elemento {target} não encontrado.",
324
+ "error": None
325
+ }
326
+
327
+ except EC.TimeoutException:
328
+
329
+ return {
330
+ "success": False,
331
+ "details": f"O elemento {target} não foi encontrado dentro do tempo definido",
332
+ "error": None
333
+ }
334
+
335
+ except Exception as e:
336
+
337
+ return {
338
+ "success": False,
339
+ "details":None,
340
+ "error": e
341
+ }
342
+
343
+ else:
344
+
345
+ try:
346
+
347
+ element_select = self.web_bot.find_element(target, By.XPATH)
348
+
349
+ self.web_bot.wait_for_stale_element(
350
+ element=element_select,
351
+ timeout=self.timeout
352
+ )
353
+
354
+ element_select = element_as_select(element_select)
355
+
356
+ element_select.select_by_value(value)
357
+
358
+ except Exception as e:
359
+
360
+ return {
361
+ "success": False,
362
+ "details":None,
363
+ "error": e
364
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: csc_cia_stne
3
- Version: 0.0.46
3
+ Version: 0.0.48
4
4
  Summary: Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs
5
5
  License: MIT
6
6
  Keywords: karavela,csc,cia,stone,rpa
@@ -21,6 +21,8 @@ Requires-Dist: pyjwt
21
21
  Requires-Dist: PyYAML
22
22
  Requires-Dist: python-dotenv
23
23
  Requires-Dist: slack_sdk
24
+ Requires-Dist: webdriver-manager
25
+ Requires-Dist: botcity-framework-web
24
26
  Requires-Dist: email-validator
25
27
 
26
28
  Essa biblioteca é desenvolvida e atualizada pelo time **CSC-CIA** da **Stone**
@@ -1,4 +1,4 @@
1
- csc_cia_stne/__init__.py,sha256=lHYOTmSOu5K-G1lKYKqrK1evkjOW1WTAxSHjWHk99-k,2466
1
+ csc_cia_stne/__init__.py,sha256=Io-gKis1evws5cHUqyOrcsZKNCQRviYj3zbp__5lgKU,2512
2
2
  csc_cia_stne/bc_correios.py,sha256=pQAnRrcXEMrx3N1MWydZVIhEQLerh3x8-0B045zZIzk,24174
3
3
  csc_cia_stne/bc_sta.py,sha256=f75HJ7FLIDSJFLDTvvSvCYo9z0HchzP7rDY5WIdiKXY,16830
4
4
  csc_cia_stne/email.py,sha256=RK_TzWBVnUfpP-s5NvjTJJjzhICy8e2fME9EuaiySMY,8162
@@ -11,19 +11,21 @@ csc_cia_stne/provio.py,sha256=G-pDnHYLSp97joc7S7dvwjNvl3omnTmvdi3rOPQf5GA,3987
11
11
  csc_cia_stne/servicenow.py,sha256=3eifPWOIGv2udGpI3cr2SkMMKcQR4xHlA_fiOdw_fmg,32136
12
12
  csc_cia_stne/slack.py,sha256=33_UNF7M529eIuWjmzSJFEZ4RmVNkFkuVxvxwsKY1tQ,8126
13
13
  csc_cia_stne/stne_admin.py,sha256=vnGSEzcmqWE42vg71oEuoRg6ENaGsZsXFOjxduSH4KU,23561
14
+ csc_cia_stne/web.py,sha256=ubLN-t67bG6LGkPWOgfT6bZ-cRV6Gh9nfjJWRCeyWz4,11647
14
15
  csc_cia_stne/utilitarios/__init__.py,sha256=oWxCOFL2wxjs8KBgxoeA6-gVe4ulicVGDgdaw8jzvsY,253
15
16
  csc_cia_stne/utilitarios/functions/__init__.py,sha256=iSLKxM8lgPM1lJ51WZ1mwy36IW5iitfMRc_AnEtzpxg,364
16
17
  csc_cia_stne/utilitarios/functions/func_b64.py,sha256=XGU34BIQQXWXBS0yM2B4A2wDlcrMl1unIJXjq4lpLnk,1254
17
18
  csc_cia_stne/utilitarios/functions/func_converters.py,sha256=EY1zvlBaRX7G1MceVSiRXwwKDQDZwUO9iECBL0fe5iU,481
18
19
  csc_cia_stne/utilitarios/functions/func_recriar_pastas.py,sha256=4whZpB3aJQaCPJ3osMAQpKrzEhqYtJbljGWlx_OvKIM,826
19
- csc_cia_stne/utilitarios/functions/func_settings.py,sha256=rlu4Ec5M-7UzrreiR92L_KLrpBSXv8Hlj4uuRYcPMUc,1709
20
+ csc_cia_stne/utilitarios/functions/func_settings.py,sha256=XwlfqdcfocXQ8kTsDKZ6GsAtpzr0_u44AOTIMtdem7U,2059
20
21
  csc_cia_stne/utilitarios/functions/func_titulo.py,sha256=bH4tYxovTARF-g2kWUK_GIzzXt8egbVdp6mWD6fc_3I,5345
21
22
  csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py,sha256=PfCeeQquheZkrm07HTIjobleh3QQOjljRFGdxbQ1amQ,4630
22
23
  csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py,sha256=PBo-AV2bjR__4o9jYxuXO-UyxjAZvVwYgMbtsrFK2sI,4537
23
24
  csc_cia_stne/utilitarios/validations/ServiceNowValidator.py,sha256=yleKUIo1ZfyloP9fDPNjv3JJXdLcocT81WIgRSYmqEA,14423
24
25
  csc_cia_stne/utilitarios/validations/__init__.py,sha256=O_qyEU2ji3u6LHUXZCXvUFsMpoMWL625qqHTXyXivTA,106
25
- csc_cia_stne-0.0.46.dist-info/LICENCE,sha256=LPGMtgKki2C3KEZP7hDhA1HBrlq5JCHkIeStUCLEMx4,1073
26
- csc_cia_stne-0.0.46.dist-info/METADATA,sha256=m3ty7x_xf90UxVSKQN3_BBGZ9m11C1iw6Z7wmiyiVjs,1121
27
- csc_cia_stne-0.0.46.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
28
- csc_cia_stne-0.0.46.dist-info/top_level.txt,sha256=ldo7GVv3tQx5KJvwBzdZzzQmjPys2NDVVn1rv0BOF2Q,13
29
- csc_cia_stne-0.0.46.dist-info/RECORD,,
26
+ csc_cia_stne/utilitarios/validations/web_validator.py,sha256=Mas_Jg_VjvM4f-RAHBDs7FTQELEGfFQ5yGPuu_t1Zmg,3919
27
+ csc_cia_stne-0.0.48.dist-info/LICENCE,sha256=LPGMtgKki2C3KEZP7hDhA1HBrlq5JCHkIeStUCLEMx4,1073
28
+ csc_cia_stne-0.0.48.dist-info/METADATA,sha256=3IWnhOlTRFMUihd-QhIksuN4mWkznEhLRwKpy7SsCfE,1191
29
+ csc_cia_stne-0.0.48.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
30
+ csc_cia_stne-0.0.48.dist-info/top_level.txt,sha256=ldo7GVv3tQx5KJvwBzdZzzQmjPys2NDVVn1rv0BOF2Q,13
31
+ csc_cia_stne-0.0.48.dist-info/RECORD,,