diff --git a/openbb_terminal/common/behavioural_analysis/google_model.py b/openbb_terminal/common/behavioural_analysis/google_model.py index d13aa315191b..2c00d94604c6 100644 --- a/openbb_terminal/common/behavioural_analysis/google_model.py +++ b/openbb_terminal/common/behavioural_analysis/google_model.py @@ -50,7 +50,7 @@ def get_regions(symbol: str) -> pd.DataFrame: @log_start_end(log=logger) -def get_queries(symbol: str) -> pd.DataFrame: +def get_queries(symbol: str) -> dict: """Get related queries from google api [Source: google] Parameters @@ -60,8 +60,8 @@ def get_queries(symbol: str) -> pd.DataFrame: Returns ------- - pd.DataFrame - Dataframe of related queries + dict : {'top': pd.DataFrame or None, 'rising': pd.DataFrame or None} + """ pytrend = TrendReq() pytrend.build_payload(kw_list=[symbol]) diff --git a/openbb_terminal/common/behavioural_analysis/google_view.py b/openbb_terminal/common/behavioural_analysis/google_view.py index 5b90d9728121..22fe0f6eaf48 100644 --- a/openbb_terminal/common/behavioural_analysis/google_view.py +++ b/openbb_terminal/common/behavioural_analysis/google_view.py @@ -211,23 +211,34 @@ def display_queries(symbol: str, limit: int = 5, export: str = ""): Ticker symbol limit: int Number of regions to show - export: str + export: {"csv","json","xlsx","png","jpg","pdf","svg"} Format to export data + + Returns + ------- + None """ - df_related_queries = google_model.get_queries(symbol) - df = df_related_queries.copy() - df_related_queries = df_related_queries[symbol]["top"].head(limit) - df_related_queries["value"] = df_related_queries["value"].apply( - lambda x: str(x) + "%" - ) + # Retrieve a dict with top and rising queries + dict_related_queries = google_model.get_queries(symbol) + + # Select the DataFrame "top" from the dict + df_top_queries = dict_related_queries[symbol]["top"].head(limit).copy() + df_export = ( + df_top_queries.copy() + ) # export the raw values, prior to string manipulation + + # convert to strings and add % + df_top_queries["value"] = df_top_queries["value"].apply(lambda x: str(x) + "%") print_rich_table( - df_related_queries, - headers=list(df_related_queries.columns), + df_top_queries, + headers=list(df_top_queries.columns), title=f"Top {symbol}'s related queries", ) - export_data(export, os.path.dirname(os.path.abspath(__file__)), "queries", df) + export_data( + export, os.path.dirname(os.path.abspath(__file__)), "queries", df_export + ) @log_start_end(log=logger) diff --git a/openbb_terminal/stocks/options/op_helpers.py b/openbb_terminal/stocks/options/op_helpers.py index 0b2f2c4fad30..58ca2dcfd24c 100644 --- a/openbb_terminal/stocks/options/op_helpers.py +++ b/openbb_terminal/stocks/options/op_helpers.py @@ -168,8 +168,6 @@ def __init__( Parameters ---------- - type : int - Option type, 1 for call and -1 for a put s : float The underlying asset price k : float @@ -182,6 +180,8 @@ def __init__( The number of days until expiration vol : float The underlying volatility for an option + opt_type : int + put == -1; call == +1 """ self.Type = int(opt_type) self.price = float(s) diff --git a/openbb_terminal/stocks/options/yfinance_model.py b/openbb_terminal/stocks/options/yfinance_model.py index 5149f2a7dd3d..12fdc003b79b 100644 --- a/openbb_terminal/stocks/options/yfinance_model.py +++ b/openbb_terminal/stocks/options/yfinance_model.py @@ -71,7 +71,7 @@ def get_full_option_chain( if calls: df_list.append(call_df) option_factor.append(1) - df_list = [x[x["impliedVolatility"] > 0] for x in df_list] + df_list = [x[x["impliedVolatility"] > 0].copy() for x in df_list] # Add in greeks to each df # Time to expiration: dt = (datetime.strptime(expiration, "%Y-%m-%d") - datetime.now()).seconds / ( diff --git a/tests/openbb_terminal/common/behavioural_analysis/cassettes/test_google_view/test_display_queries_export[AAPL-10-].yaml b/tests/openbb_terminal/common/behavioural_analysis/cassettes/test_google_view/test_display_queries_export[AAPL-10-].yaml new file mode 100644 index 000000000000..3ddeddf0d2d3 --- /dev/null +++ b/tests/openbb_terminal/common/behavioural_analysis/cassettes/test_google_view/test_display_queries_export[AAPL-10-].yaml @@ -0,0 +1,822 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + method: GET + uri: https://trends.google.com/?geo=US + response: + body: + string: "\n301 + Moved\n

301 Moved

\nThe document has moved\nhere.\r\n\r\n" + headers: + Age: + - '1495' + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" + Cache-Control: + - public, max-age=1800 + Content-Length: + - '237' + Content-Type: + - text/html; charset=UTF-8 + Date: + - Wed, 31 Aug 2022 13:32:51 GMT + Expires: + - Wed, 31 Aug 2022 14:02:51 GMT + Location: + - https://trends.google.com/trends/?geo=US + Server: + - sffe + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - '0' + status: + code: 301 + message: Moved Permanently +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.28.1 + method: GET + uri: https://trends.google.com/trends/?geo=US + response: + body: + string: !!binary | + H4sIAAAAAAAAAOybbVfaSBTHv0o2+6JvRBIeqnXFXUBEtFIK2G5Z93DGZEym5oGdTETs6XffSaLm + TmwH27pb0fEFh3D/d57u/c1NBtz+xQ4ttphhzWW+t7OdvGqEYT+yQv5h8i6xNnSXsVm0VS5Hlot9 + tB5Sp/wen464QNdsQhu6x6iueShwGjoOSscjnTeGkb2z7WOGtAD5vBEnDB0PlyLuVbrAlJwRCzES + BrpmhQHDAWvopTisHLQWs2rJvdxtmhPn4qhqDzZbHXP6z+6ubbf9acSm85o52NTLO9uMMA/vdNN2 + tTHFgR1tl7MPtz0SnGsUew2dWEkfLsVnYCKRt+5EjPdvrVuhX2ap8zSgjJarRq0+HbYNs3yGLhLn + df6ia9lKEB85uHxZShvd2T5FEb5u+rqNcjKwdNa3s5oTm7kNG/PGcCm9WNN8EhA/9kuRhTzcMNe0 + yKV8xCUWls4IawS8w2zVLgiez0LKbpvNPmY8ELhkhV5Iwfr9Wqts1vdqRe2cMIbploWoDcRR7PuI + Lr4ijtLg3or/yFY5W+RblxnleULZoqGHzla68MBFiMuXXdLVBC5B7HkS5Va6eEBvVjZlchcTx2X3 + 0SeznSYLIBt/ZFEyY1pErTyR5vP5epbYaR5RbKEZs1xURjOy/jH6PXHGtPHy9VlwdvABNZO/7uTA + rTYn++af/rmzYfc+VnuDeunyynz1nkc9DCwehledGq0v3qFBbzR9ezVunR7b04O3POPK2ShuR5Ol + JcOXrPwRXaDs06XNXCCq4QCdevg9sR3MRi6iWGtoGqMx1n7TEnvkhvPO5YxnGO7xJaEB8vohS1Vn + yItuZDPE3AEngFxyy4uTawxeXLeRIjYQJNnSnZRPihSeQAxPcg6FtoY4CmNq4XeYRnzzSBosCq0w + DhjB0egBO/8Y3XT8MO1Z0QM3GGFELbc5I0lzMBJJJpZRzELexszDDJevPRwcDoh1jilX//VJJ7a+ + pTeH+pqecsDfU4dzQAKkf167MR8DcxwxijwCzeOCGRpbndzYwp5DYh8YQb8tiq6Il9vazdzWRgGy + QaPt18DmEr7/5KY3wMT3Sf8UjqY9AdYrbLnQuHuYG3dxwHfJ89zY6ebGjrPgsN2a9nq5aY8EvB7a + wAimuEcRxxN0CNami6mPgkVu7ALHLsUYOu6Dke6HgaMd8hdgBvHajwMn2e5vjb1+buwFNlyA3q5g + CgMcCWYw3B6vscI8eyAkvYgiDELZAwnSY8gDozkY5KYDNENBbjoE3R3iYAFGcvQhNx0hDy2EcR79 + Caz4Minjt7Y+GGYf83JKk2lEQDCBgrk2wUicaB8kQp84WMj2Psi+fkjnCEx1AOYzwDQGln1g4elM + ZjPC1x4IwKgHoTiewRjaKIsdBJZ+CAY0DHmGwdEOQZ4M40hYxBHAb4Rim2hNigSWRmAhRoRnGb9f + ATk6gQ2EMd+dmmeU3/uBAA+LikPeAuwBrNhojm0MsqO9D22EXWWRzAXj97lgjMgcptYYOI9dRAqe + YFzjmJ5jEMRjMKvjc4p4nACyLWAM+L2FrR3yhbFDsOXxm+SiJilYMNrvAKHvCGb8rf7572z3xlll + HhMfw138FPH3QbouR9w5bSYI55pZgqmFIqa5vPikXX3NpXbHpZY6RVIvs2QXvOzr3P+ax8Ydj43E + p9hNb9K98WIht/Oe/IJf1biXY/WO46v7OZqVO55mRfP5DaO71LdeWhRc69qC12yJI/K8acUwNnO/ + 5Eor8VtXHPHSLPUUnGrQ6TqBFiTaj0/v3AFUDLM+7b5+02qCrabrhadwM0lFS24GUo2srqcCWXFP + BbKymQqktTNVSApdZpdXu1QjKU+pXV6IUsnSXS5b+ntsHalQsn/kEX7NE20Uz5IHSGx/4OmW3BlW + jMrNXSOXJJ9mWcBrUReHXPFJv06ALZ4V0Y27vpU8HKzdDKFiwhTjV8nwvio2BLEhFZuvoJhfScUC + HvxKKt4QxBty8UtB/FIurgviulxcE8Q1ubgqiKtycUUQV+RiIYKmPIKmEEFTHkFDiKAhj2Bxg5OL + hQga8ggaQgQNeQQNIYKGPIKGEEFDHkFDiKAhj6AhRNCQR9AQIsivPv+9pjc7itunxm164HJvcAvq + n0auOI5l6BbUS9gtqJfAW1AvobegXoJvQb2E34L6iwAPFcBPDeBvKryK39Xmd6z4VfwqfleW32PF + r+JX8fvd/H7T0++D49vaLeIrOi3jt6BWAP9XABcw+4mPwIWsWsJwQf1EIf7JRbilTrFWgWFVhBW/ + X+a3++z4LWTsEoALalWFVRV+hBSro2hVhVUVXl1+P/zYs7ACWALDEoILalWGFcbfi3G7qcqwKsOq + DK/oiXR7X+Gr8FX4rmz5Vb+EVvwqfleX3/7/+Y1wIVmWIFxQL2G4oH6SB9IKY4XxlzF+o8qwKsOK + 35Xl986XSeow+lFW4MdzFv1NDKuj6P8D4okqwqoIqyK8qvzudhS/z5pfUazw/S+/SRLFDwDvoYL3 + WcOriu9qF987J1jqIPpHH4Ofx4+y1IPwo2P5xx6EFcrPFWX1+8pHx3Knreryz4VZnU8rlB8G5Tvn + W0//SyaFsSrJT47j5/f/w+qoSxH8lAgeKYIVweqw+rv5/aavmh4c372ewvdZ4PsvAAAA///s3dsN + wjAMBdDdEFAeP7D/MgwQkFopLX6cIY5uYjsOviXj92p1B7/8HhS/syc9lhO90/TuWMPCF99vfIcX + /1kbSkEIBwlgRehWZ+jFGfpPhA13QDwL8fAdS8qOcNbJjqySjXZEg3zz+qHcgdqVuJFfa3hksSyu + YbnfzXgb4yBhzDDDPw375zAD4SjnaaWtcILvZ4KrCVad7kX4gnA1wkK4lWDb4QkmOLPgoTBNMMFz + KlkaSwf4fVvFo68ki0tYHqa1ZLEslsWr/W569zCd7+OFL7778JW/BwB+qke3A/wBAAD//+zdPQ7C + MAwG0LMxsNHCxM/9L8KMKiFZitM4eXvXp89x7AbgmQCvN5mVBzh2DJ5f8BIV9NmAXx33lXSzdLNY + zrPstbSzwphiihspvh0WD2OJXPWCKURZIrNcwfIcfwNI3FzKhFx0d4nj8Rw/OeaY4+qOt61nbR2C + rNvFMssRy2/drmbdLnfHfz7mN8Xvh19++a3qd/dm2nR+M0tow1vDCbZLPJ1gCdzR77nbD/t9Ob6x + Rha/eliDJ7CJLYIlcFm/j8t698KJc1p5gse5SXIMHg7xVQgLYYDrAj68fwhwH8CxcY48wb8fq6KL + +fXUUoUAblZDfwEAAP//7N0pEoBADATAz4HAIID/vwWFQm5xTNIe2zVDWLImWQUN+5aUYDiyRMvg + F/zeFnmYZJlkSeEwxbvdtP5vYLmEZbtpNWqCgwVv/Q5oEUxwJcFjfTpR8H+69IOvxRS3UuzqYTls + Nh3rd7+dsuSXXwkcJHiyZdpcmuUSlmdpLI216Vi/9nbwy2+u36Wd3yd7tJNaWvQXiv3zIIUJTha8 + uqelJGNJ3Mvx4N0OqY4Np20CKGd5bKc0yl0py+XfWT5s9ShXra+HTwAAAP//7F1Nc9s2EP0rPKa/ + oZODvkwxlBWGFJVGt5WIkhiRoAISVqVO/3th56Ana7xIXLe1Ylw0GvktuVjse7tckuP/uxj7OfV/ + wN+LN4o9fz1/fQW+IgZ/9gz2DPYV+Fr5m/vnpj1/fQW+ZgZfPKv1NmbT/x6Nf2yc5W8yeSK/DJHf + 3ovEvhS/xlb6HOyg7zn4DbPX/6vSa2Cvv53kK/CTHF5O3mYr/XruDXsuey6/EJcvHr309fgV1mN/ + Qewp/BSFV342/dNR+CoviD1/n8ffi3vDr6edvs4XEX+smX6E9t20p/LzqPzXr8Ed6eAgu1C0idxs + hU6E/iLsb++DP7+hnq7U4ezjcDA7HTSs2zXVnBPj1Qk9qEuhJXHwQQpwXQrVS8Ub5GBgul5T7TjD + 4pEBDx+OT/AhqbKmQnQVa/EFLERN2nQsfHIGL6VpWDgEaKjpKNnoD0NAm7okx2pHgxN+RIoKHg2Z + MKpkLVjw/AzM7+roI4Dbum3WDr9TxHc9BancsBZTtNAt9Y4TQBqPjmJT8fBxfIKPhWpIb1k4LHfc + NlJZ51WQip1Z13LDWU5GJ8vJxlDRahYO+TApD7ueA2dLANdBRvWd8/iQzJOubxUfppvoBL+RqiZV + sHDYsxtNasMm3Bh8CYVuSB04eDgFeEV8fobgSaiF4D0JQXJCQ71oqOaTE7gybVVhNLEaMo3P8GUQ + 2w/WAFRzapTVBTY2EfgTqYLf1Gh8Bm6V6BwGn8BA01cWO0GscGVMBAoVdZoEq5YR7FPUU83G5ENy + An+gHSkOHIN8xHSkbWU1ireAhcZCHdgIxp8BbPYkWV7PgNcz6u/43ZlBUGayrww5SH0L9e/WJvrB + sf23vwFe/CE3LYu+BfSB7qU1eDc0lt6/cGZzSIS56Cuh71OHJdV8hSb7YCXIlW5zkNe5dDY7c5D9 + eav3xCZcAiRPaCtdGZRkiK9FZ1spVqaSARrYL6zzCSSo7SANiwVtTWyjIHc76wsb/QQ2LGldgU8W + iNa9KfmuNAH9TozQfXvfMLCJl8JmpW3jYkEKCpuazsGBDEKfkSlkMNDk6HkyEOVMKOFYcpohXLsO + DpmcSVsgLIhNngyyM6vbO5ug/Amic7xwxHOFEWpNXwWD37Wjx4vTxzaxXQVrMsEo7UiyDJvhmrUM + ZqS2/KKhNGam4PmbAcGyvSgEix5NES374zeFY08AQp0dHFq1gBKzILnnfV+AN4uKpMuVBezUwuit + YJUwh+TMS3to1vMcMiffanKo4ADCnitp//7AxWDSSG1bN1a0wuGFbWzJU7TsJV2eXVhlvetUOWxe + rk1p+OKxhFUtrVgcjeBb0CWoy1KK3n5l6QnpsZLNmtZ78TA4fBhS/NOBAhi4rwEA/B2XAOjLs3bP + Dzj8gMMPOPyA4yUGHH4G4WcQP+cM4m8AAAD//+zbOw6AIBBAwbtwBT/3P5otsQEREd3psTHG8Ca7 + DIJBMAgGwSAYBIN40iD+rglLT02oiuvsfDkfx1BF8ZaYna28dmRPFH9A86MJA6EaiWpQjfP3QzXe + UA1Q8SmooA7UgTrEUgeQABJCQcJqzyFuAhsDEMzTBrM9BzVuxkC6t6S7GQO1r/bVvhkDNGDPYSgo + bEABKCSgABSAAlAACkABKAAFoAAUgAJQAApA4SIo7D1XHZpeFoSAEBACQkAICHETIQ4AAAD//+zc + MRLCMBBD0StBBdz/YsxQCQqkdWKPHf9+XTFg6YXsZxaEACFACBAChAAhQAgQ4goIsY4nPPAEPAFP + wBPwBDwBT8ATPjEYT8AT8AQ8AU/AE/CEn3E84Y8nPE9dxZh0/QOrG4OmL9NBD9dpW8Nbd0jaUq2z + rlPrbFCpddwXXt1l6fuursn0tW/MUs2oN+kSTteDGhd2JpFZx21iPrQMNAy+ciLMd3rCxjsZ9llK + hqPkIvNpsJAjYa5o3K/q7339mmbXvpzwF7kOB/e4/uIW786mrbKDRbo/AFeNtrd17qqRSwtgEfSW + NTrY7WQYg6wWEaX5jKgz+XTmlZJ+zOMTC2nBCy3YRQuiTKrN20fSQRhRS7va6XzY1VaXxdcZlSQK + r/rZBtl1QoSxyVIFwMXEC+FOkBAVdmwi02ETyCAmiAliGk9MJZiZR1m2QZAG17gCVUxmDwgBQoAQ + HBGC++1MIai1mob/pPEuA+8yZJLyNcy7DDs8Pez6LsOijybfAAAA///s3EsSAyEIRdG9ZAf57H9t + mVKVijy0tUHv3O6pjwOo+85IjGc54ecwXdJ/pQfLCQ3Hy1xtzev0smnApoGtV9g0YNNgRZ3O84lX + c8KTgQO1sq4+cDBxIsAtLDM26aNddKHI6u25+1WQPe0WQbTzW1/E2/lurk/ZoFdyt+3n+xm6u/sv + Jmj7fzcRD0wXKHmYYYRGnOwfRvDDpJ0k8NMhwwqPk/dhWHG5jW4PnaiIkWA25IvTWlCyCs8jxORi + hCIK+cALH8AHzvQB9+bPaQnKnY89lLGH0CoBUrFeKoSABFXsTxVueOx2jbT7G+abYOIEUA4ClGQm + AnE4xFHfLILjNIXJYjIktGTgvbEMSPfNGkpQrqbq8lD3KYTYiwYRBhFuWdAENJmCJn4usYeVWILI + PBSREZKXPT7r4YiJdiOmuU20J9MUixJzkSQk6WZJEkoa605KRbPOqWLq1I88HWoDw1zuJGH3iO/P + J7KGlgV8sAAs4HgL2H3Iwb9CKO7Hi/svAAAA///s3TESgzAMRNG75A4ELsb9KWgoYMbLyGZl/T5l + JuQ/S6Z33NPf9v1tNW1Rq9jTRzhJ/WElDwjeOQLWb0qhUvCazh2oPa0d87+4cMKovrXlhHd3HYSO + ByyQwC78rI4BhH4ioFU+0U60E+1NT3kq/+vKzxruZHhkV3O4HVLiHG7btL668yDd4CwvSGAJnSyh + ogywYRDlDqEm8McEMIHHj6sn/7AALAALwAJxpc95PpCQHBKa/joCD8DDpPBQ+J4F1CFWHcTXufSd + XlAJIYkIrIiAnwjYrBmwOnD32fkvBgAnSuIE1w6EyQdrD9WZhKsHmM74ue5J5HWP69f0tmvCmERi + D2fHSAwTo+YVxJcsGM0HaHsJD3ZwWsCGBWABWEAFC1D6vunxMZUHHAAAAP//7J3NbtNAFIVfxeIJ + 0i6QEGLhqZQ0oP4gUCsBGzsdkmltjzS2g1TEkifjxRgyCTnT4jiWalFPziaLnDuJdefvni+OhzyA + PIA8gDyAPIA8gDyAPCA0HtDlRE2ygINkAa/IAsgCyALIAh4EkwWQBQyLBXQoG0gQXpAgkCCQIJAg + HBBBIBIYLBKgt+/m7Zsb7PiPwPEoYBZAa/8gltae1p7W/qCsffueGwIHoKOno6ejD9jRt5XedP90 + /0/7HIW9fkgkL+iTFwRzU8BAWMDRU7KAPebb8yUHZAFBWPthmvUBm++WxZ0+ne64f3e8z/YfgkGm + 3Q3W7vZrYVvrUdrdwdvd7v614/GEPLHANdnj2YFd/HTv/+cP4eGBvZ9A8KxuJfg/RODH62hpeyPJ + shNdF9Ywy3Ii9aWa3UkTvYk+f18vtGMw1l/ndnhv6zMXAJXqr59/doRoWm7rTxcDVVKcpX9HzU6Q + 4FrCuhvn0qxWiQ9JrjEGkh1bF2MMihcoznWG2tTTapV56ntUq8TMqs2a5vSJpyu7vkdf6tHo+GUk + EpPWNxjbiD+cfIZyLr38xNco1ilKjZRkJxRxIqbd1hRpom6xXwVkXiQLOwehQ8WpJ5pNudO2NTld + oG6/+EbjRzdsUzvBjRM/eaK6l6C9Ra3wLvcMJZN7HScghWJReyNfwNASOlNLTK+IUSxtj24Gx6k0 + 93Kul94IENcYXpXfEk+9QrVeymo9xyDk35DKGWa8UKMqVS6iFRoooouZtK8fpbFv6zVXcMvM5HGb + K2Xmqng8vcU5xtaFVKA18TCnjlE1dzYn0TgpNURMvYjaXvZWfAfD8CTJU73CHb8BAAD//8xbzW/j + SnL/V4i5zHvAyOb3x+QkS7IkW5I9liyPDQNGk2xKtClSQ1Ky5d0ACRAgH5cglwCL3LKH3RdggQTI + IQE2p/kj3ttrkE2O+y+kmq2PoiRa0mIOOwMbMn9V3V3VVdXVVdQCrbRzKI2jCO1eQeWNY32MjanQ + p7GLrekTxmPftpkW16/efIm3mHQGt7hN/VWQFioQG8CN5zeUtYyIZ9XIvSpDgmxge33wjWyOQ58x + FEN4B1ffsK8KyroqkRMlwnfnFJwsHHy/RaCi4iNXCd6XaBTF2P0rdQxCwBZKArPnVzKF8Iwlqm4S + Qh6fDEmChTvHVNHTlrUWp64cRwZY+frvKRXc//6LXzSnkR+j1RTVT/kQKExXcgG8coORmHz9FUG2 + X8G2MxvnImFRCZYfqQUVVw6iUFh99G243SKXqqLNWeTlCN2dtb+Zo3Nwa4V3Z7LO02fkebUvkD9H + EE8CoT6B6yJaZw1tRw2iV5wDC9J7voI7DD7DRoZIOzV0HNTSoR+NMe8pUvspCZ5wMiR8xz4kQhtE + AvdLvkdsF5gtjuimkZ6iPTv1H9GKikrgHNxe8eaaPMUYDZ0h02Lu2LncJLmMgtmqSszj0SZVVjGh + 8epg8SkSpo4ib53YOCjX2xjKh416riIfwVGEDbOgXP/GBY1DSH1134bIC4kegrfX9TnWymNruq9X + c3D+gKmjsjTcAl0aRJMxHvs6h6Mkp/j+yOE6hmELEooV0cFo3mXqN+tY6cRPEjJBJLeYZJZTZAOt + qwGXTmSiDbSpDUpid5EJtZ1qFJJgy4Wh8NLL0cIGCocL+iU8F0JpbdOh+T3b3jvhUGGrhMPIUJox + zhK39kw4UtAi4SBSGqiHCpEHsQOPu71lwrGtHZIMOkPjnkFSnwvv27slHEKLPaNxzqzOUAA7i2IX + 873RVOH41h4Kh5BvnvuQZRFsVZ+REZxHSTRFB2dBDYRjyEPOZ/Fg9ppfUAtFpxbBqUlBrYRj6E7T + onDDxVGt1cVgEqVDtNYWspyWb+evv63bHIi102piCBKAlIZJSvHNprhcw2HkJ63JC4X8eRIjP2qj + bW0TB2cm7TqGXDIgiYPjZvsG4wF5RhtX2AnjaD+Huv4UHx3tVg7Fo/ZySIqHbGAohgwxCDZDTvtT + joqd+18mKCS3rzA+gWMtr8329Tru43ztNre+WZSmeOzt3T5+huMSmu/E65GnjQJTOwrcaIrBCgZD + ggdud3LYIMrVDtq1HJqyIlmMubt5PIGTniA3a5cxHkdObuo7DL6ygz6v6x1lw4yog2bokJGfSxY6 + VxicxOgU66Ag16FjguLmW41UTlDBBM9ChQTUzSeQb7VWOQFy3A6E35gMJpi/huEBRV5V1IPl4DUG + sTY7KEHrRLEXBU8b17vzyxxNrt/Ft+R8nQBCwrrs7fVRWA7YZld+uNdveFxBkzjDLpAFXIxwfC7s + FnP0BqMBzl6K+8Yc3l5z5lgdY+MJEdjOrmdQl7eYKttWJNHWNjRH3ug6cwLkqZd+6hA/3lJFKGhF + c6yo88zRNwroGcEnpJtPJJchXyGxrr7+MAl9fPIVtbA5uL1jzTG0j1fPy5p4ht3gTmu+FNxtY4jb + XogE6SI9dL/+MhJ60ejrD4t89DL++pvQ8XEi/majnFMUtBK4GNub5pyxgrGZM6RBgHe9i/az67Pw + KrRohE22uMvO4c85OAVtwLlG0fYUtt05WtRl5yjKeLqsxhNtscnuBSYa5cvTb7bl+YWju04xv/gt + dow/hJ12n324d27M/1Ybny9wY4ZVuyYj2N7W5/lTYVcog0/w/qVHrCmQDr/+ENARigrdRp6oQQOK + r1XnnTx+7qdpspC+Q6c+zk8redrWxMkF59M8zJMcFAXaefyS2Rxd3tXYCR1g3+6vTdf3Q4eClc0Z + +J03H8i2t8U4hHcKsqfs4wpF9Y/ulAQ2ukWeZX4+y9n19vcrMuyt1yk489a3JzKo4GUJjp1h7NFf + P5l6dxgPX/OxsPDNCo4iU+r5oyguwTUCJ5A9FAl60QBFvN45Rp5o7kjsXWAQAgiCUKTswXb4Lllq + vBfZJDcHMtIenAD58tD2l0A41s5jrPO1prVKnmJp+xW4uUbJpsf3+pgBTAWJe42muz7qHgkXkzSY + QeDcHKbfXCMt6n0UNG85VvBKSwbu9QYLj4Jvv7DCp3rz/RROUvA6CgeRdV6/2nTdevvorO6TcEJS + pNd+GYNpVhOu+CnuJhU2rTlc8O4LP+5R3LqBq5u/tIHTSTrBwbKGnOiGOUjMesVDgvvBt2glt3SE + I8MdMo+7teJjQROd99CDyIF8ctk6/9k7Gj7AhsCCwkHAGmff5bbkexgKKGBbNyme+MYyEsiyPr77 + 6Ve/+6uf/vOnf/vp17/7u59+gKf+Mzz98Z9//Icff/3jL378F3jyOnyodODh//zHb/73H//6D7/9 + G/jw+3/6rz/89m85CEELgb//+3/9v7/8JQPnLwA4JN1o+oOWV+KW4bYMRHSwVsa1VyQnk4QFegTS + FViDy2OcgvGDstEFcbSiaMAVKUUN4hQFYMc/7lEHgQk+jyGVRZMOcTQbC8mi8DzfpmdKnzZElUVZ + LolWSZRwAJ58ELp0LEirsTmdWVIkbGPuB6E8GQjKNkIRByI6JxQ3CWUrd5PmhPBwk9DER+SC0NxC + aOCkNZ0TGlsI9RXhaezPCfUthNqadjJCbQuhukU98DDvKqD/9zQsXXff86cvSeyxwykE4N3yj3fz + N1RCEswgqCRlx2FvqjDm63JJVUVJNpWSNB9jktC4NoKTk+HzZ4Op/9om4ypknn6InkOS5aRwUUku + Y5r4kB6kXdb9brrZwuagLEr6On1/XEA4Ha+T9pilFY2bZuBi5S8xZDxTOmv54RNaZe55d/FyD2SZ + ELoHNEGUM0riZtiF386wD/JEtZFN3es4SLJwBDOK7z7+7J1LPTIJUuYpaTpOPh4fPz8/H80g7Z3Y + 9MiJRseU8R2fip8+n2jjZ/lLDXaYsUuHsHfLzRpcn59a0e2cXT6E/eX2oX19YhK39mnOrhzC3pqW + ktuHV7PdSebs6iHs1f5zo1Ivxw8XC9m1Q9i/GJFxpZ0MbqoL2fVD2M+bfX9mtB6CiPl6s7qTQRmr + j/WZ1uhdOMAAN+pdDNPbL6Fpn9mNwUK7xiELnDbVViNQZ6eTaL/5tK4hjk/N3qx6PZ/PPGQ+nZy6 + tWHt7tNjbT+FlGaXZ69X9HxyxuJv+3YnQ+yLL1dma/ipwfKjy8ZOhlv62HoJzN6T/AQM/c5OBqq9 + WMPrycVTM5qrwDpEBXdXFffi6sy/Hlzvp/JQbQfVsla/nT7x+eSDvD+OnuozcTi5rbG0rrx7vpk/ + lL1PkhpnBbCT2k6GRiSLihVZT0N2mJ9c7GRwtbvXdkkdnZrPjOFqJ0ONti7kwWn19guTodI6cIbK + oUuq7F5SnqF6vpPh+rZ61zDjqXjD7iLVQ5dUqxzIcNrcvdPVRK4MXXOSMufKEti3GcRqoz10ldHd + BfOVeu/AJTV2O1eeYY8A8fmuYTWcWTkIB8BwdrmToVkaGQ8n9sl5nVlr+/OBS9ojBPWlm/HDp4ZU + HjIP7+zeh/wMnd3m/UUn47OhF55kMnR221IUVGu1V+V6MmVa6tztDtSdm8A9KevnJWYal+UDZbjc + HTXWGHYH6sZkWFamDevRy5a02+Pqo5Nu04unpy12E7w81Kcvd+90nmGf4/NWl+unz/3klQWB7m4t + he36+eOsfnXVYTvdre82jWmiXdfK0+fsTctu/0AZenscmO1p/9nTnauAJTXXh2qpf6hp7HEkl+rS + a2Aod6PTxRF5UIZb+2JH5Wap/1SCpObPN3PwExKGNG6OBmsp+HLYJAmOBknKaiXZsGlMQzd5SMfp + sW1QVbMMi9iq6DmOJWnEMSRRtzRRIvDfMx1N9RyiUcnQ4G9qU03SHdvVPd2lrn30OGYuy5P2fSZU + PFNRdVVURFkXLVH2FOo6sucR2TF1UfM0W5Ft0xZV3ZFV21JsYlkSoRIgBvFMuppQ3m9CzwFeltZr + tuk6nqKKNpV0UdUc1dQNW9MpMVURxCamrpgOVYjlEVf0VGqYruYgCZX9JpQMS3QU2SWS4rhUcm1P + JZqmmKBV07YINYnpiZapaJ4hg3ygTZcqtk0dQ5GpaUmrCdX9JpRlTXaAW4M9lFXL1hXFsgyT2DCp + KVmO4YiOJKkGkURqe7bkuYbo6FTVCXVlWXVWE2prtrg5IaRf2c8Do36wM8tb8ev7LRi2F6xKt3TT + 8iiswfI0z9MNyRYpqFzxqKO6MDzVDVWnFvFkAtrzDFPUJFdRbWQDxp4asixZsRzTAvWYtm3Ykqgq + ii56iqg51JYU0BmF+SmYuutplsM2jSqwb66iUNldTWjuN6EuGxpoWtcs15MkU9cICCjrhmYSUTZM + DRwN3IkS3VINyyA2MVTHlgyPmqIqO6K3mtDab0IHxiKWDtZNYcNlSfVkENOyiKIpsqE4smGARTqi + roPsuq3ZLqjEIcTVqEttR1xOKO8ZOBxbI+DGrgluC5sEsumqB65qg1aJ7NpgfQ4IpWvUgBk0QzF0 + 3XVVjciwBkkxVhPuGTjAdyhEHRuEcCg4pmyJikpFEexckkFuYlCi2LKqSLoBSpZEQ9ZVSwFfAxc3 + XfFozN7am5dNQmIHtOxO2UuqbiUajUnsJxEr2gjZl5mEebUy8Fm1xndphThD2k1ZrXwwY7UQ10/Y + GO77rZTVCVD6UdgM2z6rIVMnYm/lwvACmB37dyRun+Nk4gdugyRDNokCYerhqiJK74Wf/1x4D4Ow + OnlaimkSTWKHlqY0TmCa+SLmB0qdRlnValHviqlDxqkzJF0/pec0W77e8kLv7JaU2b/63dlQKd81 + pM+jp4HhNh+V5qVWenmVrJv3WGFXi4GYIOzLpEIO9RM/HDRTOkpOZlW+lNrLmMY+K8UCC+P4M6HS + uuheX9UeOhcP1dpld/E8G8f1+RvWWbXp/sWw719ksNLYTdiHj/cvmr14mvppQOdPZZkVBIWbzklZ + uAzILPK8jOED++XSxIn9MduNJXlvSIVNFsGmAxIKYAblyWCSpIJkfMjIjpaDPfvugKbzcfhC+KPe + bLxajUcfBjR6AEXF6Rpr7YX1CUhQHvubMrFK5sYgmXFS92FExsux4AkZJbllxPRL7m/gzf2dFTPj + 2XL46y77Daj7gcMLH2AbuLGy8TAmyWpt98ej+2NRfRyJY3e5qNRHqw+jZ0EquYs5YCw+D7PcYLLc + DCl7yMu0S14aLscEqSY0SS+y7csLDIHgCYJD9mw+B//JGCdxgFbLw8j9MRn798d8I1ySkvvjhXbn + 2sotldOd+jTYYn7gip4/QAuaz5vbwidKx1kTZqUjbCZ2FAWUrIRl7UOOZjFoPmbBfDBWTMIkIMiw + +fOtBs+8hb3Um4Llc8GOBBZ0P94f3x8PouhoENwfd8602ueV5ywm4GtiXppTcU7UNBr7znYx2TcB + w8EWKbkZfhR4Fiv4rHMDmw0fuF+Ol345E9iZQD8IYwK4S2bIdg/YD4jZbMx25BbsyJtLjelgYYSH + T82Z/ygF/bETYkc7cNJxzL4w6NA9hC22wyc62/Sbomicgi+k/lhI6UsKRkpSYRiB32X2Og9dApNv + t9XmtAB+3Zn/nfPtQ0wbxqiyYLGYIJnYOU3iwJwD4NxP8wreFkdcvNelTn/J4UXxiKQpdftob7SM + SxJFLtJcHFhipXggpIQM7dApcVfyDEmykC+bgGtjPvKIvGTTN0OXvmQk4oa9aHa2njnHhqBLmP/k + jCm/5mplH+FNc5fsaJx12as+M3wnZbGwAg7C+u7fUhNsccWK4OhOPVR6e+lB3aUHNM66HioR3NzY + V8wn6TcVX31TfHU/M6jtI74h7TSDWqH4VRqQZzj4v6XsbEHFsnN0p+w35W8jOxpnXfYbuFxA6E/R + yfCnIn2ztY/02k7DR+OsS9+E61gY+cm3lF170+q1/ay+fL6X7Mou2dE467KXA5I8fdNwx5bzhuTK + XpL39wp32s4jr18c7vo0HkXhNw112vLI+38BAAAA///UXW1v2kgQ/itcpCof7mjjFyBUzZ0IpYHE + Bo6X5hKdhBazBBeDqW0Kya+/XZvYBry7Q7NJOSniQ2xm5xnP+3qWTOiwiGd+hkDXiyLoKTq70E3k + PdK3CGVipwyxsUdXxdhBbl4vCLGz3bxJX4KUCrzABV6AWfo9CLjY0u+ZwCue/eTOpZq6zjV1HWbq + rQ4IuiqCnqKzC71FSi25oU1XuchVEPImzNKFgb3JtvRoUOozmrqB3CfPDe06LLQ37yD4tZIQ/x0b + P17l7lxvKhM7ZYiNPboqxH4FSuo0oae7Yid1m0kVqdC5vk6D+TqzCYIuzOhSdPacvE1KGV+yzmvc + lE6DpXRdkM1rQkffZdt8NEUk3+Y1rrfXgIkdTO+F+L+y9T4alJCs+DKwdxog7MJIl6Kzi70zIfdu + ZkSk4ufGOw0W78yuHPwpOvuG7/v0b7Gwjw5+sw6CLw73dSZ8Gu7qaLYg1bzcRobGjfcaMN5fSxLA + NVcA0eEgR4fehHk+YUlrsj2fiXwfWZOlj4NAajdD4xa2Gqyw7YJauaqwldtlt3Kj0FdFnuvYcksd + ldvEVWFN3AZIBVRhwttgq0DDXcnFzU12VViyewvawRDjvmVvYNBpu9xrRH4pAmjCVF/Y02myVT+q + 9F5F9bmdHRXW2akYIAmIGxwGUwIVBw3RTC50btqnwtK+BqjeEUNvsOud6CzV44PeBPXzVGHGl6Kz + H/GHnuwWtspN91RgtgtqYYuxm+wWNj32SPZjlwG99w8IujDRS9HZhd7DayQ1xVG5OZ4Ky/GqsAAv + zPGq7ABfRY5NaMuOctwET4UleLeg+lYRh3l2fXtr+/SNR1tqM1fhhngFFuKrLTngU3T2N+gd10Mj + 9+iwt0FqL8beZqt9G8/n/qPzA0lWfCn4e6AIrwjTux47wvcw7Wj6WGpVr3AzOwWW2d2Auvhi8Dfs + Lv4NngdLayq1ppeC3YQZvXivlm30tKPlLj2p7Swp2JumHOwpOlndnOg0yqNDb8JinXinmh3rTNua + 2A9IbqjjbuAosA2cFqiRKcbeYjcyWxNb7jOXgfsG1L9WhBtXKTp7ng7Nfbl5rcLdtVJgu1ZfDDnI + U3R2kX8huY0t+RVUGdAroNcTxNBTdPbfzJge52Nvgd4/U4Sdixb7/bPW1EETV27XRuG2LhRY68KA + 5bRC7AY7pzXcJT2pTm4BLwV8H9S7UIQFfJ/du+gHaCIVN7d+V2D1ex0W1YW46+yoXkcrZMvN5mQg + b4DeSxCG9BSZvR7liBi6TNzckL4V0TPQA8ZlLFpuxwzDJ2XaFaPW69UG1ZbR6gw221kS57boaAwd + iXHQEDu7gzFBeqrLD6eo4iGqH3S4ATAuc8gkTLTE15By+LgMytVPSG1n4uujWGyZ7EzcVQdT3kdf + bbzK5gMwZBerVkDPgYu/WWm3i4N+LZyQvVtXi7cP5lI5V5zet9b36f03Q+3Xi/fYr90V17OY/GZg + cevByh3FZI1Zht8VzGluod0ZxaQfndpVo5X0JV48l0k/qmay8gahnVxNj8oOFGtYHo+1Yr6kaeW8 + XkLFfNkanucLpfLQKhT18zNUyn7KIZk5/cHG5PrWgPAL5gwjani2iK0kWjG+Fp7S0du/YRBeSDQv + mtWOb1DiK7ZvuJGtbH5KM/on/YmuICIQG2Z4KXu4lR5A+fjvh353YC0H67EXzDT3slK57OrmIPXo + UsLn3LpljduibJPUPRqfjmlmuS7j6rKXi+6lr94Tufs5Czt0B4cePYqJOB5z18s5ps+BOrCtU0vf + 56oTbE1z7jIIL1LRkkcSDm33QsC/xauDh7JH7nwZvHwsO4sMYCL7sBHrDrLnQ2LdKztxogc6ki1P + EbhEnXOlZCT7D8HCcyJ+B1n416xOTJXGD//XrE50lKpq8GtW95f0V0x9H78S+jgC7Pn3fD/pVgBd + vPLs2QXeaW/0PnAD4uv2eDps6v41puDbi1ndf4rl8DZT8Jv0bSs4eRt9QJaFfT88XXgTmejZwnva + 9Bqj2QYmYXWUI455FuWhRHih+8uF7m8jxGcPHjlmwt3QJ98Qi3ZbdoT8njYcIvzh0iEmm9iM5Dnt + TX2QkfUngXyBPfqjBOghIa6o7zIuk4onsp7n7GIdxN/Y8fw7z5jNhspjQy3x2FBLbDbScQDMi8YV + CZcXhcNLOiqAedHjxey4xNRZvGlc3jQOb+mYAeatkMFbgcUblzUOZ9vxJF0jQysfJ18ufDfxnTZ4 + as6NagFpDr45v/6+WiUv6WVVPoKUR1pUy6p9eGb0JgszDedNVmeaypuszjSGN1k9W+GlpTz0o3F/ + ldDOLGtTVcJAQUpZKY7L+dGwZOX1wlDPo1FZz6vWGJdHGtKGZ4n3PrSw/bnU4X9Z1Zaqzb8v3Rop + VSvlBb+qzbx1SxUmyDddD9fiQ8e2WNocfEZ7TLX1wqE3rhERRngSfvrwM3rHjdMgWuyaRNbEJadO + kfv0Icqp/vzk0NP2Jx4eX5w+H3Y3pj9k+J7kRg8OJumxH554Z/n+X2M0s53Hi447dAP3o3J29k6t + auGnHn4Wzs5Ocx52Lk794JFwNME4OM1Rvbk4pRGAEjnNzd25hS9Oin3L6CpGrzg9X9Z9b2Rel56u + H04+pFk6OYyl30137n4kXJyEXJwkXJy8hAuwYOoYD49KLv8BAAD//7J1B8toBwNbq9oukFOmsLsP + S4gR5x7sAa0E85YSmoNxHKSYV1RSpA8/VRCkMT4pM08PbAAhdwAAAAD//8Qdi5LbNu5XdNm5aTy1 + vNTTstzkmmwfSZq0zTuTzE2G1sOrxK/a3qdm//0APiRSorTeu3QuGWslPkAABAEQhOwf2Oi3I9IP + 5+FoPgN9GK/W+/t4+yQdlMjd2PE2l8fueHNpcSEbPsJFOdwBS+0dKMB8em0zJymeROHNj7CFybfg + /u8sAPKZluSf5XpDk2J/FZObQHlybm4oDvS+nK23abaFkVfZlDll8ZHvRkHuT5OzLSjJWHx/4hTx + sS+yYn66j2frRTpdn+1hEjLedbOG3Q2ovBh/RHlfnGdTpN2mi2K+itEry7a8JM2SNf8aSN6RFbId + DZ66xGcb9OLAfk0vTmG7ZO8AYRziYks3AuX4dA36NaY5wByKonydnO14UYlWab4FE5ranKDtfEbv + kyH+HznuAMjE31Ldx/fuTU85PSiV00WW72NSU0JnLBQMKK43UA67uv0pa6nhoWFQmkiUzWmCfOlA + zwm8ofyM/IGRVxzQhzaEasb4U57nomnnmEeE+N7MvcFWH0EGLu3dKU3XFzGxHBA2/GhcCwes6fsh + A8uuhF2dUnx/XFysUBrsGTgTX6fsVjDXjTaX0w1NU/C8EL4Lj1zq7C1NC5g3KGHgiYIokBHhf9E0 + RpRgPorUOkpC/H/Dh2/34KCGR/OZxbhAVGwF+WEYNuXbyPEKiCO6H9BH4NVCW0xS/zpSyREdlCJs + R7f2HPkGEnwfJHN45HvROE/hbxh5GR1M82IByyDebNfzIo1/+vB0Ceb3jVxhI/YDxrt1vh9VYEAl + bvcst3a33z6QAEE3KmUM+PBX0QWDyA/IoM2fWgJZAV8jbQEjungFA9Fcymvdvljtsj20d029NHZ5 + yThKk1vZBc1o5sPffBym3jdglwCosYsDN7ILCfV0sc1zg5SnNE0yIte0Q8deFk2Ni61TctlQcgr0 + dTKrxpQaoTHe2M9oqEDh+k2D4gOcXO9QCbNCSAsUn+RhA3ZbV8VHWZJ7edaFE158tT0zI/jVpau9 + gaFBHnphJIFFdAb438I7NkKbgUwK3SAYys+I+AMJOIsymqVNGC32cRieO3Q9Hz5jaZoUGCZmmqE3 + OaqMaWCrYegm9gjgmla6Hbnyj2KJv35FV3tW+4iW58WumBUL9CdOizTNVqxinppNAvAQf5ZwIXyC + JfRYcGV5lZct94GPYYakKUwj2LZ9mTKVUlyjDRKVUCLtv0+gBTfw7LYykkRaic266PRhcDYqRfio + vGNnNmG01BZjW5AB2/1+vbRrBSsrmNcZpxQcz9QSf5iwyAacLmJFowDkiF2n6sQaPB7mCjkOa4re + jw9uaOVpOpJr0iciU7oqlpwk5ndaI3fH6PJvp+vvRv9uWJu5nSSJsUK1RrB4GafQl7mM7bW9ga0H + LsBhWpzrvGgBZ7w6OcAmKIgYMVBETzO5aDwd0nDqoL3GR21ZocrLF9CZr2wDk7eMm5GQkBDXWA9D + G57ePMXrV8rVFR22ynxD2cmQP3BuSdyZTtCAMuWVm0ArNb6u3bi+URRRH51SpmyHdXuqkfFUI0A8 + nZRLim9m2wjDxqkQGMd5AR6DnZwWixT19y6/UIu+FxpVuM82k2xf9F4zel5mVhuU3oGw5q+yDjX7 + KrF4PffuU/FUwvzTfczoF+pYevHIDV23CYRY1yipNrLvB9wKWcVy3r8xc8mg4QlrggObVzbE68ya + ncHyWVm78/mQY3VLS2EHESV+azPDtcgGFYy6LbP1hnJuRetBu4GKer455PfCPLOHTxR28HZ2uaEg + QukDjJn9u1QJ56zmU/I6w+sbnRI5kgFLc/0jvbw0uBX4ixOurw99C1De7ADYuQNOnH8rWU3Ixkad + 86ODaM693kvgrE1k08dTJTQkw9AfhsxP6iOjISM9wtMbClCGc3vH6+JFk9rDaCMRH6zgi/gRXp7T + rs6KJb/plGt1fKPcm3GaBMPJZOgQH7SCP+gGz/B827OuWIN3oMiKxSKW/n8dAjNKe4N5Usr7eKi5 + 0pKN5mXUFvJeQdXWmKHocLQc0oFWUzYl/F4Rbe5bVNA9kqAx8w4CoW21DhlOk4zb2lUCgj6XLh21 + 5e0yumq95ZravKAmGx6KpidlFcCdOFrYbIVJ6AveiJnSrGQ90fZyn4Se7dc3Py6zFJbs/SW9FK6y + F4B7MShbHckNA/YhEx4JuiKBxOOaM4lx7LGllKhTUrkPdojk2u5E+jG398C2vEeDx+rI16qAaCV8 + /6z3fJq2XTiSsMC5zY8gYn4EYeERxFBE0J9ki/MMt4ztWDrrCZvELHZxF6hG6nxwqRfZfo87FkQC + Q5kjFzcY6pz5ODnC0+NePtt7Vmi33WpVJpwQA6XmQHrVMVssis2u2HVsfHFScch29HyaL3AbZDkW + kxvOLLw6idyyeolPfE8R4Q23BcBUnSjuULqsu5fINj1OqgDkJ20XlKFs10tHIDNbgBRNlzCmkGo2 + JYbeaIh4Wb3lsdyALHfK+M+AggqU6xMNuWfc4/3NIE5ag+dpKeaZLZvTjILbKZBu70bAGQalylUL + +MpoKVl8kFW+SGtG5MVllrYPGbDZ76kWOoUVhOsO98HNzZzjD4ZERO7ZTq/VwOUNXAHEbsb4hVr9 + oyIylFP4XGDRip60Z6PGv9pbothNv5zt9kV+ZcujFyaY9izbX2SwCuqpwTvRRjCx2kps6EDOgrIN + UWbpz2qWhKSTWtLFzuQ52we+ZNdXqSISpC2rzzXdrq9UtswbnX+rGMe0gHl5GpYlq7cxmXAnD8pU + 1jHYb9KHDQnd44+L2Qlog6bMuPVC5GbCI53hLxOjFBa0QDlSJN5WTIb/cuS36cN4vVpciS2oKXbH + 2r1j/H/doTB47ft02JrZd2rZppaMD+lA1Ju2vRpFEniDrp6W7KGgUgFyRS31B9CgU6nAeZEocD6q + qH9ItRod6eosrAlaY2DHglQFsO1LKIdwLYlmQsKmlAhxaK1ZrLWzFQ8Of9Ck/UYlTllWxQr0Awxc + l1SCVjFBDTM0cJK80BhGjLPspGVtvVFMp7VD5BIkrsP0yhPJDitrOIVmKyMtVcPT8Fqtkc+Nj5eq + 1ky4raKIQZbKiQeLfkksaf6K1Sm4JFwJ/lW2wyXReKBYGdlb3rpc9nwuda/kk7TzXTuhGhLTNklz + V6CD1QuvE1PLRIenodFy7UlFlQ7lqo4nBemgzmiA5jeaAyOYpvhbbFYxyyPDvL94vdkXS5CQ59lc + nFyowzkcWy8VTw13M0w74mfjVPM5adOt7F6JUq2CRecn9ukQRG3F7syT3n2GAEQIEHI2G5C4wPE2 + 0p/m0RobX/TKuO4R9Xxj2RzsDBlZ6bnMfDyj+7SBWMN819FxNqSlC/hd1pPBidL/1cEXHn0AHn1D + Zdzu4DMXvWkKZEEdKa713SRUkh9wC+R6UtlouTGHHGP5XXZcU7+W4JKKJaroxlG9aGWI4ooqw7mx + MwvDZDJtneZ7aspIGFbhqwBcTlahHN7XASdvoA1Xxzg0BAwHz04S5DP6N6FhOIUGsr3E+cbjAe+1 + Mfj5fuvIpxln03yUqHZRUbRwrSmiF0kvZZKWisChQFTnx1JpAOFSxcJGAmr1yo6jqUbqgMIgNZ2M + k9aQP98AWBzJ9/GgawwRvzaQxYWoj7hDEyQSoDFPzHS0htHA4Q+255Npz1Fon2TV6S6KWKk13sBE + eH1AURNubnMAi0zADoJlyhgxnBEkkzTt5C3XDD11hhmkYRLm9CCWaykfCkFcE/QT3Zmz0kGKoT11 + Ei83KNVqllXVMeRnuaG5XuZRwXblgEBqFA26047M+4tGPoPRlqPfre5Dmn63njYqnfCu/TLf23p+ + K2dQ7joKxmS/94SiMxmIQfhCFaek9roFYEs06dCAimk2ezZVuED1EQJjKEsywxNnzRiiEahUeXSt + 6XIzL1eT3rTp9iOYalJNt0pX/9GB7wxd34OPz3ObehkI6DWNdIfQmQBxZmpBrsp2mpeAaKGbX8Mi + 4HT2oqbSiflXBvTY6eV/o6JJU0mrWClHwrzo653RvWVWFrTfPVfi05rHPlYKZDT5UH9VdZU9t8qp + GjcWqyXw09z+pmdNmpgSHU+iYSlDp2MZM1iwoZYGTVhPaXMFN1zmqSHOIMEyEla07N6oGEKXhjCS + rhdkDOwvbHh5KCf11oyRDWY81tjANjwI1PLqXOyYtDMuplpUW6Aam+PwbVw9NVWGc+/ENB1ZlJM8 + awszE3nPHXre0AvZwWp7WAFV0ChxqLP5POkDyzbK0VJV1E46rjbVP3Up/o4clamyqu6g1MghWq16 + WaEWVb56O1KWqtMEKVU/y+DSkZOPnWzMtr94smW5AOeYScTd9tMd73gYXueozylR2Ksv2Ykd2GOn + m83lYHjfXttYmWbnRZLZm+IyW9gs7hAHxz7WX2Szr8W+qxFCglZ9taWY8HiWAXZc+/5SPZrVZU3L + Dl+SvD+CiajK7DWwuuB7KouLeGE1oDYBkJHvhOzfeHBz05LKx5UxPSxn3ii/vUnzere49daM/r7M + wCDkygs0uoZQXqdhozyhjQCDflpKtP0qW7Yy5DYaBy3PsePE0xi45SExgUMj9PxE5fcT2jhbHkWB + mtX3RMvje9Y2WiL7VzSixj5KnAlmUrKpQui3KjWUpZDW5pwncrIaeUYic2QNqbSVDTG16fDVa2sU + NrjfbdlkVpAlcG9yrqDstOoFLRWP1pIfqY1+5+nStPnOyGNW/geUw0zaGwozh5f7371wQoucuP4o + 8kK4A+NljUdO6Pk+3jrhCbuO/EkIBc5oMh77+DyJxgF79rB+PPLHrnfikVEAqxDrA99xLDcaRa4T + wLPljhGW646IO0EAlhNZLhFPcBuc4BXghGMHCkaTCfRwJ6MxcX1sGBLCxvfcyD1xJiPH9z18HoeB + h+MHk0nIEYbriUIBLNeKNsCAVNTJv1hskY/f8RX8ZyU0mvn5xjantjNs0JdU5spM6IxwjcedkLom + TcOQJxG84oJQVaUTj7iB0qnZIHejWeSqfV+Lqvq05DVfXBoA2UrNY3xj5k9lnqWuivpMaOVIOJGW + 6iJW+Ly5BBxFG8x5C6kRxEsC7ZrmAphrkGvFoOb+6ycTPGFHMyPzdlHVqo60zrWiA0xORwRK5A68 + pSLjiQF/J586k6rl/panSOWs13vl/jm/L8W5JM9cmVZPSwq6C7UqPyRkjT9KrV3WRqXx5gqpHEWf + 9My9LV9+YDf1yyE8WiwSYzilrnwqpefFtiSCNpEV1Uwkm2V6uskOtDRo5kV588Mxeyni4Q/8NXn1 + XeIv9Jzy0nvWbpvUrzZfXFxorzazr1jYHS/WLEflS/0G8uRnfxtcvaN/Pn39+eX1m8ezt+nnZy/v + Paxfyr/DqIe9UL0/LbYpbILAnmS7z2Dw/zZ86Bd62XwhHcuOF8Vsd0xX87MF3cLuDTwR8GSPnZEz + IvY28WWVLatGd8by0PfjC3Ce5AvyL8Ro3z/Fn3T5Hr9vD3MT7/w6fMUjurtaATvuWWmWZ1u8YewR + 4sEQ4Uisdiiou2Mc92yZbXdn2/PsCliEAD7zp3/h91U9uFp9XV8mF9vN9X6ZFdfjs/XWX49naeD/ + X0WKlX5LOboFzBSEGOZyBuLzoDz54/dfnv4af/r0iQzv/UcAAAAA//+0PWl32siy3/0rQCeHIw1t + WeAdReF4EmeSTBLnxs42DI/XLTUIWywROLZjeL/9VfWiHcdz73uZOUK9VdfeVd0NLlieQYzZyP6+ + nNh8Ovh0bv9r+tcxPXoz/uvdiX0GjbILn8LjwDHAefb2SJsYhv5/79A5aO2223vw7hh9Mr2OImK0 + 26MP3w4/fD4J2n+M+exDm385ODqZGbLZSeY8Og12D0fv92MIaN7aX8WMJyftb/HFj5MXrM12v51d + tF69vjg+3b/+693X27fbf/0ABdKdroMhfTEZ0TN/OXp52b768+LFx683J+9GwfxfAr02aZG2A/N9 + Oj9Rk0sEkRbxaCmUey3i2JAIiH+tvWOn1Tpo4fi+bIJK1bh3uHd8uLffEk1yQZEwE54YqgHeW8TJ + /KeoL74kJScLRP2facwPkJPmdx1aFozJhNESgVZmgECon6noGS0YM/LHg+PWcNc53N8PDugBOzw6 + DHy/TfecgzY/4MdHEOyB+kLPjH+I8MvCnREU7LH8IQeJNahLv4ipmmzi7gxAxcF0mb8t1RAqLhc7 + V56AIx58ar/+c/9s8unTx6B9ap/tBF5rJ154J6/mZ7PZ8W77DXiv8zev/jxufxl9vnz9efvNzc3d + 9e7Hm52JNxgMOV1eQ9I+GAAuia9FjFOfUsHkFiC+GMyj6wWsb4ORP8AfKnWOHHC6g7mjrECKAwUM + KnEs/x0eHuwdtfeP2tpcULF6iVI4Cfz91tEeaFBWfkYln5TQE9m3StLPaZFTFGp2vGL8PtgpaG0i + wb//tk3AdhVfr3y6Ynerq58rKEP15Fa9LGPrCVqIMAGlRO1DZ2+XHGiTkp4hcQI20HpEKllTobyS + A7uH0HvvuMSIzU4kw4s22SfG3S3MeghY9oogNoUbs5FWus3ObydeepegT98pi8n3QTCdk++gRMEO + v8VKegPFIIDHGB58PCXfQ6wLsXfoh/AYUXhgayha57HQY66V+dd+rg//yDrry9PX1ep+7ZrD66mP + 0aA5sO7xh4xuxlMIh0U3d2sZ391vYe0VJQtK7ig5oeR3SiC6f03JG0rOKLmg5BMlnyn5QslXSr5R + 8oQSyghnZMjcgU2pl8xBCbPux0PzNI5nse3TOVrZ+ZL6Vxf4U2HWhnoTsSEIynJ5tOACUd8TvU3L + XmBH1280RD9Z9HxrTXXNRP4ik3cufn3TpJbl/piNg5pT9zymO/n0esE9Zq0BZ5bBWbKFegN7ak/p + j/GILmexG3NAcVrDKahHbRgan4zAl1ld2jEMhDHPkG3dy/7brbqH0AFpsUt8NoQ27OznJlTAAYZp + nM15TA3RiW/sdIE/sAzO2lqtRPnd+etTOWa4cczLMX5f9zYZ8/J2fHaOg7YG9njjqHM6pPHYsBqN + ujmwQ6BEDX8+owuFgJ/WngYjbmQKO0nh7MNH+T5Me5+Po6ukw8k0iEFIhiXoCCswMuXEYTybpJM8 + jwUZiGAZAzkBwrvcSGEyb55EjaZfRBfAXW0ENv4QwlJgJNiMP8yCbIkGEp2oCsJVOpXsmRRmgRLU + hOa0DDWVgTpGfDpahi5YmvOU4S8rxaY0mZM4pncms0jgOW7wlLlBs2n5vaDvUXhorfbX8qXXR9ym + FbhlFHk5ezu74fFzuuAZtTbk3rVRkIMwDFphGbUZmBK63LoHL7QGATvkrz6fDWufxtPlkUAcR8dF + d3LGLrm/tMeLl/HsJ0eQq5X5nXZp7zvtrzzWSUyd2h9ZFx9Yq4ZB3gA56Id4NuciWwOY9x9Z5178 + AGyHEflzutcx3j7v1B1yE4+X+p1PMZOQpdZ6jZqw2IidyHXEV0YBQ/AaGkN0IOLT+x9m5XHFJvzA + FinuZYW4XYAEMkcYHSbGaTEiO8HBdZ0OQ85dF3HTKFTy6P+HRYjHjzwRKFIA2bISn4qdbiqVhHbr + aJNLijxsWwgT+t5WAzzIQrzL9wHLqAuVAslIm4BFYQme5KYmVxXjxrBAmhIOTvKzyD3WVRMdWZ2F + /AQZnVTiLRUbNduYCaYanudhXgbqDZUlVMACbMxUl/G1D6sNdJayWLu/V8FXoqAFUbQyomgVRQEk + Pc+TRHwSWPe+J3UB5vS79VbHd4O0JsCaAP1KiXmaUn5TY2bQRalAdQdWbOjt55qFKr/ME7K4GS/9 + 0NQ8ATzAn9QMwJnx2Oio4WDkeMMeTQjW2WQ5d2VnxdoOTFjFVCF1dD8ZdF9gATHMeZyBfZpxpr9T + l3nKllYrQ/6Ed0aArMs66L1YtdPqwhxg2QigaJiG0UHwHluv16mqviqKRSCufKN4L1GG0ckfVPUW + IVINuwlKBR2Bd78m3MWFQPylBWoFPd73XkEP+JTDqBesxVBACLmSYCTk9UcZKwlYIjOPZ8sZMsRe + RGMfEiQaRUIy0DmwxMQUlhz6NNCLE4WVJ+hRgQR+SiTUpMHafV2y2Jz5pNZDYQl6c372XstUl00k + CRUtQ0yRc13FNxHNgrau3Te51Q5IPytbCeFkaN2LwO8S57/s+X2rW4Jtcm9o3/Auujzw5IIxpgWz + QCj7JygFgOJQHNhvZQEQMFGRgg2KxD3NvC7aEWqpiS9pFzOwAPY7ikDfw+LcKahKgCsPl44rIOBA + g0ZDuFNoaDUaAlvA+gGRigmuqcmJqQauHKuxvd/CkIJbnTussgigih2/ayLR3SwLDjTnG9Gz0069 + LleqQk/tf3BFZJ5hWG5hLJUr3Ieij84PdKrHgXL/q6zcOmYKpLkwST4ICeIk0AAZtp8XJ0wiLVQS + r+XypzQegd/FfVGl9xz0/j7wknqwP2EePk4UWBR0yQvg4WpYQ7Cb4dOPSVQ3xJDN+0h7wz5RS3Qq + qpAuzm6marG+UzIDekSYoSBbYNEXVYGjo/lTjkXZUz1/9z6AkBZXFLXq9Fiz2V93VLUDvsz9RD1D + w0htdUM80a2qv+tU+EDqFVVztaJ6bUwrE0fgAm59z7cFoplgYOtznnrq9UqOZRTNGI0uIDNsNNJ3 + Qkmpp8yYGw35WW5f8GjYaOCz3CYh6xlSmaMsUpa7zSazVNKLJIkltdHwwdKXoYe76qGVhO65KAYy + R3ftfqHeZyqyXMv9WpGOM4t2FPgvwDRwa4t5NF6ahm1YCUoyY9AobbdE6iBGcZk8YEwlVxffsljM + 6RVIwPd8UPA1wOylQ/sQU/jg8mFdhVjBclndC3T0D6b6iaKdkfuHAksVfK5Rl7e+UkjG7iZsFhmk + uGakyiD5mrQPyci6F5n/pTcEjZWbDEbm718Yj0FhhEEty1jgcibjkoqETs62diWrjcsF/jL+YCEw + HxhNs3V6/BsKE9wzqNLEtJ49e+ZYTWNgYL4GDiVFXhCH8LJrBVchLC4K+AuMSglYxmGK8MxvmkOI + ZAwBuglyhOVsrbvwtZXlqA3hVoxbHg+xlnqys2n4GY0BVy3MtfZar0+ZpUq+Po/oZM6DpFvrIG3U + 71C9206r9ftL/BZlrnCwJwqG1t6aYREftNZ/yrQh+VpnA9D0HgNn2HeznkrbJahjWl1PalMx9zBz + A6XJVD1OZcta8Y2aF8o6LUyREj9lud+Kfup+ym+XGKbQXkE8/Q36ts76vYH9V5XfN/Brbuh8g5RW + Cb7RKEwD4U5pZj0DBMI67utIRC8w9gILffLQeuCDq1jybq7UKSOZi8oyBudRN59cgGpunmzBlx/0 + yLOhRZlX2ZBuMzLmaufIvHuKCxwJ4G3t4uZowOzBQKAyGHg+cxnzoAoSBun+1j7FrAZoWEMLpF0w + H2PdvAOmGRBM5CJpBW5QVht18N9GMxukiwRjzSFhYSjnG684ScqwJxBuZlZLN9OWyzopIsOZxZmA + IfOKJMJBR88sZHYyGrTHx5oNC722PNU84stMqPJC+V0ALxIBsMDKuABQwTxVZSoY0qAVAw3fvAxR + a3fINmVRkIdXs5QDS32RDeZSuY98dHo7rx4ylEO0FJq49Sudp1gDsjE0/obu4st4GeYdabKzQVOd + z2RXQybXJUaMDAQRYCufRoZe6t5ELGBP6K3pEPk6npr+yiG6t5W65xG4xtFTCE38p9xFsUFsCJEc + LMG9EXwq715vaepGz7wh+Cexeo3K3M1l0JJ8sTme2XRPQwkdCwAdDgTJgYyKZbSLGakQgg65h5Bv + JSn7PR91OHk56gx1zow12y2skuE++BuUQDGJASUKHsl6TXDCe9+yX46QdnEYErLqTOZRwTgOUDry + BXzEOzrPI6XfYZkGr5GUfDOS/Jloh6Z3EzI7ShMdRHkRLO/ZZW2SQgoQEsZqITMjWPg1WOE9MQ6C + SqJ2lCYYXyUjeYqDJLUHESvMaSallC+xmCPO6gTT8ULsVu2KxpCjBPDU6jaBd5geoGQ8P+JNV6t6 + 4rRplOopOmREL/Iyzeb92iKTUk0s6KVmrxeRdp/0JmS33xe23657MfomIHa12tWFiZWxB3BJEV8i + O+B9ga1kT+Ndj1Hs0NRo7HnJYLUQ/NC6gjtwppUGUFtS9Y0nKiaUF4AhOMuFgy4HjxNz/pMb4n0e + 8x+QQiomgueW1UikoewUwsYwlUqURLzmqOnlYDdbVhK6moIR0DnyMGJAOrXpTty6OfEiG5d3IMDG + pM+1Jt5EJllEnsAhzT2nTya9lsg2w6wj5JmNgIhMpFBRv/MbsCMgAXXVzepqrkcIzhfaI0iEe5Ks + vjdxc7FPduJRbuLEan0hKzVBNwtM+5McFBDuL6HIF8zPJSQrD0Jqz2YoW5vAdOXIWg5J3ANXw0Md + upe8SqUVVUS4aFvZcAC0C/9qUGXfB20wzFvcbWcPjC5SRieUqtcLYU0zwOqEiOG1DnqF5hKC4bWw + gFcdVytZKUFgaaFLxFgaVh19XVv3ThGRfirSFJho8hOltjhfLFR3tYql4oK21r0Qt3cNNHlZ18ou + gulo7cYUhL10gNO3bwHGMgcDWKqHihG4hw5R5C88ggx6kV9qmYBUJhFhqOx4JuJQadFbQ0BNmh8w + ApZVIBL6hdKEw9SEIzDhyAsLJhwBrwomHKEJR8qE/U0mHJIIZ8HjgbDrdELF+UCunTDvxMY/rbha + mfJF3kCY9Sb2OOh7vT52+Eq7+JAIeFHHxJJKdiR55MpXb/aVT/CXyJIGftcJVXIVrYmcxJ5fL0IB + xSLJMEGxh5VpXaaIbIMoJO9A/AfsVnA3pVMbIQAEyxVodE35KTJSn0NJnI+SlkVUgwyDVitl2Yo3 + IfKGIKQEbVHAN5K8IfpbqpOsRb6Io4qUou1tUnfkSVmWFj/iNM7mVCV9SllUUKw8oJw/DBNtrid8 + AbzyI3J+OBlhZliJYkMWCqHmBytzrkh21S2RMmTgJugIUeD6uF+ThYh/BfWfgKsJcEUo8g+G/kM4 + kr4CJDDTU+qHBQNL1l8pl9SrbcVgzqlz0uYcawcEdIu4MyIxWDI8HLmc5Gct7yZUMN1VKUkOMeVn + G40kLE0D0kk+Cp10mYqNuhPIWWSMBbbuGUaz1myOCJNuB2ICqwO1c4h/IjFpDOoPHkOkBbFYFqGM + 3ZAt4Hvc8Gmsc6BQZxI/vLgXiiEiIm40fqDg4FV8wkriqVedWYyDzoSgVXZiIr/EGZKvtPMjSTTK + HSDvwB4q78ju0GWYE9qX2jl8o4V1eCJFCz4Qbbcu+opw6sp3VQMKtu7JDq5eICbelmwhhe34CKNN + dyK8gMZb7cyrHhpbaw2pY+GaU4gOINVzXy0T8CFcS7gmo/SUwF9bItN6Lw5p7XcnXwfnJy9PB6/f + X5z+cfoxE4EkOn/sOIet4+P2/t7hnnN83FLp5LiYUW1IJpvi8Edun0JO6+GxtlomCuFNgGmtzjJ1 + ZgnprZs7MWfmkOA5ikUUE9drAKoJ3MC3tVthLhWGn9lRlVFZMSNVZvXrpDSpHbOCN8mkqz14R+em + hFKcDN3cfzRTehSUTqIkP168p+8fkVvran2snzlDbzQEEOijtxgu2QN7hnSxGI+m3Vypk1eh9NJT + y/XLx3CZneD0KM4X7iKw9Fguz+TA3wSEyzM0jmdovJ/ZppXCzaFSzYvV6pLlpDOM8bLvI7Yk5MUM + mdv7Xb9TtZrIYwUOERWY9T/a0WXlHd3qPdShdQ+GKtcTlt9Iqpu4DZVfg7iMwnx9CjlUK9IIWK82 + 8BBEun9F1JaUiz2Ko1lv1Ccjy0qtSvFScf7R1pQcpQGnAkFEIPcyQcyM4BG5L6fu4aQBbgskDk8n + WEXrksv//5Elo2MtEDd+DF0ZCExc3xH3WyGX2sFia8fvMHnh1YcPf5OjGE/96Dp4FCPTbUpxXTio + dNqB3gEMLEupaJDuV/qrlSNk4DzDC7yZDUy/yYkDQ3B30k93BwNlpENP0JbwBzw5S/ZonHWaVFkb + NmT/IZ3pvcfsnmwCJL35CL2Bpo1+GLchX2PX/2Avko82Q4+iR3sUKQwRT+o0xHFLcnAIb/oyR5e7 + 5wFkK8+4FXjcDTy5AuAhrvMsENLODQzUrq+vOwregEwDIVOcW2zh55IutQBcMW8DIVVUKzecHDWW + mHLFJMvSI8iHu2SPJjf2TI8sHwT2qz7pEeeDYH7VJ3sk+nAndVRa2Wlr57etrdrz2fxOfLmzdhHy + 2vNotriOee3tmMU0vqudXC/DWbywt2rnH1583X4Lye10wbdf4y308XDM407tZA5ZDN9u287Wbzti + f3PGyJyR7/ilgIh5+BBfQRjYU6GEqxXekYDihFWcUeoNqtKuN0vuDeezDXEjaApBhC9xH1yPg82H + 7O6sfKKR3CfDFcim83l0Z1KbgQGTJGSAWHteedJUp7nNSrm1XApDHnOJTg8h7WQhKkTtD97YSlF1 + i72up4twPFwq0jhe1EtolnUMwp7kbmJ5FUu7ZRgizpl/lnjyUpUz8yMrGw30qRsaMzvS6c3yqfgh + nJo/C7iBF/h+ejPWwY954kagpDATmyFZaQ3sk2Kukb/vImMDUB2XQq6Mt1lAr9JwKgmGfJvfcv9c + HFquVtmSaSAMo4njM4derk5HhJuEOZH3EC25Fk38b3LTlnXxVj4s1fCsl684QW0Xr9YE/Y78gLyt + Iz7lhbbfi/fS0nMk636dye2zh6bFQ9TswbDYifQfOCqGsVfppOqKZBohqkuRBfXfblsk9NqQvpfi + c0zjRz3o0c/E52F61yDDC95Xwg4gPgT1+169cIhvD1S5FqEjQuQ20LNY8gBPeBfi4AGEX/fVpYQP + M7AqvVtQY2Kvm3n5VrwcL8uvLt697XwH1RclqRnF8qeP2GWtj4cCvLw+FYydRRyvZiYFmws3Eujv + MiX5h5K3id+OIsLXWOJLVxlBTemEe8ZzoGw2ET0MHLJgXikmgvKkW8U70WJa6065cee/en8v/r6l + Tv83E9/O+791raTqyY4wDOjea/XX8pzrJ64AS1ZyWsrCC9cjcjd3S52TQ1UiTSeHorreVr6yra8u + 6ZZ6moiKowedkHS3Wx2aieyc1JzlxSKaTSfxVp64LYqXZCCqwbsbOqJ3dfwo7reWaVe7ft2i19zQ + LyXbL1Ccu7uaPWev4EI3cXwG3kqWF00DccF0iISACiaH8BzPoYbi3isoz48KCsSfFS4RsEF8sve/ + QYZIbx3IFH9Nj9wYDIQrwcMQJGlkqSPiETqThLqIhER8LQfIbDb7XpTYFxffRimTO6Hzx9IKXf8N + QpML3cNHkCoT50AkziOkcyhoGcF6kNyiEPkzXqTI7ksN7NsybTEPrn2+mbz/FQAAAP//vD1pd9o6 + sN/vr0jc3Fy7mC2kvS2uwyOBLG2Stlm6ATfHlgyBACYsWcn77W9mJHnDpLlvO6cltjSSRiNpNBrN + jNOgn++h6B2z4FCA09+A9ACEdgquEBXLWNjY42yLugRc5O4XkZ34A+9lLAMhf8svwvUdjAV/wQAI + OxZGdixoNUWKo2D5qE6hr0XEliXQNOLtzB8Pi33zbrzx/cs6R6D/z71b/U33lOkQnMdxplXjmy8m + NLQVrRVzNrGC5IQfBqL92TW/uOY57h/beIJAZ0x0ZLLROVY8YnLgbggJNUzYcdF1cgde6zJ/z2NX + vvROHEJR4ey51JU24cYIFe1iRUPR6J6s9AjD6E/9ySVB7MvU72QXPqG0A5l22B3O7iI+q+iyCtkf + ZXbggwppn1z7SjRzKHOFMygkHAUJvkg4pmMVQn92k6p94cHMfUaylBUep4O0I5CoA5uHP6TV41d0 + uDBPUqtD/0+LnKrqaqfLj2/KeuOfpmG1MobeNOaWEUgAAnQnAEVaNvMgNPBmDqCTcAqs6eqVMg7D + fHxjNMorrefr3w3q/+65n7pTaKF5ulD7dgAFlX/zxmg+YzRWmvlWJQ7+BF0kV0wgxIlbOXFBjinj + LYREkohximakeqAjWbVPocSpuzVyxhOPDtxQ3DAevyiZSz+Fg7YyEn2C5K/u00XuzLW/uKLicKRQ + DJTNfJPNnLv2N7fyzS1T/QfDqY5lzWLBUCcIoV0FOPEKU+O7a5+TZegPnCNtMaN+irkV8yuG5F/J + ibaGCT1RxkFJ+VI8u/jcFctHTjxap4yZNcdizKbjPReqa6uW5r0anniUjw6sZTilWCBZM/R1SDov + 09m93ffRo0zysHzJQPcjt/F2s4V27civSJrxQn+FDWBedkm02iEbQ5AP4E+m2DL79LDRMgdo+7i1 + tdGyOvCkd9ZLxocPm/PLra3NlnWJSZfrxTeQtjHvb229bVl9SOuvvy21LCYEh0Gmk7nM9J8G0Hrf + 5pb0awzQ8KRn40Z5ELYO9Q5kvYA/F+6MIHkKNKFmNHJ1EK8MgDoSqwFilelnuBJVWK7nd4fIsond + eiy6ZvEwg0OBfJfTwCjCOrZW3d6p1Xf39g8+fjo8Ov785evJ6dn5t+8/fv5yXAYn385lt3fVHwz9 + 0fV4Mp3d3N7dPxSKG6XNN2//fvdeC/cK07UbWiZvayb8wk/2wqbfHP1qLbLHf7PFYtcveMaBA5CO + hrxhVQbMH/JYChCVtqIxRyqlFPZa4UzCDgLNYD7JJxuVGE9yD/Edy3fiFyRq2wtVg8hcHSQS0LHN + 7DQXgVQ9IuldsFCHpTdx5t1Nax7qLsYY1eAZqPpQQBHSXYZ7V5rrzir29yiubEK7KGGxse0IK+7A + sx7pE1yLxsrMyFUI/QZTLjO7cA7Wu8wO/Q7xzEwNk06lHj1vXrKUGoTuWCIlh+LaSaWsuqjShGfM + Qo5uVOSDlHLkpiUqHSKprphSmQh7SZ18MBtoa3aRG7AYHyJ+e4semldJJ/B7osmQPXuftjwPrR0O + 5JWInHzM8lmqdiLnA4Xh10Y0Gk5uJ+PkqqjWIfrWligns0XSFSFxy+4WlN2B/dzH/8A6JVnKesSj + u1Bm5F3uk5JfwJnyYtGosDK17lLb2O51iof4oj84khR3VidXo5gFNQkhbOkJLWBr6izskzYAHfNM + mpuR2AM+orazRTQINKQ8+potyjskwtHytgAHGjnUfUk5lF49qh8L0l0e1I2etypHug+EnYWzSRwP + l07y+CRNswSt4t409QVVIgyVcJaITXu8tFhdJeF2xBaGcnkpVqYy18+WceywkYyTrCI+9qK+3ReN + qryrg1Ht0dTs4WS0pI0++TzTPZwBomHgck7CNhp41shPwzPwUk4A265JfscuEN0UMRxwwa1nS6XI + 5ZIbqtdoUboEg9KFWqEkJri567YuPIyxHaoTjsqqpYCQQjt2uOjeG07ZZOe4JCerqFAIZQbVIyRN + 2lDHfE2VcVqgn5Y3EbDf4BysmFFkZ1stSvULi7r5cty8cAfD/nm2h4LaLbrLt1tJ1AP0MFSFzs1V + T/nIoI+6LrPlujQRh6slXRkvzrYAbsQip8uAoUh2Pk2ZpoghtDVhyHgnUhAM74yjSmTkgOjkWPjA + gRYLuT3LqajQH8W3KBVT9I3ShlGGJtoVoEm50TJl8uY7YPUe7HcfQq07xkOIeqHCVNI6Gi7zaCpp + 5wty/6zaehu6mC0aWa4MI+VmQ29XuL/CSUniG7Api9ttYFW4PqC+IBd9xwGLtmEEBpdtK3BBQxMd + yLMKgb/i+voD2iSQaYxRoRI7dsTc6lv18Lxeluk8K1AOzhXRGFfZ4ge3okvI4IoWhjxTlMWkoayv + 5kh5SXPokbEKlBXQ6+t/CBqK1/j2WdVk9A+KOyF0CFHpzSXnYNP9IJqq6G5GUKpq6jygmbsQWwFt + NGgNcYklQdGUhsnAbdhhyMTR1FE0XCzfVuXbRpkHJZ+sadToUQSRWDz2ygbDtdNjwHhjcSQSNQ3T + 5CFayLKuxaafdyG+ciIXY3LxzWKNQHXiSoSMBuL3X7f6jJlTWJCzaJvX7SWtkUPlUPKuGzo5LAsM + BPXqN6yxKPy07O2Y4WN0lihR4ckwbxhIk38gikw5FCPbuIu93cfeHiJvGKUk2onZs0QAYHNGbGlv + KRmUaKjGSc2Bx1uKdCCN9GMgJPLAhuXkbr34atiG1eDO5/cRWHGuRaE6ye6k+I5SWm5bis1BBJGI + I52syvzN2QiVdrizB2yOuGHbCCzdhNJYGYFmOlbUtE+/NCqwppiBCmXUI5c/S3d5Zl4KxbKLulra + b8IsT3IWsy2yGQiGZCjkBAKYeI/IVJG5Vn12ruHw6dWlk026pKXkGmZVTDNsY5slVJJ7QqMpZoyc + KdsMdpU9ml87L4FHMFECnyKT63uq6I+7L5UvidsVxKv2knZqIV71l+FVD/CqR/HqtZ/Fa2NTXfvs + vqyZ3RCx/QUfg2PXln/FHD+WLPWYRNP9CFrH6DKdSOtOat3JyJ94fBlzPHaT9cycFCRAMFHorBbE + 1neii8NstOxJgh1IVGndKPzVojPUu7zZD3jzXpJs+yHZAkHDUfJFo2UFzhiContIz33D2mOxa5eJ + 37/xYjVLUxkhBiyJ4xFT/WNID2ZlMhzV+m7DIXNH15ZPQqyPHCgCsTpq6adsNyqu8EFPoBkbqFDn + JN1LJCYS6Z4prDJFqBHCSxq4oCFmrqcbSjKUvdc9QwpZ7VXlWARLnG7mscSYA5OTt+sd41FwHWne + iQDGkyQ6C5RQksuSYoNGb/9fjN6O7IeQcwXbtqWsWAuca3yc144tAsaEQUXDKKIgAtrhvbO8g0Bh + Npoa3FSQm/XL1eR4/m+gnPs+qp/GJEPFQgUEC3I178u5tx8d1N3EuVd22lVEcChAAzmn1ry2M+tP + K8kE3Si7OTGdvpHXF92BXeQOXsZiDkIW8/FlJT6GJT6xBYbAnakj19unaE/9KKQcsMA+I/6e6/ud + tDRdO/Q7K9hAeUUzg9aMhbZ6KWsZVgMLw0OFhV0xhz1SEp6fHOz4g5E/BPLCLp3RbC2TkiMlxqAS + DAUV3AbrmgNI2N31hzsoTXHFas7UM9BN56w7ALEjo61rGVfqmNc1w8hNZi7IK3oh3LcOWdrMkMQN + TKt2IQ82r3fGfE7tMEtSTQSWDogog21f1Q/UxMSacl7XXgCQC5HyJwBwkZtJLUQRjYjDTL/TDjKZ + WUrkjUe2/iwuk2FlNZ97fTlay+em3mSqJ7Mx9Brex9Sh6b+BvBWtqOF3o6Kt3EQweGsAYXNaJkz5 + O4ETj3Rmo5jIZNHMZE/7kcw3kOfGyOh3ABFXro9DXB2fmLy/OXFsLSKMrsQDGax0J5FQKSsjmXww + qQchJlcwKix+/UvMuRV1XFkhQ/nP7WiMHlyRR0nVARoAGI+HLLqUUdmFMdfCPpiPPe9u1OXlsJ/v + DcOcjNmoU8a4JCM7pKyDtDZ7k3FZmH/ip7/0Yp4bpjeYdMqM7KQyMFgZpqysnmh3AUS83MVkiCYV + +NfGjw/ACsPncF8VFjNGuLpSVmDbaNloSPOkmNIRMw8V0Y9Rd/M5xpoCPcsxGmUf42CPXR2ad7PX + 08Gry+mgr4X2HMdMBLNLXYPAnelq5AsLIlR//Tdnzl4mpdBXFJ6Sibfu0jpix1YYyiXy8AluUwnY + k3S1eTxs51e2GDkVUytOrlfWELsLsqMrnwk7vxOQImZj5p2P+9S5L3TkoNH4zswfzDzDMTl/hqBn + ITnP/xU5E907TyPr+X+PrN9eQqrzVFKdL5Lq1GlL+sDxJf8P7WN67jVwE2fivd00G072oZB9n2nm + Wxn79Vq+a/1AOBBG4B+Fz6/MB063P/Xn7enIKM8b/5TzlVet15DdwIf5mmFAKQxOtXAxs4B0NOZY + ejDQrxi/+NYF+SKMD/uDCWaNYWOhlz9xfpWjsWlAEhn1MdJ8Xv+zUJ3/WagZ+Y6JF5ooRQ9IfvzO + 0NpYlEXxLm60svZ/jzvpUjXH9WfTcncInLTLXz1Iy/yHMMabxPHJOpP37z9T54O4yjtHhe4Zo3nj + cEGbZ5qAQXK5qJXx59iMy2ldiO2I5rMo87IJvQD7b5cT5/KqknFd00zEhwwLuC2iOenaP42smWtq + f/15sfoqvwJzuJr9BdO42Ww0m61WZo3sHjohfBPk69m432zqjZXmtDlsvTb0vxor2XU9K8pk/7P1 + +q95U2usrL6KJDW1eQMS1l9H0oygjmbTwA+udARpL+PNwdbH5mzmdlnW9R663nje7k6z8luU88tJ + H/87c/y8oTPOdvCrb5gBs3XcvZsPusOBczfHVKcf5sJE9xz403HxvzPXgcYg583pW51z+vJLH+U+ + /cf85/zXvMSNyhz4oYEdz2Ze54FGgli5P1+JHpkrrQz0Q3WDrqu51ZXTpPfMNOmmTpLeCydJYsh7 + /5P5csVfwDJ7PI1l9ngqy9zHvZlC+/MUsR43eopPTDHzAntxiphtxRZojwPZuuJmZqBmNSQmrdWF + tXg0JecNRtN7rJZsYrq0Aoa4xvuwKD644y01XCO8wvXT8FwtmsEtUYSUqD1htqOjvcdqIeofGdXy + ioO+smOS3az3PXzTNd69IXuRZ/PhHOmMRt6Q71x2AetnYfEOLAqMFlbAvNvd8WRKKZFHC8/RQ2+M + 1EHtP9JzELi/rMLpir5+JBsAMXDEbTR0v83kL7KtTMNuPRbMjae1PC7b6zjlHFt38KJuaCxa2+Wu + Z974/tTrezh/KhRCOpak/0VfQWvQ17laJn5krZH8OFpL5v5lGPLzI/Q+nzt4WKtOYV67s6mna5RM + xosjHm6AsOJIYgHMxxF+2GxOHkvm5pMzhY15Bbfv3OsKLPucUdHhDScePMGeLZb/xVoLFv/tWuv1 + /IMDDd0P/NlkyzCwMPAFZ7KiL0BCbS2jYlSwduAns+HV0L8drggZDFjIHBKFd498ATgPNqEVZ7oi + sEB5Yk5CBfDCvmeU8/kGYm60MvPw42blHDZlzP9dCUPw/EmEJnEqLPQHsvO5ygfskg7Y5oidV/4D + ksuF/07j4haVm7fcvMElOUtbks8eT/t+B2Q1DCwf/3JR+NUqy83YWr7jDS82CpuV2cS7YD6cev3h + OmUBK9Mho5BVV5BwosTF8YvBesJZ7SArmqYhhjPkYACnJpPZgL6bgzMPskMbn/C7jPQAssV4GmXL + pNi45YGdxS16+D5Z8OeGo0WdCzXhB/NQriWx5pajivQGlYRovs5fpP2544H25z4Nee2AaSL25gEJ + xvETr+6GkZkAwBKddaxImnS8eoipO+VeF+r9hIZpO7knKsXIA0cdp/oeARr0kSQJfxsOBmaMBKGs + chQOSaH5KPJF8FB0SPLhzQjviPBSPQgRyT94FLlZKlShKFDJkrQXRQnHWhJHGRYT7QlCWqBRgRUi + tUNclz6XwaPqrMjZ7h5n0wNOIkSuHiMX+S2FulUxdnUuv/xEd0K/h69ys84F9M7voXcEtFD0xsDF + 7rXLlU5zj6tBxEDzOlrloM7FxA/7GeJX6XlDDVARmW/M21TcdfsCdFfVNca6ShgXStUSqI1lJKaq + iOhi7UfFHFjui6MkSqlJhcOyjafYa52ZRdMJHMhk0gYk0RezVEIJElCkFBeAKvUNIibNY0gE2cE6 + D9HSZLOA8VqVPt/v6O/foSUJ6uAVNjVpLrAter8LK0PGifNsAVFF3lITc4P0/Fp/gCrGbREwU2jw + 28ajJ5s/YtKYwdSuZ85wOhvQVwS3Z7C5Hzqu19dMGdbLx/LIS/GuQGCRyTyFNSq70ANgK/i9RtgD + obdvzfdmsWAWi2YRhmXT3Hhnbrw3SwWztGmW3pilv83SO7P0Hju/uWFuQqF35uZ7803BfFM032yY + b0rmW/gtFFrmYXwlhR+Q+L12y+94ZW7C711Cw+V3RuW4XsvvJBVb+kcQmPDIqmYroxmGCsowZcMs + 1rObhkE1zCZlqfIC7DS/c6tJT6Ko0vDWbuOvKVkGvRiWduPxRegbvKbD3xAaXlDubYSG3fLqubBq + h6Y60moPzhRo1EXPn7jeMYI3vNKK5OAdNN6L4/4lbaAtTVu1k8jDJtSWHsq3+iEn5Rvi8CkpwoXn + 74DXKRWBhsbMf27UtVBrAAmYtKMZT+ZHnlQErB5x4/GIR22uRXz/g+C+3gWOfMQbB2iN0rLD+BVQ + FBmyeSSs0qSi8CVb3rHa8Mg/IYWzfeEgfH/lsFmfBJwtuIN0FROK8zqaK+I35HUhgGJgbjy0qLoj + S7BFafazrRhsenbNwu/GqDwm8kDAtotGJHVDpW5EU0sqVaG7aztP1unzHFTyrY+4v0qTK2FkVI2y + 1EMu+exy/iO5j2RDu2J9AxtixlPo7yvm4ll8RAVdnHA4oiZnvi0+y3YWO+9eesMF4zsBLtYIfSeG + yxzD+sbDTTBWUdqtctRGV6Km/ExUSi9u6nIQsz9/pjHUgf1vtdWLNUX+MgtLEc0B/VjsBeUiQ3a/ + 247Jou89kqjmc4aBj1A3V8UPNllkOG05NBTkBY4+jTDfhJWLGtqE57Z0QUiQoBrnO8IC2pd+fDC7 + JA0WabedKFjFgtVEwZ4kxHlyCwrMDx21OF1FRHGJcLAgxm7LnfcsMISMv+8l3muJ993E+37ifSfx + Xk28+4n3T8E7KXCAfRxEQhdASu7XZYoEKvpCRXKD7rMayKvczVKAPQHQXwpQEwDTpQC7AqC7FGBf + APSWAuwIgLOl3awKgNOlAD4CHDwnqR+om93vL9l0vnNlX/QzzT4Hb34vcj8QqI6cHAv9+g3gLsie + Coc1HlwU4wdsw8MvvuXER8ora9xOSW4UWhhsprxGh0esW8TW5fqaEv93ubnHTdgRT7j5hVu73I6g + AefHkryuxhdrj3TlXA/S6igPf6RK97n1NSX7BNN+RdJ2mfUl0gjs2Jsy7xhP/46QdU85+c7qmujO + RW02GNXvmCc/URMflI8g7n0kIdwxynEGRL7UqL8X1e4ztImgFEeYKbwzHwdlbRuOAnhh6eDdRKhv + oxR0EK1o11pZm2hPOMoSq1wVVexnpGCMMSkHb1sWNqpIwW0seECesdHQL058NcNCTUK4CYibBQie + gJguQLQTEL8ukxCdBER/oY7LBER3AaKbgOgtQPQSEGcLeCS4G6zoCA0doiEemqRBqRjgPSZtEwzS + OOgaiCeayTw527m3OBvlurm4+PLtLDAd4J75zlB1eNd0meL9lwAAAAD//8Qda1fbxvJ7foXYe29s + XyT5EZoSg/EBTHpJSEJ4NW0Ox11Ja1vGthxJxhDCf78zsytpJdsUkva0JzXSat87OzszOw+o5Jk6 + 6QTCXR4qIe0+ix0txCMwhxAaudoTeb59UeEqSLXkhoocmpd7Qmoq9cSK8zW9fVA00V0S5r3JzYA6 + HlFEqXwNGHBy4fRMMAzMaaLYkqKdbrc7jEaY7NkDXREFZlEagqj3BlKnnu1NA532baBOjmePI12z + QyZpKS8oZSSRWafsQO0kC5YvRPgqjlyaP5EpPJHPZPglXxrFbG6yqWFcNorsmEkeG75WFJcuXQcX + fGTTmvWFji4PoaWNFLQO0WO3/vmNC1xs8hVefAmyAARD+dQTW0M59eW+gMKQIwHBfsQg1yMA8F51 + mvAmujWrGr+QHNQ4nLj2s+2qlL7ubI9FzA3pJEcKSq3Ij4V1LUK/50MbiGcNde3WYtYsaLzZu52+ + sAY3nd367/3rdy+84829g3r3S6fjefvjbhR35xv1401W3dmuouPcnW0n8G53tj3/2iBBfot5fgS8 + 423TmGCAaPnJ91oM3izZC5XojngUQc+cbsAN+P3k4W+dnnddRoX6DkvqdQB/90kEYLnBKAibdKUn + rzMWaryguj5RXW89Zkz6FnTHQtdbqMXTYoz01iwULlizKbwXazhZ7Oapu5D0FRvoU2M9/Pna0yvm + oxhbkgOZ84XStz1I4lrCLjN46HNrhIxWi6lV5dNpxIxBKHqtFcLvqj+JR1UxqdIFdxX2uDdz40jV + Jm6mwLAK6EWPjyLBjDCgCZ3FMQJAzB1SvWyxGnQnuu5rHTqH3D04KyM5a6r8tS/mToAFjJrR2IB/ + UBCO0QHgCvbupbnp1u26CZ9Mq2a/wj+NCJ/gr2E11C9+gT8NAz80IFPj67s6/Na+t/DLHypb3/iB + Tv9A4ZfmS7dmQuksNdJqMVbWQg1//0xv/kinN79/qgFSqggq8AdADX45/A/bIv+rb4o6bqwG/mzS + Rtt0i5uBuy7ghTjSd8SpCK99VxwFfX/SnqL3YmD+643aq5e12nM+nm4h3vMnM9FKaokBk3i5OmRK + td0XwX9edM5PqVwvGI2COeCMJ5YTbuuX3d93j3dxx4UYK4B142DKdk79/sTwJytmQv+VeN0gt3Us + FjdxNbtrYwZdirbYq4ON8KfbC358eNr9+PVszzn3um8+sp3syGhlj+SnMrva7krRgTzvpQmLJHeA + 2xILtAI5g7SDxD1YqlBAtmjo15kCdLi6VY+bhBpZ86Qv5Sypgm1Ia03pdVia3dx5reSk5vZrKU2W + 8nVu762j47699fUtcrCvXRATDhZffDjnKQ5ch9xbo56oY3PPO0B97SM/goNPhO3FpDKKstfqlaYs + EMfcHVCGdu6tDIcaW0cr4yaKKJDXULKbzh9sHWPb3z+SnPw7PJN27VGO3JSOMiYLg82iTuUD0uVD + znBUmUgtOguh6+7uTab2GDPvALZ1x9Acxb7AVUl50mL7ZYY3+Dmn+vewyibmDcU4uBaPya5mGcAy + c2AuTefGRKE5bTYXzpUfnyHZ4GPJg4kHHF+cvsOmZU8g/yciYyPzqg7MJtLAphO9YgarM/6r72Cu + NxhddCKeP18LyDviFfp1cIQ5ESZzR757xZ7Cl3C/wJcsshn7mXwsM+jIgqR0tHApydOeuqdDjoT7 + kiPpIhdY1A60d7Nr1N3sYiC5YqUseL1qvxXliowyDi9vHC1IkLx+1exzpCSM+wVBWC9v38Vx7hxf + DhRqRoYke82e7V+88lo9M3FRIq9+vjIllP3ML79906xik0paSbmZKLBiaMVPWlDJLWFAQVXTRzTc + zXtb1D/pjhdxSfVvn93LsiaIlUtJeMdTlz9X9s0gNwy1ieWyfubUsUvZ8YP8gNPhkn+ZpfOGhVvo + jzjNS1NZk+ZlV3YhrKuCG54HglTWTVWkcJC9/0bBVaWkUyztohxFsgBjsWTEpOOm2mqn3VWGXDTz + vtR18KW4SPJgHhwYrv+UzdYZPogF3vEUDRyszqmjgc4Q0MDBUEcDneET0MCjuUONF5EEizUPUc0s + JHYJnpL03SlQKdtrlmLfgl6vaQA+sSxKnATEPeCbVuNsEs2m0yCMhQfshhPEEWRUrCZbzipiq5gD + uJORCFvsPKuiI5CW24/Dkcwl27graa1YHuUpNY1oEMy1su+i/j10f+xZvot+gmVZcQMPY2KBrTEP + r4DNh7PFd62B7wnLh8TA8YFVNaAc0KkWKuqk9GYUjew+kDux72r0XncSxmH1RW3jp+7Jfq1e9d2u + 1koXW+k2NqY3NtSHVLDqEZB1wJ4tmTdLKTQYS9IsJwzmESzVzm/BDLg8yBShFYo+7SqLbZwGY2Ek + IiFjzG9hvmNjHsCo3SAMAQZHt7ZxPkVVWjRwga0DBHiB3xzwOKkwCPsZDeuM+OSqy3bG6NNpkjSK + xKxpRDN3YPBoSW157tUdhNDFxToV3O7TZ6zSBuiFyfq+KZMAwnbOaLXQ9MeYyTF7ctCADkRoXEuf + eaYxH/jQfT+i2dKm9ZawiiGrS3uUciwA1GM/ihSgwqZtsUWIbElOekdl1mh/2FFVbUtlu26ib7rP + fs8YxbClD4xXlzvPDGObtpRR1KjUeQUXOoVZDcPWweSOkgwj3YzOKHCvjDV/jBn4JN6iDPfYSJWq + pvbWPsMs+r3LZN/DaFEsgPIOPosDQDKwjf9C9oU6gQi32+dfjJb88+2b8flS9g/fVXSTUheZAckT + lkyDT/joFrZqpJIuK7IEIMYT0ROwAULj/OTIGBPpjRiIw8lxfHiIBwh+mPKQj0UMcGEjZQ6QHMCG + m+NsI3WKy2IA2xMD0Z5lTZrAUDj0KdTbKpNXU4Aj2LO8B/kpS6ldqthLR5N09AMUQ+tYGFZ6liQV + K8szrORz7TIZZbGmTjCG4b2HXkIdJVyq0qqsu8joHvmTKxFC3jiciVU594PgyhfHwNZjpQofUr2U + XdOdTsGNRKscFnKF6nNJwkVJtWhAZhshB0qUCrBT0rLw6HbiQh7srZYM6BsSyyWJgEpGS2sXwJ0w + tKQt3WBktI2ShupLRlNVhP/RF4nCShVj3SgpRGalYEYoDdocRmnHcLCRPlZAc2qg0d7tGe/jemRD + huVLSkZKYfs9oFcbeGxgt/YI/sp9DghWzQ6c+fSUHe7/nKjg72Flp0UiW1F5tW0pHojJ9bI0+vyy + 1HfA8jAba2io0OQFPzq80mYcn1jTaTKkGcniIVxWMbaXqVOpYhTCJxfKIwsNlvREEfpYcVQcneYX + 9M+CZ9RXBc9A0YpyrLLl0W5NowlooTMKAS/o7oqYCVxM0q7B4CX2h14PgEeIyT6fABzBnAPRj2C8 + jzTdTVxmDY8lrAnMzT0sCfLd+6j++Jr8sy7wSQRbc9+LBwk3OhAIMzLCCV4NzkSB4ePRFGb0BPfr + qqt/qrCqVSeZhGW+G9fKWYn/aiUU8+EKf7SgLSL7S2pg+F2roZIbQyGHqjh/v0QsLDp8fagV6RH2 + wWa0LCvboZuTh9qR2pUPtqNlWdoOMURzYX7FxbpevmNR6yhBg5XleDBVUaR1uCnW07U/8rKTyX9k + EDnYYUXLQxcDnn106F7QJevDypYkjlADAD2B47MNdBG6JW25TUYknPpIz9gf/AAYVyWjafJrWDG3 + ORdFZXqvgpXqgsg5BjQx3UqzRj6KeBQfJl4u6GqGmejaePEjyS/xY7FCDysjn5AYS23r2Vy07lwx + Gk2558GkwRDg5Vi+4KX4aATkqZt+OZUv8CXADxNIDTAR9S2QcnGCEMh4GC++7NELM+VaN5n8y8wx + v5Goq8ng8YgemUlnSlOZ5ph4xdRk+IvPc9kWPMi2cIGkYRkzZ5EY82mTwV+K7o22mX3IfL07ooCD + BIxNRn8IC+8uR5bov5rc/92iFFnBkIORaipbaGS+6AzebXu5Vc6fAW4l/1np3xoM9Yxv5EpUthq6 + Szts2NO8XXro/H5Rbp68Gx5FWiYRs2betdjRAYIjUUcIqEgKQMHmoHKfuVlsFF3QJZFBlZOsNTy9 + yj2ydBk75Ciutt2zJ1AX2tRV0J0MecW548076Xhm4cTqpfqF5D6Mqkn8Ti8LqohhFzFSbjqe3IfU + m18hJKMWk/GBajMf4310sEJ6iv02dIp83/XoCCOLlKWyIQKSBAslPqBuF+V4CRQB3sDjUd2ZV28Q + CazfjMmDLxlOolgD51H58EQnEcBL7vOIvJpl8bZyJK6kVvbzPUxFZQUbPwymJPmNxAiQjFlWDA/W + Bh2K1ltkQyfXmNwZL83/Ss/W5k1uB/OJCDtqgtD+Lpks8rJanChdmMm3pEVNmVd0s3Cu0bEo2rzP + CXf/uUsSUiLF4+rsMco8mE2q85wLUt6+WDqfxaBWhXMiCWaBUdzIZxE+XKIRvHxqra+fC2rx1xXL + q9uTEPQ+av669uHwUYM8HCqdpUdW+2a4gOMQWEctdwtjoLn5/ZA5etIEFRV0dkxCIvSeAdBtksvd + L165AIykRqwn4F0U+l268MWcXEAVrgLVgeSQl2RqwSn61mirNptO0bNBm4zzHET5F6hX+G98efSE + E8A+ARDfDonqJpX2kyOYH+Az+6xivh3iFVpKW+MroryjYQtKPHaR3i3xwoQmO8orMNBIMONPmu1v + 35Qenp0RdDnBdqWd+hmWoXVNJjlQZefLKlvQpgfnrLLz9Zbb+aKZN4ameGBxycH7Mj9TSwzS0xBl + S6zSP7q0MY/J9+9T1u/RFwYfFjdLqqm68dK843Hc5EhjNR1zFo6aSOeZHx8q9PPSQlt822kfD8t8 + vW4SAL/RL6j7/A+2ztcZ3VObd2lDx8MCbgdcfjLMDDn3YNJP908Oj89g8VwpbkGfLq69XNQAH9wB + OmOLW+z87LW1iSnS6vXExZq3EDJRScBNjGmRHS5/GJo0Tswrv0mTW/r4Mfcxm4iflkwE5iGV3mvo + +f8OdjsMxSs5ggvtVszTx6DG06GmzHk2zDT/4EP9Z6X4B8/nQ/Nk2CqfyxxnWApwar2CRmvvh6Tp + CFk2CLClzxXzYmj+CkUu8kUaepGLQpFPOfV2WOo6RtKEBft1mIWywQU7Onz/lqEaRH7zSPo7Ew5T + oB4AGOiImcPNqTtYQMfkbGvlNnxwnjndUS46UpAK5SreDmqKblYqn9BcmOjRpG3SLEXlylqizruo + SCA1O7UGVM5IunoLZnH50xCxBUYxLv/Vl2mLSoZFhb9DL73UQKW+ZdJx4vxQLItjsVwSrOK1WAQD + taAXeCk3E+xP81moEmihoy4Uyeeur+j2Rbu+ctCeLYpnnh9Ur3gcVGVtXXcQANrruomXrzRdttJF + He3rF/Yw+lOBYjZPVakvWkUKeuf/AAAA//8DAGmJumh0HgQA + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Content-Encoding: + - gzip + Content-Security-Policy: + - 'script-src ''nonce-9E4r5yVaPIS_QzTBbUd_JQ'' ''unsafe-inline'' ''strict-dynamic'' + https: http: ''unsafe-eval'';object-src ''none'';base-uri ''self'';report-uri + /trends/cspreport' + Content-Type: + - text/html; charset=utf-8 + Cross-Origin-Opener-Policy: + - same-origin-allow-popups + Date: + - Wed, 31 Aug 2022 13:57:46 GMT + Expires: + - Mon, 01 Jan 1990 00:00:00 GMT + P3P: + - CP="This is not a P3P policy! See g.co/p3phelp for more info." + Pragma: + - no-cache + Server: + - GSE + Set-Cookie: + - NID=511=s5q550rRdsYSXycOhBAeXXFWz0xPozsGid1z_CNdqOJXZhM9PisffmeFt7R1o2FX6FjCQKW5Zg_YJ04eHn0PL2_c4QWk_1ypYu1aBblTmKrF3JoQQPonyNms8qlz0xf2tJ9-C7fWfDg0nIUpn8bQtWFYx1Fqmcnqmw5Mo9IjNsE; + expires=Thu, 02-Mar-2023 13:57:46 GMT; path=/; domain=.google.com; HttpOnly + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - NID=511=s5q550rRdsYSXycOhBAeXXFWz0xPozsGid1z_CNdqOJXZhM9PisffmeFt7R1o2FX6FjCQKW5Zg_YJ04eHn0PL2_c4QWk_1ypYu1aBblTmKrF3JoQQPonyNms8qlz0xf2tJ9-C7fWfDg0nIUpn8bQtWFYx1Fqmcnqmw5Mo9IjNsE + User-Agent: + - python-requests/2.28.1 + accept-language: + - en-US + method: GET + uri: https://trends.google.com/trends/api/explore?hl=en-US&tz=360&req=%7B%22comparisonItem%22%3A+%5B%7B%22keyword%22%3A+%22AAPL%22%2C+%22time%22%3A+%22today+5-y%22%2C+%22geo%22%3A+%22%22%7D%5D%2C+%22category%22%3A+0%2C+%22property%22%3A+%22%22%7D + response: + body: + string: !!binary | + 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 + FaPmmObHQGTLRrfvvwAAAP//AwDqvgGmfhUAAA== + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Content-Disposition: + - attachment; filename="json.txt"; filename*=UTF-8''json.txt + Content-Encoding: + - gzip + Content-Security-Policy: + - 'script-src ''nonce-uBwba1B73bs_YKJY-UAkxg'' ''unsafe-inline'' ''strict-dynamic'' + https: http: ''unsafe-eval'';object-src ''none'';base-uri ''self'';report-uri + /trends/cspreport' + Content-Type: + - application/json; charset=utf-8 + Cross-Origin-Opener-Policy: + - same-origin-allow-popups + Date: + - Wed, 31 Aug 2022 13:57:47 GMT + Expires: + - Mon, 01 Jan 1990 00:00:00 GMT + Pragma: + - no-cache + Server: + - GSE + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - NID=511=s5q550rRdsYSXycOhBAeXXFWz0xPozsGid1z_CNdqOJXZhM9PisffmeFt7R1o2FX6FjCQKW5Zg_YJ04eHn0PL2_c4QWk_1ypYu1aBblTmKrF3JoQQPonyNms8qlz0xf2tJ9-C7fWfDg0nIUpn8bQtWFYx1Fqmcnqmw5Mo9IjNsE + User-Agent: + - python-requests/2.28.1 + accept-language: + - en-US + method: GET + uri: https://trends.google.com/trends/api/widgetdata/relatedsearches?req=%7B%22restriction%22%3A+%7B%22geo%22%3A+%7B%7D%2C+%22time%22%3A+%222017-08-31+2022-08-31%22%2C+%22originalTimeRangeForExploreUrl%22%3A+%22today+5-y%22%2C+%22complexKeywordsRestriction%22%3A+%7B%22keyword%22%3A+%5B%7B%22type%22%3A+%22BROAD%22%2C+%22value%22%3A+%22AAPL%22%7D%5D%7D%7D%2C+%22keywordType%22%3A+%22QUERY%22%2C+%22metric%22%3A+%5B%22TOP%22%2C+%22RISING%22%5D%2C+%22trendinessSettings%22%3A+%7B%22compareTime%22%3A+%222012-08-30+2017-08-30%22%7D%2C+%22requestOptions%22%3A+%7B%22property%22%3A+%22%22%2C+%22backend%22%3A+%22IZG%22%2C+%22category%22%3A+0%7D%2C+%22language%22%3A+%22en%22%2C+%22userCountryCode%22%3A+%22US%22%2C+%22userConfig%22%3A+%7B%22userType%22%3A+%22USER_TYPE_SCRAPER%22%7D%7D&token=APP6_UEAAAAAYxC6W2SEDwpOlcF2HmIga88ZSjbh-a9K&tz=360 + response: + body: + string: !!binary | + H4sIAAAAAAAAALxUbWvkNhD+K3MbAskRxS9J2IvfKD3a4/rloIQW+uWQ7bEtIkuqJMebLAv9G/17 + /SUdeXcvuUDhoLRfbDQzmmfmmdFTDH6UILnqS1RVMaLn0AzcOvTl5Dv27mBTfMTyQeBstPXQaOVR + +XIllPCCS+YaLrFMLmAkyziNz4ZZtH4oW3wQDbLlsKoKL7zE6gdrtYXr9BbOvuct/Iy/T+j8+Zs3 + SRHtIwrnHyWC0qrBcvWpiX8zn55+fS9//Pj+7kqI5Kf0l3lVvd2O3PZCZXFueNsK1WfxLvR10egW + tx0VmyU3ZhOlqdkAt1TwhePKMYdWdEvktubNfW/1pNrspOu6vNFS2+wkTdMvOUOKXa3bx+0Lp8eN + Z1yKXmWTItLyQynrU+CT1xCTYbPvO7u6jc0mJ4bYgKIfqKh3wXDMf0UHiCHA5Lu3UMGC9aKwycqz + KJrn+bLXupd42egxEiPv0UUYuHSR1bX2l0b155DE8SlQLmKPWTTI/RGJ2QU9jUND5khekizwgaNc + P6DtpJ6zQbQtqp2xuJ0H4ZE5wxvM6Mxmy02+E8od6Viv13s6Wmy05V5oldHkcMdBjP221rZFS5P5 + bsRWcHCNRVTAVQtnzxyt14R/vn3deshzoJZ5bbKXtC6+r1uLd7sTqXv9rezVlsqg69HeFa5GyebF + 6fPS4+fkJt7cXLdmz/AzsYfKJHY+Y4HVQ49aycevG6Uoi07LaaEnuU1bI863/7rY9NuLBVqL+DRa + 1iN8cjbqJ7afDlsg/gN0Gsg/UcJmrO+FZ4Gag0wYsUHJlhXK0v+XnfxYzjMcc+IJsy98HVerFc5I + /pgJJYVCVkvd3OeHh31zTY9ov52EQ/tQRIuSkZhyoUC05Yp3bHmzLGgpGdGuwGrSzFUIIY3kMFjs + ytd9kiYavqQIVSxqxiSvUZYflph9EnpwFWFSJP14VZiqqCtS2ssiqiso6NVWdwP3f/3xp6MpwFIJ + +YKdYu8GBNJGEgFouFLag7G6QefAk8fudRpqbPjkEIQH4WDkstOWZnwJHz24QU+yhXC1Dje8FcHz + ClhKmBHulZ6P2FFovvobAAD//wMAvGjwBJUGAAA= + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Content-Encoding: + - gzip + Content-Security-Policy: + - 'script-src ''nonce-W1uRM1JPcUImnLGHuxmN3A'' ''unsafe-inline'' ''strict-dynamic'' + https: http: ''unsafe-eval'';object-src ''none'';base-uri ''self'';report-uri + /trends/cspreport' + Content-Type: + - text/html; charset=utf-8 + Cross-Origin-Opener-Policy: + - same-origin-allow-popups + Date: + - Wed, 31 Aug 2022 13:57:47 GMT + Expires: + - Mon, 01 Jan 1990 00:00:00 GMT + Pragma: + - no-cache + Server: + - GSE + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - 1; mode=block + status: + code: 429 + message: unknown +version: 1 diff --git a/tests/openbb_terminal/common/behavioural_analysis/test_google_view.py b/tests/openbb_terminal/common/behavioural_analysis/test_google_view.py index e69de29bb2d1..bc4c680dcc93 100644 --- a/tests/openbb_terminal/common/behavioural_analysis/test_google_view.py +++ b/tests/openbb_terminal/common/behavioural_analysis/test_google_view.py @@ -0,0 +1,104 @@ +# IMPORTATION STANDARD + +# IMPORTATION THIRDPARTY +import pandas as pd +import pytest + +# IMPORTATION INTERNAL +from openbb_terminal.common.behavioural_analysis import google_view + +# pylint: disable=E1101 +# pylint: disable=W0603 +# pylint: disable=E1111 +# pylint: disable=W0621 +# pylint: disable=W0613 + + +@pytest.fixture +def get_queries_response(): + """ + mock response from get_queries function in google_model + """ + top_list = [ + ["stock aapl", 100], + ["aapl price", 29], + ["stock price aapl", 24], + ["amzn", 19], + ["tsla", 19], + ["msft", 15], + ["tsla stock", 12], + ["amzn stock", 11], + ["fb stock", 10], + ["msft stock", 9], + ["nvda", 7], + ["dow", 6], + ["tesla", 6], + ["amd", 5], + ["goog", 5], + ["baba", 5], + ["aapl premarket", 5], + ["nvda stock", 5], + ["tesla stock", 5], + ["amd stock", 4], + ["aapl stock price today", 4], + ["nflx", 4], + ["nio", 4], + ["baba stock", 4], + ["nio stock", 4], + ] + + resp = { + "AAPL": { + "top": pd.DataFrame(top_list, columns=["query", "value"]), + "rising": pd.DataFrame(top_list, columns=["query", "value"]), + } + } + + return resp + + +@pytest.mark.default_cassette("test_google_view") +@pytest.mark.vcr +@pytest.mark.parametrize( + "symbol, limit, export", + [ + ( + # standard run without export + "AAPL", + 10, + "", + ), + ( + # standard run WITH export + "AAPL", + 10, + "csv", + ), + ], +) +def test_display_queries(mocker, symbol, limit, export, get_queries_response): + # MOCK VISUALIZE_OUTPUT + mocker.patch(target="openbb_terminal.helper_classes.TerminalStyle.visualize_output") + + # MOCK GOOGLE_MODEL + mocker.patch( + target="openbb_terminal.common.behavioural_analysis.google_model.get_queries", + return_value=get_queries_response, + ) + + # MOCK EXPORT_DATA + export_mock = mocker.Mock() + mocker.patch( + target="openbb_terminal.common.behavioural_analysis.google_view.export_data", + new=export_mock, + ) + + google_view.display_queries(symbol, limit, export) + + if export: + pd.testing.assert_frame_equal( + export_mock.call_args[0][3], # fourth positional arg is the df + pd.DataFrame( + get_queries_response[symbol]["top"].head(limit) + ), # expected DF + ) diff --git a/tests/openbb_terminal/common/behavioural_analysis/txt/test_google_view/test_display_queries_export[AAPL-10-].txt b/tests/openbb_terminal/common/behavioural_analysis/txt/test_google_view/test_display_queries_export[AAPL-10-].txt new file mode 100644 index 000000000000..9c5cd3a7ab0b --- /dev/null +++ b/tests/openbb_terminal/common/behavioural_analysis/txt/test_google_view/test_display_queries_export[AAPL-10-].txt @@ -0,0 +1,11 @@ + query value +0 stock aapl 100% +1 aapl price 29% +2 stock price aapl 24% +3 amzn 19% +4 tsla 19% +5 msft 15% +6 tsla stock 12% +7 amzn stock 11% +8 fb stock 10% +9 msft stock 9% diff --git a/tests/openbb_terminal/common/behavioural_analysis/txt/test_google_view/test_display_queries_export[AAPL-10-csv].txt b/tests/openbb_terminal/common/behavioural_analysis/txt/test_google_view/test_display_queries_export[AAPL-10-csv].txt new file mode 100644 index 000000000000..9c5cd3a7ab0b --- /dev/null +++ b/tests/openbb_terminal/common/behavioural_analysis/txt/test_google_view/test_display_queries_export[AAPL-10-csv].txt @@ -0,0 +1,11 @@ + query value +0 stock aapl 100% +1 aapl price 29% +2 stock price aapl 24% +3 amzn 19% +4 tsla 19% +5 msft 15% +6 tsla stock 12% +7 amzn stock 11% +8 fb stock 10% +9 msft stock 9% diff --git a/tests/openbb_terminal/test_helper_funcs.py b/tests/openbb_terminal/test_helper_funcs.py new file mode 100644 index 000000000000..db63cd861b54 --- /dev/null +++ b/tests/openbb_terminal/test_helper_funcs.py @@ -0,0 +1,99 @@ +# IMPORTATION STANDARD +from pathlib import Path + +# IMPORTATION THIRDPARTY +import pandas as pd +import pytest + +# IMPORTATION INTERNAL +from openbb_terminal.helper_funcs import export_data + +# pylint: disable=E1101 +# pylint: disable=W0603 +# pylint: disable=E1111 +# pylint: disable=W0621 +# pylint: disable=W0613 + + +@pytest.fixture +def mock_compose_export_path(monkeypatch, tmp_path): + # files in tmp_dir will remain (in separate folders) for 3 sequential runs of pytest + def mock_return(func_name, *args, **kwargs): + return tmp_path, f"{func_name}_20220829_235959" + + monkeypatch.setattr("openbb_terminal.helper_funcs.compose_export_path", mock_return) + + +@pytest.mark.parametrize( + "export_type, dir_path, func_name, df", + [ + ( + "csv", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ( + "json", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ( + "xlsx", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ( + "png", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ( + "jpg", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ( + "pdf", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ( + "svg", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + pd.DataFrame(), + ), + ], +) +def test_export_data_filetypes( + mock_compose_export_path, export_type, dir_path, func_name, df, tmp_path +): + export_data(export_type, dir_path, func_name, df) + + assert Path(tmp_path / f"{func_name}_20220829_235959.{export_type}").exists() + # TODO add assertions to check the validity of the files? + + +@pytest.mark.parametrize( + "export_type, dir_path, func_name, data", + [ + ( + # Dict instead of DataFrame + "csv", + "C:/openbb_terminal/common/behavioural_analysis", + "queries", + dict({"test": "dict"}), + ), + ], +) +def test_export_data_invalid_data( + mock_compose_export_path, export_type, dir_path, func_name, data +): + with pytest.raises(AttributeError): + assert export_data(export_type, dir_path, func_name, data)