maisaedu-utilities-prefect 1.2.69__tar.gz → 1.2.71__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.
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/PKG-INFO +1 -1
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/deals.py +115 -0
- maisaedu_utilities_prefect-1.2.71/maisaedu_utilities_prefect/hubspot/marketing_emails.py +48 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/PKG-INFO +1 -1
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/setup.py +1 -1
- maisaedu_utilities_prefect-1.2.69/maisaedu_utilities_prefect/hubspot/marketing_emails.py +0 -65
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/LICENSE +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/azure_blob_service/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/azure_blob_service/azureBlobService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/env.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/notification.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/redshift.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/selenium.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/database/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/database/athena.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/database/postgres.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/dw.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/googlesheet/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/googlesheet/gspread.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/associations.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/company.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/contacts.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/contacts_lists.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/email_events.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/form_submission_events.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/forms.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/forms_submissions.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/landing_pages.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/lineItems.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/objects.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/owners.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/pipelines.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/tickets.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/users.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/llm/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/llm/service/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/llm/service/llm_service.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/notification.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/one_drive/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/one_drive/document_handling.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/one_drive/extractor.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/adminGroupModel.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/datasetDatasourceModel.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/datasetRefreshScheduleModel.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/datasourceModel.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/gatewayModel.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/activityLogsService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/adminGroupsService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/client.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/datasetService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/datasourceService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/gatewayService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/userService.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/prefect_api/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/prefect_api/flows.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/scripts/flow-mem-limit +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/scripts/refresh-secrets +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/secrets.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/selenium/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/selenium/service/__init__.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/tunnel.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/utils.py +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/SOURCES.txt +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/dependency_links.txt +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/requires.txt +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/top_level.txt +0 -0
- {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/setup.cfg +0 -0
|
@@ -141,3 +141,118 @@ def get_all_deals_v1_recent_modified(
|
|
|
141
141
|
prefect.get_run_logger().error(resp)
|
|
142
142
|
raise Exception(e)
|
|
143
143
|
return data
|
|
144
|
+
|
|
145
|
+
def get_deal_v3_with_history(
|
|
146
|
+
app_private_token,
|
|
147
|
+
deal_id,
|
|
148
|
+
properties_with_history,
|
|
149
|
+
tries=5,
|
|
150
|
+
):
|
|
151
|
+
logger = prefect.get_run_logger()
|
|
152
|
+
base_url = f"https://api.hubapi.com/crm/v3/objects/deals/{deal_id}"
|
|
153
|
+
|
|
154
|
+
params = {}
|
|
155
|
+
|
|
156
|
+
if properties_with_history:
|
|
157
|
+
params["propertiesWithHistory"] = ",".join(properties_with_history)
|
|
158
|
+
|
|
159
|
+
headers = {
|
|
160
|
+
"content-type": "application/json",
|
|
161
|
+
"cache-control": "no-cache",
|
|
162
|
+
"Authorization": f"Bearer {app_private_token}",
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
for i in range(tries):
|
|
166
|
+
try:
|
|
167
|
+
r = requests.get(url=base_url, headers=headers, params=params)
|
|
168
|
+
r.raise_for_status()
|
|
169
|
+
response_dict = r.json()
|
|
170
|
+
return response_dict
|
|
171
|
+
except Exception as e:
|
|
172
|
+
logger.error(f"Error to fetch deal v3 with history (attempt {i+1}/{tries}): {e}")
|
|
173
|
+
if i == tries - 1:
|
|
174
|
+
raise
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def chunk_list(values, chunk_size):
|
|
178
|
+
values = list(values)
|
|
179
|
+
for i in range(0, len(values), chunk_size):
|
|
180
|
+
yield values[i:i + chunk_size]
|
|
181
|
+
|
|
182
|
+
def get_deals_v3_batch_with_history(
|
|
183
|
+
app_private_token,
|
|
184
|
+
deal_ids,
|
|
185
|
+
properties_with_history=None,
|
|
186
|
+
properties=None,
|
|
187
|
+
batch_size=50,
|
|
188
|
+
tries=5,
|
|
189
|
+
):
|
|
190
|
+
"""
|
|
191
|
+
Lê deals em lote na API v3 usando:
|
|
192
|
+
POST /crm/v3/objects/deals/batch/read
|
|
193
|
+
|
|
194
|
+
- deal_ids: iterável de IDs de deals
|
|
195
|
+
- properties_with_history: lista de propriedades com histórico
|
|
196
|
+
- properties: lista de propriedades atuais
|
|
197
|
+
- batch_size: máximo 50 por causa da API da HubSpot
|
|
198
|
+
|
|
199
|
+
Retorna: dict {deal_id: payload_json_completo}
|
|
200
|
+
"""
|
|
201
|
+
logger = prefect.get_run_logger()
|
|
202
|
+
url = "https://api.hubapi.com/crm/v3/objects/deals/batch/read"
|
|
203
|
+
|
|
204
|
+
# garantia extra: nunca passa de 50
|
|
205
|
+
if batch_size > 50:
|
|
206
|
+
batch_size = 50
|
|
207
|
+
|
|
208
|
+
headers = {
|
|
209
|
+
"content-type": "application/json",
|
|
210
|
+
"cache-control": "no-cache",
|
|
211
|
+
"Authorization": f"Bearer {app_private_token}",
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
results_by_id = {}
|
|
215
|
+
|
|
216
|
+
# garante lista de strings
|
|
217
|
+
deal_ids = [str(d) for d in deal_ids]
|
|
218
|
+
|
|
219
|
+
for ids_chunk in chunk_list(deal_ids, batch_size):
|
|
220
|
+
if not ids_chunk:
|
|
221
|
+
continue
|
|
222
|
+
|
|
223
|
+
# LOG para você ver o tamanho do chunk
|
|
224
|
+
logger.info(f"Chamando batch/read para {len(ids_chunk)} deals "
|
|
225
|
+
f"({ids_chunk[0]} .. {ids_chunk[-1]})")
|
|
226
|
+
|
|
227
|
+
body = {
|
|
228
|
+
"inputs": [{"id": did} for did in ids_chunk]
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if properties:
|
|
232
|
+
body["properties"] = list(properties)
|
|
233
|
+
|
|
234
|
+
if properties_with_history:
|
|
235
|
+
body["propertiesWithHistory"] = list(properties_with_history)
|
|
236
|
+
|
|
237
|
+
for attempt in range(tries):
|
|
238
|
+
try:
|
|
239
|
+
r = requests.post(url, headers=headers, json=body, timeout=30)
|
|
240
|
+
r.raise_for_status()
|
|
241
|
+
resp = r.json()
|
|
242
|
+
|
|
243
|
+
for deal in resp.get("results", []):
|
|
244
|
+
deal_id = deal.get("id")
|
|
245
|
+
if deal_id is not None:
|
|
246
|
+
results_by_id[deal_id] = deal
|
|
247
|
+
|
|
248
|
+
break # deu certo, sai do retry
|
|
249
|
+
except Exception as e:
|
|
250
|
+
logger.error(
|
|
251
|
+
f"Erro ao buscar deals v3 em batch "
|
|
252
|
+
f"(chunk {ids_chunk[0]}..{ids_chunk[-1]}) "
|
|
253
|
+
f"(tentativa {attempt+1}/{tries}): {e}"
|
|
254
|
+
)
|
|
255
|
+
if attempt == tries - 1:
|
|
256
|
+
raise
|
|
257
|
+
|
|
258
|
+
return results_by_id
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
from retry import retry
|
|
3
|
+
import requests
|
|
4
|
+
import json
|
|
5
|
+
import urllib
|
|
6
|
+
|
|
7
|
+
@retry(tries=5, delay=2, backoff=2)
|
|
8
|
+
def get_marketing_emails(api_key, app_private_token, after=None):
|
|
9
|
+
url = "https://api.hubapi.com/marketing/v3/emails?"
|
|
10
|
+
if api_key is not None:
|
|
11
|
+
parameter_dict = {"hapikey": api_key, "limit": 100}
|
|
12
|
+
headers = {"content-type": "application/json", "cache-control": "no-cache"}
|
|
13
|
+
else:
|
|
14
|
+
parameter_dict = {"limit": 100}
|
|
15
|
+
headers = {
|
|
16
|
+
"content-type": "application/json",
|
|
17
|
+
"cache-control": "no-cache",
|
|
18
|
+
"Authorization": f"Bearer {app_private_token}",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if after is not None:
|
|
22
|
+
parameter_dict["after"] = after
|
|
23
|
+
|
|
24
|
+
parameter_dict["includeStats"] = "true"
|
|
25
|
+
|
|
26
|
+
parameters = urllib.parse.urlencode(parameter_dict)
|
|
27
|
+
|
|
28
|
+
url = url + parameters
|
|
29
|
+
|
|
30
|
+
r = requests.get(url=url, headers=headers)
|
|
31
|
+
r.raise_for_status()
|
|
32
|
+
response_dict = json.loads(r.text)
|
|
33
|
+
return response_dict
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_all_marketing_emails(api_key, app_private_token):
|
|
37
|
+
has_more = True
|
|
38
|
+
after = None
|
|
39
|
+
while has_more:
|
|
40
|
+
resp = get_marketing_emails(api_key, app_private_token, after)
|
|
41
|
+
|
|
42
|
+
if "paging" in resp and "next" in resp["paging"]:
|
|
43
|
+
after = resp["paging"]["next"]["after"]
|
|
44
|
+
has_more = True
|
|
45
|
+
else:
|
|
46
|
+
has_more = False
|
|
47
|
+
|
|
48
|
+
yield resp["results"]
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
import json
|
|
3
|
-
import urllib
|
|
4
|
-
import time
|
|
5
|
-
import prefect
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def get_marketing_emails(api_key, app_private_token, offset=None):
|
|
9
|
-
url = "https://api.hubapi.com/marketing-emails/v1/emails/with-statistics?"
|
|
10
|
-
if api_key is not None:
|
|
11
|
-
parameter_dict = {"hapikey": api_key, "limit": 100}
|
|
12
|
-
headers = {"content-type": "application/json", "cache-control": "no-cache"}
|
|
13
|
-
else:
|
|
14
|
-
parameter_dict = {"limit": 100}
|
|
15
|
-
headers = {
|
|
16
|
-
"content-type": "application/json",
|
|
17
|
-
"cache-control": "no-cache",
|
|
18
|
-
"Authorization": f"Bearer {app_private_token}",
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if offset is not None:
|
|
22
|
-
parameter_dict["offset"] = offset
|
|
23
|
-
|
|
24
|
-
parameter_dict["orderBy"] = "updated"
|
|
25
|
-
|
|
26
|
-
parameters = urllib.parse.urlencode(parameter_dict)
|
|
27
|
-
|
|
28
|
-
url = url + parameters
|
|
29
|
-
|
|
30
|
-
try:
|
|
31
|
-
r = requests.get(url=url, headers=headers)
|
|
32
|
-
response_dict = json.loads(r.text)
|
|
33
|
-
return response_dict
|
|
34
|
-
except Exception as e:
|
|
35
|
-
print(e)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def get_all_marketing_emails(api_key, app_private_token):
|
|
39
|
-
offset = 0
|
|
40
|
-
total = 1
|
|
41
|
-
attempts = 0
|
|
42
|
-
while total > offset:
|
|
43
|
-
resp = get_marketing_emails(api_key, app_private_token, offset)
|
|
44
|
-
|
|
45
|
-
try:
|
|
46
|
-
if "objects" in resp and "offset" in resp:
|
|
47
|
-
attempts = 0
|
|
48
|
-
offset = resp["offset"] + len(resp["objects"])
|
|
49
|
-
total = resp["total"]
|
|
50
|
-
|
|
51
|
-
yield resp["objects"]
|
|
52
|
-
else:
|
|
53
|
-
attempts += 1
|
|
54
|
-
if attempts > 2:
|
|
55
|
-
offset = total
|
|
56
|
-
except Exception as e:
|
|
57
|
-
if "errorType" in e and e["errorType"] == "RATE_LIMIT":
|
|
58
|
-
print(e)
|
|
59
|
-
print(resp)
|
|
60
|
-
time.sleep(10)
|
|
61
|
-
else:
|
|
62
|
-
prefect.get_run_logger().error("Failed")
|
|
63
|
-
prefect.get_run_logger().error(e)
|
|
64
|
-
prefect.get_run_logger().error(resp)
|
|
65
|
-
raise e
|
|
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
|
|
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
|