diff --git a/plugin.video.alfa/channels/hdfull.py b/plugin.video.alfa/channels/hdfull.py
index 8140ecf7..7b369752 100644
--- a/plugin.video.alfa/channels/hdfull.py
+++ b/plugin.video.alfa/channels/hdfull.py
@@ -533,17 +533,17 @@ def findvideos(item):
key = scrapertools.find_single_match(data_js, 'JSON.parse\(atob.*?substrings\((.*?)\)')
data_js = httptools.downloadpage("%s/js/providers.js" % host).data
- try:
- from lib import alfaresolver
- provs = alfaresolver.hdfull_providers(data_js)
- if provs == '': return []
- except:
- return []
+ decoded = jhexdecode(data_js)
+ providers_pattern = 'p\[(\d+)\]= {"t":"([^"]+)","d":".*?","e":.function.*?,"l":.function.*?return "([^"]+)".*?};'
+ providers = scrapertools.find_multiple_matches (decoded, providers_pattern)
+ provs = {}
+ for provider, e, l in providers:
+ provs[provider]=[e,l]
data = agrupa_datos(httptools.downloadpage(item.url).data)
data_obf = scrapertools.find_single_match(data, "var ad\s*=\s*'([^']+)'")
- data_decrypt = jsontools.load(obfs(base64.b64decode(data_obf), 126 - int(key)))
+ data_decrypt = jsontools.load(obfs(base64.b64decode(data_obf), 126 - int(key)))
infolabels = {}
year = scrapertools.find_single_match(data, 'Año:\s*.*?(\d{4})')
infolabels["year"] = year
@@ -552,7 +552,7 @@ def findvideos(item):
if match['provider'] in provs:
try:
embed = provs[match['provider']][0]
- url = eval(provs[match['provider']][1].replace('_code_', "match['code']"))
+ url = provs[match['provider']][1]+match['code']
matches.append([match['lang'], match['quality'], url, embed])
except:
pass
@@ -691,7 +691,6 @@ def get_status(status, type, id):
## --------------------------------------------------------------------------------
## --------------------------------------------------------------------------------
-
def jhexdecode(t):
r = re.sub(r'_\d+x\w+x(\d+)', 'var_' + r'\1', t)
r = re.sub(r'_\d+x\w+', 'var_0', r)
diff --git a/plugin.video.alfa/core/httptools.py b/plugin.video.alfa/core/httptools.py
index 03d8fd29..d846c118 100644
--- a/plugin.video.alfa/core/httptools.py
+++ b/plugin.video.alfa/core/httptools.py
@@ -99,7 +99,7 @@ load_cookies()
def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=True, cookies=True, replace_headers=False,
- add_referer=False, only_headers=False, bypass_cloudflare=True, count_retries=0, random_headers=False, ignore_response_code=False):
+ add_referer=False, only_headers=False, bypass_cloudflare=True, count_retries=0, random_headers=False, ignore_response_code=False, alfa_s=False):
"""
Abre una url y retorna los datos obtenidos
@@ -164,22 +164,23 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr
if timeout is None and HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT is not None: timeout = HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT
if timeout == 0: timeout = None
- logger.info("----------------------------------------------")
- logger.info("downloadpage Alfa: %s" %__version)
- logger.info("----------------------------------------------")
- logger.info("Timeout: %s" % timeout)
- logger.info("URL: " + url)
- logger.info("Dominio: " + urlparse.urlparse(url)[1])
- if post:
- logger.info("Peticion: POST")
- else:
- logger.info("Peticion: GET")
- logger.info("Usar Cookies: %s" % cookies)
- logger.info("Descargar Pagina: %s" % (not only_headers))
- logger.info("Fichero de Cookies: " + ficherocookies)
- logger.info("Headers:")
- for header in request_headers:
- logger.info("- %s: %s" % (header, request_headers[header]))
+ if not alfa_s:
+ logger.info("----------------------------------------------")
+ logger.info("downloadpage Alfa: %s" %__version)
+ logger.info("----------------------------------------------")
+ logger.info("Timeout: %s" % timeout)
+ logger.info("URL: " + url)
+ logger.info("Dominio: " + urlparse.urlparse(url)[1])
+ if post:
+ logger.info("Peticion: POST")
+ else:
+ logger.info("Peticion: GET")
+ logger.info("Usar Cookies: %s" % cookies)
+ logger.info("Descargar Pagina: %s" % (not only_headers))
+ logger.info("Fichero de Cookies: " + ficherocookies)
+ logger.info("Headers:")
+ for header in request_headers:
+ logger.info("- %s: %s" % (header, request_headers[header]))
# Handlers
handlers = [urllib2.HTTPHandler(debuglevel=False)]
@@ -192,7 +193,8 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr
opener = urllib2.build_opener(*handlers)
- logger.info("Realizando Peticion")
+ if not alfa_s:
+ logger.info("Realizando Peticion")
# Contador
inicio = time.time()
@@ -243,15 +245,17 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr
response["time"] = time.time() - inicio
response["url"] = handle.geturl()
- logger.info("Terminado en %.2f segundos" % (response["time"]))
- logger.info("Response sucess: %s" % (response["sucess"]))
- logger.info("Response code: %s" % (response["code"]))
- logger.info("Response error: %s" % (response["error"]))
- logger.info("Response data length: %s" % (len(response["data"])))
- logger.info("Response headers:")
+ if not alfa_s:
+ logger.info("Terminado en %.2f segundos" % (response["time"]))
+ logger.info("Response sucess: %s" % (response["sucess"]))
+ logger.info("Response code: %s" % (response["code"]))
+ logger.info("Response error: %s" % (response["error"]))
+ logger.info("Response data length: %s" % (len(response["data"])))
+ logger.info("Response headers:")
server_cloudflare = ""
for header in response["headers"]:
- logger.info("- %s: %s" % (header, response["headers"][header]))
+ if not alfa_s:
+ logger.info("- %s: %s" % (header, response["headers"][header]))
if "cloudflare" in response["headers"][header]:
server_cloudflare = "cloudflare"
@@ -266,22 +270,27 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr
if cookies:
save_cookies()
- logger.info("Encoding: %s" % (response["headers"].get('content-encoding')))
+ if not alfa_s:
+ logger.info("Encoding: %s" % (response["headers"].get('content-encoding')))
if response["headers"].get('content-encoding') == 'gzip':
- logger.info("Descomprimiendo...")
+ if not alfa_s:
+ logger.info("Descomprimiendo...")
data_alt = response["data"]
try:
response["data"] = gzip.GzipFile(fileobj=StringIO(response["data"])).read()
- logger.info("Descomprimido")
+ if not alfa_s:
+ logger.info("Descomprimido")
except:
- logger.info("No se ha podido descomprimir con gzip. Intentando con zlib")
+ if not alfa_s:
+ logger.info("No se ha podido descomprimir con gzip. Intentando con zlib")
response["data"] = data_alt
try:
import zlib
response["data"] = zlib.decompressobj(16 + zlib.MAX_WBITS).decompress(response["data"])
except:
- logger.info("No se ha podido descomprimir con zlib")
+ if not alfa_s:
+ logger.info("No se ha podido descomprimir con zlib")
response["data"] = data_alt
# Anti Cloudflare
@@ -289,11 +298,14 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr
cf = Cloudflare(response)
if cf.is_cloudflare:
count_retries += 1
- logger.info("cloudflare detectado, esperando %s segundos..." % cf.wait_time)
+ if not alfa_s:
+ logger.info("cloudflare detectado, esperando %s segundos..." % cf.wait_time)
auth_url = cf.get_url()
- logger.info("Autorizando... intento %d url: %s" % (count_retries, auth_url))
+ if not alfa_s:
+ logger.info("Autorizando... intento %d url: %s" % (count_retries, auth_url))
if downloadpage(auth_url, headers=request_headers, replace_headers=True, count_retries=count_retries).sucess:
- logger.info("Autorización correcta, descargando página")
+ if not alfa_s:
+ logger.info("Autorización correcta, descargando página")
resp = downloadpage(url=response["url"], post=post, headers=headers, timeout=timeout,
follow_redirects=follow_redirects,
cookies=cookies, replace_headers=replace_headers, add_referer=add_referer)
@@ -305,7 +317,8 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr
response["time"] = resp.time
response["url"] = resp.url
else:
- logger.info("No se ha podido autorizar")
+ if not alfa_s:
+ logger.info("No se ha podido autorizar")
return type('HTTPResponse', (), response)
diff --git a/plugin.video.alfa/core/scraper.py b/plugin.video.alfa/core/scraper.py
index ea229982..7f02a470 100755
--- a/plugin.video.alfa/core/scraper.py
+++ b/plugin.video.alfa/core/scraper.py
@@ -151,7 +151,7 @@ def cuadro_completar(item):
'default': mediatype_default,
'enabled': True,
'visible': True,
- 'lvalues': [config.get_localized_string(60244), config.get_localized_string(60245)]
+ 'lvalues': [config.get_localized_string(60244), config.get_localized_string(70136)]
}]
for i, c in enumerate(controls):
diff --git a/plugin.video.alfa/core/tmdb.py b/plugin.video.alfa/core/tmdb.py
index 72c709e5..a72bea42 100644
--- a/plugin.video.alfa/core/tmdb.py
+++ b/plugin.video.alfa/core/tmdb.py
@@ -455,7 +455,7 @@ def find_and_set_infoLabels(item):
title = item.contentTitle
else:
tipo_busqueda = "tv"
- tipo_contenido = config.get_localized_string(70529)
+ tipo_contenido = config.get_localized_string(60245)
title = item.contentSerieName
# Si el titulo incluye el (año) se lo quitamos
@@ -478,7 +478,7 @@ def find_and_set_infoLabels(item):
if len(results) > 1:
from platformcode import platformtools
tmdb_result = platformtools.show_video_info(results, item=item,
- caption="[%s]: Selecciona la %s correcta" % (title, tipo_contenido))
+ caption=config.get_localized_string(60247) %(title, tipo_contenido))
elif len(results) > 0:
tmdb_result = results[0]
diff --git a/plugin.video.alfa/lib/alfaresolver.py b/plugin.video.alfa/lib/alfaresolver.py
index e2605efc..34e59d85 100644
--- a/plugin.video.alfa/lib/alfaresolver.py
+++ b/plugin.video.alfa/lib/alfaresolver.py
@@ -1 +1 @@
-import base64; exec(base64.b64decode('aW1wb3J0IG1hcnNoYWwKZXhlYyhtYXJzaGFsLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoJ1l3QUFBQUFBQUFBQUdRQUFBRUFBQUFCejl3QUFBR1FBQUdRQkFHd0FBRm9BQUdRQUFHUUJBR3dCQUZvQkFHUUFBR1FCQUd3Q0FGb0NBR1FBQUdRQkFHd0RBRm9EQUdRQUFHUUNBR3dFQUcwRkFGb0ZBQUZrQUFCa0F3QnNCQUJ0QmdCYUJnQUJaQUFBWkFFQWJBY0FXZ2NBWkFRQVpRZ0FaZ0VBWkFVQWhBQUFnd0FBV1ZvSkFHUUdBSVFBQUZvS0FHUUhBSVFBQUZvTEFHUUlBSVFBQUZvTUFHUUpBSVFBQUZvTkFHUUtBSVFBQUZvT0FHY0FBR1FMQUdRTUFHUU5BR1FPQUdRUEFHUVFBR1FSQUdRU0FHUVRBR1FVQUdRUEFHUVZBR1FQQUdRTUFHUVdBR1FYQUdRVEFHUVlBR1FaQUdRYUFHUVBBR1FZQUdRYkFHUWNBR2NZQUdjQ0FGb1BBR1FCQUZNb0hRQUFBR24vLy8vL1RpZ0JBQUFBZEFZQUFBQnNiMmRuWlhJb0FRQUFBSFFHQUFBQVkyOXVabWxuZEFZQUFBQnNNV3d4TVd4akFBQUFBQUFBQUFBQ0FBQUFRZ0FBQUhNdkFBQUFaUUFBV2dFQVpBQUFoQUFBV2dJQVpBRUFoQUFBV2dNQVpBSUFaQU1BaEFFQVdnUUFaQVFBaEFBQVdnVUFVbE1vQlFBQUFHTUNBQUFBQndBQUFBVUFBQUJEQUFBQWM4VURBQUI4QVFCOEFBQmZBQUJrQVFCOEFBQmZBUUJuQUFCOEFBQmZBZ0I4QUFCcUF3Q0RBQUJjQWdCOEFBQmZCQUI4QUFCZkJRQjhBQUJxQkFCeXdRTjBCZ0JxQndCa0FnQjhBQUJxQVFBV2d3RUFhZ2dBZkFBQWFnQUFnd0VBZlFJQWVOUUFkQWtBZkFJQWd3RUFSRjNHQUZ3Q0FIMERBSDBFQUh3RUFHUURBQmxrQXdBZ1pBUUFhd0lBY3A0QWZBQUFhZ29BZkFRQVpBTUFHWU1CQUc0SEFId0VBR1FEQUJsOUJRQjhBQUJxQ3dCMERBQjhCQUJrQlFBWlpBWUFnd0lBZkFVQWd3SUFmUVlBWkFjQWZBWUFhd2NBY3ZvQWZBQUFhZ0FBYWcwQWZBUUFaQWdBR1dRSEFId0dBQmRrQndBWGd3SUFmQUFBWHdBQWNXc0FaQWtBZkFZQWF3Y0FjaTBCZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FKQUh3R0FCZGtDUUFYZ3dJQWZBQUFYd0FBY1dzQVpBQUFVM0ZyQUZkMEJnQnFCd0JrQ2dCOEFBQnFBUUFXZ3dFQWFnZ0FmQUFBYWdBQWd3RUFmUUlBZU5RQWRBa0FmQUlBZ3dFQVJGM0dBRndDQUgwREFIMEVBSHdFQUdRREFCbGtBd0FnWkFRQWF3SUFjcGNCZkFBQWFnb0FmQVFBWkFNQUdZTUJBRzRIQUh3RUFHUURBQmw5QlFCOEFBQnFDd0IwREFCOEJBQmtCUUFaWkFZQWd3SUFmQVVBZ3dJQWZRWUFaQWNBZkFZQWF3Y0Fjdk1CZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FMQUh3R0FCZGtDd0FYZ3dJQWZBQUFYd0FBY1dRQlpBa0FmQVlBYXdjQWNpWUNmQUFBYWdBQWFnMEFmQVFBWkFnQUdXUU1BSHdHQUJka0RBQVhnd0lBZkFBQVh3QUFjV1FCWkFBQVUzRmtBVmQwQmdCcUJ3QmtEUUI4QUFCcUFRQVdnd0VBYWdnQWZBQUFhZ0FBZ3dFQWZRSUFlS01BZEFrQWZBSUFnd0VBUkYyVkFGd0NBSDBEQUgwRUFId0FBR29MQUhRTUFId0VBR1FGQUJsa0JnQ0RBZ0JrQVFDREFnQjlCZ0JrQndCOEJnQnJCd0J5dXdKOEFBQnFBQUJxRFFCOEJBQmtDQUFaWkFjQWZBWUFGMlFIQUJlREFnQjhBQUJmQUFCeFhRSmtDUUI4QmdCckJ3Qnk3Z0o4QUFCcUFBQnFEUUI4QkFCa0NBQVpaQWtBZkFZQUYyUUpBQmVEQWdCOEFBQmZBQUJ4WFFKa0FBQlRjVjBDVjNRR0FHb0hBR1FPQUh3QUFHb0JBQmFEQVFCcUNBQjhBQUJxQUFDREFRQjlBZ0I0cGdCMENRQjhBZ0NEQVFCRVhaVUFYQUlBZlFNQWZRUUFmQUFBYWdzQWRBd0FmQVFBWkFVQUdXUUdBSU1DQUdRQkFJTUNBSDBHQUdRSEFId0dBR3NIQUhLREEzd0FBR29BQUdvTkFId0VBR1FJQUJsa0N3QjhCZ0FYWkFzQUY0TUNBSHdBQUY4QUFIRWxBMlFKQUh3R0FHc0hBSEsyQTN3QUFHb0FBR29OQUh3RUFHUUlBQmxrREFCOEJnQVhaQXdBRjRNQ0FId0FBRjhBQUhFbEEyUUFBRk54SlFOWGJnQUFaQUFBVXlnUEFBQUFUblFBQUFBQWN4NEFBQUFvSlhOY0tDY29XMTRuWFNvcEp5eGNjeW9uS0Z0ZUoxMHFLU2RjS1NscEFnQUFBSE1DQUFBQVhIaHBBUUFBQUdrUUFBQUFkQUVBQUFBbmFRQUFBQUIwQVFBQUFDSnpJZ0FBQUNnbGMxd29YRnduS0M0cVB5bGNYQ2NzWEhNcVhGd25LQzRxUHlsY1hDZGNLU2x6QWdBQUFGd25jd0lBQUFCY0luTVJBQUFBS0NWelhDZ25LRnRlSjEwcUtTZGNLU2x6RXdBQUFDZ2xjMXdvWEZ3bktDNHFQeWxjWENkY0tTa29EZ0FBQUhRRUFBQUFaR0YwWVhRSEFBQUFablZ1WTJsdmJuUUZBQUFBYkdsemRHRjBCZ0FBQUd3eE1Xd3hNWFFHQUFBQWJHd3hiR3d4ZEFNQUFBQnRjMmQwQWdBQUFISmxkQWNBQUFCamIyMXdhV3hsZEFjQUFBQm1hVzVrWVd4c2RBa0FBQUJsYm5WdFpYSmhkR1YwQlFBQUFIVnVhR1Y0ZEFZQUFBQnNNV3d4TVRGMEF3QUFBR2x1ZEhRSEFBQUFjbVZ3YkdGalpTZ0hBQUFBZEFRQUFBQnpaV3htVWdZQUFBQjBCZ0FBQUd4c2JERXhNWFFCQUFBQWFYUUZBQUFBYldGMFkyaDBBUUFBQUhoMEJRQUFBSFpoYkc5eUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQ0FBQUFGOWZhVzVwZEY5ZktnQUFBSE5PQUFBQUFBRUpBZ2tCQ1FJWUF3a0NJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVI4Q0RBRW5BUXdCSndNSUF5SUJHUUVmQWd3Qkp3RU1BU2NEWXdFQUFBQUhBQUFBQlFBQUFFTUFBQUJ6QUFJQUFIUUFBR29CQUdRQkFId0FBR29DQUlNQ0FIMEJBSHdCQUhNbEFIUURBR1FDQUdZQ0FGTjhBUUJxQkFCa0F3Q0RBUUI5QWdCOEFRQnFCQUJrQkFDREFRQnFCUUJrQlFDREFRQjhBQUJmQmdCNE53QjBCd0I4QUFCcUJnQ0RBUUJFWFNZQVhBSUFmUU1BZlFRQWZBUUFhZ2dBZ3dBQVpBTUFaQVlBSVh3QUFHb0dBSHdEQUR4eFh3QlhmQUFBYWdZQVpBY0FHV1FFQUNCa0NBQnJBZ0J5MlFCNE5nQjBCd0I4QUFCcUJnQ0RBUUJFWFNJQVhBSUFmUU1BZlFRQWZBQUFhZ2tBZkFRQWd3RUFmQUFBYWdZQWZBTUFQSEd3QUZkdUFBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEFBQnFBUUJrQ1FCOEFnQVdmQUFBYWdJQVpBb0FkQUFBYWdzQWd3SUJmUUVBZkFFQWN5d0JkQU1BWkFJQVpnSUFVM1FNQUh3QkFHb0VBR1FEQUlNQkFHUUhBSU1DQUgwRkFId0FBR29DQUdvS0FId0JBR29FQUdRSEFJTUJBR1FDQUlNQ0FId0FBRjhDQUhnd0FIUU5BSHdGQUlNQkFFUmRJZ0I5QmdCOEFBQnFCZ0JxRGdCOEFBQnFCZ0JxRHdCa0J3Q0RBUUNEQVFBQmNYSUJWM1FBQUdvQkFHUUxBSHdBQUdvQ0FJTUNBSDBCQUh3QkFITzlBWFFEQUdRQ0FHWUNBRk44QVFCcUJBQmtBd0NEQVFCcUNBQ0RBQUI4QUFCZkVBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEVRQmtBZ0JtQWdCVEtBd0FBQUJPY3hvQUFBQjJZWElnS0Z4M0tpbGNjeW85WEhNcVhGc29MaW8vS1Z4ZE8xSURBQUFBYVFFQUFBQnBBZ0FBQUhRQkFBQUFMR24vLy8vL2FRQUFBQUJ6QWdBQUFGeDRjeVVBQUFCY0tHWjFibU4wYVc5dVhDZ3VLajk5WENnbGN5eGNjeW9vVzE1Y0tWMHFLVndwWENrN2RBVUFBQUJtYkdGbmMzTnVBQUFBZG1GeUlDaGNkeW9wWEhNcVBWeHpLbVoxYm1OMGFXOXVYSE1xWENoY2N5cGJYaXhkS2l4Y2N5cGJYbHdwWFNwY0tWeHpLbHg3TGlvL1hIMWNjeXBsYkhObFhIdGNjeXBjZHlwY2N5bzlYSE1xWEhjcU8xeHpLbHg5WEhNcWNtVjBkWEp1SUZ4M0tqdGNjeXBjZlRzb0VnQUFBRklNQUFBQWRBWUFBQUJ6WldGeVkyaFNCZ0FBQUhRRkFBQUFSbUZzYzJWMEJRQUFBR2R5YjNWd2RBVUFBQUJ6Y0d4cGRGSUlBQUFBVWc4QUFBQjBCUUFBQUhOMGNtbHdVaEFBQUFCU0V3QUFBSFFHQUFBQVJFOVVRVXhNVWhJQUFBQjBCUUFBQUhKaGJtZGxkQVlBQUFCaGNIQmxibVIwQXdBQUFIQnZjRklIQUFBQWRBUUFBQUJVY25WbEtBY0FBQUJTRkFBQUFIUUJBQUFBYlhRR0FBQUFibTl0WW5KbFVoWUFBQUIwQVFBQUFIWjBCZ0FBQUc1MWJXVnliMUlZQUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejVTQ1FBQUFHMEFBQUJ6TUFBQUFBQUVGUUVHQUFvQ0R3RWJBUndBSGdJWEFSd0FIUUloQmlJQkJnQUtBaGdDSVFJVEFDQUZGUUVHQUFvQ0dBSWhBbElEQUFBQVl3TUFBQUFMQUFBQUNBQUFBRU1BQUFCenZBRUFBSFFBQUh3QUFHb0JBSHdCQUJtREFRQjlBd0IwQWdCcUF3QjhBd0NEQVFCOUF3QmtBUUI5QkFCNFJBQjBCQUIwQlFCOEF3Q0RBUUNEQVFCRVhUQUFmUVVBZkFRQVpBSUFaQU1BZEFZQWRBY0FmQU1BZkFVQUdZTUJBSU1CQUdRRUFCOFhaQVVBSHhjM2ZRUUFjVHNBVjNRSUFIUUpBR29LQUh3RUFJTUJBR1FHQUlNQ0FIMERBSHdDQUdRQkFHc0NBSEtYQUh3REFGTjBCQUJrQndDREFRQjlCZ0JrQ0FCOUJ3QmtBUUI5Q0FCNFlBQjBCQUJrQndDREFRQkVYVklBZlFVQWZBY0FmQVlBZkFVQUdSZDBCd0I4QWdCOEJRQjBCUUI4QWdDREFRQVdHWU1CQUJka0J3QVdmUWNBZkFZQWZBVUFHWDBKQUh3R0FId0hBQmw4QmdCOEJRQThmQWtBZkFZQWZBY0FQSEc4QUZka0NBQjlDZ0JrQ0FCOUJ3QjRqZ0IwQkFCMEJRQjhBd0NEQVFDREFRQkVYWG9BZlFVQWZBb0FaQWtBRjJRSEFCWjlDZ0I4QndCOEJnQjhDZ0FaRjJRSEFCWjlCd0I4QmdCOENnQVpmUWtBZkFZQWZBY0FHWHdHQUh3S0FEeDhDUUI4QmdCOEJ3QThmQWdBZEFzQWRBY0FmQU1BZkFVQUdZTUJBSHdHQUh3R0FId0tBQmw4QmdCOEJ3QVpGMlFIQUJZWlFZTUJBRGQ5Q0FCeE1RRlhmQWdBYWd3QVpBWUFnd0VBVXlnS0FBQUFUbElEQUFBQWRBRUFBQUFsZEFJQUFBQXdNR2tDQUFBQWFmNy8vLzkwQkFBQUFIVjBaamhwQUFFQUFHa0FBQUFBYVFFQUFBQW9EUUFBQUhRREFBQUFjM1J5VWdnQUFBQjBCZ0FBQUdKaGMyVTJOSFFKQUFBQVlqWTBaR1ZqYjJSbFVpTUFBQUIwQXdBQUFHeGxiblFEQUFBQWFHVjRkQU1BQUFCdmNtUjBCd0FBQUhWdWFXTnZaR1YwQmdBQUFIVnliR3hwWW5RSEFBQUFkVzV4ZFc5MFpYUUdBQUFBZFc1cFkyaHlkQVlBQUFCbGJtTnZaR1VvQ3dBQUFGSVVBQUFBZEFNQUFBQnVkVzEwQVFBQUFITjBBUUFBQUhKU0dBQUFBSFFCQUFBQWVYUUJBQUFBZEhRQkFBQUFkWFFCQUFBQWQxSXBBQUFBZEFFQUFBQkJLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1U0VRQUFBSmtBQUFCek5BQUFBQUFCRXdJUEFnWUJHUUV1QWhnQkRBQUVBZ3dCQmdBR0FSTUJLZ0VLQVE0QkRnSUdBQVlCR1FFT0FSSUJDZ0VPQVFvQk5nSmpBZ0FBQUFJQUFBQUVBQUFBUXdBQUFITVdBQUFBZEFBQWFnRUFaQUVBWkFJQWhBQUFmQUVBZ3dNQVV5Z0RBQUFBVG5NVEFBQUFYRng0VzJFdFpqQXRPVjFiWVMxbU1DMDVYV01CQUFBQUFRQUFBQUlBQUFCVEFBQUFjeGNBQUFCOEFBQnFBQUNEQUFCa0FRQWZhZ0VBWkFJQWd3RUFVeWdEQUFBQVRta0NBQUFBVWpJQUFBQW9BZ0FBQUZJZkFBQUFkQVlBQUFCa1pXTnZaR1VvQVFBQUFGSW5BQUFBS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NTBDQUFBQUR4c1lXMWlaR0UrdkFBQUFITUFBQUFBS0FJQUFBQlNEQUFBQUhRREFBQUFjM1ZpS0FJQUFBQlNGQUFBQUhRREFBQUFkSGgwS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NVNFQUFBQUxzQUFBQnpBZ0FBQUFBQktBWUFBQUIwQ0FBQUFGOWZibUZ0WlY5ZmRBb0FBQUJmWDIxdlpIVnNaVjlmVWhvQUFBQlNDUUFBQUZJUkFBQUFVaEFBQUFBb0FBQUFBQ2dBQUFBQUtBQUFBQUJ6Q0FBQUFEeHpkSEpwYm1jK1VnSUFBQUFvQUFBQWN3Z0FBQUFHQWdsRENTd01JbU1CQUFBQUNRQUFBQVFBQUFCREFBQUFjL1lBQUFCMEFBQnFBUUNEQUFCekVBQjhBQUJUWkFFQVpBQUFiQUlBZlFFQVpBRUFaQUFBYkFNQWZRSUFaQUVBWkFBQWJBUUFmUU1BZkFFQWFnVUFnd0FBYWdZQVpBSUFnd0VBZlFRQWRBY0FhZ2dBWkFNQWd3RUFmUVVBZEFrQWZBQUFnd0VBWkFRQWF3UUFjdklBZkFRQVpBVUFhd01BYzRJQWZBVUFaQVlBYXdNQWN2SUFmQUlBYWdvQVpBUUFkQWtBZkFBQWd3RUFnd0lBZlFZQWRBc0FmQUFBZ3dFQWZRY0FmQWNBZkFZQUdYMElBSGdxQUh3SEFId0dBQmw4Q0FCckFnQnkzQUI4QWdCcURBQjhBd0JxRFFDREFRQjhCd0I4QmdBOGNiTUFWMlFIQUdvT0FId0hBSU1CQUgwQUFISHlBRzRBQUh3QUFGTW9DQUFBQUU1cC8vLy8vM1FHQUFBQVlYVjBhRzl5Y3hRQUFBQkRiMjUwWVdsdVpYSXVVR3gxWjJsdVRtRnRaV2tBQUFBQWN3b0FBQUJCYkdaaElFRmtaRzl1Y3hFQUFBQndiSFZuYVc0dWRtbGtaVzh1WVd4bVlWSURBQUFBS0E4QUFBQlNBUUFBQUhRSEFBQUFhWE5mZUdKdFkzUUpBQUFBZUdKdFkyRmtaRzl1ZEFZQUFBQnlZVzVrYjIxMEJnQUFBSE4wY21sdVozUUZBQUFBUVdSa2IyNTBEQUFBQUdkbGRFRmtaRzl1U1c1bWIzUUVBQUFBZUdKdFkzUU1BQUFBWjJWMFNXNW1iMHhoWW1Wc1VqRUFBQUIwQndBQUFISmhibVJwYm5SMEJBQUFBR3hwYzNSMEJnQUFBR05vYjJsalpYUUhBQUFBYkdWMGRHVnljM1FFQUFBQWFtOXBiaWdKQUFBQWRBTUFBQUIxY214U1NRQUFBRkpLQUFBQVVrc0FBQUJTUndBQUFIUUtBQUFBWVdSa2IyNWZibUZ0WlhRR0FBQUFZMmhoYm1kbGRBZ0FBQUIwWlcxd1gzVnliSFFEQUFBQWIyeGtLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1MEFnQUFBR0YyeEFBQUFITWdBQUFBQUFFTUFRUUJEQUVNQVF3Q0ZRRVBBUklCR0FFWUFRd0JDZ0VUQVJvQkZRRmpBQUFBQUFNQUFBQUlBQUFBUXdBQUFITnZBQUFBWkFFQWRBQUFhd2NBY2hBQWRBRUFVM1FDQUdvREFHUUNBSU1CQUgwQUFIaEpBSFFFQUVSZFFRQjlBUUI4QUFCMEJRQnFCZ0JrQXdCcUJ3Qm5BQUI4QVFCRVhSSUFmUUlBZEFnQWZBSUFnd0VBWGdJQWNVSUFnd0VBZ3dFQWF3SUFjaVlBZEFrQVUzRW1BRmQwQVFCVEtBUUFBQUJPY3c4QUFBQmhiR1poY21WemIyeDJaWEl1Y0hsekZBQUFBRU52Ym5SaGFXNWxjaTVRYkhWbmFXNU9ZVzFsVWdNQUFBQW9DZ0FBQUhRSUFBQUFYMTltYVd4bFgxOVNIZ0FBQUZKT0FBQUFVazhBQUFCMEFnQUFBR3d4VWk4QUFBQlNNQUFBQUZKVUFBQUFkQU1BQUFCamFISlNKZ0FBQUNnREFBQUFkQUVBQUFCaFVoZ0FBQUJTUEFBQUFDZ0FBQUFBS0FBQUFBQnpDQUFBQUR4emRISnBibWMrZEFZQUFBQnNiREZzTVRIWkFBQUFjdzRBQUFBQUFRd0FCQUlQQVEwQk53QUlBV01CQUFBQUJBQUFBQU1BQUFCREFBQUFjOHdBQUFCMEFBQnFBUUJrQVFDREFRQnFBZ0I4QUFDREFRQjlBUUIwQXdCOEFRQ0RBUUJrQWdCckJBQnlXd0IwQkFCOEFRQmtBZ0FaWkFJQUdXUURBSU1DQUgwQ0FIUUVBSHdCQUdRQ0FCbGtCQUFaWkFNQWd3SUFmUU1BYm1jQWRBQUFhZ0VBWkFVQWd3RUFhZ0lBZkFBQWd3RUFmUUVBZEFNQWZBRUFnd0VBWkFJQWF3UUFjcllBZEFRQWZBRUFaQUlBR1dRQ0FCbGtCZ0NEQWdCOUFnQjBCQUI4QVFCa0FnQVpaQVFBR1dRR0FJTUNBSDBEQUc0TUFHUUNBSDBDQUdRQ0FIMERBSHdDQUh3REFHWUNBRk1vQndBQUFFNXpKd0FBQURCNEtGc3dMVGxoTFdaQkxVWmRLeWxjY3lvc1hITXFNSGdvV3pBdE9XRXRaa0V0UmwwcktXa0FBQUFBYVJBQUFBQnBBUUFBQUhNVUFBQUFYSE1xS0Z4a0t5bGNjeW9zWEhNcUtGeGtLeWxwQ2dBQUFDZ0ZBQUFBVWd3QUFBQlNEUUFBQUZJT0FBQUFVakVBQUFCU0VnQUFBQ2dFQUFBQVVrUUFBQUJTRlFBQUFIUUZBQUFBWkdWelpHVlNPUUFBQUNnQUFBQUFLQUFBQUFCekNBQUFBRHh6ZEhKcGJtYytkQVlBQUFCc01XeHNNV3prQUFBQWN4WUFBQUFBQVJnQkVnRVhBUm9DR0FFU0FSY0JHZ0lHQVFZQll3SUFBQUFQQUFBQUJnQUFBRU1BQUFCelV3SUFBSFFBQUlNQUFITU5BSHdBQUZOMEFRQnFBZ0JrQVFDREFRQnFBd0I4QVFDREFRQjlBZ0I4QWdCelBBQjBCQUJxQlFCOEFRQ0RBUUFCZkFBQVUzUUdBSHdDQUdRQ0FCbURBUUI5QXdCOEF3QnFCd0J6WmdCMEJBQnFCUUI4QVFDREFRQUJmQUFBVTNRQkFHb0NBR1FEQUhRQkFHb0lBSU1DQUdvREFId0FBSU1CQUdRQ0FCbDlCQUI4QkFCa0FBQmtBQUJrQkFDRkF3QVpmUVVBZEFFQWFna0FaQVVBWkFZQWZBTUFhZ29BZ3dNQWZBTUFYd29BZURVQVpBY0FaQWdBWkFrQVpBb0FaQXNBWndVQVJGMGVBSDBHQUh3REFHb0tBR29MQUh3R0FHUU1BSU1DQUh3REFGOEtBSEhNQUZkMEFRQnFBZ0JrRFFDREFRQnFBd0I4QXdCcUNnQ0RBUUI5QWdCOEFnQnlLQUYwREFCOEFnQmtBZ0FaZ3dFQVhBSUFmUWNBZlFnQWJrWUFkQUVBYWdJQVpBNEFnd0VBYWdNQWZBTUFhZ29BZ3dFQWZRSUFmQUlBY21JQmRBd0FmQUlBWkFJQUdZTUJBRndDQUgwSEFIMElBRzRNQUdRQ0FIMEhBR1FDQUgwSUFId0hBR1FDQUdzQ0FIS0VBWHdGQUh3SUFCOXVFd0I4QlFCOEJ3QWdmQVVBZkFjQWZBZ0FGeDhYZlFrQWRBMEFmQWtBZ3dFQWZRb0FkQUVBYWdJQVpBOEFnd0VBYWdNQWZBTUFhZ29BZ3dFQWZRSUFmQUlBY2pjQ2VHMEFmQUlBUkYxaUFGd0VBSDBMQUgwTUFIME5BSDBPQUh3TkFHUVFBR3NDQUhMT0FYd0xBSHdPQUdzQ0FITE9BWHdLQUhRT0FId01BSU1CQUJsOENnQjBEZ0I4Q3dDREFRQVpBbndLQUhRT0FId0xBSU1CQUR4OENnQjBEZ0I4REFDREFRQThjYzRCY2M0QlYyNEFBSFFCQUdvSkFId0VBR1FSQUdvUEFId0tBSU1CQUh3QUFJTURBRk1vRWdBQUFFNXpLQUFBQUNoMllYSWdYSGNyWEhNcVBWeHpLbHhiTGlvL1hGMDdYQ2htZFc1amRHbHZibHdvTGlvL0tRcHBBQUFBQUhNTkFBQUFXekF0T1dFdGVsMTdOREFzZlduLy8vLy9jd2dBQUFCY2N5cGNLMXh6S25RQkFBQUFLM01KQUFBQWMzQnNKeXNuYVdObGN3a0FBQUJ6SnlzbmNHeHBZMlZ6Q1FBQUFITndKeXNuYkdsalpYTUpBQUFBYzNCc2FTY3JKMk5sY3drQUFBQnpjR3hwWXljckoyVjBCZ0FBQUhOd2JHbGpaWE1UQUFBQVhDNXpjR3hwWTJWY0tDaGJYaWxkS3lsY0tYTVhBQUFBWEZzbmMzQnNhV05sSjF4ZFhDZ29XMTRwWFNzcFhDbHpUQUFBQUZ4M0sxeGJLRnhrS3lsY1hWeHpLajFjY3lwY2R5dGNMbk53YkdsalpWeHpLbHdvS0Z4a0t5bGNjeW9zWEhNcUtGeGtLeWxjY3lvc1hITXFYSGNyWEZzb1hHUXJLVnhkWEhNcVhDbDBBUUFBQURGU0F3QUFBQ2dRQUFBQVVsOEFBQUJTREFBQUFGSU5BQUFBVWc0QUFBQlNBQUFBQUhRRUFBQUFhVzVtYjFJQ0FBQUFVZ29BQUFCMENnQUFBRWxIVGs5U1JVTkJVMFZTUXdBQUFGSUdBQUFBVWhNQUFBQlNZUUFBQUZKUkFBQUFVaElBQUFCU1ZBQUFBQ2dQQUFBQVVsVUFBQUJTQmdBQUFGSVZBQUFBZEFNQUFBQnVaWFIwQmdBQUFHeHNiREZzTVhRR0FBQUFiR3d4TVRFeGRBTUFBQUJ5WlhCU1lBQUFBRkk1QUFBQVVoZ0FBQUJTT3dBQUFIUURBQUFBZFc1dmRBTUFBQUJrYjNOMEF3QUFBSFJoYlhRREFBQUFabWx1S0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NTBFQUFBQUdSbFkyOWtaVjkyYVdSbGIxOTFjbXowQUFBQWN6NEFBQUFBQXdrQUJBUVlBUVlCRFFFRUFoQUJDUUVOQVFRSUlnRVRBeHNESEFFY0F4c0JCZ0VaQWhzQkJnRVpBZ1lBQmdFc0JBd0NHd0VHQVJrQkdBRS9BMk1CQUFBQUN3QUFBQVlBQUFCREFBQUFjenNCQUFCMEFBQ0RBQUJ6RFFCa0FRQlRkQUVBYWdJQVpBSUFnd0VBYWdNQWZBQUFnd0VBZlFFQWZBRUFjendBZEFRQWFnVUFmQUFBZ3dFQUFXUUJBRk4wQmdCOEFRQmtBd0FaZ3dFQWZRSUFmQUlBYWdjQWMyWUFkQVFBYWdVQWZBQUFnd0VBQVdRQkFGTjBBUUJxQ0FCa0JBQmtCUUNFQUFCOEFnQnFDUUNEQXdCOEFnQmZDUUIwQVFCcUFnQmtCZ0NEQVFCcUF3QjhBZ0JxQ1FDREFRQjlBd0IwQ2dCOEF3Q0RBUUI5QkFCMEFRQnFBZ0JrQndCa0NBQjBBUUJxQ3dDREFRRnFBd0I4QWdCcUNRQ0RBUUI5QlFCMENnQjhCUUNEQVFCOUJnQnBBQUI5QndCNFV3QjhCZ0JFWFVzQWZRZ0FmQWdBZkFRQWF3WUFjZ1FCZkFRQWZBZ0FHVzREQUdRQkFIMEpBSFFCQUdvSUFHUUpBR1FLQUh3R0FId0lBQm1EQXdCOUNnQjhDUUI4Q2dCbkFnQjhCd0I4Q0FBOGNlZ0FWM3dIQUZNb0N3QUFBRTVTQXdBQUFITW9BQUFBS0haaGNpQmNkeXRjY3lvOVhITXFYRnN1S2o5Y1hUdGNLR1oxYm1OMGFXOXVYQ2d1S2o4cENta0FBQUFBY3hJQUFBQndYRnN3ZUNoYllTMW1NQzA1WFNzcFhGMWpBUUFBQUFFQUFBQUZBQUFBVXdBQUFITWtBQUFBWkFFQWRBQUFkQUVBZkFBQWFnSUFaQUlBZ3dFQVpBTUFnd0lBZ3dFQUYyUUVBQmRUS0FVQUFBQk9jd0lBQUFCd1cya0JBQUFBYVJBQUFBQjBBUUFBQUYwb0F3QUFBRkl1QUFBQVVoSUFBQUJTSHdBQUFDZ0JBQUFBVWljQUFBQW9BQUFBQUNnQUFBQUFjd2dBQUFBOGMzUnlhVzVuUGxKQ0FBQUFSZ0VBQUhNQUFBQUFjeUVBQUFCd1hGc29YR1FyS1Z4ZFhGc25kQ2RjWFZ4ektqMWNjeW9uS0Z0ZUoxMHFLU2R6SndBQUFIQmNXeWhjWkNzcFhGMWNXeWRzSjF4ZFhITXFQUzRxUDNKbGRIVnliaUFvVzE0N1hTb3BPMUljQUFBQWN3NEFBQUFvWHpCNFcyRXRaakF0T1YwcktYUUdBQUFBWDJOdlpHVmZLQXdBQUFCU1h3QUFBRklNQUFBQVVnMEFBQUJTRGdBQUFGSUFBQUFBVW1VQUFBQlNBZ0FBQUZJS0FBQUFVa01BQUFCU0JnQUFBSFFFQUFBQVpHbGpkRklpQUFBQUtBc0FBQUJTQmdBQUFGSVZBQUFBVW1jQUFBQjBBZ0FBQUhCMGRBTUFBQUJrY0hSMEFnQUFBSEJzZEFNQUFBQmtjR3gwQVFBQUFIQlNPUUFBQUZJOUFBQUFkQUVBQUFCc0tBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwRUFBQUFHaGtablZzYkY5d2NtOTJhV1JsY25Nd0FRQUFjeW9BQUFBQUF3a0FCQVFZQVFZQkRRRUVBaEFCQ1FFTkFRUUhIZ0liQVF3Q0pBRU1BZ1lCRFFFY0FSa0JGQUpwWXdBQUFHbEhBQUFBYVhnQUFBQnBNUUFBQUdsYUFBQUFhVElBQUFCcGJBQUFBR2wxQUFBQWFVd0FBQUJwYmdBQUFHbHdBQUFBYVZZQUFBQnBkZ0FBQUdsdEFBQUFhVVlBQUFCcGN3QUFBR2xGQUFBQWFUMEFBQUFvRUFBQUFGSU1BQUFBZEFNQUFBQnplWE5TTHdBQUFGSTFBQUFBZEF3QUFBQndiR0YwWm05eWJXTnZaR1ZTQUFBQUFGSUJBQUFBVWs0QUFBQjBCZ0FBQUc5aWFtVmpkRklDQUFBQVVsb0FBQUJTWHdBQUFGSmhBQUFBVW04QUFBQlNlUUFBQUZKY0FBQUFLQUFBQUFBb0FBQUFBQ2dBQUFBQWN3Z0FBQUE4YzNSeWFXNW5QblFJQUFBQVBHMXZaSFZzWlQ0REFBQUFjeFFBQUFBd0FSQUJFQUVNSWhhY0NSVUpDd2tRQ1R3Skp3PT0nKSkp'))
\ No newline at end of file
+import base64; exec(base64.b64decode('aW1wb3J0IG1hcnNoYWwKZXhlYyhtYXJzaGFsLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoJ1l3QUFBQUFBQUFBQUdRQUFBRUFBQUFCejRRQUFBR1FBQUdRQkFHd0FBRm9BQUdRQUFHUUJBR3dCQUZvQkFHUUFBR1FCQUd3Q0FGb0NBR1FBQUdRQkFHd0RBRm9EQUdRQUFHUUNBR3dFQUcwRkFGb0ZBRzBHQUZvR0FBRmtBd0JsQndCbUFRQmtCQUNFQUFDREFBQlpXZ2dBWkFVQWhBQUFXZ2tBWkFZQWhBQUFXZ29BWkFjQWhBQUFXZ3NBWkFnQWhBQUFXZ3dBWkFrQWhBQUFXZzBBWndBQVpBb0FaQXNBWkF3QVpBMEFaQTRBWkE4QVpCQUFaQkVBWkJJQVpCTUFaQTRBWkJRQVpBNEFaQXNBWkJVQVpCWUFaQklBWkJjQVpCZ0FaQmtBWkE0QVpCY0FaQm9BWkJzQVp4Z0Fad0lBV2c0QVpBRUFVeWdjQUFBQWFmLy8vLzlPS0FJQUFBQjBCZ0FBQUd4dloyZGxjblFHQUFBQVkyOXVabWxuZEFZQUFBQnNiREV4YkRGakFBQUFBQUFBQUFBQ0FBQUFRZ0FBQUhNdkFBQUFaUUFBV2dFQVpBQUFoQUFBV2dJQVpBRUFoQUFBV2dNQVpBSUFaQU1BaEFFQVdnUUFaQVFBaEFBQVdnVUFVbE1vQlFBQUFHTUNBQUFBQndBQUFBVUFBQUJEQUFBQWM4VURBQUI4QVFCOEFBQmZBQUJrQVFCOEFBQmZBUUJuQUFCOEFBQmZBZ0I4QUFCcUF3Q0RBQUJjQWdCOEFBQmZCQUI4QUFCZkJRQjhBQUJxQkFCeXdRTjBCZ0JxQndCa0FnQjhBQUJxQVFBV2d3RUFhZ2dBZkFBQWFnQUFnd0VBZlFJQWVOUUFkQWtBZkFJQWd3RUFSRjNHQUZ3Q0FIMERBSDBFQUh3RUFHUURBQmxrQXdBZ1pBUUFhd0lBY3A0QWZBQUFhZ29BZkFRQVpBTUFHWU1CQUc0SEFId0VBR1FEQUJsOUJRQjhBQUJxQ3dCMERBQjhCQUJrQlFBWlpBWUFnd0lBZkFVQWd3SUFmUVlBWkFjQWZBWUFhd2NBY3ZvQWZBQUFhZ0FBYWcwQWZBUUFaQWdBR1dRSEFId0dBQmRrQndBWGd3SUFmQUFBWHdBQWNXc0FaQWtBZkFZQWF3Y0FjaTBCZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FKQUh3R0FCZGtDUUFYZ3dJQWZBQUFYd0FBY1dzQVpBQUFVM0ZyQUZkMEJnQnFCd0JrQ2dCOEFBQnFBUUFXZ3dFQWFnZ0FmQUFBYWdBQWd3RUFmUUlBZU5RQWRBa0FmQUlBZ3dFQVJGM0dBRndDQUgwREFIMEVBSHdFQUdRREFCbGtBd0FnWkFRQWF3SUFjcGNCZkFBQWFnb0FmQVFBWkFNQUdZTUJBRzRIQUh3RUFHUURBQmw5QlFCOEFBQnFDd0IwREFCOEJBQmtCUUFaWkFZQWd3SUFmQVVBZ3dJQWZRWUFaQWNBZkFZQWF3Y0Fjdk1CZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FMQUh3R0FCZGtDd0FYZ3dJQWZBQUFYd0FBY1dRQlpBa0FmQVlBYXdjQWNpWUNmQUFBYWdBQWFnMEFmQVFBWkFnQUdXUU1BSHdHQUJka0RBQVhnd0lBZkFBQVh3QUFjV1FCWkFBQVUzRmtBVmQwQmdCcUJ3QmtEUUI4QUFCcUFRQVdnd0VBYWdnQWZBQUFhZ0FBZ3dFQWZRSUFlS01BZEFrQWZBSUFnd0VBUkYyVkFGd0NBSDBEQUgwRUFId0FBR29MQUhRTUFId0VBR1FGQUJsa0JnQ0RBZ0JrQVFDREFnQjlCZ0JrQndCOEJnQnJCd0J5dXdKOEFBQnFBQUJxRFFCOEJBQmtDQUFaWkFjQWZBWUFGMlFIQUJlREFnQjhBQUJmQUFCeFhRSmtDUUI4QmdCckJ3Qnk3Z0o4QUFCcUFBQnFEUUI4QkFCa0NBQVpaQWtBZkFZQUYyUUpBQmVEQWdCOEFBQmZBQUJ4WFFKa0FBQlRjVjBDVjNRR0FHb0hBR1FPQUh3QUFHb0JBQmFEQVFCcUNBQjhBQUJxQUFDREFRQjlBZ0I0cGdCMENRQjhBZ0NEQVFCRVhaVUFYQUlBZlFNQWZRUUFmQUFBYWdzQWRBd0FmQVFBWkFVQUdXUUdBSU1DQUdRQkFJTUNBSDBHQUdRSEFId0dBR3NIQUhLREEzd0FBR29BQUdvTkFId0VBR1FJQUJsa0N3QjhCZ0FYWkFzQUY0TUNBSHdBQUY4QUFIRWxBMlFKQUh3R0FHc0hBSEsyQTN3QUFHb0FBR29OQUh3RUFHUUlBQmxrREFCOEJnQVhaQXdBRjRNQ0FId0FBRjhBQUhFbEEyUUFBRk54SlFOWGJnQUFaQUFBVXlnUEFBQUFUblFBQUFBQWN4NEFBQUFvSlhOY0tDY29XMTRuWFNvcEp5eGNjeW9uS0Z0ZUoxMHFLU2RjS1NscEFnQUFBSE1DQUFBQVhIaHBBUUFBQUdrUUFBQUFkQUVBQUFBbmFRQUFBQUIwQVFBQUFDSnpJZ0FBQUNnbGMxd29YRnduS0M0cVB5bGNYQ2NzWEhNcVhGd25LQzRxUHlsY1hDZGNLU2x6QWdBQUFGd25jd0lBQUFCY0luTVJBQUFBS0NWelhDZ25LRnRlSjEwcUtTZGNLU2x6RXdBQUFDZ2xjMXdvWEZ3bktDNHFQeWxjWENkY0tTa29EZ0FBQUhRRUFBQUFaR0YwWVhRSEFBQUFablZ1WTJsdmJuUUZBQUFBYkdsemRHRjBCZ0FBQUd3eGJHd3hNWFFHQUFBQWJERnNNVEV4ZEFNQUFBQnRjMmQwQWdBQUFISmxkQWNBQUFCamIyMXdhV3hsZEFjQUFBQm1hVzVrWVd4c2RBa0FBQUJsYm5WdFpYSmhkR1YwQlFBQUFIVnVhR1Y0ZEFZQUFBQnNNV3d4TVd4MEF3QUFBR2x1ZEhRSEFBQUFjbVZ3YkdGalpTZ0hBQUFBZEFRQUFBQnpaV3htVWdZQUFBQjBCZ0FBQUd4c01URXhNWFFCQUFBQWFYUUZBQUFBYldGMFkyaDBBUUFBQUhoMEJRQUFBSFpoYkc5eUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQ0FBQUFGOWZhVzVwZEY5ZktRQUFBSE5PQUFBQUFBRUpBZ2tCQ1FJWUF3a0NJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVI4Q0RBRW5BUXdCSndNSUF5SUJHUUVmQWd3Qkp3RU1BU2NEWXdFQUFBQUhBQUFBQlFBQUFFTUFBQUJ6QUFJQUFIUUFBR29CQUdRQkFId0FBR29DQUlNQ0FIMEJBSHdCQUhNbEFIUURBR1FDQUdZQ0FGTjhBUUJxQkFCa0F3Q0RBUUI5QWdCOEFRQnFCQUJrQkFDREFRQnFCUUJrQlFDREFRQjhBQUJmQmdCNE53QjBCd0I4QUFCcUJnQ0RBUUJFWFNZQVhBSUFmUU1BZlFRQWZBUUFhZ2dBZ3dBQVpBTUFaQVlBSVh3QUFHb0dBSHdEQUR4eFh3QlhmQUFBYWdZQVpBY0FHV1FFQUNCa0NBQnJBZ0J5MlFCNE5nQjBCd0I4QUFCcUJnQ0RBUUJFWFNJQVhBSUFmUU1BZlFRQWZBQUFhZ2tBZkFRQWd3RUFmQUFBYWdZQWZBTUFQSEd3QUZkdUFBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEFBQnFBUUJrQ1FCOEFnQVdmQUFBYWdJQVpBb0FkQUFBYWdzQWd3SUJmUUVBZkFFQWN5d0JkQU1BWkFJQVpnSUFVM1FNQUh3QkFHb0VBR1FEQUlNQkFHUUhBSU1DQUgwRkFId0FBR29DQUdvS0FId0JBR29FQUdRSEFJTUJBR1FDQUlNQ0FId0FBRjhDQUhnd0FIUU5BSHdGQUlNQkFFUmRJZ0I5QmdCOEFBQnFCZ0JxRGdCOEFBQnFCZ0JxRHdCa0J3Q0RBUUNEQVFBQmNYSUJWM1FBQUdvQkFHUUxBSHdBQUdvQ0FJTUNBSDBCQUh3QkFITzlBWFFEQUdRQ0FHWUNBRk44QVFCcUJBQmtBd0NEQVFCcUNBQ0RBQUI4QUFCZkVBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEVRQmtBZ0JtQWdCVEtBd0FBQUJPY3hvQUFBQjJZWElnS0Z4M0tpbGNjeW85WEhNcVhGc29MaW8vS1Z4ZE8xSURBQUFBYVFFQUFBQnBBZ0FBQUhRQkFBQUFMR24vLy8vL2FRQUFBQUJ6QWdBQUFGeDRjeVVBQUFCY0tHWjFibU4wYVc5dVhDZ3VLajk5WENnbGN5eGNjeW9vVzE1Y0tWMHFLVndwWENrN2RBVUFBQUJtYkdGbmMzTnVBQUFBZG1GeUlDaGNkeW9wWEhNcVBWeHpLbVoxYm1OMGFXOXVYSE1xWENoY2N5cGJYaXhkS2l4Y2N5cGJYbHdwWFNwY0tWeHpLbHg3TGlvL1hIMWNjeXBsYkhObFhIdGNjeXBjZHlwY2N5bzlYSE1xWEhjcU8xeHpLbHg5WEhNcWNtVjBkWEp1SUZ4M0tqdGNjeXBjZlRzb0VnQUFBRklNQUFBQWRBWUFBQUJ6WldGeVkyaFNCZ0FBQUhRRkFBQUFSbUZzYzJWMEJRQUFBR2R5YjNWd2RBVUFBQUJ6Y0d4cGRGSUlBQUFBVWc4QUFBQjBCUUFBQUhOMGNtbHdVaEFBQUFCU0V3QUFBSFFHQUFBQVJFOVVRVXhNVWhJQUFBQjBCUUFBQUhKaGJtZGxkQVlBQUFCaGNIQmxibVIwQXdBQUFIQnZjRklIQUFBQWRBUUFBQUJVY25WbEtBY0FBQUJTRkFBQUFIUUJBQUFBYlhRR0FBQUFibTl0WW5KbFVoWUFBQUIwQVFBQUFIWjBCZ0FBQUc1MWJXVnliMUlZQUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejVTQ1FBQUFHd0FBQUJ6TUFBQUFBQUVGUUVHQUFvQ0R3RWJBUndBSGdJWEFSd0FIUUloQmlJQkJnQUtBaGdDSVFJVEFDQUZGUUVHQUFvQ0dBSWhBbElEQUFBQVl3TUFBQUFMQUFBQUNBQUFBRU1BQUFCenZBRUFBSFFBQUh3QUFHb0JBSHdCQUJtREFRQjlBd0IwQWdCcUF3QjhBd0NEQVFCOUF3QmtBUUI5QkFCNFJBQjBCQUIwQlFCOEF3Q0RBUUNEQVFCRVhUQUFmUVVBZkFRQVpBSUFaQU1BZEFZQWRBY0FmQU1BZkFVQUdZTUJBSU1CQUdRRUFCOFhaQVVBSHhjM2ZRUUFjVHNBVjNRSUFIUUpBR29LQUh3RUFJTUJBR1FHQUlNQ0FIMERBSHdDQUdRQkFHc0NBSEtYQUh3REFGTjBCQUJrQndDREFRQjlCZ0JrQ0FCOUJ3QmtBUUI5Q0FCNFlBQjBCQUJrQndDREFRQkVYVklBZlFVQWZBY0FmQVlBZkFVQUdSZDBCd0I4QWdCOEJRQjBCUUI4QWdDREFRQVdHWU1CQUJka0J3QVdmUWNBZkFZQWZBVUFHWDBKQUh3R0FId0hBQmw4QmdCOEJRQThmQWtBZkFZQWZBY0FQSEc4QUZka0NBQjlDZ0JrQ0FCOUJ3QjRqZ0IwQkFCMEJRQjhBd0NEQVFDREFRQkVYWG9BZlFVQWZBb0FaQWtBRjJRSEFCWjlDZ0I4QndCOEJnQjhDZ0FaRjJRSEFCWjlCd0I4QmdCOENnQVpmUWtBZkFZQWZBY0FHWHdHQUh3S0FEeDhDUUI4QmdCOEJ3QThmQWdBZEFzQWRBY0FmQU1BZkFVQUdZTUJBSHdHQUh3R0FId0tBQmw4QmdCOEJ3QVpGMlFIQUJZWlFZTUJBRGQ5Q0FCeE1RRlhmQWdBYWd3QVpBWUFnd0VBVXlnS0FBQUFUbElEQUFBQWRBRUFBQUFsZEFJQUFBQXdNR2tDQUFBQWFmNy8vLzkwQkFBQUFIVjBaamhwQUFFQUFHa0FBQUFBYVFFQUFBQW9EUUFBQUhRREFBQUFjM1J5VWdnQUFBQjBCZ0FBQUdKaGMyVTJOSFFKQUFBQVlqWTBaR1ZqYjJSbFVpTUFBQUIwQXdBQUFHeGxiblFEQUFBQWFHVjRkQU1BQUFCdmNtUjBCd0FBQUhWdWFXTnZaR1YwQmdBQUFIVnliR3hwWW5RSEFBQUFkVzV4ZFc5MFpYUUdBQUFBZFc1cFkyaHlkQVlBQUFCbGJtTnZaR1VvQ3dBQUFGSVVBQUFBZEFNQUFBQnVkVzEwQVFBQUFITjBBUUFBQUhKU0dBQUFBSFFCQUFBQWVYUUJBQUFBZEhRQkFBQUFkWFFCQUFBQWQxSXBBQUFBZEFFQUFBQkJLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1U0VRQUFBSmdBQUFCek5BQUFBQUFCRXdJUEFnWUJHUUV1QWhnQkRBQUVBZ3dCQmdBR0FSTUJLZ0VLQVE0QkRnSUdBQVlCR1FFT0FSSUJDZ0VPQVFvQk5nSmpBZ0FBQUFJQUFBQUVBQUFBUXdBQUFITVdBQUFBZEFBQWFnRUFaQUVBWkFJQWhBQUFmQUVBZ3dNQVV5Z0RBQUFBVG5NVEFBQUFYRng0VzJFdFpqQXRPVjFiWVMxbU1DMDVYV01CQUFBQUFRQUFBQUlBQUFCVEFBQUFjeGNBQUFCOEFBQnFBQUNEQUFCa0FRQWZhZ0VBWkFJQWd3RUFVeWdEQUFBQVRta0NBQUFBVWpJQUFBQW9BZ0FBQUZJZkFBQUFkQVlBQUFCa1pXTnZaR1VvQVFBQUFGSW5BQUFBS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NTBDQUFBQUR4c1lXMWlaR0UrdXdBQUFITUFBQUFBS0FJQUFBQlNEQUFBQUhRREFBQUFjM1ZpS0FJQUFBQlNGQUFBQUhRREFBQUFkSGgwS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NVNFQUFBQUxvQUFBQnpBZ0FBQUFBQktBWUFBQUIwQ0FBQUFGOWZibUZ0WlY5ZmRBb0FBQUJmWDIxdlpIVnNaVjlmVWhvQUFBQlNDUUFBQUZJUkFBQUFVaEFBQUFBb0FBQUFBQ2dBQUFBQUtBQUFBQUJ6Q0FBQUFEeHpkSEpwYm1jK1VnSUFBQUFuQUFBQWN3Z0FBQUFHQWdsRENTd01JbU1BQUFBQUF3QUFBQUlBQUFCREFBQUFjMklBQUFCa0FRQmtBQUJzQUFCOUFBQjBBUUJxQWdDREFBQnpIQUIwQXdCVGZBQUFhZ1FBZ3dBQWFnVUFaQUlBZ3dFQWZRRUFkQVlBYWdjQVpBTUFHWDBDQUh3QkFHUUVBR3NEQUhOV0FId0NBR1FGQUdzREFISmFBSFFJQUZOMEF3QlRaQUFBVXlnR0FBQUFUbW4vLy8vL2RBWUFBQUJoZFhSb2IzSnBBQUFBQUhNS0FBQUFRV3htWVNCQlpHUnZibk1iQUFBQWNHeDFaMmx1T2k4dmNHeDFaMmx1TG5acFpHVnZMbUZzWm1FdktBa0FBQUIwQ1FBQUFIaGliV05oWkdSdmJsSUJBQUFBZEFjQUFBQnBjMTk0WW0xalVpWUFBQUIwQlFBQUFFRmtaRzl1ZEF3QUFBQm5aWFJCWkdSdmJrbHVabTkwQXdBQUFITjVjM1FFQUFBQVlYSm5kbEllQUFBQUtBTUFBQUJTU0FBQUFGSkhBQUFBZEFvQUFBQmhaR1J2Ymw5dVlXMWxLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1MEJBQUFBR055WVdIREFBQUFjeEFBQUFBQUFRd0NEQUVFQWhVQkRRSVlBUVFDWXdFQUFBQUdBQUFBQkFBQUFFTUFBQUJ6cHdBQUFHUUJBR1FBQUd3QUFIMEJBR1FCQUdRQUFHd0JBSDBDQUhRQ0FId0FBSU1CQUdRQ0FHc0VBSEtqQUhRREFJTUFBSE9qQUh3QkFHb0VBR1FDQUhRQ0FId0FBSU1CQUlNQ0FIMERBSFFGQUh3QUFJTUJBSDBFQUh3RUFId0RBQmw5QlFCNEtnQjhCQUI4QXdBWmZBVUFhd0lBY28wQWZBRUFhZ1lBZkFJQWFnY0Fnd0VBZkFRQWZBTUFQSEZrQUZka0F3QnFDQUI4QkFDREFRQjlBQUJ4b3dCdUFBQjhBQUJUS0FRQUFBQk9hZi8vLy85cEFBQUFBRklEQUFBQUtBa0FBQUIwQmdBQUFISmhibVJ2YlhRR0FBQUFjM1J5YVc1blVqRUFBQUJTVHdBQUFIUUhBQUFBY21GdVpHbHVkSFFFQUFBQWJHbHpkSFFHQUFBQVkyaHZhV05sZEFjQUFBQnNaWFIwWlhKemRBUUFBQUJxYjJsdUtBWUFBQUIwQXdBQUFIVnliRkpRQUFBQVVsRUFBQUIwQmdBQUFHTm9ZVzVuWlhRSUFBQUFkR1Z0Y0Y5MWNteDBBd0FBQUc5c1pDZ0FBQUFBS0FBQUFBQnpDQUFBQUR4emRISnBibWMrZEFJQUFBQmhkdElBQUFCekZnQUFBQUFCREFFTUFoSUJDUUVZQVF3QkNnRVRBUm9CRlFGakFBQUFBQVFBQUFBSUFBQUFRd0FBQUhON0FBQUFaQUVBZEFBQWF3Y0FjaEFBZEFFQVUyUUNBR1FBQUd3Q0FIMEFBSHdBQUdvREFHUURBSU1CQUgwQkFIaEpBSFFFQUVSZFFRQjlBZ0I4QVFCMEJRQnFCZ0JrQkFCcUJ3Qm5BQUI4QWdCRVhSSUFmUU1BZEFnQWZBTUFnd0VBWGdJQWNVNEFnd0VBZ3dFQWF3SUFjaklBZEFrQVUzRXlBRmQwQVFCVEtBVUFBQUJPY3c4QUFBQmhiR1poY21WemIyeDJaWEl1Y0hscC8vLy8vM01VQUFBQVEyOXVkR0ZwYm1WeUxsQnNkV2RwYms1aGJXVlNBd0FBQUNnS0FBQUFkQWdBQUFCZlgyWnBiR1ZmWDFJZUFBQUFkQVFBQUFCNFltMWpkQXdBQUFCblpYUkpibVp2VEdGaVpXeDBBZ0FBQUd3eFVpOEFBQUJTTUFBQUFGSldBQUFBZEFNQUFBQmphSEpTSmdBQUFDZ0VBQUFBVWwwQUFBQjBBUUFBQUdGU0dBQUFBRkk4QUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQmdBQUFHd3hNVEZzTWVJQUFBQnpFQUFBQUFBQkRBQUVBUXdCRHdFTkFUY0FDQUZqQVFBQUFBUUFBQUFEQUFBQVF3QUFBSFBNQUFBQWRBQUFhZ0VBWkFFQWd3RUFhZ0lBZkFBQWd3RUFmUUVBZEFNQWZBRUFnd0VBWkFJQWF3UUFjbHNBZEFRQWZBRUFaQUlBR1dRQ0FCbGtBd0NEQWdCOUFnQjBCQUI4QVFCa0FnQVpaQVFBR1dRREFJTUNBSDBEQUc1bkFIUUFBR29CQUdRRkFJTUJBR29DQUh3QUFJTUJBSDBCQUhRREFId0JBSU1CQUdRQ0FHc0VBSEsyQUhRRUFId0JBR1FDQUJsa0FnQVpaQVlBZ3dJQWZRSUFkQVFBZkFFQVpBSUFHV1FFQUJsa0JnQ0RBZ0I5QXdCdURBQmtBZ0I5QWdCa0FnQjlBd0I4QWdCOEF3Qm1BZ0JUS0FjQUFBQk9jeWNBQUFBd2VDaGJNQzA1WVMxbVFTMUdYU3NwWEhNcUxGeHpLakI0S0Zzd0xUbGhMV1pCTFVaZEt5bHBBQUFBQUdrUUFBQUFhUUVBQUFCekZBQUFBRnh6S2loY1pDc3BYSE1xTEZ4ektpaGNaQ3NwYVFvQUFBQW9CUUFBQUZJTUFBQUFVZzBBQUFCU0RnQUFBRkl4QUFBQVVoSUFBQUFvQkFBQUFGSkVBQUFBVWhVQUFBQjBCUUFBQUdSbGMyUmxVamtBQUFBb0FBQUFBQ2dBQUFBQWN3Z0FBQUE4YzNSeWFXNW5QblFHQUFBQWJERXhNVEV4N1FBQUFITVdBQUFBQUFFWUFSSUJGd0VhQWhnQkVnRVhBUm9DQmdFR0FXTUNBQUFBRHdBQUFBWUFBQUJEQUFBQWMxTUNBQUIwQUFDREFBQnpEUUI4QUFCVGRBRUFhZ0lBWkFFQWd3RUFhZ01BZkFFQWd3RUFmUUlBZkFJQWN6d0FkQVFBYWdVQWZBRUFnd0VBQVh3QUFGTjBCZ0I4QWdCa0FnQVpnd0VBZlFNQWZBTUFhZ2NBYzJZQWRBUUFhZ1VBZkFFQWd3RUFBWHdBQUZOMEFRQnFBZ0JrQXdCMEFRQnFDQUNEQWdCcUF3QjhBQUNEQVFCa0FnQVpmUVFBZkFRQVpBQUFaQUFBWkFRQWhRTUFHWDBGQUhRQkFHb0pBR1FGQUdRR0FId0RBR29LQUlNREFId0RBRjhLQUhnMUFHUUhBR1FJQUdRSkFHUUtBR1FMQUdjRkFFUmRIZ0I5QmdCOEF3QnFDZ0JxQ3dCOEJnQmtEQUNEQWdCOEF3QmZDZ0J4ekFCWGRBRUFhZ0lBWkEwQWd3RUFhZ01BZkFNQWFnb0Fnd0VBZlFJQWZBSUFjaWdCZEF3QWZBSUFaQUlBR1lNQkFGd0NBSDBIQUgwSUFHNUdBSFFCQUdvQ0FHUU9BSU1CQUdvREFId0RBR29LQUlNQkFIMENBSHdDQUhKaUFYUU1BSHdDQUdRQ0FCbURBUUJjQWdCOUJ3QjlDQUJ1REFCa0FnQjlCd0JrQWdCOUNBQjhCd0JrQWdCckFnQnloQUY4QlFCOENBQWZiaE1BZkFVQWZBY0FJSHdGQUh3SEFId0lBQmNmRjMwSkFIUU5BSHdKQUlNQkFIMEtBSFFCQUdvQ0FHUVBBSU1CQUdvREFId0RBR29LQUlNQkFIMENBSHdDQUhJM0FuaHRBSHdDQUVSZFlnQmNCQUI5Q3dCOURBQjlEUUI5RGdCOERRQmtFQUJyQWdCeXpnRjhDd0I4RGdCckFnQnl6Z0Y4Q2dCMERnQjhEQUNEQVFBWmZBb0FkQTRBZkFzQWd3RUFHUUo4Q2dCMERnQjhDd0NEQVFBOGZBb0FkQTRBZkF3QWd3RUFQSEhPQVhIT0FWZHVBQUIwQVFCcUNRQjhCQUJrRVFCcUR3QjhDZ0NEQVFCOEFBQ0RBd0JUS0JJQUFBQk9jeWdBQUFBb2RtRnlJRngzSzF4ektqMWNjeXBjV3k0cVAxeGRPMXdvWm5WdVkzUnBiMjVjS0M0cVB5a0thUUFBQUFCekRRQUFBRnN3TFRsaExYcGRlelF3TEgxcC8vLy8vM01JQUFBQVhITXFYQ3RjY3lwMEFRQUFBQ3R6Q1FBQUFITndiQ2NySjJsalpYTUpBQUFBY3ljckozQnNhV05sY3drQUFBQnpjQ2NySjJ4cFkyVnpDUUFBQUhOd2JHa25LeWRqWlhNSkFBQUFjM0JzYVdNbkt5ZGxkQVlBQUFCemNHeHBZMlZ6RXdBQUFGd3VjM0JzYVdObFhDZ29XMTRwWFNzcFhDbHpGd0FBQUZ4YkozTndiR2xqWlNkY1hWd29LRnRlS1YwcktWd3BjMHdBQUFCY2R5dGNXeWhjWkNzcFhGMWNjeW85WEhNcVhIY3JYQzV6Y0d4cFkyVmNjeXBjS0NoY1pDc3BYSE1xTEZ4ektpaGNaQ3NwWEhNcUxGeHpLbHgzSzF4YktGeGtLeWxjWFZ4ektsd3BkQUVBQUFBeFVnTUFBQUFvRUFBQUFGSmlBQUFBVWd3QUFBQlNEUUFBQUZJT0FBQUFVZ0FBQUFCMEJBQUFBR2x1Wm05U0FnQUFBRklLQUFBQWRBb0FBQUJKUjA1UFVrVkRRVk5GVWtNQUFBQlNCZ0FBQUZJVEFBQUFVbVFBQUFCU1V3QUFBRklTQUFBQVVsWUFBQUFvRHdBQUFGSlhBQUFBVWdZQUFBQlNGUUFBQUhRREFBQUFibVYwZEFZQUFBQnNNVEV4TVd4MEJnQUFBR3d4TVd4c2JIUURBQUFBY21Wd1VtTUFBQUJTT1FBQUFGSVlBQUFBVWpzQUFBQjBBd0FBQUhWdWIzUURBQUFBWkc5emRBTUFBQUIwWVcxMEF3QUFBR1pwYmlnQUFBQUFLQUFBQUFCekNBQUFBRHh6ZEhKcGJtYytkQkFBQUFCa1pXTnZaR1ZmZG1sa1pXOWZkWEpzL1FBQUFITStBQUFBQUFNSkFBUUVHQUVHQVEwQkJBSVFBUWtCRFFFRUNDSUJFd01iQXh3QkhBTWJBUVlCR1FJYkFRWUJHUUlHQUFZQkxBUU1BaHNCQmdFWkFSZ0JQd05wWXdBQUFHbEhBQUFBYVhnQUFBQnBNUUFBQUdsYUFBQUFhVElBQUFCcGJBQUFBR2wxQUFBQWFVd0FBQUJwYmdBQUFHbHdBQUFBYVZZQUFBQnBkZ0FBQUdsdEFBQUFhVVlBQUFCcGN3QUFBR2xGQUFBQWFUMEFBQUFvRHdBQUFGSU1BQUFBVWt3QUFBQlNMd0FBQUZJMUFBQUFkQXdBQUFCd2JHRjBabTl5YldOdlpHVlNBQUFBQUZJQkFBQUFkQVlBQUFCdlltcGxZM1JTQWdBQUFGSlBBQUFBVWxzQUFBQlNZZ0FBQUZKa0FBQUFVbklBQUFCU1h3QUFBQ2dBQUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQ0FBQUFEeHRiMlIxYkdVK0F3QUFBSE1RQUFBQU1BRVdJeGFjQ1E4SkVBa0xDUkFKUFE9PScpKSk='))
\ No newline at end of file
diff --git a/plugin.video.alfa/resources/language/English/strings.po b/plugin.video.alfa/resources/language/English/strings.po
index a5905f12..bc9d9672 100644
--- a/plugin.video.alfa/resources/language/English/strings.po
+++ b/plugin.video.alfa/resources/language/English/strings.po
@@ -1046,7 +1046,7 @@ msgid "Movie"
msgstr ""
msgctxt "#60245"
-msgid "Series"
+msgid "tv show"
msgstr ""
msgctxt "#60246"
@@ -1249,10 +1249,6 @@ msgctxt "#60297"
msgid "Find %s possible matches"
msgstr ""
-msgctxt "#60298"
-msgid "[%s]: Select the correct TV series"
-msgstr ""
-
msgctxt "#60299"
msgid "Not found in the language '%s'"
msgstr ""
@@ -4267,10 +4263,6 @@ msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr ""
-msgctxt "#70393"
-msgid "[%s]: Select the correct %s "
-msgstr ""
-
msgctxt "#70394"
msgid "Action"
msgstr ""
@@ -4811,10 +4803,6 @@ msgctxt "#70528"
msgid "Default folder"
msgstr ""
-msgctxt "#70529"
-msgid "Repeated link"
-msgstr ""
-
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr ""
diff --git a/plugin.video.alfa/resources/language/Italian/strings.po b/plugin.video.alfa/resources/language/Italian/strings.po
index 0e9d857e..e53d690e 100644
--- a/plugin.video.alfa/resources/language/Italian/strings.po
+++ b/plugin.video.alfa/resources/language/Italian/strings.po
@@ -1034,8 +1034,8 @@ msgid "Movie"
msgstr "Film"
msgctxt "#60245"
-msgid "Series"
-msgstr "Serie"
+msgid "tv show"
+msgstr "serie"
msgctxt "#60246"
msgid "Full information"
@@ -1237,10 +1237,6 @@ msgctxt "#60297"
msgid "Find %s possible matches"
msgstr "Trovate %s possibili corrispondenze"
-msgctxt "#60298"
-msgid "[%s]: Select the correct TV series"
-msgstr "[%s]: Seleziona la serie corretta"
-
msgctxt "#60299"
msgid "Not found in the language '%s'"
msgstr "Non trovato nella lingua '%s'"
@@ -4247,10 +4243,6 @@ msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Dai un punteggio con un [COLOR %s]%s[/COLOR]"
-msgctxt "#70393"
-msgid "[%s]: Select the correct %s "
-msgstr "[%s]: Seleziona il %s corretto"
-
msgctxt "#70394"
msgid "Action"
msgstr "Azione"
@@ -4799,10 +4791,6 @@ msgctxt "#70528"
msgid "Default folder"
msgstr "Cartella di Default"
-msgctxt "#70529"
-msgid "Repeated link"
-msgstr "Link ripetuto"
-
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "C'è già un link nella cartella"
diff --git a/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po b/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po
index ab7ad8c0..8986f352 100644
--- a/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po
+++ b/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po
@@ -1046,8 +1046,8 @@ msgid "Movie"
msgstr "Película"
msgctxt "#60245"
-msgid "Series"
-msgstr "Serie"
+msgid "tv show"
+msgstr "serie"
msgctxt "#60246"
msgid "Full information"
@@ -1249,10 +1249,6 @@ msgctxt "#60297"
msgid "Find %s possible matches"
msgstr "Encontrados %s posibles coincidencias"
-msgctxt "#60298"
-msgid "[%s]: Select the correct TV series"
-msgstr "[%s]: Selecciona la serie correcta"
-
msgctxt "#60299"
msgid "Not found in the language '%s'"
msgstr "No se ha encontrado en idioma '%s'"
@@ -4263,10 +4259,6 @@ msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Puntuar con un [COLOR %s]%s[/COLOR]"
-msgctxt "#70393"
-msgid "[%s]: Select the correct %s "
-msgstr "[%s]: Selecciona la %s correcta"
-
msgctxt "#70394"
msgid "Action"
msgstr "Accion"
@@ -4811,10 +4803,6 @@ msgctxt "#70528"
msgid "Default folder"
msgstr "Carpeta por defecto"
-msgctxt "#70529"
-msgid "Repeated link"
-msgstr "Enlace repetido"
-
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "Ya tienes este enlace en la carpeta"
diff --git a/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po b/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po
index ab7ad8c0..8986f352 100644
--- a/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po
+++ b/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po
@@ -1046,8 +1046,8 @@ msgid "Movie"
msgstr "Película"
msgctxt "#60245"
-msgid "Series"
-msgstr "Serie"
+msgid "tv show"
+msgstr "serie"
msgctxt "#60246"
msgid "Full information"
@@ -1249,10 +1249,6 @@ msgctxt "#60297"
msgid "Find %s possible matches"
msgstr "Encontrados %s posibles coincidencias"
-msgctxt "#60298"
-msgid "[%s]: Select the correct TV series"
-msgstr "[%s]: Selecciona la serie correcta"
-
msgctxt "#60299"
msgid "Not found in the language '%s'"
msgstr "No se ha encontrado en idioma '%s'"
@@ -4263,10 +4259,6 @@ msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Puntuar con un [COLOR %s]%s[/COLOR]"
-msgctxt "#70393"
-msgid "[%s]: Select the correct %s "
-msgstr "[%s]: Selecciona la %s correcta"
-
msgctxt "#70394"
msgid "Action"
msgstr "Accion"
@@ -4811,10 +4803,6 @@ msgctxt "#70528"
msgid "Default folder"
msgstr "Carpeta por defecto"
-msgctxt "#70529"
-msgid "Repeated link"
-msgstr "Enlace repetido"
-
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "Ya tienes este enlace en la carpeta"
diff --git a/plugin.video.alfa/resources/language/Spanish/strings.po b/plugin.video.alfa/resources/language/Spanish/strings.po
index ab7ad8c0..8986f352 100644
--- a/plugin.video.alfa/resources/language/Spanish/strings.po
+++ b/plugin.video.alfa/resources/language/Spanish/strings.po
@@ -1046,8 +1046,8 @@ msgid "Movie"
msgstr "Película"
msgctxt "#60245"
-msgid "Series"
-msgstr "Serie"
+msgid "tv show"
+msgstr "serie"
msgctxt "#60246"
msgid "Full information"
@@ -1249,10 +1249,6 @@ msgctxt "#60297"
msgid "Find %s possible matches"
msgstr "Encontrados %s posibles coincidencias"
-msgctxt "#60298"
-msgid "[%s]: Select the correct TV series"
-msgstr "[%s]: Selecciona la serie correcta"
-
msgctxt "#60299"
msgid "Not found in the language '%s'"
msgstr "No se ha encontrado en idioma '%s'"
@@ -4263,10 +4259,6 @@ msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Puntuar con un [COLOR %s]%s[/COLOR]"
-msgctxt "#70393"
-msgid "[%s]: Select the correct %s "
-msgstr "[%s]: Selecciona la %s correcta"
-
msgctxt "#70394"
msgid "Action"
msgstr "Accion"
@@ -4811,10 +4803,6 @@ msgctxt "#70528"
msgid "Default folder"
msgstr "Carpeta por defecto"
-msgctxt "#70529"
-msgid "Repeated link"
-msgstr "Enlace repetido"
-
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "Ya tienes este enlace en la carpeta"
diff --git a/plugin.video.alfa/servers/gamovideo.py b/plugin.video.alfa/servers/gamovideo.py
index b67149ff..8a5c6e7d 100755
--- a/plugin.video.alfa/servers/gamovideo.py
+++ b/plugin.video.alfa/servers/gamovideo.py
@@ -7,10 +7,15 @@ from core import scrapertools
from lib import jsunpack
from platformcode import logger
+headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
+
def test_video_exists(page_url):
logger.info("(page_url='%s')" % page_url)
- data = httptools.downloadpage(page_url).data
+ data = httptools.downloadpage(page_url)
+ if data.code==404:
+ data = httptools.downloadpage(page_url, headers=headers, add_referer=True)
+ data = data.data
if "File was deleted" in data or "Not Found" in data or "File was locked by administrator" in data:
return False, "[Gamovideo] El archivo no existe o ha sido borrado"
@@ -23,7 +28,10 @@ def test_video_exists(page_url):
def get_video_url(page_url, premium=False, user="", password="", video_password=""):
logger.info("(page_url='%s')" % page_url)
- data = httptools.downloadpage(page_url).data
+ data = httptools.downloadpage(page_url)
+ if data.code==404:
+ data = httptools.downloadpage(page_url, headers=headers, add_referer=True)
+ data = data.data
packer = scrapertools.find_single_match(data,
"")
if packer != "":
diff --git a/plugin.video.alfa/servers/thevid.py b/plugin.video.alfa/servers/thevid.py
index 17e13d90..0b0f6b59 100644
--- a/plugin.video.alfa/servers/thevid.py
+++ b/plugin.video.alfa/servers/thevid.py
@@ -25,7 +25,7 @@ def get_video_url(page_url, user="", password="", video_password=""):
unpacked = jsunpack.unpack(pack)
logger.info("Intel11 %s" %unpacked)
if "ldaa" in unpacked:
- videos = scrapertools.find_multiple_matches(unpacked, 'lda.="([^"]+)')
+ videos = scrapertools.find_multiple_matches(unpacked, '(?is)lda.="([^"]+)')
video_urls = []
for video in videos:
if not video.startswith("//"):