From f6b078a1dd2cad5ab13d7312b92f5f39048bae83 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Mon, 7 Aug 2023 16:59:25 +0700 Subject: [PATCH 001/291] fix: remove mime type as props --- components/carousel/module/CarouselMedia.vue | 18 ++++++------------ .../common/ConnectWallet/WalletAssetNfts.vue | 4 +--- components/gallery/GalleryItem.vue | 2 -- components/gallery/GalleryItemDescription.vue | 1 - components/gallery/GalleryItemPreviewer.vue | 1 - libs/ui/src/components/MediaItem/MediaItem.vue | 8 ++------ .../src/components/NeoNftCard/NeoNftCard.vue | 1 - 7 files changed, 9 insertions(+), 26 deletions(-) diff --git a/components/carousel/module/CarouselMedia.vue b/components/carousel/module/CarouselMedia.vue index 0efcc6daf0..b8aa9f430f 100644 --- a/components/carousel/module/CarouselMedia.vue +++ b/components/carousel/module/CarouselMedia.vue @@ -5,23 +5,17 @@ - - + diff --git a/locales/en.json b/locales/en.json index fda62fc645..a55b533cf2 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1049,6 +1049,7 @@ "tokenStandard": "Token Standard", "royalties": "Royalties", "media": "Media", + "animatedMedia": "Animated Media", "metadata": "Metadata" }, "tabActivity": { diff --git a/utils/ipfs.ts b/utils/ipfs.ts index 2fac0520e6..60041d55f3 100644 --- a/utils/ipfs.ts +++ b/utils/ipfs.ts @@ -178,3 +178,8 @@ export type EntityWithMeta = { metadata: string meta?: NFTMetadata } + +export function toCloudflareIpfsUrl(baseurl) { + const url = new URL(baseurl) + return `https://cloudflare-ipfs.com/${url.pathname}` +} From 62aaace4903ba4dbf29bb4b114dbe34b82a7dd6f Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Mon, 7 Aug 2023 18:55:12 +0700 Subject: [PATCH 004/291] refactor: adjust href url --- components/gallery/GalleryItemDescription.vue | 13 +++++++++++-- components/gallery/GalleryItemPreviewer.vue | 1 - 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/components/gallery/GalleryItemDescription.vue b/components/gallery/GalleryItemDescription.vue index 0534188a45..c610387381 100644 --- a/components/gallery/GalleryItemDescription.vue +++ b/components/gallery/GalleryItemDescription.vue @@ -87,7 +87,7 @@

{{ $t('tabs.tabDetails.media') }}

{{ $t('tabs.tabDetails.animatedMedia') }}

@@ -228,6 +228,8 @@ const propertiesTabDisabled = computed(() => { const metadataMimeType = ref('application/json') const metadataURL = ref('') const animationMediaMimeType = ref('') +const animationURL = ref('') +const mediaURL = ref('') watchEffect(async () => { if (nft.value?.metadata) { @@ -239,8 +241,15 @@ watchEffect(async () => { metadataMimeType.value = response.headers.get('content-type') || 'application/json' metadataURL.value = sanitizeMetadata + } + if (nftAnimation.value) { animationMediaMimeType.value = await getMimeType(nftAnimation.value) + animationURL.value = toCloudflareIpfsUrl(nftAnimation.value) + } + + if (nftImage.value) { + mediaURL.value = toCloudflareIpfsUrl(nftImage.value) } }) diff --git a/components/gallery/GalleryItemPreviewer.vue b/components/gallery/GalleryItemPreviewer.vue index 79cac87405..0024b865e3 100644 --- a/components/gallery/GalleryItemPreviewer.vue +++ b/components/gallery/GalleryItemPreviewer.vue @@ -37,7 +37,6 @@ const props = defineProps<{ }>() const nft = computed(() => props.galleryItem.nft.value) -const nftMimeType = computed(() => props.galleryItem.nftMimeType.value) const nftAnimation = computed(() => props.galleryItem.nftAnimation.value) const emit = defineEmits(['input']) From fc07080c7bdee9e505c02691aa8258573a3abb9b Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Tue, 8 Aug 2023 15:22:49 +0700 Subject: [PATCH 005/291] chore: use onClick --- components/gallery/GalleryItemDescription.vue | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/components/gallery/GalleryItemDescription.vue b/components/gallery/GalleryItemDescription.vue index c610387381..8643c6af5d 100644 --- a/components/gallery/GalleryItemDescription.vue +++ b/components/gallery/GalleryItemDescription.vue @@ -86,24 +86,19 @@

{{ $t('tabs.tabDetails.animatedMedia') }}

- - {{ animationMediaMimeType }} - +
+ + {{ animationMediaMimeType }} + +

{{ $t('tabs.tabDetails.metadata') }}

@@ -228,8 +223,6 @@ const propertiesTabDisabled = computed(() => { const metadataMimeType = ref('application/json') const metadataURL = ref('') const animationMediaMimeType = ref('') -const animationURL = ref('') -const mediaURL = ref('') watchEffect(async () => { if (nft.value?.metadata) { @@ -245,11 +238,10 @@ watchEffect(async () => { if (nftAnimation.value) { animationMediaMimeType.value = await getMimeType(nftAnimation.value) - animationURL.value = toCloudflareIpfsUrl(nftAnimation.value) - } - - if (nftImage.value) { - mediaURL.value = toCloudflareIpfsUrl(nftImage.value) } }) + +const openLink = (link) => { + window.open(toCloudflareIpfsUrl(link), '_blank') +} From f5d8caa22061bbd9cc63cac235a9b8625f54cbbe Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Tue, 8 Aug 2023 15:39:53 +0700 Subject: [PATCH 006/291] fix: sentry hide source map --- nuxt.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/nuxt.config.js b/nuxt.config.js index adac31a667..10ee442e7e 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -275,6 +275,7 @@ export default defineNuxtConfig({ return event }, }, + sourceMapStyle: 'hidden-source-map', }, pwa: { From f71db16a42f91341d7708eeded04f09283694fa7 Mon Sep 17 00:00:00 2001 From: hassnian Date: Tue, 8 Aug 2023 14:16:38 +0500 Subject: [PATCH 007/291] fix: Changing network in nav always redirects to / --- components/navbar/ChainSelectDropdown.vue | 14 +++++++++++++- composables/usePrefix.ts | 6 ++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/components/navbar/ChainSelectDropdown.vue b/components/navbar/ChainSelectDropdown.vue index ac3728cad7..512434d4c7 100644 --- a/components/navbar/ChainSelectDropdown.vue +++ b/components/navbar/ChainSelectDropdown.vue @@ -25,17 +25,29 @@ import { NeoDropdown, NeoDropdownItem } from '@kodadot1/brick' import { usePreferencesStore } from '@/stores/preferences' import { getChainNameByPrefix } from '@/utils/chain' +import { explorerVisible } from '@/utils/config/permision.config' const { availableChains } = useChain() const { urlPrefix, setUrlPrefix } = usePrefix() const prefrencesStore = usePreferencesStore() +const route = useRoute() +const isExplorePage = computed(() => route.name?.includes('prefix-explore')) +const isExplorePageAvailable = (chain: string): boolean => + explorerVisible(chain) + const selected = computed({ get: () => urlPrefix.value, set: (value) => { prefrencesStore.setNotificationBoxCollapse(false) setUrlPrefix(value) - navigateTo(`/${value}`) + + let newPath = `/${value}` + if (isExplorePage.value && isExplorePageAvailable(value)) { + newPath = route.path.replace(urlPrefix.value, value) + } + + navigateTo(newPath) }, }) diff --git a/composables/usePrefix.ts b/composables/usePrefix.ts index 6760ebd910..b15d401afc 100644 --- a/composables/usePrefix.ts +++ b/composables/usePrefix.ts @@ -9,11 +9,13 @@ export default function () { const route = useRoute() const storage = useLocalStorage('urlPrefix', { selected: DEFAULT_PREFIX }) const initialPrefixFromPath = getAvailablePrefix(route.path.split('/')[1]) - const validPrefixFromRoute = getAvailablePrefix(route.params.prefix) + const validPrefixFromRoute = computed(() => + getAvailablePrefix(route.params.prefix) + ) const prefix = computed( () => - (validPrefixFromRoute || + (validPrefixFromRoute.value || storage.value.selected || initialPrefixFromPath) as Prefix ) From e347ce3f50bb997d942267fce86acde1c5952d9d Mon Sep 17 00:00:00 2001 From: hassnian Date: Tue, 8 Aug 2023 17:44:33 +0500 Subject: [PATCH 008/291] ref: suport multiple pages --- components/navbar/ChainSelectDropdown.vue | 15 +--- composables/useChainRedirect.ts | 101 ++++++++++++++++++++++ utils/config/permision.config.ts | 16 ++++ 3 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 composables/useChainRedirect.ts diff --git a/components/navbar/ChainSelectDropdown.vue b/components/navbar/ChainSelectDropdown.vue index 512434d4c7..b34830b70c 100644 --- a/components/navbar/ChainSelectDropdown.vue +++ b/components/navbar/ChainSelectDropdown.vue @@ -25,29 +25,18 @@ import { NeoDropdown, NeoDropdownItem } from '@kodadot1/brick' import { usePreferencesStore } from '@/stores/preferences' import { getChainNameByPrefix } from '@/utils/chain' -import { explorerVisible } from '@/utils/config/permision.config' const { availableChains } = useChain() +const { redirectAfterChainChange } = useChainRedirect() const { urlPrefix, setUrlPrefix } = usePrefix() const prefrencesStore = usePreferencesStore() -const route = useRoute() -const isExplorePage = computed(() => route.name?.includes('prefix-explore')) -const isExplorePageAvailable = (chain: string): boolean => - explorerVisible(chain) - const selected = computed({ get: () => urlPrefix.value, set: (value) => { prefrencesStore.setNotificationBoxCollapse(false) setUrlPrefix(value) - - let newPath = `/${value}` - if (isExplorePage.value && isExplorePageAvailable(value)) { - newPath = route.path.replace(urlPrefix.value, value) - } - - navigateTo(newPath) + redirectAfterChainChange(value, `/${value}`) }, }) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts new file mode 100644 index 0000000000..b6b6d86685 --- /dev/null +++ b/composables/useChainRedirect.ts @@ -0,0 +1,101 @@ +import { Prefix } from '~~/libs/static/dist' +import { + explorerVisible, + seriesInsightVisible, +} from '@/utils/config/permision.config' + +enum RedirectTypes { + CHAIN_PREFIX_CHANGE = 'chain-prefix-change', + STAY = 'stay', +} + +export enum PageTypes { + PREFIX_EXPLORE_ITEMS = 'prefix-explore-items', + PREFIX_EXPLORE_COLLECTIBLES = 'prefix-explore-collectibles', + SALES = 'sales', + HOT = 'hot', + SERIES_INSIGHT = 'series-insight', + BLOG = 'blog', + BLOG_SLUG = 'blog-slug', + PREFIX_MASSMINT = 'prefix-massmint', + PREFIX_MASSMINT_ONBOARDING = 'prefix-massmint-onboarding', +} + +const SpecialRedirectPages = [ + PageTypes.PREFIX_EXPLORE_ITEMS, + PageTypes.PREFIX_EXPLORE_COLLECTIBLES, + PageTypes.SALES, + PageTypes.HOT, + PageTypes.SERIES_INSIGHT, + PageTypes.BLOG, + PageTypes.BLOG_SLUG, + PageTypes.PREFIX_MASSMINT, + PageTypes.PREFIX_MASSMINT_ONBOARDING, +] + +const redirectType: { [key in PageTypes]?: RedirectTypes } = { + [PageTypes.PREFIX_EXPLORE_ITEMS]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageTypes.PREFIX_EXPLORE_COLLECTIBLES]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageTypes.SALES]: RedirectTypes.STAY, + [PageTypes.HOT]: RedirectTypes.STAY, + [PageTypes.SERIES_INSIGHT]: RedirectTypes.STAY, + [PageTypes.BLOG]: RedirectTypes.STAY, + [PageTypes.BLOG_SLUG]: RedirectTypes.STAY, + [PageTypes.PREFIX_MASSMINT]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageTypes.PREFIX_MASSMINT_ONBOARDING]: RedirectTypes.CHAIN_PREFIX_CHANGE, +} + +const pageVisibilityPerChain = { + [PageTypes.PREFIX_EXPLORE_ITEMS]: (chain: Prefix | string): boolean => + explorerVisible(chain), + [PageTypes.PREFIX_EXPLORE_COLLECTIBLES]: (chain: Prefix | string): boolean => + explorerVisible(chain), + [PageTypes.SERIES_INSIGHT]: (chain: Prefix | string) => + seriesInsightVisible(chain), +} + +export default function () { + const { urlPrefix } = usePrefix() + + const route = useRoute() + + const getChangedChainPrefixFromPath = (chain: string | Prefix) => + route.path.replace(urlPrefix.value, chain) + + const handleSpecialCaseRedirect: { + [key in RedirectTypes]?: (chain: string | Prefix) => void + } = { + [RedirectTypes.CHAIN_PREFIX_CHANGE]: (chain: string | Prefix) => + navigateTo(getChangedChainPrefixFromPath(chain)), + } + + const redirectAfterChainChange = ( + chain: string | Prefix, + defaultPath: string + ) => { + const routeName = route.name || '' + + const isSpecialCase = SpecialRedirectPages.includes(routeName as PageTypes) + + let isPageAvailableForChain = true + const pageVisibilityCheck = pageVisibilityPerChain[routeName] + + if (pageVisibilityCheck) { + isPageAvailableForChain = pageVisibilityCheck(chain) + } + + if (!(isSpecialCase && isPageAvailableForChain)) { + navigateTo(defaultPath) + } + + if (redirectType[routeName] === RedirectTypes.STAY) { + return + } + + handleSpecialCaseRedirect[redirectType[routeName]](chain, routeName) + } + + return { + redirectAfterChainChange, + } +} diff --git a/utils/config/permision.config.ts b/utils/config/permision.config.ts index 8954fa4434..6abd2eef6a 100644 --- a/utils/config/permision.config.ts +++ b/utils/config/permision.config.ts @@ -24,6 +24,18 @@ const hasExplorer: Config = { stt: true, } +const hasInsight: Config = { + rmrk: true, + ksm: false, + bsx: true, + stmn: false, + movr: false, + glmr: false, + snek: false, + dot: false, + stt: false, +} + export const createVisible = (prefix: Prefix | string): boolean => { return hasCreate[prefix] } @@ -31,3 +43,7 @@ export const createVisible = (prefix: Prefix | string): boolean => { export const explorerVisible = (prefix: Prefix | string): boolean => { return hasExplorer[prefix] ?? true } + +export const seriesInsightVisible = (prefix: Prefix | string) => { + return hasInsight[prefix] +} From 5f176b206957c6242f55fa43c4d36542012ba77b Mon Sep 17 00:00:00 2001 From: Jarsen <695552027@qq.com> Date: Wed, 9 Aug 2023 09:56:42 +0800 Subject: [PATCH 009/291] fix: replace image on blog --- .../blog/kodadot's-drop-page-explained-6.webp | Bin 14114 -> 100234 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/blog/kodadot's-drop-page-explained-6.webp b/static/blog/kodadot's-drop-page-explained-6.webp index 3f5d5e4815205704333e4e65710fda0017c4dfa0..0537b3286d98038d9a23f3b2a125354ed4724a86 100644 GIT binary patch literal 100234 zcmeFZb#UED5;Q1gS_adxkh-Xlf|>#+q09Hb8P#CZfvKTjLLm9`6>{Xr zN!eCjZqq#ciA_Mz4&qrw$JOs`Ho!Nc2U@R`#;k>tc?qd z%U@SM;$ehyxHJkNIJ*G6*R}wb`0g(4Y3gFW+W?%0>?`rt%vbsAjLY^)Ks#XM6zN6% zsr`7aLi_}>weo!JmQTo61|a?P{`wndpxzfqf8KZDanE=0R^{d3mf|)1 z^&23u((LpM0QhWoqJQV>>0Q$P>N{`;1OS}0PONRUAGP=ThP|Y{?p*Th_zwD30LY%a zUm*t=mIX=ycu$_M^0xsyb1#(%`pK_-ulg^QH*FOFwr8Tp_H%+=z&;@IA^+v>IrEyJ zL4VcP@fGW#=QZ&`e^vjMfN1TrFE4=MW$6y%nWEJ9kzl`l+uinT?ZWrex9t|`_Ufqp zMBtlmAzyqG7;KsN19_%&vl>lJ(Q0Xdv2DtSt0+>A6of;nkUI0h!^UuKm;nyobz;kAOGyw3B z`S2?Ldgu!PRGu$9g#rMt9hLhb4Qj*>q$>KPVd2}cie7Ql3~{2Oml8#7l4uwM#5w=Z zy%d!Max|f9I*!Ehy4A9B-%F~x@UX_=HO-7FenLQeh|{j2oG>;*Rm`sAO$S(>@~R~Z zI+$Mm@X>~DOuxv-#Rj>Ohdoq1JyoQ1bR%>BW~y_m`zbnTV5V;wYirx zOAGsXHv+%GLgN&P)2V0=*V+!sThK|BSmDc8kjh}sk~@lbIy6YXZqt#y9~Ui1ntJX; zq&mh(W@KNXg+}=7w}3~YQMtw6Z!5)!DCp!J%1TQnT8^GwNS4gWtZ%S$XIxTAKpiNR zNM`!9@2VB?`SE!I2?5wO8qXJ0dv+FHrL`-E0H$myFva~C%bO-CtujQJk1VOZ@y?2t zvQc5gDkG#vVueKt9rE=j4I?4;F;lUGR*RIKbJA;wn^m<3OJV+r_rs82y-mPR+&Kv+ z?H_%`y@=FTXzKOJn?6GQ0k zGy@M(61{7%12I%U0UM#1`xL9lhMSw-fUtw{l!r{ysoKx{G0XO>iElII>H;@2v28%M zk5Krnt&O{m3GOy^K}TxOBQZT%$S(m+xR8BtA{WUtdJLDj$ur}-OAtt(!;5IM^oSuLco4irM8uk#1xu#CD<9fY)a>k4l zYj2E_SEVl{4l_5K+EqRZ?Fb}&wf@ps*Vsv{({t(vS-Sh?d|ERV>e;phJirln z$K?2|-;7l5)1;AT`1RI1TZ(SFaIu(VXDRDYgZed3)z`M^XdmxJGW4-qqDEp9swb3W zT8!e!k}v#W4HJGRdkY|Gqp@12tLZMm;7gg@GB2prs;5_%p>cRZML~2PbR*{)aWUHD zmxMk0L7Wp65OSRxp?kh{t$uMFJArIACE3i_G1s2LNSs(_o+J76G7 z9Kd^R1cQwR3o;-T@NuVTYEMiKz!@Su9u-hyTsneRdPfw}&%p*n2$juL7A2E65SD3E z;kkI^A^rS<+NEC}z;u;^nHYwaZLe0B!$(2qK#C^#pl)Q`wmcmtrRx^!7u$p;J97p0 zgQY=4UiUaz`|suQ*$gk@m~k+o>_q>ywZtCAFHoK<7mCa!PC)v|yoqB3Zeb|J!L#sg zsvT0u6p%u*25#?sJU@+I3$J$;ihb@#uE-X{f+2d3y-@Wo+ENe;hIt2f2zR`@w%<&H z)1f*QB6z?fSbx3|_WY3OMGo1JlS3WD;KBz)rc44l-53O~>_e~#B&`{|<8w#!vmgOP z90?=CEM;bYTGGxlY2~AN_gDvZ)HOY9IHXj>0;Ov)9;1V&f-GH+{o%;y4NA~+r0JMB zLU#=;(&kW;Zh~_AF}dar|l3hQpI|&YOF`eAXy8y-b}aCyK@9wOv8}W6;J;md_ZOkX zw4VK`5X0ND0j3V*owZyj1`BDSRo0^-^Xz8C);KJ&?C{C|=iealfBs+m*I!ZDt!V8) zyrJxxkuJhW(Gy;bZ!x)Yw!- zm_4e)cy!mnWJ^|Rps`#o}o=bK1B#Jv(OW-hx10%@!KPf%&<~l`YYSzVoe@*j+z;Ic`LAv?U;9k z$}yWS?DcyjC_zu_X!2;9Z!=rHFOzHV*$qsKDt8wUj!6^_>cfAF3h0f~vjL)fl8W@8 z`hmP_M;0L8zd<4IPelN#^g5jHXg0Uz1X%fXxuIPNjlm%|0LUi#Xvg@kg9Kl0&}+k& z&5uD}17b%oF}WJ&tF-~{2k*06dAlR<@-((ZyQ=?pCK8ijkY3Rn__5J_sl)OOlif{v zwyUwaK=_Qc0e9TafrhA}9u5hq`a(!mo%5$7R2)=?56J#2m9pro!C`_*(e}$>dLM{r zt~C*Lp2K-+hm4t3Pv-&N1vk@}R-S$c109cHTDxgVO8Ft8ll$kRrzz}+|y&AiuC$9*-!t!!8yG9CTNV`H1R z_%dXw<~!uA1@4;{J+hFW;pAB(4ZWy^pG0b0y4bGSRW>+%viJ2C(OWFK_boh{C-Utz z&i3m19ou{JqySw(RP6@`^pGFdnB>>Ipz=P|pns4dp1Mh9k$skG4H z&H8WZZLxSI_h*1T#bt2W>%brOeq&$1kYrT+j{2-rx1%#lo2_{7jGFpv z>N>hTVPyH9*u1Ce*BmmL+dy?ix-on#nxw>O)FzKthM?Q6f^+d8w6`ve(PKC}^R9w2 zVCYsD{#M=*>3pkYWyJ!KBd7BD>+mcr0YICKtY z{xGSIDBwbwldDtHXSH<7(~4LDgyxo0OVk>lgDmHDjDCs7go;B(0md$DxS&RA)6ym z8Bw#O^eFRYcxY$?VoS%hq+2`g#5Ip@mQRBLC(0&FZB0gRPa73CaU-e#ViKZQDC>mQ znrOVhnYxVd?YSo>p!IqxncTnah@(z zY1pMr7d-RSG4eC+C>6g9;RjZisjxa8J3fxnEZu^(t?}-+i~K7W=#5Q6_rbl(oIQL; z3o%V01w5KiFaLN@fFdG;@#WY(tp_;j09W^u?u*r-lcC;jxikRben{-lDcyFbi|0!v zF%d%v+DXC6I4x4j+1I{{N zhcEkTpTR#{(I>Zsz>baTkwbTUArPCbXRvUu4N3DN_L;Z1Lr)Bb+@3RDPSOyVHQhu@ zzJr-6-kP=*1(5+AQ3gURtkA&bgdrN5_26HaWg*nS3-I+Dtpr!Uu2{0*c7T;bENHOt z-S2j2O`BxrwiGWLH_4B}--sJ;7&MjUvhDYCazKB8s9NrMmIC6*!IzV)pqJc%*@jBF{Cg+MJ2 z$(xe(p*v3rlk35u50n`1PkQ5`zDC1>`JIjMi)~`lw zX@j6A3drd+uM12TELII?+yb7R&7qsxka5GL0jn-LM?9j!Co-ozgjRvTZrZwR7RiN9 z4D!8rmPciJ6K?6~6STSlEZ(g<5+dl&`X#UcG$)RLOky^#)a}Varrws?wUMdzb43Bx zcpBz9n+gR00^Yl%5ky|@@YEjcQ?!R1GlU~trOVoBg>j0UM$$^@j*xHXZN%NNg zxyU$2T8eV8{qP{8p9HfSbnUc-UwA;JZiKY)NA9*8F`&%a}hzRcT4+UJvq9rbdI9VctxX{gFZ+wKq20X6Ttn_UfL0w0Wr z1K~Af-fgkE?vJ~&Sh8F%e2_`X3#i1=NTSty9b>Bt*fk=ciL%YkRLOSAA^jo#v2gq% z`KjhySsbqvC*bR6IHX)&m{`0K>in{@M7ml90w$ses6JeMkcW zAsk1l`aEt$1Ik#JnuOl%_t;u#;$zIDp?pywc8%;Ti{cE9(Ulluxi!-f!RxxT-sqf^ zQXg}Y5BlR38@qR7^*J$A>!8ub_bJ3>59=mutT-bsFN}vI6);k;G}L`QU5`$*pD#;u z9dy`AGkoLrBeX(p+E_fw5^#bg$ILEenGc>n;tm!$-i8U~R2~&E!hu#Jx^4lr+=GE* z4$bY0Ew#>1?r4=eBSTVDUNd(w;Jy?`$fe<=blZ%NAl=Fqjr- zOStfrog)Xg2wdH~QTdy$wSG2E|DQ><5;RnLedlZeqGIQkLGO%YzAX?`3&)IcB6^)9 zImblSFsG@9Xp#FHt?>IbZM5Ki0U3#F5VD)?KWT3fXl<>8VUMBuoGOgU%<~$P5WCX> z%lS;Xg$$ABv?Ac(r-Usy{^(rZ(r>PP%L_7@{Cc2Co2mbi|Gq^-)sx+Aj`{IJNzuYp zVS5Z_R?z6>B~|(7eyCPS#P;ZK_GTRj=DF`U*iMM)c~4TWeKTN9uL$Zm-eK0)T0ffU zQ>efo)K0+fLI_@#YWqlM0)M3&egQJE%6%mZ0~4h-)=H&C&S*Qoz0iK zNH|kesAtQm{@u&L4nCGWbb`G!5PsS6S6i9s5tPIZSR^_x{V!p03>nxKJ=;*r5@EK$K-7BvlF5}BAf$)g>Ses?+p~9H9EMVH z!fHbNK;rrQUZ-{C<{UPIa?~iBrbrUBQTCi9pa~nX#Eu3E-FW+9$1`aA$f7;Of!&5G zHQ!SJ+3hKuTy>)izv>Z(8^`{XLjR@3OE8MqdL=HHC8^z?wvic9lW%J$TY`?(z1st9 zMvH1YCo~pS2?|BCvV38Fr@~=$AEg&*WGU8l_s$CpA4fJxv4S3V*WRJ3@aBex-PLXu@*ST69Rc?o5imMj(W5w8GeTR)|1tb-OsBjewg(}{7ir=jxIhfi~u#~ zD@a4ChqCCt!pjJnB;6bG>g(2P%S@Vhq9LG8Qi~~SE~nKi%{8vY%~{+L&j8+54%W8? zwpLsLjnZI9^cq+-U}(GaQCTa>s#EiT+Mh(+-&G}Ia_C!+JNA)6`Qb*e+`xIWxmh+O zo!Io0+GA91i5djZ>#VMCokg-h&~6ntxil&e;-IF203S8!VUiUV+%1+@rZhgmKc_S{ zROycJ~UFV=OJ3H71(_G1V!vXqQqg)ASnb#VPx}I3v zk7BVtA>kK4^rac!{ZBAIgb|;%f8mPZKUOcD z7}`WpRATs*)e70vle%pSx_DYX&^rN2f5vA53ZC_HfWL1Ve3ouG2X;&z(^r=ldr1uH z0&C{esEHY7{nv%dH*v8P51~4%2uM zF9FvJtlWX=SipIUnjJyt%+=T>5E-)epYzYBZ*P%R3I z^0lig#;XT6YsV2`MJeG&8j!-WA&LpP73ON|z#(Me5AbH!{M0_R<=>uIfcU@X!Ito_ z!f!>IV)F+xyP!diROAw)^J>YSxzCY?%UVmiBu&ToD|s4fQwJlM83dAcMa3xf@N-qi z69crt?Tkr*wsLP5m-Mgn9qfw4_8>ENXnV9!Ks)7=db+%3G-fCW1FgWV+!sqm~hI!C3hn-43T z>mCk*xL^+WEwh}gw{ywF2V!6WV`!Q*^#*H9?Pb6=y@MM2h2-ge)#tiS4vU3NY1vgPb%8PB}! zy7U%RPW|RMSo`a4<{Yauko>8!Cyw1v#vHT!$~BOxC5zIMFw%ChJ;jXioFnwdEav92 zM-vNikm(;Ca{lJZMIHGD#%>bH+?W6xy4Go@^mcYu5NvL;7O5tu41yaK`ulM+@CgyA zqauc_*VRCS1`o}o5NWCb-{8$Uvz1yb`O1IfniYYz^L#vfsj##+R4UCvZF)F1Tw1#4 zYhzh_VD12x&rGZadg8vdtib;Uyql76{%W^btawg0{ zuY3GNkUDgsGMQX!El9j5w&b0#8;tNe=5R)jkM6Q4=fUR;vW+K+f}9cAS<)o@wOwJ= zY+TyhFEliDp^}2qGa6zndt+efP8K6+*zv6fNrL3-;}}$u&)XUcb-kH@GNSghd0;kK ziwe77ljp@$OD{V3!*)#v%z zsjBJxA0{QxB)$rwHp0TbDU>Z0MQUop5OChk0Ufw?4CtLYfw*B*{YW)blox-J| zld~NGw@iOK=0W9cxl9?q0uvV|IXHbbUusZ6(L)aC=8r^4W_Q zIw})g@7dOGIWbFAi}CfKALBICYgs?%@5uSBc?7dLxVt$YckXA(NQ;QCK{w_EFZaJQ zO+XUi7X|d`WN*Axoy1MX=+PA)7ZRY(N6hq^Q%HFc2&%_cG zJiJjfXFU0(&%=FM9d9!>^NWAo#vyV+I0Es~mH`GP${+GVyE>r@(lUi0>ZNgq zlBJ^KlslVy41^}-?IR1pYScogP^zk0d-j+;kc*ioO>bI?+S9Y#hrp!|KiM#{*a>3Y zJfgYIi-Fp@Do{Cca3RFQDcil==svvT?iRWJ$^rm5v&75GQN1CwCz%PrUZrRpbo*6( zAaqs21iS`DpJT%kM_dGhaDnD-_)DI)(?10LDPfAX=zl+@l~HG5FK&@Ry^MPhZ0mQp z%(Fo}wm#U|@ptsd0{#PBvV?_4Mt?acr_%yff0!Iq|I4hF% z;9qO`zk`9l9ALrxk70Eg7uKU;*oqnknz=S>CP|8$-Fw|U4=*Bml@{V;)4e3x3d{o9 z`K$_eK%5F<&mPPtuA3Busz=;ULaZPK6CxyyOoE65vs z&`^q!&R1KUIsH;{CK+o%Dm_ayzc*jA!su2F^JxF-Mj?*IuneMCLYI+c}m&io0N*r>*ou#^z9%DPNqY9BlOZ29!hl~kuO|K@@A#1nLBcotUgJK5CV=q1jaq-V(35UmO5jDvCc9tOV->dv zCAVU1D7ogJF>Vrn*qBt|>PtG)HDL(-E$QjpCE^CRm4W$8M%ONjz+`}~@@AIA(vBgO z^C~L$1cJ?*XLnN;Tx`Udf9p}!0L~>uX_aq}1>IWmNI;YY4}0Xk%(II^AC5U`aET<- zq`8Rnm5v*n#?>X`?%w3&v-7!Kx zZ|VhF2G6aYG$kNK46(6ZqY03+4xHk-_7xk#WqnD`XuU4Pe8E^52vnX)RkD7edifX# zl^~z-N~8rvRlre>$QKwGIdj5R7&b-bgTysvJPFFkHk66v<=9iq@V33W|M!B?FLDbi zQ9C`CW~A7BbPpeQLtMeI2|Yp(C+OEX5>ilGM(x1XT|_E$a7MfX+gk=++;uG$U-G_1 z%8w)EWZfp&=Eg>}RNh88usv!>5?2h1%FG5_f^&;<1e^WYX%e5fRDzP4$!8%;(2Z1_ zp(>tKm=5T?kRGy>eZ>3+$pLMy0V5yKli{0c7$SOAF>?5)Ep=bWaw3sx6xqt}tFq!C z!ZK}d#6C0FB_MwNVz}3lOk#*|5qPcu18~z0w5;@Z#j#Xl2-0IcYiRV_)4DI^c@vt$ zfv-JPqQcm9d*h-}89$PK7GHPX&r%J2vJu;U41b2RU_odSkma^CT5^QR&d`!C}3WO92g}VpQ6ba1MaY_h%ij@3PmR?tAo^N3rK${$hGwDs> zIX*NLJDM@dG8{xnBmbTs!6mPsk&y!!_s4@Kg%nKoW%u!l5{%+!)iDGwseq|Me`I(? z(v7BCtItcv0k2`*$_E6VH%rpnf~ES*ND3WW+HM!6I|BS<*EVnrhYIhHKriOXQHFOb zbkCRI9EQKH3(ODN*{vh-f7ErWn;A01ws}S8&cDZVist|E185)lwf zSCv)-|A zje2q5UjK@VAJWhglWhnKNf9+j`)S~2I$lF5H~VnysddgL)Cs~_apI*RM7$3K5pdV+ zIKsw*QU%{EX&Ruue?5SKoU=W)^7yUn-2a`G-*q*RSM@ZxQ7Bd~8li zJL+XW9ek?}Q-Nj;A9lSDrMS64HRvUw5Pl-a0Wg9gmJ&4p8GC+0MmABibH_M@|g~gDWz~;gm zV$7Y>EY6#qs(Fqxmf4Taoe~74pmw?}v5CGAE9EYgGj$H{R_RLLp2>a={Xs z9ac-oYY~9D&JJuIn&j<9*^jC?^|quN5iia$%;db2X8gQlNS)@S_W3g+KDIKTMtpf?qJ3i^fRV)dcVbsF>deX2Kc zT{tb5I$#Kt#Og#V_4-$y5%&<3Wd%*~yr*Y+1`JIS9dK}R^py>xS>w9+8=eEw$lf2v z3A{HKwWGA^C*LO1L0^TsRC!{~t)mS}MYwUWT~OObz`Uezv6yk(*x{nRTHJWG^Dx|| z{0xd1*VcTr?0XwhI2Q@w?b7Nw)j%tq&?F57=hT`(JtpENjXLCr#~Tdmzq-&g@5)2G z;ZBtNlSlSfnf%X+^MPZnPV#MQb~8z^AYx`(m$C&2^{0MHAS$t2QK0-6LVHUZQ+BgT*J-=#hm#g-4kMmk`MG18k}LLc?{!mW z%9gUeNJ{xJnUbRAy%u(U&YI+8ylN{y9&;9YW?>mzQ%097MOb0{p8D>D_HPOC%ZG}_ zh}TQXg-sap9T)pe&ff-@#vI~Ck;)LAK98!mRALwLhvdxvof^A>O(RUaEy6JyEcXlI z84j}yhJ?aPIYqXFWrc4* z7E^v4e;ka_i|k*}Vn?rfI4Y2Cmi^?2IY{p%^8S8kIsyQqQ_%`-y7uwm#(bN9I` z`0DcWSo#bq;Q%%?6h0|is}?`&+p9HD=QzyG2iS%G)>bl&HZtu_lH1vo15el?xqFufh{?0R_s`CbmB z4~kdXNM~DgvPo_y{4`57lQ)XdnPJr@6gy@lM2e?fFM=DX(BDuHu0^y;Fgk(!=$-Ym zm5WS)3(~5|xtuMBt*GA!o0V@&0GIfAY4!4oa#b3fvM=D46l9O=f0gb6qq z-HRS_`BPE*KQryOrxC1oUs>b%<k?<0l|H!n zg1Vyb9^Tp_8N2I7I49m}4WH!XW9fO$xUYR3jj=9j5}QJPvGS2%ea;9jal-b`uE8vx z+_?4%51~j|R|ZAz`==-PuNLw*N5s4cFl7z>9&i7xl^qeSj+a{m0O-~0LINd<-4faW zHUM4;$)B26z$@%CW1Jl)g3Z%iU9<*U8Xq|$W)Q^dPTbJwB`5iSg3Q}J<@~eht;6c$ z)InNps4;1)_23ng6l`>)TmBqYm#1e+i%ZOUuK!ki``MnaH~u=HQx6J<cfm#C8C6bePzxdsLy#;{P0OR$K_0w%b?ZO=`*k}`{%vNX@URQPyeURO|BZl`$DIe zV!Ko`zuVVdSzMWVVmKde=cqE(4^^M)25|BQ&a>0#z2XdG?X@?tn$&sOKIw|A0;GH$ ztgh%<+dWPi9Hd_58hO<)`h;0Orm-feK|(ELLi{Zqr%e*l?t{}lLt}zYKKsW{V3#Sj zyG)AEu5~!L{%qgdC_aF%sE~i`ID+DDpwFQ!+!60bB}MW|wIMdHH}Lb+-ZBGgqQtdO zKlPIqLcw6bEYcx9dah{syH+jPSbj}-GOV?9BrUqibPcY9*r%aT{SFmVf<(OT{-G_< zx?(W&yAH>E;Ww;aLlmq8qyu?Pjs+T!FX@W<&H%$s#`FWOy}cGP+FBn(E{gSy+&gQ8Go~tqXvth`z8=OJ$>e(cmR)dhLq+) zD|rUsDDClB0gJ6pu9y3*nhjSfc_#CMj{ym#zazcpePlPv4tyLHL%x%eh=6_>5l?#F zsXH4CBxlzF9fvd#a`=gefK1EGR2;*x?F`f+QK9QF#eP~Aq>;UgtTSsT%EHgOnVKO^v$AL%Pfe?cP8Ix=JlT7>1shjxL|Hy z7pg6=hG+R7YZ3ZuRjZw}F&TILcF_N~9vGqU*1l-_y0UiWK0X0?`{b{)=QJuT!*7p} zoV{(tB6xgC(d-}!gzLn#?-y#ie9gkE%8o|tp}md5Qc47Fcp5}Qvj{7vKN^1ivx47$ z&W)mlu}J{+fRv6JcgS%;jH^C7=*Vkrz&gStMTv$>C(sFX*!d*2;`=))-W^EQ3kCA~6IJ97Ql+&_a}Xvo`62<;NGc)$A-zCp;SyJkZUn7(n$aDm#Wb|KnC;dsj@xV#xe6G#j2Zv zV0+qTa9J~`)^wsO z5i>4-XYZb3Ax8P=!^e^ac*EQ3Ki66d31;49V$f-|*7>z?y8~Cx)V7EdR<29#iTyk$ z7$Yl5ucL3!GNP53yqckWEZOnIJ%`8Uuq2r$_!^_SB*H!odGPL)Km5#^j2-L!JiFRM z+WTAna8@IUGtn;E30XyHOnS>M(EGjPCU-ACF&fJ71IE8}Ao5bHDylj{rIa)V%Bt#g zk(X2$qNu7ffT-ixi-}&YA#*)JbleHS`j6We4rO8RXWvk0k}<0AVhC%GBtA{cP*vLS z#HXsaPztY=S_yzhnN?&_^Ut+q>vU4QI}Tf+ z?@4u4Ybj~Jj}5S81s4keIWms-c?SS)NbKbBjJS8nI`PszOtT=;RQ_R({A&<}p217a zpfjBQ1hIq&O*_TVKNr%*Hz?*qv;!*t6^syuqE}6vuSu&vax2esQN~?kY$15`7E30f zv;*CzhagyExt=m}JPLYjiC{q=N$1jWFqq{UMj;d?kt2T- zguingj2_~YjZ9f>m^LFrot-Jhw7&{6fzw(q84*8vH zFpZU%v5}35JBN{g*`N$rEUBg|!@PGmq={fNLBZC!3XtNH(pUxV>z8kdnUB}5-XF3D zY{DpB16nr}l6#Wdvv@7fQCau|e)1Lmd;MJ!4dU)Mmsd7j?7;b%3_WFVuvAIWCQbaO zqI|cy;Yuh4l1>(7;B%R76}?A`9A2zo*~4nsbPxc zUI~2JP~hz{0Lwsms6-nlHq|zPenoj$5ShdkkgcR4(wWJeWa}>J{`w?%Ss)eK{~uMu zKd{fxddgA!u~aJEVPeaYT_m=DW&m|Y8RL1+G7(q=@Y8}qW4eL7@#*@z*AmsqW)4&e zkYvRWVi*!73k|TPFMi+pv;7|+9x5InUL`5_UQu~YKt|2-Y6<6rl;RdTX+A;7DEc;c zDBXZKB3=`ydE{!KmchTO?c+=c@cj=hqlDR!!5k(b_U66~PN!3g+H`9Y4yFo-?Dl*Z}>%=qb~=7Qk<52Y-=2_fX)HHhx} z?xLS#dgXo7l$RvR-!ix}kS5@L%zbgtwqdI3fcTn~N009kfQO#HTK&PMZ&i-xeRRv} z=V72IRz7Jy*6o00=);ZP3nIsN~>#L9mjsjGOzJbYaeT|J*q0-!(ZPp0l>!3k z+Pc;%wMk$svAeuflC0W*{9yf^IlHea2B}9pN$t@o;l}N<$M)OG5H!w<*AplV6>1-F zm!+Dcb(GK^#IyG8B_j!Gl11RgaaYq|SKxe)4NnoSQI3zJ=i{0!oLG%729vu=N5;{= zSZDtFmZ4)q)nX1~$S89_XIv!c;>(xTD2a`!fE_jnsyf4zkbe z*#dJPO~0d4RA_)0k`D)JYd*IJxi&y#i;~k>@eSXvC^xKpn$$v-fmwjEOJG{)~zdet&unF{m#voB;}I*67w_T8V}B zdg^|MgwOMI6b13p|C2!kEb>jrXZe1FuQht>Mhm8$B?0H8Jwc^S2*f+aI`UTHUiC%4 z?|%ONxNo!O!(fEtT<5xE{`K%bTv$Ix@5Ish`U0$yng3+*5--()zcedLn1;53$7UR2eL8hiHd#)F_DO&K;AH5)umWI#qvKGIzc4rJank zfkt*ax!Vi~lCV`6+Ym znY!1V08H4v;=8xw)Tc+suEsas&e+iZUy|)V_xz{TArbzp39ra%|YW^<# z{}SAOCq{kLyG=y?$JH@~s!U3+nWUj_t-yePZVmY3&-ia&_!H!hA*&65Cjo;&p^I`9 zal$s;LO8Pe6Hn%!P_#eXgMn6f_0y;cq~H71em8Pp)Ru64pLIO+o9Fl%%`-G^I?0W;~u zC4|UWkf1~i#+btep*<5%#|!rHt%|D_;2*fRvx{F6{pd7)Vk^ujo`zFOs|jro=)$Tu z&#qm56iZD3(~X*=neg<7=H0&r?B7pv&TZ%mtpl8p3O91yNL*u<6Vh+f#T@B|;@AoX%sGwlFHsY8!tp)^q#pe!5Mf)9gr@6#F{ zZ!PmAAe-SjJ5jZS8IB;hJ1+Ie)T2G$@Rap#Go)k=dcOM}X?{jNaCJ*DF5J$8W+9rS6fdOSnPFYB_T#+fK5gII~!NniTyQ{~po`yKaNdrby;k$e! z7ZWo9_gA|R{a>Kr&mjqKc$Tc(E26wUGi9=%iut~PbFFhlQvHs|PHf9Ow#lvjyCQ); zB5ksFFjt7LgEWS`&YZ250tr{M4}X^C_YvC8>(<@gE7PV0`yGUL-VV-rKpULxg+nGKx0) z4$G8a?|)SM`&8b-ia;LMp5;LNNCAm{Iv-5{@3s6tWzM3V~I(GNXLG)^&e77NuVHL2XTg*6qck+Ug9i&k4#?-qSb5kx8yX~&K)*?G@0t2AS15MJ zbANkhP_R3EME*~UqnYqy2nAg|10AmZ@ZW-+zSHle{?Q-o5ZE4AjoSvj^s7>{dnq={ z_UKYLV(~s+!D*sB0Ud%NjB>1KxjcFw?q-xb+CB-y-e?{wD%m()uN@Z}5_jRtk3fP?S-B54JMCgdPC$tqRwP^S#hA~* z-xYQPKsij4qCi+OW``)e?=kYhk09(IzA*1XW-s3xt&G6#HwrA7oCmJYkyEu`^t09Y z*1o^>B*|lPbcq=4g4C9+Dttg$syF?H{Y9PaL;xxFj5cqAnfF1gZ;U0W{I!e*tA03hbIMl)oNz3Hh$a`8Li+X+Y z-|?@4_3XA4J($5X!a-z8<@5z}ljMR7zK|sQ_e(25Y#dpb=F|?#KNn}R#S4BywlK!{P{EB4}p?{jM zH7+&mdU7Ccsl7$JF0=U0sSH2O*&@^YS&;t2w}02G5)b}lVoH7*nJnw{U(6VpT*Wx4 z{R2n(E8!v=3-Z%nyj@GX>!sfPe@EV^B!rjlge1(!bL}ezoNdb$2RHY9MIDsjE2KJr zcIsk?(7lL>cRNz?HHAM-@47ht9!td-`yRxZkzXHC#J}$!6-g*{xp$567XBbwrfOt- zVyfU~(}G#VIbxwb`+mzn;%g)3FLPyD+U240hunmwcQ6><=sY}fM=$-#1)Ifb=`#`i z1`#+9jl1T;9wtcHoPk!ptsIp2&sVe~`7S-0b<=JQysUW?&--+X!d z8jl38bu6sKyA;Yg6p#E5dQ-Ku0F+=rco=^8ol!F0(L?a3lB&Hl`Ds8}=M1Yiy zRcWGdF-Kk#%Yr_K7uyuT_2$wu4Z}Y4R_Ng8&*VpfYju%m$l29aNvCKL{f!oXS;SEZ z3Q)~}1jh((o^;OG?#6nt!cS+O4Lx20#hu*mXnf<90|$cj4Qvm!YNZXR?4wgq-IqEe zy-z?f%W2BEFddJtZUpGqa<@#@A(cxrMC>y4KV#{CL?%^yodWvZRjVHDE(}?Kmmpcb zNAl<==BzclVq=%9P!=)#ckeKSWSD^L3X*MP&Q8#;c`0a9<-uzC*{`EjNQJ%kkIg{m zJEcA<*$ocCc*lQXOi*M{E!F!L6j@+YoPvBZMaFpbl-N`X>Ozd~Q}JbhU=Ts{TXp<6 zs8dD|>3L2Wajdj{9I9*-&OuTMWSnh-BE`1-=qf(S{fKGJi#Fek2Cl>~?+7m@q|&Qs zA#Lw59hxF)yP_rTsUk)*?P;7_f+6`HBk{WfA!$s>pO}o*xe#$(pyc^KPaX{ zR9)dcQ~t-{&*CaQtMTz}@bBh>pxLm$IE^h+uv1HOA%|)Ta*`L%E<7C%^P}V8G3HT!^a z8tMIcvHy#+cM29A>bkVIZJlk~w)fe#ZQHhO+qP}nwr#sl_g7u@R{vjL^q;F#Qk7a+ zNovkD=9o`jsMq9n7dx=_bzEIW>_skm(n`<9@4v*)6HFAg={cEy23M4>{>xDqGyYcJqGxUpQaI12#O; zLEt-vwM6ftOCvjjQe6$L{^KfenD-fb;QlvjG!{r1iq}0xye-6eftKdWCZtq~+#HqK zR|2?$)<}N>dQjLA!V~L>f;~Gc(bEgzFSQAP{54cub{q=hqM1t=&1Vi>2e&BYK4eF7#ymn& zTBfL`&ASyn7d`s~8`*fHhbU0W+ou^?jT=eb>nF(VWjn!e(i>W09TXv&YE<6!4MqHn z|2Oy|ojDZuwE>rZz ztYAKo@(f(@!D_@Mq1sW)&(q>fvSW#~J;yBw=r<1P{D=`}yhbk*;=fTK&7~bBa3kKu?WiD_!U?idA5xKj z-ML^tF&?nT>GTblRQ(nOjS@}1xN&e3u=31L4P&lRE#l|m-vJIjqj6fWn<>LyBnB(g zLZ8M#lk&fa&0tNs$?2caR;d|!2HO>A=6!4{%iHo|APQ#e}lX0=vp)xzEKlT#( z5{v~J7WDceqEOlmb;G0N+o>w2=lr#wb8i{i&ID^Z;Zq3FiKiU@@K5CM|Dsvs{YmAI zo$_~zKFGKPDBf3a^pupL_tIW^!&4V5h3idR^T(2{xozbsOjk zDsRI?E_f!$%HqzNq(%Xu%}2~P3fy}>2!^;b=F;ex_zzD$pK!h<_x{ojihTsT5J{yX zhx(}a=;v%8a#KTyh6rC~KbVAdQsQBD^O5?RN)`}=00qI@&ccq@d74QR6pcOw?ZvB(EiA_yzbr9>w9Q6UpStHUL$sc9yOflvDW;e7k$ zlD%~joTw3O%=~jx3o@V$>qIoj^=#^gY*>~x?gWan{wZawwCWfEEdUmzUu)YBOczf~jBge$$zJk9oePHYZGqHh z0=P+W6RzU)-BqcfRbVDpv}uSsl|7g2UPAxSTWzkQ;Q&|^iGfP_B1$tXK1YGp=1NZL z1hphKuo&XX$m?8fAKG=;=tO;aQ(mq6v^LY-U#K&cwH!hKs%54jl@CKnnr5oDkoU&?vVnQd-6CI`c-sv`!aGX5%uyLm?hDfy#{JO7kppu7#b$fUyhBAg6}DpWmX-9iNSR_wTGw*Ui~9 z_-}r42;l87PMfD;$pUIM{(XPPg|&n(`-7i+W1O4|llx4j<5v@}Yt<>{-ec%PD3=a8 zClq;-7k&mp6&*Gy2+Lv{@$IZ(B;W7y({)Puy^Vq&{mENjiV zLi9~QK#VH*9M|9d!1 zL(QWK+s1`jyiKXLCWo)!Mm$fZ z=0eufNYI+*Iju^vR|mQ#iTT?}51~BZY%?sUq&Llt-QbJPtbV<5>L&?NxqKI@Jd(^qs1i zflzSX#Q{0sa<~{`6yedCg<7DyX`ng}EG=ZAH6gfvSn6v8R)loEgw=*6HFSg5>ZQ|$ z>2N<>j6fx91TV1JFm25%g*Hj*3ubVc?B(hUWbhf+UjflMIVif^(i+Joeevy7YEH(V zK}*>^pm9HL^cV}oUg08hs`m?&GgQ`ln5NEKTFVydT@ZdpM9{UF5ga`R(T!#iM>3G- zqiH%YR-TVQ_M-P$DP%!8DZn@z5j3Q1a zkV6kwt$ctCCy7S&rJ*_MS7X254MG2@cT zCaYY5tZ@kf*Z?XZO(&WLhkIJdoFm``N;G)uU)CkpI@Jx`(@IWYKB??~u*gmqlJ={w zp1WgJcjPqmm0=jfksK%8)ER^#x9VZanx;1(zVFA7mYs{=RPLIb1=PCizpo8n{aY{h zXZ?L@KgB+=VFoEp7j+G^L243dhhX=kynQs;KtZpRT-mI{2VLCf4#40&b5r^@0tNKKM#8AZVde&e1(nU z3kt2WE*c3`AvB%vc;;kl1SBT!SCC87{TxJWG@Ta!Zn9Hdgav&T_kpjf!q_Ca2Hp-YnMf-xlza@`x0X#N_F~lWBMCqL@R^4 z$+Zz{!}3T{j6$JJiTOFJ(R&aX!bh}TFfCrnM$E6Fb)~$F?$VG+ou~g&pIyPk5^<@0 zL4+=}gU6i{pEw6Fl1qXTK5=rx2Oiq7oQMve{H?O@1^eWR>k{#kH_6N+ZQIpF%@=sB z^Q!42ajS({YHf&t1$xUpXUu*ccZu8Um@Zm>FL(@Z1Fic)7Yzz|#NEgNl%Xflt;Srf zaborut7}Qp{O?e&q0`{F19UZ0|8>-C`}p1MEAa)WNYk#H3l52v4j3<{BaKZFrpFDDQ}{^PXC@=5Q`j9wAx;D^ zI@ze;@M6rScIGwuhb^TvYwO!5IijwGgD;^CUPP+2R+ga25Ctf)%O(#4-NdP-CSa6j z%{_9%O25VKT(b1M*=v!EHW@h@VQwhwY)EQ8N~j}64kJ4N*c}cjZ^;eGIB7uIkJwDC zs43luA1=HV&C{Pqw6c?kxinm z+-m<=Hs}_-8O#bQa(Huy*kSFP6wlT~ym;iq>bY5tFwyuV=*yU1ds+b6K>w_j?Qv3c zRgP{CN3)3bIhyiljv_|a=$oE$N^SVFuf+M@R7RW4p@O+rajR8Ppy z%NMVJd;4E;C0hB-pC&cIaBIm@@fb2Dq?jBZ!7Z*PwFIV-SkA}+MwTA$Zn(|QvE?Xt8$C2_8{%st3 zSGTfF_XJLY;iwj%k_e`y*;-u+m`_mQrZ8dBB(lR4C8&*51!!tzl);P|?9NWp0OD{| zR*nI-`(qpveaqvhZZ}(X#I?4pG(~b@-7a6txED{_p_%jMv)5Zd)7m22PB76$BuZ!r z6HZejZCpN(%d7T^8;woaLaMmLhoDkXbY>U9I^MgHY+@l+Q{o}Y!xUGx{8F)Zl$MzF zGJ>-i-G39jv{pe%rOyrQF|d=R1LGxQySOEcNPRAN6Tmme*N|w#vOSvIaI8I$wG2He z>Nk_u23@YTD-)GuEuaBr61nNN^b{GmqEXfxFk)}K?)N%fXi1)J&0!o)5I`BW%7K4z zr&{ELmu%8Ck_WoH3MVlsMKg+W=gBSKHd5fSbgDbFwdFd&oNlwQr_hR57pc5>1?T7_ z6cRb1d4=Z7fV0RaD|lm5gq?8nrYcD&(W2Cm-4VE>HQAVB!_l91GHks(!2GLegryb0 zmWqWAH3$O{PX*O#OXl}DDjDW3LV$KV4;v(w26p2##QFo@QdrT73YS*M(TuVw&mn_J zOpBsW<2BgDepcB=>WMM3LonjC={9E^?$)s4h61|nT1f(G!kj}_U@(OWL4y>jBXY#W z-Bckj6brI@wt(YYH=e-kBolP&E3DP6>Gi^ORzOSgOx%T#P1Sl{N?AM>P|p%e%={kSbg4x%yis_u@tM6faV1BbIjBl+B>vYug?8=vq6338#RZNIlqM5 z-0-B~&Jg^;zvmnnw1LM{o{f{_%?aS;oTN*c6`LvDQs9FGT5o;b3)Rm(0X5gCS<;-( z7J`9wr7kI&b_7U=ZoKdZMwhqu@BzNS@LTDnAQQ2`?^pIEra;iJcRAR`8GFsKk~0t0 zoOoD(iEhDPA07r@4-;?9pDIL6%a1}nO2d~E#FcX)PpCSqp~swNUcj~abEw-QhcT2; zi;yFx;oXxWfH`7Fnbs^JVPw8|GkkQy)7!T3*5HY9V=zS7i;UANoRz6Zlm!c$Vh;2} zG<|-Iy;v*i*2}CX&~w2VP{&6F>ewwpkm*`56DDZNCjA?!ZTJ{n7`GoNH1#WS`y!L6#X!tovdl{-fd%VJ2 z9k@81Oir;NnN8%0N|lrrdwR%d2^oO*vh+QON{*&U!Uc=_>G z!q=R}3X{2jT?0thsq?t^{kg2RO1dTVB}xV0L6i4{8+*CX^;d2xI-HNX`vGXH)J+Ut z>l@GpMXWHo|Dkb*uZ>G!xQdY!rp~7eMT`>9iT5{zsVV_-w>!N@4%r{;Y0UIz_Q|r& z#29Zz)(3g@a>#(f5tZ73BdtZxV5Gy0Ll(#1NZ2?-d1r{~0oyX}$5yX@`ReE*f# zva&3V?A(la@2);*I!yQvzM-Q}q}r{c|EE#2^r=6m^wA!W2K9@eC_`Ff!2V6uD z0AZ|&(Xkv9KM~|gOHFD4#opHCY3zm3`l7~Ie|!FB>A~m`mDMg%j<2`381XuYNps+G z%jmM!@WzsY%6LK9TBP8CHipV50wpjM9D_@03-?!q`!RhVZ_Y3?)9%k0RBgBK@Vudj zA8>E-WH9Z61?0WvNcojI3pO-BB1VTCsZ&Mt@Ung5m#JYoV;XB&;W;p@NY<5gdG@u7 z9W@XIr;#7*ZZE;cZYX>72iAHUd0|XprY?V34es>Z#&%6&;=o*EbEx`+d{ssWWPQC* ztIb3<4kjC5v~eOsfXGtxQ+DR^htR6Lw8Ja)7<6)ZK)0FrW4zIR>XwP3=zD2umOvW& z=q5UKCJjA2f28HyfXtgkSVnHPUoLcQzAd3H=t~0!1lOG8a{E;(1PZ+{Von2$FAtBQ zg=#Cd2JgSt-S{r#m+!|<_$anmp&~)x?v|JiLC1tIp<&)oBqc(cnZ=3byHM@VQ%3Ye ztP3V{9eqNZN%5L2Uq5{psbn^ybBZl+TITjigotCr4UdniLcbm&XGlwV%j^)OX)K%t zMBFAh6%oTdx)wP>GQ`PDTktu62ZRdJn9eT{wQUdzOqfBYJajp_q6-c?5nz0<&@WcF zK9GoYPTj!Kges3*9cT0&Ol8oxWlvB#Z$K#Z;9glN>}w$jnHw9`JOyXO3_pI&g_MeL zr`M>XEuO-(;$Jv<9UvQGJg`=bVh<-TmDYGIMQc~y7Yf6m)rUpTC?&9Qz-J}7egtux zs?ftPcGGIj7{AEY*5b(AC%vZtM_DQBPs=b6m8lflbL)o6-8h3j=PVJm-(UihXL$Za z{-soA#+uQtQvI6NUE2kfNDIQTIls@e-?|qx#U;vUWw>mpHA(JUuS}fI;Wy42_v_-rpo`ME z@1dIya_x%sQY8V8HyK8LtD9w|Tu8#Rwbt;8(JXE*WneLvNxar}PWpk@O93v9^5Ihi!jL(6|KuZ~B0`6jq{xb7bD=WeOLmEo z=a(s0SOYgBnf{eK_9Q|2kpIlb8KX3h7!|O5xMaK1=*-!-x3&h>&E`sd*LT35-9pZ_ zbTj!Or9fbgoUGiXnJ`XF>}&-^w!9(lpblgDy33zPk0;^%%b&*hL?Fh5qBitpfiQ>E zarHKQ%*R8$lNJrXu-2K*fLIBraVrTD(2~V`a51{v;|xpMpW?;(*vl?0-GDfCZ!9g- zDw4NOHU6QnFR~)Qt~ef23PK}>HKjlInPCWJlxE4lnFUJ?iS?ep@B!SnpQBi z^766-abTvEQ%q#4n>18EdGcTFVuT(b+lrxRVu1He(=QV`J{Y{5FI0qlmD|kj{-WJ` z$4!}r!N9P)_4GR(I=klDDGbCgTBaJ`3y8`pypPNHQq?HHWWPAi`!h8iodeR=r-auu zm4&M*QfbI#-MTQQQRN`^OA!iU4zB*3;|_-cywAsJyFY}`rSQ#4cnU3P)ND-Og7y29 z`^O@cF-6iuQ)!Ik3nCz)?Kj^bK?0M{0Oi??HqiXYh)y6o&-6>g)Ot+O34{i2=4rT3 zbFrRmi-qp7V#O*Q_d!9jfpaYi${={6gZsip*Px^54SggbH%xCM_4#?1ulSN&&w}NY z!LA3Sp)wq>%t)&<5I!=f##En)+V{AZOYRb8m?cNrf5;Ffw;Ty#RTp%{n75r4;9KzT z+ULlJggf-eFwc?jP4+6eYmKpLWF$(LWh3M1Hb!&RbJEg5H$2}j?koV|=vkmPCkEC+@2}BE%UDT(LoZ&nyJJgo%{s_p z#d=5Q#*k%vxVrmGkA*{O04g8|4%3SbF-#}D3STJnlO!>NHx5}oIPw$o+CCRM=||rH zDCC0oa%2Jq6+8dn0v{e};!pnaZ;dHe%|dkQQlSxfnMW+YD}nvBy3;rQ3M*%`>yzRW zQo;K%x8GBZ7VXtq5$u(X^AopngA~4m$0d=}V4OsgCMyfpCbTuQ;@q=-waf?g+e6sI zYCfy+n4K<}L{fMVNlyG}O;VlXq zVkDNfzpPnDl-@&O9a|R+sjtBdPNaCqM~ndxz7-pFVL*60?-o zvVTd0F{U9A-ZQ19CIwghgC2=V__G%rmGBIko~^8y63M)OadXiLlEi1reBVc@`^Jf0 zX}?08_95?*Dbl9;z+$z39gz-DPrI)I4|7-X8$!BLHn8yTgJU! zsOzFBFQd%K6qSmJS9Byhyxw82RYa`E{dQw=xC07Lea{;^%7Ok()f&-2%HR*PQ&u%% zZuhu|A8{#0@iQ#ux`e42aC=}EHwEZ&M2=S3%&|JtAWdLp2~8(~I4}y#^&xZ@aI=$v zUzN)@wrOj@-cdsLu+E~TA*QKFD+67ynfQs%stMh0)Ht8ur42sW!%%b?dpBG}zB&*B ze$B<)r%zU%nx4#tve>F0FP8hZN3g3i4QwgU$4NgFA za&V6=P#}Zk6xIf2ke#Dw@jD!9J*|^4Iy<7 zrcqE>vgy!=!nWui;Yw<7MV5-HV?&p(G%G&LFeLtu-<~r1M6eZ8+k<@m=f!}BbwiuD zT^QkC(iP&-2K}R9r&7oSQaYaQ1YE_64R*WA$!tACb4}HZzwNGRUkQg74vV5;w2eOy z&f|AkPzG?Kn~%d4Q0GK;# zK$O`EiQc8>B6plpjx|Gi{$;>R$2!)+(}*B+jEbCioqOGK6T|P&;mG$Z{j<*04LHU# zns8C(>4m_gg&r$S%5FB#vYd2Lzt_~j1|QW8W+v0ny;B=bsJp;XH1&7`pJhA5&Wg4b zew3t(aupq7u0d!K78+CAOp8RLB!=npG=e6hpmbsH8CfVb30*TP<&#)HJo-z<7USH< zjn^d;@re013U=@V=8X9c7qBR!@}&hCSY>0Vw?A95jRY}I%}me3ZY&W`k8^$-JzHvQ z7UN&l&Y!{GL=|eZ*2SPLj!!V~G-Y`pD>ho(9ZR~nk36O>(~`Xq6?Sb~|Kg)^6}E+= ztV@RjTTqW5A}+dkA>3f;go2^=SOqBGX}s`(EB z=;1ONT>)c@Ded4C9Y%4PS9u7ga%-ue^o{`5!!9VPckyttsLmVH;ugD|1Tn!G>!3?% z5$ag^07qF}#KN30s`yfcLJD@H&@>3A^k>vWR~{1WaC@xr`2(c(;dc*i?jnylC{S84#Fn9+E-ov440nbifCUmpv zbD(3P&Uw=gP_^*BH(pmeq_g=SJ6~qDn@L;rYH>s8?P&xg&x^rznL(r8?lzw=pNCrn zSRfs|%&EPEB7{H2wsTP4S3 zyTH-}jYJ9}xQ(i=4{&C(ZFzLP8!_I;iR#Ks)O5mPYb)d+9EmuVj-<(E#WtFkLb_=~ zaVnNHC~Nm1+*_#5*H2>lGtJkqZB-CSEEe*msT8Y0JvxpD0L717NSfYBk>`;aTikp& z`pzt@fAlkvogl$C_|{7N8o9BAR?#v9D>^YyQsPPLf-|!wZlR_o+1qTcN8*dXt(gBz zolv8LN9trsjb%5(1ZSdd8B&7?cqr`4=ZTb0jZ<%;=bo5N6uNNg%cgrcA4v$ctf-=D zTz&1ZIERMMhqWP?-@~+i^aJQk5~81@$l8i+IU7FvK&9k%T62SfYqm9*yOeHVL^YBs zD$(=88Bp$yRn9Ss<<&R0B=H;#*ak#ja7N#v7Xo{Tg?N@(iVaolSwpkI0fN=TQGEljyFwgbd zTj-v8*XJP_?Ls1>i^169Vgx13(SFWHt?Pg^G`$;Sg8NL3`MEUEY2qulr zA79SuZb3MY>hnUvm-keTi`v*$A1@e5wT^)pN1S0wafU?=`LK?uUhVeF~X1 z*a9b!RQB8{%X3K@Ao40H_2qIo;rw>^QN@0SR>;?-l4pFNW(7W}4WK<$0;>pZq0uXz z`gEZV>+!p5z|0?eYAb~)vgQ7(llFcv5Z$f)tD6@AACqaz5gT0y1Z?%+zm^b>rqy*Z zbMD~}H4a&N71Raem+EbkhUE^BC6W_K4muUUE{uSEyQY=1LVB=%;fX0qzV39_R4n?O z$`M?Zf_`XXmAYave(S4%F4Ic+>M$X(Nu@190P|U@QBW!*sO#HUt$elR>ek&*m`D7m zt%M*bSG+sS^tN^P?OFK7w)??TjPAwurPgPU72A`Pq6g^~BJ2*EKg%~}zXwlkTTBUS zE0$`JZ@+qOM6#Y}*{M(PCw9xV}o;_ed`OEDr=KPQ7EUcGNk# zU~*}nMgSs+(9Ozk==<9cxYgJ~==$gw#dfNrsx`v)99X1-`HAVdsHGv3x14W?AnsM_^cAh1PEoXGNL{bVyL)qZ~2M_6?HButt1h8_h#SNCK_(ZKFf?gis^9-fcU1~vT_r3%)hHW zJ_Q5FBRvAJLZ-KJ1CqRP=)BYUVsC;(f3d0$7j2!S%t^F1fkI7O zYU1Zj`7oS*IhwkRmnVh%ceNo`9Zx>Y-96sNxleq=2h`pC&>GDDVKb6;>KPUjAuUXE zNu`DPL%zqvTmt@ORp(K2odd}I^$PqMz`-LvmUIJF$$g??n2hfh<>WbH0LwJk3iBCN z!mt=a9t(qB%OLn2+$+l+EW;_RPnJWd(Fa<6NY_49=W+0>sKr4Y;9x?qe{rl4S*MQh z)Woqoe2J_to2>ZR@#7Rs$;vy1bNdI3uF=gn1o?r(|3%VjHWS1Z;P5dV)+#rjFnaZv zuZxkd29Nr=%9x(A2&ThgXYcjx)O#H9bzL_#FdTm~7S%E7i=(e@kTDaqYcr6C&DA`T zUuEmjId?yh!r(#0+Zk%_I7R#tNgN(%{&h}?&V7B4%`#jA;?N zbR_I%3eEV7Bitb63;0$ZG>KjbovD2O$h@D>?Di~0(DH%7;^GA9Iy$scWGKz2jm`rQ^gt;QLR7&xHMk=KVG zTe%;+^=g}MAI`Oqj#y2YIA2E?f45JXHG&C!a0Fy?KSS$8 z3UvElyiE3lIRQdPg6U&R^^rm-y@?&Fo&8%+NBi+!D07Eb8r_+uZAyZvAEd8&u=k~! z3<2W%vz#s!teNXJQ0N>eRm*$uUv_}5sT!Vcb?^GJ_cf+Q$OX;~`-v9xyL_zsB|T2w z>UY5vaC)nQlZoY$E;$QkI!j|eKuK~6*}TFe*@#kO2aYTl3)Jr0J6bqjlKno>P2^-2 zi=P@5{Q(D>aprn470GsY-qyd!p%p6)Z{-@5a15@fwkiZOUUBV38A+n>wlw;0k|$kwpgF=w ztvq8(U4F!2y1V_=##X}8lgvSPyU;CKu6BBNXEFOUF6VWeo&;LHZovt%mWc$fX|Aw| zTBDd6Ho)rRA`Q1?<%=e{OCF6%yM8(X3Nq(I+ld@Z`irLW_D*c+Pw(jxdAfc(6s0lC>~3n0Q9Y z&hjk%etoecEgbZT2|g5>Uox?rX9=GOBp1hKvx(%wG5fBw@uh|4x-z4Jb$dnKguv1O z;P7WT2VE}9f9D#?WrU&!2$$h%S^1;Yz5qE(6m6Zgz-(GhfJotsTPG8*KwIzaE08aBHfvg)Y2I53t$;Q8L5G ziW)bEzRpD~r^Tc;=%#q`?h6aicc1rJUE{$x?eSM11F^^wHrq`IJJ4b2`su;o@5bHq zq!ESjRfLCsXXo?-va2Hw7#M$in?b+{NmNB%4#tv0N%nT#sngYI?r5`);uj20^zBQd zD*6W9fshS9tq-oS{A;TF8nXOI+A|A>y3{yp9(hYVXodAWN@Sp1gX_%Q8HfkJwxVP# z5sUdYGFT{seoruR{$zlFcp@-O1}WUOZAu5m*#A^p4wX$y$@9lc$3Jfbk*ez)vdP zT=J!PegfMbi@9)D(rSw2vDsMNV2Ce^fxq50O;!&8wnn%T7(**T54Ug1Cfi>Mz<)F3zIIMe3!(qr5Ax4g{dU(CfIdAXxrGwe_U6?q#8^P`-v_Xgw!AJ9C9|P%*b8oKugh4|8p2GR8}BwBM0VnR1TcT?H~0J~hr9 zRujm9hexYd#O6Fw4kxAtDj;8F8kWM?)69AplcPGo~6-*S?4k`Tk ze^N0fz}y3{|J6(`PkCcTWZPIU>Dm6EKTVci#+o%FhF!r4*(}Y+c5jmEdkB)wqMn&e zP*@r?4$rSN@oetwN3P?}+L@*_JNfuu?6;r*GBb>Tn>5|5)HEZAO}oVK001D;L{df; zpjuNhpdvoMOaK6Y;M@Cr{pN@D3k&N9AfIYMJ{T;TInan!1_}eti1{B zbn95z&b**)!Ry+=^~BxgTW2kSE{ZCNi%r!8V0tdJNXWd z^BtAj9=_!&`RsXKH*FD{7D|Ji$=})gBfxLpcIEQKyq(G(@6HJvQ`O)I-yFVvlD@-@ zH1QJk9LrpvU!uw9CfeK25O>Thtp!Aa=H87Stx8$0F1W{wuZ2NvG87y7L!Jw=>dyQC zPOQ%lOcr~|oHn`;oaMG!O?L3*jGT}`3BK!;L8O_5@v;s1Y8HCm+1}2I!1OWoV7mR~ zt^SkSa?pEj6l(y2_-wd*!_%BSRzOz>melvT4-_6M^Jt2ANr+V7|C zPlB%Ul^7gcF&eRH>kZG?u5@c>J&jBWMAcXyH;Frdp^|SWy(3~wrZxhkB5PC%hK8R; znvPpvw7+FUQhY6^$`A_Jk(e7aO7-=IeGU2Wr5FCdFtJ>-%L?XrSxr<#hT;F5UOa$m zTWGS009d22+n`oXn@V}-KZxb?`~W$|}=xeFz|Jp^At4_MEz0|?c{A^&AL2J|P zhyD#g|I8Ij7{09989MQjLWY?vgsDQn|z8ux4EW#I9c-k2HbtcL8zb_ z|4#R=o2IK!Pm;8fDpgDZId$s~4tIsG*#}cr*az^>rkhxRtwFJWe~68HF=omdNoQ=O za2@$#N;M2DPV9_03%=ObCnG$Mn!}RRrdTA@sh=i=Squ;h?UZ23t;lq0%Td%a5CqVW zi!)roBx^&PkQ#sa)CWy*hw8p8S}h6jbW2(h#GpqnNhSlkwY)L8U|2`WQ2^yeUQePL z0h2;JWAyfmM+H-xP_O5Nz&T4hrp|J5ty3TDlV`{05WNXtKmDSQ>XU>inH)h6HuM~ih_mkV@X zB0YS|(cMg?*#~)tAwAssA0AM_bG<9ld(LCi@`?a+=+`sg5zRGPhCw>iE~gK_T&}vT zDw=uV+ZIw#;X%l_%7%7E#iqI4gV>NWTcVhTn6mQLLeEv>S7QSJKpWYBPHgh+bP$4V zcMWi2Y}>0aE|cA`_M>$Ce%-efK_mseSFKiC|KlOzG~+!O!XSx%Ejo$(5+yoDj&Z*4 zMdl?j_rj2y0e8`zb`OkisXyZ+X8^*ZW+0$a;tqzDbEy>j_*gcs`ME>Bk+7LX#uMJpa(NP9 zsd635npCS~>TAKn47gax&pSi48ey<7;zt>#b?~AHGYY0mGZIEGCD{+bR7aNHPKkpCU}DW&RsvpP#^+F z7L~RPdL_d)zh5f?@-QI3JVLZ}q&<2abS;;4e+tbalRX&MHRwH!xhn5>Pl(YK>0%p1 zID)bVzH*y*SeW z*q+u!7OrD_wbiFV+b}_waK)fm`1^!-UW#bf_edNUgb`-AHZtXG*O)5c-5n*rQ{S9q zn6z9XX&g>^tMgbO3RN!)Kaw=8Rc*{mmjq06R3W5{YnD4tMDG@7M4{uCe|b zEUy`F;ol~e-&7D@Ub@OhVQ1eUzFU6A!K6C*IdBpD)E2bi+|9v8VVByP`Ze@e+=C(} zQEILAZ_@=Ad?m3RU`DAzifgKa zLQP37ohJ_g7yh zRqHe7lD)g{YhT%k$fBAj8i~XExXp1D9GkbNT@QkAK1)^E*{j1&1mj>iNOSz5@I95y zyA)u+z@0zBH<2A*k}y%)`{m>smv-S z@2q*>GhO(Y9`s|>6vdlz+y3_4p4$ttd{MX0(f=@e zEO`8!R675o%||O{;QA|b@Y>|ZXuFLI*&aZC8UmcVAJHx!tDnaDpaRWMx*#aMAR>MX zDGQZk1B_#H*q?TfWEh zFUXzUj8d))W>}ie+L|M*kDTsq9tG(iv|q-=qlw7y4OYObY-NsAmohhlTwmc}5Fnv@UU5rBb6GtEoWiQCrmu#do4wcJUA)3LUARI81M66GShxO2>gbd{))?=enI>pv2E;|RjHiAbZ*$P4MV31*Ze}m_5#rQL`#E8N zRN4X*xLOFhBZt@zyFdJOj>LJw8gPvLS|Z#xg2w zmh|A&%+R3^5rV;ienIk@CG>kmyx%bA>f|?$gYuS*WH%Z*x>7rQFuY(c#xSVu0KPJW z4h}je?r6zr&)%|kulTfBiaN}mg1R1unL5Zr-H6*=tZH*ot1(PP1H~DcSQUgCD@tY2 zzEJnUY6uC~BADVNXE_;IqdqOmjBQxItf^9%mii5d3vjZ@;~*3I(-b1tdKk8d{)ERR9>21=|0 zg@@YG-fW$2X>n2~Xa~lV>t;Tk4tUD26@;!#*mY3>Hxmi41ci;7EqyoeYNT3Bt4Pc= zqe1q?b3>#V^jDrnpShTosNEk;i@fa`iSU8=2J8J0WHOS6^&k;-At@RoZe&iS+=QRwh6L<3-d*| zgP7Q^}GHcBJY?G%yYUtAFRzG{OHn(#FgUEa1UTe>3+nn^hjv7C{W&1o)V7b{3~SC{vQ zC_m(wrg~11T&Efm^`jbVeGqEwUX>`GJF%UyMvRlho4n*{xvJ!68hY889lu4s#HI^; z7~uTV*I5>2p_MAhk~OuQ7);|VAdQ;!@#>!t^xVL5sX5(nhGcA3uJ9#jiI^73h$Q#i zKogVexyg&8G-Moa&&5S&Apel?SWF~q2*I{L`n3IgE?C#&Ca<=7`srKpnqI$ZpXcVm zr)wL<;<4q@R%XSJgraU-&rAmtjNZ;pw@N?v*Ktz{i_l_dh>`6V^T$ooVfYM%Y_<3G z-oO^h$lgk2{6bIn3PUAGQioxn6$$Ej`=~MBu&*C^MmMgHv#R(AV{8MBaX3rE?mXtD zrXgB^H=OEk)~<_}E>5ad0G}WnXSD&l)7fYymEy3f$3E#ptZUtBJ+fRfpIZ;W#8S4y z26y9$$Tanx&hX@^<9L=yYmmJSnGcA0@?OY zZRx#(lFJ=dklqHox(zvK?+SGR?$ug0tS-K+6KtYDR8MW5@X(vOJC^%9v=e_{KP+U2 zX`X&1xX#;eDwKhbxrnOIz`W)rW!&T>Hx)c(jV{xtuojzxX-hCZ=yhdW>{kk7QN1Kg zqv{RPnB}#Mzk<0N+jGe!CvY8j;c8N>6sA8)?tNi^S`C}@`ePQZU39Da#y~0n!%P@x z+ah!$O-54?0FRad`$O&1hl!rg^gY@=ey~;;!RP&IQH{2YomBm1l@9GU)7S;Hko4JPbh!Pb(fLhDle~U6lQf9>@ZG znE*DO4)Sy7v&)-CzYu#GW{8y7XlL1?`t47^xnI=sy)>@#dp5v32&zs+( zhCz=A!xv%0GWf00;w+AL#yK8s(O25C)lQ{=ic~Yt+qpIfWuH}pE`VXQ2zOq#X3g*T zr_WV3N9gQdHBqErhAZbz)yq;J+4|FhZl;Ks& zZQvCAm^6_*}-YuWbk#ZBD8R$xq`|+|IO2Inl4$Am+Yx{V|(TMy107F2$ zzk|oGlAN{p{X#3L2>gw9nlB^)={TGHVKh3Cip_qI_HYx4+@JnI*TN5@W6wvRhpu}7U zEe545F0!P7eM74F91NRYf-aD$3Mb$S&}zTg?T^tGW`a*2ihO-3;dD6z`c$k!7H@i zxnO(jJ49CHvBK>IWHiKfchbHDz%yYr;oIFqSva0!>bN4=gHDZW^@geZb=>%$9vKdD>9=AnqA*De+(Z#- z6x(lvOC*=tXCsHiz`+P}HA)7yWoN3X!imT`OxE3)o~Tq~COrMSjc&>Om^w@7Z2uaQ z69)eF+$$(KTbP|9Juy-(**S5u7a`UPifc??k8m=_rBEcv9UAp=U1Fig#;-J0n%AJW z!d>1^$9w~&W$t4do%jb_1W*GE=GJJF4JG1OU9W{oqP=RP^^XTC6iE&*U98=KFIsZY zCK4>!J6Bk42iUEcMd;Q6QmIlunKxqML3IUc;`{%D7}!D)h%|eLLo7a%up}^WMJ1nQ zrm5u6&;srQK1FUS3WV8<;g6J(vgUQ5Y+&CUrj=k$-4{%g@EUy3eMX5qb%=fPklrzQ z2$WjE%!aITYW>)U9<_RNR@I&WRtNPdV@Ks9b7R8X4Fx1=&cc^N>D9-5xg*uAdy}dNoxy5P419r9=VLBczCy%JQ(w!BIQ_8C z)P_?kocHld36C(&UQ^LR&hS5Cq1M4;Nb(Ey@RmK5kFN{Q>LG&-ovmHMwqN(mu?3Md z5E)fbPF>JTVu!kqK}yC5TjX*ONEq##FWpv4AysV{<>e@d(8SPsZGnX|5JUI5`Gcwj z0%OrziLALT&-94BgadbKOhY+D1$6KWj9H;@V3F8jjyOn?soHbn!?Dl&n#Ia{)#@uz0Na26V;A>x2so%a%Xd(f&t zX#z}SD&eho5tlpimEWQSJg`|ZV>Ux~&G2|;qj6u0pZsN=2QP6Yo{mHbtx6H3O$dXG zH%LfrdJ<=%=dan^?bBYArmc*Uk528rTVBy9EHrj0f;rBr3zdc%8xO1(Qium!oQ9Ba zbx%u&H*tQ0r4yz_EdW?DGB9=qHv}BWBJ$1_{;>AMcl8Ihq=n6$7RmnK{x8*bY8wrz zB}6VT2!#TXxBt%X=T6HHRenBaa%Po)nNCcQ`;Fm|z5@i5=eHKxmetSCYN50&+VP#> zMHNVB;xL!adc=G^G8`Lub`fiumc+QX*^xpUFD*9X6@_=JoRdR@xBhJozAh&edAXF6 z!|VB3AR>eW@;XVG9$!-Ywe2sAc>;GA*>1tx;x~Ct<4t#KuXZT3LI;?;)gY{m5#+fhzFUH=UxPOzcc3ejPqX^3U$g%L6bDi%&{iO?O#XY_Ll#^8m<=E z<(1L{Oho%9$~@4N+z6;Br}^}dQ#&;%9NB!>5n>TUMK00~-Fh5-{Y=lPYWTE5$5Sku zL>5||B<>J^u$snQ=o|oHF*yM}rrdt52JKVlZ~ZF&-C=9E8UT@3uQr?S<_H3WN=jE} z@DvBl)wjBa3X<-=#MW?7SbJ*}2k5ejUK*F89ye2SG=sNd*lYmM46hSefMQJJjl&;~DUz7Zp%x6jEDG1-ii60Uk;!!uS zQv^+|N<(m@=#Pg#6RVb9D~~hpj}AThzyQ;eHnSH*Dvu25T?~@>!_VI&Gut85LSU%w z!#*_)AxtsQ27-;f`JuhEt+1_2n6)?D>fL<%2ir1Vk^xV4r&lqKba(zkzLQ$|TGh4a zGZ#ij+`0n3BffG}1>=-`dc}isk(^jbD#Z8!I=!4>F3*bwI{iuX=wI)i&X{a}R|^2O zhL?_Hn)*QrkH*8PKm&FCI@#ZYit4udj1~wq!RQNgWMpfygE*mGAedvabW?Ln)0Tdu z+CwM{iUId&*I9Cko$bcqu-ld~jR=B*VxHkoavv@_2ZhaukD33e%^c{79=?$?-oYN| zZDBKZNdD)u@j#y;52NIME^WyEPbyJp+*m%iT97$n!VDTD_5e9~!4E))6(ns)pB!EI zy;}&IzK5{ko$-nLpOo;$U4jj&4OYO~Uwp`7v8%E=uZ$}zfP}C~&~tO#=91 z$ZA$#7XWa?ZTSdinmL8~N+3?_31L>2#7O_-LAd5Wu(km)7KPnD>&PCs^M*1RK@ zieX(wUh1w2gKxMQ(neHS)VnO3B6U-#sg!z5l`-#cc+d0MkFa*bKaNq31Ce_tfl$*? zCSgG)^GL3gRWUg#Ng5S2H~VhVt}o*bpumXxuMsZILAF(l!@1}6;0~onP>p<1 z9jKZdvGaM0i+MbBsYpA$P1+9-iU0rr08MY<*RfNe0Q-d33^*tEUgp3y%k>FnjZixx zSL-t|VYYm7czh9iqGp5#DJO)AIZ40+`4hJ+fPTCQ05;Q3O( zHcXw`P(+hJ0|N|woNjVy9x<}536u_47Gf|ZqG?p5Q?&i650XDF|~h=+~zuHl(H6A2s7yQWeE?6cjQWE-%Favnb6Go z5jMM%jVvbQcb;uJ634{zQ)CivzLuz$Wm8RD`|*o7P~zjw#q&Th#?4*A0|6Y01b!Zh zkJR$IrIpgpbfmJ)YiHcYM;>lI`AZ30WA&IC3v6(4Nd^;15EtkDA0GNgzEFPN-kO)ZZIf7?-RShpXQ zRRxA_Mek?AmlZMR&pUY*vMV6Tyqzf6PPt`cN*;7$R@C*78VP9^J%f&+@)5SNjGWa4 z4$a~A&g~4`X0KNVXkhw;_l1ygatv}T$zi`&d-bPX?T_J`K*;xzEhh@gRV9+FOP^*E zcfUsrx=Xfq?zZVpQb%-8#kg@Ct*IjCLJarwMy8x%^kc6ohxRQ<;!mr{?x}_eV2G z>z8FE03S0cst>R84VI5nGptg*j%u#;DTiOmlu&{7c_;4Rds8Fw@I{v5EEkx@Ej*+W zt1%q*O9H1qIlWLDsxqu=VKKN}GEZm?yHG62%T9DEmU1T;Q`G_Y(zu|>AtA+RS$%3K zi?P0EJ=$`BFSg1$S`MAF7Dj=L_1Kqoc-!F5pKPfhTF^OgH~02+pv|Lx;Y)hI&uNQV z`r&05GKDPcoH4TFnzS>pxy4YR$?f7`*M6@8aFW4GWtD;u6I*2YJ7+k z6?URHuGAP^qdw~u3NtrWP9QUT^q%7utPOh&t27(Rx)theKsNYvrYa^30C|WkzkCF(Powqq&ds zi|m|M`VPx*+x#nBFOq?E%5QpJ1%F-3s9O5)z`LeT8GZ>UFJbtJVT@MlUJ(Sl0|X}_ zZcZDh6|?sEh&BQ07?|CiX$GpNblFnU9JNlzj(yYA(laH<3y5O zH)QvzozdjHsKla`=7n{F>i=A!9$6%a@CBDj(fqaio!#D+fEzJpPmer0I^{dAnNO9? zwYm2h7-&la_}=cX;F~~Gl;n2s#>$o(53G1TElMG~-dC)wOAFXV)@1cG$ zKe3(@(}DH}M?!S_##u+-_Dmw9{0#+mMSDACCW9qow5ou!IgOJeb{PDuGvEw57EFz6 z$CA8uFR)#bwOT0Ni+OGDaMR)zV0b-|AmC(xd8TN0-7{Lu_Dj=l78nS)K#E=Pt8n)) z+4tdv&WMfV2C~5?$;p|)l&w6GFr}xZ`Wu?;EZF~ufF`aMjQE9n_(@B5=}$whOQa=p z>O0?`oBPK84I{rXzCx!b7|d)Rrf(JnzxRxcW)TLUipm*q@+Hn5 zviHBWaP2%pAWN^ql23CDpMDrz=!o7*A3DydKWv__i*O8QQYxes!zo$@PFt%|MkFS{ z)%(f3_3^#No5i^B_fpSP__H*<;%q;~5Gszi$#E_gk-AR=z&aPZ3*tYlWDGk9@5gF$X@uGEOyPE^@H zU~owOuLYmzB0bNuAk;$rZlN3A%H4tK^GznoSEVF(v+6LnDloJ!=kA|ZF+ooZ9SyiwM{hYrPj`X&8WBh;HL5xK-N-{^ujYbItaS8(fu`)-jk z5kN4PRf#QEXOE!IxGwl~WPTVtSg z3@%c5K;4npIa6g%C72P1u1&14O{d!9IfiDjeLMt}aTwtC{Ts3yE@I=@!IgFAGT~nw zHXCoHT*g2#Q+uKZc5S00N#``28?Q3`vF4$(fnaoo7%_Y-aT4Yn2c`lAMQEYr46vf# z>BmV(7m&j$x}y@nU`Iu11PK&%A&NP7@ny**_Gfn#a__PU&k~`x_f``+=CsHP{Cu}F z#dv(SjMde>AuIXGqeD7gc)L!I#x?CMst#qvK(c%XkvLH0(O?@e!wcD;>(pAwIoE4{ zXWUtA>svK_NCG*a_D^kjuwG4R=_G~CL$07m)dPO$DG)bIZ89dF*Sk7E^zXSwBrN_39S_e1<$@PXdvR5RCNR z>fRO`&~#XjsKd}EzAEz0Njo#hyFq&SdLT4*%_t-SuLwVssZ5fzINlKfwuDIXuXFKr zRw5$LRM(%sB4+O1YI!7RZ(FgwtJsW(^sdhs6;4@tNrLffz{(Jt zBTdz-=IQvu!+L%fa+65#1SfDiWq~qLhZeIdS_wGl?ubSxSWaIgxv>NC28Bw-=}Mh% zv1tj|(OLC!XE6(Hc`KvFnC1|U161)t({Gz@tA5WbAdte7PJjTNZ*}($)rkm>=3=>F z436)BG?9xVEm*Ilmo$TjbNpkGi|YHw&?^a%V0x&gbN@+Ml9M1CDBN`nO1U$zTuq@Q z6Ag!FN=|`626)6%>5{vC>$StQ9NFMx;jrkWvq8uv3?rl#e808-yi3%EM_GkPoccLoGdCYx`xi!Iaeycr7s0uG2l6v_eWC&i}mnD)5FI||K zQir(^(zbEo=F%C)2J=LgWgvl-hqCJQFosaBZz0z!F}rw1;>{4M9$DLmzr>0iid55})$-J<{(da(zx)r) zX%9c>11boIcRn_e+vps&@!=~4fcbaUNHr{K!*Ous3aC$3RZa(2d})=j4WX9e{S$pZ zSR6X3a9md|La5;Y5&z(<<>%#*Y|;7|16$>ZQsN3+@&l<`q&C*uw2xiAZCQm~ms`~| z*&23`xpZBy_Z8I5Za7a^zeOZWQ`NQ(+eL-uB5bDR;o9z($~P|M&=U!f9(pIguA)9M zjULm(nI4>%NpKN{wcG&7Wq}u3j*lIC$x=1YXCFg9&u-&kGOpa-5t~RlN&-OM9lOAN= zpYukAhy1T%J7f>LobLcQfIRLY1v~#a`;A4{dF7^gHSoc8-rCp4SJLDE+TmjHWlM*1 zv@#ff#aAx@)_Sh&xQZoFG>TMvMfm#62o(0%8n0TSFk4kPIpjTNsz=MsGVysJ@H;&- zgcD_S%1^2jBs@;yEg5qrqs|)iXIvpH)s@DAvRa9@fTpDF>4)*x-k}pVeKlFz+?cHp zBJ9FgP~P+gy84&^q1o|qKT z5fs?D?JgdTf+dY#ypV)L+kKu9Wd}uc)unaF(3}OXSaECI4X;4DUc~M6=P;S?%&opP zaBr(=Ztf=u%p{i1HHQr;%!?OoMw{$W+9H%RcG`+IW4uzTrmoHtYzv4Gz!ShukbK78 znFWx$&n}K@rqks&wMqy3Z;$tBK%Sq@I$!4C(1oH4XRr-`ZJ<_`P$YuSH5xMEK1LyIb1L+Z;KdzOW=SmQ7)~YP4Yub$kRY(W1z$0upX=W-& z6Tt740&5}S+nTZ6{XWNe_KW*CKW6HF`}wwDjz3zp20GOU)}ocqzcE=gE6nl)8m8Js zI!E5-urjv4neT?+?k5|BE6HB`(u{T8y<6LEBL>-Mtqt7KDvWA~Qjy6;&jr-pfHpaP zr|`U%SDkSif6J&B0X%jto2aSgqHv}3NgLH-seYW!F$S0u_GD{nL zZ9}jjXBcBLmBKA;?JQC+Yg6L~wZ2F$5)mTAB?WN_aPCFKxQ6}e&CDm81a3UfHJn{Z_T++|N0gZRLUa6^2t*3DnGGYEESwWG|&rF z?ihy2JO2STU^*}M<6y$Fk}e&4Lg9yNoA8tjh&;=c35cLrqPG|e+6*VfRN1`d(QMxrn9WsDmZEAr?W18J-=I)l z^r5N$$@P{LNMPqrpa^aJLz+mi#e~udH6*DfnA0dv=5>{cPqEde2oSl#szuJ!BgyLb zVXujbvSJm#8B9#{ZR{IQlk>i3+XN6p3r`l5A~lV2_uT`9%uu~n?%RyniN-};BWmI7Wbo0;9iPj2xfBLx7m zNZa#?1pnjTaU--a??gDP;pTc7!OqiDo|`?7HCo3$x%=}23vsWSB-5i_)X>Fviwn2u z*WdUWlmQ_Cq>`6|=mUUJ5{LAEVy%^q(|FPh~8Hftr*ow zRag!EWe~U8d2P`PfyfpwFQK3=jIhb8r;mAeE-XJHa~DjoOh`?_Wq9<<`9SxIHXoBh z;i*LRSdb)KbQ907bQB;8Qo0-;Hlq7}-W&}RcLVhI0#9tKKTSet6$TCScoJY)O}m}Tj!YHReObr2evzLE6T))j zb$Ivx4)-r~K5b?Vwo&ay0~IN<2$?UT#X9qJW-mf3NFZ+wZ}f+uuL_r2xidQ@L%GzA z9x0p+y|`N~pKGH|{1c0h=jbFThyc|gI^{A!=N803*rj*})+s3|M*c%cTdChzj?X5(&P}Ry-vhn(s&FL*jokcyJ!6k(qAvf=%3sx%NmViglPl?o) zyiiLr3eYB4$EpXO79R5pp7YyGMJFUh_b){mG7OX zF=r-;A^JWGUN4s;et1sj#{2nrWIe{DglroxCnVGSR7?qcu)J?ek z3R+3$%S3Jv5Jyzh4Yqy#%e3O!GnFiH0Q0je2UMjUe&Q~x_Lnqk8u$ncisf)@{tySi8i$&%X6t4h z8F$otsiC2VH$pr6pn?f%uDdI==x%P2v2_#(e2iH=Xr=A_+U9F6WH(43@Mhz{;%L*} z?Ej%%`Y#NY|MJNRYq}CuNW-U;Iv_X?z!m@xiuB2_oYAr5!prU*aH)o}QUK}4MGW-d zjUH}BngU(7qef^^x;+`oM_@paOfVXOwcXlZFD3DzTot^!57S&;F1Z*A_ogZcFA|#G z;czLis+^*4+vY`ZuG;jGWeB^rInqL7*YL~0NfYFFr)5o?6ngLNMJ@pX+uKVNXGjM4 znoROjAtnfdiK!)Dl0X2l z$Sc9yXU}l^w@oj%=^ot<_si26DIp0N?b_K*170x56L{nH_~BJCZFRXG-7d2$T7*Fg zqT96*IIdOQiXS?y4ZsBLGfqXIuEqGj9~~>6J~)ba;;5PgjUt&q=UVS$Faa7FvkZ}` zbnMQm;8MslZDRlCe^*EHAo`riuC>z29eQetxrco7AF`NJbC2`Sw1d2+-ttQmzSp+q z3i~eFhP~e4zT#Z?BVM-%jMY2e(9rK{fn< zvpO`(Z`b;k2TehWL#~(bhdh1EDAvGe&os2 zb37<4l%$@TMgo_NeFO zSZ$pUe+sNfFqRJ8+R%jW*QeR1s}c#F+V3~f4&_O`Y2s*?c3YK7Dp!;Vz*16>Lp+~F zhFHWbqfm&p~kSTU&*6e{YW_C#!)E=A(2GY*jdh6cu>+wgby{lrE4@kHdiZD zC`^VVwud`KeNh{HAvHozDNnWlVg@pI;BKo&OHxg24dfLWiBbV_XZo^O?NG1K9@^!j z49Cgel3Lv(#wDGBI|HgH;xdeid3jSeil_(x000001oX>qJWASV0`G$F6LZ}XYQ?u= zC!X`VhMi1ahIb1b&_63EbS4L;(JfHqoeeYs6BA(G66p12LV?hFRZ@zTS`9$q3mm%3 z{-d&QNjd~yxBQf+`ev-%mm_!wNvLE;dWfMKZs!r`9_jotSfMwFtTy z&EZ+tx+>^oz{V@3y{7Nyc6P1kve?{+mRMXd##6L(gP%>%jX3D~TcW`Hluh4FqC(DR ztdI^E%cl^}ffaNpT%M5Tl}~EGyKHMjZQVRs+^Pp`KPwR>>eb<<=RK08Q#T!MezSP8 zdg0oGS9gAr%5`TQH>FYArpjzE@NJ`7p*&NOGCy{o6-|wFTMTBofSP#M&JKCF@ATyIKH zOggJNf<-6PyspB|<~WvQ%|qHm%#6 zCf0(>qz;Mc4nD=&$C~Osg|Zqo_K?T61Jh6@U!nkjT;c;>SlRhy&g1hc@6`qDwv27s zAtzxVCZOt$4vF3QnPw;*pmf2S;c_bu9^dPad!Upg*PQ?(MxF`-kafa8m6oRu+fAYUBK-#W znus6>v@IKDl#Sk&}2M zmY@e4GDPJ$7XyqWj;LIF<$>#$2|M|>Mk!&u03-`T6dN%pg8{{fJE1Hg#n$8IZsVkY z(xx;vGqyUaF9+Y$qtVkwLX2!aj0)pqBu-kjEpVN{r$&JTGqn0SgXQgc|FER>P&;Wf zXHb9YU5sBgvHOvd+>9cLXI`iX&n-t8b^Cj8zWI5O`x<}S^;7~L^x~C_G7x@3-w7vrzMJ~* zJy0wJwP)~jt%LkE?^Ytm#SqRf8&*5uLXOQ<`@e@5O4P^;Nlo6o&l&mm&DRRfG( zGGXBN*b<#V5rQ*mk;yLHKh#~UL=#{@J>2|ylN99_za48XxPg--@De$o@tJ*RQOjQ&S5BTX=?o(G(NtIvU(*e% zbUSY0$i0khMDq?=vBY09%S>nRG+u^)qF)FBpfEd^=B^cxmt`Hv>?Lxvpe1hino`8; z)FaLRowxWDrc2=6#O+WmVdu#_Uz>)#&nkm3Gt93K0liK059@sX!jx;T^mUwB1;$l_ zVx}_6*c9mzD6YBrdbngu$cOXxlldSTV0$3)sDPPdY7dkp zB&B?C51grU^xti&Fok8~&uBTS!uA|hYzAYN5yYlg8t431$OjFdx)jsJ_H5wLer&D- z$Zloo$^r&Hkj}yQUh(t~N{`bV#6U5}ShN5NWbpWSpm9I|?fw95*r*j??j65`0_Qp=-3 zCt_0;z^EG!CwySj9iMr8D^1YQhEVnd-xn955*X8WZFicDQ9_WElGKOXoMfL@JPmIB zkyZ{8%|`pR3FOK8XgN&(i{OZV(M_h)9Yh}dDK`k?iK?oTdAPLm z!nY9?Tx_(|UT`AF!jsGAb=FbJ(&Xvkxvyc27Kk~c?V`(pH2PUcKed=j3B%g!DU*Gq z`yc0yNV;TwvX&6mrhZ=mCjGohW6NAVqJ~f-;(P3;Nj$DARH7ld9e(^3_A$H4hEt-4 zf|TCC0000_Zi!Y{kh88my^i=rIRCZ`3RiT%$XFxx$(dg|(RO`4FcaC>XG1X9Xu>$g z3i?LKr%t=6P{SL)tQ6ALf~ziuE?;xTo0-x{;6)ed;T*3QRcjc0#?R%g3BZGnUNs7J*KokFHhCg?mc)ra#ausG;bE0B%KSj-D1om!6zbBX4a;H_JBtoP1>aL zf5si#m?n24d|BwO-ryuPVWqg;3uWqa{^A>y3bbkf1q_cN=v!FcCS7B zoe(k~h!Xs`A}}#@H5xZktN%rd{}6x;jMSYYaWfF>&k)L7JRVyb#zcxAI2)bu?-KYt z#dq@Yv!;^(5r0cX4hCSzK#hRhfA&68!#ZK~9x^Csc(=UwK%M06S%@eBM7;48n;8Vj zEl{0h0~Zu0D$}CHQ-u6(baz+1l4;mAF^#R4rb^7B_b4=W%)9fAgJw$6)_1q^US(>Tp)NHr#gkNT~+g<$5+gm)W+B~!^AG#VEAOlXbw;d z`t_p%2-W#Vv>F==eRnpqhwmGQwWcE0f8mFMvv(V6zZz3%cF;Z68{v^A<_q}-#~{*H zq|Kfat<7t5le~Ths^>_@QRjG*`*>WiWa)Nz%j+#j-=6 zPfu?;^T1nD=!F@|H`R*2^19mOKT_FE{HEWoek$kiSmkqLLAa>KFwr^Pe4sy{bN>!r z(u=@ypYakz*{yi&dD?|vb1u#KZ@>N~lf>P4%oH5(-$AhS0L^fmkn7Q}zsE$0fWS^9 z`S*P|vuM$d$8{{s0001EXC~Gv782E9{gLaJ)4$mXZEXC%`>j8yscodb)I&JbePitV zhr8$5)EVkm=sxK_FTqI3WH^MKf)4Hhr{pYUy-v6tEu*)3{XY_DMC5f+BTnX2vWQP8 z$4Vx(@V#RaY|R8nb$Ev&jbAAk#iPZM%3b_|H49G}JkSxepN@eOa)z{_A}xIPu&@it zd!4*eClwsW-pyi-brG?W7#=ZvNaDRCMKt1Vdt%12DW)S7b3m_W6mnzJk;U~d$xk%S zxU88Jg|RK3SS4qIJPVc%D2@J&*RR6lC!KBP+FJxy)Q>uv(|m=fMJn@cveB1STTHZ1 zoig=yKAd z$mxm)2)sjMjxLMk#)35swUQb|gR19ucw{BxLniWG+@FlB*+~jc$LTwR8{;7w`d*b| zC_0K>)@e=$>u8T|P>%v`$TM46gl&e=`R-+Pm6JK2)}8U~U6;VG=5k-j>SYv3^*E5S ze0knO*8FRYE8XZjVOnf4UgLDa@p>hanSQAofvvL@3-OhN(hA&;Iqse~3mfwIYO*=# zJP>nUkco>v2IaE=g4jRESs)!GWJUe^;rc{0lMr$7Jz04S&- z!DPE`R!CM;PNuxIH5hY-oY5Jk%%PZh#>Bq_B9`c#%#N2o0gs$Ak?Z}<-6VUV(RFUv zS-J*7l`O&EDSJSf3*%>I!1;YfvoV!L-EM?5)RKsD6eg0OVDqziGC1wtmrG29&!IPg z9aEA88YE%#_h1Fv(BZdq>!l`uWwklfSr(375r0``Wd$5!@XXu)XwL)ZG0!F{T}Cn> z$Yh-s;n~Sx%J&{1Rcu^OL}4RNR!GfBj0>63%|Htv#TAWt+_@+01pM=M%LuD~hdq;` zD#3W0$zL!IT*^q|7TzPb#mYe%=mFJIXoYsu{!;k%#hW^XMQbO>US5v9$5vCuT> zZ5>tzJ%pi+CD|Sc$B_o|QZIoC1{vekI#l*zet_Or!5iN4-h3KI46Hq1>;ruw8CogC zo7|hB`B6^K{V(V869NwmkTDS((Zl4rP{p>y(sCamhck-w=@ESj8Ah(pS%VXwkE=C6 zwvEW7wVY1T8<(Isbc=0Xs(Js$kS z-RSdn)R7d-ZTT+vyOp7*?4VVxhI&jYW?%OD?(Y=p_WdZUDJY)pl_vw^|H?p$K-Q}mjzcFHx0-qW zQnU3VG>D|L;Z6Dyy;6f*f=juDAi@6uW|I6ezE%JL02uJEF_BHJ8A3J{$kX7HCy8AA@b+vJQ-;?@c62edwsiv0Tslj-Ytj>vo|H1+ z4j2tPlQRsH9V=25*pGq{xgWPhC;MMn?oBOmau+=lmkeE`cJrH z&Vi8V$5j;vB!3l{D%J7S0~hVK$71`xKFH%x-~yzns!vu?fmT2j&bnpe{cbh%5T(>q z=V$y-BlCXI4-T#ev&F4if9~Xc(-YPuPAL>3(OJ+NW!C0BfRP|lXhY;Ig*AIL`?@irx;!OoiM)MqXSw7%F~9qeI02mgEcT+u zkjV!=Ib@xhYgCw+gG4wBZ=XhL&%a0L#tnSsjn5VimQ+b5=JqDf zjFCYYx_-QNA0d9|2$t9?GMl`Cnb@30Up?ng9o?N!^n(&P!~iZ851|Vh1+QBt<5TPck~cVNlDm00HCeIv zm0WTZ2!F>CH3kbd&fAsrrQ(4@xMctrve`TTAYwFsgZ}K*?}(L>SYqJH(P2+J%?Hq$ zooH_Tx!Af%9CyfPn=j|B%ypr`Od&R6X?&BBVm%xT`<=v;Sjs|uP45<1wq4~l__qxB z&|EEVI{@#R7a4dfdqK2;q8nzkM=DP%OU|w_ZZh3{15>#`7h{*}NX5FzGm#!Ny?&p{ z!12{+y#ZD!^OBAH@M5N%g5_1Lga%I|I-ZQdOe_*uWRak9htb5KT?*4NIScqDoE6M~ zO~S5C_CYXpIZwti5lnQ;q_S7K&`}E0!3rr~3DePlZ4e)wlX7QRQ+TO=wKG@|qp3-8>WFRU-72H}!x&A0S({w&GK<^?MY?HZgllXgSp7M zHUE8Cp;a;P00m~N>Mz@%><$I@QXA(E2xhI7gvFSpeG#|nbuhak!J1k>5fud|U1y&z zvrW%|+v0tKbLOvzsP;&^_~>2Li*P+NT(*g`L44oo-=7{m`C!CAGvYf3ZriN}ZI=Y9 zNPJ<*RGbv1H7#(6*1@YAm;mEsQ0e1n3%cv6xLv*Y}y z?*mKV|C+`Mp-Vl31tVqnSovw=uM<;66oF%?UHDawlspdAY`s8HMAVa)iS%qV-c?#r zm`RE>Ko-<;+@>p{jL>B=OxqN&o_umY&s(M84G@PTa+b+y&YA7m`TsEovGl>QOdkQ& z!xZ;gQ8F?@+k^vs?q^G`L#pKefE!HbQ6yP$`QD|J{ZLN-6~|!I)imK4=3&f-zLaQo z3@-oZbEu)sfr4%kRu!ta@0K@Q%=Xq{@`Q;Xx9eodEVj?2s=Tb)aNk|oAA=bzY9}7S zzAq>lMj$?f+Idw`b9%{x!9Y*edR~7~mQIjtag9s{uKG?1+(*i7uL*Exg?(8py_h4o z@O|Y`Ej-%-(Qc&1_XJ(jDqVQV?7qa+jz{RHHl*rok-%EMA`r&%* zjnZe8==Y}eS>QVgL<*SZtH&;EUUx~!YT8SziZtx=a(mbd&h~sQ06(1%Ii2eVG*6#X zzOGT9AZ6HRCT^NO@LsG+>Qj9rvaJ(KB2G43j4P)x8?K45LJLO{_bC*-jZbBNgh?EO z6Fn2R{7`_P@7Vtt>Of)UQ0U@;X|Htm9#+2w@p(GLSSZErZ>){(h1g@PC_~mF17UNB zFK~wCY_@#a%$PaM2em+@rag`ZW5n)6l<3P|rW|(GkZn)_t13ZpN=2f)%dJJhn?Y+A zStphK<#&P4GQu@8YA+SF@)~t;W-0N@>!^VTo06+oWyy6h+xen(QZj4)fj54LEgH&e z?UjoH{8D`zNM8f`rmkAi5V=|YH>00>t*Lp!RL?@^RKp1dCIxA?B$_Y1beP>m-GLKh z%|scJbu-+&Q0}M`eH^=;?@t#+DUb{~_+;e@g!KR_5zLcpcu#XUwt>x`6k(!78I%uA z?j#C}stb9}nJ!&co>K6AC%i7Yi(bX`hj6C4k>n}eEFg5TjFyR+=ng7`E(1K9cEZD=fYzT zXS9yLamBoI4r~9cNK~r@y_<`5e!10^E7d3%5Cwu*4kT^WEOC34y+HS1ZNI`CrCo6g5--y1Fz@+iNcUnc-iMSz>Tp|1;E@D2;Lw^z9~Di= z;<1OaoO|KWL{kqBWbN84+gLFZctVnR6xq8cr%EJ8$8PnYL7lTaV>^*Q+Jm!g$XzxaScRRR1b}-t*PrOstJELRc>y9`6#> z=04`03ukMQlOy%kCBDmvn|(O}P_1=@>mXBVKc^IznCi(?h2-ftcEglQ9$a^7z^8|y zjvLFyi{9kdNVQD4N_Q^8WWvyNPXA}aKtWG_u_XbW??P$<2YzPGVpy=}>F!rkdz>>L z<_X#9t8OG4mSljmL(1nvFPX=;09Qb$zqdLYuk0=3-G(2$6gF8~R;yS5vK|GQ(9T@ETJTgI%th`aXi{!+DCQtY*-A@&E zM--utlwktQZRRl+@z@aa-^JSi#oralSF*15|i8BaasLrDdQ2rD*g%SQ+t+N49`3Zg#; z0Ktg)o2lnIafO+>sl+Ln1m&xJlLUt_kAeI*;#OnT&s}-*S zwpfekek6FRH=g@*QF`91KU=_*rKabK$@3embqe+4j9_{o*l7c|u)dG^yWkx6ND*O< z!}}h8W`E9-H~09;tzmAD%BRum!m z|39%`symiEk8v=0?CGC~x4k|{PdJ9qSqr~+Zv{`NSOrCI-n>Ant^ivt?-Y|<-vxC< z)$iSpr#u{q9=05c8g6j-S8Y?yVHnt^u@CqsV&Gk(`h!cqB&qmAgWZow>Vzb)5h$x# zxe$jLq?>knrxB{4&+KkRTzuQ+bwBDKp!d|!ftI<9-!l5gQ=*vsLY4f1pnrsaav&p_Q}p^k}z zAgaw9TD*>06Gw>g=tFVe^&W!bg^nLh=wW>C74;y!N{)_=@Nt$0)_nGEmz7KeELDrK zFKYQ7kAyC`lG^c+OdmH|*CZD5UQ<8c0m8?gz(aKgD|Ydtf^RR-=G{B1_mNXH}hq zD^+Ve5l`Yr%%;2rjoKwfi*w0(*FR21WRFDAVYgqit;|^3#b^(1*0v$+4oIS}Q2b@p zSQJQS6Uk_J4~!&ib4DS6G{+r<>&z-I%!KGytn98hC@Gh4ZEVjIzyJUmlU0C{u5BMT zG2?rJNg+Nv(4J2^So#Vy2>j-^vYr^z79iX-c-BJ{Q49= z!w)gH*Q4_65zL!OR(Bi4YxfsVTJ>eF9XD{6Ogcu0deQ#mYSb`m*dTbSV2px>iU_31 ze+5&+Z$X^6hDlkCb4EkPlPx z4a+4}-GJIQ%@`-H{yE`F*K=96>j{pdBFp_jWNm3qs?pgB?)rV*^?X@&DDq(2Yu*4L^DqA*gY*2st3<}H>>jkIR7Cjp06=o z#&#^V?VLq2v0P9P+U1^QtChdN(d`9#A+{zViMZW+Dfgx``1wH@EI#;IjC)WZly*9y zSP6qe@`n*0ot5b*KM|!fUaT<+cig+Kr(uH?*_z~BvP!i+V9jSNzAllg%V|yN!5-S_q}Y*fkj2nbmNomRwKE%=BDu6P(uuY=>n)82y(M18+<3 zc<-^El#^YVf>D8hA|sZ!iYyb%lYF#;C3b7&0jj{FqKgEM%=t7A5+U1P=IGXn1o zr;aR+=$~fUHX{YD1;n8o#P_yK_9=!<2@eGBdevEIZce9!l9p&XXAP;F#vPjXqs8>O zM(Dzi2$))6q=wQj?&RD%Gn|FNDCa5N;=3AnX0n|t0<;ID@E_e)!Qr&^MiwbwZ!HUr zDUiB)BX1};y*9=T+WHSj*QL4<6=Z*#WFCe(Y$tqMV_y_ zY)A{??rNS#4Y57KKAs>v=%b!~m*%DPG8?9Ba&Y#-V%w#@je7-*id{wl zc7Mm9>IZ3hH+ZDA)0Qg4lhQr)^? z^Se4>2PyuQAEt~wbYZ#9)h%?%SrA+O!bHYijIQMgzkX6%ts%d40hv$Saca?H?2 zj_W5%d8Hzmf5PsjVuBTbmXH?@aE-aU&of$+nBD*X1Hr=ojPjG~I>P8bM$%4b9!L~| zgta4(h;8Ymid%hv5}a#|C*btta|u4TWWTvZC~8lscE<5+JMH>C4r=qv_)Q%pMIF+k&hI@%Mh5B%Z3rNJAgn#=dJ}F_AIbx3&~Z;c1UF{s(Y&n! zM8U_|`gBgaIQHheYkpVG7YV=vxTL1Y=)GeF$NyHTWB@9ikfKHF`loj}xNSOo*i2h= zf2d-uJqcAz;vCqSIlJ=~BTesUpO^gAmNDGEP+E-^%;6%tI}xcfrZ3_6QEp5x;jNJ` z%()&Atf^SCt>Hs=*lg5Lf?V5^VcDJ~cEM;otro|y0v=2p{Ay>oZL>;!fj6BDEl`vs zB5UXD`g8WL?hqN+#oxnV4y)GZSU7Rc7c0p-K#6DQ{Lbf3t`4RX1y&wBiusFy&r}Uc zbDeEN*f2YIRd4~0%KM$bc?^$=33|?%7(srBQ1n8y45;TvfQAC7xVv1XtPgE4efTJF z;AR!JX`AhHjRQ_b^YkXg;F@spHZDAiM)GDqNk^6Pxkf(J+My52x3JFO-Nth(`HnWv z)~3jrR5c@0@{gI~sJjTXbd;RT=YsrNOeQdZ+9Q!a9*u=n8$a@d0@~i2QFR;!3T8Z? zT`#qza7VHzZ0k#v+Eo6ty9mZ??-#6_up*MEjOsd~;lfZ&u&I}9F!^FnCl`Gqg~{tY z9(<$TT(e6_;*Q#`_2P+ha9>j2$M@k|h*W}tD0(R^z{8ZvK<|6+4Qi;bd`h#IJNkew z@Caj`{DO%!_(GWXXTBz6=B5Hl1OyBy;pu}_dXh?F8&A+L{*MnYNH?qAzknur3PcTw zRg;Ue*4b1ktF2zUn2;Pd{$~t9KUF|-Fq^?Jbi4SQV=!9fssQKH%)AnLNgLyemegkV}PtjqeS0YAw^*Jtk^Z3Zo}v%n7=qqWM-T& zHN0|q`n`HUpZ!+UR3zhyTm&DDi*be_wy;-X7SE9#gQM@dTNom_&R2af_JM=VSDk zC(U7MA-+Bq9CIDO;xN_vhUO{Q}aZgC)anzj`cHESM39Iubr~@yYQLpEhzw68>Aa$+-G3{%;ulS-}jS*&tkdm-# z@w5^SoiWzOdWL5tHVD7=cV{B$XSL+dc%{zdA@lVF$KciBkJ1QB!EhMs+gt;7oNyeHqdEqO zk(7h3f$Su$t6B%VmWtyC&P5~pH+;!QgP(FKUG&<(pI{Fpd%hnn{nPmbtS(Cz7P`z5 z(1qJWe@hP1rgpfR@3Ux7(fO3HdKss^v(0i`B>TMFw}>r)meUrNkz&Mp!*A=Dv5U=!a3^ zD}tA~E?wu17MWZIosfIkm)LwplE9~6@07wmz^-6_r{R_5usD=r6@0#X{wbjZ)e5)j zy8F355C zTNGEHxryJSABU>An$OeADb%WESy0n`;oNt?R^C@2-;OVfGG4V6!}-=oSlX0}c~}|~#3h9nZIDExQhPR~VT%7l+lMsAU0!;?h7yh(${wu@y+z+wpM{(c zdwNy|wl#JVfiZ$!hTl2X?CaXEIS=KJzLUHA%9eDS;6cSe+8`ceqjd26OP}nR$yC(T zye!zbX>&4FD1giZOzur}^Kxz}S1=>$j{CuYxHT-eAz!7sKEBNjwcaAdIT?Q=Sg$+n z+UYki4ie9xB?-i|4ZfE~ub|{zIhV7>!5u14rsE=xns=kQn1*zZWEK3%pSRdY`~x+9 zEnU}-!fafbh*3vCvW#TCioU?gpuCq_xKIbku~}*g-#UK?aPUWcW!x&GuhQX3Uvy_^ zP?P#0fG@xKISw|ET<(a^0IW(Cvxb=h-ase@%lpBJowrV-%gpE$FRxQNZ|NU^ zbdJJ_oSP@NDjQQ9gqi6}51@H)wKu{}W~^ja;h1$+tiHAe>YPT4!^r?Yp0-Eqbe16! z^T=D%q?@q&O^SL&;$tcpA#JJ7SXS}3{z~`cR_v%V<8z|IOSsOwGeLtT;w@{Jk9E9~(|>lP#$K`QNnmE$jbL(%Tl+qWp>6p?TjlTBb{P%Io$#j zc%(f4ou5cPdHwA4t*VePWz zSbto|m9^gTv8HybADi+=@3UOlaDMd5Mes(YbI^%TSYw*?IX?>KzdolQH>L9y6Im6) zC`J4V`tv*W*ub5yNfT=s0K0fgd(h#7%-z!oJ@srzR#JPE3p~GZeK$KO_C>_ciKd!P za0i$u!no^FsG}VA5Evn~EpHQ$!m;|7Iq@e0OUee`5Q=pc-R2Ia+BD9Oo)<+w2^t9W z>*j+V2{;2;p=z956M>3hrnb;4o1c9n}f(;Hx_;fYGw`G7AyVmV@F7ftJ52owlx9`k94_(69=9V8PNzLuCcZ(A@9wmkhe^N5V*O86rH zo9INE@>?t&rQ%U6Nw6ksawwB#@PKkKLF%@J?wiJW@tWrk8zAYYakVyW_~}_=4)3S` zG|V?K4}tm^x5|`6nQ;~nr>5Q(*rt!g32iFb1~8X?>~A%>A>UTKIzh;?s-!JCwAym2B6jt6nv(ZuU6Ewakn<2GIPPyQIS05?9-vKMPumD1o2_o?@C~ zyFaRDX1C2VCj16VnT5|EN!)$uh`prejYa3Z15NP5A5vpiU~S5^!bSl&O6n>wsWoqJ8b8hT%4+?>nV#~VF;zGm z@!Kl;P4-UdQZ_4c$F9or?!ci-FboASH;5Y5IZkay&pe0G_^p8|_}#MB<}nc><#Do4 zhVaE3?I@}(ri2C%+uBE>hDon=l9>Uw99>gMUBnh zQpXSNHwQAq^#Pn0m~2u`!1{w3u&@0wu%Z4tTaR&j!MDd$-jHdwc*b@N3-bpWJRkKz zY@@Ue-Z3;CaOVEWckw;c3SSziJ&3+yw*!FMVX)h^ItFaags#iA4ieM}DyAT>u6G413la$p<6FZ}AR7Yktr+6_OYbdx4_83oA8b?`cw_ zDuAxQSVwr&k$*g{vJOFUJsYK_e|X9&+UamXgKl3*Q?bv`a#oWOBI6}%?AUh1t!<8NcD!0(!_mRoY(8sCv)5Y~YN=8h3HWe+QZ9&5>?4 znUGMli~fZ27b8GA?)H{0O~acRI!snIYH#h~dFRDjqUyBSd`H;w@bU@P zQ{Gg(2?jM;nc2vDN939wEiF^nPJnRexo!8qaWGrQ;4j#QEca1Sz%7%FRDgRGm#|G9 z$&XIbAfIHfxZV;s(Dd@Lo)Jke+iFelEen`G>%=pz{?`YxYuyC9E9g=@{Dkza;%0C~ z&ivk(uyTlicx^MOKYJK*S1zYdH)rgVBj$aH-l9|n4d=M~M#iZDm(W<^U`uh=sW{QE zKx%7%ycX!030lIXAIK8kg&3NYyEb+B6xjhdR^Wd^_B63Dd|>}WzB*16M%2 zS55Hd5eH)N}^cJZ}Zfj!`x5Ajv~nVk#`%V%myu|F`1%oYVV zwh7Ggq-3?jp4q&Y1az^hrG5?=JBPb!qA{?D1@ex>`O+^9&xwHvsR7ws(MZ8>EE zcegRWAeGS$yV)x+wqBZXmI?1n#BAM3Gw-b_>ONvfF=;Tg0-D#lC;?_s`z|lU3>9}7 z#)U9|#rcNQC6(f1ss z{G@e7O(6L5WJKV}-^NQbdpw*&%H(Ykgnt+Njm{&iyzCwY@MaX%(GUJ23YZ|c^ANJ@ z<5{Z`&&2!q6Tgx}`}x&(aJ{D2zW!`pp6Yt`SJ0$+_Vt$ z0$Yx~Nyd$(Gi_WKTmiXHk5XlR zw1zkRTvQ5tE4{M)@mlb;nBL_|l?jSB%G2<5sX+tQTK4T{Ge8zK67{7ioxNy+T*d(+>Pu!0+ zDOA*Es!cAa@^ATh&8Eyn+~x~>8r{dQ z|8srWK1s#yvp3xV zyM5D9%3w=@t-r5TQn}TI=&M?cgM--0S5UB-%#Orpzu?zXya{dI38`>kDit=w(;jaD zoypKQIpK7+)t*lvaR`98V}j^y@sq4Y9~*A1XC>707SYNhQ_q^X)~9`+jWxw!WbHfN z<}U;n_4>)G5)}Pp*t-c?@7as*2E~@uDH`AaHZZFArmZHLP-PMqibl}fD!XEY#C{W! zDOO-II)UUN8;lotlGK;FHFjK1%RZINm~DaTZ&lwM8Tp zd?yzss$MT<;dA%pH?%!}NW^LU+gQb{7pTXkvsW|VF+oF1ku*D2ehDQ;u=;NqK$dL> zfO*}tCTiFo!{81CX5w5D!|WUFg5Ucund`Nak^zixlBaj5ZG5S5_DKC&Q2OYp+@n#9 zMWr(phKG_B?NNKb6?|wUbfZ!9nd5d7TW$E7&LhTeA-gwhw>mCQO%w-}JWm+Ed;RLd z6Kv%da2TU=BlxekDMLBD(SV(60Y-}F!u&0v3OJeXm*UoR)IWMEPa2_cL zXox+XQdCEVb%#%h5p%xnQ+E?T6e|zdLLIGJbwEr#i}#%EmZ|g97W3X@GR(MN`7uQJ zKMW)oWdk~$|_s_~v`oEIHXZBL-enZy^{`+>xqZKc z1F)R#{FO37T!w2|f%n>Zr)9{M8e^xnEe%wc#va;7+HU6nvHxeOBsE@8^#tBWOG@%9 zt$D?Y57b*%xv_TP|F22+%ZX(%D^O3s^XUIh>B1ZBb-z}Gx0rG_5>Lydw7@eb00080 zX|#sxRY}TjozIom5%kSjHoUf$cN34fKzT8|2oh8>MN`p#lIT$& zPc2k$1xuC@^scj++ciD9d0Lk>$C&YaKVL(dN|8atipl-W=kmITy5G|!Aw#UsThiH6 znmIe_tor9+r~1K`(OaAL_5$i*5B|D89*Ic5T*vtsF%E|BzR2T{VRTg(J4X1XM%o=b ztf0uTQB6Bkiq1?E?|TNV85LlzueBd8D6rDcl9ZkOn{tW=N_yHF@gc~dTXLLrDH@a3pNe$3<3(8;4_J1fGaw^Zn+SG>)}bYx9#(28G-RE zDhAK4h9H>Qk@)x)0z8<$z*9(F-Q7FA;bH_n?Ny7impjX)GPGbYfB*mi&k50CeG1A8 zC0GNn2#Fw9Ddsp(Hq!@&2+J(=1nA6D2*%_hGG>#- zBricU$Nyz*98#$diF&-sC-M^%BCcZ=q&3EaIE3CwkmKe<88p4)}{|SlP4TJc@6;>WI$o8PRyDSxSF%}BI0003s?YOTUf2RHX z&Jd}$DK5R^r#pduz+o;rQkZLx<`xbX0VQ{+uDu+O;(j5{8*6CDh8d5T13#>?irlg( zSCiT7$Gi9yW}7=nfci>|*Vp7HrfN#t$DWr0x<`HJ(_F$aA{;E5zLYc~v$?N!AGI$` zWgLylV?6?eAs66ONOW@Rmf2CfgN=R@oXThL-uQt;9vZO;En}`mqj=l<$LgAj1<^#G z82fhSN<(Kjm*-BdDzHMjr>pQ4!0jmFt;J2^LEe+TOKtYgBbH9P_5@hT_JE~&*K z%(f>uuzp2#h=S)}7X9|YE<}9XcTF=$fQtxRz_%6xC%jzu;Bt)$`GA1JBQuJRvBlMR z|4>`gMlRX%xr3eE8lFbhif0ypaDg+o%R*zGp(AY}KrkN7@oZLW!)|^(?^6M6{g`yT zocJx06h&EPJ}Q_sb{|h{M|L$`wv+eb1VW;#`PUv{dE8mcz?%yLLI&2hhXg25mVaaa zgd;0?_3rEv-WS~^wJ6HBDOUsw@0l%mD2$;JTifm;eDUAGjaqjs#bPTRWaj=<@1vmC zBn)wfMf=WBTixToiOAk~XYUR8c`(Z1Jab6k#;G9hsq)6Psl6_fE+4!-}%l)*z zJWF)U^?gqBPe!LY0wcG1Up9r6EW1NFhz~7DsF2?uqUJKeMs@nFDkCUc*aI1P3`qrj z!JmNCUe*>h-il_OpZ871LI9?@(ybZN2mk;8DnY#tO&hW=*6^^VaVK!HGF<-B2)0+g z-umMyTbyXp{qJKfeX=t)2{Wk+?0uF9&t#=I8h>>ZHsjfJL@+9p7eBJ4 z-1#a3K1p}7-g!6=%j)yr~4;s0D4h~HaMFBFa<+h<-pS+R?fYyT7_^hE^ zn8K3G$BpHaPrrE#UCQ*G_TU?9&Wq)hZfM5yZu3Gd>nBaKXc^?G^gL9tfq0T=FeP(N z+!XEG!Ojr@)R%T`Kt)r5>UdR%aJPowG%ee<2iiA4p;YrNW*cC`N1r>IBBScipi@~z ziM0sL7Y~s8)&r957%BLpU65!69Kf-XL8CO+HMM&yiczT_1`sV(+mxk;B@-aHWSE=4 z=u{vCWE|G$F##uc-k$Gx0000~l~A!Bp^V>KlM&MM7_M*y^pkruhbH2;+xGQa^fFvu!1cXSy$ zp*BL;(@;>0CatRDYk(d=PNsn><=*c+y#N3J0YB;>y>S|X+{1$O&5??ZYE0bEoNL4~ zUlb9H;T6^)rAax?RkYV>#4(v{&`h7gxF%~24;ojw@PXHaLBh*gkP4c*SY643qU`|K@c4#bQh3ghYNxKhM9zi$aq^+$^&R@kL*eYN?P2qI%8cfaFjs~wSLPDYN5^b*Wmm=7^!Nms|=Bsep#b_#d zElRPU2SM`?w;-lU^4pT0|Gb%smpr6S$ATgxbyS@JzzR&cou%Y#AKcDR+?d{zymBDc z>U~7ns{F4bNh*=08I@kLI;Geyk#7U%734UP^3G6}H)6UVl?7daT;{tw07zY16Po_V z+;_c=LslPkDe&LEIM=}$knITg0001ceeck54oUB)NgC`^XOU|DVJxx=&G%63Bw&3w zKLaND0QnnpWcWoeM5mX!dutGGbBMgR@WRo&>I}=Ve+(_2T&0;|oTyHka`~dJs#c{b z+;{B4@bgtwpmPkJtN*85amN+h(Y_Tus_V^OnYLOnWcc_3f?fJdmivN1_}_WIbrDdm zyYAA8%XN6^ee2_*ZNF``h-Pnez$e=sOjCQhWs=Y06_Jir^qN)aty z#V5g;QrY?GPxPPQipBqlBUaM~i*=$ECecuUG;OhUi^M}D;74^5Xu|3s0000TN9e0_ zp#f-%fObT#K`d*vl zyQU0(QnX!qCjcz(`$fVqoSbr(HceH<^@Sg(RTQwRzw7R0YtZ*1?+f)5fsry6`QD0Y zen9Z*il(tK=u3aFB?Rh)*VHK42PAPMh%m!B?2R)#mf%RvgEMM(espKmGEzexCSqPq zKA3%!XmoVX3jhjn6>k>yDO`EwkV@F=YsV%~R6-f+G6kV%$1mrsw^X7g!z*9AknT{A zQMDiy@8t6d?o6mBdu5e4*gHZ8Am9K10m1iDOfRg_3yLfWOd143;6R@y&9^GGKC^x< z!z3ueQ9NuNrWi^&0B8oVVOfB>9P#kMo6U%Hyzx=sJtori$^s{F|Mwt!C-X@1FdATM z``C)MJG`!0rw7=AH%zodOV9>S(0AQez$lX!2NuZ{ZO)JFfJJzQS8>^jAIFgEA70C_ znpbcm1Gl9MSUdHQ3Ja3F%UkHK+w6P*f$ioBr*qpGOz~p%dq)4KC7?fwn2?^1tMNYG zXR*e24Ddm8j|-=Mp`ZYUeQKMS;V$u8nBL+<=xj^RIi%IU8>O{ev$C;D`5%@qM11M^$vL|+^eBHjss3tZbL zQ&msxBlQXC>0~I=VL|I4uM=2HW#3Rim^s$=%wUPK-`&70aaoSs?sik4y$OWGeMV6X=<`fgKz{Yzsqu+3<0FPf#c$l*ZNli^9!Sx>=Y;K18v0nSOoP zf-4iB=aKtd#6Q>TU;KEDnN0Heuw@y>P3w*Qd(oWJfS+Py#^`xgsFNo&tfi^w=gbKM zP{05H0Om((NCt!4+Lt{r!dwh01-$#S(lka%E_%bb#PM_=7Vl$My(#L8`}7h&5QB`0 zm`jGJ-6v`)O=3L`>@FQyJo6NA-B(tLZL03SM|%%@)la-rE{#Ld+knYPWIe2u*s~f} zB;y;Gp=lX8LVzg~Y+R)t%B&Rxxz_r8e^KlA=Nz6;zi4g#M5XdM2aBEPV?g{~bp4&e zf{Jv1hJ~gMx}m(@;O(}dhA!*uD;(I8X#fBK0v@Y_=VX`HbSQN~c}T6*Q49l0kEWQt zdNS`Vd1u2SC$!LakZpC)r7EPsWW^tlmh1+Ct_jct0HDI)>K;?WX%Ph2)Iv@YY*%~H zmVq_mh%AbzVX}UZqqBL!F7}$_k5u+yAEt~lh#i1NH9ADVNdM9qkkNXY_Qq^e^9V#{ zGzPRg0Y8jdbsN|u$C)EM>3^@DSQD=#vguImzBo3DPiT-wrJN#cbNINx=N;Ke51p8^ zLg~A7eCS{+f^nU^+c~``u1SHSR+UnK00028)AFe5HVMJnh1-yNK~iXgk^J^eusk~% zEiNvBlp$fvfbz3*1|6tCHSnEM>`bccgpA9m46D@-)qb9XDuoQ3fsI8>TM~m3NFDDD z^4dBuR7er{K%O(~;tGcLoA2G5l6uUX8W54z2JFQ~SZ{7t;%wEsTH4|heiW4IzOWg8 zeDS#jw&vgIbNgOhC>7LIM3SOPs*xLQlbQ*TO(ltSkj!|`RhG!^VUkrEq=A9+br{e_ z9TeqaNx>MP;wA_XEMctP@=WnVp*UJzC@~1@2)=qfJUl^w_}-r&d{VlzT8=M+q7mRA zjjK+Rppa<6`*(EkTptD6Aa45W6Wi}(>73+cYR5_5bzz%@`000Ng#(YLHec4BTZSX(>!0Q=u+21?yfisU&`&Rbr)idW# zs7G3}0;eP7*T}=~Q*4B;C1R|(4(J2{fx{Z4q(xipyMfb%<%+v(X?(7iIvM-RyF&V< z%G;NKp0MWv?nEuG)@xi{LZj3LE;i$dJ3&Ukd!8LpdW>Cg^STO!Fhz7VILLhLXe6W6<>ble^6oEFG*43uH3&rKY+zWqp(k~fpKps6ZqqW`w zW=nTKkxFg`5BD0&4#5?7zEEvGCWc2Pepr4ESju%4lyxjJ00057MK2mZb%+i!^qNGK zfqY}2t3KmX5`TCtH-U;onUv-6L0dew=}`nB>G2+kzS@RC&3C6(6A^}H=99p{Z2DK$AM2_V35oN{ z7IkF0c?)J%yi|~gwOBPCyD&sb-*ONU)mH6;%kLb|0o0;97Rb!bD%?iO<`1$XOFe9m zrDDZd8)Af5BVEECwTPRl1JoeHs!MS1br%kKdImn$Ug9Cn!3oa4K<0nDvQHeNYr(p( zn}t09YOMHA9U(}*dj5RDjvb+VtdhQv!BAwAi5;B6iMPoHV|uLtBhgRL&Q^wi_S$E@ zWw_rO6WJQ{NdU`19Mg=KT;!!U9uU12`7@~tJte){U#|!0X4VPyr9jE$(>QXF#@x{c zJ#pE$xhO=#4-e3boZ;ic?;xm+K6@k4SPR{cXyGqw+L&~TT(ZB6;f`=xO`VB;Cs|LrKfFh_ z_Z-R$VHVeUqp$5!d1k1Pc~3b207J_V_rY`WH%fp0SO51fV+Q>?N}VN6lBY>iq^Z(W z=_+)UA#onz@Hl6uz4zaQjsWA|-`pbn1RD>Yh5i%&>Tu{>aK5o&<@Y~$-9R+MNO%KS zk&1maBALKKuY~IJVl|7uT(Z5BW-CO&cR5rH^1Ptw7(5<6QD0}L6x}__Y)swnw$Gfm zJ*Yc5P#mugo#~whETtQmkruy(8C47392s>V zIT$+tJ-`>TDiV^ygjl#C3c!iRy>|axRqibO-JodC0}m;{|IF~ey;gOk8VyF77SJ0) z)(T;s63-Y1DAiCl2Vp&KP&eDw%k*8@jwl*|>ERkNr1kReO0@k_=_P}C%KlrN77 zbaAXyVIKKO^W==9q#4qp}B6PRcDA}_Pp&Tt&{+q=~Wkg}{KS$__4QE*Fjj{}I= zlT+bjw!` z`v1Cs?OmIh{x;lDC5TlBDwGaZREc+MtD&4uCGB<1l%;8OF?oC>EXgfDXL9slm?61E zVXp%vRYO=Lg6pHMu$W>;S@`qwelA7#~fk( zW$UG+bXoLrv{I{YgwBQGOBTz?$qzFxR}#=*0J2TIvfkN;$CLVMds{m#7h4=PU4R&) zyUa#i_25nFthw5WWo_!92_!&)Y6>yZykT%q9o>qlQIn-jLSWjUHg@1oe`M50U)wmXHVl008cWY}oNMC93dUReDCG zNk@&r!~c9NX&v20`H(iPUeaPVEyq~~HpAW>r&nSR_JoJcRXUE}Pq@UnE1fd3i6)5Q zu(10ujQ;mD12*tioZ7=Mn(5<=5NY3z81dZa5d6@Hg67gE#Sbi1c)Ar~N&WU(wLv1u7_$J9oG1{{)a^ogc~6BybH5JP zjp}7Vd>asn6V+P@$RjJ(VFD{tPLYC^;WUu-md&kcGK6Jkm6_~vDqPt+H0u+ZApuKk zl#;0`LKICH%yO#dV!=>Zq_s@eYpmAIuNAxWPkO9I_AlFBd4&}W6B`SJBA7yzHAgTw z$tUIjF~LhCnSTd5r#^ff7^3j4xmc7Sz2uuuZJGa7ah!NI8*yDgN5rnn`1eBI`4p!@ zj$sx^lSl~sqk={rt^IwQ3ElGjCCAsxc*>JBg1<-{jh7{4xaau{6gUf_uFVheoRJ`0 zqFDDRN|qJ)j}ZSE<{gjaEijSN#8lYwmzx$G73l8t#a9i*bmnk2ETt7 zA;AXsiy#Nv=+0P&cl8>0St{>&AkhJ}N+XvcDA;Dun8?^!KXr_cOh_NQDU)BHs0DUG~ z35dQ90QskRAmPL_&P8t2teX?ys7?48bvkITxjFn2o&iD$IB!HJQ+>#BN+g;mNZKDSh zDQJi>cUXitBYGNKf?4xgZDxSMByp$Ju}0zccewUx&v{a!V310J3H#`Qp>qr1EoVvO%_-DC3l34IkI~yA@xYS z=->Mx-TOd8P<1OIq{e{VklB~&RJ(X4UN!mb$JI9^)=a_x00x!s;@-4Fk)d6oVe)(M zAkGJmu?Av`(-3<@#uMc!nGfZEm&?Z zP`o!QLo8@Y?|CXkk?NI3=z_`!A_ZPLRpKQbLbk;tgHC>H_~>3osYXmAB*mweSFoXm zSH*_HF7Hi%jS+MThw2^1mREHt3;f#VSJQ;-cSXC0qnJwe#5fKP_q_D7vw+t<N!_!7Nqw9B|8j3E)&mz~-K8TyDsX=77yUXBUcUg`ql(T5ht z(INEXi14`_nSk&OwO0kKcN46vw3>4tWJ?q(=?@x{ZmxpY3;xe|L!HXkMgJbmR&K^d6w-ri95-LvRebzkIwm4F< zR#=|L0BY>+v|;0PiO!Zs`DBxJ^}_Jh4#NLD2pvoB$?C^2}{1l=I$0B*8?^3{ul zy#7w3u=QY9RG0k*`XZ!on!;;vP8??Q|3JYAtvN7*DYT_;#GfwEj8vOHv9#6XKSP37 ze;E0a8o=GdF4-7SnA}-6ETeh+wQm|%VYUV7#_}5+Bv+3~h-kZR{a^^UYZmNwQMUP` z0(Ph2&1{?v(5;&7&It8ivYD4o6t3_VR{VM4j~l2b#Mcc=mBrF=Yy|recJ$r8eo?GL z3au$d2%XOcLZ=A79zI1vI*d)3%lge2*w9+n1j4H#CvqQFMhePWWc9^H=9GHH;ibzK zh>VzUk4;|uvNm+LU!GC*r?w$6Uij`;teF>DYG;Y`Vg{zA2WQnW_ZwE^!wd@DxOw= zjBhaf0DhrAG@0H=O@hjerj*-D<(3mbb>bpIX~429XQ8N}TFp19{`_Q6tK${?Uicaq z8L73lTrrPOgA@xdfs`@g#zyBC1jQWKQ$^$9Uh~mZY#0!`ocmw!lB^$5p}&-k34&I=6`+gt43QWXbZEwA^fK7>2&VmpW0i%TSR zDrRv{0vk5Y^)xo%*M<&6@T(`&wSxY&-ky(bqVcTv(L!29on{ly2V;rzJ%hn-XLNJInW>PC zByvuff1V;ugAyHGadx743dY|_?>kE_N0}*-0o12lu%~QaDlrTUOvcIIozvsBbOgRy zNMBK0UA{N5zSYvhL*@q7v?!A3tmqYKlj=##yK@xGBex9EzVmI+pvK2MC5oN;3NXYq zu zcPBJFnY6@Z!Wq|I#pgm}UYp^UZ0L{esMt4=(NZgCmckUu$OJjUM9JFt1vi-h5h5lS5v(SN2}S=+ASVh0>qx z4Hl81qt5KfBLUMw775~W!P*o1$TJ9t#JFee?{3BF1i(R?cuHJWn0}5>eN3l4%J4i+ z8SYw&n*Au^llsKpO>|DuH*aHNY?Mu z=c;(cLQCnp8rJb!>w!UYQ&^Gj;sDAr3`K4ShDf>GqO3A-zH^`hAk$H_tU$%8sbY;Y zH{t{l_(O1+;1P%S&YBWUhKL(lC!2_yBrjE{%NXsAY2rJBV+R-1F;`lAL9 zFYCYEzDgp0lyee1hpDc%gAbJGaf4n!0&XLg_lQKQaOhpc6&(ECPp|MorCpYavs_xx0<_zM`H!|Mxh zF4^3*X}C?)R(;OEfvs`S;o*JV+-&Er&o$#X3;@2l2FYX#_Xkk#BNFa7Z63Tz^a21N z^8xOkyajxaW6uWfaG`prM`MjVV3I9#I}fKgOiqjOi)aPU#B_80t=YJ*t->X_U;@?` zo8_8Nxih?^R01F+yd8%-QPe1>e{N_zfgc_RrgFdteDU!(Ls3Fn>xzog^OH(yM=8Q3 z<2{`%l9xk&IWbXnhm?MNTpQ{l%FFYCTdYk`dA8SkboTZ+<~zKV;A36*U*U@*5 zs)zm3Jy0}qt`N9;v$}o>aJB!wg(S<{Zs0T20AdU43LyB18e{Uv#gP)+k=1jQ%sL`y zn~^CQhv3?s*%8|GUyHf=O@eFhR*Hi9Rs8EIA=&8;*C|hhES|D4kHP{XGJcncj+066T z%`=>wp*S)xm6c|-_y`E3tpg0Jmat?QxKBoLs~Cix?Nb>=sI4s>ZXG8#Ee14%TY6t+ z%xv<>)W0a{x5~&#&|nEDXi~?$P>wmV5sMm$kzY*9{w_GHxe(**LiB0_d5Ph!cx+cPlI{jI{N`VvZ|?>xq@)?;^=WdW;0Ba69+{#=R-Ur z-~qmzHOQPW*J;l9RF5K8R&G#;-SXPA-Q1Q6ftI>1B>3<8=M2kp!rsOd6)oci!GfC+ zB>BHR{!#HR%&IfDNio5web|amc}TvvL$9ur{-N;y4wedok@)+<`4&QIqyljDk8nNM z+%N5ghSH5+AD*L+0=1+1jwF~{`T888*Qu#CZU&!`Uc~9)I_4d$kh#2#sWFzb)5!nq z0fY%vvR&HgXIZTObHMN~)Dw#7rhmaxfS+B;2p!pQG#!|~5i24A?L>8qqHN##yPtfY z`^9SbM3+k2bPFJ_POLQXw7nb-=abPbMxk%rMu+qbx@bnA!s#+ooCHW$pp(90QBN36=>h^Y4 z#u-PwrHO3LrM;x)a5i6AQ0tYGkaM|Q1+4Uypqi| zdpTLFe)3pEws`%FOl^~xY9HCfUy#m?%?re;5u>Vm|cOd$*~b|nZ;T{q^uN;`oknYUBlsBOb_LBh5Qk1??+C@XWo}e z2EDf7MKEwf^KIzjQG&48s(qJrg~87BTpn5(V~P=0t4M-FuPW*-`#?uU%M@`2kqF^R z{HF%Gn9=Kd_HML;leLzkh=oswnYjil*N2?`z#Jd&>Cp1}4LMIZ!s=>7^fFF$L^JX3 zID0P9Zrk?sLqId}HSFG#W~;39U&({oxubE*N~V859v$nqs+(2_%!&taG-Z0_3sC}m z{+-Z{Z;Vtw*G3{zP}^nhzbzEQ?X=xAXTj8RZ2y~OfDsKR5Tm4~*?4{9B9tKic%ITX{EvVr>#)82LtO-VX^uv2#4=bOlf03u6unwc8P9#N_jc?4W9 zS;n>)ak7^pG<1AVdBWaMNlM{6TP<Sl86s-eEn+8f4njp@VSi-2KMJeHEm`xQ4FXA(Gz`ir*}1RKa2+1qeFE znJ_s(%dGxcXN|Mv|2B2})j81_6;BJ@DMllk7XH-s&iG7rKBjWOaOlH}?SDni=en=T&i%w=swG_`6johWYqX z)>w&it2cdKQER4x44n~Qxf{bXF5RXCfJc6E;DcVRQ1-otT$taMCa}{fg+~V|Hdd?d z%uI)%+W~=sxX8;EsUCb%>l9;{LtjGO&9Bz%cm+OL7skKo!+EBY0X7OCy!zLb6 zcRyu(p|jk`ycLD<8fg^py~IRXecm}hJzqL*z%IC}`vv27t>cIy%c-;)=SGr&CzkW(5JeB8Z z&m{UVLm{(_=SBA*bm*ip(Qp}*Y3$ttUkdDOfY!7pVhR*{Gky4rT`G9f9nMIgNZ(!~6&o^dsA=0h`F9L{G?Yc0A2oOg6t42Dfio{vSrU*lMZG0${fMRNrV0 zxHuUY7I7AaNJh7 zC9LN@o#b0j_FqjA=EyT#!M7egsabNG*3%i&3TfO-pi#XIRsy7RRbA zGYYhn-D}y$N#BD0@f#F5@{+Y}2@%eVn`}4pMFF>Xmap=a`Vi%+>v-M-5yOd^6o=}~ z^)jv$9v=ylOVXj28Iw$7RhUlN%j?6%DZwGb4AbhaqD{+g_bYXqH2gf=1rj}P2k;{3+d-(VEQ45qI2F{I(Yj`(B zmt|}-#THx6G}(Id?eu7(AcB=s_%NwwIf!{>hIFA2V9R`@vZdEy5y%#uwo#7`vtZ=3 zVa#fq7!j{2pRsRgz8~J^i&!M5ce=MsqT9z%tIo(7idr8rRi^S0j@SOhWa4prgY9vn zyHgVxAMyRB`T+3wQGv_39oy)4M=Yn;(N0cD`dO%nOIa&>YG#R0A3_5Ucfq+V=;;sY zr6fw*ragYzT#ITmOo{^Jn2=#!WMHmb+m|O)q52dexMd0+nJ8-ZQ!gkz=n*g3J3FQg zyD*a{y!g@Du6&2zvk9oE#V~U#rZ=9eYh(a#kyz9YFPn308*mHTXvY|tlsqYwHh)Ri zOrLEg1Z|6=kRGjNi&wiJYS(|>tJB<=(yiuf6b?Bl!8Uh$(d%8#1oHw>1vEmc(7K}E z?4g?)C;sKbTb>mmw}e1s__Ek=*CooFqW+o{4>j+;1?zlh0dA0}3}3aG!7@89y{M!% z-8>u1mFUfc+dmJMUNgx=e<+gmQ*`%RCa&wC@e~;RSAYbf8 zHFjK_$GF6^@}vQ|PwH4!_cLDGT@$nn*V}uT*9T=D7GG+KMY2@p+YL zekYvG^{sSazy%)wk`xvUh?;plrlh~qzv|{R5z|Orwt9>sKDGFt6h3!^?U7m=d$|tx zzCJ|aktPJA*_B*hcz(Dt$ECIW%)6~fBYL1JPLh2{3=M)KI;3Ora>gH*q;kJLVD&P~ z#cO4jDuVzb7ipFH78cdXIUqylqF-Hqt<6V>&tpa=57*hiu1>R&)%*yJ)z`g`1f<)# z_|Ywk#-{wv^@%RCp~!_)elYoa@Tyu1`Te>h9vnUwxP-MW#!K~aSnn_e&(<5fv86gZ z{F4H>4M_ye_GtsbBs8o;toZ|2Z%1vE%}ap9dA=ejD^rO{X-C({T;+`0dnSa}7K%g! z)az7!b}V#IoH3^*3J=iWK!Kjxu^@?yZS(Qn-H)!}L!{>y@DmWZohZ3nT-3^$PjbiD zTu^hELBBIaEs!l|^f!r_3fjcfxvHJx?u~MOCA$oRX5$N2WyLiS(py@*qMroqH47V=|K*`vCFp z$W>Tbj~V~R2i_${)Cj?oe}Wxp0j_vK7OT{>@#PzW?s>&!aa6m@r0UYVK)gls2er?F zbCGr*U(|F6^DC9!h*kOi5#l#xij{_Bto;`G6P|Vx{J~f#x2Iio?2Kn*H%~V8>jmy2 z3h01_bXsFygm`6ycb-IF*#-uDwMrob6lhSpw<0cQ)~Y&^--Vxc&gd2_aNMSq8Dc;t znRA>_Bp^!)P<>96|TP!rS+NSEYD~5Pb6DVv{O#Pv=oSfhIxeSw$8uus5^2oXIC4h6b^I8S5V9l zWBK=7>YnTwZ3&Zm5J5k`;EB&Z|1tOiRr3_sA@$&Kz6atLHR>ShXF53$@q*75TfQ#s zJr2?c>wBRsEv5E@`Jr6$fg&r+qfi$l< z+)QoAnHX*V11gKJlhQE3Q3q%ivl-zQ)P)><4un#_CMp-6rwn5_%31WhDpg?}30<*( zG|KIh)@VTO&+PJjZKt}rU5K*>WT&4Ti!8e{pGIAhoT-8T88<9FrB-GA?%}i;j!8Wj~#O&+qv4&tnYmD)>#Ci=+0By>TykPqwTuIL1fl~!Q182GA z3{DyT>p`s5J-u!PMshnEHc7N;*M|;Ut zE*$K?N=|KL?l6Nx;=Z|6huVNIPu|gUFIkn``=NeWLH5_Yn6M55kpSfAY)l@UZ$K~L z{_>zD>qg`h#oXT&kw&20PK*1mpjL6fhZd>%CgG(;5o+JW&cr|rFM)X^%W5W1ZXdF^ z{v)D>!v?agZ=sH7_jC(^<}xgOaWmGJnXXB_+fa#6(%tplZ{{RmrYc`)bJysD?>$9z)q#X_STh0KAU-jns=NQt z)eDuTCQyrEsm^XqR{8@R2WIr~e19?_=2cu zD2mtNgTa4p{~zOPNMJ;9tACzZQhHmjTbJDeU8RoRRo95uo`f8sM_3eh-^6>H_EJf&hktIY0sUZ< zUZy0=-uzgiAOc`oO3-`iN$plHcz~`wrH?>{v}5LE)dvf zlzXq%)wYX?DV(ZDVCZ8I}8rntcoaTP2O>ss5!Bs$QVgpc~9BWfR-T8 zLoWyB(>;N*i!Sh;TA3enPQXf6K>b#|&k-IGK8n%kqsFa=>>F^w19E?0R=$j}bI_Vx zza=9y)mR7j8V8fqA*2T~8rnSY9KFvmWUp&v)<6D$d8Jm4>V%f|;p_mE@fF8rvJvG1 z+7=LX>5eOLOtR!A8)Q*rpc080(y~nued4w!k_n!Tr%(RP1)5fUBT&+JYbSI50pvp5Qle!1hotH9^HZ#C>ZpV6H?Q;^q z_m_o2;u=T=kvpK%>34((O_b@6YbcsSvFK(3&<)hXU`${u*+T;e1=+l^vH5_d8`x8O z&_Ry!EuQ(!?WS$zhc&d2Ppyw-;-9@4fOH&7{-7IwmiP*X#Du70qI-Jlmqft8P>*K; zU8FRPd0M_iEs54O5U(L&Bz~p*$DYE~d{()Pb1&w$=(Mt1=wBj@7;qp$)-8I>(rsr9i>~`UoEoY!Z z9%u0Wm2nmqrF5*k&20-I}U!Vl{%+ z0K(}>w!(x7WaM4SG8Ivia~)%=+E7*`vBg%V^hmQPeEq2Ze5yiXyHk_EdEfy>w(~Hu!cqf-yGS7J<>8we{xc^%F z^w@p{>G=J^rcx_d$%#b|8p*vP_v?EPRY!hO@GR@u5#Fa(dNZKqN=oO|O8P)8dU*%x zR_=~F0n#b}{73xThl89cmQZwTyU)7BHu{NlX{%oBlCzPL}qHBdM1hF-%p@6p?hXeHl% z$?;~MD+n0)#RUlt>SOif>=#>y`O40cF>5HEvz(`p5FPnBcmWabbzlr8dd zQgPY#6PylC?m3Ohf#&n`I-HvGs`n~Z`$?#ItBJA-OmUckMUFv|yge5E;MxQfUJE(6u>*~muBHw4f*~q~< zdqQNtsm=WEci5HEB*7az>KFz8Y>N`cc{KyJwo66o*@yg90yT zX_n}RK5|DK9STo*`bgo*q&6eiJL&EHcipdj(UdYxf97QlseP7>b{h4i+RxJ_zyO+2 z7Wc9zoNEV|Izj)}BHbDnXt=T?cyjKx#?AB?8jDa_7YO0srblWKQfk*^ zw40=(W^1#Cy;Q5$$+3pM-z3)_dWOKR_MfdVrh_M;VJ}nD<5twzuewhV52LhZ_GZnp zvi{DgN_AkgeS<=6=1}OTqU<|~1{-8y#-K&V3AgUdH;RRd9=Wh1JRWlR>LRB2H~dXu zxKC@?4oMA=QrW_#zZsS@{!yyIpQ!YtekT?wjx6@@0R{Qtr-)K?1rh#T+H#Ry<&bJK zfc3-G+7@hjS-F4r2U5`)(CzH25M^^hP%A{#O;DJ9y&gdQaZN>bnfR`}vz`0ovc!a+ zAfr#zxOj!?ZUWdI4!y-NcKT2XnHOD=ev+*L{YGIo_MU&tuc0;a@Zv`!Nvt)_N~*CUziZ3de#16=bzF(wWAbM6E*hx^B)nqgXT!o zx;tIci%5(D5g7BMBHXHzoOD7OzP)ESzk3=xKw+azae^XRoXX{g004`A?9V+yiyG$N zlW{gXX0#J}u+UAxicM$%oG7hG6;$|MUox(&BX4Q~o`AhHWbRmL={6sBSaW*Y>Z?5Y zy3VtQBFH&R!cu_3%MYiVVgueE0MAK6Gxa4j<8JR8JYhzgEd@>|SbtiVmSqqcO-n-F zE7y0z{I?UG6IJ~FXeVumFaxC~^`s(B?BlWPE3p_85%5BCu2cAt*$lv44pBmwB)9^C z#ha1o+OWhNFz-~T?uRua(JJOtV6tvCcX|LlT^7x(Pu4X;*q6Z4W^ECi`h7>;x>Hjl zFrmyTQ;ODMi8^ovNI}_M8-K%(CDQ1PeZVLGUXr#gBX`>mz$V)!TTo^wU|C|{5u^Un z^qF%@zy4(Nn$=geoXOXf2x~8KPnnryzRW>Ey@UCYVX`|*U|f=LSRA);;;u`|y-XEj zqj?1lb4BcJ>cWoTbr%T7S7F)3SbYkEU7+?5Vrs+K#r01JbdII$?+8|N1?4ZRknr67 zHL*@4E?uy_J%gX+8L6<%n0;DeK?C1;JzcTPvU#OkVx}Sv2P@Jh+}ioX&~6d2t~XbN zqb4iXQDJlK>~*~qgY%pw3gZ~o2&z02vb%36FOvGHF28*23bZ)8at6{}n-6FLi@f?O zvj9z}veEMLcQ2Edz!V0~t;+c)WaC2ivXpry^z)u|9DTS(oE+ zCcq`EqW)5>U+oyO8C{bZ5QJ?zy{eGSBdoz_04xmp+a73F8I72c8k0J8-wmBZ1)QD_mvPwne%{$IA#Vmfh(bXS z{(ABPQ4o1-`4K~!Miz(_>`V{!=T)x%>CbJ4bSkoDn-=ysyc!~D@YYV|!!*P`tnJSg z1q1{W%)4B`m&u&S^hargo8(@OgC9&uZ1o$%;T+0$ww$R3q;cgvmhZOun&o5R9Z1u3 z`(ph;&M^%US`s!7MfqFj7ynjJk39)0fG!jHl8-T@)Sv`{w}<0)op4|TaZeE_E0i0c zT!4^}nKir^Tj$*~t5nPw5f0%UxaTL$7yv*F()tpDow(|%V#9W+g`t04)V=;)j>wB6fPXaKX`U7#p^13~bZ%2o#~XLRhdqTXU0h@C;d%4lvpM7o!NYGC=v;kyuKHSGNu8BlK2Shg;OT*3A7M zg819P>{G&;RC|4NKVwc$u$8F(6pb$>OzxxgD_a#J41CI{fD13qV{FX%r8S!?lTsYD zBHGoW7n0Pm83Zv;<Ro>zX#la(cq!a6o&wJq zh(d)hhps2K3VwDNjzRhr-t@aL+2g#n0d)uPH5fw3*UWI7eMFyB!H!l0q^ZelXrL1* z*uju!75S~yJ=d>3QsNfJwtE;y1sy+t0mdPxlSS%E>)>|X9Gm3@fDz&bm%O8~fIcjjv$6~nNIM<4d1Kifh~nOS zo{jW9CVrqJxJTE5#T9Ycs-&S&`MBJUQpSzUp` z>}Odfq?F0q7vsx28|EL47f}bmd2}J=X(LFp3kZP`TF4|4pg=Z6TKAS4A+10`OCuO^ zST?+?kV@YDj=AngWkA`=x{B%G<7M&<*z1_r?z5Y@~kvYNn_cIkB6Ek8lk&fm%{XHM9X zy1OjeF4jgPjOrV}PHjJRw!d6s+N^3#`S&)5;dWUwOo-f-0I?0=PN?fRz&g?esk@ zWpwu#sW5lnk+|8LT$dnQrg9rQL)Z!UtaVE3s!DBEZ9kK!8O`j-bkJiSayu4Np}e*Y z%sJZ)89dDyWx^X$gU95+BUD$e(hUzg%t#7J?Tl!hn$+1Ef=1nj`%0+;OM7_8iyWF+ zd`JmCy(M7(bG6uxtp4%kk_M}GX|xRscN*EO04<{x*0+$gjXPn);A}ZTgLorv+Sx~p zUF(~|g&IK{yoC~NrQ@^nHPk(QEX$yY?pHY2RhbOlz}M6Yi6-x}hP&=3Id_3C3s&uQ zDCgYAn(QZj9&?+!*aRkF7>Ky1s%L+kjt*NAA)0o>)%ya6Be95%yo-|qa&nh&B2#}7 zlXDPK=qOVe6=;gnWrIVDEev{yeD>d+V$6{NQPh3RxcucL?=gBoK3}XNZCUklOHs+- z#AKlhKJ1Ma0u`=Fuw^rxKdVoZUF7{`xxo5BgKHbrHEV|f#(OT zHe#++8X_k&(Wyg&AmB0p$?FhnOpZ}N-phH%gt!ed2Cp31opd(3@n`xJ(xjIyd&*la zOrhMiV(LcaI%&d3vywi+41p#m|04lQgG&|9v}@QQ$!nm*T;_TKY1ehs>uv(4e21=Z z>lrKg0{4))`ZcPPUYy?1fm%gqAAR{mSWp`)!@~)-j<6Pw3RA+4$3j~bK>VVz&wnW3 zuyrkOGTk)L2`=DfUk7lSL>H4WP-7_xA43x&I{Zypr+VX}sEV_?lc6 z>FOOcI*~p`-}kfC*6EXnmHE>ycHVF@e&gK%yo6zqD*mz~7mtkM31B_DWl;I890>+$ zm|Yepj-~$c(y6!3hoPAItcX+6M3HLc&I}AQikJ|TCpSI|;83p0Ap6H@;SOQ%&GmyW z=z?8&1t|W&0=mBw3Px3xI?e!ub)U2$1^g`%h|7g~wbrL5mCUF*lI1lWufnBc0jg+2 zV=aBZTmH6L1YQ`bvzW-q>4a(I@^*oC(on8q1aj({sgW(?5DO`2h5Of~fIz_cK=-Xy z_5#Dt&^{d5KdB4!8X6+hXZR{kav|iX0^&t#A|?LpzmKfEBFG3gqB6XgOAe&l9kOYn z!qX-IvT#8%?HL*IgTar13PUY3|ff-b6|2ld=muR>ibGfYTrMFF!6TFaaBMr zq!5bq?x2-s@?@Xz*`6CFoFcnu1%Ps9lZFC;@5azZV*_FxofnZ!r({+6{dQw`IwuKn z_`5s7j~9)RY=gL?cj!EzH~UxNe7@1A{}*ats}PEi5h=H=Gq^t}ZByIF zXIUqrXLg3bN-?oYNSlN|0fEAA#_((7lAp0R#FmG@f*``J(YAd$#55c2L@kwFUSy!0 zPjpEg9FuxT-5z~o%!>->+qiryUTounG}y+H7EIeJ1bs7A1FnCx7!h(Eqw|&9q#aJ$Q|*k~BS66+;ROT)0hu%1(h+!*2YnC$tc zEuo-QB349wp3B4*b*~sFHk`Dw$lhH{Y}&w`w^cLHL1{RZ*i|6q(hTu5e5H1Q!5WL1 zFi4?VG9gi^xqW;z!9B1ph~>-85JT_$JutQN1I__BLIkAdBa_QyRNSkLKtD?)1rwsV z@j}v|j+ZeTd3;{qbUD%uu$`DWrtE&VUF)m&Zd!d|Hko6I%va)OshLl5 z1h5(J9)d}q$t`{zCVw+0_5{0bFiTMest=D&oyANBxTum1i&rM&3A-`RTa0v*J{*at zi`TIfm;$-)k0%u8Qy}@>|2~s}fhVy|sjpkFd4d9Y-9}G-zbDzHLr;_v8L=;xDxW>V zZY&!pY<6~bvVzSxL9ux3G13?nYMzHrBGCs!Pi274%jQjt3gz%3zuVBMyoO&egKZRd zb-`b=c9E5rR(27g?6ot)vTaQ~`Va+DQ>RhV9*|Uj_NXYFk)-0A+1z%iOT8KO@WfDP zJ{HRNa#R{px%V;nQ%kksZVwSTl}G>+0ENS6GeVl~x@eu+0?GS9h zE{^tnKhj>SE+d6a7?V(Z?waStW3PPDMCy>;`M5aKcUO}P_W5Odk^muPe8|hD>a8Bb zssP0N)G_R9c_#OfG0h_(F1JMu`|0Yoo*>AlGLD_at=nt@YFQb2yf1g&UB+=5%OmQ`z|3%oC$kaW$BB_bGlf;o_OAZgGfnD zr?i{*hZeN0ZQtmdLFBlW5(EM0Zvqrx{-I)zU$I{3eE~y_`zI`pHKA4oy%L@?q+q)* zE|8m>tV9tp+iIqr^$?;y|A57rrU!3V$-rkh*W9G8XWe|sHD@>TQ=4_B4*ynoQ@Yn? zJ~6B>UY;GLO48IVkuK9yF?1M4*!#t~fLp0jB=B@SG>Sa2Sp8Up@O65>HT)yU57SlVVVr_mU@=kf-2gk>QQa`4l^Zl^=@7{k?d4YBr5gG@ z8r;+82aA`1|Fkde z^Y@R(e`(-#&X`#UR}>lCN^hmsNVrjM%5O{vFei|WCkfM$NHQSrP2A?3*}ug(vX8t_ zcIra7_YDt5_fNyr{@urP|yd0Fxsr88|Z8X`h5M9q#5CrOY-qS zCuKTf_xP}Xc8};h)>A$0DkipT3ZA`CWQYT4Ne zSDRbmY{ovVtBo@ao}l!nKTGXz7`bzrFz5*2OxTYz#J_6Xj^ch*=#CHZA7$#Zp4u?4 zvrXY%*)ClfY4xpD4q?5e9$?CQ2J%h%8_D zeO>8$ALvYtY1^wH=%3kc1P-ueEP>SA>Y(DAWa$sTLN5GyOE=Y^Z~o*$_RUWG({P6m zJCeQK%}jHiiBbp=DsMM;! z$iS|LfYU?Wf}lkA^*@Iu&OMuhXGBz%SAsBl+`@T)=%a4dIk|jJ+HD=VG46H*``Vk2 z(sTOGyBw%fPAq*FQW*)qkXsyVyvXTjTf{a3^dgBHjsurKO3 zBa!{V&3SfZyTIN3{o|BdXH7kMG(G&W8$XTa`KI2W8FZUI=G;yn`KlSTW-YXPvSz&TM~Ox%DhdkC{>m+o2bbx$U=A8xjpYfoP@ z=a!AEdI?g0n`Mxtrqu`E{bVksw~TWEgu0}%P478Ehj%-QzdEvS`Z}FxiJVD8^~p+Rbdsk)nmQ@_LrSp6xwtHtK1_dc6~HCajE)++>Q!$X z##kVeynNT=+89dk^gD|Ovpp_WB9?{hNLh2PFI5J~ZmYwaayx~QHJ-U zY~;|Od3h1D$YoiXuQ;V!xkCKf+7sZ4hO+0fiG3yoCfl8P2|Z{7^nf4C?#ETeOR20; zBnPJ~mei2Tj}ogDe)1v`yg}BqA9^rH*@7Ud5>QCydB=3NCNek2&(HSL=&@7+Nl?p` z4@{)7g=J=El3xI-s_a)cO51oQ)otH!-rvOIyYis;R{+)-yd7vvBs%afzgpauY|hxg z;n~ki;KO)}DU|kg&Q=EJ+%VP-UA;|GZWY-3>-xd={;b*LVOGfkp4Vql0;NmLMrtq( z%Jp`cW4q8&bOQa-!Qm+Q-zH;Yq^XfY6iP6@YBzeTqy;?#G)dqv;`wROpAMq9k6*Kd z(L;>CUn)E8KtZ@GqX>4&kdX-(u$zI3LS49xnOcK7J#3o7N||sO(-N#)xt8+y(@X3Q z7NN^HK1&~RyI~yjJ0@ZKmAy_L)pw~FXjuIkX%|L_YL3(EK!WHRs`^ zBc4X|zsZxP^7cr8h#{VhA6ugd7_qGqc-EAy(ibRZcwM~5tGNjv@woS!=s3!_8}<4| znTVr*XoX;xU_&T8@i3ZP63KUXiJeg17ZB{l z&w;|mNoH2~5hC3YH|ZfrjSQuA zqUvx@>mMT#OyfvMiJU@%tXL@J;{EDbmb6nTEQFFFkq*N)T8Y>3A>I;0bG*DfrN%&K zvDywC0Nd{I=XqB>oc#Mlq9T;zxa!f|iG3W_pFHqN@$8j#G}3qwrhI;HqlfAqk{-iN zy8fypuQP7v31aDnjgf20vxTR>_Pks2jdLFF!i5zpCiDLSo-bk0rsH15@e2}JIHy-6 zBvK4+8e9VHV&`l6*Mk6Ko?H*?iMKiT)@P3)YrX~eIvoPJ1=G*E5iSc-RSRJI6EOxdq$< zT~W}C-)?k_QliwC{)i(R`L-Y;?TkPHR@@WE7wea(57dw=41M74n!1k2hzJJ5DeK7f zIW2f}&?!v-*SC}ht2OV~yz*a-nE!hBbdP_`z_ezsmROYQ5uEEL?ULb*Sa#7r5j-2I zwhpxH=P!W{O{D2c+tspq)6`F=##x>l$#Bq-+MT4fg4G^tOviqiLyc0CLGo4R6sr$8 zg}zkecV*Hn#49-v+CZPgU(C+7J%xS|Z9fdGh6QBf&saZTmA7|NG>CP^Uv8ACF5Zg_p9ng3fidR8n!Y!=J%K{VRX!X<>%& zs_(8UHbH5t$x%9tahU&vP(S*JW}*GM{KY8Kcx|!=bZ=3HsyzUOk|Iw!zFN{jAc*9ioP(TK1l-KA7rk*q6S^LM`b#hW#xV}w*Q}js9#w;UhZ}58L%`U!S}bl)LBW5 zwjF|=^H_v>eOy~GCMkgI)m~5b_Wa0N&PENr+M5|+^>OkZ_3y+^>W zoYmOQD-C8P`a}b^dd>s7{Sq)>=g7m$Ohc`{(VLaa=02*F6XT|7gVP?7A;br~UbT5XdI;ap0C>L!&dIuzG$t+UEf^Cul(Kb4%xE|y=viGq#a_uO%(0){ zarImQEl7N!u>wn6&8^+1RT@odJpcdz0iiwqYf5~z^c%|3&VL!JM7BPB2RQI60t^u^ z_d`F(L<#48urBx17P=@1s+Q2HvN~>-8Pbby+y^CL%5IYgC$7xTmtZjBR>h)@Q&bZm z8*;hjtW;wHbl*4&lqFRFDxkhUdkFQRty~aWZo)@lfs2p;OwJB~8A217TUIFPwfXbb4SJwwxpF{apY7dtQMpH*&Cc z)`HSP{F+sXX0=myb5YI;gs?y@ zQ3gcsYAg5Ab1IWJ5ID0&Ajj{@mfMe8X?XJ zm?5mq^*^_bsPBs1QTEP)zkyK`u5!T5UNB7FP6_+14UZZ-z|Ial(Plbpz#Z1SP~Q*V z1!eAI_rFzf=MWX3S5hPkmdZwPi1swf!Ax`tWtu)%PW~7S{YCG|&~B2AIA*&d!2DDC z%8kGEGO^F*BN}#dog$jXtHiFpd*`v)+}u~iWG9n!Qvdm?2n1oSFhp%;K^e_XXSogm zgJOv&Q|q6~iWs*cI46fEXO#TJEL)t1A9Kky31V+m*H>cGm;-^3I*6DtXA1A4IhHl` z{Zh8m3w)0DEiNYO9bQ2Xz{}geapu{ZEkrEQ`E@<@3*y$h4c1sho}c?o4mM3~h#M>L zvSlnCDfzxAAb3!#qkC4IzL~?qqSn8y@8@0!VZpWPB^Q>Uyn`hi0M#g_FDq7_U1&rG z{5KAeV%$n@29aE5n-5V(Lb?%;2>aTvpG-fB{>Hf}-^=OrR`~Aii?J?B{S*z9cl%gs zMNar#Ta~ZR-S27p4o;FUubuR6AIBYgPHh>LB|A501J@$Ujaw3aY_ZwAtdG|3(@4#B z+}hqPG=Yf~?DgR!Z#fd=&g|m!JFkO5Dq_S5W}RV@t;B3VpTJb}@!~(0KbY+x7ZAUaVT}!@E z@M$2e2j%uzBH`X7Llef!F&Kz51ji0OCZz3-G8ez+LXQ%X6rqv zdaod^w>=zSJipTL;;gXPcWudx?=X;V#Oz4S^Q`a*`+~5c5nr`gstM4hSc&1u+2ubm z3n0RIZlZI(-6I^P%tM-gy>D>&sKC(#s&XDqgIIEVybB9vx+vR75SH<0{RBGxVQ*HW zGTv1ON^fo7>$!^H?BTHw7Uns#r6SHPtR&`ekG2Z>1?IKAC5l|Cyk&hKSW;xJvcR>d3cmhsOo=^`QHwqRL0y zbKL?3I#58_dD01vUg9ZHz#gzsJ1RP~vv~aJtnkhVcsb=aMTuRl>?d><%g%jysTcXl z0K;+w5Azl*IU2Y}wn8qSYqW)${N7l<0w|m@1u)5|KBX6Iax8YiCt0ayB*P5wRO}h- z@KKCvZTiz*3%dc6Zmq&Yi>=Myk6BLymbmBR)=T1`mZ9RdBg;zL{R{-sg@V<@Mnpc% z|F~llbM>(dNAo@pON)N|67W4gkA{EfBnOY2%2cZHi<&6;KDdi3o!9nS^nP~1~O7$C;|zHdQdGZ zB`-~*;^ir`Jl&%enjt(@p`i0<;sU%bN2WEM;mxA+0MrOglwK*-!l4s8R+paVhsYbA z@j5N`mfK!|=s=4(SkoV7VxCo~*h|su-7#XXl30A%cGh*&yRTnzHKVm=R9@#TxN}cK zUy1;?YRu1o!qu_e$ho)Ahkk5&`jIA}iJ!PInq0ok`%DGeI&IsE!AolHS-QK|fZ+SfbAxjyrT)FD?sE|Czw^po8tfDxio(OAlQ>Q1T|LBbQ%7y=GXj!t9R`}t+KB5SA=Hy#fej$!B{F-ie!Na&!vlITU`7}!V5npaH0 z6;n34X+jUF_U*kzEfs9am|uH>oWE{d)spa^GHF4mI&jK35n^DEA>pgy{C-x^U5Q2Q z5hEiMO;jF1sWzfggYt>Jh|))7aqhZlr8adUeD-$#l{{W~2(N?mR}0iNGc!0tOw>q& z>oHKq%N3dVDMepkMgfD81C@te>m#G9zM;fflqUII+G*^fGlQH8ygQ7T_2HIt6nSit?MQf$X3-ZQhYkQ+A8< zIrPq%mUFvjeXv8I$QX_5nhqU3?h%zo^HX1InCA#?EN@W%&1uRc7nL%?cksYx>K9{= z33h&^{ye~I#*l_TC^Xvw)&UtdZaGd=I`l{-W&bDj-Lapgn7KddhFb0JsKXwo zSUHzJuOjEY$tSn@pB4|Gr;9Sk=h#L%5<3!7d3f%b4N~v;Wq_eAkvLVV|BC+)<1>-X zXkZ#LbQ;5zEz3!g0+9D-00000I0Du$MX@m)?9%~h>ula9&G8p$$c*42D=v^7*@gqn zyFdVj>MTkYC*2ZVCoHybK<9+Ve*B;}2iE``9>uQO)<==qLDyUM@1LfQi#z1q+$1^|-+FjRc5!U*iBY=hs|6&u-phQiQ!^~tVbFG6``i;uO9nGks~rqn;uwA^J(26EZ%q0=;4lp+YsY6a znw&i_5{JpwfrQg{79?$P#ZeqgleaEHI=6oZKSK!=^8;8A>2d>mU-QRpJU8PUt*d$E z3b#aeqD^s~Mf|*yam!Q!x&Iuh;LyAUrj5XV{Ti)rwoLAjU0?9uL~a4nzHNl<2mBCc znfz;489}rB8sLYcWMCgYgwmIz8#cU49G~2gHbC|O$n31KSn#NZ9$!-%#y#v zhDn|7sDd*n^;Msoz}^B0^NQZK4Doj>_^Bz%Rktcde$w19O_v^x*c^CB#4sKpjRl<5 zEDUvx7M?JE!Co|AxyErHz^vdbe_lD8=X}mxVyIPVj77bp^U%+rL0spIiBhjf!D)qk9 z^xyD6?I#Y3%zBSC292r4)HYmxiD5&{`KBTq5}KLJf86{BCkw=zTALby`7^o zFBzGAORK{+Ak_VA?pk9=b%Saa@4FoGXj3s?JzHhslN+lY;fv3g>6`6t3fG2qSHn6Q zc}BVm1=l&^Yor9sxZxv!Ouel&h*p?S=m+XJBk|G!Szri zXUs^;mREcZ#=cITekGb=N=pSs3Ky+Kv+Bys|4!-|i>0w+MW-G8m@T{%O^VPwbahv4 zMQtwPn2q4SzT6H? zdR(aVq5s5>p=EcrFXNWXnq&Y-XrD$NRJDn<8yzX21$3e0Ay{+EN?AN`#7xwb%$2o@ zO?VHRieWd6+*exMl5zC0Xe@a-ECE@#uUroEODob43oUY&zh=DdRcrT8)N1F;vFA-P z_b#?ZtxMTkviX^dpbLli#5e6tBKD@bk1ShTBt6+D){#Z2dWA|hdQX!)=1_17=rG0G zC0T@WRSYhXIv!G(&UGtn6$YrYPHt$hV_4jX*Dm_Ka5!>-dBl;Ul&?)`4^s=a^8aio zuNd+pxsb3GzC|k8?g^_}Sh9@@l?$Q`4~3Y1b2TR>V9B z*Xcj8a%NBO+{%>X833^OOEQpWbKd6X3Y@MT6G`rl9>GCriYe~j^Fb!dlN5j+3%nG1=9sMj)ieq`=5rF#s1+b!ESM5;kZa&^nF#LrBw)rK>294)i|{bFJ&DW6Qe z_*HMdbZ7vD1bBLE=(Qw^qwLnwF*#_tuow@rhT zI7yt?VF_vi7%@=kbMLh;^SI<-a|`xHC!xbBLT^MBJd`3vY|HRaW{qf33zjOkM7e$Y zBht*O&qkv6$edfyaUCAo>6ldh?hJL7rf|p&;MWnYHlNWnuHLBjL#GuclD)zQMm-z- zc_fuDw3Y%?e@X%fEO`JK@Z#`_%&+&0#^DD`fAJ}VkgaxastnGWrHYp99X^~?%@Dnc zSG*HdBg*i=$z#sz#`s0K#?AKJq=VX$Ha3xP#)e%5WyrNv49_!I@s90U6L5h=0E0;1 zOghzJFdVH9epesTXZ16uk>cBI&u#ccxIs?HAm432Bo{RyT#9_-soS!Tkun0EDb5`boFwwDXI_7-8|{FS05qPa%29sn!Sx}zs{5H>GHRK? z03D5x1~9K0FFte{Lb%DI+%Xn@U0%JrbtMd=Vyt|m5U`r%d8FT4*~Q23snMt*4hg!N zwt`BTYwl^tv$dx~dJa~XDX)n?r%6(imhk>@$GMDSUHY2)&gAmq*2sD%oOWtY+9^U0 zQ|!t&ZsIl~z^5T-aFG8)xr33mut@2r;vs zPW%7>0000000IsSkUj2~7BHToBx^L9000017C)L7DRZr{$`U~>TjS9K*yemwCf=A2 z5Tz}fXaapdkMvi`v(C0HJBSFd(nI9{pB&F4KcQ6x0A1g>{x=r5B2Tzqp^Yp+*G*jDmiLBmt9V&UtEyypTkhXQ5z5dn1S;b)kk^(hp7 zh{nYBAf_+q8k=DGY)x&cxQe(vHFQ*x%~$a;6`r*)nZ#O<7oB!)q(@w$7oS={A9Rv8CEm33iHAEO6oK9f`M( zU9gebZapIU#ca`97V=M&PUI??XgfwHOBiu2?yc86;l-#Uo$tOV-EyZmvvzAQ)*&;t6y7~LK?q$t&O z8nprRpGDP+$<=&Wh%**xy)7v#>Ksg2FEC%zC;VuBlW4(} zmtlo83ee&zVQ!!A!sYSt`kh(1EA{&*SN;*&vc*dho}P4Wf9jjOQM??b=7~l!Be$wE zqcyh3LmM1+z9j67v_Ak;ct^p;Hbs!Yiqpr@WN}8$RiTJ|I-U%-=0vtEFYecV^F)Pv z96KfnJHNpWTeaO^j-GCQ`|s_S(bzBRmny^`Yqa$|vIt{ox`zy-`|Fhm56U%eXz&ko zyew8FqwS>~%GSY0F-_KDmdS=_jKosM%pMVv5>oG>pMU66eR71}qwnk+)8kVz&Ml81 zeyB-;^-6!AH4sQG)z-(-j7a4Lt~e2$#nt{*6wQ-oRNIas4I_%n-LOfPD=|BPEw&;H zwnOZLz1DmiN7+lsm+N6VVB=3k8NVE3Ef4e_DE*9OZ-@kR1#ZuBEKh_qdNd*c00000000000000005!kaU%9TI zU(9=Zug8ma%Pgc2p0dh~Bd3AgpL|HeAkQq;Q*^Gju;vICK^jvo6W-(XcJpTaWEPAW z3;sW@$2`YV@_D!=d?DnbG8+y>zjHgPGf_a#m;!Xr7Z+XGUlvu>6oJY;)j;ksGr$8V z;e4U^r(Fs~efDTHpY^kV)V#f_tK}^6YmZiW1VCBPRtFMSc~8BN_wcF`nP6YokR%HM zBg^knpLmIN7X;7{Rd3SIsG;jFxhuJZNK$Ww0+a6Vmqq;ZR-6^?D%K_kK}q{Pt7}S9 zrtq{lBwsgWBffF~|N9^eyu~>eW4op!EQ$5zbqy=PJ0vb7FT7V`xS^UdGO(U8p}bx5 zK-oG<#=8Q557hs2lSH2cqq>smp9EZ^Q#QB8x(EB5h29APl#=Ysw%Tn@Br~PDXzwcc zD>My^eN0c#2~U~*XF8kW_uoYC1{?30z=`8KeWNq?CAnEB#M<6NQ@Kcc;A#LF35X0v z<~%Wmi;bBDDI6P1O0%9UO_WKuv+J=(mouB>r$SGT=@3W#=c@sh1COz{wtdo-@PkJ8 z#=f1c74xw@ag5U^6DvpW|7SWE(NTxt%E>WQ(rxbw@Yw7~@Z+MDUIC^YC>K!I9ZD+7 zd^kte4kJw|v#As3tdv<`!bWtMkp&V=H@QcqFyKJEf1EkkxHJBEQWdjYnX>dW@b|@Z zXCm&*J-6P^%=`Ief5$t>SNrLB5U4tU%kB9My(IwU6quzcv)Dfi!~cd(n1qk-$(rt) z$t!dMC-U*E_@<_HY;-5SKe)&D==t+1(q5Yj3dvhkUI$CeDO96m-rU`$z6v3npP!G8 zk&KxhEb<$VsmB-PY0x=-lBZJJQ&^w3hA>>qlt7W*BIoDq?E-Rg`ol%cOTHgug$vqr z>@K0=EuJzaNRP%-w}l;ERIFFi*%IA!%sZh<%>!d1O*6x#EnbY-bpNqG7v811?1(Ur z-LJ&B7AXV5C541jm+i}%vR)JRXbQ7pF58iBmZ$i*HxUJ&QN4rVfga`XG|nrJzc7|( zL+nF{ue<7GzJ(F8V0IHAW01TJ?r`PTkz#KiqR)^xuYzWqPD7Kc9a1j&lv?%_udezj zy7HFnnK^~;^^C-0F^Szq5$%sJ$IpQ@)$`cS#IISs029G_x?YI^C&R7a>80B3e`R){ z`~490La*}gJ4!PK^ zG%U7bfVDl2|CMlc$Z~@{C4Dnu41XAsocnU6b?=_-QA8Z;`%nolMlwzh5e>Vfi^aZe z;)ie~O?AM9mi})VXcCDugJYIE(rjT*)zI?c-`xN6-~H7!m6Va3VJqGy@@@-^K97Os zEc1+Vtg03GU>8N(e!ORZF1$yA+m#;Wm?3kZET=j2UDKBhm|Y!N-S(oeoIfOZ;#z>d zqGMbW7@-PFCFUm(hbS05Hv(qh;SPC$30+@diWbliR4N69Vw#fjvY6#q5pVz4ktb;u zOfy;_n8eWwJy>~n1}rjnL)Y192}y>A9S6*7YN{)D~2QlujCDuJnc4 zD=$wE!l&i3(o1mz^N$28u`tvc6tM){-xyk;8w5s&{A1og>e-5|ow68|qMj?xJz3-t z0cSwLC+4lHevSNd?05EMb>g0R=59=)2L1<-`xz>!t=L`|sr)GQ<@Oc8kK>ItennOk z0^7vwp1hs}v+~Zlks$@xWm%|d4&!9j)*G%Nz5T|`>d-6U_D^kk30IF9_HVmD5`+2E#EjpqvJSWWjY%rxm@?9lXwBoP%hb#A-WwY}EPH$3T|ZMG>B zJ-ko7TkZS3!BsGhho zEN_}-GawvzAsylZmzeGuE7PKj5dl{yZYL1eV1ll&Sg$QBFAQlKB5{o z<~%5+R!@_1U|6NL(n?{=oi>dDZ<7^*_Q+Q*XyZ2itS)Kj zgMz3Yg}YUA)8m&50=juI)0JTk|Ap$ttG$PTZT^l8Ry3zS&;60Hx|h#6^62u(AP@t&F?|w&aGuv- zIq+k#%ahIAzU_|kZ-md=hk}h>qW!N^4y{X?am^hN^$?LpW|P5i38}@c15Kij*GAi#$q}o=4Xl33Rk{R&pkh^3 zmUkdA1uLlA_8eeA=Rq zB!*HaSiem~SlWz~8o5>egblzeBKU5xtRAFpi-F1-;&t#1&~nEk>j>L7v4@L&=)R9+ zY@b-bcge7~yGK96ZFyuz_AK_3CC59;UC_9TU*07ZOQnGecW=N$*Pm(fHZiiz zyaMBUjuU}8BVP8%v2_luJmb}(*n_|Oa1MA7-q3xMxROk)wS>j7m88E?aljB}OFz z{1H7Pic%V^5le$}Xa;e9@_GA!WhuoqS45bCMf9CfTo75b1j_fS$073lu&yXC+5B~I zn9wFke&n7!2=xAfIqC|_G`jcAT{3$->$^ddgR-FT)Z`X{%ol16zW~0-;;4) z`~a=3p1`hW`+t}Y?1be;#_Lbfiri+9G`o44kL*Y;yfV^vjq}yOI3yf9Gye$16JB6L z47W-uO8lKmIH$I_?`Ak(l$MTO#+WFrC5P;@gF^hFl z;YQpHmrUKUvo^NLfHWv|&1)|)6pY5k7~=bjN_YW2myAIEmX%O{==vD4 zi4I>oiP8GFSVFyNT*fGobw+r4Jwghej5zPuz`BxM2c>YKX77yTxb2qVQW*RG8cjgJ zngSjS-@)0=UG8!6kF`02XkL5h8=q#9{6YIYzw3sY z?L+LFy7VO`#W#z2K5#!qhfO2}H+%fjItKD=E$-3Ibb32XLF_L5Kg-Pamze^6PT=P7OBgRN!o8tv#M$^+|tFFp0`M`f?Pqlb_=4vqCu&#_2-5PrsFqd}euO=Mx>N{jb{Bvmu( zoU+F8Lqd1y>DjjRn^On9`NVNJ6!yy_<*(Fkua4y<=TIJTfP3KBb7^P$W%NOWlB>M& zvw|w@%gsL^8l>&#=ThFs#Tss~)O*#HDbyODk_;mNGxCyi_MFgalWe@A8rL+>WzSs0 zH~9$`V7H^?okKVI=;X(|V7EV$qb_&V#qEFf2k1EgrrFNeaq+HO5#qFCP@DR0N~E+gFm8PSS^pS(! z|12yDdGO~xU!VdX$lyK1zYNLf3+vD#-<0HfP{pfHnrTR>TZ2JaX1?M}Bw+klFrL$0 zQP}D5k#_Fn1FtXdsc2lML9!5Nm9ieK@$#*$j8xy9D092r%YMZ-nj>_VIPjmJdjcay zTmLddN$Q*NVpIISzUR>}ir!_zQV{}m0j1+SU{B41R2UIg(gvENBXi0S#p82)G{2fF z+LMcTc&%;1W?bWT<-py0-_*##=s~9RrE2Bj3~~*lyZgwG=RoTopBc2@cx2Wo(?{*u1^rMZpFds--3dxJ)kwI zY}EuTX8*EZY+Ti8kO8WrHmCXC>49jGxhHqIREk)+FFU>SIZ(_wB%KRcz8I{ zu3e0$PM)MhHZyXSz2r_d7H&|1B12zmY4yqeHEqHD;S*b=Zv5AL)wV?r?_;Fil-Iue zFMG!SH}Tj>GI`gaRM?+b)Q8+h#gI*4eDSpMw;M^|O_v9z$^4eVc3o1oHl93Cz1+ImbB%h3Ftfw9JA*@2KV}ID zz87*C6?grGypO4?{N>%d89rVuWFTztFJ$}~)I?rGYus6d?qqoDaQX?G6%=>KJKod* z4Sf_%$V{M&qdCW7Bj*pbQ-r1N2OX6pQA_`F-C#B2`^1w@yPVt<>F5l_5P5CiSU|~z z+We?_KM6sMMRq2*IVAXDH-%tjTl%Ms}K%x3B z*xS8ocePFfT>bMgy*)t?9~rc>shWYGw)ELV%bY-@H!q8V?*k|)S z*YyeO6&}|(A~)_oPN515XUT!QG{tfc;a?B1T5Dxoj-vd7mtOxprWKL|&Y%z*fGk%| zPf@2+dBntLU{+4HHIE_(< z@-NXz|5{CbT|gx*L4pbC#xoETh4542-M<{60w++B%BA=6irI~_6N|?*l1=c%8wYEh z#`T62>-m9d{REYVQ)`uq(HKvL;Ys{wi7KP*Z@L6(A&(4)9Uh!RhF|$(6}AAMo=XwQ zH6lndRQ3););+eJNc~o8>p9bO6Ec;G%#i(PmvzOCWg3#FY{7FTzMo+j&}8zNOjz~; z7t<9Y4bvi*Gbp$DAE-8)lj(&i*o(xxmer^{N~cL|pK3*c!h!h(>bieO;P(VB{=E%g zyYm}3v3s82R!_nO7m2aAi#uj(*GC7PviM6WjEiy!S(}d&G?QlvP_l7_G=Wzj+Q(qR zg^4zLPd`(+Ud|KIS8+8MGRdA!^q2*u;D-8-Hn2j3&*rMa&dGHz*J~6aYHJ0d*6SXN z%{f+tOrLLyFKS4^0OF55I+u7HQFo8lLYk{H%=mH>h|WlQ0&;{KB0PDHvGxAcid)o? z4~AEHiGwr&1#^Yg6mdVN<>~M5A4;E$cW;2&K<@!v7jMlNKGNO}ZY1uWVN(>uY)MNp zg~ByDSsyeC4-Xh}4s3QDrMMuPQ&A2$hhRT>M`ubbAtI}@fsPKHNRnEdBrn#Pf&8R6V5CPitH-URrV$D$*ljiKf0y| z_O(1APprA<^o#X9o~zcnVN76(d=cwejk5++)7AonoL+Eg9mlVo&*dyh!uiWd?$fB# z4Fe&LziX4LM?W1qb5H{snqtrh+7XJdZ;W;b+-BMXZA(@cV`!_)*E0yKGJZxs`8G$g0uG#E*$tici9q9w;E8z!1!N~vU6Fi!zO{J4JVdfv znQ>Mrw4607veiqoJFk0BXXB1>aN@0k8Ai)We>t!z?geM`eQ)&Ir+>?1&B+dl@+SZG z{q_akw7k#NH-h^Yg7;qv-fqmLx|e80ZtemB4#1H&wpp%Lp3t>2MTjo)dg^KMqaDzyQ^PS)AWw}MbO7I%|2n)}83s!$$*B}MHzF(~5?(Pz#Q(B}O5$Td{3F!{$P(eDSOG3K4Q@S4r$9v!S-|>Bq z!El_j*4``Tn)4S+l%*vl@wfm$Lqb$hU6Gpv>HhQJ8h9$$b38a32*IcqS+bvV3d>0< z@?Bq}!J6A_U?OaG?Z>UfjF;Pi$veL(xr=%sqz2@1ltrxtaNqQ*sWe}=el0ti!@dyJerFYL@Mm!J^n4>gm!M>!6bc(=fln@s4L z2$q%c5b)Ew5Xt2`-KO=R0|9>1+C7?S4_#Oz(WdXecq6A+>`N_4XZbOpso2Q~f3*nP z8;U-DWtwK_JE!9k_>=~xo?eT>lsAh-mxM&HLF8q|W;54(HqC zS^^E!WQ@eiKTU^V`$59RNyOykrS-N)53`xPIi5efSZbK05Kb=(!oau=lcV;$f&vR5_#7K$MAeV0glX?xkM0WWzv<@ ztkh;&wA-p#nX@AKH1dsIPXC+z*$>56_^l@l;$@V8ul0bZ%R@>3*_BAwpHsijv`if?^$I~-0UJQLaJ?sj!`KLJ&C1fIy9}D3= zo<7=-1y#<5`<>+>5g#^O=(GNqsQ-$ErHtNFJq5=+7LB42?$`qU9h}%l&}dhn@+@bk zGI~#!hx9bdlG8z_GZm*AxDsmhS=5)DKkVEQuqa z?V3CP+3S5mhRPrehy7XavqDe-XA59eL<^MvP6J^p^Hb%Uytx{GtnrL4Cd9|eTY`fA z?EC+fa(-)YkmEh9kL3;S%LKxeAZ&z2&|scVWxNE{`lr?&Hbs*6RK_|-%r#HxElm7_ z2gc;-B>!2#GySa^Hx>PdxMnK+Ipq73{8x~4$8w*hs*+K9EW=vZCLo3=?SV?}EB%b_ zDOx6G$}Ueii%@^{IAj{hi?(? zMqJPtMnMUJG9u9*6hGh=g?fH#I9*0Qg7cU1fp1J>tU9Kh;)Pu<^`S*eYg)~0lc531 zda0A`#DqA{cIxygCn}Qby5miFG++mj{!gX0^W3%(4PA6wJP^vH^$AiA=f7CNM(L^N zo@x~9ccuOD|BEml7({yS6`d)S67(aq_3lvkZj6OD-0{n+s(7a4KH^I^8fQ(h1{NSh z$kDGK?l7bW!eknCTp!;1R$XSE_x8EVKpZuHvgo*x?! zy`G<(?QE>lrJOL7yq-#X`7;62Xj||C(@83ijKm{#4Tqvf4wWu5C)&YL|Ncr*{#dFi zD=m25RFygW3GGjzbbjF&;_!TE%`qo0^ASl>g~ilJicFjla|i~WsvhM4DW6~lINtiE z<~#AkQ&p62XqsIKNOKhC2YeoBV8{*H*LN!qWohc-OB@=S)O&o~Y^5TN2kOn*EQjW23A)KXiXMFc>+kMuXZ{|sb?cNxDeNzstO!RH zoZpGpowlrDlBckZW#TBjhPGcW;WGriP>IZtSR%^(8@)l9r}gQqF#h#EqBR8mjXCddpbH4s`n0i3-g5qeDpJ&Dh^2)Mb4$*(noNv5@P{oL@n z-y%<=7<3l16sQ{}lioJ{BTnpEYO}sxMO6JGNTQ_v(K^&|zeHr!z-HRydBM})n?qTu zea`L{#)PcNCE5kP+fQEF!E;p!7xFn+r~6@8BJi9*5kvPGiflj79eG-(1i@RpugkJ3$%qEV9ZksbzZ6 zrF?06C(mqgI9m4Mg29Jsd9^>C;;`-fWY)5eSv)XS0+h5Yo&KaFfCWVRi=PZ9`wrVJ$2GgcmyFS`dG-5|_w50j5Kbp^r*Qp81moq~ZU(`_$ztkCFXIy#IRf4kQ9~;r;@8 z;5G=*by*X*GJ}mx!{VP+NeUMCLxWg}(f=pCpqm;Zyep(+}KH21%h)A~QW^IuZY#rLmvU5EpRE&@r&&A;%$aQ?pn(`V$b@NfhrXxi(A zC!+0eru42FdcV5yS5p4pHbqWEENSn*eb3tUm4*JlXo?fXAxOyPNe|yEcq%jTRq9zzUQ<-{8T<<$e8S0N#oDP z+@l{on7GW6RsVA_VdF>`PkXJJKM?HehTq;jOt#S}X8)uJ;|FugL|zv~Puxh6|G{-4 z17&8E2&Ca;JyFDcMD!`;M|}mBka8RA|NhN9@oV`v)Tn07{G@*b?0TRd^GMM1P<$nQ ze2GxOY-+ea62)ig5>WkFxK_9W(LRJYzxqLT_DRL?651?yz|!{$e^1PG9-D8f1F1m^ zJ5KBcQmJ^@1pe_7&Swbz4riOFtr;;Yo`Bcd%;66r-K!96Gjypxk zOs=HHF(!L1G3^YU#x>SY}lLHi)=t0xVsj?S5> z=%#7S{^%Wppb>jmjO|Z^-aT14Gqs5ysFT0x%4xtP472n*E+7+@eh#J2i3Kz>WIJ-Y z><#ejpz^(il9-FYH19GHC_DZ5^Q8uoJUXfbh$-1$27v__fEW>#H2r}~?_>Tzk;kvK zL_j?lXK=SLgmw=`^Fd43VjO`aS_m9<)Tpeuz_OEPw zh1L7e%sCD)aTaXn_Zno0gJk}{Oaluz)y-L74jQA^Aq;#iy154f{2TUpp>sc|S=frk zIRCF?>vt$#=FTZUWON55NXl(Hc{ufgwCJiKV)Z((rv~9p(iV%>Z2QS{vdHf4~hI_8`^h& zaXs1w6B9igkm?p;coc7%iEqULkR;$x1R)airzc4~fc}x{1|BSqJ?NNO196>{Z*ro>L`q*I#qQW2j-+k(|w18agz7FU>>p?k&fgq*(r1~b; zkYLvyU5maw$b_4rs*vM@(CZ&m!=9@F8Mc3L8Yki}04g2|INp-e6|I+M#k}&VN z0_4{JIOFvsJy88;)jrvtn(>I2f8A{p)YElPc^yar4!%D~gB=AqyV@t{f*N42|C=rj zPh|V9jNq^E_?O-Mi~1Sci~O94AO`y74`Mj@+9x9%gtaO2aC>yGS?G@fAFph54xgp` zb@qR~tqBcH24=uhwj6qbmhx|l_xD--CTGz7!#~OPFE6+H*_(eRp-S+{9Boy7F_&d} zCEc`muUh|HwLB0>J16L-<(^sG{@%3QKe4g!mui@Lodu^JS>Zv!vr~R>Xw3#O08gvH zMv}We^E@G{jP4V=hi4$DaJ@_A2w>|v`#?k<{d79;-uP7_wc^ZV-gi8*$?Si^3-trM z5Dp4?;^i2&z>hDFHzBm{xSAazl2fyT6;J{wd?0%op_E91{~D->YJ-rM$liPM>_HPB z>GPFT&rIM*`55{hbK?M~pzH;)%CHSWE=jc#Z z)(DK)Ve%r8-_J@vgc62~`4L8H37fA3EkFZ!w{z(~s+INV>54&IV23=$qS z*QF^r3MtI|@7<|O-JZ!ciSJwf#y8;Cs;`Qx&>6w?L<3K~ z=B&d_&1y<^RAh>H;#$A_Y9#3{mXm_E{Ke*Wvv#6XWYwM95mhOYuie||`)rKTzw>(O z{WvSjaW>Xs;g7-juYI|M(K}b_F0poky=bp$VP&R~N0YP!ZZewKTUmSDWav}hRI4E7xYfZ*F_>IAJF)!Q zH_V&sRA`7ucOw)$<@MNcxSH5J`}+UZ>>2LI(;>CmHcKR=_0nUC@V4S;eB*ou^&?3$ zW{&)sh|cDlhydbczH<@7qGfNI%H9jgEncW*03da#EO|Dw@EQPIS20^K&n2L|0c_^_ zs{X6NXQq@VF*F+#6L5t&U(--U-ozD>3SDR2Fn;5xx|ZF8rAqa$m5mBwo`gUHW}bW4 zD13#Cc8V-$K{5;e@%$JSy67DjiyNSWPv88FTv3$(iAMwiO#SUQOk<~GB7dfDvlK`I z`5)(XNsa8VtoGoJnq<0dRmQ9_+C|y%cG!Q;Gq6~<~UXcCEROUi{am3&C zx4ZmXDn=<}l>#i+QOy_#&!zcW4WqQVNH7s6MH4Rwqn-B)M4nCP+4_rFm&(d*OjhsI z+#tS?ztKbSOdSUl&111lhvjqB377rOC+`f5VWF8#;@fD$q!UslY`(2kT8!y`?n+%} z;jK81oW#wZO?u&FGX4CukHuWCxu+_{MhcnuK4oJf3BaUe=8PHK(IjJJORYDSLogH?x zQVS-ILe+%&Ov&wjE-+Riou!@Ai}uz7FcE*2Fxup{-xUkxFB zl%R9uK%eI`~d?huNRgDU*nv1(GDCpUG2tQkTc7*I=p~&RE z-ZE8tM$8U3Tj!f?oNq4CO{A6N*Gpt#{9XX$_gA)Da|-t;I~VBUo$e4#NA-JWDdq^GvI`F zbyfO7P-j1b(JymsNy@Tr@;kpY_3RW%tkpiB23nd322WrJLV)*{ZKyDSK*H6P8vH5T z7L`Owa*;A?Dbb+b!B>G5>N|2vDN9U9l6t+&u4F6Zsp{F9QLgW0PFg(}1h!_Vu6oPS)7&crq*FtY)=IuJzXfRf8mWVDpp5r{0^fhuvxL z{nDx=cEj#3<2oG5-C0OzUz4$8N(&V+g;)jNXm~5>{D7St)zPvd6i<|KN{}!PujEd` zy$b4GBd3zP7*dT=HkB@T<7?HEQ;%EK45h#oC6wHi-oK)-_M7_11^uEvcuy40Gva@K z!rktl(Hr`opTQHMm7OA=tWk?+1OWIKNsV6}=WVb)@k2I|lR>zBE^8!3eN0E#{7e(k zA-wzo;&?fivi>Cw)Od?FJ)g?Hoe`xO8@+HVUxB>F!zNbqi~F$itD%2z$vYh^m_GX) z|3cc>7lF~&Rn_w|3u4MwDJ@6i{*8|TyM7_NMKP21YQn%h ztQWh6P8~vt_HKVHF)WgB*iWD_zYsftU=nsFAg*(lcfy5>Zipa3jhH8 zf*xi70AxNanxzhJXO;|}0k4DsfZ2Q8%zK+~km4}S08*764CQG6%oRM|A%J zVN=4{q@>Hyv)5K`(?;xsfI(@hQ(U$cjq_V^7GG=Z%1>-x9DE+Wz1MVEXWy0Wj`@=o1_OvIJoP0Dj>* zOB)I5twhNw`o#+NBtc#;N|>r6b-Ztmf$P!P>v%1b^rRS4+t3mN~97Gtuhns zA!Ulc_x&0H0D9s}9}3cQro?P=CtWa@qdKtPu1#B1H^yfnxeKxL6|U(q!LeF81RM5v zxIfPtUHQi5ZMf2+k3@7awm=KjQfg+we@ zbSb_xP(osn&q~>_E3=;(4!fuzr@1;P z#*R)cWG$mEok$s|?}^1cTeSKye zr(mqBEZUqGiiQuYl0+-0;fx~BU9MUqq&!>+wRT4~-ZE#Y)}A8ul4(Uj$^2o?PyuPx6?q%uuDrM9-F2B ze3~w^zjc=p%#jPeu!2fsJdgr;~eL2!(>k$Tfh zU#qlmxo9)0me;El@4Q~FaDB`h8i4WVLkhOw`1N~TA!>lDnp$-Y>*auuw?lKbBdyca zaZm?G*J0z^snOW_plD0wCN=*bXXK&$KGh0P#?t*>QVRfTL76}l-EN%|E&2&lS4o)1 z3osj!*3UC~C!9tZX|=qXoUR|3Xx=d`*jMlC&*A*uolO8+;lB6G%_A{`O-wJG$ z9{B#r4odGt$-0Hiv!i3Vvd*0X&19EOiMTGwHHuoTGaC04>J7snKVo!5k^gwQg7Riy zgZ=)}`_6GF7Orpnad-`kNY3*TU3Op8kOO)O<+|#{xbzUdnnuRYqL;R^8>c9ZLy{Xs zk?M18BER%a1K%x=%L0G*!;mG=%*dz54RMb&o`tv36q6RyL?FQ&x@7+TzdxK!@%Zw* z&J_4G(r6ZRpMmgs}!qwl*M8~J}mHOVR5eLfr|Z!~+y zke|BINYwexrT-8r+t1`?NjOs`I@n*T%DYvRl&~ z{|_@`8jF{WonQ62_BekhX|Qy{&D9U(5wJGdv1ArWmN*kyoyf(aNsAw?65xTi#svC6 z80GAbsT|y;ML>nte1Xra{o0pDTy{5_%7>frqSOh(cpbcMNYtkE*r!UvRYbd}0h4NL z{{`K9ryR`Mx?#9k-A$;cPFm~Hxk&Z@>9ldBk^8R>2xeWSmoHyxCH20vMN0jU*IJwf zmVu%UgNAHU{&cwUoSFY3z&Q?**1>`s@w0_98 z#y9QZUALU5G4!b;|Coh^s%J`JKhoDuzo)faG!<82)UOIh^@=s_?Ji;AwFDh*t=Vve z2pStgxJX!+UfL(&75%pj=+a5ULhlxJK5uS{BT1aMQuvk}pj{hewu`}qmrx&Pw{CPs zMkU%>{^?}Q&7>eSaUzyEOL)=6{jUxRzd?dId!%p62^{a$G^4E~wWCC7&7pQQ*94j> zTW(#zEy$>q$E;;v%Oe~j7rxWWv3*IQi|`UM3I7FOzcy-aq{-1@l-FQiv}|sQtT$uL z`@roMc)keJ%^60Gn}M_wECN?~B}~yi87Y|%9r<`LS${uioR~dEwyf>|p44YuVmOv^ z8j(z_SK0;m*xD}-Z!RL84b4Z`$B0iCE{+Ql_$y3bZ!q_gH08;XS*kVxvTfmRr;&q8 zTkP|NnwPx_ZhDLPFjH1+d$dm)5n+@>Rcb1cg(~`z zP|T=Uai3XtjqAf2f~Q}#3BgOBdy=2m(X_Nwgj*fRcQwPMsmm4K*&OIdf93^qCfLph zN|nok|JFwo_sSZsx*4$G1SAzAUoSm32T(Z{!1gOhI=?bj%I&oKF|lB0ahs>5v?;DPgyePE8FCe#392 zRm9ZqH&g@j6%O;_C2iiKjrhwj$Wc@(n%Xo!xmb1?XQ}S#WrUoM3e@b-NtO(pKfMqn zW3*PuYa>h7+sPaG4^HN@vBdDNfoR0|nQ^5+oP=S|SV6EG?Z$de$9m(XfCleRg?_*5 zSi(|jOKdSw)5z9`<2vz%7LGSve)BW(RgxM+?j^o9g8P!cPmlCf$)?S~gjT1{JfrEk z)fd-}@gFi}?1yO2EE`$n5dF?qW>!f!lpC!+#NB1?m;_Fri@}NooV0c9bgXIamnUs? zb9oTfg(FQzMI_r(CYCPcvVD`SR`oulVeBl4X{lJ(Z-7(IIcl7M*ojlM%KTUiRz6k) zS>=uUG0od^D;F5NbK+Q{XcqalJv-D`y&QprhGcTo zQsrHW*j3MR;v|KJdEZFnJjEi3N`xREQP-F(*24eUWybb5x&_lGQCp0b=S__Ylr8Vh z;=n)ohw$m2zSk&SgmCc+yzw2dpk7(uSe9C#z#!H}a_WY6m~Qy46(ZubB4fg?=U)@& zL{Eq-NN%^9b}FMZs;2lMJqc?DChtU0^$n#~E5AD!@}v&t&Gz*;Bt1^%!tbWHc$02$ zuoNpz^VtafMXH1cBXm8A7hB!#1$DD+ec0N zSovO6g}dqB!dAyIM356)I8JUH;V31Z()PVpx()X&DlHUMb-FmMmRP!%EpAnh4!T+Q?*fEDnW`@eqO zV9xS7cqWhG4uHL#xl7h@#vMm+e>pS6S~X^$X|<&LLo#Wmcm8P%Igk?oQfnz zq)A~#C0n{P>d=){1Bj5?v(A0H5pe);x2hG9>lx&4wyv>BohhzRa_IeqeHga&FVDFy zx)<9BKh(+0?-H65Ij-4F3HzOj@5z{YsA3}i9{eytXN#L2)xWb@8AV_QpE}L`^(=^E z@HNTU?2`2{MFz}N%(SEZ)?SSC*uo*S&-aNhBYfW}2HpfIz;*OXO|Z*x*S?zVzbe|U zGOg<9QKc%@_Za?W;JH6i{%XlWB7g)&p*F3ACOZPy0C*;rxp<7E~3aA8{ZQ9rODZvXxXjYM}}7H4Ea z3tO|}^#LO?wjb@07NZzL%Vb3Y7KiCP$&Ga&-#CKlogrjd8wI&j!yQZ_wELbc_V9S+$Y>;zHbMxPU727;OA)qAg+PiT;w8`H}6uz^*7rM z1rti>vEKw=OxhwG6$5y0c=4DNDt)V4Qb~(LRZ+4uoyx4Od+gkjHr>h+zS&%QiA+Y1 z>m;SKbeGh#uYOB|7~$)%niN$fuE|d{$K|-FLRUEXYS;r`lQI+Hj=pI{kmqqV7-k5K z#F@%W8^W{JylM~vX7M}vi|h(D^Ew|&EgFq|=y;Z8%lJ*N{a%}@b!F`>2ZCnd)%qLD z5U8*(btIyMHAAzCUObblIp0s!eC8LK_>dEHmz}Bj;&9gZ^@S5d zE=HpB6o}(>Ary7)*H?8VFSRXjy?b1_Sr$6#5&L%w)n1A#9zIvjSEXATfqO@}Tp9+I zfbB7woKCoUTP;$k^GltlIBJu{3Ks_QMU)Y5dX9*(CE*MvG9rT1Ab4&zDx|dZ^R?Grz~N0^?9Gyv%p7B# z^7OiY|60h<{qPm-ep&}tRmb1VqbzFOClkECp^I~A5uEYwl1EKbR-BM>({-d)D6t18 z#Z?A$CTKPVCFlJ@4%@Z^_xMGxFgciE@3`?i_z=-~Icug6o0}0*P=!exii(F#arVRJ ziief}`sVjQg)fHSF2NGK*iZz)Cq<2U8H__ zsS525$>g773U^W$BXmc9et(MP$yS=9;GH>A{Sg{RQE7T$rp#^R#d}MPxUgy*Kg591 zTYZ4PlxiGj^EV}gwFUiXcb!z!O!(JQa`>p93oaMC>}HF%X*_~yw5pmd@t2%jF?R|C z>7d_~gmT|2KECw3??+kdcf0NzHFsC~yo_GA<3B_HG){*+pBsJkMJoMk9qnCSgu*|+ zYM65GzOmxuhcamJq+$!*S*}YA+)Z5!y}LVYbkP33XWI-I22XBCiUsgT=wMg_X{ucZ z!3lcJk~nHaU3tNiP;uYn;>Mz##HRU8Jtl`s+~>maSMm5J45%R8=NM3of3uQREEm`v zgh6!bKyvv+mB%q|;JZv(DR|(J&27Li(DA0+ zYkhQxR3+tLkua0Zd0%e#64PCZ7}A@?9kxbGpCw5uSAoCNr+A9l({S6CSS2<4RqPw- zF#}Pxian(XJCEmzuU1fLT2&Dh-xik7(XFQ7@{~!rH1BQt4X^sjayHEl;wltS(2h&F zMfg-=$)Kq5f2IFrmS&OmBDhZ7(@+Si6?Y9`(JgxeewJ8RZ{rgDOllCjRxo8qYvKN` z%CuA%2F>BUi-_C4Cr2z=P#)ARC8(D%rb9%${i-`k( z0e_e6IZ*XQ`ZWMa4Qc8RAnf~90KjiVl2{!uFmE#w0A4wc?9&uL&Vh&mfH@zLHZ6e9 zwNQEkXpUJr^sFdQ<(E*Zp$I?upM82w@VkcvegT-~wA&fmP!qNIMK9u9} zh`*51`^Z(al;8^wN18+MUi4*OexIhfJZ#wlh6_v$w9zI;--_)|m+TnXIBqCRN1o?< z`yF}Y&?<8PzGx4CPSG3@`~o7tO)|(@;#=ujZBhigxl^uT99aNDbvM$&;eo zkDJgB%BY*=f__BoWLQy`dO+hvq(M5(tN!(qSev4yV6;%-);6>^SvR@A4CZ!5k@_7j z2wuG3+B!16sZ^RaSvAa^sSNKKFr1T>Xy$xdtVt}%#=`}N@eF3h+9NI> zOd7TOQaK3MROQokR^_`FsBc9Z^BwBldfFhD@$IhqPs9|>dz6Pg%{LE5zwGl~DWRK5 z*VXwam#8M9Mpb1z3xb_SSFIaCJJ&lnH)&jx(rxMZMtmpl*~(i(O#b=S(M@lgd`V)6 z1QMs@6~gTLu&F5(cSjqWbw)}tpQ}B-tgSZSl8FtWJBO>x%EnsP8CaF#pIa;^2BJ-0x1r&32kRAB^Bv4WMNiuL#}STc*-xlrTo~##=VgWt3-0&#mQB78 zEG#Qb9m5&=^-=GPk3R0)xe*JG3m1JwVUG$vn|t|UbZqo^h~Fqz!G^L1Ri1~5&cZR+ z)Ec#ZxG=Ki;JZJNWxX(Go$+(zmMs?1+-97nFoif%YS@{|tnmA;0pkg&&Q|JzP}I-# zUpKrBvIEE;vA=7$4A`R>BqLl_v7m9O8BwJ1%N8xX*Yx)ekHvKHU_^4D2NM{BP$ND4 z+!hZ9@f{w!(v99{KCTnCV+E3@p;^|NK)t)~++0Q$kQ1N>>_mUwnO95wN*o#Ka*|JP zPZW^LIuRK7VaH<^F8Bou&mQY7izL|fSESbn$lHgisEhL({!viyD3BS1j5o#x-_xk; zyHbveP$lx2Pq8XYUt~bGKa*i{$Icg6_I$?pilIzQQ?=V_nZHOA2jf~wEmq=A?AJ-J z1{{e7Cy~_X8Yi@}rJhj1js(JdJXN3x Date: Wed, 9 Aug 2023 10:08:58 +0500 Subject: [PATCH 010/291] fix: working with {prefix}-create --- components/navbar/ChainSelectDropdown.vue | 7 +- composables/useChainRedirect.ts | 167 +++++++++++++++------- utils/config/permision.config.ts | 16 +++ 3 files changed, 139 insertions(+), 51 deletions(-) diff --git a/components/navbar/ChainSelectDropdown.vue b/components/navbar/ChainSelectDropdown.vue index b34830b70c..e2a58358dc 100644 --- a/components/navbar/ChainSelectDropdown.vue +++ b/components/navbar/ChainSelectDropdown.vue @@ -33,10 +33,11 @@ const prefrencesStore = usePreferencesStore() const selected = computed({ get: () => urlPrefix.value, - set: (value) => { + set: (newChain) => { prefrencesStore.setNotificationBoxCollapse(false) - setUrlPrefix(value) - redirectAfterChainChange(value, `/${value}`) + const prevChain = urlPrefix.value + setUrlPrefix(newChain) + redirectAfterChainChange(newChain, prevChain) }, }) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index b6b6d86685..5c5f408eae 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -1,5 +1,6 @@ import { Prefix } from '~~/libs/static/dist' import { + classicCreateVisible, explorerVisible, seriesInsightVisible, } from '@/utils/config/permision.config' @@ -9,90 +10,160 @@ enum RedirectTypes { STAY = 'stay', } -export enum PageTypes { - PREFIX_EXPLORE_ITEMS = 'prefix-explore-items', - PREFIX_EXPLORE_COLLECTIBLES = 'prefix-explore-collectibles', +enum PageType { + PREFIX_EXPLORE_ITEMS = '{prefix}-explore-items', + PREFIX_EXPLORE_COLLECTIBLES = '{prefix}-explore-collectibles', SALES = 'sales', HOT = 'hot', SERIES_INSIGHT = 'series-insight', BLOG = 'blog', BLOG_SLUG = 'blog-slug', - PREFIX_MASSMINT = 'prefix-massmint', - PREFIX_MASSMINT_ONBOARDING = 'prefix-massmint-onboarding', + PREFIX_MASSMINT = '{prefix}-massmint', + PREFIX_MASSMINT_ONBOARDING = '{prefix}-massmint-onboarding', + PREFIX_CLASSIC_CREATE = '{prefix}-create', } -const SpecialRedirectPages = [ - PageTypes.PREFIX_EXPLORE_ITEMS, - PageTypes.PREFIX_EXPLORE_COLLECTIBLES, - PageTypes.SALES, - PageTypes.HOT, - PageTypes.SERIES_INSIGHT, - PageTypes.BLOG, - PageTypes.BLOG_SLUG, - PageTypes.PREFIX_MASSMINT, - PageTypes.PREFIX_MASSMINT_ONBOARDING, -] - -const redirectType: { [key in PageTypes]?: RedirectTypes } = { - [PageTypes.PREFIX_EXPLORE_ITEMS]: RedirectTypes.CHAIN_PREFIX_CHANGE, - [PageTypes.PREFIX_EXPLORE_COLLECTIBLES]: RedirectTypes.CHAIN_PREFIX_CHANGE, - [PageTypes.SALES]: RedirectTypes.STAY, - [PageTypes.HOT]: RedirectTypes.STAY, - [PageTypes.SERIES_INSIGHT]: RedirectTypes.STAY, - [PageTypes.BLOG]: RedirectTypes.STAY, - [PageTypes.BLOG_SLUG]: RedirectTypes.STAY, - [PageTypes.PREFIX_MASSMINT]: RedirectTypes.CHAIN_PREFIX_CHANGE, - [PageTypes.PREFIX_MASSMINT_ONBOARDING]: RedirectTypes.CHAIN_PREFIX_CHANGE, +type RedirectPath = { + path: string + query?: { + [key: string]: any + } +} + +const PageRedirectType: { [key in PageType]?: RedirectTypes } = { + [PageType.PREFIX_EXPLORE_ITEMS]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageType.PREFIX_EXPLORE_COLLECTIBLES]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageType.SALES]: RedirectTypes.STAY, + [PageType.HOT]: RedirectTypes.STAY, + [PageType.SERIES_INSIGHT]: RedirectTypes.STAY, + [PageType.BLOG]: RedirectTypes.STAY, + [PageType.BLOG_SLUG]: RedirectTypes.STAY, + [PageType.PREFIX_MASSMINT]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageType.PREFIX_MASSMINT_ONBOARDING]: RedirectTypes.CHAIN_PREFIX_CHANGE, + [PageType.PREFIX_CLASSIC_CREATE]: RedirectTypes.CHAIN_PREFIX_CHANGE, +} + +function getEnumKeyByValue< + T extends { [key: string]: string }, + K extends keyof T +>(enumObject: T, value: string): K | undefined { + return Object.keys(enumObject).find((key) => enumObject[key] === value) as K } +const SpecialRedirectPageTypes: PageType[] = Object.keys(PageRedirectType) + .map((value) => getEnumKeyByValue(PageType, value) as PageType) + .filter(Boolean) as PageType[] + const pageVisibilityPerChain = { - [PageTypes.PREFIX_EXPLORE_ITEMS]: (chain: Prefix | string): boolean => + [PageType.PREFIX_EXPLORE_ITEMS]: (chain: Prefix | string): boolean => explorerVisible(chain), - [PageTypes.PREFIX_EXPLORE_COLLECTIBLES]: (chain: Prefix | string): boolean => + [PageType.PREFIX_EXPLORE_COLLECTIBLES]: (chain: Prefix | string): boolean => explorerVisible(chain), - [PageTypes.SERIES_INSIGHT]: (chain: Prefix | string) => + [PageType.SERIES_INSIGHT]: (chain: Prefix | string) => seriesInsightVisible(chain), + [PageType.PREFIX_CLASSIC_CREATE]: (chain: Prefix | string) => + classicCreateVisible(chain), } -export default function () { - const { urlPrefix } = usePrefix() +const getPagaType = (routeName: string): PageType => { + const matchingKey = Object.keys(PageType).find((key) => { + const pattern = PageType[key].replace(/\{.*\}/, '.+').replace('-', '\\-') + return new RegExp(`^${pattern}$`).test(routeName) + }) + return matchingKey as PageType +} + +export default function () { const route = useRoute() - const getChangedChainPrefixFromPath = (chain: string | Prefix) => - route.path.replace(urlPrefix.value, chain) + const getChangedChainPrefixFromPath = ( + chain: string | Prefix, + prevChain: string | Prefix + ): RedirectPath => ({ + path: route.path.replace(prevChain, chain), + query: route.query, + }) const handleSpecialCaseRedirect: { - [key in RedirectTypes]?: (chain: string | Prefix) => void + [key in RedirectTypes]?: ( + chain: string | Prefix, + prevChain: string | Prefix + ) => RedirectPath } = { - [RedirectTypes.CHAIN_PREFIX_CHANGE]: (chain: string | Prefix) => - navigateTo(getChangedChainPrefixFromPath(chain)), + [RedirectTypes.CHAIN_PREFIX_CHANGE]: ( + chain: string | Prefix, + prevChain: string | Prefix + ): RedirectPath => getChangedChainPrefixFromPath(chain, prevChain), } - const redirectAfterChainChange = ( - chain: string | Prefix, - defaultPath: string - ) => { + const checkIfPageHasSpecialRedirect = (pageType: PageType): boolean => { + return SpecialRedirectPageTypes.includes(pageType as PageType) + } + + const getPageRedirectPath = ( + newChain: string | Prefix, + prevChain: string | Prefix, + defaultRedirectPath: string + ): RedirectPath | null => { const routeName = route.name || '' - const isSpecialCase = SpecialRedirectPages.includes(routeName as PageTypes) + const defaultRedirect: RedirectPath = { + path: defaultRedirectPath, + } + + const pageType = getPagaType(routeName) + + const isSpecialCase = checkIfPageHasSpecialRedirect(pageType) + if (!isSpecialCase) { + return defaultRedirect + } + + const pageTypeValue = PageType[pageType] let isPageAvailableForChain = true - const pageVisibilityCheck = pageVisibilityPerChain[routeName] + + const pageVisibilityCheck = pageVisibilityPerChain[pageTypeValue] if (pageVisibilityCheck) { - isPageAvailableForChain = pageVisibilityCheck(chain) + isPageAvailableForChain = pageVisibilityCheck(newChain) } - if (!(isSpecialCase && isPageAvailableForChain)) { - navigateTo(defaultPath) + if (!isPageAvailableForChain) { + return defaultRedirect } - if (redirectType[routeName] === RedirectTypes.STAY) { + const pageRedirectType = PageRedirectType[pageTypeValue] + + if ( + pageRedirectType === RedirectTypes.STAY || + !Object.prototype.hasOwnProperty.call( + handleSpecialCaseRedirect, + pageRedirectType + ) + ) { + return null + } + + return handleSpecialCaseRedirect[pageRedirectType](newChain, prevChain) + } + + const redirectAfterChainChange = ( + newChain: string | Prefix, + prevChain: string | Prefix, + defaultRedirect = `/${newChain}` + ) => { + const redirectPath = getPageRedirectPath( + newChain, + prevChain, + defaultRedirect + ) + + if (!redirectPath) { return } - handleSpecialCaseRedirect[redirectType[routeName]](chain, routeName) + navigateTo(redirectPath) } return { diff --git a/utils/config/permision.config.ts b/utils/config/permision.config.ts index 6abd2eef6a..839316a157 100644 --- a/utils/config/permision.config.ts +++ b/utils/config/permision.config.ts @@ -36,6 +36,18 @@ const hasInsight: Config = { stt: false, } +const hasClassicCreate: Config = { + rmrk: true, + ksm: true, + bsx: true, + stmn: false, + movr: true, + glmr: true, + snek: true, + dot: true, + stt: true, +} + export const createVisible = (prefix: Prefix | string): boolean => { return hasCreate[prefix] } @@ -47,3 +59,7 @@ export const explorerVisible = (prefix: Prefix | string): boolean => { export const seriesInsightVisible = (prefix: Prefix | string) => { return hasInsight[prefix] } + +export const classicCreateVisible = (prefix: Prefix | string) => { + return hasClassicCreate[prefix] +} From c6ad534b8fec1a278f96aab49d451f582f0d1dc5 Mon Sep 17 00:00:00 2001 From: hassnian Date: Wed, 9 Aug 2023 10:13:33 +0500 Subject: [PATCH 011/291] fix: config update --- utils/config/permision.config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/config/permision.config.ts b/utils/config/permision.config.ts index 839316a157..3ee2b60d5e 100644 --- a/utils/config/permision.config.ts +++ b/utils/config/permision.config.ts @@ -41,11 +41,11 @@ const hasClassicCreate: Config = { ksm: true, bsx: true, stmn: false, - movr: true, - glmr: true, + movr: false, + glmr: false, snek: true, - dot: true, - stt: true, + dot: false, + stt: false, } export const createVisible = (prefix: Prefix | string): boolean => { From 6c8f99ac0f94249cc4f4b2af82731f8c1ccccc05 Mon Sep 17 00:00:00 2001 From: hassnian Date: Wed, 9 Aug 2023 10:23:29 +0500 Subject: [PATCH 012/291] added massmint checks --- composables/useChainRedirect.ts | 7 ++++++- utils/config/permision.config.ts | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index 5c5f408eae..8a19376005 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -2,6 +2,7 @@ import { Prefix } from '~~/libs/static/dist' import { classicCreateVisible, explorerVisible, + massmintCreateVisible, seriesInsightVisible, } from '@/utils/config/permision.config' @@ -63,6 +64,10 @@ const pageVisibilityPerChain = { seriesInsightVisible(chain), [PageType.PREFIX_CLASSIC_CREATE]: (chain: Prefix | string) => classicCreateVisible(chain), + [PageType.PREFIX_MASSMINT]: (chain: Prefix | string) => + massmintCreateVisible(chain), + [PageType.PREFIX_MASSMINT_ONBOARDING]: (chain: Prefix | string) => + massmintCreateVisible(chain), } const getPagaType = (routeName: string): PageType => { @@ -121,7 +126,7 @@ export default function () { } const pageTypeValue = PageType[pageType] - let isPageAvailableForChain = true + let isPageAvailableForChain = false const pageVisibilityCheck = pageVisibilityPerChain[pageTypeValue] diff --git a/utils/config/permision.config.ts b/utils/config/permision.config.ts index 3ee2b60d5e..7337663a6f 100644 --- a/utils/config/permision.config.ts +++ b/utils/config/permision.config.ts @@ -48,6 +48,18 @@ const hasClassicCreate: Config = { stt: false, } +const hasMassmintCreate: Config = { + rmrk: true, + ksm: true, + bsx: true, + stmn: true, + movr: false, + glmr: false, + snek: true, + dot: false, + stt: false, +} + export const createVisible = (prefix: Prefix | string): boolean => { return hasCreate[prefix] } @@ -63,3 +75,7 @@ export const seriesInsightVisible = (prefix: Prefix | string) => { export const classicCreateVisible = (prefix: Prefix | string) => { return hasClassicCreate[prefix] } + +export const massmintCreateVisible = (prefix: Prefix | string) => { + return hasMassmintCreate[prefix] +} From a5296e5cdffb223460515912256a8d4a10dc5268 Mon Sep 17 00:00:00 2001 From: hassnian Date: Wed, 9 Aug 2023 10:48:16 +0500 Subject: [PATCH 013/291] fix: added checks for hot and sales --- composables/useChainRedirect.ts | 20 ++++++++++++-------- utils/config/permision.config.ts | 32 ++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index 8a19376005..aca093aec6 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -1,8 +1,10 @@ import { Prefix } from '~~/libs/static/dist' import { - classicCreateVisible, + createVisible, explorerVisible, + hotVisible, massmintCreateVisible, + salesVisible, seriesInsightVisible, } from '@/utils/config/permision.config' @@ -63,11 +65,13 @@ const pageVisibilityPerChain = { [PageType.SERIES_INSIGHT]: (chain: Prefix | string) => seriesInsightVisible(chain), [PageType.PREFIX_CLASSIC_CREATE]: (chain: Prefix | string) => - classicCreateVisible(chain), + createVisible(chain), [PageType.PREFIX_MASSMINT]: (chain: Prefix | string) => massmintCreateVisible(chain), [PageType.PREFIX_MASSMINT_ONBOARDING]: (chain: Prefix | string) => massmintCreateVisible(chain), + [PageType.SALES]: (chain: Prefix | string) => salesVisible(chain), + [PageType.HOT]: (chain: Prefix | string) => hotVisible(chain), } const getPagaType = (routeName: string): PageType => { @@ -79,7 +83,7 @@ const getPagaType = (routeName: string): PageType => { return matchingKey as PageType } -export default function () { +export default function (allowRedirectIfCheckNotPresent = false) { const route = useRoute() const getChangedChainPrefixFromPath = ( @@ -125,9 +129,8 @@ export default function () { return defaultRedirect } + let isPageAvailableForChain = allowRedirectIfCheckNotPresent const pageTypeValue = PageType[pageType] - let isPageAvailableForChain = false - const pageVisibilityCheck = pageVisibilityPerChain[pageTypeValue] if (pageVisibilityCheck) { @@ -140,13 +143,14 @@ export default function () { const pageRedirectType = PageRedirectType[pageTypeValue] - if ( - pageRedirectType === RedirectTypes.STAY || + const justStay = pageRedirectType === RedirectTypes.STAY + const noSpecialHandleRedirectAvailableForChain = !Object.prototype.hasOwnProperty.call( handleSpecialCaseRedirect, pageRedirectType ) - ) { + + if (justStay || noSpecialHandleRedirectAvailableForChain) { return null } diff --git a/utils/config/permision.config.ts b/utils/config/permision.config.ts index 7337663a6f..f2a08de4d7 100644 --- a/utils/config/permision.config.ts +++ b/utils/config/permision.config.ts @@ -4,7 +4,7 @@ const hasCreate: Config = { rmrk: true, ksm: true, bsx: true, - stmn: true, + stmn: false, movr: false, glmr: false, snek: true, @@ -36,18 +36,30 @@ const hasInsight: Config = { stt: false, } -const hasClassicCreate: Config = { +const hasSales: Config = { rmrk: true, ksm: true, - bsx: true, + bsx: false, stmn: false, movr: false, glmr: false, - snek: true, + snek: false, dot: false, stt: false, } +const hasHot: Config = { + rmrk: true, + ksm: true, + bsx: true, + stmn: true, + movr: true, + glmr: true, + snek: true, + dot: true, + stt: true, +} + const hasMassmintCreate: Config = { rmrk: true, ksm: true, @@ -72,10 +84,14 @@ export const seriesInsightVisible = (prefix: Prefix | string) => { return hasInsight[prefix] } -export const classicCreateVisible = (prefix: Prefix | string) => { - return hasClassicCreate[prefix] -} - export const massmintCreateVisible = (prefix: Prefix | string) => { return hasMassmintCreate[prefix] } + +export const salesVisible = (prefix: Prefix | string) => { + return hasSales[prefix] +} + +export const hotVisible = (prefix: Prefix | string) => { + return hasHot[prefix] +} From 6aa8a9e4fcc4843dc50e7e46d60c4e344518cdcb Mon Sep 17 00:00:00 2001 From: hassnian Date: Wed, 9 Aug 2023 10:58:32 +0500 Subject: [PATCH 014/291] cleanup --- composables/useChainRedirect.ts | 40 ++++++++++++++------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index aca093aec6..d56c711cd7 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -58,20 +58,17 @@ const SpecialRedirectPageTypes: PageType[] = Object.keys(PageRedirectType) .filter(Boolean) as PageType[] const pageVisibilityPerChain = { - [PageType.PREFIX_EXPLORE_ITEMS]: (chain: Prefix | string): boolean => + [PageType.PREFIX_EXPLORE_ITEMS]: (chain: Prefix): boolean => explorerVisible(chain), - [PageType.PREFIX_EXPLORE_COLLECTIBLES]: (chain: Prefix | string): boolean => + [PageType.PREFIX_EXPLORE_COLLECTIBLES]: (chain: Prefix): boolean => explorerVisible(chain), - [PageType.SERIES_INSIGHT]: (chain: Prefix | string) => - seriesInsightVisible(chain), - [PageType.PREFIX_CLASSIC_CREATE]: (chain: Prefix | string) => - createVisible(chain), - [PageType.PREFIX_MASSMINT]: (chain: Prefix | string) => + [PageType.SERIES_INSIGHT]: (chain: Prefix) => seriesInsightVisible(chain), + [PageType.PREFIX_CLASSIC_CREATE]: (chain: Prefix) => createVisible(chain), + [PageType.PREFIX_MASSMINT]: (chain: Prefix) => massmintCreateVisible(chain), + [PageType.PREFIX_MASSMINT_ONBOARDING]: (chain: Prefix) => massmintCreateVisible(chain), - [PageType.PREFIX_MASSMINT_ONBOARDING]: (chain: Prefix | string) => - massmintCreateVisible(chain), - [PageType.SALES]: (chain: Prefix | string) => salesVisible(chain), - [PageType.HOT]: (chain: Prefix | string) => hotVisible(chain), + [PageType.SALES]: (chain: Prefix) => salesVisible(chain), + [PageType.HOT]: (chain: Prefix) => hotVisible(chain), } const getPagaType = (routeName: string): PageType => { @@ -87,22 +84,19 @@ export default function (allowRedirectIfCheckNotPresent = false) { const route = useRoute() const getChangedChainPrefixFromPath = ( - chain: string | Prefix, - prevChain: string | Prefix + chain: Prefix, + prevChain: Prefix ): RedirectPath => ({ path: route.path.replace(prevChain, chain), query: route.query, }) const handleSpecialCaseRedirect: { - [key in RedirectTypes]?: ( - chain: string | Prefix, - prevChain: string | Prefix - ) => RedirectPath + [key in RedirectTypes]?: (chain: Prefix, prevChain: Prefix) => RedirectPath } = { [RedirectTypes.CHAIN_PREFIX_CHANGE]: ( - chain: string | Prefix, - prevChain: string | Prefix + chain: Prefix, + prevChain: Prefix ): RedirectPath => getChangedChainPrefixFromPath(chain, prevChain), } @@ -111,8 +105,8 @@ export default function (allowRedirectIfCheckNotPresent = false) { } const getPageRedirectPath = ( - newChain: string | Prefix, - prevChain: string | Prefix, + newChain: Prefix, + prevChain: Prefix, defaultRedirectPath: string ): RedirectPath | null => { const routeName = route.name || '' @@ -158,8 +152,8 @@ export default function (allowRedirectIfCheckNotPresent = false) { } const redirectAfterChainChange = ( - newChain: string | Prefix, - prevChain: string | Prefix, + newChain: Prefix, + prevChain: Prefix, defaultRedirect = `/${newChain}` ) => { const redirectPath = getPageRedirectPath( From 27ce7b6f08536ffae8fc5ab6c589a9e8ccd774ac Mon Sep 17 00:00:00 2001 From: hassnian Date: Wed, 9 Aug 2023 11:18:49 +0500 Subject: [PATCH 015/291] ref: removed handleSpecialCaseRedirect --- composables/useChainRedirect.ts | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index d56c711cd7..27f553691c 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -91,15 +91,6 @@ export default function (allowRedirectIfCheckNotPresent = false) { query: route.query, }) - const handleSpecialCaseRedirect: { - [key in RedirectTypes]?: (chain: Prefix, prevChain: Prefix) => RedirectPath - } = { - [RedirectTypes.CHAIN_PREFIX_CHANGE]: ( - chain: Prefix, - prevChain: Prefix - ): RedirectPath => getChangedChainPrefixFromPath(chain, prevChain), - } - const checkIfPageHasSpecialRedirect = (pageType: PageType): boolean => { return SpecialRedirectPageTypes.includes(pageType as PageType) } @@ -137,18 +128,15 @@ export default function (allowRedirectIfCheckNotPresent = false) { const pageRedirectType = PageRedirectType[pageTypeValue] - const justStay = pageRedirectType === RedirectTypes.STAY - const noSpecialHandleRedirectAvailableForChain = - !Object.prototype.hasOwnProperty.call( - handleSpecialCaseRedirect, - pageRedirectType - ) - - if (justStay || noSpecialHandleRedirectAvailableForChain) { + if (pageRedirectType === RedirectTypes.STAY) { return null } - return handleSpecialCaseRedirect[pageRedirectType](newChain, prevChain) + if (pageRedirectType === RedirectTypes.CHAIN_PREFIX_CHANGE) { + return getChangedChainPrefixFromPath(newChain, prevChain) + } + + return null } const redirectAfterChainChange = ( From f45579f90f4c0f579e0bafad25470fe5765bb12d Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Wed, 9 Aug 2023 13:49:34 +0700 Subject: [PATCH 016/291] revert: render image by default --- components/common/ConnectWallet/WalletAssetNfts.vue | 4 +++- components/gallery/GalleryItem.vue | 2 ++ components/gallery/GalleryItemDescription.vue | 2 +- components/gallery/GalleryItemPreviewer.vue | 2 ++ libs/ui/src/components/MediaItem/MediaItem.vue | 8 ++++++-- libs/ui/src/components/NeoNftCard/NeoNftCard.vue | 1 + 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/components/common/ConnectWallet/WalletAssetNfts.vue b/components/common/ConnectWallet/WalletAssetNfts.vue index e3d69435e5..3de683bf38 100644 --- a/components/common/ConnectWallet/WalletAssetNfts.vue +++ b/components/common/ConnectWallet/WalletAssetNfts.vue @@ -7,7 +7,9 @@ v-for="nft in nfts.slice(0, 3)" :key="nft.id" :href="`/${urlPrefix}/gallery/${nft.id}`"> - +
diff --git a/components/gallery/GalleryItem.vue b/components/gallery/GalleryItem.vue index 37a78d95b8..32fc8a71bd 100644 --- a/components/gallery/GalleryItem.vue +++ b/components/gallery/GalleryItem.vue @@ -35,6 +35,7 @@ @@ -51,6 +52,7 @@ class="gallery-item-media" :src="nftImage" :animation-src="nftAnimation" + :mime-type="nftMimeType" :title="nftMetadata?.name" is-detail :is-lewd="galleryDescriptionRef?.isLewd" diff --git a/components/gallery/GalleryItemDescription.vue b/components/gallery/GalleryItemDescription.vue index 8643c6af5d..6b6426f59a 100644 --- a/components/gallery/GalleryItemDescription.vue +++ b/components/gallery/GalleryItemDescription.vue @@ -226,7 +226,7 @@ const animationMediaMimeType = ref('') watchEffect(async () => { if (nft.value?.metadata) { - const sanitizeMetadata = sanitizeIpfsUrl(nft.value?.metadata, 'cloudflare') + const sanitizeMetadata = sanitizeIpfsUrl(nft.value?.metadata) const response = await fetch(sanitizeMetadata, { method: 'HEAD', }) diff --git a/components/gallery/GalleryItemPreviewer.vue b/components/gallery/GalleryItemPreviewer.vue index 0024b865e3..38660a1c1e 100644 --- a/components/gallery/GalleryItemPreviewer.vue +++ b/components/gallery/GalleryItemPreviewer.vue @@ -18,6 +18,7 @@ :src="itemSrc" :placeholder="placeholder" :animation-src="nftAnimation" + :mime-type="nftMimeType" :title="nft?.name || nft?.id" original /> @@ -37,6 +38,7 @@ const props = defineProps<{ }>() const nft = computed(() => props.galleryItem.nft.value) +const nftMimeType = computed(() => props.galleryItem.nftMimeType.value) const nftAnimation = computed(() => props.galleryItem.nftAnimation.value) const emit = defineEmits(['input']) diff --git a/libs/ui/src/components/MediaItem/MediaItem.vue b/libs/ui/src/components/MediaItem/MediaItem.vue index 3b3ded2af6..632f8db90a 100644 --- a/libs/ui/src/components/MediaItem/MediaItem.vue +++ b/libs/ui/src/components/MediaItem/MediaItem.vue @@ -45,6 +45,10 @@ export default { type: String, default: '', }, + mimeType: { + type: String, + default: '', + }, title: { type: String, default: 'KodaDot NFT', @@ -89,7 +93,7 @@ export default { }, computed: { resolveComponent() { - const type = this.defaultMimeType + const type = this.mimeType || this.defaultMimeType return this.components[resolveMedia(type) + SUFFIX] }, properSrc() { @@ -106,7 +110,7 @@ export default { }, methods: { async updateComponent() { - if (this.animationSrc) { + if (this.animationSrc && !this.mimeType) { this.defaultMimeType = await getMimeType(this.animationSrc) } }, diff --git a/libs/ui/src/components/NeoNftCard/NeoNftCard.vue b/libs/ui/src/components/NeoNftCard/NeoNftCard.vue index f3397f46fc..c75fc88f89 100644 --- a/libs/ui/src/components/NeoNftCard/NeoNftCard.vue +++ b/libs/ui/src/components/NeoNftCard/NeoNftCard.vue @@ -15,6 +15,7 @@ class="nft-media" :src="nft.image" :animation-src="nft.animationUrl" + :mime-type="nft.mimeType" :placeholder="placeholder" :title="nft?.name" />
Date: Wed, 9 Aug 2023 13:52:52 +0700 Subject: [PATCH 017/291] feat: use obtainMimeType --- components/gallery/GalleryItemDescription.vue | 5 +++-- package.json | 1 + pnpm-lock.yaml | 20 +++++++++++++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/components/gallery/GalleryItemDescription.vue b/components/gallery/GalleryItemDescription.vue index 6b6426f59a..32e32ae783 100644 --- a/components/gallery/GalleryItemDescription.vue +++ b/components/gallery/GalleryItemDescription.vue @@ -138,6 +138,7 @@ diff --git a/components/bsx/Offer/OfferTable.vue b/components/bsx/Offer/OfferTable.vue index dd5f190998..e92b955e62 100644 --- a/components/bsx/Offer/OfferTable.vue +++ b/components/bsx/Offer/OfferTable.vue @@ -71,7 +71,7 @@ field="formatPrice" :label="$t('offer.price')" sortable> - +

- {{ new Date(props.row.createdAt) | formatDistanceToNow }} + {{ timeAgo(new Date(props.row.createdAt).getTime()) }}

- + From ddaf3a9570a3ecba882d5081194a447bdb7750ab Mon Sep 17 00:00:00 2001 From: god-of-js Date: Fri, 11 Aug 2023 23:12:32 +0100 Subject: [PATCH 200/291] chore(): truncated NFT name to max 2 lines --- .../common/shoppingCart/ShoppingCartItemRow.vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/components/common/shoppingCart/ShoppingCartItemRow.vue b/components/common/shoppingCart/ShoppingCartItemRow.vue index cac246d17f..6ab9780307 100644 --- a/components/common/shoppingCart/ShoppingCartItemRow.vue +++ b/components/common/shoppingCart/ShoppingCartItemRow.vue @@ -16,7 +16,7 @@ class="is-flex is-flex-direction-column is-justify-content-space-between ml-4"> {{ nft.name }} @@ -67,7 +67,7 @@ const emit = defineEmits(['delete', 'click-item']) const props = withDefaults( defineProps<{ nft: ShoppingCartItem - round: number + round?: number }>(), { round: 2, @@ -123,4 +123,11 @@ onMounted(() => { .hidden { opacity: 0; } + +.truncate-to-2-lines { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} From 0fc93754598051c1750925447b7382e293137f47 Mon Sep 17 00:00:00 2001 From: hassnian Date: Sat, 12 Aug 2023 10:30:40 +0500 Subject: [PATCH 201/291] ref:more specific function & multiple placeholders --- composables/useChainRedirect.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index 7d98b93415..41f1d59e60 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -80,9 +80,9 @@ const pageAvailabilityPerChain = { } const generateRouteRegexPattern = (pattern: string): string => { - const patternWithPlaceholderReplaced = pattern.replace(/\{.*\}/, '.+') + const patternWithPlaceholderReplaced = pattern.replace(/\{[^}]*\}/g, '.+') const patternWithHyphensEscaped = patternWithPlaceholderReplaced.replace( - '-', + /-/g, '\\-' ) return `^${patternWithHyphensEscaped}$` From daae9cbfd47280b50252c70722bed6d6307f5227 Mon Sep 17 00:00:00 2001 From: hassnian Date: Sat, 12 Aug 2023 10:48:16 +0500 Subject: [PATCH 202/291] ref: limit the length of the placeholder --- composables/useChainRedirect.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composables/useChainRedirect.ts b/composables/useChainRedirect.ts index 41f1d59e60..041098b9ba 100644 --- a/composables/useChainRedirect.ts +++ b/composables/useChainRedirect.ts @@ -80,7 +80,10 @@ const pageAvailabilityPerChain = { } const generateRouteRegexPattern = (pattern: string): string => { - const patternWithPlaceholderReplaced = pattern.replace(/\{[^}]*\}/g, '.+') + const patternWithPlaceholderReplaced = pattern.replace( + /\{[^}]{1,30}\}/g, + '.+' + ) const patternWithHyphensEscaped = patternWithPlaceholderReplaced.replace( /-/g, '\\-' From 856bd3ed6211b50c4c2cdc43989687ede891d645 Mon Sep 17 00:00:00 2001 From: hassnian Date: Sat, 12 Aug 2023 11:23:05 +0500 Subject: [PATCH 203/291] ref: styles inside neobutton & useDoAfterLogin --- .../common/shoppingCart/ShoppingCartModal.vue | 2 +- .../GalleryItemActionType/GalleryItemBuy.vue | 2 +- components/items/ItemsGrid/ItemsGridImage.vue | 30 ++++------------ composables/useDoAfterlogin.ts | 14 ++++---- .../src/components/NeoButton/NeoButton.scss | 22 ++++++++++++ .../ui/src/components/NeoButton/NeoButton.vue | 35 +++++++++++-------- 6 files changed, 59 insertions(+), 46 deletions(-) diff --git a/components/common/shoppingCart/ShoppingCartModal.vue b/components/common/shoppingCart/ShoppingCartModal.vue index 50e63f8ed2..fc2652dfea 100644 --- a/components/common/shoppingCart/ShoppingCartModal.vue +++ b/components/common/shoppingCart/ShoppingCartModal.vue @@ -156,7 +156,7 @@ const openCompletePurcahseModal = () => { } const onCompletePurchase = () => { - doAfterLogin(openCompletePurcahseModal) + doAfterLogin({ onLoginSuccess: openCompletePurcahseModal }) closeShoppingCart() } diff --git a/components/gallery/GalleryItemAction/GalleryItemActionType/GalleryItemBuy.vue b/components/gallery/GalleryItemAction/GalleryItemActionType/GalleryItemBuy.vue index 197ccdd996..8ec64f38ce 100644 --- a/components/gallery/GalleryItemAction/GalleryItemActionType/GalleryItemBuy.vue +++ b/components/gallery/GalleryItemAction/GalleryItemActionType/GalleryItemBuy.vue @@ -152,7 +152,7 @@ function onClick() { if (btnStatus.value === BuyStatus.CART) { openShoppingCart(instance) } else { - doAfterLogin(openCompletePurcahseModal) + doAfterLogin({ onLoginSuccess: openCompletePurcahseModal }) } } diff --git a/components/items/ItemsGrid/ItemsGridImage.vue b/components/items/ItemsGrid/ItemsGridImage.vue index 1eb9772486..0e7cfb1021 100644 --- a/components/items/ItemsGrid/ItemsGridImage.vue +++ b/components/items/ItemsGrid/ItemsGridImage.vue @@ -18,9 +18,9 @@ data-cy="item-buy" no-shadow :loading="showActionSection" - class="is-flex-grow-1 btn-height override-button-loading" + class="is-flex-grow-1 btn-height" + loading-with-label @click.native.prevent="onClickBuy"> - {{ buyLabel }} { const onClickBuy = () => { shoppingCartStore.setItemToBuy(nftToShoppingCardItem(props.nft)) - doAfterLogin(openCompletePurcahseModal, onCancelPurchase) + doAfterLogin({ + onLoginSuccess: openCompletePurcahseModal, + onCancel: onCancelPurchase, + }) } const onClickShoppingCart = () => { @@ -115,27 +118,6 @@ const onClickShoppingCart = () => { width: unset !important; } } - -.override-button-loading.o-btn--loading { - @include ktheme() { - color: theme('k-grey') !important; - - :deep .o-btn__label { - margin: 0 3px !important; - } - - &::after { - position: relative !important; - left: 0px !important ; - border: 2px solid theme('k-grey') !important; - border-radius: 9999px !important; - border-right-color: transparent !important; - border-top-color: transparent !important; - margin: 0 3px; - } - } -} - .in-cart-border { @include ktheme() { outline: 2px solid theme('k-blue') !important; diff --git a/composables/useDoAfterlogin.ts b/composables/useDoAfterlogin.ts index 89b66c36c9..752eb55a20 100644 --- a/composables/useDoAfterlogin.ts +++ b/composables/useDoAfterlogin.ts @@ -1,20 +1,22 @@ import { openConnectWalletModal } from '@/components/common/ConnectWallet/useConnectWallet' +interface DoAfterLoginParams { + onLoginSuccess: (account?: string) => void + onCancel?: () => void +} + export default function (instance) { - const doAfterLogin = ( - callback: (account?: string) => void, - onCancel?: () => void - ) => { + const doAfterLogin = ({ onLoginSuccess, onCancel }: DoAfterLoginParams) => { const { isLogIn } = useAuth() if (!isLogIn.value) { openConnectWalletModal(instance, { - onConnect: callback, + onConnect: onLoginSuccess, onCancel, onClose: onCancel, closeAfterConnect: true, }) } else { - callback() + onLoginSuccess() } } return { diff --git a/libs/ui/src/components/NeoButton/NeoButton.scss b/libs/ui/src/components/NeoButton/NeoButton.scss index 36c62c48ef..67697c9947 100644 --- a/libs/ui/src/components/NeoButton/NeoButton.scss +++ b/libs/ui/src/components/NeoButton/NeoButton.scss @@ -188,6 +188,28 @@ } } } + + &.loading-with-label.o-btn--loading { + @include ktheme() { + color: theme('k-grey') !important; + + :deep .o-btn__label { + margin: 0 3px !important; + } + + &::after { + position: relative !important; + left: 0px !important ; + border: 2px solid theme('k-grey') !important; + border-radius: 9999px !important; + border-right-color: transparent !important; + border-top-color: transparent !important; + margin: 0 3px; + height: 1em !important; + width: 1em !important; + } + } + } } .is-fixed-width { diff --git a/libs/ui/src/components/NeoButton/NeoButton.vue b/libs/ui/src/components/NeoButton/NeoButton.vue index 2d1f0ab7b6..aa39927bd2 100644 --- a/libs/ui/src/components/NeoButton/NeoButton.vue +++ b/libs/ui/src/components/NeoButton/NeoButton.vue @@ -4,6 +4,7 @@ active: active, 'is-fixed-width': fixedWidth, 'no-shadow': noShadow, + 'loading-with-label': loadingWithLabel, }" :size="size" :icon-right="icon" @@ -24,20 +25,26 @@ import { OButton } from '@oruga-ui/oruga' import { NeoButtonVariant } from '@kodadot1/brick' -defineProps<{ - size?: 'small' | 'medium' | 'large' - disabled?: boolean - expanded?: boolean - icon?: string - iconPack?: string - label?: string - active?: boolean - fixedWidth?: boolean - noShadow?: boolean - variant?: NeoButtonVariant - rounded?: boolean - tag?: string -}>() +withDefaults( + defineProps<{ + size?: 'small' | 'medium' | 'large' + disabled?: boolean + expanded?: boolean + icon?: string + iconPack?: string + label?: string + active?: boolean + fixedWidth?: boolean + noShadow?: boolean + variant?: NeoButtonVariant + rounded?: boolean + tag?: string + loadingWithLabel: boolean + }>(), + { + loadingWithLabel: false, + } +) From b77b18e6f51c84f2d4d3b8dfbe38e050c4854fa0 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 03:31:46 +0700 Subject: [PATCH 211/291] build: exit on failed to parse --- nuxt.config.js | 2 +- package.json | 2 +- script/generate.mjs | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 script/generate.mjs diff --git a/nuxt.config.js b/nuxt.config.js index c2b1d2399f..b1fa64f1ea 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -332,7 +332,7 @@ export default defineNuxtConfig({ }, }, - buildModules: ['nuxt-webpack-optimisations'], + // buildModules: ['nuxt-webpack-optimisations'], webpackOptimisations: { features: { diff --git a/package.json b/package.json index f9118cff0a..b4efbd39b1 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "start": "nuxi preview", "start:static": "npx --yes serve@14.2.0 -L -l 9090 -s dist", "generate:pnpm": "npx pnpm@latest-8 i --store=node_modules/.pnpm-store && npx pnpm@latest-8 generate", - "generate": "node ./script/substack.mjs && cross-env NODE_OPTIONS=--openssl-legacy-provider NITRO_PRESET=netlify nuxi generate", + "generate": "node ./script/substack.mjs && cross-env NODE_OPTIONS=--openssl-legacy-provider NITRO_PRESET=netlify node script/generate.mjs", "lint": "eslint --ignore-path .gitignore --ext .js,.ts,.vue .", "lint:quiet": "eslint --quiet --ignore-path .gitignore --ext .js,.ts,.vue .", "lint:fix": "eslint --fix --quiet --ignore-path .gitignore --ext .js,.ts,.vue .", diff --git a/script/generate.mjs b/script/generate.mjs new file mode 100644 index 0000000000..0f6b6ffc3a --- /dev/null +++ b/script/generate.mjs @@ -0,0 +1,23 @@ +import { spawn } from 'child_process' + +const generate = spawn('pnpm', ['generate']) + +generate.stdout.on('data', (data) => { + console.log(`stdout: ${data}`) + + if (data.includes('failed to parse')) { + console.log('exit(1)') + process.exit(1) + } +}) +generate.stderr.on('data', (data) => { + console.error(`stderr: ${data}`) + + if (data.includes('failed to parse')) { + console.log('exit(1)') + process.exit(1) + } +}) +generate.on('close', (code) => { + console.log(`child process exited with code ${code}`) +}) From 41529891d848faba194c6f999062c4361eb9603c Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 03:35:42 +0700 Subject: [PATCH 212/291] ci: rename script --- package.json | 4 ++-- script/generate.mjs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b4efbd39b1..a57185775a 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,8 @@ "locales:check": "node ./script/checkLocale.mjs", "start": "nuxi preview", "start:static": "npx --yes serve@14.2.0 -L -l 9090 -s dist", - "generate:pnpm": "npx pnpm@latest-8 i --store=node_modules/.pnpm-store && npx pnpm@latest-8 generate", - "generate": "node ./script/substack.mjs && cross-env NODE_OPTIONS=--openssl-legacy-provider NITRO_PRESET=netlify node script/generate.mjs", + "generate:script": "node ./script/substack.mjs && cross-env NODE_OPTIONS=--openssl-legacy-provider NITRO_PRESET=netlify nuxi generate", + "generate": "node script/generate.mjs", "lint": "eslint --ignore-path .gitignore --ext .js,.ts,.vue .", "lint:quiet": "eslint --quiet --ignore-path .gitignore --ext .js,.ts,.vue .", "lint:fix": "eslint --fix --quiet --ignore-path .gitignore --ext .js,.ts,.vue .", diff --git a/script/generate.mjs b/script/generate.mjs index 0f6b6ffc3a..2409f359f5 100644 --- a/script/generate.mjs +++ b/script/generate.mjs @@ -1,6 +1,6 @@ import { spawn } from 'child_process' -const generate = spawn('pnpm', ['generate']) +const generate = spawn('pnpm', ['generate:script']) generate.stdout.on('data', (data) => { console.log(`stdout: ${data}`) From 2127e179e7c22c5fee4d0e6b7abf50ec57e3443e Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 03:40:03 +0700 Subject: [PATCH 213/291] ci: force source map --- nuxt.config.js | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/nuxt.config.js b/nuxt.config.js index b1fa64f1ea..589038ee50 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -387,21 +387,9 @@ export default defineNuxtConfig({ '@google/model-viewer', // TODO check to see if it works without transpilation in future nuxt releases ], extend(config) { - // if ( - // process.env.NODE_ENV !== 'development' && - // process.env.SENTRY_AUTH_TOKEN - // ) { - // https://community.cloudflare.com/t/recurring-deployment-issue-on-pages-which-works-on-preview-branch-but-doesnt-on-production-branch/540278/10 - // config.devtool = 'source-map' - // config.plugins.push( - // new SentryWebpackPlugin({ - // org: 'kodadot', - // project: 'nft-gallery', - // include: './dist', - // authToken: process.env.SENTRY_AUTH_TOKEN, - // }) - // ) - // } + if (process.env.NODE_ENV !== 'development') { + config.devtool = 'source-map' + } // add frontmatter-markdown-loader config.module.rules.push({ From 91d786879bb52e86055bd008b65b076272fa7eed Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 04:12:27 +0700 Subject: [PATCH 214/291] ci: fail pls --- .github/workflows/node.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/node.yml diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml new file mode 100644 index 0000000000..3995f9e7eb --- /dev/null +++ b/.github/workflows/node.yml @@ -0,0 +1,36 @@ +name: Node.js CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.13.0, 18.14.2, 18.15.0, 18.16.1, 18.17.1] + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - uses: pnpm/action-setup@v2 + name: Install pnpm + id: pnpm-install + with: + version: 8 + + - name: Install dependencies + shell: bash + run: pnpm install + + - name: Run Build + run: pnpm generate From 549c847f6629d860ac732e0f7ebca4ebe44c54c3 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 04:22:24 +0700 Subject: [PATCH 215/291] ci: always exit(1) on stderr --- script/generate.mjs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/script/generate.mjs b/script/generate.mjs index 2409f359f5..dc095d79d9 100644 --- a/script/generate.mjs +++ b/script/generate.mjs @@ -10,14 +10,13 @@ generate.stdout.on('data', (data) => { process.exit(1) } }) + generate.stderr.on('data', (data) => { console.error(`stderr: ${data}`) - - if (data.includes('failed to parse')) { - console.log('exit(1)') - process.exit(1) - } + console.log('exit(1)') + process.exit(1) }) + generate.on('close', (code) => { console.log(`child process exited with code ${code}`) }) From 77c7f19e51c1f01225a43551c89ee04f9c36b861 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 04:32:06 +0700 Subject: [PATCH 216/291] ci: disable source-map --- components/landing/SearchLanding.vue | 2 +- nuxt.config.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/landing/SearchLanding.vue b/components/landing/SearchLanding.vue index 037d423717..fa5869a0a8 100644 --- a/components/landing/SearchLanding.vue +++ b/components/landing/SearchLanding.vue @@ -6,7 +6,7 @@ class="is-flex is-flex-direction-column is-align-items-center search-info">

- {{ $t('search.landingTitle1') }} + {{ $t('search.landingTitle1') }} test fails {{ $t('search.landingTitle2') }} diff --git a/nuxt.config.js b/nuxt.config.js index 589038ee50..e0487838e5 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -387,9 +387,9 @@ export default defineNuxtConfig({ '@google/model-viewer', // TODO check to see if it works without transpilation in future nuxt releases ], extend(config) { - if (process.env.NODE_ENV !== 'development') { - config.devtool = 'source-map' - } + // if (process.env.NODE_ENV !== 'development') { + // config.devtool = 'source-map' + // } // add frontmatter-markdown-loader config.module.rules.push({ From 796bb050ef27c08e09bf9012f1b9447d6aa60892 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 11:49:32 +0700 Subject: [PATCH 217/291] ci: cleanup --- components/landing/SearchLanding.vue | 2 +- nuxt.config.js | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/components/landing/SearchLanding.vue b/components/landing/SearchLanding.vue index fa5869a0a8..037d423717 100644 --- a/components/landing/SearchLanding.vue +++ b/components/landing/SearchLanding.vue @@ -6,7 +6,7 @@ class="is-flex is-flex-direction-column is-align-items-center search-info">

- {{ $t('search.landingTitle1') }} test fails + {{ $t('search.landingTitle1') }} {{ $t('search.landingTitle2') }} diff --git a/nuxt.config.js b/nuxt.config.js index e0487838e5..c2b1d2399f 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -332,7 +332,7 @@ export default defineNuxtConfig({ }, }, - // buildModules: ['nuxt-webpack-optimisations'], + buildModules: ['nuxt-webpack-optimisations'], webpackOptimisations: { features: { @@ -387,8 +387,20 @@ export default defineNuxtConfig({ '@google/model-viewer', // TODO check to see if it works without transpilation in future nuxt releases ], extend(config) { - // if (process.env.NODE_ENV !== 'development') { - // config.devtool = 'source-map' + // if ( + // process.env.NODE_ENV !== 'development' && + // process.env.SENTRY_AUTH_TOKEN + // ) { + // https://community.cloudflare.com/t/recurring-deployment-issue-on-pages-which-works-on-preview-branch-but-doesnt-on-production-branch/540278/10 + // config.devtool = 'source-map' + // config.plugins.push( + // new SentryWebpackPlugin({ + // org: 'kodadot', + // project: 'nft-gallery', + // include: './dist', + // authToken: process.env.SENTRY_AUTH_TOKEN, + // }) + // ) // } // add frontmatter-markdown-loader From 4396a806f0b4a6fbc4f93e1b6da85b9d2c6aa4f4 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 11:49:47 +0700 Subject: [PATCH 218/291] ci: cleanup --- .github/workflows/node.yml | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 .github/workflows/node.yml diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml deleted file mode 100644 index 3995f9e7eb..0000000000 --- a/.github/workflows/node.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Node.js CI - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [18.13.0, 18.14.2, 18.15.0, 18.16.1, 18.17.1] - - steps: - - uses: actions/checkout@v3 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - uses: pnpm/action-setup@v2 - name: Install pnpm - id: pnpm-install - with: - version: 8 - - - name: Install dependencies - shell: bash - run: pnpm install - - - name: Run Build - run: pnpm generate From d9d61af9111b9975b88e5fdb0a90d19e0732f171 Mon Sep 17 00:00:00 2001 From: Preschian Febryantara Date: Sun, 13 Aug 2023 14:30:52 +0700 Subject: [PATCH 219/291] ci: check pnpm path first --- script/generate.mjs | 50 ++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/script/generate.mjs b/script/generate.mjs index dc095d79d9..6da626b7ec 100644 --- a/script/generate.mjs +++ b/script/generate.mjs @@ -1,22 +1,44 @@ -import { spawn } from 'child_process' +import { exec, spawn } from 'child_process' +import { promisify } from 'util' -const generate = spawn('pnpm', ['generate:script']) +const promiseExec = promisify(exec) -generate.stdout.on('data', (data) => { - console.log(`stdout: ${data}`) +async function getPath(cmd) { + const { stdout } = await promiseExec('which ' + cmd) + return stdout.trim() +} - if (data.includes('failed to parse')) { - console.log('exit(1)') +async function runScript() { + const pnpmPath = await getPath('pnpm') + if (!pnpmPath) { + console.error('failed to find pnpm') process.exit(1) } -}) -generate.stderr.on('data', (data) => { - console.error(`stderr: ${data}`) - console.log('exit(1)') - process.exit(1) -}) + console.log(pnpmPath) + + const generate = spawn(pnpmPath, ['generate:script']) + + generate.stdout.on('data', (data) => { + console.log(`stdout: ${data}`) + if (data.includes('failed to parse')) { + console.log('exit(1)') + process.exit(1) + } + }) -generate.on('close', (code) => { - console.log(`child process exited with code ${code}`) + generate.stderr.on('data', (data) => { + console.error(`stderr: ${data}`) + console.log('exit(1)') + process.exit(1) + }) + + generate.on('close', (code) => { + console.log(`child process exited with code ${code}`) + }) +} + +runScript().catch((err) => { + console.error(err) + process.exit(1) }) From 6c52862ecc6be9ecbf0a0a1d0860d4b4e26b1fd5 Mon Sep 17 00:00:00 2001 From: Luke Fishman Date: Sun, 13 Aug 2023 16:12:13 +0700 Subject: [PATCH 220/291] Update NeoButton.vue --- libs/ui/src/components/NeoButton/NeoButton.vue | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/libs/ui/src/components/NeoButton/NeoButton.vue b/libs/ui/src/components/NeoButton/NeoButton.vue index aa39927bd2..28e81fdbc5 100644 --- a/libs/ui/src/components/NeoButton/NeoButton.vue +++ b/libs/ui/src/components/NeoButton/NeoButton.vue @@ -25,7 +25,6 @@ import { OButton } from '@oruga-ui/oruga' import { NeoButtonVariant } from '@kodadot1/brick' -withDefaults( defineProps<{ size?: 'small' | 'medium' | 'large' disabled?: boolean @@ -39,12 +38,8 @@ withDefaults( variant?: NeoButtonVariant rounded?: boolean tag?: string - loadingWithLabel: boolean - }>(), - { - loadingWithLabel: false, - } -) + loadingWithLabel?: boolean + }>() diff --git a/locales/en.json b/locales/en.json index 78bb638546..666fff17ab 100644 --- a/locales/en.json +++ b/locales/en.json @@ -98,7 +98,11 @@ "addAddress": "Add recipient", "payMeLink": "Pay me link", "setSameAmount": "Set one amount that will be sent to all recipients", - "transferable": "Transferable" + "network": "Network", + "sendTo": "Sending to", + "recipients": "recipients", + "totalAmount": "Total Amount", + "transferable": "Transferable" }, "topCollections": { "timeFrames": { From 0be1770064082fdba24943ae056d4a0ad17667b4 Mon Sep 17 00:00:00 2001 From: Jarsen <695552027@qq.com> Date: Sun, 13 Aug 2023 21:39:12 +0800 Subject: [PATCH 227/291] feat: transfer transaction --- components/transfer/Transfer.vue | 63 ++++++++++++++++---------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/components/transfer/Transfer.vue b/components/transfer/Transfer.vue index 66d0480829..48a916587f 100644 --- a/components/transfer/Transfer.vue +++ b/components/transfer/Transfer.vue @@ -1,5 +1,6 @@ @@ -217,7 +219,6 @@ import { useIdentityStore } from '@/stores/identity' import Avatar from '@/components/shared/Avatar.vue' import Identity from '@/components/identity/IdentityIndex.vue' import TransferConfirmModal from '@/components/transfer/TransferConfirmModal.vue' -import { emptyObject } from '@kodadot1/minimark/utils' import { NeoButton, NeoDropdown, @@ -239,16 +240,13 @@ const { unit, decimals } = useChain() const { apiInstance } = useApi() const { urlPrefix } = usePrefix() const { isLogIn, accountId } = useAuth() -const { redesign } = useExperiments() const { getAuthBalance } = useIdentityStore() const { fetchFiatPrice, getCurrentTokenValue } = useFiatStore() -const { initTransactionLoader, isLoading, resolveStatus } = +const { initTransactionLoader, isLoading, resolveStatus, status } = useTransactionStatus() const { toast } = useToast() const isTransferModalVisible = ref(false) -type Target = 'target' | `target${number}` -type TargetMap = Record export type TargetAddress = { address?: string usd?: number | string @@ -258,7 +256,6 @@ export type TargetAddress = { const transactionValue = ref('') const price = ref(0) const usdValue = ref(0) -const targets = ref(emptyObject()) const sendSameAmount = ref(false) const displayUnit = ref<'token' | 'usd'>('token') const { getTokenIconBySymbol } = useIcon() @@ -349,14 +346,6 @@ const balanceUsdValue = computed(() => ) ) -const handleContinue = () => { - if (!disabled.value) { - targetAddresses.value = targetAddresses.value.filter( - (address) => address.address && address.token && address.usd - ) - isTransferModalVisible.value = true - } -} const onAmountFieldChange = (target: TargetAddress) => { /* calculating usd value on the basis of price entered */ @@ -400,34 +389,48 @@ const unifyAddressAmount = (target: TargetAddress) => { })) } +const handleContinue = () => { + if (!disabled.value) { + targetAddresses.value = targetAddresses.value.filter( + (address) => address.address && address.token && address.usd + ) + isTransferModalVisible.value = true + } +} + const submit = async ( event: any, usedNodeUrls: string[] = [] ): Promise => { - if (redesign.value) { - showNotification('coming soon') - return - } - showNotification(`${route.query.target ? 'Sent for Sign' : 'Dispatched'}`) + isTransferModalVisible.value = false initTransactionLoader() - try { const api = await apiInstance.value - const amountToTansfer = String( - calculateBalance(price.value, decimals.value) - ) - const numOfTargetAddresses = Object.keys(targets.value).length + + const numOfTargetAddresses = targetAddresses.value.length const cb = numOfTargetAddresses > 1 ? api.tx.utility.batch : api.tx.balances.transfer const arg = numOfTargetAddresses > 1 ? [ - Object.values(targets.value).map((target) => - api.tx.balances.transfer(target, amountToTansfer) + targetAddresses.value.map((target) => { + const amountToTransfer = String( + calculateBalance(Number(target.token), decimals.value) + ) + return api.tx.balances.transfer( + target.address as string, + amountToTransfer + ) + }), + ] + : [ + targetAddresses.value[0].address as string, + calculateBalance( + Number(targetAddresses.value[0].token), + decimals.value ), ] - : [targets.value['target'], amountToTansfer] const tx = await exec( accountId.value, @@ -441,9 +444,7 @@ const submit = async ( const blockNumber = header.number.toString() showNotification( - `[${unit.value}] Transfered ${price.value * numOfTargetAddresses} ${ - unit.value - } in block ${blockNumber}`, + `[${unit.value}] Transfered ${totalTokenAmount.value} ${unit.value} in block ${blockNumber}`, notificationTypes.success ) From bcacc4bbc575f186f9e37369696a852ad5434da4 Mon Sep 17 00:00:00 2001 From: Stephen Jason Wang Date: Sun, 13 Aug 2023 22:54:34 +0800 Subject: [PATCH 228/291] refactor: removed unused assetMixin --- utils/mixins/assetMixin.ts | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 utils/mixins/assetMixin.ts diff --git a/utils/mixins/assetMixin.ts b/utils/mixins/assetMixin.ts deleted file mode 100644 index 3c271368dd..0000000000 --- a/utils/mixins/assetMixin.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, Vue } from 'nuxt-property-decorator' -import { useAssetsStore } from '@/stores/assets' - -/* - * refer to https://stackoverflow.com/questions/51873087/unable-to-use-mixins-in-vue-with-typescript - */ -@Component -export default class AssetMixin extends Vue { - get assetsStore() { - return useAssetsStore() - } - - assetIdOf(id: string | number) { - return this.assetsStore.getAssetById(String(id)) - } -} From ba299102eea4f9ec729b2f0d33a25eb595563382 Mon Sep 17 00:00:00 2001 From: god-of-js Date: Sun, 13 Aug 2023 16:29:40 +0100 Subject: [PATCH 229/291] style(cart): NFT name allowed to span full width --- .../shoppingCart/ShoppingCartItemRow.vue | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/components/common/shoppingCart/ShoppingCartItemRow.vue b/components/common/shoppingCart/ShoppingCartItemRow.vue index 62df8ab08b..7a6182ab19 100644 --- a/components/common/shoppingCart/ShoppingCartItemRow.vue +++ b/components/common/shoppingCart/ShoppingCartItemRow.vue @@ -20,32 +20,32 @@ @click.native="emit('click-item')"> {{ nft.name }} -
- {{ nft.collection?.name || nft.collection.id }} +
+
+ {{ nft.collection?.name || nft.collection.id }} +
+ +
+ +

-
-
- -
- -
- -
+
+
@@ -114,9 +114,12 @@ onMounted(() => { .inherit-background-color { background-color: inherit !important; } -.gap-8 { +.gap-2 { gap: 2px; } +.gap-8 { + gap: 8px; +} .hidden { opacity: 0; } From 555e421dcb14de9c4944100ae80c2633c3a294da Mon Sep 17 00:00:00 2001 From: god-of-js Date: Sun, 13 Aug 2023 16:57:41 +0100 Subject: [PATCH 230/291] style(cart): extra gap added between price and collection name --- components/common/shoppingCart/ShoppingCartItemRow.vue | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/components/common/shoppingCart/ShoppingCartItemRow.vue b/components/common/shoppingCart/ShoppingCartItemRow.vue index 7a6182ab19..16b40a59cd 100644 --- a/components/common/shoppingCart/ShoppingCartItemRow.vue +++ b/components/common/shoppingCart/ShoppingCartItemRow.vue @@ -20,7 +20,7 @@ @click.native="emit('click-item')"> {{ nft.name }} -
+
{{ nft.collection?.name || nft.collection.id }}
@@ -114,9 +114,6 @@ onMounted(() => { .inherit-background-color { background-color: inherit !important; } -.gap-2 { - gap: 2px; -} .gap-8 { gap: 8px; } From 881a3b71be411cf70a88f8c8a41b89bfb8c5c15e Mon Sep 17 00:00:00 2001 From: Jarsen <695552027@qq.com> Date: Mon, 14 Aug 2023 00:04:41 +0800 Subject: [PATCH 231/291] fix: redesign issue --- components/transfer/TransferConfirmModal.vue | 24 ++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/components/transfer/TransferConfirmModal.vue b/components/transfer/TransferConfirmModal.vue index 9fe84eaa36..3f051a194d 100644 --- a/components/transfer/TransferConfirmModal.vue +++ b/components/transfer/TransferConfirmModal.vue @@ -7,6 +7,7 @@ class="is-flex is-justify-content-center is-align-items-center header px-6 py-3"> {{ $t('teleport.send') }} + {{ unit }} - +
+ class="py-4 is-bordered-top is-small-size-text">
- +
- ({{ totalTokenAmount }} {{ unit }}) - + ${{ totalUsdValue }}
@@ -188,11 +195,14 @@ const isExpandList = ref(false) } .fixed-button-height { - height: 3.5rem; + min-height: 55px; +} +.is-small-size-text { + font-size: 14px; } .is-scrollable { - overflow-y: scroll; + overflow-y: auto; } .is-bordered-top { @include ktheme() { From 9eb49542068b377f452a49a3ce496083e67347cd Mon Sep 17 00:00:00 2001 From: Jarsen <695552027@qq.com> Date: Mon, 14 Aug 2023 00:25:46 +0800 Subject: [PATCH 232/291] fix: total value --- components/transfer/Transfer.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/transfer/Transfer.vue b/components/transfer/Transfer.vue index 48a916587f..8fb5c2fb6a 100644 --- a/components/transfer/Transfer.vue +++ b/components/transfer/Transfer.vue @@ -332,10 +332,12 @@ watch(sendSameAmount, (value) => { }) const totalTokenAmount = computed(() => - Number(getNumberSumOfObjectField(targetAddresses.value, 'token')).toFixed(4) + Number( + Number(getNumberSumOfObjectField(targetAddresses.value, 'token')).toFixed(4) + ) ) const totalUsdValue = computed(() => - getNumberSumOfObjectField(targetAddresses.value, 'usd') + calculateUsdFromKsm(totalTokenAmount.value, Number(currentTokenValue.value)) ) const currentTokenValue = computed(() => getCurrentTokenValue(unit.value)) From 460345b3454f5fddedad0619c7ec7007b90c9d7e Mon Sep 17 00:00:00 2001 From: Jarsen <695552027@qq.com> Date: Mon, 14 Aug 2023 09:45:40 +0800 Subject: [PATCH 233/291] fix: UI issue --- components/transfer/Transfer.vue | 7 ++-- components/transfer/TransferConfirmModal.vue | 34 +++++++++++--------- locales/en.json | 3 +- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/components/transfer/Transfer.vue b/components/transfer/Transfer.vue index 8fb5c2fb6a..38c2f0a5a4 100644 --- a/components/transfer/Transfer.vue +++ b/components/transfer/Transfer.vue @@ -26,7 +26,7 @@
- token + token {{ unit }} ${{ currentTokenValue }}
@@ -563,7 +563,10 @@ watch( width: 32px; height: 32px; } - + .square-20 { + width: 20px; + height: 20px; + } .fixed-height { height: 51px; } diff --git a/components/transfer/TransferConfirmModal.vue b/components/transfer/TransferConfirmModal.vue index 3f051a194d..9635a2a13a 100644 --- a/components/transfer/TransferConfirmModal.vue +++ b/components/transfer/TransferConfirmModal.vue @@ -3,44 +3,48 @@