summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-01-09 02:57:33 -0800
committerGitHub <noreply@github.com>2024-01-09 10:57:33 +0000
commit0b8d6e6620dc18e2af5f57280d19b8e7837b0337 (patch)
tree6990d52c73d6026520a642c4a493d88b06d21d4e
parent873e9a50e34eef0554d1daba144e0b9b83532dba (diff)
hotfix/fmp-rev-segments: Adds Fiscal Period to busines/geographic segments revenue. (#5921)
* add fiscal_period to revenue by geography and business line * data description and unused imports * update test cassette
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py31
-rw-r--r--openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py41
-rw-r--r--openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py39
-rw-r--r--openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py57
-rw-r--r--openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml212
-rw-r--r--openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml202
6 files changed, 487 insertions, 95 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py b/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py
index 4c44a136b6d..90d44d971fe 100644
--- a/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py
+++ b/openbb_platform/core/openbb_core/provider/standard_models/revenue_business_line.py
@@ -1,18 +1,19 @@
"""Revenue by Business Line Standard Model."""
-
+import warnings
from datetime import date as dateType
-from typing import Dict, List, Literal, Set, Union
+from typing import Dict, Literal, Optional
from pydantic import Field, field_validator
from openbb_core.provider.abstract.data import Data, ForceInt
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
- DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
+_warn = warnings.warn
+
class RevenueBusinessLineQueryParams(QueryParams):
"""Revenue by Business Line Query."""
@@ -26,17 +27,29 @@ class RevenueBusinessLineQueryParams(QueryParams):
) # should always be flat
@field_validator("symbol", mode="before", check_fields=False)
- def upper_symbol(cls, v: Union[str, List[str], Set[str]]):
+ @classmethod
+ def upper_symbol(cls, v: str):
"""Convert symbol to uppercase."""
- if isinstance(v, str):
- return v.upper()
- return ",".join([symbol.upper() for symbol in list(v)])
+ if "," in v:
+ _warn(
+ f"{QUERY_DESCRIPTIONS.get('symbol_list_warning', '')} {v.split(',')[0].upper()}"
+ )
+ return v.split(",")[0].upper() if "," in v else v.upper()
class RevenueBusinessLineData(Data):
"""Revenue by Business Line Data."""
- date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
+ period_ending: dateType = Field(description="The end date of the reporting period.")
+ fiscal_period: Optional[str] = Field(
+ default=None, description="The fiscal period of the reporting period."
+ )
+ fiscal_year: Optional[int] = Field(
+ default=None, description="The fiscal year of the reporting period."
+ )
+ filing_date: Optional[dateType] = Field(
+ default=None, description="The filing date of the report."
+ )
business_line: Dict[str, ForceInt] = Field(
- description="Day level data containing the revenue of the business line."
+ description="Dictionary containing the revenue of the business line."
)
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py b/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py
index bdd7fbfc695..adfb22cf066 100644
--- a/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py
+++ b/openbb_platform/core/openbb_core/provider/standard_models/revenue_geographic.py
@@ -1,18 +1,19 @@
"""Revenue by Geographic Segments Standard Model."""
-
+import warnings
from datetime import date as dateType
-from typing import Dict, List, Literal, Optional, Set, Union
+from typing import Dict, Literal, Optional
from pydantic import Field, field_validator
from openbb_core.provider.abstract.data import Data, ForceInt
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
- DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
+_warn = warnings.warn
+
class RevenueGeographicQueryParams(QueryParams):
"""Revenue by Geographic Segments Query."""
@@ -27,32 +28,28 @@ class RevenueGeographicQueryParams(QueryParams):
@field_validator("symbol", mode="before", check_fields=False)
@classmethod
- def upper_symbol(cls, v: Union[str, List[str], Set[str]]):
+ def upper_symbol(cls, v: str):
"""Convert symbol to uppercase."""
- if isinstance(v, str):
- return v.upper()
- return ",".join([symbol.upper() for symbol in list(v)])
+ if "," in v:
+ _warn(
+ f"{QUERY_DESCRIPTIONS.get('symbol_list_warning', '')} {v.split(',')[0].upper()}"
+ )
+ return v.split(",")[0].upper() if "," in v else v.upper()
class RevenueGeographicData(Data):
"""Revenue by Geographic Segments Data."""
- date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
- geographic_segment: Dict[str, ForceInt] = Field(
- description="Day level data containing the revenue of the geographic segment."
+ period_ending: dateType = Field(description="The end date of the reporting period.")
+ fiscal_period: Optional[str] = Field(
+ default=None, description="The fiscal period of the reporting period."
)
- americas: Optional[ForceInt] = Field(
- default=None, description="Revenue from the the American segment."
+ fiscal_year: Optional[int] = Field(
+ default=None, description="The fiscal year of the reporting period."
)
- europe: Optional[ForceInt] = Field(
- default=None, description="Revenue from the the European segment."
+ filing_date: Optional[dateType] = Field(
+ default=None, description="The filing date of the report."
)
- greater_china: Optional[ForceInt] = Field(
- default=None, description="Revenue from the the Greater China segment."
- )
- japan: Optional[ForceInt] = Field(
- default=None, description="Revenue from the the Japan segment."
- )
- rest_of_asia_pacific: Optional[ForceInt] = Field(
- default=None, description="Revenue from the the Rest of Asia Pacific segment."
+ geographic_segment: Dict[str, ForceInt] = Field(
+ description="Dictionary of the revenue by geographic segment."
)
diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py
index 981db010da0..adad792f284 100644
--- a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py
+++ b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_business_line.py
@@ -1,5 +1,5 @@
"""FMP Revenue by Business Line Model."""
-
+# pylint: disable=unused-argument
from datetime import datetime
from typing import Any, Dict, List, Optional
@@ -8,6 +8,7 @@ from openbb_core.provider.standard_models.revenue_business_line import (
RevenueBusinessLineData,
RevenueBusinessLineQueryParams,
)
+from openbb_fmp.models.cash_flow import FMPCashFlowStatementFetcher
from openbb_fmp.utils.helpers import create_url, get_data_many
from pydantic import field_validator
@@ -22,11 +23,11 @@ class FMPRevenueBusinessLineQueryParams(RevenueBusinessLineQueryParams):
class FMPRevenueBusinessLineData(RevenueBusinessLineData):
"""FMP Revenue by Business Line Data."""
- @field_validator("date", mode="before", check_fields=False)
+ @field_validator("period_ending", "filing_date", mode="before", check_fields=False)
@classmethod
def date_validate(cls, v): # pylint: disable=E0213
"""Return the date as a datetime object."""
- return datetime.strptime(v, "%Y-%m-%d")
+ return datetime.strptime(v, "%Y-%m-%d") if v else None
class FMPRevenueBusinessLineFetcher(
@@ -53,15 +54,35 @@ class FMPRevenueBusinessLineFetcher(
url = create_url(4, "revenue-product-segmentation", api_key, query)
- return await get_data_many(url, **kwargs)
+ cf_fetcher = FMPCashFlowStatementFetcher()
+ cf_query = cf_fetcher.transform_query(
+ {"symbol": query.symbol, "period": query.period, "limit": 200}
+ )
+ cf_data = await cf_fetcher.aextract_data(cf_query, {"fmp_api_key": api_key})
+ filing_dates = sorted(
+ [
+ {
+ "period_ending": d["date"],
+ "fiscal_year": d["calendarYear"],
+ "fiscal_period": d["period"],
+ "filing_date": d["fillingDate"],
+ }
+ for d in cf_data
+ ],
+ key=lambda d: d["period_ending"],
+ )
+ rev_data = await get_data_many(url, **kwargs)
+ rev_data_dict = {list(d.keys())[0]: list(d.values())[0] for d in rev_data}
+ combined_data = [
+ {**d, "business_line": rev_data_dict[d["period_ending"]]}
+ for d in filing_dates
+ if d["period_ending"] in rev_data_dict
+ ]
+ return combined_data
@staticmethod
def transform_data(
query: FMPRevenueBusinessLineQueryParams, data: List[Dict], **kwargs: Any
) -> List[FMPRevenueBusinessLineData]:
"""Return the transformed data."""
- return [
- FMPRevenueBusinessLineData(date=key, business_line=value)
- for d in data
- for key, value in d.items()
- ]
+ return [FMPRevenueBusinessLineData.model_validate(d) for d in data]
diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py
index c1a63bc69af..f3e824135c8 100644
--- a/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py
+++ b/openbb_platform/providers/fmp/openbb_fmp/models/revenue_geographic.py
@@ -1,5 +1,5 @@
"""FMP Revenue Geographic Model."""
-
+# pylint: disable=unused-argument
from datetime import datetime
from typing import Any, Dict, List, Optional
@@ -8,6 +8,7 @@ from openbb_core.provider.standard_models.revenue_geographic import (
RevenueGeographicData,
RevenueGeographicQueryParams,
)
+from openbb_fmp.models.cash_flow import FMPCashFlowStatementFetcher
from openbb_fmp.utils.helpers import create_url, get_data_many
from pydantic import field_validator
@@ -22,11 +23,11 @@ class FMPRevenueGeographicQueryParams(RevenueGeographicQueryParams):
class FMPRevenueGeographicData(RevenueGeographicData):
"""FMP Revenue Geographic Data."""
- @field_validator("date", mode="before")
+ @field_validator("period_ending", "filing_date", mode="before", check_fields=False)
@classmethod
def date_validate(cls, v): # pylint: disable=E0213
- """Return date as a datetime object."""
- return datetime.strptime(v, "%Y-%m-%d")
+ """Return the date as a datetime object."""
+ return datetime.strptime(v, "%Y-%m-%d") if v else None
class FMPRevenueGeographicFetcher(
@@ -53,28 +54,38 @@ class FMPRevenueGeographicFetcher(
url = create_url(4, "revenue-geographic-segmentation", api_key, query)
- return await get_data_many(url, **kwargs)
+ cf_fetcher = FMPCashFlowStatementFetcher()
+ cf_query = cf_fetcher.transform_query(
+ {"symbol": query.symbol, "period": query.period, "limit": 200}
+ )
+ cf_data = await cf_fetcher.aextract_data(cf_query, {"fmp_api_key": api_key})
+ filing_dates = sorted(
+ [
+ {
+ "period_ending": d["date"],
+ "fiscal_year": d["calendarYear"],
+ "fiscal_period": d["period"],
+ "filing_date": d["fillingDate"],
+ }
+ for d in cf_data
+ ],
+ key=lambda d: d["period_ending"],
+ )
+
+ rev_data = await get_data_many(url, **kwargs)
+ rev_data_dict = {list(d.keys())[0]: list(d.values())[0] for d in rev_data}
+
+ combined_data = [
+ {**d, "geographic_segment": rev_data_dict[d["period_ending"]]}
+ for d in filing_dates
+ if d["period_ending"] in rev_data_dict
+ ]
+
+ return combined_data
@staticmethod
def transform_data(
query: FMPRevenueGeographicQueryParams, data: List[Dict], **kwargs: Any
) -> List[FMPRevenueGeographicData]:
"""Return the transformed data."""
- return [
- FMPRevenueGeographicData(
- date=key,
- geographic_segment=v,
- americas=v.get("Americas Segment", v.get("North America", None)),
- europe=v.get("Europe Segment", v.get("Europe", None)),
- greater_china=v.get(
- "Greater China Segment", v.get("Greater China", None)
- ),
- japan=v.get("Japan Segment", v.get("Japan", v.get("J P", None))),
- rest_of_asia_pacific=v.get(
- "Rest of Asia Pacific Segment", v.get("Asia-Pacific", None)
- ),
- )
- for d in data
- for key, v in d.items()
- if isinstance(v, Dict)
- ]
+ return [FMPRevenueGeographicData.model_validate(d) for d in data]
diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml
index 020a5cef713..785e3edf1e9 100644
--- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml
+++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_business_line_fetcher.yaml
@@ -3,9 +3,183 @@ interactions:
body: null
headers:
Accept:
- - '*/*'
+ - application/json
Accept-Encoding:
- - gzip, deflate, br
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ method: GET
+ uri: https://financialmodelingprep.com/api/v3/cash-flow-statement/AAPL?apikey=MOCK_API_KEY&limit=200&period=annual
+ response:
+ body:
+ string: !!binary |
+ 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
+ headers:
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Headers:
+ - X-Requested-With, content-type, auth-token, Authorization, stripe-signature,
+ APPS
+ Access-Control-Allow-Methods:
+ - GET, POST, OPTIONS
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Max-Age:
+ - '3600'
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Fri, 05 Jan 2024 21:23:47 GMT
+ Etag:
+ - W/"dce9-lmsObLv7FoJ8s1nEBTpjv9OWr+4"
+ Server:
+ - nginx/1.18.0 (Ubuntu)
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Accept-Encoding
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Powered-By:
+ - Express
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
Connection:
- keep-alive
method: GET
@@ -13,20 +187,20 @@ interactions:
response:
body:
string: !!binary |
- H4sIAAAAAAAAA5WWPW/bMBCG9/wKIbMD8PjNbgY6JENaIwnQoejAygwi1LEESW6HIv+9JEXF8tGy
- Ghs2YJM83vPe8aW+XxXFX/8pimtKKL0h5oby60/pP//vvS39T05AKRJfq3Hk0bW/q9L5UaWBGjT6
- zdnW/ty5blXc1q+usPttsS5L13V1W7kuxATKAa2qNnbrh6jx72zopd6H3SgRXKft4uCb/35bnYBA
- BBE5CBOQlp4DkZpT8WEQppnE4iQQBlrOgoABo9hlEBJBZA5CfWAc+QgimJL64yBkTDavCFOUz4Iw
- 5VvgIgiYCKLPgAjF8aZHEC6pwU2yDEI517nsAwhQnTOOIJyyJRAdQcw5EK6xRPd2f3i2ZX9o3bbY
- tPX2UPar4mv/4tqwneIw0zigNcGdeExTSmkunwBQIU1GzqWpBRYgJjTmFwT0IkmGJqWiRH2NOSPi
- kLihWV9O9AUGC4nL3IPWTbNzRUqfaoYbYhgfC+ybGLf+OOG9X8fzmmnQTDQAYDMnbOgxxvVlFJEf
- 3hMUwdVlFEYp7g+MIgTJXDRHISRzqAkK+GZaqAqPKGoWhROFb4DTIymJwQ11wsqIL+wCq3eRzAyq
- Tb0d2kLikafDPnjEY/3c/7GtK9beJ47OAprIy+YLLPesUyihCN51yPmuSfafn5NxQoIyQHPlpsoC
- z3S5ayIz54DVuOsD8yyyJGLB3Wjubp9d96uvm6GImVUH0uLB7Wx/dLhuum+8WCjPbo9BgcWlmvDs
- ySPxCwnYIofOvz90VbkcWTCc08a1VeMj2N0wewh3a9ttUDNUw190eE3d9vE2CgIr0Lgk77VIW08C
- f3F98WiHpYwL3AZPdW93oQ265AULtYPcOae14wxvMGTxGtVqk1qja8RbtTuqJRlcUsueVYulzp1R
- yxcAxxzVWo17x8h1jLz3cnVJLmoEXvou1+lEUNn5CZYT4y5BU8IErvdgR/+1nCsi8vs99q7iYsF8
- SP4I++B6W+2CaSiTXT1XP/4BWk+i1MwLAAA=
+ H4sIAAAAAAAAA5WWPW/bMBCG9/wKIbMD8PjNbgE6JENaIwnQoejAygwi1LEESW6HIv+9/JBs+WhZ
+ TYIYiCne3fPe8aW+XxXFX/9XFNeUUHZDzA0j15+G7/y3D7b0/1LDhCLxZzWuPLn2d1U6v6oFJQSt
+ fnO2tT+3rlsVd/WbK+xuU9yWpeu6uq1c53cxo7lAu6q13YR0mmUBq/VrvQvZfC4xrsfFd//5vjoB
+ oQGE8hyEE1DzIEoDNR8G4UA5zIAY/zsPIrg2l0EggogchAkwWKIjiNScYm2XQZhmEoszgDDQchYE
+ DBi10BESQeSZ0fKBceQjiGBK6o+DkLHYvCNMUT4LwpQfgYsgYCKIPgMiFMdJjyBcUoOHZBmEcq5z
+ 2RMIUJ0zjiCcsiUQHUHMORCusUQPdrd/sWW/b92mWLf1Zl/2q+Jr/+rakE5xmBkc0Jrkp3wsU0pp
+ Lp8AULOeJLTAAsSCxvqCgF4kydBDQ1OivsacETEVbmg2lxN9gcFC4TL3oNum2bpiKN+bHB6ItD42
+ 2A8xHv3xgcO8juc106CZaADAZk5YmjHG9WUUkR/eExTB1WUURimeD4wiBMlcNEchJHOoCQr4YVro
+ Co8oahaFE4VvgNMjKYnBA3XCysjh9ppl9S6SmUG1rjdpLCReed7vgkc81S/9H9u64tb7xNFZQBN5
+ 2XyB5Z51CuUvd5w11XzfDPafn5PxgQHKAM2VmyoLPNPlvonMnANW474PzLPIkogFd6O5u3123a++
+ blITM6sOpMWj29r+6HDdNG+8WCjPbo+kwOJWTXj25jHwCwnYItPkP+y7qlyOLBiuae3aqvER7DY9
+ ncLd2XYT1Azd8Bcd3lO3fbyNgsAKNG7JoRdD6kngL64vnmzayrjAY/Bc93YbxqAbvGChd5A757R3
+ nOEEqYq3qFY7qDW6RrxVu6NaksEltexZtdj4PnpeLd8AHHNUazXmjpHrGHnn5eoGuagReOtBrtMH
+ QWXnJ1hOjLsETQkTuN/Jjv5rO1cke/0f/EpxsWA+JH+FfXS9rbbBNJTJrp6rH/8AMp/7vZUMAAA=
headers:
Access-Control-Allow-Credentials:
- 'true'
@@ -46,9 +220,9 @@ interactions:
Content-Type:
- application/json; charset=utf-8
Date:
- - Mon, 16 Oct 2023 12:22:07 GMT
- ETag:
- - W/"bcc-RmRDrPPLIZSDozSR7yOvF32ihbo"
+ - Fri, 05 Jan 2024 21:23:48 GMT
+ Etag:
+ - W/"c95-f87WUVMmUm4/WysLRNFu8Xy3rmE"
Server:
- nginx/1.18.0 (Ubuntu)
Transfer-Encoding:
diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml
index dd702ef4bd7..f86bca477eb 100644
--- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml
+++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_revenue_geographic_fetcher.yaml
@@ -3,9 +3,183 @@ interactions:
body: null
headers:
Accept:
- - '*/*'
+ - application/json
Accept-Encoding:
- - gzip, deflate, br
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ method: GET
+ uri: https://financialmodelingprep.com/api/v3/cash-flow-statement/AAPL?apikey=MOCK_API_KEY&limit=200&period=annual
+ response:
+ body:
+ string: !!binary |
+ H4sIAAAAAAAAA82dW4/bRpbH3+dTGHlexnW/9JuTSQADs5NgZgeLwWIxULplR4it9nbLSTyL/e5b
+ RYlq1b9OXUhdMEECO1RJRRYPz6/Olf/1h1ev/jf89+rVVw+r3fqru1dfCSbkwPwg2Vf/tv/k+cvH
+ nx4/xM/evPnxT9PRp/Wnx6fd+uHbz09P6+39l/j53/76x+nj+80v8QgL/0jBuJfTB+82Hz5stu//
+ eDod5wM7Dljd368/hR/ORohX3N0xdyfscZLVh/X2YfX09/XqaRo6ffZp/bR5fIhHv//7dGy73r3d
+ 3j9+jL/rjfeajf8cPn1Yf3pa329Wu83j9s324c3HcH2bf47/G8ZzrrmH8e/W4dof9j/5H6vfw6gw
+ Jv3R593j/S/frJ7DQj1+/LTePh9/jzkpk6H3P6+279dvt//5+PRLWKFvV582u1Vc98Foa5OhYY0e
+ P293z39Z3683v65++rB+juO4cS4Zt9n+ut7uHp++7D/ljvyVH1dfXn7CufQqH3c/r5+yU8qucxz2
+ 58ftt6vnn9/u1h/HH7NKiGRUuAFxwI9Pj79uHtYP33z5IdymsCLb92/ud5tfN7vNeBacM63SxYlX
+ 8rz7GK7m+e02fD98b/flxw+r7S7cqu/+5/PmU/xsvALmdXoJq/vw+fMmLvzzn9dx0PTJp89PYdWf
+ 188/vHv7MkH8FeE1T8/gOQjb87+vdp+fxtPEbyitucqXZD/o5QIPqyxlekMPC/O3ICffP9JfCt9A
+ ef1p95f1p9WX45VHGU2GBMH8+Lj9a5TBt8/Pn9fxeeDi8DPEoPBzhxV5GO+f1TD2YRNv3PYhyMxm
+ HMI1E4QkfL/Zrrb3eNmGcVIe4mW/yAR+d3NYM+YUiPf63bv1/e6Hd2HJ1r9/Oz4+zz+MInhyj+Mc
+ hyfr8Im2BlYgHH+z+2778MO7Hye1IZmFe7Qf9c36/Wa7DWd3MlYoDw/o4yTXccrvPzz+Rkv1/f6B
+ +u73oBkeNkG01rQEv3tar09+KWgul8paUKmjvv15t/v0fPf69W+//fb18/r+6/ePv75+E+7oJgjU
+ 6/XD+9XT66DoV6/3Ov