From 6cdd3bdfbc4c3019bfec74f66199dd60a47c53ac Mon Sep 17 00:00:00 2001 From: 170-carry Date: Fri, 24 Apr 2026 20:42:36 +0800 Subject: [PATCH] chore: update h5 center static pages --- h5/KYC/index.html | 13 + h5/admin-center/index.html | 90 ++- h5/admin-policy/index.html | 13 + h5/agency-center/agency-center.css | 414 +++++++++++ h5/agency-center/agency-center.js | 703 ++++++++++++++++++ h5/agency-center/index.html | 158 +++- h5/agency-list/index.html | 13 + h5/agency-setting/index.html | 13 + h5/apply/apply.css | 338 +++++++++ h5/apply/apply.js | 511 +++++++++++++ h5/apply/index.html | 60 +- .../defaultAvatar-CdxWBK1k-1776148661448.png | Bin 42625 -> 134581 bytes h5/available-income/index.html | 13 + h5/bank-card/index.html | 13 + h5/bank-cards/index.html | 13 + h5/bd-center/bd-center.css | 2 +- h5/bd-center/bd-center.js | 87 ++- h5/bd-item-distribution/index.html | 13 + h5/bd-leader-center/bd-leader-center.css | 482 ++++++++++++ h5/bd-leader-center/bd-leader-center.js | 558 ++++++++++++++ h5/bd-leader-center/index.html | 137 +++- h5/bd-list/index.html | 13 + h5/cash-out-details/index.html | 13 + h5/cash-out/index.html | 13 + h5/cash-withdraw/index.html | 13 + h5/center-static/center-static.css | 318 ++++++++ h5/center-static/center-static.js | 297 ++++++++ h5/center-static/static-route.css | 177 +++++ h5/center-static/static-route.js | 56 ++ h5/exchange-gold-coins/index.html | 13 + h5/history-salary/index.html | 13 + h5/host-center/host-center.css | 431 +++++++++++ h5/host-center/host-center.js | 653 ++++++++++++++++ h5/host-center/icons/arrow.svg | 3 + h5/host-center/icons/back.svg | 3 + h5/host-center/icons/bank.svg | 5 + h5/host-center/icons/exchange.svg | 6 + h5/host-center/icons/money.svg | 5 + h5/host-center/icons/policy.svg | 6 + h5/host-center/icons/transfer.svg | 6 + h5/host-center/icons/withdraw.svg | 7 + h5/host-center/index.html | 134 +++- h5/host-setting/index.html | 13 + h5/income-details/index.html | 13 + h5/information-details/index.html | 13 + h5/invite-agency/index.html | 110 +++ h5/invite-agency/yumi-invite-agency.css | 177 +++++ h5/invite-agency/yumi-invite-agency.js | 694 +++++++++++++++++ h5/invite-bd-leader/index.html | 109 +++ h5/invite-bd-leader/yumi-invite-bd-leader.css | 177 +++++ h5/invite-bd-leader/yumi-invite-bd-leader.js | 699 +++++++++++++++++ h5/invite-bd/index.html | 109 +++ h5/invite-bd/yumi-invite-bd.css | 177 +++++ h5/invite-bd/yumi-invite-bd.js | 699 +++++++++++++++++ h5/invite-members/index.html | 13 + h5/invite-recharge-agency/index.html | 109 +++ .../yumi-invite-recharge-agency.css | 177 +++++ .../yumi-invite-recharge-agency.js | 699 +++++++++++++++++ h5/item-distribution/index.html | 13 + h5/language/index.html | 35 + h5/logic-pages/app.css | 355 +++++++++ h5/logic-pages/app.js | 662 +++++++++++++++++ h5/message/index.html | 13 + h5/my-BD-teams/index.html | 13 + h5/my-BDLeader-teams/index.html | 13 + h5/my-agency-teams/index.html | 13 + h5/my-recharge-agency/index.html | 13 + h5/platform-policy/index.html | 13 + h5/policy/index.html | 13 + h5/search-payee/index.html | 13 + h5/team-bill/index.html | 13 + h5/team-member/index.html | 13 + h5/transfer/index.html | 13 + 73 files changed, 10904 insertions(+), 121 deletions(-) create mode 100644 h5/KYC/index.html create mode 100644 h5/admin-policy/index.html create mode 100644 h5/agency-center/agency-center.css create mode 100644 h5/agency-center/agency-center.js create mode 100644 h5/agency-list/index.html create mode 100644 h5/agency-setting/index.html create mode 100644 h5/apply/apply.css create mode 100644 h5/apply/apply.js create mode 100644 h5/available-income/index.html create mode 100644 h5/bank-card/index.html create mode 100644 h5/bank-cards/index.html create mode 100644 h5/bd-item-distribution/index.html create mode 100644 h5/bd-leader-center/bd-leader-center.css create mode 100644 h5/bd-leader-center/bd-leader-center.js create mode 100644 h5/bd-list/index.html create mode 100644 h5/cash-out-details/index.html create mode 100644 h5/cash-out/index.html create mode 100644 h5/cash-withdraw/index.html create mode 100644 h5/center-static/center-static.css create mode 100644 h5/center-static/center-static.js create mode 100644 h5/center-static/static-route.css create mode 100644 h5/center-static/static-route.js create mode 100644 h5/exchange-gold-coins/index.html create mode 100644 h5/history-salary/index.html create mode 100644 h5/host-center/host-center.css create mode 100644 h5/host-center/host-center.js create mode 100644 h5/host-center/icons/arrow.svg create mode 100644 h5/host-center/icons/back.svg create mode 100644 h5/host-center/icons/bank.svg create mode 100644 h5/host-center/icons/exchange.svg create mode 100644 h5/host-center/icons/money.svg create mode 100644 h5/host-center/icons/policy.svg create mode 100644 h5/host-center/icons/transfer.svg create mode 100644 h5/host-center/icons/withdraw.svg create mode 100644 h5/host-setting/index.html create mode 100644 h5/income-details/index.html create mode 100644 h5/information-details/index.html create mode 100644 h5/invite-agency/index.html create mode 100644 h5/invite-agency/yumi-invite-agency.css create mode 100644 h5/invite-agency/yumi-invite-agency.js create mode 100644 h5/invite-bd-leader/index.html create mode 100644 h5/invite-bd-leader/yumi-invite-bd-leader.css create mode 100644 h5/invite-bd-leader/yumi-invite-bd-leader.js create mode 100644 h5/invite-bd/index.html create mode 100644 h5/invite-bd/yumi-invite-bd.css create mode 100644 h5/invite-bd/yumi-invite-bd.js create mode 100644 h5/invite-members/index.html create mode 100644 h5/invite-recharge-agency/index.html create mode 100644 h5/invite-recharge-agency/yumi-invite-recharge-agency.css create mode 100644 h5/invite-recharge-agency/yumi-invite-recharge-agency.js create mode 100644 h5/item-distribution/index.html create mode 100644 h5/language/index.html create mode 100644 h5/logic-pages/app.css create mode 100644 h5/logic-pages/app.js create mode 100644 h5/message/index.html create mode 100644 h5/my-BD-teams/index.html create mode 100644 h5/my-BDLeader-teams/index.html create mode 100644 h5/my-agency-teams/index.html create mode 100644 h5/my-recharge-agency/index.html create mode 100644 h5/platform-policy/index.html create mode 100644 h5/policy/index.html create mode 100644 h5/search-payee/index.html create mode 100644 h5/team-bill/index.html create mode 100644 h5/team-member/index.html create mode 100644 h5/transfer/index.html diff --git a/h5/KYC/index.html b/h5/KYC/index.html new file mode 100644 index 0000000..3ab7dad --- /dev/null +++ b/h5/KYC/index.html @@ -0,0 +1,13 @@ + + + + + + KYC + + + + + + + diff --git a/h5/admin-center/index.html b/h5/admin-center/index.html index 8d4f53d..04c7e47 100644 --- a/h5/admin-center/index.html +++ b/h5/admin-center/index.html @@ -1,35 +1,67 @@ - + - - - - - - - - - - Yumi H5 - - - - - + + + Admin Center + -
+
+ +
+
+
+
My available salary
+ +
+
$0
+
+
+
+
+ +
+ + diff --git a/h5/admin-policy/index.html b/h5/admin-policy/index.html new file mode 100644 index 0000000..aee1a9d --- /dev/null +++ b/h5/admin-policy/index.html @@ -0,0 +1,13 @@ + + + + + + Admin Policy + + + + + + + diff --git a/h5/agency-center/agency-center.css b/h5/agency-center/agency-center.css new file mode 100644 index 0000000..66dabbd --- /dev/null +++ b/h5/agency-center/agency-center.css @@ -0,0 +1,414 @@ +@font-face { + font-family: "Baloo 2"; + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Baloo 2"; + font-weight: 600; + font-style: normal; + font-display: swap; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.4; +} + +html, +body { + width: 100%; + min-height: 100%; + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: transparent; + overflow-x: hidden; +} + +body { + color: #21342a; + background: #edf8f1; +} + +button { + border: 0; + background: transparent; + color: inherit; + font: inherit; +} + +.agency-center { + min-height: 100vh; + overflow-y: auto; + background-color: #edf8f1; + background-image: none; +} + +.agency-center::-webkit-scrollbar { + display: none; +} + +.page-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: 44px 1fr auto; + align-items: center; + width: 100%; + min-height: calc(48px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 10px 0; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); +} + +.page-header h1 { + min-width: 0; + font-size: 1.35em; + font-weight: 600; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #153d28; +} + +.header-actions { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 6px; +} + +.icon-button, +.message-button, +.language-button { + min-width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + color: #1f6f46; +} + +.icon-button span { + display: block; + font-size: 2em; + line-height: 1; +} + +.message-button { + width: 36px; + border-radius: 50%; + background: #fff3c8; + color: #7d5b09; +} + +.message-button span { + width: 16px; + height: 16px; + display: block; + border-radius: 50%; + background: #f3c74e; + color: #5d4200; + font-size: 0.8em; + line-height: 16px; + text-align: center; +} + +.language-button { + min-width: 42px; + padding: 0 10px; + border-radius: 999px; + background: #dff5e7; + color: #24724a; + font-size: 0.9em; +} + +.content { + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + gap: 14px; + padding: 16px; +} + +.surface-card { + position: relative; + border: 1px solid #b7e0c6; + border-radius: 18px; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.salary-card { + padding: 18px; + background: #f8fff9; + border-color: #94d9ae; + overflow: hidden; +} + +.salary-card::after { + content: ""; + position: absolute; + right: 18px; + bottom: 18px; + width: 64px; + height: 64px; + border-radius: 20px; + background: #d7f5e2; + border: 10px solid #ecfbf1; + opacity: 0.9; +} + +.salary-title { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + gap: 8px; + margin-bottom: 5px; +} + +.salary-title span { + min-width: 0; + font-weight: 600; + color: #244735; +} + +.salary-title button { + flex-shrink: 0; + padding: 4px 10px; + border-radius: 999px; + background: #fff3c8; + color: #846216; + font-weight: 600; +} + +.salary-amount { + position: relative; + z-index: 1; + font-size: 1.5em; + font-weight: 600; + color: #105c36; +} + +.task-card { + margin: 0 1%; + padding: 16px; + background: #fffaf0; + border-color: #e7c777; +} + +.task-title { + margin-bottom: 12px; + font-weight: 700; + color: #3f3826; +} + +.task-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + text-align: center; +} + +.task-cell { + min-width: 0; + padding: 8px; + border-radius: 12px; + background: #fffdf7; + border: 1px solid #f0dfaa; +} + +.task-label { + margin-bottom: 5px; + font-size: 0.86em; + font-weight: 700; + color: #4b4536; +} + +.task-value { + font-size: 0.95em; + font-weight: 800; + color: #1f3528; + overflow-wrap: anywhere; +} + +.menu-card { + margin: 0 1% 12px; + padding: 10px; + background: #fbfffc; +} + +.menu-row { + width: 100%; + min-height: 4.5em; + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: 14px; + text-align: left; +} + +.menu-row:nth-of-type(4n + 1) { + background: #eefbf3; +} + +.menu-row:nth-of-type(4n + 3) { + background: #f7fbec; +} + +.menu-row:nth-of-type(4n + 5) { + background: #eef7fb; +} + +.menu-row:nth-of-type(4n + 7) { + background: #fff5ed; +} + +.menu-label { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + gap: 12px; +} + +.menu-label img, +.menu-symbol { + display: flex; + width: 2.7em; + padding: 0.55em; + aspect-ratio: 1 / 1; + flex-shrink: 0; + align-items: center; + justify-content: center; + border-radius: 14px; + background: #d7f5e2; + border: 1px solid #bce5ca; + color: #1e6b43; + font-weight: 800; +} + +.menu-row:nth-of-type(4n + 5) .menu-label img, +.menu-row:nth-of-type(4n + 5) .menu-symbol { + background: #dff2fb; + border-color: #c0e1f1; +} + +.menu-row:nth-of-type(4n + 7) .menu-label img, +.menu-row:nth-of-type(4n + 7) .menu-symbol { + background: #ffe6d6; + border-color: #ffd2b7; +} + +.menu-label span:last-child { + min-width: 0; + font-size: 1em; + font-weight: 600; + color: #244735; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.menu-row > img { + display: block; + width: 1.35em; + flex-shrink: 0; + opacity: 0.5; +} + +.divider { + height: 1px; + margin: 0 12px; + background: #dbece0; +} + +.modal-mask { + position: fixed; + inset: 0; + z-index: 30; + display: flex; + align-items: center; + justify-content: center; + padding: 16px; + background: rgba(0, 0, 0, 0.5); +} + +.modal-dialog { + width: min(80vw, 320px); + padding: 14px; + border-radius: 12px; + background: #ffffff; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.18); +} + +.modal-title { + color: rgba(0, 0, 0, 0.8); + font-weight: 700; + font-size: 1.2em; +} + +.modal-message { + color: rgba(0, 0, 0, 0.8); + font-weight: 600; + text-align: center; +} + +.modal-hint { + color: rgba(0, 0, 0, 0.45); + font-weight: 600; + font-size: 0.85em; + text-align: center; +} + +.modal-action { + width: 50%; + min-width: 120px; + padding: 8px 12px; + border-radius: 999px; + background: #f3c74e; + color: #3f2b00; + font-weight: 800; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(22px + env(safe-area-inset-bottom)); + z-index: 40; + max-width: calc(100% - 40px); + transform: translateX(-50%); + padding: 9px 13px; + border-radius: 999px; + background: rgba(22, 56, 36, 0.92); + color: #fff; + font-size: 0.9em; + font-weight: 700; + text-align: center; +} + +[hidden] { + display: none !important; +} + +[dir="rtl"] .flip-img { + transform: rotate(180deg); +} diff --git a/h5/agency-center/agency-center.js b/h5/agency-center/agency-center.js new file mode 100644 index 0000000..d4879b6 --- /dev/null +++ b/h5/agency-center/agency-center.js @@ -0,0 +1,703 @@ +import { _ as policyIcon, a as transferIcon, b as bankIcon } from "../js/database-export-CGwyHyM--1776148658686.js"; +import { _ as coinsIcon, a as cashIcon } from "../js/database-dollar-DDq4bT-e-1776148658686.js"; +import { _ as arrowIcon } from "../js/arrow-Cf0JWzXk-1776148658686.js"; +import { _ as helpIcon } from "../js/help-BgsLqEJs-1776148658686.js"; + +const API_BASE_URL = "https://jvapi.haiyihy.com"; + +const labels = { + en: { + agency_center: "Agency Center", + my_available_salary: "My available salary", + my_salary_details: "Salary details", + today_host_task: "My task as a host today is:", + host_type: "Host type", + minutes: "Minutes", + gift_task: "Gift Task", + platform_policy: "Platform policy", + exchange_coins: "Exchange coins", + transfer: "Transfer", + cash_withdraw: "Cash withdraw", + bank_accounts: "Bank Accounts", + team_member: "Team Member", + team_bill: "Team Bill", + invite_members: "Invite Members", + prompt: "Prompt", + fill_info_tips: "Please complete your withdrawal information first.", + card_issue_tips: "Make sure the bank card and identity information are valid.", + to_improve: "To improve", + completed: "Completed", + in_progress: "In progress", + out_of_account: "Out of account", + failed_to_load_data: "Failed to load data. Please try again." + }, + ar: {}, + tr: {}, + bn: {} +}; + +let commonHeaders = { + authorization: "Bearer undefined", + "req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google", + "req-client": "Android", + "req-imei": "8fa54d728ab449e04f9292329ed44bda", + "req-lang": "id-ID", + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "req-version": "V2", + "req-zone": "Asia/Shanghai" +}; + +const state = { + lang: resolveLanguage(), + userProfile: null, + teamInfo: null, + identityInfo: null, + salaryInfo: { + currentSalary: "0.00" + }, + taskInfo: { + anchorType: "Chat", + minutesProgress: 0, + minutesTotal: 120, + giftTask: 0 + }, + memberQuantity: 0, + memberWorkTotal: "0.00", + teamBill: { + date: "–", + hostSalary: "–", + agentSalary: "–", + total: "–", + status: "–" + }, + bankCards: [], + defaultBankCard: null, + withdrawInfo: null, + withdrawEnabled: false, + showFillInfoModal: false +}; + +const rolePriority = { + guest: 0, + anchor: 1, + agent: 2, + bd: 3, + bdLeader: 4, + freightAgent: 5, + admin: 6 +}; + +const roleDefaultPages = { + admin: "/admin-center", + freightAgent: "/coin-seller", + agent: "/agency-center", + bdLeader: "/bd-leader-center", + bd: "/bd-center", + anchor: "/host-center", + guest: "/apply" +}; + +const rolePages = { + admin: [ + "/admin-center", + "/invite-bd-leader", + "/invite-bd", + "/invite-recharge-agency", + "/invite-agency", + "/item-distribution", + "/my-BDLeader-teams", + "/my-BD-teams", + "/my-agency-teams", + "/my-recharge-agency", + "/admin-policy" + ], + freightAgent: ["/coin-seller", "/seller-records", "/coin-seller-search"], + agent: [ + "/agency-center", + "/transfer", + "/exchange-gold-coins", + "/message", + "/platform-policy", + "/agency-setting", + "/team-member", + "/information-details", + "/history-salary", + "/invite-members", + "/team-bill" + ], + bdLeader: [ + "/bd-leader-center", + "/invite-bd-leader", + "/invite-bd", + "/bd-center", + "/transfer", + "/exchange-gold-coins", + "/message", + "/invite-agency", + "/bd-item-distribution", + "/team-member", + "/history-salary", + "/agency-list", + "/available-income", + "/income-details", + "/policy", + "/bd-list" + ], + bd: [ + "/bd-center", + "/transfer", + "/exchange-gold-coins", + "/message", + "/invite-agency", + "/bd-item-distribution", + "/team-member", + "/history-salary", + "/agency-list", + "/available-income", + "/income-details", + "/policy" + ], + anchor: [ + "/host-center", + "/transfer", + "/exchange-gold-coins", + "/message", + "/platform-policy", + "/host-setting", + "/information-details", + "/history-salary", + "/invite-members", + "/team-bill" + ], + guest: ["/apply", "/language"] +}; + +const publicPages = [ + "/apply", + "/language", + "/not_app", + "/pay-result", + "/map", + "/top-list", + "/weekly-star", + "/ranking", + "/games-king", + "/couple", + "/invitation-to-register", + "/invitation/invite-new-user", + "/recharge-reward", + "/login-reward", + "/activities/lesser-bairam", + "/activities/lucky-dollars-season3", + "/activities/spring-festival", + "/recharge", + "/recharge-pay-way", + "/recharge-guide", + "/recharge-agency-recruit", + "/search-payee", + "/cash-withdraw", + "/cash-out", + "/cash-out-details", + "/bank-cards", + "/bank-card", + "/KYC", + "/good-ID" +]; + +function resolveLanguage() { + const params = new URLSearchParams(window.location.search); + const hashQuery = window.location.hash.includes("?") ? window.location.hash.split("?")[1] : ""; + const hashParams = new URLSearchParams(hashQuery); + const lang = params.get("lang") || hashParams.get("lang") || navigator.language || "en"; + + if (lang.startsWith("ar")) return "ar"; + if (lang.startsWith("tr")) return "tr"; + if (lang.startsWith("bn")) return "bn"; + return "en"; +} + +function t(key) { + return labels[state.lang]?.[key] || labels.en[key] || key; +} + +function setLanguage() { + document.documentElement.lang = state.lang; + document.documentElement.dir = state.lang === "ar" ? "rtl" : "ltr"; + document.querySelector("[data-action='language']").textContent = state.lang.toUpperCase(); + document.querySelectorAll("[data-i18n]").forEach((node) => { + node.textContent = t(node.dataset.i18n); + }); +} + +function setIcons() { + const iconMap = { + policy: policyIcon, + transfer: transferIcon, + bank: bankIcon, + coins: coinsIcon, + cash: cashIcon, + arrow: arrowIcon, + help: helpIcon + }; + + document.querySelectorAll("[data-icon]").forEach((img) => { + img.src = iconMap[img.dataset.icon] || ""; + }); +} + +function isMobileDevice() { + return /Android|iPad|iPhone|iPod/.test(navigator.userAgent); +} + +function isAppEnvironment() { + return Boolean(window.app || window.webkit || window.FlutterPageControl); +} + +function splitHeaderPairs(value) { + const result = {}; + if (!value) return result; + value.split(";").forEach((item) => { + const index = item.indexOf("="); + if (index > -1) result[item.slice(0, index)] = item.slice(index + 1); + }); + return result; +} + +function parseAccessOrigin(raw) { + const data = JSON.parse(raw); + const appIntel = splitHeaderPairs(data["Req-App-Intel"]); + const sysOrigin = splitHeaderPairs(data["Req-Sys-Origin"]); + + return { + reqLang: data["Req-Lang"], + authorization: data.Authorization, + buildVersion: appIntel.build, + appVersion: appIntel.version, + appChannel: appIntel.channel, + reqImei: data["Req-Imei"], + sysOrigin: sysOrigin.origin, + sysOriginChild: sysOrigin.child + }; +} + +function setHeadersFromApp(headers) { + const next = {}; + if (headers.authorization) next.authorization = headers.authorization; + if (headers.reqLang) next["req-lang"] = headers.reqLang; + if (headers.appVersion || headers.buildVersion || headers.appChannel) { + const intel = []; + if (headers.appVersion) intel.push(`version=${headers.appVersion}`); + if (headers.buildVersion) intel.push(`build=${headers.buildVersion}`); + if (headers.appChannel) intel.push(`channel=${headers.appChannel}`); + next["req-app-intel"] = intel.join(";"); + } + if (headers.reqImei) next["req-imei"] = headers.reqImei; + if (headers.sysOrigin) { + const origin = [`origin=${headers.sysOrigin}`]; + if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`); + next["req-sys-origin"] = origin.join(";"); + } + commonHeaders = { ...commonHeaders, ...next }; +} + +function requestAccessOrigin() { + return new Promise((resolve) => { + window.renderData = resolve; + window.getIosAccessOriginParam = resolve; + + if (!isAppEnvironment()) { + setHeadersFromApp({ + authorization: "", + reqLang: state.lang, + appVersion: "1.0.0", + buildVersion: "1", + appChannel: "Web", + reqImei: "H5-STATIC", + sysOrigin: "LIKEI", + sysOriginChild: "LIKEI" + }); + resolve(null); + return; + } + + let attempt = 0; + const poll = () => { + attempt += 1; + if (window.app && typeof window.app.getAccessOrigin === "function") { + resolve(window.app.getAccessOrigin()); + return; + } + if (attempt < 50) { + window.setTimeout(poll, 100); + return; + } + if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") { + window.FlutterApp.postMessage("requestAccessOrigin"); + } + }; + + if (isMobileDevice()) { + poll(); + return; + } + resolve(null); + }); +} + +async function connectToApp() { + const raw = await requestAccessOrigin(); + if (raw) setHeadersFromApp(parseAccessOrigin(raw)); +} + +async function apiGet(path) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "GET", + headers: commonHeaders + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.status === false) { + const error = new Error(data.errorMsg || data.message || `Request failed: ${response.status}`); + error.response = data; + throw error; + } + return data; +} + +function readCachedJson(key) { + const raw = localStorage.getItem(key); + if (!raw) return null; + try { + return JSON.parse(raw); + } catch (error) { + console.warn(`Failed to parse ${key}:`, error); + return null; + } +} + +function writeCachedJson(key, value) { + if (value === null || value === undefined) { + localStorage.removeItem(key); + return; + } + localStorage.setItem(key, JSON.stringify(value)); +} + +function getUserId() { + return state.userProfile?.id || readCachedJson("userProfile")?.id || null; +} + +function getTeamId() { + return state.teamInfo?.id || readCachedJson("teamInfo")?.id || null; +} + +function formatMoney(value) { + if (value === null || value === undefined || value === "") return "0"; + const number = Number(value); + if (Number.isNaN(number)) return String(value); + return number.toFixed(2); +} + +function formatBillStatus(status) { + return { + SETTLED: t("completed"), + UNPAID: t("in_progress"), + HANG_UP: t("out_of_account"), + PAY_OUT: t("completed") + }[status] || status || "–"; +} + +function getIdentityRoles(identity) { + if (!identity) return ["guest"]; + const roles = []; + if (identity.freightAgent) roles.push("freightAgent"); + if (identity.agent) roles.push("agent"); + if (identity.bdLeader) roles.push("bdLeader"); + if (identity.bd) roles.push("bd"); + if (identity.anchor) roles.push("anchor"); + if (identity.admin) roles.push("admin"); + return roles.length ? roles : ["guest"]; +} + +function getPrimaryRole(roles) { + return roles.reduce((primary, role) => (rolePriority[role] > rolePriority[primary] ? role : primary), "guest"); +} + +function getAllowedPages(roles) { + const pages = new Set([...publicPages, "/loading"]); + roles.forEach((role) => { + (rolePages[role] || []).forEach((page) => pages.add(page)); + }); + return pages; +} + +function applyPermissionRedirect() { + const roles = getIdentityRoles(state.identityInfo); + const primaryRole = getPrimaryRole(roles); + const allowedPages = getAllowedPages(roles); + const currentPath = window.location.pathname.replace(/\/$/, "") || "/"; + + if (!allowedPages.has(currentPath)) { + navigateTo(roleDefaultPages[primaryRole] || "/apply"); + } +} + +async function fetchIdentity() { + const result = await apiGet("/app/h5/identity"); + if (result.status && result.body) state.identityInfo = result.body; +} + +async function fetchUserProfile() { + const result = await apiGet("/team/member/profile"); + if (result.status && result.body) { + state.userProfile = result.body; + writeCachedJson("userProfile", result.body); + } +} + +async function fetchTeamInfo() { + const result = await apiGet("/team/entry"); + if (result.status && result.body) { + state.teamInfo = result.body.teamProfile || result.body; + writeCachedJson("teamInfo", state.teamInfo); + } else { + state.teamInfo = null; + writeCachedJson("teamInfo", null); + } +} + +async function fetchBankBalance() { + const result = await apiGet("/wallet/bank/balance"); + if (result.status && typeof result.body === "number") { + state.salaryInfo.currentSalary = result.body.toFixed(2); + } else { + state.salaryInfo.currentSalary = "0"; + } +} + +async function fetchWorkStatistics() { + const userId = getUserId(); + if (!userId) return; + const result = await apiGet(`/team/member/work/statistics-now?dataType=DAILY&memberId=${encodeURIComponent(userId)}`); + if (result.status && result.body) { + const ownTime = Number(result.body.ownTime) || 0; + const otherTime = Number(result.body.otherTime) || 0; + const progress = ownTime + otherTime; + state.taskInfo.anchorType = "Chat"; + state.taskInfo.minutesProgress = Math.min(progress, state.taskInfo.minutesTotal); + state.taskInfo.giftTask = result.body.acceptGiftValue || 0; + } +} + +async function fetchMemberWorkTotal() { + const userId = getUserId(); + if (!userId) return; + const result = await apiGet(`/team/member-work?userId=${encodeURIComponent(userId)}`); + if (!result.status || !result.body) return; + + const targets = result.body.targets || []; + const isAgent = Boolean(state.identityInfo?.agent); + const isAnchor = Boolean(state.identityInfo?.anchor); + const total = targets.reduce((sum, item, index) => { + if (index === 0) return sum; + const settlement = item.target?.settlementResult || {}; + if (isAgent) { + return sum + Number(settlement.ownSalary || 0) + Number(settlement.memberSalary || 0); + } + if (isAnchor) { + return sum + Number(settlement.memberSalary || 0); + } + return sum; + }, 0); + state.memberWorkTotal = total.toFixed(2); +} + +async function fetchTeamMemberCount() { + const teamId = getTeamId(); + if (!teamId) return; + try { + const result = await apiGet(`/team/members/count?id=${encodeURIComponent(teamId)}`); + if (result.status && result.body) { + state.memberQuantity = result.body.memberQuantity || 0; + } + } catch (error) { + console.error("Failed to fetch team member count:", error); + state.memberQuantity = 87; + } +} + +async function fetchTeamBill() { + const teamId = getTeamId(); + if (!teamId) return; + const result = await apiGet(`/team/bill?id=${encodeURIComponent(teamId)}`); + if (!result.status || !Array.isArray(result.body) || !result.body[0]) return; + + const bill = result.body[0]; + const billBelong = String(bill.billBelong || ""); + state.teamBill = { + date: billBelong.length >= 6 ? `${billBelong.slice(0, 4)}.${billBelong.slice(4, 6)}` : "–", + hostSalary: bill.settleResult?.memberSalary?.toFixed(2) || "–", + agentSalary: bill.settleResult?.ownSalary?.toFixed(2) || "–", + total: bill.settleResult?.totalSalary?.toFixed(2) || "–", + status: formatBillStatus(bill.status) + }; +} + +async function fetchBankCards() { + const result = await apiGet("/wallet/bank-card/list"); + if (result.status && result.body) { + state.bankCards = result.body; + state.defaultBankCard = state.bankCards.find((card) => card.use) || null; + } +} + +async function fetchWithdrawInfo() { + const result = await apiGet("/wallet/withdraw-info/list"); + if (result.status && Array.isArray(result.body) && result.body.length > 0) { + const info = result.body[0]; + let previewUrls = []; + try { + previewUrls = JSON.parse(info.passportFrontUrl || "[]").map((item) => item); + } catch (error) { + console.warn("Failed to parse withdraw info preview urls:", error); + } + state.withdrawInfo = { ...info, previewUrls }; + } +} + +async function fetchWithdrawEnabled() { + const result = await apiGet("/wallet/bank/host-salary/withdraw/enabled"); + if (result.status) state.withdrawEnabled = Boolean(result.body); +} + +function render() { + document.getElementById("currentSalary").textContent = `$${state.salaryInfo.currentSalary}`; + document.getElementById("anchorType").textContent = state.taskInfo.anchorType; + document.getElementById("minutesProgress").textContent = state.taskInfo.minutesProgress; + document.getElementById("minutesTotal").textContent = state.taskInfo.minutesTotal; + document.getElementById("giftTask").textContent = state.taskInfo.giftTask; + + document.querySelectorAll(".cash-withdraw-row").forEach((node) => { + node.hidden = !state.withdrawEnabled; + }); + document.getElementById("fillInfoModal").hidden = !state.showFillInfoModal; +} + +function showToast(message) { + const toast = document.getElementById("toast"); + toast.textContent = message; + toast.hidden = false; + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => { + toast.hidden = true; + }, 2500); +} + +function closePage() { + if (window.history.length > 1) { + window.history.back(); + return; + } + if (window.app && typeof window.app.closePage === "function") { + window.app.closePage(); + return; + } + if (window.FlutterPageControl && typeof window.FlutterPageControl.postMessage === "function") { + window.FlutterPageControl.postMessage("close_page"); + } +} + +function navigateTo(target) { + const url = new URL(target, window.location.origin); + const currentLang = new URLSearchParams(window.location.search).get("lang"); + if (currentLang && !url.searchParams.has("lang")) url.searchParams.set("lang", currentLang); + window.location.href = `${url.pathname}${url.search}${url.hash}`; +} + +function openCashWithdraw() { + if (!state.withdrawInfo || !state.defaultBankCard) { + state.showFillInfoModal = true; + render(); + return; + } + navigateTo("/cash-withdraw"); +} + +function bindEvents() { + const actions = { + back: closePage, + language: () => navigateTo("/language"), + message: () => navigateTo("/message"), + salaryDetails: () => navigateTo("/history-salary"), + platformPolicy: () => navigateTo("/platform-policy?from=agencycenter"), + exchangeCoins: () => navigateTo("/exchange-gold-coins"), + transfer: () => navigateTo("/transfer"), + cashWithdraw: openCashWithdraw, + bankAccounts: () => navigateTo("/agency-setting"), + teamMember: () => navigateTo(`/team-member?source=agency-center&members=${state.memberQuantity}`), + teamBill: () => navigateTo("/team-bill"), + inviteMembers: () => navigateTo("/invite-members"), + completeInfo: () => navigateTo("/agency-setting") + }; + + document.querySelectorAll("[data-action]").forEach((node) => { + const handler = actions[node.dataset.action]; + if (handler) node.addEventListener("click", handler); + }); + + document.getElementById("fillInfoModal").addEventListener("click", (event) => { + if (event.target.id === "fillInfoModal") { + state.showFillInfoModal = false; + render(); + } + }); +} + +async function initializeData() { + const firstWave = [ + fetchUserProfile(), + fetchTeamInfo(), + fetchBankBalance(), + fetchWithdrawEnabled(), + fetchBankCards(), + fetchWithdrawInfo(), + fetchIdentity() + ]; + const firstResults = await Promise.allSettled(firstWave); + firstResults.forEach((result) => { + if (result.status === "rejected") console.warn("Agency center data request failed:", result.reason); + }); + applyPermissionRedirect(); + + const secondWave = [ + fetchWorkStatistics(), + fetchTeamMemberCount(), + fetchTeamBill(), + fetchMemberWorkTotal() + ]; + const secondResults = await Promise.allSettled(secondWave); + secondResults.forEach((result) => { + if (result.status === "rejected") console.warn("Agency center dependent request failed:", result.reason); + }); +} + +async function init() { + setLanguage(); + setIcons(); + bindEvents(); + render(); + + localStorage.setItem("identity", JSON.stringify({ identity: "AGENCY" })); + localStorage.removeItem("payee"); + + try { + await connectToApp(); + await initializeData(); + } catch (error) { + console.warn("Agency center initialization failed:", error); + showToast(error.response?.errorMsg || error.message || t("failed_to_load_data")); + } finally { + render(); + } +} + +init(); diff --git a/h5/agency-center/index.html b/h5/agency-center/index.html index 668e516..c561167 100644 --- a/h5/agency-center/index.html +++ b/h5/agency-center/index.html @@ -13,23 +13,149 @@ - Yumi H5 - - - - - + Agency Center + -
+
+ + +
+
+
+ My available salary + +
+
$0.00
+
+ +
+
My task as a host today is:
+
+
+
Host type
+
Chat
+
+
+
Minutes
+
0/120
+
+
+
Gift Task
+
0
+
+
+
+ + +
+
+ + + + + diff --git a/h5/agency-list/index.html b/h5/agency-list/index.html new file mode 100644 index 0000000..c6abee8 --- /dev/null +++ b/h5/agency-list/index.html @@ -0,0 +1,13 @@ + + + + + + Agency List + + + + + + + diff --git a/h5/agency-setting/index.html b/h5/agency-setting/index.html new file mode 100644 index 0000000..fc40b16 --- /dev/null +++ b/h5/agency-setting/index.html @@ -0,0 +1,13 @@ + + + + + + Agency Setting + + + + + + + diff --git a/h5/apply/apply.css b/h5/apply/apply.css new file mode 100644 index 0000000..51e4225 --- /dev/null +++ b/h5/apply/apply.css @@ -0,0 +1,338 @@ +@font-face { + font-family: "Baloo 2"; + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Baloo 2"; + font-weight: 600; + font-style: normal; + font-display: swap; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.4; +} + +html, +body { + width: 100%; + min-height: 100%; + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: transparent; + overflow-x: hidden; +} + +body { + color: #25352b; + background: #edf8f1; +} + +button, +input { + font: inherit; +} + +button { + border: 0; + background: transparent; + color: inherit; +} + +.apply-view { + min-height: 100vh; + overflow-y: auto; + background: #edf8f1; +} + +.page-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: 44px 1fr 44px; + align-items: center; + min-height: calc(54px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 12px 0; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); +} + +.page-header h1 { + min-width: 0; + color: #173a28; + font-size: 1.35em; + font-weight: 800; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.help-button { + width: 36px; + height: 36px; + justify-self: end; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + background: #fff3c8; + border: 1px solid #e9cc70; +} + +.help-button img { + width: 18px; + height: 18px; + display: block; +} + +.content { + display: flex; + flex-direction: column; + gap: 18px; + padding: 18px 12px; +} + +.reminder-section { + padding: 14px 10px 4px; +} + +.reminder-section h3 { + margin-bottom: 10px; + color: #788279; + font-size: 1.05em; + font-weight: 800; +} + +.reminder-section p { + color: #2f302d; + font-size: 1em; + font-weight: 700; +} + +.apply-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 12px; + align-items: stretch; +} + +.surface-card { + border: 1px solid #b7e0c6; + border-radius: 18px; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.input-card { + min-height: 56px; + display: flex; + align-items: center; + gap: 10px; + padding: 0 14px; + background: #fffdf7; + border-color: #f0d97d; +} + +.input-card label { + flex-shrink: 0; + font-weight: 800; + color: #26352c; +} + +.input-card input { + min-width: 0; + width: 100%; + border: 0; + outline: 0; + background: transparent; + color: #27342d; + font-weight: 600; +} + +.input-card input::placeholder { + color: #8d9088; +} + +.apply-button { + min-width: 96px; + min-height: 56px; + padding: 0 22px; + border-radius: 999px; + background: #f3c74e; + color: #3f2b00; + font-weight: 800; + box-shadow: 0 8px 18px rgba(155, 119, 23, 0.18); +} + +.records-section { + padding: 16px; + border-radius: 16px; + background: #fbfffc; + border: 1px solid #cce9d7; +} + +.records-section h3 { + margin-bottom: 14px; + color: #173a28; + font-weight: 800; +} + +.record-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.record-card { + position: relative; + min-height: 74px; + display: grid; + grid-template-columns: auto 1fr auto; + gap: 10px; + align-items: center; + padding: 12px; +} + +.record-status { + color: #d54e42; + font-size: 0.9em; + font-weight: 800; +} + +.record-user { + min-width: 0; + display: flex; + align-items: center; + gap: 10px; +} + +.record-avatar { + width: 44px; + height: 44px; + flex-shrink: 0; + border-radius: 50%; + overflow: hidden; + background: #d7f5e2; + display: flex; + align-items: center; + justify-content: center; + color: #1e6b43; + font-weight: 800; +} + +.record-avatar img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.record-info { + min-width: 0; +} + +.record-name { + color: #25352b; + font-weight: 700; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.record-id { + color: #6d756f; + font-size: 0.82em; +} + +.record-cancel { + padding: 6px 12px; + border-radius: 999px; + background: #f3c74e; + color: #3f2b00; + font-weight: 800; +} + +.modal-layer { + position: fixed; + inset: 0; + z-index: 30; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + background: rgba(0, 0, 0, 0.5); +} + +.modal-card { + width: min(100%, 360px); + padding: 16px; + border-radius: 14px; + background: #ffffff; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.18); +} + +.modal-card h3 { + color: rgba(0, 0, 0, 0.8); + font-weight: 800; + font-size: 1.3em; +} + +.modal-card p { + color: rgba(0, 0, 0, 0.8); + font-weight: 700; + font-size: 1.05em; + text-align: center; +} + +.modal-primary { + width: 80%; + padding: 8px 12px; + border-radius: 999px; + background: #f3c74e; + color: #3f2b00; + font-weight: 800; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(22px + env(safe-area-inset-bottom)); + z-index: 40; + max-width: calc(100% - 40px); + transform: translateX(-50%); + padding: 9px 13px; + border-radius: 999px; + background: rgba(22, 56, 36, 0.92); + color: #fff; + font-size: 0.9em; + font-weight: 700; + text-align: center; +} + +[hidden] { + display: none !important; +} + +@media (max-width: 420px) { + .apply-row { + grid-template-columns: 1fr; + } + + .apply-button { + width: 100%; + } +} diff --git a/h5/apply/apply.js b/h5/apply/apply.js new file mode 100644 index 0000000..630a3a3 --- /dev/null +++ b/h5/apply/apply.js @@ -0,0 +1,511 @@ +import { _ as helpIcon } from "../js/help-BgsLqEJs-1776148658686.js"; + +const API_BASE_URL = "https://jvapi.haiyihy.com"; + +const labels = { + en: { + apply_join_team: "Apply to join the team", + apply_reminder: "Reminder before application:", + apply_reminder_detail: + "Enter the ID of your agent, and you will become the host after the host apply is approved. After becoming an hoster,your income will be entrusted to your agent", + apply_id: "Apply ID:", + enter_agent_id: "Please enter the agent ID", + apply: "Apply", + application_records: "Application records", + pending: "Pending", + cancel: "Cancel", + application_help: "Application help", + application_help_detail: "Enter your agent ID and wait for approval.", + got_it: "Got it", + user_id_prefix: "ID:", + application_submitted: "Application submitted", + application_cancelled: "Application cancelled", + cancellation_failed: "Cancellation failed", + application_record_not_found: "Application record not found", + application_processed_cannot_cancel: "Application processed, cannot cancel", + network_error: "Network error", + cancellation_failed_try_again: "Cancellation failed, please try again" + }, + ar: {}, + tr: {}, + bn: {} +}; + +class ApiError extends Error { + constructor(message, options = {}) { + super(message); + this.name = "ApiError"; + this.type = options.type || "unknown"; + this.status = options.status || null; + this.errorCode = options.errorCode || null; + this.errorCodeName = options.errorCodeName || null; + this.errorMsg = options.errorMsg || null; + this.response = options.response || null; + } +} + +let commonHeaders = { + authorization: "Bearer undefined", + "req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google", + "req-client": "Android", + "req-imei": "8fa54d728ab449e04f9292329ed44bda", + "req-lang": "id-ID", + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "req-version": "V2", + "req-zone": "Asia/Shanghai" +}; + +const state = { + lang: resolveLanguage(), + agencyId: "", + inlineError: "", + loading: false, + records: [], + selectedTeam: null, + helpOpen: false +}; + +function resolveLanguage() { + const params = new URLSearchParams(window.location.search); + const hashQuery = window.location.hash.includes("?") ? window.location.hash.split("?")[1] : ""; + const hashParams = new URLSearchParams(hashQuery); + const lang = params.get("lang") || hashParams.get("lang") || navigator.language || "en"; + + if (lang.startsWith("ar")) return "ar"; + if (lang.startsWith("tr")) return "tr"; + if (lang.startsWith("bn")) return "bn"; + return "en"; +} + +function t(key) { + return labels[state.lang]?.[key] || labels.en[key] || key; +} + +function setLanguage() { + document.documentElement.lang = state.lang; + document.documentElement.dir = state.lang === "ar" ? "rtl" : "ltr"; + document.querySelectorAll("[data-i18n]").forEach((node) => { + node.textContent = t(node.dataset.i18n); + }); + document.querySelectorAll("[data-i18n-placeholder]").forEach((node) => { + node.setAttribute("placeholder", t(node.dataset.i18nPlaceholder)); + }); +} + +function setIcons() { + document.getElementById("helpIcon").src = helpIcon; +} + +function isMobileDevice() { + return /Android|iPad|iPhone|iPod/.test(navigator.userAgent); +} + +function isAppEnvironment() { + return Boolean(window.app || window.webkit || window.FlutterPageControl); +} + +function splitHeaderPairs(value) { + const result = {}; + if (!value) return result; + value.split(";").forEach((item) => { + const index = item.indexOf("="); + if (index > -1) result[item.slice(0, index)] = item.slice(index + 1); + }); + return result; +} + +function parseAccessOrigin(raw) { + try { + const data = JSON.parse(raw); + const appIntel = splitHeaderPairs(data["Req-App-Intel"]); + const sysOrigin = splitHeaderPairs(data["Req-Sys-Origin"]); + + return { + success: true, + data: { + reqLang: data["Req-Lang"], + authorization: data.Authorization, + buildVersion: appIntel.build, + appVersion: appIntel.version, + appChannel: appIntel.channel, + reqImei: appIntel["Req-Imei"], + sysOrigin: sysOrigin.origin, + sysOriginChild: sysOrigin.child + } + }; + } catch (error) { + console.error("Failed to parse access origin:", error); + return { success: false, error: "accessOrigin Error.", data: null }; + } +} + +function setHeadersFromApp(headers) { + const next = {}; + if (headers.authorization) next.authorization = headers.authorization; + if (headers.reqLang) next["req-lang"] = headers.reqLang; + if (headers.appVersion || headers.buildVersion || headers.appChannel) { + const intel = []; + if (headers.appVersion) intel.push(`version=${headers.appVersion}`); + if (headers.buildVersion) intel.push(`build=${headers.buildVersion}`); + if (headers.appChannel) intel.push(`channel=${headers.appChannel}`); + next["req-app-intel"] = intel.join(";"); + } + if (headers.reqImei) next["req-imei"] = headers.reqImei; + if (headers.sysOrigin) { + const origin = [`origin=${headers.sysOrigin}`]; + if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`); + next["req-sys-origin"] = origin.join(";"); + } + commonHeaders = { ...commonHeaders, ...next }; +} + +function requestAccessOrigin() { + return new Promise((resolve) => { + window.renderData = resolve; + window.getIosAccessOriginParam = resolve; + + if (!isAppEnvironment()) { + setHeadersFromApp({ + authorization: "", + reqLang: state.lang, + appVersion: "1.0.0", + buildVersion: "1", + appChannel: "Web", + reqImei: "H5-STATIC", + sysOrigin: "LIKEI", + sysOriginChild: "LIKEI" + }); + resolve(null); + return; + } + + let attempt = 0; + const poll = () => { + attempt += 1; + if (window.app && typeof window.app.getAccessOrigin === "function") { + resolve(window.app.getAccessOrigin()); + return; + } + if (attempt < 50) { + window.setTimeout(poll, 100); + return; + } + if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") { + window.FlutterApp.postMessage("requestAccessOrigin"); + } + }; + + if (isMobileDevice()) { + poll(); + return; + } + resolve(null); + }); +} + +async function connectToApp() { + const raw = await requestAccessOrigin(); + if (!raw) return { success: true, environment: "browser" }; + const parsed = parseAccessOrigin(raw); + if (!parsed.success) { + navigateTo(`/not_app?message=${encodeURIComponent(parsed.error)}`); + return { success: false, error: parsed.error }; + } + setHeadersFromApp(parsed.data); + return { success: true, environment: "app" }; +} + +async function apiRequest(path, options = {}) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: options.method || "GET", + headers: { + ...commonHeaders, + ...(options.body ? { "Content-Type": "application/json" } : {}) + }, + body: options.body ? JSON.stringify(options.body) : undefined + }); + + let data = {}; + try { + data = await response.json(); + } catch { + data = {}; + } + + if (!response.ok) { + throw new ApiError(`HTTP Error: ${response.status} ${response.statusText}`, { + type: "http", + status: response.status, + response: data, + errorCode: data.errorCode, + errorCodeName: data.errorCodeName, + errorMsg: data.errorMsg + }); + } + + if (data.status === false) { + throw new ApiError(data.errorMsg || data.message || `API Error: ${data.errorCode}`, { + type: "business", + status: response.status, + response: data, + errorCode: data.errorCode, + errorCodeName: data.errorCodeName, + errorMsg: data.errorMsg + }); + } + + return data; +} + +function apiGet(path) { + return apiRequest(path); +} + +function apiPost(path, body) { + return apiRequest(path, { method: "POST", body }); +} + +async function fetchUserProfile() { + const result = await apiGet("/team/member/profile"); + if (result.status && result.body) { + localStorage.setItem("userProfile", JSON.stringify(result.body)); + } +} + +async function fetchApplicationRecord() { + try { + const result = await apiGet("/team/wait-apply/profile"); + state.records = result.status && result.body ? [result.body] : []; + } catch (error) { + console.error("获取申请记录失败:", error); + state.records = []; + showToast(error.errorMsg || error.message || ""); + } + render(); +} + +async function cancelApplication(record) { + try { + const result = await apiPost("/team/user/join-apply-cancel", { id: record.messageId }); + if (result.status) { + showToast(t("application_cancelled")); + state.records = []; + await fetchApplicationRecord(); + } else { + showToast(result.message || t("cancellation_failed")); + } + } catch (error) { + console.error("撤销申请失败:", error); + if (error instanceof ApiError) { + if (error.type === "business") { + switch (error.errorCode) { + case 6404: + showToast(t("application_record_not_found")); + break; + case 6003: + showToast(t("application_processed_cannot_cancel")); + break; + default: + showToast(error.errorMsg || error.message || "Cancellation failed, please try again"); + } + } else { + showToast(error.type === "http" ? t("network_error") : t("cancellation_failed")); + } + return; + } + showToast(t("cancellation_failed_try_again")); + } +} + +async function searchTeamAccount(account) { + try { + console.debug("🔍 Searching team account:", account); + const result = await apiGet(`/team/search-account?account=${encodeURIComponent(account)}`); + if (result.status && result.body && result.body.teamProfile) { + state.selectedTeam = result.body; + console.debug("✅ Team found:", result.body.teamProfile); + return result.body.teamProfile.id; + } + state.selectedTeam = null; + showToast(result.errorMsg || ""); + } catch (error) { + state.selectedTeam = null; + showToast(error.errorMsg || error.message || ""); + } + return null; +} + +async function submitApplication() { + if (!state.agencyId.trim()) { + state.inlineError = "Please enter agency ID"; + return; + } + + state.loading = true; + state.inlineError = ""; + render(); + + try { + const teamId = await searchTeamAccount(state.agencyId.trim()); + if (!teamId) { + state.inlineError = "Account not found or not an agency"; + return; + } + + console.debug("✅ Team ID found:", teamId); + console.debug("📝 Step 2: Submitting application..."); + const result = await apiPost("/team/user/apply", { teamId, reason: "JOIN" }); + if (result.status) { + showToast(t("application_submitted")); + await fetchApplicationRecord(); + state.agencyId = ""; + state.selectedTeam = null; + } else { + state.inlineError = result.message || "Application failed. Please try again."; + } + } catch (error) { + if (error instanceof ApiError) { + if (error.type === "business") { + showToast(`business error!${error.errorMsg || ""}`); + } else if (error.type === "http") { + showToast(error.status === 406 ? error.errorMsg : error.message || "Unknown error, please try again"); + } else { + showToast("Unknown error, please try again"); + } + } + } finally { + state.loading = false; + render(); + } +} + +function navigateTo(target) { + const url = new URL(target, window.location.origin); + const currentLang = new URLSearchParams(window.location.search).get("lang"); + if (currentLang && !url.searchParams.has("lang")) url.searchParams.set("lang", currentLang); + window.location.href = `${url.pathname}${url.search}${url.hash}`; +} + +function avatarText(profile) { + const name = profile?.userNickname || profile?.account || "U"; + return name.trim().slice(0, 1).toUpperCase() || "U"; +} + +function userAccount(profile) { + return profile?.ownSpecialId?.account || profile?.account || ""; +} + +function renderRecords() { + const recordsSection = document.getElementById("recordsSection"); + const recordList = document.getElementById("recordList"); + recordList.innerHTML = ""; + recordsSection.hidden = state.records.length === 0; + document.querySelector("[data-action='apply']").hidden = state.records.length > 0; + + state.records.forEach((record) => { + const profile = record.ownUserProfile || {}; + const card = document.createElement("article"); + card.className = "surface-card record-card"; + card.innerHTML = ` +
+
+
+
+
+
+
+
+ + `; + + card.querySelector(".record-status").textContent = t("pending"); + const img = card.querySelector(".record-avatar img"); + const fallback = card.querySelector(".record-avatar span"); + img.src = profile.userAvatar || ""; + fallback.textContent = avatarText(profile); + img.addEventListener("error", () => { + img.hidden = true; + fallback.hidden = false; + }); + if (!profile.userAvatar) { + img.hidden = true; + fallback.hidden = false; + } else { + fallback.hidden = true; + } + card.querySelector(".record-name").textContent = profile.userNickname || ""; + card.querySelector(".record-id").textContent = `${t("user_id_prefix")} ${userAccount(profile)}`; + const cancelButton = card.querySelector(".record-cancel"); + cancelButton.textContent = t("cancel"); + cancelButton.addEventListener("click", () => cancelApplication(record)); + recordList.appendChild(card); + }); +} + +function render() { + const input = document.getElementById("agencyInput"); + if (document.activeElement !== input) input.value = state.agencyId; + document.querySelector("[data-action='apply']").textContent = state.loading ? "..." : t("apply"); + document.getElementById("helpModal").hidden = !state.helpOpen; + renderRecords(); +} + +function showToast(message) { + if (!message) return; + const toast = document.getElementById("toast"); + toast.textContent = message; + toast.hidden = false; + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => { + toast.hidden = true; + }, 2500); +} + +function bindEvents() { + const input = document.getElementById("agencyInput"); + input.addEventListener("input", () => { + state.agencyId = input.value; + render(); + }); + + document.querySelector("[data-action='apply']").addEventListener("click", submitApplication); + document.querySelector("[data-action='help']").addEventListener("click", () => { + state.helpOpen = true; + render(); + }); + document.querySelector("[data-action='close-help']").addEventListener("click", () => { + state.helpOpen = false; + render(); + }); + document.getElementById("helpModal").addEventListener("click", (event) => { + if (event.target.id === "helpModal") { + state.helpOpen = false; + render(); + } + }); +} + +async function initializePageData() { + try { + await fetchUserProfile(); + } catch (error) { + console.error("❌ Data initialization failed:", error); + } + await fetchApplicationRecord(); +} + +async function init() { + setLanguage(); + setIcons(); + bindEvents(); + render(); + + try { + const connection = await connectToApp(); + if (connection.success) await initializePageData(); + } catch (error) { + console.error("❌ Page initialization failed:", error); + } +} + +init(); diff --git a/h5/apply/index.html b/h5/apply/index.html index 2d7c08d..4365f01 100644 --- a/h5/apply/index.html +++ b/h5/apply/index.html @@ -13,23 +13,51 @@ - Yumi H5 - - - - - + Apply + -
+
+ + +
+
+

Reminder before application:

+

+ Enter the ID of your agent, and you will become the host after the host apply is approved. After becoming an hoster,your income will be entrusted to your agent +

+
+ +
+
+ + +
+ +
+ + +
+
+ + + + + diff --git a/h5/assets/defaultAvatar-CdxWBK1k-1776148661448.png b/h5/assets/defaultAvatar-CdxWBK1k-1776148661448.png index 59aa5a3a2103d71dbf247f7edfe54ccb152820c9..3705cf97f09ed89e5a7322e0e06240b822f2f987 100644 GIT binary patch literal 134581 zcmbTd19T?c)*u|)R>!uDj-8I}Jh9D=ZQC}U*tRE zhXCn6czHjc{}wZm68{6@Vl6-_{FflHro1AtsJ)XZF&85%g9$S;GcgwrBa1O7hY=T# zF*`jmD>ExA6Ei0h3mXF~D=#z4=SlppgY=W26TpmDSxn+zxZ9@~|5C_*3+=4x z>0rvFZ0c<9>SSUn?)J$h*UzVr`2AdD*#n*_i2=xp|qH{|i*!9$;za`QL$Zu=BEV z{V$-OegiOaG5Y@n2AJ@g**n=9eTr;pYh-T9tO zd8O@~U5xBZOr^yHNI#`!w6p~9va+#p8<}wMFtD;P0~pv%SpW>iJe+0>CLC<6%qGk% zMn-HL|E@1)Z{qsbw*RgV_^i*(ZOmqBX3WgM!DY(Kz;4XR#b6BJVP!Dl0&p8~^RRL= zv$6cU{x>Jf&*o)h^Z$(JZ=?I`6ueTF&Y$M;{8yV$F?IaclZ_?uKYqY#Wb)U)1xQW) z8rBp*`mbWk|3(A3_$*vyt2X znfd=a^ZoCc|6d&N|Bd;7sn*28$j;pKGiEZ8{uPJmZ)o{1!!Z4SZT8Q%|0xXp8~ii2 z{eApTT>X6cPh>W=`$X;Z8Fy*^uqc6mL8nWL39EW!pT4=KlOK3q#Q1eob!K{+dEvMj zdN$`T1>&gN$U;e*xygYZaBrF%3`u8mQ@L?F60nJ<3Iplaj8oOM%?MYF4g<`pk1M@C z$}2L@GgdJ*c@Ey*^f!L0X$Wh49s;uuPk$aYAN>**xx{>&Gkk0>&rgJYXOx)_Qs{7< zX)fSGwwa*ogG^RO+f0LOCePP-Ocx%0Ty*ViOxQ!VdFWKz1hqJ%JN@Q;xvW1XV2o|2 zoJk8MJmtGgx}DASRa!bsX$-mfpgMn8iro9SM}%R#O1$K=?|PYZ@7j5&>*$(UJ9iDZ zr7l75Y@k!Ad*%fy#_45zGQT+oSJa{Rfn-}{gyrIyAZ3C|}txO3N+?S$+;tE_3= zsa)^Bfy5VjpQVEOhu-7&Z?CE}Qlt7i47~-{evrhp!drS=_SbOZMDapSOdyP{FB}GS zXaxGO&d)=f!*hvzPBq0 zr#~-Vu1uf_y|(K5;Yr<4qcmOC`!dX@7#;VOgvc3}3)R4PwRvH$Sd)6&g=ZuF<+0}VBMbw67``PV zoXI{{gNM2smDos%B(E%bIc$nT?8TOGOc%$PrACfTou$OH3w z0}dsn&#*pZDCwd<5x*bPp_`;Pf$8UV%XB=`PqeFpPwI?bJvLFsOr!C(O8%8+pLQ!z z#%e`0+0c*GyY;qPL#Y43xdB5{3>S<~TE0fet~Fc`mixNs$EEn%3M%$pbjTcJ@WsyR zW=7D3st+FtA!Y5!>8$GcoGw7Df_TdzqOMJ!9@|PW#i`)pUH$!HlCJwg0}Lv^^2@tB zDCF1aFTI;l$lb+0cUS9vX|G2M8}Apac0F4lsFyD`+iP|2vZ5*Joqlh0zN4598Gf&K z;ro`uiTD-TOsUlb1J>VEYXU0I_U`@YdND<5*JhoRSD_HKx;`YNO#LFd-XQW`ueqRm zK1x2`Iu)YMD!4M`yNv!p?WqOlzHzgU9qadEppNu*EucwhFogdkv|}cx$sgQA06Q6? z7Om{q?{Vaypmz45?n_rE5$(3)z-Vv4{L4^k@{OoH?^GAharkaZ|AtKPD&S$=@34SM zhyq(?!G7^>1I3?NbFj>=WBc2O&4I+$VR!4oJgSHM&#{>j1I% z>4iw4UGT5Edz#k*9BYnqC$ueGBZ|*DPkv=9wn)29N3P#Bs1MQv?Cy}%&t%PIO9Or< z;*%I%8Rq3cc!)wz>^)B$8b-?J`KEq*U0}1P&U%aiE$kuLw(j*Bb?>?FChA&$I9zLx z>v_!5zs4+a6UTV5!gsUh0zn5SHZR2$KxAVxEgezW1=iKEs78)zXFFK?#*v`+uhyu`({8CF7Pb$XHeG9`3@frDWXYY%)Y=? z4?4Bk7J(>dKY?i45im>MU^xvD1Ru~hyqf~Dz2q+nr0%kc_o&$fN&j-P1U7sE3RR|3 zpouZ%y4RpVhYcR_6AU3gNc4w!g?4Y{#dL4fPdK!~*=Bl8ocwx^k0t-1kYdgG0J1#l zg=OQdNIL6PH_7Cd7}s6oY@>ajDVrPn0 z8b6yHE_(&#%FknP+pl?2N}&Qq)-pjnE{P)fA1$(d3gwy%|99KmYeJc#mR6Uy;g`kA}bHEF<>#nKvMZcgCMKzwOMUP}+w zpbBY={8;sHV9KK6Q3IZG^|sO^(KIu_U~e#dMzoBWiH;n{CRnj~-^KDq!&2k4M@6(b zE%ZIwy!SR}<|jB>9V{`JZyrNks*cd()2!fC$d~t-h2GaGd@!U4%alwGef2XqwmG8B zPJ`ovv4#P(X3$E|fv;x%DK&1()pv6jNBix#DPku6&hzsU)Vz?zg~oOok$}$nSbN8# zymo2hR!HgYKr?qsSq4e7G&h`S%TeXz>9ajC=P1o<_`Y37I6%#F_p`W^?4}xK^-ReZ zN`|8YoJ33l2r)%CuSpEuXK*>`O*NVQ9%br`gHl@NxvIm_C6S0+hhSY!`Op&1(A%oT zNP5o*iEkMZaGfF`DGGIIgRA_6WnXK{>sL?Ah_fg{FlCiSE-7p(1dIkWYSe&2P{{I_6sSe+ zL>yQW;gaY|Dbh0trDI}eh#{Cc?%koDKj%o`bt-3nXH_ucehCE;H`d;pfAGl?`tAeR z?DV@U$*Ef!yvhU_IColHznh*N?U_H_xn&Xx+SwM4s-rF;2tKZ^{%-D!$&6!T)WH4a z89Y|rx>^quzxC%|1t0VvJrj7DFTeqxt`Ufti_r)!d8cnSw>J&LH%g6MBg!#j=ALN- zb5&a-IqbzeGz*;qO6k0aoAD%~)v#PxoCBuEsrC-M9ojD_n(2R3G4Wa-G}Zx!mF; zDQM}k(^7kafQ50joc*G))j>T1C&>@c%7g{LvNpHi)Pu5OWedR{Oz^wz`u zZft$_cFBc!vj&cItq>TnnE26PWKxk^wH{aFlU52BPKQZrl(SpjX^ux+?888Dprmll zR^wNiMoMLMeJ-8#*xgFFT{mzdEbq9^%`12U=mf73&pmA}tj*BsG8{3QEHVVCbe(IO;Z1^VY(cJ1NOk#)K` z+8>ngAD$Ss;*jdIpy`}~MZ!g@fmB2vVkk~Lcf)bg$!LkXz`<1h0j0?LGE7UHYWl{9 zjXF-EtSpQMK`z`^KwHcJMuF+N z8&XW3Ous%K&P_GTzqvYbKn50`f}VR$%4nEYR7A_;-jqU89gRALgM2Q;#+4Xz^7Rfe z3pY2{q{&cH-4=s91SnceOrv(ur#XT2CNNeRQ#c(uX|!|IAS_sKim0FyAu4&`KuyyE z8OaS9fxW;eQ#q{5Uh&ydvTRMI`BEXoHlL7nB@CP5$RfbR`y;wF#oTzMxqT2g*?)MC zdr4^HJD772L=?Xh5-fdHQtvxyh#yaF|9D}cgtqBA@>~3Ya_MkxL0I;3_rO)Av-8N- zyUir{&U2o}u%3NN4<@->!p>}g9)D4}dA)er=C(B5t zxMs06AJ=p_U&k(ZlfWX=z6}{b!dcUBvd*{aCC~Ojs5g$hj?Y8Eb2}rrQNVC7?pMVB zAtH`1qt7Wk00Prr8pp4!1UhHN8W9B=TwtskNlu^5)F#F$Nk0T{wd7brj0)FIol<3R zDbXvV&5(fZ!#zjMcebJ$KvEHH(YWoLOant&Dc^T+r%0RDzzZ2Ej$5VjRivb`HtI?w z+shszN>xIngt#0cM^HJ?rWU@^e^!l>VdYXA3Pz5>cdT}k+tmjW9g_~dB;VWHtlJm zB&Yh4hdY&q_*eCqDPq=wS*=>u*HQ!u`Z0Cr6^QRFLzI`lH&L8TA+?qyy-r@eTYo`1 zf4WzoEW1z;q+0Ev8?#zdeNRycBM?Id5^8psy2?SPXdogvB>}E8c#aUGO0gNHvXV_< zZbVAPw2`-u&+dFcFm+d|@as%N{x3YM>Qe`n`T3y+Sx)6}kE`judTdvGO)V`D*dGDL zb{&20A2h>}cW1hHMhUy^2#qT0^qKb^&pDH@OoF#4A6I8YORuM|L(}t5b0736#ZjGw z9+>}(LYMh!9}U1ap5t15E_V1T>b}3(Es0GGWa8r;_3-qS+2QVG9L!^@QW-Dcxxe=7 zXx<(1J#`CaKsyUY4v4huIf0P0-73u*W6Q;()WDw#)6(w4C)v1(RjJ=?2f(vNP!Ow< zgx2!$%wo_ETVYrB^R4 zgLC2|K@h-Da)X2yf=8)R9xft!6IP8y7vg`lhGcS%6sg(V<7c%?L!>as>=nXS??jYW zpR!ewS3wigjqK9_W8`FSx*V{Hq^t`aHQJiFSGXrPuTSFuREYgJ8r-8!m_8!DyU!o1 zFKoTnk{&*)pSQ$Lmoh(8;b;PeawE?>X$|VBU-C=<0B`9f)adm`^kn{#s`QO?Hha1w zR)OG$o7TgJ=+rhr{N=wopIi)IpyJ@+?U7~G2`53}5=E1ZE6f8YTu;_K?|o9c zW}BJE=*iU1M4ODVChJSOvx2;5P#9BqOdkS&!WP=XzM!b4G*R^(rBvbA$If$S_36_y zg2MV|)`v*?;+kv}S^l}`x8MEhsd&KFd?)AJT^P}>$%g0F zHul}|w+Wo}m{_ZDOP2{o4?0@Jq!bA%p!khf3Xs5=c}PAnv1;Zw7lN_A7OAztAI_~7 z?D5Ixi^m+WqryPH_uL7YSO(i^0z5*pP4|qJ;Ah}S^0e_U(Bp1YyfL=%`NP@xLD|A$ z@WILsX7jQgwNZ_wkcbKuu^O-Rr*ct|Y^VyPp+Mhrw}yc3dGhJXB+SSOPb1-_>cE{%8jy}I&R77v8fT0yYY|&%p`53$OY1Z~(Smr$ z+8g4lOeRN65@Fm#=P#YdUsw7!s|-{lHwN^X3$goH4Kw(F&mj+$TW#6i?f0RwomZbY zk#FvNS)7lag8KVxVX~7gkfKwZY)k^`9(mre&2zlxYkdAC%hTV0@1}K1mJeXvh@ogK zwZENV+^+|!g*a=jkU!?+);Q^UpR49JsP`$bS{t^lXB}iuTw9Y_Lq-|h&c(eut(q5o z_T&D17+${jHg@0^>-wH?sZm#~*kai|`LO-dr9MnA0yj~zmVb!h`(0nRJ`H4O5qcaE zh_pvrH5xHtDcMenEkxXmPSB>pWm+oACrO8MI#-C@%IrJXeismBy9%+Mi5h0i#{?t^ zTR>*y%eL~pZegBq`}81VyO9esOEQWMUrwMU5^uW0aoea9aMGz)S=g0D!DU&2O<|xt z`fz3=@!iX%+A^eVI#>-k!yX^->G9-mV-LDS8A|WBlOB`lO(X#U5!_ZsNXe^ca0{m` zb7#&wz_d#UYfCujt2Kx&g#Zyv!~As0qSbWOCGVrOwQjJsw435gcB(wOmhxE$6F zgp6q@e|$?aZf@hY6J7GUx{YTF<`%J1T8ONu{O#jF@)@mNS~zL>DHFLR_T5b76t>QI z=_Ge^wxvo#s+vzMtBmkY3zkr&6;)koLp!~k3~N@9AX;KDy$&~j5=-8?vFmjF-b&CB z4G>=Q^tluBl`ya{Dr=3sNf(KRP||VPFloP@4*;~|0>@^lWHd_$=3l8-g{~cJ?(LXx zv%?pZH_GT~{oa4A(CP{dj}AR`nA=#DZdv}e@FU&Rj-sd>R_F2PyX8C!^2O^7%7MW| z`uCIONJ9qn%qeEy8`le5ulGY_CbPIU;;#^|f;umHtzRC`b=(%upN4zMG$)fW&o~&a znsQq1SvB5$;q%&^li!UZ>iv!;1u~m%p8R}~scJidnD{T*A*G2500)8n<~%H_5Pc9Z zqN)B6^jF$A$HAJZxYQ}1(bRr{x&n*3%H`){#H48lKjWX@)DE0w+f4%n4cw4nd4a`0 zj!>knp8akn&=lgNBpSEf;gVAb1oL7RfQ^J>r*#7=2Xs-gs9`+j$gg>tdH6RV>~g?b&kb9Y z`di&GYeloEI5;u#^=Wkn)N1A;KAdh-&xlB7HXL?xqOj6UMJHUnu$> z4Tbz3I`a<78h(qPp-v8b>$_+)Ety}3PEvUgd~1==J~8mN`OZrn&y<7MdniJ@Om@A@9R2lpj`(S1b*E|su?S7)MJS)_ zi0KAiyn?x26aa-MX*C+fj0|aGk|>5KXe{Nv#WDfq5_Gx}5XLUd(u6s$d6W3Ck6)k8 zBZBYtBQ;w{EhjFezJuT~87**4m|u&OSqOzTB%}@2U6|qmn0bX6%0Qkb-`LGD_9uay zur3b@OSgc-h-rET#n>(ulZ0r4mv^KxKBXJnGSG+#eAQ;DktZ#(ffYqO2~Bed1$>o0 zLM%XWEF_agS25%bN}7bDXHDhXhfFotIr=KM7ar_JMtM#Le_&X3pgaZo))5 zl)=}R8tRCFn+Xr!D16xT;Cz7lOFO~A4c7b>K|o3~c@b*vEyw3H_#%U*N7DRTvAk^n>4hzZ0I{1&^=n32`Q3lZY4IJI3&bA}J zvVlHGu_iTB=;htutmW->VcGxw7n>wq|JIp~M5-xbgJq2D9~W5pyyx$GK|)@JuzBbc zd$eCQ6^0cjG9#|BI{Rkk>3=SIb0;Xd##2}ECizoP_pDI2(;Jqk%m zsk3UekN43`QvN)R1Q}eQGAL|H5u4|6pyJpBf-HqoVo1Hk-lJUZg0r;3P+0=MT_6c| zO`(*z2K2cToLVzFmN*npYoJi765#}vH8)qRsUjF6WwMJQd#t2^XOA|>v;;>Eshm|& z`;;?BJe(9sZF}ZYCOAT%ji2$9P^j0(DfwLX1onmDwoQ*e0jqxHZg}7QbE2*(LRc+W z)(&$cx0IJ5;o3>UgsuV!1`L#?b7n<~9FF8W9O^8Dk{pxP0!6GJp|V8gP|CzF5)0@O z3ST#sWSjt;At}`A4o0qEr0P1Zemo^z>^-jg*_E;rm>W+7i2B&_h=A5b`s@-X{nUHO z{e4v6H)WP4k;MQS?!RHac3FDTb946bRN?y4`{rKvB#9j~7;=jEahc~gz%^-fF63^e zWm=cWLvQVujy+dNQcjy!E_;2RiQ>mqqjWt59wpzWte#emR}X>^SefZn;5enoL>?9{ zsum9s;4dHN2%-p&=Bm%+DGnX{t*bpRK*H>s6BH;B6+F$m%>o|fH6#>}Rew&N zGOr>sn*Fq{IWTQJQLLcc-ABtsk)B5LloK7M35bM|f`-yxKvPWa0pOHX?r9V57_VaC zpB(-`To=4OD;>Hr6l92u|m7kb&>lROo<;dHW9Z8WPKjTQ6v41;-amGl6U+7zV zQEnPC8!$*)RO!YVC|BGN+6WtA7l){`Dr%h{p4^BI)KvPSej0*iU1U_cznZW`!}<%v zO%zcN1V$Rgvr)FcY_DM#og9b)!)`b|HK%+6RnqsSa&s)KCC)Hb4v9Mfr>!(%)o^%5 zhc~p0QBc$!f|n+hRF=9mZYi=(S3#4Eo50Qrl%P?{Pp2o=fgq(T8cQJFst$E#RA{H) znn)hg{4(?fNj2udq6WpF8FF_=c3;iwgI2$i3CH$^}<8_IFPuJ|NFnF2_Sm@*k`Q^8cgMnUKt(L`; zH^?2;%E}B7de1yo!mM=(8d$%(2etUxyK)~*?%F@&guE+>SEJ>6k70^sL-Nu6iqtPv zxFZ4%g@hKV_;32afSXl>Q3mNl zPVy?GuY)1LarRT7h(vRuk}4-Ofz35%BNw{lBD+lHG{QS?D&u@wEZb*6b04N{j7{wW zx{GGLl(>l0XJ^zVyWr#V!s+%6i7mix<4Q8yW0#+CHI&zWy$%AV4kU3{8xjS?-u73x zi35?mbrvpB`kr}QZfSQndRpp1D3|T-!FSkg?kRUWoNC0rAFSd{a-gof;zP>$Ggkeb zr7Y+V*ayefDRRAZ$Gy9#^jn=HDJRm=P1A#G6;;{FwttGm6&? z%c4xXn&h1qa(m?3=UqETK7rtw?AF8Q2MklFgNpy4P(;Jh3<1TUa0Lx{<3tR@ zObWy|S{~u37R2Vj;$x%e-dW<+ZNs!c5V7Z!kCP=gTXJ3D6XnEc&2vjjlEo`3$4Zwr zZF?A#rUXC-StVo}QlvGKdcATt6Ns-ys!S#{bS5Z9=%|sacA3&mbiFi--=ZuP8O3%oIiBK091*W!n$#=IdWAD3Csim7t4q8XK zeGPRv=IPr@BiGg(1cWk=gnOBhbEelIwN#1lIK~+>n~t{vQKC+q)SAAus;S;;<#EWD zR2+fibE^=OXlz*4r_`racinHyKr1XIwvxe=qNhq3*8)|7h6+l77}^saXe$LpNU;I1 zuvK8xfvA`Hi~dmiyZ(uZDWi#EtIn3GEN;qL7Ox2LJWl~tM#+O0)iA%4UuHs)poj=4 zY4SUzsmy8JQVMKZD zPIfAoQ9yx5B9Jw_2TYn8+!2MWhLkoh^yLcN2`JRl^vzhMWp^><{dqy4Z^3nq^ujBhD31P9v}oqdwhYFAxk0H4TnL z3W6C(vT~AUBy7);=uxvW7MQ?e!+B0~*XKg+U;+whVw`&*EnqKkgqkKR=-@e&n?qo9 zHCRm8fASSeu*H#MLy#xZM6i-M1e3}ODHK%-z)98UurXOUJrj5Spsk#MLDw^4wuPC&nzC8&q&SBm)fbL@+dXS#FeFpxcva&6}e%XfSR#=SQDmvA=Prr9havRRkm6Vnzc6?zgP@G zxdRE;t(C?Yv#rx)Fl1%aR7vS)3FtjxdnNmf8#8H+n~|VbqNgZUzq^Gm=PC#)ZHV+8h~KG#k;T3At1_ z*P%$JIu+Lo`#QPUOjz3wQ@>05fVQuNmFb*aSIIK?>=A+&a^&cNLG}ATTQTZQV+jn-%2n&UFTS| zB$-IsSy3G;QN}RGT>b-$>9GlQQjkzogUCurBv%ZQ;IG@%RFWJx&@Qy|5Ww=iiyyjp zRf~5qhy*xUesurfJzT&Mc!h5|%)&z!c>CRp_mdrTV9R;^bCphSO>?Ni!AH zue$zocJegrkR4dO>2w%9aN?q@$Z*QzO9&d{wG{Z1>}F}rUQ9*~1%X%E6#a8w5X6#j zAKk)ftE2ZfzB^F8Vb5CoaOg0qqZW1+V)-Q6Ao>&BXb?!yPz*i=_IdG;&xDmK{Z7NK zqt01zJ=)ij(02b~?aR+Y5`J2rhY+*Xs%?*nmBtJk zzN)$uX-7W3deKj;)o7K*ost@9UhirdzkE~Cp%yWRmrrX#S0tO5s~@hU#*+~i$x%ok%Ip7$)6YhSy4vxj zq6qh8)wwNOFjy|K;;kE^rH0}hSeT4~ff+xsyU(#@tS(}0FP6w*WwPYT*i8r@_d9F9 z=%aj%EcK)l`*;@JL|pJ?&kyNidc*gPhTRr}7R2~O$NqiI_Nmc&ai}1wr(T98S=Fwm zD&WFb-qeFz!_<9j49xv4j_+}ClVDsIl3LY2h~iMVUTZFK36#8YdPMIIPCz?UgmSn) zfmN~_J|!ypF$_PLKI=4xoK18rGKpwNjGk~*L~M_LLg$pTLl=IeOBRjA7i;<|wQ6G$ zn&=S{mf%roiWj;4sT^bOpm^qlLLhD62z_O*i4{MhzSS>1wuAWzI6%cG8eF7w3@(^^ zj=y~<70afA`#hO%#aad@4p=g)M9r^4Q*My!Gb7Pco$9NdwXrn)oQXOYN!K6Ai87d? ztlNDiRsap8QAp%fh-nKg)!K%)TFr_B=4uW+w#DRMaD3ErJau7kx@2I}7S!)Dw0{JA z#rgsvzzZ+ChuOHmhlR@)W0KOhi9(!|9KU}CGAcQm-ncrBiOH|9RY=T|GLtnTK_>5` zoJd2huKh(2E_2LAX~#lgN7pGm@#hStt&WGYHI=_srSIM!Fc?6a*_s1MDOMP8h0peZ~mLg!G>-| z%rK6DPdFOUX=c#vy1dtyyx5P?JSFtRhE?_nQ#yq*<662n+%*m*%!0-ozn7B$ic{eT zh@;+pr27Yk8hH}F91m;$-9})puU_rF1w`*=8*_g8=+Gh?~)j+JtQC_R0 zIk_Kg*%tj#D+5;wZH?Ofi{~(&Y95k=(&a5u4SJ)TS(xUI zzrE1{+9Cvpk1x|GRT+26%#K5Nn=P1a05JsZRcIjpD%a#49T{MkevoJCDtmik?iXk!KrEa-i%Q+&(j;eg&;~gwV`qd6y0D77qaf*3oJN0 z{}^@X=qs*FOp`HlSPE7vb|;-~-({we&Fx&PEm_~$^DskeEoF&GV`kL#y_7ZjlZ3l> zxex~PQ#*XtV%N!2Eb33jt1T*J5~+C&m^h}2EywSJOj-AWstnSfi;wXNxn!P&dAXf+ zkOsyF8_{a?ZY{Y%-it3>ZVp%3+z4MX@6d*+l)Rs=~Nri+{#L@3MHXnM}SF z<0efEMbQ?@4z1x8rqkz_(}PB=+#|Yt;nlv2?jnTuzTfvaI1nv?)(BBh4Na*yc!a2Mznw()T# zba~kyq&8|=hOY4)B(2;3K+$jMY66m&;2TR46bCAm`j!o9j)+?7Z#n(m*wmatqx*ro zFW`lOc)nypU)?cuoB2LdqUB81VrSy-4$XO9OUA(Pjfx9(RqOEDaKyX~S<0NfE;Q1l z86Yp-R${6I$T^+V=}K2@-Ioh-*Q(cJm+1F)R(-ABSmk&{Hb}NtFS~@YWp1SSw47a2 zs(>dDvbaQ+$y!|F!}ri)^6#+W@Px2~bX#gN!C**e6^Wix?28OQ5|0$+rDj?oHiX2` z;*yYgHwn+q;nC>tqS0txBfJ_)XOkciQPQRrJY?jZPQ42!kUYc5(*vu)6LDe2ukY{= zXp`TZ+}E1B%ADcX$dC$e{1{Pak{T)gni+AFhd04k8C5CK%fjRMHwL0`#FP(rYXXH0 z&BVSRibnIzeU-O`?Xfyst(QVhgyZSP#V8t)`S6#h9c~w)M;BJh%#yAwv(k?op;k}ZUtW{$6r+t!ATCr!`KMYLnpDR_iAo}_pnl7^2viT8MTHiH?OZm zQrySMv1ZXRXVG2myt5QWhKVTkA3G<^RZ9itvN!cqr1k>{SB>?Q@xffM=8Q0>E)83| zEhwGa#YVxnRTud*`L8wb@DSrfNpwW8zHmcMQBTM$8``{7M^*rFrur4tqMc(lbZyKX zyzk6Yq-6}TFQYnWx6<8B)hk#q8O==?w5mNqLNZZGOqGM^#XSR-XM@BjZfH|DWK3ha zv?Wp*Fn&-+xvBG=9LW~rPVjMOa0}E?!y zMy@d$y8fDrWQ7iEL~w1&{KFWOq5YYB4UFc+Jjl#Yk&8yqe6z+Y?=^xiTpIn61U(*? zw-=eUF<>akVD2UPV_R#&gza;!f|X6W!!#vVZw)77dYd3iG)vA{);!#WYuk2p=;=y$ z`zE14yHu*7dfrEi?`V}ikUT48uDDR-_eJ3<+|2m#YR~iRq^{$4I(_@t*Qu)N_;U#1 z8jd9d(9I~nn}dyUp{u$=s(d4K&tZx*)V9;_N`fDA4HPN)pP?l0XO~)lqLX~QgLnE+ zy*|Ot{x!im62$7yEo8EP!Ol;{wM#Q(NiUN$q`@0||6~ za51!o*c6wW(7d{0POkf&4^l?+(gF@>aWHE#YN^>BsW^$(D(jCm zXwiqFsx%*oyDFq@|8A&^8l{rB(jg_FxmBT#y@?H-*2O%fBp${UdSGt^hb(2KkeH#; zT*V?KvK{8+nzRufz`J(tXdicpU{avi$c<6DP##A#iyt*h=Vg<95a_h%-ZP7Q;(5;V zMJqAqsI{&$+_xb*_Sr3ICY}=%5aIqIGaB=AJ`Ha~C~YwB+h$zZ5hC29y1ki)@z@mE zJgYb>7Cb|iwp5u6Oalb4zxoF4N>)SZ;WdGlFaM{>Rv+6!*UQb_tzh0T`j09lP;P$g z^Nq&t*`k)Ns;eIhvu{<+pPQ~bkFPuStmBJ*#_4u#e3u6|&x=OS(y!!7P_rF;!cB}JcW6=Y(18! zhBZbAv%YHP+L5B-LC*p=bl{!YbjijmlcKejoW_uAEhEV~1!Y5DLWjOCvrQX|A~avsbkZSp+JD`BUqGGkbv3pBFZ3Om6mgQlZ7! zO-(d+Z)~>6Kl-Uvg6Am|ZeAzp8Hwpizo)3}2r6(#dY=sBPCWxhzHn_HTOC|M`%XVz zbyxcx=+xKP3)77~#@!_e7ywQ$8_7*Xb+68aNIY)L=$q|AcSPkrP9>*gf>yZPOb|V% z3dMhU1RCoP^fchtDUxPuQtzN#WUG~+{ieogJpi|0FlSO(E#a;@*Ildau<{9I?*Thi z&%H_E7u&_2C#UT)N?f0N*kuD(4%-La2n<;;<|GEzm!X|#p(h5$&b@_V^&=JOmNs1g zA^%ss8e~T`Z%nD7Z}MnYD_8o<(%c%gz)?hL)`jUM=N}R$^sgs=0L^B)E+S8m_6 zd2b!_rMt%XUs4;{J?lqzXqU$z#%kzO?OngUHn_^I?Tbv7;Gkx6%?;Ie!n3z;rGzTg z>e?@x&A(+u7YK39h6Bvi4xpvX0ExJ`&BPg-O0cB)L1L!3ynQy0BgWB9?S;x52atz% zUuY5IQj}ssai$8LnjUC*`7Vv>j8QFNGsXCh;7m&Vay?aj-3mOJqZh4A^k{nWEm$Lm zWht_xjA~f5y)e3SG$VoIa5umO2t`qZmJ&QevVKp12olp%e8@rx584wu-y7o8X=k2E zn5#p08of(h6`4>me%H%4h4|QmbW{eL`wq+OJm)25MLRTE_QzX~w1jMtrO9`5i*W8a-le$*_!89%Q*Wh_e&K6rIRr2XN@Ba4_D4c8 z30kmVTLSsvd4dF7ZHo9+@;gweWDls2i0e7-4q*V&$rtS9>oYFKh3*!@(kx}QOF!4b z?AH1xKm*|@f42pDRTZ6ClIq)#w9+jbkD9U7A1>V;jMYC!=A%AHVNQb-+4AKC8-CfU zZX`dAe>K+UG(=4$!>Qev;H*^ud%hq-U9PdCSNk}*##KVVnfQk7t%$;{V_H_ql204Z}3YR{p!+03lep4Uo6k0~Lof#1Fv7G}Oy8*j{ufhSXX0l`=9O9hOiSys!c#0 zYW6+xveQo2dfj1sS^iJ9zM*Ql)+38ar<1Mj?pQ;KGv0f?wEOg;L38SO#cpD3&)qp6 zw|gOxq!kp%r8?k9Bj-q{wavuSC7Nt0m9)o+^{~;% z!-}jl+iZBlD=1&4g}n&0ngXLa?DuXhHbg|T=#1gRA}SUZ(>_NX@XTdi+~`>*+`6)( zm6%iKc_adSGIDNcvZbGU3ao?+m$z73!CN4|UXCYPT9-pao2ilOwZu0tRWp%mb%w9$ zv*UYElyDB=sA11$H@7)08mH}U@9ZSXCAGP*5{M#T8D|$^xTKI`{OI*20nt{Vt?=FJ zt`ZlIqewR}3~;1(^Hl#uNRJs}n}%*H=x54#T|)^X(p`)n`-k7rYe&KVRPih7{oTl6LK|r^$N`Vpuv9g zyb2&9VE@|Yb^c?BCui%FO|o)k7V>rkm+q*EPZ=)h4ys~SEi6TblW)1jYafnr1Pu}* z&(}UzHIT4MP~;*~U!>Uhl6G_ly9N{E1muhX$zMXG55Pb&^>aK478Oi}J zt0EoMqcS*aDT$0aQy(7GHQ)v6@l2Yye1;1bjt!9wE7Te^QIgwxI71;{2T+0_>CG_e z`xFp}Sp?Z|Mx1D;LWV%Ve)JEtJ=loPX~^npW06OHWeH-?wa6S8{`|ecP%w3*elq=G zC-Nq@Lzc&PpSTe+!ee}35r7r8F}kUlxccON9`j5CX;lI1jk^F5S@4-H?4uH8ZO*`G zYyms+h^2-TJ)pF_gRyvWB*h=p{4Fo{tzUC)#O6E0`67Wav)DrIv4Z!f<&^lBCTE16 z$t5Ye7d|^lsTZUqzFUZsjVG*Xk~n=~( zn|UW$x5Kd-Vf1)vLK6^>}X2DYu zuA`kDwY>G)xrd|8`fw%PhZsN7hsCJk3vaX^N2vN#?}+jU3RHI+NF50`uwB-~r#~!E z$P1$eWM&T-7MCIxrFcDT4joT6(ebzEQ?+wx4jaBGEsbj$_iNouIYc(Xro^hzaeFx= zH{8JDz0!i#$z7x?aB0+96l&5ZG3rQ}VU^yp`S(*Zs;B`=&2^d)ID&6q%X1#}I;{ge}~NsAtT_8@a=CKfzfp zxaRlfgM(Jzbb9mHsGhhL8_i7KOyTtIr!nWeI#2=yKljd28Q|=ms!-L}#i4cIa6Vtd z{tu3>F}SjBi6)aw>||n2Y?~81nb@{%+nm_e#1q@LZQD-X`Ciqj`{!2OALsV&UaQyY z-VvU%X@tscSA@2ok^DcmG=$vQWZc=J8=v&|?;Ovc`w8NrM8`d``8nVO`jXx0MSqKO zaR+5e*A|(g#>5HcD|MeeI9{)qhBY=An8Tz&NCDDlB(;hXZ-H4>aE|vE8h}+P>OJ0c zs$y|=AJtZBirni<%Lsui z7c~l8gzf~Hn?teqDJ$j}$3`hu?i+xgGMov;Sb;#}pg@F;bOUk0^5Dea_Q=Cr^bL3z zS4KiLein|QM+`7QBIH!3m;P|Vs8CDRMaHH2Wz^DJ0^td@tft_#a14%-UW#6>ogR50 zNCiQ|0MS)ifvKa+c!3n6v`WHsoTCjTp4*y8e|f$55*|ve{jXXj+0mUYd7w(ax;*X& z?jiH=a)&UF%O9_J{wm#(<&ih>tc;(`DdgwVcF*2Hc-W2|iN$#NCeFloI9!0kqQ{e~ z>3UOo1U%H=AK7F|dRu&gkiD_?(}Y)}j3OCG52K+bJhpR+DDLL( z#48i48>At+sK}SN5l;1Ns zARDl3fW)BNy@jNI{_ZOVS%O~$5gJ9quv=w%w&7ZHG=ovWx90JL$K&lVh2m^DhVl8w z)aTXmUm6dP7b#$xwC%sY7|lc_fpC;95`$xW4#&W&CZvt+$&f+I9-CL8r(`k82#g#* zEzIK^17rp8@dp}8sAO`AP+1-&>P=Y51kIGi88E=ArO|bAP!)o2K@!&zr(=6_bxBk2LLUpB2LaAt7AtM-IowW&k~{CA z|Gpq$EpB9~7G$O@@9yolEq7K0=u`+orB!0|P)nS$jexb0w*Z-a12GOR4vTUW#Y9-5 zH3JfXcB7qRwe0xJUV-ibozeH1z^x;vEeVqtIL5?Op@^c?R74*so+n(8im!V^aCYm$ z%8gLAL~{FgnkfX_!$Z%_VAg#iH<#q=7f@WGj!duDqyJ8x-dXtUDRL@byzu6mWj-4{ zo~jUw2Z2E(hPH8*5`QvU9reG_Lm+JbpZS zU)#i-Z&dQ{zhI!X|NY^28$J`Pd&kxCfl6@DeHRfQYhs7Q^e0L?OK>Ue~;<-6EGB*NPhpu##`lGtD!g9sXT*3{cFddJ^*Kl zNg#hV@ka8zCoZxUs^HIugTlzqd3T`#P=rPIKq8ubIT{47a&Sm6aXJW;NcA96`Wejo zI0;E9voD7&by>KFUNuWuZcwE}R!qPwe+Z`?3CglttEjlR(&wL&eYm_s(uew8u?Q*> zW>zc0ZA5T6FP@iKG@ns`F`Lw*FsFOucd;DFgu^2vINSNL0ZVb9)a~%^*RL~5Y@2ma z3uSg<&fpPjdW*b%VmZEkTGw@vJ8jj(DfHoN`UJNZG)4N4^zG2ExbR}^!FF_$ViE_$ z4?MgXYpsvXrgR8%W2@w$P@U~XZP(++u(>`p@=3?`E6U6EvqTP@3yv(de*xojvHatq ztu~bg$RVmTNUpFeNvG3V8tG#RVHj_R#A&Py|sTx)ij8@ ztvy^FbQ8y(LAJ|YbG4jgx!x^b4u#1TN^oU{&46fjJ?m$Gp30g3aR}P=0Ml^ZAY)22 zFFrh)ADV~kyqy8w*e`+1D}7U+;l@#Jb)l-b-Tt7 zaN5kEBg$#VG$h z2IZxGSA7c~<>brtn17%oO(0GF9xjRgdu4^XN58g^bfe~2If?YBkW_k4w_J@y8AVE` zTqDY`Gk3U|WDhoi%&-NCuw7#+EYAUxYG7A@a#~$MU_M8p-%!ks`(^A^iW7}{xNMoF zc7!Cw+I)L|49v=`uD+aCxUj^(MyLc7opWDM>{{Lh<~88MkV1!zQ&lx@ZqRK_Z$EMxW{xTy%wN*qB1I-#l)j4@8~JZq z+a7ky5q!%vF+ibB+jG47BJT9P@>TJ6J*#8~aFn#@40ZF$`%=!)a@SU@hfk(xTd+h% zFL$Hu!8$ar8mS>hxO!x>WqwrVai6Z{)airvKh{%F$qZRIq?!|pLGO}Lt<{E@!?@41 z4ZQpwrfRYvZ?DTMg6;S;nintJChqYA8-By&7fErx4eyhtlZB$Ffw<9b8X*9P#^{EL zU{Z;;S`i)BXAH_#Nd1K=^&l++hwIZ;!-6;W3#ttYL|}gBk_SbI35ySJ?@$ z2<^eIQ|Wo1-1Q^xf{OknrwkVaDp@^

UPpc8DbiLrrtK-P6ISSxTQJWDCtIBt6jq9AsFge>wL@695~nNC)`a@XKX zI$&w1_y|>EvSIe{rVRw*B~O zg&z+?hxrh?zjP0h*>F7_lyI_Lc~%r#QR%|YtJu6Zfoo_~;T_vaq@;PQRHo^{hqfoG z)!?RCCeBmUA~P-5bgER{VJyI#sDQ9-^TvqHUeja^l;23wwmQ}t0tm^>LV#8L+UI>B z&-H~Z(SVc15u#`FhwIi*z3#i~IhJ-;eF)F}QqwVg0huIGRzIrKO;xmI{4Uliwzd_& z8(I&kL%(|er5#F@HUm1)7EZCA!Rbj$k<)`0=2)^N&WRH6{Z+S; zLR0gHNC{M2UFX*QptFZ00c*twbtKAamFHVy5lwF#Yzr5BnG$0HsdqTJRDU9D*;*Nl z9m9G?WC5c-5n1mwmr_JL|BmtxvII_4=|NI=iEc$QO2+u{cxoys5Xx&9MNCWszaXG7 z4E?Uh_D0R-d47Y&^)}FFZaI93Rm>4&XFB*py||-jfUw?eBiDXV4hX)NJE1 zlJL2AmfM0!y>k00CHgp1g>0w}O^5rJ8}8I3?(es|{?ruKn3J7~(Ue)}-K`^Lfp~c? zx;pek^jdr0Tx`4Awo)K|c?YT2=YLtGkRk9!6ypD6G+352yW$M0@?dEiei|~iz<%eT zZM~^u*eCxtIiSsciZ+rVJ*{Et>TP=pyPG(Fu=&m?_aEB;xF zeyNc?{;9bZ8sCwHovWrc?7*Ud_#ef_3dpw-z^ai2%LoG&7KIB>oX(`zC%sz!NAggQ z#D;cqq#4tb;fg!AAZ(@<9!KaP%m$aa9U+9KQT;ifmA9vP(LsN1u#V$&R*w)u084QP zYb~kE921v3fs;qpe=v7by

6gr&)>4x;Bk?Hd9uX?#-z(c)U<`Nxag$l&Zh)>gM; za{B2xzAO9GIk7u4p*U3aanOSi$XJJ?hph4JG={4Yf=47F!U#dM@3u_g6$~Qwg2e!H zNRwN3kiTmXTfxNH-Cyz@IP`thJTxhxJSc81D@)6H-?*y1HPj_+kR^BqD)4?s7lgoy z3oY}R#zSgoqUZ9tm66mGnO7QaUvKm#n|z-~RftMl zeC%WG%1YR@axCdF5x&MKLdevQnzz$r+-fv15}h9c^K6wxP4ue9xw!UA^qJevwCdV76}zx}1+l$@x*+D7DqLhC)YN2m~8qbo*lAN6nYM-XY#k8&Z6l zxs)iyHwj5j(#19V4^~4t(x*+Sa^&V#53}c2`?qIKe%B)Ff4waD8$Er$ALq^QXhe>X z^fsWo*c^j)yX$3sgp%C|XGTTwOjyrY0#japvRvw1kb#`601cP%tJR8;+v~3Z_+RiC z$%TH9NLUGD;iCAqcq)2K>JQnT`372%mQe~*%xXB*Y@(5b%SmQ6VPn6z_ybN#H5u1p z{Y16DlBEMh=RF{y1Ht-HlQwQ-QF}>|L`e|S_7Y^gIRYxs20F$>&@`6XAe3O3Ov7qf z0ni2^n9PyN0fA~^cLRqAn~JWKec_2f=6)ndC&7T4xlB_dY2k8vMv7L`)FALRq z%E~+(%h?pMVv@Kjy)>>+-x$8({Sf{QoNSdVtypIf)NG}1&dss^y|MerwdND+l31W-tt3n0R-?qB3VP--og%zOq@KTu_Bw^Rp9_WmqO9W+sO=i z&|FuR9xXa)o2ud0w2!~tF}(Z0f|udd0aCd91S|koCNhe%aSs@*fFqR5nS2v1dac!p z3X)5fe#lptU;rldG*!O^>i=QJ>^G3=*qLPZ6{3ts#+6d&)+ZwGV-Qv;$B6{(13}qa zALz=ULQjGJVyjl|L5kX970|OU=TcHFvOsZO(AP?sc)Qgnr{)-EaS3F_+}0b$uw0$E zn5n0)|C%OA*>ne^=eLJpJSU!=^TV7euqlB51rZZ7J%ii7u{jXy`-un`MC*_4aRCm| zZ|1k>`HCFC*I)XXmDZ1YiDzloHR3c^&wk})UYTImx66q>I^k1qJs#KBYXr~ht0m`K ztL)3C<>evu5WYt9U`#{*y!mWssGXk_@n$JYkd#9$m@lSQS4hP;v`P6tY`V48XdvWRNsh%$HClL!x z>@*I?Ke4(V#K58qY^QwA3#0RV&R$g}C_`=Ylu|8KCIrBB1y)3b6}+Ilkyz(4V}ul< zyr~D9wCJ(7Of4~;#|*XQ1>G{h@@bGaJLWG?gh{CPH`)=tP2|UNGj1_a!|hXjK&Ml) zF)F4)0s>*4U#HP`NI(F9b7N8pYnPJiW)kQDfe7TB_u$nk;#gK`3NXpRXLWzx2DNz` zM(}y*(5>sB7S}9@9M{4JI_LDeqQF%8Wdh++=bMbzN$lnzK+(wdN*S%;fd(WfFVZN% z<2ItFS)#){0k_EO?E;kTrazL?9N(PO{jt<=GDN@?u&UPjLYw1}XKKINx0|)=4syN{ z@f#BFD@v^c`axX<2X@m8ju{~{cdr}gSXJfHG|8&OgIvu~4?#`E2}DR=1Ay=#5FhTQ zdvxuz-B5{fnn2`ZO8!d#OVw+6V(F7ZYdr4P$d}Fcvbe0ynb0(D7a)^}#lT-rw|W&l z^*8%Am^L+u9K8fX=EPXKs;v_qq`@}#Tr(Rd8Rh~F|5a(h3%t+sZGKc$fTW5ax}T)+6|SRt zQRJRwx>plS(56FKHOIiY7S(=98u)#$u~KVPiA&jcQ<7{gJ$96ttp5&3uKsxn4{i;0 znQzm$Ge-qD^!vAeqe2-(uSc7q`h4{L`W?CxDocOs(?A%8rCbzKp&@WVL1K^*Rq=MIrTBgGo1>j2`BVCEYB3z4mECo!F(KdBt!9!L|7qG>;7E<=Yl(P4jWfOssoOtM z_!Gq%sxEJ6B57%JASp#>YIz#uE#^$;9|ep8k5F{^G^P{KAyVI2EY&0+sj0)aou3+2 z90HlXY)^_RfVdL)W_{I1(ZgfOcl%50`-T}-)Wq-M@r2e(JP-dg%J8xj9~m(xoX2QO zL{AHZmC2rymrW6{c z-0BFyE5g=F4Q$WZ!UKPa_Ea+SA)nn!g%t#Zc>63iI;Ln*I`X|Xu2EDWZ6GhEMF=vD z5jdRsZG!p*v_KmDE|pt{(Yc4AT4w1#8ntoP_k;OB$ujWxf%BdktW=k1n8CVd*EO2E zC(f;zz?h;Dlbzf?mgdD!;ZvcXFL47#FtpCEev1ki`HN>gsOC#gQa^n+JHzWprB^*E zYu`y|8{99wU(5l{!UBcDN*AC0;@Y+eTXA7u<-Ilpp+~gCnT9;hXbwjaf zl~7YEzqMUdIU^$Gh(wxJ!dJ0v0f!0UPGKj_-LBNu-hZ*sp>kz9XSj!Z&eES6+4575=`a>mKQ&Uqs zVLXWfWzKh#8P)qUj-H^}3(NC$A+;;PP-EF!AGjsDJQ8%jyDyw~EGz%hy4}R?1xlgS z_h$QsPTb~1V~UkUO$n3myOAw~okefJwbwsmSffZ`-uE$LZ#t*ibC}6r&ClSNGsaPo zozZLaiF4P8tISQO{25IW-L0IAdDAvra?ss4#ngh9*nfwIR3Q^jz?fi;<|M9~D zt5u7dbxivgvm{#c2NWiEjf4(e**q*^BE4z~Rzw}UZkZ4o7C#nNLZ$io2m%wl|2r@U zTT>`}h2rTybE6MRlWBv@h$;Akw=}}dd+0kdBfHn@QsqW$MCZ~zE{^!}LGYc^;e9>vF%$}h$&Lf zO209)%CIe2BkXP9;WfaM4qAVk{K_urFz9!Bh9a z1=1fzP@&k(Ynupc(W8OuR)fP0!7PWSX)px$ek66K((e&)&$Gl9sMWFwk)u=w{Y4tt zEMH7cV~jTFW4x0p$>`U2&DMRZzY>C(3j#|h4-H|!p!EIQps9hpDMY}Ugi?_5FaA3E z-Uhyoo+_AE=$3~ACNHfy4@v^t_Ov)lQeRyfJE{#aQ=UoGsrNWje9obyGo0n=0#7Q4 zKwdQ$o5NFlcH7V6ArOwHH*TI9&(vxjw~!J7j{b;Ah6i{ZmFK^JtjD6pvbfmux-c=% z@_f@M4t$zZP5$P03y7Ii=BZ-Y;bnv)H*{)0L%+j<^Ztm`dP?rY}f{QvT+C1mTr?SWErjrUf&FS{gwRsN3Hovv$7=KXy<5Q=%uY5u$W(yMiG-t4KvbzYSw zCzs0~Lqq7>m2VqQS`#zjzvt(1X@Ap)4i>-6>w1TsZ2kh|zuOs2ZZ|+2L}{FL1%j$l&CCDGPe)_umWyIooDJSYj`2&UtDT?YFxkOQ7L0(#GC5dZp~5CF}yZ4xmtCKcQ^0YRmE=rR2AA z8aP+}D84Kqcz1?Q2nNyiBn2IoNHoI{Xs&A?+7b*S-j0o9Nxo1Prs}*Occ+SPOsL)| zU%`BuRr&j7JlM5X1%7leYu!xp3pLp8;&i=3_&$E@dF^Z#fNNL`g9nmvn1S-oG}fFj zVUUN^gou2D*R=chZzgAy+1n!de8wBFGp^XZX-jS)UXrqLSOo}McMK=ezcW9q@eS)~ z!~%?9X6265_LW4Nj{aboLoSAYAmkD!^E4Q_%@w9?Cw#_KJq1UPb!EmfNfmbuVGHO8sCKXP%{1iZ zu|K2~!_+vV)2CMeo0{X;=*7F;me4TuDHQvXJ%B+=2;9T{Na|kdDuu0e-0s!q1;Z`5 z*)z(;8e3v^L!4P`+M~zsStiuseV6+d2s*N^e7{V!>K)-@Wu~U-!n9n^B(vT3ap^Dk z0!e=dZYc;+GX6RnU2tMI3QNl5d70gF3!u};%sTAn$_>@C1m*YiX~?Mlcouqp+3F1A zX7^`#0=X({`y<8b4PGC*UhLDUr43=Y#nG6mt)}Ion8cuj*d^1qTbDstt45XBs1r@4 zKO%K##6FrIZUkPvWQ2%eh+KmNrA!H-b{|AstlgsrAF?(d)^3I3yi~9g&yddzuUBdW zHfUg^T9rCM=$Q#+;|<-+Gyf;@UEhcqs0Q7AwMS;?XD?=E)cjE$lJ`<2 zMR|`%~$h4{T-1QtY+J)_*9I;;la^K-HX~=W$fxu#5&RMT09(ua<5PRz|R|@w%UbbI&W3O z)L)i=Ihn?HI4~z6IW<9EX$=Ncvc-$5-At7{yQ4@f(<4p5v zTd5V%oXOwY8fT6DYCp}?H(1wkhB3`R^TR?G-B5Z6r8F3Ym*9X zJ0@Con_$Gjqp^Ffs#E)Ar3rs~aMk9r`Cqp8(A$5M(V@%_Rh#{6*`9N$ijvvhAufMDr~-OQN4Z%gQ6#mNt~gvq&>?zC0}-Zz#EmXx8Z7!Q zDwXNjY4j8=CMmTQqI!@1AW63%Zs4{Hp<4$T2j(no#Be7RQBxJ27U^+LQL!_3;<^1# z&&+vBrmxi-n_}j^_x)V__s5xOmCu)bc6VDRa*!v!2WEqgz(0n2g~dadVX<=*2S~S! z5V5kqd}EAwBB?chZoBMC{zzT+4Vf8X><@wBJyT^yO@y9Gai=bJCi8e9y$Hff<<5D^%F^~Db69UCVpdmy&7R`;!CkQ~9gQ}`SF|3tg zEu0WE#w!1`e^p6UYclCkp8Za^v!|EK;TA}l5YuK6o=!K`d}RU2et-?OY_RX(@-n6g zA`;!wsoKK1Emwl;QIU~TN=Y=+q)rTdm3GbUfr^^BN={mHKU~ozqJXwgIa{bw{6GcH z$A8@qazs8s&Bh=mw#W`P!TCe--=nh}e39#?#r8wdg|WEgCw2}ip4ErjODsb-5H+F;$Vmg<6bA>ZxcjtfM`6q3(Q7E)(P5u_E22Fp1%|zeeC2 z)cRCYn-}OVD3hCeSQngcJoUQ zadCOYc@BL0BHw7(_%E9v^1OpE(`OqPoYKVP>BR7L<}_F&%xngFy=Cwpjw~~JxBAy$ zsFrtk&-jQMI-(seZ1|y zTg_(r-ub-EqRl%)XEu5aKEL_u4-1v*LQ1v1IeMOc4PSO{6&u0upxXW+PVR;b_BRz~ zBWn`|g}x5Mw-yPg+DWYM-Fz&PzMOqU>BChjI1lQ#clUk3;V9`j z>N}{|p~wHkFY&!b2}R@?i^sq>wz+}|NXX^MD85P~vazr*nL0s!#KY{{(h6lKveR~C z554mBx1y4eV(ERgi+jYTu2@{SJx4^?sb8Zgjx^e5;%kGqB@~~ft9c6>--C{RtN)dq z?s#iQ)mtBofX|te=j-)N)tlSFCZP`!vBq{ZkcUrikaK=9k_DXfG(@hTxgcuo-DpTG zbrNo`^_I@W3slte!QH~P{gy1mC>0<3aA(=k%ixVSN}Y7EP_f^!fZ~#3K;Dno5L%Y} zUI84aQn&t4rpgm79U9}B8ycDITnw45gT;HOZ>0;?`{ zQQZ~24%jjXu;a8cm+*C6`D_#wo-(;x2j?dnj{zB(`ceHRU|>Pl1B4cz_+_!#i^9tY zYICH__x3N`-_?ngs#e?bx44_RS@C;wf7fdQuqh+ilSz4bhEJO|dxDO8I2rqd72)x+ z&eXWy4PX5yWwYvJa?(lpaSTgcNMi{m`ey3gzIh-mPEH~Ow|M9aM|Q7fmwW1(X7%!A z<*%rl(4_4#rmtZAo96R~sFkPX_ko$zA-zqhuq|Qb9dAMr5nbbrk|l>)Guk!A!|m4# zv-C#J&cXRLEJcy8^P!$K#X&>7Er#f&0S7bKiOg$`NmlO?4}y}k7&Op8M0JpqPc>m7 zsYB1l*%l;{Dv(DrU#2yVuJ@|}3KFkBkyJ4YD(w2s>0AGIB&Jj_f$pNFaQ^81-xt&? z{GTN75m`IoLh~ucI?LV=C%n`xGYUi3;Tz{G-eI>^>1N`3Lx;{@ubNvTT9)rPZJ)g`wmv_Qurw9Zy6-jZmlWP9c5x!4>Qq!^FB@ z$e%G9Oeev&5EjKj6Y->~RJXGQo;B?Az*Z%BjTs@f?W60lBZ|=WpmpO(JooUbn&Amm z?Lmz(%9#J`pH&aPHl!GJ7sef~`LOA|$&($hAMTmms^1*{T~k8j@OQ_D=+>0I$-c9` zVR5eOyq+G+4sb>QT`i7|BXkz`-1YOB{OA^R}?_c z=S>uh_B{0ml+kc3-S>l!Kx;%Y)Hdqz?4NnM#xwPWp5Ucd&W%C_(W_9Wg*u*Ovhoz` zXL66rZvkd?N+)-&wQyR(miY5GN2q*P0+y~H(E5#c;)lnBhgE$1VN}0qQWVD5B!O^$ zSH8qBMMy`6p3=R$E-WW0dZAlN;4UFUPT%h_@liSv3t%DEUBi0T(Hs9ns0nJdy@kF; z?mijZQ+~1B1(B@kX!5-`&}OTSn1B%@dKX*nfVONss~DgYEmhweVU0tW$YiMu!3_QF zbAjVb2<_unDn40;OrnfQE%-O-tjmM*mASuLok>bu65Rxa97(xDbW|+PcemZSAPfqB zR$7a*z)C{Hs>}>L%u;oWna-iljfYw<-YtjPUZ%o_I4-gb$tpqtkN)}8bI&XLO)zuU zA?WTlIwiL8#`g|GcRyS%R5y*sy`&;imrzM`{o&w4Z?#*SL#aWWEN}bSWTJp2%T_-4 z8irdYs=mB8SaoeC+Tf{!+ey%b903bot|<;)qrzMn(9dvo=U4?SI#05a0j<7beZRadAl-iNNR z-(6qZ%YAFCLvcqMFzcNu`BY2VoN#2p+`lV9Q-;QJVlgm3M?T^v1*bN;K8x9t7ett7 zP{<(!!~ms}^AW~ehn3alFqG#J&dNZfAgvezoV&I?k_MIXLjh1m3+sg_zC*K~6R9jF zc~^}6N}L!QF^HP6WK&qKO*;}rn3caGOqQNe?ut1XXUN(iQ}{sDa({tz+qu^V_Q5tb ztqWgv!-9;z^f^6){hNI2!J)y1M~{|D!cuU)W5qfZ`p4!>ty7&7Cu6+3%;_cb@K>V& zf-{YnlV{|7n4_L}?|w94np#Tm&iJebk~ivyHE#FBB6am|5J4<*jh~a!RDIcro-a)s zPq#ON8R~mssS>{+X;A=a{{7%|ZN&;Pt%omQO`nWZ{RlQw37Y}KlM3!o??GAavrR3k zTypTSB1sa%j5Lu!fV3uR0<^S_dmd(?`z~-sUm;Q{vJ|RJFovL^9p0~r`y-S89^}cY zD?I1iI}HBIQXZA z&QGJjD z?lqe&k$)wDlXj>BW#HB+R)d{C1?{PNfVbknG_=1=sUrH|PrmIkTicpZ$*vpV43p&n2D>a_p+c^tn^)f8Z$jPF*mA{kadz|}tmtgBpaebQ8owWOB!u#Q9 ze2KRG0th~LkDy6w`TxaQ9w1cTxoFP0A?&TH19UF z{A4WZRP^rc!u085eQPZ$5wqa(oM6S;RANGGICGz{wGVhobDTeqs4TfkC}7u6oXN#ld~*B zOjb_w^33-n);lh%s%@z@nnGJ%>)vurp}Dlb=6@I3e1S$NLIaP7v4r@uP!yRI%fF?9 zB87e(K2aAVG`ViMB^X%NN*TBu4#Ul_!3vey`g)-i>@vmT2BMx7Gx9^YI6zI};p3gX(pfVQH}_VTa)8J*>M$p%>9wQ(^gU4O?4nIf(T5Cc#D(ZI;H9$fss)8 z=PR_=39FCHNUUc5ajC_eyHbXb>cGxbqx;dWKsDEc5g1&{UqIs*rJws<`VlFMzgiPb z-Ijhg?Q-wdodI#aq4ugsU*X8)I;un*e`)TyB(%~f=AMx;*`%$lyUO)k(CT8_mhTI1 zKY;IfSzC5rFn(kN?sJeLrNbI^txA0)JdhZdmm!RYQ>qiB(JCgSPT>8V!J@c-ROZb6 zjr=lC{YUr%fD2s z#?Js5J$)fpJG(MjEig6zWO5AAmSIn|2->NI*Jjaq{em5iut{;PJX@txogkpyy(ot}+GX{1nAk@kvYHuWOAgP1q9gG<;P@dtSE#rr`b z;tnS7q^5}W)1&Ze%hR;El}6^*aqH^4T%Ug(-Zk1DCd?Ntf}d+y6(kdB_{4I( z+f#B=h~kzgQJ01i{fnL6`%0GrpKEeHp3kN}rPT7TeqF79*UPOpg*p~#MN{~$bjTq* zo>faDq$!!m7cu!r)cCB?lG)~TPx=q!bRO*6eHwE7EwP_zWG?MFj$*QQPFtXfocJ5A zezh;MEI`-*FM{Fq7Wq|&1H`YQE&NwxmP$p6iD??DCt?ldvVaX&9{?b0D*cP~;H}Rd zv_fk~pdHGB&rM$D8Hk6bGC(EZAAUu6-Y3{u(zW0gxkemCCTcl87^_9pXA*46l$Zog zIs?Sv)#P5Q*vX96JJF-@kTwqj7@?i<%IqLV0ITUxgbZ#>_|y#w5e-2LcllM=mAUhx zB_X#-CEh=Jvcw{@8@%rf8pND2ZQ3gc8LYVS3%JusCCmsrJaVu;5YM3Jk{dxO}YNrW2;y%s%MfN9EFrCu^X^jL1TrXFZz zEAF#YvwzD1;dy)7DpE}bH}wvyjOQ{oH4WW;XkG3)!h}T38A82AwX*C+ovvo*&JR?w zmlQi6Yn-1wv)v!*8wz43ws%o8rn{PdUY~@2zf-1G`;jJ^c<;ES!#6hc9S|#sHrt>F zWjBWws+e4%5x|=gaSGsBpo>Te;~VHoaTtljy1PJ7fLoYsf91PwF1%o#SRv+_nQulB$q^2=y|PKqb=_Ybe_E50Ds{oKP4DZ8c6RJ<&M?P2@Z$p=M_%}Cn# zgL^sr!=fvm?iJlDlWQ&daINf-JW3evy`XiS{XsV1@)Hy#>&%NRBbGE{D~EvnYmz|I zS4=+p5Fma8ZRiUU4KsN?)5qia1a0uVbOFaIwQW1rG<+anCzb+wIE{-?^cS8%O;tXy z7qmo~;b>sVOwpZeWXxF1P!-Q>#@y$7dV`>NqS%G6O^( z(L*{8fI4tpfAUMpH0>`}DbY$$-e#p2lF3)r>^wnxNZ%?9_8$WFOw{ZF5bEMWMXx@@%l)Xmh;^nffF=lM#!k;`U3&g zTAB+DiDO;B0!h_#Auy7H zw2lBFzFnw6u(ET@#KSzkJWV3#gJ4R8umd8;Zx`mw%?u~T2VWrOFB7)mM>+OnjB(m!M$zO^|LjT>cgk-6-kX~59GlP8 z6n{}Br-Pc?uGmz-_d^}Nz`33LIPv&YRb{2`OkxoB;8|wI6#JxF;MZ-y7GlT;>eY#@ zM(}TcF222lAUQWfediq>!OiyDG9p49nj`|TY&{ikt|Ylt$KKF^n7Vg-fwVE+KE`jg ze8+X$xA(b}{%>Gj|h8r1`k2|+-`b%+S6hKk9zq~15zcmYj_C~WlYg)uRGAW9^V)}UG zoUCSYxWouJHcd3if?zE$O%LI6I`p!6C&@~OUzrtneCHThj(gF;{eT7(k$lj2 z>S_(K3$LjEIQR?~ZxK=UTwP?{$SGV;z17nw15|iVX};rmdtT|927j z0AwzY4ViU1lRGG|Zv(qJ{&5+LM!2-=;BnNgu$+6RG3#{Iw6aQDPWKKwTdHrA&b5Sp zy`tA&P(N>dIb_oN?2wJ_fT+&@a61+=Z9ZKj6MfCuIjuTtUc}fDQLk3C!!B0~LToTV z%&+^F-|KE}ULva>jO%sbM(=k2g_WURI%AgXUJ>R3o|Q+N95&Rs-@NUzoniWYd@u5M z6&*2$zz7}fu|i#94mk~@d5^%#rStD&f?iGF?&xKSd|8A2T8x*|6r266&Sxo}=--|1 z!SsrIH1o_w~QP~d0=jH7iaMX zl&{$bs{;O0A{qMG$!AEImN49lJ(<>ss$QrK-&Ce*{rWoz5rr)#maU0q) zg}F0EzE$42P+OLXQzh+;FT+Kr{3U_L#I-ZKl6ZCeu5!8F-A(KX!W*Lx2%8Ac_E+TSLb1`soqalhX8VOZI&6 zd3@~QYS^aB=sPEzAN-}z9op32p{Y|tMz@rF3?V>Mp(W5$@HEM)w)O{A$nKZ`KZa7L zc;H$LHM8t>=U3>zrx-^P{ru) zPA?Ob%FC}xvaj9wruIlIHJ%zaAM|-D;7!Y2boEll5)l6jO@TcsvrsjfthayeRwPtQ<<4 zCh3-_xc6XyN2u=3`;bmoPaK`o{@mFH_wlB->x-s77H>~WW3S%#i^`<}aU%@5?L_CF zLpJJ`Z$dKbl!T+choWmX1S5hapw6Vuua*U;@OuaY0<0eX`YawlkB9FXO(iP{c>Y zoZk7uUD>8vJq$xS9Ap06i1sh{Jhor1SBK=jmk=tB@Ge_SlW8kdv0g927`T3P93U)G z2yuMR-S{>wTga5j2}FO4rZe7 z1Jtf$jBxE}KYSCivau+t{$a@!(+;%!;KbPxeGPSUuwqC?nW`L@#CTW%2Ia&QgR!#2 zgU1R%gIdQexc6BS%*>US&piLI8p-qrFL_xeOZy+%sstnkr#9}4!%DK=4~9qEZ&1IN zC~YPEf_UVu7NOkP>h?oioIjjf{s>JfsW)2mFJ-<9kCH1;q!1nUoSh9w(mR?vBsJl! zn|8hNHX%bn93u`PFYWbswDdk!B6vDn4ya;oY)Q2!eAAQqo3h@^^s&Q%oFmDEp7+%a zz8CrgVrS(MKcEmjpa8#tx_frC^gLu34ez40oXf~QpzZ1T^0D>ho7U##ue$W^b+@B> zGtS#PXWA*IyF66V>4x6Z5isi*Bve4E<12B*`y_LHUm&+*j)56RT!>RaLTbv$`jaly zyE(fCoVrJ&6l^X?b8!MpRNJ`PM@z4- z`mF=coKN(Y0oE$5?4M3^Dvt={oY#r~RKG^bb8g~WC!dXhNK1E+{Pfo6-#tZ9R7q;Y zJ^BoTrFKmh)=Mo*V|&OCN#c%12}{&ww)>I1@?*WX9anFXEj6>_+$&|_$M`E1;{O2V zKpDTEbt*8Mua9N-#*LSnj@{7Ta(3(wWB;ZQ1K_v||0<{Wd3tU>0OjIJi zWedflr@Pyi8#=*g5WBI4oT)NhdYO9$f1JzJNys}cR-ONt&Kmd zP+uyrG`q~U+xM`NYY+%oycX#tyw;>Pr7;-p=lSnE#i7M{e)3&A_?w50@riHF@dw;R z{K{wf#@9d2FaDR$@XNpQD1ZN@8JM?g zVtx^~xWW1id*M?nYh7Tl8%=KT^*V{jb#`dK&}4a2sIj@Uxnx-EjP#H#uhA1ySh#$V z#DNI4r740tcapz!l2;}*Zhg;oUi!PgLKSGW{Y`_K5?F@sTaE7ASzeK+ImyN<&#i`ua;U<#(L>X^iXnJ z2=nVq;B{I!TAg~+OLI0&0TBHnX5HlV=_UNT#~2z;5$NxwGi=Wv3U+T;wS`3nTsHo2 ziY49Q0i{iuEh&}JLX9b_%0R4-wd#4AjWt3Oeat^GjqA!Xo+JCvhhTiJ!ONFVGQ8)u ztM+*;5@1~JBk4Y|v*4c%mw+4F}O<>vumZy^L8e0ZxLlzZVjyNWlOX zk3L7B;wL`TPq|WJ_Tm*r-*pScGnc3>EHZvzFZFVTgLmEfhW#6mEtYhTlZ*t?Gs~z0 zJ@^NrEF8PUmhHm~hP|kM1%D#IlJ22Yt}xSRz?mtI+_jUx{f(dDZ@=;|UwZsBKmLw= zJpJfX{MBzhz-PYp9H*atm;?9!CQ8o{^46mqI3V(^|NCj)^NYWX;g9j-p=lo09SV82 zR!8u8Y0xB~i6Dk}wot+?`)KJlA)!gqwAqo2vD6lrs##ZgXq$yyYJ#^54F3|#*UhVj z2VdK#(Wz2&O!i4EuU~^5O~}o*BKb)!oZ!VsjNS`pi8MD7*8PIP$#48G7HTaHjTSKi z_wmi=9^tz$IbB2l_uI2Fd#=B+8%O}s$Sjlx0 zrlKMSV3#yANR2Nr3@#7A7X;quJ176ZKgQO}kIkSMJ;+0HwN&yHz9*bWTnsx5$voxe{0B zGN@IJ@$n%lfOPQ^ub*$wtEvS0dwKsaKghFRc!qSoxW4@wL61axz-efScpSIAXt}9} zRqAbl^hyy;ucCWGXt`w~asY1J&g#W!@|K_2{1ucnANxio@DC@sxL|W=ub(TAy~v#J zJRiJw3%~NAALUb@{v0sEQ?IBTnIt& z61w(pn-Yzit&^PGoTRLZPKT%LlL+(17W2(H2XKI)(}R+{`d=hHD(TsI-j+Io)Li2q zzCOc`-Py;;?R%Jg`6bRC%kr~#CpbN4^3*pU;gv~^_kH*vAN$CSy!5%JDHt0UXh3z7 za|=*vAcOshB@uU(jAC6guMcD}Sb;B~yvSOj7)7}RfT9Z!oer)}ch}}FFZ|biE#PEL zC0Xcpc6J(#T)IiB8RRRcpCS@bFiT|u@gWr78RsCDjV?IkB$Yr=rMga9x@lq?t@$ft zi+TDRH4H@|7^qS58oWL`&!rFj5w3n`iD)xx?7Qz~0BSW2RaGcjZX%u*gJBhaB0%-T z4D*-fiS;I^SZgH1ju39d(?Z@7r@D~iA|7^yBKUBUlM3*Ae?G;d|MRza_QZ>vJX7J( zul^zT-nE@ZE=?l`CzhUMcs$Dd>r>qNi@(gtryr(weZMZh_*sUw?cl)uzsc-le?a2k z&j2#xfi}}sC*RRf+yu1saKmhHS2WC0Ti_LU3#tw{gk%{xu;E4)tn0^=cB9F#$D}N& z-B9Ct;IP@UrbOU60HHUGt3YC>HwNAq7n=F*-#Yq`07nk)W?HXO`sQ(d`&Zw?Yu|c~ zuu$Zc7gsoZ``dZ)`%iNAb%jJ~aALB^kSf4Hltws!0GvO!ihj~* z%u1yKG!+qVSSC|-Dhn>3ggfFzkevl36zXWja+jhFaOK1Wlt>6u5usip4~SNn>f#D! z-9+?@q;`z6eQOG^Krb^COW5S=AWFzL?-t@i{RGZlWNl^+a6;5}SfRF_WM9MqiAbeL z#06A}EVTt(h**Irxy3b%vccNiIqn&JfP`OQy0Fal8yy9-Ryj|zu|~#H>8HWeLWUt< zFQ?i8>StGI-*|=7i!1cD{5-szW&9Qh;ip(Hk&3;scc;{J!cl#FJvuurziG2pXPv(l zP;>#}DnNLPzg=qq)98YNq1)Xz+$?_5s%lOW6387Iq1S4Y3`uB{HC&M>c4Mu(ZL_h4 z+$S>O4p2*1XySCJ4K2e9CWIn>j4i#i8XA^nk(e0b^pmeKv3&w{AlgNBemNo%SFE5}dBF40VqRuAvf{F!g?W54vH)bn59<;PEu7+t|1Rv73x!g5LEN1Ih1 zYv>%7QY`xl=s?J*p(7Ajr?T_~15l|lwVtB@r|Pk*+~hsCzKuUW_u^Zgi+Ie>lJ0!} z9?<~9Am(?_{aUc-coCbelXJM%gXjQ5#24gJsnYc#Qns_-w?wz{=|}#Gkw6G@@e=Mx zl*hhv3BT&)Z@={t13eMWOjg*kJHg9OT;Utv`Y6X9`6BZ<7}_4^)X7x@El0@CQCQE$ zM-`Ew?QtqsviSR*b0tX|z+kC>Z_% z@>40)QGqMR&T#U%S2=RmC=dVh|KO|t_-S^IdwBNc1~EnB?CS_3H%TEB9u0n@4*Do}g2yfxJ{6beB@_L>`XFAogef9fo4lA;?I$IN|H-N)$2jl#D zeTv`hy^&i(ZLHxaPdt~VCkUq&+f2^osAx8mb2YY(sJwh3&(FOx&J$lhgPzWFNs~Es za+;_ja&SDtT-{=qt>FzioW#5hg` zF0be4*($Rzx1QvbT=ZnBWOK_r`?;eCs)!T|B95d`!$I~d7K@vlw0hC;J~X{bK9?be z0|sHEfoqerW27o`-rb@{P^rr;CRCLx4ILCer6Y;c=Wdm=fz+lq3%ZmNuR8Ke+7B%2yPr%Ei zrJ8dQ#S;XD27bYS^~qh|e0qhazWE3A9@)(we{PZo_ldl8QD^&zLS9q&+#f&0@BFWK z6HFy|^>mp72j*Ftn`U5SoY`Yj+?PDetz*vJuu~cE8Z`)jza1mH-uc?`C^{gKT@N=l z^BwF)lc>jJea;zA~?^Re0)@Lk0fL-@Svs_`m1)?sJRW zzg3|Y2=NQ!GNLa+*i+=ujF;~|GtK@3DYkkHR&!NGf&qF{Db`kNHnxqkO6H?8t^0q&sP^~z*FmS*k6$sEcw+KBObnM3k7tJU09+O_pwxp&<-p3ER9_|9Kp|? zNQ`IK%ddk;mAO)tTD3{U11qOzDXipp$Gux18i8_={Ub^IMU9;1J%>jh~B67gKD)%7xyxi&cvgFpeULG^%7s=KkCOLQi%?i_- zY1o}GNQq8@iIqwzvDb$;@iEwArx%$>C1?YW(RxhujE;aekuieL)7w0H6W%l=Y36x3{f&o%-A7FFz#RbO3qc9NVkH37j zTd4@y5Dv=_Z~(tq(($fyDD*(68)kGEkl-XO<%ynduEGYAaUZ!xjas?HFre-l<7r&2apjjM!)cC*?rnJZLjwn8i~HF>+c#S;~o$a;v8ZmqG_u0R3q z9*?mqtP|~Gy)3&m?lUXAU07zO9i|!%LC(2B8@f%{G$_gP58bSFz4iaEu3{V-8s*i6 zS$_TQd+ejrvqB-`B$X;9C)7Bc+QRYW8A7pMLX84z?TS+a4l1lvsubO=Ej4(vDpH}BzX_uR(R7mI9W*v|Q8uir`D`Jh#wnxb zh_(ba_O~Na+hf$bxrfc*0Ce*ZS##YT_etHD^jeVUSWD`ZHy!UGBZvqMlZE`#_`?b_ zUpPbHt{Yie$}^>VxN9KHaL7ewCC85)^mFffcknxZ_zJuFf;{@jc@Erph-l^%>>j`< zRB2YK6oLWf>K5+aAm=k0&5}+cEaUGDP`^%sHQMj|-Ia)gW_FX8*P6XtMb|c}1$7+W zgiVzxUyg)jpls=ui!Nk_;)0Tw`!mpqy(9XNQ}Oq zkJZ`?eSHC5SY5zx1_+N25xwg+vNOx*-UQDSF0;iKL8Jt6sS64#qD`MqC0sA!t!KGZ zYNOR8TxisQWGq6hrlHj&f&mG$ZbDxYy{Yl3|Nb=sLve=u0^{RDJoVjINw3v7bmtZx zf9lFr)F0o^6JI~WLti}s zIMbcZom%1MdnTyO&oMn$;L@B%v$#Uiw;$>i3?<6fY6Z~1*Ny-t(WXdYz1N}BJ=qB- zgm#3iUE_h&1m9kDG(S6`MaN=(5sWuhCIp|1-O#%pLTu$!G+1hr#T{D=0v1HcJgB@#Oc)r~@0H-zh=GdIe^$Lq>h`zF7z8 zwRYT+n3;TvTX)~fT;@5-k9~#v-#x;Kr&ow=O`#NvWG*_M*FcZ+xs!7>0;-$)fAnS^ z{pxeXwmKomkKGhQiiP;8-}ySJRDeuX$6nn4>5$D;RP2roghU$t5baEk;-r&U-b|Y6 zJWr(pNO2znfejtXO0|f%{#})IQP&P&D2m9`)5l5fonUYxfvN_b20mGFv`%Xk7E4VA z!(IkP!l>#{_kBNjSaCpPYl`&DJYk@^++>kOGLdN-)~+xf-odJ1^5d;GKfOK9e5nmFXcY|pwr0>ugef*_ z2&Rt?A*NeExDF4(wu-c@=5>|pH=75*yv~N5znNC^y8YztsLFr(#^0&Pl9P{E-w{#Q zDd;-Uc$jiSCjv}8>vYP^7$V!ow=whF6wRIhJ0950!q?AHacOu0b^&8CuTpcTt3_lF?r zBM}c%tT$+AFfcJhWifjdC0F(;1mixWs2kY~v2}lnMoq(*S>y1XVG2zbQE!`FeFdl% zIQdGR-}t%rbMpKPW^Dxz4f2orK)Q zR}F@DJG_uo+{fSiqca=g$oez_J6j>qvyoF67TN@RywpM)-$4zm&k?OQsn<=47G&0{ zKowDu-$0fE2V4gBj$+nL%({t^GVrMi`8AthAcCSA*o8Vd96EI{zM-d)+>*k~mAJ58 z5(TH?pvVC6W7^Bj#o9Zf?ictIV4l zq10+$itjx(1>~vshB50UMBVW!4Sx9i!&U2j{Sm+|RfRWf_-3XzHx16w4UnB3-5rV% zXty1p&~*+CjZ$%G7+M)MGshiw9Y!%sc=a;Dfl$J~Pcj zkI!)6mR;O^M;{N~QYW+gG`Ug(wReK&UrRH*Gr_NZco5(EMSlE5nfcY%NzWCT%6qA$ zD`d`=Fzc(`&+9DeCAZH1IQ1=_S#~rtbNM>^*OQn%f=bk5a;JX-9AuwFRaCFa8@P?@ zGaloXbD?zRU~c|wIl58v?|=jF23j>ZAQABeX_fOVYR>W9b;BsT67cd9j&$10iixEL z*l}wg1w$a9y7`@7_#gq*&7XYo$2oU&nwe>blKuL{0{eTs45@D1y+Ih*m^!^wHaT^2 zl~X5InVKrFx>`lgI>3+!$oOg-+LfXr6YNVmB}PRiePxwcZ-Q8Fg7j*g*()2>3wu*5 zbSf&6O!-Ns{KUP0;z#t0q_3fje9&XsSkGQ3iY!o=; za`B$iNBMtu_w#=gABReHE*TOd!g`fy$ho=v*0IZkQ-N;RrnM>Ld^2#6y&IFYOsn|@ zaM*0ZZ~pH4KQ6bXuyE6AttU6uA6-V3wp#>wCtvxqzabuVK3q{eycX&Q%Lb1?rd-Al zH=-3OBx6)6{EuILkmsH`PAp=xFV)Y&i5aBZ4&r|PECZDi^+b|zT_;?q(`b}Q-F_4H zYp>EQ=(vZI)L%MDEEGXsSw)ygVJ@XVKGO<`dbA1%CIg=WhpeP)V!p@v{ZoqIWPwtypDcX_dv-FS2re zhN%m47}W*?6Jhq=v5$t;;!9sYgS*+{AHK0h%2VNa97i|23O-u6A79`s17mzA|?%eOS9Wre8)dEo@0f91h{SIE!R>7;R-)yprb7J-6`qGnbety1CkCvWHvV{m zX1(Hg9RVNpT#oro!y`DU3)Q_i#Tg-NbA* zDYYz?%_jA_fxVI=9P+bw`!+5eKTE*xN8UY3?&)JhW>$$73-|^?j6e1|A5N9&AKrn# zm}A^6Q(irezkdf(&`YT9lwaq(9{%{m1+1D)OEYL75DK?pHH)EHU|HbtIFG>I+zK=| zZvOXw^yhF_UUb&?rZwMc*|b_Vg4Muq4dZd;Ot`w~4Z&)>VTh+M;=w5tt(z=4Uc@F( zqGQ>7nuK5A&mQ_NnYztrBubG2fAD+n;1gf}Cc*tS6Ap#)a2TBKk#SO`)wA41}D6SI^`) zvy#JCJ4ab?T-aavpTEj&!-sis{uO@i4D`j1 zsp;L8?v-qn^z;%^EXdAV4|3(i1&SpJ+1nr(_mQ4nB0ast&RY*+tcwqCIp}~#C+QgL zb%<24r2>^|5wmWhX(p;>P$|?|di5OgL=Q@TAE(aEBBtU9g$9|geII44mrB9Hr+}S` z;y*Z!Qftz;&6)OnVPy%q&|rGzEH}RA5Vb;$ca5uT9qwT&7$C7zWu*<-=}YwBOcUR` z<3?74Ba8!K{W#0E#Fyu6%K0_);(Bvrz(={FVfrLK(4U|f(0Tg!di6%X253V;u4kQf z-!Z8w;4$6R?mw^HxMS{XhWB`zke*~-k*CrIS0)N2)LNeLlqae4YO~wSj7=$VSWBwLqcO@?6MQ7}z_?(wSN0J_WOGvh&u1OkJAd%83iz8wEgR&cMu-5d9(* z%b;D;PzR#;iIUD25v$JKR|JA_AHhI`%3~pwNtkr7hiD6vn2K9WAWGm85NCH%s*I297nCR_sPNcJQP&QD; zdb^$k;DAO`qunqlT$<-ce(RU)iziPA!y^+s`RL1x_4_ES7>xF=m$TMtBzsljEgM=k zTO%%~`>;R2cb{8ibRbO9tMl03{WEs8%m;6eGM|IE+=L#PgEuBvNN;#u-@Rz_6D5t+ zT!X>!VJ8#a4}(n!nmRipJuEhsd9{7@EVEaPRb-#{>OKkMjpfMA)>-6l1`eCOh&M}Q zcK+T0h7M44>{2Mm-~Q(R;L<04f!O#qP98l^R1(OvR1WpaJoDMdn6A5_UM8Tr2`U0l ze(giFgCeV|Mz@4n0H|4xHXogH>s;(nMI_oEKn)0l2IJVJD)qXF5(yEE`!MS!hA%*< z?WI_%Kn&XJAZltl^G7GS))M_Omd?x~8AVp-3{oS#j1DNw0+q!qT5*+1B!r@f4Bfb$ z-mwwdt>peq?A4N5oKq6~9U7ka62dt8@2&G?alC`W-JAj`M{y$QOA%^hxP(orGRI6^;_H&n>MLczpreNa>IvL)Z zMihQz$6o&F(lo0TH}jP;q_42_JkAT(*ur;#T5D3>*Q11e^%MmP~?wpOGn zw2?)LjBU`WHE{QYDQ62Tl^YC(11uCu=(RegAdpGd@Jh~suoQ`=(ZuT#@aj7LWDjc4 zOKv{H)XbFozW2P#{^moEx^KLF2d_PM5hW5Ly;`7dyD6ostgY3UN!OXL8(hpa**1}& zxtM1lD)5D;7rFV)ZQS_22Z(M>@xr%G5s8He`P(!zMHV$bxtT1vh8urS!mArR`<=7w z+!?3nRarQ74z&-)hj(yVvM3iTR6I5{BwV&r$qBk`3?)j#F!6{2Ey<6|HoMcTQ~~O? zvzXoMc_6p=#_Dw^f3VryqKCF=UA6u7w!0P>d~JugrAZWyXsi!88l_=a6t67e#)Zo#VOHwcH50ifK-=BM8&IicixkUccHb~W({MBS z$}~e;hshVp*pi?6LK(U+KsB8w=#eN19)=Pz1lb2I zCn4$WiQ|%G6j35N*vI|@`|yv1$$8MoUEE#4vF@fOg zrEb@*=Kg3zyjHuKUeq8>0xn@v(b9E-M*a6|;*VS3PgG zXvc1O13F-Cdw+>KYBV z7b{;yOa^IWi&V>b@)!hn4>EdFKb4Y2z1+aHmLa-*6uYJ)HZ4Y@2`aTJX01j`bki=? zsG1g0MZ~l%GU*y|*-Lt{%+6$lai077 zQ|=qyv6C0SbsU#ZqLC?J*UYODWXf<1!RIC3*TZbVV6j+ZF5|eIKmXnvx$VfU_`Md2 zSmW4t&+z!UCLes?7)PI3v^1)14-LblNA=^EB#jI6=^revDySlENuX`C(5x1xUti$4$B%R2JG~NUz8zOb&FwcGZE66T^f^L)Ay92c+My63m5hdy&k%+7! zhW#`L1zhLy6px>0ZFZi%dKHy6Pfg``wNc=Szxh5-oto#_Q)gL7=SXCyiTi7~YD+9E zE%Jp%mfu~O=b~H08w_D**I21H@r=j0E8yqy#Y?!X20wfAUH0qQHMf?_U}zS9_1o{~ zrKe8ObZszj_mAYA#Qw1eVR&cNnJ+ZaXotzUWP#}#wA3kI%c>kZGZ2N17? z`cX_1O;A|QyZQXHPauc`Wa<@=T#N*V@yiB&$-|a|H}Z|+r+9lZ!iAiU$K$5jcH?u4 zwAvx& zSeP%eYcS5#r77Z~fJZaQO)W9f7hvy}2+^T_3WAe_sV=VIj|MSYHd9BZu^Prz7nV2V z$GbI7-&l&>Hw-yc*p|Uy(8EN32!BMz<#O@)Z=A*_W!blPjMVrTcR#qDs8`_S7iaJX zB~Cnjj!-IqKPYkNjuF0nvdCzUNIb0Y^i!AFe$yzU{XTqwQ8Jh;wOx1xkzB1Lw8Y{)^)+b z?Nd>V_18*11R=}CXQ=CbIyN#wBD2j;b2CYyfe{P;iCXb~zsTXPlqX9&}h&L7{Grxw^YO}Cf zqR(w{M@md!JF^b|$2fyc60dg&aQV;5O?=``uH(_H!Tb4-5cWopF=o~WOk zZjgy3unufT%QR_+qC^tCWMhN0u{e8visu*8{Qa(de7@G?l+~iqY-7kiDs`RuN|sPi z!B-ThR11_`fU59RVZr_HhWFcpeJ*!lxxwS#KTb=LG3<@wwYQW;ZRuBe5U%{utJeFq zkG5-k9U$CmZ#dvr9sKJ6#N|LQt@WmuGA;DB$WpmXkIzpi2!7chThmEyA7O{0Yv@!>8TxV$25*@G#%Xqz@opGx8OJ;Z_`a*OlSqCQ+&lXf(SH|QtQ z7SRJ9Tsw{A8A1vBmUD=LjTY6c$!7bc4NjOgIz2`uizbZX`*>%vAAu6;_s3 z!L;%Cy;pe*sU5=%Y#AYhYDF?7gS+?nSXrwP^BLT5aDWFtct1yQ>iF0LNocWQFs^S!_}10t9U23ARWQ1>5d=2%Sg4v?$3ElWvQg+eWPG zZ}1Y}jh;eFx<25vO#|KUN0UVUT|339p5bkpi=krD;$1&|4=2BS9JeIk^0}#($_Sg=g`-ppMOZ8H_VGSWFHE{$n9N{kCT-C}wP_OYis)4xmnd*obrIXJ zFj_8r$td^!=uhFwAAQSpZ@b3-^}QH>`17~(U;q9ET8d1y>BP(ZnNf3UgrEfDBfUg?K^DLB1f`d*P*}>adj1NQ8pmrjF;_Q; zE*I7-6P?!Ij&)`ZX~lB4dB-l)No*aZXt^ng0-j=xPMW5@2^8d>07@jpz^FsZmDb1X z*`+GgaG38tw@Bgf8Asu$q;vT25R;2Vb|n;=C7r+d>krXr6!^(|-p@df%;}fr7~3<# z*s{sYbb(M@;7|VR0e=2>Uf~aa?{;2(`~=D2D3fRBIC^H15333nvU%`0M5efSNok5uSMXHMR|j+#G@{uRMj?FR(PL5*C~rPAcx> z{91)*e{j88)TE9xBSQ^%k;a_PQDbHeZEd5AcOWD}NbE8!H&-#h0gB?}QkOy>>`S5* zH&oWUI+hWq8`Q{GNRAH>^hgkpoYLodgH{zNPAwpN9RRyDxys?6eA42D&f+5)9E_{$sDt=TsWwK>4UWHo|+A%j1npsi1~e^($t z-R~tQxIuMud|o3IRG2E}xogWXvo(#EFD!K5udTYN)!QITRCR;Bqr;q;-JtY$%+oIX zz~PQ&Q+GTFzj2AS=glvY>v<6Wux8LST(m_GifJOrUYfQ=)3*4DiBakeiIp;Pz&MGJhPv9n#pgzLSZrog);6!1rTvHN{AJUK){E- zj>>}1iyIdnzqfn$mwN*AguIA-32b*8X(-9A?Qxp6imm#n)ii{)GHN`C;fBK83i>+Q z10?rO&=Ygo!qs??%vzC#4Vkjd-1!v@*||%N4TsUK7AMcHfo8Fq*ZJE2xtpi{`8mG+ z-39g!x_Itv1yl0z%IPdIy+NZbP&8fi)RypuV|@SX=ds)##NNcd=``!ewQE zk}T1*Od4)am$0PB3e%>O@$V!g@kf!}P;IohkTxi2=2b)~jW%`LO=G3P)R|@07W23wQMTPW&fu;IdbbUd zZi$qtCN&U9Z%p^9MPDL#~_FvEWJszFAg3@kk;c7(VH3`k4QKX!O#sV znF86xRpNWcm>7fouzY5kwpSvxcL#lYx8Uv#BaJ4AMuKQslUO*2 zHx$4d3eX>QgI=RBvq+=m!l>40c%bAGaQQ=&CJqyr zUcuC|474on+CEMuTclm8Qn748o;F281&@!$Iw;+|V>b)yic@RZ0&btgp~?!jVIc|7 z4g`4HkA4u>$}?}d?v2*)8$Ag3dcCz{4coqE3L}JNoAgSPX4p@wSSKP2xHX-YBGZ!; z`R3XJM|KXOCi+>@i_94&5zD6N5g0qTlZaO(ckwc(zWgQH)h0f#n^r@^=Tiu*$HXnS zL{$NM{YF=IHIcnamp-jTLg?!yOJz9Ltt$upB0;5xof8S3ef$`=e)I#>%N2Tu2B|G9 zvT*DY#Zm>?t8_hx-&+0{9edjjm*o#N&`iT!;czIn_E$ud>v zj`iz*bCy5<*g<~vzI*XT`dE12KX87fL886k!fzc>S#n1>I9%oRiyks7O?J;0sH|p4 zj&0}6#bXG!9R@p3NbytF>Q`|ZI@a+VI@7c_TgMZKw*+$TA5JxBvsVEQ7_>HNZFGLW z_U|2AmSa$MYUk%yniR`TCg*BYv^LuWo5`~U;%b}B;}^*!M>!C8@#t5dV@P$gbws6L z2+Y+j3R8uv-Zx}JAzMYqDRp8yIvwfhrLKn%**d_$Xn&W>usXL!wPm0KgFksU#%ht3 zQ&(tuyto#Zo$~fd&H)LWCasPVwx*dRx1`7{=aIb%7r*lo7je|Z2uM`dbrwXw$gbTf z5)%oE3yY{jgJ|nvQP1tWh#XfrfAl0fca0%iWfVE!bcK#MjbF(zN5%kPzA#7JP{;t zxcuTI^{U47ldocxs+|7vQ!JgFqEWBo#^rGLqXCCfo3FBb;v#Do7bwrJ(WuvHR_myV z7~^}lu|MXbQmS+OY?f!wq-lFxsH#LV=0jB_E?mg6yijFeAj0hAEVtg7z$`R5zgnm6 za^sa;+_W=6=Hd(<%jD*JZs5#?RkD*gq658TG>bhq?j-H;Q5Rj*-2$@ccoLgw&k2{+ z^%@GcO~dUWr1)uCCLzU-uk9oueQkI5dAudiaJ6|eyViqni4two!0l6UiPBZz&$i+xTjbq-fw|X?v7BiVr%5CrG5t!KcfMnc14nu}`Er&z9&EeK$Z(YNt935VH)vXI zR&q^j-QbR44<)aULScj7(kX#Pm5thbxW`Z3*hoY+t97!AtE`-#A-9&puXu>}^%C&= zS)E;>QK^yKHcaB~y#zu5%JWXnNw+N&*^4hM<8H5a1p|$MOw{M4*)RzwBGii&w2Dr8 zW|7KrhDy4GR?*33Y6N?{C?1=bAmURa$PJTK>E8C{If%DJ z7NFP>rDzx+3#g$m5uZxK>mco%2_NX$!uOv12EDk@bqiVcP?(+M!@vEry!z$G$<41~ zOA$h9k#fyNx#l9=@?Z`2;wjdsX0muA5duwie8 z_U>4phE*<7%{SP8?{+@IkaHT-_q(ckY7o(*C{^EOo!X1bHD-XVR7yW|4yMtbGmPlq(NqTdxp`#?7+eCg!*d_@{A_L^y zHu2WRi#wjgo8A4dI^UbN*$fERg2QH8c5CQ?tqiv-oGCSk%T503%d?y}JpA_C##lai znooT8LH^*Qk0NZ1@>k!UXIHO>{vPov#^h9?%G6Ybs3LYnYdg02_b8B9*Nf=n9Kgvn zv>OKLE2~s;4TLSd#0Ptc_*6&Iz9sR*L*FAgK7i(3*MeAoU(qiTQGCuM5X}O=pJ3d% z29o0g6jpLwg{o*@yz6}~O_kVpI64@{bk_Nst@o}6@m6-N2cak)Ua=$W+dfX#(2(10 zMiK_1yNa)E@=I^KnRYl#rd4NhagLxZk*S-6Et|R}GC6aO(YNj3fm;r7bS;BXXcF+N zNU}^Z1hOrll`F`y7g_dFlSG1U4}!}^@%bsPkMlEYI>7-)LM}AgN8+YlgxAyLDmp>a zO+8z~vMoH42Wh;I9XD>LRyPoQGL^+FjYJgH<0iUmgjTyv?@%9so+tfH6?x3ZW{vo)dOQe(Jib1o3WZ3U@$n#iKm^(5k! z&QjY&!QKcRLW-ZdTfpCLQFjYnenR);`r{~uPTgvD^9XNd9j~F)sNoW&uJ_P+zS$Zs zllNN@##<7PVe_-W45yyGNVGRdR4>y~Lww)^2igDNuMm*-&R|cthUM4 zT4*JW9lLt?+LJSsDhAskBDWqH;LKF9%X{c>A3CO4EowD`-d>f#ElE7_2nb$mce|TQ z(u!qTHI34l8PZepOg{1=vo9V;RAjVjgV@$V8Xi}7l0&`H#BG}R!vPe@@mAc?0Ir&b z=oe9A0lcyd9udoG5eWDYMFG(-($rj3N;+f7AgQD?jM}$*khUlium#!;om2A#dcp#! zsMFNdACKbq1zBnf1lK*gVlaZz)M+J>tS(mRZ5Qz8SJ-mPI8Cidp*ZpomlMSz zvR9;$Eg-jAhyj&L%WIsNT4TTyq2g(fE^IVqwHgMYh@bt1#jXb-Mx)&M-uKd2eG$?9 z=F>Nu?rr~ifOx%clxDSz+-`HEFNNl=^S$5yZ_G`v^0~8@*?0IbXC_xE08k{sAvye;)~}f!Xq7RBO0&3$v+HS7_hp&nz(15Ej(T?FPy7#!`>j?+5)quml;2> zhyAx~1Wx8|YdaZa=>N)%h|ZUFs20>3x`PFb@94D%k|01gS;#Mi8$ z2a;&(tkMn$yxC)Cn+_mc3k)6WY5SSfR{2~c$fc&6qT0_pe2+49L8nJ-aN|4f<*|Q$ zo-GqD{^x)GGvBZM%0ZSI0#l0>!a|#uzj80{e9sPk>?ejKM2|_nP+yRS1L1T3;kIypLb=Ot~M&c-eII&a@Be(2AO+*m`e(HrXj0_P} zBt%8V(wle%H~w${J?clcExbM_G|fycVAl=Yrb%tJMC^{eWLFC$gApuwofi}GBlu)m z4ILpAq}j5G4)t*P(gLI7DW?1SJ=~v2jk#&N6c32<1!; zI}}FuD%8sr>`)jn?8oC(&<931608!fRk-=a-Q>27bFpo5C8skY_-W-c9E$DY#M~_L zMxB8j6I_{EVok4+O`B|uC&|=n>*r8Fuj*HY7#)Bx*N*;RfcX87-um&jc@B@@yY5B} z+eS#;_XdEtm>8i{Ytj>oGByyUtQC0Z`KKwyWJ*4TT{pj*)5o5|&Kr0UnJSh55G)H5 z0jXspxxM69YFt{HrWNt>_WR$5dn|-&{{X(5#@V)a2d?oE;(NBC^|{f8`w1Ny!gpvd z@`ZWa(E!O<1beU_f7x_0z_N_Fn5AMF)bmw5!_IW(=wKhk^K*oQHm^N@5iu1fdHY^g z8a2eGMJN`<8&v7tIZjAc7}=koVS6x}8m1c**~@Uq&DOnx9NafSu~_CS|L`hT=8CMX z)vy`{@4t5hy(%);@27Vp!qZPoqj*}lY=gRHP_DOd<;xUp59MZy`fQrrhex^Z!Clyk zej<0@#@lp>({7QP*&<+juL6nAqby24&~w<@RtX9!X^)GB%e-pwUoW@tX5PYeuL+ll zDu($^rosPepWwpO6g~M2nG18|+A5+f^Z4^KeCIpo`O4qk$H#y78H(jP*;)(P4NpG5 zgpf^h)4P6+kNnzaxxA!PT`WRCCbLwgRx?<(Tts_=^z;YuO9G{uL1Y~)IzUmY8O)tt zq#cjbh|6Tw3S_fIf$>v+ug?F5eY^E6iXFaVTGVi!R1$Ix13|=kA`rY zCdE<(v)Z6Mzsl(DajLZjfp`d`(IgNL;q}S%jHGba45X-vnW+*T>S1o)0fdGJ3L!6n zRGj%&&*BTIcvK$?rioIi5sD{x{>h^py6-kjR|`Rwki!84S)vw~u%ilwPoTMPJI6K{mjMlZm&n^5~WXmrk>Fe3+`=%ktC}^lFR3HN!gu%L3gbh>NOW<1wKw%1o74 zSUh=_!on(csl;kNjUnk210GzF5dGsRZawe;PCxW{!h(<3@BrzRHN2@9i9()cAWU_6 z4P+6oPi84sXXMZ}`o>0>K6!?Pb5o?JvS8YTZrh0|i6~`_=30*A$Pkk3#mHnBAL^kn zv&hOq4rwGp&pPzmU&(9#JBE2z(wA0(Ga_qGgUYyKxX#Wn} zrA6-fzyWe4FQ53-8Sc7mh-XgZSg5%9yMm&KLU9)V^%9Ri3@~)8r|mfCb3UCT zO_7@xA7Z%{$M2~l32myy3a?(M^Wv+&#*5#3od4^R>a%Oq>P{KZCCg|v9U)sm@W}){5~kmSC!*4Hxsh<=@rdLrIqLoZ zo`#M);Kf@rQR7Z0abSE9scqAUsmQH14Zn>SdexyNX9R4aWO|`O{3mu;m%fQS4^~8lTZUh z!^Vq9$S32n9Dp#JbspH?&)m5a?&+3`5MHXAa#hy?#2pXbg^_=~>lid_`zmk3wlxfC zr{h6*tCu!FVg0cK6jH51#?G{eFrO9XTi*VbOlrHu=u*|e}NFK)Yu?6T?gyV<4= z@WoI3FVrhJVu=W=r!Ek>v5$n@qLR1SJ{;xp**UyEndOsHB>JORg(`C|o~Agth)Wbu zRF%WOay$8z3btY46+D=$MPkGKL@Gr>vcyYI9%EV8P=_utn{LOFu zg}ZE6^v3)cf`^XybS>MUp~@(3`1a!$7#Z(Jc3W)U8{?OM<3l|Ex$j^~KEkF>W-iNM zuNPM^NUKz3{Du_gE}BRon{rF$_KACWuCh!(6lnSbgv1cOI%uH)y)_S7C_vk6Ao%0m zN4Mldu2(3i3aS{!uIF$|KC-TQcTryp6#o)X*le9Dh98LwVuB-+51~pq7BfMX&ad+J zUwkh=^8P);0w!mWf?UZ#Lx|=5i8^;ePNdJsVgMz*h}QV1oK6MmDlGHB3`05?cvCe zypze}=dm*-@IiRX0G@`^qf;qWsnkpO!y$TN5vpqir-ZKCgm0f9|MDejYX$NPYZNRC zk0MgJJj2kvw-D)xp(Nv|qD)$_s0wYi_#!N*F8T&kZi+<+jE<4j%2Z~vEUgytv`t1I zILuOCn1&3+NQjDErckO=%$CvfRoo>Vx7DJYts^xJbloCi*`zHn8akR`;da4bz>V3g zvw!by9(npSXDTfceu0H-oq$*DdJ)$Hh*tV|7a*is6})nH-FE@v_kQu7k4wfZu4eP9 zAE5ha4S(Pb9z-EFMr<@hxhheqv@m=g*7O>qd&k+m`c$0=0;ZcetPC>;mqZ09p$-9$a1#NovzO5FzRA<+(3DMvq>=SSeA<6|sjC z?7CwoiK>UZCGh0mK0>2fBYk>`mSxj2Y|7a@fq)M@BGKLu%1Dw-Q77E;(6kLCS;i_< zi4FIY*G(>+zJlPBiS66Qt?#~{aI%NY*$d2{p5)bUK2LAV&z60I_&kstisAD>y=G7_ zEzFX}PrY|5x2qMJbBkP_sc`b~vrJuD#HZNwhFnOI5Mn4mMQbrJAaQ!tg~u>xnKq@F zRiuc{wuzniQFy1zV6E+?ZPsb}0|eV5f-F;YS-7S3p}*2bXy}%F-NoAhhYqQ!0~G&O z>v#_xtGX=ug4>z>>qi*e-ou4+C6e(buRM7Udoj(^FJ0!sYZ=s_m-M8*3y-;Id%LrN91Rr>!evC{7yJq5% zJS>0bbrP$d5VP3)M2%(5f}4&a6={)VTDu=UBdY1y8X~WY0LeZ`eml4ieoqjJw%D z-;%;w(wKeWDO53t+iKx0RVYr+vh@8+^i}KJap-nxjWi9z#4>HHN`sbecW3 z@8yPjZl{$#j#xL}u-;wGCLYU;#_kP(Xa_^Mn$7OxW@`<->kR<$wqJc8FTb#a5(tv1 zSMaL>J*rGakr^MJ;KbR>P%(%pH3kCxESF0gZ)jN#V0b*3UK39uf~AAIxKYw_i2}CA zU}EeD_%ZB&`azj-a@hxM7&(#Vjv=<0aCw^T-|rRcknR_Vs@LU`$1j1iU^G zcOpvg?lG(@c_fbqx$Qf8x~^{1 z_HUxN`H|l6)A1<&CDw46-S<7{PLgt|JkqZ5AyoI!&Y9A{J5zSvu2sjkVbleSHB$v&q7Anub><+7qF$u!=XJ zvTY)YI}{+hQXo2-#2*f!2r^Y!MQR!7*(!o6I{b*E=V)GBB7DOZT*E!A=JTBW+LM^8 zITTgJ7Cm^j_Mnzb1fT3AA=eLAtym@2n}C3fX19>;-G(t=$KBS^g#aE*T%tfA8N;$I z8dZ&{7mstflxOb6*SY-Cah7J*Sd(QcFCHg5vqn2tqqTmM4EPn=l8aiV#QDk;30>sI ziLI=tUh?@GqG?jKz-yRDO-D{nXtl7dHiBhQTBpeib{$_ZflY;?;KC?YnXZ%=>Gkvd zb1P2Ew@1KenjEUEAb3S=!y-J`!wvV`jx>Mzt(w3v@CI-Ix*vtLNn|m5cZQheubf)Frr_e-Dp!$ z1!Rw-PMr)0G$cP#&}Q4j2*%A$pG9-7h~)85a$C5H8nV$QFg{4o)g~lMTt0b`dZkIZ zSiv3f;)z6f+nyfoIJ^zpW#LsMd_4h9om^mgu}r{fQf)M`^d=s^mj!>6V71D}Klwqb z%ZoHDNc6=i<;pZ=g_~|jasGUf+inh0@C`71X_-Se^|3Tpq7Y87W2~R4ibh0=5|3^r z-ID0__-MP_B-$<#Z5OF}hPWp{b`uHehXIX_b-aszDM)PgAoiH>c9%u2UgDR=OT6&Z z6}+J+C(lpQsG7(_VV*o!VWnYl=dK`aRptCrm407~!M+fRUT0rQWO_yC=&5v9`=M-D zjP?c?9Esy=HYjQ>N1c2!i(63`80{w&7qIZ+^~rc?VX88&ra{ZH92#}Vhgofqf8r$7 z3p2zAd)fM{KhCZ1x{ImlY4n*DtezOca1c?qX&W|(5{MF&b_=)1O&}gZl_Ye%!Ql2$ zT0R9ybWy8=P_A_8+JMsvpem@TDE_t!PgF$;`C!`s&108nx@_ci+EL4Fp}1i%;-T&m zDJ-wC@|8!4&1>9z+dhh6fl953;TC8bEwEZ$fM|IDruw^OJT z5nGV0>6jijTYWJ!y@A&wu)p9aWN!ut_wq>q>V6gJIwkOiZ~MQzSxa4KHMSI)WW?Y% zK6DHJEmXH`}@_exau04okEoKW243OD{XSWLhN- zkKfFhZ#_p}u5Yp$84<|VbRu4bdejH2PTiVDvnyR+0RsLIs@luS&Ilu-Gd#6J zP!6{|EH7qZum=@bEY-Mheul~`ll1Ky#nm4o6bkSoyL!8yTPf6e^xJ2|mIe8WmD)nbmbZ`g!*o+i&_?8>E`su22Dx%JOJya^+4Vs= z$?*Zaqe%ks5Pkc$QQW_U$>%SkUzkQ2j-fTrE-y%0x#a7(ovd>dtt-^#(3swLtSw z3ioLpx2B`zGW6VXD|#e?T-cCu>&)dyuhvnU8pB6+u&Tvao0%i`iT_Q1EXs%9_MrX3 z{-$vLc$J3YN3LuT-3;9(s><}40xL?0Y^}yqSLWC;GE9bfvg<{GeFs9Edo~ZcL0Gma z=}yi^^j$3>>94;ziSCC6h-)VTSDPl2i!DY3iCsxQ=hJD1#^cz&B)P&#lv)!-l__)p zq9bm*{#dB#cmi$Yo!c==#W#H3_IKUIQU)4lXNkl%q|n{TbrElLTVmwSV z9^yxC*~Z-E3mkpoymQe4`wyfL!U0wbCh6%V_H2nWvMt4{&t2JI_*Hd2{l(L~@19}) zPuJX>GvbfmHF^Nh5z#TpW&zP`fG%d5L|Q?Tu>1x)mof7 z=`aF26SJP~#SdtlPuCeNH1G>h?}^bUH2Bh&KPPOdoBYbp|APIEXhBHN>BxC!7*5i& ze)C-y@bxuAR3{gS@4tb}+&pbLPN-PqThB~`%f+Fs+aUYO8&6=Z3F;3qIOi>`_U3ak z%5H(rzqZJ$Gc`tsdI6i1AhR+x1He0XNBQEjC1>M~^7Z;-RF$cq(Z6RG=bw1xs$pTa z*kG*Q;KWxR#kXe^R?1yq00@i>kXKYXmsFBGL;}={KBN@5TMmVF(9@#i50R~v>AUR) znp1V!>m$%qRpIgrXOSm*puH|cijQK;g||1-oeKWRe|VJosg>^JEtgNCR&BC1?BhbI z!v32^$u;5Zx6hIY$ZQ`_Id!s1Diz?pV*=-nPV?Z=KjtGJJji`Nc?+>u@+{A#$*kn~ z@89|-B8?1%{3Ht}|AwAECj_dOG)8xXSSuEB>uGwDBV@}OQx{%fYi!ezl9PnSO)Bji zq;pg=M~MRcp6%Qm(~;SWofzbEb)EQny+0+$(Dw0UyYZ$#(eWrYKfj)Lk%>xVm!0=W z8(#kTYYR-*-2^ffcHG*>?H_&{uRU>*AN%nw{PUNt@QL4l4?p!gUngq22n%hZ6H%t7 z3XJv!2o1)sdhaAQQqpmqN?w`ee1WAYM^tv_Sd3f~GRt`Y+z~JSNFS|YlZ)SZiF03Z zz@ptSi1x+tjwbN}{^1l0^Q-8qxvu)TII}|N?g{2Ewdvf3YKn^>5h|8JtJ=gJ@FHXz zOxJ2ym*+`@g7iOlC(ETAbC117+})f|m+im=VB8kY= zUV#=;AnV+mU!A9XIKT%L|MSr^x2h+;{&y zS8emfS5~fmQAZ|C4u14ODkslSS2yl1{)mDr5=9(~ zqXW{#OWpqsz3*He^?>2YT#yrp8{}Xr=xJ3 zPtQ5WPfxS3rqO7;1c1*MWoX+D#KgT$7_uIcd^D88wu-Es{S+-Z$!c(fiNIE-+Of9; zinn^+F}I%P{OKiTX3Ojt_w&yu>g*50BhRP#v+w>R@B8pU@~_T<%fn~>_A$m(5B)u! z?s$NDD$orlqKe4S_BcW~z^OtD3eNr~+&cYxM^XBn=~nqQn>a=2k5S1rpaI6NK}5NL zJL1I~iBLBMe3^nne43T$-PyyH#R4APX`44!b2R;7+{GffbBja=5-5QH3#YEow|@(@ zwH$7ou%q5|s$RLO#&pC(ba@4>;dmjDJNM$gyvUGOX028u)Ut_<$6219L|(A)?}^il zDF{O;)KHkp%jfYXoNG?i+Eg?!rwd4XdMTbY@fRydQ8&e=2DuDP^jI(IL`Wnrp3I zcXPb5M5w56*S+rsAl|5vTb)CXgcuvXjg{&=@%<^5wvRa{+!F@iV(mCRF<6|@QO6vN z3?veGD<$S$oThMTp0cY+?}05{AgDJtO~`H;^!4|0A%68$l@?CBxBT8DHVbLS97x`dIh5{M}@hsSBn z7YSqvtem#+9~r~*LIKxUFQv3|&NV~9y;wzh=O8P8^)#{G2%cgM&nB{9=Q?pMERlT2 zK3pvqmHAbM!*TqfAWOX(uGuWTVU@PJo|_8FsG%^0ibi-$!aI=vOn;OlnqZIEwj6OMw8+SLvsPuUG^JktGRR4xb^-876Xd=qV z6=xqZR)Jc*%{hIQ_is9vh3Lk(fU6>e>qHAzdk`IPc#E)NvjrvRz)4DoaG%J49AU|@ z_|g6zzPNae_pmAd5LIPr0Rwe>nEYH8HxRLGv~^I58IWGbmsh4w0q{U-f_Q3#vjHz@ ztHy<99t4ow>x;X!M$+BO$Y6xkr!JDZcL(*NhC0?yAgc1p-+UFL(853HWxyMz9u=VC zgc{Xc+3D%<%G7H$7FUl=x1rFgy!}U z?Gs5)J7OJ6Ws|9_#z(fLF!E&*w{GK){_uA=`NW@g!2z5*|59a|p=~?JmNi;2 zTQ?X8j&t($7Z^*qkQJGpzJ9VR%gmjf2EZSanLGOha-|0Gu#a5HabpJ}KKwD6vHcEs zlq=JCq8naHJ6q?cdLp#5RUYyfyoQ$#%0a%WS3vS{Q10VVW19OdKTmiz!ix?#{1E|u zpDJ5p0tIE3OLG!q<56}^NSvR7{_zpcKlU170q)zE;K|b&yr}@ClI|oWk1taT`RUu| zbkS~}xNT}WdQ&6OAEVfEVe3^|#U`y{lV`qulm~zM9ry>Ltj?`*_SgcEurp}cI5SJ~ z$L^%r8$m172zfCkQ_we+?Pa()2#$rL#U8B^_&r))WD6x$N=n?$r4FfL_^2vm5-oe~s zuQ4?23@}!;HZ{dXx>UyA(~I6Ph-w1Ckp!{*yEtRFFehhmH{7%|XFm%y9aS)p;$h5e zk&*3j<`#>L0zIJsTY}46sdxw(60Wum-XCr-^Y!eFA;z`d#1F8tWYFV_5C|%4iS_c# z@N$ac0}`7i4M$@!RxX}E-87Ndtw^|AMUq5FS2ixpZ!<-3V2}u2mW=Cb zXzq;k@bs&51P_i-FKYNB3bUC4oN*SD6m=t|VyF>;U?@gy#sQZOI9L&tctmCKl@oX) z5oXeh#0Qg9TZSVe2Dp0zgy!d|0n42k181|yUWHhz!PMyu;S;-N^0A-X%{}|Vcm{S- zTa+kQoPDX6Gy>KtvLe&)_Yq5u(8$Z+(O9ZX(#u<+=@5i%vGospqe?#*{8lh&tM<^u)^Bf9F0bSqPG{(pMrVVsYdz8o)7X7 zz-3PJRULjz-NyHqpX84squj1c^ASD4Z^d5 z3?Axd>1-AhKe2!pzceD>%!FzD++eT`nm-o#+1iyR?%57EdnW zomxOl#pxXzq0lyo`()ZcFh0nIGc(-&w!^&k*mJCT-IP|BsFX|ejc&olkwZ{J5MQfM z8c#6%&YO7UKmHX)zKTcjurR;M@K4@{t59Jah54;fw%u@F_u45oDokdIl%{jIOc~oU z5OvE5FTk07kt>1A#i@CdkT1?_SLS)w9e0wMo5x7!2&Ix#7v5TL_6ONp=OBPqvyJOb zHmMjoy9NVfRh!Z6V+_eX$i-I}N(E_`1ZJxx2N14P>J)-O1b-aYre1YhZ1AzeJ9+BL z9Obu=FR16|-k@?d(2`ks`3Z(c0w_ZXCeL1^T87aBd#Nlh5!;#QZtGqLhlr;|(Qc(%2nta2qLAz)Mg~y0WX2710t%{Mk*J$)OOLjW&nv+EHkU=U4fI$rMs1Lv%G8K z7ijLCXW?~6DAeb35_?;tH8Y=9{>&^cwYTd%eEyT4bB<%xNyP5GZ5JbZ#>uWM;}7?D_h+KN54WDC zB`1kZ901b+t+|@U2jw6yKK+Lr@ddH3JjZt{E4;SjLCz2K@RMeQdtG@x`PA3Z;!TcJ zpW}%NOt0#!tr`Rsflq&Nl4hmB?|keKCy$;7;QX-#@^udt%_gV_q~bon#>kh6ZB0SG zL@Fu*B8C(}@fy^_PKV{do*vZLC|lJbV2H_?1)3E3_E(=q8SAAl(F0+H)IgLJ&LHQN z%d>p#p|9aB)v3L9nbfVjsG4p9qK9U-NHrQ^I9H{P#rDwz1;2+TFfg$LA^8Hx68%eSs>^F!y0D5^%5mk~3E zW}ZF)={(^BgA^MT#PKM8-Nqg8(sDPM|KgL3{r=Ce?a;fZRL_HLGMQOLZy4B(CW6n4 zOElQr%fq_14 zlNxb=!WXMMK1<$-t=mD9sY^{p;%=udJ(uaan8kX7o$Gh1ir-CZW<&n2BU?8R5?KNo zIQa)V(fNLjlhhZT6FIVHoJ&_Uj*Q>L%hS^=oV~(Q@eE&HYjEY;mzbD{ z^7i*`hhh=gm0@VxA@b=t>eU*Nke5cIz=gbyIy{2U7iDCRLQ77v<3I#oOede7qi_2y zfRnARmo(!wiRAtOiGzoW0D2E9ZFIU<&j+k9_GU z^-zR+_Zd89`H5(=yzuH*So_Wj7Z3Wl^2#MX_~AYL?LU^0qB8fakKFU$w1c5NTR62+ z=AM0F3fVUQ@YQ3CjYoNKpUB1OIt4>;e$Hh$pV7J{%}Chnin6#PURIVW)E6%?eD5LJ z=WiM`3z!c-OOpD5FmQ&w-g-G%qYL7gD zrCHc|6{+FI7xjY@#|+0=d+9RPZ*Rd{s-O#A%%v5~J-g6-63v!Db1qFhmL%32VdjrM zNAb>+-1O`J0f1Jif}N{kYfZ`qv}KWyY0&bt(XH!G?2fJ{@!KUQE*}wL)+b|VWv+Lh z6=j9i>RXTG>zKo&EMEp;J?J-#jpsny2G_Q?@#v@jk=^$EjXzz{`DS;ntQ1a}W$D>B;g)3{qA9*>*0U{V1op*xU_3WiUnIXFO1 zD1b1KVrsF#*tT9IMWlG4##qcl%^$*FH8_3xBAVtx*w;s7JV~Qaqt$5QY6|2EMckqr zqpXp$G)kE=ZQXX{&7mt)QfanOA|V1+(-D&CQ;Cm+S-P;q&3pS8jqS#kEq2^|Gd?wp z-&^Nz{`~9w^S96Oe~)K*rKpp*_cr{W`%PS*f1GfmM$qr!mDksJ@eALkT&YtL$7zKI zIrrjO4s2K0HlCukHqYaao~N2$<=amj0(}HlO^%f8^F@Wmwy;1ZpC{s#k&P^7vr1A)kX~5EoSJ6;n8f*+^IV!K zV`d8Ynhlz@I{)-onmxlF{_>miynLmKRx*%OiQoBO&v5K)hATOfzx&z+jJ6xGX>e+) zL3kv|FMVV;x9@~+EqYj3tD!_fShm#_CiZwlRF8zE_y`QfVWmjX)M>BNl_T*OKE=c* zwTX!?<}*cXS)ytiTs|>N>E+Wz;wrOGyhbbG2X`od;8##BXeo}4W2-Mn zLuzvO$U&wSu3!fwaEYjG8?)`ArI{Gb7Sd=OWzP^zqk)jF5b=lbhWuEbHg3_4S8>yh z1&F-+2&LDr;N6=9mql_oNxN-Onl0jWxiQ){m9;c6NrG&RON(b2+`gNH6d|o;v9%_8 z(*{w%Ti4mr>!sYV(JYtK4Gj+AFsxFj>7+&!7K`QopS1rDbL70vyx|{m6;Q~j(YdF4 zdNOB*Lk@G6Oa&@gvSdrLWlNSN+p@Lmu=c*YujRFDImq7E+Lc#MYgv|L%Zju}k)oI- zlEXBClS9vRZZvWz097cUfbWk7D0I&ZDcaw;uD*aqC=?3MInRCWllbXfNeVUxt7}!X zoGSFrX5)_PB6{17X|&nCXBWw_1fI%iI&Hhqai@(=vrE_P>AbCj7TA9k7o(3PUI(h^ zN-=V^JX4aJ$EtNc6o*;a&3W2n+G5ZtAfS+@VGH?4woPiT2DVTXS6#;u2tc8Y>1yB! zr>tYAS_Yj+9KBd$#nvPsC)nm5!qf_UIyTAm5eL6`b`>_XLdbO1$rRR^Ie0q<91^BC zNv2)H)C$~GD3VrH>Lm?tw9Xy3-GY``<}VMOVeL+mi|(_|1>7EwKeHcZgA@IsDk;bZhJU z;_scdG7E?P{KH)L&f6&jQur7|q+(K&Y&1xXAkSaanQAU@{sN4K!@Mvb=7sqx5azmV z<7iTvyLMJ#XOz)V7l!{@d?A_h1rzt$bL7hnN-w;OHz5eLpMCc@KEFaR5}*OhMjeEk zRmR8fq3$ek{=@=O3OEio-MN$JesG*vDnKn$C2r_kn%7W#Ax7gGKm1{q+ooiGG_SE# z>u{r5-AXS_`-(a@8sjCpF|@djBM+&aELI7{UFcUPLG8rqS$x zZeSFuxW;3&UzkVj7&J>I5|iV!WG61IO-pi+bVFfVly@=C zc$i|ojK9}2HYAy3Rd8*H(AaG)aJvWYMqlrH0OJY+VZHFj7zb6Bi2lfz$!9BQ~A)M0*^oGHxEOBt_1h-BM z^XDuPi~8{O`Z3V$#6u7NE2BH!#)^^NbY7z!iCCk?vKNMdaAA>qM)vScen?_+ zg6EF@kn4sOPG305!$*p^Q&Ie#02hKXJ8c1~`T`IX6U2LiWKCTqF%qSkud~q;?7J84 z=#}Ht@4R^@@A~jNIXLo0DyvW6wt=nlBEG1^n?8AlH|!3wT?w&PZm{&d7kDBW#x9@d z;ET`j#v6v&73z>_N+frT<8S6M%MJ297TXc>k~uEIgKb=ns|MfTj zh2Q+Gw=y#_%%P`F^T0QsW;8Bwe6_`q^Cfl-Ia$rMxNb*~)iV{#NPPWBo!Xy%nblm2 zEz=R+`O`bN|7%D1(Y(f6?waQ8ON-QkKAwMm2`TO;G8`jwaRvKOfV|zobgl_I)bg% zK`Yf!q8`jb0cm!M&d?mPng?HiLPdoNq-H{tObK@uV!Ox4pAPJs<wJM^We=N1=nnciU+6(rO^|)EBa@)i(PrtIj z|k!I3von)?kxhRi?y z%LP94v7H?HyN8(n!JD{rew|h*#ooJrij{?n%&o2gDzop}Mfvp0eEC~ztmHBjjTPLz zFzeb$5k8F#2Yad7Ajc)P?V9ANtz3y%agZ~zZ0daC*6TQS{3MS#T-bYlbyu+y#7AE%hNfq@F!2(N7fPgNLi9~q zX03@kDN}0J@P)@HhB6FaGff|NPTY1g%O_sO>2-^BJszOCtP+$Z?4f~jzH#==eDUI! zad;(aE;qD$n~~($wDCeOE7_(oCWm>k(qICZikm!fN=I=tuizmzB8bcN+G zNF!lZ?HWs&%|uC1_E9R6PJhZwyk#DkBV;Lw3vp}5SH)5f;C zn;*Ic$C__<@dIg7$Ke@fv0h_!+s*vsbdmXsXPG}dhcD@e1#rd!#1)CH@vU4^&-0Zz zkw;LgX(EA2_ED**$XkZ21S!cQLvNmf%PVs0vvZFw_y6;Y%ns*a4LmqOrotXP(1G8ba{;ZcZ_lTpPvDQ zVHn;$N^DrT2l=%M^zM_>Q5G_Eg8_D2cMWg2`wottIm+k%@P2N+#>397Neb;L^5q8E z`ESrF7r5cBoxJY@Z(wyI>;1}K;BRIaDRy~a)Z3YxCxx`$rs# zi@ZZBt&fEC*GtWV9PKxPJ(7iQ$u{g|SNo<><8T7NfRz*IujG_o1 zHQ4JOu2xkRRfUBX-~i{C9~uVT@lj08V5nnb-50{)i{ToN(K#VDr)1dCyY;eGl~}J8 znBFl#q?9BU^#M&B?I>%DPw|@{|1+M;Kf~gA5#>o-SfyhRqlY^riUyB$UL-xA9_WNi zr-4KZaH$*8wR=*m=|mK<8IRgb#-%t5EqLp7*YU`?mx#zREDv7q@<_P9bGSoqLSY0^-ux_BG17c3X>=r^aqA* zO~tw3Y~%37uK1i-YLb>;;XP6SrFfKcFGeUO_Mlc(TnJ;3=^2O7j>M=W7MkpkSZmiX zdzFsE{t4z^evaDe67eB7<*qOelVf3Q;Ru?Vr{vf1wVR~XDmGlSWG9`7f>+b2&JSAf zTS@Fa*1W2gu!lXwdhOf3{*Mo^dh`$R)^&7EN7ulWKgP8?#`w;23P1g`Q94ox`$P)w zb!oo%Oqq)pzf0kTGosSb6xMlMu@f5(;#cgfom?R{9Aqe^Y(f-~NrkfuCCuC+wn~); zzWFrie1lK?^c3;9lj*G~reY%7v?C>n_lCSwo5PImo}inn^GvzR|335--~Pcur<%RO+leeTMBHd=J%s6KU>CwO%t>t;Kt93GwwK zB_4Yv3!DTH#-S$>*~R$Q7+^9S^3WKM(Wq(Y%?gGlliZr3Rc}#T%Oi(_wCXL+{pf_a z9>01!vy(GiIwJZQ_?s;{*&?n)gd;D$M5Uqg{-2&?Vkk;Ra-sp@T9alxK_?zy^~^Gz zVvVruBoz1J+%ZPw`^PBi>uh`DUS>jDnJZu5uC04`CJw;RT7XGQ5-6g73nGClS5d9Eon8_yeARYk zX6)7EYC3=AWUbfPAHXdKnH+OLt3$@+xZ-(9azf3tLNHn?K%=bF@pgzrqtFCXYvOeH zSnpPOf}Te( zDuwy*&?L_l&vVI}g!TYjO|%PWstEgB==!mRBgAtGP{ThtN_xFXJ*QBwbntfqWSS++ zaj^^O867hfAs{&*Tes>r6s?P_7!=l9V1s1J$D3|H$YSXvC+C-$)H0MRO~OGB9;rao zsPnEHhR9`9zVV$LXU#B+YZ~f;$U5}|{EVP70;oNuYgX0X3<;G>7mFM@Un1n_a`Ua@ z9Q@GroPPQYqj8BX2a`PcJ>dr3b^QdN|Jpp$&L;bBD)8p}41$pWO3KZt!$&9_KElv+ zilSe^=DeL-_ua_f{O-rO_)@$6eH_ps%0n9J?6hPr@rbY%IF6tz=rpR1K z13|X#iL)|SCJ-Cr@%tZSCgQ_%`zYxq!At9uj$WXXE#e;==F5NfWh#*{zNt7J%|KH; z$T^kpju}d^Rb-d=?aa7Aa>oqS?;pb%_c8aQQ|$eTU0?^(n?(1zX|31s#sfH(Aig(2 zw^$`OGt7Fg*XPjWZmN5iD6h4MQm0&JVK3c^a8d%!uGOw!qmiiEG=gOb5)hWRF_nmL zsa(NyC``IHBLk5}Ug2tTIY4;TD8`TDAVT&UVKv2qr1SpCF>dh&_!5YeP()d(j36b$ zZ4+163uPU8@GMOphwP!Hn@ABCca7}eMTBtxFyshsP2i6Y+Uk@%cFv#3QkxD_F|SU# ztmq}4D+)A`a!9PHgQ2CftrGqIIVr!Nbzo+TjkF3|<6Aj>_T=C=4VB3LtyDdA+-o(Y zfW*k8pJvHHQxiYB&m*x~$q{XuRBTORUWHOq%-WoyEruk^Yhnmmu#4``@@Pp@x`r5cc7udf)N&IbZ zW7wnd7k~I5OPQm<=g6(rSv%oEiFvv213M|5dV-AM;oYBnl3)G69=`gu<6O5R$k0u@ zdCyxu!);SCyM{fSI+rFD^YR;S86mK9iu)hGNbzWzRLV~}J=o1QN>(8F!SgAlP>LcZl zFwPaQt2Pe)=Xdku{Vx!YCh11RhA|o)rdX*E2?kMTcB55KQ)u{z12*pnQvn026@1O?2Tab5YU?7c2g<2 zaZ6$ihTA3?Nh0ZlovE!HZB^*@`i(RLAyz$WOj;8_2GVX`sXwnqB@BXuZucez)9$go zdX`mBR(jQfYgLug-4w@41>&9oF_~$DH|(Wq)9}UocwIVn$w8uMkZOvH?FxIzsU7}r zd6B%^%V^g_Eb1fd4X|o@_(*7iV_*I>yADk8&By0(-FP2qM~jtS4aUa#lq+_fhZ`;y zJ;PU=>qT8**SP#ZG>$Vxa}4GT23wN*&EF zqxoe5vV)~shpJ|B>7p>2gK!{>#w9-XfmuHD&FA^#uiel5+3zwp|9u{P_$!1u1tPm{ zpsvgSP*-cb{G$_m?0x@4AeA679HVGBaKr;Rlf&e75C7+PALK_59pn6CFYvkFe;Z%@ z+HpqWE?z!U;h+Bcc`JJHgI9ziyQ4w=@yRTo{_7W5Ix7grQX7W%PT^2oSNwsPhUJna zPMu8i)qi@PU;o&@^4#G?ZWyXF>#4DQHpTdL+tK|&PMu8iqBlZVmGIAwF<-5)FVbe* zX0mU37cJRIESh9!|5jqrB>6|4-LwwHZ=)b(Rc3D3j~0~46*Bn76r6D%hE~BLZQd*0 z+oDje^2DJNOz)c+{4OCE$)KA^a8Pd%obt00l*uVFCBM#mwZc?DJij9;+~$0-M$BlC zGF?a!g<^d`3IsQlerF@S4ca|;%pD3-H3rc#qu0f%-#@A3bnt98O-C~b_KL+~5rvUv zulu;M8PPSWWi)MC7=@nR_x1g9y}xRzbwAYkS|}o}NQ^qe_*^=}0Y4?}9HU(iN1KBP zKp^D7KbD}G&teNj!56}hi$hZmTQH1V+bL#vtVOvDOp|HSK6I>KQUV-EmTnh}wG*B{slFgz;GeaG$uhchqJeeMW(-NRBw zD16ay;EqN(nbC;VYK+8P45bvFyC{&s)ugJK$h|P@Qm=o)#@Ajm;^OAnNlv}A$Z^BL z$~Vpsaf5Aglo!vs`GrsJV@t}$^Up2wrkh)2(r$*X`w)$S#K|X~=J)^dk7zY@lKZ?g z3KGBiQ@=$mF5E%M1E)`^?7d}@7oL8Bn{OTG9d{3-49)Q7pZiDbLjmkV;`^UkRr%5U zC1z$KjQc$dhrAqGZ6c`^5_TQeHB+n{pT{Ljv^3osW7pDjYr(s{ZX}OP{(O!9_rwb% zMxt=8hT1W(jRc9vE?n_2Uw`x%Z~x<8BKyU!vZB~{<5ZA*wZiG~6fL<#q~4}1JCUVf zsw-KD`^B!`ORfqXyot*9A0aTBAX64=&%G^*=?mdV3JC9uPLeitV!Ov!&&@G99b^9c zFSF&~2*Dn@%~T8mesG0?_{J1q3|v7t_6iF_Vbs+MQ+qd5O!g${RLJy}P1@8+nJ&_f z7US|5gU)qvHzlN#r)yu*2_NJH71) z$FWmLcI)92%T!jutv7rs&$vL~ql4e^9C$CtDcgLEcx{D`DP?f`h!OY1Gg>TUNU5vm zKUnX@HDbFgl7K$K2L7@nC8{UJRpeO}!#Zk)vZn`Cp1%tMl$nksrDji{G-- z67{{U&QtT74qD)OSl$ z8hg$4Nj7(6iHP3KZdPk9&jaVl7}odvg%J$~W|$6Nc$y(4lC<(t6vuhnv&N6dBZZ1sXr8 zBDGgq96b)|+Y$3e5niLg4*pw+?%iW=PAb&*teGV=YTLxNwN2evwy6E!DdCwPCXIJA zyi5ga5-T=~Pj*`BYHS;Nn)?BzIxI=suc+_j%gVKTz#t7{lTcs;g>nU($G6aNm~EGN zp+ju=psgm^;$M9X*(dE}8^dtG%aT*9SLEYY0CXl^yLayNLI9c~C;#WlA3x%AcPU$o zr0j>d#n7RLQqX@H!86hBM21OzckB&YC7`Tk#NKy~jmmt_+ak+yaxR!JOb%B~+(-kl zMxl~!*IH>mZ1>qz`JVee0^b83^I;!?-hBw${S-Zsec`m^w6euDIZAD*DO_-OBD3Q1 z<%ef1qR4U9uMfD^XULi%acNnXm(}lXgmittEx7~IWeI$*eh=9aO7z>2FHQsEEpJ5j z*doR%+dt0u;bzI@d*91HLYAxMz*kn5t}Ds6=bSeu&#r@F?_-r9F@c`yfZd68UIq?= z)Q5h5OgzbCo=w(q{WCnX_dBRWVH$a>Yx70B`4c9=&aE~(tGNe1=J7f?O{UuO)8<)x zLeWk3U=d~9r1x0=x>ES$ML({?9;uI_HlA908!q_+xQlo&$d=}Zxwr;@JBHF&emRy9W+hko zs+=IoGuaY$dWQx2`r$E!F8lEgvEVWRsZF(1=J^X@^@rR)mDklsM>gFBPM89mo(`3}* zZ4jyc5Sy&+fHC&fo)e*(CgIC$g-2A&N4z@d!;()pYp?7~-MHGc;Y{>*pTZzt@Ug6f zm}4&&dfN(nWQ)Z{PfQuVbp1mX7ie*R&{t592GG^<>Lh&dJ!a>QMCDX8gRsZzXN;XS&wm%Nj~h9HaN#g*#&0j@xt2LQQN|DABrg!K zdbyq8n-dM6%NFZBV3df-7B|i=P8T9=tkXvu-pSjowRLbV=e$;u@w$cy1dx3MULiMa z0O|@zf(!ibrI0Gr%*Z_qwir?nA3jY&BIRVe*l_zpM4^YYh%iBQP!hLh_>RsFmdNK? zDKZ(M>JqPM1k1vA&GycWLF+P>>QL&FwP?EKdaTnB-t|E$EwJxA$dPFC%P+YokY$Y- zSeP9%ZnaCF z-_WFa6ikO$$4G*F9Rp$8Kk2WqyPOo={&tmtL@INTq-}}bQi42_3f$bNtBRXjCG%99 z+BTxc%y>IUr1;qls|mmB2!g@k&l$BFEcwCxZQfPCiyRhZLw{AQ@u))+W^8rf;8{0O zWT5v;9l0A;KU!vFA0*yGD0J=7qi7kA_(lhQOQL*7weKUji+6`{9vF~x_7)0GNbHaP zhyVaDGJqq|IU342nu*hoG~Y;HViRV;7o;!hh1hZ~MMvgN4_b(MAERL{;e0G1Xh4htC=h{@n|JeqFkIu^=^uK{9(?h$ z0H+N{%AUzB)fs0VbP0Kxl=$$ceo$b*Tc)O?!`T@d-S5Kyh~sj+1unLJVq~R_g^8sA z248bOY@ls)pESMSgMafJZDT|WklK(tdg^S<05~q*FjEhAc#jDHi5ZtDvz#to4AR>J zcX)H&`<~P9JRTameSRnMMS$P?-?sz(-<(>m&F(RlUE;z5-n-fT`$Tb+t?R z)sedNrLEeFKpGnMq*O!4t%KxMHeMnPT=+nGW%~WSn701Q<_iAWO1@DLMfrQin%?NURKZ@gjC zT%OoE$q5p!+Ad<~An+6Hi$wN-%(CD6Tj<)*=GT56seYc&eNvM~LkbI&8wLn6&=hv# z7lX+!pY3$6+GP1Z_p5#Mq*L!@eb`eB{NP5FOUeVQrd4YO{?U>0@<2NnirYnkYc>Rl zc?q;C%Or8FRl8?r9vFc#FhG*kSnYjU$qSJ3akl9%z3D12)s-1xsGtas+UO>utB#6* zh*JWdg$o2M!fZo2YPG`c=fXc~9?-#f6riG8-PfJM4(72_+JUg)Xk&Rg;eK~*+6`gl zX#5OOolU7;k-vqAFdHhL%_Vy(GpCOS+sX&52t1KvG61O? zZ5jq}V&^Jy3R^iuMfuzj9>=?cTo@cXP=niAG7T(j)nb6EAsykP^YbbEZovhWTe*iL zVLf^rF(ekA5}@&Qs-*0BhXLT@a`Pm=z|^P;dCmL20MTiB=%-x}&{w>?-ZMMDqjEsH zzvHgmgL^le+QV{QUe7Pnm0uZF=XrA;=ez4X8=CYuiDX7(K}=q<1064Y#xJ;a#He#T zMCSgDy}BIZUQhFEh=leC};u6&=_K+;z`B{csu=Up^?* zqD%CdL*`8gcxi_81dgEyQi$&ATb0`5_jb7{{Q2dt4+kR_OszH_#Qdq2%~X|iBKJ#E zn7xElBG41|I%6p>_h%vGLt89naZBa*W-W7f#+*jL%|g(C)HN-XH!hNfN5#f3HqK-q z8rTCsI*eYiXG1*HiObBh73New`oN;a?_^Cp&PW@ z&pV_Ax}3Z~#-c%7KY_chNirWivXVCEak@YMmsdFvT^FNO(CeG*U`{08F}DIkH&FUD z<{c+}+ZX(XhdGBX7lkMosCw|52RulUI$0C=tJ!z(!Go{YNtQiuH|Jm0BsaJT^-@1! z98u^-6jzB4J7E&v6S~Q@%tzGS9pznDp1nzd6Fl#H;QCd%U_LkFVz zhe9_{uP@c&IK&+d^|G46bESVQiT=yy5>DzXHLqS@(ZOQ?4u3p3X|=oAUteW3_r z9XiX&ydq;z9|TF4ydzqkTyae{%x_ky&}eb<6DTJRu`BYbPrx-9aG+?1r?N}Q$w3%M zyT*b-K#qthto~yX+uI3ZjcprR#$Fx;B9|1|cnX|sM1G`^cE+E6r{u!x3<55<6tQ|v z!V}1Kf3V5nUDC#p)nvQqWhe8QNARNnpWJLI>&^}4QRhMV9`4G{>@F-c#am-EONJA7Qt>%|5(gp# z0dBkI5I!EMjm}3b$#xSe{S#PrwFIGw%Tdav{f~9Ue;lW}K>aYF!oLKX*}0m&U4nm$fhNsI?~|HEtVCC z?5GI{1sUuD`OH8cJF>$wvwxm;&^8Kq+r>I3AoJWGPK1yHG(u^Lk2|+9IAg+_HD6h_JM{KKZQa}R-o04en*|B0_Ycz~Y zV&U57OKz6|68UHd5)0H607%jg(Bu22_RSsWJS?&m4Tgnl>dgmjhn-Gse5gt0;_uvq zCX4y7b;Igm#pa~BAqB{>k-@bdwJ_NjEg7Iz|NFGs}{RlqmCh3 z-UX6{0U&NwTt}HL!5Vs0b5*8`wwZNaIxP5^at9;r*zBie7N;Dc4<=e`TtFmE^MP3C zRkiJQ%i`F%+}|sfF9|ir2l;*azBK}aTP2aC)h5mo#`V+kq<;Y(PAl5OwXy9mIHu;X zPzqa}fz_nU;5=))eM%Ui=Ve7+<9f`LenAXWpe{r6@sW%B2c>YyQC2%qH5XS zk_NkpR*89GRnW6;RNg9*vpmSWIs)&d*f$I?LOFZvXPbS5VR`*WUav10O_SAO;`D3z zX3F(iIUuB#myyIbyZCKNo6pPkryT3}N(e@zGIg`wLFv$xvuAE_rP=@w<1nvR|5Vp2 z9YD*=yD-IWo&JmKCyG*|lz@SKq|S@0#O;D4{VsV#m{dbnu9b2Vij8MhP4Yj~%+f22 z)?+KFGB3@^EM}*%RZjsK*OB8%8~MSb^_vP+lYiehET>vEa|uN~>rt- z^k^HyRw}$M8PnC8tjtYvKk*{8_0sL|?zN@fU5o^>nmIj;`~qLCaD&?}qDO7{+&^bC z6sKGh`oLIB3dhw`);P%R*^t6g>(^j!T=K(d+ z(BWlhu*xAxuXP|HyN?tNr)JlkEXPoij&GQed4|7MrraQRqr82pp&S5gZ$d>S%k_;n z?JL}Tzx5Izsh4q%SR%h9_KkbMDnKG@K`Yh?HutgGeY6_7vniE3pVO2~&?c>57hC|@ zpIIm4m_1KVj^?$XX^QtVlM`jxf=W489qx5SY1Ddqpg_83j0#K8IxhRb+o7m_q4Kt2&w*)Mwc2%luZ6%~-Wa}YJGqzHA@I16m!p+A z`-rs;H9&Hnm~w}T8(CUP;Mmo#ofu&ux`@{64w|s)q4ef{sPx01}YOivBe^a4ra{)G18Hlu@aI3u0hFFgsu1_m(##u*h=OvGivj9ai3? ztGbTxfE1^eq-xH03@bq^j1CZ-SnV@fOyNo-iQ8IM(yk2N!sMy4|0p*sN-#88 zF3}&&K7#ukcT|zDrFl}VW4xK9w$W{Dt1&=r^L24XK7$)-TagEfK-RYm3laL{d#6d9 zjrP%aAsr5adn3-KZ4Ag#=ky{U2C1s@@%x>3(_Qx~Y017Jf|=DzhmmU%{{k)jNR1h+*>(hhp! z#-i@|t}+36;wFn)W&L@wasGfp`(rU-{<4XyekA5l|E-RoUpz&WlBXdLV0AKEG7mtn z6J?_*M{v3si9jJ_X&$5eR(8K533J@iB$Wp>!hk!kt{9#abI)>ACq~)P zMGJGaU=FLH-r%f%OUJ>_be)~K&Hg*z?tQ-k`akWN2AoR2^fJA?WEOo6P4ayB8Ez)5 zKOGtcGvx}CEJdYB{T@{WpGp1zi+CRuCxu;-4)uPPd_>MkRp=Q2f<`ufWQjz$3ma2P)m+A8cm774!mC;B}{6W_vUT1#DZy$Qz9)}KG zgpTa`GO&~3{#E^Y@wLD|T+VagNyOoJ(Qm%%CO&jUr4=cMy%xIMiQ~Ju z6wa15yFl-ht*+~I3?%mC$jDW;s;?+Bz)<`xMy++ik2!}|O+dac6_eEW$H>lg>9o(F zY;3)TXSg&qmG%S$qmK=soYmN>lYKUnw?I#;elIC#m~6}SETbSBQjzB~6H6<<@yUm@ z&F18|{QgNMc73Ogu;%xdwa0C?m;s}|OJ|=c>~oOR6|E}I*4i=HQ3gV?)#JAV0^a6O zFIs7??2});&15@jDMvKIBTUi(tkk+NG6d_BQgaLVBr(_8@THb)OXY*EClDF~C4zri zvx}1%bo&zY5`rhrO$rWD=9O6HIyB5r2RQK3>l*iu$GBRSznusrV%hPhX7h^u%f+3U zs#bRvw-)>b-jkR-E}4pKvU3IOYyPxUuFIFA_)2P7-0r%}UysR5h~}*&B9>Pe46|x? zeG~FLxNUa5P&A!gJ5mG5)Q>M7q5%?pY_qJs0~kuT?y;4<-G{;VXE>jHb7E%pQ-c2j zK{Hja$DVV9@VX<=HF~k`tHhZnqM=j%i36lA!$5s!QYL(C?@Hq&F!m)3Sz_AR%o@AS zxPi{J=9IB+rNmAk0qdT|7Cr`ZnX*Ve*LDH}4_nwvQ(b^M0 z#dV<$Tk+Z8Drp3%m`|8h@DuF)*7s87?rRXE6BDTJo0E_G zexq+%SMUFbwWRPk(+*!(Hn~&1`*3DJ%)~xP`m*`?<*9nJ2arww8RGd-(&o22O&)lW zWwjhQLFPhB-5%lH2CV2Ick@GO;19WF6tKde6lW!NL?^}w9p|6|rQ)H>iWItHOP-i6 zx$o*FhLfYyCD))1l`tQKOD3kZMGh6^RaU7Q9W6Y~!{Yx;@3Wx>w-FCb!kc2!tq<+f z2JWE6`>YW}&uM1x9xUgXy@F1b#Dc|R`Q0?rYJ1cf7Q!bKt#Oc-TOl=jTe>p4OgqpMx5)yiRSabsvGW9H^ z()?7zBYFx22KO`K@1BLZdWo%1QePm~vx}<|zEsY2?&@JahiE2U(w^Kg_rZFx3UiFFV}{WkQ5z0`CeCx!$~Xc8BAP_RJS?*Ja9Mzk zo5{%LVKob=WHcZs1T$oS7meyoa0UFWziK(x)xci@NSFd@a1;7vj7y6jNTEFx3*XFi zs&YKIDd9pn&J)haBp-M>fBtEt7G1Hz|6HG&$f{o;^s7gEtT&R$N^)>IZU^YiI3M{BA!kgAO}P3d&8>_sXU>YY8}t@vZ{IHq!D!QjmK2}OC>!_m!k|c z7n*t{nl4*y7DL#J2*I^+b!B848oFde>`);@W1)+Nfc;( zpgw=0UtpIT9$4iFt30T;?jMwPws8n;Qpnq9csO;07^SOqn&2biAq7HD+nQ=uHzC{c zI+#+97Dh>uN5FyoZSj|uJwf~JEgdG=zLpW~)v>i^tJ0br0OkzI^t=k)_^7l`DOd~F zeg{fm;nC^Pp{&L?KhOq#*zFFy;{_UXzx$5C7*d~5@Y87+utd^HJR42m5!hrEu=n)A zsgGqdg>(%(Bpm%OMf zcIE;Y)kJ!Es&g&e^hL7i=v$Ex!dpE+%3^O~jXkLT5vlT*{{fzWQ)`N4sYLzBkeRv- zgYfS&w8uS<K8b)@tUYv|i607Yk>Ly7+Yt~g-a0H!CP}PK#JWZKEZOU-s63Q3Y?soo~~2xo~Ji;#!6UI>wgEBBE_G+wS!} z5m(=VE=Oyx_J|Qq+~l|dkNnet8lt;wujdy|DTzejN2Pb~?y$mX^zU zVGOFxw4TjL$)o1tz_wx_ZCN~Q&O78Cb@rmUK7@*52)1i=vGqQu##=lzmZ9tEYr0m zgkzY`crQtdNClkY3CBt_lZU>qzLM}GBNs#Z&#*W0T@737MWw+4Eiux@ zljsK}aA3BRzoSU3h)2pR8zBz_xh^d%z9s53(F8-F%3^I3zAF88+vAKzpu2bH-4mlT z^AljbW%O#YJ=XyUx4+khwyyX9DnRec z^V?voskiyEr={*nr!=~ z=^Hc&nGLOGPwS%l$3wxChK_uyCL0gFmCGxWn}yu%MH+&me6pyH>}}JWwHIy?FrYhefvP2 zCe6_j{@*!Ptus8z+Td^5KTsf((*NSz2qz*}avASp(Tjqo8d-3+_aV_99%>hUVgm}T z*54qrD22)*UE05A$+f-~34Pg$!yhHKv3k~5_)ge#Jzb8?e}_Z1PXeEb10D~cbq}u@ zfEu*^xn0MnXRR2(g1u5Wp09?n|)WlYE`}ZfA zl(2ndrLK;z@^gGI!?GCC%C$?wt~JO$nl%4V^AD=*wQ*C37)81zmdl;DfC)Th;=j6O zCI#}Q4-;Ea!`R3fU~$?r$@aK>wK6k)taZH^wUk`XRIl}GsWz#ID%CvpW~o*k@zG}4 z)i7SKH^IL(sEvB{)3r=QU$oK1ZKB6Z873=rjHyi`xy*Q=nv=bJNAR5g;>E?kHZDqc zf4DOxF65Zbiqs18Ntg3=23KgYm20x0=`RgjY$DH|3#_m#mL==^`PrsE?r+317)0OM zkpWdM!skmLbP3}@2WE`PpHUx!O!D3waovgayJz61%TkYuU`={_HbAN+>`afPhnfU2 zd6HGP`b|GuYF?+UjTI*TsNf#x*&w=`IxUxKa4p&eEj3N>1NF@;#+1MWn#;t|GT4-8IOgV=3)Kbv)jbT< z?;z-2GMtX-)^SSQ{s8fsya=hzrUVoor(PhJp^ETNf_HK$arsf(_cejOzkJVEhkhQB z`8Ev#%+p;gLxrZMk)XQR3fpLUQQ~<;)VT}2z~L|Z6A$0xD38fooDh%1=U8*T-$0e~ zxZ?GSWm!3}%5aUfboFv``{iw~6#DJW7q^BA>SHMn*HsL`{+X^+HF_iKK_pDzW9#|l zxJV#rj-#3;bg#X&PU1LaeT2~h@K8(=3;pd1S|V4BC@J}(r!acK2ju40u7B1K%EtM9OP6Z*4?{}2nIL{nhH^2F>>Ck=xK#1M}Yv3tqJ6`1BWM|_Ya9TT&T6VLe}^_t5c&0sZo z?aRQE?|`D5c%$K8YV&<|K$DILiT!yiu|JQL4Zem?m7XRKyj()aHx!u8^;MkyeaQvO z4PiqaQ=mLszb_}<-Zy^uK=VT4sK#<({E3a(P={*s`n1CZ7LYqw(S};lN-dZFJGZa8 zG#=Y;d3b@pDWcxDxuGXE6vk!N&6^L+aKfgzA^EQ z>RYYnFL8$|zob!^T%Xi_ep?b>IW2;CcH8#prYisWtj#E)$>eg*wDd0)dW2`|rtp`f z<1t@y_iMA;cy)QwD!J>&PsuHWo^^=wX_)Yz`efUXgL<43)Ci;J+_aYGTdBo%3G>Ct zRP=oIux4J@Wb89~6(lcCvrS(Qp@D5mo{B@mN$~P0fW#XRA1xH)GJe|7s+eUG&}q>i zr*6H}_7C>SnkRO}@~x7y7fVWQzV5s}OYS(Jr)RRV?qRvf!yGGeY$QI6(k0!Mp&ZBg z-b@}RE^i1iO#4B5$KuMAC0MyX{r#8~12JU%w-Ex=`T*2KrM2L)3B}=XB z&Cfl%a_*!A@#u}~kYITgmYt?b69&h9_T$FCF5Fkxe>X2XlWZz0B0O)tJ(~DyoAK$_ zMSm?s<`7QTYL8wjRHv)JbmyFj;(D`e?8#wa)*YHEC1zlJntsIf2CPxcR<4r>G~X5> zS2-s(?8I9c`?mZa-|=b*LtToYz%`jhe{qmZ5n*&~N*I}n;vGaK%Z-qYbgigf!xL|>aoVU#wNH^OkFiMhY>o9}a>u}XC|NU-YAXcQ7 zX<$b=Yp?oUmC|zrQ+1N%{x?D@;mg1h%HTVo`wz=j_yHt}L^ zF+i2#%N>rF__Z1}GNCgP@k|Etsv znRPdZZ(m{}=vubR^u57mu$_&8(&1;06Dv1pCa6r)`&l4Q!^;sJ2r$wcu)2qaLq4*8 zP2C5U2E&G5S(q{H<|}UOI!(TD|F-vNr^5-pq@CC2T~%d2rGL{3^4U=0GE?(^_!L$@r=Gl0f1U~4 z9^$Ilpq*5UagaSP`bnH}IM~B`7;14^#;u6-71@`kQ_#%21h)z!A>Anov0aeNpMMht zl!9BYH*j#G;;;tS44uE`#dWigaEos=TCp$(xH-(1WqtcvWQ1$nou6Uuni^ui6zg}tM6UQV>5d2?J_`ZzTan7XP;X6A3Dd;t$DbKS;6g3jQ zAIAU&(}|27E@Mc;ce58#VocRvih!a*7KKhr3BG5y32Td3AFusVZ?TTApoNrAzi^Ee zuhTMet5Y2>gx;=t+zhKs#zkbqKKp*XG0{*UVK`E>2q|P-aG~j=9`X0FIBcrgE;Cez zyL@hcvl+umGHA+OCh??EO=`z%Nfg)_H~Q7>4>7>MN=LN$q{QP;8B=X_!;*<<0K!R% zh^CJFgi)n|BL;NZ4K=v2_5vAdoRn5h{D_B)S>?iUK)M(U{N6OU|X zC&fjj?Mflfo6stB7Q~-?`PNvLpv>}zxdM3A{=Ck;Js~t!(>)9er6lYHeq0QW~CoNG-`yM(;!$=H-mWyfGt)_~Z z;Hb4Z8Tzr-zjoMTm74UpMzrK>CxY4I);~{vJ!hgdW*KAt#u&sP)7hXr%Q2h_<4aZh>Me*OY8CdydJiQ=lIzj`oGt~ipbbn3xYFV>Q@ z|Fzt)Qh#QmXslb$%c{O&AbqEFb4c!KQIJjvk3n|1g8;heXW=5tjm$Ex=?0v)OFYnU zXvc#QL7jYxOyLWpdk1Fo;jcct)F*?AH6{{rHX<`RGuNwS0@$k4 zfYTQUl(LK|=ixT4qmr|;blUC>t=f95t{u=k&)OujyiJ{>qe|m@u6!*w!xGp<#Frx` z1OkHrn?g{)2YQCqa50kPkNZAGwh#qin*;n3yEtsCGvnF)CVu$HDi-bTJKX{yx%}Lo z`Ke?)ldcG#viURCSqW*_?obMDuAS9-kPCTi_u8I@$(_K;A&4l$O40USr2+1(64RZf9 zwo3Rj18UIQD7S_QeoK$9Dx(uW(OtrNTaMel4&JgeTfuR3O6WH_$YGptBH3A5_b}<& zoRseg0uzlZXWS*sHh6j=YWagL4jh`(JZP^Yn>}CeSqL|QbvZXVFKmgOANA@I^%Tt* z3;wK@&&w0k&hHj20cg=L;zT7gj>wX961`LQn3|U9w;$x>c+kYgH=46z`q=cE$eku= zZm4bh4aXKgahNmwDoz~c%gDYGGL6&?gHlpGn@n?~%N+FfN zn|%r$yi6t$+~?h9glV zq8H~^PffgyVP_<5#(ur>v1buK)c2=TxApf2$$)3nH|TQ!OcpQpd7<*8GXE`fwm;Bk zgELtuD`_ARYQ~F&Ygrj0?xO0_V;pei>-T<%2wj%Tm8mOpXXs zg@3ge9J4TQ3-JCFIF^Rzbr}%L$Zr0=F}y{#ap|IE#2ew_qDY1VMF%k+p0W0%&Ca6X z<_=c(B#%X^e|bUobRcY6kM!mo0lX$sf+!SXP`B`u(Ft(rmJRbIX!+p7pCVPPQw$^v z)3Ig9^?7uy|GtJPlRuk{lM0Q2PJJKta^8@uI^UQFEvx%B3>pngI-B@rY;$O&YM0Xf z&Rm%u?o*r29-$FR2U63(C9Tt;#__b79I3r~YHI2_aIG98>l6L+0_Eh-PN%y|;h|_e zj>EzVi5h7dNgkY5-|n8ob1(od)xJDO$U#2kp&-LKV{Fk6(OR4xg+DbLG+}Ya7H}ZW zoq&UtK#4_J33Kj0z@j1khgQ3SJa(6^m3U{n{1TfF+B}%OWIXkv&0RseZ`2T$)ezY- zPpN}BOG-X(_4#jyUKq$RudRdVG}+-^wO?{!P#f_ibE@d^zr&%t^tV6GKaC0MV!lWg z8JfLhd7)>>%E6_ z>#rdS(Q2F<(KN&b?HTcg^!vmOediGZ1ZW1*^iuSDLwjzuSG}^-)K*ylcalt^Rq~(a#W*MnYGgr~c9xFi5liO19lZRQiZc=FZ_Fvpf(xgEz zZAsEG@+f|7Nns0^otf2{=V_LXOHx$7>gT>EdRnA<8BfLijmYO7?8_|>OwIQVbI??6 zz|E(q1Gis0Y#AB{Zj2&kklW>j^=t39SE6>ZR5y<|4x4a9{=FI!$n`3Ar!5Q=_`q zsG>skD%p;4GNh&%RFCn`YEOBbeEj8?YKqsZ<f=#?lG8-&S%Cfa$MXADA%RJhgfgEKNUQ-1J+5#5FZe zTLS&+4OwqbEC*Fa%Zw$5*IUC-wN^QH%f2sA)GlxIc5uw#w?2kK1hr{wwDPn&I< zo&=s!X&=Z6F$yO~7shPT$A{9Q&69*W0pwB{*kXOrM zq)NXSM3J~IQ#tHI_zA1ztKw=`nZ~VP`AE|fMx+Dp13#!NR%cIpYaZdpPQZv=8oa(~ zN>m?fsg6U^vbMe^H}e=NMVnIKjodw#{K_m) zw86-7FYn=-SHqmuODk$O0R)VOy_uYXdHQ^9>UmWHTFZxVkKbm&~U z@HoDtbfLD`=PYM>60`RGEuE{k-9j(XrKp+e0>&S!5hu%I#*!KPnmr%yKdj^d#ALvm zPSwga03dc}$ZNd35NfRopnA>%V2=lkfXNhF!Iul7N{Q%178d6o3z~VCt7QgVtZvwQ zjmYP2&tL^TzwRELOrWyGL0G2s7q4wnvp8Um*Zy`t3Pr9I?cGaG@I0Iwh?K7)c{Lm~ zCQvs+-cE+LvUh&lkg;so`{BEVHG}YKWNhTdPXT;#yZWu;7)nm!PuRho2oVnI z^Yj*xRs&~5H*!ST0z)Y)WI!kclK;eTRrNc@zx=+(U+J19*Qmh7g3#z`4-N`+oqyW2 zle%EswJKt{*7Vmp4fuNn=y1O+yKn@EI2=jP*ZN)qC>!W{v1EQuz#i`!a zK!O-&LwFn3X$wdJGb3nBiU+XoFO*B`{sLi(P+oB{1AG~!=!r-HXWEWC{UL%?_Sv7k zCT7c;OPY|ijL`N5)YiLgc$Va_DP!$j5NS}ldm%V%BK>E{&^cuCkoJJc;J_ZH+wT#x z-~Tqd6TzVD_C} zggOQSL2 zTyh6&r!M~}QUdYGq%9;sBcTuJFP zs{(Z^Y_rld_X$Ap9EmL<1l{EmVH@Hetq{7ha}z`W5}0|T=3bN57kbP@4lE*kP|BSB zvodM@X7R11bAJaymCmqj2q z`}vU5x5C+8#&U@;45&;;&rMgR{~F%wHXEBKV63z?v%4X<`@o3Tf`+>~11LJo7d|4K zpk5|#2N=`^XRFsTG3DNpb4-c2|JrR>u5>VJ-gDGgf=Q2R6R%J{t(&<6`bl@S22!A_ z&&a-p{)|Mr{_%v$(f{3nlNz$TZt^Qab-(LE@x!c}g;C2pY=O1}zlVvaq)_+x-#^;( zS`suZHfsTQAY?N{U`<*;d_`M$XIN4eXyOby+{NeWSdeK!NT+yjqK~|q)Ga?p81ZZG z!C|GDOIB2Cs09)aLBCSpH!pU{%FVs$l|(4ad`1KM_{t2%BPN_E#OfyjUDwt#(NzE*htz1^#{#&h5v?CoFBs1uPy7)n-7auC^qwi zF}?ah`iqQS6yTCtZVa;#;=*+lO#I91jcbDc#QR73G_(Z3*o8|b;P+T((?@!{ecgI! zc@5CA0K&1tzP;yrFEX;xjw$%U6YIPcVbx;glxf(mZjXP-j-#gIcNC^2>ml!{R=UFL zLEWc)CZf1Zw{Nc$rfCM(f+HRIOjJYw%qQa z!-!-PY#>%{90y9pOb+&B2m&V0>Az)pXf=*6z=4fxMR)oI>&>=(i3I`@+9{s-RE4J! zLohS1C0g#D+8=gV0y9;cF$3kXv>(L+^ccuL&olFdGYH3H!Bro_WT1pZl}&7uFk7r; zkmJ0be1El`f0`sSh)zuBY!6b^YsGl`kyE8gZr$=dKzJ;FjM`JN*}JEU^9sKzuKX}y zX)S5+)Z$^q*+@`hfCpA>qS~UBp5KgS&_4z zq1FQ8z{p#Z->%^>MIYdf1x)jTDm4LSwtltF%EN;n? z{(lxuER*~#_fIZ>XNj9lqp1B5D~jZJdD@E5xQ^P^vi!B+UC$RJ#UfpLT?reNqXg!r zvaLPQ#uIQ@Q&WXm>EvQ&UdcI8`|DHNdK;srwjlaN#sD zNp@G-+D&$sV=@63AZY@IyA}#XX;-R_G$7gsAB48HmSCVd4~)D-;2IkrgE~kA0^ef6 z&em^uBKOU)^#+c09IWF$g%gKqh*Wra|KsQyqbl#Zcr)3yZQGM=+qPYkU6WmtZM!DB zCfjbZ`Tn1Gt=9e6hkMRFd+(pNE#|0^xupog&pDav(*#-oJ*#euI+I0)wKKPR10t0U z;ux56Q50QBsmpyh!>t)+aMmr^qS*1P$&*~|InWRqhg;}Lvy}B|?W#tH)oLL%P}~6x z+|;uz1UrzN3>-YwmCxIbYt%&BGDi$Sa?Z*Ax5xLtGs>$8JJVlpg6&NUzm08fPhf2} zK2q%fSaH0Di#7$Lv;k+cp6qzt-hX$B8L*LgZ1ML43bHx{I447%QTEmuq6vmLeKbG( zqob(F9NqmPR&xJ6P!AJa=mPga4;P6GU~=61i#Q!+-qF1gnj#&&S25nBR4bVZ`1O^S z#i?@)>XF0@c#0_w=V<|YBuXI{kQrnt*VR&djE;(1Ri!~)Aq`rr9HTQ#Nd5xQu8e(` zws9|AZJ#8A%cnL)Uk-h~EQ{?<4@JSQzO{N-T?W#yG~fE+rrQ09t?mRyx`t{sJ*dzfP96ks|Sl)Q%_zm##K7jdHxZl^h;Y*Gf7s@5#aU&mt0Z`Wo! zxTTZv7>HA~jkvwiw-4!ECBeEcl<49T2Q#LxO8YfQk!w8lx)~gn^?TPmAAGFy$>@yc zymZFkCPT_6=*1+6F%Bqu{= zndJ2ePr+cdBcolJD>&0r5CynU_8lKi&dZNN(p9~vh9j2QL8Jqpb4)E2(J5h3Yu*o5 z!hS$T%;_LRQhT8hCeUBCc|a6n4)fk!;5^ypm~NOmm(xfxmICNAlGXbxR zRcqk4THc>lHb_i;Tew3Yh8_dcgL1r%V<Z@T?2}(Tf>IEy~7gX}YBSh(c)v6(6Opqju$k$-L*+w^fft z*VBph`BUzc)RK9+b6NP8@)|QJ-g=x}dtZ3RMYxIBcrnV4^m3>p(I9EDAqNkg7ldk8 zg7TH$+b zaLv|OF9`j^v)YtO#lgg0Gq3kfg|nWm)tvn23#A12=bjUvQT+=9x)B|F>p2YRoVD$= z+FIFF)}_I;&`L#$Tq{V&!q%XWttfI&NM3_pwrh1seH+t=zedP|bk?9~xZ=pzuL2@) zj)A|ilyvNHv}|Y5(y9&7qKLY*J-XG?p2}2?YyZrJHR!><6+~JsmOQ}yH2NsVC87MZ zPt)$U`M@HI5$(0#cW&QMw9V#4`h^ErnBB($MIJSWjZEZ2256P$&bXXG2kPb|o3e@f zl@UXYs3sM9&Now?fJ~XeBTUCqZm(Lx+p+;s zuK8tlfw9L9K8(qePg!0zB_7PI9ai%ApII?hi2S&uiu}eSl-_EbvVG{R5D(k_Yj;g; z*}J~u&#)m>3o6DEE&5}pRO_#edqW`ao8E3ql%qqoWQ$_!-=0eb7g>F!7r*=G3?c$* zB%Hqw zr@kMG7J`L;32^pY^+gP9klDp3_q|nG#~nTxD6K2)+Ohvzll3RZh$4uCW-)p&9I~jG z7HtR@Eqd5Zb8=4i45pBI@0N%i&idh!Vsr^Jpw$K&HX)&9brEFO*w%I)kw_}5*Ck+q z$1t=JPk(OMmae|NID2)rIy<5g5O##;GXbOA^<`^MR?@BzVqg&~$T@kUQ8?BNCyt@3 zLN+jGLGbS#QhvP!CwtpXd2I7dS$zHbKBAvVx$>aMPxi+dx>Nr1*$Q9<)}6!RKQG^y zecJIDv`8*Onl+A`#!%?xEZ)k5)-5Qc^57$U);;X7l95-@A8K!y)d<2ryJ>cpt6}E6yotutp7D~ z_Qu557+U^MC#3!dFr?7%NIi)BBXa+UJrVjZuL~Ct+7dXkqPe@AU4M6UyX^1q4+QzA zJHJQpI-DPmg_oH0;e_kZ>33go1?gD&2S~nbupqGLrTs%N)Q?E$*T-B$bE5&%GodAEfR2*6BZ5Bd&AJ+PKmU=s}F2 z$mW9U0ycV_>bN4||2pW;doaWK8B!f+yUgkoEN@oWE#18Ey#KkNb6EGFH;H7LSVf^s zl~FH@pWrohknO!JgbK$yq;K60eA{{R@70FE{P*X?N2+C-6=9UedlqB_QoIIcI<^0LW=M^me4xT1Y&4!Ap$EG{M85HqYA6}-$sOOb94Tj(sSluXI1PV~ z>2_h<{4rtOf2C%MB7(%(vC(n`(gP~kUxqfEhXprR9||6%Us-X1OJFj*#A^Akp^S>d zX0*9vh@I^aj5O{D1lx88g8|_D!8h9q?8oYjl6cf?t`}If$W*Z6fx`(MuMC@(qzdb( z3j#1U59{o*3;>HZ^U2bPgAMLwp5n>!`xrb_lNyipkEr#37%b>1qYot7t4H=FfEG)b zb49mWF>5FEOKiyd(Wqa^e25X{)?jnFD+bnz%EJF=O@(83&S-Cj3ijE|rv_Z-EgE z!1yIC2R{;#_hVA#u=p;$l7_uGa^`q%FtiIj(UpoJH7|>_QGejrW%n+U0J*Xq3q zoW#ECAIyMw&O9Q1eoie5HwJ}1>KwVppuJi?gAER9lD|BmH_p!y5g5p)-m%Ol6vS7p zbM_FYW!NQ60f`BjQd^{xaaFs$Y`Jh@N18u?PuyGK6V>Sv#j+3S zcActw;}%=>L0$U;9akp_|H z)NV8Pgm-bhR&)?gO7}LpGbtVCtwO1SBzU4YJC^%1KJ}tWKdE_D)T?GtPZn@N_;yIIV-TOAQuh9xTXoUHbC{JVTsVqbT6{Y%pTh8upKxYhFh6HU28)oL zn1s-82Z&i?xw2e%A=up&bo`jY+$5C;3B$+lBhO>=QTKHA^xcdqRX- z(+6U(IVi9YA*OS$$1}YNF5vV@@xA6(S`x}unm5X+m}`T0ja$)tib*j39`gFDF9NR5 z$+*z+C!9GTJ{NFj0Wo_R%D)DL&ar?&Eai|-N*3tONE)b)FFO%%eR#5aRCi{T5!emd zgVHyiwZ}+R)*SWh^f}RWT#^z%=tKb)jsrP$Gt8(sZ=?%mwVnJ-F2}uRTygZoetJG z_g!uj5fZI&To0xqssf}Da}m2{K>e1ABmW0ss^jNFP@E|$dTwV8uEc2(R&(?|wE(um z%Gg;nWnK72!TS=7MO2+q@47r7{+$~T2g`r9rHU&_Dfsu-jrRUD6=L+;PSVv22;vms zZpM7tbJE*Z=)&af3nAZ+65~2rfhj-KeY^-a&Z)01T^embYCEE~T>a+NIfmG=DpxDR z0}24{dr={*7=5{}dokdWv6m!yF({W;UGj7qMkcS$2I@5Q2-PqlMuads8W(We4e%0! z;iLzxXsyMkleMs+`gW^afQngWzMLy$ceRn-eCl)o16I981PJZ?Iq#>o{2gL3t57H{ z1$(u2Wq~wE^_;WkA1=%osm`TjtC6iRDc}!ur21jhEeZ(07^-#%u?y7aCB+AdNP<6e z&7B&fTa_>{Rn4C+h_KxO>CUfA*`2tR8+6X_aTNq;pPHD>vb)h+yxxFMEFgizW8+Cc zd=IkC?onRgD;N@(f+va{We_Uq);Unb8JDUCyCzU`=>Vi0MC0N*arI!Q2b)&Itngl? zx;Be|6dS$~2=3L_(%-)y3M9Tlr0sa;Pm>w&eQ<~Kd-G!cfe2zUMSr$*48?uEJ2r<0?xd^iE+C(%FyWY#c*U}bzmB2&G}PV%Y3~px=^9F zkJ28!dbe|YQK8p?sw!2tTM&ssZt7l>daYXD+Wjx|Rvl*Ng}DvQG~=Q2 zCo?|wZtK^J4B0>P zzn6*b4KHf{)z=L+{Juc?r}vUGMX$UG7^BRq&4{Bz43Od%o8h9i0l_G8^ODi$Zkm&< zE$KF1vNmO@M71~r;EQ}xg-N4hW)&xsHD^8)&<#K+70jpO6aISQN z-b5YCROzMb?1@+~C{q9w2RgK&W>f|q)%2?l<;NN#K;tdtMQ^52e;abUJfZ>oul$VS+}=yeFMkTR58?x!{XXv|ws$|a z-*qY{Tn#!7JDPL<2+dI3gZu$7jG>+zK70ZKLFYAR>Z+@QdL5|uS?x^O z{1DoMLia7Ai`f-ytl@3wI?Yqfz~JTaVo&~tb}Ksvyye5zS_&hbSo*}sR=xbKh3ce4 za=}%%2yo|^P`(fz`6ZiX+Sy^{fw8vkz|C{>`i&vXl=KbODc0zj0YIb70}lA*q$!7T z&-YHG(}(7@w$gEsQv8N`H-_qTV+n#zC>0-ko*#1?W9QT9? z!uO2Jmv$Gtvzj%gwUDEJ8O=@|aZ-C#ZZ*UeKJ&LF2?5dJX4rZDXx~Ffo;qdprWEf9 zJNeEVR8R(7*s8_k+#UAtO;^Q;j)n*xcd%}NLuO{E0rqoM5%Ve63l$e6a_btqPBxdj zv}q(ndO`3DFk))mCbc)wIOAIL^winrN64Gsb+EyxbuFUg2n!uhE&QifV+o&Ew47Jo zTms38T^t02z+2X1!VtKHC|ObCWKSi=)jdupNxz6?G=g#)BnzH1Z$ax{PZ07>jKZPh(#e+s!Fm4S!#+rzeZ&h5{S9x*7pUAkp z&0}YJzC_+11p^`tI-c|aA>xeRUFG{ltOJto;0-IE;{_B*Yw_^Q;x6$PC#whQ% zWdh*M2U2eIY=P|>8f|z}zoGgS^jP5|dhktnQL8XGW}N?>P&{;C4T|Q+0)i1L_SpxH zYH#d3?F~~bGzrww-e`Ut^pkJ;tf$Zr!vkG(+zy380N@NOc7lMYAD;vCNcnNkH?1=z zzZ!xN%NK0nsDrxvtcv^IquR_FvkmHDj%&OLl%YEHTU`D2Kh#w)A@-bM8*b{Cg^?L+ z&U|m$VX-o8u>lLl*lr4)zL>d_&`>3mjMqzY`KOpLrWf4IV#BCN(!vo&8C}lMW%kZm zC*rTlpa#?>22(8S<5iB!y;;zi>uJ!=1RMyxA%Ae|YaiWO?IMzz7A69EDH0?U!9E}b zcr$5dW60%woOgTN;p;B#`QlA*5R)(<5QzD(*#08^ui|(z@sCj2x5x6f+8#;(>jiXm z_jI%qC>OsE34bf3`;+^rK6Um(%|EuC-0v^TmHL0o-O-ZRRcPymKV;~Sac{jp$9>qa zNROica5-+zIaW<=pAD@Qg$SxovYRGZDi&UL@T*}AUh28H(p)gJ83Pcp#QnU5RM3JzbJ&?k8QoXnd)6elZ0*K>-b}X@2{uUv4egA0Rk?2U} z>1!{nP*>`L4ub8A8*^Pt>-nJ1;I?sbFx^W6x!_HH|K;3QkfT}L^Jz3qVbXjykAQ-+ z@bA#;M>|=_%E?|n39hy}j6SBiGt>7}y44Id_wS$>EWqFBD1R#HLOUNd}yFqcK?*;|B@EWYR80EP`uQq|$vF`s*F8%&~dPlUJS@M@)suRo1roc^Hx2oD#<8AFEEJ$Fy~jwIal% zqCL(3bp;A7o#?#u@#;qpFZLF%+v1H^u6KsA9#Zf*ef@jTzp3R?K{;A1w47EzQ_Us* z4*UUAmr9c(F8QP}exqh@kb@(@U1Z`I#mg3!By6wd~ zFVpothUb~QPV0DDpPD&s`tS{)*9;Cby@aKHf3!p!S!F*jk3IK6m7;2=-)o2`@a?Wr z7_(J&;I0~x>y|4f8As=_PWs~=x&8W*$HE$lQqc`8Mu=E?d!(u89^2!ZRq+CVnY zN-Z890V|EMd)}{~o~v8C<9nZnHJ)p)yl8uG1A508H+>jq)R*ZH_B;sR5i+9s|2uD* zRdj)`i+E2adh3r`x6q77j|{nvn!!`d zV;m+S4npj&>Q_J-UA;TURN*$a`;ZgJpG;{_caigE?P%3;hhk-$XmDGz*hn9HL(i*) z61uUT5I_Css{8SXw}$vkKBl9RnnXR#2AHOU1S7n}yaRUDgRJk&_eule9)BuF)t$Az zzUCPT4qIA#BXus@wxqqkr+1iVM(%*Z2*kcmMKr`EF%9j@0Ob!uJ%szmkJ0`{Z8ryuuW!3|rhV`P@T~*Zn2* zdEh=*y^MNkmy=c)nyX8%RB_;{=+fSPS=0G)vA?|w@9_?n=l9OL;c+MM`JA=AU+U16 z%h>IiJ$J%H+Nk3D35j?OdG!ef())Ihw9#ZI7~s6DcL6Kmb@msWfXg`wbGkBHOVMdm z<8{#~%?LZZYqLm`%9eydVpAmj{P=kRce_8@b9B|ak*tvxc;=FWOxg~KrZs;W&dylp z|HmO-cYd{uF2n}O+NM6pMfD_PmEGGOJt~Ec-==_@`W^f}R!tOv(Na5p2?xVmI3@z- zt20ueroTjpB!H}4tgX2&S4>aOVlNk$Z-YlR?Q6BeKk{BXQQ?O_2X;*OA$gXs(F8wyXberM-Y+L4GCxKAh*(J zo7&!JKpnEhWSN5V-=V9&vPB@Zom=yZzn)jci%TR~mV*5~XNy^m!Ar+RS8>>P$?)_Z zE%(AkoYy#OwnZ4Tb^fq)MGbHLtJrRJ%q94`D`m|-H6G5Du|4Ud`;X6>9yeC{BZ`2r zw&coPV?=>-rvTT{sIuiVpsL#=o7BVa>uVv#JI%dW+irWkyL&6EwtcgG$DZk%N#9D~ zEHpckFbWFPR1p$Xekj85Fhoqf)79h4#d-I|=3~iXMcUlLHX-TMJ&37U>1ru+ zZ6qz;!RqnTTysJAWMmRoqdBIo@e~aX2|{kyo0B%iuvS1bbr*{-&6K!KcFiLceCFye zR3s^uY1b>q}agHgxWFsluwzIBfl_uV}2BNK0|0jMIl^TKqRvqf^c3z8g2}tEK8J8~)dwdsIV-Q8T z%8*ySNF9He-vi2d{fP&YzhfVb2V;-@x|hBvc@imquCSC@xhk4Czv^<>jO6yR}M*TI%~uU9xWy<6noT#Xnr5f*bX!4*v#6xrrVg# zDvIoNa6hR!7gaL&eN+rt`5o@d^bKCsUHK7zkwht!Dow~ZI$r~e0)f4~=k9oF6`83N za`~EG+d>7paq^L6%|fKoxBjt9m&8A`K>|fiX8PzB4Vu}@(;()SF2q5Ly1X9UGk$PH zRKiAE(dX)UDmU6h33-KwNDg$&dbqroYA#^^xz&Y6|{f?Cp!2N^3YiE!FI>rv3OB09)_KSc;-MJKt~j z3x5gEy4*1leC7ChFG0MS3>6 zMlvKgO8lunpi);8GTeL7(751-By0KnX;e^YW1y>8KJ`uu2yp_F55V+kz-4J%^AKgP zw`+Y>b$FmO@mg7B|D$PAt&D$Yyh<^778cs0wO~XOU(E(58Of}I3018&v|;CuRitv% zr{Xo+ zqW;hRWO;Vh=@^`YS5AiAt*Z}={w=8{YH6mq!C6*PHc`C$=2a+)Os*1{a;WKV&bn`F%72l(yI0ga^<~A z;RnA5p&Kvs_hWEiW+dd)hjlL1YP^7vOgH#3Z;hjR%qJ!M^hK_!Z~|0Ra2%KtMVW~Tv88Q0eafE0&5(V2oEAEvi1ZBv z2bV!vX^t$j?I^xZARs02T=|hnrx~eGV0;M1;dvzs+O;{~)svnj8L4%C&M-)Y1c`{a z;~04fB>G!r2R=rydTP_^tT2!(EvuKQuuP?j{w{zkykbQ`VKb%fb_F0E@JDJJ7>>IM z=#_Ts$FrkpaN`{j8cc+(9TTo0W;V>x_PoyjzSDr|qM@PZO~fLrI<|5#Ide0t+QJ~d z>Dp67i^=EUi(h*m-B5#QXHFjrzn4>B#nuvvcjZRPccvJw_OvAxT9mY15!&~2rjqX6 zGI1oCyGX?3_kSOgTG>Euq>x+O%zv#zV=|ivXgOz!HDYY(5`I0g?}KAaeO%%8d?m7B zG=Ti6K01fyay#e{FuLAqE8wsVqh{99ne_636*MvyCR1bnHNlAF^g=CrP>=cd{?XlW zrcde8bAb1GJi2!$X}LF4;r)`*_oMpi=>PA7^N5Al?ur({_6Lkd_doYFTb#VtLxtzX z9W=X3s7jr+<9`D-fuQNZo@X2$l8&2&WqEx*6XqyQN(_y4`5872E5i~3x7dGf7~HRT z#AI}k=Io*xCe^ZP7(aIlmA6uYG z7DVsl?NjK=33((3o@cWU33(D=%{WvDig7yL_&dYeCFF|l8LhJS+TPoKE07k&=vFrK z2waZ~_2?Q`!w*YYtT+>SEIC@eX6(>r`21;dJw_-iwd>FwCC%XvCUZae?4mdY(VYH% zHyNzR=xR*!qTGE4(guk)T?FUe&?yFe7(Ejsbq1=aW0vX{M|{>^47FTdE<;u|B)3a~ z!n$o+b4AK;It@39N*r>rY)t8&*xI(25l;Kfu=Mpr+>AG?@m(VG6X?$E-*ML_?<_^G zNQ#_7gMJ;a>W!S_vHASIcMesgGISz13K~4Ezqhd#T99ir(7aT7fAi>lxhrr%nz|f9 z!o%DU{ZjXT46Q{)$Y6*XF*y#kMiQAKOC6AhTJdD!7tavKR)*f2iyvYH`WW? z#ZdY(<2!DuG&h!ZE7yKG2^G-beXY;EM07ktnLxcF!^WF>Tt@RJ()hWJPLMp(pPlW| zdwu$F{gET>aepSAaDq6TJJL)P{vEa;enLtpeCARQ#G7K))5?=PvUtZTD%Y(#eglt( z9Qr373!yo?KC&wg)RsQ+vMQDY#I!<71GWHMw*0yk^SW9DwP~ zQR9bSLC=sClh9CuYfpu8k5GkS5g!aE#xjj&>CmPvL`N@BLVVF?ktvtNY5I#8{gieoZtO%hfUGmZltTnOPgjVdL_DqjKp)PFa2NO{!^&1uF~ z%B?yW4Swu5+ju_ZTpe8ICnaa@1Ec+*Tjf9-E^1jfeA_z>=?C@2N?9D)4JA(9TlWg9 zSX7c2ozDwy2#j zD4-({zf`0aGU$|r2Fx*;(BMTDnN&fQ(2(9C#Kj<`zNvwCLbYH`N;{eqPEzsV(zC<%on}36AgV*=A%0se( zn_FF*oOMmb=#{^#0Q=~SSEA-tVnf$j9#dCMb#Ha{CX2mvRZi*0cO;$KO|ex@9QCFj zbnI+<#rH6#y=+xB=F6e#Qv>4V=Qyqz`P7g8Jve>pgMwrWM8j9WdD7zQc#N_WCMSrg2 zxwGYie33(^*BGNYIX$niIkGmfylc(IEASDkpWF3x<#{DXSfIwB13l5svFsDEZZyzP ze8JruZB`8{8Gk&c8r|f^d9$%Vz13n18Q=Q~m)7dR%)>ezLE-fBcWA@qnY@J~eXQ*m z@!~L-S8(hO^6~aT{{p$H3n&+KoGpx(V8s{%%jPy@O|TYS z=QwGGiRGV~_HZ=Y8i|S35Ls)WM)<}9Qq^9H^vvspu%Uq>fG3H|F>zJ@u`#^Ije&m zd=f@loZSUaTWMF%pgSpH(GB_* zutaGo4HrzMS_L}?zr7XcaK== zHAdO;1hcV2{b273ksK9sv5BxE7iLc>A>JcOx7@p)xhkQbm452b2fh?|?Z}@5WF(m< z1g;&-@86Yrv!b@e>Z-FYL<41;C7Z}cPv@XBJ7w!r<`$sNUze_f`4R70{w?3^1p3ig z>rJ0baz&bBTKqNHXy4ZsaC&Ne9v{-tT-^HeWWYUXk?Rv#iwIB3zIGbTYlU9fgf{%* z6CXQ&j&W_GbUbZ=;B+ypPzn<(lc6Y5?r-)Coz24kruhlC(>M^ zrbu;GWHY|uCKnzV8MN4;H$y&YcN^6*IbH2I@|{j6muTgL{d5^Uv}{DEu*PXl3_n7N zP_7zYwg??Z@8~UtnqycYJ!rs9{CH5bU)o<@7R^#?amu9EH#4i}QA%0@qV4HXVYb4j zO8HXN494!wyh%A~;2UPZLq(_p_!iS8^7sy zltSw;czqRZg=tU#+ti=2QpZ(HwG01#I*M2s1=EnWE{_ zg_tzY=ovu+k+vS$kSNokM;`a^X4UHdI&xsYXBM&8HO^h2REO4%ng4Y>Ph}Fyo61I_ zuw24HnZb@eR&!zNFk2g7NOcv>;NdmDiGBB<;lpvmkI2*`3EenX={{G741Lx1Skb$y zH@u8a;f~=r#B;~}xgH9R;*x++*H8}vTB>qiI)xt-&K-Z=!=;}^a+q43&tu3!^a0QC z`8?vk^lzh|RUy}Wq*~(|Xs#kCTQX9oF-ap?03{Q{D*q+E7<#UG?H%3`|UwHC* z-ao41Dw=%wJaMHhjR#R4s&x2~7f~MPwgqDt@%q$NDE-$P@cI1A3Fj0e(oc@d6NI)p zKg@eRcldqx{^~sE>2gT z`grQxaRvFuROb^r4^Yl75_=o4t$J_0``#$_jaMx53TLr}sF%@DD_3_=}z+ z_Vm{ZcnF5}JAL;L{E;Sw#ml7E{L@J5?jlm%p(?Qi_RbUfCKS3LnirbGo1Xpr1{L){ z#jFw~v4#pRb#nW4*5!k(!*D+_g4{#{JJSdl>lXIw2A%rB!g#o_$Iw(P#JO)r=XGCi zJe0Y4rL3+@?s`1BJ0F_p?ncg#zW!?|_qR79Xi_-hS+<-yEWf>lQi^Tuc8zOT2+*j9m=layuy{# zMe`s1Az;N!^7S+)z`hbD5SC(oz+;m#Yp9sRan!OY=`YoSH+HEEESUG->Zs6BY4p-b zfJr@`738)uCgAix`C+r*R;o=!SYPDubMd&d4_ zrhvkkH9CWjRp@F-VDLx8fM74~PjpNJsj5|}&JhtACIuPC&j?n246+>7P2c9>p7lCg zYDg9H&UXFs#OcG63$6auaueBdu^NNUm;k>cfgb10Dc_fNiRan4)|&xJ!oB}WQ){?9 zP^l)tds$Bk*X>QRGE2O6m<(R8EuQar{iR=4koDJC<>{ax^IqBC@;0aXv{Oiz?RUGY z;XP@2nCBbbGZo=uT+ z7DF!vnG6WMBBh@&dhRRpX8q22fKIxSlMTQZQ1gkbdc$WX`No+QU^%;AKxgstw;cxEO)JEJsau_R%-9Qk|*f}JnDVW8xL-0ys$G{_lNds6f7i4Kj2&N30W zF7Eou{b`TMWo*Th7M68O1IBSM1wZOJ{kO~%dX8X0uJs3Ndw|7eo9uewKXZiM(Ogjt zfXXE@&&-xX(Hq{Sn*VEg)%QkQI^(;DN>USh>)%DBgV{)C4*kCqE0S^9#!M{P#f|g` zJdzwa!-f$BGNPmCZSF3t!4mN%4z|O%^~ko`F@=1>WEVRgPlEk+SDl&06mo|PM#-Xt z`=xmYshsbiou!BgIg&}Wxds*5n0mt4pMm;k4_rKNwL*~t9l1UrZpWrQsAAlYU`V><59${}Kg zEmw98-Oku<$hhm9EQaHDRRX1ixg7UIgh&zZu+hxwLH0lqZwTHUB({Tw5cTohiZfN~ zMoRWYrhcKsNw6ZaEa*{h6y-$_P*wEqszB?XMRksW;kxA^w0c4uqW8X`#!BKe)M)I% z1?Im`z9$x`sQs?^X$*yC3Sav>6d^nVXIwR|1HUpb`9O!YGcr6)YvN0cY@o*uxZtK<)(NL7%yVe9l zPV6Wyf=VGrJSU>)C2J`Bdpr=oywAg*kNmdx04#J&FFv#8meRc^!Nss>hueQShF@|80aV9`2cotpv#}lhRn)nYpeskC)*KZ~NNwMP6<1Y62p@>r|e> z%JF7+3BBv^YFlc1n)Z3QRuHUjx%a(#DgJ9n1BAEW+d)Gp%F=vq(6W>1& z+@DveRNQ33mP_fXPL&2l&O<+J>YPlC!P$~)WYuDt=oNo(?&LZWu8Xhl(H`-%{=3Fz zTYBh3R(d+qYFc{&8mWqye5|SLH|?~Mj=v9&nfIHnV)eI3i&dsHV&p2RBXh}_CC||# z*fW@I$`1*-B9@8cEXAt*G#{zT-~@cvcm{%AU|-b^JMm_a(E~z>^WYaICMB=)uBoop z5e8=QyHpv+377X7^Ig714d6q{jDqnzehB=6MK%~76oy#8rc4mA;KSFmn

Gaw*zDGh-iw3Kc(4k3r z;y)iRM0`ZamS~gNBNmj%2@D23D@%*9vaO;-C6!}%nR_BSXw`>O^N-z?=GOP^{&$~X zMfQE|zF6O_`6kwQYb|bk+)>tMWvzT+23mt!{S8qi9^>l0L~yr$#TQ)`phP-;p{lqt z*pWCt8Vz54AbfcqFSmWB%Cs2+8!S&4w+0yfU+`MHpD@ARzlRpsAK|`#hxIO?JBj>j znm#gVAlXhl%PLvb?)8+EIGG@aBIoM#;5wZHNRXdUlI!9G5$Vj5(1JZQ^BjwWY6KUZ~=PB>jq zPRFYZ?Mcq+cx30*a7{cmWlDKOnl$T$L8E`DGrK@Zm&B--@6jJ|cYo0-;Pdw9c85F3 z#bs3}u*(N0Fe&1jS++h!&;^A7RwV ze~v7F(N0PlA_>i&v~XCDHJ<@8V?&o+36>WwRwf&JyW6 zLXv%gsRHm_UkaqUyBL&a>$V`O9p%b4y`$}%0-<)@A!?k15sUN&-iY7x>6S!WxJH&l z5_P(N2oXtA(57SL3f8ilLWB>1{Af*9DLM1s>AS2~-n58*SN06v1I`4WmosfAM_D&E zfQW;8ydVYE^EH83{c$DY!PWWbK&gu$!Pkk9m*E4eb~=052rYxgjyGuXTF_v#yzpIV zc4y}GHbpDg`GIy5WBQa@L`=ur8my}~3UkYNSR~K*Ur6x1Y%uxJYJ2XUvVyfR9A8J0 zbr_on{UdR5*CaoTa5~mWyRPr`33-qa_Wj~zoY$P5U&l9#1N6$>c0*7mRuL+2ZpudEBGvl zrV>kR2NlAL6pH0#k`;mZ>9A~j7&j~66&&9JM&sDD#52nkQ_w0BgOn2FrlXdnlooGB zVWRYiU{Y-iJRZ!@VLE

J|Tn1>1mtM}Q3bT~J98PepZt=K4)(zRu^O&9=m%dX#2a zzxmfDBZ5*(B$T~iM$qZUct@Oh)6Pq z&oXT2vzgtiLq@GkC2{XDthl`pNGanbB{&-o))|{6!!2wdoQ-N~VSs%*2=Pt-R7ca<{^`p`UwxvO~<|qgPhj$X9 zW{vG;NKWZh0w6Be+N%~1MEC@lr~j*{aY^Y^$7Ivq4EB?~ zM2XLmY7-1il+uvlbjucvw*`F*lb64)naFemw zEN9knoT_6L|JGi{DO*^RuxN`G#WRt~r|Y7H_@+R1s+;_qdv^qz^Y92@2vjI)$UoPP zp&I|~7^2i?!wb=5;N?z35cs*JGvwvW1-wxMSlrO@Fm{~gY{=&I7W7z!rR=y;KW}M z?#^K%YSC92qLc|ZjXaddYL4$nN>iv*D>A5aF{>SfcAFd1Vm)YW<`VZBMQup4wB`8T z_LQ!EZqcqjj0&VyTkm6j-DB$}U}Wl`Cc}tv=x><4Q; zvf;eGZY16KY_Z#Ty0*~jsY!X#otLzT29UDvj87I`w>xZzpSw(#njrBb7iCqP4paY@ z>!uT6CFd5^Dyswef<_5@->5Wl*K9uHm+cZK`507N2S_*;C5V%YJmane}BBT3N% zREjgTk|*&bbNSt^rd!`riR(B(-(f0?ILs$=nf-Y9PB;d$;%M=B@R}`(IGs7(P(pnQ z&R&QEAh-z$hWF85Mza`?R&tZr!n)bmICdXi)3M|m{;ip@t+=;O28U{)djU}?@WP95S){Ca= zmgGgZ_Qd!1^P5(x=?02-bf!9)o5OUf3(HBViaK`a-P37K*Uv*Dspe4RA#NV#Q>k8a z7pUHf6%aF~B#L`*N$Sr-M}3C{&mr$;XlNKeDoLrjdBtj+xbQi}`X5Et7#!ysg`1{n zY}-y_vr%K)_Qtjvo7>oS(%80*#%$8qyx*PKU%NZAyEA9s_nb$k*Od_DzqQWY`M{kg z&XTG3Z9g`4rlUS8-g0IRXXjD#>+IgHqBND3Dvnh7myF=s5KOofio|nL=WF&Vd~7s8 zS9htrAiTKuqx&Au&e|Y1hH#Uq1QcBb-+5M4-<^u zZiP?y@hDtOr^2qvQQY{sQ>Tg9mVP!NhxBRI9+*854(KyIo=DzB(!<<}Jf0V=Oq(T3 zHH%bdVL~=QT5AK}wW;{b|4JX1M~62 zS35~{tPP?*bc;5qKUB9$sb(u)23o9{SGf$i!)OCcVzV*T`~=mu|>` zC~J>RnJ-G*$c+HfA&jBu68NWvpa(x%G0~7$k4!^q_LpTYcUlQIdq}?tbqNkeB%aX6 zBYw-v$)2Sfs!mUELh!?;8*2B{{Tsudu22cT$4~29*XFNl?DI+U?4CDgd;){J|4w=Q zT+*vk@J2z=bB|W}w(yq!)Z{LS>ZQa>RzOr@7)ypT!*UmYJh-t?oYzX!$~v;^2s(Gyi)*qI zI9Wi+&sSE%%y+{MRUW#4VY_~xPS_L*9Vd;y{L2vSoz^$0v)Pfgb%y(6RQ*^NiyBN< zAVpVDz;j)MmfvsZ8iQ9KOTXWL?wq$&63rtHPtnIhOsPe=Isd~Cv{uPXlfH_bf1FH* zM@{TMXRdlwX=G@11deKMev*c5`19E)leKtxeKrF_quv~Ax*}=gHs(fc2abV5GFB4uEE8EE zcam$4i(>pUR71QmY`KOY*T6BnREv9j02fJ`bhjDH%bf|2p{I?jW7QPo{01!; zJGpYxHtwg7v^(AS@y(?C8UG0Jvm-sJaZFX_FS@ygwqSr{bgB!|n{-;P(Wlx}w$Wxm zcz;Vlmp!8UZQq8&9HIO_9@+5%T`$OoL9V%uJKia=2?k%c{GKoREwAcdo9ue8 z4&_|Bj#xSG2Q63I!U@5QL-^M$0_uJE*N$had%7j9RXljJ#vumWiNHtj%wzRGY-ari z>HXZ8AN@T)*>@l}kjl_=$Mo@ir?^5Y5^1h1&$Cx4Ib9f`QHa9X-SkQVPdbe)3#MnKf8c8*|WNO4r5#e*M& z1?k*Udh-(JtH1FcY~bvi1vG$5!eI@gGaRM=FAwvV5OMsfH8)H z2_>cMh%x4IBTnyc1jbOU`l)v-9Gn$NZ|r6p8f@N}|MlJ38R^Ii*%=^lw1t(FN@R}j zw6N=?ZF#S{m`FiV{>9TZR{64IA zLOv*$r@^Rg<2%h!G4R(H?x(c)$PtNNZur>xv@4>%b@i;SECx?OArT8njl6f~?O}95 z0iXJ;MeyK!iV0RsfZLC3S`93=qZabC3$n!?_PlhLh!{M3J;zu0Wz1RyOGb)4m?vDl z(h^JTyC=?z?HOL}$H(UVP-m!u9!C7eaJqYXa>|+Z>tB8bRKlkiJL)U#!!{*G<$D+` z!|0Mk?mp6DcwW-xjIvDGfdgvNHb?d0Qj7`ow`f&E_v^~LtW!3=rAlzb4|tARvH||_&2v(NKU247ItarTftIsSXeMOznzU&^W>?i zalT=S4mA}VAjyfhxc(hNaOjX;n^9|tf`u3w#oPThMEvVDW7-L*53w5f90iGozgTiz zc21NMZ8WpxxMIl!NK*9y`F4qg%2Ua-7GtHO1QVsljY~%kJrI5>MiWaQMs7#1_rfap z>}8Ij-PZ3r6$dPTk34L81~toNwXm%kE22|C4Q7++s{(FrIe10d>4p8&i6~|w5w85J z_FWpC7kymR60F&DH)m<^-fuS89G6`-T<v*EHg z2vrwdN{HaEz^=+|ZcNI{oDv=#-9siK$FizDE;RZhpTT7a>-zdaPfcS+zu~jWX}&;G z(d2ej8Ez2N^HOl^=DccUx zL_=vddR9hzHY>0()%XTkmH@rvkrRv^>Z}Rec(O87_BS;i&wksEJyE`=8J)?)0_->$ zvE|Bo)8oJD8b7?qj!RzVFLvf1e3LdGwnXN^f;~*;R5srZ&ErJ%Eb_Y`7}Q*N=MN+9 zH`mo?@tjG-@_nB7PFqW-``2sqd#Z=!8&2!yU79>_gjlU%7nYzb4!w})TmnN6srVD( zS083qd*+}H`(!9StKVq&`{PwvB4O&+)g}Ny+xG!H=y@BO%Un$i7gT$TTk1!7o zgaOW0<(JH8sc_3=I4A)l9! zVU}WKr5-6>)XY$%D0F+Wjf)OJ3Hfi0;&$E4(BCW@-1!sNJ!s$iL&Jb21*^1)8Ka}G z%KV=Six-~p58Jr&=cnHMH^SHs$w|0ZTUz77kg|7H+2&I#A6ks#>zAqC9|drPLuQ?- zAXO8uxLO{cNdrfmklV9yNw69KjMDKs1(w&FFXE@Js*2T;?m`cw0>6~QzeWPzGj4cJ zjx@@-Yj^~+*cn`{sqzs{o2_&;^Z@x-!aTMa69Ic{U&{k2HuWI{@nR>|ZoyYNc>Hv& zm6?gSDD&>VlQgL*Nhm)*b0#5wE9`&1r>Ns91f|6-9kz%;y7}7K1OHqT!ISkmI)DQ% zAJ>2}oQVV5xk&o=Uqca9kGOWsqe!Svm3GZn3(FTfyteoIlWMX`X=9IH$VUv%cW;ZbhG8El%^bQe6I4veNYp5!;%T?m78C@^lfYr`g`f9ebnF<0VN3?>@c z21*Zpj(R?19Djtf0x82O)J5i-&(g8BE#JyZV-nx@*vRxv-{CR-X7)uwq@!%A{+qw; z^s5tFFgV;W6jL9W;oPp?h30fEI5d586wWyi-J zggTPf>+uJX2P7W|q3R(TNbl#?^D3FvBls=jbpzeW9;Lu@Gu}}troMf~PwLzhUKhvX3*JiW0$Ifnf#Pw{YCX49Q-jtJ_9k3}g+Dh_k3%#@*hkJ|*?Pqg8mouqPoRqw@;f&h<{Jyk`k&4VU62gq@mM!)1>jZF-e3-b%Xr41KCq359}P*+EiaaT;ZJ&JI8UnxIS&(IRR zCJIYUzz?bz(hQ1kfLiFE46RNsIX8XF-zgZ3M5+J9`|I9}hnnW;?i5RxVqF8o<48Zu zQuHvBQvYBa7sfNyl5Gt4EZ8mmt}^rK_zsAh#=VxVhm)A*weO7q+HMsY&7<8mnCQAFK?7t5z-sJ8kbBNyhU5r2EhYE*d*TH2ZFBPh?o$Fr-F6Ix zX_3q;lrZ8ylWpT*EoWB7fsj&a1|4Tu=%&>sS~mj!4D~wm1LD5tVL>q%|rWw zyVQvQ{->IW1b}fZTRh!-%F5q3{w@W;H|Dcux~7{zNeoSzntppwY;Ge6lBt>_a!X(` z1xU`?iHjosmFZz22LUDlw{V{}Ffrlqm}&pyXz1z`mKT2~WjGeyHgeZGI*}`=Mfvb-0(_oLwxr)nv^IA8 zh_gqn-&g!gPD>}>*To~4;xhyuo%j?|XHUH*a$s)GPqKNE{y$8<;0L?zv`h+?y`S&6 zDJ}U|@56pW`AY|9W$gukolnUr<}5-4alM%tF2HC`p>C%g!>Pvak8mcyQSpYbn~JU z+7-${YbzuS=|@c5Zn6S3(;z$4W!aF#!aSMu)p^DFzD&l{6_0}=f|oO7t&Y5;>}(_e z8+JHdtZ+b(*QxgFG}ED!0@5I z*jF_vy*CXN;dO0r+5Wiep7X04siIL3c{xYFt|k602SVhseWl@uLHf0^tjT$t$s~l% z8wnW@FQLLg(a@459`6DTNOA?Qig;QBn`fvKuNHVcaTXdU?N=6jE&oD~1rbr6$J%yN zM)mIYNichJsK@IOQ@mzFq~r*{>GsFsg(&&c@ z`4@*=wekTmq3JBOG(1*;%IWSadriCuttU9WIR?CXE(3~^ApL|Gl7+gC7CrEi9# z+@U*0{bu(T6R_Gnq$qlJ)tR0| zhOGPAe1N?&ghvyBMu3}obSYH67i4**4I1UW43~d-+Gc*ZpRWDzAJ6<4kA?E(9D-AG z;+cP|EZEr~B^Lx|03(Wnl*zn0TPpIYTeY2CJ_pM7$ikPO!9LaT5~y+WGY#RRbp+q& z+a4zj-hwE>l~h;_1*R4&-TslMn{CN@$Y({r>_sKBD3|8OCRTl;iCXdX2#rNmO^@mk zA9eU7zkH4+_6T>4Qb&bJ*Ow7VSiM_#)7{)01T2Iw5DgqW;2K3b*yyR~oAINMp5}+H zfpH6@%j+~qpNFTd>xoMu!ItxHw{a8k>_K9pr1^RAu%BWG|JPs>YUqudD7=sH3Tm8t z(6=KCnh0bsMONx{2fF+1y1n1~!ZTR$RDps-dFYi!GT2Q&739ZjSk#;eKZGb$It>hI zOZ+_C;+GaR2ojfJ!ly@wy-9e`S2!4eiQ{LU8pP&OBFZ*QD80I}(Qak13li3&q|=JO zd?HAeh7)DVBC8qOAD#qKxovOtI#%r`5vsxnm@ATSu@I#xRg8rSM6CHOI*Sz-T75(d z7VFkbYUY;B-l;xZhrvKi$j}^i7LUC8m4^OblFNqcl!eX|t zeI6|5u%tb@i?4)`>FiuTuVYiM7!!EhpaD)SDyU|j(|qG=)Z6s0;w&{z{l((@@Q3`f zGU~&lB{GjrxON`X-cPGc*(BL8Y}GhRs^|FCo2KtejjdR&S>w)Skj_kfAO4^ETJJ4V zcpTH-&Tib!II@wSLF%HTx?-89tWX4QQ%lfIEs(F5&^6m*a`VTjp0|UdF8FYydi_l5 ztG-PmSC7(IRB#ij{FWgE0CMoUy=72nVf0y|B@ieUp!Zz$+2i&5coWKPvNiYeK>*fm z)9M(#4#-3!WgCgA7Pb##%*i1kIa&>SjYoY#r+9yH7cx{bAjW5GO&960NVH|X!Jy$; zdK6%Yx~pYa>Mw%Faw1DRlnEo=jl5fS;P?IcbGhR)au&<*Ds38TtV4K$iAgvS^=54b zEr-G%7o>>u*^5fvE+qc)j` zLoZ_mrki6IJszoo+;A~^+|ZlL?7AMCv` zod3*Jze3l@9Oj>W-_H_p3Uz(RIj{TQ_-}S^WaUgxTD zFoStXZ%MwX1T7V@Vnjv1oiT_uF;S#u;sc=RYT`HMrN; zor|lcaeK&~kw_dZRC86oxABVvV#4i<&FkgIK8R}$>~2*wk1nA>HVcIYg;D0>msZO` zZC*$LAB$-wkL5Wo=j#PpnK3)St9ChyFEl{>{_^sh$yQtr{CFHgyt^|@oO_0<$yRn# zU9h)dshWmH;rB5C^U%dBdMu}LGoL{Ev(mI4(k44tMGa;R(S~lJl>`C>t>TM=qV46S zJE>63`?2tTEo|hqZ0v$q_S6CCSU>uJwr}A)n&@z%7&et=^OEk*k~j*~Hzb)Fx5TN&(&4~BO(na~hcQzON++w*_tFaba22gJ4Ccq#IJ>@UrRu#(Je9xaMt1ZXA%M`Vpk5a2{ zKX3y6!*TZ?2H`tsRtjIPmIeaHQr3#2%x#y>jXf;;o}HWnMUqtEc+$+fiECs?!1R|x zW|IV`3h7#ZBq0d}XVceo?I*ukGj>%BaC5Fs=bPzasF+c(OayoHStGt>(XOUV0UBsG z=XryR-{1QZIB4gB!=|_4y;oial0Zoonr#j|*iz^OKKB}+j%RHu6S5?ZL1LvVr`H~c zuG^%V2A4&3yY7F!4BE};i~o8Y_-IVchKAu0FsB?`$Ogx<4=Sy6#=+T-q*2e$wb*n2 zds}_(?-i~?E_@;;*SVN^<4yZHG_L+1XqM(B-SPu|S7ty{g*^>JBV8Bydt@4q49mIu zht~{Yr>jNbaZ4sz2L@4;wHzgH9j1O(YYqPejgdt{M&aX<3A%W#tc~F^Q-8iaqf1;%`S(7T^O|c6wZYv{t`w3 zDhn+?M=n%wSZXnjhOM3yM^av4cQ}H?P(v$T6Lp@GyNk%tm5#QK(ur~^ba;dugr+CG3y~7nNZ!n8)C^)!` zjo?^lAgI_4i@outhnQ#p|Jq@a5_}b7@1KOIq2Igt<_$!%GL+kQAv?xF`-@P zjzs(*rnmFN@8aVk`{TwDJP7AhAE2i^<8%m%8;`-?7AV1$>!yayFAqXO{ZoMsvr-l= zzr^vZHA}G5`A^Q{{SqJRxqQWzlE65;L1HQqTpSErCl;(>KEL*ja{DV zoX5E-62}?T;F+J;EKRa?zgrMQqQ%g}Awx;{`8BF2X;Rq?;e%2p!?xXJ8s$`c20A3q z=g6ROBR9jZswqMJ!X`Zsq(V;R(K3lv(JQpr7@v`1WYsB?VYX4(`GZ1pX+8FokUrj} zx;#$t+~@`CIdL#;Jyem?wV_H7GeCwFCrNAUH@Z$Mlf`uX<`bMIqj;f{J$WY>2>3>* z<>|tD1!&Fq-7@{(cx%h(QtCxC7ipIVjQ(ciozNr(_CpZiv$y54Cmkemz{9FV`RsQt zJ1v9HcNC>}1|gG@b&+C;WLe9;Q>7eTmeKks5eHQoE_0;660tWY9k~;VJxrwT^xl$T zj5041^zg)(HEDC5pw)p!|Bbfwd?S9Q;XFuL*1JD~9h$(5^r$-0fBAFR!o$(PA3k;l zE^8NkN;FE4J&Xh`R0$^k1|e%X3)y=-r~!AMaXl^OSM#cu9C;csaGDfhojpsDF=qF4 zKk zoBaahtAU2Ny1jB6h{sWYdo0)a2m*o|0(RUS4q}_HFZYlgw5GM?iOwzl{gpctXw3N^ zp}9@-jizA3c!8d!QybHQ!IdsuPL`jLt9{jGTLdl z+Ccg7-rxD|nhNjCb8h~tguw%J%)fMtg03+1L zIO?yk_F#2(K1rSRPS@*S3X{w2XjzZMMk-$3b zNgJV#9qdQ#ikyv0*hDGZ=2UUCes&I?2q+^b1}=MIbvvCQfsdyz#BHZpfTS5Rek}Eh z>p?k_eLOa#aebAtpS~o_W4_UTmy23~)w9EY6T?!8tyc#9ZNv>)UQM`(uU5hruk9dWeU@4 zjE-)9OPM^GZ=C5<$#jjQ_rp#vm`L;>S3ycx5Bf}Ou-WTUEg~V2V())eqDrlzdzG3( zv-71cRlVyu`@(7UF6!wTd1_|);OKr_qv7QY<>S@n#yiRn`m|bGKC1tRNU|2z5|5K% zCWlVyj&1af!j}J6|DM6ih~&YTOBYT}V`ikdjHY;8>%w8Uj?;Q7q!`*q@b9Z_Vx)Nt z2OYvpqgg|_0z?+9{RP8>e$1>2PM2*aa~=-O!r>C2t&g}pfz?K{+ZTbds7lRFpqlahQZd(z}%xeBYiwd`d`h1W)c4C?*`rB|k{vQ8shOl^wgn9v?(<*!P{H zRrbo?4Vd>FV3 z^aC@i+Wy=(nWwj2biik7W6XJvj4g+Xn***>O*3@CB3T>*(I_cALf%Au#{L|c-Z`7r zr;{O}ttfUb$P&)_)VQ47(d;Sav|3aQO^Q86W4+jx)&AD4-D(^(;K}DTwdW;X(3pBz z7RQ$Zj|35x1+lsj26XBje#k&sxwzf!mX>nUm8T_CyJGqY==AQy%&cKbp!Juk>`^4K z&U;!`$AFm@v6l0&W3N-=&i4O5uRe8s<%%(?fkFZ@0S>kVd%is*;A6WveTY6JU$_ zU3z<}&i3W;pND!&aVCl3sW}~I(s?a(f>-TD<<@d)N{C3*7>B4}G0#u~d+lE0=QYnt z=y$gl@iX6DDf6lGJ$rY*kfUsw>jeAmBn^3PS|r5lMTJeoJd$}&$r08lbyrr!%xxWi z9OJ;PSU#-n`tHtH*~Y#WV-$s-lWz&)@4WZH2A6L!DZXJ)PGG1)Fv>F>Zq zeO2g8C*#Q88_5=iC-}RF_=yFJ;_reibC2QcNa-E7Rf7sqcF(^c7wtaW%WeDHIn4Pw z?8!MR9;+aKz?cWfKj;nKX^}ggzUJFH{;cJ(TrO4McAq+w1m?CewX9!8nkudEJgazV z8qKW{6VEOe0pr3yZVc@a$i&{nO!VP($rzF6({Ptu9#6EBdvYePdz))YSb0WF+GSZ6 zvMx49*q8_lNH^t#!Jc;I(m$G&8rx}(S@oySB*%S5nbA`kH$=KjCmvQl5H|Z;PdmFt z8+(P#kwh+A+dt<(023j@t_<}1Bo$=Q_r@vC~)tr~OE{enoT%o)vyav805bX6t1^=!w z7}4-^rS5(Q8z`yU`aHFlz`768Vwn}k#X3EVTC`pWbxqE8CNb!3#WE3@uj{!xSgVRK zmv1bbiH)b?^0Q884hj$L>=lvYW(%-KP#=?df)cHSf%Rvo(O(@j#zyjK$P#aJ&4nWK_u|z+oLLps+Jk8(CY8F!M=O??Qe4N@cZ#@ldEstt z8m=nRW+-Y<3IkEPm2-3G=Cj4}KKl52zT(D{onM0WKN|@_6ik#fgLXW%4Eb}03cN<> z@Qg$Y3|Aa1+fuw~)-(CqlbWLdH^?lbr+`h7M3L3JU`_h_1 zNJ?c+XBk8&j$M0-2k0iYRrQh&;7-Z~GYo!t>vUhB%~B4I@nqUyj|m?SVjG}yi#0}r zPT3*)Mp1&QHSw80mi%XPzMvq5!J=3;7D}mQK!vtG^h&EQ*}5tOU6m08{fUMK|K>YD_G(a?szHc=nJ4hS5}< z(z1rEoqR<}$#in<#|yRQ0=5_`Ise_BM9Y2fh2ilGQIHJSX?KvcNxv)J^n<&FzY+y= zK{C4Rg!Uc*k;TP-ktH);&;O!iRWpmUX`2EE;`_Rafvw(=#?8! zzY=^w8F$z3XWM$E((*A?__woXAUHa)N^t6azhifDh-kk$;Jf7?azrFJ`k01MQwXZG zn(=s-44ew+tu}ZKKjaizXZlBy!QlAMi}=cBYw%)7ey)k6H|WGlTfmLoKVbHXUqvk@ z;)JXyF)06d!|TmB+tU-FeL94CJ489H8cS%@B@LKXX$vDCT@k^eJqIWwmYkXLsC0B~ zG{D%&9H|y0m@ryE{)GU~x=ecEn_@le%C(xd7i2O#-2OZY+^%Xl@X}5|%!yP)Xzh0u z@7VACUeY0C?@&aEJje$kfn|Xv8*{UfRqh<^L-Ho*wqlMd?6OweQW%#@iOE5KZb>53 zg-Q0s=xAXYZyJ#(^fNql6pYsh$XIIPiaPzS+rA`bHI!lGPmYf*(F9sY(pMXd7wI%R zFL%EsHkjc9cN~y_h2Tz3i;FP0AcdPwSAf${t{6#LTPhIRU*%xlcF41o_;Ex+&QK1qTu1{tB6m8J;si_5v{)G^{9eXf%db#nBCX|nwaYLx zPh|gyn9Qh6>oGIS#Y9ce+y0E!C0WdXkTTu)7`MOkPKV0r%*LLPt`UeSeF+V9CTW2Y z^IcI&8(F_vvD^<)wO0R--?2ZWaW(0Esn`L+Q8+=Zp zs69O%FygwH`vI{=>+Lls3{GFS};GP6vD`FjX;`-5^)*Jo%ee`T8|u}q$@+(>*YVVyW8%l7!WGfGC^K^KNh zord*AER0a0Cki>Fkq|<Dq?%@0Pzbb!06RwXGUZ}p| z^7q7qM$Yd07eqNues)oV=86}dC}!-)7ONOwn_&###B61BMmd4&X5>ODL*V1VVuAwF zS!g229D_Vnm&C(KA z%rYhu!8dCdAS7r&F}SezT|@O%9<`M&FIi?EPQEX4s9qEDG(D4|kJZL&trc`sf{Txl;E{u)gnSqA#vWk})u>XXBM}b)&FRGooTKaUiX#e{ zzYzs(kxV_SY5XTAtN_hpH7PDmhf;T{PR0giX`}(**$=;ChB-?6-LvmV4IoK+sR{JvvS+8Uv(A&|OIuz7B0c?q7jHj-zVFn&E2x2q(0G|R z$KtJO*?Bi*532wzm%?i0kb+Wz9xbQsuk=}PH)QV7-va`#9h&ak5lwa#>2Ul+Bd)cnAccOMbBGy6zbRflgRa*PGt&J&hNuL0d-5K#HcgFVPq- zX7hOR8#LRjZk8WEzDEiimMB&&=K5=DCUN`bBK-9xaDaxiWIfa)TOas!4O~@C%6iT+c24HNwNSfHF0zw{W`P zdZkz+lS?z+A_h@H2Y5VSTK^Sm?9`d4sKNb$J~=2u0E7OBo%Hy<3L>wnB89C-RF+zD zBFmQqg9dXe*HCpK=*oi^23XuSYD0r9t~VYAUpy~L&I{SSG7k+QOW0_!e&9*Tn57>O z@D)I4>A||h^~_ZF zAMMCw`1FSE3B z$-!`%7n+flT2z~BG#I|w3c3^! zZ1Z~PA0(xm7zafXHhsh1e3aD$_F1T^-|iGwlwPxAm}mOPy-*b+=Bmcusxsvd6w9ID zT5v~>F3ptBH2vX+mFJ@^=4ir4Fq5Wt7^Rk;)Pz3Zju_;{xk4n#j_ zs;(L(e7!SHLCo;NC6=0or^dL-d=-hI)bg*Srwgr~)(LZs%lGrHhQ7kS_<*Nt)i7}X za~d+Vd{08xn&#QO>5M7ziyX^&%J$D+Ir#ujbT?NvI4jPe6pW+ zYl2JW^t*017bQb=Rjc3YRPzAv+o@WNM}sv9Tm;vZ%6*_4VLa*rsP^c>^ts2be+|U= z-^g#)AF@TOxwe6ST2`rPXzP8hXkQ;C<{L5>-l@KeTETMB!F4X7{;4~P+8kWf3ejk2 za@j-sRRICLS#;sT{PKW2IX0u`%u%&=(F^mn@#=Po-8!SyKrcUut%SP8!xr*?F1Y4? zl;N+#Sq z8C;cDsCB{pN1x)R@mA1B%xPalDDn^8tyxt+zuzb{hK$P@rO~#dvtXG{n^0GFix=1d z2u2~D`e449IQD^QtV7R_8T0!yhI6cAtq!(EUHH|g?e{2R;_Zg zJQ{MoteNPFPT+Rx=!*!4)b83H@q}m-n7*uRuzs|e^P*WQ#Ody4c?--MG#;0Z5Z?R_ey@);#b|D)J;zLip9k z0hmUcbh8gCbQt2}2bkF~k&{e#QRBTK6V}EEW&!i*@DySF2oJ;xg*5 z2RQr0OI|Y*A79?=6v3u`vnI8#&?HgHIe`hFNFb8Sm$jH63gjvJ{atPt!o0V4B-LSA zQsU!vZ}@50KKpR~!XG6dZfkRxUPDj(BRVp*W)jsF%}PBsJu^g&$SPYJ1*3{pQ?da=sVJk^3Ul?`fzwCdGp1A&#Rk5^_!od{ zbqatQ&{5|d#X?Z8jGILtn{RKN_KFjiQ77l(*acxK^}!}P1f?~+cnl`=EE|S$b&@h= zd+^OCvA*?7xe38puESW$Xw z*s*&1TsDe5LcBmp2<$CAwaiY>$k$#6cz0cAE~r_xhN9PvJHZE*0L6NXDeqwTw05he zE2{08O2TKAiO&%{cIzFnQ_e?Ly5ApakdXAjhAi9W55w~6in!mfVV*3o^}N`vXkmQq z>jx%64=`jf+t&NABr|a)9Nb7GKoMmh+{;OyJPykIIIG|shr?+%w8KQ< z(q*Fo*p`m^GtJSkmKwqCg~??NpTh2g=7vKN zdTYjoAVhD2%p+*JOeH*UrNCpPm?mG#dF;C=q>I2 zfX$Yb=VoQX6vOVAqa+_^q0!BdCvkPN`l3dXhX9#x^{PkEDLAD|!@X)va|5zApNylY8dNLo!`h-MG zEH3*yK4yAsVC!S%P1k*ob4>sh@Sg%lMB8wtl~VOzF_VU;6zYex;D{RCoPe>j_zg`t zcxPTVQ8ET{u`FG`Hza-jnQ6tP?M*PX$GKsw^1}FzPsFG(>LQUK(*x(lMve8)_0Kn+ zh)2vxMolCR)z}caC^YFmpWY~37oCdY`7gM5mfx2tij*bEj)xh>z6Gp9kv4h}X?JEX zCZ)J?0-?3OuE-)uYSns+!Te$W)R(I(w{qYSoZG(>V%~7H=EuZu)sCoO$zeTCmQDd> zkUUg!YzMzr*$5XWFOzJo{namL_?qI=Z;{v&{)w|^@~xLCwX=_Zu;(qW&R>@Gqo^0Y zt2n1g+l6vup#j$j?a?s6$2=ZYfB9&0h9Zo}buB74s6yyA`~&^VseN>k=O-X(S$7{@ zbIbWwe_k*6Ov(2_*5t@*Kb(X5P5pqi8*Kk(6#hmVEZ1yzU@M`_tp=q;pN|Dv0wm{4 zzD3C#63b?kM0#zRQ}%C|R+FPkly(3+XS5xmVYN~l++n0o@ai`&XIC+4s@c>P+%@!> z$UR_x1z}vH83l9FgplFnH#f-T=}b&K&2m9*qGnbllQi~+b6=d$w^^)=e`g@679Lmb z$$iaOfw;`Vvi6uJ#YD4HzLEX%TYV?`tZ`7~A9WeV=Zw)fqTwvsJ$P@NF}&NOF^u6* zTyDoyWGr6KJX;9uo?DONC^TgXF)-xX2I`P5C7qv2&DdY5-g zJerWmR|Ui^XE)kj$Zfi9+h4a4n^-(}r?2|aTf`vMf|E%TU7u?s`aEG1mtPez*|e-+ z8V(fN4Jm1%lt{p1%I0oY$MV#n<>V_+syjaJQg^&c;t7e9KMcH~pNzB1K|x>Cg3IMd z3T@2iWAyetHhb#IGh*{l$r$m=Dt|VR4x~B47M16MWf-*4Oz5=48ayv~Rlk5UzK_Vb z@lV!^Gpg%(V;TVH%+**!|HkFiy6{AvI{ivCJ3O!G7ja@ya%xKyU^nXKXz}@v*iyJ6 zSzLb_5GSfpTZ?di@G;g^ix?0iuRI3S$&n4(r#$hP!W^Cu_jT)i>Da{io)E|~Z8K-1 z(4z;r`g3CYef%;MX|3-x>N7WL4YQJJurzSuP_@e!hzVZ0cY`-~HNUb52S!3<_Ye*j?Fp4bD5QWR%}2rwzu$ zNQkP|9O<(oe!5*bt@Z}HSHYtEIC(r}1ZAuT>o0j6JPDr$V@w)qUhXu36*-0h$Z`qH z@dZP)wkKb(NdZO9yojm-C*4k+*ZL{NxdNZLo1fAni$X?xBUD%(CC_>xF%=J2s$Y>E z#QA*@hu)H6-GpIImES8xwp^@~cH~&{Yx{TzmCd7X@j8DNo0K}{#-pwx<7ta|?9HKj zrEoaY0Xp#$#AsnpBe4Bt_f~kp8p?iVC@~u;e-rn48exZ)vbD~g=k$3u(-lv4f4mea zA$Ny#-&N&zV4k&PVx-~7as8z3OlTk|18Q7WO5&C$qS>2<_A3yB;+S^+bnSyxz%p@C zZFdWTRZ_DM{*frW7*BYg&Si$8h@qN8*c)Hx?Q7|lCccS+EeB>PM5q%Zw_&p1$!Z1_ z+U%KY*L1~>h7pUETMwWag-)3tYtDS1?-NWfbY$#yf?Dl`po&B?o?>WYlk{GgY#XBc z!3+PrV{llO2n)0#W)cjp-~^}{_E^2tQd5}~W0pSQKuQ~JSk)334zDy`9|R4C&|zB% z6tUNTEWpoJD9D)T!HB724pkA6X~j)rxY>@No0c{El{Tl@m>cmY;%ohI9NW2Dz1<+$ z9JM@4HeJ2zQ4#<1hTZNrLfKf^Ju6$0tWgshyu5H^0X!0}M03xKuq+v!r>M!SOx_GJ zCR59pC#`J`%|_0NdbQ=7h7#g~>=z`bwlgCS=FvrL`~5+Ik{Oqq<|Lb_=FPH7I5!*9 z&ADHYa_)-pN9eGpL<72U!b(RP2&cJ*$ItxnrCUom>mwj2a=rrRdBO@7&^#7OM=I=f zxey{r`4h%$tlH~2bd6@UW0ZtR4XQ9UKQ=>MN2*3%c=5}=E1vnv4tu=JVQ(3j|5Wv? zl~FV6L>)S^b^DVc4HXQKThmUlGuvy`yvO+kgcPsZ587&k&9ydlf|C#zqQ`PWpP;72 zb?b|PD0Ze(fyz?Oi(WTsGYQ^X1RCnWkYY91NUP1a`vZ(Ss`HLJgNT-lmG>cca!mPz z45GfB`#BfIMdUz$!iEW z(X$02O@3T@39mb^iN%WCcgs4XDZlLnkY^9C;dBgS5w;RHw3dPadOP zpW!dByqS$XEevK-Ois*da(Fcvr=TH=ZgZiZV>!cNdKa2zg$sJwM%rh`rK-qPWgal- zW!cnkuzva4eY@QPi1o`BFnRY6*f*NT@H)t*O2qpT^seb(|3s18!gg9-8KscPljv(f zOi!SQPNb?vK3^f)5TKNr!Rrxe?n#hX(#i0l0bYD=klwf4OxM|#%4Ij8oY z;t;*u_sSkNHV5$q% zW+$1Prf=m%jGs6Is)o~RC(_+P`p_WpfDgOVkEfg@Dwk;PZQ>IjeHV6Jhwu{PqgzLXInTZ05xALEd=PdXAnor?JKTP7IrYR8nw?vs@t2X~(Dy z{KX~W(({zdA~vsMmWe!P9o4~MZYXiC`9*`Jln5%bf;OcR-2TDM%$z>*zpitOL(Y%ZH9m?1`uFjdw?)05Cm8Lg_q zJbCcBUPPS+3+HTgIh0BEL8Ca-4;khLM|$$3QgWTcfM^2MZJkn zeB=ileRhy5-?W9+jxJ6foFq4+(iyT5i#Ui0GO3pyC;7r@Zd}^L?N?pJre*CMo1SKB zw1m@XL-&gaK098Uj;t^*8&&7u3Mjmf%L5u}ZpV&`Zq8XQ*AsF*fO{LMw6&9^pz_DFNY3@nz{H_!a z|K==5@^&u!%eND2iSxs+{f?tY#`&AuTXB|WSg^c}>G2$1kBB=Mpt&bOK$JMOca)Z% zFj_f{$89$~6wygFm8S0vt054Y{hJ=<^AKUZ+Wla>-dP-n4>&bZH(Ts&20pTFf<%vqDyJ z&dWalGhKES_1q%KMqGuK;6sLpyWS&^mIWH$6hz6b- zJy#G!BK8!w-Ljb0o>snl*Q5O7mtJ7yk|;gvx1tIH0w^|%`=R= zaD>0y(#0Kbyq3mITPT#06h>yuQmxyK)2*9ch22g-QIKsm3pD24I_v~Q0r?z$f57FK zm(!>NgsOPh)*0m3-b1()12O7j+2UsU2Qw5LHcno?k)=48*>wVst}@U+L*D`~IcFTH zqVwp}DSr0Y6i*$f@Wwl@<)&+IAU|=GKmNyWI5?JL(Z&UQ{Jk+kdJ%t9E3R09aG(K2 zbh2pG0$iQTuxkZ6wykF7>=-@UE=Dg*v*eQ1?0aE|&fX~d50wcfI!R|$+QS-#H$q?c z0=6}mcz4pp?{XzvWrJue!qL2rD;#7zRU}!`c<1~7ieLZw+oU}K{`TUx^IyOEA%@$* zMSbfz`s}OVchkDCm&x7xP~uG}*%T`--@=i{Umy^%admqG%|e-vf8csveBn61eduw9 zrpj#GxQ16x^&@HKN&D>KQ3S7tfWwZg>(+T#2ZwrJheMYwH8n}9c@MP)Ew7*@m5say2eT&Z#`d7M6TKvpl^Mi+}LZ683c39hZpR`mOSvE z#@L?E0pJOSspPZPi{?HKc6U=8bMe`a@3Dkq03P#pGN}mGj{R>TMmX*!J0;-{+Goo( zwH}Rn3G_l<#JQ7{Z2{LjUBSA!wdy>vkGcE_nB~*g1#$xpJ4$U%VooqWf0^6M8fgSi zCPPv;-)rcksbLxDYQbMLkIB|0ZcAq(7PAuxxh#^=T+509_P;#C&+pquqS4D8AHJTg z+m;EejY11)EuRmAp=bu#;;p*~q>hKFGpCg^{Tu<0mHAbjd;nHZP{KVFf*z5>2nX zO2^nVCl3yxP3JjN5(xMOKKoB^!PVZ$*ei#5@V;j)K7{YmOIaNh*wmfD*(xHBX*gR& zGACwZ;yS0It*wF4(HZ=mU6f`dd<||QzCj#;CX$n0UU{mY)~&T!rQPjJkB@PD@f8FQ zK1wLDj(2GS&Ts_(RFM@?fkVH47B!XUEua24yH4)sz@x9Q_=f9H15x%o{S>V`SJR$_ zU4ML@_KiKblLZD(4AZr^gTVu*_|)INk9)rQZ>)0&Y}(q%J2tQ2$(Nt!w=d+F*1XK5 zlJuu#LZQGsvE_5eYRqTw||O-)GF&dGHvCQ_1sj_;6LwK zfijbsx6bF9Cm04yfaqHL4eSnmR>tbwf13L^KQO?Gn>WG7=fB}LXP*0%@OfWm?iZQ+ z#ncOQo1F^|F11RT*O$zi3l8-L8%}gmAoSenn(A}Yy#4b9{J1<$ z+#WZsip0jnGM9bzBF3@~o_g*OfBT8M>Fe@y$A_<{Z$%dXGiUcPGm~a%PoAZyOivGT z?7l(r6G^I)i=9im`MdSKxY|1zX=>zbroecSR$c`(>mE7xtgWF`58rVQ{A$ezC z`{@1?eBk=k{O%urL$P*jLyKZ`Il%Uxzh-9laVCm7XZ-@pxAbt+KfZ~juEiXgIK<<> zdYtm`1m2DWQKyEjtBs!39R!lov^ola$(wMtifG<#^zFznJ$97Li5v?yHCezxZ9bAw zoMiFN+c>cwyhapATi^h2V8EoPUz|V2(@iV*@$u7K6A18>*U4EF`p2s5T-k%WcR9y0 z)4X!{7;Qa`T(SNdzH-;+5Szl>*?SFN{=1Li2^d_tDinydJmVLVv42A5yF2>@GsNDL7}iS?B5|4*z!Gg6|9S*SsRQQnp`y^OK`} zrT=IZ=XB>?$h1_M)$h5CkGyFQQgYU9al7DqdiQI34|65xtcgQ&NK+Sj4ra+y^@V?~ z2QhEo=AiMy)~Gck6--I;OsPyqXTo}3s7Y@(`~8%v5(P!2w>ie)S~<>|qk!p_Z!D*A zo*BZ~5JH~GQS^ryKQcCPjMdB5t^9J!_V%VgK>{>^{`b=kJ7*Q1@)oG>z~8n3)9!;#paB#BT(c+%PwN?ag*QRX^HaqgU8rETtsLxS-5&K%@g;3 zlXW+L1l8~3lka-7_8;H+u~@acED6PPt)5e>kDxr4QS248^K>Tb{D;@_%FhLiW{2s; zTv?u9sc1>K`TV_GIPm?a`BT>WDc?uOY(IM7=Y^g<@AL;c&v%W_{fEBQ&Fnkfz+L}z z*a|b;F1SZ-A@>^Eb{Dd9dpLAOHA4>l{7|EA=K{sKZktQ3&TAPzw~e+wnW%1|ka@ED zTy6^_>OCG6r^5n?kgkyvL^`}Go&A&ei&>lvA<|VFa=KtmgId0>)p{)3qhQhHlkh=n{%=PDLx z)W`89lV(z`SgKIYl}O9xv72}eDfYV6$J*7c-b~fGD8cF-i&?vV1D#U346$Z8R5`g&7ynPR@p+NW|kZ2^SCm*BZVioe}{5#Rj5-9*={qB1qYKt4yVb2-PS zW|(q_*cNoKa=}(!c=iGGnHl0;G5-GIPx5yU{X4}M_u=2z!yVUsg1f%*Q8dxd+ur*w zjy(Ar3i%?s5Fwr)XX_oG;GI)X@W`=#&K@gT`}3QlW+ft*D-aNzl-weExnf;#gF$|dcQ-eTu3P=ww?N_?`%}V;y7zE%d3av`)Kt>oOaHbWmwS>*K8uzr zTOcv_e%%T~MMj%GK4$x?FaJ~j+spsdP6%T(MH%JfHxq z&;!5~4B(6gkkbVmgVS^_4{_PWE%f#J=H(~mf3MPnjpg(h|I7|I$br3uRUan#W)07JGQftqGxp(#XMH=CFm6G2?r}r-Ds94RCdp9<==>eNg2n0fagpfj5 zQV1o4-M|KxP0z9+l~4j-NPrO2n;kISV8FdM*_LE=9i86m_s3{PbDA0^`F20<>(Vu& zb7tmDdEa}U{s^JAbCxzz*W{+Vy`SA1g*Q@Vok?gW?6T21x0b_E1y%FxyuGdqquGEx z5vN9##9d=2WMZ*-6vvnY8cO$1YEjrBhsdaG*=Fb?Gw+Y&Hu$!=x-0WR{bHIHq;! zgf#BuJv{S}$mB`WqPij4?MkWd;vBOK=ZjpJ>&ZK0|3HrC_MgGF2i{=3_|~?wpHwXW z{Q0YYyKwC#WD8>#|{S8L23cSO7e+B%z@w zeZ654!4PI|oUl_*O@)z}O%AH6v}lYDQc)kfw)HUBEetr36hM#|MD%8~99c1wR6ierf-qSbn8xmm!AAl3zx>XYDdUM!qb}C1 zO0cJ#2qLI~be=0{#E?@$JS%f7IZ;GXDi%$3v!i3AXJKtsC4J#A5xt6zK$c2XfNHai zkS9Q7xYeJWB*fm1ooKODR}pWmB=u04-?ePQj_m(bpTM{k7e~4^44WyLc)C zzzf?$u-!uD`YS6-8)bDBf=VFP^GYa$^U>r0YyRYS`G@c;U9wMv ziQS*jqX-1q*X|=Tcue;PMuA+-o?&$wm`KOLm*1s{=Kk&uXIjr zfhZ^Sbn$1cor^3s!rh$=9vGyuTFZ&H9xyjDXt7~xJA&8XLTPi++dd#=@2clkas1im z(d=Hv2Yq{a?e8y<(`&F)oA~v4-{aA)583t1Ur}3NcKtN2TYedPUcZZ5&N`EIyEpP& zmyfD5&f~ckpP+54m!+*U*x0t8u4ssOFixve%Q@$?N(7OKr;E!JXw|609x__{aFHZ1 z8uBHHqS~$Hh@qfRjQpLi)Tm36gD5=|c`oMKsBH~!_@ywq{MtBqb6dWyblBDJ=^gPhh~mFEX^l1$6?)+fVKVEABmwEVhNXx|IDsdwlMI)c!5{+)HD>QfmZ)XA z6Q?$VcbE{wicr-xBkE7sZYS7a#$#%vTNmNmvuk+t{@19VUB%XC4^w+;BYiDG_p({; z3ViSFCfPg09J65bvO0wkIn|ish{;5^)`-br;7ps6T7{oO-NL=zaU{h2W(#fA^}MD~ zGCLUH;!{`f^jjM^)28H=fUsSS#lmX}B~hz`iX-hrT{cczdJ@gix^MxJW5 z{eKqvaw0Tk3iu-ALJ8bvEkk`it~p~CzkTa)N%v$noZ$9rSMtOA)}b_yNT{Ve6Qeb` zDTQ*Lj6&~4q35E1AjjRm7v^iIqqKxth`^AF*>}A}OU0Q&Slz?V{UucK_b;3E`b-hS z$dQPE&LkXQ<*jvm^PJ*Zmg{qN4r?8GpNVRPd_C_%$07-txCSLySPorz-LBA(DZ*mY zN|xtBxXoG`ZA#*58~sDRJZ}dGdZ-xs-Bh8Z-IEo_LNC;SaK<9&+Xl(_LsVolB?$ur zLJ&O*rAQ+ob5Y76+7Qa2DwmcT(}XQfl0yN!NtJXw(WvUwT$ z(H=tSR_HNB+Wyo4X zUDiN6e3<>4_tE#tX3Qo9;h_YEnf3hk#=B`thq&jt-;(L=1mO62v-#mEH?rNgp6Mwc z-+b^1n(7^FK+C0{yMaf(^BtO}H{j{$C03;;xqqlA-ln#~C>bLQi@l82;c7HjC6I5- zF9%tCg#5)jn(aZagS(%tXWh@b$1MOPBCxvhjzjnV+a0Y6faRY*fAvFOtGuN9WpiW6JhKJS*5AQSPoL^1#*vH!QMwcf;vwOj14Dgef-ggGm7M23jqSemJpb;iEU2&Lnb-Ext&4E;zxIkJCC+4&QLf_h@kpr7#*<$R%=1EJ8r7<8)0Z zFKQC)M01@R!If~VvznmkWNImm8!Iq4zK*i$IF6@JEu?|C9bA*vkCN+b5Hnn)tfl9qZp z+S?e+=!)VeN_jmjIt?Mka69?oT9j6;95LD5D7rq zZb(o&#MlU()q>9{w4*;-S1Hxc3`cTUazb^bQW2TzN*zkOR%niEHQ?EGR3e9PB!}6g zpvt6zY6o4hI2X^K!F$iVjk>~$b?$srue^iOttL5ZCgG|kDz*tZK)d@REL$<1Su^MH z;`$wQb$8HEV*M`J!Tvs$_MQ)hFHV<~@l=f40L41{>UJBrd`;9Hm7$WLy&akz4q@O-MzJPzL@ z>(E>Ecn3#}dYO1Sucxep5>i7pm1a(T1$+Daqt1cRVjD`S6H1L*l16Ol1W98STTWM` zT7VE3b=yOgyl~f19JbNJ??w0m3NHNp4)n(PC*?AkcNGBDH7?6zdtMA4zV37yYe!~# zJg$-mqi`LdrXg1{E&^csJSVsBvq=|P=*5uhXhkUD+L22j6H+&ZAD%q6q7+6W2l@I` zmzBP7n5p^s)3cNeK`2T>g8#;i)9HP{F$V$7LQ%k`K3 zCjbw>^&50SKd-ItKw&pwSvHk#p7Irba@&p6WpZ?fgnPZ@%b(@FJ0C<{X)01L7Bn{^jH^$xVWNWA5Id~9&)+?_f`2Nder`4f6*p0QKo;fFfil<-vE2@1x zRJByl6^j#h)G=*J4UH}H2zDJopBSJQ!SES%D98?XcQ^Nk>G2Gp91IfKdlYr0j*QC8 zWmjFms=Afz4j$y`ZO@@R*v;VsA#&5}IQz0INcjV7Sp5XC_7P9k>9<_Zx_|qza1YCn z!)S?B(zB3_*HV(gM3Sz`ZEs5_2pLRV7&u&HcL=3aTy&0;^UqbYc6BcX-T3=sO*{Q& zu6}aYlkfla#Y;g(5DJy*#CUYa`ageZ32x{3PhKR6t5)_DooN3+j{Bdyn>qh}pLDY% zRvm*NN`+#}2?8kkzGPg5>^Ejr+u7?2l~gen&8TDRu+BLeIV_q{NB_`pp2cwVWj2(c zd5VF?CJVX2DDU*7NEy`F%sJXU`612ooOX74{W$chqVFBU?o@HII`pc%b@8okbC{$_ zSq^eS5|68ir5PAb_b&V`LvnmfXpkbXz}UF=p2 z)iyGkC>PJ4!Ha7*V?J>)v1iv4Fd8`hmh0KtwFO%;jA!k3;zliJefE4@&C7Z9z#9Aq z`-#Lem@>j!J=N)96Sz*D#y3y-3J?GNLHb_VES+=8Zs+`4zRjBJZUrdH5|-N@Byt$z=8J#YB&io5BM5*ypZIBd`n&h2Ea@R) zCDK;q5Pvw9$WmRKqwchMMZr@rY$(~cmX%-lSGr5&2aHGT8h1Of(OgFbfmqW`1`b3< z7-c+?gG#R^8H`h3YZWRK564c(Q^;GZE15AxxOWO;9jo8pD@}CygfI1`&V>?E8vFc4 zx0F0)NTzVt>Wau_qHyR{QuS|f!dK;Tgi`6EH08=+sbz3@JEKmC-l`{4X_Qn5ZBMu~ zLFly@n%smmT27l+%lfB3KwYV$@#GUY^w{4~*IPK{>TAiUhuHAs^JM)=^wA{YNRB0! zU%;v*=K}CS-(Gfyj|fsi#{pFPga9CsAd=0^)EqaBg;N%?SYIpcv+=F9#Ex`G#eWT_ z%;D1WuBJa7!K_S_ZMv=S1tN_6nO+O+MG7%l*B8h^Qz%s^zlIG*HdA-OWdyzXb^C!L`vjEMzb1krwWGjj zX*DTG$I?Z1i9&*qi;Iq}pueNK$x!qI9sNR){Cq)DuP#)DTGss)1DRcO1Z|Q%VFR zmlkrNgmgSW`VF^POMf^?CZ48Rr($rpac%W5u?{K}C@eaZMlI@k%a{a#UQhKYbMPKH z!0h^IYPj68SDwkHXI{lH$Ax|23|37)hZnXzM`+zf^wFf`38`2#m+GduxEmX! z$={vMx5U?}&C=(u9#}(oXBU-mAO4;cUXLGuEAP0O25T$#Joj5-A085nk;CM$@ata! zV9QT`mnU&GYjqqR3g$ikBF{w$H)dh9B$QTt3$vcbOBSL8F&a7i@TY=zamU}gi{@#$ zd2G-rCF#LvTXbb6o_tK)CvPTK*SIV{`NOYzGLK(lwwm(Wb&Z8!M9Y;wbMw1z^zp%g zY>~PllEln2FXpH}Q!;?66ls)_EXwUWTCp0SWUhy_UM5QvMh1ty(nu&Ua$jmIjM4;y z{8D%hy^1MD3;J|`#wH6DX#<OM!`EzKGW9N_KSg z7quajqm*&A94d1;LfNF0ry`FN5s5;6eR6_G9t=S|SxgWBb}OdlO0tz!Y^nr$pOW@% z2Oyqg;q}+B-E#=N$492Oli8oTnE5Sp`Fs1@bg$cn-amlSE*vKn(xR~>nO#4PzFZKK zqn=1ONW>o^or$1UnMh|MD5FZUu_SK0jkZXPC7(K-`7LwVv+Zp*J@cwW3@1%*uj=v#!e77gngywF?6CNG9zocw7Ih>Z|8aQF-){NK?N?0rM*uGPL4C;p zDi~2Wj=Si3%(0|YiE2C;jQ~oK%cv4ZiM$V8IzifO8kHdA4SoviRak6VDQK$R?LzGf zOA-aZ9A%s@T|9>m4-86V(LLm4MMEVUItOv+3>=QDB$sL71TXZWj5g^ph+* zCQSy5QcL%+L{ewbNu(iOBa9HBvbF-XB`0|>sbu1dBhwuAM^2 zxn<>2>gF$J$1^XY_jMDAnOJ)6S)4OtIRKr(HufJlKx?v>y7WjO*8R^4H7i78u5(Hi z0}cyHhY9V>CQflrXG%pq?|$$yhhE+Q@i@*3I{^J@So*mOQHQ*2dibfL^OhqQN-))B zl?uN6v&o^9TA|k=g&0(rbNt8Z241+U^xPW_!HAZtfAI|ZmJ5Di((Au3suxf|5C9sp zVe0*lKCpc|sAE*54ZQi@9)cz%LlKn}gw^ATGOf;u*=&&VMvOWo zp+GV(`ZF1fqqXX#?*U0gkrT_|p`a8ED5?|F>YUQ&B2o0o?vqG>i;thpjw6DvT_T8( z0{p=|FNh>T3=@RflH-)CuVwwS4^uyH35_lD*zo#O#Jl69EJhZ7m)<(sHg8NrZ>*J9fcmMfIOC}{nRM+NM z`n86V@ev?M64(FcOFXna!ZYi3P(_k}B2kopB1g$c%mS3E-&b<`GMS?y3R8E#f91)v z@882?oASkfao_4}oI&GA{(`g8m=|E zl}V*nQ<=*Zkpqm>|CA&Mrx|snP9g{xnP~NHmk?7RR?pV!N!M3$=4UQq{j(3FX>R7E zQ!ixg`nBlV_L21`saQ0Z1*e{iTW#gl18X?dA4E0eWrH_FuSUysgO+}c3X`Lri)YN> zzCD{U#)RvO_(KHa8PeVegh$-Jns}U(rnj>GKpP6XiCo_hS#MYhhcAax21?2PP{yTM z>LoTFf)I(IaNQxWweg=r7$vH!C@`yXgtMhDQY@)ITAM%db8(xZ?Q|-kDT(+eYt|!2E|VQ; zWCDD+c?Smu(?YwzoHB1arAkRyp_Y1fC@ebS>0DlwZAB(SMxh{*%;51w7#s?5?(#Y8 z>hxl@J2)Cm^VAz#IQfJYk}3tCJ7+pdorYGkolH88MU_LL5o%Rb=#x|#Ra6;O*!2oX z1=-daAT<0aHEIQ>cm@-IUWGrF#%ABDg#x8o zNsV1kwZnqP7ZJWoW&}wnoul6EB9zSt<@hs6lCcbP-8J<4132_5`U4T6%ziq+xuL8_QljyxmZ-Gqb2O4=grr6vEvXYtvDN7{c-G48t}yi zhz@$uc@=bR@5FbckA1uLVb7`QKGch^V~E&Lglr&&CKyH)4x@_4QN`n=%x1d#2QXCI zNO?kJ2ZV$=U!eTN&4m)2x1fcgY=YQukBVGcHWr2(+Q=(R%U?v|_$*avS{i~8KN;WT@lyiQbR(i=Bm^YG_p2~dfiA@1CbmyKG@0O4jnq}=&sjNm@@5D?%wD*v}66d z--$+|MKSs%XQL=Zq!LH(zUR|ZX{b(>+H6z=BU+|UOR)574P3QSa8H#A=m7ZXh8J1+ z*>7{ypOGTOLI%^AEL=`X7UX+zKrnfvn_0 zt+(rNPpzYAmVx%YFj9w_##EP;o`FGZHcOt-v@aYcJ8XKNKDB|iKH+!7JQIgrMW)h-)?mY~6w1o0hNUH6 zJj49vMt1f0NmbB>xOp`fp3;T(=%bT%A*o9#z?NLcNheB#yo?cKj|bmt~iDI=+f zAEjL@sUrhUEt!ai_O~|@>J6d^Mai}If?kWW!j9MDCuO$-pw+9;Pp`&4%}wrTfWUz+ zV(tB8y(8X_TquFcZ2`TOtT#-0Fe0g0@=ECni;nc5kpEIjf+%HkkjME<6opd5)TED- z6#h~7`Q4g&Ha^(NfrGk9N&20A8qRpChb8vvJkNz3Wn~hZ)uMJdjB9qie9y|i{^wUF zbpkM=ZruEtqYQ>sCG8UZ139j|uQ7=>lM3Q>^9 zk@uPWIOG@DEkr4!XQ>o(|6mlYRi9@wIN0r_w!(-y?I*3ab8@YQs(E&rtu|V1MyZJF zD;ox=u_sx-xlbYtUm`}G%Src;m$cf>P@fOAK}~H{r4-yXyS0ja{Q&}j5H3?jGL(X# zzRYync*;M5^m(^K*stCoJg-J)6H#psv!~6aGa95X zkft{jqCEvGF1m`T~aX$ z$N|b5Cns8-UW8cJwNRyy8zVz06*C$%-1boAq}2)--7qP~s7KeB4O4IX;~fWht9ysGaFG%5zhDAnTu)9BxzD<+1qmngS#Gp-EZv0R3+4Gh-!Nn*y(3} zvxOZ;LR30j4El!XGApPz7}&c@nD9pPh&@Q@R!bA#(Aq?`O}K^z<48i893S?2iM6$J zG!~=ZC!CwQ!b+uC&sLT2>@U6I>pZ{a1wuPIN$K?{7dCM2stWD@=yJ3Gnr_%S4W zTsEhUN8j(sZ$?}Ii%ydlrY;X_PgPf;)vL(0_YylONJMg}v5+Xr=3R`_1~J~^vIc{O zSWGzQ(Sn~u^bh1X`@&kj_5(HRe%39`t;xVS{j>ZjHtW#CKl!O(?Qu!%5K-tF9W9)-5G6}} z$uUYK-0>@>^WlaAMV=9HaLGLhFfz#G-(})y7PwVx@6VL2(w#}Bx#;9MJpaLd=~&e| zl~6a+7nG_sg|bO3N-c{j75H^}x`({fxtuhZRBY%RlI>1YqJWVwsMz9h}ZwbEd; zqN=H-MK5?s4#h*#x`;z@K@F8}Q;5U95DITMeStJ>odfi?4`9h!=^9pH2o>YlSlW3cGOrrjS=^WV7*a&jEspkgc-Q+S)+taVJTMSn&Fsum)~luyLih^26)W39dO~7K6SaIwKjj>>r}hW~VzD#%0QoR@=#j z5`?lz>a=F!ng9-+0be3UT5U(2_H)89Jh(CqbVFlGrRhGC3mMhDlr#IuwedlI{Y3&3I*y)9kG-Fw;H@% z157=>4(sxB33)o%_xjcmgIqk0qS}RfeiPMAb4fQ>qCPT6N9Yiq-XKbEMDSby3WJ7R zECu1Xu>Y`nQ7Yl8tgT6gLg}KEiZRichf=CUAu-5R3Gx4qqd6Mu72N%7J;C=wy!DEI z+^O58(9xsg>PHWuH#Cl_T8J2z0;4hLs_LrjkG8G<)5@psJnti&U_7pp(!}3>C{r>t zTMkj8s7Utn$Waqp`!krWYRs|xH;7!am{3@Di9G&s2VE5qMB!UX3aknxP?c#o4CKWk z$RT&P)>(A;B2f}*9hqbrtyP~VwTMkxL>ogO5F)P9NhR3<8f{A2l1k#iIC`11qlu-Z z_JbnCi7tL^S+ay*9rznvmS*(gC&(D9#50=N5CH>+2KQ7Y0CTkQqQF%CQx0vluNTzg=skq z28}dEM+?pD%jOSmXfXBnS}f5z{U? z|K+#7{;3)7|K&U5E?-p&iHJZHr+(UvW|o@YeWQ;zK1hyA6rq%0;GEs8A#AJXC6AJ= z{lYnjl7$?ph@jhr4cgK<8DmHcW5H-Z%HvRnJ>)8?$86>U6ooU3+rdbuF|mIFkhfkA zYJ-||EGi|`b~wB@3IsSs_`q865&e-Ryrc5>+D4P^Frm+j_WC?VW?=Xreh zN6+U~ESIZ#;{RoB3MD*LMJU)u>_Z`<(5@iDmQHYbvOmvAFDC~5@TT#EKny3J;o>_# zH<8+#=B?-ZKhk^y=<88%?oEH;_+LD||KO7^o;#Y|L5>NTKs9E=)Gy!mudm#(!rHRu z`I|?rUpXEmBH*Y}GUxIs^t9Qy@85Q^`!IQ3yGk*uoGj923+sJ0wt2I85t&tt48B70 zD1}rcHLmRdDs&K(l?XrKxJKUFoUcP#BUwBN&^nb^BUx#ChfXl|iQ;|XJ}RdPUm}Ke zxWaJIG_t=nGIn^i%4s6wjpQwTiJ0`e#|jark;-I_?jbL&b&U*pMxqmEy3OqC7l_Je zHb|ZnW2G?hyap4_;fWO;6b8OYrzd9}F*0UU4l0(_(po*2c%P3woo!^g4ig9~q>R); zsMCI8mI_HiGTZEEYaA%z9){XOs0Jc}?ItmCx4j(V%SS|CN-3pai?F2=G@3HB_&gFR zh~v4GDj^cXq6G$Sdq}9+x%=_1y!I25MIr)AzVJs*{PoKdA_tftLD;MobvTun^VJ{R z_LN8xj;hI7QRVOrWT}`f7+`wZY&`tqHnwh$VRWdAZmzfv!vA6{MWs1|)2SzJb}*3D z;Y}#mofvr&__B&gwKE&d3sTtFNBTOQKy6TCvspOWBSadClEI1=GX}kd*LU~k?K7Hg zEY={9=Yoh`nM9PTmL)$od3Q0T(U2EWX^Lmi8ibpZj2Q@JlahJ@Lc`@7Enzh)5M<7vwHVL$!@~JdM#| zBpWO5b~g-%JbSwaNOt)0)xA-SjuWz3LEcNKN*R}m5<6o)i3kc&NDPBv6;WTBlh1H* z>DOziZ4I#RRWG5A@VFY>j0N97cGBbk6C?=8CyAe()zGr(FJC<-BmpChd1kH>IxdKn zs-nJhQDNM2kUs!X(im$W0JA1XIHka>$+xd)E#rIh+VvUyaTWFn=!ka9VjQGPQMb?$1*21#>v83L54%qnOi3$F>1per$-X8+z#<$VrmLSd+dG zg_FM&#zP1nHwjFX04D1TpRAiq#8?C}QNn`<@qw;&(sHs; zrHkvSD$V)j=9BvpXfk~a1x+X-ozfT;VRi{FUU3W`OB_8CV9^b4aNRFoKlI1{_|Xr{ zTHW71DmlP0A_y3K(V;^_!b6Y3cgo!jDW62AhFcpjdy*nHo?;I`h_ZriM|E6;3%YYkYaj zPw)xKp>V9om*pUi!%|BT<;L_x;ksleSKf95Pu}zFmB&hIkmHyW1dK=%xn%lZ9$5YG zbyuC$X!bn!89=x(#}d(WB}Vli(RAgwwl93hDYY9-x}TKVowr>gmPBXJ7A@u9O$Nv6 zIOUEx-ffT7Z~srlSoc936N%w?3!OoWCOx(dK^%+n<*|fFDis$#%Oij92!G|XU%JCx zX@8)vcc^rC=Z}bwg&;(fB8teHmlF%bjww+TK8QlHkduJ8bXlSdh5mQg9rOl0@e79S@ud{r-E` zwBY#_LvKEa!Dhf<{OA)kr5e9&A(D0ykHv9WqD0b8OlmKYv{U-N@c&Qn|0l$8AYYb) zCeuesRgESi*eB%clSM2l7)F(Iu18<{1-|j~2M#^(?|1$FA3+Qv{viY*!e+Io1Hn*Q zp;Dc=?9y{?xc2hTpZ&%2PdDTF716Da0!)f53Ll2}e<5keA96-zN0srDQQ3(nO2-fA zb=k7tjkUeFKGtWS;Qwui&uYA6QAiXMg-8mI0000t72v(&&(e)(-k2qX1XhSVmd5!#6-ELqeD`4byZnqm1xVh?2;`( zvNlqr2yg{K0+|33xi2sC?eE>Czq9=AOHf|4P;2#-l1L<8zIT`NJInWd=lneS-wrv_ zv^^j9`e%|fJxWn@jDmQ?BX6FPbTpxOlwaff;XGdHeuKzM_@|U6>7x8NO%^@MQ5txQ zUJ_r8y>ust3m3vdrRL@H=jnet$fN(njx^mFjXL2O-=lldG=hOeXJ9C2(lo}+NcaW% z<(XmOj|AWIjqPMNJ3Rdt{9C~PJx5-6!K2`b+|blH`UO9JAq_6w*%|HUI*;P1 zeuyYO19KU@>51#BU?>AqGyi0VryeY2V@a~t)4uP#%&cy{h1q-I_mk9n-6!(fn&(UH zGe`|mP1mpC$L9hsd?M)6SG}==i}VY2{K6Pqy0b9a4~mZ>f_*4Wld}ky78-qfq}eO! zrprz}^=4#YF#Gp}(wlD2euMRH{*kk?%%cswVVds$_kAD#`nMB9^zBU5z2fiZ5c)qI zRu6xMenF0(dxLB5teg$}^id@6A42>aO*!9U&*Y_a(~}oZwf}NmVAJn4EGDGI!0TV9 zN1CRCx0Cnw?VI#_Y=~}p9o<}OcotH#z`HLdd;7d@>U^JHgYi86mLzBODpHGro;}=npFw!pLr?b^nU~t5-shq8d+&93#^rZvw14GIdz~{( z;*{bz5<~WVpMqQ{VOCGodBK!i)V1iU#^=sQUgvQgy#JHV`(F5oaQNrb>-}6A9EZ&) z%zp%xZSzY7oLg)oAIlBi2z!KXqoM@0LR_x*=` zM!L^z_jy1yh(S)szOPxUQv@R$JA4ujHYY|>-&%u5u2GE79Gf1eARpXxZu{TEeqeRW z>vGS`COtDe@wSU_pfJ3nKNp7Q)6e+PsV{$|7X}NI#*cgA)ij~jRi5laDa;edp@o1# z8y-R%QDe6a0~@09=p>a!#_`esM$o2ir|aIpf~EU%Kh{D(zTD^Rb8y*T7&-xj(yTWm zoO)iE6#@LeIO^SXmr%DIQ@a^aABHpdccRSVQ0CQZO^SMb z%9ktT2L%ek9J2%XogVG1ZAci@*Hac+lPH0KbYYNv5D(EHl`|}Tq}FbYXkR5tuM7MG1M{qcmZHIa?i-jq0H%|y7=huX z(WiTRFudlq575u(5z^1t0YjVjL+^L+?V~O&bD_nv{Dv{xMy-RKXqZZ4BNTO7)Y#dg zwArQMi3&oQKdAQb2AxJ9zZFqqYaMx21xDJS=H3qV8$0;j2E_-aC@2=x!{M{`b{Yc8 zRz@bN*J>do)~GyGq(Y@cQpp;I=4CmYbFMJrb`y3{r1h(dFl^jj6b|g!*x-u=g!81J z7wXYI{LLFwulsP6fkAtj!;_%DFK_f-mjdFq=8-Nw(c4@6bR4H2FO3~rq@SVVXUgDu z^{XF2)%iGX=IFk%lCsLs{@QKzsoj8aO~GS@MdU=FrLfeyc(6^sN7admeR&r`YA?ov z?$X-g0tG>U94mq$)hHjdDQY$0C1SY|{3-1gJk<6!9XNgq<*H*a-hdk0%kWgYG&Vbn zu$a@IG>YKzHWC5wmAoqK` zeL?%CDmcxuPG_w8LN8-R@Z-mD>Sv?I)t{;S?q|Z_*sBGh_bJ@Dv+SMHeL0NWX9uAf z#@4F$sMqb&E|T%eP!}O}7oo3?khM)oH-*8ClbVkL3O?|Ys1sAKjn}mH5c-;w&qb6U zfq@|8h9P?${?vqaH#RBh?IL&Ff-#3Uw^ew;Riuy+a=tPRO-;!;XI!cNMGrjTVSM)H zYZs_g!9vL8sE6vZkoPH<>{1)&Fg!Vtd8YlwmQ|;6*!T9c)JwnTo_VQvb0l_^t$9v+ zbA;LS)4j&xV{t$I@Xvy``>7jTuW=PvTKWmx^HGgxNmla>?!VGd`twwZfC%~9*76GN z2Fox8zz{H!w7pJL+2`Fn4OwFcN9p>7WeVatmHZaPL4$H$k6POijUImphJmV4@;|O# z`xL`dHdZdu9={42JI}o0x#DR34#lXKRi>H z3{Tl^FqVo|iIzP3zt2-;AwU<02)bT&aw;(GeW5R4r4XoHKgQXg7`!`q>}t`N5-j2Jif7gxH_B!Sw-m zB)<1~+=fx7`SJH<#RG=X8JhDTS%M?>tY#$j8I5jYR(d-FWKHD7x|# z`N-3_LR8$qmv=|7gp&z~BWQhNjgCBU7i~Rr5&xQ_fTcosaO5?qL_4(I+NOgK9;b~< zi>OlSlpqh=+rC20N}0m(IVv5zjS3@2q-fF8MTNTiGI^a>rReC^+iJ2#9gSI%bHHW8@KnGRNt=9(8Q2(#W?H6&NjvU zL_p>sUld@uw{nAa*0*Q^m3OY_--Ox8|5Bgt#(dxh&vthfK3o_(_5}R|kDsW)^>?p+ z44Kg5OmU{JtiP!;^Y*1}>7Yh)*b`Yo%m>2Xnn%WyL(#CfdC~U5g zpY~utDTVM_K|Vxv8d8+E2OY)KT-`)&H%*0^VM?}I6aqu@g!@dX2~Tn0^fawpzATF& z?(b0tcv=o#Edn*w+o)0Z`fC)9Oi}6ZX(}JM1Mk|Qw0DWxwHh_nVXzCEvPh=KM<_;> zT3>#SCU1R&a^-_oG3aGDoR`cSwRchYw72m3S15va?xG-y+B*o<5e#t`1~;tb4LoOa zbA<{+69^Q67+}i$Ene4acW7&ElV*-ie^1WmS#gAKMiFN}->ok^UKl#|ary}zKQV*r z?_K>JTM{l8*Ui$_ey$9Z-w;*Aqx6_jF z#s=pFKIK7Qg)q8gERP(AX!rU$4IP-KjVo8^z@2x}_H!>&y3qnm!3j}9Z7-tP17mdK z<%^ULIjM}O3$K^!mSC(cglPcD2*c6l4)xY=P-pfM4b3CJ>+Vv&-lfgOP0FE4ojyJz zY(@^@jj659))oAGma=T#bAkg~Y;4@XQOn~}MGJv?$Ep2YniJ3RAzVR@8_BXbCMZ7P-kOB}A!`U+wu5^heO z+35Pf!n}N+%9BNSERgB-CIyu?<#!8m<4Z8UPIrY;fXOlPsUq;b)hpM;_$05wNA>+K zJYn(D8>(BOL|Hv9pI9u?$G053lti z&hKHoXGobwPwquvhL_OD)C8?Rzl$Kh1E6_`lEOI7twf!qNXHLNDqY4o9}F>SZNh`+ zXzLn`)XP&J-Yx3);LR(PFDOTx8WrI{a|Mw#y0EO?!u#Xhy@mP0@UaimkNNnq8l0#* z0^)q_>^`5C*-c6=o~TH25MqgLV&wOiTv;Ax=8L~i9yv|RuYQqEotdGDV?(rZJ`dKR ziLjc=B4->fSA<8xuLco6EUt7B8e5>Y7G9&N)3+iluTxz20M>R8YLC+O7cZH?lRRX$ zh$t6RzV8dj3}lZOpUF++Y2?@xoZC8WFRh@M*`fI}r?C)V05JNH#Q`voFvsx74HN-2 zc%wsJFEGl@~tN+g&`9OVW4# zI4js6o52a};d`h==}c*L}B??N&>5y=@H+QLbc$e}Bp`C6*JwPq; zSv~d?zMQsi5~v=qyF9#Ht|K`RypKnR-t~Zl!Ol*NuD@^<5Xb=tt!=n!zZ zJ<5*{Q)hRBT5B&-b>=>5ZzKF~zeZ7W84sa{N*38Ia>#Dnph8$<8iIyqMrq~Zi!^^= zhH`7{LE*W2e)86tD9lZBJT1O=~1qfvA%2inq9Flz#04P5TqbtS$kOQHR#vi_o zazh1btt`>i@4iC$a)}PzH7~}J0+?njIRt;oDM7$t86@Z4!Z)b?%5xMVM+4A?Vj!kI zlKlk#mR50L1%zsNPrfH1pJ&pf_UaOKk$n1$vGLbPiSkE=X#P!i&`W>$0_|N~pz8P` z8k^dt>TH9i4;{qkr2{dl$8;bt%gtpPpSuO#wGbD{a6f6jSZg7g+Q^Go0ES%_7?*h{<7v2RGEE%vQ%!bwxZChfiexI2G`klFupJ!1ypIHF&2c zwKmqNdSo6L-mBEwt!pUt2ht?T2k~bVpb7-EGJNzHjoyA6!te&IJb#fI8+AJQj{8s` zAe17%OJreaD9aTK$o0Tj04wXEf(~$=Q42;D_u<)kj22TcjnGyQ9>p}J%!$HKVX$$R z`!iw{F&Bz7gljAvxrJW&#tXEAT(i^0zk?l_A8u2yyh>ZmOO&5JMwR*dLEjz1IRLn3 zaRZo`z14zHZV|xZMr{j#Hj1nc*cf;@7I~WD_)I?>`#etLo%9ADZ@9s6fsh%SgEZ_I zG_wrCs7h@}Tzt}N!f2K$YM}b6BR7GOrNFS#UPoAj82o91q&>m|h!KLA-eQSTAI6uI zhhZ>7R9oAkQoc>?wby89xPUy!rx0GKhp<-&0WBbJ3r9vJ@lKJf7lu#)HY0?(6`H*3 z0cx%+qpHR0+g&+NF*;rd`@CF!4nXjm9)z*9X>0L1ZC+bJwR@bZQ^UeuWLZI?P)C3~ zuDuC-uY}|u#yDIoQE#&jN7xrpK{$@;nR#7LizB!2IKN}ukQbLM!lFkLch6Aq@L^gw z{~Fym|Gea>`9eUW75x70uF!UV6R^$JGIg)L08e-)RZlzwTWSNjfq`LRwqX288d5*v zUfdD#OTIlO4Ko%&&VqyeRK7a@VR{3PH`L(z^{XGlgM2KtQ0MLQZ2P;HGRlQl6dqc? zwkT{tyvH;Zj0_JuMyN|*U@`Eq6gQm7a}EOuo(9X4q@e}RCtzcPG4*#N3g^dZ{k7{f zcl#kaczT#xuMSgpuSexWYdsz3O*1*Z40GYVseu_IW)nHJR1aj{Dzrw^g&A;_s zct{A}TPt+=Yu}>6=oB4$>-~6_E<6!s=j(}gOW=VJ3Gp$7VNg%4Hu+#G+Muh7fN0`& zO2s3{r;zgn6iShjm~b>n7~JhpX{Z9GBBD9KEct_n>GF48p~a`37p`^Z#x~6z9oAe8 ztFXuSEtSYiPJrr%NFnxMl=YSv_a*>ozc537@d%2hVH!CS(&VA)0I&1Cn@|Ki!;j+G z)^bB{3{Llk7#uL1M{#P8yP)YBjLCtTE|tRrh+50kUpr4x?FP6>zyYX|diY9Ua4aHA z*v%(#mht(DONflfb2*+7*8ETKcEX3<~Ps5NU<0|o=@F#CrzHdMM79_XOkBH z@*8rs^KXAh!d}d|q3gT&N;4-9QgQYepqgv6{LBloF!vCWxgaV4Z|h>=^pIwFy{;%}5|iO4QZwMb7E-$P zO{ZyOZj7$JxD1@KL5EHprpnY2RQO}$L;!sL=|0xS!B2^oKHjb`e6=)m>>T}w$B%4q zqR{o|Q)zb6UIujxRJZtB)S&Lh1?n%qgb+~&^U#7#CDr~yy6aebT0s9twAU@%=gWbm8)v_z#)Jr>_k zKM3R@^LggVK9#x!+PDmu0tQw-bd+v;^!<3aHQ^+EB-#l=Tnp^N!q=Y??|b~0--#*} zUbNemhb#|^TLSr9<;qiYG*A!E(1LSh`dL4_RECmCHQBTgr3MOA4Hh;$0!7>Ho zv$Xo!Dqa8fx8bS#)PuJg8>>)ruc2sD!r?R$L*!asoU23_6gjxBb8kLMW5=+7!27N& z)adlP{t-={y2m`dD-@KU&7zS!I0NVLh5=|Wpbz(YKO*7(BN?1YjJ|@?9UaWq@G|5_ ze}JUEb{U5D9fZ#{gi#n9sz5fhg!#)Pvb;x;cE0JjI?{C>P=*xq%4f-uL@M4Aw;!bPSefzwI~j>*2{@~g@_2X&$o}eB zj&|4EwEEHljU)V3CWoa;OaO!QdkC>NPyxOQ8mYq2%Y76KkKjT36z#w(`*`2-IE*RM zWWS?gPaliQYq#(^{0#Wt?)5s19>^OmI~pp(OKG1%5U7WfsAgUGd4ylD46k(lRa(37 zA_}rD(ghSB)x6vttQ{)g_d8g0Z5VQbd{ve^hhzz}0afM@^4~I#H_g#=e{lgA;XO2Q z;!bkRv_7i+h1~#-a*&m=6L{ACSIp>sXt?A@GPo%4KgL}{jx(_JK-L@+8=ws~Gzp!Y`DaO$Vn=Q|k>-DayqCZXi5eSsMvb4i6;YugD`EL7^ObT+n5s2Wav9 z6}$vl1oc`H}z47IpCEI~L3ssTOt8}|Too}h(i7isfG zpWgmozF&k7gTt+8z2{m?sZ7fIp4lkrd_M?2hHro9BI1WOxc1({V+d;>B~2_dZZkW% z&Nj8LewpIcMe1(uA)Er`M(E*UfZY;qk6=xyK?i!DnBoF6AfP0|SP*C4O?p@Oixm-U zbg>zyyfnoFI!3$K0vHca_|7iijv}ouqe{a=DB*@z0foHuudmb5;&D0*Dl7zJ&`0$+ z_4c>X*3Knbdg^IBxEfG<@R_qyG;(kZM0f`rXiqA>iQDd?F|Y{5k-Xgc=G7(Id483; z7ia0#U;Zt+*8URtja>@6xP}!}g0Jn-dbdfPc%4>zuhGN*>~45ggw$$}>g%Yy6Br!| zf^D4R47?DBcdld^BP@(g!$Wsz>B~=3b7Nc1qp{nh;n9*V##p^z0XbYKd7m%nU8mQV z`w@!}z^4b_dpGjV8QMS?UHI-2-TiBi;rfPYztA(I3bO`mk0@h?^x5z+V0w~|MvbfI zf7m{WAIjjQ2Z6kgxnxrz5MPsUc5DC`I}2Z-X!R;}fQ$8a>VP^JGKi#_N+ck};z7w^;gI_B^VBa=v2&7EzWL`g_l^_rpbdo9GAg{H zq(dxo%lUaaGI1J4xdB4`Sv>p_op}HIK>F{{)1UnUo%)ps;TGX)vOr7uX*;*zCb(6 zHM;zz%QW}Pv(yE$Ul^?*rv&MbaM(tXw1Nwpn46&zD5-w0Kr7F_N_*F@i`ux;=us0n z+vr3|?o-_Jbme)zF*s?KQuM|9Yo0rPe4I}F(ouNjlop=8LwO;vSO4e5aqHaln zkoLP0J{c|N4yi1A3#eM_d|8^du)a&r{hNPBcb|QPmcI2Q?bW%e&C%%Wj9_THAoQ8v zY%Kc-)xZH;U4+Fv45y5u3C1@Bh-DigdGjc$$nNn6=XG#*v zs#MCJ1sO1$j+za;lYYSC2R67Khf<)>S^uO9|7;M9WMBSs6bQ>e`nQm**ToyKp~bY% z;F82}Dx7?zhLmVEAo3th&pf$dPQo3f3b!PghwDq8!p7%=bWi(ZR0rO~c~uHPED)YM z)raS4zTVEP}Y%1WSUD3(6=zF+n>CD@F=5c4QnlSzE#%KfKZ?V}GcgVT2X%yg3-D z1TkD(eY-{7W}ilYAF^lbq3W*JBe`#G-hkk3s7|HuB5N2WguBF;^;a~qN8b5t2Jl`oA22foXna~1_268aXYseaw_8VoEWb2p-@p9?e&hElT zizCNAK|d~o<4}qd_*iP#(m>ayIa}xQUw}?op!UidB@Ko8#cT44=bOyDUsg0&QK4U{gc1CQa*U7R^O`$d&4)OXLGm32iql0n z2OkeLf;Xt(J*q*TuJ3JA30|#=l^?Zr?ug3XRg%ue<)z$puZzVKV2dAeDzfx+PbIF$a>6R@v};tZS}z3tSK{w+s(Yv|+v`m+`W(vU z(r}T+XA3lbpiI-C+cuuNO!@U~ipG4}t+lDK*VXICXV-az#YmNM)iMgB2|E7fV=(3+ zy7uBG?X3VlnL0>2FJ2MMum0=}YG3>otqcuQ`M@C>I(nK$=T1>^>VU#fs90q;>nXhL<2u%5$tl<<&d@cw)7JO#-oeOCM+C+lhTmMLL_`-m^NK7v&0HTnJ+g^F9g$RL{4bq8I<<1!`R`(9YFusvgc!aTjZ;^v|pd-yYT7_AZ=IIG91>^DG48>@ALS+4X(Sh@F+g?LzFrTckUI?!|Da< zE?tCYLl^~p#5fd56&gv0l;&#;{xV&YsKKOK1b9futFwm?3Z_Ks#kpC()dUQ&OuNgg z;58c(YW%>+bG}#>P5^UbugDc`gv2{3bVdDI-@pSH@`NL-UEdTsYvT9;YBzi0HSeCi zjS>*_E6o+k!;>{(tbTq9>3|?x=1EiWcFe=qHu1WVaa5>Bs8z2~k%@O0C+AjP)2G8@ z)3{V%boCt?L1-@F8VWeEb+9Jg9w;n$4j%>-;GEJGZu=``xoE~mF!ac>BmR@+R9G0* z@f>Ym*`oT3MY`q9e~&I+`%~Ke@+GPd!xIfhR6Ll{@ToGbZ0^!1D^76k4REfFdIzvj zSsJqQIM-c3F~YBr7HoX3k`9OjifdaGK-ZeI3!1TYbq2WIJ)i{d!1)xcfzENslwtV} zpEJ$HqhKMRo+?n#&s?;CEGi&9Q-EQ)I}ulK1d{ zm>!I-hmRdQc^Y)l-Bdn!fKuc^dL@y*JwE3kjMnS6XzTI<-MH`)ZN0L9ygd@}A;T0Q zP)`s#br6hNl7IHrHqc@J!-$XcR^?3^M&% zbBmtEHQZf33Zv|hSIEPIbpi5j()P7ARH<0;FovaPzDpm|?0Oo(XzM8Dcd$=25wuOpFuvuQW13 z*S@?%)%G0qSGQ>9wp*zE>NVt>qm=7~bp1Qmao<3d0UX|5Zva{WZkI2pCqs&m2RI$o z+d}uT!SO=kXBPS}GFINOkdvPk?lUtQ(nJKW+^DZpd+BLVX}418;9aQB$FpZL0P_vQ zv`QASg}vOp-;Wu6Uk1mR8*FRd4PWtG(+5IE@7lM4vuy(UV4MxqN}_{fQmIB$snOZ9 z#kj#>o~VGl;rPREq5RANkjO>x**?69Z{bX_Is9%=LJn4>vD=EMy5^{P?K)ljv#(KW zZ9^3mq>2b8BVw@Q8$AYUdo*1c#SLr&e?#~{&XzBFw98?(1c>Ce9YXM@Qj$~8<5%fK z2VS7kppj!ft-wGhkHH((>a>381|53fUYa^KCE=N8i(LKI(=>PAajM~5f^JCbtxfXQ zc4)0vmsQ_@As~YU{4!0`;B>iW)Pm{(r3Qk0^<8JI8;_26BPteR=IFc?XEmS$;LAEHnvbSw9VN1Vr;P{UNFj3 zq}*MEn*$G@rOEprgtsh+%hr(GmleZgyxy6F+$VUz*LcOINr4K7J-Yoj-YrJQy`nyI zqVOhu=t-|-A7Q9V@MJ0SH@_kwJAk)3a%zlLukO&!R)Z=>;C*gy3%t<}oS-145uE2L z(t#X8(G-yXouwVAFegt;slpasZsNo+=rCYp7cKzGC?S09(Vf3JPtX4Dt2BhqIt&Wx z==cnbp+qe_u&vc)8UZYF;@Bx#I<$n!bBDU{@VDH5FOvHs2=`0W-dLkCKsE6Q^0A#g zWgD>IieNYP)_O=)a@1_^$l#s`a0{m#}3T7G)8Ue_y>4BRy%LL$qUfIUihG#NMtCimY3rpi>5x2(Q=u5(>a2gxQDT z{l{*?9tM6>!2XZG#pH*gN7OaY4bMn(3yEl^r_%z&!%oZg1=f=*#Rzw-X6$P{Ko5 zzYebguh`=Ai#=&Rsf<_Y@QHEF2NP~CK1dY+wDs)BHrU=fUr<-t(w(j+|H3x9Z(iiKG)C7a?|r2w-+%@Y=fi={x|7{(|$Jr>CU zJaF1&Wi;+XCl=v@*G7fhUP3xk23I_x;IZe^esT$qvzP=)_y7Gb{`+%(lRf>d9?p5U zOeG~eUY|OP-++5xS7Ylb_9eiECEb!3!@KqK!*t@2N2z$|pv>>!xgRX6jzIgcq4kgx zvC1LpMUvM@0?ju8a79=yBK!d9&lkmadng3hJ08C0G_^qWbYOTvAr*Rujjt~u1D+Q* zs)~m&b7+)Wzyi59lxd(Y66z}Gq4~S#koWA$gQ|iEFOPymFZl3m8z8|`I{DBE1D;{1 zdkxyX@*?dZbe{O7dujHr6SVNnXX(KFG+ll6niNA^xUkHqcpTw>bQoN10r#XtofazL zksMup`4S3`3MIRnbm8k)MQK|Z0~1n7*tQ^5xTW?$W08O0NS$&>p{TjgC9VDeqQEBk%jEzv&4sa9{`4Kw#o_|P%$q@-nA`)z1 zwRGUc+Q_Er0BU!;)ZfMzjDeGB_Vqd7Q$7qJH{79U6mUijhD{1|b_=s6Zx%S5%St10dlMvbuXs8M{z~XJdc9c5NGQL4l@cN90C_g+TDO&4n%C zX8>pq!P5jVhVfA>f(~%Af`q?LQ%Yjwf+d`r zsE=?xi`1fw>*J7~D;5R%2*z-4YALE_7+evHW(enr)Mf-2+>4*P0lOxGm4vSW8$zgIT^6I2f}0sGMv0D$kCK2U?t2>*#!=-2Je035 zBE_VG1R4o_+(6E-1tR-O9R)!HKa1poIRxg10H)3$d>l}9NLuB_7ng{{f`uhu1x5}} z)AGyLRe%YjV*$v>>?9pP;-99wR0h5k&@fFM8WVboiy4*~v4Xa~*Mc!|?iv*DBKJk;60%54rH|XMm@n(uBdvxCSmN z;KDla$OmsnI7RL`l)(Fg1%{6FmkbXp0nUJxJw`(oy%$k@5tWa= z9p_y#Ye^g#@R1+N;Do|LWjc^kdeTMITYHY;)$7znI7`^=rX~Y7)|kgep~9x&Ti!-f zx8DbE(UH)^BN(`PN|5_RJ3ZQcd6!yO@Usql0TO+mCE^UHaP9}fxe0owbE8ewTSh2_ zM+%4G!3rEYHK+4f?TQDONAAH4!TP;F@y9&ZlLDiW{GIAc(%(j2PD+VUD*{r1zM^caQF`#A=UQ6(d+UH$fX+FshD z!Z7eIguH{`Ki3x4kT;g`o;zRwhUxS_nnFR=r`~lu=@LfJm-Cy-h>jI8EU57CSFeUW@=yA@WrMkFXjuG{P*6vgCylcFt)eiciLLDav~0lCq>m0?L@Tmglq zE)~Zosf5tg#b=Js4$)j%th7aJ?|(VRq*LkMF(}#X$oF$*vg69&)nfaz_xG;@qLqsxFy`r1Rw=ZyQw!=zX}!s}Y55ClB^(^C(~ zfHPnj#y7QqFeb@0oHNbG#s&(oCy_3qivOZed!_kbkyOW}a;S_S!*6{52G`qJ;0ES1 z8HPiuhiWfhp!Vtt{=FvB8BS8g+WG&?9`v{xOo5#N`Uu%2w^ULSsSzb@U_nfIuV4kZTIBANbPs97r3MX^hIP_aAruL>ikQHQ!l+6oC*&rL zB24iEsK7AyHXC%}{@dvlU}pr#;{Nx)lU_XcT{?Q}-3X6&)2n~^O{z{$(~$?>M6Z1L z>&O`^bl}$0$k(o-LVO+}5AS(!gw|0=>?}8F3|^!>Is)(QNfE=nreO(H>Vx-7!!pl{ zYx+av+&;CEPZ6}2?Y89z9ToUtzb3|w?|QK*dM=V%D|>$T1AVvQsM z8HxOzjfLAr7~|}bv_EnY5sJvcmsEze3sK0lpyhZhm$!agHG)9oSEA6u^J&S?UcwuU zNKTgyfZ?-$9sBTC8eA%gUlvH^XFT(wa~%}c<_>N`TVlEzo1x~?m<*U9!9^dr4WHQ% zT^O%O1{+hj^!75sE9ju&IE<|jO5T!i$YUra@RYtZX5Me6nNlQeA|ze|I9gEgBknLt z^(N&2tAs<$P3Fbm+dP~PNqDc(mN~%JKw6i}C0cp$Iv&DXXkuo9ZoG7zPQK$UG&Xw~ zoZ~VL&)q@C9=;z1$g@;A42I)P?-smk>-r6ve&8$(pBy6Z8($FufBeL)fHAh|>NoyU z(u>Ixho}QeY>q|FN2ND{CG3ImynK&(sP@)hy9UE-A#B&N2%ez^ z2zf4GhNddC3C}h@GfLyrLlTPn-1$|3mjn49=JK-3O&e*+G>H1raEW%->ypFq_5mr* zA*!_KrOk^7)11!*p?|KsIx8<1xbWg z^h98RYpKB~m+-pEv(yDfSD3mZ3x@$up(i@`dfW2;N)NZUxWlp7DS17FsK%u)QvJe{ z)V{$abw{{NuG;v+d3E&=O1lUF{^VVB;@$rlsxYANd1V_oRHl0Y)xNt0bi1e{3_L9e z;zZ>>JXeGBKPJGr43AK;r6?rWD|kE&wF9eao*PuX=@6UwoFzQ%C5)gTGEYub!usXTC`@civ9b zx!Y;w>95i&-?%`dQzKLXrq)C*$>42ys0vVb2wn=*Q-KQ_V3bJ6yI3IH0nfv4w%4?S ztz0RH7iG&}D5;Msv9{5IXVLv7W=~DRpv$zivQ0;CJ4Q>$i7#JRpw=ex!eR<&24x09 zBzJb@;jy?-5Q$chi1!iTDC}dQ7f3;d^ufBu?|3%!mJ?(z)$C8iu zVr)oit@|C36P4O+QVo(x$R+l}s9Goha$IX6&)_Rpxi}XIsckOf**00JaLX_mc&jch z9A85~!po6(Lm$aUF~{eXQ(2RYH0=sz6rwoUzQF@pdemt3MS0?}Mhu2`_{1#oBLKTy zc-m`S>Vb~q#oI;hwAowaeiI3GJI}vN&86#t(d}KmL01}Iq|(%=;CRd6b8AcgipGur z=mo2=hWxL-{U2!N_B(0n*5kDL^7AwV7-sgqhpAHaWSZsJZNCIaW(K*{H)#3!i!^z3 zmhGQzyzmmZ-YuCO$6+#H$v7B|>BEy^91)M+LZQ>B!_dG&^xN7f%?yi>2gu1nc(!AA zorDoq==@X9qR82!a$Y4Dk1Q1+&e2Oo=}xJxm=jF8@kaG zzHh&m^rf&!LDw+9(_Gzy7Y7_v{06G<58!hOT;Y!PgOt78r~gKSLxS|7{o2YHD0AcD z*Qte-6g8S6_+vv6w+h4S@x-ByRxW)QLpaQ1<#lq9FJkgU_9IBR85hulALg@7G)!%v zVmJw(07^?+fKvAG8hEilJ!IqnO1^mhWq8I2xK<2f=Xq%ICnMr`ePt-b166$-hr1>` z%fzV@bmXqv;RWF}VZdO&@%w$5{Tt(FjToQa9^XmBOB?nA!eB zr|9Y87q3PZhB?;`e4DEf3l}UPKGLKHD(+l$fuhNmD4aS&*5mS_ztP}WV99D;?F&tX zXRKfP8ge)AemlF;39jAnn&fjBs8X1R2+-^#Ls1HbnA%~UCx{TpU*DulLm21MB@ZiD=Pkd4G zy^)DwF3psw$ye`64=A$zOyj8Kdj#D;Q~5KCOKi(Q@{2M z?OnQnRbHc*VGTFmBW4T;NqUF5Qua0~xoL9_CJ*12KN*Qtr;O?*U~n@OBlA+dP|;h3 zsjMpYa<#o}{K}5p*f7w2Mt!$YNUXX#i2$kYg(dVEp9_zTXM>YSt{4*EoC0vRBexub zA-1$|>GzZc;6$7O&=MF2za7k3ide1FK4XH=M^PDJL`cU2}~`rtI~yExknk??jn)Z*}etbKPBmS$J4Q zbEiQCfZ*Zub5uC;HgPtH3^#?<@Md@CeIT_s*8twO^UPmR^9BgwW*woltFj?Z@Vh(^ zg*{s=m8m>zuD~MR{cjIE;TS5aNanDKq$$wc!ji27n~3oWjKT)UhL&g#L?jx24bkF3IrPAAUi?J4Dl< zsK!nm6H-6O^IoP^;cJDt03IjslN3jh$%|qg6Tyu;d>`QPSv$x3adG0$GuRlG=`~w2 zI;;-bFUD))5b(-o1S7*2pp>}cft&4v>n%x$+5^52!FYxN`tEKpQIF5;uTk62OYYSK zMOPdfR%2UVp^=$M>C?y!m2ti-N`Utd^xo!dyqHo}4#<^ROv-boTCs9i)B;qa5{Ga0 zaMGS5qs-K}Qfp{pZ#dY2R=L@Pjaou0k4Wd0D1f&WjXj<5Yicf%UIhb!`Hd1%AtO7< z9{YLZiK7P&(t)u_um}}NzPW-%@!5c?FWk@O5(~&YqEr7*;H|cXp_=i`)wLkJ*JJ?n`ya2I?0O+F4Dq z+=3V4=}3Zn!kM#{H)Gg8A8S1ssWTlO3>fg7Nzvg))ER5 zuq9ZKevG<%S8yd3}*9;YT< zIE}q)S83)A*#xV#guG-2)mlNPJn)T* z9Qf>3t9E&%CQ;|?wu8SjvvBY@&(J`KM8YoF78?SG$4Jj#9z~+tOqRLw94<@lD63rh z7-FG;B$OsST?l=6cZ5&Q?>KSxCFcx8g3dc0aE_E?H3nR=RD-B)8P3Q7)GpyX%DjJS zWa0*yXV;hEggo@H3BzfFk8X3P7oewSp1MH`mv-g8w2%w7+9}N(r~vNi(99HgQ!od6 zfQyO~W$@U$FzCL7%%~6egQGwpR8=qUZ{lf=#rG;A)h6=unF2d<>TUPZ1iZdqsmg#u zmW(C5t$;)!aK!+adBoYwnOmuTd5M;ve1+jg}!R_SyeO%aIyw3#yDK6oNL@!ko~ssu&W@#=g-_lBfLusdmxsevkXdx!)U=G z2-8h|+!a)UdqpWN%h*-U)g%=2J>y~vVRvthJF8Zx4v2JMs=JI3 z)sa={$@bt%zi_B!(3h3Gku=J1$kHAF9uZ%eJ4`1ZxQ~WlXgqVx&s$Lvs9as9mwN^i zSiV5w^?HH@a###(GfhUwVbAEueRZ-b##q{)SQ7o@qyw|-JD$i#(YnlDF3OYRXUPDrksjQ@=b7dEm^ zODl4=Y;K0(_jm6r$_qBrfOL<8*a{g>Ka;tG9v4_0@erIpNp6$m6+>i$l?PoER6p14 z3arrqRaG3_qT!LMR{7Fvz!RwxsV<9w4wGiafG0lXd9$~?{yirYp(_+TVGc^+5Euxg zC~z3JK5#poe9IlUZzw?cv$zxiXhbewREVj<#OB-XC0M5_`Z*%O;V zn<|dO!}`iYfdHD)w#VJ$s8%k0=Sy_YJAMO^l$i-!dQlY${n{qDS{R$J+byzJ>mzBF zuWlqzOC(5yC-23JJ@Sima>d)IRa6_4S|1NWTH-nT#9U>w^Yf^jq^ z&VBQ2u|YgMWs*ZE8yYV%flRoV;h*6l49y)kAUZW~$<=F5#i&VQfi;x(Z|tmIp~9gD*)a_a z&hwLZ%)jGal*3(m;Sax#KUp8&Vu=WDREN_S(Wi0WC|j^RV(A!%n;qu;0}{!(q>jXk z#na*Dzwpg3(H#%nM@7H_6tF4;cHUaUjflnT2y+1Lksl0qcCq@Fjg1!xJEJbkXsRQ0 z_oKf;L&pw-7_O=mNZRQ_Yvk}OxAN4;d@FA~9a+WyOJw7YZFytC?fN}^*dm+KRW2AC z8ys$Mib}ADTs9aTHKX;UdSy_ULr}`qn0PA9$2cVQ>f5-EZK=W;B58x8Wg&tt1}y?K ze#ZiHaI+8(&5l~JRCcVunL0d8<RW8r3YNoTmeCeji-{Cg`^|^j`Zm&?~hxf+A@nXrm|^>g^(T9J?pW z;qV^w9zN*S-*}kDjvt~YKlR688CF15g(6kaT~fM|!-U)wUg1#$Akj-I-phncoU4g= z&ld`$zPU^nzmw3(drrbo`c(9H@%w$b>HMI3yk7x7T+Y!DI+LC!2FHtz2e>4lZXW#m z@2B#S10e7#GTlg|;x@is_Q4ALj6zEdwy-((Hp|x+FWTc>`g$Ep0Tf+~@BI0VC z2PLwYGvNXW>_PSTxDkwL2BxN93$*nv6#9&zfbK3Jq-KqDMlPTuz)5{n`2sYPA@?=} zhoOoH@6khn#)TMTb_ohC9}9JCc1qMFYH*qwGw?iqWQJNBHG1W%-=_XHZ?leb_akLp z*a#!W);NdNypw-d20pRjfemS{UZ=7*r!*IgE!jiba~bEb&P1nfg^Zv#N^7<)Js z5B&50=SP26`#?Ra92ln)Z@mXZY(*Y=bFU||BVJ2rbaFi z4o19+Vg+s5$VGVk>BJ=Bf4;3%k*x5h6bQmpz}R>?L?ng=PM233a;GzY=e;y?a*o0Z za)^AWN{K*?$qT})-ObN5TdG!NgG>cr(`1@Yt-n{3joA1BvS%aL&M4a@e z(RJ|Wp@$H{xoL%wc-HQjk$SS{XeirVc0kAV8a3m=kuC#c>(utd$T?JU1-la;h=;4Q4);`9tX@DF~CiU&dAfbZn-2eR)#R(a}N zI4|43%Z!lR_yJQ#i1q0XHzm9$H@LL7wj`04k*f?3v#g5MCOD@KKv+I6J}SWXLagFc zDllIPh}4jF0Yk7t`rJ>;6O%%%vRk`*A}{9=1F~xkcaO;izJY?(NKcr9<#xpmk6~!@ zHtKbW93$}Jc^Df@y|ZD1hIMKx6U$x=r{DW_n#Ll0`AdI^MZtp?`$o#EGKbLv<%@G- zG$I?%6@Z^^$#zW5#W9L%fiebxs(SsRj{1@UET>$oFfzTIv<&RN6w&k;IA$zJZtKif zs;X>a7-sr3^%uV-K(h{qOhuf^=gbR|wSC>qHL9M%{cA7Ghq#PUL!*qoFhMzA1RnIz z>=;&Pk*&EGzfOhOad@_ZfX3>nD1$k4M;Kr894|0q^Ni=z6|Pcz z8)wM#K9CCz&!egv0SvLeNi8JgU3fg+kxwd94nwHMDkI3-fWFV%aZ(2mCiY$~1an2* zWBybb1jgw&0q=ls?($ABOwsY;!xL*Pt<%U+CDvK^z>=yyLUos?xbp@m@I2kU7L6V` zMAexIdDw0nayk3dK{xt-(&vE`XYBTq^x*U)z4(PM;bE>S5pS>02^byPCMuBv#Q7r9 zpCaz{9*F)f)wf1*SxV{gZijrIgED)uKt|CDlfoeq*OhBCBo%{GN6tQ!io!^a$CkQDD9fW|3| zjZg^&5-|*eFV@8gW=0DAgykX7UZbW;wn=|0o>D$1L6qjL^M7qL)d9Xb3_+|N=hLJk%U@Fb`LZ`Ay1jk{cy>*Q@Vv<`BG7QVmt{clDnV>G-VVcEBk={W$` zw~$JMIkirfBR!Ocw>hLcuj%dp7;+0mB-J+>a{V{efSl=l*DM= z^7-detN9&Un~0Q$5Mv^mPhGdQ;Y~98%VW#lqs{OB z5fxK}3YlOTiRJn>id6O&UfH=q#6Yb0w#kM!!3l@ zyWal@u(rD-XOkXDYupgpgbNnixKuS<YGVsK$;T z(aD>A-kW|+<_>c>YBEoa&lsLPNW(`D%Y^lykjqBq3l*1YwHd@_c)oI%0W$(DkmUA1 zU#Ff2(-U;pZ@ibzf9?yYU^m2@#lBu~kMTWRLy(JQM?!|5^32XK*9<5tH?o3fT*Eb; z!Uv4WqSpPsJe{cSE3+caG>BdCZbEs%6=T(d$+S;SgOD<9Cej;B)&rpfD0OF{7!j-o zgDf8kMnb&bQA^$^s~RK*^r(6H84P1xgJLUk^kNQpS_=6_yXXpwPl+)nv?Npau!TmUsu*IB(xMsq%3K&WmOn`RYZnhum$((l0GleJr1rNG#D znj}}ELRoRnCU_fXJbNj$@2(#17Ak%IfvwVb%HCh*g%;`yZI`;@@#;h_-lMnYzxk5(Xu`T z#uamT=rG`0e)(PW7+I+$nV?UUY@`zp5LW%bxmLn2Wx0L z;{>xL(so&^*2d{2Cfs082CkJ0L>_y%{xv|veOd?N++<;l>S-Ss``WN%;rFa=Yc0EvI*6ji22RiEXG9dExn#Aars zc6|aC6FCjPGi)LC`Men;Yt|K$ixs0w4Np@F)Ysfa91LC$W`;*CFx^)@a1dYPRGuE8 z+;BxkzV_Msz?pH73&8<%g6*3SK%`L?9XQdCv#lgGf`}x`2K9JGk13*T zi;0bf>8+V5I`QzE>GGGqEFEm3nhsUg&j~z>A0no;Y^NGYzgZ)|jXF#fCP{X$JeOv9 zMi;AdW!_TK7STxdQ%N6KRm7_AK)hTkf?JumN!oMFXg5mpNjEQ$pN&8`?i0Uo+Ih445zDv(Q|T9QGC zGMP!Hu#*~uC}{%mXqLW7Wvu1=$SI?bJ4-OFTxSzy(ttBNAc&dUb6^H(=1nZlgq`q z7d_5CNFjtYec!r0|9Ne2pbz013c7*CF#sONZ)FtdOA`3qD+4XOhQmD z3_xAdun888Ui;1^7~55uyX!V{(>W%I?AgEuP+Q-jOHW^-2Y=&Dwr8mJxTY54Jqx!c z)lgIOGRJ2|=acU3or*V3(*QI-oG1x?&FNr}abe1SJ%FXSa+I;A)TR#Ly{MvJ}H&z=+ zIFsBy8=C>T?0?0(#QG-OHP4`D-x``ZCle3WSB#AfkBNAmOc~qsMS1l2yj$P?Fbx4+ zPjlATn>w%7qi6o?yR!Wxzqjj|OjEa^Taryh=g)8KG%{~w!>2T-^gNqutNueDZ88`E zpQg4`UMl$#Q&*g0(fEiw>>j>nY)yvi#Kuvw@`Az9qISje#HEl2CbGgKmlqIN_K3)^ zLNCjCd0>usDku8P5@*j^D%GbZWjV#xtqG&4=BZE)W#2E^z8&CmySGL~nzYjy+8;?17;)SE#$r;{xyyQFVF3`o|VV z$@)GWT!Jqs)lZPfnkd^8dDw-i!C6tnr582Oo)!EEj*+R%(toadZ zz)JG)c-VDeyeIoV=;R@5?B<6MT3F=VNTvCQ3$1}*y;982YwOb;ZwHVf_NY&feTmthHQ8@~P%9Qqf zS=s6cM6S#5Sbd+t@jvu7F9J~p0>9UkLVVUx-ESWigX^K?0S z23Po=T6jNo?P-a2(c=p5dE{-BpByv6pv5uOunkQk%a}_pORY=ZjIEOZ1TUhbon_5P& zN**RN0a=U3qOlJB#Izu-oX7w=Rh*5t5&lCV|QZ;BPv1o)41)w-M z$eaE4)zL71+73bQ6>00$=O}6HP@mZ(q)*jCqLnGrajE8~9OhW6)!$wf&Q%N~>3~~Y zd6jxwb)jlf&i09wx;b^D96DJ_)QxQBL`rUAqVLdf-<~87CZuE_!-m!Oh1>IJ^ypDK zbmlhW>ujG;eEyXSSLx~{oo1QX(7RY07^FB!%@d6xTpYdqDBbeV9W*&VO{_>%FBoJ6 zgM?0xvPv`?0+8zRbsQ^Sm~V-(U|y6O?iWzDbB?2z_Jv{zY`&Fn<~dTkk0Q;oT@ER$ zgdHcMiN4!BPB+)^DYo-*1%qZkIy6uVAoX&j6DF;X#LMN9W+!)XJ3 zXdv~eSE#cc)71-qE~yts!7dvjfLr<18?**%_)(+M zP!)S=rUup(9$2{d%mC61Y<9Ni>Ji7=W?v2;v=A>k6W$Ko&c!hx`X;H7^_rJyk3=%? z&XgJ&kQ$(C5y=%tK4s~SPBqYp2SFa71iaUgyKbXrFTX|wq&Zo=A)fOaAmNMgjT959?WGkPj-_2z{Y2*}jUPKs2W~rQIhU2-W&oA3igar+^ubaa)^!ys1v-3U zj!v98K~r;6R2dnO#%i}GyreTSwjpp4RlS;fFwP(>)VoSty`9lf@?2B#(t~_f-dPrs zg6b}uyNBvjGF}FUDUht@MVX+{6d&^Iu_-~s!ZYuuhP*Ftv$*eB;>|clhf^H9rZ}Yi zx|y!W7DrZeTSylt!nr0Y=HkQ{jT|~e-L)mBkHOh=TZ~Wk)Zm&qd|#mUc9ULy`U!cCeU_lClVeDlU8dG584?mNB@ zkuX)gz4jubC5XoxU=-G=U2DsPAr56ZM!=a1Wuagv7J0RwQ;^b^sg{W~zu5PYHbzTj z$_|dXJkATn4sme+LhpIcS(&D-o+2@?lgRg{AD*Xf(xr{%O&XmXp~J@yNI_5uOMEl+hEZsbL%-csv#7W5uHExDSSv1p;l=*#`kiOVy+Do6oo<} zfO5#rMWBkVL`f#7YVF-6nK9dIbVaJeA(3S&+5jDi!Gxi13M&mL(#n?D7|&E75(a$Z zX#WNj>hJ{P!H3Qvft@-vrvRexv4i4*k3uD+2i|>`qTjx@_Ng&BN`u4y zt1v-C^)wxAmD!wnABT9k_e$w?@9hnOqkI2!AE4}%G_EO{%s5h499Uov(?NAC;V|=p zgTGrljb?A$5oT^$Qf;su&wlACy87}pHApPF4REzP>svJZol!ddz)70Bb5^M<=MB@r zwTjUO`g^0G+j2w0)T{IG?Nr(%rOAsUL!>GmE;`ic60kaJT`Eorvnd{Mzy%UDw~z@ z{#1#DQ?4*%C|;b1IySWgki)HxhS!cRp*6TnPPCGXtw}oG7b5&pj_&)lcfqQ1o!*z`uiG>_(@6&g(B;DI@Y^k)k8Dc~_ zx5Trvp@BfabA^S5KhOFmls8P>8Ct%laD|_}tDoh3qRCD7ml9+J&45yJC2Svn_xiOB znf1Z_A>2i$TX`k`ytnA-FV$)J%CaodT*-}q9$bmuUQePD&mKJT$V`!F7wUO+|OUEYyyl2F#6@t?djkjO8+vMg!9eeb$m1}f@Bq$VCS zD`#hc9BpJ~nikoKAmw2$oMA*?cEMJlmPe5B>qOMbBgVFN5L`x3Fczr=>S}4}MOt5c zfy!wY2BeMVfu|C(e6>K$Mo))Q@~8_oK73Za!6Ma&Mn^&^RsyfP7{;xQTC}?*03Lg- z#BN}(uZcg?h@J@%#a1HSuq{n&=b1RQt+C0Pj_t{L*3?lf)3INA5V)#J!ewn|)n7Wu zpDYwQfYOCFsq|tRkkx@1L8ykIwioN~C&3`(kye$ytL8H9)LhrV1WlT*Iab!sN|}AC z*K_HXGoF1in*m5_;I{KLp3~ylb$ChU4JA`c$QFuv->e!X66yDYk34|nA>lQfj;+^vbX zqEeM9LGNnV-n_CH?Wv4Nv`cowxa&y6m{xpl3rf}2yN)NTPOZNnuzV{r<6vO%;O)24 z$lRgqA>_NF?9|l=IdT>H^oym<9R4#+>@B8=pD#NC@_1Rx?$%%MIs zN0j+DOH?#N0iK$t@x!yU%F1BtH<8H#sR}>Y%S9rm@ZnecGx0xMq_ zM&UMsTq?~{v85UO8lD2cM%-z#S}2eZ?1OP=BffGQBkLf`m82GSYS$NqtY-aMq?2~C zoI*UkCsHEWRCZrMAb&b4$;fE=O>It;o5Gdp-2L}zlcd7OE@{yu*{U=xoylM+pSq}) zufKGi)~>G7?&dB}$(KZwlTv=)@u4*uf}xGU;O6c=~gY@QKdzjAs!Cz7h_l0+h<{2(Bc$zt2*6ZQ9ymH|RO&uPi@!6uivri87^GrfM zIx|Jr@O%sWEOXpR7D#TGhT5dVlq9!I@^i@XIxcGKV1*~c=XrLFFD(N)2uisWwhdLj zkZj@9?y9YLOn)XhQB?PN|1(A{y8ijFx4L@1-|T7IzqGPh)2l6HiJCTcA(2tni47C9 zrj|f&zc5{v$a4k6d0b`o2zb*OxqDJ@_%RJ&i-Ys<@I?3uFG7p`SqwNg-@o7-_m~bF*hM%UH)XQ0B z_ANg5^aCfT1P}71&wY(HS9dkK3d~~f!(3`Br7JI9rSStNN#~yUR{Uw2z|*3*KQ_%5 zMcKiFa8iR?DY1MvQN<58I&%d&JOV5Z`MM0v;o&<4HaJxdO9v*-kR|!DfeW)MAy=gV zwd&k=0gsmgx=Bm2T~v&(ZW7jlPk!#{+JE`Z+a7Oi?MbJ!R(6BsD4vWB&Uz%3?y)q@ z2`0&QXYy=VagI@SpXT2DRvLyI7l7B(mNkV#Ov3Cr51GmyTU)QL)1_}*q*pID=o_#4 z^z?O)mUjcVmu7jJ zTYwIRQDi_1k6~Qf(G#|e{o<}ioMnV#~^hDjgC`1#LBe^lDNfvK)Atjdl1U8MF zhgSOeAv$o&X-dhcD&MVHOPKA+Nsa~AwRw4yE`9S=dhtp^-@I0#Lnn{ZyWVnut}QOp zs~4|;_Uc-9!+dIf%7DaM1dh&oiJm01F7A~FJaM#B_49xTCFgY>> zmyMFpp@ZHa-Lf|cNxhcL{LDThNuBq!u&U+0c@BD=hqZg*xj#K;fj6I@-ES2hc(M)V zyZ+wW=<@kRdhS~<)6UA4C^=Xo$1G$C%nb9@zUdVewK0&JKMSFFczTjnSC&OQ$pQ>k z>4u3flJPV)VE{LB;~rE2F7I`_V#w^>*vq-jeqGd_2rYdUh4SWc5kfEjtcd%8n0)9h z?*@}GM7vvUV7$Ha^t82|so5K7P3_Jih%No2!dzy0-;EE>X%fv{;l8n$o~~rq6vL(Y?$Rz@d3u4KUr6b@+oSY<{TKg)9)9;dQUSN? z3H|94U#H*sum1-DqGeqhujosO6w)i}3H^t!0uY^Cq2WUl!2R->Dp+TOn5S{x#X@A} zr^K_du`v#%&ad^YMrB~Q2h(kVJ}+hJOK=_Is#F2k}(je>_Iy`gox5DN+Fp?DCIBT2?jh3qvA;^F}1ey za=ZX@bo!C|Y5vU*sar{stN-}-{%bY3xC`q`(+{~DAY!CMcL$7g_Ka>2MxKGEspFLe zPYZ3P1&?=Nq8AtX^h#@*{`r6Rf27;* zJ*Jv5-fXYx)7keuNT2;ze?(VayJinH-6vqweCy?8^MhK2?<9T37aixv^@~5+(SBE_20!X^q^59OS&agIqEbO7|5? zR??)pL5goPjA@^zlN`@aElekX8FF;$-Z?sY>x_J!?DkAHFo(3&P-rp}Lda*K+ANQc z3P;`p)f6zV%9K>!C_Z0DK!|{Vxm#4DBV##gw$y-SpAx$kSpbO^hpxRRPuh4B2@oIB z+Dn({*jpYHX&W5GITs(O-R_-dpH=dTTjcO2W{fzq zcZ+1e^Awe)X6)hYg9)rqaOgc>+~(zVx^lHgUti48fA!z}GrH~G<68W=YL9`%Vu4CS z6;TpJ^*RR&&#l0~@^H7GMieO+%!6!vc)0D?uE-`VenCdyo_Fp6l}318UAaOF9NYV< zP*O#&sEtznd!m>P=XG2l@IXSh8JO%ZgP#u_m{YYvwvt^vW@1WV5deSe^-y)S>1(fa z=>5O-DBXVF@quUX6yW8j*9Hr+wXrAchC2s6Ho3q2L>+_5q0|@erUpm0UzO_hf~*)Rcx6QY>i8Q%)#jLENm5 z)KQ0VHlBg!0`r$pWn|PHC6wv#vT))&oMYY|?!m?^>ybQVhyv`vc?5_FN4$4D5<%7s!Oamc} zy7}FeI=ytILpxEG-uHLk3Eam3SKr+&>9)m|6aXRa$>(aa z9VBJd;=Z>_T^LhilNiB9=CdY@cZ1e_Pn|)E?3;J1<|;Kc1#i|6!-l6bb6sim!9+(z%GUM8XP9QBu`mUr53xP;jh&{}?_4uvsWQw%jFXQcKTGOUrK z3&Lr2VluO19laXs*6gy^28mjiqlVOt+`Z3HMznLbfv@LAd}$*%d%_@>O6PsfcIM^| zKi*DY_sSK%E9dMK2ScR+zFxrlpOuEzhz8!o_$rqdFuM>kX^X0*P*!6j14fxx=FK^( zQ&Uns@r@50@}8P~OIYw_tM1xXm%jb{F3lgm0}20-D}0rQ<%0`~%@%$3Q(qJgklbdo zc9#>QhxinwFCA}x`9_m!JAIn8veJm`z$#UZPu0GKRnMqs>I`KRj05kFeGcfg%iQOaB5hk)FCDWQVN z7j!3K*$F09B|~9kT!ep#bm_+#w=S3DnYY17GHtc8(xb~uJ$mcy)hw@ba&Z1n7ZvL7 z{(nD5-~8&ch7kB!IqrL!{_7M=1^77B?lpbdgu$KEXKjx+mE2El-V`j-hmhBB8fb`A zOfDqKI^mtJ!{vRNxvExMH^tzVK<02WNX5?2T|}C7WcgX8>(0ulepB<>fDUM5aRVgz zD%E!y@=(j=A{8q+sto68Y;F=se_7@2>45ytKFbVne<*fwMRj)i;iaKb(gA{c7O{cu zeyq_;L>snIoYX};`#03eJPoue7dK=KLt?3fw9CL~S?wFjFq@cK>&ra%_=)c^xK0$E z4^zJu_tVjSFL2uyh?|L1olV9+D1s-BWsl7slGlsWnQwxU59B09 z!Ykr+Z6vKPzS^K>$ESr?SE;$#g=Z{eNXF7@JM@YF=HJqvfAL!~Hr8Qjo*9F?dAu1% z>Taln*Botb_sPlL$&5^%gYOz(0tusuTApN!gm(v*$bPrxZI;=Pp>tftJ8GFqeEi} z&CM*(;S&>d`1U!fOjWcHNe5v;Wm~Cvmo!UY9Ot1MxsbFq>R_NWOIuO{rq#pZ$9-Qq z^rK8nk=Ou3Pa*X_rWL5*FOJi51j8t z>Dh?qkcn5*24Utpc`k@-i&N21ngqIQiPPZwcA>llkr;qzvy)6YB8fZa);uf^2Gnk( zbak06sX&)sS*Cya-+qqHKJuVodEfl{v-HJ3{5q}Q*pZH;Oh0a9`ry&(y%sZJFDLKs zQ=@4~vdf%R_hau7$jwQ8tx#nGxtsn(0cG@rlP+1Vr4J@nFD2K*UNO=zZ#ki+9Trl_ zE!h3W>kW)ea{}oRc;(q;`s{yro?ZgO(rj~R&kx2*v{PE$BYI)Qr;*os^w828-L|+z z^JnJh!0m_B))Oc6^!C-K=G!dP+EY@7B3DGA2k#!+aBP>Nq-sPQX4$JrD}vqcY*HGL z=@#|Z+?EB>)Wf?;7XyLPB$bjki@!?yj+-`jYxTU(q;dYNws*yv4J4kh4IKL`6;vCQ zM5X4wwhn4e7H5=Bp53)B?o3B!7N|+Tr#laJx*n}=@dL~Yp!@s(?o0H<=l?>*o1#ni zWm30i9a*kQOU!r%lA?ic@nca9$VS2LmaFTxtum!h;GB&|f>rTa-t?m=E4Frhofg0P zB;bO&ypG2;6u~`~Cq}6}HAdyJ5h1jBlmp9sQiF9UbvV>MJs#P0n^eke9+KLA@xpE5 zcUiXmjlZ}~pZk-mbo91+>9JosP1_rF`s$ayNlP%SGYKO4}XTNmbWh5{jIebFIMBp2-~F zj3l;dY0w205A?)RHF;g>?6rP^4EceeoOAzPd!E za*4)fW<;Ld-`t~3e(+-K=BbK2j_V*Dy8jj`f!ubocG*@lBL*$Uid~*YlvPBMGO%ho zpl_aArGNj$CHl}u|M&FP_dKLn7ChQp-uWQ?^N;?2XmewSGIfh@05s0|JK&gkkF7^& zNnnZDyAF`f9#r^+tdMZVu1!L|ZidH;DbIUtf$Quv_IZ9Uqs3I~7?8~ql-;34hZpd! zs1_MKo&T1h5yts)io^2^!${X-r`P`LJ=}-SovVHN9q&1Zn|qdr@3A_B^En=wS}N*@ zeEt&d%=?Zaev#*8aN{m-f~GrictU}RVFguCUI*adhQ#ocy3!(n zx2J416WXhT7~iQ=ZEcr|)iR2rf{sZrbqjmuD6Y}=wKcl_>}7iRpFB#X;gWjzWPqEc z`-Gl}EevhG(FMUN#if_p^qJp(l|J(S_&?DDzkH8)1`+7uJ|9PpcHhHi=!^g1D@KyJ zW*JRm_(8t32Bd&`R4Uw{%4iwv%21ZSIoM7eo@c3o1qtDeQCpYF6zyqVOO`UYBFPnp z98G-YTuGe^7YZ}Z> ziM27mQX$!RrDMkq&^SWg^-EjS1h*LkeL8$-cmT!l=jMkI zMGoSgmKmtAP2Cj!kOzuykKcC(J^AvQG<)ZQ9yQv0y*V*Bk=rMFEiN_%+a20l-9@N9 zVnqT^?QWV!NwNj!TPmQDR7C;1HKI@d&ri|&|IP>L!MER|;Y{`r(&x?(tW@FYoVHV= zr!AE{RlrXag5dXhVJ)Q7%Lxs?yh7FKsu1Z}$*Z~}b3A@_FLV*0OezlvJEP2>r6-<} zercv#)IuU=**RCLte4~HmzwOy4}_DIVMq2EnzCyI4C4N$UvFREV{m>x|3t6Z`<*BX zNBLyRWnV^i@-~GmWf4ZfQ;tqH2}>20mXQdSvn6J5ZUpv2ISM^zA} z@?n_m7%iix3`gSM%q5yz$o{2Cp311Q7>t~n8l@gmt`{#~qg-01GS3#SMl>^9HfoHC z-ZDbyj1(&lge6`07WP$KaNv%^bnw;_wD{yj7;c|@0HI-52ie3Xrw=@p;^g3sM~+WZ zWnxJ00eg{fNd8PaE4o86`%gzlrGwDU*xq-ZUZdSso*w;+pM`Q&%8Ca8HBb2j%yC$)8oC-@?l=&W4h2KtF68LU;V{r{#Jwg@VO^ypSArc!>$JQPvDg&X^wm3|Tv(!y|`PL7i(jBRC z4pgNQswT;?(gDBkJfSoj+v*mVEkv;HJG!^c?e zXG;>*vH6KTREZfeId+pDL2jf-cYWX<$qBDKb)8zgtvKmkSh0mB<_W9AWjX>1?(`#f zpg_tCU8QEic`8Cd0kBYX6@PDMaE(4Ny`DJA(dRz*B0cixucD&Q>3K12m}(Bik>gum zevV#v=CY2yO4Lv44ljz0N!ar=W4yNQ(`&0>cNR9OGE+4Xs@=q_D)vl|nHq5JQ<1kZ zBK1l-G>BxocW0~$Ui&%=#2$>KH{D2pf8L@zwGH)nYthiWVzwQXmp(y%#S#8hKP=D9 zJrRcfN0N#aizDxrb;@l`2*RzmV4kJCUUZ2K>Lpp*m zu)SLnkCBb{+?V<}d5*YgEAhiX!!A>A4R{i6_m=K^FBLrK&2Jw;_)N6&%1sbI0ZF_$ z$MpM><40D&c!q)~A)Zp@;4t0x8+TA;dYGs7Y!rX&B{H8^DN5({u-GO_H20>%R2mKGz-txB*^1Qy4b6@sPa1-ujZ&^! z(g$vfEp-pox}_38Jzj1aRLKnkBy3g+{`-w@T_>c8^yclKMOhvV#X2Y;&FChM1`JtU-}Y#I*P{d5O&U5_9k31L{I^Dx$S_4F@peZom!9QngFCf#F29;WVjVx3ghbP09no$m$>RP9N=<^{v#poqAG)xXhz z(Uqw*UbfK@3RVinM4Ghg#306KQArAtqc1f``&dmb4ba6*mn?LyMSLwb7@1R3-Gqkz7LtpySr|3@rc5f{6>jQGM zlvI_OOiGD1i7Luf$qi}ud|Ioa@^5G{=h^c}tx#~rqTq*yK^dSZXuv>oBHi=6?}(?0 zkl1cG-y4Cv>`}|JH*!{ipPV$!=eU^UXytjI`0MQIuQj-T@~8jvr~lpiAN?KJ^QgSB zKkz)VicKWwRJ@$UGeXwct0N@MD2^w$Dj+usReA*kw!#Gfs5yK%pj%JC=w1tyE}Z)mS*G*YU<2kz2(@jFIZ|Sbt zLJs-P6kNq=m8c0HWSIos;L9IqO87duc-RHcMjM;6j6MBLnQ!!CbL}2AI$LJ3v6y|(8!Tv8Q~p}NXG2sTaa2>q&QtRY*|8c0!1l8jDV{w@`Pp&G1FH**p|U1KTJ>>w-tFKT>J-&l zGGU;f$La-d8OK4ECU~~$^)`6f?=yfby&pVhMK(5Jd@95>wI#uBcLJ*K@q!3s&#cC7 zB=C-dX?)9*+_EN}bjxb4GXm+@p2@N1QrtHkVU8|mas}RfRScm@Je^I5%SjYZ_E7D?S3KDf#R?}|MEC2p;c-;)mz4wUW+7t5Tsuzy2$rcCH8mdmNstD0O^BY~Z>`&0Y6?nv!eq zW`EihnRrMp+71dXSFswVVmDKxr5cp)2PQjm`ep^W17CGBo>k8}htARv*)cK5B=7ug zy?(s-w*Tds&-~B^_rWL5)xPle-V872eatfeF%?3dv>(y|xa4J++wR&L3WvTtcqgWm z$@6j@&Ipn$M@WJ$9i3w@R-vcPr?lHB=}ibtd!>1KHuce|XF1p&nCa5{elt%K2YcER zE8rc2)p@d|V7FQl9ZL6_RNs1)p8KD!)6lVb8ai|caLA~JZraKdsZ_X%cdSzaWg&;nA; z9eV|Sm?3ywo)gTS?YU5Wo#dUVGAxY$^?08H&W~A|n>fM5fKlM*B9N#lX`I)U%GrdJ z8l}}+2~f{1p&~K#BpuTCb9AIoh!dP`sI@5T5Q9E$^sJI82Lp8fk?l zJASB6GpG<>xJY#6I;u}@q-A5a!8)GhYV6vFhr4vwy+n83=TUW{tFm{`#FDJeO^i^t z{7rJ6SVx$0&JuUpwENP_RD1E2eO0P9BTEXLD)Pm5ar@Z|)LdGo*|Tq@^06b-nyi8) zE67l0;dZ&hob~=p^Wg-llS8@{WT12w%cT+tNjg!KjVrVbh1si>^93s8^CE84y38;z zQuzc=h-d7MbEIzAmjQuH^Ld_1);VOmP1(GRok_9?GcZ5TxYkt2QQk|83?Eg8%@meC zL!kpxRsV+mAYGF1xo?=YuuJ45P2S?KKC$?jAKBnow)Cfe=gh|`4t|H+o?3~P18Q>V zU{(dMTAa|@;sT9K9+YM#2MRdlNG3b?R7L8Vec6)?6`J($Jw3Yf);z6m1+=*n&|X6` z8s6@FcsK=bN_6lDSc*y{Ws`VV!TQ{kCEY8)m#6G!1};)){x^B4QAI92N;NG=OeX0b zoJ$otTN||a#2->_e2j*VAEyd1wBp#9%*l&(8`OeVZ(*UG{JZayYBo2NSLs${k|psZ zF;z=>0Ny3p`hsV%Rl%4P!PmMy!=x%Vk1p6411w;9n0b&^J)rr$r~rdQ;e-3ZjLZ5) zQ%0p#N-Bs=jm}C;X~LdKN6Y#$V8&I<{Z@nAgsFkh%QSITaf=bkxVC`Y3<6u5lK&~_ zpNR9o8$C|n$MLrs93Sub{qvvr@^9YzA$avOJR>mn_N4=cQp-#ci|1>XU!&u2K|Zh^ zFLB_d>e_@Sjg|bB+w5!Sw_J}HVno#(zF=48q3*ps+ZS!BSGh@p zhWMrrJ#Z(CjrSi76pT)^;^QKMHQaoOr95)h@jNx^9_TzkG=-veuzO}0q_vSE4(f5) znDPueaMLmXbM6@^cJ7h?d>I7aPS@tLOJSndA8FwGbAe8r^R=F?$Y1t-M(*w;{%k`ZwHC@6)6A$ zO%gRPNV6`g*l?k=+osLyS84kAEjpDaO)`MdOi$Moudc+Q;@Je@~nUMH3WUV5HHyu2t`g~|xGtQS-DjAC-y7$UJAhLX}PC#$r#p1|NrB3KBdlC{-qIYwfF zR+&8N>&D_de>Xsy!8vq^_mcpoSFi5^q(%N$D$}X?G8Kn=+FOv2bzK>AZ2M|u(rn%| zcW)=#zd;w6r8wjXwBt*}@TKzRCic`)lT>X%n|@-eo?#pGeIDPp!9DWt&Y$~>-@50C z&`Tc8goT`$BxJkHShGl~(v(ZjJV_(dfFMd0CC*h;rOBxnU#vKfr}>?7uL?Z~7@3&U zOEpw_o?RRpd!$AvH^6hPe=fYowwXsDFLh&k1Ms$$aghD%yRzbW3L4oQ65i~Cw=9xv zi)7;uqkyENDUp$+++W#~?JQNR?;Ewl3x9y&pl%(H70SJ=6w2^^J){~T-Eyi#r7=&T z66Nd2b$X>X#zDNCBAcYwgPSSR*MMJQ?v_E zSLV<$OHo3?4l>?HlJ8{VsTr#<}9afDbnn0OxxQz@z#OwfCvZq1X*h0S)DB^oqS%r78eX`^qgDec}E-| z-?yLgX?!x)3GXRot&_UDBUyNN;S|pe5K+=?2oj)fPU4hC9`kaEc}FqvgtSf9(|nho zeWDw{Eut9vIQ;-e@PoYgGcT;xe(Uy$E^fwqWP5Jg(kK>{k|yx7Ww#~cHNXrLv$ODW zRV9wyDkfL?c=lhjQr{xTAPYq5Q%rJG2f$iyd|LN*+eKg-BiWY(dLX|nWTVd6e;V|UcW~5h39pe zC6CN^I|3Qrme` zVB~x()q=K|ai!9Wbz4f^$4aG0je4D?j~2o+R{}CM)v9>rG9C zw0a%)rr~zK*2e2#ACd3aQ}rsIG@SGHlWx42HY0=Q_G*Q76?f$5-86Fqyo22PkbF)9lnemr%@A>?~_no`B;|B_< z?&w76hjGK7g^`VF*LWZ!9->rf4ppf7LQB;*)@b2{^K|s?hm`j-O%}tUfr%3nnW5rb zdP>M=>oR5viPpwHrvt!B85-$tWNrJ?gM|>s`d#9vuM8PBXk{+M?8 zi>JMJQMl}Au9O&BE`Rb40zEo>Fi%U@y8w4X+kQwFnm`cNYoOO)Gm$yWC8}sSa-dCT z-_oVADNuT$=2=>q8n~O1b=>*V2*r~Q7@Y2GZ_wJy-_=>Y`9N9*G9^l)Py>(q;-TVF zW!v^ta^0TJhQn?D=m-Aj>JJo3eYONm{(UnaeBt)W(dia`c6NNzm~!>&yC4a;*lXB_Ev=UzcKI^(xA zX$PBmX=0SR>os`6o`uRl#&k(e66)|8nd<0rE79kN+Kyl%Q85NQs4-Ng!}p&uHXyOB z9eD!`HaMQ>y^GwjBgW)A;yg0L!)wb07~O%8HaB1h-M~UCk=xK$Qr8TGPG!VIK4=44 z>Cs!?g6ednNn*WjbZVNKH&f%&p@T}S>oAr+ZNByrwKlH9Tl%s+5ic$&S8Se%3^?Q} zwy%YWj@39f`* zjEx&NXlP;@cvwYfAh|~d4T)mGI+9!ib7D=WsU>{|oU78-`Z!YijKly>zHxn^{xOgG zbRtHN25362xIBXpxV)i~bMa!%sMLEY#%Gfr-QX5~Fea8SFg!d-Q@{EUbyMAyM=DdE z2h#1z7N03k!tU=#DhYeqbStw%=>%TzU4D6)y8r-A|}wq%bM_-#5g z)24?XCc5>OE)1`gq5i_@+QcL2Ax?FhcJ6WF;X+)@Y5o?`m2ZDlpp+bpEuYtgl=}NS z^Ank1-@(FRK_;2k^#z~~7lVHAo4>bM>(CE*c=RJ4|Mu*y^S#7>w$<&A_Ko8!$PC!T zKue`n_`+p8R8XM#``r18VxXxFy|dv7p{ayJeT|I!WaBU$ml(DTtn{<6 z%gWPUvyGcI4(x4OwhIqSoE+yR404z*fWM^8IyIiUMBZ-Os$#4EEU#2`Es58N4MY}P zj&ZI76EuGI9_kj5Ms)ibqmaN_BHqoXjXbiwhp=6jiIwazH8o02pqa`bz%=$u(xg~f z)GyJ_ULKH%PtCUWkum@~I+D=Ha36SE422oFt=moi(xGvc=!J1xz$Db z5sn|p!}0OC#m(BU9hrC%9{4cwBaVv_o<;h1{<)bmI?|z=fyp+_B0oDY*`e`jo65P4wCGWWr|Fk#yve*Ar#75R z8cZd?JWslW_r3njuTX#@CSML@^p-3@V^!SF*NOG2u-vKJ(*|k=;bPzW&BwmJ_HFtR zk006K`1r!L&BgZ~oZv-#md~DB{z6}gd>K$@a7SSLB)jbGmFv`kCmNYPpoN4-gN6~Z z2W%2<*N>B0s8awWwZ;xN*2X}mL@6a+rJY6#9&ng4S)J<{B@&#h4+9!HeS`|Y<66xo z^?EkA+60NJrnSAPKwAy}(rr||`xwOyj$Z#~3kQ;X0iH2ly6OT--)0ZvZ)vLvtOv*wa?<6`0w@YP1;^tqv44e8Jm?@f5E^&j1Nt0 z{#)uy(fyO%d~(__olPssSHAf`)VUMN%as+MvR#VZz&}=dbeWX^3o#7ORhXNiU}lv3 z2^2PC0FS4JDSvE+s&~#)^{#oTN_Y46U|c;7LF^59J9ggMkqZU>d2<`ri*O3=R>x5I zHyfK7l+0i=;U*`buG`&nQY?451_?Q+LuoTLMwjRdxXY>yo9xa&Jcm++aVvA~&y?B6$j#h&0}Ma77BmqgZ31vp)Wj=QbXvH|Ti7433XKTiO28U!I;k zmdh8;a7g6|i1|R35|(0-+nYVrSpw7s0ljqj6)LcLqJjraPRyBPMk3|9q6s$*;&Vn9 z+m=nKjfgdVN>*ySz71n$L1s>GYLr@Yv3e2qP91pK=3YzocJ-?z3MNM=oEf2DdXy66 zU>&?qeXmJvcuWynMph_vdGB}gY~Wdw_6~lwMuloo_R5lQtnOGn7IR;=xeCwL9l#hy z>)Gx;F8n(j&ex1y)hR|(rI89zQ|n!g;=z|pu@vvfJ;FVD?JvJf@ea-lIcHuBE)>>; z7leZx`~6-vVSsxwdc2EZ_R`iz=?y&IP=n*+&)2q|c;Df}X8}3P=K}R|zCk0h z*;^)6cTNn+GAg?Dt5>M8wF#peLhe(PW*8o`ptEsFfyiXw_$1QA`?g|=QsZ>fOrD+E zi`#qKq|8NLWInRxW~5s#%J16{zFt@JvUaNjLv4$JwHsa8C0q7`70OE64r3S_Z~GW` z5Q33Hn>`5dHmN*ZmQB<=i}~!WBImut z2y9kJqFWQ)v@chx1&>s)shz<W9n+S#LS?K(cE zCcEI|%Ow>JNU9oV>_TEWoK&c>Q*fA`P)^UwiUMt%NzE_~jLoi*GVd+GDvet*{5vdoy0w7}d=3ThR&i1w@~eJ7lI;@W$UE;v-FN=e^R*iN z7>*x{!SV42i;JCKpF8n;IiHO#5u?+62~;&&CFE`*=0iu?W_wj%o+2B@tp`1*K!)G>aJ+`n&mPaOJ->az6 z6*ZnqH>3ziGeDdFEg~DikgBkimAO(dNHex-^%|=;=;D{ZgwJlvJU`i#jc2wo#Rg-` z6$`rGsWsV1${^?FpNk94_kQ@>KOSQvdINyp@8|gJyYKyU=(j!;qDm4(4%gaCbci7* zxSbyFlMZy7N4KMD?AR*T4kyxG^8nmV%^#)lqq9^Q88RX{RE?d;e0=d*y15wXybfP+ zwA2Kno>XCdmEXjX4N+wE#}HOMs?t19#w_UEVC&i!Eu46}4vek|Pf*AEbXdEoBSs5F znbV;PlY!zxb1}-WKh5EEQAi)JjpOxVBiv)HQfXgqC!v^J0hAa-WW$^JzeWe@tWsTI zt5;s5>(4xmf-S~*vC4$xE0n!7U~jAeELxLzqH~*D%`WbH@|pkqYu6s5AM^1OF*rVc z?^kYr9A){({4^5eoo`W}#nYmwC2I4YsC~wNA~D9uBsxm3YG;^)HT>?-)Fd4|IY*5qrs_bQ++)KGjbkO#m}$c{pNWFcX=>gq?OC|80fsjF*WDb2Q50$A$(pi*9@AmD zoayCQrrHfPw`k<|Vw-r74GYn(hPmA|js1#*5kE(AFjyoxVCHmxVeP!_ttw#U4 z~EfQe(S)((Eb#j6EAPoo3wuI25m2` z$rdVH-n06HN5!V12GxxwbY@*TU?9>o6Q@YVXi87dZKrLVt!IiA*PNqWecGt(17Zn6 z9k(x)sK2j!&GJi?+-sg0yDz7@wfvHY4aQjml7`4QNwXX-vD{5ZDHvSA)Rk!i6X8IW z+G^}<(#0pAf_Ga4)|tp=x`7Bt*|Vj(aZ3;g9K!vt0>v9p9QC7*|NXyM_`lOn==h0w zICuQsFQ0f6ANna&lcPM9iRZ*7viprMV55AYaL}$QRb~XK(PAPhRG^X-8Y25Zd_hK zG1QgCQQ+;Uz;dt?%X4)qxf=}gKw|3zc}*MwM~#4+u?dB zJ4bAI{}mf!H| zt<0Y!mX zo}A7MW+_t0Uf$1tGHG-l|KPdBA6q5*HyuAUgLB7cA35<@=qDe;qnYP{NUTukbRsbz zzL_$_E8v^wQ8Dz5R#XT8(NU`M z{tLy>W^8D|LAKe2bcR_K?DTP|D_+T}VK&HA!>ZN7SypP+X;IbOp}XZ7_TlODq;%hQ zm8r5b?B#mR7HutEr>&J$+S%Nc-zoSuVb^mLqHO9Lrzl~n+l%LzTGafFqeBpcHIVhc z{lP!E{Av0r9zS)1)5M>@+*Fr5zPa=L}K3~|N{<0-Bziw>=qElPA{I}B}* zaO>u10s=>daj_UN;*p|GSz*(NNdGM?7Qug3sEDuX$gqseFO&fvl!{V?%4Bxms$p?d zL8e@Blb(HV(1Ef4Fq2b>xcUXQ zw_^b#S?0vEd)eT4>LssUNq5pf@h5>C9I0&ym1zGXWg1cyBRY?$`@bf_sYZ$Ol%6Rq z2Hr^e9GG+D3G3_?!6M{AwQ)#h;FQ}6S)R?pPL?3a262`rQYNEPkCj>hAY--#d+bYB zSGU;~;Q({Cjoli)ZvpG;%B*BwWbB!^QfJ4Hg{X|Ly>av_Ml>Lo^YVDy}0LDPpWP)6dOjD*kWRg z5VlWwp3oG?mgG;Q{r+!%_}f34Lide6e&!6$9sk2aM;>kWqu;?3n=kMXWZc9&@TDS; z^5=acn5<6y!CW{mCN~F&995Q4VS|1L3Bj@J!6e~O-M+A~>r}VC&e*Ii*{8`%Y=lDA zY?cm+1o@K&)vBAvpH-oi;?9CZ*Vcb!KtAan0@hzJFDedfuGDN8_ z+d~4sSLDW+&^u2#`t5)G^`&$4GkE;W8k{?R=ggtU@}B=Ogo}BmXINQM$|r&`>5bG7^3ji_0NFG|02BLCs9!g~G zp3JFH?Oos?2##S+UuWS}#Tyy9?uhfqc{y%uG1Nact(qH-n9a*2GGnq3nyM#sswOo` zHPYC2drnQXz?EoDU>}7sq*R|$RM@NKx2KK z+r}vGnP&@?WS9IabaCiCgXPfLi&$+EiJ_GWzO*Zfr!$r!HJ6q+;}OnPb2ZnrqqLJ253UnR zJ)WN#q3>pQ$mBLt$(oUhMt+S7q*`~2cL`Z+#+?hS7L@!5Bs zdaNDyKGf^?&N2@>R4G!W5Zc6_RQ9Y7tfxY9InqWHvPx17PMcY@Er1(IJl;{8(B4X;2nSE4zovNc~5U^eu!Mr<}V%|%IQJ{a-2Uf=&r zTWw~rp$yI)|MKAj^N3n!^SST?BbCD0eCUrl5H@h$&P0;V&={|a5^den zPBF#zc&-|6pyv7%__ZP!;7vn#WPYOZZvJP+%W@(Z!E4-mn|z(=t0MlfkoRSX3=bJ} zkO-x2zXPv^yzP8DN5;Yxi^vLSkAy78G!m={me*JXYie$tWUMf=A;y9-zw3hkkG#FFg-#-~wLp z3vXbrKmL<6xWDT7?AfU^sA)%$;NKHdFb1ynD4f*1%G8p1?rQ3Qd(PB4Fc9H8XfcC#SJmR1Kr$1v9(@*R8Ujc1O{iPp<-)#T@002ovPDHLk FV1n6un`i(4 diff --git a/h5/available-income/index.html b/h5/available-income/index.html new file mode 100644 index 0000000..b07f2ec --- /dev/null +++ b/h5/available-income/index.html @@ -0,0 +1,13 @@ + + + + + + Available Income + + + + + + + diff --git a/h5/bank-card/index.html b/h5/bank-card/index.html new file mode 100644 index 0000000..bd1f6a8 --- /dev/null +++ b/h5/bank-card/index.html @@ -0,0 +1,13 @@ + + + + + + Bank Card + + + + + + + diff --git a/h5/bank-cards/index.html b/h5/bank-cards/index.html new file mode 100644 index 0000000..f854e32 --- /dev/null +++ b/h5/bank-cards/index.html @@ -0,0 +1,13 @@ + + + + + + Bank Cards + + + + + + + diff --git a/h5/bd-center/bd-center.css b/h5/bd-center/bd-center.css index 12e14e3..241fbec 100644 --- a/h5/bd-center/bd-center.css +++ b/h5/bd-center/bd-center.css @@ -248,7 +248,7 @@ button { .menu-label span { min-width: 0; - font-size: 1em; + font-size: 1.6em; font-weight: 600; color: #244735; overflow: hidden; diff --git a/h5/bd-center/bd-center.js b/h5/bd-center/bd-center.js index 78cd962..56137fa 100644 --- a/h5/bd-center/bd-center.js +++ b/h5/bd-center/bd-center.js @@ -69,7 +69,12 @@ let commonHeaders = { const state = { lang: resolveLanguage(), balance: 0, - hasGiftPermission: false + hasGiftPermission: false, + appConnected: false, + userInfo: null, + teamInfo: null, + identityInfo: null, + identity: "BD" }; function resolveLanguage() { @@ -140,7 +145,7 @@ function isMobileDevice() { } function isAppEnvironment() { - return Boolean(window.app || window.webkit || window.FlutterPageControl); + return Boolean(window.app || window.webkit || window.FlutterPageControl || window.FlutterApp); } function splitHeaderPairs(value) { @@ -166,9 +171,9 @@ function parseAccessOrigin(raw) { buildVersion: appIntel.build, appVersion: appIntel.version, appChannel: appIntel.channel, - reqImei: appIntel["Req-Imei"], + reqImei: data["Req-Imei"] || appIntel["Req-Imei"], sysOrigin: sysOrigin.origin, - sysOriginChild: sysOrigin.child + sysOriginChild: sysOrigin.originChild || sysOrigin.child }; } @@ -186,7 +191,7 @@ function setHeadersFromApp(headers) { if (headers.reqImei) next["req-imei"] = headers.reqImei; if (headers.sysOrigin) { const origin = [`origin=${headers.sysOrigin}`]; - if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`); + if (headers.sysOriginChild) origin.push(`originChild=${headers.sysOriginChild}`); next["req-sys-origin"] = origin.join(";"); } commonHeaders = { ...commonHeaders, ...next }; @@ -229,7 +234,7 @@ function requestAccessOrigin() { } }; - if (isMobileDevice()) { + if (isMobileDevice() || isAppEnvironment()) { poll(); } else { resolve(null); @@ -239,8 +244,12 @@ function requestAccessOrigin() { async function connectToApp() { const raw = await requestAccessOrigin(); - if (!raw) return; + if (!raw) { + state.appConnected = true; + return; + } setHeadersFromApp(parseAccessOrigin(raw)); + state.appConnected = true; } async function apiGet(path) { @@ -272,6 +281,59 @@ async function fetchGiftPermission() { } } +async function fetchUserProfile() { + const result = await apiGet("/team/member/profile"); + if (result.status && result.body) { + state.userInfo = result.body; + } +} + +async function fetchTeamInfo() { + const result = await apiGet("/team/entry"); + if (result.status && result.body) { + state.teamInfo = result.body.teamProfile || result.body; + } +} + +async function fetchIdentity() { + const result = await apiGet("/app/h5/identity"); + if (result.status && result.body) { + state.identityInfo = result.body; + } +} + +async function initializePageConfig() { + const results = await Promise.allSettled([fetchUserProfile(), fetchTeamInfo(), fetchIdentity()]); + results.forEach((result) => { + if (result.status === "rejected") { + console.warn("BD center page config request failed:", result.reason); + } + }); +} + +function clearPayeeStore() { + try { + sessionStorage.removeItem("payee"); + localStorage.removeItem("payee"); + } catch (error) { + console.debug("BD center payee cache clear skipped:", error); + } +} + +function setIdentity(identity) { + state.identity = identity; + localStorage.setItem("identity", JSON.stringify({ identity })); +} + +async function loadBDCenterData() { + const results = await Promise.allSettled([fetchBalance(), fetchGiftPermission()]); + results.forEach((result) => { + if (result.status === "rejected") { + console.warn("BD center data request failed:", result.reason); + } + }); +} + function navigateTo(target) { const url = new URL(target, window.location.origin); const currentLang = new URLSearchParams(window.location.search).get("lang"); @@ -310,16 +372,13 @@ async function init() { setIcons(); bindEvents(); render(); - localStorage.setItem("identity", JSON.stringify({ identity: "BD" })); + clearPayeeStore(); + setIdentity("BD"); try { await connectToApp(); - const results = await Promise.allSettled([fetchBalance(), fetchGiftPermission()]); - results.forEach((result) => { - if (result.status === "rejected") { - console.warn("BD center data request failed:", result.reason); - } - }); + await initializePageConfig(); + await loadBDCenterData(); } catch (error) { console.warn("BD center initialization failed:", error); showToast(error.response?.errorMsg || error.message || t("failed_to_load_balance")); diff --git a/h5/bd-item-distribution/index.html b/h5/bd-item-distribution/index.html new file mode 100644 index 0000000..8bb6e2d --- /dev/null +++ b/h5/bd-item-distribution/index.html @@ -0,0 +1,13 @@ + + + + + + BD Item Distribution + + + + + + + diff --git a/h5/bd-leader-center/bd-leader-center.css b/h5/bd-leader-center/bd-leader-center.css new file mode 100644 index 0000000..89056f7 --- /dev/null +++ b/h5/bd-leader-center/bd-leader-center.css @@ -0,0 +1,482 @@ +@font-face { + font-family: "Baloo 2"; + font-weight: 400 700; + font-style: normal; + font-display: swap; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.4; +} + +html, +body { + width: 100%; + min-height: 100%; + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: transparent; + overflow-x: hidden; +} + +body { + color: #1f2937; + background: #f4fbf6; +} + +button { + border: 0; + background: transparent; + color: inherit; + font: inherit; +} + +.bd-center { + min-height: 100vh; + overflow-y: auto; + background: #f4fbf6; +} + +.general-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: 44px 1fr 58px; + align-items: center; + width: 100%; + min-height: calc(48px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 10px 0; + background: #ffffff; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.general-header h1 { + min-width: 0; + color: #111827; + font-size: 1.35em; + font-weight: 700; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.header-button, +.language-button { + min-width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + color: #111827; + font-weight: 700; +} + +.header-button span { + display: block; + font-size: 2em; + line-height: 1; +} + +.language-button { + justify-self: end; + padding: 0 10px; + border-radius: 999px; + background: #e9f7ee; + color: #276344; + font-size: 0.86em; +} + +.content { + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px; +} + +.gradient-border { + position: relative; + overflow: hidden; + border-radius: 20px; + background: #ffffff; + border: 1px solid #d7eadf; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.salary-card { + margin-bottom: 12px; +} + +.salary-inner { + padding: 16px; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.salary-row { + display: flex; + justify-content: space-between; + gap: 10px; + margin-bottom: 5px; +} + +.salary-title { + flex: 1; + min-width: 0; + font-weight: 600; + color: #1f2937; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.salary-link { + flex-shrink: 0; + max-width: 48%; + color: rgba(0, 0, 0, 0.4); + font-weight: 500; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.salary-amount { + color: #1f2937; + font-size: 1.5em; + font-weight: 600; + direction: ltr; + display: flex; + align-items: center; + gap: 8px; +} + +.salary-icon { + display: block; + width: 1.35em; + aspect-ratio: 1 / 1; + object-fit: contain; + flex-shrink: 0; +} + +.menu-card { + margin: 0 1% 12px; +} + +.menu-inner { + padding: 16px; + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 4vw; +} + +.menu-row { + width: 100%; + min-height: 1.8em; + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; + text-align: left; +} + +.menu-label { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + gap: 1vw; +} + +.menu-label img { + display: block; + width: 1.6em; + aspect-ratio: 1 / 1; + object-fit: contain; + flex-shrink: 0; +} + +.menu-label span { + min-width: 0; + color: #1f2937; + font-size: 1.4em; + font-weight: 600; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.arrow { + display: block; + width: 1.5em; + aspect-ratio: 1 / 1; + object-fit: contain; + flex-shrink: 0; +} + +.divider { + border-bottom: 1px solid #e6e6e6; +} + +.mask-layer { + position: fixed; + inset: 0; + z-index: 40; + background: rgba(0, 0, 0, 0.35); +} + +.mask-hit { + position: absolute; + inset: 0; +} + +.sheet { + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 41; + max-height: 80vh; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 10px; + padding: 20px; + border-radius: 16px 16px 0 0; + background: #ffffff; +} + +.details-sheet { + max-height: 60vh; +} + +.sheet-title { + display: flex; + justify-content: center; + align-items: center; + color: #333333; + font-size: 1em; + font-weight: 600; +} + +.summary-box, +.details-summary { + display: grid; + gap: 4px; + margin: 0 4px; + padding: 12px; + border-radius: 8px; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + font-size: 0.9em; + font-weight: 600; +} + +.details-summary { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.7em; +} + +.salary-list, +.member-list { + display: flex; + flex-direction: column; + gap: 8px; + overflow-y: auto; +} + +.salary-item { + position: relative; + width: 100%; + border-radius: 8px; + background: #ebf1fd; +} + +.salary-item.is-pending { + background: #feebef; +} + +.salary-item.is-completed { + background: #e8faed; +} + +.salary-item.is-out { + background: #e9e9e9; +} + +.status-background { + position: absolute; + top: 0; + left: 0; + min-width: 7.5em; + max-width: 9em; + padding: 2px 8px; + border-radius: 8px 0 8px 0; + background: #3d73ff; + color: #ffffff; + font-size: 0.9em; + font-weight: 600; + text-align: center; +} + +.is-pending .status-background { + background: #ff3d40; +} + +.is-completed .status-background { + background: #3dff54; +} + +.is-out .status-background { + background: #aeaeae; + font-size: 0.7em; +} + +.salary-item-content { + display: grid; + gap: 7px; + padding: 32px 8px 30px; + font-size: 0.9em; +} + +.pair-line { + display: flex; + justify-content: space-between; + gap: 8px; +} + +.pair-line > div { + min-width: 0; +} + +.more-bt { + position: absolute; + right: 8px; + bottom: 6px; + color: #4f46e5; + font-size: 0.9em; + font-weight: 700; +} + +.member-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 4px; + padding: 10px 16px; + border-radius: 12px; + background: #ffffff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.member-item img { + width: 3.5em; + aspect-ratio: 1 / 1; + border-radius: 50%; + object-fit: cover; + background: #eef2f7; +} + +.member-info { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 4px; +} + +.member-info div:first-child { + font-weight: 700; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.member-info div:last-child { + color: rgba(0, 0, 0, 0.4); + font-size: 0.8em; + font-weight: 500; +} + +.member-metrics { + width: auto; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: space-around; + font-size: 0.8em; + font-weight: 500; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(28px + env(safe-area-inset-bottom)); + z-index: 50; + max-width: 86vw; + transform: translateX(-50%); + padding: 10px 14px; + border-radius: 8px; + color: #ffffff; + background: rgba(0, 0, 0, 0.75); + font-size: 13px; + font-weight: 500; + text-align: center; +} + +[hidden] { + display: none !important; +} + +[dir="rtl"] .flip-img { + transform: scaleX(-1); +} + +[dir="rtl"] .menu-row { + text-align: right; +} + +[dir="rtl"] .status-background { + left: auto; + right: 0; + border-radius: 0 8px 0 8px; +} + +[dir="rtl"] .more-bt { + right: auto; + left: 8px; +} + +@media screen and (max-width: 360px) { + .bd-center { + font-size: 10px; + } +} + +@media screen and (min-width: 360px) { + .bd-center { + font-size: 12px; + } +} + +@media screen and (min-width: 768px) { + .bd-center { + font-size: 24px; + } +} + +@media screen and (min-width: 1024px) { + .bd-center { + font-size: 32px; + } +} diff --git a/h5/bd-leader-center/bd-leader-center.js b/h5/bd-leader-center/bd-leader-center.js new file mode 100644 index 0000000..d26799e --- /dev/null +++ b/h5/bd-leader-center/bd-leader-center.js @@ -0,0 +1,558 @@ +const API_BASE_URL = "https://jvapi.haiyihy.com"; + +const labels = { + en: { + bd_leader_center: "BD Leader Center", + my_available_salary: "My available salary", + my_salary_link: "Details", + bd_policy_link: "BD policy", + agency_list_link: "Agency list", + bd_list_link: "BD List", + invite_become_agent: "Invite to become agent", + invite_become_BD: "Invite to become BD", + bank_cards_link: "Bank cards", + send_welcome_gift: "Send welcome gift", + bd_salary: "BD salary", + bd_leader_history: "BD Leader history", + total_income: "Total income", + previous_period_income: "Previous period income", + agency_number: "Agency number", + bd_number: "BD number", + team_salary: "Team salary", + team_top_up: "Team top up", + bd_income_salary: "BD income salary", + bd_income_top_up: "BD income top up", + user_id_prefix: "ID: ", + salary: "Salary", + recharge: "Recharge", + host: "Host", + agencies: "Agencies", + total_team_salary: "Total team salary", + more: "More", + in_progress: "In Progress", + pending: "Pending", + completed: "Completed", + out_of_account: "Out of account", + failed_to_load_balance: "Failed to load balance. Please try again.", + failed_to_load_history: "Failed to load history. Please try again.", + request_not_available: "Request failed. Please try again." + }, + ar: {}, + tr: {}, + bn: {} +}; + +["ar", "tr", "bn"].forEach((lang) => { + labels[lang] = { ...labels.en }; +}); + +let commonHeaders = { + authorization: "Bearer undefined", + "req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google", + "req-client": "Android", + "req-imei": "8fa54d728ab449e04f9292329ed44bda", + "req-lang": "id-ID", + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "req-version": "V2", + "req-zone": "Asia/Shanghai" +}; + +const state = { + lang: resolveLanguage(), + balanceTotal: {}, + userInfo: null, + teamInfo: null, + identityInfo: null, + identity: "BD_LEADER", + modalMode: "", + historyType: "bd", + bdHistory: {}, + bdLeaderHistory: {}, + historyMore: {} +}; + +function resolveLanguage() { + const params = new URLSearchParams(window.location.search); + const hashQuery = window.location.hash.includes("?") ? window.location.hash.split("?")[1] : ""; + const hashParams = new URLSearchParams(hashQuery); + const lang = params.get("lang") || hashParams.get("lang") || navigator.language || "en"; + if (lang.startsWith("ar")) return "ar"; + if (lang.startsWith("tr")) return "tr"; + if (lang.startsWith("bn")) return "bn"; + return "en"; +} + +function t(key) { + return labels[state.lang]?.[key] || labels.en[key] || key; +} + +function setLanguage() { + document.documentElement.lang = state.lang; + document.documentElement.dir = state.lang === "ar" ? "rtl" : "ltr"; + document.querySelector("[data-action='language']").textContent = state.lang.toUpperCase(); + document.querySelectorAll("[data-i18n]").forEach((node) => { + node.textContent = t(node.dataset.i18n); + }); +} + +function setIcons() { + const icon = (body) => `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(` + + ${body} + + `)}`; + + const iconMap = { + policy: icon(` + + + + `), + bank: icon(` + + + + `), + gift: icon(` + + + + + `), + invite: icon(` + + + + `), + arrow: icon(` + + `), + salary: icon(` + + + + `) + }; + + document.querySelectorAll("[data-icon]").forEach((img) => { + img.src = iconMap[img.dataset.icon] || ""; + }); +} + +function splitHeaderPairs(value) { + const result = {}; + if (!value) return result; + value.split(";").forEach((item) => { + const index = item.indexOf("="); + if (index > -1) result[item.slice(0, index)] = item.slice(index + 1); + }); + return result; +} + +function parseAccessOrigin(raw) { + const data = JSON.parse(raw); + const appIntel = splitHeaderPairs(data["Req-App-Intel"]); + const sysOrigin = splitHeaderPairs(data["Req-Sys-Origin"]); + return { + reqLang: data["Req-Lang"], + authorization: data.Authorization, + buildVersion: appIntel.build, + appVersion: appIntel.version, + appChannel: appIntel.channel, + reqImei: appIntel["Req-Imei"], + sysOrigin: sysOrigin.origin, + sysOriginChild: sysOrigin.child + }; +} + +function setHeadersFromApp(headers) { + const next = {}; + if (headers.authorization) next.authorization = headers.authorization; + if (headers.reqLang) next["req-lang"] = headers.reqLang; + if (headers.appVersion || headers.buildVersion || headers.appChannel) { + const intel = []; + if (headers.appVersion) intel.push(`version=${headers.appVersion}`); + if (headers.buildVersion) intel.push(`build=${headers.buildVersion}`); + if (headers.appChannel) intel.push(`channel=${headers.appChannel}`); + next["req-app-intel"] = intel.join(";"); + } + if (headers.reqImei) next["req-imei"] = headers.reqImei; + if (headers.sysOrigin) { + const origin = [`origin=${headers.sysOrigin}`]; + if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`); + next["req-sys-origin"] = origin.join(";"); + } + commonHeaders = { ...commonHeaders, ...next }; +} + +function isMobileDevice() { + return /Android|iPad|iPhone|iPod/.test(navigator.userAgent); +} + +function isAppEnvironment() { + return Boolean(window.app || window.webkit || window.FlutterPageControl || window.FlutterApp); +} + +function requestAccessOrigin() { + return new Promise((resolve) => { + window.renderData = resolve; + window.getIosAccessOriginParam = resolve; + + if (!isAppEnvironment()) { + setHeadersFromApp({ + authorization: "", + reqLang: state.lang, + appVersion: "1.0.0", + buildVersion: "1", + appChannel: "Web", + reqImei: "H5-STATIC", + sysOrigin: "LIKEI", + sysOriginChild: "LIKEI" + }); + resolve(null); + return; + } + + let attempt = 0; + const poll = () => { + attempt += 1; + if (window.app && typeof window.app.getAccessOrigin === "function") { + resolve(window.app.getAccessOrigin()); + return; + } + if (attempt < 50) { + window.setTimeout(poll, 100); + return; + } + if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") { + window.FlutterApp.postMessage("requestAccessOrigin"); + } + }; + + if (isMobileDevice() || isAppEnvironment()) { + poll(); + } else { + resolve(null); + } + }); +} + +async function connectToApp() { + const raw = await requestAccessOrigin(); + if (!raw) return { success: true, environment: "browser" }; + setHeadersFromApp(parseAccessOrigin(raw)); + return { success: true, environment: "app" }; +} + +async function apiGet(path) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "GET", + headers: commonHeaders + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.status === false) { + const error = new Error(data.errorMsg || data.message || `Request failed: ${response.status}`); + error.response = data; + throw error; + } + return data; +} + +async function fetchUserProfile() { + const result = await apiGet("/team/member/profile"); + if (result.status && result.body) state.userInfo = result.body; +} + +async function fetchTeamInfo() { + try { + const result = await apiGet("/team/entry"); + if (result.status && result.body) state.teamInfo = result.body.teamProfile || result.body; + } catch (error) { + state.teamInfo = null; + console.debug("BD leader team info unavailable:", error); + } +} + +async function fetchIdentity() { + const result = await apiGet("/app/h5/identity"); + if (result.status && result.body) state.identityInfo = result.body; +} + +async function fetchBalanceTotal() { + const result = await apiGet("/wallet/salary-account/balance/total"); + if (result.status && result.body) state.balanceTotal = result.body || {}; +} + +async function fetchBDHistoryMore(billBelong) { + const result = await apiGet(`/team/bd/history/more?billBelong=${encodeURIComponent(billBelong)}`); + if (result.status && result.body) state.historyMore = result.body || {}; +} + +async function fetchBDLeaderHistoryMore(billBelong) { + const result = await apiGet(`/team/bd/leader/history/more?billBelong=${encodeURIComponent(billBelong)}`); + if (result.status && result.body) state.historyMore = result.body || {}; +} + +function setIdentity(identity) { + state.identity = identity; + localStorage.setItem("identity", JSON.stringify({ identity })); +} + +function clearPayee() { + try { + sessionStorage.removeItem("payee"); + localStorage.removeItem("payee"); + } catch (error) { + console.debug("Payee cache clear skipped:", error); + } +} + +function formatMoney(value) { + if (value === null || value === undefined || value === "") return "0"; + const number = Number(value); + if (Number.isNaN(number)) return String(value); + return Number.isInteger(number) ? String(number) : number.toFixed(2); +} + +function normalizeStatus(status) { + if (status === "In Progress" || status === t("in_progress")) return t("in_progress"); + if (status === "Pending" || status === t("pending")) return t("pending"); + if (status === "Completed" || status === t("completed")) return t("completed"); + if (status === "Out of account" || status === t("out_of_account")) return t("out_of_account"); + return status || ""; +} + +function statusClass(status) { + const value = normalizeStatus(status); + if (value === t("completed")) return "is-completed"; + if (value === t("pending")) return "is-pending"; + if (value === t("out_of_account")) return "is-out"; + return "is-progress"; +} + +function navigateTo(target) { + const url = new URL(target, window.location.origin); + const currentLang = new URLSearchParams(window.location.search).get("lang"); + if (currentLang && !url.searchParams.has("lang")) url.searchParams.set("lang", currentLang); + window.location.href = `${url.pathname}${url.search}${url.hash}`; +} + +function closePage() { + if (window.history.length > 1) { + window.history.back(); + return; + } + if (window.app && typeof window.app.closePage === "function") { + window.app.closePage(); + return; + } + if (window.FlutterPageControl && typeof window.FlutterPageControl.postMessage === "function") { + window.FlutterPageControl.postMessage("close_page"); + } +} + +function renderBalance() { + document.getElementById("availableBalance").textContent = `$${formatMoney(state.balanceTotal.availableBalance || 0)}`; +} + +function historySource() { + return state.historyType === "bd" ? state.bdHistory : state.bdLeaderHistory; +} + +function historyTitle() { + return state.historyType === "bd" ? t("bd_salary") : t("bd_leader_history"); +} + +function renderHistorySheet() { + const data = historySource(); + document.getElementById("historyTitle").textContent = historyTitle(); + document.getElementById("historyTotalIncome").textContent = formatMoney(data.totalIncome || 0); + document.getElementById("historyPreviousIncome").textContent = formatMoney(data.previousPeriodIncome || 0); + + const list = document.getElementById("historyList"); + list.innerHTML = ""; + const items = data.incomeDetails || []; + items.forEach((item) => list.appendChild(createHistoryItem(item))); +} + +function createHistoryItem(item) { + const card = document.createElement("article"); + card.className = `salary-item ${statusClass(item.statusText)}`; + + const status = document.createElement("div"); + status.className = "status-background"; + status.textContent = normalizeStatus(item.statusText); + card.appendChild(status); + + const content = document.createElement("div"); + content.className = "salary-item-content"; + if (state.historyType === "bd") { + content.append( + textLine(item.billTitle || ""), + textLine(`${t("agency_number")}: ${item.agencyNumber || 0}`), + pairLine(`${t("team_salary")}: $${item.teamSalaryAmount || 0}`, `${t("bd_income_salary")}: $${item.bdIncomeSalary || item.settlementSalary || 0} (${item.bdRatioSalary || item.commissionRate || 0}%)`), + pairLine(`${t("team_top_up")}: $${item.teamRechargeAmount || 0}`, `${t("bd_income_top_up")}: $${item.bdIncomeRecharge || item.settlementSalary || 0} (${item.bdRatioRecharge || item.commissionRate || 0}%)`) + ); + } else { + content.append( + textLine(item.billTitle || ""), + pairLine(`${t("bd_number")}: ${item.bdNumber || 0}`, `${t("team_salary")}: $${item.teamSalaryAmount || 0}`) + ); + } + card.appendChild(content); + + if (normalizeStatus(item.statusText) === t("completed")) { + const more = document.createElement("button"); + more.type = "button"; + more.className = "more-bt"; + more.textContent = t("more"); + more.addEventListener("click", () => showHistoryMore(item.billBelong)); + card.appendChild(more); + } + return card; +} + +function textLine(text) { + const node = document.createElement("div"); + node.textContent = text; + return node; +} + +function pairLine(left, right) { + const node = document.createElement("div"); + node.className = "pair-line"; + const leftNode = document.createElement("div"); + const rightNode = document.createElement("div"); + leftNode.textContent = left; + rightNode.textContent = right; + node.append(leftNode, rightNode); + return node; +} + +async function showHistoryMore(billBelong) { + try { + if (state.historyType === "bd") { + await fetchBDHistoryMore(billBelong); + } else { + await fetchBDLeaderHistoryMore(billBelong); + } + state.modalMode = "details"; + renderModal(); + } catch (error) { + console.warn("BD leader history more failed:", error); + showToast(error.response?.errorMsg || error.message || t("failed_to_load_history")); + } +} + +function renderDetailsSheet() { + const data = state.historyMore || {}; + document.getElementById("detailsPeriod").textContent = data.period || ""; + const summary = document.getElementById("detailsSummary"); + summary.innerHTML = ""; + if (state.historyType === "bd") { + summary.append( + textLine(`${t("team_top_up")}: $${data.teamTotalRecharge || 0}`), + textLine(`${t("total_team_salary")}: $${data.teamTotalSalary || 0}`) + ); + } else { + summary.append( + textLine(`${t("team_salary")}: $${data.teamSalary || 0}`), + textLine(`${t("bd_number")}: ${data.bdNumber || 0}`) + ); + } + + const list = document.getElementById("memberDetails"); + list.innerHTML = ""; + (data.memberDetails || []).forEach((item) => { + const card = document.createElement("article"); + card.className = "member-item"; + const img = document.createElement("img"); + img.src = state.historyType === "bd" ? item.userAvatar || "" : item.bdUserAvatar || ""; + img.alt = ""; + img.addEventListener("error", () => { + img.removeAttribute("src"); + }); + const info = document.createElement("div"); + info.className = "member-info"; + info.append( + textLine(state.historyType === "bd" ? item.userName || "" : item.bdUserName || ""), + textLine(`${t("user_id_prefix")}${item.account || ""}`) + ); + const metrics = document.createElement("div"); + metrics.className = "member-metrics"; + metrics.append(textLine(`${t("salary")}: $${item.salary || 0}`)); + if (state.historyType === "bd") { + metrics.append(textLine(`${t("recharge")}: $${item.recharge || 0}`), textLine(`${t("host")}: ${item.hostCount || 0}`)); + } else { + metrics.append(textLine(`${t("agencies")}: ${item.agencyCount || 0}`)); + } + card.append(img, info, metrics); + list.appendChild(card); + }); +} + +function renderModal() { + const mask = document.getElementById("maskLayer"); + const history = document.getElementById("historySheet"); + const details = document.getElementById("detailsSheet"); + const showHistory = state.modalMode === "history"; + const showDetails = state.modalMode === "details"; + mask.hidden = !showHistory && !showDetails; + history.hidden = !showHistory; + details.hidden = !showDetails; + if (showHistory) renderHistorySheet(); + if (showDetails) renderDetailsSheet(); +} + +function closeModal() { + state.modalMode = ""; + state.historyMore = {}; + renderModal(); +} + +function showToast(message) { + const toast = document.getElementById("toast"); + toast.textContent = message; + toast.hidden = false; + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => { + toast.hidden = true; + }, 2500); +} + +function bindEvents() { + document.querySelector("[data-action='back']").addEventListener("click", closePage); + document.querySelector("[data-action='language']").addEventListener("click", () => navigateTo("/language")); + document.querySelectorAll("[data-route]").forEach((node) => { + node.addEventListener("click", () => navigateTo(node.dataset.route)); + }); + document.querySelector("[data-action='sendGift']").addEventListener("click", () => navigateTo("/bd-item-distribution")); + document.querySelector("[data-action='closeModal']").addEventListener("click", closeModal); +} + +async function initializePageData() { + const tasks = [fetchUserProfile(), fetchTeamInfo(), fetchIdentity()]; + await Promise.allSettled(tasks); +} + +async function init() { + setLanguage(); + setIcons(); + bindEvents(); + renderBalance(); + clearPayee(); + setIdentity("BD_LEADER"); + + try { + await connectToApp(); + await initializePageData(); + await fetchBalanceTotal(); + } catch (error) { + console.warn("BD leader center initialization failed:", error); + showToast(error.response?.errorMsg || error.message || t("failed_to_load_balance")); + } finally { + renderBalance(); + } +} + +init(); diff --git a/h5/bd-leader-center/index.html b/h5/bd-leader-center/index.html index 37291a7..a1b4538 100644 --- a/h5/bd-leader-center/index.html +++ b/h5/bd-leader-center/index.html @@ -13,23 +13,128 @@ - Yumi H5 - - - - - + BD Leader Center + -

+
+
+ +

BD Leader Center

+ +
+ +
+
+
+
+
My available salary
+ +
+
+ + $0 +
+
+
+ + +
+
+ + + + + diff --git a/h5/bd-list/index.html b/h5/bd-list/index.html new file mode 100644 index 0000000..ce5d8d0 --- /dev/null +++ b/h5/bd-list/index.html @@ -0,0 +1,13 @@ + + + + + + BD List + + + + + + + diff --git a/h5/cash-out-details/index.html b/h5/cash-out-details/index.html new file mode 100644 index 0000000..d9a1c68 --- /dev/null +++ b/h5/cash-out-details/index.html @@ -0,0 +1,13 @@ + + + + + + Cash Out Details + + + + + + + diff --git a/h5/cash-out/index.html b/h5/cash-out/index.html new file mode 100644 index 0000000..65fd9d0 --- /dev/null +++ b/h5/cash-out/index.html @@ -0,0 +1,13 @@ + + + + + + Cash Out + + + + + + + diff --git a/h5/cash-withdraw/index.html b/h5/cash-withdraw/index.html new file mode 100644 index 0000000..ea8127d --- /dev/null +++ b/h5/cash-withdraw/index.html @@ -0,0 +1,13 @@ + + + + + + Cash Withdraw + + + + + + + diff --git a/h5/center-static/center-static.css b/h5/center-static/center-static.css new file mode 100644 index 0000000..7657cd1 --- /dev/null +++ b/h5/center-static/center-static.css @@ -0,0 +1,318 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.4; +} + +html, +body { + width: 100%; + min-height: 100%; + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: transparent; + overflow-x: hidden; +} + +body { + color: #1f3528; + background: #edf8f1; +} + +button { + border: 0; + background: transparent; + color: inherit; + font: inherit; +} + +.center-page { + min-height: 100vh; + overflow-y: auto; + background: #edf8f1; +} + +.page-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: 44px 1fr 58px; + align-items: center; + min-height: calc(48px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 10px 0; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); +} + +.page-header h1 { + min-width: 0; + font-size: 1.35em; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #153d28; +} + +.icon-button, +.language-button { + min-width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + color: #1f6f46; +} + +.icon-button span { + display: block; + font-size: 2em; + line-height: 1; +} + +.language-button { + justify-self: end; + padding: 0 10px; + border-radius: 999px; + background: #dff5e7; + color: #24724a; + font-size: 0.86em; +} + +.content { + display: flex; + flex-direction: column; + gap: 14px; + padding: 16px; +} + +.surface-card { + border: 1px solid #b7e0c6; + border-radius: 18px; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.hero-card { + position: relative; + padding: 18px; + background: #f8fff9; + border-color: #94d9ae; + overflow: hidden; +} + +.hero-card::after { + content: ""; + position: absolute; + right: 16px; + bottom: 16px; + width: 64px; + height: 64px; + border-radius: 20px; + background: #d7f5e2; + border: 10px solid #ecfbf1; +} + +.hero-row { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + gap: 10px; +} + +.hero-title { + font-weight: 700; + color: #244735; +} + +.hero-link { + flex-shrink: 0; + padding: 4px 10px; + border-radius: 999px; + background: #fff3c8; + color: #846216; + font-weight: 700; +} + +.hero-value { + position: relative; + z-index: 1; + margin-top: 6px; + font-size: 1.65em; + font-weight: 800; + color: #105c36; +} + +.summary-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; +} + +.summary-item { + padding: 12px; + border-radius: 14px; + border: 1px solid #cce9d7; + background: #fbfffc; +} + +.summary-item:nth-child(2n) { + background: #f7fbec; +} + +.summary-label { + font-size: 0.83em; + font-weight: 700; + color: #587060; +} + +.summary-value { + margin-top: 4px; + font-size: 1.12em; + font-weight: 800; + color: #153d28; +} + +.task-card { + padding: 14px 16px 16px; + background: #fffaf0; + border-color: #e7c777; +} + +.task-title { + margin-bottom: 10px; + font-weight: 800; + color: #3f3826; +} + +.task-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + text-align: center; +} + +.task-label { + margin-bottom: 6px; + font-size: 0.9em; + font-weight: 800; + color: #4b4536; +} + +.task-value { + font-size: 0.95em; + font-weight: 800; + color: #1f3528; +} + +.menu-card { + padding: 10px; + background: #fbfffc; +} + +.section-title { + padding: 4px 4px 10px; + font-size: 1.02em; + font-weight: 800; + color: #1f5134; +} + +.section-title:empty { + display: none; +} + +.menu-row { + width: 100%; + min-height: 4.5em; + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: 14px; + text-align: left; +} + +.menu-row:nth-of-type(4n + 2) { + background: #eefbf3; +} + +.menu-row:nth-of-type(4n + 3) { + background: #f7fbec; +} + +.menu-row:nth-of-type(4n + 4) { + background: #eef7fb; +} + +.menu-row:nth-of-type(4n + 5) { + background: #fff5ed; +} + +.menu-label { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + gap: 12px; +} + +.menu-icon { + width: 2.65em; + height: 2.65em; + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: center; + border-radius: 14px; + border: 1px solid #bce5ca; + background: #d7f5e2; + color: #1e6b43; + font-size: 1em; + font-weight: 800; +} + +.menu-text { + min-width: 0; + font-size: 1em; + font-weight: 800; + color: #173a28; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.arrow { + flex-shrink: 0; + color: #7fa48d; + font-size: 1.35em; + font-weight: 800; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(22px + env(safe-area-inset-bottom)); + z-index: 20; + max-width: calc(100% - 40px); + transform: translateX(-50%); + padding: 9px 13px; + border-radius: 999px; + background: rgba(22, 56, 36, 0.92); + color: #fff; + font-size: 0.9em; + font-weight: 700; + text-align: center; +} + +[hidden] { + display: none !important; +} diff --git a/h5/center-static/center-static.js b/h5/center-static/center-static.js new file mode 100644 index 0000000..f45a5c8 --- /dev/null +++ b/h5/center-static/center-static.js @@ -0,0 +1,297 @@ +const API_BASE_URL = "https://jvapi.haiyihy.com"; + +let commonHeaders = { + authorization: "Bearer undefined", + "req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google", + "req-client": "Android", + "req-imei": "8fa54d728ab449e04f9292329ed44bda", + "req-lang": "id-ID", + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "req-version": "V2", + "req-zone": "Asia/Shanghai" +}; + +const fallbackConfig = { + title: "Center", + identity: "USER", + heroTitle: "Available salary", + heroLink: "Details", + heroRoute: "/history-salary", + balanceType: "", + summaries: [], + sections: [] +}; + +const config = { ...fallbackConfig, ...(window.CENTER_PAGE || {}) }; +const state = { + lang: resolveLanguage(), + heroValue: "0", + summaries: [...(config.summaries || [])] +}; + +function resolveLanguage() { + const params = new URLSearchParams(window.location.search); + const hashQuery = window.location.hash.includes("?") ? window.location.hash.split("?")[1] : ""; + const hashParams = new URLSearchParams(hashQuery); + const lang = params.get("lang") || hashParams.get("lang") || navigator.language || "en"; + if (lang.startsWith("ar")) return "ar"; + if (lang.startsWith("tr")) return "tr"; + if (lang.startsWith("bn")) return "bn"; + return "en"; +} + +function formatMoney(value) { + if (value === null || value === undefined || value === "") return "0"; + const number = Number(value); + if (Number.isNaN(number)) return String(value); + return Number.isInteger(number) ? String(number) : number.toFixed(2); +} + +function splitHeaderPairs(value) { + const result = {}; + if (!value) return result; + value.split(";").forEach((item) => { + const index = item.indexOf("="); + if (index > -1) result[item.slice(0, index)] = item.slice(index + 1); + }); + return result; +} + +function parseAccessOrigin(raw) { + const data = JSON.parse(raw); + const appIntel = splitHeaderPairs(data["Req-App-Intel"]); + const sysOrigin = splitHeaderPairs(data["Req-Sys-Origin"]); + return { + reqLang: data["Req-Lang"], + authorization: data.Authorization, + buildVersion: appIntel.build, + appVersion: appIntel.version, + appChannel: appIntel.channel, + reqImei: appIntel["Req-Imei"], + sysOrigin: sysOrigin.origin, + sysOriginChild: sysOrigin.child + }; +} + +function setHeadersFromApp(headers) { + const next = {}; + if (headers.authorization) next.authorization = headers.authorization; + if (headers.reqLang) next["req-lang"] = headers.reqLang; + if (headers.appVersion || headers.buildVersion || headers.appChannel) { + const intel = []; + if (headers.appVersion) intel.push(`version=${headers.appVersion}`); + if (headers.buildVersion) intel.push(`build=${headers.buildVersion}`); + if (headers.appChannel) intel.push(`channel=${headers.appChannel}`); + next["req-app-intel"] = intel.join(";"); + } + if (headers.reqImei) next["req-imei"] = headers.reqImei; + if (headers.sysOrigin) { + const origin = [`origin=${headers.sysOrigin}`]; + if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`); + next["req-sys-origin"] = origin.join(";"); + } + commonHeaders = { ...commonHeaders, ...next }; +} + +function requestAccessOrigin() { + return new Promise((resolve) => { + window.renderData = resolve; + window.getIosAccessOriginParam = resolve; + + if (!(window.app || window.webkit || window.FlutterPageControl)) { + setHeadersFromApp({ + authorization: "", + reqLang: state.lang, + appVersion: "1.0.0", + buildVersion: "1", + appChannel: "Web", + reqImei: "H5-STATIC", + sysOrigin: "LIKEI", + sysOriginChild: "LIKEI" + }); + resolve(null); + return; + } + + let attempt = 0; + const poll = () => { + attempt += 1; + if (window.app && typeof window.app.getAccessOrigin === "function") { + resolve(window.app.getAccessOrigin()); + return; + } + if (attempt < 50) { + window.setTimeout(poll, 100); + return; + } + if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") { + window.FlutterApp.postMessage("requestAccessOrigin"); + } + }; + poll(); + }); +} + +async function connectToApp() { + const raw = await requestAccessOrigin(); + if (raw) setHeadersFromApp(parseAccessOrigin(raw)); +} + +async function apiGet(path) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "GET", + headers: commonHeaders + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.status === false) { + const error = new Error(data.errorMsg || data.message || `Request failed: ${response.status}`); + error.response = data; + throw error; + } + return data; +} + +async function fetchHeroValue() { + if (config.balanceType) { + const result = await apiGet(`/wallet/salary-account/balance?salaryType=${config.balanceType}`); + if (result.status && result.body) state.heroValue = formatMoney(result.body.availableBalance || 0); + return; + } + if (config.balanceEndpoint) { + const result = await apiGet(config.balanceEndpoint); + const body = result.body || {}; + state.heroValue = formatMoney(body.currentSalary ?? body.availableBalance ?? body.balance ?? 0); + } +} + +function showToast(message) { + const toast = document.getElementById("toast"); + toast.textContent = message; + toast.hidden = false; + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => { + toast.hidden = true; + }, 2500); +} + +function normalizeRoute(target) { + const alias = { + "/invite-agency": "/invite-agency/", + "/invite-bd": "/invite-bd/", + "/invite-bd-leader": "/invite-bd-leader/", + "/invite-recharge-agency": "/invite-recharge-agency/" + }; + const url = new URL(alias[target] || target, window.location.origin); + const currentLang = new URLSearchParams(window.location.search).get("lang"); + if (currentLang && !url.searchParams.has("lang")) url.searchParams.set("lang", currentLang); + return `${url.pathname}${url.search}${url.hash}`; +} + +function navigateTo(target) { + window.location.href = normalizeRoute(target); +} + +function menuIcon(text) { + return (text || "?").trim().slice(0, 1).toUpperCase(); +} + +function render() { + document.documentElement.lang = state.lang; + document.documentElement.dir = state.lang === "ar" ? "rtl" : "ltr"; + document.getElementById("pageTitle").textContent = config.title; + document.querySelector("[data-action='language']").textContent = state.lang.toUpperCase(); + document.getElementById("heroTitle").textContent = config.heroTitle; + document.getElementById("heroLink").textContent = config.heroLink || "Details"; + document.getElementById("heroValue").textContent = `$${state.heroValue}`; + + const summaryRoot = document.getElementById("summaryGrid"); + summaryRoot.innerHTML = ""; + state.summaries.forEach((item) => { + const node = document.createElement("div"); + node.className = "summary-item"; + node.innerHTML = `
`; + node.querySelector(".summary-label").textContent = item.label; + node.querySelector(".summary-value").textContent = item.value; + summaryRoot.appendChild(node); + }); + summaryRoot.hidden = !state.summaries.length; + + const oldTask = document.getElementById("taskCard"); + if (oldTask) oldTask.remove(); + if (config.task) { + const taskCard = document.createElement("section"); + taskCard.className = "surface-card task-card"; + taskCard.id = "taskCard"; + taskCard.innerHTML = `
`; + taskCard.querySelector(".task-title").textContent = config.task.title || ""; + const taskGrid = taskCard.querySelector(".task-grid"); + (config.task.items || []).forEach((item) => { + const node = document.createElement("div"); + node.innerHTML = `
`; + node.querySelector(".task-label").textContent = item.label; + node.querySelector(".task-value").textContent = item.value; + taskGrid.appendChild(node); + }); + const sections = document.getElementById("sections"); + sections.parentNode.insertBefore(taskCard, sections); + } + + const sectionRoot = document.getElementById("sections"); + sectionRoot.innerHTML = ""; + (config.sections || []).forEach((section) => { + const card = document.createElement("section"); + card.className = "surface-card menu-card"; + const title = document.createElement("div"); + title.className = "section-title"; + title.textContent = section.title || ""; + card.appendChild(title); + + (section.items || []).forEach((item) => { + const row = document.createElement("button"); + row.type = "button"; + row.className = "menu-row"; + row.dataset.route = item.route; + row.innerHTML = ``; + row.querySelector(".menu-icon").textContent = item.icon || menuIcon(item.label); + row.querySelector(".menu-text").textContent = item.label; + row.addEventListener("click", () => navigateTo(item.route)); + card.appendChild(row); + }); + sectionRoot.appendChild(card); + }); +} + +function bindEvents() { + document.querySelector("[data-action='back']").addEventListener("click", () => { + if (window.history.length > 1) { + window.history.back(); + return; + } + if (window.app && typeof window.app.closePage === "function") { + window.app.closePage(); + return; + } + if (window.FlutterPageControl && typeof window.FlutterPageControl.postMessage === "function") { + window.FlutterPageControl.postMessage("close_page"); + } + }); + document.querySelector("[data-action='language']").addEventListener("click", () => navigateTo("/language")); + document.getElementById("heroLink").addEventListener("click", () => navigateTo(config.heroRoute || "/history-salary")); +} + +async function init() { + localStorage.setItem("identity", JSON.stringify({ identity: config.identity })); + render(); + bindEvents(); + try { + await connectToApp(); + await fetchHeroValue(); + } catch (error) { + console.warn(`${config.title} data request failed:`, error); + showToast(error.response?.errorMsg || error.message || "Failed to load data."); + } finally { + render(); + } +} + +init(); diff --git a/h5/center-static/static-route.css b/h5/center-static/static-route.css new file mode 100644 index 0000000..b0c8e89 --- /dev/null +++ b/h5/center-static/static-route.css @@ -0,0 +1,177 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; +} + +html, +body { + width: 100%; + min-height: 100%; + background: #edf8f1; + color: #1f3528; + -webkit-text-size-adjust: 100%; +} + +button, +input { + font: inherit; +} + +button { + border: 0; + background: transparent; + color: inherit; +} + +.page { + min-height: 100vh; + background: #edf8f1; +} + +.page-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: 44px 1fr 58px; + align-items: center; + min-height: calc(48px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 10px 0; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); +} + +.page-header h1 { + min-width: 0; + color: #153d28; + font-size: 1.32em; + font-weight: 800; + text-align: center; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.back-button, +.lang-button { + min-width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + font-weight: 800; + color: #1f6f46; +} + +.back-button span { + font-size: 2em; + line-height: 1; +} + +.lang-button { + justify-self: end; + padding: 0 10px; + border-radius: 999px; + background: #dff5e7; + font-size: 0.86em; +} + +.content { + display: flex; + flex-direction: column; + gap: 14px; + padding: 16px; +} + +.search-card, +.list-card, +.empty-card { + border: 1px solid #b7e0c6; + border-radius: 18px; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.search-card { + display: flex; + gap: 8px; + padding: 10px; + background: #fbfffc; +} + +.search-card input { + flex: 1; + min-width: 0; + border: 1px solid #cce9d7; + border-radius: 12px; + background: #f8fff9; + padding: 10px 12px; + outline: none; + color: #1f3528; + font-weight: 700; +} + +.search-card button, +.primary-button { + flex-shrink: 0; + border-radius: 12px; + background: #dff5e7; + padding: 0 14px; + color: #1f6f46; + font-weight: 800; +} + +.list-card { + overflow: hidden; +} + +.row { + width: 100%; + min-height: 4.2em; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 12px 14px; + border-bottom: 1px solid #e2f1e7; +} + +.row:last-child { + border-bottom: 0; +} + +.row:nth-child(2n) { + background: #fbfffc; +} + +.row-title { + font-weight: 800; + color: #173a28; +} + +.row-subtitle { + margin-top: 4px; + color: #6d7e72; + font-size: 0.86em; + font-weight: 700; +} + +.tag { + flex-shrink: 0; + border-radius: 999px; + background: #fff3c8; + padding: 5px 9px; + color: #846216; + font-size: 0.82em; + font-weight: 800; +} + +.empty-card { + padding: 24px 16px; + text-align: center; + color: #6d7e72; + font-weight: 700; +} diff --git a/h5/center-static/static-route.js b/h5/center-static/static-route.js new file mode 100644 index 0000000..0094af9 --- /dev/null +++ b/h5/center-static/static-route.js @@ -0,0 +1,56 @@ +const config = window.STATIC_ROUTE || {}; + +function lang() { + const value = new URLSearchParams(window.location.search).get("lang") || navigator.language || "en"; + if (value.startsWith("ar")) return "AR"; + if (value.startsWith("tr")) return "TR"; + if (value.startsWith("bn")) return "BN"; + return "EN"; +} + +function goBack() { + if (window.history.length > 1) { + window.history.back(); + return; + } + if (window.app && typeof window.app.closePage === "function") { + window.app.closePage(); + return; + } + if (window.FlutterPageControl && typeof window.FlutterPageControl.postMessage === "function") { + window.FlutterPageControl.postMessage("close_page"); + } +} + +function renderRows(rows) { + const list = document.getElementById("list"); + list.innerHTML = ""; + rows.forEach((row) => { + const node = document.createElement("div"); + node.className = "row"; + node.innerHTML = `
`; + node.querySelector(".row-title").textContent = row.title; + node.querySelector(".row-subtitle").textContent = row.subtitle || ""; + node.querySelector(".tag").textContent = row.tag || "Ready"; + list.appendChild(node); + }); +} + +function init() { + document.title = config.title || "Yumi H5"; + document.getElementById("title").textContent = config.title || "Yumi H5"; + document.getElementById("lang").textContent = lang(); + document.getElementById("keyword").placeholder = config.placeholder || "Search"; + document.getElementById("empty").textContent = config.empty || "No data"; + document.querySelector("[data-action='back']").addEventListener("click", goBack); + document.getElementById("search").addEventListener("click", () => { + const value = document.getElementById("keyword").value.trim(); + const base = config.rows || []; + renderRows(value ? base.filter((row) => JSON.stringify(row).toLowerCase().includes(value.toLowerCase())) : base); + }); + renderRows(config.rows || []); + document.getElementById("list").hidden = !(config.rows || []).length; + document.getElementById("empty").hidden = (config.rows || []).length > 0; +} + +init(); diff --git a/h5/exchange-gold-coins/index.html b/h5/exchange-gold-coins/index.html new file mode 100644 index 0000000..dd21fa7 --- /dev/null +++ b/h5/exchange-gold-coins/index.html @@ -0,0 +1,13 @@ + + + + + + Exchange Coins + + + + + + + diff --git a/h5/history-salary/index.html b/h5/history-salary/index.html new file mode 100644 index 0000000..c2cc2c6 --- /dev/null +++ b/h5/history-salary/index.html @@ -0,0 +1,13 @@ + + + + + + History Salary + + + + + + + diff --git a/h5/host-center/host-center.css b/h5/host-center/host-center.css new file mode 100644 index 0000000..cced638 --- /dev/null +++ b/h5/host-center/host-center.css @@ -0,0 +1,431 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.35; +} + +html, +body { + width: 100%; + min-height: 100%; + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: transparent; +} + +body { + color: rgba(0, 0, 0, 0.8); + background: #edf8f1; +} + +button { + border: 0; + background: transparent; + color: inherit; + font: inherit; +} + +.host-center { + width: 100vw; + min-height: 100vh; + background: #edf8f1; +} + +.page-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: 44px 1fr 58px; + align-items: center; + min-height: calc(48px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 10px 0; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); +} + +.page-header h1 { + min-width: 0; + color: #153d28; + font-size: 1.25em; + font-weight: 700; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.header-icon, +.lang-button { + min-width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + color: #1f6f46; + font-weight: 700; +} + +.header-icon { + padding: 6px; +} + +.header-icon img { + width: 100%; + height: 100%; + display: block; +} + +.lang-button { + justify-self: end; + padding: 0 10px; + border-radius: 999px; + background: #dff5e7; + font-size: 0.86em; +} + +.page-content { + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px; +} + +.section-title { + display: flex; + align-items: center; + margin: 0 1%; + color: #173a28; + font-size: 1.25em; + font-weight: 700; +} + +.surface-card { + margin: 0 1%; + border: 1px solid #b7e0c6; + border-radius: 20px; + background: #fbfffc; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.agency-card { + display: flex; + align-items: center; + gap: 12px; + padding: 16px; +} + +.avatar { + position: relative; + width: 50px; + height: 50px; + flex: 0 0 50px; + overflow: hidden; + border-radius: 25px; + background: #91d9aa; + color: #fff; + font-size: 20px; + font-weight: 700; +} + +.avatar img, +.avatar span { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.avatar img { + display: block; + object-fit: cover; +} + +.avatar span { + display: flex; + align-items: center; + justify-content: center; +} + +.user-info { + flex: 1; + min-width: 0; +} + +.agency-name { + width: 100%; + margin-bottom: 4px; + color: #244735; + font-weight: 700; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.agency-id { + color: #647468; + font-size: 0.9em; +} + +.leave-button { + min-width: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 4px 12px; + border: 1px solid #ff9500; + border-radius: 16px; + color: #ff9500; + font-weight: 700; +} + +.salary-card, +.task-card, +.menu-card { + padding: 16px; +} + +.card-row, +.menu-row { + display: flex; + align-items: center; + justify-content: space-between; +} + +.card-title, +.task-title { + color: #244735; + font-size: 1.08em; + font-weight: 700; +} + +.text-link { + color: rgba(0, 0, 0, 0.42); + cursor: pointer; + font-weight: 600; +} + +.salary-value { + margin-top: 8px; + display: flex; + align-items: center; + gap: 6px; + color: #105c36; + font-size: 1.45em; + font-weight: 700; +} + +.money-icon { + width: 1.05em; + height: 1.05em; + display: block; + flex: 0 0 auto; +} + +.task-card { + background: #fffaf0; + border-color: #e7c777; +} + +.task-title { + margin-bottom: 12px; +} + +.task-grid { + display: flex; + justify-content: space-between; +} + +.task-item { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + align-items: center; +} + +.task-label, +.task-value { + font-weight: 700; +} + +.task-label { + margin-bottom: 5px; + color: #4b4536; +} + +.task-value { + color: #1f3528; +} + +.menu-card { + display: flex; + flex-direction: column; + gap: 4vw; +} + +.menu-row { + width: 100%; + min-height: 32px; + text-align: left; +} + +.menu-main { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + gap: 1vw; +} + +.menu-main span { + min-width: 0; + color: #173a28; + font-size: 1.4em; + font-weight: 700; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.menu-icon { + display: block; + width: 1.6em; + flex: 0 0 auto; +} + +.arrow-icon { + display: block; + width: 1.5em; + flex: 0 0 auto; +} + +.divider { + border-bottom: 1px solid #d9eadf; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(22px + env(safe-area-inset-bottom)); + z-index: 30; + max-width: calc(100% - 40px); + transform: translateX(-50%); + padding: 9px 13px; + border-radius: 999px; + background: rgba(22, 56, 36, 0.92); + color: #fff; + font-size: 0.9em; + font-weight: 700; + text-align: center; +} + +.modal-layer { + position: fixed; + inset: 0; + z-index: 20; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.45); +} + +.modal-card { + width: 80%; + max-width: 420px; + display: flex; + flex-direction: column; + align-items: center; + gap: 2vw; + padding: 12px; + border-radius: 12px; + background: #fff; +} + +.modal-title { + color: rgba(0, 0, 0, 0.8); + font-size: 1.2em; + font-weight: 800; +} + +.modal-message { + color: rgba(0, 0, 0, 0.8); + font-weight: 700; + text-align: center; +} + +.modal-submessage { + color: rgba(0, 0, 0, 0.4); + font-size: 0.8em; + font-weight: 700; + text-align: center; +} + +.modal-actions { + width: 80%; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.modal-primary, +.modal-secondary { + display: flex; + align-items: center; + justify-content: center; + min-height: 38px; + padding: 8px 12px; + border-radius: 70px; + font-weight: 800; +} + +.modal-primary { + width: 50%; + background: #ff9500; + color: #fff; +} + +.modal-actions .modal-primary, +.modal-secondary { + width: 45%; +} + +.modal-secondary { + border: 1px solid #ffb805; + background: #fff; + color: #ff9500; +} + +[hidden] { + display: none !important; +} + +[dir="rtl"] .menu-row, +[dir="rtl"] .page-content { + text-align: right; +} + +@media screen and (max-width: 360px) { + * { + font-size: 10px; + } +} + +@media screen and (min-width: 360px) { + * { + font-size: 12px; + } +} + +@media screen and (min-width: 768px) { + * { + font-size: 24px; + } +} diff --git a/h5/host-center/host-center.js b/h5/host-center/host-center.js new file mode 100644 index 0000000..8445100 --- /dev/null +++ b/h5/host-center/host-center.js @@ -0,0 +1,653 @@ +const API_BASE_URL = "https://jvapi.haiyihy.com"; +const DEFAULT_AVATAR = "/assets/defaultAvatar-CdxWBK1k-1776148661448.png"; +const icons = { + policy: "./icons/policy.svg", + exchange: "./icons/exchange.svg", + transfer: "./icons/transfer.svg", + withdraw: "./icons/withdraw.svg", + bank: "./icons/bank.svg", + money: "./icons/money.svg", + back: "./icons/back.svg", + arrow: "./icons/arrow.svg" +}; + +let commonHeaders = { + authorization: "Bearer undefined", + "req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google", + "req-client": "Android", + "req-imei": "8fa54d728ab449e04f9292329ed44bda", + "req-lang": "id-ID", + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "req-version": "V2", + "req-zone": "Asia/Shanghai" +}; + +const i18n = { + en: { + host_center: "Host Center", + my_agency: "My agency", + user_id_prefix: "ID:", + leave: "Leave", + my_available_salary: "My available salary", + my_salary_details: "My salary details", + todays_task: "Today's task", + anchor_type: "Anchor type", + minutes: "Minutes", + gift_task: "Gift Task", + platform_policy: "Platform policy", + exchange_coins: "Exchange coins", + transfer: "Transfer", + cash_withdraw: "Cash withdraw", + bank_accounts: "Bank accounts", + prompt: "Prompt", + tips: "Tips", + fill_info_tips: "Please complete your information first.", + card_issue_tips: "Please make sure your bank card and KYC information are available.", + to_improve: "To improve", + leave_agent_tips: "Are you sure you want to leave?", + cancel: "Cancel", + confirm: "Confirm", + failed_to_load_balance: "Failed to load balance. Please try again.", + something_went_wrong: "Something went wrong." + }, + ar: { + host_center: "مركز المضيف", + my_agency: "وكالتي", + user_id_prefix: "ID:", + leave: "مغادرة", + my_available_salary: "راتبي المتاح", + my_salary_details: "تفاصيل الراتب", + todays_task: "مهمة اليوم", + anchor_type: "نوع المضيف", + minutes: "الدقائق", + gift_task: "مهمة الهدايا", + platform_policy: "سياسة المنصة", + exchange_coins: "استبدال العملات", + transfer: "تحويل", + cash_withdraw: "سحب نقدي", + bank_accounts: "الحسابات البنكية", + prompt: "تنبيه", + tips: "نصائح", + fill_info_tips: "يرجى إكمال معلوماتك أولا.", + card_issue_tips: "يرجى التأكد من توفر البطاقة البنكية ومعلومات KYC.", + to_improve: "إكمال", + leave_agent_tips: "هل أنت متأكد أنك تريد المغادرة؟", + cancel: "إلغاء", + confirm: "تأكيد", + failed_to_load_balance: "فشل تحميل الرصيد. يرجى المحاولة مرة أخرى.", + something_went_wrong: "حدث خطأ ما." + }, + tr: { + host_center: "Host Merkezi", + my_agency: "Ajansım", + user_id_prefix: "ID:", + leave: "Ayrıl", + my_available_salary: "Kullanılabilir maaşım", + my_salary_details: "Maaş detayları", + todays_task: "Bugünkü görev", + anchor_type: "Host türü", + minutes: "Dakika", + gift_task: "Hediye görevi", + platform_policy: "Platform politikası", + exchange_coins: "Coin değiştir", + transfer: "Transfer", + cash_withdraw: "Para çek", + bank_accounts: "Banka hesapları", + prompt: "Uyarı", + tips: "İpuçları", + fill_info_tips: "Lütfen önce bilgilerinizi tamamlayın.", + card_issue_tips: "Lütfen banka kartı ve KYC bilgilerinizin mevcut olduğundan emin olun.", + to_improve: "Tamamla", + leave_agent_tips: "Ayrılmak istediğinizden emin misiniz?", + cancel: "İptal", + confirm: "Onayla", + failed_to_load_balance: "Bakiye yüklenemedi. Lütfen tekrar deneyin.", + something_went_wrong: "Bir şeyler ters gitti." + }, + bn: { + host_center: "হোস্ট সেন্টার", + my_agency: "আমার এজেন্সি", + user_id_prefix: "ID:", + leave: "ছাড়ুন", + my_available_salary: "আমার উপলভ্য বেতন", + my_salary_details: "বেতনের বিবরণ", + todays_task: "আজকের কাজ", + anchor_type: "হোস্ট ধরন", + minutes: "মিনিট", + gift_task: "গিফট টাস্ক", + platform_policy: "প্ল্যাটফর্ম নীতি", + exchange_coins: "কয়েন এক্সচেঞ্জ", + transfer: "ট্রান্সফার", + cash_withdraw: "ক্যাশ উত্তোলন", + bank_accounts: "ব্যাংক অ্যাকাউন্ট", + prompt: "প্রম্পট", + tips: "টিপস", + fill_info_tips: "প্রথমে আপনার তথ্য সম্পূর্ণ করুন।", + card_issue_tips: "আপনার ব্যাংক কার্ড এবং KYC তথ্য আছে কিনা নিশ্চিত করুন।", + to_improve: "সম্পূর্ণ করুন", + leave_agent_tips: "আপনি কি নিশ্চিত যে আপনি ছাড়তে চান?", + cancel: "বাতিল", + confirm: "নিশ্চিত", + failed_to_load_balance: "ব্যালেন্স লোড করতে ব্যর্থ। আবার চেষ্টা করুন।", + something_went_wrong: "কিছু ভুল হয়েছে।" + } +}; + +const state = { + lang: resolveLanguage(), + profile: {}, + teamInfo: null, + identityInfo: null, + agency: {}, + salaryInfo: { currentSalary: "0" }, + taskInfo: { anchorType: "Chat", minutesProgress: 0, minutesTotal: 120, giftTask: 0 }, + bankCards: [], + activeBankCard: null, + withdrawInfo: null, + withdrawEnabled: false +}; + +const $ = (selector) => document.querySelector(selector); +const $$ = (selector) => Array.from(document.querySelectorAll(selector)); +const t = (key) => (i18n[state.lang] && i18n[state.lang][key]) || i18n.en[key] || key; + +function resolveLanguage() { + const params = new URLSearchParams(window.location.search); + const hashQuery = window.location.hash.includes("?") ? window.location.hash.split("?")[1] : ""; + const hashParams = new URLSearchParams(hashQuery); + const lang = params.get("lang") || hashParams.get("lang") || navigator.language || "en"; + if (lang.startsWith("ar")) return "ar"; + if (lang.startsWith("tr")) return "tr"; + if (lang.startsWith("bn")) return "bn"; + return "en"; +} + +function splitHeaderPairs(value) { + const result = {}; + if (!value) return result; + value.split(";").forEach((item) => { + const index = item.indexOf("="); + if (index > -1) result[item.slice(0, index)] = item.slice(index + 1); + }); + return result; +} + +function parseAccessOrigin(raw) { + const data = JSON.parse(raw); + const appIntel = splitHeaderPairs(data["Req-App-Intel"]); + const sysOrigin = splitHeaderPairs(data["Req-Sys-Origin"]); + return { + reqLang: data["Req-Lang"], + authorization: data.Authorization, + buildVersion: appIntel.build, + appVersion: appIntel.version, + appChannel: appIntel.channel, + reqImei: appIntel["Req-Imei"], + sysOrigin: sysOrigin.origin, + sysOriginChild: sysOrigin.child + }; +} + +function setHeadersFromApp(headers) { + const next = {}; + if (headers.authorization) next.authorization = headers.authorization; + if (headers.reqLang) next["req-lang"] = headers.reqLang; + if (headers.appVersion || headers.buildVersion || headers.appChannel) { + const intel = []; + if (headers.appVersion) intel.push(`version=${headers.appVersion}`); + if (headers.buildVersion) intel.push(`build=${headers.buildVersion}`); + if (headers.appChannel) intel.push(`channel=${headers.appChannel}`); + next["req-app-intel"] = intel.join(";"); + } + if (headers.reqImei) next["req-imei"] = headers.reqImei; + if (headers.sysOrigin) { + const origin = [`origin=${headers.sysOrigin}`]; + if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`); + next["req-sys-origin"] = origin.join(";"); + } + commonHeaders = { ...commonHeaders, ...next }; +} + +function connectToApp() { + return new Promise((resolve) => { + window.renderData = resolve; + window.getIosAccessOriginParam = resolve; + + if (!(window.app || window.webkit || window.FlutterPageControl)) { + setHeadersFromApp({ + authorization: "", + reqLang: state.lang, + appVersion: "1.0.0", + buildVersion: "1", + appChannel: "Web", + reqImei: "H5-STATIC", + sysOrigin: "LIKEI", + sysOriginChild: "LIKEI" + }); + resolve({ success: true, environment: "browser" }); + return; + } + + let attempt = 0; + const poll = () => { + attempt += 1; + if (window.app && typeof window.app.getAccessOrigin === "function") { + try { + const raw = window.app.getAccessOrigin(); + if (raw) setHeadersFromApp(parseAccessOrigin(raw)); + } catch (error) { + console.error("Failed to parse access origin:", error); + } + resolve({ success: true, environment: "app" }); + return; + } + if (attempt < 50) { + window.setTimeout(poll, 100); + return; + } + if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") { + window.FlutterApp.postMessage("requestAccessOrigin"); + } + resolve({ success: true, environment: "app" }); + }; + poll(); + }).then((result) => { + if (typeof result === "string") { + setHeadersFromApp(parseAccessOrigin(result)); + return { success: true, environment: "app" }; + } + return result; + }); +} + +async function apiGet(path) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "GET", + headers: commonHeaders + }); + return parseApiResponse(response); +} + +async function apiPost(path, body) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method: "POST", + headers: { + ...commonHeaders, + "content-type": "application/json" + }, + body: JSON.stringify(body || {}) + }); + return parseApiResponse(response); +} + +async function parseApiResponse(response) { + const data = await response.json().catch(() => ({})); + if (!response.ok || data.status === false) { + const error = new Error(data.errorMsg || data.message || `Request failed: ${response.status}`); + error.response = data; + throw error; + } + return data; +} + +function formatMoney(value) { + if (value === null || value === undefined || value === "") return "0"; + const number = Number(value); + if (Number.isNaN(number)) return String(value); + return number.toFixed(2); +} + +function getMemberId() { + return state.profile.id || state.profile.userId || state.profile.account || null; +} + +function getTeamId() { + if (state.teamInfo && state.teamInfo.id) return state.teamInfo.id; + const cached = localStorage.getItem("teamInfo"); + if (cached) { + try { + const data = JSON.parse(cached); + if (data && data.id) return data.id; + } catch (error) { + console.error("Failed to parse teamInfo:", error); + } + } + return state.agency.teamId || state.agency.id || null; +} + +async function fetchUserProfile() { + const cached = localStorage.getItem("userProfile"); + if (cached) { + try { + state.profile = JSON.parse(cached) || {}; + } catch (error) { + console.error("Failed to parse userProfile:", error); + } + } + const result = await apiGet("/team/member/profile"); + if (result.status && result.body) { + state.profile = result.body; + localStorage.setItem("userProfile", JSON.stringify(result.body)); + } +} + +async function fetchAgencyProfile() { + const result = await apiGet("/team/team-own/profile"); + if (result.status && result.body) state.agency = result.body; +} + +async function fetchTeamEntry() { + const cached = localStorage.getItem("teamInfo"); + if (cached) { + try { + state.teamInfo = JSON.parse(cached); + } catch (error) { + console.error("Failed to parse teamInfo:", error); + } + } + const result = await apiGet("/team/entry"); + if (result.status && result.body) { + state.teamInfo = result.body.teamProfile || result.body; + localStorage.setItem("teamInfo", JSON.stringify(state.teamInfo)); + } +} + +async function fetchBankBalance() { + const result = await apiGet("/wallet/bank/balance"); + if (result.status && typeof result.body === "number") { + state.salaryInfo.currentSalary = result.body.toFixed(2); + } else if (result.status && result.body) { + state.salaryInfo.currentSalary = formatMoney(result.body.currentSalary ?? result.body.availableBalance ?? result.body.balance ?? 0); + } else { + state.salaryInfo.currentSalary = "0"; + } +} + +async function fetchWorkStatistics() { + const memberId = getMemberId(); + if (!memberId) { + console.warn("No user ID available"); + return; + } + const result = await apiGet(`/team/member/work/statistics-now?dataType=DAILY&memberId=${encodeURIComponent(memberId)}`); + if (result.status && result.body) { + const ownTime = Number(result.body.ownTime) || 0; + const otherTime = Number(result.body.otherTime) || 0; + const total = ownTime + otherTime; + state.taskInfo.anchorType = "Chat"; + state.taskInfo.minutesProgress = total >= state.taskInfo.minutesTotal ? state.taskInfo.minutesTotal : total; + state.taskInfo.giftTask = result.body.acceptGiftValue || 0; + } +} + +async function fetchMemberWork() { + const memberId = getMemberId(); + if (!memberId) return; + const result = await apiGet(`/team/member-work?userId=${encodeURIComponent(memberId)}`); + if (result.status && result.body) console.debug("member work data:", result.body); +} + +async function fetchBankCards() { + const result = await apiGet("/wallet/bank-card/list"); + if (result.status && result.body) { + state.bankCards = result.body; + state.activeBankCard = state.bankCards.find((item) => item.use) || null; + } +} + +async function fetchWithdrawInfo() { + const result = await apiGet("/wallet/withdraw-info/list"); + if (result.status && result.body && result.body.length > 0) { + const first = result.body[0]; + let previewUrls = []; + try { + previewUrls = JSON.parse(first.passportFrontUrl || "[]").map((item) => item); + } catch (error) { + console.error("Failed to parse passportFrontUrl:", error); + } + state.withdrawInfo = { previewUrls, ...first }; + } +} + +async function fetchWithdrawEnabled() { + const result = await apiGet("/wallet/bank/host-salary/withdraw/enabled"); + if (result.status) state.withdrawEnabled = Boolean(result.body); +} + +function calculateRoles(identity) { + if (!identity) return ["guest"]; + const roles = []; + if (identity.freightAgent) roles.push("freightAgent"); + if (identity.agent) roles.push("agent"); + if (identity.bdLeader) roles.push("bdLeader"); + if (identity.bd) roles.push("bd"); + if (identity.anchor) roles.push("anchor"); + if (identity.admin) roles.push("admin"); + return roles.length ? roles : ["guest"]; +} + +function getPrimaryRole(roles) { + const weight = { + guest: 0, + anchor: 1, + agent: 2, + bd: 3, + bdLeader: 4, + freightAgent: 5, + admin: 6 + }; + return roles.reduce((current, role) => (weight[role] > weight[current] ? role : current), "guest"); +} + +function getDefaultPage(role) { + return { + admin: "/admin-center", + freightAgent: "/coin-seller", + agent: "/agency-center", + bdLeader: "/bd-leader-center", + bd: "/bd-center", + anchor: "/host-center", + guest: "/apply" + }[role] || "/apply"; +} + +async function checkIdentityAndRedirect() { + const memberId = getMemberId(); + if (!memberId) { + navigateTo("/apply"); + return; + } + const result = await apiGet("/app/h5/identity"); + if (!result.status || !result.body) return; + state.identityInfo = result.body; + const roles = calculateRoles(result.body); + const primaryRole = getPrimaryRole(roles); + if (!roles.includes("anchor")) { + const defaultPage = getDefaultPage(primaryRole); + if (defaultPage !== "/host-center") navigateTo(defaultPage); + } +} + +async function leaveAgency() { + await apiPost("/team/user/apply", { + reason: "QUIT", + teamId: getTeamId() + }); +} + +async function runTask(task, label) { + try { + await task(); + } catch (error) { + console.error(`${label} failed:`, error); + if (label === "bank balance") showToast(t("failed_to_load_balance")); + if (label === "withdraw info" || label === "withdraw enabled") showToast(error.response?.errorMsg || error.message || t("something_went_wrong")); + } +} + +function normalizeRoute(target) { + const url = new URL(target, window.location.origin); + const currentLang = new URLSearchParams(window.location.search).get("lang"); + if (currentLang && !url.searchParams.has("lang")) url.searchParams.set("lang", currentLang); + return `${url.pathname}${url.search}${url.hash}`; +} + +function navigateTo(target) { + window.location.href = normalizeRoute(target); +} + +function closePage() { + if (window.app && typeof window.app.closePage === "function") { + window.app.closePage(); + return; + } + if (window.FlutterPageControl && typeof window.FlutterPageControl.postMessage === "function") { + window.FlutterPageControl.postMessage("close_page"); + return; + } + if (window.history.length > 1) { + window.history.back(); + } +} + +function showToast(message) { + const toast = $("#toast"); + toast.textContent = message; + toast.hidden = false; + window.clearTimeout(showToast.timer); + showToast.timer = window.setTimeout(() => { + toast.hidden = true; + }, 2500); +} + +function showModal(id) { + const modal = $(`#${id}`); + if (modal) modal.hidden = false; +} + +function hideModal(id) { + const modal = $(`#${id}`); + if (modal) modal.hidden = true; +} + +function renderI18n() { + document.documentElement.lang = state.lang; + document.documentElement.dir = state.lang === "ar" ? "rtl" : "ltr"; + $("[data-action='language']").textContent = state.lang.toUpperCase(); + $$("[data-i18n]").forEach((node) => { + node.textContent = t(node.dataset.i18n); + }); +} + +function renderIcons() { + $("#policyIcon").src = icons.policy; + $("#exchangeIcon").src = icons.exchange; + $("#transferIcon").src = icons.transfer; + $("#withdrawIcon").src = icons.withdraw; + $("#bankIcon").src = icons.bank; + $("#moneyIcon").src = icons.money; + $("#backIcon").src = icons.back; + ["#arrowIcon1", "#arrowIcon2", "#arrowIcon3", "#arrowIcon4", "#arrowIcon5"].forEach((selector) => { + $(selector).src = icons.arrow; + }); +} + +function renderAgency() { + const avatar = $("#agencyAvatar"); + const fallback = $("#avatarFallback"); + const displayName = state.agency.userNickname || state.agency.name || "-"; + const account = state.agency.ownSpecialId?.account || state.agency.account || "-"; + + $("#agencyName").textContent = displayName; + $("#agencyId").textContent = account; + fallback.textContent = (displayName || "U").slice(0, 1).toUpperCase(); + avatar.alt = displayName; + avatar.src = state.agency.userAvatar || ""; + avatar.hidden = !state.agency.userAvatar; +} + +function renderData() { + $("#currentSalary").textContent = state.salaryInfo.currentSalary; + $("#anchorType").textContent = state.taskInfo.anchorType; + $("#minutesProgress").textContent = state.taskInfo.minutesProgress; + $("#minutesTotal").textContent = state.taskInfo.minutesTotal; + $("#giftTask").textContent = state.taskInfo.giftTask; + $("#cashWithdrawRow").hidden = !state.withdrawEnabled; + $("#cashDivider").hidden = !state.withdrawEnabled; +} + +function render() { + renderI18n(); + renderIcons(); + renderAgency(); + renderData(); +} + +function bindEvents() { + $("[data-action='back']").addEventListener("click", closePage); + $("[data-action='language']").addEventListener("click", () => navigateTo("/language")); + $("[data-action='leave']").addEventListener("click", () => showModal("leaveModal")); + + $$("[data-route]").forEach((node) => { + node.addEventListener("click", () => navigateTo(node.dataset.route)); + }); + + $("[data-action='cash-withdraw']").addEventListener("click", () => { + if (!state.withdrawInfo || !state.activeBankCard) { + showModal("infoMissingModal"); + return; + } + navigateTo("/cash-withdraw"); + }); + + $("#agencyAvatar").addEventListener("error", (event) => { + event.target.onerror = null; + event.target.src = DEFAULT_AVATAR; + event.target.hidden = false; + }); + + $("#infoMissingModal").addEventListener("click", () => hideModal("infoMissingModal")); + $("#leaveModal").addEventListener("click", () => hideModal("leaveModal")); + $$(".modal-card").forEach((node) => node.addEventListener("click", (event) => event.stopPropagation())); + $("[data-action='improve']").addEventListener("click", () => navigateTo("/host-setting")); + $("[data-action='cancel-leave']").addEventListener("click", () => hideModal("leaveModal")); + $("[data-action='confirm-leave']").addEventListener("click", async () => { + try { + await leaveAgency(); + } catch (error) { + showToast(error.response?.errorMsg || error.errorMsg || t("something_went_wrong")); + } finally { + hideModal("leaveModal"); + } + }); +} + +async function init() { + localStorage.setItem("identity", JSON.stringify({ identity: "HOST" })); + localStorage.removeItem("payee"); + bindEvents(); + render(); + + try { + await connectToApp(); + await fetchUserProfile(); + await Promise.all([ + runTask(checkIdentityAndRedirect, "identity check"), + runTask(fetchTeamEntry, "team entry"), + runTask(fetchAgencyProfile, "agency profile"), + runTask(fetchBankBalance, "bank balance"), + runTask(fetchWorkStatistics, "work statistics"), + runTask(fetchBankCards, "bank cards"), + runTask(fetchWithdrawInfo, "withdraw info"), + runTask(fetchWithdrawEnabled, "withdraw enabled"), + runTask(fetchMemberWork, "member work") + ]); + } catch (error) { + console.error("Host center data request failed:", error); + showToast(error.response?.errorMsg || error.message || t("failed_to_load_balance")); + } finally { + render(); + } +} + +init(); diff --git a/h5/host-center/icons/arrow.svg b/h5/host-center/icons/arrow.svg new file mode 100644 index 0000000..7e4862b --- /dev/null +++ b/h5/host-center/icons/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/h5/host-center/icons/back.svg b/h5/host-center/icons/back.svg new file mode 100644 index 0000000..b74cc76 --- /dev/null +++ b/h5/host-center/icons/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/h5/host-center/icons/bank.svg b/h5/host-center/icons/bank.svg new file mode 100644 index 0000000..c334b2b --- /dev/null +++ b/h5/host-center/icons/bank.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/h5/host-center/icons/exchange.svg b/h5/host-center/icons/exchange.svg new file mode 100644 index 0000000..023017c --- /dev/null +++ b/h5/host-center/icons/exchange.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/h5/host-center/icons/money.svg b/h5/host-center/icons/money.svg new file mode 100644 index 0000000..29b9c80 --- /dev/null +++ b/h5/host-center/icons/money.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/h5/host-center/icons/policy.svg b/h5/host-center/icons/policy.svg new file mode 100644 index 0000000..91fb8fa --- /dev/null +++ b/h5/host-center/icons/policy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/h5/host-center/icons/transfer.svg b/h5/host-center/icons/transfer.svg new file mode 100644 index 0000000..b6b3815 --- /dev/null +++ b/h5/host-center/icons/transfer.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/h5/host-center/icons/withdraw.svg b/h5/host-center/icons/withdraw.svg new file mode 100644 index 0000000..c03c007 --- /dev/null +++ b/h5/host-center/icons/withdraw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/h5/host-center/index.html b/h5/host-center/index.html index 1123132..bc5a8ca 100644 --- a/h5/host-center/index.html +++ b/h5/host-center/index.html @@ -1,35 +1,111 @@ - + - - - - - - - - - - Yumi H5 - - - - - + + + Host Center + -
+
+ + +
+
My agency
+ +
+
+ + U +
+ + +
+ +
+
+
My available salary
+ +
+
0
+
+ +
+
Today's task
+
+
+
Anchor type
+
Chat
+
+
+
Minutes
+
0/120
+
+
+
Gift Task
+
0
+
+
+
+ + +
+ + + + + + +
+ + diff --git a/h5/host-setting/index.html b/h5/host-setting/index.html new file mode 100644 index 0000000..d1ec1ff --- /dev/null +++ b/h5/host-setting/index.html @@ -0,0 +1,13 @@ + + + + + + Host Setting + + + + + + + diff --git a/h5/income-details/index.html b/h5/income-details/index.html new file mode 100644 index 0000000..b889420 --- /dev/null +++ b/h5/income-details/index.html @@ -0,0 +1,13 @@ + + + + + + Income Details + + + + + + + diff --git a/h5/information-details/index.html b/h5/information-details/index.html new file mode 100644 index 0000000..3a1e745 --- /dev/null +++ b/h5/information-details/index.html @@ -0,0 +1,13 @@ + + + + + + Information Details + + + + + + + diff --git a/h5/invite-agency/index.html b/h5/invite-agency/index.html new file mode 100644 index 0000000..04b88bc --- /dev/null +++ b/h5/invite-agency/index.html @@ -0,0 +1,110 @@ + + + + + + Invite User To Become Agent + + + +
+
+
+
+ +
+

Invite User To Become Agent

+
+
+
English
+
+
+
+ +
+
+
+
+
+ + +
+
+
+ +
+ +
+
please input user id
+
+
+ + + + + + diff --git a/h5/invite-agency/yumi-invite-agency.css b/h5/invite-agency/yumi-invite-agency.css new file mode 100644 index 0000000..828a8df --- /dev/null +++ b/h5/invite-agency/yumi-invite-agency.css @@ -0,0 +1,177 @@ +html { + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; +} + +body { + margin: 0; + min-height: 100%; + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif; + background: #edf8f1; + color: #1f3528; +} + +* { box-sizing: border-box; } +button, input { font: inherit; } +[hidden] { display: none !important; } + +.fullPage { + width: 100vw; + min-height: 100vh; + background: #edf8f1; + position: relative; +} + +.fullPage input::placeholder { + font-weight: 700; + color: #7b8d81; +} + +.invite-btn, .result-action-btn { + padding: 7px 14px; + border-radius: 32px; + background: #dff5e7; + color: #1f6f46; + border: 1px solid #b7e0c6; + font-weight: 800; + cursor: pointer; + transition: transform 0.2s, background 0.2s; + white-space: nowrap; +} + +.invite-btn:disabled, .result-action-btn:disabled { + background: #e1e7e3; + border-color: #ccd6d0; + color: #7b8d81; + cursor: not-allowed; +} + +.no-data { + text-align: center; + padding: 40px 20px; + color: #6d7e72; + font-weight: 700; +} + +.user-card { cursor: default; } + +.status-bar-placeholder { display: none; height: 30px; } +.status-bar-placeholder.is-visible { display: block; } + +.header-container { + position: sticky; + top: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + height: 60px; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); + font-size: 16px; +} + +.side-area, .actions-area { + min-width: 1.5em; + display: flex; + align-items: center; +} + +.actions-area { + justify-content: flex-end; + gap: 8px; +} + +.header-title { + flex: 1; + margin: 0; + color: #153d28 !important; + font-size: 1.2em; + font-weight: 800; + text-align: center; + letter-spacing: 0; +} + +.back-btn, .help-btn { + width: 1.5em; + border: none; + background: transparent; + transition: transform 0.2s ease; + padding: 0; +} + +.back-btn:active, .help-btn:active { transform: scale(0.9); } + +.language-entry { + display: flex; + align-items: center; + border-radius: 999px; + background: #dff5e7; + padding: 5px 10px; + color: #24724a !important; + cursor: pointer; +} + +.language-name { font-weight: 800; } + +.surface-border-wrapper, .gradient-border-wrapper { + position: relative; + border: 1px solid #b7e0c6; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.surface-border-content, .gradient-border-content { + position: relative; + border-radius: inherit; + width: 100%; + height: 100%; + background: #fbfffc; +} + +.modal-overlay { + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.6); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + padding: 20px; +} + +.modal { + background: #fff; + border-radius: 16px; + box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04); + width: 100%; + max-width: 320px; + padding: 24px 20px 20px; + text-align: center; + position: relative; +} + +.modal-title { + font-size: 18px; + font-weight: 700; + color: #1f3528; + margin-bottom: 12px; +} + +.modal-message { + font-size: 14px; + color: #6b7280; + line-height: 1.5; + margin-bottom: 20px; +} + +.modal-button { + border: none; + border-radius: 12px; + background: #dff5e7; + color: #1f6f46; + padding: 10px 16px; + font-weight: 800; +} diff --git a/h5/invite-agency/yumi-invite-agency.js b/h5/invite-agency/yumi-invite-agency.js new file mode 100644 index 0000000..744df40 --- /dev/null +++ b/h5/invite-agency/yumi-invite-agency.js @@ -0,0 +1,694 @@ +(function () { + const API_BASE = "https://jvapi.haiyihy.com"; + const BACK_ICON = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGXSURBVHgB7dvBTcNAFIThB5xTQFwADVBBmqEnUgZQAAXAjRqgACgAj2wfECbJZXZnrPmkVRT5lF9ODn4vVRERERERETEaxnNb8cd+PA/jeZ3PY02xqG7KA+Ic6/eds5vfPxfRdelb4uxXrt0VmXqgU3Hgo8iUA52LA9SvF1yVpkviHOdDpRhIJg6oBZKKA0qB5OKASiDJOKAQSDYO9A4kHQd6BpKPA70CWcSBHoFs4kDrQFZxoGUguzjQKpBlHGgRyDYOsANZxwFmIPs4wAq0iTjACvRUG4gDjEeumDRsIg4wAn3VhjDmYt81jWOGf64vo5q3MsAaHOLDH2oa7q2xicQKhLvopTYQiTl63kQk9mzePlKL5QXrSK22O2wjtVx/sYzUej/ILlKPBSqrSL02zGwi9VzBs4jUe0dRPpLCEqd0JJUtV9lISmvAkpHU9qTlIikukktFUt20vzQSHu++F5HqGvDi3PgIgQ5FpL5p/zme+/l1za7IHP6rcSoSfdPeIRCsRcIPtM18rSUMJoeKiIiIiIjw9QNKh3OJhFQBoAAAAABJRU5ErkJggg=="; + const DEFAULT_AVATAR = "../assets/defaultAvatar-CdxWBK1k-1776148661448.png"; + + const TEXT = { + pageTitle: "Invite User To Become Agent", + language: "English", + placeholder: "Enter User ID", + search: "Search", + invite: "Invite", + idlePrompt: "please input user id", + noUsersFound: "No users found", + information: "Information:", + userIdPrefix: "User ID:", + pending: "Pending", + success: "Success", + cancel: "Cancel", + invitationSubmitted: "Invitation submitted", + applicationCancelled: "Application cancelled", + somethingWentWrong: "Something went wrong", + cancellationFailed: "Cancellation failed, try again", + informationTitle: "Information", + successTitle: "Success", + errorTitle: "Error", + ok: "OK", + }; + + const state = { + query: "", + invitedList: [], + searchResults: [], + showSearchResults: false, + searching: false, + hasSearched: false, + }; + + const dom = { + statusBarPlaceholder: document.getElementById("statusBarPlaceholder"), + backButton: document.getElementById("backButton"), + backButtonIcon: document.getElementById("backButtonIcon"), + pageTitle: document.getElementById("pageTitle"), + languageEntry: document.getElementById("languageEntry"), + languageName: document.getElementById("languageName"), + searchInput: document.getElementById("searchInput"), + clearButton: document.getElementById("clearButton"), + searchButton: document.getElementById("searchButton"), + resultList: document.getElementById("resultList"), + noData: document.getElementById("noData"), + userCardTemplate: document.getElementById("userCardTemplate"), + }; + + init(); + + function init() { + document.title = TEXT.pageTitle; + document.documentElement.lang = "en"; + document.documentElement.dir = resolveDocumentDirection(); + + dom.backButtonIcon.src = BACK_ICON; + dom.pageTitle.textContent = TEXT.pageTitle; + dom.languageName.textContent = TEXT.language; + dom.searchInput.placeholder = TEXT.placeholder; + dom.searchButton.textContent = TEXT.search; + dom.noData.textContent = TEXT.idlePrompt; + + syncStatusBarPlaceholder(); + bindEvents(); + render(); + loadInvitedList(); + } + + function bindEvents() { + dom.backButton.addEventListener("click", handleBack); + dom.languageEntry.addEventListener("click", handleLanguageClick); + dom.searchInput.addEventListener("input", handleSearchInput); + dom.clearButton.addEventListener("click", clearSearch); + dom.searchButton.addEventListener("click", triggerSearchNow); + } + + function resolveDocumentDirection() { + const lang = (new URLSearchParams(window.location.search).get("lang") || "").toLowerCase(); + return lang.startsWith("ar") ? "rtl" : "ltr"; + } + + function syncStatusBarPlaceholder() { + const hasAppBridge = + Boolean(window.app) || + Boolean(window.FlutterPageControl) || + Boolean(window.webkit && window.webkit.messageHandlers); + const isIOS = /iphone|ipad|ipod/i.test(window.navigator.userAgent || ""); + dom.statusBarPlaceholder.classList.toggle("is-visible", hasAppBridge && isIOS); + } + + function handleBack() { + if (window.history.length > 1) { + window.history.back(); + return; + } + + window.location.href = "/"; + } + + function handleLanguageClick() { + window.location.href = "/language"; + } + + function handleSearchInput(event) { + state.query = event.target.value; + dom.clearButton.hidden = !state.query; + state.showSearchResults = false; + state.hasSearched = false; + render(); + } + + function clearSearch() { + state.query = ""; + state.searchResults = []; + state.showSearchResults = false; + state.hasSearched = false; + dom.searchInput.value = ""; + dom.clearButton.hidden = true; + render(); + } + + async function triggerSearchNow() { + if (state.searching) { + return; + } + + const query = state.query.trim(); + + if (!query) { + state.showSearchResults = false; + state.hasSearched = false; + render(); + return; + } + + state.searching = true; + state.showSearchResults = true; + state.hasSearched = true; + state.searchResults = []; + render(); + + try { + const payload = await searchUser(query); + state.searchResults = payload ? [mergeWithInvitationStatus(payload.userProfile)] : []; + } catch (error) { + state.searchResults = []; + showToast(extractErrorMessage(error), { + title: TEXT.errorTitle, + type: "error", + }); + } finally { + state.searching = false; + render(); + } + } + + async function loadInvitedList() { + try { + const response = await request("GET", "/team/bd/invite-message-own"); + state.invitedList = response && response.status && Array.isArray(response.body) ? response.body : []; + state.searchResults = state.searchResults.map(function (item) { + return mergeWithInvitationStatus(item.userProfile || {}); + }); + render(); + } catch (error) { + state.invitedList = []; + render(); + } + } + + async function searchUser(query) { + try { + const response = await request( + "GET", + "/user/user-profile/open-search?account=" + encodeURIComponent(query) + ); + + if (response && response.status && response.body) { + return { userProfile: response.body }; + } + } catch (error) { + if (!/^\d+$/.test(query)) { + throw error; + } + } + + if (!/^\d+$/.test(query)) { + return null; + } + + const fallbackResponse = await request( + "GET", + "/user/user-profile?userId=" + encodeURIComponent(query) + ); + + if (fallbackResponse && fallbackResponse.status && fallbackResponse.body) { + return { userProfile: fallbackResponse.body }; + } + + return null; + } + + function mergeWithInvitationStatus(userProfile) { + const matchedInvitation = state.invitedList.find(function (item) { + return ( + item && + item.userProfile && + userProfile && + item.userProfile.id === userProfile.id + ); + }); + + return Object.assign({}, matchedInvitation || {}, { + userProfile: userProfile || {}, + }); + } + + async function inviteUser(item) { + if (!item || !item.userProfile || !item.userProfile.id) { + return; + } + + try { + const response = await request("POST", "/team/bd/invite-agent", { + body: { + inviteUserId: item.userProfile.id, + }, + }); + + if (response && response.status) { + showToast(TEXT.invitationSubmitted, { + title: TEXT.successTitle, + type: "success", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.somethingWentWrong), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + async function cancelInvitation(invitationId) { + try { + const response = await request("POST", "/team/bd/invite-agent-cancel/" + invitationId); + + if (response && response.status) { + showToast(TEXT.applicationCancelled, { + title: TEXT.informationTitle, + type: "info", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.cancellationFailed), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + function render() { + renderSearchButton(); + renderList(); + } + + function renderSearchButton() { + dom.searchButton.disabled = !state.query.trim() || state.searching; + } + + function renderList() { + const currentList = state.showSearchResults ? state.searchResults : state.invitedList; + dom.resultList.innerHTML = ""; + + currentList.forEach(function (item) { + dom.resultList.appendChild(createUserCard(item, state.showSearchResults ? "search" : "invited")); + }); + + if (currentList.length > 0 || (state.searching && state.showSearchResults)) { + dom.noData.hidden = true; + return; + } + + dom.noData.hidden = false; + dom.noData.textContent = + state.showSearchResults && state.hasSearched ? TEXT.noUsersFound : TEXT.idlePrompt; + } + + function createUserCard(item, mode) { + const fragment = dom.userCardTemplate.content.cloneNode(true); + const statusBadge = fragment.querySelector(".status-badge"); + const avatarImage = fragment.querySelector(".avatar-image"); + const nickname = fragment.querySelector(".nickname"); + const account = fragment.querySelector(".account"); + const pendingActions = fragment.querySelector(".pending-actions"); + const userProfile = item.userProfile || {}; + + avatarImage.src = userProfile.userAvatar || DEFAULT_AVATAR; + avatarImage.alt = userProfile.userNickname || ""; + avatarImage.onerror = handleAvatarError; + nickname.textContent = userProfile.userNickname || ""; + account.textContent = TEXT.userIdPrefix + " " + (userProfile.account || userProfile.id || ""); + + if (item.status === 0) { + statusBadge.innerHTML = + '
' + + TEXT.pending + + "
"; + } else if (item.status === 1) { + statusBadge.innerHTML = + '
' + + TEXT.success + + "
"; + } + + if (mode === "search") { + const inviteButton = document.createElement("button"); + inviteButton.type = "button"; + inviteButton.className = "result-action-btn"; + inviteButton.textContent = TEXT.invite; + inviteButton.disabled = item.status === 0 || item.status === 1; + inviteButton.addEventListener("click", function (event) { + event.stopPropagation(); + inviteUser(item); + }); + pendingActions.appendChild(inviteButton); + } else if (item.status === 0) { + const cancelButton = document.createElement("div"); + cancelButton.textContent = TEXT.cancel; + cancelButton.style.padding = "4px 8px"; + cancelButton.style.borderRadius = "32px"; + cancelButton.style.backgroundColor = "red"; + cancelButton.style.color = "white"; + cancelButton.style.fontWeight = "600"; + cancelButton.style.zIndex = "5"; + cancelButton.addEventListener("click", function (event) { + event.stopPropagation(); + cancelInvitation(item.id); + }); + pendingActions.appendChild(cancelButton); + } + + return fragment; + } + + function handleAvatarError(event) { + event.target.onerror = null; + event.target.src = DEFAULT_AVATAR; + } + + function extractErrorMessage(error, fallback) { + return ( + (error && + error.response && + (error.response.errorMsg || error.response.message || error.response.error)) || + (error && error.message) || + fallback || + TEXT.somethingWentWrong + ); + } + + function showToast(message, options) { + const config = Object.assign( + { + title: TEXT.informationTitle, + type: "info", + confirmText: TEXT.ok, + }, + options || {} + ); + + const iconMap = { + error: "✕", + warning: "⚠", + success: "✓", + info: "i", + simple: "", + }; + + const overlay = document.createElement("div"); + overlay.className = "modal-overlay"; + overlay.innerHTML = + '"; + + const modal = overlay.querySelector(".modal"); + const closeButton = overlay.querySelector(".modal-btn"); + const close = function () { + modal.classList.remove("modal-enter"); + modal.classList.add("modal-leave"); + window.setTimeout(function () { + overlay.remove(); + }, 200); + }; + + closeButton.addEventListener("click", close); + overlay.addEventListener("click", function (event) { + if (event.target === overlay) { + close(); + } + }); + + document.body.appendChild(overlay); + } + + function escapeHtml(value) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + async function request(method, path, options) { + const config = options || {}; + const headers = buildRequestHeaders(Boolean(config.body), config.headers || {}); + const response = await fetch(API_BASE + path, { + method: method, + credentials: "include", + headers: headers, + body: config.body ? JSON.stringify(config.body) : undefined, + }); + const text = await response.text(); + let payload = {}; + + if (text) { + try { + payload = JSON.parse(text); + } catch (error) { + payload = { + status: response.ok, + body: text, + }; + } + } + + if (!response.ok || payload.status === false) { + const requestError = new Error( + payload.errorMsg || payload.message || response.statusText || TEXT.somethingWentWrong + ); + requestError.response = payload; + throw requestError; + } + + return payload; + } + + function buildRequestHeaders(hasBody, overrideHeaders) { + const discovered = discoverAppHeaders(); + const headers = Object.assign({}, overrideHeaders || {}); + + if (hasBody) { + headers["Content-Type"] = headers["Content-Type"] || "application/json"; + } + + headers.Accept = headers.Accept || "application/json, text/plain, */*"; + + if (discovered.authorization) { + headers.Authorization = headers.Authorization || discovered.authorization; + } + + if (discovered.reqLang) { + headers["Req-Lang"] = headers["Req-Lang"] || discovered.reqLang; + } + + if (discovered.appVersion) { + headers["App-Version"] = headers["App-Version"] || discovered.appVersion; + } + + if (discovered.buildVersion) { + headers["Build-Version"] = headers["Build-Version"] || discovered.buildVersion; + } + + if (discovered.appChannel) { + headers["App-Channel"] = headers["App-Channel"] || discovered.appChannel; + } + + if (discovered.reqImei) { + headers["Req-Imei"] = headers["Req-Imei"] || discovered.reqImei; + } + + if (discovered.sysOrigin) { + headers["Sys-Origin"] = headers["Sys-Origin"] || discovered.sysOrigin; + } + + if (discovered.sysOriginChild) { + headers["Sys-Origin-Child"] = + headers["Sys-Origin-Child"] || discovered.sysOriginChild; + } + + return headers; + } + + function discoverAppHeaders() { + const query = new URLSearchParams(window.location.search); + const collected = []; + + collectCandidate(collected, window.__APP_HEADERS__); + collectCandidate(collected, window.__HEADER_INFO__); + collectCandidate(collected, window.headerInfo); + collectCandidate(collected, parseHeaderObjectFromQuery(query)); + + collectFromStorage(collected, window.localStorage); + collectFromStorage(collected, window.sessionStorage); + + return collected.reduce(function (result, candidate) { + return Object.assign(result, candidate); + }, { + reqLang: query.get("lang") || document.documentElement.lang || "en", + }); + } + + function parseHeaderObjectFromQuery(query) { + const candidate = {}; + mapHeaderValue(candidate, "authorization", query.get("authorization")); + mapHeaderValue(candidate, "authorization", query.get("token")); + mapHeaderValue(candidate, "reqLang", query.get("lang")); + mapHeaderValue(candidate, "appVersion", query.get("appVersion")); + mapHeaderValue(candidate, "buildVersion", query.get("buildVersion")); + mapHeaderValue(candidate, "appChannel", query.get("appChannel")); + mapHeaderValue(candidate, "reqImei", query.get("reqImei")); + mapHeaderValue(candidate, "sysOrigin", query.get("sysOrigin")); + mapHeaderValue(candidate, "sysOriginChild", query.get("sysOriginChild")); + return candidate; + } + + function collectFromStorage(collected, storage) { + if (!storage) { + return; + } + + const preferredKeys = [ + "authorization", + "Authorization", + "token", + "accessToken", + "headerInfo", + "headersFromApp", + "appHeaders", + "persist:root", + "user", + "userInfo", + ]; + + preferredKeys.forEach(function (key) { + try { + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + }); + + for (let index = 0; index < storage.length; index += 1) { + try { + const key = storage.key(index); + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + } + } + + function collectCandidate(collected, value) { + const normalized = normalizeHeaderCandidate(value, 0); + if (normalized && Object.keys(normalized).length > 0) { + collected.push(normalized); + } + } + + function normalizeHeaderCandidate(value, depth) { + if (depth > 4 || value == null) { + return null; + } + + if (typeof value === "string") { + const trimmed = value.trim(); + + if (!trimmed) { + return null; + } + + if (trimmed[0] === "{" || trimmed[0] === "[") { + try { + return normalizeHeaderCandidate(JSON.parse(trimmed), depth + 1); + } catch (error) { + return null; + } + } + + if (/bearer\s+/i.test(trimmed)) { + return { + authorization: trimmed, + }; + } + + return null; + } + + if (Array.isArray(value)) { + return value.reduce(function (result, entry) { + const normalized = normalizeHeaderCandidate(entry, depth + 1); + return normalized ? Object.assign(result, normalized) : result; + }, {}); + } + + if (typeof value !== "object") { + return null; + } + + const normalized = {}; + const aliasMap = { + authorization: ["authorization", "Authorization", "token", "accessToken"], + reqLang: ["reqLang", "Req-Lang", "lang", "language"], + appVersion: ["appVersion", "App-Version"], + buildVersion: ["buildVersion", "Build-Version"], + appChannel: ["appChannel", "App-Channel"], + reqImei: ["reqImei", "Req-Imei"], + sysOrigin: ["sysOrigin", "Sys-Origin"], + sysOriginChild: ["sysOriginChild", "Sys-Origin-Child"], + }; + + Object.keys(aliasMap).forEach(function (targetKey) { + aliasMap[targetKey].forEach(function (sourceKey) { + mapHeaderValue(normalized, targetKey, value[sourceKey]); + }); + }); + + ["headerInfo", "headers", "auth", "data", "state"].forEach(function (nestedKey) { + const nestedValue = normalizeHeaderCandidate(value[nestedKey], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + }); + + Object.keys(value).forEach(function (key) { + if ( + key === "headerInfo" || + key === "headers" || + key === "auth" || + key === "data" || + key === "state" + ) { + return; + } + + if (typeof value[key] === "object") { + const nestedValue = normalizeHeaderCandidate(value[key], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + } + }); + + return normalized; + } + + function mapHeaderValue(target, key, value) { + if (value == null || value === "" || target[key]) { + return; + } + + target[key] = String(value); + } +})(); diff --git a/h5/invite-bd-leader/index.html b/h5/invite-bd-leader/index.html new file mode 100644 index 0000000..28827b8 --- /dev/null +++ b/h5/invite-bd-leader/index.html @@ -0,0 +1,109 @@ + + + + + + Invite User To Become BD Leader + + + +
+
+
+
+ +
+

Invite User To Become BD Leader

+
+
+
English
+
+
+
+ +
+
+
+
+
+ + +
+
+
+ +
+ +
+
please input user id
+
+
+ + + + + + diff --git a/h5/invite-bd-leader/yumi-invite-bd-leader.css b/h5/invite-bd-leader/yumi-invite-bd-leader.css new file mode 100644 index 0000000..828a8df --- /dev/null +++ b/h5/invite-bd-leader/yumi-invite-bd-leader.css @@ -0,0 +1,177 @@ +html { + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; +} + +body { + margin: 0; + min-height: 100%; + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif; + background: #edf8f1; + color: #1f3528; +} + +* { box-sizing: border-box; } +button, input { font: inherit; } +[hidden] { display: none !important; } + +.fullPage { + width: 100vw; + min-height: 100vh; + background: #edf8f1; + position: relative; +} + +.fullPage input::placeholder { + font-weight: 700; + color: #7b8d81; +} + +.invite-btn, .result-action-btn { + padding: 7px 14px; + border-radius: 32px; + background: #dff5e7; + color: #1f6f46; + border: 1px solid #b7e0c6; + font-weight: 800; + cursor: pointer; + transition: transform 0.2s, background 0.2s; + white-space: nowrap; +} + +.invite-btn:disabled, .result-action-btn:disabled { + background: #e1e7e3; + border-color: #ccd6d0; + color: #7b8d81; + cursor: not-allowed; +} + +.no-data { + text-align: center; + padding: 40px 20px; + color: #6d7e72; + font-weight: 700; +} + +.user-card { cursor: default; } + +.status-bar-placeholder { display: none; height: 30px; } +.status-bar-placeholder.is-visible { display: block; } + +.header-container { + position: sticky; + top: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + height: 60px; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); + font-size: 16px; +} + +.side-area, .actions-area { + min-width: 1.5em; + display: flex; + align-items: center; +} + +.actions-area { + justify-content: flex-end; + gap: 8px; +} + +.header-title { + flex: 1; + margin: 0; + color: #153d28 !important; + font-size: 1.2em; + font-weight: 800; + text-align: center; + letter-spacing: 0; +} + +.back-btn, .help-btn { + width: 1.5em; + border: none; + background: transparent; + transition: transform 0.2s ease; + padding: 0; +} + +.back-btn:active, .help-btn:active { transform: scale(0.9); } + +.language-entry { + display: flex; + align-items: center; + border-radius: 999px; + background: #dff5e7; + padding: 5px 10px; + color: #24724a !important; + cursor: pointer; +} + +.language-name { font-weight: 800; } + +.surface-border-wrapper, .gradient-border-wrapper { + position: relative; + border: 1px solid #b7e0c6; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.surface-border-content, .gradient-border-content { + position: relative; + border-radius: inherit; + width: 100%; + height: 100%; + background: #fbfffc; +} + +.modal-overlay { + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.6); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + padding: 20px; +} + +.modal { + background: #fff; + border-radius: 16px; + box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04); + width: 100%; + max-width: 320px; + padding: 24px 20px 20px; + text-align: center; + position: relative; +} + +.modal-title { + font-size: 18px; + font-weight: 700; + color: #1f3528; + margin-bottom: 12px; +} + +.modal-message { + font-size: 14px; + color: #6b7280; + line-height: 1.5; + margin-bottom: 20px; +} + +.modal-button { + border: none; + border-radius: 12px; + background: #dff5e7; + color: #1f6f46; + padding: 10px 16px; + font-weight: 800; +} diff --git a/h5/invite-bd-leader/yumi-invite-bd-leader.js b/h5/invite-bd-leader/yumi-invite-bd-leader.js new file mode 100644 index 0000000..e889b1c --- /dev/null +++ b/h5/invite-bd-leader/yumi-invite-bd-leader.js @@ -0,0 +1,699 @@ +(function () { + const API_BASE = "https://jvapi.haiyihy.com"; + const BACK_ICON = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGXSURBVHgB7dvBTcNAFIThB5xTQFwADVBBmqEnUgZQAAXAjRqgACgAj2wfECbJZXZnrPmkVRT5lF9ODn4vVRERERERETEaxnNb8cd+PA/jeZ3PY02xqG7KA+Ic6/eds5vfPxfRdelb4uxXrt0VmXqgU3Hgo8iUA52LA9SvF1yVpkviHOdDpRhIJg6oBZKKA0qB5OKASiDJOKAQSDYO9A4kHQd6BpKPA70CWcSBHoFs4kDrQFZxoGUguzjQKpBlHGgRyDYOsANZxwFmIPs4wAq0iTjACvRUG4gDjEeumDRsIg4wAn3VhjDmYt81jWOGf64vo5q3MsAaHOLDH2oa7q2xicQKhLvopTYQiTl63kQk9mzePlKL5QXrSK22O2wjtVx/sYzUej/ILlKPBSqrSL02zGwi9VzBs4jUe0dRPpLCEqd0JJUtV9lISmvAkpHU9qTlIikukktFUt20vzQSHu++F5HqGvDi3PgIgQ5FpL5p/zme+/l1za7IHP6rcSoSfdPeIRCsRcIPtM18rSUMJoeKiIiIiIjw9QNKh3OJhFQBoAAAAABJRU5ErkJggg=="; + const DEFAULT_AVATAR = "../assets/defaultAvatar-CdxWBK1k-1776148661448.png"; + const ENDPOINTS = { + invitedList: "/team/bd/invite-bdleader-message-own", + invite: "/team/bd/invite-bdleader", + cancelPrefix: "/team/bd/invite-bdleader-cancel/", + }; + + const TEXT = { + pageTitle: "Invite User To Become BD Leader", + language: "English", + placeholder: "Enter User ID", + search: "Search", + invite: "Invite", + idlePrompt: "please input user id", + noUsersFound: "No users found", + information: "Information:", + userIdPrefix: "User ID:", + pending: "Pending", + success: "Success", + cancel: "Cancel", + invitationSubmitted: "Invitation submitted", + applicationCancelled: "Application cancelled", + somethingWentWrong: "Something went wrong", + cancellationFailed: "Cancellation failed, try again", + informationTitle: "Information", + successTitle: "Success", + errorTitle: "Error", + ok: "OK", + }; + + const state = { + query: "", + invitedList: [], + searchResults: [], + showSearchResults: false, + searching: false, + hasSearched: false, + }; + + const dom = { + statusBarPlaceholder: document.getElementById("statusBarPlaceholder"), + backButton: document.getElementById("backButton"), + backButtonIcon: document.getElementById("backButtonIcon"), + pageTitle: document.getElementById("pageTitle"), + languageEntry: document.getElementById("languageEntry"), + languageName: document.getElementById("languageName"), + searchInput: document.getElementById("searchInput"), + clearButton: document.getElementById("clearButton"), + searchButton: document.getElementById("searchButton"), + resultList: document.getElementById("resultList"), + noData: document.getElementById("noData"), + userCardTemplate: document.getElementById("userCardTemplate"), + }; + + init(); + + function init() { + document.title = TEXT.pageTitle; + document.documentElement.lang = "en"; + document.documentElement.dir = resolveDocumentDirection(); + + dom.backButtonIcon.src = BACK_ICON; + dom.pageTitle.textContent = TEXT.pageTitle; + dom.languageName.textContent = TEXT.language; + dom.searchInput.placeholder = TEXT.placeholder; + dom.searchButton.textContent = TEXT.search; + dom.noData.textContent = TEXT.idlePrompt; + + syncStatusBarPlaceholder(); + bindEvents(); + render(); + loadInvitedList(); + } + + function bindEvents() { + dom.backButton.addEventListener("click", handleBack); + dom.languageEntry.addEventListener("click", handleLanguageClick); + dom.searchInput.addEventListener("input", handleSearchInput); + dom.clearButton.addEventListener("click", clearSearch); + dom.searchButton.addEventListener("click", triggerSearchNow); + } + + function resolveDocumentDirection() { + const lang = (new URLSearchParams(window.location.search).get("lang") || "").toLowerCase(); + return lang.startsWith("ar") ? "rtl" : "ltr"; + } + + function syncStatusBarPlaceholder() { + const hasAppBridge = + Boolean(window.app) || + Boolean(window.FlutterPageControl) || + Boolean(window.webkit && window.webkit.messageHandlers); + const isIOS = /iphone|ipad|ipod/i.test(window.navigator.userAgent || ""); + dom.statusBarPlaceholder.classList.toggle("is-visible", hasAppBridge && isIOS); + } + + function handleBack() { + if (window.history.length > 1) { + window.history.back(); + return; + } + + window.location.href = "/"; + } + + function handleLanguageClick() { + window.location.href = "/language"; + } + + function handleSearchInput(event) { + state.query = event.target.value; + dom.clearButton.hidden = !state.query; + state.showSearchResults = false; + state.hasSearched = false; + render(); + } + + function clearSearch() { + state.query = ""; + state.searchResults = []; + state.showSearchResults = false; + state.hasSearched = false; + dom.searchInput.value = ""; + dom.clearButton.hidden = true; + render(); + } + + async function triggerSearchNow() { + if (state.searching) { + return; + } + + const query = state.query.trim(); + + if (!query) { + state.showSearchResults = false; + state.hasSearched = false; + render(); + return; + } + + state.searching = true; + state.showSearchResults = true; + state.hasSearched = true; + state.searchResults = []; + render(); + + try { + const payload = await searchUser(query); + state.searchResults = payload ? [mergeWithInvitationStatus(payload.userProfile)] : []; + } catch (error) { + state.searchResults = []; + showToast(extractErrorMessage(error), { + title: TEXT.errorTitle, + type: "error", + }); + } finally { + state.searching = false; + render(); + } + } + + async function loadInvitedList() { + try { + const response = await request("GET", ENDPOINTS.invitedList); + state.invitedList = response && response.status && Array.isArray(response.body) ? response.body : []; + state.searchResults = state.searchResults.map(function (item) { + return mergeWithInvitationStatus(item.userProfile || {}); + }); + render(); + } catch (error) { + state.invitedList = []; + render(); + } + } + + async function searchUser(query) { + try { + const response = await request( + "GET", + "/user/user-profile/open-search?account=" + encodeURIComponent(query) + ); + + if (response && response.status && response.body) { + return { userProfile: response.body }; + } + } catch (error) { + if (!/^\d+$/.test(query)) { + throw error; + } + } + + if (!/^\d+$/.test(query)) { + return null; + } + + const fallbackResponse = await request( + "GET", + "/user/user-profile?userId=" + encodeURIComponent(query) + ); + + if (fallbackResponse && fallbackResponse.status && fallbackResponse.body) { + return { userProfile: fallbackResponse.body }; + } + + return null; + } + + function mergeWithInvitationStatus(userProfile) { + const matchedInvitation = state.invitedList.find(function (item) { + return ( + item && + item.userProfile && + userProfile && + item.userProfile.id === userProfile.id + ); + }); + + return Object.assign({}, matchedInvitation || {}, { + userProfile: userProfile || {}, + }); + } + + async function inviteUser(item) { + if (!item || !item.userProfile || !item.userProfile.id) { + return; + } + + try { + const response = await request("POST", ENDPOINTS.invite, { + body: { + inviteUserId: item.userProfile.id, + }, + }); + + if (response && response.status) { + showToast(TEXT.invitationSubmitted, { + title: TEXT.successTitle, + type: "success", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.somethingWentWrong), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + async function cancelInvitation(invitationId) { + try { + const response = await request("POST", ENDPOINTS.cancelPrefix + invitationId); + + if (response && response.status) { + showToast(TEXT.applicationCancelled, { + title: TEXT.informationTitle, + type: "info", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.cancellationFailed), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + function render() { + renderSearchButton(); + renderList(); + } + + function renderSearchButton() { + dom.searchButton.disabled = !state.query.trim() || state.searching; + } + + function renderList() { + const currentList = state.showSearchResults ? state.searchResults : state.invitedList; + dom.resultList.innerHTML = ""; + + currentList.forEach(function (item) { + dom.resultList.appendChild(createUserCard(item, state.showSearchResults ? "search" : "invited")); + }); + + if (currentList.length > 0 || (state.searching && state.showSearchResults)) { + dom.noData.hidden = true; + return; + } + + dom.noData.hidden = false; + dom.noData.textContent = + state.showSearchResults && state.hasSearched ? TEXT.noUsersFound : TEXT.idlePrompt; + } + + function createUserCard(item, mode) { + const fragment = dom.userCardTemplate.content.cloneNode(true); + const statusBadge = fragment.querySelector(".status-badge"); + const avatarImage = fragment.querySelector(".avatar-image"); + const nickname = fragment.querySelector(".nickname"); + const account = fragment.querySelector(".account"); + const pendingActions = fragment.querySelector(".pending-actions"); + const userProfile = item.userProfile || {}; + + avatarImage.src = userProfile.userAvatar || DEFAULT_AVATAR; + avatarImage.alt = userProfile.userNickname || ""; + avatarImage.onerror = handleAvatarError; + nickname.textContent = userProfile.userNickname || ""; + account.textContent = TEXT.userIdPrefix + " " + (userProfile.account || userProfile.id || ""); + + if (item.status === 0) { + statusBadge.innerHTML = + '
' + + TEXT.pending + + "
"; + } else if (item.status === 1) { + statusBadge.innerHTML = + '
' + + TEXT.success + + "
"; + } + + if (mode === "search") { + const inviteButton = document.createElement("button"); + inviteButton.type = "button"; + inviteButton.className = "result-action-btn"; + inviteButton.textContent = TEXT.invite; + inviteButton.disabled = item.status === 0 || item.status === 1; + inviteButton.addEventListener("click", function (event) { + event.stopPropagation(); + inviteUser(item); + }); + pendingActions.appendChild(inviteButton); + } else if (item.status === 0) { + const cancelButton = document.createElement("div"); + cancelButton.textContent = TEXT.cancel; + cancelButton.style.padding = "4px 8px"; + cancelButton.style.borderRadius = "32px"; + cancelButton.style.backgroundColor = "red"; + cancelButton.style.color = "white"; + cancelButton.style.fontWeight = "600"; + cancelButton.style.zIndex = "5"; + cancelButton.addEventListener("click", function (event) { + event.stopPropagation(); + cancelInvitation(item.id); + }); + pendingActions.appendChild(cancelButton); + } + + return fragment; + } + + function handleAvatarError(event) { + event.target.onerror = null; + event.target.src = DEFAULT_AVATAR; + } + + function extractErrorMessage(error, fallback) { + return ( + (error && + error.response && + (error.response.errorMsg || error.response.message || error.response.error)) || + (error && error.message) || + fallback || + TEXT.somethingWentWrong + ); + } + + function showToast(message, options) { + const config = Object.assign( + { + title: TEXT.informationTitle, + type: "info", + confirmText: TEXT.ok, + }, + options || {} + ); + + const iconMap = { + error: "✕", + warning: "⚠", + success: "✓", + info: "i", + simple: "", + }; + + const overlay = document.createElement("div"); + overlay.className = "modal-overlay"; + overlay.innerHTML = + '"; + + const modal = overlay.querySelector(".modal"); + const closeButton = overlay.querySelector(".modal-btn"); + const close = function () { + modal.classList.remove("modal-enter"); + modal.classList.add("modal-leave"); + window.setTimeout(function () { + overlay.remove(); + }, 200); + }; + + closeButton.addEventListener("click", close); + overlay.addEventListener("click", function (event) { + if (event.target === overlay) { + close(); + } + }); + + document.body.appendChild(overlay); + } + + function escapeHtml(value) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + async function request(method, path, options) { + const config = options || {}; + const headers = buildRequestHeaders(Boolean(config.body), config.headers || {}); + const response = await fetch(API_BASE + path, { + method: method, + credentials: "include", + headers: headers, + body: config.body ? JSON.stringify(config.body) : undefined, + }); + const text = await response.text(); + let payload = {}; + + if (text) { + try { + payload = JSON.parse(text); + } catch (error) { + payload = { + status: response.ok, + body: text, + }; + } + } + + if (!response.ok || payload.status === false) { + const requestError = new Error( + payload.errorMsg || payload.message || response.statusText || TEXT.somethingWentWrong + ); + requestError.response = payload; + throw requestError; + } + + return payload; + } + + function buildRequestHeaders(hasBody, overrideHeaders) { + const discovered = discoverAppHeaders(); + const headers = Object.assign({}, overrideHeaders || {}); + + if (hasBody) { + headers["Content-Type"] = headers["Content-Type"] || "application/json"; + } + + headers.Accept = headers.Accept || "application/json, text/plain, */*"; + + if (discovered.authorization) { + headers.Authorization = headers.Authorization || discovered.authorization; + } + + if (discovered.reqLang) { + headers["Req-Lang"] = headers["Req-Lang"] || discovered.reqLang; + } + + if (discovered.appVersion) { + headers["App-Version"] = headers["App-Version"] || discovered.appVersion; + } + + if (discovered.buildVersion) { + headers["Build-Version"] = headers["Build-Version"] || discovered.buildVersion; + } + + if (discovered.appChannel) { + headers["App-Channel"] = headers["App-Channel"] || discovered.appChannel; + } + + if (discovered.reqImei) { + headers["Req-Imei"] = headers["Req-Imei"] || discovered.reqImei; + } + + if (discovered.sysOrigin) { + headers["Sys-Origin"] = headers["Sys-Origin"] || discovered.sysOrigin; + } + + if (discovered.sysOriginChild) { + headers["Sys-Origin-Child"] = + headers["Sys-Origin-Child"] || discovered.sysOriginChild; + } + + return headers; + } + + function discoverAppHeaders() { + const query = new URLSearchParams(window.location.search); + const collected = []; + + collectCandidate(collected, window.__APP_HEADERS__); + collectCandidate(collected, window.__HEADER_INFO__); + collectCandidate(collected, window.headerInfo); + collectCandidate(collected, parseHeaderObjectFromQuery(query)); + + collectFromStorage(collected, window.localStorage); + collectFromStorage(collected, window.sessionStorage); + + return collected.reduce(function (result, candidate) { + return Object.assign(result, candidate); + }, { + reqLang: query.get("lang") || document.documentElement.lang || "en", + }); + } + + function parseHeaderObjectFromQuery(query) { + const candidate = {}; + mapHeaderValue(candidate, "authorization", query.get("authorization")); + mapHeaderValue(candidate, "authorization", query.get("token")); + mapHeaderValue(candidate, "reqLang", query.get("lang")); + mapHeaderValue(candidate, "appVersion", query.get("appVersion")); + mapHeaderValue(candidate, "buildVersion", query.get("buildVersion")); + mapHeaderValue(candidate, "appChannel", query.get("appChannel")); + mapHeaderValue(candidate, "reqImei", query.get("reqImei")); + mapHeaderValue(candidate, "sysOrigin", query.get("sysOrigin")); + mapHeaderValue(candidate, "sysOriginChild", query.get("sysOriginChild")); + return candidate; + } + + function collectFromStorage(collected, storage) { + if (!storage) { + return; + } + + const preferredKeys = [ + "authorization", + "Authorization", + "token", + "accessToken", + "headerInfo", + "headersFromApp", + "appHeaders", + "persist:root", + "user", + "userInfo", + ]; + + preferredKeys.forEach(function (key) { + try { + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + }); + + for (let index = 0; index < storage.length; index += 1) { + try { + const key = storage.key(index); + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + } + } + + function collectCandidate(collected, value) { + const normalized = normalizeHeaderCandidate(value, 0); + if (normalized && Object.keys(normalized).length > 0) { + collected.push(normalized); + } + } + + function normalizeHeaderCandidate(value, depth) { + if (depth > 4 || value == null) { + return null; + } + + if (typeof value === "string") { + const trimmed = value.trim(); + + if (!trimmed) { + return null; + } + + if (trimmed[0] === "{" || trimmed[0] === "[") { + try { + return normalizeHeaderCandidate(JSON.parse(trimmed), depth + 1); + } catch (error) { + return null; + } + } + + if (/bearer\\s+/i.test(trimmed)) { + return { + authorization: trimmed, + }; + } + + return null; + } + + if (Array.isArray(value)) { + return value.reduce(function (result, entry) { + const normalized = normalizeHeaderCandidate(entry, depth + 1); + return normalized ? Object.assign(result, normalized) : result; + }, {}); + } + + if (typeof value !== "object") { + return null; + } + + const normalized = {}; + const aliasMap = { + authorization: ["authorization", "Authorization", "token", "accessToken"], + reqLang: ["reqLang", "Req-Lang", "lang", "language"], + appVersion: ["appVersion", "App-Version"], + buildVersion: ["buildVersion", "Build-Version"], + appChannel: ["appChannel", "App-Channel"], + reqImei: ["reqImei", "Req-Imei"], + sysOrigin: ["sysOrigin", "Sys-Origin"], + sysOriginChild: ["sysOriginChild", "Sys-Origin-Child"], + }; + + Object.keys(aliasMap).forEach(function (targetKey) { + aliasMap[targetKey].forEach(function (sourceKey) { + mapHeaderValue(normalized, targetKey, value[sourceKey]); + }); + }); + + ["headerInfo", "headers", "auth", "data", "state"].forEach(function (nestedKey) { + const nestedValue = normalizeHeaderCandidate(value[nestedKey], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + }); + + Object.keys(value).forEach(function (key) { + if ( + key === "headerInfo" || + key === "headers" || + key === "auth" || + key === "data" || + key === "state" + ) { + return; + } + + if (typeof value[key] === "object") { + const nestedValue = normalizeHeaderCandidate(value[key], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + } + }); + + return normalized; + } + + function mapHeaderValue(target, key, value) { + if (value == null || value === "" || target[key]) { + return; + } + + target[key] = String(value); + } +})(); diff --git a/h5/invite-bd/index.html b/h5/invite-bd/index.html new file mode 100644 index 0000000..4b32ca9 --- /dev/null +++ b/h5/invite-bd/index.html @@ -0,0 +1,109 @@ + + + + + + Invite User To Become BD + + + +
+
+
+
+ +
+

Invite User To Become BD

+
+
+
English
+
+
+
+ +
+
+
+
+
+ + +
+
+
+ +
+ +
+
please input user id
+
+
+ + + + + + diff --git a/h5/invite-bd/yumi-invite-bd.css b/h5/invite-bd/yumi-invite-bd.css new file mode 100644 index 0000000..828a8df --- /dev/null +++ b/h5/invite-bd/yumi-invite-bd.css @@ -0,0 +1,177 @@ +html { + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; +} + +body { + margin: 0; + min-height: 100%; + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif; + background: #edf8f1; + color: #1f3528; +} + +* { box-sizing: border-box; } +button, input { font: inherit; } +[hidden] { display: none !important; } + +.fullPage { + width: 100vw; + min-height: 100vh; + background: #edf8f1; + position: relative; +} + +.fullPage input::placeholder { + font-weight: 700; + color: #7b8d81; +} + +.invite-btn, .result-action-btn { + padding: 7px 14px; + border-radius: 32px; + background: #dff5e7; + color: #1f6f46; + border: 1px solid #b7e0c6; + font-weight: 800; + cursor: pointer; + transition: transform 0.2s, background 0.2s; + white-space: nowrap; +} + +.invite-btn:disabled, .result-action-btn:disabled { + background: #e1e7e3; + border-color: #ccd6d0; + color: #7b8d81; + cursor: not-allowed; +} + +.no-data { + text-align: center; + padding: 40px 20px; + color: #6d7e72; + font-weight: 700; +} + +.user-card { cursor: default; } + +.status-bar-placeholder { display: none; height: 30px; } +.status-bar-placeholder.is-visible { display: block; } + +.header-container { + position: sticky; + top: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + height: 60px; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); + font-size: 16px; +} + +.side-area, .actions-area { + min-width: 1.5em; + display: flex; + align-items: center; +} + +.actions-area { + justify-content: flex-end; + gap: 8px; +} + +.header-title { + flex: 1; + margin: 0; + color: #153d28 !important; + font-size: 1.2em; + font-weight: 800; + text-align: center; + letter-spacing: 0; +} + +.back-btn, .help-btn { + width: 1.5em; + border: none; + background: transparent; + transition: transform 0.2s ease; + padding: 0; +} + +.back-btn:active, .help-btn:active { transform: scale(0.9); } + +.language-entry { + display: flex; + align-items: center; + border-radius: 999px; + background: #dff5e7; + padding: 5px 10px; + color: #24724a !important; + cursor: pointer; +} + +.language-name { font-weight: 800; } + +.surface-border-wrapper, .gradient-border-wrapper { + position: relative; + border: 1px solid #b7e0c6; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.surface-border-content, .gradient-border-content { + position: relative; + border-radius: inherit; + width: 100%; + height: 100%; + background: #fbfffc; +} + +.modal-overlay { + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.6); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + padding: 20px; +} + +.modal { + background: #fff; + border-radius: 16px; + box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04); + width: 100%; + max-width: 320px; + padding: 24px 20px 20px; + text-align: center; + position: relative; +} + +.modal-title { + font-size: 18px; + font-weight: 700; + color: #1f3528; + margin-bottom: 12px; +} + +.modal-message { + font-size: 14px; + color: #6b7280; + line-height: 1.5; + margin-bottom: 20px; +} + +.modal-button { + border: none; + border-radius: 12px; + background: #dff5e7; + color: #1f6f46; + padding: 10px 16px; + font-weight: 800; +} diff --git a/h5/invite-bd/yumi-invite-bd.js b/h5/invite-bd/yumi-invite-bd.js new file mode 100644 index 0000000..bec1e7f --- /dev/null +++ b/h5/invite-bd/yumi-invite-bd.js @@ -0,0 +1,699 @@ +(function () { + const API_BASE = "https://jvapi.haiyihy.com"; + const BACK_ICON = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGXSURBVHgB7dvBTcNAFIThB5xTQFwADVBBmqEnUgZQAAXAjRqgACgAj2wfECbJZXZnrPmkVRT5lF9ODn4vVRERERERETEaxnNb8cd+PA/jeZ3PY02xqG7KA+Ic6/eds5vfPxfRdelb4uxXrt0VmXqgU3Hgo8iUA52LA9SvF1yVpkviHOdDpRhIJg6oBZKKA0qB5OKASiDJOKAQSDYO9A4kHQd6BpKPA70CWcSBHoFs4kDrQFZxoGUguzjQKpBlHGgRyDYOsANZxwFmIPs4wAq0iTjACvRUG4gDjEeumDRsIg4wAn3VhjDmYt81jWOGf64vo5q3MsAaHOLDH2oa7q2xicQKhLvopTYQiTl63kQk9mzePlKL5QXrSK22O2wjtVx/sYzUej/ILlKPBSqrSL02zGwi9VzBs4jUe0dRPpLCEqd0JJUtV9lISmvAkpHU9qTlIikukktFUt20vzQSHu++F5HqGvDi3PgIgQ5FpL5p/zme+/l1za7IHP6rcSoSfdPeIRCsRcIPtM18rSUMJoeKiIiIiIjw9QNKh3OJhFQBoAAAAABJRU5ErkJggg=="; + const DEFAULT_AVATAR = "../assets/defaultAvatar-CdxWBK1k-1776148661448.png"; + const ENDPOINTS = { + invitedList: "/team/bd/invite-bd-message-own", + invite: "/team/bd/invite-bd", + cancelPrefix: "/team/bd/invite-bd-cancel/", + }; + + const TEXT = { + pageTitle: "Invite User To Become BD", + language: "English", + placeholder: "Enter User ID", + search: "Search", + invite: "Invite", + idlePrompt: "please input user id", + noUsersFound: "No users found", + information: "Information:", + userIdPrefix: "User ID:", + pending: "Pending", + success: "Success", + cancel: "Cancel", + invitationSubmitted: "Invitation submitted", + applicationCancelled: "Application cancelled", + somethingWentWrong: "Something went wrong", + cancellationFailed: "Cancellation failed, try again", + informationTitle: "Information", + successTitle: "Success", + errorTitle: "Error", + ok: "OK", + }; + + const state = { + query: "", + invitedList: [], + searchResults: [], + showSearchResults: false, + searching: false, + hasSearched: false, + }; + + const dom = { + statusBarPlaceholder: document.getElementById("statusBarPlaceholder"), + backButton: document.getElementById("backButton"), + backButtonIcon: document.getElementById("backButtonIcon"), + pageTitle: document.getElementById("pageTitle"), + languageEntry: document.getElementById("languageEntry"), + languageName: document.getElementById("languageName"), + searchInput: document.getElementById("searchInput"), + clearButton: document.getElementById("clearButton"), + searchButton: document.getElementById("searchButton"), + resultList: document.getElementById("resultList"), + noData: document.getElementById("noData"), + userCardTemplate: document.getElementById("userCardTemplate"), + }; + + init(); + + function init() { + document.title = TEXT.pageTitle; + document.documentElement.lang = "en"; + document.documentElement.dir = resolveDocumentDirection(); + + dom.backButtonIcon.src = BACK_ICON; + dom.pageTitle.textContent = TEXT.pageTitle; + dom.languageName.textContent = TEXT.language; + dom.searchInput.placeholder = TEXT.placeholder; + dom.searchButton.textContent = TEXT.search; + dom.noData.textContent = TEXT.idlePrompt; + + syncStatusBarPlaceholder(); + bindEvents(); + render(); + loadInvitedList(); + } + + function bindEvents() { + dom.backButton.addEventListener("click", handleBack); + dom.languageEntry.addEventListener("click", handleLanguageClick); + dom.searchInput.addEventListener("input", handleSearchInput); + dom.clearButton.addEventListener("click", clearSearch); + dom.searchButton.addEventListener("click", triggerSearchNow); + } + + function resolveDocumentDirection() { + const lang = (new URLSearchParams(window.location.search).get("lang") || "").toLowerCase(); + return lang.startsWith("ar") ? "rtl" : "ltr"; + } + + function syncStatusBarPlaceholder() { + const hasAppBridge = + Boolean(window.app) || + Boolean(window.FlutterPageControl) || + Boolean(window.webkit && window.webkit.messageHandlers); + const isIOS = /iphone|ipad|ipod/i.test(window.navigator.userAgent || ""); + dom.statusBarPlaceholder.classList.toggle("is-visible", hasAppBridge && isIOS); + } + + function handleBack() { + if (window.history.length > 1) { + window.history.back(); + return; + } + + window.location.href = "/"; + } + + function handleLanguageClick() { + window.location.href = "/language"; + } + + function handleSearchInput(event) { + state.query = event.target.value; + dom.clearButton.hidden = !state.query; + state.showSearchResults = false; + state.hasSearched = false; + render(); + } + + function clearSearch() { + state.query = ""; + state.searchResults = []; + state.showSearchResults = false; + state.hasSearched = false; + dom.searchInput.value = ""; + dom.clearButton.hidden = true; + render(); + } + + async function triggerSearchNow() { + if (state.searching) { + return; + } + + const query = state.query.trim(); + + if (!query) { + state.showSearchResults = false; + state.hasSearched = false; + render(); + return; + } + + state.searching = true; + state.showSearchResults = true; + state.hasSearched = true; + state.searchResults = []; + render(); + + try { + const payload = await searchUser(query); + state.searchResults = payload ? [mergeWithInvitationStatus(payload.userProfile)] : []; + } catch (error) { + state.searchResults = []; + showToast(extractErrorMessage(error), { + title: TEXT.errorTitle, + type: "error", + }); + } finally { + state.searching = false; + render(); + } + } + + async function loadInvitedList() { + try { + const response = await request("GET", ENDPOINTS.invitedList); + state.invitedList = response && response.status && Array.isArray(response.body) ? response.body : []; + state.searchResults = state.searchResults.map(function (item) { + return mergeWithInvitationStatus(item.userProfile || {}); + }); + render(); + } catch (error) { + state.invitedList = []; + render(); + } + } + + async function searchUser(query) { + try { + const response = await request( + "GET", + "/user/user-profile/open-search?account=" + encodeURIComponent(query) + ); + + if (response && response.status && response.body) { + return { userProfile: response.body }; + } + } catch (error) { + if (!/^\d+$/.test(query)) { + throw error; + } + } + + if (!/^\d+$/.test(query)) { + return null; + } + + const fallbackResponse = await request( + "GET", + "/user/user-profile?userId=" + encodeURIComponent(query) + ); + + if (fallbackResponse && fallbackResponse.status && fallbackResponse.body) { + return { userProfile: fallbackResponse.body }; + } + + return null; + } + + function mergeWithInvitationStatus(userProfile) { + const matchedInvitation = state.invitedList.find(function (item) { + return ( + item && + item.userProfile && + userProfile && + item.userProfile.id === userProfile.id + ); + }); + + return Object.assign({}, matchedInvitation || {}, { + userProfile: userProfile || {}, + }); + } + + async function inviteUser(item) { + if (!item || !item.userProfile || !item.userProfile.id) { + return; + } + + try { + const response = await request("POST", ENDPOINTS.invite, { + body: { + inviteUserId: item.userProfile.id, + }, + }); + + if (response && response.status) { + showToast(TEXT.invitationSubmitted, { + title: TEXT.successTitle, + type: "success", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.somethingWentWrong), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + async function cancelInvitation(invitationId) { + try { + const response = await request("POST", ENDPOINTS.cancelPrefix + invitationId); + + if (response && response.status) { + showToast(TEXT.applicationCancelled, { + title: TEXT.informationTitle, + type: "info", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.cancellationFailed), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + function render() { + renderSearchButton(); + renderList(); + } + + function renderSearchButton() { + dom.searchButton.disabled = !state.query.trim() || state.searching; + } + + function renderList() { + const currentList = state.showSearchResults ? state.searchResults : state.invitedList; + dom.resultList.innerHTML = ""; + + currentList.forEach(function (item) { + dom.resultList.appendChild(createUserCard(item, state.showSearchResults ? "search" : "invited")); + }); + + if (currentList.length > 0 || (state.searching && state.showSearchResults)) { + dom.noData.hidden = true; + return; + } + + dom.noData.hidden = false; + dom.noData.textContent = + state.showSearchResults && state.hasSearched ? TEXT.noUsersFound : TEXT.idlePrompt; + } + + function createUserCard(item, mode) { + const fragment = dom.userCardTemplate.content.cloneNode(true); + const statusBadge = fragment.querySelector(".status-badge"); + const avatarImage = fragment.querySelector(".avatar-image"); + const nickname = fragment.querySelector(".nickname"); + const account = fragment.querySelector(".account"); + const pendingActions = fragment.querySelector(".pending-actions"); + const userProfile = item.userProfile || {}; + + avatarImage.src = userProfile.userAvatar || DEFAULT_AVATAR; + avatarImage.alt = userProfile.userNickname || ""; + avatarImage.onerror = handleAvatarError; + nickname.textContent = userProfile.userNickname || ""; + account.textContent = TEXT.userIdPrefix + " " + (userProfile.account || userProfile.id || ""); + + if (item.status === 0) { + statusBadge.innerHTML = + '
' + + TEXT.pending + + "
"; + } else if (item.status === 1) { + statusBadge.innerHTML = + '
' + + TEXT.success + + "
"; + } + + if (mode === "search") { + const inviteButton = document.createElement("button"); + inviteButton.type = "button"; + inviteButton.className = "result-action-btn"; + inviteButton.textContent = TEXT.invite; + inviteButton.disabled = item.status === 0 || item.status === 1; + inviteButton.addEventListener("click", function (event) { + event.stopPropagation(); + inviteUser(item); + }); + pendingActions.appendChild(inviteButton); + } else if (item.status === 0) { + const cancelButton = document.createElement("div"); + cancelButton.textContent = TEXT.cancel; + cancelButton.style.padding = "4px 8px"; + cancelButton.style.borderRadius = "32px"; + cancelButton.style.backgroundColor = "red"; + cancelButton.style.color = "white"; + cancelButton.style.fontWeight = "600"; + cancelButton.style.zIndex = "5"; + cancelButton.addEventListener("click", function (event) { + event.stopPropagation(); + cancelInvitation(item.id); + }); + pendingActions.appendChild(cancelButton); + } + + return fragment; + } + + function handleAvatarError(event) { + event.target.onerror = null; + event.target.src = DEFAULT_AVATAR; + } + + function extractErrorMessage(error, fallback) { + return ( + (error && + error.response && + (error.response.errorMsg || error.response.message || error.response.error)) || + (error && error.message) || + fallback || + TEXT.somethingWentWrong + ); + } + + function showToast(message, options) { + const config = Object.assign( + { + title: TEXT.informationTitle, + type: "info", + confirmText: TEXT.ok, + }, + options || {} + ); + + const iconMap = { + error: "✕", + warning: "⚠", + success: "✓", + info: "i", + simple: "", + }; + + const overlay = document.createElement("div"); + overlay.className = "modal-overlay"; + overlay.innerHTML = + '"; + + const modal = overlay.querySelector(".modal"); + const closeButton = overlay.querySelector(".modal-btn"); + const close = function () { + modal.classList.remove("modal-enter"); + modal.classList.add("modal-leave"); + window.setTimeout(function () { + overlay.remove(); + }, 200); + }; + + closeButton.addEventListener("click", close); + overlay.addEventListener("click", function (event) { + if (event.target === overlay) { + close(); + } + }); + + document.body.appendChild(overlay); + } + + function escapeHtml(value) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + async function request(method, path, options) { + const config = options || {}; + const headers = buildRequestHeaders(Boolean(config.body), config.headers || {}); + const response = await fetch(API_BASE + path, { + method: method, + credentials: "include", + headers: headers, + body: config.body ? JSON.stringify(config.body) : undefined, + }); + const text = await response.text(); + let payload = {}; + + if (text) { + try { + payload = JSON.parse(text); + } catch (error) { + payload = { + status: response.ok, + body: text, + }; + } + } + + if (!response.ok || payload.status === false) { + const requestError = new Error( + payload.errorMsg || payload.message || response.statusText || TEXT.somethingWentWrong + ); + requestError.response = payload; + throw requestError; + } + + return payload; + } + + function buildRequestHeaders(hasBody, overrideHeaders) { + const discovered = discoverAppHeaders(); + const headers = Object.assign({}, overrideHeaders || {}); + + if (hasBody) { + headers["Content-Type"] = headers["Content-Type"] || "application/json"; + } + + headers.Accept = headers.Accept || "application/json, text/plain, */*"; + + if (discovered.authorization) { + headers.Authorization = headers.Authorization || discovered.authorization; + } + + if (discovered.reqLang) { + headers["Req-Lang"] = headers["Req-Lang"] || discovered.reqLang; + } + + if (discovered.appVersion) { + headers["App-Version"] = headers["App-Version"] || discovered.appVersion; + } + + if (discovered.buildVersion) { + headers["Build-Version"] = headers["Build-Version"] || discovered.buildVersion; + } + + if (discovered.appChannel) { + headers["App-Channel"] = headers["App-Channel"] || discovered.appChannel; + } + + if (discovered.reqImei) { + headers["Req-Imei"] = headers["Req-Imei"] || discovered.reqImei; + } + + if (discovered.sysOrigin) { + headers["Sys-Origin"] = headers["Sys-Origin"] || discovered.sysOrigin; + } + + if (discovered.sysOriginChild) { + headers["Sys-Origin-Child"] = + headers["Sys-Origin-Child"] || discovered.sysOriginChild; + } + + return headers; + } + + function discoverAppHeaders() { + const query = new URLSearchParams(window.location.search); + const collected = []; + + collectCandidate(collected, window.__APP_HEADERS__); + collectCandidate(collected, window.__HEADER_INFO__); + collectCandidate(collected, window.headerInfo); + collectCandidate(collected, parseHeaderObjectFromQuery(query)); + + collectFromStorage(collected, window.localStorage); + collectFromStorage(collected, window.sessionStorage); + + return collected.reduce(function (result, candidate) { + return Object.assign(result, candidate); + }, { + reqLang: query.get("lang") || document.documentElement.lang || "en", + }); + } + + function parseHeaderObjectFromQuery(query) { + const candidate = {}; + mapHeaderValue(candidate, "authorization", query.get("authorization")); + mapHeaderValue(candidate, "authorization", query.get("token")); + mapHeaderValue(candidate, "reqLang", query.get("lang")); + mapHeaderValue(candidate, "appVersion", query.get("appVersion")); + mapHeaderValue(candidate, "buildVersion", query.get("buildVersion")); + mapHeaderValue(candidate, "appChannel", query.get("appChannel")); + mapHeaderValue(candidate, "reqImei", query.get("reqImei")); + mapHeaderValue(candidate, "sysOrigin", query.get("sysOrigin")); + mapHeaderValue(candidate, "sysOriginChild", query.get("sysOriginChild")); + return candidate; + } + + function collectFromStorage(collected, storage) { + if (!storage) { + return; + } + + const preferredKeys = [ + "authorization", + "Authorization", + "token", + "accessToken", + "headerInfo", + "headersFromApp", + "appHeaders", + "persist:root", + "user", + "userInfo", + ]; + + preferredKeys.forEach(function (key) { + try { + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + }); + + for (let index = 0; index < storage.length; index += 1) { + try { + const key = storage.key(index); + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + } + } + + function collectCandidate(collected, value) { + const normalized = normalizeHeaderCandidate(value, 0); + if (normalized && Object.keys(normalized).length > 0) { + collected.push(normalized); + } + } + + function normalizeHeaderCandidate(value, depth) { + if (depth > 4 || value == null) { + return null; + } + + if (typeof value === "string") { + const trimmed = value.trim(); + + if (!trimmed) { + return null; + } + + if (trimmed[0] === "{" || trimmed[0] === "[") { + try { + return normalizeHeaderCandidate(JSON.parse(trimmed), depth + 1); + } catch (error) { + return null; + } + } + + if (/bearer\\s+/i.test(trimmed)) { + return { + authorization: trimmed, + }; + } + + return null; + } + + if (Array.isArray(value)) { + return value.reduce(function (result, entry) { + const normalized = normalizeHeaderCandidate(entry, depth + 1); + return normalized ? Object.assign(result, normalized) : result; + }, {}); + } + + if (typeof value !== "object") { + return null; + } + + const normalized = {}; + const aliasMap = { + authorization: ["authorization", "Authorization", "token", "accessToken"], + reqLang: ["reqLang", "Req-Lang", "lang", "language"], + appVersion: ["appVersion", "App-Version"], + buildVersion: ["buildVersion", "Build-Version"], + appChannel: ["appChannel", "App-Channel"], + reqImei: ["reqImei", "Req-Imei"], + sysOrigin: ["sysOrigin", "Sys-Origin"], + sysOriginChild: ["sysOriginChild", "Sys-Origin-Child"], + }; + + Object.keys(aliasMap).forEach(function (targetKey) { + aliasMap[targetKey].forEach(function (sourceKey) { + mapHeaderValue(normalized, targetKey, value[sourceKey]); + }); + }); + + ["headerInfo", "headers", "auth", "data", "state"].forEach(function (nestedKey) { + const nestedValue = normalizeHeaderCandidate(value[nestedKey], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + }); + + Object.keys(value).forEach(function (key) { + if ( + key === "headerInfo" || + key === "headers" || + key === "auth" || + key === "data" || + key === "state" + ) { + return; + } + + if (typeof value[key] === "object") { + const nestedValue = normalizeHeaderCandidate(value[key], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + } + }); + + return normalized; + } + + function mapHeaderValue(target, key, value) { + if (value == null || value === "" || target[key]) { + return; + } + + target[key] = String(value); + } +})(); diff --git a/h5/invite-members/index.html b/h5/invite-members/index.html new file mode 100644 index 0000000..5f631a5 --- /dev/null +++ b/h5/invite-members/index.html @@ -0,0 +1,13 @@ + + + + + + Invite Members + + + + + + + diff --git a/h5/invite-recharge-agency/index.html b/h5/invite-recharge-agency/index.html new file mode 100644 index 0000000..4e0c87a --- /dev/null +++ b/h5/invite-recharge-agency/index.html @@ -0,0 +1,109 @@ + + + + + + Invite User To Become Recharge Agent + + + +
+
+
+
+ +
+

Invite User To Become Recharge Agent

+
+
+
English
+
+
+
+ +
+
+
+
+
+ + +
+
+
+ +
+ +
+
please input user id
+
+
+ + + + + + diff --git a/h5/invite-recharge-agency/yumi-invite-recharge-agency.css b/h5/invite-recharge-agency/yumi-invite-recharge-agency.css new file mode 100644 index 0000000..828a8df --- /dev/null +++ b/h5/invite-recharge-agency/yumi-invite-recharge-agency.css @@ -0,0 +1,177 @@ +html { + -webkit-text-size-adjust: 100%; + -webkit-overflow-scrolling: touch; +} + +body { + margin: 0; + min-height: 100%; + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif; + background: #edf8f1; + color: #1f3528; +} + +* { box-sizing: border-box; } +button, input { font: inherit; } +[hidden] { display: none !important; } + +.fullPage { + width: 100vw; + min-height: 100vh; + background: #edf8f1; + position: relative; +} + +.fullPage input::placeholder { + font-weight: 700; + color: #7b8d81; +} + +.invite-btn, .result-action-btn { + padding: 7px 14px; + border-radius: 32px; + background: #dff5e7; + color: #1f6f46; + border: 1px solid #b7e0c6; + font-weight: 800; + cursor: pointer; + transition: transform 0.2s, background 0.2s; + white-space: nowrap; +} + +.invite-btn:disabled, .result-action-btn:disabled { + background: #e1e7e3; + border-color: #ccd6d0; + color: #7b8d81; + cursor: not-allowed; +} + +.no-data { + text-align: center; + padding: 40px 20px; + color: #6d7e72; + font-weight: 700; +} + +.user-card { cursor: default; } + +.status-bar-placeholder { display: none; height: 30px; } +.status-bar-placeholder.is-visible { display: block; } + +.header-container { + position: sticky; + top: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + height: 60px; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); + font-size: 16px; +} + +.side-area, .actions-area { + min-width: 1.5em; + display: flex; + align-items: center; +} + +.actions-area { + justify-content: flex-end; + gap: 8px; +} + +.header-title { + flex: 1; + margin: 0; + color: #153d28 !important; + font-size: 1.2em; + font-weight: 800; + text-align: center; + letter-spacing: 0; +} + +.back-btn, .help-btn { + width: 1.5em; + border: none; + background: transparent; + transition: transform 0.2s ease; + padding: 0; +} + +.back-btn:active, .help-btn:active { transform: scale(0.9); } + +.language-entry { + display: flex; + align-items: center; + border-radius: 999px; + background: #dff5e7; + padding: 5px 10px; + color: #24724a !important; + cursor: pointer; +} + +.language-name { font-weight: 800; } + +.surface-border-wrapper, .gradient-border-wrapper { + position: relative; + border: 1px solid #b7e0c6; + background: #ffffff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); +} + +.surface-border-content, .gradient-border-content { + position: relative; + border-radius: inherit; + width: 100%; + height: 100%; + background: #fbfffc; +} + +.modal-overlay { + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.6); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + padding: 20px; +} + +.modal { + background: #fff; + border-radius: 16px; + box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04); + width: 100%; + max-width: 320px; + padding: 24px 20px 20px; + text-align: center; + position: relative; +} + +.modal-title { + font-size: 18px; + font-weight: 700; + color: #1f3528; + margin-bottom: 12px; +} + +.modal-message { + font-size: 14px; + color: #6b7280; + line-height: 1.5; + margin-bottom: 20px; +} + +.modal-button { + border: none; + border-radius: 12px; + background: #dff5e7; + color: #1f6f46; + padding: 10px 16px; + font-weight: 800; +} diff --git a/h5/invite-recharge-agency/yumi-invite-recharge-agency.js b/h5/invite-recharge-agency/yumi-invite-recharge-agency.js new file mode 100644 index 0000000..f0092c1 --- /dev/null +++ b/h5/invite-recharge-agency/yumi-invite-recharge-agency.js @@ -0,0 +1,699 @@ +(function () { + const API_BASE = "https://jvapi.haiyihy.com"; + const BACK_ICON = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGXSURBVHgB7dvBTcNAFIThB5xTQFwADVBBmqEnUgZQAAXAjRqgACgAj2wfECbJZXZnrPmkVRT5lF9ODn4vVRERERERETEaxnNb8cd+PA/jeZ3PY02xqG7KA+Ic6/eds5vfPxfRdelb4uxXrt0VmXqgU3Hgo8iUA52LA9SvF1yVpkviHOdDpRhIJg6oBZKKA0qB5OKASiDJOKAQSDYO9A4kHQd6BpKPA70CWcSBHoFs4kDrQFZxoGUguzjQKpBlHGgRyDYOsANZxwFmIPs4wAq0iTjACvRUG4gDjEeumDRsIg4wAn3VhjDmYt81jWOGf64vo5q3MsAaHOLDH2oa7q2xicQKhLvopTYQiTl63kQk9mzePlKL5QXrSK22O2wjtVx/sYzUej/ILlKPBSqrSL02zGwi9VzBs4jUe0dRPpLCEqd0JJUtV9lISmvAkpHU9qTlIikukktFUt20vzQSHu++F5HqGvDi3PgIgQ5FpL5p/zme+/l1za7IHP6rcSoSfdPeIRCsRcIPtM18rSUMJoeKiIiIiIjw9QNKh3OJhFQBoAAAAABJRU5ErkJggg=="; + const DEFAULT_AVATAR = "../assets/defaultAvatar-CdxWBK1k-1776148661448.png"; + const ENDPOINTS = { + invitedList: "/team/bd/invite-recharge-agent-message-own", + invite: "/team/bd/invite-recharge-agent", + cancelPrefix: "/team/bd/invite-recharge-agent-cancel/", + }; + + const TEXT = { + pageTitle: "Invite User To Become Recharge Agent", + language: "English", + placeholder: "Enter User ID", + search: "Search", + invite: "Invite", + idlePrompt: "please input user id", + noUsersFound: "No users found", + information: "Information:", + userIdPrefix: "User ID:", + pending: "Pending", + success: "Success", + cancel: "Cancel", + invitationSubmitted: "Invitation submitted", + applicationCancelled: "Application cancelled", + somethingWentWrong: "Something went wrong", + cancellationFailed: "Cancellation failed, try again", + informationTitle: "Information", + successTitle: "Success", + errorTitle: "Error", + ok: "OK", + }; + + const state = { + query: "", + invitedList: [], + searchResults: [], + showSearchResults: false, + searching: false, + hasSearched: false, + }; + + const dom = { + statusBarPlaceholder: document.getElementById("statusBarPlaceholder"), + backButton: document.getElementById("backButton"), + backButtonIcon: document.getElementById("backButtonIcon"), + pageTitle: document.getElementById("pageTitle"), + languageEntry: document.getElementById("languageEntry"), + languageName: document.getElementById("languageName"), + searchInput: document.getElementById("searchInput"), + clearButton: document.getElementById("clearButton"), + searchButton: document.getElementById("searchButton"), + resultList: document.getElementById("resultList"), + noData: document.getElementById("noData"), + userCardTemplate: document.getElementById("userCardTemplate"), + }; + + init(); + + function init() { + document.title = TEXT.pageTitle; + document.documentElement.lang = "en"; + document.documentElement.dir = resolveDocumentDirection(); + + dom.backButtonIcon.src = BACK_ICON; + dom.pageTitle.textContent = TEXT.pageTitle; + dom.languageName.textContent = TEXT.language; + dom.searchInput.placeholder = TEXT.placeholder; + dom.searchButton.textContent = TEXT.search; + dom.noData.textContent = TEXT.idlePrompt; + + syncStatusBarPlaceholder(); + bindEvents(); + render(); + loadInvitedList(); + } + + function bindEvents() { + dom.backButton.addEventListener("click", handleBack); + dom.languageEntry.addEventListener("click", handleLanguageClick); + dom.searchInput.addEventListener("input", handleSearchInput); + dom.clearButton.addEventListener("click", clearSearch); + dom.searchButton.addEventListener("click", triggerSearchNow); + } + + function resolveDocumentDirection() { + const lang = (new URLSearchParams(window.location.search).get("lang") || "").toLowerCase(); + return lang.startsWith("ar") ? "rtl" : "ltr"; + } + + function syncStatusBarPlaceholder() { + const hasAppBridge = + Boolean(window.app) || + Boolean(window.FlutterPageControl) || + Boolean(window.webkit && window.webkit.messageHandlers); + const isIOS = /iphone|ipad|ipod/i.test(window.navigator.userAgent || ""); + dom.statusBarPlaceholder.classList.toggle("is-visible", hasAppBridge && isIOS); + } + + function handleBack() { + if (window.history.length > 1) { + window.history.back(); + return; + } + + window.location.href = "/"; + } + + function handleLanguageClick() { + window.location.href = "/language"; + } + + function handleSearchInput(event) { + state.query = event.target.value; + dom.clearButton.hidden = !state.query; + state.showSearchResults = false; + state.hasSearched = false; + render(); + } + + function clearSearch() { + state.query = ""; + state.searchResults = []; + state.showSearchResults = false; + state.hasSearched = false; + dom.searchInput.value = ""; + dom.clearButton.hidden = true; + render(); + } + + async function triggerSearchNow() { + if (state.searching) { + return; + } + + const query = state.query.trim(); + + if (!query) { + state.showSearchResults = false; + state.hasSearched = false; + render(); + return; + } + + state.searching = true; + state.showSearchResults = true; + state.hasSearched = true; + state.searchResults = []; + render(); + + try { + const payload = await searchUser(query); + state.searchResults = payload ? [mergeWithInvitationStatus(payload.userProfile)] : []; + } catch (error) { + state.searchResults = []; + showToast(extractErrorMessage(error), { + title: TEXT.errorTitle, + type: "error", + }); + } finally { + state.searching = false; + render(); + } + } + + async function loadInvitedList() { + try { + const response = await request("GET", ENDPOINTS.invitedList); + state.invitedList = response && response.status && Array.isArray(response.body) ? response.body : []; + state.searchResults = state.searchResults.map(function (item) { + return mergeWithInvitationStatus(item.userProfile || {}); + }); + render(); + } catch (error) { + state.invitedList = []; + render(); + } + } + + async function searchUser(query) { + try { + const response = await request( + "GET", + "/user/user-profile/open-search?account=" + encodeURIComponent(query) + ); + + if (response && response.status && response.body) { + return { userProfile: response.body }; + } + } catch (error) { + if (!/^\d+$/.test(query)) { + throw error; + } + } + + if (!/^\d+$/.test(query)) { + return null; + } + + const fallbackResponse = await request( + "GET", + "/user/user-profile?userId=" + encodeURIComponent(query) + ); + + if (fallbackResponse && fallbackResponse.status && fallbackResponse.body) { + return { userProfile: fallbackResponse.body }; + } + + return null; + } + + function mergeWithInvitationStatus(userProfile) { + const matchedInvitation = state.invitedList.find(function (item) { + return ( + item && + item.userProfile && + userProfile && + item.userProfile.id === userProfile.id + ); + }); + + return Object.assign({}, matchedInvitation || {}, { + userProfile: userProfile || {}, + }); + } + + async function inviteUser(item) { + if (!item || !item.userProfile || !item.userProfile.id) { + return; + } + + try { + const response = await request("POST", ENDPOINTS.invite, { + body: { + inviteUserId: item.userProfile.id, + }, + }); + + if (response && response.status) { + showToast(TEXT.invitationSubmitted, { + title: TEXT.successTitle, + type: "success", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.somethingWentWrong), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + async function cancelInvitation(invitationId) { + try { + const response = await request("POST", ENDPOINTS.cancelPrefix + invitationId); + + if (response && response.status) { + showToast(TEXT.applicationCancelled, { + title: TEXT.informationTitle, + type: "info", + }); + await loadInvitedList(); + } + } catch (error) { + showToast(extractErrorMessage(error, TEXT.cancellationFailed), { + title: TEXT.errorTitle, + type: "error", + }); + } + } + + function render() { + renderSearchButton(); + renderList(); + } + + function renderSearchButton() { + dom.searchButton.disabled = !state.query.trim() || state.searching; + } + + function renderList() { + const currentList = state.showSearchResults ? state.searchResults : state.invitedList; + dom.resultList.innerHTML = ""; + + currentList.forEach(function (item) { + dom.resultList.appendChild(createUserCard(item, state.showSearchResults ? "search" : "invited")); + }); + + if (currentList.length > 0 || (state.searching && state.showSearchResults)) { + dom.noData.hidden = true; + return; + } + + dom.noData.hidden = false; + dom.noData.textContent = + state.showSearchResults && state.hasSearched ? TEXT.noUsersFound : TEXT.idlePrompt; + } + + function createUserCard(item, mode) { + const fragment = dom.userCardTemplate.content.cloneNode(true); + const statusBadge = fragment.querySelector(".status-badge"); + const avatarImage = fragment.querySelector(".avatar-image"); + const nickname = fragment.querySelector(".nickname"); + const account = fragment.querySelector(".account"); + const pendingActions = fragment.querySelector(".pending-actions"); + const userProfile = item.userProfile || {}; + + avatarImage.src = userProfile.userAvatar || DEFAULT_AVATAR; + avatarImage.alt = userProfile.userNickname || ""; + avatarImage.onerror = handleAvatarError; + nickname.textContent = userProfile.userNickname || ""; + account.textContent = TEXT.userIdPrefix + " " + (userProfile.account || userProfile.id || ""); + + if (item.status === 0) { + statusBadge.innerHTML = + '
' + + TEXT.pending + + "
"; + } else if (item.status === 1) { + statusBadge.innerHTML = + '
' + + TEXT.success + + "
"; + } + + if (mode === "search") { + const inviteButton = document.createElement("button"); + inviteButton.type = "button"; + inviteButton.className = "result-action-btn"; + inviteButton.textContent = TEXT.invite; + inviteButton.disabled = item.status === 0 || item.status === 1; + inviteButton.addEventListener("click", function (event) { + event.stopPropagation(); + inviteUser(item); + }); + pendingActions.appendChild(inviteButton); + } else if (item.status === 0) { + const cancelButton = document.createElement("div"); + cancelButton.textContent = TEXT.cancel; + cancelButton.style.padding = "4px 8px"; + cancelButton.style.borderRadius = "32px"; + cancelButton.style.backgroundColor = "red"; + cancelButton.style.color = "white"; + cancelButton.style.fontWeight = "600"; + cancelButton.style.zIndex = "5"; + cancelButton.addEventListener("click", function (event) { + event.stopPropagation(); + cancelInvitation(item.id); + }); + pendingActions.appendChild(cancelButton); + } + + return fragment; + } + + function handleAvatarError(event) { + event.target.onerror = null; + event.target.src = DEFAULT_AVATAR; + } + + function extractErrorMessage(error, fallback) { + return ( + (error && + error.response && + (error.response.errorMsg || error.response.message || error.response.error)) || + (error && error.message) || + fallback || + TEXT.somethingWentWrong + ); + } + + function showToast(message, options) { + const config = Object.assign( + { + title: TEXT.informationTitle, + type: "info", + confirmText: TEXT.ok, + }, + options || {} + ); + + const iconMap = { + error: "✕", + warning: "⚠", + success: "✓", + info: "i", + simple: "", + }; + + const overlay = document.createElement("div"); + overlay.className = "modal-overlay"; + overlay.innerHTML = + '"; + + const modal = overlay.querySelector(".modal"); + const closeButton = overlay.querySelector(".modal-btn"); + const close = function () { + modal.classList.remove("modal-enter"); + modal.classList.add("modal-leave"); + window.setTimeout(function () { + overlay.remove(); + }, 200); + }; + + closeButton.addEventListener("click", close); + overlay.addEventListener("click", function (event) { + if (event.target === overlay) { + close(); + } + }); + + document.body.appendChild(overlay); + } + + function escapeHtml(value) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + async function request(method, path, options) { + const config = options || {}; + const headers = buildRequestHeaders(Boolean(config.body), config.headers || {}); + const response = await fetch(API_BASE + path, { + method: method, + credentials: "include", + headers: headers, + body: config.body ? JSON.stringify(config.body) : undefined, + }); + const text = await response.text(); + let payload = {}; + + if (text) { + try { + payload = JSON.parse(text); + } catch (error) { + payload = { + status: response.ok, + body: text, + }; + } + } + + if (!response.ok || payload.status === false) { + const requestError = new Error( + payload.errorMsg || payload.message || response.statusText || TEXT.somethingWentWrong + ); + requestError.response = payload; + throw requestError; + } + + return payload; + } + + function buildRequestHeaders(hasBody, overrideHeaders) { + const discovered = discoverAppHeaders(); + const headers = Object.assign({}, overrideHeaders || {}); + + if (hasBody) { + headers["Content-Type"] = headers["Content-Type"] || "application/json"; + } + + headers.Accept = headers.Accept || "application/json, text/plain, */*"; + + if (discovered.authorization) { + headers.Authorization = headers.Authorization || discovered.authorization; + } + + if (discovered.reqLang) { + headers["Req-Lang"] = headers["Req-Lang"] || discovered.reqLang; + } + + if (discovered.appVersion) { + headers["App-Version"] = headers["App-Version"] || discovered.appVersion; + } + + if (discovered.buildVersion) { + headers["Build-Version"] = headers["Build-Version"] || discovered.buildVersion; + } + + if (discovered.appChannel) { + headers["App-Channel"] = headers["App-Channel"] || discovered.appChannel; + } + + if (discovered.reqImei) { + headers["Req-Imei"] = headers["Req-Imei"] || discovered.reqImei; + } + + if (discovered.sysOrigin) { + headers["Sys-Origin"] = headers["Sys-Origin"] || discovered.sysOrigin; + } + + if (discovered.sysOriginChild) { + headers["Sys-Origin-Child"] = + headers["Sys-Origin-Child"] || discovered.sysOriginChild; + } + + return headers; + } + + function discoverAppHeaders() { + const query = new URLSearchParams(window.location.search); + const collected = []; + + collectCandidate(collected, window.__APP_HEADERS__); + collectCandidate(collected, window.__HEADER_INFO__); + collectCandidate(collected, window.headerInfo); + collectCandidate(collected, parseHeaderObjectFromQuery(query)); + + collectFromStorage(collected, window.localStorage); + collectFromStorage(collected, window.sessionStorage); + + return collected.reduce(function (result, candidate) { + return Object.assign(result, candidate); + }, { + reqLang: query.get("lang") || document.documentElement.lang || "en", + }); + } + + function parseHeaderObjectFromQuery(query) { + const candidate = {}; + mapHeaderValue(candidate, "authorization", query.get("authorization")); + mapHeaderValue(candidate, "authorization", query.get("token")); + mapHeaderValue(candidate, "reqLang", query.get("lang")); + mapHeaderValue(candidate, "appVersion", query.get("appVersion")); + mapHeaderValue(candidate, "buildVersion", query.get("buildVersion")); + mapHeaderValue(candidate, "appChannel", query.get("appChannel")); + mapHeaderValue(candidate, "reqImei", query.get("reqImei")); + mapHeaderValue(candidate, "sysOrigin", query.get("sysOrigin")); + mapHeaderValue(candidate, "sysOriginChild", query.get("sysOriginChild")); + return candidate; + } + + function collectFromStorage(collected, storage) { + if (!storage) { + return; + } + + const preferredKeys = [ + "authorization", + "Authorization", + "token", + "accessToken", + "headerInfo", + "headersFromApp", + "appHeaders", + "persist:root", + "user", + "userInfo", + ]; + + preferredKeys.forEach(function (key) { + try { + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + }); + + for (let index = 0; index < storage.length; index += 1) { + try { + const key = storage.key(index); + collectCandidate(collected, storage.getItem(key)); + } catch (error) { + return; + } + } + } + + function collectCandidate(collected, value) { + const normalized = normalizeHeaderCandidate(value, 0); + if (normalized && Object.keys(normalized).length > 0) { + collected.push(normalized); + } + } + + function normalizeHeaderCandidate(value, depth) { + if (depth > 4 || value == null) { + return null; + } + + if (typeof value === "string") { + const trimmed = value.trim(); + + if (!trimmed) { + return null; + } + + if (trimmed[0] === "{" || trimmed[0] === "[") { + try { + return normalizeHeaderCandidate(JSON.parse(trimmed), depth + 1); + } catch (error) { + return null; + } + } + + if (/bearer\\s+/i.test(trimmed)) { + return { + authorization: trimmed, + }; + } + + return null; + } + + if (Array.isArray(value)) { + return value.reduce(function (result, entry) { + const normalized = normalizeHeaderCandidate(entry, depth + 1); + return normalized ? Object.assign(result, normalized) : result; + }, {}); + } + + if (typeof value !== "object") { + return null; + } + + const normalized = {}; + const aliasMap = { + authorization: ["authorization", "Authorization", "token", "accessToken"], + reqLang: ["reqLang", "Req-Lang", "lang", "language"], + appVersion: ["appVersion", "App-Version"], + buildVersion: ["buildVersion", "Build-Version"], + appChannel: ["appChannel", "App-Channel"], + reqImei: ["reqImei", "Req-Imei"], + sysOrigin: ["sysOrigin", "Sys-Origin"], + sysOriginChild: ["sysOriginChild", "Sys-Origin-Child"], + }; + + Object.keys(aliasMap).forEach(function (targetKey) { + aliasMap[targetKey].forEach(function (sourceKey) { + mapHeaderValue(normalized, targetKey, value[sourceKey]); + }); + }); + + ["headerInfo", "headers", "auth", "data", "state"].forEach(function (nestedKey) { + const nestedValue = normalizeHeaderCandidate(value[nestedKey], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + }); + + Object.keys(value).forEach(function (key) { + if ( + key === "headerInfo" || + key === "headers" || + key === "auth" || + key === "data" || + key === "state" + ) { + return; + } + + if (typeof value[key] === "object") { + const nestedValue = normalizeHeaderCandidate(value[key], depth + 1); + if (nestedValue) { + Object.assign(normalized, nestedValue); + } + } + }); + + return normalized; + } + + function mapHeaderValue(target, key, value) { + if (value == null || value === "" || target[key]) { + return; + } + + target[key] = String(value); + } +})(); diff --git a/h5/item-distribution/index.html b/h5/item-distribution/index.html new file mode 100644 index 0000000..911650a --- /dev/null +++ b/h5/item-distribution/index.html @@ -0,0 +1,13 @@ + + + + + + Item Distribution + + + + + + + diff --git a/h5/language/index.html b/h5/language/index.html new file mode 100644 index 0000000..9bced21 --- /dev/null +++ b/h5/language/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + Yumi H5 + + + + + + + +
+ + diff --git a/h5/logic-pages/app.css b/h5/logic-pages/app.css new file mode 100644 index 0000000..fcb8a52 --- /dev/null +++ b/h5/logic-pages/app.css @@ -0,0 +1,355 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: "Baloo 2", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; +} + +html, +body { + width: 100%; + min-height: 100%; + background: #edf8f1; + color: #1f3528; + -webkit-text-size-adjust: 100%; +} + +button, +input { + font: inherit; +} + +button { + border: 0; + background: transparent; + color: inherit; +} + +.page { + min-height: 100vh; + background: #edf8f1; +} + +.header { + position: sticky; + top: 0; + z-index: 20; + display: grid; + grid-template-columns: 44px 1fr 58px; + align-items: center; + min-height: calc(48px + env(safe-area-inset-top)); + padding: env(safe-area-inset-top) 10px 0; + background: #f8fff9; + border-bottom: 1px solid #cce9d7; + box-shadow: 0 4px 14px rgba(75, 137, 95, 0.14); +} + +.header h1 { + min-width: 0; + color: #153d28; + font-size: 1.28em; + font-weight: 800; + text-align: center; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.back, +.lang { + min-width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + font-weight: 800; + color: #1f6f46; +} + +.back span { + font-size: 2em; + line-height: 1; +} + +.lang { + justify-self: end; + padding: 0 10px; + border-radius: 999px; + background: #dff5e7; + font-size: 0.86em; +} + +.content { + display: flex; + flex-direction: column; + gap: 14px; + padding: 16px; +} + +.card { + border: 1px solid #b7e0c6; + border-radius: 18px; + background: #fff; + box-shadow: 0 8px 20px rgba(69, 129, 89, 0.12); + overflow: hidden; +} + +.card-pad { + padding: 14px; +} + +.metric-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; +} + +.metric { + padding: 12px; + border-radius: 14px; + border: 1px solid #cce9d7; + background: #fbfffc; +} + +.metric:nth-child(2n) { + background: #f7fbec; +} + +.label { + font-size: 0.84em; + color: #5f7468; + font-weight: 800; +} + +.value { + margin-top: 4px; + color: #153d28; + font-size: 1.12em; + font-weight: 900; +} + +.section-title { + color: #1f5134; + font-size: 1.04em; + font-weight: 900; +} + +.row { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 13px 14px; + border-bottom: 1px solid #e2f1e7; +} + +.row:last-child { + border-bottom: 0; +} + +.avatar { + width: 46px; + height: 46px; + flex-shrink: 0; + border-radius: 50%; + background: #dff5e7; + object-fit: cover; +} + +.main { + flex: 1; + min-width: 0; +} + +.title { + color: #173a28; + font-weight: 900; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.sub { + margin-top: 4px; + color: #6d7e72; + font-size: 0.84em; + font-weight: 700; +} + +.side { + flex-shrink: 0; + text-align: right; + font-size: 0.84em; + font-weight: 800; + color: #375744; +} + +.tag { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + background: #fff3c8; + padding: 5px 9px; + color: #846216; + font-size: 0.82em; + font-weight: 900; +} + +.toolbar, +.tabs, +.form-row { + display: flex; + align-items: center; + gap: 8px; +} + +.toolbar input, +.form-row input, +.input { + width: 100%; + border: 1px solid #cce9d7; + border-radius: 12px; + background: #f8fff9; + padding: 10px 12px; + outline: none; + color: #1f3528; + font-weight: 800; +} + +.button, +.primary, +.ghost { + min-height: 38px; + border-radius: 12px; + padding: 8px 12px; + font-weight: 900; +} + +.primary { + background: #dff5e7; + border: 1px solid #b7e0c6; + color: #1f6f46; +} + +.ghost { + border: 1px solid #cce9d7; + color: #375744; + background: #fff; +} + +.tabs button { + flex: 1; + border: 1px solid #cce9d7; + background: #fff; + color: #375744; + border-radius: 999px; + padding: 9px 8px; + font-weight: 900; +} + +.tabs button.active { + background: #dff5e7; + color: #1f6f46; + border-color: #94d9ae; +} + +.grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px; +} + +.grid.three { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.tile { + min-height: 96px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + border: 1px solid #cce9d7; + border-radius: 14px; + background: #fbfffc; + color: #173a28; + font-weight: 900; + text-align: center; +} + +.tile.selected { + background: #dff5e7; + border-color: #74c993; +} + +.tile img { + width: 54%; + max-height: 64px; + object-fit: contain; +} + +.empty, +.loading { + padding: 28px 16px; + text-align: center; + color: #6d7e72; + font-weight: 800; +} + +.modal-mask { + position: fixed; + inset: 0; + z-index: 50; + display: none; + align-items: flex-end; + background: rgba(0, 0, 0, 0.45); +} + +.modal-mask.show { + display: flex; +} + +.modal { + width: 100%; + max-height: 82vh; + overflow: auto; + border-radius: 18px 18px 0 0; + background: #fff; + padding: 16px; +} + +.modal.center { + width: calc(100% - 32px); + margin: auto; + border-radius: 18px; +} + +.modal-title { + margin-bottom: 12px; + color: #153d28; + font-weight: 900; + text-align: center; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(22px + env(safe-area-inset-bottom)); + z-index: 80; + max-width: calc(100% - 40px); + transform: translateX(-50%); + padding: 9px 13px; + border-radius: 999px; + background: rgba(22, 56, 36, 0.92); + color: #fff; + font-size: 0.9em; + font-weight: 800; + text-align: center; +} + +[hidden] { + display: none !important; +} diff --git a/h5/logic-pages/app.js b/h5/logic-pages/app.js new file mode 100644 index 0000000..fab9e98 --- /dev/null +++ b/h5/logic-pages/app.js @@ -0,0 +1,662 @@ +const API_BASE_URL = "https://jvapi.haiyihy.com"; + +let headers = { + authorization: "Bearer undefined", + "req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google", + "req-client": "Android", + "req-imei": "8fa54d728ab449e04f9292329ed44bda", + "req-lang": "id-ID", + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "req-version": "V2", + "req-zone": "Asia/Shanghai" +}; + +const cfg = window.PAGE_CONFIG || {}; +const $ = (selector, root = document) => root.querySelector(selector); +const money = (v) => { + const n = Number(v || 0); + return Number.isFinite(n) ? n.toFixed(2).replace(/\.00$/, "") : String(v || 0); +}; + +function lang() { + const value = new URLSearchParams(location.search).get("lang") || navigator.language || "en"; + if (value.startsWith("ar")) return "AR"; + if (value.startsWith("tr")) return "TR"; + if (value.startsWith("bn")) return "BN"; + return "EN"; +} + +function splitPairs(value) { + const result = {}; + String(value || "").split(";").forEach((item) => { + const index = item.indexOf("="); + if (index > -1) result[item.slice(0, index)] = item.slice(index + 1); + }); + return result; +} + +function setAppHeaders(raw) { + if (!raw) return; + const data = typeof raw === "string" ? JSON.parse(raw) : raw; + const appIntel = splitPairs(data["Req-App-Intel"]); + const sysOrigin = splitPairs(data["Req-Sys-Origin"]); + headers = { + ...headers, + authorization: data.Authorization || headers.authorization, + "req-lang": data["Req-Lang"] || headers["req-lang"], + "req-app-intel": [`version=${appIntel.version || "1.0.0"}`, `build=${appIntel.build || "1"}`, `channel=${appIntel.channel || "Web"}`].join(";"), + "req-imei": appIntel["Req-Imei"] || headers["req-imei"], + "req-sys-origin": [`origin=${sysOrigin.origin || "LIKEI"}`, `child=${sysOrigin.child || "LIKEI"}`].join(";") + }; +} + +async function connectApp() { + if (!(window.app || window.webkit || window.FlutterPageControl)) { + headers["req-lang"] = lang().toLowerCase(); + return; + } + const raw = await new Promise((resolve) => { + window.renderData = resolve; + window.getIosAccessOriginParam = resolve; + let attempt = 0; + const poll = () => { + attempt += 1; + if (window.app && typeof window.app.getAccessOrigin === "function") return resolve(window.app.getAccessOrigin()); + if (attempt < 50) return setTimeout(poll, 100); + if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") window.FlutterApp.postMessage("requestAccessOrigin"); + resolve(null); + }; + poll(); + }); + if (raw) setAppHeaders(raw); +} + +async function request(method, path, body) { + const response = await fetch(`${API_BASE_URL}${path}`, { + method, + headers: { ...headers, "content-type": "application/json" }, + body: body === undefined ? undefined : JSON.stringify(body) + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.status === false) { + const error = new Error(data.errorMsg || data.message || `HTTP ${response.status}`); + error.response = data; + throw error; + } + return data; +} + +const get = (path) => request("GET", path); +const post = (path, body) => request("POST", path, body); + +function getTeamId() { + const keys = ["teamId", "TEAM_ID", "team_id"]; + for (const key of keys) { + const value = localStorage.getItem(key); + if (value) return value.replace(/^"|"$/g, ""); + } + for (const key of ["teamInfo", "userInfo", "identity"]) { + try { + const item = JSON.parse(localStorage.getItem(key) || "{}"); + if (item.teamId || item.id) return item.teamId || item.id; + } catch {} + } + return ""; +} + +function getIdentity() { + try { + const value = JSON.parse(localStorage.getItem("identity") || "{}"); + return value.identity || value.role || "BD"; + } catch { + return "BD"; + } +} + +function toast(message) { + const node = $("#toast"); + node.textContent = message || "Request failed"; + node.hidden = false; + clearTimeout(toast.timer); + toast.timer = setTimeout(() => (node.hidden = true), 2500); +} + +function setLoading(text = "Loading...") { + $("#app").innerHTML = `
${text}
`; +} + +function row({ avatar, title, sub, side, tag, onClick }) { + const node = document.createElement("button"); + node.type = "button"; + node.className = "row"; + node.innerHTML = `${avatar !== undefined ? `` : ""}
${tag ? `` : ""}`; + $(".title", node).textContent = title || "-"; + $(".sub", node).textContent = sub || ""; + $(".side", node).textContent = side || ""; + if (tag) $(".tag", node).textContent = tag; + if (onClick) node.addEventListener("click", onClick); + return node; +} + +function metrics(items) { + return `
${items.map((item) => `
${item.label}
${item.value}
`).join("")}
`; +} + +function showModal(title, content, center = false) { + const mask = $("#modalMask"); + mask.innerHTML = ``; + $(".modal-title", mask).textContent = title || ""; + $(".modal-body", mask).append(content); + mask.classList.add("show"); +} + +function closeModal() { + $("#modalMask").classList.remove("show"); +} + +function navigate(route) { + const url = new URL(route, location.origin); + const langParam = new URLSearchParams(location.search).get("lang"); + if (langParam && !url.searchParams.has("lang")) url.searchParams.set("lang", langParam); + location.href = `${url.pathname}${url.search}${url.hash}`; +} + +function renderShell() { + document.title = cfg.title || "Yumi H5"; + document.body.innerHTML = ` +
+
+ +

${cfg.title || "Yumi H5"}

+ +
+
+ + +
`; + $("[data-back]").addEventListener("click", () => history.length > 1 ? history.back() : window.app?.closePage?.()); + $("#modalMask").addEventListener("click", (event) => { + if (event.target.id === "modalMask") closeModal(); + }); +} + +async function renderTeamHistory() { + setLoading(); + const [listRes, historyRes] = await Promise.allSettled([get(cfg.listEndpoint), get(cfg.historyEndpoint)]); + const bill = listRes.value?.body || {}; + const history = historyRes.value?.body || {}; + $("#app").innerHTML = ` + ${metrics([ + { label: cfg.countLabel, value: bill.memberCount || 0 }, + { label: cfg.totalLabel, value: `$${money(bill.totalSalary || bill.teamSalary || bill.totalRecharge || 0)}` } + ])} +
+
+
${bill.billTitle || cfg.title}
${cfg.totalLabel}: $${money(bill.totalSalary || 0)}
+ +
+
+
`; + const list = $("#list"); + (bill.memberBillList || []).forEach((item) => { + list.appendChild(row({ + avatar: item.agentAvatar || item.userAvatar, + title: item.agentName || item.userName, + sub: `ID: ${item.agentAccount || item.account || "-"}`, + side: `${cfg.memberSide1}: $${money(item.teamSalaryAmount || item.salary || 0)}\n${cfg.memberSide2}: ${item.teamMemberCount || item.hostCount || item.agencyCount || 0}` + })); + }); + if (!list.children.length) list.innerHTML = `
No data
`; + $("#historyBtn").addEventListener("click", () => { + const body = document.createElement("div"); + body.innerHTML = metrics([ + { label: "Total income", value: `$${money(history.totalIncome || 0)}` }, + { label: "Previous period", value: `$${money(history.previousPeriodIncome || 0)}` } + ]); + const wrap = document.createElement("div"); + wrap.className = "card"; + (history.incomeDetails || []).forEach((item) => { + wrap.appendChild(row({ + title: item.billTitle || item.settlementPeriod, + sub: `${cfg.countLabel}: ${item.agencyNumber || item.bdNumber || item.memberCount || 0}`, + side: `$${money(item.teamSalaryAmount || item.teamTotalIncome || item.settlementSalary || 0)}`, + tag: item.statusText || item.status, + onClick: async () => { + if (!cfg.moreEndpoint || !item.billBelong) return; + try { + const more = await get(`${cfg.moreEndpoint}${item.billBelong}`); + const detail = document.createElement("div"); + const card = document.createElement("div"); + card.className = "card"; + (more.body?.memberDetails || more.body?.members || []).forEach((member) => { + card.appendChild(row({ + avatar: member.userAvatar || member.bdUserAvatar || member.avatar, + title: member.userName || member.bdUserName || member.account, + sub: `ID: ${member.account || "-"}`, + side: `$${money(member.salary || member.income || 0)}` + })); + }); + detail.appendChild(card); + showModal(more.body?.period || item.billTitle, detail); + } catch (error) { + toast(error.message); + } + } + })); + }); + if (!wrap.children.length) wrap.innerHTML = `
No data
`; + body.appendChild(wrap); + showModal("History", body); + }); +} + +async function renderAdminTeam() { + setLoading(); + const res = await post("/bd/team/overview", { type: cfg.teamType }); + const data = res.body || {}; + $("#app").innerHTML = ` + ${metrics([ + { label: "Total income", value: `$${money(data.totalIncome || 0)}` }, + { label: "Previous period", value: `$${money(data.previousPeriodIncome || 0)}` }, + { label: cfg.memberTitle, value: data.memberCount || 0 }, + { label: "Team total income", value: `$${money(data.teamTotalIncome || 0)}` } + ])} +
`; + const members = $("#members"); + (data.members || []).forEach((item) => { + members.appendChild(row({ + avatar: item.avatar, + title: item.userName || "-", + sub: `ID: ${item.account || "-"}`, + side: `${cfg.subMemberLabel}: ${item.subMemberCount || 0}\n$${money(item.totalIncome || 0)}`, + tag: "More", + onClick: () => showAdminTeamDetail(item) + })); + }); + if (!members.children.length) members.innerHTML = `
No data
`; +} + +async function showAdminTeamDetail(item) { + try { + const res = await post("/bd/team/member/detail", { targetId: item.userId, type: cfg.detailType || cfg.teamType }); + const data = res.body || {}; + const body = document.createElement("div"); + body.innerHTML = metrics([ + { label: "Total income", value: `$${money(data.totalIncome || 0)}` }, + { label: "Previous period", value: `$${money(data.previousPeriodIncome || 0)}` } + ]); + const card = document.createElement("div"); + card.className = "card"; + (data.incomeDetails || []).forEach((detail) => { + card.appendChild(row({ + title: detail.settlementPeriod, + sub: `${cfg.subMemberLabel}: ${detail.memberCount || 0}`, + side: `$${money(detail.teamTotalIncome || 0)}`, + tag: detail.status || "More", + onClick: () => { + const detailBody = document.createElement("div"); + const detailCard = document.createElement("div"); + detailCard.className = "card"; + (detail.members || []).forEach((member) => detailCard.appendChild(row({ + avatar: member.avatar, + title: member.userName, + sub: `ID: ${member.account || "-"}`, + side: `$${money(member.income || 0)}` + }))); + detailBody.appendChild(detailCard); + showModal(detail.settlementPeriod, detailBody); + } + })); + }); + if (!card.children.length) card.innerHTML = `
No data
`; + body.appendChild(card); + showModal(`${cfg.memberTitle} ${item.account || ""}`, body); + } catch (error) { + toast(error.message); + } +} + +async function renderRechargeAgency() { + setLoading(); + const [summary, list] = await Promise.allSettled([ + get("/app/h5/recharge-summary"), + get("/app/h5/recharge-page?cursor=1&limit=20") + ]); + const data = summary.value?.body || {}; + const records = list.value?.body?.records || []; + $("#app").innerHTML = `${metrics([ + { label: "My total income", value: `$${money(data.totalIncome || 0)}` }, + { label: "This period recharge", value: `$${money(data.currentMonthRecharge || 0)}` } + ])}
Recharge agency list
`; + const root = $("#records"); + records.forEach((item) => root.appendChild(row({ + avatar: item.userAvatar, + title: item.userNickname, + sub: `ID: ${item.account || "-"}`, + side: `This: $${money(item.thisMonth || 0)}\nLast: $${money(item.lastMonth || 0)}` + }))); + if (!root.children.length) root.innerHTML = `
No data
`; +} + +async function renderMessage() { + const teamId = getTeamId(); + setLoading(); + const res = await get(`/team/user/apply/record?teamId=${teamId}&status=WAIT`); + const records = (res.body || []).map((item) => ({ + id: item.id, + account: item.createUserProfile?.account, + name: item.createUserProfile?.userNickname, + avatar: item.createUserProfile?.userAvatar + })); + $("#app").innerHTML = `
`; + const root = $("#messages"); + records.forEach((item) => { + const node = row({ avatar: item.avatar, title: item.name || "Unknown user", sub: `ID: ${item.account || "-"}` }); + const actions = document.createElement("div"); + actions.className = "toolbar"; + actions.innerHTML = ``; + actions.children[0].addEventListener("click", async () => updateApply(item.id, "AGREE", node)); + actions.children[1].addEventListener("click", async () => updateApply(item.id, "REJECT", node)); + node.appendChild(actions); + root.appendChild(node); + }); + if (!root.children.length) root.innerHTML = `
No data
`; +} + +async function updateApply(id, status, node) { + try { + await post("/team/user/apply/record/update", { id, status }); + node.remove(); + toast(status === "AGREE" ? "Approved" : "Rejected"); + } catch (error) { + toast(error.message); + } +} + +async function renderTeamMembers() { + const teamId = getTeamId(); + setLoading(); + const res = await get(`/team/members?id=${teamId}`); + const records = res.body || []; + $("#app").innerHTML = ` +
+
`; + const root = $("#members"); + const draw = (items) => { + root.innerHTML = ""; + items.forEach((member, index) => root.appendChild(row({ + avatar: member.userProfile?.userAvatar, + title: `${index + 1}. ${member.userProfile?.userNickname || "-"}`, + sub: `ID: ${member.userProfile?.ownSpecialId?.account || member.userProfile?.account || "-"}`, + side: `${member.targetFormat || "-"}\n${member.timeHours || "-"}` + }))); + if (!root.children.length) root.innerHTML = `
No data
`; + }; + draw(records); + $("#searchBtn").addEventListener("click", async () => { + const account = $("#search").value.trim(); + if (!account) return draw(records); + try { + const searched = await get(`/team/search-members?account=${account}`); + draw(searched.body || []); + } catch (error) { + toast(error.message); + } + }); + $("#cancelBtn").addEventListener("click", () => { + $("#search").value = ""; + draw(records); + }); +} + +async function renderTeamBill() { + const teamId = getTeamId(); + setLoading(); + const res = await get(`/team/bill?id=${teamId}`); + const records = res.body || []; + let total = 0; + records.forEach((item) => { + if (item.status === "SETTLED") total += Number(item.settleResult?.totalSalary || 0); + }); + $("#app").innerHTML = `${metrics([{ label: "History team income", value: `$${money(total)}` }])}
Work report
`; + const root = $("#bills"); + records.forEach((item) => root.appendChild(row({ + title: item.billTitle, + sub: `Host salary: $${money(item.settleResult?.memberSalary || 0)} | Agent salary: $${money(item.settleResult?.ownSalary || 0)}`, + side: `$${money(item.settleResult?.totalSalary || 0)}`, + tag: ({ SETTLED: "Completed", UNPAID: "In Progress", HANG_UP: "Out of account", PAY_OUT: "Completed" })[item.status] || item.status, + onClick: async () => { + try { + const detail = await get(`/team/bill/work-members?id=${item.id}`); + const body = document.createElement("div"); + const card = document.createElement("div"); + card.className = "card"; + (detail.body || []).forEach((member) => card.appendChild(row({ + avatar: member.memberProfile?.userAvatar, + title: member.memberProfile?.userNickname, + sub: `ID: ${member.memberProfile?.account || "-"}`, + side: `Target: ${member.target?.acceptGiftValue || 0}\nDays: ${member.target?.effectiveDay || 0}` + }))); + body.appendChild(card); + showModal(item.billTitle, body); + } catch (error) { + toast(error.message); + } + } + }))); + if (!root.children.length) root.innerHTML = `
No data
`; +} + +function renderInviteProcess() { + $("#app").innerHTML = `
+
1
Invite users to download the app.
+
2
Invited users log in.
+
3
Users join your team.
+
4
Enter team ID when joining.
+
`; +} + +async function renderBankCards() { + setLoading(); + const [cards, kyc] = await Promise.allSettled([get("/wallet/bank-card/list"), get("/wallet/withdraw-info/list")]); + const current = (cards.value?.body || []).find((item) => item.use); + const info = kyc.value?.body?.[0]; + $("#app").innerHTML = ` +
Bank card
+
+
KYC
+
`; + $("#cardBox").appendChild(current ? row({ title: current.cardType, sub: `Card: ${current.cardNo}`, side: current.payee }) : row({ title: "Add payment method", sub: "No bank cards in use", tag: "Add", onClick: () => navigate("/bank-card") })); + $("#kycBox").appendChild(info ? row({ title: `Status: ${info.status}`, sub: `Contact: ${info.contactNumber || "-"}`, side: info.otherDescription || "", tag: "KYC", onClick: () => navigate("/KYC") }) : row({ title: "Complete information", sub: "No KYC info", tag: "KYC", onClick: () => navigate("/KYC") })); +} + +async function renderWalletAction() { + setLoading(); + const action = new URLSearchParams(location.search).get("activeAction") || cfg.action || "Exchange"; + const balanceEndpoint = cfg.salaryType ? `/wallet/salary-account/balance?salaryType=${cfg.salaryType}` : "/wallet/bank/balance"; + const balanceRes = await get(balanceEndpoint).catch(() => ({ body: 0 })); + const balance = typeof balanceRes.body === "number" ? balanceRes.body : balanceRes.body?.availableBalance || balanceRes.body?.balance || 0; + const amounts = [1, 5, 10, 50, 100, 200]; + $("#app").innerHTML = ` + ${metrics([{ label: "Available salaries", value: `$${money(balance)}` }])} +
+ + + +
+
`; + document.querySelectorAll("[data-act]").forEach((btn) => btn.addEventListener("click", () => navigate(`${location.pathname}?activeAction=${encodeURIComponent(btn.dataset.act)}&lang=${lang().toLowerCase()}`))); + const panel = $("#walletPanel"); + if (action === "Cash out") return renderCashOutPanel(panel); + if (action === "Transfer") return renderTransferPanel(panel, amounts); + renderExchangePanel(panel, amounts); +} + +function renderExchangePanel(panel, amounts) { + panel.innerHTML = `
${amounts.map((amount) => ``).join("")}
`; + let selected = null; + panel.querySelectorAll("[data-amount]").forEach((node) => node.addEventListener("click", () => { + selected = Number(node.dataset.amount); + panel.querySelectorAll(".tile").forEach((tile) => tile.classList.remove("selected")); + node.classList.add("selected"); + })); + $("#submit").addEventListener("click", async () => { + if (!selected) return toast("Please select amount"); + try { + const path = cfg.salaryType ? "/wallet/salary-account/exchange/gold" : "/wallet/bank/exchange/gold"; + await post(path, cfg.salaryType ? { amount: selected, salaryType: cfg.salaryType } : { amount: selected }); + toast("Exchange success"); + } catch (error) { + toast(error.message); + } + }); +} + +function renderTransferPanel(panel, amounts) { + panel.innerHTML = `
${amounts.map((amount) => ``).join("")}
`; + let payee = null; + let selected = null; + $("#findPayee").addEventListener("click", async () => { + try { + const res = await get(`/user/user-profile/open-search?account=${encodeURIComponent($("#payee").value.trim())}`); + payee = res.body; + $("#payeeInfo").innerHTML = ""; + $("#payeeInfo").appendChild(row({ avatar: payee.userAvatar, title: payee.userNickname || payee.name, sub: `ID: ${payee.account}`, side: "" })); + } catch (error) { + toast(error.message); + } + }); + panel.querySelectorAll("[data-amount]").forEach((node) => node.addEventListener("click", () => { + selected = Number(node.dataset.amount); + panel.querySelectorAll(".tile").forEach((tile) => tile.classList.remove("selected")); + node.classList.add("selected"); + })); + $("#submit").addEventListener("click", async () => { + if (!selected || !payee?.id) return toast("Please select amount and payee"); + try { + const path = cfg.salaryType ? "/wallet/salary-account/transferGold" : "/wallet/bank/transferGold"; + await post(path, cfg.salaryType ? { amount: selected, acceptUserId: payee.id, salaryType: cfg.salaryType } : { amount: selected, acceptUserId: payee.id, acceptMethod: "BANK_TRANSFER" }); + toast("Transfer success"); + } catch (error) { + toast(error.message); + } + }); +} + +async function renderCashOutPanel(panel) { + const [cards, kyc] = await Promise.allSettled([get("/wallet/bank-card/list"), get("/wallet/withdraw-info/list")]); + const card = (cards.value?.body || []).find((item) => item.use); + const info = kyc.value?.body?.[0]; + panel.innerHTML = `
`; + $("#card").appendChild(card ? row({ title: card.cardType, sub: `Card: ${card.cardNo}`, side: card.payee }) : row({ title: "No bank cards in use", sub: "Add bank card", tag: "Add", onClick: () => navigate("/bank-card") })); + $("#kyc").appendChild(info ? row({ title: `KYC: ${info.status}`, sub: `Contact: ${info.contactNumber || "-"}`, tag: "KYC" }) : row({ title: "Complete KYC", sub: "No KYC information", tag: "KYC", onClick: () => navigate("/KYC") })); + $("#submit").addEventListener("click", async () => { + const amount = Number($("#amount").value); + if (!card?.id || !amount || amount < 50) return toast("Please complete information and enter at least 50"); + try { + await post("/wallet/bank/withdraw", { amount, acceptBankCardId: card.id, salaryType: cfg.salaryType || (getIdentity() === "HOST" ? "HOST_SALARY" : "BD_SALARY") }); + toast("Cash withdrawal submitted"); + } catch (error) { + toast(error.message); + } + }); +} + +async function renderItemDistribution() { + setLoading(); + const permissionEndpoint = cfg.admin ? "/app/h5/own-permission?propsType=NOBLE_VIP" : "/sys/bd/list-permission"; + const propsBase = cfg.admin ? "/sys/manager/props" : "/sys/bd/props"; + const sendEndpoint = cfg.admin ? "/sys/manager/send" : "/sys/bd/send"; + let tabs = cfg.admin ? [{ name: "frames", type: "AVATAR_FRAME" }, { name: "vehicles", type: "RIDE" }, { name: "vip", type: "NOBLE_VIP" }] : []; + if (!cfg.admin) { + const res = await get(permissionEndpoint); + const body = res.body || []; + if (body.includes("AVATAR_FRAME")) tabs.push({ name: "frames", type: "AVATAR_FRAME" }); + if (body.includes("RIDE")) tabs.push({ name: "vehicles", type: "RIDE" }); + if (body.some((x) => String(x).startsWith("NOBLE_VIP"))) tabs.push({ name: "vip", type: "NOBLE_VIP" }); + } + if (!tabs.length) tabs = [{ name: "frames", type: "AVATAR_FRAME" }]; + $("#app").innerHTML = `
${tabs.map((tab, index) => ``).join("")}
`; + const load = async (tab) => { + const res = await get(`${propsBase}?propsType=${tab.type}¤cyType=GOLD`); + const root = $("#props"); + root.innerHTML = ""; + (res.body || []).forEach((item) => { + const tile = document.createElement("button"); + tile.type = "button"; + tile.className = "tile"; + tile.innerHTML = `${item.name || "Item"}Send`; + tile.addEventListener("click", () => openSendProps(item, sendEndpoint)); + root.appendChild(tile); + }); + if (!root.children.length) root.innerHTML = `
No data
`; + }; + document.querySelectorAll("[data-tab]").forEach((btn) => btn.addEventListener("click", () => { + document.querySelectorAll("[data-tab]").forEach((b) => b.classList.remove("active")); + btn.classList.add("active"); + load(tabs[Number(btn.dataset.tab)]); + })); + await load(tabs[0]); +} + +function openSendProps(item, endpoint) { + const body = document.createElement("div"); + body.innerHTML = `
`; + $("#confirmSend", body).addEventListener("click", async () => { + try { + const user = await get(`/user/user-profile/open-search?account=${encodeURIComponent($("#targetUser", body).value.trim())}`); + await post(endpoint, { propsId: item.id, acceptUserId: user.body.id }); + closeModal(); + toast("Gift delivery successful"); + } catch (error) { + toast(error.message); + } + }); + showModal(item.name || "Send", body, true); +} + +function renderPolicy() { + $("#app").innerHTML = ""; +} + +async function renderPlatformPolicy() { + const teamId = getTeamId(); + setLoading(); + const res = await get(`/team/release/policy?id=${teamId}`); + const policies = res.body?.policy || []; + $("#app").innerHTML = `
`; + const root = $("#policyList"); + policies.forEach((item) => root.appendChild(row({ + title: `Lv.${item.level}`, + sub: `Time: ${item.onlineTime || 0}h | Target: ${item.target || 0}`, + side: `Host: $${money(item.memberSalary || 0)}\nAgent: $${money(item.ownSalary || 0)}` + }))); + if (!root.children.length) root.innerHTML = `
No policy data available
`; +} + +async function init() { + renderShell(); + try { + await connectApp(); + const handlers = { + teamHistory: renderTeamHistory, + adminTeam: renderAdminTeam, + rechargeAgency: renderRechargeAgency, + message: renderMessage, + teamMembers: renderTeamMembers, + teamBill: renderTeamBill, + inviteProcess: renderInviteProcess, + bankCards: renderBankCards, + walletAction: renderWalletAction, + itemDistribution: renderItemDistribution, + platformPolicy: renderPlatformPolicy, + policy: renderPolicy + }; + await (handlers[cfg.mode] || renderPolicy)(); + } catch (error) { + console.error(error); + $("#app").innerHTML = `
${error.message || "Failed to load data"}
`; + } +} + +init(); diff --git a/h5/message/index.html b/h5/message/index.html new file mode 100644 index 0000000..1978f9a --- /dev/null +++ b/h5/message/index.html @@ -0,0 +1,13 @@ + + + + + + Message + + + + + + + diff --git a/h5/my-BD-teams/index.html b/h5/my-BD-teams/index.html new file mode 100644 index 0000000..b71207d --- /dev/null +++ b/h5/my-BD-teams/index.html @@ -0,0 +1,13 @@ + + + + + + My BD Teams + + + + + + + diff --git a/h5/my-BDLeader-teams/index.html b/h5/my-BDLeader-teams/index.html new file mode 100644 index 0000000..3f519d7 --- /dev/null +++ b/h5/my-BDLeader-teams/index.html @@ -0,0 +1,13 @@ + + + + + + My BD Leader Teams + + + + + + + diff --git a/h5/my-agency-teams/index.html b/h5/my-agency-teams/index.html new file mode 100644 index 0000000..afcaefc --- /dev/null +++ b/h5/my-agency-teams/index.html @@ -0,0 +1,13 @@ + + + + + + My Agency Teams + + + + + + + diff --git a/h5/my-recharge-agency/index.html b/h5/my-recharge-agency/index.html new file mode 100644 index 0000000..95bb679 --- /dev/null +++ b/h5/my-recharge-agency/index.html @@ -0,0 +1,13 @@ + + + + + + My Recharge Agency + + + + + + + diff --git a/h5/platform-policy/index.html b/h5/platform-policy/index.html new file mode 100644 index 0000000..396524e --- /dev/null +++ b/h5/platform-policy/index.html @@ -0,0 +1,13 @@ + + + + + + Platform Policy + + + + + + + diff --git a/h5/policy/index.html b/h5/policy/index.html new file mode 100644 index 0000000..8b18e28 --- /dev/null +++ b/h5/policy/index.html @@ -0,0 +1,13 @@ + + + + + + BD Policy + + + + + + + diff --git a/h5/search-payee/index.html b/h5/search-payee/index.html new file mode 100644 index 0000000..2ce7e86 --- /dev/null +++ b/h5/search-payee/index.html @@ -0,0 +1,13 @@ + + + + + + Search Payee + + + + + + + diff --git a/h5/team-bill/index.html b/h5/team-bill/index.html new file mode 100644 index 0000000..d1deec4 --- /dev/null +++ b/h5/team-bill/index.html @@ -0,0 +1,13 @@ + + + + + + Team Bill + + + + + + + diff --git a/h5/team-member/index.html b/h5/team-member/index.html new file mode 100644 index 0000000..3b2c760 --- /dev/null +++ b/h5/team-member/index.html @@ -0,0 +1,13 @@ + + + + + + Team Member + + + + + + + diff --git a/h5/transfer/index.html b/h5/transfer/index.html new file mode 100644 index 0000000..7d6a254 --- /dev/null +++ b/h5/transfer/index.html @@ -0,0 +1,13 @@ + + + + + + Transfer + + + + + + +