From 31a89018f56de76650b256c843996bb3d35c1e4c Mon Sep 17 00:00:00 2001 From: John Mizerek Date: Thu, 5 Feb 2026 10:18:33 -0800 Subject: [PATCH] Launch prep: fix menu builder, payment flow, comment out pre-launch features - Fix menu builder dropdown showing empty names (return MenuName instead of Name) - Add default menu selection (setDefault action, DefaultMenuID in getForBuilder) - Fix createPaymentIntent column names for dev schema (ID, StripeAccountID, etc.) - Fix menu-builder favicon and remove redundant business label - Comment out Tabs/Running Checks feature for launch (HTML + JS) - Comment out Service Point Marketing/Grants feature for launch (HTML + JS) - Add testMarkPaid.cfm for testing orders without Stripe webhooks - Task API updates for worker payout ledger integration Co-Authored-By: Claude Opus 4.5 --- api/menu/getForBuilder.cfm | 26 ++- api/menu/menus.cfm | 26 +++ api/orders/testMarkPaid.cfm | 55 ++++++ api/stripe/createPaymentIntent.cfm | 10 +- api/tasks/complete.cfm | 160 ++++++++++++++- api/tasks/getDetails.cfm | 17 ++ api/tasks/listMine.cfm | 22 +++ api/tasks/listPending.cfm | 22 +++ portal/favicon-512.png | Bin 0 -> 31547 bytes portal/index.html | 9 +- portal/menu-builder.html | 43 +++- portal/portal.js | 308 ++++++----------------------- 12 files changed, 417 insertions(+), 281 deletions(-) create mode 100644 api/orders/testMarkPaid.cfm create mode 100644 portal/favicon-512.png diff --git a/api/menu/getForBuilder.cfm b/api/menu/getForBuilder.cfm index 35e02bf..f728dd4 100644 --- a/api/menu/getForBuilder.cfm +++ b/api/menu/getForBuilder.cfm @@ -60,6 +60,16 @@ try { // Check for MenuID filter (optional - if provided, only return categories for that menu) menuID = structKeyExists(requestData, "MenuID") ? val(requestData.MenuID) : 0; + // Get business's default menu setting + defaultMenuID = 0; + try { + qBiz = queryTimed("SELECT DefaultMenuID FROM Businesses WHERE ID = :businessID", + { businessID: businessID }, { datasource: "payfrit" }); + if (qBiz.recordCount > 0 && !isNull(qBiz.DefaultMenuID)) { + defaultMenuID = val(qBiz.DefaultMenuID); + } + } catch (any e) {} + // Get all menus for this business allMenus = []; try { @@ -74,11 +84,11 @@ try { for (m = 1; m <= qMenus.recordCount; m++) { arrayAppend(allMenus, { "MenuID": qMenus.ID[m], - "Name": qMenus.Name[m], - "Description": isNull(qMenus.Description[m]) ? "" : qMenus.Description[m], - "DaysActive": qMenus.DaysActive[m], - "StartTime": isNull(qMenus.StartTime[m]) ? "" : timeFormat(qMenus.StartTime[m], "HH:mm"), - "EndTime": isNull(qMenus.EndTime[m]) ? "" : timeFormat(qMenus.EndTime[m], "HH:mm"), + "MenuName": qMenus.Name[m], + "MenuDescription": isNull(qMenus.Description[m]) ? "" : qMenus.Description[m], + "MenuDaysActive": qMenus.DaysActive[m], + "MenuStartTime": isNull(qMenus.StartTime[m]) ? "" : timeFormat(qMenus.StartTime[m], "HH:mm"), + "MenuEndTime": isNull(qMenus.EndTime[m]) ? "" : timeFormat(qMenus.EndTime[m], "HH:mm"), "SortOrder": qMenus.SortOrder[m] }); } @@ -113,8 +123,11 @@ try { // If exactly one menu is active now, auto-select it if (arrayLen(activeMenuIds) == 1) { menuID = activeMenuIds[1]; + } else if (arrayLen(activeMenuIds) > 1 && defaultMenuID > 0 && arrayFind(activeMenuIds, defaultMenuID)) { + // Multiple menus active - use business default if it's among the active ones + menuID = defaultMenuID; } - // If multiple match (overlap) or none match, show all (menuID stays 0) + // If multiple match with no default, or none match, show all (menuID stays 0) } } catch (any e) { // Menus table might not exist yet @@ -455,6 +468,7 @@ try { response["MENU"] = { "categories": categories }; response["MENUS"] = allMenus; response["SELECTED_MENU_ID"] = menuID; + response["DEFAULT_MENU_ID"] = defaultMenuID; response["TEMPLATES"] = templateLibrary; response["BRANDCOLOR"] = brandColor; response["CATEGORY_COUNT"] = arrayLen(categories); diff --git a/api/menu/menus.cfm b/api/menu/menus.cfm index 69a1c85..44570b2 100644 --- a/api/menu/menus.cfm +++ b/api/menu/menus.cfm @@ -234,6 +234,32 @@ try { response = { "OK": true, "ACTION": "reordered" }; break; + case "setDefault": + // Set the default menu for this business + menuID = structKeyExists(requestData, "MenuID") ? val(requestData.MenuID) : 0; + // MenuID of 0 means "no default" (clear the default) + + if (menuID > 0) { + // Verify the menu exists and belongs to this business + qCheck = queryTimed(" + SELECT ID FROM Menus WHERE ID = :menuID AND BusinessID = :businessID AND IsActive = 1 + ", { menuID: menuID, businessID: businessID }, { datasource: "payfrit" }); + + if (qCheck.recordCount == 0) { + apiAbort({ "OK": false, "ERROR": "invalid_menu", "MESSAGE": "Menu not found or not active" }); + } + } + + queryTimed(" + UPDATE Businesses SET DefaultMenuID = :menuID WHERE ID = :businessID + ", { + menuID: { value: menuID, cfsqltype: "cf_sql_integer", null: menuID == 0 }, + businessID: { value: businessID, cfsqltype: "cf_sql_integer" } + }, { datasource: "payfrit" }); + + response = { "OK": true, "ACTION": "defaultSet", "DefaultMenuID": menuID }; + break; + default: apiAbort({ "OK": false, "ERROR": "invalid_action", "MESSAGE": "Unknown action: " & action }); } diff --git a/api/orders/testMarkPaid.cfm b/api/orders/testMarkPaid.cfm new file mode 100644 index 0000000..6ea9ffc --- /dev/null +++ b/api/orders/testMarkPaid.cfm @@ -0,0 +1,55 @@ + + + + + +/** + * TEST ONLY: Mark an order as submitted and paid without Stripe + * This bypasses the payment flow for development testing + * + * POST: { OrderID: int } + */ + +response = { "OK": false }; + +try { + requestData = deserializeJSON(toString(getHttpRequestData().content)); + orderID = val(requestData.OrderID ?: 0); + + if (orderID == 0) { + response["ERROR"] = "OrderID is required"; + writeOutput(serializeJSON(response)); + abort; + } + + // Check order exists + qOrder = queryExecute(" + SELECT ID, StatusID, PaymentStatus FROM Orders WHERE ID = :orderID + ", { orderID: orderID }, { datasource: "payfrit" }); + + if (qOrder.recordCount == 0) { + response["ERROR"] = "Order not found"; + writeOutput(serializeJSON(response)); + abort; + } + + // Mark as submitted and paid + queryExecute(" + UPDATE Orders + SET StatusID = 1, + PaymentStatus = 'paid', + PaymentCompletedOn = NOW(), + SubmittedOn = COALESCE(SubmittedOn, NOW()), + LastEditedOn = NOW() + WHERE ID = :orderID + ", { orderID: orderID }, { datasource: "payfrit" }); + + response["OK"] = true; + response["MESSAGE"] = "Order #orderID# marked as submitted and paid"; + +} catch (any e) { + response["ERROR"] = e.message; +} + +writeOutput(serializeJSON(response)); + diff --git a/api/stripe/createPaymentIntent.cfm b/api/stripe/createPaymentIntent.cfm index 26e0793..f13082a 100644 --- a/api/stripe/createPaymentIntent.cfm +++ b/api/stripe/createPaymentIntent.cfm @@ -62,9 +62,9 @@ try { // Get business Stripe account qBusiness = queryExecute(" - SELECT StripeAccountID AS BusinessStripeAccountID, StripeOnboardingComplete AS BusinessStripeOnboardingComplete, Name AS BusinessName + SELECT StripeAccountID, StripeOnboardingComplete, Name FROM Businesses - WHERE BusinessID = :businessID + WHERE ID = :businessID ", { businessID: businessID }, { datasource: "payfrit" }); if (qBusiness.recordCount == 0) { @@ -103,7 +103,7 @@ try { } // For testing, allow orders even without Stripe Connect setup - hasStripeConnect = qBusiness.BusinessStripeOnboardingComplete == 1 && len(trim(qBusiness.BusinessStripeAccountID)) > 0; + hasStripeConnect = qBusiness.StripeOnboardingComplete == 1 && len(trim(qBusiness.StripeAccountID)) > 0; // ============================================================ // FEE CALCULATION @@ -138,7 +138,7 @@ try { // SP-SM: Add grant owner fee to platform fee (Payfrit collects, then transfers to owner) effectivePlatformFeeCents = totalPlatformFeeCents + grantOwnerFeeCents; httpService.addParam(type="formfield", name="application_fee_amount", value=effectivePlatformFeeCents); - httpService.addParam(type="formfield", name="transfer_data[destination]", value=qBusiness.BusinessStripeAccountID); + httpService.addParam(type="formfield", name="transfer_data[destination]", value=qBusiness.StripeAccountID); } httpService.addParam(type="formfield", name="metadata[order_id]", value=orderID); @@ -150,7 +150,7 @@ try { httpService.addParam(type="formfield", name="metadata[grant_owner_business_id]", value=grantOwnerBusinessID); httpService.addParam(type="formfield", name="metadata[grant_owner_fee_cents]", value=grantOwnerFeeCents); } - httpService.addParam(type="formfield", name="description", value="Order ###orderID# at #qBusiness.BusinessName#"); + httpService.addParam(type="formfield", name="description", value="Order ###orderID# at #qBusiness.Name#"); if (customerEmail != "") { httpService.addParam(type="formfield", name="receipt_email", value=customerEmail); diff --git a/api/tasks/complete.cfm b/api/tasks/complete.cfm index 0a8f62c..f0b36ff 100644 --- a/api/tasks/complete.cfm +++ b/api/tasks/complete.cfm @@ -37,6 +37,7 @@ + @@ -46,9 +47,13 @@ @@ -58,6 +63,7 @@ + @@ -74,7 +80,8 @@ - + + @@ -101,6 +108,77 @@ + + + + + + + + + + + + + = DATE_SUB(NOW(), INTERVAL 30 DAY) + ", [{ value = customerUserID, cfsqltype = "cf_sql_integer" }], { datasource = "payfrit" })> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -225,15 +364,26 @@ - + "LedgerCreated": ledgerCreated, + "CashProcessed": cashProcessed + }> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2iiFZIN)Txj7$Myvr4our2@=whqYyV{x%f%rGC?bB;;50$r$#WM(^|4RHvl75q(1KdgBtE+#9VvU50luTk& zRA33bx{$7>+QWc9o494f!nYQ|V`Y+ItHABiv!}s`AxotY^jeD4z8SW;amc0(VdCWE zB-AGPVCL?nI|iijCybPgAFpRi8vZ@WDXh>-_y{p-w#El6(D``z-;a!sk5}()TBYOV z<11K4LE-W7*Q41W#)}tY7-0~&kI?~A)zrMCP74tq8BYRTyl6xz0fC28Um=GyH8rn% z{og13??U`l=s zQm*jvwOBA+yQO!EF2IRji5!c+a1$Elhpb5NKjsZjhM~4d!6Q6dxL&nyU;Co3UefNb z;d|7a%cNi(XGaFjaJ7?>@!li3C`Ix>l^u#cQ<(H?Jtv9SI8E8Yf_Gmr_LGq=I9rB3 zl5v(~Tiz|>_9QF3#>+;c%9T}%Xn(IBc;xjhm5==^AKJF z=GCN1`nR}87#zXkBXkGZFOjzB@C&Ny)UX+kc29pxrrJj&aV&;k!izW9n3{AWD4}!N zZFQZj@05REU$zq_xdxMypz4hE=FG}~!AKkIJ1>$NvoU%?ydSAAeS|)GGt@rXH_+6~ zR7=sN(P2xCSM7|5kcTLeC+J5O+{P( zJYcaEK~S_kX$$fWHKlfEDwDCCcyzSLN9xXxbBv&mhg_o?4_Xhq1AQf#V00m6WaOhx zxK2i^qoJy*ev6COo~(ETO9RRw@0H+mG?h7%cu}^_yy_n&V^Z;t3M#`nH}W3SQeu~5 z!?t*(ND|^#g6o4J`CzhXu}1w@JN0TA&wRD4RLR63=wY@f=1F)m2dxg(DpWnstrHTC zp}nh(qf{^34O>+hHSVwggXHn@(uRhw^ik(XU&s1m`TO2epLlPnk!-vGHerKVfNTR zOjN!fM+2$;lybP0e&aWOi!x_XQ8^BHpy;M?m%3#LDLqKJC9qN*?{< z^G6cOd{Yx?=t>MLSqU=i5c7uVqIS1;6uDpZRG|!s{1zxk8ee)94)17^DLRO@QB1Yd zP-%2DmNB^{;lH)rGTT2pvGkGrj3lZQVqxkflr#mH?QN^H%jzWxVOQpkpF*^yL5#n$ zomKT@jWxVc_5f{sdl;E}NgXplb0{_5m~yl|4Rp81OM$EM2;X}D-h zjn^0zTQ{rC$t#g)Lkb>pUVX$v!JXG!;3bA1I*Lt`K&t9Zvbo9ZYjGZw6W!inOZ5M- z(MMlt_5Yls9t)!M7m3_f2iKv7KMCW- zk-+1=62BgX8zEGyYnf%eMw_pGs60Rr%1l~L`r0!)FF>x;x$Hw|$5SJe{t=APkDs=* z<$w<1tI8IB^?MFCdfSp4?jPXNl}ZM3N2*!T`b!6M>EddpkDx^4HJv?2$a_MU2#(j(KwQ=C{ry z7}-t8Th}YOgNllR{$p7gKR>T8Q|#37-H;tF%84C=FLt9mU}mx0Ah|MK(6NQ-xKuXt z(({~-DvREZl39?iI))DEXreG;lw&$=*QnY_3Z<`a>yTJ!@j8(;ys74bWmv7x`p~i^ zm;NAh89I^*PB%x~;`QjPAt`-DF`oTz`XCu>u8M!6r2i_#t`(8+lB0awMksr3lFf-| zK87(0+G+9HHAkpx-{%d_-lm{5hw|v-#;QmDlxpx_t$r2GY(&L6N=F{;s5;?!n|zE1 zl1oj7-S9XR;3RC&fL25^_TW74=K1BV_mEA>Ob*wa98#> zwJ9_wda%IRU`TivK2g@4K=X}~HyWnX*+7C~@f?i-?C0Qvz8r$cdDWpS9Wkt4;M#D>e}{tl(o(=&*tdqMRJuLnkRhI#%k^BJr_w z^WRiKbD@Ev$%dao{WhjX*Y^A>mY!K2@WU?Jg5^soMcfrtz)$5w31Vb6i?YAbA3Lve_^Y*`SBdYJe)9c~|<=BqW^+=SPr)r<$bM@9c3I8HLB1gKk0AGQ}0x z-4XRF+w(c$u5~Rh=YL?;d8~JWh!n^3wvTmKSh(lYC^QTZA5F7lB_hko6j4Q-qU?zy z=Kn^24D*~xbPyGfc9oo<)%bGxO0}>KPuH``^=)$8@q_BseTt^(XC-H?{{mlha#I{Z z)+7XqM6ilGLF#4#hDwmUySRcqpai`24m>%+P4Gdxe zuK(tu>vNEJBzgHOGgTHoe$N%(RAu*CzFt6nd*+~bDomo$gCp6a$DdON6>+r)%cVM` zkh#tY+Y8${2-Pe!`Z)H4{}q+y)sf`HeqEHQZ4)?-x=GD8Q;iCEoRfvN=-@I&>qZe` zSBIbJn{!>fR^cY{&+CR#w*`?YOnVSly(L|Sli$XIpN-4;*?%dhG#&m_9e&0H%~r?2 zjAs^NbUUmGSSHzfz8t1y<8F1MYBSli;7A?lO-Cn$c+t`wkH!%1%DZ9S1EcW_4 zFMA@_tmEPkham^~D*4u75Lde1g$mR1<={&RnyL2$!7(wWpzPl*CFJf--8)Y9DjZQQ zwbrT|X{v2aOr(Cu5Uwl-i;6m4MB7TpDkS;}M(OaAmLiix&+>Fv?=-4Ys_IQ_QG6M9 z%^!EqA1Nt>m*-o8TSb9!X@O-$9{2`s)-jfJzuq*;V+yQLye6OQ=;j!%%a4;{z?u2v zId{kT9?jNFTOuAG`jy$|zoz#)RF?pb?PMecN6N9jetdLzQ#tfB8ixzXDh`}i@Zfs% zwm898K1l(wHHV%J?U|U!qHen1?0A$*HJWza?8n5PKi#8$`IJM?<8e5gTQEZltkSeD z;ht#R>gto90|WNX{^TJcA>y?A_m-<6yDUMz;sgxFrZwb@Wwt%E_xEp>cLT+UpCbM0 zd}*DkVJcfQ$hc({T=abYl`qdDBE?@?{Rd?gQ}u{fH`hd{5RPH9?I9Ya4tG);xw;*TsRA~h9Z#RIm*_s})jp-5Vz`qz7F%pv-@r_zq$^WlsCkV!o zM1JIt*gae~YYoJ)Pfbn18Q$YxPBkRC-%5;Q;Q2d+MTHZZBd3Ju@FZRu;E?)DhxBGt(<-$`lVN!5?8ELrdf8e~-yN=@mFBJ7KQOA(_BM?4@!UgbhKVKAlIm@@I z#(qp%LQXC|H}sUM#(BH zC(~`uC{l8j?+9~8*|T|?Ez}Gh4U(9A+dv zv8GSSRWwpVw;|cs*yOCBxeqT=!#ymHYpcW47ZSiVO&wj5rS?>oT-m53eIN&Z-*enCMoF*}QzpTEMML~dD;fmZOo?D(U_hdlg| zP|Wx5y5|eIgwD2LY#TSVQhPBB%CWi<9llCmKVD|y{<*40T3`4%ej^7VuQMKDpva9n zIFJs-pFCE4e!v)lgQ>VcdC6HpRqLR)9G{;^{Wdl83K~nMdu4zRQ#s(PnpU%wYz=fkt@Reu})U5l${MmRpUm&EH$8Dy=L3(?d?fu za#b9kJ!7u799R$S*phgHi;$s(t@^SvGrtZv|3~#fDJ)h~vXsyFu=90FsY3gVYlFC= zbhLAM4BBhP&LgC4A<`QzFJ3E56BidJcm0xKsi{31d91cp>itjScaY0|Qv{9wnk_P7 zN>^`a7D@<e(8N4_qGdRAuGvy0O) z$EcHhe`I_i5ZfB*8ex3sAg8B=9Afzuj_-pN*Wp7BZ41RqU8QSs&X zQeEu1&vOd>5~W?6xWgp13R4YX_TIHMAqS;chJ$)(_9O=v7s}VKUxUrBPEhR#`n(@S zN803-;LG`IozC6U<4T%N$rWC*^#^QC0DKjsQGycP3pu%}E1>qsg2i=Q=*S-{E+Z4O zyX!+sN9QoVPiksvYIyz9!yP*d#@PJ!N_(U)#F*48E+-caj^^II`wovDT@n|qzVL+i z^>;ha-k6!0%`L6Jc6CLd1wux6Rppb{w5F$eGOKJQZYd|vr(OJLT>7lT+18fl$D-s1 z<=|MHde^$vc+xi$euEPZ$NpNdU&X;^MPj$+yP_zvkWz60d{jNs$stKwjsOB$(s6hi zHrLn3JZ+|hW^!@~>gCK!2W;ypylKAsf-O&7?#qY9a*%<^`{>zZ_Dl@T6B#hVZca>L zdN($Ni;F)=$lr<;vu(F?3cMT~EOh;gaQVVB#0a;Xs?1WF3z$rM(^PJ;_PnnL_|o+P zF?ft`9=id5>fpz;`=3(viabvZZEv8`;+y!RMv^OGgJ+rnl~W zZs$mq;>VK(I?|EPZF!uXA6J8(Sv%!dy1g`XH^qqNhSBv)JE-lB9%))of(2C_3<;W~ zvEJK%gO; zXHl(UAe8P$iUlH*&)n20z1A!w(=~0wRQd!3!N?#X0T|_HM_^P^y`MBYU6mES7F85H zppj|Jm!oIz@5xg4?3vD|v6&hlPShqhi*~Wnhl7^Yd*o7eby;sMy4QYC(^JPJZ+(^G zF__Isv}Y?ZEjK?uqMN)&p2Dr76&9uD5GlcV?q{p-kKJ#C)GI$v zQM}TtjY|s8$us8p{aRapN`cERf)@BlZh8MMwH3?+2*&~x0sz9xB1lvjrf~WCYb7_r?;m&5Ioo|jE4N{)#)V~TD>CU8$SmJ9To?6)G?8)kH{;qiK4k17pFm!eVLMSHAl}eFRU{gemdVn!P&H|%}6s4 za5kS54(p=1EtZL;I&{5V;?_!OC(bwl%}I(rLx+?e%u=mA>H{dwTsYRWpA?ejpfkUF zw|e?AX>2yL_YKtN^1m7OY~P$E*)Cu10)wtkOZ#F9Y6`QuDWWnqGD_zxnfCSTKYp-B zi9NY~+@z`r6)2{T*D_}~!ypmgu!r`Zo-8mNEWQ`l%==fzhc)c0$URt10O!@h zLLpW=FCH*5()AX<1^bR*n->C*i1+g1K?lbYOIy=jJ3FafLJt*O(l)8C&1{u)lDo)Q zP0Y-6ooCAux0V7D=^~RIk9_v0N_|e_#WT2^7~+HB@;ZFm6Y-(EcSIJ$17sTUc`=f8XrEX%Dm6H)*j53tw;9>O_A z!N_&jEed}R54v&J|7y&C2IHMDX={(ZXi6re)kxeMxaSz~i0!R=!&P1FOr=-G?@!*p zG3H}Qu@49!8ykB7CQs+yp5zhs2;j=WoVOccpSO{d^h3EFs?87kz#u%rVhx0^KQkJw-~!Eb_wRD;N z!*c-C+!s^1>hNynAv%50=}rG)@}!np_Ott4Jcx8XPGo2?>b^)AAT4gksBI zmh+~U3Zw8TyQy1$YuNfwCZf%Wj-1m|gRteXXOxBbf@mrrZdG)I!he=29b=JENeNk;n z(_uT%+1VMO4eD+1ZJqZmE?bf9*J*lG1z&f85+jbsxD@W7%PZPX%^xkF35UpBFH5Ix z4?T%Qc+JkQqpKz`7!L$4P8wn)jc9Rf@x(vVCLn}adWMG?xfP#>=j3qxa+BHKNBoC= z-Oop6$5w2XvwLvOH$>&o&M!n|GZ3Y;^@`pK>3h1k$Ypbj9Lg*)>n<34DTDb}9fse} zt+o^aU~yq?uJa~~?`0bVhV{iG$%N9<8~60}ue|>5`!WRPf>5$G6nxzWpk{S@L+oOa zz{b{As96v7m-T||*odeo*!jsaj}AXG8y8Pc=N#|7o?lMi<;DD4RNpAHUg7GLzV}h; z$-Vpc!3hpkU)^B@;HSvAw9xSToko+#xOG0E6mF&Ns5l03iQ5U9iX^Drl;EH+odI)i z*1wn99kgP)N${uZV#N2Dz)bE6>BZLXqN&0&C#{}kAHUYXomB;so}QlWu6uP9OuE=P zIrWw^`*6iniB?N7GR8NJ!(f5;ZM$x;Bxo`w^+jSsS2mHWbjRFn&g3h|*$gkE#F>Hj zaJ4>M#fNu`ZsD|z{7RBwnDqIN3q(5M?9T$WGGcqC_vq+WLu2De30e$C$_f~6 z|FVRFLL%sIAII8nH)@;8D&m?>!#;_Le}70VB_)-WlXFKjSK|?8BLIH~t1CMQpba2_ zcK|XXZj!DDk^_b^vg@mPg?%k8bzAQQ>?pHh6YyOmih-w>&SFU0L(Y~=#9LPkRk3R^ zZ++PrxD`8Je=?8&>vT_W!AY?(rDpJ%OK#HXR)bT$Vd=w~FHP}{`}^kR<~vL*3Ju#Y z`WOzEi^g5MTXmEg0HAREjSY9+gm=kdjyUpMb)xpDATvRa;&$!vzr&+9ol8a zsrvy>+NL8DUCPW`n0Ec|?(yWOJ1tdi3b#II6bW@SSbDoJ|NHPsO5|U@+k2f$4D`dU z4V8q>+^!0GC}`x`Bp$EqT5qW>YjDX|r-jLzn;xxU1a6=dq&8I141`@P%B@1X z{ysd#XnuLb7x7Ri=AK{_n8uHU5`e^GE&A!j*sWG zaIomt4Q%E#SP9hev0Pst%7iW`ET)pX-uIX6|7u+j1`~EUc`r?+*lfvXZU^NgPU109?<;#(5xlfIuL2 zPxc>!c^;7T!{YZlEQMNw2Vl*B0uqVcd{11~+nhra+1Hz!8fNp?#FW##-6=pT55OLY zEG;kB)Hf#pxy4-A-{Uf-1>cPpvnAf;T0|}7Q07N-(C+&|$V@NH6w%NCm~nzuAqiv_ zst7buAZh@{1x~lwrNrLkk1cg?91cN|z=czcfp2MbwQ-_};nHM{96$i($M zmD4f@V1e1T!)-=H%#a{YC@sGWZ)de0FDig9Byc z^it~bbn`QcRbR^sP!6l)VFk)x4FVD!M|Sq{=^_niF0nlh7cYjb0`{8Qe!t{O_u-+R zSJ_gMh>qV&tILq@*tI4ntCBZ2&8@A!hMl7bU*oVmcJ-FKoG$IbWQK3d3fD@sL)nTG;@Co-+_gdqk#A*P27S?Qc>2* z=s_)&p6_TQ`wo=YQ#?EdXuKo#a}9!04pQ}{Su_BF!S{#Zs)%i_?^@r` zp?bZge#HcqNbY6{eZQ9k9d_jkMpj}Ph8D=}2b>=qYAq~9)p)9CLV3E{1>>&sb92ya zyU1T065(>|U3k@5_1VBL9wuC{(*4Ix7}F6QvPo-t0AbB-ta`e-NVru(UrtV1(9+T# zSQqSnk-g2G2*4rn6tl6js|&tXD;znl{KpkWS^#JA3v%wedA=}PStt;00JrPyP&w`X zORy2m?U~NG{aIMdaX?9nHOUuAFy&{8aI%<~oa}0>vfahwg2Btrb@foJtfvIhwWE)F zX3x;gbd&DnSe~*;h-Z2+5|@5CC3rT7E{rWU0%*C!0XYQd?#_<)S>(Kq7j5-fz#5tv z5;|nh$jscC#|1yfA5d{@{ncBN5xa_Um#(g>i&|V1cz&|C_${YOUVDyf%I(S&UGe09 zj5gyr6&_P14~2-*F5oe{i~X!#9v7-4GUS?f%{YGF9_zt*Ql^u!CY9QUQz2Z}y3{VJ z;0~AtuU%{7pxHhg9997GySSp{OQNJgPtTWgKe(TgB40FohGMD#2xBIpF_n9#Tvg?; zaPxbIJNgC&h43nb@(L|FKV!Vxz9v2?iS9Y>l&BH{t$$|uBp7Rxi&7K*=eG_E-%5zc`C4{JHk;uob|C%&xfAeGGZkK*gZHVk~WLeZ;bEAO7!PDIC%kK|k0 zt=X{ffh4-toLp32pVkm|iSN9JL_t9z;AA;hN8mN+o0{!aL;ZN{8f;~GwNxvp5Bile z`tKh>e05BSENBcLt@>l&oN(AUyL0}D_1og!=C_59IJGlQ zML9zYLfAQ8;WzrXVb!=ilDjH_{)Sq&1oo^;bT+B55w=YpJ+R8+!uDj5X+ z09M9g?1OA5dc&o}aZM)v)a(9zeFuMkdX1hQa|?@I>aFKP3A1gcszt_K%LcirL)iKD z;QXIUwQI@WJyzP5*Km7nRk2Ta(;i}q0Illm!jn)_P?WssMryuQq_u@4c6w8II zi_ozR+QIJBdjIiS@NzX7?RzFNUxA-TmbpDXoL_`F#x1#m&n^IwX1j@jj_ykC5Ra~+ zqCP*9ntYDhtxOG}boG2g7cp_ao^w>EwEi3u^9MhOF+uC%ZRebn2PxraAGGg{ah#6l zMwH9btNGl7g)=wj-p?6cmf^eRx4TBzG0WP=P;tbPJSe&F;@yCtshQbsF5x6M)z|^Z zGGOq-v4f>vmD^sL7@6t1X3l#(E6wkITLkpuTXX{#938W=-gWQnd@Jor@NU%ABMxhT zh#*%B%p=LbwKu8|d~|-|m>n%dTvz@w4Q9=Q89`B78SYtWlOFIXPR-SH2FSNQDg zkN|=)%>?bO#58O7E!nS}9PVY;1Z#-v^C};&WwXSFNRM2<7Z-#~@8iB|TR(`9iUuLB|1}PKL~T z$+#M$LE@?U_?=+%lM=E1KKs(>laoLob}9xPPy&d?r5o|siOu!KKXKFKOV@A(s2d_h z(WyZhR`H;y*=)~E{0ty{NZSKnR+sxW}uL3jI)P8kChT8s;vEUsUoCVB+z&rkkV zD1})|8e;nm8Gi4g7j7$!zr&P7QbNvno%|fN5K9P-Ar3>Tz6=Gow=Ub zkr%3k0+>FUl5abK-U5hgJU9#>EPtgDZ&}`2S2ZLkvLxDr!D5iB+*^oBY5R`{In=RG z{6ZJ%jp9>o4NEyeSJgB$tR1Rm6_*xsb6J!}R3do|QL_pQG9S@yY)a0s6-y{B-t}{Z zDNXj4VP{`oEJEqF33}PmfN*$i;zCz_s~2keq~9OA_1%DAl-zUs!m@BPKfd5b&~&90 zB6tE*9eCF?D8Vxv?kCD*k|PMb2O?blJIVwWrd4=I%H0kr9&gXflElZIm=pZ=&(?oE z?o(P|9j2!_x2Bt;+;0Up3`DF=mY`kDt!z;|VdoJ5{W~BKjaNCEku-Ig_XO8PnH3lA z?=~NE&cb~SRGW>vrcMHh@Bu6tc$)Xeu|bNR&FpPnHF?)RIreNiMaFDAJgBO|C4oa{o6oNL6$+-~Q?UQyW3!+-W9{#*KyzxYipg zUU%>dyu9x5C zRnuM*F_fze@HvAy91aYU{YV+Fb6ek;xHA=e?327OJIDYdjL*-%;`OsCc;lf6)(r?z z4qE`5hVGF8TE6luE|e1~RoILUVhn%h)e3woF&f*Q-Jamj!Xo)2E}R4ON9fN@&ZtH7 zIpg4Q^M)KZ*N|VX_mBOc!#7-$muw?z@h?}d$l36nx6<~g^0TXb%^_zKoWZ}SG-#E> zd2HDT@N$MWafTn=X~d~1$#YG~mVR%0n~wLCCoHrw<(9mgm3twE>rQU?nfG zA?XZMX*%_^Msy7UE%vD^_4h}$%L}a`2e=&P!U#+b7x1_i)-%Q8QGd;C;C&bc#KWih z*f0DCGlOpwaNeGt^e_#Lc;xr+%(p+C*~mFjYIP%>eW&vHV;lm=>5pnJg9bur4|St8 z=1uCD8R1teUXe&n(sC;YMfddZDL)TLX~QYKx$E@BQl!f0i2bR~0rqfy**3Im2pGf> z`D$#jBvUo>I@%_KQQKP#t}l&_i?3zSGwk9q3ay~hK39G&uomrksmUlYz~Q!|Kvoj) zb8&lWmBDAo{m|Q1jJGA23F#$mAm^;~n4)?4b@u0fZP*qj`!+Z>T|$LnUZeq_#^Jq4 z(k9fj?9%ql5l-jET8cS7x}u#hU8P(!7Q!Z*ALEB`J_?p-6;VZNQL66_Y0mDdQ>R0G|xwm$Q&JAN8YbUIB5lAlF+VxpDQXH0(~wjSWQh# z&h-7*qXzq0etG=GpyMn~Src>8w7|>^jP0+(!>O_j_%_zUtye!FLt&QP`?4kdH%prC z7M`L!=S8l=I$gwqKi|E~kV0EdYG9D-;JHQ5^gUWON{yicz*B3{xbLes6a$YgVR@#_ z4)OV7|L}Ak2AB6ENn`_kgWWj1W`8b#f_Hu5p!BuC?Vi6c9-6Y(i+jQ6KAn5t# z1%7Dx*#7G?!YX_{qr}$w&za~Idxcx>D5}TQ-*v~No@-Pwg+E$gn9CrC9zUa^V#QZl zA7lw$7vSuV^$5|foszhtF(_TUAxOBxcM)(U$L9{DxTq+dq6hF%Ypfi9P-|#?S=lvF z5s^Ry@6DSxfibC7VX4$(?>dwbf9)?DCwn*0`osZFF&AE{Fg#Lfi6aG)G2pJm5e&d} zYZ#WkKe4}LylfMRhu3!^ThRJrVBHu)ahtN|d;MZ7{a8O~d_~5O!CWAN7HX$>Z*SQU zO$nC7(hwG{;A1WShU;rt97IV1Guef%vfWt%x~_%!&eEUU#`s?*RF1(ut^WKwO65-6 z`P+gmQOdUMMvC0pirgK;Z0(LyF26Wjq}fwPPj-WRRz`8vB;hNkq5m?KB!dk&Sq}t` zj**9aL4T6OlW_`MX;08!q(exWbiP$G@4ZUkFaA_4A*GOLEsA)W6J5!xYPM`?WztOB zGGYa$^xi0wUQw+V;tz&!&19f|>7i(3Ws;cKt|)~|70dM^&E|*Qz>Fml!#IX*0Pd&g z!m2jTxxbqO*2KWA{B`W{koawx7$UlM*1eI|zqqrqdsQ*yh}LmoL8qne)`8xmnd-Db zg`J^yjKuz*8FQgEJ1nuc_s+)VW?+OBVo{@o{FBK(NvnnC3AzXfTlP8Nn5WL;Fn zfc~Y#J6CqKy~Vp=A#zT+$2P~gws}q}-WmUrP%;_1MI42koL@UTRfp0^ z4Hk4vsN2S6a?)4iRIHii-oF1$eo{xkTnpeLYp1kj?Ofg7*4`jBDFmIcFu!HPy{AaTrap7p=~@bPZqEq1!kpDXQl7PLVPch1f6 z#%jl=4Ws_P$?M5xk&}pcJe2E*K(H!IDF77%5a;e31;ozWyaovJTz#vjo~t@@2M(of zo|9sbzua&6m@9q-$N_*)ZeX&ijoVzmK`HYGw{3;}8I#<(`|?7v=s{yJ|L}#yruR*l zw$Okd{xr5?dF)jPyXM=1K_&wr(Q|Nkn1iIwaa1TVa|7Jg)zTdusjk@;Ed|L*c~vG` zi8SWW*fj}wYinssC`v{KoYM**kP{6tuJtd#?e}e_#d9S_z#Iz;3$xz8>;CqQ(xJv2 z71x1wTT4{0FzxxVMxBwt0xWA#8UWL`ovcyBkY;3Lh$~4YY4U{z0ndq@D9HBo5L@cX z1l!(;B2d08D}EQj-}s7!FUWzTBEsVG4!pYj>pri9urIK1skQa~1yCUN9n~q=?U}Ax zVPI@S1|O8W0Lgqh`TjK6xQu@^IcYanbn`O-Xx&6+YJObsy8-Q#0rRuZ*nFnkF+7}54y8q5jlijt^4Dv!SdOA9y>Ck`o?%Lo-c*mOx- zkio%O;Z_U?kBA_lrDwR3CfAJU>o7MI%<00NVRyp_Dg@cGarWX*pNNKwujR67=S_(b zBa5GOl;QsNMMXt-&Ow~w_;?;xHtw2Ni$^wIVKPe0({z;h`aH25GE>mVGaK*S8oyq( z$@bmfV$->NF+}jd|NR$Cd!{#`urBotSlGY`e7o|`ndYe6F#KggE&)Hg`|mq*edUG0 znPZr0;YjDvAU%L7)gY(@B7GH9s=lwRIH31m1FfoSBUzx!dA@{;-}_f*`rMmhUl zvZj2=e~sXSIWI4PlZ0mm0mz%c+-xJ)svt)f_P3d(M7}98aRZD_PEk?OPyZBt_Fngs z$tq^@a#h6I;rlIK)n#s=zB`75aDko(vbS)M2-B)Jsv>gF@|!oy|>y@V~yH>1ZT3x>`cDAa)Kb)kCU7>8}6XO-wvK#>3h}a4&$xDP}Jb z?}+&xZHd_#SwMkN08$1swH5LuuQTN?4G-op!X<%!)C;sU_5ARl3je=rhgiH zLQ6+q;2RMCNOD!?8r zez}#Az^!_Yjv6w3LM^dPqE?(qS|DqZGC6sfXu-afI}1S6O@7^)5xw^uHuDho{DM%s&yr{?v8| zvb__mDgbB;m<+Cj~g}Gy2~MoD!kgfsGsh0@IAl z-PN&c#9++RQnGy}(=^2@AdtD=iYiT@svliQW&h)57DM)nacVbCRkpSGNtvJWwBO>@ zG|GaJ64!I7%LjA^j=sK^#>U3jxG$?IXDZZ^?dYB;oL<*Mb#EZ*O-9{Xp^Dc zW57w3lqBu+IG|ezwLh$5cD~qXseg%vVq)@7H*k7i^!|PO%D+{>O~3xd+_!kWFAu(l z8JQT8wZ+{zS9u__DqGXi64}PA0~`WDaAGX3e>rVv8KBu#0VI<3;@+() z;L(;;61u?_55>KR8Op6`Z&(uP;`;S0DRS}m1*om%3yyH~xX)ndUg5Y)V8Rp3c|X2v z@%B{^(T?wZ*jRI_=U|t|18fB1asT`&tfi%$+P@@^TyJ%Yl(XdieHOK5)i%-z^3uP- z^#b1B;X!R%xXrO68?iG5kjY8-PPB;lGW)w2Nsn%fZJbXM%FD~mE#am;3>h(5!6U=_ zaenzZT6GByHStA70zZEaI=BQ-zIE5~8cF+!@Zuu3?-U17>Kh<_<>2g0e)I0#>s;Ig zrWM^ykw}Fcn!H4g3gN0b91;t{zh8kM#rTYwG#KNQ6V&y~@y@1Y5*KP*obC-nzxjDX zJm_$9L^Zg7d2ax24QFeN-du7FvjM0(vd5WQ)AaEEJ^zx|v zF5~|HV4l0eqN0C6W&@dVF{ihJ26*Ud5!|*M+}wQzV(`3<4hH}7Hnss>H-Bxui<$)& zK}h!Nf&@R4EaFudI{-SB&4e}BKZ1-!3E zn?d6FMsWC%P3;@TVxidAASQuWPJZW8T^os0pLa;wq1x^UZKrn-?(d%25}g?wDy*tv zh|-7xXpHp(yFe=;VyY)1*|gJ#6F>^UHCeo7TDwk9<%PzD{_Y0MeR8zv`}uM^fBTib zR6(p|_|2Ta;lww_7e1F>GG4tzPEJwjzE()^^1s*ob!12#E1qu8<~ouWL4u0@XvxA;_k)*uGnw zZakeeF<2nXqhJ2%HGZEj^9b25g@>sSJ^hR0Jij!4*uL7C@twbm9Qwy&uAMLz(6S%DHu#)yaVFpe; z_D>bA!<0GhigBEE@GI0H%X)f-ybnOLoA8Ql|+V@Sgp@}?A-Y#ak%+~ zF-M7KG_6E-eZqRSv%CX7znLw2-Ao9M@AN=Y=DrgS9Knq&>!zT0gOdM*Em~qHr&w-a zzAMTrd}|b8o!NX)sn(A2ll_Aqs#eY{8y5mleg``nwlJhZ_zJuSa1nvrk-@V6Iw_<= zh|>u32716=NXU%uJ7%OXCidhT#hrs=h5HJY2=~Cfn6}`S{4-gQS_c`in(FFs5QDe( zb1HH?#ps@`R3kMk_=@TGZk7)(k;b*s?nc_IGCF(m^yR9sr|V!ag8w?GPGF|R$6XxHg?-?qYqVZO*7x%Dr2_b>Jku<5Ec^q9N_Ltn-Fk5ar+0pQ)l-38S|-L(JRa3 z36~U&)5KpuWs09F3JnN|2V)-?fcE~6S*~8aDs-HR|3S4yOG%l2X%&B+DGA`N^2;Qz zUxSI!H8@Dmo)jxfA2fL&L0lyuft6>9f!;ncJDUR5Xv@=BjAKTLCtA!~QJDKL_*ela zdjjCH0HX@iw)d~5R`{GehYn9qTQ>quwr1+we!^0A2mX|%$`+RdRE|qDF`eld#ZwEW@cjE_B;Nmgu7zB0 ziK4KT&BHRv*0n24R$zkXlq=Ee>l@zv#tZmamfgJ}mEF_rj<#m(<5JpBC~Ch14CqU= zDKB|J|9_bU^uh9o{g%DVOyZRyoPQV`b}a7l%$>_R-bz*R3m zS#_Idp2zigGk@a$(@%!QVjW$B*c}t^US~;!YXnXn9IewhHd}XpO5qs+g?fhFcC@pD zR((%hV3_fR_3a}wR^JfUlEhk%DHmxD(DZxO(P2bEPY(Q%{K9x#GqE7#^uv+o&skIM zALm47+eIPtld%h3=T<)dBrs}J-qI%z;+Ot(^#nBSE7CH&w@(0WM7vS0* z0Puu`h39MuXJHG6>uB@yQ*Z%+k-&fCim2$wbzn<|o_17(AYXe24_4x^tZTovKrDOlqS-Ik3L7;y{fe<=h zjSH%_@DtIXg2RbT-F3W7c8H^$W;Sgch7m*g7%B_fJ3XN)?+4jxBdYirrY@~*enCR0 zQ?0Ae;=#csV742s=#jU&%d>X6T6nVJu04NFAi?2a#OT|tOr-|a(lgZyUw068%%fGw|DsQXN{<>TD0Jc%H)F#_2Neh<#y z%I(eVj{@OESJU)}oI2|5q=lCd9J>~d8QPyUd7~!)>^lcQjRu_SY*zKRwX34$?!Nk^ zM0pbk#BY88<>*7EuzX5Phuhb-cg3Smh{@{1L9U-eLyp10XJ0ovt`pYZ7E=MYq{y-t zOf--qB4YjL%5nDu$3(4t|1@8jiYVY-x(#;V7%GLB1qQDSnA*cd-?kqGt>6uAR$TK=q*GWV9F-H6GIz(9@Dt#lo04Sgv<1O#GIZN-clF|uA?b1Cx|e*&#MP$}+9ww0(-(>)YI6x_Z#lvP z{Vz^VE(F9i*T`bwX5V!geG+eHn>5bXQM~mJcjlb`_tr|urC<-K!W^BJMsmji%e{3D z03;)unwq#%41Ff24iW1LYNHM`Sj>A@crj@CP>rcg_fF|EEzTTPy&;o5z*l-h0`4sU zk2W5*hpJRmKvLGU@eMRp14T8Zk8AbBH!~&S>S9~1TW-bt40?d&k zw>&2XdopO1BZC_-rHAi7GcFo6KN5l3b;5z_N9{Uy?l8cM#9P)Zd|H0QjQ~IY{{4Hj zgiBEmY5{B#lv-dvFkF&(z9>DcT@$=lqxN8D`^a(i2lYKY&&|GyhL`SN>IHr-?;@b$5+UUs;KggM1pN{#IHe#%A!jI zXk%-4R-kSGS~hJPd2O2^W$||j6;2Nh;@=o8lX7aRq|{;ys#di88DD_VXJ8&B_W^e| zFff2lk^i->Z*!2l9*#Y-@-F9BRO)>U6w097*IRncBEZkmq~CJW+`I|ZhsL)F#v0}# z6ECH2d95fSn3rGdAM9?ixmnhsnSL9ts~{gqR8Ig_`&{$Q2Xn^n7~&@zy0`V6MS0qp@$-9qAgwuHh&<~Hd+=sN&<}a zl*%H(M*?f<>({T=*47iB=Dgq4SONqAYA{fwfhT9iG zEA=^vCH#Ti7a%FevK!&8Q|~%{)8{y4{FC7p@hT;ywFhNno+o0R630d>JfiG+WqCet zj1aOCH^5f+crQS1O+#zIcfs?a8+=Bh zxw--ft+R`Z#RVDbP3h%$V~KdZQ?Yu5;`1W~{f=^lRaFsyJAiBPHOn^_lG1>asd&Nr ziN#&jqi2I!f`^y0v6sg%)g$V2`l@}?@9eLODgL5m9HJM1N4c=52o)v#P~V@Xd;}tk z{d0PGXb1!Wz*XYYgsTKTENz`uoX_+D^y7Z7ybg*s@59q`=SPi{ED;>Y-TNr(L6hXs zs{iN>(MAJW-%}M{8YGTfL6SJS0)M;7IS+5N$m$Er2a0@@_Bo_R$mIpk=m^v0wm*`( z+qrQ1f)&45e6TFC$A-b&JZbQn8Kxf2L(n1^NygV`DDSIKR>_A_Nr*=!V2dLSVC?Ie z?MtxIi2x1>Xdpmn0lfLa$C2DFsdA_=YEr%Si55>&(+MCiP3*mRDNgrJF1{k*frY9V zPJ8nL!yVa@L5H+@CFmg%Z4djM{O%tAH_S!Fvfx==)Xs$<#ZTgG#-AN`{83RNtb@0% zU4+=(CnfvRUO|_>c=72E7he{OEu6giYtX}qSDOwLyfq~l2_nigK487Ow)2J=eha94Ta#r~Np zimP0bqXO6167*THY~csC9r(X^+n=*r<5%A3TkV3NZkvu4r>GbWNmLQ?&Lbdu#G^a$@Ldw#Xd2@o-DAK^!>t`H{mT54b6Qt=7ca0dPo= zT3bM91f(16ZU9H4xT=@W)ac{m>hS|RX3y;E$SJerJxkMFN!w}=z=MV({R-;eu>qEI z8|?AVT9w(uJ3OA|FR0<3M(I5~sf{6sW%$b`f3|a{>{Goj$R5H1BBJxp35)Bt?hAk2 zd!|$ZCobAot&eyN-OEqk?Wi2>lkOj2EIFM}GBD+NKOGPiQP=+%R+obIn84Noi2{(? zF?DDPwPrrNwfOo#Q*KIkO?kEnBj}S>2nS^onD^HUf^4An(`OVSF@u3X$@Qx#Nmy<^ zl2-2*JJ_kJ$(Bts0S!yFNo3cLDz$wFYYy(43g^zMJhhX_7NfL(6@1Z7^7`BvFA(KOy&koYEvS|b= zUhXP?e<;0xuC#n>=cD22epbrUeB=u9`g{4TPHW3EXD;7(dsxkGzg`ys185uAZ9+69I*Ebj0@>f(e*nRAW zgvhWiV|Q22cGi$}dqV_-!6LT;%?UpgIk#@HYij10TXDLcqfuk_`Z5pg1*-4Qb70!> z_jh;ZUK*>>d}B28YDmxXa=9{G-6N_;sI%^Uji5yoo9`WZ2pbP9cpOxY;5v09Q~ds| z;cMJ9B4mL}Ly>z5Kd<+pC#X9pw?Ky2-_ZhG&jrBP~H$^+$9NejbwU3orZ z{Pk8rTH_BuJ}NFD0VUBC%540)zxW2J_*}?4|77j#R^}bSXw2d=vP4Q?k>`ReQ0 zCdkAMto?QoN~!9kRk5D{{HT&gyR`*(MlCWXhE3=PgWGnOsbmtNRAr_O6D@|*2SXWP zuU{9SjEFDrOt602_AOx52Bns~&BksvQh=a4q(Q%%LfNBei6yKZX;#*(!EXwH5Cf#) zIyGbU&v%ZALQzqAgZFb{u$6ZrcAAc?`P{O7aabdMKN1cSIP=%OG6NkI(~)lTDpX~l zw#IqROCsD;xH{>0@XfPfm6aQUI-@&YxtlKnefP!U#%@`=8c*!*s#@0W9zydxz_@hd z>b${eqqzad909@`B*zt$iL?Kkw6MhrDu4a6)&Gbk9zL*usjwN<-?$N%k@Kj%9X&w- z?;KmI{<||Rs>FxyVd>!SZ5g^d^`7Kc<*tF;xQM9*54 zT;{vm(R%MzCc00oon*i5_F>fcXQ+)em@_Hslr42@;Dn&+6hB%sk6p#g2y!ALI7+kT zC8@9WC6>SHUgqyk=Uw8jDQ)wLCm0nIt0>!dd=`!M=tUtu1_uUyV8@vcun5HJH59u@ zO;pbAF;Z<5JV+sTzPXd=bnlHG&E4F)zQBBbvXg;x4}6TX;({6K6g5jTz0FlgVVMLu zRP=$W%7V5-eoP8%jDE*}q?Mo&ZrE5Tjd)HTFI{kBM1=v#$;}`8(xrB+a{QXq;^r1z z9oGdlqFiwUe%)(!(Of2e#k^o+}jAz z8z5a=;|*a2bqPqHQQ_(S?$kl(XjteTQ(cSm`eQ^~;Oh11YsCM3a2%yYht>Ckr#oN6 zH(c@1;Ar6^B3+}tq(9>zR{=)_xWoGLHGb!6rd}28%X6$MwkYYw&lZOKuwe^pZt{K} zZS!xSVj#ot@h92L&3c^jo zfJ6iIO;t4n8MM`&ZbA4F&x3f_>tM%1Ei~X_^Hg3uin~8ML_HRyud9>ia}dceKDIPo z*A%wtB>JPNN%P|^X)VtagfI8&rZdW0yq!OYGbI?%Ug_-x{~Q~-Mgc@itub`JeYlIf zA7W;3DyiMt+fah7npE6VWZ>TFG1F7}=!y&>+ zITz^nOv%pGC`M5UFrzAE&}+aaNAqzS_s?!H(R@g3=a!f>C_hL=D?z4r!1jruBb>CL56N z?tkyV?Ia~5#c9uP6-1cG#KLCAtnh8=mai`-FzJq!xg0WW39g4Iet8@WB`)0N!^1!& z9NH)RWq+c@j;dZzg*DBx700fcbnQ({(Cr~u`}-@ML8(B;-}dLGtL2kb*!MijjJOgh z9acftrdE{Df=^a4;&Xmaoy(%LO+jb{YjoKo5C+5T_y)}i>UrLc`?(hZQ6qJrqfDQ z2jtAVyVd3IH%z7SE|woJ$Wqj$Lm)n+NmG+E{~b#iKFvF4v22$7&UY6{Tc zTccCHrE6*3rwn?lUrYHU7=r;wS=HppgWS_u-<*(%yuxpmOIf*zZ``a(TzNw(E6=2l zyot7bcZ{9J#HS#ZkFijk$=uu=%@_jtlg-MoqRHvls8}7fVvFv+@dxv?YOp`RWk%f| zU^&Ij7{2NEJHKDb7)~mpo1i^I9`sW^3Yk^lY7mM3Y*+n05YZ9apH;zF@Ka+!_Hpex zC>#N)09UEyobByo**j^~;~)a>pkx=Wg}OGSm-W^)mReLanW%BQ1Ys)|B?JhOdvDR(T}F@Mh2~?an&T zRiKeZ>+F(#PxX^?9+IBV3)~ppcY5DG4DnSB?k>7KQWbO%9xOB{hJ8iJxja#%``#dx zJJs&zAXptx?)xrJV9-pi4+juK$LYSVIt*SIi94u|O4YVoLKQi-M6gIu+3Lo(qX2#v z!PC_ALjXFvw?(HOq$Q9$wsPNOQ+jA(w6(Qy%F6$MR}IYamVad$w9GR6Pw{g_LfZ>Z z+CkF>mB1LXW>49CeI(Vt{i`lDw6a^RZgnV1ooa+%S&lBj&S*gi zf!U`~g|`E`Tv}c&vZzS<<9c!3Nj7YwQA8xTeQ(|Nr!(i~2K*9i-2=7S6%;|+L=jLy z!d?gr5Y!cgU{cjiBfF|pzdgC1f3biAk8NZP7ydDGoaf`h0<(yS2v~otcl5cZ)=Fu^ zAExhkU_}AKLV<&UAWGz4MK=&5(Y1OHJq~`_!H1-laMVl1cTRS{Xhkh(Q1C{#IoQxY zQp0$P!ybx1NjVQO9#5ZIgJ@DyQ&ZQzC&#fPy{!!vW~f@EVJLK%FYgkT@-uh#S7o%88$xkfQL}nfYPY+Dx!X}Pt%%;c>J$t zKL!uNGRR>7l~>GsTW*V$=T$qk3wc*thlaS~%&xivY3opuElE2tvgI?)GZSQ%EB`)^ zRLKzQjqsBwm#~d>_0gwe4Q;@*<>5mHzRmx8`@TvxH-l&3&lfN94GKD+ygpJ`QxggO z{?_uo+R-|RGOFL?;eddBe~NPuA9IryEP<_`)Zh#aZoTvx7_IEq%D=MAul}yAGr1n9 z7hURcQH@zwP=OTedl0DyO$m?^-!}#+XZoDv!N6q;k~ffn%>TY}2CG;tSIFupH#ayk z)Cjn~SgcICdHv5dstj+zNf9bTL&IB+?yPrwe#s7(xmCwMdbn72lXvZm^RNPlh?dbd z+gC8^=Gkd^=rh-EN?qG~M$Mm2MNjqj0Us137uM?o%s;~M$TMDeBIf8IQjhCX+PvrE z*J`mlY}?l0%mWWmz~0`gDi1o@5?Q!gwaGJkBT?KKowuIX8e!W($;90LYVDOwZtb97 zC7|niUr=BRU~=qzn$MndUn63*(%63P{6R&+a8J=Y_jm^v)NMd)yNg$ zuz*gH(l$At{L4YZGkdrYqQFxROS+FS+1_TPJd3*!!Xx}(YZ(J=0H_H~@6y=y-N58r zi*qY-cw^NxeD^$7bhG7FP|(4H<7!$(zCUL{@mwG4eDPGc%d}+VUp@fs0w;6I^P$d3k!CFE5s)s?@Gf=hm zJAt;U8Q86F-@ZX9{*nU6>`^%Kj_yR)%h~|8*37VE0&b{a(mZ|T>ix|oTzk|! zzVq3Y&4VE~u3uRrG!+=Nz9+U{e6YKW38Jhsrl<#MWZ(2YF2o-)8CZJA@p0{C8ESrJ zH*LIfQbXSwGg?LbK*J7_+Ol~Pk9&#b%{;XlJ-)uL{O7yb-y`QL{7A0B3z#n3pI38f zdgUgRLN`6ei#g|#mM)fvGfCvq3>PcwInq83>aPR+B(#k-j*ign(6STzi=)nF>oi?~ zJ)^25qO@NgBKF>16EBmEaPy_CDKH8^;tDDa*w`rCTI7ZYFS^4HS`WfiWFeCf%$(jU z3XGApgC8wO0AU}iTUOYfPa7_q51Q^}8TCTwC81NY-n@ zvFr(17;x`9rSi5XB;j6lPA`LI4``tO1h35Bkm%}k_rKV|zU7(1P1re+Ih$`BNR`5{ z`Jnv$*fb?(N=O)@B;7lMhKncGbY=FtX=D&Mz#+j9KyF>RL$2%Z$$IXPxsDi##TqG# zLvm$f*+RX=M^Xs|euJNx3WSbPi}gi|`F<-iPaQ`OI=(Tg2Vp9x9v|K+ni<`ra|!aI zG6mg-{Uj55qA1Dr9YA=de-h}(a;J3ko<7aGNi+~ywW#4CvA_8x`PEp|3?eZI3a>_! z97rq<8OGW*mO8opbAz2p$}R5P)!)^X{;Wi$+^V7 z$ilU62bRlBbAB~Ewy7`T1yQsOXsSSEgqpgtP5#_>RNgPM$tqxSE+;pHYo)O^R>WNS z6vN)`!1T-bSXi?rexeV-r%-+wf8S%4(=d}2fDHPx%VEueV>JOxz?O>hg$Xu>%*|gs%1q*~O8kxo;#h=_3r z`^2x-&-@vQ`VHefe=Tu0kTNeLX($=z+VJN|)D)%iQ>jW~n>cFnYI=SI)4 z^UlL(i&+2^hS1Nvb_qL=GqG6<{{Q+g0}kNiCpX7(m~jW_9@PE(ZB?gEJ?dy0|o%3$$n-c^IuIC?#n(}2yx4#a&6v{i)fHEA#4~kZ#<#~P#CI@{s zf2HdZY(vi(s<)vAUa?QvXM)1YwEP`0}hc8c}EvP&- zHW31aIs^|cJ&2hAY*{S!OXT4zRicogPntb{-;nFs%Ci)&g=j-8W7nUenzDZG+_lJa zn?otC`-twi^vs^>{N0IM}}&Sfr}Gv}T!N{xGc^X7r1ssELR@7;)7ic=$;+Z{MoV>EPc$zrq9pZDFc z`+iUXo(1E$-M;l2;s4}zqm^dJ2fHzp^14+gXno6w?q1!VMZYE6@%0GqQIRHGb=8{) zRf=lw6*oeVVKU>9!o4${ft%aqHk{75_#b2r?q^Rn%mC*1q_mt(hTTiF~= zmdZ*rRo7=G)rXL~Z1o~w_${|p4g0LuaVd)Qs+AQ48jiHm)U;QKp=X$6VvHa6*r&En z3hO#K=SHV3W47%VH|?FxS<9x1cO7?{rrgi$^wzl5aGg&+H||^(MvPJ|A1HgnD+m5L zXok7xV|Kg8Hs@JC@ez-Y+Fz1q`154g;+=qVuXFgrpB0@c|*`j}R+2b7#zrYVu?xs7vY9FiyQQ#Jl zxg^`)$ys5UJ3<~1{=2a&bn1b11(nZ5PpEP5Mvl6=p4`Umtt*PI9UOJqG zr0yKB)oJ z&=L3{!q2mQT8Gz2lser#K8@NWHN&c9FN~UBD2)#C*Ok1i3Y2QgbjBBVhWSK2chdN# z<#?6)kJ^o5#2J+6zg~1Hgi%@1L^gTWi>++ObQ^gtXxJIx2XX0-!t?lSncj@iBSd01 z+x2Y4a~c(F@tZvms($--X@Bj8wj!A|XH;4UfngWHwpr$ZcQ~UPiKb3(N-cwH%;>}v z_($pak#l%>0|vYv=aW;ndi}J>zk^k-D+SOBC9;-9X62FRk~AtTPSGNmCJb|V!Ffi8 z*2qRJ6_XS2(OLU@#re~T0{zs=vt?76Q+Rx%g7aW#8Ubr?2xsf)qR3ywblrphu2(Qek)QAWW}xUm=k-hps**+I`}cLV6blPc6fKrHSV6Db{CMmee{}ZQM`> zyhUImoR`u(k9cG*N0xUHX#~WzShy90LZ}l%xsiGzk;rfa$)b2nRFqIZjbh`1w^;42 zbO<$a`A4+xVz!elkzR z75;mac+`3r$9v?-^&TP%)q#+K_9cWkyrtq={;){^7A}dJ)N4Td&Ag>_rSYj)#BDp}B@X(vGFC6=4?Ij!y$@~RWih?Ho8^=B-mP|m z?l1O2NR$B#qC^eZ`Qr`hzb=tv`_q$V3vQ<}hzc-UVM(k`b9DmzkAtn{_w?{s;)Vpt z{m{0-Fh-o4ZTQ^B=xFwEWqe-@ZUPA!c`kmYHlUXclc{bvN%p57NtB_v?z z1*%m`HdsCV$#w4jS-b^dH$15iDN68T@Fy|-wt_tMg*;l!^*9498rGPo#QQdXNhUlD zy=;q$_$+O!$l*^LDmpOBgiT}AWbSLwWRzqQyVKFc0Wwp$4qli+xs3QL>wA!4eM=hE zF(m6dv2jnvbOa-QsIcoH6^5QF6!U@kP?-u7zJPfm zh1QXqtn@U{1EvtvK3X2Vp@;Etwu)c(YNdF&5>*sgdZ?p>(){I}-Av%ZMG4kMYt$bV zyVt0Y%H?qfUw`hS1Y*ZT6=xJ17jn3e#plSm$*Z>apOv#k|Dz9IwJO`Gq=)x_kxLAb zXjAVJHZnU+?#z(u!x8C!d#(|wks8i9{hUc;CO>d;ewzc!zPO+#-&gQOe6AGxi0w8y zPUhreOC~%?F(K5P_L>)EI8^MsRC*#!>T_!9^f$E+MP6Zuo`=LnJ~H+$o|R4~&PJ8Y zjL+Y%BP3?5*SKJ(J%IT>>VM2#@VViL5zXlrb-jhsE~;1aP(Qavfk)*j;$I7 zR7_md(NJQ)tkZbk40)>TK7cja+=^4-)x-<_KtlUGaHFNj$WD*~MN4a~#<^VjUWoGm z^|G$iWsCKzRoRrr;N=264*muvVEgra-Zx_=;Nti{e4O7xO+Q(2A#kx0(a7OJ)aY41 zgu@66SC0O{TvJN=%Wx%jjTtq?7$5)0EeJEAo$q9MHB5M5}n zPLqwr#4fyZV7L}aq+-xiW{o<)#-poA_{^#C#e3pN$bW{bJR44P(_`qpYOz^n>!u1-?zF1?i(*DQ3WgHco83WD`G>BC_%5bv=aSLw&$ zd9_2fQsf&LWBmB4zLINKDuK#C6l2c9sieWd^g{_wt>omoUycJW*({r{7nrgcdtIz* z>dy2W_A7szH$_iBow@lt3tkSXHjW@qhKlybr|IM9>L`WI`G*ecv)pNv<|*f`npIO0i^d=m^DN6j4HiPWGb;X*-c28Z z9O$Xa+(!f-=Cr1kB!$AoukPzA7Es|>?^k?7G(U-_kL9PQiVmHt`DTT=8-nFVe0Ouj zXFKA(^Jo+s3Tmj+#IQfj5nbJ-R1b74qNK)*@a>GGaI*J0)1-vzQmHg7D+wE^5I1e} zLTVYrC?inVK&R2OWZT7ujkfo)EW-RfzhB(8O!tn(=KfZbP4!7>U`9s#;z%osymTT%7-IG~B4DF8D|z%MpJ%qd)O-`}dv z?i`1q999;C^ju-w+MNCY9t)l8y5nnSt?m<5Dg-l}>k_L@MKe2%GqJIaijgorBX@{S zM~P|d`>A26{kT#FhDjyXs1Q#f9??AyS~r3jLM?ck{a{8jT8l)+Mtuj{_et^`4`nCg%`k zd>4(Nim10>!s8QZ7s44-ZZ%0?R01tkhzg4lNO`U`;Hqz6ScxZ0LO6 zO>y?_M_z%EW+JmL=U8EhA#%9KX#AN0g~?DK9qcxf{lJ*;ggwfpQ7(;@4Z|jl*pNHW9DIF%fzd-E)Cv1%*fp??M{!(Ohf%FQR(I!Q9>)_RG=j!R8O9u5o}tN| zgXy_bc1yUYwH}?urw-#tD6Ket{f;}M;kBWHv(}@!Y+nD8K#v#BXDX-0C1M-3`MKZ1 zEB9<#!JD)28%Kw`=<~C1vIWPPMC=L)vBo;t3+rGds0yEYm#X&$R}rHz^s})}LTDZM zT~cZ(SI$-m|CNp0=ee$X2#Z68UpgKZPL!u}to(czlS7YQlit`D|K>dYeS@KRw%!ma zyVDdS0dxB9k7FjYX4;O1nlW-BJjqWdqxy9PsIEUsfNeNz!}vbCv96jFi@RAyDUa#D zhL`qzsQFni!*X59&h=xtP1)vRY+dw*kD$oK>zvQK&)eLY#2O)zo?R@FVH9?g8y zc3tD#%(aT|Rt(YqS@c|!DWoyiXC%J2&wE$^0CoLKV*mgE literal 0 HcmV?d00001 diff --git a/portal/index.html b/portal/index.html index e90c41f..3306d44 100644 --- a/portal/index.html +++ b/portal/index.html @@ -426,7 +426,7 @@ - +

Invites & Active Grants

@@ -447,8 +445,6 @@
- - + END COMMENTED OUT --> @@ -695,6 +692,7 @@ +
diff --git a/portal/menu-builder.html b/portal/menu-builder.html index cfb225a..5cc9652 100644 --- a/portal/menu-builder.html +++ b/portal/menu-builder.html @@ -4,7 +4,7 @@ Menu Builder - Payfrit - +