From ace7f024e47ea294efc93eb9e4b46427988568a0 Mon Sep 17 00:00:00 2001 From: Guilherme Fontes Date: Thu, 11 Dec 2025 20:22:59 -0400 Subject: [PATCH 1/4] feat: add table to shop services and transactions --- .vscode/settings.json | 5 ++ .../migration.sql | 37 ++++++++++++ apps/api/prisma/models/base.prisma | 1 + apps/api/prisma/models/shop.prisma | 51 ++++++++++++++++ apps/api/prisma/seed/index.ts | 60 ++++++++++++++++++- 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 apps/api/prisma/migrations/20251212000952_shop_services_and_transactions/migration.sql create mode 100644 apps/api/prisma/models/shop.prisma diff --git a/.vscode/settings.json b/.vscode/settings.json index 44891a0..5473acd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -125,6 +125,7 @@ "manashield", "manaspent", "mariadb", + "mercadopago", "miforge", "mitg", "mitgdev", @@ -176,11 +177,13 @@ "roboto", "safelist", "serverinfo", + "serviceid", "sessionkey", "showrewardnews", "SKRS", "skulltime", "stayloggedin", + "stonebar", "synchronisation", "tailwindcss", "tanstack", @@ -192,6 +195,7 @@ "tibiaclient", "tibiacoin", "tibiacointrusted", + "tibiora", "Toplayers", "torsocolor", "tournamentticketpurchasestate", @@ -212,6 +216,7 @@ "warid", "wheeldata", "worldid", + "xlarge", "xpboost" ], } \ No newline at end of file diff --git a/apps/api/prisma/migrations/20251212000952_shop_services_and_transactions/migration.sql b/apps/api/prisma/migrations/20251212000952_shop_services_and_transactions/migration.sql new file mode 100644 index 0000000..6e6458c --- /dev/null +++ b/apps/api/prisma/migrations/20251212000952_shop_services_and_transactions/migration.sql @@ -0,0 +1,37 @@ +-- CreateTable +CREATE TABLE `miforge_shop_service` ( + `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `type` ENUM('COINS') NOT NULL, + `slug` VARCHAR(100) NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` TEXT NULL, + `price` INTEGER UNSIGNED NOT NULL DEFAULT 0, + `quantity` INTEGER UNSIGNED NOT NULL DEFAULT 1, + `is_active` BOOLEAN NOT NULL DEFAULT true, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `miforge_shop_service_slug_key`(`slug`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `miforge_shop_transactions` ( + `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `status` ENUM('PENDING', 'COMPLETED', 'FAILED', 'CANCELED', 'REFUNDED') NOT NULL DEFAULT 'PENDING', + `method` ENUM('MERCADO_PAGO_PIX') NOT NULL, + `units` INTEGER UNSIGNED NOT NULL DEFAULT 1, + `total` INTEGER UNSIGNED NOT NULL DEFAULT 0, + `service_id` INTEGER UNSIGNED NOT NULL, + `account_id` INTEGER UNSIGNED NOT NULL, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `miforge_shop_transactions` ADD CONSTRAINT `miforge_shop_transactions_service_id_fkey` FOREIGN KEY (`service_id`) REFERENCES `miforge_shop_service`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `miforge_shop_transactions` ADD CONSTRAINT `miforge_shop_transactions_account_id_fkey` FOREIGN KEY (`account_id`) REFERENCES `accounts`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/api/prisma/models/base.prisma b/apps/api/prisma/models/base.prisma index e1637fe..a4ad16e 100644 --- a/apps/api/prisma/models/base.prisma +++ b/apps/api/prisma/models/base.prisma @@ -101,6 +101,7 @@ model accounts { audits miforge_account_audit[] confirmations miforge_account_confirmations[] oauths miforge_account_oauths[] + transactions miforge_shop_transactions[] two_factor_enabled Boolean @default(false) two_factor_secret String? @db.VarChar(64) diff --git a/apps/api/prisma/models/shop.prisma b/apps/api/prisma/models/shop.prisma new file mode 100644 index 0000000..17254d4 --- /dev/null +++ b/apps/api/prisma/models/shop.prisma @@ -0,0 +1,51 @@ +enum ShopServiceType { + COINS +} + +model miforge_shop_service { + id Int @id @default(autoincrement()) @db.UnsignedInt + type ShopServiceType + slug String @unique @db.VarChar(100) + title String @db.VarChar(255) + description String? @db.Text + + transactions miforge_shop_transactions[] + + price Int @default(0) @db.UnsignedInt + quantity Int @default(1) @db.UnsignedInt + is_active Boolean @default(true) + + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt +} + +enum ShopTransactionStatus { + PENDING + COMPLETED + FAILED + CANCELED + REFUNDED +} + +enum ShopTransactionMethod { + MERCADO_PAGO_PIX +} + +model miforge_shop_transactions { + id Int @id @default(autoincrement()) @db.UnsignedInt + + status ShopTransactionStatus @default(PENDING) + method ShopTransactionMethod + + units Int @default(1) @db.UnsignedInt + total Int @default(0) @db.UnsignedInt + + serviceId Int @map("service_id") @db.UnsignedInt + service miforge_shop_service @relation(fields: [serviceId], references: [id], onDelete: Cascade) + + accountId Int @map("account_id") @db.UnsignedInt + account accounts @relation(fields: [accountId], references: [id], onDelete: Cascade) + + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt +} diff --git a/apps/api/prisma/seed/index.ts b/apps/api/prisma/seed/index.ts index a41aa55..04f7f85 100644 --- a/apps/api/prisma/seed/index.ts +++ b/apps/api/prisma/seed/index.ts @@ -1,5 +1,5 @@ import { env } from '@/infra/env' -import {PrismaClient} from 'generated/client' +import {PrismaClient, type miforge_shop_service} from 'generated/client' import {PrismaMariaDb} from "@prisma/adapter-mariadb" import crypto from "node:crypto"; import { MiforgeConfigSchema } from '@/shared/schemas/Config'; @@ -39,6 +39,9 @@ const miforgeConfig = MiforgeConfigSchema.decode({ discord: { enabled: Boolean(env.DISCORD_ENABLED) }, + mercado_pago: { + enabled: Boolean(env.MERCADO_PAGO_ENABLED) + }, account: { emailConfirmationRequired: Boolean(env.MAILER_PROVIDER), emailChangeConfirmationRequired: Boolean(env.MAILER_PROVIDER), @@ -46,6 +49,50 @@ const miforgeConfig = MiforgeConfigSchema.decode({ } }) +const DEFAULT_SHOP_SERVICES: Pick[] = [{ + type: "COINS", + title: "250 Coins", + slug: "250-coins", + price: 10, // cents = 0.20 = 20/100 = 0.2 + quantity: 250, + description: null +}, { + type: "COINS", + title: "750 Coins", + slug: "750-coins", + price: 10, + quantity: 750, + description: null +}, { + type: "COINS", + title: "1500 Coins", + slug: "1500-coins", + price: 10, + quantity: 1500, + description: null +}, { + type: "COINS", + title: "3000 Coins", + slug: "3000-coins", + price: 10, + quantity: 3000, + description: null +}, { + type: "COINS", + title: "4000 Coins", + slug: "4000-coins", + price: 10, + quantity: 4000, + description: null +}, { + type: "COINS", + title: "12000 Coins", + slug: "12000-coins", + price: 10, + quantity: 12000, + description: null +}] + async function main() { console.log("[seed] Seeding miforge_configs") await prisma.miforge_config.upsert({ @@ -61,6 +108,17 @@ async function main() { } }) + console.log("[seed] Seeding default shop services") + for (const service of DEFAULT_SHOP_SERVICES) { + await prisma.miforge_shop_service.upsert({ + where: { + slug: service.slug + }, + create: service, + update: {} + }) + } + for (const config of server_configs) { const existing = await prisma.server_config.findUnique({ where: { From 0e68c6e3e3439eef2cc38b99f3cfce5cfd324fbb Mon Sep 17 00:00:00 2001 From: Guilherme Fontes Date: Fri, 12 Dec 2025 22:19:47 -0400 Subject: [PATCH 2/4] feat: add form to order a service --- .../public/assets/icons/32/tibiora_box.gif | Bin 0 -> 4666 bytes .../assets/payments/coins/serviceid_1.png | Bin 0 -> 989 bytes .../assets/payments/coins/serviceid_2.png | Bin 0 -> 1126 bytes .../assets/payments/coins/serviceid_3.png | Bin 0 -> 1319 bytes .../assets/payments/coins/serviceid_4.png | Bin 0 -> 1505 bytes .../assets/payments/coins/serviceid_5.png | Bin 0 -> 1665 bytes .../assets/payments/coins/serviceid_6.png | Bin 0 -> 5734 bytes .../assets/payments/methods/mercado-pago.png | Bin 0 -> 35745 bytes .../assets/payments/methods/pag-seguro.png | Bin 0 -> 124478 bytes .../payments/methods/payment_icon_hover.webp | Bin 0 -> 238 bytes .../payments/methods/payment_icon_normal.webp | Bin 0 -> 1704 bytes .../methods/payment_icon_selected.webp | Bin 0 -> 2312 bytes .../public/assets/payments/methods/pix.webp | Bin 0 -> 30166 bytes .../service/serviceid_deactivated.png | Bin 0 -> 6964 bytes .../service/serviceid_icon_normal.png | Bin 0 -> 5065 bytes .../payments/service/serviceid_icon_over.png | Bin 0 -> 4572 bytes .../service/serviceid_icon_selected.png | Bin 0 -> 4497 bytes apps/web/src/components/Menu/Item/index.tsx | 27 +++- apps/web/src/components/Menu/index.tsx | 5 + .../Payments/CoinsPackage/index.tsx | 57 +++++++ .../Payments/PaymentMethod/index.tsx | 96 ++++++++++++ .../components/Payments/ServiceItem/index.tsx | 87 +++++++++++ apps/web/src/routeTree.gen.ts | 25 ++++ .../routes/_auth/shop/donate/index.lazy.tsx | 10 ++ apps/web/src/sdk/hooks/useMoney.ts | 61 ++++++++ .../sections/account_2fa_link/form/index.tsx | 10 +- .../src/sections/shop_donate/form/index.tsx | 70 +++++++++ .../shop_donate/form/payments/index.tsx | 80 ++++++++++ .../shop_donate/form/review/index.tsx | 139 ++++++++++++++++++ .../shop_donate/form/services/index.tsx | 115 +++++++++++++++ apps/web/src/sections/shop_donate/index.tsx | 17 +++ 31 files changed, 794 insertions(+), 5 deletions(-) create mode 100644 apps/web/public/assets/icons/32/tibiora_box.gif create mode 100644 apps/web/public/assets/payments/coins/serviceid_1.png create mode 100644 apps/web/public/assets/payments/coins/serviceid_2.png create mode 100644 apps/web/public/assets/payments/coins/serviceid_3.png create mode 100644 apps/web/public/assets/payments/coins/serviceid_4.png create mode 100644 apps/web/public/assets/payments/coins/serviceid_5.png create mode 100644 apps/web/public/assets/payments/coins/serviceid_6.png create mode 100644 apps/web/public/assets/payments/methods/mercado-pago.png create mode 100644 apps/web/public/assets/payments/methods/pag-seguro.png create mode 100644 apps/web/public/assets/payments/methods/payment_icon_hover.webp create mode 100644 apps/web/public/assets/payments/methods/payment_icon_normal.webp create mode 100644 apps/web/public/assets/payments/methods/payment_icon_selected.webp create mode 100644 apps/web/public/assets/payments/methods/pix.webp create mode 100644 apps/web/public/assets/payments/service/serviceid_deactivated.png create mode 100644 apps/web/public/assets/payments/service/serviceid_icon_normal.png create mode 100644 apps/web/public/assets/payments/service/serviceid_icon_over.png create mode 100644 apps/web/public/assets/payments/service/serviceid_icon_selected.png create mode 100644 apps/web/src/components/Payments/CoinsPackage/index.tsx create mode 100644 apps/web/src/components/Payments/PaymentMethod/index.tsx create mode 100644 apps/web/src/components/Payments/ServiceItem/index.tsx create mode 100644 apps/web/src/routes/_auth/shop/donate/index.lazy.tsx create mode 100644 apps/web/src/sdk/hooks/useMoney.ts create mode 100644 apps/web/src/sections/shop_donate/form/index.tsx create mode 100644 apps/web/src/sections/shop_donate/form/payments/index.tsx create mode 100644 apps/web/src/sections/shop_donate/form/review/index.tsx create mode 100644 apps/web/src/sections/shop_donate/form/services/index.tsx create mode 100644 apps/web/src/sections/shop_donate/index.tsx diff --git a/apps/web/public/assets/icons/32/tibiora_box.gif b/apps/web/public/assets/icons/32/tibiora_box.gif new file mode 100644 index 0000000000000000000000000000000000000000..2782a2b596e30c5d5e54131f007e62b3fee54fb2 GIT binary patch literal 4666 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 LNkvXXu0mjfm}IBD literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/coins/serviceid_2.png b/apps/web/public/assets/payments/coins/serviceid_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c1bcbaebd9813cf598d52304ea1d4f3fc96164 GIT binary patch literal 1126 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/coins/serviceid_4.png b/apps/web/public/assets/payments/coins/serviceid_4.png new file mode 100644 index 0000000000000000000000000000000000000000..793e2ac88cb2e7c4c50294e3b70ce4a41af7112a GIT binary patch literal 1505 zcmV<71s?i|P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00015 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%0Atxr>>N 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/methods/pag-seguro.png b/apps/web/public/assets/payments/methods/pag-seguro.png new file mode 100644 index 0000000000000000000000000000000000000000..28c88998e3d91de582309bb3eea2494d26504288 GIT binary patch literal 124478 zcmeFY6$bf+kWG7fB%Bt)BE0&?ZI{8ea`E|bGY9eJDwZ zUu6!84~SnzPxMSRwS4pxm6dMs-j=v`myVv^#LSeHjg5+i%GKS?-qAroNbsqh?Z@WE zSIKWl$;ry*XXlsgj}a>O;w5_XuHZ~bB1lK-hGWH=dr}sBD zFaZ)9T@hM84wyxA-0*lC5OxayZUWjGYNo++J3Sx}@j1wQJamupQqTYU{I9hDWHyHM z5)8mi!t|pjX8-s3-)sR#270nfEI=;oIo19*8{+@YZWh}WW@NB1Qv_Vsew?Jia(~tI zL)#&NCv;MbJCyh3#S1a2XJL~6X1L!DZ~9%o1kL~dk4j&+S<9gLxOXw3-3T5J^Ajyu zISMTM^kM$uhKVorAK!$dTcxPr+{#{}NHpq#Q{7vM-mUPJ=+W9b9Q$gdQ*gi!Lnpi9 zEkR+g@^NGlk+p^QE&bocjxnOR}$% zy4nkQf+@(6wT;2&))QQx;^WT)b5r}mSwhqkeJS0xOXNf_3paMk=!rfE|0g>c!C;Fx zm7WWkuwIdT+~W9TiY`W#r#gyWiUlQUgWZk&>vKb6Q&N}?X_*mW&6w8$g8h73e-cCV zeQ^HYu)R~y<+$$i-S&OgsKbA9KRfy;m6Cf`o+x6Tu>akXq;JDL^vR68pP=}S zIb8h8C-)wrZ46O=&^cS(vO$M*eJmrzwTe{-BZ%gfXCcPtbTI)FiL&{LV}6O{Si)$V zX!vzjgjr1DLlPoX&&u0-y|buc`kx|YlY{7sn-P-kphZ(qzF~bA;=Q>Dd?Fg{pKH!; zut8lpiBi%HT@tIH-=MAr>_7L>zp6**jBU zr)ROZ7?&2;L79Sy4(d?yK6qpzNrYERQa3iDOLa8VZtILov)4x|qK0p&^lRr_ci2L1 zo_9@MzBvS2S=9GJWW|xcH3_b1B}7JqaCpZV=YVZ#1~UErsAFT+*q6cWXN-#pUAmvA zMc|2*U;1>&x{t`%6rza`>(<1GB`*88%DnWGwiNB`&OeW0LD2<)7Z%9FM+Y~@zgG2w z#@*!oIiqYM3y93SUC$8H$Ay-gM0Y;7S@OU2!b`95G;bhm>H*TiCSM%N{cYEXztuf^ zhN^4a@|Wvgk=LK6QLhtEM+ulvULxSxQV@6x zQ|+t^!;x$ZelEA*pTU}JtZSlvj%XKqro=nSiN%f7_dXRRI#41t!q66`nIV=QsqW3W zkR>xO%WAwY0eC-sjzjyo^)356b;~f|>WR0$b?LRV74Nw%S&xH?>?By%4kzo}OXSml zu8yClX?Ng5;CcKI$x2?TiI&ge3r(Xxk;vdVifkz)4FIU@%DY`Z>s&bI3@wJn#S}c^ zpOqC8ihOAuNgzSHTPgfHC6Bi?TeY$p(5Xc#UtM~VpJEW9uzdzy7VYK^ zN*YA?%FFUdt)pJGz)q$m$N`8q_FJQ9;+Kkw{_4n-m~VWu)cvn64*e!j*C@>yPF{3Aq4Uhi0ocHJ?Yd(2tNj^{O=U0q%(+EOs)dNta%o<4 zpSU-D`PH44_kzKxyYE*!#$U9K91q)WUw@aw9-nqw@kM-ERYysK;-h`LQ z{I-vv+jH(-0A!y9yz*_mb8ffyH+}`qIJ9X264~*0Q@DQo(d#UOp%VEux=@R@| z*d(Zb@O7)BK(dwGj`2;qCtbPXeGD-FPm8mN+PQwI?uNjl5lMv!I&llL^pn$(w|#|` z^oejHm~Z1UG&AmpSXNw&i0^RioMLCb&+jvVTTD9!bouGk#4ONyJV zXghc3L3t{Y*6Y%4O~vL|(wS3T0nX*%BaaM6z$?sJA z#kJZhnYODUpAi`fIy2KB@k=aRd9fi-Q+jli#dBtCW6lL`{WJ2uJ)LGgoD>M}5-bU@ zb+%pE-!Xvo;TKnT&S&e68ff59%m)`)Eouaj)P!QKOnKqstoV%-RaKHQaG#mUM+IVI z(LL5ME`20FlZlhcR0H{~sjkU68{R%#!WML=2MnirGSF9Xv zT$#Ubt6R&X0>H}#knQ3OD|6nN32^&5l8ZQyg8f&La9p4vbr12Roddb;Kl=V<-S)|~ z&2uR)?n&VRP)r4H@B!SIP8!_~9DNxp%o+cOR0keJ_cRV2Hgeeck$>c7Vp zpBNCSvB-KKY_)C~)-m|^)dl?h$^}c;$leu$Sta|6F1?`9-zSeFFC*~6YNK1c!8u^# zFvk3@_pcAr&*e9}kBax?_w6pQqp;_@1DN)w7o%wLIqcJg)S$kRM+}JFR<`)E0F*7u zshO}?(cduDqZC4J#Uf*?8VGKitaMj1!S211b`5Q)ZT1wRD?rU-0=G(-&35fb`{i?4x$b#*;ZeNIvj+E^89ZudrA`YTu zA2WCaq7iiF1lf8B+l|j}`#Jck-qM+TM9ZfX(SlyK!9}lJo+%Uit4)}360;)(Mm$S76MxYptd2+>kf*9=@vr z0SB+UJassue0%57(HykSG!yhcw&6avd0_-S-`!SzG;Y`jy`lkgsmu~gAP@?#>{)N`lKIOVpVzd&;Cp@t`)pQW#u~iYm<$z`QIRA>5 zKhg$yI`P_D_Qq429^x9<227v+RbsnEzP4q@+en_7r`+$Q&Od7LV1BFJV#vzLK7}_O)R_XpmM@&5FB?c8 zGjdF{zC_f|7rJ}*_|Jnm|B}ZOEjJKJ$ittKkuZ`7vAPdE$Jr%a{?5Z?G)s8VT3)&; zy%G{4C*9O({AJ~3ay**i#Z19w286&%%CLFwR(z_{Jdf`cfeO*@g?m-oPaa?FeuqjhE`&$aloclN zYp2aO;gT%pC>xjL28_~K-Z)qm0^dR0@8M1lIarBo9-#l-+kOP5gZcbS*E(%pA6i{I zi}d{~`;EHBq-P*v|Kj{3%zG$wT9rJcGvUX|8y#0m1k)XLfI(bi@VS88r6v!*h865? zK;@h!M0G<-JaGB{5X_op3K{s5gvvV2ZGf${16P57W4vc}A$QTT)CU@T<8ocpJtr;(}kOc5yE71G4>xrfd3 zkoCoVEq~0uec{b0e&M^L3pNVz%ts zLr1!J#Ntihg1q!f^_f*Iqg5RZS)!7i=XGWp8jyidI1BY0!SG`d3alckQ zm+O-ckQbX%dqW=r586&5_tzvo1T30w5Ra~#f`s*EUZ{Vy=9iNA{c{nj&DX$o?;dqk|NzEmTUq%z+tTMQN>?ty($r zJ`dpvqQ5CF6RPAReBgq8N(84R&rXHGRyORD?Q{HXGq!i6B0MvVQR<5puirH&QrGbf zyG=)ZqCt^?l(a!owU^e0-2vzAL6?v^XrLPQqSZ6PD+cxkX|eOD!qeejT+~2h=JyXv zBYgh3W0Z6f5s^+t$@zH?k}pvPv7dw`tm3z@&jToe^*;PD%kf8s_^Yhox_?u2Ps!BE zOscH)9j?V7bW{0~hTiz!>O_O$KuVLO$xq;y2M!ZDomNpDl%tS)aD4)EVRtS3>jXS( zHqP|fad^ezaSw*&V}<`MB0e4yyclUw<=j5sA};qgu)tu^JAJtO2kmPm+Zzck^Ekxx z+I}hbkS3u!cl-RJHYz4awqw%kG~&%&O0hw5gL`}8!NZD5Wat+Ra)R}j`zct!t6%rJ zRL!j2{@jfmxUafRjS+wQ@jR^i8NPd*ygN4q+d(Iqc4e;XQ&gsvgZ8Ag!vcSB|MM!H z)Otf9hdtt!3pl%ln zKORxOpB#K;h(P^LdRe{LRb-rKvzY@caYMyNRAYx>Alc50Y<;lHJp z_WU8<0hY`U`wk52MTT$IMw}z+D1V98r+b@(Km&Jh;fNrjR^lf%bm`iv~64(Eu=mzM5791obD@4>h zyy*hLm#T2@tutju^Ov;bjmABdK#$}`qTl(=qmAA+JOCaTz|fcl{Upxn)(?3 zso*8yVMyKAW$7ldw8ehtiUmM)x1A<X+oew=m z?r7EXVU6D=3Iyt$VwdE-oDQRt1p9AS>QqWR3jL@DzVSyDixC8mYJgP*X~K;hQB(C? zcgeUKWm^%{H|ki}*T5BK8W0!u=A=LsosuXJf~VnwP5R8k7+A zA1Kj!tUl4?m#Gh_mb$UG|7NngYj^BB+HVEF_X8gpLsR9cnY{*J?=7#HJ1|TBx(&&K zRd?}UPRX11 zaP(h!deB9$m_rXMarOv=x8hlTBk)`tMz;T^PVjb-kwl3}?QAp3?xC~@x21XcAKbmQ z{-OzpD8W%*=R?}6t+8fr`nu#qj8T^#?oa$nP($`*hU5u%%5>J@+l!rsiyppp=x5r z4n8%`yy<#r4Tn4D+pq06C-q^x)R}+RRSmXDpj0}X)}(u`4tak`CaCh|hRI*5RhW8L zhgWY6bH;jDe>9S?TzZVE>FIB{*)s--_n?E!3k2-=%%GPZkNZ@2wQ2K->Fg&~0LP~D2fGpXsU+uD^ zE6`%qM6|&R(M9~}HHc;V3^2@vtyPJ&|0C4`*rgQ4c;?F{ca55g*2C)+x z!ZqHFNxJrXM15a}+@txj%|Y=VLwAB{+P8re_m8Q!rp+5?mXQY+9t{OXZ;+{!h$@m4 z+M!Wc%(5#ItC;YDiG9jdo8>V8I|K9yw$%=t$)!QgphF$v@)I)Je!FqWBDowzFL^2t zA4&ut592iPkx5kHTjk_?9%ml&FIq=#wf3~mWa;#g*f*vfI55I?H#~R$W zizl87ZN&C^uvOPL4_!!3Un}T-qpm2iND220AIY(gDbC%wFlZwANTu!)w&>)cp1&&kr>@I2!?5-t{&)1PTCcw~HjRbD01t31MAPu);A zJRg4&G5qU_!>$COh#VHk(mEVt2bS%ZM=K5KPEgS%{V{Hog@1D( zItE_0K@3|c*41(hQxxYPrByq1!& zu*&JZ*G;FuB@!vp%aX(MN_gWX!GP>3ohDn-EG*z;k^_4>Z;Mi3XrCs__Z8_!f=<3k z5S?-K#lD8{UNGA^iAIm*GW6l^bOqDCA&%CUme!qC@3*WX58j={79b1!HnZWn*^sXC zm>PO#CU#b)ujH+iK^k-Js3d)dSO3*@-oMcIbCq8?xFfkSKHu=A=WNzYXUiER61inO zH3kPVQ6Xl1M+p+|0s60$6TcqGf3q2VaEKu$DoCFFl}BEzTMup;**AH^uKttO<_D*U z5+1r-#eB`XgLG1a^G;luT#^84rpu>c)8(Mv@t?lyLTx!8NxzL3k^Ed<|77yK7U zZ7FySs!UX2X7|2>ZDa{Ud|#F3(75?jzUyM>IUAOZ`)EHUjiOpB4B~Q1ie+1RNz(UG zkCqowN)6pDrW^Qt4NfGkT@iV(5^^(iQ?$b6N>DHKM`T>8+6K~uGw%2;m&2|eccYck zFSWj#R?Lrhzb}#3a_ujQ(`Vnf%!e~j{IE^VgD_l$pIPl`%Jc7Twm*@fD@>oKuXM|m z!gcA}uQ6GM<-m#LSEH;UEk2NKV+Y>*|Lr7!Jdu)x1f49zo}!XqwJpe)d4Q>JRMITL z)D_owaU9yxC_VsCrbNh&9b`hmQaH*P}XNUEH$iftc8WQp3Rq|6d zfreUxQ+*U$COrR2a~@pCVa6N~e8vQNdfMS#0ug>l>>446ROdT73X|nDUCkhhRs>$m z@P~b7168ax;i&(ak5 z{sX9k%O5U|IbE>b3(QHxzY|r_WUU>0%X;c?y1wfk>eu~au<7-R3-2jo$*$OQIuFzS znirNy(io8`SN~myVj-?Mfw1-?shW#PDMi<{BQjacsXzW4rv~(ed*#6WJX((&!v(vx zL4qL~Vl=@nYAmj5GK-BV?U=i1Vj2I>0=TEAr4<~w?XwpR2eF}vE(*&n^sruhY`;J) zf=orvlVlVoGQkxy<@@lubg*Erke*?UflLjVu`?-om3Gg6Hbkuzxw`ni>YDPI^g%=% z#o%Zv^-=4bsdFm_i}Y0qrR4h>>_R*`x(#)|EpA_2ZOphf>qk_*md2PR0E!jR`2G?R zg`+VPCn*?wcsimcv8{H%FxZ?KEA8q-?!*0v^}DfWhD`ijBH7H4S;6BEXJhvv zf?TLJ#@3q`)cI0T45Qibi1L>uYJG7e!G8RiUj!KTKm*LTF0&VRZIsZQ8$Ry`B2P?q z10Ty442K2MT90z*vFAiaQuets1Pikdz2+q1ks-`dbyN>6eM}T_+2qjIoYimNTzG$s zeZQ^rMXghRs1lb*66Yct1Ig>6~in6y(Y=cBuxJyA%-2k}eWTP~w}3G#3YF1=KD z3L|^)8;apf5?E-Cq_P)RPS#papb@k zu73Py!BJSQO)~m`_p)j`3?=fU3)YLUWuX<#x@V9-x?$l=Q=w#pL zDQ@UhI<`uDB{|7!oSLw8njPOCY2nN>>77u<0HFE^j6dFeiY%S}_285?XYQbwcVZO% zMY3wb2$~8nrrF+AlBQ+{U3dnxI<`QX-gU3DWY`7laaja#JTJOp;+JmI^w+pa)Ju&; z6_?nG^m}sW?SWFti{l@DjvD%rnu7}}qPJmSHS+>!q=^m!EJkRx2Lb31w$QEolOn;+ zy9gTwCFZKIv373oBSNo@5~`VTX82XU5xEk_;nce?YeFcAZUgfWb`GKb$f;qoF%H+f z@Zm2wGY?I3InAc}LC*X9)w%V2_sZ)Cbv%eV#;Pg1Q;f|mjPRc7SlB!xeUQ0iB4HMj4A6xig42n|8biXWCAFngMFzJHQvKKWvj0N!x8nZ`f+N-8QM*?K~G zXy_vdi+Qy0BeLkf# zbe6ceo`0*j)BW0XNU!!bRS=@Lvl|yJtrE_7U%B(qMdYjI+2iQjFTIrKIug3UIjaEh zUj5l%fmU&nxo183Y0#r9IVVWni7!-Wt4IlZ_il)z$btKpu82?#L%+Cm%wyJB;Vb68 zw>Do?@#YjmxO97dTX|q)lD#kLds-)$yF+@X{lC0!PTCI53?%MJtXFf)>ypUbpaRP_ z1+~7fnas(72Y>LAcY;MdHlOrxgO%3YJGfH z0JX7P2+;2csmYr_=9O zoOc&AMFes59z#F3_J{XaeEu<;|4el|%ezYIJhc&^4-(ZS6;OK%L>|@iC1gKv;cZme$LulLevf#^sM?g_<$TOK z{ilxflSaCUs$4J46+kX>ntsw0pAl9RlffA?q=GxAz_QV6$1KV=ht?%KGOtYGZ#mzt z1s7=P4%hy!fHd6J0`^&~+x3I@KAHB^K>6Wb8`R1di6g-b~>~-fq>+3 zm>PR!`2}JfsO)DnncPIu>`Bb5W?YG|&xWDVHI&QRsy?}Fxn`XYU7`xqepo#-0tz}P zEM3L}GDpU{_g{tiCA_6)E^w*=6i?yO(A zUHt<&86WXEDvNR_2cQ=V`5aq2Fjxc7j|3lihekrxMpvme=AP)QWEAH=54trj2P?Bo zt&x>`S?$nFY^HSCW;DOXO@MhMqbvw+Hu!fqngMB&Q@1g9ezg0o+aApw5nmy^N)9Pr zlwwY5tG}5On&qil6|w;0GRQ=krQo3pBCJPWqtT?H%zD3t>XsrhTiU#qLneiW7I0Yc zXM5MY-*pg#_kLtuI0Y-Q?{V}UgV}N%1zu^iK1~=hx*wo;P43;}n3L7FW9IDjjGrX) zt#Zk#mi?$4Y-y^;D67-tV29Bn{%-YcUS0O7o-+)8)Ym~`GQ<~PYtG@O{%$Hc!Q&|20B`PZnw1WG-wWG70;p!9G%3cYcrmX#zIcB%%^m zX04BdJRk+A0QZWQ#gfXfQ^g;4iY-(xiEPPK%J!LFR?6fMpKJ88dzDtQ40}eV0g^n1Ri3 zQA6OBbQ|4gi&rqj&O*h%Cea;dBhCS5m{wybE4^cae@CEs`1`ZPGU7Y=7}h!B*ve9V z<-O9`6YIARll^@8$G|?2_~n)iYyEW3P4<7<^YZQ8NG1QD*slD-R$JnwqOmo{HQBER zBY@pT{0+^g!wPU*Er*%y6WC2nQv3B=o}2Tw0SxYPS1rpsQTdC<3{Dv~?w|~dN%N^%;hi#R?DCW z_aKWD`W-HR=o$R##m(An61h4)hO6Y-MNk2)M;1?UwAkO zScHL@ecSArcJ@Gf%h30*o7yCVBc`YpEgNV%JV?gp#-ooFZ4qX!+N2dv@@dMXZlF{# zDXG?V4LaL%uR_19=uRy>{#H7q%lPO&ZuN zVN4VOD^AfWf6FvI0rt=@N|H+HP4C>3)@{7cX={oS%FpmxR6vpB$#l$wrq?c9Vhl8; z;8BvXvURFQ(rU+;hPlxJyG`i;K!Ut)b(IyKxJ4uAeKaqm-guIUpK3casgtBAqadA( zL9mS2(i<g(g%uKQ@;DoJUjkzV%9$Bvh9#UGv?%(czDfS8Lf4Yb>EWtdw4p~(YMNPS zp~ar}p_&6d(PfH3Cz9r;0y8RQK{cfHpJ0=+ClZfkqddr~@_ir{6kvqG`(U_u4S24 zY)NYxetmr0@4Lxkybf$*uF)Qh_3;;$UAc5!&=hDfFhWZUUq?&qkKI~jNcK&-7&76( z@V#rX&DIc26@>(4P%gJPq(KN;nsG3SPZxnG2Y~030U0I$(z3Jn9ES}*OUZt1e}4r$ z4)e*E+%N}KPU>t7FcyY!#8B*H0L{+<5q?vEV(Lo`_fu8Jl8mxFs3~aS2p_tMe=GC` z0DMTf5NiqxPO7SGfPcd!7xBpM$}EL96#A%H6%;$eO!cU^! z*tNqRO2y-dx-gJn*Z`C=MmCRVV`WgVH0hU$ZX%cFM=1Bt)&;t+^Sf21{b<-u4X7Lx z@o8gQA&DfGT$v6@rWY9DgC8!KX8)BXE@YF*OUB7194MKU9#{}`!tlS+HQrau%=0@^6X6qf z+led$ojfWhKB0M9aPnt(Mtk=Ff>PO%B z^V(Xsn(y(-%=2Rr1Hgl6hU1Hh1m$IvaWTg{|CKv_oOzWy_jD5ciRZ6Gt|5qk3#yEc zY^8FjWRR0ULu{|X+qfM0{G&6HjiSV8KRyIV0k|$!I~Cc{?GE1AeP^&Y zKv*X9$}6K_NPG8knqY7Iq4afJXs|G4Oki|X?O#aTy?s4@hiVec`!OB_J^uJ9Zm{CP z7$W^OvIKOgkrPgFPXCV{*OBeg`uCfed(cU?6Ny|468k$%0^n0Upd0L#z4C&+5R!Kl z-hA)#!>m+Ug<5_M)9bU~=l+a0n_igRbj@SACCkXqy9xsAreW$#D~q7~@s7js2SK=G z{R=5-c7ttD5NXuV`d?@^jg}UuL*tn+sScG`u)j61{a5CCPgsfR&CH!jNoQr##~*J4 z@JdVzY}s5&@FIjFIQ}%2K(l@dfmIxkGX?hmUM!M=>=b0R)xz))0sqt5Qig4|?|ay1 z(HX`iQ~KTs!3!UR7}`>WN|VVc0J(HLoz_H(c{G$e4aUEc0_S2lqrwJ-h)WXRR(D6guaVt&wC0AG)H$0L9-bUb{FmdAxAlo~ho8*;Ngddk-na~$`UC}` zAm;nf8m8cjd3_Ltkb{Lv0S}ar&Jj|a2A@kn)&L_#?{((Y2Ff9{8*4hzr5kn>SBR^r z&c?ELIHVQwwC$1Bg}u*15TVPTG-^`!WdCy+9>YmJ0|LD)C%62=JXI+0vpVlg?EBR; zTsRoycXa4d4>cA&pO0n^k04e@2Zyh(?k>377q1-c6We?ihO^TS<5iJ7cySOJ!%QiS zhAs=-SWs)a=vxtm+osm%9JEMD1|O)Zq2%*{cER(+hNP7dlgoGFZoJ!n)#X}4%HH-U1Myvu>LJO`?9 zlEm7@Nay$OsN;1%UE}v!0f9#E2{WhW00 z1l=fYCae7w&sT4jQSq_#`co-qbKyTzgq^&E55=vFnl=yLlRUe@mH*WfPf({oUva)W zBb1ux*S>tL7topPo1keSd$<;XJCB<#Fw`AN_-3me+RMxbKwRuarh$o^w|S34^Jlh# z`s&f(C5uq_z@`eS?etgPl^PbGWU@#@V=+?c-^r>4Upe3gn$fEXb-_vM6q1~S_Voo= z5_VEz2%UH73Upysov>%>1JbM*@DiIWiMT-R+ot7#d|JjrX#2kdjPh^K}?yhLxcjee^2bFMPZpU6(>7xtcJ48+k1=kb1Z zh-c{Xcy93g;)VSm#*2qF+-UzlhYONbIc>2N?|}Sf)kGmKho-AL0&#Lj8L)g@BA%-o z|4U}tKL2_eMS~p$ zxzVH)!3VWp_kjtDi<%T8dxdJ8*GCI2YwP<|ta8UwWxw!AJHVGcd_Nvh!A%07WI5Sh z?USUCtBp#=dgEY}4rj;Q=syp3vSbYf>1i0wxC)BfjKM{T{-)*?a^!M!9Uru#X5MZA z-`9ngMsp_B0pP+MClX%+QbKJQgnPSsNSwiH%T!Q>u9Y0h@Gk5d71U|O`!6~y@PWrt z_Gx-h5`_)Jn^213BJco%!yktA@Fu>hAHmuRmw7YmQ^fSy?lFiV;~@j}at(o)rC56MLIuv~`QmtCKa)sxAw*-nb~+aH&Or$k#01xA z7d8e}$&qRIIyu}o>U&e2S)*FOn!%qXuD!lV1Js%ll7A8MWZO+2-BH>0ULo|VoLPN= ztkaRPDxpr9;PJ{d4*k83F6s#OH`ND|lb z+8CE(yWXUC9sayn*XbAVoe;|!;K5FqHvQ*GWVfx5(h1 zrjFxYsgHupJMpioT>~z;BnQ59A)JbzySoplELk^E%l!j87I3471bl+9yP_))QnW5p`d^FGf_$mnj0v{3K5q1KxmyA->wsc|0jGt6gGMxN!GmAY%Biw4k=|TKec*u3^5pTKA zh|@51_f_H1z1oA4H{RL?9`CJeOkpq0aV9vYQ5cKnamOpp5NA1Fa=^0Q(QTBFo=Wv) zg%>&tC<@_XQ#8cRn*%ajXm&9v6ioFh6~ckBVD=7kHFA z?WLQC7VD)op4*kS_*2Nb*@DY|-d6bFTH-AhS;-S@g}XSUF2IU_vnBQ`y)6>cG9T_M zm7DUh`0NAmgV5vuji zer2z*7uj7SY#dZN`7{aXP+QV^Qvi@z?@u-hPGK!wCBH)~X^7F_rH?8YEpAjo&2qdl zp|8zVa(KJ2_y8D6Ca--)e&l$}^FR+{;l3J{VJ+zKZwcH5m9DjGscI-6BzL-92QC#> zmUSu)cM*HsAkd8=yQ4|IOe^vK#Nhnwk%LP=q1ifw+p!J>YL@9FUI^3pf3C;!^gaWm z;!ogp#rL76FJF^bn$%ROkXxE{8M^CQOe<0N$z*k|KuM0}YJq z=3o2jzkn>*z7$Nj4RLJIwqzp@M-n>Z*fHjmVr=t?o(2nLZ*}OOzD{*@=Y3DQK-E1- z-{|(uco)}wZ$x1F{04R5kuU8F*7cWuH~;l!yPnOA+$N4b*0zutgbvpuxp~)=FDI2g6-Q{_0Gf{-o^mHTDP6}q-MSG_WmSDB{G7L2*fGd!29~%vj(#G z-*Avo*gv+U%Rj%4bb5b%xV+4Ro9sM1tikA>%|{W@3In=_=pUs@(Ptv%f4#H1U*Pkf z2(6B=f1m(r{fh%(@?fsoOshWa#yApaUujs4g!dnVpUN)zF4rjYfTB?w$s|GDq z5|%ju8}9Aj5o8R=w%E9zNd97Ys>KSfILavsI*{SgCgzrmA#=`8nL zZkgFgReUaHfm=VfslWGd7b;|E{>x#md$utUd>CFGX3hIn5zUOUCU_}+u&NRsT7WhR zglsHR`d%T9BqZ0X7G;h#@4Zx1Ho=9TCxIRVpHv(;-0x-(q?+gNoj#D`l zSnEeTGoMHdIhI*4_K>&9G$S20CG#0md56(>HpE|!K=Rq{Qde@J#z-zycoNIsG5>0max;rP^$#@!f1w7D<|?B` zpL@I;ukBZ~^1W-BJ-(xwc7s9gdxIuF=!Pw$b-wG#%bE<(?xFvXvq_z1Jw{H14wRcE zy?`&VOC6qi;dyGI4cJ@?SgF>55n5UVd1Rsl^D3+fcy*iak(o?45*9WuiAsudQ!RRt# zPJUz(ujEOtNFHnvl7$w>!Krr@w~tOEa2Gd20c*x!W6&v64L2@rq1m0xvH#4+>~~bE zSfnye+vst7Iz2eMc4_zsDy-gk_pH;Onq(%v<3sZ=UMcN2oI@02Q(N2Z#^VJ`Lj8B~Bu-nguq@TRCt*K>aeC&NLhC^0K z7PjlWV#25{9^4`Ry&BEu#S@aEZBI?U4Kn$Un+lli1Y+Z3NbEIGBJ&a^?&@F$#TE09D6d?lTOjsHpge!_ORk+xCWy&}WvYB1tXe;?-- zvWQl$PgE>78lb-$8>&vQxX0w9A8x%<$xi~@RESv)lw06|-cC7mWmrl67;Z$Mm3> z!4=nNdS>uitDsAA4)UB49y=AOoUoz(Y4G8zba;UdVNU;Of1Io`QbjDjcVIADuW+%7 zU{T-u`e_>!#r5z7o;w-3D2wIs5VKk=*R*UB{ln*$%^Hq3*$QR!Bcmd9sK26plr zsjQ}h(bOw&p>!VAeGnuA4^x^7sdCrXP2eBLAs^8LqHk? z>4rt6Q|Vqoz(P6vzrA zbKcB%MZM0Z2#>Kz4!_d6fxeDJp*ch;&t9lhUS?d*+$29n4Hvj2>Wp6QnET?at?KR{ z{_^!*cx$$nsu4%)y#Meq6U^f`-vomW-_V{TyKZDeEeEax zho5zTK;B^(Q@^A4%S#rjOcx;HkuYf>LR-*8^vFvLg1SuQ6|2 zC@ycDH_SIwhnWgMoms7@umwoqx5y5Jp4=bFVf+p7B9hp#rW7Ww8vm89Vs&2PX(%u) zo!ot8r8Q-=i^C0dqWVx|gLQNK`q34=nUdz{tA#hj?MCZ$q5z z7k32Ckbn;{rpC~`CWzW6hAN-3N{6lRKB|-o_0FA9{FV8v|I*pD^GhoA%G{OH*fM>8 z*^pD->xQ>4=N^|EzSRKIXk4dvo!KF;1;Hq2ZOBid_fhK_vmQFLWy#k7?;mGCjt@(P z-^6#NLeHwZO9XidHstN7MlEb3kMXR@YeWj-ZOxX&Bl$Dlu$ko%!U9*m%euDPd`IhmuZ2dPLug!C0yQP_$a;DyI^OWgb90^z3zl%cA5-dOf z)FMe#WaoBXKz+kCyN6gR_^D!XyVHn`;+D1ZrSd{XCNcG!;PDq60$)}W+J#}J3=q~^ zq27~$6=jW4ckOITfC*FSBvYt@T*$>-7com~FVL36)B?Q*Oh zx_*s~?~XpV|8-GCt3QsCqJXdllLRE{NePm4Z)8akVMr>#1x1i99-_d-`Vm?K_W&vZ zbi=ThLj*=i7JCtUKWn8MDA)tK(i@k{tNR5I(jhpV_246N)GyH~TfA09*4;1AEN7h1 zmQd%#TYXjhEEwn?0F}A5BUVJ?9S{1l)x@(9Fq8&y)OSV=4&q3sbBxos0uu@LHF;8a zNn2E-Aj-~~FOqVnenRp-yHHP6YGO&`1n zt>ydTR1>7804eha5^wM^VI0^t^03hP!$i{83PZG&4ZH57aNpP8xO1+zysbOEuBKQJ z#h5p4@)=CkLfL>@%JKkJhW|U=C4CSvK-m1Z_g2H3ZkOMQBAg8$RK(tS3y`CFHEisY z%!GB#0>uK7pQa+UfEhCAWGixjX5}#Ux|1zvVRk8`#r9jDSMQUL$X_i&{Z2TMvsS{9 zS65d59)huYM3TJG*rs!NsqD~U&PIHhN;_~t%7y}dn8B_!(zw@)dIrC(1~4jmQ$I^5 zt$t#>$cUOgy|LrUR^oZOLcY_QI)!U^6Rkv^1iZ;;a5r$nS(Dr-AFP^XvSI##Ce>~J z{C5M8o#CBRrlycokM@<%3|)5yoc0mo9EJiWTg5}((J0$&iVokp6)KK4z)kF_-P<_wO=Ir339Elj;A3+4+p>-L5%?-H>qQS*@?;U=uXreLNf10Lj z>7PZ$@td=!eas)tc5a`ixp9IX5oY1}@kL^|RBGPIKxFinVHh0Lj!xeYXxwF(Hl#*I zc-99qWUP-}Ow6k&kltj)m8IDwvQb3^$)x^JU#zr{}nI7{<>E&&DJ2N z*lhAMBkK7LsA#&2t?ys2-x7U&N2wA2lonwMkgI!89|`kgAJ8$_{e1G%>Vct=veQmK zdPJzuxFEJz2ufODyVJ#b<3Dl0%Pc1PH~n1CuS;3eU|EsLD345?gzpaMB1W@h6j`fP z6{~XGTj+qn0ZmoRunZ=b9A%&Pn4d6;g-r^6r(>W_0(RTbn)jm#G`lCxpdQBG zEgyOIF0Yp-%i!B6Tj@HLtK976l)WQ`lY*=QND-(!<^{a#5C_lkW=F5?LSz6glCv!( z@-rKu(I;_*k33B{o`mm75gH9cf$`ry;8#^IYxMljCkS>7W;}tcuSv)Fa zfY>&lfJ7MKmIr+FW%wY-BxbBd1!h%$-1sj@mHj$0M{t3=2ERyTorU zLYNS6e3g2Ld0YD7k31Lo{_f2~<6(ln_C=*dTGWf(>fI{zSJLQ`3oWRE2qZfcTAPo{ zSz~@gjgl;H6&}~y9l-Uk-sK%cX%fo-z-#A(;@llzo>feV<5J}<@)33Lf>1&113SOv1DEN$rBGteaG{=T8l8E3*5yAdYIf%guAyK1I^rJ z7B8I!PHX?M_}yU1bbs*}Ve#m6s^rh#HqZsC?cz@((1gMSm}qFZms1re(aEYh3KOR&3=5oarwR$tllsaF2R?(XSFKpf!P%AjE+n<9AA#8o=iJA(1WIuhBQm$v2n75vRNdynGuR(({4$U5KfXo-D@ zJKM~UW{>Hz9BTf@HN=|=AqRj{bKM3voS0wf=^y8x{~g#k?;GSs?oBstt;5tJJd)#>W=cl%%2kTA3?E-AM z#F()fHmWbTj5Gv#M-6)}SZLN2yvAcj`#PHx`AvIKeG4avSKQZ^R(vLWX$=24Es4^5 zn!|tY+s&DAe2jet^8nt_YlvsHA6gE)I=3kr6fS|_ZlCTjY6|(pqT9*NVYPoNW63+E znIe+2N8b+KArXrf35`s)0TX-$kt?D8S>GM^XEP#d@KmBSKt)%FkG))Z7!H?jJ0P7H z6sE(PJVD14-lWUv1)Re?8d1f47ZaH=k{*ABu#t~~mMw3Hzi*TRq(-fH0HWe1-8*Dt zBr)6?UnUxb!{=1WbQ7%e+a>ZI=gFh|c`%A7L@3V6lYWnA*=chzLR7o%mOT_n`=ULm zogFuZ>u(nUEr!AZ3_!&EX0v1xH6n79&dCVH%sFdi9i(X84V7V0>VRm_B~cWz#x+q(9G(2nwq zpk-Sm#UL|}0y zlyvJ*o(;3${7VK-0I8&cvgN9qmXY=pH!Tw{XM}8UbksIzDfb==zTG67y1(&iM8B{D z?1QnC5E2O(0qwyCM_7`x~l-qaQy@4dU$>du_HKeC6s=n1^o}IejhmM*MZSD z8-hoZPZX{m<~xIB!D1>eSq$mk2 zT%7$=OaKU;%fs62tx&uDJ78{epD8_$C;)p?F=1rc|C5jONkti*oN1=`k0G5J$n>8l zv;6IVTI{H)bX_FQ0BDtGwX+6@l@v1CJ9(i%X3@+mMw{L zx@#TMkfOib)z&nnFW>xlJ04$>B8Kq29StB(^BPA72pygowS&EVi4j%Gsn=|8-|Z zx_rI&a_zPx1QqXZC~D`ewKnIwOeea~7Zy^Jc)&VZC?^J}ZdIv4KIAwO#~T9n`LK&r z^{pgoXh&1jJ_?|yfIHoMY5ZU}|IeV~qYn8DDb&UnnC@ed@``y;eXIz=m-17_7z92c zd^8CpD?x@>;$pr-FWQM;ae2V7-RtPp!1>g^u8DF}D%7I0*ce^$Vt4nSGO9TsBb&kl z(3``x`5~M}DYi;t<B$<_A0k^2_ zd!kLKei!$JFyL8+U&+G=nEG~F(+wl=hFpD17z|uU z1Lh>bRNf0xj5*%XbdS6IpW>?x5bCgckD#tpng4e{M3X?|efUad- zK+j*EV!2T&R9?4kku}6|rYF3f1e*2WE+`=&Z4Zq-`?(G~%d{l|sS0ZZ9^qdx zp~pfP=lS6Yc>)Q99m&~bJl__}tT?hSCFWywtz(KS)k66U7Xoj+LjA_SA_HLGo=k3w z`z_RNm|DKfJ+)LeBuoT14g~aOVw=4X8NqXd!cqxq!#({JI7anAqKHG@LEO=$>K!cC zD3wf}29_`tpKl2A%g}aBV_UfaR{P#bJ6VfZ;B^ zR`MI*B%&<>k7iza`mu4s`o+W$m~24E2fWFy>>)D7ZH7h;M0*Z|W}y8AibXbdvhX3X-pEtaNwG2eP>qh(2O%oZ7B9i zyNk<11ygJ7$c++rUZK2@?<+O)WpC@-AuDK%E-esmyBgE+C9M6I!5^1%2Av!cpaRr! zy6AAccXz$F|FRq@0M|(nkN+0!ul2g#d+F}bq&g&{kyI)Gy*k+TqTeigJxzg`9-7c| z9jta54lo@d{`c>GphoP%gLTodTkc5p_A|)*M^SXPi3} zs5&&8Lxo!1ta;f;eDv0*0a{wJ>T7vImfp4@|7(Z@lb>T71u-h*0zQi%{8N0 zs^u0ze(*uaummSFE+yl0vF%GAVXKRD<1xZis2au4g&!7eumDd_{Ck#^R`|7c(8=+# z@!J-$D=L3rh-Z6FrNgBHX(?Zy7#(Q%4yRJTEGn3}D=B!2yTg+PQhlFrJ`Nn! zS8%vRI>wFh39qv_5**t}`^SWilfSdO><9kD_`5o0QM(USd z0{R`DUaQyv^y51fNm;YoTmbOSkrZk zBD>vx8W7ah!D=A?+oDlU-(6Ea_0Se_e;{s2S;6@WPJ0~nt0eQ*zy)ue_K;+rH4cp!8w?h5-+nIGd zUcPRW@|e28_-jj3h-yX4Svdy?Vb5Er(FWnq*j!dj4I8Mz2~;qLLZ4-?tt;sES7zZv zO3$y1SrnZEcGzp1MjvD&PKfBmGZU{}2rpWLp9+l$*c{_hD9KNUzD^cay0Fvtn>t|0v2v$u2<)?}fcC;!-gg;_Z}fXT%-8VzMY&N_I$aXQJ2D!e=!%o?|OM(1n+k0;l zAD2vojXTeAH7!EAe=n8|@UDg$x>7bMAh&e{vQ@~wtMYv*yxw{_$_SYKLr$E}CvBkD zG|;8=LphQVBLXHAQ8!(!L+lH-OwN8`jK)D6Q!UQLVVMZy-h-}w?svm3tDEPs6i~4k z^(yc%b2^PHQj~ziFg41c2OOu6TVCN$gYv#t=nQU#{6p}tqx?v0;tb)E3YupcP=$&O zRCYSjaoF16G^qG?$dv6Ni)98Ud2t2c7f~#p_~?WTqh=j81qPM%k{gx6DV}5!2EDl) zu+eN)g)*V;lY}AX9N2Bz3*#cZR~QoDbI6icP2%oyf(>RHcH}n*$RLX8u%{t*mu+f0$XUYc!yL1< zqcTp!-ALrHcfS98qJbx~rRP0A&*o$`4f`qq8V2E7x;}p}S)d*vU;RmW4+xn|_-c2< zPKyHIV)#F9G$yh)+`qRNxq$bPP&NW+r@rplJ;}3*sj3pIr|B$d_V+4AHFvWWeCykp z!u`dev)!>9l{I*Xqoch&g7pHLESLmhimrAqV=sZr!^$g6xQ2B&k{Vfb(f_jjKDu&D zXh&Vj`svt_QqAm`zYl4yQ6rOxga_S;S-K*~;AlpXI~Fb6g*YVv#9J0X&Kwn!)0VFy zls3xB#Zb#Z4-Gr`d=T+5%IYL$aF7d>R3N>L0ngb$8amxfv86-oODEgC1@aynGzIX2 znIc-OvxOD2Jr{a{RN4jj0W!EE{VY z5;?BUeu;W-o$End|Gwy?|1fPo60;Y}^0|*@2N9ym_OH>5Sq5QQg5+BZ=L0_TAqG2T zY03}JcZG~VxJHrKILHHcuB!qoNUViIA@AlHFdXPmI;7+HskY05Cr(8nrvd^)0@IKk zC5{m{JGP+{iYkzG^Zl(_RL4Gjy6~mg?DK0b9IlX*NP?h{=Y_z-3gxNo)s@N2fU>df z05T1l^LVhaUL_4+(czquaauA6*9V&P06fHfk{<)mlZAG%m7&8;c0o85T>A8$+g#IY zF;6?X@V9GHd9R*Y!B-gb4#iJ?$bU8}o`otG5FQL-zZErd00>lueYycKdMe}8t4sKr z7=9ZCaH`;M599Bgyfs}BbcrK?s0~NCZ`$h&f4(gFDm0qqW;(1rf8M<;bMo2Vfo%xd zntE8jeAclr0RcEgZX!>Wuk9{QHF(-TK}dmLVEL#mN=;{%)UU{4sV{%j6rqe#w_DY~lXcffSN| z(|d_{1>unqA@DtvCQ3ZPrYAI(j+?zrGJ`?EQAr~&U*VVs^_y>&Vm+3XZ74XAMHT=w zL>m{|fUD@S(7{XrIOu%*;YUsA68LPPlwRp=Pf7HMTGERG(xx@qr_2i8Ws@7vpO)$1 zJ!U)icJRAhN3s7ir_}m)IQ{Uw3K>gHf3*gsHN&RBn>}rZjBq+XLYcuAYf}{We;LJ! zKZP~Jnd6=n?f?L+VKO`3IEWH5qhEcw8D;=(3}+T3Hpto$_Ok+SD~P66>#gBM9xn%k z-{7y{i;Cx7b#Qo1=Fwu(;#Zp-QqKe{^a87q+L7M$-ir!6r5D#k0e^V`0n;qDp)4pF zpnl)G%J+Lg(Z*D*l$z8^izgQd>;Qt<%^>GfK|Oxs*Zc40VG0k0pO%OSoBy^-SGhFt ztVb6El<4)}O^F|}3x4@hJPuaBOw9jIREz3a5h?S5LI?oP&ka`eqj&M^FFEha-wlf1 zN(F6xrXHlVNquW3pAsh+R$KB2+9!vfwYVO)I6-^sPiNDw6|q-BZXgil@k<0z`j*dI zxowmR>P(2ik2Ey6eF6}N{y~B8?RZ0s!dD zN@I0!bW(wjVL%snIDipZ%uPfAayg*ieid4yJw!~RGuOoT!Rq2Yyu+Ilr2=k2Hl8Xn zV2bjprQ{{4IlnT)B&44^#{7j0I6GrOWjWJ>_=33DooeQ z#>c69L3@CtcK*D10N7Qdf)F4W^&$46gO{(+BdOY_pJnF>x$^oa;q4_#Ho0)4|7}880T@dS98CHq zRrv~HP7vMkxOmV)^VwgPrOvwdx8t9rik1*bxJs1*-HV!24zqXSxxhg7{gdV*j zcY1l|2^$W-$Zr9N03z)5Tg^KThnwyQ?*F8f2IW7LsNWMrZN=Ecnd-GSt<AB<+6jikLO-*HMw74;Tvv!br?qLq4@ZeY`@|?DsZr6@V250yL;t zJx{DK5M_o+J|}>0{E;HpHrF1ax3ZzYWFzB^8aFtxf3P29+UmYc>fFDSyjSff7OsX- zSvemjeoF*GL*wy_4HwG_wnsq@l-_r&FN*`z@4T3Zxnaj{!7@fS4b5R~fih_<_~Wrq z%~InnN0Cr`R#=H6k!PeP-qeFdWJCUf+}h?UjUGZcgGd7Oq5#<8^BOsFn=SwwBUx#Q zp#0oiox{R9WRf0CY1GW&tagF#7~AcRuAua9-YdOezyA^vtQI^mN4{|1d(Ahx#FyIY z^|T8kv~OAccbx>n9qfnjI*JqUQ~H_WM{lG|)1bl;&~f)#u+t&{0Dh`d^L-wRtdG&@ z=RUK5IGtf{1M&9PlUXg9KBdl{IN5^B&1t`|Tqgn}|JA0QhK7Qz_Vx>>(^vqiIN60R!IOgtdZo>SHxo4|m)BRaUKUS)Z*~u?CVkvQ-RN&TZaGH9QJCZ6Pe$FQx ztG-2$<4KrrONY5f&Y(q*S*%6}hqO|GSpG*+IsGmE2mHb6LHR<~#UF1?T`mB4D)MdI zC5__upu4sWftiDO;LcFzk@;BYzX;u~nJTG0OKLRnX;P-9xw!vxb~TxsDXfX~4AFj82Z7C#|f5+#Rxa!iKtIx!aH<^&i-^utIHo2$k z{;p)jks+K~(i5Hak^oR=>a8@4vfA2IS$alR86Fl7!b6wX8 zV$05Du}dbpTbnV@a>3N=#^!3=fSQ0Z2KNn&#beLY_r{^oPiWsNoLFE7mcONovA#f} z6H>Jiuj-e%QSIhmz7quqR+SWdX|CTRnE(fIX{ca=iQyCbNC7s*lr2ojjs^lLaB2Lh zMoKBgPQ2<-gH!RGa|A#8^P^8BCSS3^Z=Z1y5N1Ht+?xeNt=;PuqRFiY=3VVK4g;uu z)g@Oh{rpO*QCE3g!2P$G8}(u>Wq|iyT66D%9WUaV8*oG?h8foUa%nsa&3{A9kN2a&-lQmS4$gEM#u@Ld;pNB5bKxYb49o%G831X1l$GWb~JyzP-i#`!uG2l%p!V7OU$GmUurtg z+t6&)fbWgr`27yxr@Sys6sn9i@wsR75+E zASt%8{QB+BWWiFA({8MSK6?yIbbHP?F~InVd_S1SZs z9>Gz)kY*0<>DP4^;Z`;ckM2Fd>X3E~M^#9F^FAVxVD93`UFD@<#+Z5{&d2o-AO6PF z&dPGGaHHOdCHxRNKai`NIB(jWypsz!KNB6xI_VrD0rfu9)v43I3v1}|9A%sBmYnFV zTH|1}=j5)?rJQ^>NTL>YdFOXd;=8hqj|afwf29MypFH$V^_Xg$-K5H!ZTm5J?i{{~ z(Bdf+`$SXIOJe>bPsvvfR@kT*jB+Pcmag*lISezs$AAAl@dO>Ot-ynh1_2F8DQWt>uB}KqtAc8Y{N9)T1_xc^Z8(Wx9@vSe^ZY;L~kOJx}$cTW)>$ zcUzRn0DCzGpAvw~=yI``Y)DnRq2L6qY_a)dzGH>XO?w7U zKK#*18r9VE8u3SQ=tr;IsyZ$fcri(XG0lpc_)%|EMBkoWUKXJ&zVmK!F4N}&MlXz@ zAA3fY0~xk0G2D{upIrz$Uh5l@;LrN>wV=8FBwZ2S>uOB)r%as{|M$m@0 zl8&5;XKMWzUF;fiWxcFMXh^z-WA<~i+kK7wDRKc_i_3OajiAtOrOxj1ifK~0fKmw$#+{? zsi@Rd@kd`~KCqb23L{L}w|Gz4_Cddz#CGw3t!KONn`+)C-@cyCBRwD$F|77;TM>oVG1$+E_Y#YoH~> z@MHY$(j+pBJVWtHy_(LZ2;jkwqG*KFfB7Lvg?Xu)$XG1TAXy4*hu;(%8N*#N@$K=) z1H=|H$iQUxo!LXzu0qTH{X=bkX8X~nxB(HY#yMYF&RL~isPnc@h`K*=;te53^Yg?~ zkDDlyU-t%=%h)5{$3+I+Mf#DPmGiVY$pYEA>7w`poDf{qzm*Mjax(2-Kb!PMm@pq- zJuE*Ql!kTCnef}f6xJ$G+}rw40DA*dP~}Ci3H!=qbfwjJPE*J{=(%d#nLPHXRY@Cj zEUy_;<>>Xw)ernxuw^IRx;p%#ZFs-lBCH4&4?&iDyOec|ln%7nV0%8W#3QZ+Ap@yD z<=CD{DKM+K2hCit_yx*AMat7(d-CX{FFpk+0rmtI=4o3uu9`EZowgylOj0>mbu`nc zvywURx<7H%T>yVlfACI>*apASR($6p_QLwx9aM47`((S*z9f^^i}E(bp*P_{61n=0 zDl)J{UD~Xu^<-YC!|&I35rQWzSA_h34l@n4c1TxVN767Wfm$#OH@9Q*{BW%xuzADMxw84dVwz3!aC&W#uPxHmA3Pa$eNb?i&Xx*|21)%iPF8#(+i z7U59EVEIym*JR}}k?*{yFn0t{ATJl4e!*=TV0rY3pO-Lx@d}qz-Oq9XNe*lEEbmh6 zF_N01r)q8Sv)rem%-=+v&6Y@yASZvO^3;4veb{BQOS;<)st)AO>CvGOue(pWyNjDx zo{pu*2#?kjZafbn!EV1@-S{wXo;Wqur|Uws`dfU%hqqVbeZUr)#}? zv6d4OS-aX`fst#{?~_i-b86#4z4jZmg@qwCpnaCaP9?Dmi2$I!PFh)wXT#wmt4%%b z4p-gHNsq}-KJsRWIhM3u`e5~q<1ek8>l@48VTsJPpGlKSly2SXd!ns4^xmjt-pB3J z<>*iVq{4r2nF|7e+@w;^6N)apsAd-M=w6Ui2wn07miEvY zd}e+_4-IJ7*o~|xMhmJUd8Z=WZ==Rj3*@^41ZB3y!iSB%J9Xw-`=B5X%#zl4spoa25uA;5Xm zwj*bqN>*lVz6|%Que;&ou9fS0;)iU~AE{9~3_qZ%j|69b-bOvTP0X+`R7^z{^POPX zHk+5WtH9Ub?S=UewS)W18EHz&I!lb4E+RZD=?*MQ_)+->RMRVmMXB4PJp$0aaAR&N zuqFtqD+&m_u!68V4^m{dcTQq_%&(e;WbAh)=pu@ZYPnZz>Sb+Rtq?2UeZgvDEmx^} zsyNe>`ovckV&4(u{pd7R)HOeEs>BQ6@VT183D4d;m8jnQ%`qNtSVk~z^n*SmrcLbX zJISDOm-Hg-At5+B`ImBJ+o)j#4?65mtq?=mVYja~oOtK-g9%a8_`l9dBMAEeb277q zFpQCHcu?SW$*CAP$)R#a|3f)2ag3sNK+$AfghmM!9Pj(Sdl3YzV zNpDOVs2ny?ia~Is_)hGU9t$`(zTi?v8-7ch6ZMs*TMIF$aKsP&QN=6Om{Is0ugL+X zFn8XGmr_YP^atdSoBgK$S3S@VjjBvSp%nq0+;=s~z~2_Qwae9}m+L&i`r3(kU2h7a`@gf=sp~ zWN$tDc*TXX%$CVDCZhI#5ymFVRmc6HX-C48ST&R`qF91>mb6}P$#1Q z+)F$$ZFhW|D=9FKQmVin%AYY0GucpHt`qB*GL(h_^$A3k4-OQOXz8l`PsI(Z zDYbA!Kkl^r+2h|R+mJ!hI}!@DDHCDL@x|@>HqKI?vCqxx38}Zxg`vyE(5AWQMbR+C zckpfB(7Gj>vu*Of``nEQCF~FoU~*)j(P=lgzqFhNGejKVdewiZdCBLvnqGpkrUmcv znu)T8IHj6ZG#ZdK!VP-;c>kc(oL0lLd0+lIYicwkpkp#v4oG?@xXl2Y)Ka5xh$~_& zUHE+p{@OeZyafbFxZ~6_8SuUWXzW9Du3pVXpY4c{$KVqCkBiGFk{xUBD?UeMDqDrh zObnC1Fe;GGvjJL(L1_yG72@3`I7tUaU-v!|!haKz^)!T2mBtRCJ1>w%zH?V%rzI$_ z>9{w~5OTu*9x(xV4W{Y=O$+63os8+W`a#o4q6n>cfSlsF7d)GJl;lDD6cyUX9!~7Ux{PLX8d?IyGqFVx$rVCVjB1#=D5`!l|oT=r%p2G-%YD zYnyV(38}sR1V?1=#93sasF-GBl949Ub|;=bHt_r57njHN2=E=dlKNpIkv2Kv7T%2)qzcP;p-jyYj?teQgFzl zNdZ~H4L9TU%mP zq^Weq$4*X$`*F$f(8FN!&T%`lLMspLbUdSap6NTA1gMQ8#SqWsuUGo#iY~n!M2*xQ zYrlBZcGF<6Nnv~iw>?+mkY+s40N1w+`3S%Bty+6_Rk7*r9}E$ue`P7HOX~_ zPL(*aFNq+lrWlp1n>)M4SFp23IoI@o{huQXf&33V1t`I*V4dRHwXM zrOtgP{eFkBj9-p@e%rPSV())<1Yp*-+@Fi@dm!&}|B9nY)1bZ4k{S>D$oRt4qXVI# z<+!G9D36do(RjpB%jheiMujniLAUWCCCOA6>CovBl@IAv<&%W?S;G4*!aec-r6!~x z)g@aVS%XTES(b%RLT&)hbIFh%GmoBb?C8|I@ia z$S31jW(Wa`*W15do>*sV#i7&p5uE^!Y539%8%h5iu<504z?~b#q(}%6!#u+c5Va{E z3Ze#xB}T<;On|QcoxVf#YNLVZ!q?-yMpAndPNqv=(Ii(F4=$LWUmZM8%;I)@R4I znf|Qxcj6$gPT2B@*Gb>V5!LFkgxr5BBOI?XuWfINcz8m>D~X7|1gSyC0s3&^pQYqZ z&#Z^8*?#A@tI%t*Gr>yaMx2|C{X!FcH0gozzsOjIZs&Z^P9eTK?h`I0$w(@}M3<12-?pRsY z1oFV6DGvVdAca>MQELiFH-6NYryZ|R9=tJ9&0ro97C>oUSrXn6SKP0li!q!!y)2}P zjy>C-aGeXbvl1jQw8OSGbiCZ=wG=kfOo^nBt`&w>wvzuS2AWEl%)@ZMCCz#LpZ$@f zf>V<&YT@p2-$o@0`y&(YO92344C4^)L00tKO2+tlOg4$0*mJ*xC??OGQT9_T`PVmP z!_lu06*cYamrK-2^KgBV7;~5v-LJo7XTk4x?>}Xu=VJE9Gp8*)_B;@Hy&|V^o!@k| zz(x&IXm|R!jtu0^Z2Satzws*jpLq)L94k?6m&H>p0cx7Rjlr*@Q!cZ!{qP@)B%lko zw`liv&f>i#o73YmjheoQn zThl4eW$zoHUqbsrNY@PyZfk)3(Ka{sy6|C@wLJcMy|<9I5gOj%$fLe*7Uee|ww}n) zU56a^*`4{8mBema%d&}jV4H5cMW~qFBI+RRdli~Q$15C={gbrsW1Q@tr+MDM_>JK& zczOkzErpLZ#@m@FV6iq;F~s~SuhgF%chxgGcqwF~E}n$9jvVj5>{s*N+NDSNLvz9H zteoguZ{Aha!#4Qc^65ACDv8}6-m|z2tcWYx+XI6^`ybCKZeL88h~k&NrxC5fJJl(Q zOcGBZ>FYyCo3*oV50?26lD90!R++3URc=9{+k_DQP?$mpA24{U+0_EU=0^QXjHdSG zCFH+U)Kl(iuVwnDq%Uz>>C?|c z`?1T2jnjr>e0j5gVwmv1z@>nv9m1j&iEI=f>0b;LpxEiSl8xW58_i!I-rA89(~{^9 zA6X%Ss&r{_%kB3MH-sqgy^#=z2j}XA=plY9_5UvUMGW?70)_246Y;XQ>8L2Dj)YZ^cebo!(n~OVd3;$)3j-w!am11~Ui4=a)LEH8${gXp zg~2q%OESz4tKIbTDZK6p)C3!3uv`K%#o>gMnVDgKcp2Uj-Bwe=vOyp z+6ey&9@M8Zy|GJW)5?#N$HF7;gh%(L)18y)X34bfkYt-kU!(s1WetuCDTc=51=4Z3 z;t}|Ke3PXlCrS3c#5dA>iD&R4GlUA!ZH&(d33;#EWz}5#+9CTcg3<_Y=IBnOb>n9R z3K-r)2Q`$c%QWF7j-y31z9UJb$69~#1LZebNo86M($`t^F2Pj z6l9fjhdLR6Xj|Ny8OW?Y88DH{plRFti)f!%MgMTWDISh&)n{#dRzked|JlO>s}@AYkR!Af4|os8y#fZO37uki zYH1sf8ZVUlD0&zmjRJoM^;bZebC&VS(*E6ty-Q2spXhXmqdbm*?f5jeSGs3axrO>> zJf_!rbhtVl{gleVKJJ@F`Q&>@=X$knE|Yfym}VcGmAH@%Pe6 zX`%!-YXhM^MZO_#d*oCCO;7r=g_UcAZr_Fz0`P9eirpuBFMpldOBWUFRK|;NqJDRSW1zrn z+KZqXF6@Id^OY;I6ThqS2nASQM(ZQ*5WbCRof-n!z1ww=q!f9A6&ZI+d?M5ee!}X3 zXKKwRH6-vSRyQ0j8CQ{&uHq2Z0Ovt5sGv@6A=Z?Q&l#Te3`DIz@V&jz?Ez{`cunWF zTS&Q~kDX>L@-|+JY3w(PywT6#V5Z`(e}AK@XWpFbUX0!DAYVhKyH3^N<+Pv5#6Lfo z&%Xck|7f}jx2T>ry1Ojh-67p2B_N@Kq$o(&f=ZWkvw(_-fP#|J0@6tLF5Ripu&Xo( zEZw``_4hpAKX7N}&Rg@&nRD#$mp_4ic)fR!B$c-03R2aiV2kdpPjwMnBZSTpL)=Vp zSS#$idA5BZL+-18Rl9=3va-8M*0EPZX+P(HKC ztqz4JZR@OoIq?s{^_ZG>r}}XlQ&OQv<39BLL{Zz#Dm=yR8r=Q+;(ZzZto@`AQFRzZ zw5>>v7^6(6$OGmlg(~PMhY&)*Kq=Kuf_xbll;)o5LY_`@_|W`-&-B6qyX&cH0JG!i zy*rBd<%Cd0a3RU@!sjDjQ-~%nZa5?wnG%m3vYDVqi!>AM%ZUT)+J}5QG;=^LJo_se zdI2yuWkn5mx`4{$ora-^4b5unM{dwGRUUCgOTD#INy>jKY`Is9d2Y2^P}#)Z3U&-S z8NXrp+WIzp&w+O5m2mG4#{i=1lyuj$f&6AFveh5`nlA7g)UkJklL*srXTo9E*oY3D zvddMtqM0NugnTt(no1;jG;}{L(1aXWOAqVlbO6~D`hwL zGqC-;zFJ2vT?~+_!{UsD1*6RpX`5v6XyRcDD&%}*M zfzI->E%n$*r9G3OOe$FJ@47uso`^7oHhK>O}Y}wij$I5c8>e^ zJU6)SUlho)DO+9!1jX0B?ry9zK8f-Tu*Fuqlm7g|mU-itjMhW74^`7B1j7Y@h~b=SE^#u)&0SrO zE3vIyQSl-?dx@ahjMZ*kHyYY6LCAXh z<-qHPYfMI{F5ZR;ocLR-ce6xZeP*A;y4uSr_^xUH>re5i^hw_>V?{~+x>-{F^tzjQ zg8Qo3Z~|3wGa%H1lC{t475CMA@TPf!X3OiZ6&J+Q>{Z=Y6)U@z^N~*!&N?eCL|23- zW(L!&7rd~d#*kGAPT#<1ivd6nb$G0Qa6iB!y#)fXkx7hGrppZJ!QjzU%Pr8s7Z;7G zH_9h5w}#8;byj{{kYZaO5QtlPpi3xzJR$k=!V6M$BUS31^-T%LxdI_o%Sp=UWX0$9 z0-en1^8C=WL{aI{kXJK5Rd8ARY8yOApR#udZ^7So90VZbqZjxHSFqgCO~#MT^?<_G zsLX-zy+K4>Zb-4l_s18lPYJMLgUAY}nmJJywa6m~VE_8a9jf1y`(XwtQLAt^v3Jel zZI442xsl38*%)tcHJtV18rFl0)aDHMeZmJp|5>1cab7HvyEfjC9l>P0#3rsDJcPLU zyD_MnaW_iCdG}i5?-9u_t(h_}JP`+489NU=0nD4^uc4YGDKbxN{F8nzPu=CvUKu)9 zUyr9A3w=4r*B|@ST=x+bdXB_v#3W^y{*w(O*T0(>kQ)Z>{<)u3E9>^T=25DTJWqA@ z+&CZkFVvv$vrOwJOBW%%>qizP6NvlFfkhC}myl?P=QLC~8ox{>Z1jL#l0ZZ+kVrD` zDMH8ekm`?+k$!!rt7Qq(V-#XW5vV0XU4&kyN!}yWNxyS@065txcp6La{CMy2 zE4D~iUiZUZ;=?D$jXBOqzXJwJU^h#`bS-6&@r+)r1d)K&oSib0Tt~WFqXTRT`J&X` zL65>-b!3btJX7gwx?~i2dPm+j*x!T`AD@8VXz~SwnN|nD`XB#>La2KJfZvK=TydB*`pSdsAN6!W6W%q*Qq4K`nV>OlIZ&DTNs+D+0=;i`m;Unu(E_xU?Cz(m!* zQ;YlindP(2UVXfMxu0*!qWNB;8x_v~yIC?>4ZzxiuC6I?&(#dJ+GH)Ic8Ln|eST@2 zdCFhA1n$cb_l5fiAE-(%WT8;mc^#TccV)S9xcX)9-zKq{MY8l%AbQzGle+z{5-Ds-s}TCfAaZe z+qQn7%<5}l>Sf%lqa6KtO5uDP-+fs`taCI`+oH*b9}_uZwrtF*l1VtctQAEI1tG?z zKW`hCMzx}(;+#YvR=V-46kwa<@9U*Q;fCG2Dbc;yTAusFl!<^Zot~3tLuCeNrDyE* z7!3yN8PEvV%YyA!s>$zvu|Aw4Ifb62wz8fFi>Oj~)H27eq=Oz|D)jXhBEV{baHTXm>xK*jvcapQ zkpOcTc`!A&(mRM&vLseaTdqL10S~8z&u$f0`f!-RGKzEuc$TSzv!fw=w1vngICmxT z%5d0m^odDbrEBtGd-d-U!e1Mn=}FqWWSmzFKxO=j@z28%0jsD3jZvw4i^*hp*!f?P zO2XCJQ5UmUXIX33PXpc}NgqFd!&&iN>w@8liFn12$R>*c4LC7$_6z7p*ss%hO>KFg z;=F9bqMsXbeI{iWroMdn(EAXQI)?XO{y%v1>pLh@>xEJ5ex?PHXQ9aDe!)QS@9`uT zHt8q8h>9!t;w8E*be@J`0@XgTYqo_TR9UF#!n+Y~0y2w=4CHM0;@B)vbs_`I2Qp&C zxmvYzC!S`!;$*}3C9x?}R$AioCCA6U{`@!FejNXr7_b=A(mrE{F@Hw^yE{{mPy~w8 zGcI4e^kL4m=%&O^TgRucBm1{3xwk?(Pv^y)_7UEv*?xcA3y=un+Bo! zH(Gl+OI1JIwM?jRj2iu#b4&6!aLw~1h4Q{sl9w9~`#(2iw<$?7c!A7+?^vPv_kGc6 zld1KE{O6Bcw=XTr5T+k&9lb=f4?N`l?zr3=jw8|Y_wTWKH01d1)NOz(3F{fX1ne*gn1$9UCOc^Yms~+xOtTqosq&7Z&`1fJWBX&zck`l;F z0`%W9ZxX7E?MI(pii{?P3n3|}(ESC1F^BtKB_%GuAq26036Mr(n4f#9%+K-}_t&zU zFZ7Wm#LZc!o6JlNiL{elepP2w!7FI9KS!_Esw9tyUtbLdB;ktUh#7q-d@H~bi5nCJ z10|S^vxQwK&_T}iuEpO|ez;p_XUSoTLvMGX0-kk+g-Z_r>DPjKbD zqISd&8Jo*U2U}f(UWVfrbIT9HcprIuEx`Y`)TM9pufflHJl{c-`44_tb+u&pF)-daGbL(Ic#CV}-k;ez z;YzHe)|Bs9TtxBS21%_!o#D*nqP>0~mA=Eft(`sbs4u%OWr<=z0PI5u)Gy5~XcVB& zf9SiUeSNUFn0gW7IgI!^o2X0l($u^3d>_9XaYY}gAwa{K{nG5tk|npK+l0|rM$@3+ z={FL$YCVC$NdJa1)%dR+pCE1OAEdv-f|-0%9^5KeIz-`DBI>+QyAPyDYKcL0XsImvZLqwe$9SEcG~)kCiLRB zJAL3irek^1omg$ymEDyAZFN_Shj)jAOtM$ThZGrNb$CDtXoFQ|i)K9TImr^uuZQ3T zu`BxbB5C7Ii|cCgRqxuWPm7AVFNH~>l$W=>t09dFAkgxyvJgJ){74J=Z`-1i#-y0A z1)8rrCv#%BUFhzBhz|YS_}g%mSLBz6+TArff1GWJbMPp?sv9&fefz0*wVh4B;S@y$WpH=TO#?&x(>v~3wAspws@Cg*qAAtyQk}eV4 z#h@5(=r6g6Fx0uu_#9{V0k;f~CU6VsU(%_EEMD5NASzAZjB`?)=$GuxPh$VDiD{*{ ziJ;yhAG58iKX+>xeK)x6d9qzbELjl&N*42~eU(|EExKOYKh8HLs@oF;jdLD<lWthsU3f!6ad~fy}Z)270%bzAj)4YkG6oAMVAp1s2Ba{!>p#*Lja8KUY zXwEyXHE)qFxV++l$VcoaqtahH_IzK^4eF{(iQ|zLyBn^$y@^3Tp+)~<_F@x9t7+AW zZF~vhfZod-Hw2d)i`1dG#*e(lR~uC*@qiK%sS0iyglAJxJ*N}?IW^V5gY>)F|A0-> zE_oSpnHng2O?q+$6P7g9v`hb_*2p9&1IsijX5HFv`rR0=Lo*%ZoqO99+Jq#+sMH7D z!RJ5y^F*Sha3h-AA$Ih_u>&8S)AzKNdqpR8cInl@8&|_YWEW}HQ_-gWFk4)`_zmB@ z5{~b`U%>+&dxod~RD39Hs~2@w7;&@k7G%1MFvPmn{PqZoYP=@Z32IVy8WqHB%A#DL z9Xw?7n&8S93ay0|B?m7KC5r-0h)Va${HVj7S0J}ICnNT%e9NGZy!Gp|$t?H_8Jx8b zM4J@2k)i`BO`zKNXP<>Ay19rBxm-*%zhSfu>7Ha0sw-IL6-~Sz$Xa;`6c&xpw7#PK zV-k#@T@hu-Z0C7ZWRuK?=q*~XcjRTrfU?shiC&=!)w~*%KRm*oYW8|@Yk5}u)5!E{ z=d&6)$26m1w(p`tdFQj-b8X$4dUzY$3@wEUCaY)eby;_uSP*8;Cct!t6{s5ck$k_X zNNI^=o8F*%bhQvws$8N`C#u}s05u}U|Do(H%$$=`Q|rUE#CQvMRn~#6^w2Nn?T817 z{ggF1l#8*)Xsfkoxhg2&A8$a24GJxuHUnZr5}8X5H=!c&;-_6WXn~W@aq_g_OO&e= zLr1eop$tg}U(^2LC%)e`k8C(=zg_GPamre)+dPV6FCVnb*$^e;RHst8*B98`cN*gqTd}fH-r(IQ3as|RgHb#6jU}8nb4|))XA7jTsf?-_Bz)|u% zY2@9jDnEA~`gP{nX;9F#i2qi_Me;N0=rsxU$|C9c&F$|^$X#*}JO@(kN1Q~ikM%I* zJQMqRn;Lg5>o(UH682h^IvoGv3==f5q{F*Fdhsk;lQT&u`}%5EZrHL>t~g@P5a*L? z6aZx^siL(h3Muh+|Hfb|ZYzX^-YV2MsJ%39nmtLaZWquSWg4tZ`IostunbVSiDo=e zR6L~ZbwHiiJ!ZqObco*PD`ws)5$d#0^}k9<(^&}K3yK;Y^`5N`mcLw(CI-lIuX6Bq z-+}rc!;8PgD{))KIg&<5#L9?u{klI}6TKwG%0*H3wK}R|ypCsa2}ng{g74jxi)mI9 zAb+z#wq*yl+vKZey&>(z5w~!c{178^3&Eszm9JMvBqVN+;0vgGHKa6>44dNg;J2CF&FU+iL_{>NAx$ z=GGxbLsLQD?%t4|?hq4pSg{be*+uQ0-MU3Gj3Hp zhe)rvZwuzTk=C7iW@xxZjIG(n{1C+)Km7y90KkSWdh1>W0FjNkW;4v8g5FxRV(cg9 z_v_7Xi+%(tPO2>j;Sb)5Yo!e3p<}je6E)C6_xDeX5A2Z>@cw;dgnZI_s|B+2A>Tj^ zE%_tm3K_q;bjK$I5M^z5Ue7@j%PpH5X{+i00kP{Z5QmdnpGl(<4ZT31Q01BgXCeG1 zPIlRElZBZ+kVSVKpK+zzo$Fi_3VJbfpJGuD;@U>~%zMS5VmgK!iCa4N8o1}tBPsNZ z|FxGbj*iiWwoztq>F*k|i$M{`<3R0(mV{Lq63Pc~4L_!ffry=lS#gf{;447lQl_K) zlJ*aW@*freu3e*)#dclJRQOf%wvP_HiXE%;IKWaS=JJo9ZbP^l_HHqeUg5giH-7@R zr#pV45Gz#leUUrnj^jU^^lx9dFZoT&kPZ^MtW3CF@gd71hWK2YEQ}MEw-ArAiRsYJ zKp={NRBKCr3gfP;bNE$n@4wrlnru&CcIfItzpREm`Gkji@)r35MVq??Wq7EF)FQfa zB(f9bM*g(VFLORsZW9_@8cEBCI=4L7|BV!SZG9ivNmT7sbk!jIl4r=_Vmpqyn-T(o zN3fPUgg%dCo3>d!Lgo)}K8oS5qQREUsh_od;>40(oUvsgt+x;>#E&y`moixrwBR|i z;Osep${?EhMBeK$kx{EjkxyLu*0(5&;e^FHJG3y1x;G*x;#rwtS>kh-hjRZ8_L$SQ zjB-fjdnik+&HAil@J&1Uxde01a5z00i13#?N4%2t{5`FB=x6Q7lT^SAo8DxmxY6(5 zz@g_Ul9K*D7MX<^1?pX`Qe-(gR~ zSVuOtj7@ov)oKPC79Sm<3J%fDmnYiTt^%?W+dF1i^n)hj$anXZff5e$2;?E1>!_6b z!o1?HL7frg`YQA>3agC$IM0mu5HYS6iL(hm_gZbF#jDiQ^mInT_XKrHKxOCUgC&`N zOl>w8mEM_gGpK>HuMJOzJalDN5#kD_9T@k&lWuZ;x-H4SD0?vgRU@+1)bEm-&LPJ3 zBR~0N8AvI4sB(r8w|4)+RK(?sCtT_#gu*JEqv8&_10!-*R7lB^f<{1T0`6z?zJ|>p zzLA-Dx@pS%_r8ai*y3|oZ}`L53Ni4N3_e?Js8fj+I~DqMJexT()I4c9_Cd`hAt~v9 zi`z9`YNI<2F?j9$%<}ivh)D46CPFyfRKO&;S~VJ*T|?V6{QZ+#Sp_&Q&_@yg+qn68 z$=#uJy{I?>IJ{Oh``+QzagBa}-=stM?VDfSJO{Jyl8n4tOxD;6b7fPe_5LsGFJ!jd zLZ%FwwulPx-Bi${o@Ys`ea94E(-x`2lMc9%!!9XILWoQ0!;|E+B|B zq^&b&%={yQa5NnOAf6}41a@b=*~2k2{)lz`l|U-E@%O=BgS>Gm9gudab?u&K0T=t1 zhvC9J+#sR}{&! z)Y+>U`0oJ`AlgJbqpo`b0-!_!(DV7@1d8^hr1I_Xi6^^G?bjEiH)nb*7}W3rf&RRg z{mCzK^1x4^orlyvwa1729)Hn1*M(<&ZhqyZHf|wc&;nmkNG1I)PUIE5xZtRPWj(F< zP2m&|IZmx}S%+h`TQ2=dpKS zy<$Nt+ed=5d8TU`AFEzB9*e!CUyYtmZhkr(Ed-Oom8J1(b=?o9N~j#^7k&RG{^^dX z^gommIt%p0$o$cG=J%)YI|!WOtQ*e%#J1$?*UKkIwjZ%%I)Qx(n=$i$l@-x8t+}1> zLK3gLNd`Ljfq!R51I4c8Fb-VEenpE@BixOxMfoFmx9r~UXaRNIV_Qb3f+oQG0$Oe_ z%$!Nn7~J>8pVfF;`4-Vqzml`&d?-lW#eR?mnh|fk)I##+t+EX4=4rT(Am1(< ztLLp5>r~BaK-R| z;CqcwXIaAIen?n^;zWeffoVHZq#a@v`%^1IC5%PJbcwd+A{8!$MW#0C>maX9gqhZ zq^udS@!Hm})z6gk$>^|l$cmP)h(s~UG(?0LrRCC zo4@=>8xo>K`AUPUnevO_)33-lMQ_I#!AHX#f{nO~(DjW~*@lH)O8}%!z3RnajPG zgbZ4f0uyYZvs=O;(zvou)n&2OrtSR^>JgCcJpzn(cztk(nhwQ z(kqgfVW}h-E!<}WK@zrC>4td)p_W5nt?e@<(_23QuZNx+8f$(vS;o3%JVA*dZ!z2o z`cXM?<-7(CndfzScftSy`rw5z1q#+`=A~^p%?N?V|9n|3aJWPV(S)nMGA#nhs~n?b z8wLTHY=R5MKu5c!?JcHe?g(dbu&Hk}fwBOy>sL>-ov{vwak92Z)}*F+`GOpI%K`oFBpep#w9nH(s<~reoh9*uoTuu05bB zdPJK-l2#M7!$*kW9{T)inxy!tdak$+(h*Rm#D0{J?CDG0V26lxW|(SA$>{Fev@%(< zGcn{WIRM5ngOr=Uo&Sn3_G@mv{buZX{7u{zqlaxS0{NA)B*mKD;-UtEH%*J~eP1@t zEa?|_j^PC;A_PMFrid^0r=WoxcOr~e<@)a`#S`d>PVGLV`!aA4tHz}a;P1qXf132v z{~ot6F7kf}kGZTGK~^Zay?pL|d7DU5k~lhCfN^J}rC525H;4PYZSzqx8T>~VMSz<*!0*=`tQP`Q5Cdvm zN0Tgg>yGxwucZqIB1*wr$cqDJNvXbJWz<>rhbSOSQ!Pga*}QT6^-*ChyRodmJMAM@ z$=XH)?|tyq?Y;;wJt6k$T~|gXu0L!Fct26H^7|Fp`BktKS!>P9A0_w74-aG^*Iepm zM;40>3er7y~F#Z(pW`1^q8bYD=kkE5UQUxkQg0x!#v?=7q;Y(3`v^cGpCc0fiZ(k5-iNFv2}a+4cAh@Fa-#UQvcb8O0r@imyG4~fVyb^ON0AkvX+rkgHjVl@db^8CaSNAK zhB#8I3P-2AyvIQZ!n8aIl#5$Ps=zX^wbw1PgyqCprZ*ObN{>V(Z~d?&l_aV@iE;Nn zzXN;6v$F0cF=n^U_qKwnc-@IE?ZH{qY*;mZ? z1*Vj4Mn-^tNN%bc5tIv$W$z%x<-#B7z}H%zB^c&LyFyMi;7>yTynVs`8BE&mZc-j3 zrb1LLkJDT(`oykvqd!uAF6w`mDf>U3nE9hL-7nokk&3s+|4flpzu=zGTaS2{R5kB( zag8Cw-7sD=n&p9KeoYYQ591vJ2UqC1v;?cXRIZx?@}-%M!&WS);Jk) zVeFxhoQC7D&GB7*^&}WxVp0~&2T;{OB=$Wd<`?>72ub9d&6R`~-+5?Y41B%9DaolE z%dz1C=ZR9pdhZ{azvPt&W}*KtIX1Afo05`L2X6=5I5y>iqv=n2&h@5xPqc71QCL#9 zs{7LMdVoQ5A*+Usn-d$dwvuG5M9TTmi>3q&>c=nrNhrU8i(l59hHk_X64vb#DM=Nw z?*|1>eX1bh4#^^#`FdBA4QQozQlmExpc@BSKgWe_RKoTfNa_brtcD`cV}!gf}G}*E2)p1%Txfp0me+lhNsA zvK`8YYVh{dv^9;C2ck=!Jlr&QpYD7O-0&<`=r#u6(XhZ_Vp3PVppNZeJYQq$N>n`S z%}h0@-Gap@ZwT8UlB|KYj(p54_P5v`Q4eW5Uc? z>>Z;qmqI<>MF>s^cmN(R=4!@N_uOW z;*>npTNW(!0ImY~TBT!&C+opDvfp{a_GIcW+@9>*8;2cb@%j-OFe6G{P)B~%-+$$- z`By;_!WJ}yd?y9@n*w%>saB`etx-lb1fw~KFyYCY_6)N#92!a&ttZL~66*8XZveok zmp1(30Z1-6;C0mJ95J@g-yfRa&xD^#Ot+2YbWlds*AiTF*$l2nv2sEK$4P4226WE4kwPJA zW;u=7gq(a@vt&S(@))AGzT%&pXhoZ$k%j*=AFH(a+<04)W{CwDwVAvnyO7zHd9ju7 zFShLN1nMl0a9&FZ*F(r|Mq6FXz)Keq9C+PeZdS)i$gi_<82#gKG-!YKzMwS6?as)h zwx>GGiAh>|SdR$S&y|f&B+38FT`iWyLFm$XE72>3L51vgy4>}R@G|Zl)(c*Zk#`VVr(Pr3m?apM^*bT(ovT8jaf2pKxX)%Q;Gh=t~h* za}s>v3r!Ri)%g)WHy#}wpqlXLnh3w{53dGy?MQ|Nss=@PpFqCN?p0C2am8VGzzIqVVrGvwP_9% z9Jb`d(y}Wz1mAJs9-Ek1_Vyy~{WIcf5&ks4rnFMaxZX}Na6?|0ETB`%YHyM#b{~gd zPJ{kVI{&KU`Krb2P?X`bH-PPuDg)oFR5Ho|9U7? z^FF5ga5=GcnR;;w6RgPz>f)P}5TR5a4w4`Pdv5bz z?i@R=9}pGpPUrh$(ba+nw8JtwQY8N>P9jai>Pd_BVW0LJlCSK7UR}+u0y5vfiSAkx z|4Cza@1v5k;W&0r!x_;TNSO_Eeti4ZV-nlwu%DCD-4S(>lJ5SyG3MwaQ3~20c(xu0 zP5XHiClXajMvqR#pYLjk049MOFC=gS5?oU@9srz_!mq42iOl*8%4E`NF#ozCaEqdt z_Ce^gA|NnFWpoDgIain?yyh`q^azisDZ)E~7O_&K$qMfGj` z4Hieq-eWJP%_RxzxwGfXzr~xC`rVn{&(nD7PAli|6}uh8lsRv!c4zcfSQ9O-@_N_H zX5h2_8-mtd~Tpoc1??P&U;hRT^B+c%NH3$MyQ~oh7x&Ka5yM7 zXnl^5Jmv6e%$PTx0W(r~#RS(EeWQQWzILH{`f?>T@#CWrj~`pZ?mFe6$+F!KRCte4 zim#8evd71JHyv8Kzl9H<-YsXwZN9rwYApD6Se?LWMffNrK)m$$OlBS+vJb8_R{azf z5)t5njanVeG~KAf-MV1n1UT`KYsPK8Ti-6?LwSus>gUS1r z@upoQt?7L0hPcZA5SYYlf^SF{)v*qpG9jo8cZ1hy#@_O#jm1w-vHM?5=?4kD5yC-& z3&P>No&{qr_e`~Ynr!4b7b@ucclo8B_uoXMY>Zlo0|^QQs$_e|0E@Z*LLeq^gdJTy zf#}Mes8@}{ksAF4lkOb4$R_O`SmY71y}>QL{(buS{5@VdvqJGO9z#K-!Nv~%FeAt2 zb>E@s3#L4SyQ)3$>6veUK#l4cveCaau{)YMeN?mr=3okE#kO-q76u!qapwYZ)4r5V z&8;qEvAS=kneelekX^T|I$H7EHaSy6ppv4iB0e?bRI6i)`AZ+5lQ%XAl?BXvDuZt}w_APyS zOba`#F)gU^vS5hl68{z`?vf--F{i5Z`G&RJLhp%w)Wjc@kM^IDz@ZQ<+gv<*WIf7j z2?|1qXT@-e)<*sd+tih(Ew!7PEqbcv{F+P4A)ilV+ ziZJ@+@;c331KOev+&$u)V_e+WcW11&>`mu;umFyt)(*5mOzv(#n)c`W7$NQ7|q zXaC$oEK8}9>Lw`0E-#|+x6jY+CO~4|g|ew~L1x-PDx*~q|C#~G{%qa)**Tdd((;ja z^`gW~G4D}GqmgC%3_(nH5Tj}hn`ic>$Stu$CQ}e?Bt8gBjE?(oD#$Wf=H0^vS9%Ic zJ*jd^Zxu)AUIU!xdTZbvqiSDii4*vYEcEUKc<&%(+MH$`67KX{QE>UQbTC2PKjb+) zLY}h9aE3K1@SL6V zF&9L~_{e-kW%FHJJh0-TyRi0?h1o~emUMM3pN+8(X}W7RTYo`xzoWR|V5A6T^grZY zW88*^$XD}q|C|SIsu3ps@MqvfU9bSYR@YOI)rE-Zs4QSWQlu7*BwQ?h$XLQQj+?9O zwQuq%u~K!OSZ#pn8cn|P5cULUeqdh??Qy(Qj~Vx{4Eapu#0L+_%COxBJMHq8Ocd_^ z!F3&nARE8gd9o1lnrwknQA0(^7s-WJVT%INwu7v1i5jb@`hTkARHr( z(cuFU5ldKJRsTz|^MdZ!m5;&;>&@}-d|PC&aM9+@7#L3379!d&18=s6z^fW5m8#DD z{oo7Jn5c(|U8#Ud>*wpT6vK&CU~hqsk#v!izFa#gc0P&$XtHg73+tg9f+(bPcvHR- z5`(T`EO=?@fGO>r{`M1DtzIpA(>=94(&re;2fzADMv(6US}4nSUKv6COfm-VixAAm zA^3#vIN@z;1rLdcj1tmbi`#a1w{hi7yc`H~50q#F5j}eV0|S?-fdO>)?VVoz7DVw! zJ_EBUULiD`$}10MFhS9*coUNQRCS*kuFIy{Is{|XV?@#-EB8Q+DD$gVBq>+B33%+F zz?V_UK)3*%EyQe*V7O*9Z2#IT4f0b|w}QkWxw3dOEuYt(;mvL)#1R%77LpNHpiiZ*E@Z2@q&3b$scC1o`?qpVqhfTJpj0 z5F+#t#Onum+E|(zj(yO#9|;)Hz0rb*k=nm-wmd)b-*(_o5RP~!f24po(h+Q zouwcfi~pQl?w<@T3t@j+UJ}`+Ut1SJDY_j`vQzxJ?}dJ&jWwYJVWNn+s|Vl&APIcT z`ZuFbcdwTptvxIpd~OQ10^X|X+3vW>LaJeVVrVy_mWD0YWm-WYn8tBn5BGUW8=v?2 zMd{J0QF4D&Us1QD4_s+6GWq6>(J_Uj)C8zHaIAIr9Fi6U?71Omzy5Y_Mc&xmvHWg- zxClA2g&y6PEd@-NokW2~j?m2V^;471C+V5Nah#10v5%EG(@n2QY)QRekrJBuHid?A z5h-3JP&wuRyP{C+ebfOp@P3To{OmZzQ6f4S{( z-{oGBu)_LBi>?wnirTqNPex={y?dJ}*5{>j6A-pwzxArYqP^6>Cpk#a-7io!-FHUL ze|h4yCa9&-=I+#(26X9PqX3Pc5f$)FNZhNxCeJKwKL;q6e48=0r|UO7fATWg==M1) zKBoP&#{Z@Fi5-UBw~lujAC$6ZYt@ee@&Bvx+M;Y4-6zXZ-j^(k@m5k)lOTmt2RF+S zg)gkMK{A(&4wR7zC!SnNWBaFmaMo3S%njB*8Zk*C4y|4ZYnUg;JK}xY;i$u=-3fvB zUNHip#HW@Dq|AVHr@&0SfGq`A7J$ZBKOFxO%s||}Wb9A}A#QB@7c@B)X1`_qe#iPH zsMB^E)VO24LLMD#>{W&rx`=iGA@dVGjod*0cFxA|Cn$hPj7_>gVE`;H&n2r7^_%t^ z1O{aqk-sb#hDUfjso$L5#Xb=_)hF|d{>*%>Hxt$Ec@X6TUQ7}8tkT^6s9ufutMChq zj5^t;V?`QP1HV+odzLMeqS~4Goc4w%%pdMbj{Jp4b(Tqjz|JYoO!*W7jFBfZ<|k4Z zF4`TmlXvOuq(F$Ay}c?qMEH?G{v|J zI`e{Gy*e(;*&l!bf#LjEZjeBd+6+Jm(#vGRQ^fpr6FD9M&DT~^SYbr8reXQdhT>ID zQV-Ql$+V9-nKX!d3d6ROe<(=fPw7uGpBn1;B&B#qk@5seQFv9|C9Ak9>sa6c?5dfr zxKWBQHx>y2sY>K!7St&rKj(Ov+gzvNS&^y9mnF&&Pl$rLua`aP=+~>LDi3EA*B6-H zSL*8_aH+qD6ZW2XKx1yRbh5Ld6QSesWH2C?iOzMTIpCdl0d^kR_6n#u=k$^$zX)mQ z>XhmF#n$3o%fbC9ysQi2tZ>|LJI#Gl6UWmmI;;B>q|VK(FRaX+GGh`xQM1LNnZwYM z*ZbmR%+S8q@9l&Y#>egf49QWHo|aPD1Twg35PC({w>EV*W`y!9>?8oLORn`<1C>GK zBnsl`fw}CT*^XXSC`)KmHP#Tw{d_5}`StbQ43WFAiB}?rv$mH)9NF}HHTk`kuqmwA z((nQskkza8#%6Y*1l7t(DU=`^z||a3e;KC4Mt>#dhZ%ewqo}?EwqTknT~W;diKg{m z#Xoqa)QCtdvFx6~#@27yjGEQC^C-l=NifE+$zc}2dkr*q-5`bAAlrZ6{#m=Ap_dzR zX2lOi&ctnY+|4g`U3z;!rTCms;W|V{lzUe|P+nrbo_e63>m9eR7Fl^99aCoY`{zE(n&sdLUL1z$Nw1RY=e~ z4c+g5e;|I;o!4HAXQcy|Yos&%!d?%0k9{56j>-{~bg|VfYKg;l3uh-;+V=F(nK$_= zlT2w90B9yVEsB}pF^|GM8 zTV!kaf3sq} z3$&;n+;=o*T#5W83$WprX%do$O{hgfgU7SYUhhuM|1GuFHhJ+{maD-Ze%l?-5RM&- zc4r2?Q74Qrx$ts$?HH1x!VvAkiX_nkV@!ZRUyi9B_=uKxE>Zdr*4U4$)kJ+MU zJ6AcoIaH>~bz!O)NxAA#u>YuH-IMl?vU&$1CQx6$Yska#5x_&?u_WkTE9GtJ<<{Pa zkHO$CHw<`4Z8ck`WzZ-AjH&0wczebL`=&~UB;JkW({MPUg4Cb9CA>~y`e0mjWQ;F- z>Ea+u@iCjepgj0}I~cSgvY2ECl?1rn^^Ta9M5p)QYaA_kx-?u5K(_DTUxM#%lmI3F zMA@ZZu}W%9(Kgf>?agbs;=4&+{P@|NEcq8*v^qPi-(YFY*PDY~7tp_Cvi{wWLHP_M z@!xC@>5%(ga6AXNF<#xz&7(uDXYX*Nc<-?-BevfyTkXP{{WOcVR^)2aTzQ*E2~_@G z`A5nUHmw&YG{4g45E1__4}!V%^}5~FgD{j$fnha-TORDQb<9eXA~1sU(?MM!&f+2? znHdD2zdgRbzs!F1_pLX{hv(o955LSRXpiPaf2`|9Bq0+4g)jVB%)wej3Rx2vxfvQ~ zN0Uo?j|K#55h$TS(zKu(#aD$Tal*a?3d5BekUF23_Z&`{*^`KgfW2CsFou{DRwuKD z4~Trvql%y!P?&p&_Pk8>S9#*l-S4z584!0iX7^{=J2VCRz(`>IbB>rkJNye_=V02Zp?wm+RIQe7n$>{Ihj4O+6#}LY2VX~$&4V) zS8a60%enN4w5F)u__ZueP}V}LLk#1#0l};^7Sym+lK;Nj{<$gW%~lMZiD61mfFXeV#w6go`QNad7Jr2LPY9PZq`y8{D0d8oU z&y+7U6MMc(=rG6!dSB|qI)ZxvbXE96Q&buTwO^^Xf>ufmTZO@Fb&%P-BHjFG0;f&m zYwST9;tihFmHl?LzS29qzq83-&j=}3At)$DsNS8s%4$X~UVwtMIq)rr0RH5c+k)M- zZ9@+j*+co`g<;JD?$H|pIy5EtOEc-paGC5BGsXyz1ILp*p24=MS_(u|$Uoy9NPo}Z zym(>WV}^R}{CaN?AE+?cP102mkf0$cZVTf zt$~6pb3HE`CE*o$7HiY`zy9-#ft&il-U;@$@2Qu*;VCr){vMi1$6FA`8zPwHrSXk4 z>dj2^@!TDt@|4VY=U&TH3eEr&+s+BVUw)F$%T_4jv7>d937pD0CRlO-t3ds&dg_jv zdXrrg67om%Wb0UT+Nq*OMJ6*Z#4GZI!AZ)ogw&8xjSB+&&TRdnhZd+$qvr(J2NfMs%x<#om-%t0Vf>DIMCMJ zr79z2RJgiZ_($u9KT{+53PDfsk9+M^jw0ctAfy6G!xHRL-n^EF0#p>5JvQA=H=|DB zmBeuuavm(KCqI+KU-7_T4i3GkQ{@~p>{zhBPBbHNq+kKPU0>=;noQUqlq0+LjRXR3 z3+nGgTh@N#92=TX$P6Tz6znd`s)v&X?9E8?1`amLF-r0KnkKKvD=&CR2fJxX=kP_8FePXL@tGJcHYx>@ zv;()L#T8T?wNrSdSSOYk`zzcFm4xRdo^CAO)W53@@YR3NrbIt2C;D04aTLEp8?8`) zG`|H8+0lGC3fj1j6a+#|B$mArmk#VxS_8J77?#ub*Afx}#TcXBbIV1yEDpWJzE)pE zbtoovdoXK+e$Nn^P`5odL>};ZO+uD(mIDYJq&5jaJm03}TESO2$$W%>DP5-g@xZEF zgj~hYAk!-ZYMkJe3lcmsYWHpT{zuYP$3^vg?YluEUD6HGh%^X@2#A11NUk6yNOvwR zilQPVEg&MPAPu{KfJlRM?9xasUCZu!zrXkI`3p?Qy<9`mteW6X0%YB*NuS zH08o3k3q)Gcug2{C6oW$CE5Ynk1xy`P%FZr2FKt<|J+W2WqB(fW^kdeFh+)IyeH+~M)7-+(2Y)aN+9x1reZX;%& z;HDW>4?P_uyc<8_G~iKheCu8KN|#u>vHo@D)8;3Vx5H%RyO7!&)^+AYj&N~f3IwG( zaOy^S9HHM$hV04x=9+fEQ2E1{vq}9x2dw}p6VjZii+COp1Dby)A?5jrPlV6cpLI(* z5A}0rxkKbV#Z~L2B&PL}M(#waenQ6r?%)njB(Nv*&nOJpmBEIK%Q=+0h~HtHf2l4|3y*90ccjv zGK0bJG~B|x!U0+e+>>p@Gn5o~bj90Tka4YBnE4fto%7bL`OMQ6tAn?TVi9AOMue(A z+tSujiYuXN+=JbRc$pY`^R~A)B_EBj~?wr5* zS+5m25c&oOh#lQ2M zq=uD{fB+)lrr^$I`Modd!4wPlz3rbq{S8*q4Sb<#Xgk@c%;xkLOK3+9-yE{+pFWY* z>}2(wJxlIk3L1Tlw7}`Q*bDQ^-VAbJRKp_RplAYc{|AssFVs+CUEc%S`txI?$h`UsFNgyg<=H%b`&Fxt>rn~1)$#-d==YAJlnRI?X9s2bXlcRxLK(MQt(hD+NBGngAHe<287dym9Y!2pD^VTCt-T(bv2TrdYHR|G-+p z^btpu^_FdEpJ|1@Yf9eZ zWd&Q?B1V4odYCnM8=8r>=ERydMfBRUv2g>*m44hF0(RA(t~6hs+ywe41%cBjTgs#} zhRvuxmM(*XlHacYDfYa%ok|-IDj1rs4UjS<-ZiKE7;@tFgz=C4>WNDI!6rMUsgdVA z&Gwrn_aVp&`N(Qv=xO?~K!mlTOwCowCj$wgko5gGgt48j#jXt}!OElD{^uv87iO{0 z5jq%v5kPMC&b5BZE0se}^#Zj|yc%H=f(Wg`JUJg|wFXO;ow}4PXx}M`+RY+6_1toWf_La|7iV0@ zm3NV=H{i%hI&`Pf3uzd7ept(gRH?~kzye-#B)ys6co#eY=RZ0*AYeyP4>9nCKRT%w ze|J|-w#O?w$y=ojY_Ytq_3+31faB|= zh!&z7OLg5ODoBtwo(~9Z+l`yEV$GC1$lYum!KGwL4m~IN@G<4(S=vuBK~2z*%$oCm z=S#y2xXiESqj-eEN>%DNU?C^|@qMaH4E0(ZzEotBK?VGQ$=_=qyl5#}g{3>bdBk1F z{NN^Tr{D!PH+S|&cs#){RSrrIU^&7S)kr)`P54vJM=X_98J+J!&6$_)Kx^`|sUBqK zoSdSDg3cbixtJ0@xVz(n%3Zy*NW?bLO61&jo-mX|!QF>Q=O!V?cwLGHj|V@IUP#E7 zZxO6M_DMtDgf^+FKjAt3X+4&_baX&#Ouu`!pq4}U>mUqsqsmJXIVha)o7CovH7DYgriyt znahZ_liIxD>c)_lZ;u~au#%E*pIEPNib&a0X4tm;8JQG!#mYwm{o>ok1i$MlV9A>I zWCYG$Q&NBQeRgdgymnxGCV%j?XC-v+L9j>lpUhm0a70fB$RpmM-k9M+ZNU%h^cjW)k8EYfWthL^;d3? z)3H|Zi9U8!4*lj%B?q^9*GUEg9xBrh)op&?Ju_E4d-10qv&}JQ>!&<~0&tS}!TAg@ z4;-cys63PRYY97OHc!-I)khfQQ9UK&_$J)s^J}U{1%B|zdW;KDt#vS}CuA)T&gN@D zuoskq?2=-#g0EzOE9(6Op>B7c2(CT#(~!pSoU_fk$Y?GE`(X60Hu)qLxM*4tIr^I{ z{yTB?5xK?6k)dgD-Mp~Q5h?ZT;7#e5D0~B2kQ%OK`CwQX?PU-KEBNqsO8Y(I7H~Sr zfi9HRy1otDF#}-Bd6O%;D#V@bOMQaMqSV=iR-0|{l`)E$fsF=wH$f9h1)WF zQ8jC`EXWJU`erOCvs&%Ilkecki&}@VYMP+-79B4+JA9sVa|S>50 zOw04Bm&shg?^b#r9x>~s-p?PG|78Y5FXf${Rt8+W-wq$F-zjOx8bqNqT(P!BXtl(l z>o|m_8s44tO?Td$Fm72L&1ht}6Yktz!~-us-2Za7{p*MNE6p#dnrBRyOGi8VF~`c9 z5Ei)B3>2#pFotQ}GL-CBrvPqp?})$qJ=vzpX6ZJBB+=R5)sQC`?5HZgbuXLW`na<@ z_~{uXjI1(_J?u3V)IS5=rH(c(MC>+*IsgcAi>VdEmk>No+Q|)w z<8`jCq~iicZ+TDxNn&~NOCuJ~X~o~=UEQ;FKu_3iI0j)lE?WrP;o~IeZQ{VLRz3Pz zXlhh7;Y4I=Dz@_^SKjz0eXQZ_02 ElS}EdX~g!bGhWe_H7A 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/methods/payment_icon_selected.webp b/apps/web/public/assets/payments/methods/payment_icon_selected.webp new file mode 100644 index 0000000000000000000000000000000000000000..af62df00a465c6530ead705af214d63480ff7289 GIT binary patch literal 2312 zcmV+j3HSC=Nk&Eh2><|BMM6+kP&il$0000G0001$005Ez06|PpNF)IO00EF=+qP+2 z^Et9@zXGUK^O<$CZG1=1W;la`&okT4ZbVFgBtcd}*1``2JVgLj1|Uf=Q<48W3OwOD z9pRDI3;f`bbWm>xze~@A8?~E~4jSAjzm&i$YWFMxjpm8pnvsW;ysx7hV0jsm+Wt;+^z--qZ*b4!pUeN;e!TYu{jv5B{c#`8 zM*sfh`~T#~0ss6d8+ZPU_8;_m|Nlr2G5;IuU--kVsZygcWtP>x9YnGM%-OSMQCDRW zsDW$QDoRJT2|k~lGUWSARe{wn(OzIZGL*eeG6_n@Djj~~UBOB4`>0tKWFuILVlNw~ znF*aD)-zIXV#$L`X#iBLw)XAYw{F<-FRtcvm~5EtG#tg=TkJRjNM2JlfHjiU%oCQh z(}!)F@78^%Pyqh=l*_08)%VO|eJ6&3mi1wzIZyr3GS9X*{2KUq{tcs0^m;%eXG0NJ z&^>P+Iwkf?LCaz$>GTk16}Z#Xzf!DB$Li>a9yAZxVg}Yf`Bc3Pm>=$b#oI!o_U_+qfTx{<#djC!%xMhK~-v0zpu~`MdKp!AMt}Ltm2yB)V~!?Bj>+^K9nxLeRjSY-yh1tyUN}+|CwPseei7O8C0~ zaHLMte?8)PQ?>k&(EsV~KricyrO|xEmR$pc^gMieQua@d8Q0(aIAwi#hSdqh1i~Fb z3M<-9!YjDmtSOr5zyhPU*UV}_M$kYJzYE|A*HVeQ8)2%RsBSOk>W1%WFCsbJeP-Vm zl+Azr{RLvF%zv&iy)CcKu!kzSvm$(jo!q;2T;;N6AAqyjsR5^@No*gYUWZuc>Wwkl^poUv zi{~gF_tyIcP-qEJ(99XpV8xV~dmjB*>Zm6~F{Z(cvddY$WNHil$5Lrf%XwgW{V=z% z-Y(1x*7@-_m6U|KJbg2u1Wq_xM9SC2^Tr z8XC6ZHFJKPmzwutI{P4^lx8&nP^!&lY%lUSc|7pY@gjd6vPb?z%vF<6i2w@yBYrgF zfy*L$Ar5Hv5fVQUK~S{Yc0Up`jFnl!?%(Av?2NzUhTrUdE-el=ECbI#BD6l9NDII6 zIm62arq1zOO}%M)?D+-(wb=dP<}bb<=Ta~KE)nGTT21Y(`~U#hZ{y`pZj)rF?v5Ai z1-k<0toDnr6RcTZ^V@A&J5TsK<5m!{Tzy7{IeGK|2C6G5Z9J~|&&nh-TZ{CnilW0T z7~H`7Ca9SnXEFi+zS}?A7oUIw;hlf!Vdp_{N9&B}16KvnOo*&C*y(Usl%#ezGfur0 zR$5dg^)r9A&^&&~s73^XgNuF;nu(%PXyQCpHg#HxS-_W0>q$lzX1adtX9=!WGz)M=Dg#@|B7ALbN6FGxta!j(oJ$KF!c*;BZGSzm#+sYY7AA9wArXPH(i^AwI+a z0S3rpe05jT?L5(%-fMolzctaMQRkYNmHhwZ=e!uA1&T_^l~{u`mnmYKbuj`Li*gwk zIHgEsQ^Zkdm?|hK^a10dimtqEe~nNB_tcM~+k% z=6&P{t0cV)hPLwQTmSMgJ^3!E08eZ!jX%4nB}0BQ8svGCftdSK0TR@pw-);JXWPjE z^0WuxIcTT=TK@4hJ(@qb3+Kd~*wSTjR%+5(5;&rLaiX*2f2W-^GC$xt|GXw)+r*tn z=rYizsSRtl9r3fx>>d}BA=g^Ec%Q=(P~_+GFw?gl8ypT7r&yAYa;K7&ZD}`?4^`z? zi`~l;<@H&u@>&)CSQj07hqns4Zn}4un5yn2OeRHig^cS>Ecrw;#J94@`UD=$Rh9o2 zkGTZCs$^zRXAxGBto~NK+8q87igzg*1GJckPI#EtGXSTb_u=aiweWx3Hp+S=-kGJ$ zC<*BmP)2~S*ayG=*uPw7uLTi;EIN1K3jhK#!l?;a0GE{pc*(3WGS!zvw@J3T=r97j i)%m8977^un^5BlJVAJqt8(_bPJLDHfbz6O1!$1HE!;KIC literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/methods/pix.webp b/apps/web/public/assets/payments/methods/pix.webp new file mode 100644 index 0000000000000000000000000000000000000000..dd6cd7e4f5f92701eef8042fdf594e1c1b837da9 GIT binary patch literal 30166 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

f#8hZ7GnbrJk3%>Hws$dsR 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 VZryHd!Mp3$ZKZ1Cm5JhZgcXsRGk5?1 literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/service/serviceid_deactivated.png b/apps/web/public/assets/payments/service/serviceid_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..b91c921da299d4a04f21926bbe418c71fe858c5d GIT binary patch literal 6964 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/service/serviceid_icon_over.png b/apps/web/public/assets/payments/service/serviceid_icon_over.png new file mode 100644 index 0000000000000000000000000000000000000000..daabf00e46973e9f95d7ceec7eac3f5f7167c76c GIT binary patch literal 4572 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/assets/payments/service/serviceid_icon_selected.png b/apps/web/public/assets/payments/service/serviceid_icon_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2eb791af674ab9d3668711c2bbe05bc8f855ba GIT binary patch literal 4497 zcmbVQcTiK^wzq+PD8&NOln_)(2q_dvASk^^uaRmRMMwf6kU&60ngS{aqEbX8NblVU zT*XKgY>0GGP^8xgB5;GBe((Kp=gz!$X3p7buk~AXuQhw-T(dMc=(Lw2XqFciWLZ9ExE02mW79t3Lw1|Q_tM$p``W4E7| zEt-lpGezRaL?z5NMu|@Jp<<1Dr-E!BkZcFqk3$4uvU0U{DAg0fxblDyNY!HNfu&$n{3S zyCbdj41W9K?odEaD%BSWfzW6)C7QAlnc@L~ArJ@%6b^yI!CVB`KZr!d(7_~snLifv z2>v*VmoL?eOag3M#9+w*R1}aK>E9_3ea+1NF--FRT_|qJAasl`1f~Rq5Q*D){X+Xw ztqK1V#(zZn+Xnd(Al3wbasUO#Jr8%8Kg!(N{dY&(KyEZh3yK%_P%u7vWLyA|K%yG! zp@3Y865b1sgej}5sX^VbV2nG~9ZZ0$;KAz3h|^%K3PKfo8j4p_Q91p`&VSO^)mDY6 ztLf=#Bb1>qn7*<)!T@HVtD>s{(}C+N8zBDZ8k78~7!r=~$F~>P_itUD|Ei1Br4TSw zGR2lm_W9EVmY!rP+251w3((aC$T@hC@MN05{Pqd`ov}6D`ConWhsABi zZStQf;BNkzBLay#JQVJfoUaM0;ZAOiv7WXqy?;9WFJIx6V=YaL2GC!BC0xF&r&n&G z3UIYkta@KyYdCN(FgX5Wcz?f1^>NcF)#AN@?}AO8@~e7c?Y$v_j(g7e$te$0;kwIZewv~7Us5^AVERW(h2iV78^4=-M`NaY)Cb2JQ>-fRR-+oN_lCrye2VUZHm|*f9T%%Z1Bb)2gN#=F@NlhLj=aULasB)#bX)qA z_q7hB-2r&x;pDWGQiBOy!pq?K{v_A{s8;-@jO7)hvaZ|SP6_+^C)!Uf|rfvI{V;anz0`FgI=7e}we6lYUPLa|H-H;H~2rRmb z4im;2{H4~XVdb`A>Z`{-R4zV}cejY&EvQj6HwyM`-Wa{y^;T{_e`1D^FHtNH&-WO& z=V|1?@cG@XK0Z$)9JFqPk=-J5s<*;Hx9SB7zoX0yAE^ouYp?Hztg5AuT=-?|?uGOmqaE0e89bz$+ykf3M z0YiXfoHWy^wJrhJ=2j5~e8^+1Q6O;s0huu$h`1XzwY1tYo3q;T=nmdV{6ae&bZm6e zrClvjstV%Z;JUT6kYwD)nQolX$FGlhbXX@HJv0GHG>Y=czL9tGv%-ENsl((;jEY{i z75*aa)AP!v*v~PNajbUoD+MgLFG%9BfDl5)9M;#CJ2NA_>2@11h@nFZRhuUf^Q>f8F@-NG@icTEM|$PC+4 zRUnPlAfD{pm|-$aRMa^64}GhWUvCPP*(_M#S;;bMl-ub+;Zfv)z0`#TC* zU89`#0n$C8*V%K&PWp)#ox7*18>d>tvO9U!Rr`(fIW70XsTkixbL)? zsE>flc(Y-@gx6od zCu1Z0@Z1wdL&R)uTgovBtNyPxm|^*w=L_iQOG7I%!s zXua#*a>w*}>Z-=Y9_JNM*x8YpDw5x5x=WI1~y+lQT?z}M^NIuB(pbJ~PGcpO5-MqV)5R40pL)@|;$HN$+FZ?1T_ zsa6-6yX+sU8Y>EFq6%O~Y!19!9ZHV%7kXbA=4EAVT>qtYqn0txn#tY-z8$bR+KJx1 zNB%Mdpd>DQ{JPEFjG&d)`H3jxa(wa^KSTy3clf?Y-H&8#5A0Ptu_p<+XM)6?3q`_S zk8q$ke#Ls%bXsHzrh3MKqJP&1I0d#>$KuSbo1 z*8P;U($cDEHwL9otbQZO6r+=?``A1xG=0+oQdW4sdr7PoNK&;UMh4*b>kyRFGv5- zt-KtTJ=mRt9y?3P8B_6&X&~N^q~#mB1rM4Rk0k%dbPOpIT3PI3EbI$Bm)48)_WQgv zX;MD0Uig`u|8`t;vPK`n2C@OYrIMqj>lRBL=%a3lP9qa47rcX$97C9v0aitylDrc; zO|$J=MlRvkhEGmjx-IF{P&}L}KQi_9j^;9FF8qnMV>+d$qfao!RTb1XHeGM!%0CS0 zMcKC^@0Q0pm8CIl4GV*$+ns6&s%#*lUTYQF&j0+eVdk}S=B#+DQ#>-FIG1u?Ue|%L z^w)r>muS1MW>EpoC$qKr&d`rO!>H^l0`&f6NviO37A?vcm5 z0A?zg9LvBa-h|@7L8ICRQNM&@AJauN!ns^ITtJAtytJn9t((G^t{>#$kHiVZ>hoEU zx5`Y)_bH2Hp(C*eb;|d#{}#w?Gb|N`^P&JrR(NPAh*L2dZ9$JS6b&Ng z3le?@Fn0I_3@hZCw&_~t1D9l4cGgW5s#D&f-4(6Tqz0mvcyY#&INx|~(DL@fMkPZ{ zXb-n#8H1}(95<8L%iA@yroX@By_*e;A_P<6O7!Wtr|`KaNmsIFpGU7yCkD-*FBXJ>hmWtMv?FtI4*lLGqtnHtQy$R#Y4)xe6u0S}EP+X!#40@6!p@i6q z;pR}ZO&<^avC|;p$fj*8ghx7*ZO#@{O!4%@GFw|T=--_)6G4Z5FpAbU>=Kg;>zEX{ zYbNI+6kb^=? zP302)@c^fr#HeAsc>Hkl$9=*r9(1{pzSK+SQ@R|q_|+v zJH)MJ-UCSu25Ei_Ff^Jd|lIz!3$RL<{gsTD2Kj9m{{g`y@@c zu%yJiP`>n_;c%~Av_QR)ALhlgy$!@h+gNs-RP&ef3!DRcul5aRd#=DeyHq~*z0rVj zFJi|_JMHD3T}=w*UCz(}GrUSxrN zzloB1mo+5YA{DIL0Qp*QyjlxXoz5~Zxk^Xw1kagYy;yk5@Yo*1 zx^PQiI#{=nC*a`cTE@ftv<6bmnR>V;%F|G*pj%s_fBlm4il6$$&THCDGva-1SC3DZ z_RS1LRSK_Gz)?wHrx_44r19t3$;swkt?p2{)DSd)oEzd(fIY6d47*pw4%q0 zy14Q&w{G0}-LArbal1(JXd2v5vmQ t;O|3^TTq}Q#ACAN4Q43BQrJ%39pC&4VzV5JzHk2|G1fQNE77@d<=; }; -export const MenuItem = ({ icon, label, menus = [] }: Props) => { +export const MenuItem = ({ + icon, + label, + menus = [], + needsSession = false, +}: Props) => { const routerState = useRouterState(); + const { session } = useSession(); const [show, setShow] = useState(() => { return menus.some( (subMenu) => subMenu.to === routerState.location.pathname, @@ -34,7 +44,16 @@ export const MenuItem = ({ icon, label, menus = [] }: Props) => { setShow((prev) => (prev ? prev : shouldShow)); }, [routerState.location.pathname, menus]); - const heightTotal = menus.length * 18.8; + const heightTotal = menus.reduce((acc, subMenu) => { + if (subMenu.needsSession && !session) { + return acc; + } + return acc + 18.8; + }, 0); + + if (needsSession && !session) { + return null; + } return (

@@ -75,6 +94,10 @@ export const MenuItem = ({ icon, label, menus = [] }: Props) => { {menus.map((subMenu) => { const isActive = routerState.location.pathname === subMenu.to; + if (subMenu.needsSession && !session) { + return null; + } + return ( { icon="sphere" menus={[{ label: "Updates", to: "/", hot: true }]} /> +
); diff --git a/apps/web/src/components/Payments/CoinsPackage/index.tsx b/apps/web/src/components/Payments/CoinsPackage/index.tsx new file mode 100644 index 0000000..6ead3a6 --- /dev/null +++ b/apps/web/src/components/Payments/CoinsPackage/index.tsx @@ -0,0 +1,57 @@ +import { ServiceItem, type ServiceItemProps } from "../ServiceItem"; + +type PackageSize = "tiny" | "small" | "medium" | "large" | "xlarge" | "mega"; + +const PACKAGE_META: Record = { + tiny: { + label: "Tiny", + icon: "/assets/payments/coins/serviceid_1.png", + }, + small: { + label: "Small", + icon: "/assets/payments/coins/serviceid_2.png", + }, + medium: { + label: "Medium", + icon: "/assets/payments/coins/serviceid_3.png", + }, + large: { + label: "Large", + icon: "/assets/payments/coins/serviceid_4.png", + }, + xlarge: { + label: "X-Large", + icon: "/assets/payments/coins/serviceid_5.png", + }, + mega: { + label: "Mega", + icon: "/assets/payments/coins/serviceid_6.png", + }, +}; + +type Props = Omit & { + amount: number; + size?: PackageSize; +}; + +export const CoinsPackageItem = ({ + size = "mega", + amount = 0, + onClick, + price, + selected, + disabled = false, +}: Props) => { + const icon = PACKAGE_META[size].icon; + + return ( + + ); +}; diff --git a/apps/web/src/components/Payments/PaymentMethod/index.tsx b/apps/web/src/components/Payments/PaymentMethod/index.tsx new file mode 100644 index 0000000..1757b2e --- /dev/null +++ b/apps/web/src/components/Payments/PaymentMethod/index.tsx @@ -0,0 +1,96 @@ +import { cn } from "@/sdk/utils/cn"; + +type MethodMetaKey = "mercado-pago" | "pag-seguro" | "pix"; + +const METHOD_META: Record = + { + "mercado-pago": { + icon: "/assets/payments/methods/mercado-pago.png", + }, + pix: { + icon: "/assets/payments/methods/pix.webp", + className: " mx-auto rounded-md w-[80px]", + }, + "pag-seguro": { + icon: "/assets/payments/methods/pag-seguro.png", + }, + }; + +type PaymentMethodItemProps = { + selected: boolean; + onClick: () => void; + title: string; + speed?: "instant" | "medium" | "slow"; + method: MethodMetaKey; +}; + +export const PaymentMethodItem = ({ + onClick, + selected, + title, + speed = "instant", + method, +}: PaymentMethodItemProps) => { + const methodMeta = METHOD_META[method]; + + return ( + + ); +}; diff --git a/apps/web/src/components/Payments/ServiceItem/index.tsx b/apps/web/src/components/Payments/ServiceItem/index.tsx new file mode 100644 index 0000000..b9b6266 --- /dev/null +++ b/apps/web/src/components/Payments/ServiceItem/index.tsx @@ -0,0 +1,87 @@ +import { cn } from "@/sdk/utils/cn"; + +export type ServiceItemProps = { + selected: boolean; + onClick: () => void; + title: string; + price: string; + disabled?: boolean; + icon?: React.ReactNode | string; +}; + +export const ServiceItem = ({ + title, + onClick, + price, + selected, + disabled = true, + icon, +}: ServiceItemProps) => { + return ( + + ); +}; diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index 492f0cf..74127af 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -36,6 +36,9 @@ const Not_authAccountLostIndexLazyRouteImport = createFileRoute( const Not_authAccountCreateIndexLazyRouteImport = createFileRoute( '/_not_auth/account/create/', )() +const AuthShopDonateIndexLazyRouteImport = createFileRoute( + '/_auth/shop/donate/', +)() const AuthAccountReset_passwordIndexLazyRouteImport = createFileRoute( '/_auth/account/reset_password/', )() @@ -138,6 +141,13 @@ const Not_authAccountCreateIndexLazyRoute = } as any).lazy(() => import('./routes/_not_auth/account/create/index.lazy').then((d) => d.Route), ) +const AuthShopDonateIndexLazyRoute = AuthShopDonateIndexLazyRouteImport.update({ + id: '/shop/donate/', + path: '/shop/donate/', + getParentRoute: () => AuthRouteRoute, +} as any).lazy(() => + import('./routes/_auth/shop/donate/index.lazy').then((d) => d.Route), +) const AuthAccountReset_passwordIndexLazyRoute = AuthAccountReset_passwordIndexLazyRouteImport.update({ id: '/account/reset_password/', @@ -354,6 +364,7 @@ export interface FileRoutesByFullPath { '/account/details': typeof AuthAccountDetailsIndexLazyRoute '/account/registration': typeof AuthAccountRegistrationIndexLazyRoute '/account/reset_password': typeof AuthAccountReset_passwordIndexLazyRoute + '/shop/donate': typeof AuthShopDonateIndexLazyRoute '/account/create': typeof Not_authAccountCreateIndexLazyRoute '/account/lost': typeof Not_authAccountLostIndexLazyRoute '/account/email/change/$token': typeof AuthAccountEmailChangeTokenRouteRouteWithChildren @@ -385,6 +396,7 @@ export interface FileRoutesByTo { '/account/details': typeof AuthAccountDetailsIndexLazyRoute '/account/registration': typeof AuthAccountRegistrationIndexLazyRoute '/account/reset_password': typeof AuthAccountReset_passwordIndexLazyRoute + '/shop/donate': typeof AuthShopDonateIndexLazyRoute '/account/create': typeof Not_authAccountCreateIndexLazyRoute '/account/lost': typeof Not_authAccountLostIndexLazyRoute '/account/email/change/$token': typeof AuthAccountEmailChangeTokenRouteRouteWithChildren @@ -421,6 +433,7 @@ export interface FileRoutesById { '/_auth/account/details/': typeof AuthAccountDetailsIndexLazyRoute '/_auth/account/registration/': typeof AuthAccountRegistrationIndexLazyRoute '/_auth/account/reset_password/': typeof AuthAccountReset_passwordIndexLazyRoute + '/_auth/shop/donate/': typeof AuthShopDonateIndexLazyRoute '/_not_auth/account/create/': typeof Not_authAccountCreateIndexLazyRoute '/_not_auth/account/lost/': typeof Not_authAccountLostIndexLazyRoute '/_auth/account/email/change/$token': typeof AuthAccountEmailChangeTokenRouteRouteWithChildren @@ -455,6 +468,7 @@ export interface FileRouteTypes { | '/account/details' | '/account/registration' | '/account/reset_password' + | '/shop/donate' | '/account/create' | '/account/lost' | '/account/email/change/$token' @@ -486,6 +500,7 @@ export interface FileRouteTypes { | '/account/details' | '/account/registration' | '/account/reset_password' + | '/shop/donate' | '/account/create' | '/account/lost' | '/account/email/change/$token' @@ -521,6 +536,7 @@ export interface FileRouteTypes { | '/_auth/account/details/' | '/_auth/account/registration/' | '/_auth/account/reset_password/' + | '/_auth/shop/donate/' | '/_not_auth/account/create/' | '/_not_auth/account/lost/' | '/_auth/account/email/change/$token' @@ -625,6 +641,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof Not_authAccountCreateIndexLazyRouteImport parentRoute: typeof Not_authRouteRoute } + '/_auth/shop/donate/': { + id: '/_auth/shop/donate/' + path: '/shop/donate' + fullPath: '/shop/donate' + preLoaderRoute: typeof AuthShopDonateIndexLazyRouteImport + parentRoute: typeof AuthRouteRoute + } '/_auth/account/reset_password/': { id: '/_auth/account/reset_password/' path: '/account/reset_password' @@ -821,6 +844,7 @@ interface AuthRouteRouteChildren { AuthAccountDetailsIndexLazyRoute: typeof AuthAccountDetailsIndexLazyRoute AuthAccountRegistrationIndexLazyRoute: typeof AuthAccountRegistrationIndexLazyRoute AuthAccountReset_passwordIndexLazyRoute: typeof AuthAccountReset_passwordIndexLazyRoute + AuthShopDonateIndexLazyRoute: typeof AuthShopDonateIndexLazyRoute AuthAccount2faLinkIndexRoute: typeof AuthAccount2faLinkIndexRoute AuthAccount2faUnlinkIndexRoute: typeof AuthAccount2faUnlinkIndexRoute AuthAccountPlayerCreateIndexRoute: typeof AuthAccountPlayerCreateIndexRoute @@ -840,6 +864,7 @@ const AuthRouteRouteChildren: AuthRouteRouteChildren = { AuthAccountRegistrationIndexLazyRoute: AuthAccountRegistrationIndexLazyRoute, AuthAccountReset_passwordIndexLazyRoute: AuthAccountReset_passwordIndexLazyRoute, + AuthShopDonateIndexLazyRoute: AuthShopDonateIndexLazyRoute, AuthAccount2faLinkIndexRoute: AuthAccount2faLinkIndexRoute, AuthAccount2faUnlinkIndexRoute: AuthAccount2faUnlinkIndexRoute, AuthAccountPlayerCreateIndexRoute: AuthAccountPlayerCreateIndexRoute, diff --git a/apps/web/src/routes/_auth/shop/donate/index.lazy.tsx b/apps/web/src/routes/_auth/shop/donate/index.lazy.tsx new file mode 100644 index 0000000..09c03e9 --- /dev/null +++ b/apps/web/src/routes/_auth/shop/donate/index.lazy.tsx @@ -0,0 +1,10 @@ +import { createLazyFileRoute } from "@tanstack/react-router"; +import { ShopDonateSection } from "@/sections/shop_donate"; + +export const Route = createLazyFileRoute("/_auth/shop/donate/")({ + component: RouteComponent, +}); + +function RouteComponent() { + return ; +} diff --git a/apps/web/src/sdk/hooks/useMoney.ts b/apps/web/src/sdk/hooks/useMoney.ts new file mode 100644 index 0000000..6beb80a --- /dev/null +++ b/apps/web/src/sdk/hooks/useMoney.ts @@ -0,0 +1,61 @@ +import { useCallback, useMemo, useState } from "react"; + +export type FormatterOptions = { + locale?: string; + currency?: string; + // Quando true, o valor é tratado como inteiro em centavos. + cents?: boolean; +}; + +export const formatter = ( + value: number, + options: FormatterOptions & { + cents?: boolean; + } = {}, +): string => { + const { locale = "pt-BR", currency = "BRL", cents = false } = options; + + const displayValue = cents ? value / 100 : value; + + return new Intl.NumberFormat(locale, { + style: "currency", + currency, + minimumFractionDigits: 2, + }).format(displayValue); +}; + +export const useFormatter = ( + initialValue = 0, + options: FormatterOptions = {}, +) => { + const { cents = false } = options; + + // Quando cents=true, armazenamos o estado como inteiro (centavos). + const [value, setValue] = useState(initialValue); + + const formatted = useMemo(() => formatter(value, options), [value, options]); + + const onChange = useCallback( + (raw: string) => { + const onlyNumbers = raw.replace(/[^\d]/g, ""); + if (cents) { + // Mantém valor como inteiro em centavos + const num = Number(onlyNumbers); + setValue(num); + } else { + // Valor em reais com duas casas, armazenado como float + const num = Number(onlyNumbers) / 100; + setValue(num); + } + }, + [cents], + ); + + return { + // value será inteiro (centavos) quando cents=true, ou float quando cents=false + value, + formatted, + onChange, + setValue, + }; +}; diff --git a/apps/web/src/sections/account_2fa_link/form/index.tsx b/apps/web/src/sections/account_2fa_link/form/index.tsx index 06c57f9..6ddb29b 100644 --- a/apps/web/src/sections/account_2fa_link/form/index.tsx +++ b/apps/web/src/sections/account_2fa_link/form/index.tsx @@ -1,6 +1,6 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { useNavigate } from "@tanstack/react-router"; +import { useNavigate, useRouter } from "@tanstack/react-router"; import { useCallback } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; @@ -39,6 +39,7 @@ type FormConfirmValues = z.infer; export const Account2FALinkForm = () => { const navigate = useNavigate(); const queryClient = useQueryClient(); + const router = useRouter(); const { data: setupData, @@ -212,9 +213,12 @@ export const Account2FALinkForm = () => {
{!isSetupSuccessful && ( - + router.history.back()} + > Back - + )} val === true, { + message: "You must give consent to proceed", + }), +}); + +export type FormValues = z.infer; + +export const ShopDonateForm = () => { + const { session } = useSession(); + + const form = useForm({ + resolver: zodResolver(FormSchema), + defaultValues: { + step: "payments", + }, + }); + + const step = form.watch("step"); + + const title = useMemo(() => { + switch (step) { + case "payments": + return "Select Payment Method"; + case "services": + return "Select Products"; + case "review": + return "Confirm Your Order"; + default: + return ""; + } + }, [step]); + + const handleSubmit = useCallback(async (data: FormValues) => { + console.log("Form submitted:", data); + }, []); + + return ( +
+
+ + Order for: {session?.email} + +
+ +
+ + + + + + +
+
+ ); +}; diff --git a/apps/web/src/sections/shop_donate/form/payments/index.tsx b/apps/web/src/sections/shop_donate/form/payments/index.tsx new file mode 100644 index 0000000..8d56c7c --- /dev/null +++ b/apps/web/src/sections/shop_donate/form/payments/index.tsx @@ -0,0 +1,80 @@ +import { useFormContext } from "react-hook-form"; +import { PaymentMethodItem } from "@/components/Payments/PaymentMethod"; +import { ButtonImage } from "@/ui/Buttons/ButtonImage"; +import { InnerContainer } from "@/ui/Container/Inner"; +import { FormField, FormItem, FormMessage } from "@/ui/Form"; +import type { FormValues } from ".."; + +export const PaymentMethods = [ + { + id: "MERCADO_PAGO_PIX", + title: "Pix", + speed: "instant", + method: "pix", + }, +] as const; + +export const ShopDonateStepPayments = () => { + const form = useFormContext(); + const step = form.watch("step"); + const paymentId = form.watch("paymentMethod"); + + if (step !== "payments") { + return null; + } + + return ( + <> + + { + return ( + +
+ {PaymentMethods.map((method) => ( + { + form.clearErrors("paymentMethod"); + onChange(value === method.id ? undefined : method.id); + }} + /> + ))} +
+ +
+ ); + }} + /> +
+ + +
+ { + if (!paymentId) { + form.setError("paymentMethod", { + type: "required", + message: "Please select a payment method.", + }); + return; + } + + form.setValue("step", "services"); + }} + > + Next + +
+
+ + ); +}; diff --git a/apps/web/src/sections/shop_donate/form/review/index.tsx b/apps/web/src/sections/shop_donate/form/review/index.tsx new file mode 100644 index 0000000..9be211e --- /dev/null +++ b/apps/web/src/sections/shop_donate/form/review/index.tsx @@ -0,0 +1,139 @@ +import { useQuery } from "@tanstack/react-query"; +import { Link } from "@tanstack/react-router"; +import { useMemo } from "react"; +import { useFormContext } from "react-hook-form"; +import { List } from "@/components/List"; +import { useSession } from "@/sdk/contexts/session"; +import { formatter } from "@/sdk/hooks/useMoney"; +import { api } from "@/sdk/lib/api/factory"; +import { ButtonImage } from "@/ui/Buttons/ButtonImage"; +import { Checkbox } from "@/ui/Checkbox"; +import { InnerContainer } from "@/ui/Container/Inner"; +import { FormControl, FormField, FormItem, FormMessage } from "@/ui/Form"; +import { Label } from "@/ui/Label"; +import type { FormValues } from ".."; +import { PaymentMethods } from "../payments"; + +export const ShopDonateStepReview = () => { + const { data: services } = useQuery( + api.query.miforge.shop.services.queryOptions(), + ); + const { session } = useSession(); + const form = useFormContext(); + const step = form.watch("step"); + + const paymentMethod = form.watch("paymentMethod"); + const serviceId = form.watch("serviceId"); + + const selectedService = useMemo(() => { + return services?.find((service) => service.slug === serviceId); + }, [serviceId, services]); + + const selectedPaymentMethod = useMemo(() => { + return PaymentMethods.find((method) => method.id === paymentMethod); + }, [paymentMethod]); + + if (step !== "review") { + return null; + } + + return ( + <> + + + + {session?.email} + + + + + + + + {selectedPaymentMethod?.title} + + + + {selectedService?.type} + + + + {formatter( + (selectedService?.unit_price ?? 0) * + (selectedService?.quantity ?? 0), + )} + + + + {selectedService?.quantity} + + + + + { + return ( + + + + + + + ); + }} + /> + + +
+ { + form.setValue("step", "services"); + }} + > + Back + + + Confirm Order + +
+
+ + ); +}; diff --git a/apps/web/src/sections/shop_donate/form/services/index.tsx b/apps/web/src/sections/shop_donate/form/services/index.tsx new file mode 100644 index 0000000..4084d6a --- /dev/null +++ b/apps/web/src/sections/shop_donate/form/services/index.tsx @@ -0,0 +1,115 @@ +import { useQuery } from "@tanstack/react-query"; +import { useFormContext } from "react-hook-form"; +import { CoinsPackageItem } from "@/components/Payments/CoinsPackage"; +import { formatter } from "@/sdk/hooks/useMoney"; +import { api } from "@/sdk/lib/api/factory"; +import { ButtonImage } from "@/ui/Buttons/ButtonImage"; +import { InnerContainer } from "@/ui/Container/Inner"; +import { FormField, FormItem, FormMessage } from "@/ui/Form"; +import type { FormValues } from ".."; + +export const ShopDonateStepServices = () => { + const { data: services = [] } = useQuery( + api.query.miforge.shop.services.queryOptions(), + ); + + const form = useFormContext(); + const step = form.watch("step"); + const serviceId = form.watch("serviceId"); + + // Defina a ordem de tamanhos + const SIZE_ORDER = ["tiny", "small", "medium", "large", "xlarge"] as const; + + // Ordena por preço total e atribui tamanho em ordem, caindo em "mega" + const servicesWithSize = services + .map((service) => ({ + ...service, + totalPrice: service.unit_price * service.quantity, + })) + .sort((a, b) => a.totalPrice - b.totalPrice) + .map((service, index) => { + const autoSize = SIZE_ORDER[index] ?? "mega"; + return { ...service, autoSize }; + }); + + if (step !== "services") { + return null; + } + + return ( + <> + + { + return ( + +
+ {servicesWithSize.map((service) => { + const id = service.slug; + const price = service.unit_price * service.quantity; + + if (service.type === "COINS") { + return ( + { + form.clearErrors("serviceId"); + onChange(value === id ? undefined : id); + }} + /> + ); + } + + return null; + })} +
+ +
+ ); + }} + /> + + * Please note that the prices may vary depending on the current + exchange rate. Different prices may apply depending on your selected + payment method. + +
+ +
+ { + form.setValue("step", "payments"); + }} + > + Back + + { + if (!serviceId) { + form.setError("serviceId", { + type: "required", + message: "Please select a service.", + }); + return; + } + + form.setValue("step", "review"); + }} + > + Next + +
+
+ + ); +}; diff --git a/apps/web/src/sections/shop_donate/index.tsx b/apps/web/src/sections/shop_donate/index.tsx new file mode 100644 index 0000000..4235674 --- /dev/null +++ b/apps/web/src/sections/shop_donate/index.tsx @@ -0,0 +1,17 @@ +import { Section } from "@/ui/Section"; +import { SectionHeader } from "@/ui/Section/Header"; +import { InnerSection } from "@/ui/Section/Inner"; +import { ShopDonateForm } from "./form"; + +export const ShopDonateSection = () => { + return ( +
+ +

Shop

+
+ + + +
+ ); +}; From 61f1d86c99cc7b88acd796b650ce983106e5d6a4 Mon Sep 17 00:00:00 2001 From: Guilherme Fontes Date: Sat, 13 Dec 2025 09:06:58 -0400 Subject: [PATCH 3/4] feat: add columns to save id form payment provider method --- .../migration.sql | 9 +++++++++ .../migration.sql | 2 ++ apps/api/prisma/models/shop.prisma | 8 +++++--- apps/api/prisma/seed/index.ts | 16 ++++++++-------- 4 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 apps/api/prisma/migrations/20251212004820_proce_to_unit_price/migration.sql create mode 100644 apps/api/prisma/migrations/20251213130619_add_id_in_transaction_from_provider/migration.sql diff --git a/apps/api/prisma/migrations/20251212004820_proce_to_unit_price/migration.sql b/apps/api/prisma/migrations/20251212004820_proce_to_unit_price/migration.sql new file mode 100644 index 0000000..2a6d986 --- /dev/null +++ b/apps/api/prisma/migrations/20251212004820_proce_to_unit_price/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `price` on the `miforge_shop_service` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE `miforge_shop_service` DROP COLUMN `price`, + ADD COLUMN `unit_price` INTEGER UNSIGNED NOT NULL DEFAULT 0; diff --git a/apps/api/prisma/migrations/20251213130619_add_id_in_transaction_from_provider/migration.sql b/apps/api/prisma/migrations/20251213130619_add_id_in_transaction_from_provider/migration.sql new file mode 100644 index 0000000..d7bbb05 --- /dev/null +++ b/apps/api/prisma/migrations/20251213130619_add_id_in_transaction_from_provider/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE `miforge_shop_transactions` ADD COLUMN `method_transaction_id` VARCHAR(255) NULL; diff --git a/apps/api/prisma/models/shop.prisma b/apps/api/prisma/models/shop.prisma index 17254d4..e874a9a 100644 --- a/apps/api/prisma/models/shop.prisma +++ b/apps/api/prisma/models/shop.prisma @@ -11,9 +11,9 @@ model miforge_shop_service { transactions miforge_shop_transactions[] - price Int @default(0) @db.UnsignedInt - quantity Int @default(1) @db.UnsignedInt - is_active Boolean @default(true) + unit_price Int @default(0) @db.UnsignedInt + quantity Int @default(1) @db.UnsignedInt + is_active Boolean @default(true) created_at DateTime @default(now()) updated_at DateTime @default(now()) @updatedAt @@ -37,6 +37,8 @@ model miforge_shop_transactions { status ShopTransactionStatus @default(PENDING) method ShopTransactionMethod + methodTransactionId String? @map("method_transaction_id") @db.VarChar(255) + units Int @default(1) @db.UnsignedInt total Int @default(0) @db.UnsignedInt diff --git a/apps/api/prisma/seed/index.ts b/apps/api/prisma/seed/index.ts index 04f7f85..7776db1 100644 --- a/apps/api/prisma/seed/index.ts +++ b/apps/api/prisma/seed/index.ts @@ -49,46 +49,46 @@ const miforgeConfig = MiforgeConfigSchema.decode({ } }) -const DEFAULT_SHOP_SERVICES: Pick[] = [{ +const DEFAULT_SHOP_SERVICES: Pick[] = [{ type: "COINS", title: "250 Coins", slug: "250-coins", - price: 10, // cents = 0.20 = 20/100 = 0.2 + unit_price: 10, // cents = 0.10 = 10/100 = 0.1 quantity: 250, description: null }, { type: "COINS", title: "750 Coins", slug: "750-coins", - price: 10, + unit_price: 10, quantity: 750, description: null }, { type: "COINS", title: "1500 Coins", slug: "1500-coins", - price: 10, + unit_price: 10, quantity: 1500, description: null }, { type: "COINS", title: "3000 Coins", slug: "3000-coins", - price: 10, + unit_price: 10, quantity: 3000, description: null }, { type: "COINS", title: "4000 Coins", slug: "4000-coins", - price: 10, + unit_price: 10, quantity: 4000, description: null }, { type: "COINS", title: "12000 Coins", slug: "12000-coins", - price: 10, + unit_price: 10, quantity: 12000, description: null }] @@ -115,7 +115,7 @@ async function main() { slug: service.slug }, create: service, - update: {} + update: service }) } From eb22b63dd2e8e43b3190724a01e8fe782239149a Mon Sep 17 00:00:00 2001 From: Guilherme Fontes Date: Sun, 14 Dec 2025 08:43:19 -0400 Subject: [PATCH 4/4] feat: previous changes only to use in another branch --- .vscode/launch.json | 20 +-- .../migration.sql | 22 +++ .../migration.sql | 32 +++++ .../migration.sql | 2 + apps/api/prisma/models/shop.prisma | 39 +++++- apps/api/prisma/seed/index.ts | 16 +++ apps/api/src/application/services/index.ts | 2 + .../application/services/mercadoPago/index.ts | 126 +++++++++++++++++ .../src/application/services/shop/index.ts | 71 ++++++++++ apps/api/src/application/usecases/factory.ts | 12 ++ apps/api/src/application/usecases/index.ts | 1 + .../usecases/shop/createOrder/contract.ts | 18 +++ .../usecases/shop/createOrder/index.ts | 28 ++++ .../src/application/usecases/shop/index.ts | 3 + .../usecases/shop/providers/contract.ts | 15 +++ .../usecases/shop/providers/index.ts | 23 ++++ .../usecases/shop/services/contract.ts | 14 ++ .../usecases/shop/services/index.ts | 23 ++++ apps/api/src/domain/clients/index.ts | 1 + .../src/domain/clients/mercadopago/index.ts | 55 ++++++++ .../src/domain/clients/mercadopago/types.ts | 88 ++++++++++++ apps/api/src/domain/repositories/index.ts | 3 + .../repositories/shopProviders/index.ts | 30 +++++ .../domain/repositories/shopServices/index.ts | 28 ++++ .../repositories/shopTransactions/index.ts | 41 ++++++ apps/api/src/index.ts | 5 + apps/api/src/infra/di/containers/clients.ts | 19 +++ .../src/infra/di/containers/repositories.ts | 18 +++ apps/api/src/infra/di/containers/services.ts | 13 ++ apps/api/src/infra/di/containers/usecases.ts | 19 +++ apps/api/src/infra/di/tokens.ts | 27 ++++ apps/api/src/infra/env/index.ts | 30 +++++ apps/api/src/presentation/v1/routes/index.ts | 4 + .../presentation/v1/routes/payments/index.ts | 6 + .../v1/routes/payments/mercadopago/index.ts | 8 ++ .../payments/mercadopago/payment/index.ts | 12 ++ .../routes/payments/mercadopago/test/index.ts | 31 +++++ .../payments/mercadopago/webhook/index.ts | 127 ++++++++++++++++++ .../src/presentation/v1/routes/shop/index.ts | 10 ++ .../v1/routes/shop/orders/create/index.ts | 15 +++ .../v1/routes/shop/orders/index.ts | 6 + .../v1/routes/shop/providers/index.ts | 15 +++ .../v1/routes/shop/services/index.ts | 15 +++ apps/api/src/shared/schemas/Config.ts | 7 + apps/api/src/shared/schemas/ShopOrder.ts | 22 +++ apps/api/src/shared/schemas/ShopProvider.ts | 23 ++++ apps/api/src/shared/schemas/ShopService.ts | 17 +++ .../src/shared/schemas/ShopTransactions.ts | 17 +++ apps/api/src/shared/utils/money.ts | 3 + .../Payments/PaymentMethod/index.tsx | 33 ++--- .../src/sections/shop_donate/form/index.tsx | 14 +- .../form/{payments => providers}/index.tsx | 53 ++++---- .../shop_donate/form/review/index.tsx | 19 +-- .../shop_donate/form/services/index.tsx | 4 +- 54 files changed, 1229 insertions(+), 76 deletions(-) create mode 100644 apps/api/prisma/migrations/20251213140742_add_provider_with_method/migration.sql create mode 100644 apps/api/prisma/migrations/20251213151549_migrate_provider_to_other_table/migration.sql create mode 100644 apps/api/prisma/migrations/20251213152454_method_provider_and_active/migration.sql create mode 100644 apps/api/src/application/services/mercadoPago/index.ts create mode 100644 apps/api/src/application/services/shop/index.ts create mode 100644 apps/api/src/application/usecases/shop/createOrder/contract.ts create mode 100644 apps/api/src/application/usecases/shop/createOrder/index.ts create mode 100644 apps/api/src/application/usecases/shop/index.ts create mode 100644 apps/api/src/application/usecases/shop/providers/contract.ts create mode 100644 apps/api/src/application/usecases/shop/providers/index.ts create mode 100644 apps/api/src/application/usecases/shop/services/contract.ts create mode 100644 apps/api/src/application/usecases/shop/services/index.ts create mode 100644 apps/api/src/domain/clients/mercadopago/index.ts create mode 100644 apps/api/src/domain/clients/mercadopago/types.ts create mode 100644 apps/api/src/domain/repositories/shopProviders/index.ts create mode 100644 apps/api/src/domain/repositories/shopServices/index.ts create mode 100644 apps/api/src/domain/repositories/shopTransactions/index.ts create mode 100644 apps/api/src/presentation/v1/routes/payments/index.ts create mode 100644 apps/api/src/presentation/v1/routes/payments/mercadopago/index.ts create mode 100644 apps/api/src/presentation/v1/routes/payments/mercadopago/payment/index.ts create mode 100644 apps/api/src/presentation/v1/routes/payments/mercadopago/test/index.ts create mode 100644 apps/api/src/presentation/v1/routes/payments/mercadopago/webhook/index.ts create mode 100644 apps/api/src/presentation/v1/routes/shop/index.ts create mode 100644 apps/api/src/presentation/v1/routes/shop/orders/create/index.ts create mode 100644 apps/api/src/presentation/v1/routes/shop/orders/index.ts create mode 100644 apps/api/src/presentation/v1/routes/shop/providers/index.ts create mode 100644 apps/api/src/presentation/v1/routes/shop/services/index.ts create mode 100644 apps/api/src/shared/schemas/ShopOrder.ts create mode 100644 apps/api/src/shared/schemas/ShopProvider.ts create mode 100644 apps/api/src/shared/schemas/ShopService.ts create mode 100644 apps/api/src/shared/schemas/ShopTransactions.ts create mode 100644 apps/api/src/shared/utils/money.ts rename apps/web/src/sections/shop_donate/form/{payments => providers}/index.tsx (60%) diff --git a/.vscode/launch.json b/.vscode/launch.json index 6eaa59f..fa3bca3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,12 +1,12 @@ { - "version": "0.2.0", - "configurations": [ - { - "type": "bun", - "request": "attach", - "name": "[Bun] Backend", - "url": "ws://localhost:6499", - "localRoot": "${workspaceFolder}" - }, - ] + "version": "0.2.0", + "configurations": [ + { + "type": "bun", + "request": "attach", + "name": "[Bun] Backend", + "url": "ws://localhost:6499", + "localRoot": "${workspaceFolder}" + } + ] } diff --git a/apps/api/prisma/migrations/20251213140742_add_provider_with_method/migration.sql b/apps/api/prisma/migrations/20251213140742_add_provider_with_method/migration.sql new file mode 100644 index 0000000..dd069cf --- /dev/null +++ b/apps/api/prisma/migrations/20251213140742_add_provider_with_method/migration.sql @@ -0,0 +1,22 @@ +/* + Warnings: + + - The values [MERCADO_PAGO_PIX] on the enum `miforge_shop_transactions_method` will be removed. If these variants are still used in the database, this will fail. + - Added the required column `provider` to the `miforge_shop_transactions` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `miforge_shop_transactions` ADD COLUMN `provider` ENUM('MERCADO_PAGO') NOT NULL, + MODIFY `method` ENUM('PIX') NOT NULL; + +-- CreateIndex +CREATE INDEX `idx_service_account_provider` ON `miforge_shop_transactions`(`service_id`, `account_id`); + +-- CreateIndex +CREATE INDEX `idx_method_transaction_id` ON `miforge_shop_transactions`(`method_transaction_id`); + +-- CreateIndex +CREATE INDEX `idx_status` ON `miforge_shop_transactions`(`status`); + +-- CreateIndex +CREATE INDEX `idx_provider` ON `miforge_shop_transactions`(`provider`); diff --git a/apps/api/prisma/migrations/20251213151549_migrate_provider_to_other_table/migration.sql b/apps/api/prisma/migrations/20251213151549_migrate_provider_to_other_table/migration.sql new file mode 100644 index 0000000..00feb91 --- /dev/null +++ b/apps/api/prisma/migrations/20251213151549_migrate_provider_to_other_table/migration.sql @@ -0,0 +1,32 @@ +/* + Warnings: + + - You are about to drop the column `method` on the `miforge_shop_transactions` table. All the data in the column will be lost. + - You are about to drop the column `provider` on the `miforge_shop_transactions` table. All the data in the column will be lost. + - Added the required column `provider_id` to the `miforge_shop_transactions` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropIndex +DROP INDEX `idx_provider` ON `miforge_shop_transactions`; + +-- AlterTable +ALTER TABLE `miforge_shop_transactions` DROP COLUMN `method`, + DROP COLUMN `provider`, + ADD COLUMN `provider_id` INTEGER UNSIGNED NOT NULL; + +-- CreateTable +CREATE TABLE `miforge_shop_providers` ( + `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `description` TEXT NULL, + `method` ENUM('PIX') NOT NULL, + `provider` ENUM('MERCADO_PAGO') NOT NULL, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `miforge_shop_providers_method_provider_key`(`method`, `provider`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `miforge_shop_transactions` ADD CONSTRAINT `miforge_shop_transactions_provider_id_fkey` FOREIGN KEY (`provider_id`) REFERENCES `miforge_shop_providers`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/api/prisma/migrations/20251213152454_method_provider_and_active/migration.sql b/apps/api/prisma/migrations/20251213152454_method_provider_and_active/migration.sql new file mode 100644 index 0000000..cccfd93 --- /dev/null +++ b/apps/api/prisma/migrations/20251213152454_method_provider_and_active/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE `miforge_shop_providers` ADD COLUMN `is_active` BOOLEAN NOT NULL DEFAULT true; diff --git a/apps/api/prisma/models/shop.prisma b/apps/api/prisma/models/shop.prisma index e874a9a..e31cec0 100644 --- a/apps/api/prisma/models/shop.prisma +++ b/apps/api/prisma/models/shop.prisma @@ -27,21 +27,44 @@ enum ShopTransactionStatus { REFUNDED } -enum ShopTransactionMethod { - MERCADO_PAGO_PIX +enum ShopProviderMethod { + PIX } -model miforge_shop_transactions { +enum ShopProvider { + MERCADO_PAGO +} + +model miforge_shop_providers { id Int @id @default(autoincrement()) @db.UnsignedInt - status ShopTransactionStatus @default(PENDING) - method ShopTransactionMethod + name String @db.VarChar(100) + description String? @db.Text + isActive Boolean @default(true) @map("is_active") + + method ShopProviderMethod + provider ShopProvider + + transactions miforge_shop_transactions[] + + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + + @@unique([method, provider], name: "uniq_method_provider") +} + +model miforge_shop_transactions { + id Int @id @default(autoincrement()) @db.UnsignedInt - methodTransactionId String? @map("method_transaction_id") @db.VarChar(255) + status ShopTransactionStatus @default(PENDING) + methodTransactionId String? @map("method_transaction_id") @db.VarChar(255) units Int @default(1) @db.UnsignedInt total Int @default(0) @db.UnsignedInt + providerId Int @map("provider_id") @db.UnsignedInt + provider miforge_shop_providers @relation(fields: [providerId], references: [id], onDelete: Cascade) + serviceId Int @map("service_id") @db.UnsignedInt service miforge_shop_service @relation(fields: [serviceId], references: [id], onDelete: Cascade) @@ -50,4 +73,8 @@ model miforge_shop_transactions { created_at DateTime @default(now()) updated_at DateTime @default(now()) @updatedAt + + @@index([serviceId, accountId], name: "idx_service_account_provider") + @@index([methodTransactionId], name: "idx_method_transaction_id") + @@index([status], name: "idx_status") } diff --git a/apps/api/prisma/seed/index.ts b/apps/api/prisma/seed/index.ts index 7776db1..9f0853f 100644 --- a/apps/api/prisma/seed/index.ts +++ b/apps/api/prisma/seed/index.ts @@ -119,6 +119,22 @@ async function main() { }) } + console.log("[seed] Seeding default payment providers") + await prisma.miforge_shop_providers.upsert({ + where: { + uniq_method_provider: { + method: "PIX", + provider: "MERCADO_PAGO" + } + }, + create: { + method: "PIX", + provider: "MERCADO_PAGO", + name: "Mercado Pago PIX" + }, + update: {} + }) + for (const config of server_configs) { const existing = await prisma.server_config.findUnique({ where: { diff --git a/apps/api/src/application/services/index.ts b/apps/api/src/application/services/index.ts index b5b0038..09a2b84 100644 --- a/apps/api/src/application/services/index.ts +++ b/apps/api/src/application/services/index.ts @@ -5,8 +5,10 @@ export * from "./accountTwoFactor"; export * from "./audit"; export * from "./config"; export * from "./lostAccount"; +export * from "./mercadoPago"; export * from "./players"; export * from "./recoveryKey"; export * from "./session"; +export * from "./shop"; export * from "./tibiaclient"; export * from "./worlds"; diff --git a/apps/api/src/application/services/mercadoPago/index.ts b/apps/api/src/application/services/mercadoPago/index.ts new file mode 100644 index 0000000..a84df61 --- /dev/null +++ b/apps/api/src/application/services/mercadoPago/index.ts @@ -0,0 +1,126 @@ +import { ORPCError } from "@orpc/client"; +import { + ShopProvider, + ShopProviderMethod, + ShopTransactionStatus, +} from "generated/client"; +import { inject, injectable } from "tsyringe"; +import { Catch } from "@/application/decorators/Catch"; +import type { MercadoPagoClient } from "@/domain/clients"; +import type { ExecutionContext } from "@/domain/context"; +import type { + AccountRepository, + ShopProvidersRepository, + ShopServicesRepository, + ShopTransactionsRepository, +} from "@/domain/repositories"; +import { TOKENS } from "@/infra/di/tokens"; +import type { ShopOrder } from "@/shared/schemas/ShopOrder"; +import { centsToFloat } from "@/shared/utils/money"; + +@injectable() +export class MercadoPagoService { + constructor( + @inject(TOKENS.ShopServicesRepository) + private readonly shopServicesRepository: ShopServicesRepository, + @inject(TOKENS.ShopTransactionsRepository) + private readonly shopTransactionsRepository: ShopTransactionsRepository, + @inject(TOKENS.ExecutionContext) + private readonly executionContext: ExecutionContext, + @inject(TOKENS.AccountRepository) + private readonly accountRepository: AccountRepository, + @inject(TOKENS.MercadoPagoClient) + private readonly mercadoPagoClient: MercadoPagoClient, + @inject(TOKENS.ShopProvidersRepository) + private readonly shopProvidersRepository: ShopProvidersRepository, + ) {} + + @Catch() + async createPixPayment( + serviceId: number, + providerMethod: ShopProviderMethod, + ): Promise { + const session = this.executionContext.session(); + + const account = await this.accountRepository.findByEmail(session.email); + + if (!account) { + throw new ORPCError("NOT_FOUND", { + message: `Account with email '${session.email}' not found.`, + }); + } + + const provider = await this.shopProvidersRepository.findByMethodAndProvider( + providerMethod, + "MERCADO_PAGO", + ); + + if (!provider || !provider.isActive) { + throw new ORPCError("NOT_FOUND", { + message: `Shop provider with method '${providerMethod}' not found. For provider 'MERCADO_PAGO'.`, + }); + } + + const service = await this.shopServicesRepository.findById(serviceId); + + if (!service || !service.is_active) { + throw new ORPCError("NOT_FOUND", { + message: `Shop service with id '${serviceId}' not found.`, + }); + } + + const totalCents = service.unit_price * service.quantity; + const totalAmount = (totalCents / 100).toFixed(2); + + const transaction = await this.shopTransactionsRepository.createTransaction( + { + accountId: account.id, + providerId: provider.id, + serviceId: service.id, + total: totalCents, + units: 1, + }, + ); + + const pix = await this.mercadoPagoClient.createPayment({ + x_idempotency_key: `${transaction.id}`, + external_reference: `${transaction.id}`, + payment_method_id: "pix", + installments: 1, + payer: { + email: account.email, + }, + transaction_amount: Number(totalAmount), + description: `Purchase of ${service.slug} in MiForge Store`, + }); + + if ( + !pix.point_of_interaction.transaction_data.qr_code || + !pix.point_of_interaction.transaction_data.qr_code_base64 + ) { + throw new ORPCError("PAYMENT_CREATION_FAILED", { + message: `Failed to create PIX payment for transaction '${transaction.id}'.`, + }); + } + + await this.shopTransactionsRepository.attachMethodTransactionId( + transaction.id, + pix.id.toString(), + ); + + return { + id: transaction.id, + price: centsToFloat(transaction.total), + status: ShopTransactionStatus.PENDING, + method: ShopProviderMethod.PIX, + provider: ShopProvider.MERCADO_PAGO, + interaction: { + transaction: { + qr_code: pix.point_of_interaction.transaction_data.qr_code, + qr_code_base64: + pix.point_of_interaction.transaction_data.qr_code_base64, + }, + }, + }; + } +} diff --git a/apps/api/src/application/services/shop/index.ts b/apps/api/src/application/services/shop/index.ts new file mode 100644 index 0000000..d8f00aa --- /dev/null +++ b/apps/api/src/application/services/shop/index.ts @@ -0,0 +1,71 @@ +import { ORPCError } from "@orpc/client"; +import { ShopProvider, ShopProviderMethod } from "generated/client"; +import { inject, injectable } from "tsyringe"; +import type { + ShopProvidersRepository, + ShopServicesRepository, +} from "@/domain/repositories"; +import { TOKENS } from "@/infra/di/tokens"; +import { centsToFloat } from "@/shared/utils/money"; +import type { MercadoPagoService } from "../mercadoPago"; + +@injectable() +export class ShopService { + constructor( + @inject(TOKENS.ShopServicesRepository) + private readonly shopServicesRepository: ShopServicesRepository, + @inject(TOKENS.ShopProvidersRepository) + private readonly shopProvidersRepository: ShopProvidersRepository, + @inject(TOKENS.MercadoPagoService) + private readonly mercadoPagoService: MercadoPagoService, + ) {} + + async getAllServices() { + const services = await this.shopServicesRepository.listAll(); + + return services.map((service) => ({ + ...service, + unit_price: centsToFloat(service.unit_price), + })); + } + + async getAllProviders() { + const providers = await this.shopProvidersRepository.findAll(); + + return providers; + } + + async createOrder(data: { serviceId: number; providerId: number }) { + const service = await this.shopServicesRepository.findById(data.serviceId); + const provider = await this.shopProvidersRepository.findById( + data.providerId, + ); + + if (!service || !provider) { + throw new ORPCError("NOT_FOUND", { + message: "Service or Provider not found", + }); + } + + const paymentMethod = provider.method; + const paymentProvider = provider.provider; + + if (paymentProvider === ShopProvider.MERCADO_PAGO) { + switch (paymentMethod) { + case ShopProviderMethod.PIX: + return this.mercadoPagoService.createPixPayment( + service.id, + paymentMethod, + ); + default: + throw new ORPCError("NOT_IMPLEMENTED", { + message: `Payment method ${paymentMethod} not implemented for provider ${paymentProvider}`, + }); + } + } + + throw new ORPCError("NOT_IMPLEMENTED", { + message: `Payment provider ${paymentProvider} not implemented`, + }); + } +} diff --git a/apps/api/src/application/usecases/factory.ts b/apps/api/src/application/usecases/factory.ts index 342be4b..7e7fb68 100644 --- a/apps/api/src/application/usecases/factory.ts +++ b/apps/api/src/application/usecases/factory.ts @@ -219,4 +219,16 @@ export class UseCasesFactory { update, } as const; } + + get shop() { + const services = this.di.resolve(TOKENS.ShopServicesUseCase); + const providers = this.di.resolve(TOKENS.ShopProvidersUserCase); + const orderCreate = this.di.resolve(TOKENS.ShopCreateOrderUseCase); + + return { + services, + providers, + orderCreate, + } as const; + } } diff --git a/apps/api/src/application/usecases/index.ts b/apps/api/src/application/usecases/index.ts index aa8e4bf..769d69e 100644 --- a/apps/api/src/application/usecases/index.ts +++ b/apps/api/src/application/usecases/index.ts @@ -3,5 +3,6 @@ export * from "./config"; export * from "./lostAccount"; export * from "./players"; export * from "./session"; +export * from "./shop"; export * from "./tibia"; export * from "./worlds"; diff --git a/apps/api/src/application/usecases/shop/createOrder/contract.ts b/apps/api/src/application/usecases/shop/createOrder/contract.ts new file mode 100644 index 0000000..8716694 --- /dev/null +++ b/apps/api/src/application/usecases/shop/createOrder/contract.ts @@ -0,0 +1,18 @@ +import z from "zod"; +import { ShopOrder } from "@/shared/schemas/ShopOrder"; + +export const ShopCreateOrderContractSchema = { + input: z.object({ + serviceId: z.number(), + providerId: z.number(), + }), + output: ShopOrder, +}; + +export type ShopCreateOrderContractInput = z.infer< + typeof ShopCreateOrderContractSchema.input +>; + +export type ShopCreateOrderContractOutput = z.infer< + typeof ShopCreateOrderContractSchema.output +>; diff --git a/apps/api/src/application/usecases/shop/createOrder/index.ts b/apps/api/src/application/usecases/shop/createOrder/index.ts new file mode 100644 index 0000000..f705359 --- /dev/null +++ b/apps/api/src/application/usecases/shop/createOrder/index.ts @@ -0,0 +1,28 @@ +import { inject, injectable } from "tsyringe"; +import type { ShopService } from "@/application/services"; +import { TOKENS } from "@/infra/di/tokens"; +import type { UseCase } from "@/shared/interfaces/usecase"; +import type { + ShopCreateOrderContractInput, + ShopCreateOrderContractOutput, +} from "./contract"; + +@injectable() +export class ShopCreateOrderUseCase + implements + UseCase +{ + constructor( + @inject(TOKENS.ShopService) + private readonly shopService: ShopService, + ) {} + + execute( + input: ShopCreateOrderContractInput, + ): Promise { + return this.shopService.createOrder({ + providerId: input.providerId, + serviceId: input.serviceId, + }); + } +} diff --git a/apps/api/src/application/usecases/shop/index.ts b/apps/api/src/application/usecases/shop/index.ts new file mode 100644 index 0000000..614843b --- /dev/null +++ b/apps/api/src/application/usecases/shop/index.ts @@ -0,0 +1,3 @@ +export * from "./createOrder"; +export * from "./providers"; +export * from "./services"; diff --git a/apps/api/src/application/usecases/shop/providers/contract.ts b/apps/api/src/application/usecases/shop/providers/contract.ts new file mode 100644 index 0000000..9834c84 --- /dev/null +++ b/apps/api/src/application/usecases/shop/providers/contract.ts @@ -0,0 +1,15 @@ +import z from "zod"; + +import { ShopProvider } from "@/shared/schemas/ShopProvider"; + +export const ShopProvidersContractSchema = { + input: z.unknown(), + output: z.array(ShopProvider), +}; + +export type ShopProvidersContractInput = z.infer< + typeof ShopProvidersContractSchema.input +>; +export type ShopProvidersContractOutput = z.infer< + typeof ShopProvidersContractSchema.output +>; diff --git a/apps/api/src/application/usecases/shop/providers/index.ts b/apps/api/src/application/usecases/shop/providers/index.ts new file mode 100644 index 0000000..d1f831c --- /dev/null +++ b/apps/api/src/application/usecases/shop/providers/index.ts @@ -0,0 +1,23 @@ +import { inject, injectable } from "tsyringe"; +import type { ShopService } from "@/application/services"; +import { TOKENS } from "@/infra/di/tokens"; +import type { UseCase } from "@/shared/interfaces/usecase"; +import type { + ShopProvidersContractInput, + ShopProvidersContractOutput, +} from "./contract"; + +@injectable() +export class ShopProvidersUserCase + implements UseCase +{ + constructor( + @inject(TOKENS.ShopService) private readonly shopService: ShopService, + ) {} + + execute( + _input: ShopProvidersContractInput, + ): Promise { + return this.shopService.getAllProviders(); + } +} diff --git a/apps/api/src/application/usecases/shop/services/contract.ts b/apps/api/src/application/usecases/shop/services/contract.ts new file mode 100644 index 0000000..ebdef4d --- /dev/null +++ b/apps/api/src/application/usecases/shop/services/contract.ts @@ -0,0 +1,14 @@ +import z from "zod"; +import { ShopService } from "@/shared/schemas/ShopService"; + +export const ShopServicesContractSchema = { + input: z.unknown(), + output: z.array(ShopService), +}; + +export type ShopServicesContractInput = z.infer< + typeof ShopServicesContractSchema.input +>; +export type ShopServicesContractOutput = z.infer< + typeof ShopServicesContractSchema.output +>; diff --git a/apps/api/src/application/usecases/shop/services/index.ts b/apps/api/src/application/usecases/shop/services/index.ts new file mode 100644 index 0000000..fed85a5 --- /dev/null +++ b/apps/api/src/application/usecases/shop/services/index.ts @@ -0,0 +1,23 @@ +import { inject, injectable } from "tsyringe"; +import type { ShopService } from "@/application/services"; +import { TOKENS } from "@/infra/di/tokens"; +import type { UseCase } from "@/shared/interfaces/usecase"; +import type { + ShopServicesContractInput, + ShopServicesContractOutput, +} from "./contract"; + +@injectable() +export class ShopServicesUseCase + implements UseCase +{ + constructor( + @inject(TOKENS.ShopService) private readonly shopService: ShopService, + ) {} + + async execute( + _input: ShopServicesContractInput, + ): Promise { + return this.shopService.getAllServices(); + } +} diff --git a/apps/api/src/domain/clients/index.ts b/apps/api/src/domain/clients/index.ts index 599687e..d08e246 100644 --- a/apps/api/src/domain/clients/index.ts +++ b/apps/api/src/domain/clients/index.ts @@ -2,6 +2,7 @@ export * from "./discord"; export * from "./discord/api"; export * from "./http"; export * from "./mailer"; +export * from "./mercadopago"; export * from "./otsServer"; export * from "./prisma"; export * from "./redis"; diff --git a/apps/api/src/domain/clients/mercadopago/index.ts b/apps/api/src/domain/clients/mercadopago/index.ts new file mode 100644 index 0000000..90a0028 --- /dev/null +++ b/apps/api/src/domain/clients/mercadopago/index.ts @@ -0,0 +1,55 @@ +import { inject, injectable } from "tsyringe"; +import { TOKENS } from "@/infra/di/tokens"; +import { env } from "@/infra/env"; +import type { HttpClient } from "../http"; +import type { + MPCreatePaymentResponse, + MPCreatePixPayment, + MPCreatePreferenceInput, + MPGetPaymentResponse, +} from "./types"; + +@injectable() +export class MercadoPagoClient { + constructor( + @inject(TOKENS.MercadoPagoHttpClient) + private readonly httpClient: HttpClient, + ) {} + + async createPreference(input: MPCreatePreferenceInput) { + const response = await this.httpClient.post("/checkout/preferences", input); + + return response.data; + } + + async getPaymentById(id: number) { + const response = await this.httpClient.get( + `/v1/payments/${id}`, + ); + + return response.data; + } + + async createPayment( + input: Omit, + ): Promise { + const { x_idempotency_key, ...rest } = input; + + const inputWithNotification = { + ...rest, + notification_url: env.MERCADO_PAGO_WEBHOOK_URL, + }; + + const response = await this.httpClient.post( + "/v1/payments", + inputWithNotification, + { + headers: { + "X-Idempotency-Key": x_idempotency_key, + }, + }, + ); + + return response.data; + } +} diff --git a/apps/api/src/domain/clients/mercadopago/types.ts b/apps/api/src/domain/clients/mercadopago/types.ts new file mode 100644 index 0000000..e8254fb --- /dev/null +++ b/apps/api/src/domain/clients/mercadopago/types.ts @@ -0,0 +1,88 @@ +export type MPItem = { + title: string; + description?: string; + quantity: number; + currency_id: "BRL"; + unit_price: number; +}; + +export type MPCreatePreferenceInput = { + external_reference: string; + items: MPItem[]; + back_urls: { + success: string; + failure: string; + pending: string; + }; + notification_url: string; + payer?: { + email?: string; + name?: string; + }; +}; + +type MPStatus = + | "pending" + | "approved" + | "authorized" + | "in_process" + | "in_mediation" + | "rejected" + | "cancelled" + | "refunded" + | "charged_back"; + +export type MPCreatePixPayment = { + x_idempotency_key: string; + external_reference: string; + payment_method_id: "pix"; + notification_url: string; + status?: MPStatus; + payer: { + email: string; + first_name?: string; + last_name?: string; + }; + installments: 1; + transaction_amount: number; + description?: string; +}; + +export type MPCreatePaymentResponse = { + id: number; + external_reference: string; + date_created: string; + date_approved: string | null; + date_last_updated: string; + date_of_expiration: string | null; + operation_type: + | "investment" + | "regular_payment" + | "money_transfer" + | "recurring_payment" + | "account_fund" + | "payment_addition" + | "cellphone_recharge" + | "pos_payment" + | "money_exchange"; + payment_type_id: + | "ticket" + | "bank_transfer" + | "atm" + | "credit_card" + | "debit_card" + | "prepaid_card" + | "digital_currency" + | "digital_wallet" + | "voucher_card" + | "crypto_transfer"; + status: MPStatus; + point_of_interaction: { + transaction_data: { + qr_code: string | null; + qr_code_base64: string | null; + }; + }; +}; + +export type MPGetPaymentResponse = MPCreatePaymentResponse; diff --git a/apps/api/src/domain/repositories/index.ts b/apps/api/src/domain/repositories/index.ts index 29b2dd4..bacc93a 100644 --- a/apps/api/src/domain/repositories/index.ts +++ b/apps/api/src/domain/repositories/index.ts @@ -10,4 +10,7 @@ export * from "./live"; export * from "./otsServer"; export * from "./players"; export * from "./session"; +export * from "./shopProviders"; +export * from "./shopServices"; +export * from "./shopTransactions"; export * from "./worlds"; diff --git a/apps/api/src/domain/repositories/shopProviders/index.ts b/apps/api/src/domain/repositories/shopProviders/index.ts new file mode 100644 index 0000000..0cac363 --- /dev/null +++ b/apps/api/src/domain/repositories/shopProviders/index.ts @@ -0,0 +1,30 @@ +import type { ShopProvider, ShopProviderMethod } from "generated/client"; +import { inject, injectable } from "tsyringe"; +import type { Prisma } from "@/domain/clients"; +import { TOKENS } from "@/infra/di/tokens"; + +@injectable() +export class ShopProvidersRepository { + constructor(@inject(TOKENS.Prisma) private readonly database: Prisma) {} + + findById(id: number) { + return this.database.miforge_shop_providers.findUnique({ + where: { id }, + }); + } + + findByMethodAndProvider(method: ShopProviderMethod, provider: ShopProvider) { + return this.database.miforge_shop_providers.findUnique({ + where: { + uniq_method_provider: { + method, + provider, + }, + }, + }); + } + + findAll() { + return this.database.miforge_shop_providers.findMany(); + } +} diff --git a/apps/api/src/domain/repositories/shopServices/index.ts b/apps/api/src/domain/repositories/shopServices/index.ts new file mode 100644 index 0000000..1c75f14 --- /dev/null +++ b/apps/api/src/domain/repositories/shopServices/index.ts @@ -0,0 +1,28 @@ +import { inject, injectable } from "tsyringe"; +import type { Prisma } from "@/domain/clients"; +import { TOKENS } from "@/infra/di/tokens"; + +@injectable() +export class ShopServicesRepository { + constructor(@inject(TOKENS.Prisma) private readonly database: Prisma) {} + + async listAll() { + return this.database.miforge_shop_service.findMany(); + } + + async findById(id: number) { + return this.database.miforge_shop_service.findUnique({ + where: { + id, + }, + }); + } + + async findBySlug(slug: string) { + return this.database.miforge_shop_service.findUnique({ + where: { + slug, + }, + }); + } +} diff --git a/apps/api/src/domain/repositories/shopTransactions/index.ts b/apps/api/src/domain/repositories/shopTransactions/index.ts new file mode 100644 index 0000000..ad150bc --- /dev/null +++ b/apps/api/src/domain/repositories/shopTransactions/index.ts @@ -0,0 +1,41 @@ +import type { ShopTransactionStatus } from "generated/client"; +import { inject, injectable } from "tsyringe"; +import type { Prisma } from "@/domain/clients"; +import { TOKENS } from "@/infra/di/tokens"; + +@injectable() +export class ShopTransactionsRepository { + constructor(@inject(TOKENS.Prisma) private readonly database: Prisma) {} + + async createTransaction(data: { + serviceId: number; + accountId: number; + providerId: number; + status?: ShopTransactionStatus; + units?: number; + total?: number; + }) { + return this.database.miforge_shop_transactions.create({ + data: { + status: data.status ?? "PENDING", + providerId: data.providerId, + accountId: data.accountId, + serviceId: data.serviceId, + total: data.total ?? 0, + units: data.units ?? 1, + }, + }); + } + + async attachMethodTransactionId( + transactionId: number, + methodTransactionId: string, + ) { + return this.database.miforge_shop_transactions.update({ + where: { id: transactionId }, + data: { + methodTransactionId: methodTransactionId, + }, + }); + } +} diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index f768b0f..4c2f7e6 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -16,6 +16,11 @@ if (import.meta.main) { bootstrapDiscord(); bootstrapJobs(); + const configRepository = container.resolve(TOKENS.ConfigRepository); + + await configRepository.updateConfig({}); + logger.info("[Config]: Configuration initialized/updated"); + const app = appFactory(); const server = Bun.serve({ diff --git a/apps/api/src/infra/di/containers/clients.ts b/apps/api/src/infra/di/containers/clients.ts index 6b75b95..9f8033c 100644 --- a/apps/api/src/infra/di/containers/clients.ts +++ b/apps/api/src/infra/di/containers/clients.ts @@ -2,6 +2,7 @@ import { container, Lifecycle } from "tsyringe"; import { DiscordApiClient, HttpClient, + MercadoPagoClient, OtsServerClient, } from "@/domain/clients"; import { env } from "@/infra/env"; @@ -28,6 +29,24 @@ export function registerClients() { }, }); + container.register(TOKENS.MercadoPagoHttpClient, { + useFactory: (c) => { + const logger = c.resolve(TOKENS.Logger); + return new HttpClient(logger, { + baseURL: env.MERCADO_PAGO_BASE_URL, + headers: { + Authorization: `Bearer ${env.MERCADO_PAGO_ACCESS_TOKEN}`, + }, + }); + }, + }); + + container.register( + TOKENS.MercadoPagoClient, + { useClass: MercadoPagoClient }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); + container.register( TOKENS.DiscordApiClient, { useClass: DiscordApiClient }, diff --git a/apps/api/src/infra/di/containers/repositories.ts b/apps/api/src/infra/di/containers/repositories.ts index a5507b8..ec4dbd7 100644 --- a/apps/api/src/infra/di/containers/repositories.ts +++ b/apps/api/src/infra/di/containers/repositories.ts @@ -10,6 +10,9 @@ import { OtsServerRepository, PlayersRepository, SessionRepository, + ShopProvidersRepository, + ShopServicesRepository, + ShopTransactionsRepository, } from "@/domain/repositories"; import { WorldsRepository } from "@/domain/repositories/worlds"; import { TOKENS } from "../tokens"; @@ -67,6 +70,21 @@ export function registerRepositories() { { useClass: AccountOauthRepository }, { lifecycle: Lifecycle.ResolutionScoped }, ); + container.register( + TOKENS.ShopServicesRepository, + { useClass: ShopServicesRepository }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); + container.register( + TOKENS.ShopTransactionsRepository, + { useClass: ShopTransactionsRepository }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); + container.register( + TOKENS.ShopProvidersRepository, + { useClass: ShopProvidersRepository }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); // Repositories with singleton lifecycle container.register( diff --git a/apps/api/src/infra/di/containers/services.ts b/apps/api/src/infra/di/containers/services.ts index 5d79629..f71cb42 100644 --- a/apps/api/src/infra/di/containers/services.ts +++ b/apps/api/src/infra/di/containers/services.ts @@ -7,9 +7,11 @@ import { AuditService, ConfigService, LostAccountService, + MercadoPagoService, PlayersService, RecoveryKeyService, SessionService, + ShopService, TibiaClientService, WorldsService, } from "@/application/services"; @@ -76,4 +78,15 @@ export function registerServices() { { useClass: AccountOauthService }, { lifecycle: Lifecycle.ResolutionScoped }, ); + container.register( + TOKENS.ShopService, + { useClass: ShopService }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); + + container.register( + TOKENS.MercadoPagoService, + { useClass: MercadoPagoService }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); } diff --git a/apps/api/src/infra/di/containers/usecases.ts b/apps/api/src/infra/di/containers/usecases.ts index 1b96a30..8976fc4 100644 --- a/apps/api/src/infra/di/containers/usecases.ts +++ b/apps/api/src/infra/di/containers/usecases.ts @@ -43,6 +43,9 @@ import { SessionCanBeAuthenticatedUseCase, SessionInfoUseCase, SessionNotAuthenticatedUseCase, + ShopCreateOrderUseCase, + ShopProvidersUserCase, + ShopServicesUseCase, TibiaLoginUseCase, WorldsListUseCase, } from "@/application/usecases"; @@ -287,4 +290,20 @@ export function registerUseCases() { { useClass: AccountDiscordOauthUnlinkUseCase }, { lifecycle: Lifecycle.ResolutionScoped }, ); + + container.register( + TOKENS.ShopServicesUseCase, + { useClass: ShopServicesUseCase }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); + container.register( + TOKENS.ShopProvidersUserCase, + { useClass: ShopProvidersUserCase }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); + container.register( + TOKENS.ShopCreateOrderUseCase, + { useClass: ShopCreateOrderUseCase }, + { lifecycle: Lifecycle.ResolutionScoped }, + ); } diff --git a/apps/api/src/infra/di/tokens.ts b/apps/api/src/infra/di/tokens.ts index c0d5d17..8284390 100644 --- a/apps/api/src/infra/di/tokens.ts +++ b/apps/api/src/infra/di/tokens.ts @@ -8,9 +8,11 @@ import type { AuditService, ConfigService, LostAccountService, + MercadoPagoService, PlayersService, RecoveryKeyService, SessionService, + ShopService, TibiaClientService, WorldsService, } from "@/application/services"; @@ -58,6 +60,9 @@ import type { SessionCanBeAuthenticatedUseCase, SessionInfoUseCase, SessionNotAuthenticatedUseCase, + ShopCreateOrderUseCase, + ShopProvidersUserCase, + ShopServicesUseCase, TibiaLoginUseCase, WorldsListUseCase, } from "@/application/usecases"; @@ -79,6 +84,7 @@ import type { DiscordClient, HttpClient, Mailer, + MercadoPagoClient, OtsServerClient, Prisma, Redis, @@ -114,6 +120,9 @@ import type { OtsServerRepository, PlayersRepository, SessionRepository, + ShopProvidersRepository, + ShopServicesRepository, + ShopTransactionsRepository, } from "@/domain/repositories"; import type { WorldsRepository } from "@/domain/repositories/worlds"; import type { EmailQueue } from "@/jobs/queue/email"; @@ -174,6 +183,15 @@ const REPOSITORIES_TOKENS = { AccountOauthRepository: token( "AccountOauthRepository", ), + ShopServicesRepository: token( + "ShopServicesRepository", + ), + ShopTransactionsRepository: token( + "ShopTransactionsRepository", + ), + ShopProvidersRepository: token( + "ShopProvidersRepository", + ), }; const UTILS_TOKENS = { @@ -321,6 +339,11 @@ const USECASES_TOKENS = { PlayerOutfitUseCase: token("PlayerOutfitUseCase"), PlayerOutfitsUseCase: token("PlayerOutfitsUseCase"), TibiaLoginUseCase: token("TibiaLoginUseCase"), + ShopServicesUseCase: token("ShopServicesUseCase"), + ShopProvidersUserCase: token("ShopProvidersUserCase"), + ShopCreateOrderUseCase: token( + "ShopCreateOrderUseCase", + ), }; const SERVICES_TOKENS = { @@ -340,6 +363,8 @@ const SERVICES_TOKENS = { LostAccountService: token("LostAccountService"), RecoveryKeyService: token("RecoveryKeyService"), AccountOauthService: token("AccountOauthService"), + ShopService: token("ShopService"), + MercadoPagoService: token("MercadoPagoService"), }; const QUEUE_AND_WORKERS_TOKENS = { @@ -357,6 +382,8 @@ const CLIENTS_TOKENS = { AppLivePublisher: token("AppLivePublisher"), OtsServerClient: token("OtsServerClient"), HttpClient: token("HttpClient"), + MercadoPagoHttpClient: token("MercadoPagoHttpClient"), + MercadoPagoClient: token("MercadoPagoClient"), }; export const TOKENS = { diff --git a/apps/api/src/infra/env/index.ts b/apps/api/src/infra/env/index.ts index bcd79c8..2869d7a 100644 --- a/apps/api/src/infra/env/index.ts +++ b/apps/api/src/infra/env/index.ts @@ -91,6 +91,17 @@ const DISCORD_CONFIG_SCHEMA = z.object({ DISCORD_API_URL: z.url().default("https://discord.com"), }); +const MERCADO_PAGO_CONFIG_SCHEMA = z.object({ + MERCADO_PAGO_ENABLED: z + .string() + .transform((val) => val === "true" || val === "1") + .default(false), + MERCADO_PAGO_BASE_URL: z.url().default("https://api.mercadopago.com"), + MERCADO_PAGO_ACCESS_TOKEN: z.string().optional(), + MERCADO_PAGO_WEBHOOK_URL: z.url().optional(), + MERCADO_PAGO_WEBHOOK_SECRET: z.string().optional(), +}); + const envSchema = z.object({ ...FRONTEND_CONFIG_SCHEMA.shape, ...SERVER_CONFIG_SCHEMA.shape, @@ -100,6 +111,7 @@ const envSchema = z.object({ ...MAILER_CONFIG_SCHEMA.shape, ...OUTFIT_CONFIG_SCHEMA.shape, ...DISCORD_CONFIG_SCHEMA.shape, + ...MERCADO_PAGO_CONFIG_SCHEMA.shape, LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"), SERVICE_NAME: z.string().default("miforge-api"), PORT: z.coerce.number().default(4000), @@ -172,4 +184,22 @@ export const env = envSchema } } }) + .superRefine((env, ctx) => { + if (!env.MERCADO_PAGO_ENABLED) return; + + const requiredFields: (keyof typeof env)[] = [ + "MERCADO_PAGO_ACCESS_TOKEN", + "MERCADO_PAGO_WEBHOOK_URL", + "MERCADO_PAGO_WEBHOOK_SECRET", + ]; + + for (const field of requiredFields) { + if (!env[field]) { + ctx.addIssue({ + code: "custom", + message: `${field} is required when MERCADO_PAGO_ENABLED is true`, + }); + } + } + }) .parse(process.env); diff --git a/apps/api/src/presentation/v1/routes/index.ts b/apps/api/src/presentation/v1/routes/index.ts index e55021c..e8ff000 100644 --- a/apps/api/src/presentation/v1/routes/index.ts +++ b/apps/api/src/presentation/v1/routes/index.ts @@ -4,8 +4,10 @@ import { clientRouter } from "./client"; import { configRouter } from "./config"; import { lostAccountRouter } from "./lost"; import { outfitRouter } from "./outfit"; +import { paymentsRouter } from "./payments"; import { pingRoute } from "./ping"; import { sessionRouter } from "./session"; +import { shopRouter } from "./shop"; import { worldsRouter } from "./worlds"; export const router = base.router({ @@ -17,4 +19,6 @@ export const router = base.router({ config: configRouter, outfit: outfitRouter, lost: lostAccountRouter, + payments: paymentsRouter, + shop: shopRouter, }); diff --git a/apps/api/src/presentation/v1/routes/payments/index.ts b/apps/api/src/presentation/v1/routes/payments/index.ts new file mode 100644 index 0000000..7ca0de4 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/payments/index.ts @@ -0,0 +1,6 @@ +import { base } from "@/infra/rpc/base"; +import { mercadoPagoRouter } from "./mercadopago"; + +export const paymentsRouter = base.tag("Payments").prefix("/payments").router({ + mercadopago: mercadoPagoRouter, +}); diff --git a/apps/api/src/presentation/v1/routes/payments/mercadopago/index.ts b/apps/api/src/presentation/v1/routes/payments/mercadopago/index.ts new file mode 100644 index 0000000..3d1e043 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/payments/mercadopago/index.ts @@ -0,0 +1,8 @@ +import { base } from "@/infra/rpc/base"; +import { mercadopagoPaymentRoute } from "./payment"; +import { mercadopagoWebhookRoute } from "./webhook"; + +export const mercadoPagoRouter = base.prefix("/mercadopago").router({ + webhook: mercadopagoWebhookRoute, + payment: mercadopagoPaymentRoute, +}); diff --git a/apps/api/src/presentation/v1/routes/payments/mercadopago/payment/index.ts b/apps/api/src/presentation/v1/routes/payments/mercadopago/payment/index.ts new file mode 100644 index 0000000..12323e2 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/payments/mercadopago/payment/index.ts @@ -0,0 +1,12 @@ +import { publicProcedure } from "@/presentation/procedures/public"; + +export const mercadopagoPaymentRoute = publicProcedure + .route({ + method: "POST", + path: "/payment", + summary: "Create MercadoPago Payment", + description: "Endpoint to create a test payment in MercadoPago.", + }) + .handler(async ({ input, context }) => { + return { message: "Payment test endpoint" }; + }); diff --git a/apps/api/src/presentation/v1/routes/payments/mercadopago/test/index.ts b/apps/api/src/presentation/v1/routes/payments/mercadopago/test/index.ts new file mode 100644 index 0000000..346bf78 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/payments/mercadopago/test/index.ts @@ -0,0 +1,31 @@ +// import { TOKENS } from "@/infra/di/tokens"; + +// import { publicProcedure } from "@/presentation/procedures/public"; + +// export const mercadopagoPaymentTestRoute = publicProcedure +// .route({ +// method: "POST", +// path: "/payment-test", +// summary: "MercadoPago Webhook", +// description: +// "Endpoint to receive notifications from MercadoPago about payment events.", +// }) +// .handler(async ({ input, context }) => { +// const mercadoPagoClient = context.di.resolve(TOKENS.MercadoPagoClient); + +// const response = await mercadoPagoClient.createPayment({ +// x_idempotency_key: "TEST_PIX_KEY_6", +// external_reference: "TEST_PIX_6", +// payment_method_id: "pix", +// installments: 1, +// notification_url: +// "https://05c9e00e89ac.ngrok-free.app/v1/payments/mercadopago/webhook", +// payer: { +// email: "test@example.com", +// }, +// transaction_amount: 1.0, +// description: "Test PIX Payment", +// }); + +// return response; +// }); diff --git a/apps/api/src/presentation/v1/routes/payments/mercadopago/webhook/index.ts b/apps/api/src/presentation/v1/routes/payments/mercadopago/webhook/index.ts new file mode 100644 index 0000000..268e2b8 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/payments/mercadopago/webhook/index.ts @@ -0,0 +1,127 @@ +import crypto from "node:crypto"; +import z from "zod"; +import { TOKENS } from "@/infra/di/tokens"; +import { env } from "@/infra/env"; +import { publicProcedure } from "@/presentation/procedures/public"; + +export function validateMpSignatureFromRequest( + xSignature: string | null, + xRequestId: string | null, + dataId: string | null, +): boolean { + if (!xSignature || !xRequestId || !dataId) return false; + if (!env.MERCADO_PAGO_WEBHOOK_SECRET) return false; + + const parts = xSignature.split(","); + let ts: string | undefined; + let hash: string | undefined; + + for (const part of parts) { + const [rawKey, rawValue] = part.split("="); + if (!rawKey || !rawValue) continue; + + const key = rawKey.trim(); + const value = rawValue.trim(); + + if (key === "ts") ts = value; + if (key === "v1") hash = value; + } + + if (!ts || !hash) return false; + + const manifest = `id:${dataId};request-id:${xRequestId};ts:${ts};`; + + const sha = crypto + .createHmac("sha256", env.MERCADO_PAGO_WEBHOOK_SECRET) + .update(manifest) + .digest("hex"); + + return crypto.timingSafeEqual(Buffer.from(sha), Buffer.from(hash)); +} + +const MPSchemaMerchantOrder = z.object({ + query: z.object({ + id: z.coerce.string(), + topic: z.literal("merchant_order"), + }), + body: z.object({ + resource: z.url(), + topic: z.literal("merchant_order"), + }), +}); + +const MPSchemaOthers = z.object({ + query: z.object({ + "data.id": z.string(), + type: z.enum([ + "payment", + "stop_delivery_op_wh", + "delivery_cancellation", + "topic_claims_integration_wh", + "topic_chargebacks_wh", + ]), + }), + body: z.object({ + action: z.string().optional(), + api_version: z.string().optional(), + application_id: z.string().optional(), + id: z.coerce.string().optional(), + live_mode: z.boolean().optional(), + type: z.string().optional(), + user_id: z.coerce.string().optional(), + data: z + .object({ + id: z.string().optional(), + }) + .optional(), + }), +}); + +const Schema = { + input: z.union([MPSchemaMerchantOrder, MPSchemaOthers]), + output: z.object({ + ok: z.boolean(), + }), +}; + +export const mercadopagoWebhookRoute = publicProcedure + .route({ + method: "POST", + path: "/webhook", + summary: "MercadoPago Webhook", + inputStructure: "detailed", + description: + "Endpoint to receive notifications from MercadoPago about payment events.", + }) + .input(Schema.input) + .output(Schema.output) + .handler(async ({ input, context }) => { + const httpContext = context.di.resolve(TOKENS.HttpContext); + console.log("input", input); + + const signatureHeader = httpContext.req.header("x-signature") as + | string + | null; + + const requestId = httpContext.req.header("x-request-id") as string | null; + + let paymentId: string | null = null; + + if ("data.id" in input.query) { + paymentId = input.query["data.id"]; + } else if ("id" in input.query) { + paymentId = input.query.id; + } + + const isValid = validateMpSignatureFromRequest( + signatureHeader, + requestId, + paymentId, + ); + + console.log("Received MercadoPago webhook:", isValid); + + return { + ok: true, + }; + }); diff --git a/apps/api/src/presentation/v1/routes/shop/index.ts b/apps/api/src/presentation/v1/routes/shop/index.ts new file mode 100644 index 0000000..fc91538 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/shop/index.ts @@ -0,0 +1,10 @@ +import { base } from "@/infra/rpc/base"; +import { ordersRouter } from "./orders"; +import { providersRoute } from "./providers"; +import { servicesRoute } from "./services"; + +export const shopRouter = base.tag("Shop").prefix("/shop").router({ + services: servicesRoute, + providers: providersRoute, + orders: ordersRouter, +}); diff --git a/apps/api/src/presentation/v1/routes/shop/orders/create/index.ts b/apps/api/src/presentation/v1/routes/shop/orders/create/index.ts new file mode 100644 index 0000000..abbb80b --- /dev/null +++ b/apps/api/src/presentation/v1/routes/shop/orders/create/index.ts @@ -0,0 +1,15 @@ +import { ShopCreateOrderContractSchema } from "@/application/usecases/shop/createOrder/contract"; +import { isAuthenticatedProcedure } from "@/presentation/procedures/isAuthenticated"; + +export const createOrderRoute = isAuthenticatedProcedure + .route({ + method: "POST", + path: "/", + summary: "Create Order", + description: "Create a new order", + }) + .input(ShopCreateOrderContractSchema.input) + .output(ShopCreateOrderContractSchema.output) + .handler(async ({ input, context }) => { + return context.usecases.shop.orderCreate.execute(input); + }); diff --git a/apps/api/src/presentation/v1/routes/shop/orders/index.ts b/apps/api/src/presentation/v1/routes/shop/orders/index.ts new file mode 100644 index 0000000..a84977a --- /dev/null +++ b/apps/api/src/presentation/v1/routes/shop/orders/index.ts @@ -0,0 +1,6 @@ +import { base } from "@/infra/rpc/base"; +import { createOrderRoute } from "./create"; + +export const ordersRouter = base.prefix("/orders").router({ + create: createOrderRoute, +}); diff --git a/apps/api/src/presentation/v1/routes/shop/providers/index.ts b/apps/api/src/presentation/v1/routes/shop/providers/index.ts new file mode 100644 index 0000000..54561c4 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/shop/providers/index.ts @@ -0,0 +1,15 @@ +import { ShopProvidersContractSchema } from "@/application/usecases/shop/providers/contract"; +import { publicProcedure } from "@/presentation/procedures/public"; + +export const providersRoute = publicProcedure + .route({ + method: "GET", + path: "/providers", + summary: "Providers", + description: "Get a list of available providers", + }) + .input(ShopProvidersContractSchema.input) + .output(ShopProvidersContractSchema.output) + .handler(async ({ input, context }) => { + return context.usecases.shop.providers.execute(input); + }); diff --git a/apps/api/src/presentation/v1/routes/shop/services/index.ts b/apps/api/src/presentation/v1/routes/shop/services/index.ts new file mode 100644 index 0000000..b24b764 --- /dev/null +++ b/apps/api/src/presentation/v1/routes/shop/services/index.ts @@ -0,0 +1,15 @@ +import { ShopServicesContractSchema } from "@/application/usecases/shop/services/contract"; +import { publicProcedure } from "@/presentation/procedures/public"; + +export const servicesRoute = publicProcedure + .route({ + method: "GET", + path: "/services", + summary: "Services", + description: "Get a list of available services", + }) + .input(ShopServicesContractSchema.input) + .output(ShopServicesContractSchema.output) + .handler(async ({ input, context }) => { + return context.usecases.shop.services.execute(input); + }); diff --git a/apps/api/src/shared/schemas/Config.ts b/apps/api/src/shared/schemas/Config.ts index b916060..1a54939 100644 --- a/apps/api/src/shared/schemas/Config.ts +++ b/apps/api/src/shared/schemas/Config.ts @@ -17,6 +17,13 @@ export const MiforgeConfigSchema = z.object({ .default({ enabled: false, }), + mercado_pago: z + .object({ + enabled: z.boolean().default(false), + }) + .default({ + enabled: false, + }), mailer: z .object({ enabled: z.boolean().default(false), diff --git a/apps/api/src/shared/schemas/ShopOrder.ts b/apps/api/src/shared/schemas/ShopOrder.ts new file mode 100644 index 0000000..fe39019 --- /dev/null +++ b/apps/api/src/shared/schemas/ShopOrder.ts @@ -0,0 +1,22 @@ +import { + ShopProvider, + ShopProviderMethod, + ShopTransactionStatus, +} from "generated/client"; +import z from "zod"; + +export const ShopOrder = z.object({ + id: z.number(), + price: z.number(), + status: z.enum(ShopTransactionStatus), + method: z.enum(ShopProviderMethod), + provider: z.enum(ShopProvider), + interaction: z.object({ + transaction: z.object({ + qr_code: z.string().nullable(), + qr_code_base64: z.string().nullable(), + }), + }), +}); + +export type ShopOrder = z.infer; diff --git a/apps/api/src/shared/schemas/ShopProvider.ts b/apps/api/src/shared/schemas/ShopProvider.ts new file mode 100644 index 0000000..a21349a --- /dev/null +++ b/apps/api/src/shared/schemas/ShopProvider.ts @@ -0,0 +1,23 @@ +import { + ShopProvider as ShopProviderEnum, + ShopProviderMethod as ShopProviderMethodEnum, +} from "generated/client"; +import z from "zod"; + +const ProviderMethod = z.enum(ShopProviderMethodEnum); +const Provider = z.enum(ShopProviderEnum); + +export const ShopProvider = z.object({ + id: z.number().int().nonnegative(), + name: z.string(), + description: z.string().nullable(), + isActive: z.boolean(), + method: ProviderMethod, + provider: Provider, + created_at: z.date(), + updated_at: z.date(), +}); + +export type ShopProvider = z.infer; +export type ShopProviderMethod = z.infer; +export type Provider = z.infer; diff --git a/apps/api/src/shared/schemas/ShopService.ts b/apps/api/src/shared/schemas/ShopService.ts new file mode 100644 index 0000000..42f9a12 --- /dev/null +++ b/apps/api/src/shared/schemas/ShopService.ts @@ -0,0 +1,17 @@ +import { ShopServiceType } from "generated/client"; +import z from "zod"; + +export const ShopService = z.object({ + id: z.number().int().nonnegative(), + type: z.enum(ShopServiceType), + slug: z.string().max(100), + title: z.string().max(255), + description: z.string().nullable(), + unit_price: z.number().nonnegative(), + quantity: z.number().int().nonnegative(), + is_active: z.boolean().default(true), + created_at: z.date(), + updated_at: z.date(), +}); + +export type ShopService = z.infer; diff --git a/apps/api/src/shared/schemas/ShopTransactions.ts b/apps/api/src/shared/schemas/ShopTransactions.ts new file mode 100644 index 0000000..7b0497a --- /dev/null +++ b/apps/api/src/shared/schemas/ShopTransactions.ts @@ -0,0 +1,17 @@ +import { ShopTransactionStatus as ShopTransactionStatusEnum } from "generated/client"; +import z from "zod"; + +export const ShopTransactionStatus = z.enum(ShopTransactionStatusEnum); + +export const ShopTransaction = z.object({ + id: z.int(), + status: ShopTransactionStatus, + methodTransactionId: z.string().max(255).nullable(), + units: z.number().int().nonnegative(), + total: z.number().int().nonnegative(), + providerId: z.int(), + serviceId: z.int(), + accountId: z.int(), + createdAt: z.date(), + updatedAt: z.date(), +}); diff --git a/apps/api/src/shared/utils/money.ts b/apps/api/src/shared/utils/money.ts new file mode 100644 index 0000000..2adba93 --- /dev/null +++ b/apps/api/src/shared/utils/money.ts @@ -0,0 +1,3 @@ +export const centsToFloat = (cents: number): number => { + return cents / 100; +}; diff --git a/apps/web/src/components/Payments/PaymentMethod/index.tsx b/apps/web/src/components/Payments/PaymentMethod/index.tsx index 1757b2e..fc1f55d 100644 --- a/apps/web/src/components/Payments/PaymentMethod/index.tsx +++ b/apps/web/src/components/Payments/PaymentMethod/index.tsx @@ -1,27 +1,28 @@ +import type { ShopProviderMethod } from "@miforge/api/shared/schemas/ShopProvider"; import { cn } from "@/sdk/utils/cn"; -type MethodMetaKey = "mercado-pago" | "pag-seguro" | "pix"; - -const METHOD_META: Record = - { - "mercado-pago": { - icon: "/assets/payments/methods/mercado-pago.png", - }, - pix: { - icon: "/assets/payments/methods/pix.webp", - className: " mx-auto rounded-md w-[80px]", - }, - "pag-seguro": { - icon: "/assets/payments/methods/pag-seguro.png", - }, - }; +const METHOD_META: Record< + ShopProviderMethod, + { icon: string; className?: string } +> = { + // "mercado-pago": { + // icon: "/assets/payments/methods/mercado-pago.png", + // }, + PIX: { + icon: "/assets/payments/methods/pix.webp", + className: " mx-auto rounded-md w-[80px]", + }, + // "pag-seguro": { + // icon: "/assets/payments/methods/pag-seguro.png", + // }, +}; type PaymentMethodItemProps = { selected: boolean; onClick: () => void; title: string; speed?: "instant" | "medium" | "slow"; - method: MethodMetaKey; + method: ShopProviderMethod; }; export const PaymentMethodItem = ({ diff --git a/apps/web/src/sections/shop_donate/form/index.tsx b/apps/web/src/sections/shop_donate/form/index.tsx index 410fffb..cb46e7f 100644 --- a/apps/web/src/sections/shop_donate/form/index.tsx +++ b/apps/web/src/sections/shop_donate/form/index.tsx @@ -5,14 +5,14 @@ import z from "zod"; import { useSession } from "@/sdk/contexts/session"; import { Container } from "@/ui/Container"; import { Form } from "@/ui/Form"; -import { ShopDonateStepPayments } from "./payments"; +import { ShopDonateStepProviders } from "./providers"; import { ShopDonateStepReview } from "./review"; import { ShopDonateStepServices } from "./services"; const FormSchema = z.object({ - step: z.enum(["payments", "services", "review"]), - paymentMethod: z.enum(["MERCADO_PAGO_PIX"]), - serviceId: z.string(), + step: z.enum(["providers", "services", "review"]), + providerId: z.number(), + serviceId: z.number(), consent: z.boolean().refine((val) => val === true, { message: "You must give consent to proceed", }), @@ -26,7 +26,7 @@ export const ShopDonateForm = () => { const form = useForm({ resolver: zodResolver(FormSchema), defaultValues: { - step: "payments", + step: "providers", }, }); @@ -34,7 +34,7 @@ export const ShopDonateForm = () => { const title = useMemo(() => { switch (step) { - case "payments": + case "providers": return "Select Payment Method"; case "services": return "Select Products"; @@ -59,7 +59,7 @@ export const ShopDonateForm = () => {
- + diff --git a/apps/web/src/sections/shop_donate/form/payments/index.tsx b/apps/web/src/sections/shop_donate/form/providers/index.tsx similarity index 60% rename from apps/web/src/sections/shop_donate/form/payments/index.tsx rename to apps/web/src/sections/shop_donate/form/providers/index.tsx index 8d56c7c..2a14f18 100644 --- a/apps/web/src/sections/shop_donate/form/payments/index.tsx +++ b/apps/web/src/sections/shop_donate/form/providers/index.tsx @@ -1,25 +1,22 @@ +import { useQuery } from "@tanstack/react-query"; import { useFormContext } from "react-hook-form"; import { PaymentMethodItem } from "@/components/Payments/PaymentMethod"; +import { api } from "@/sdk/lib/api/factory"; import { ButtonImage } from "@/ui/Buttons/ButtonImage"; import { InnerContainer } from "@/ui/Container/Inner"; import { FormField, FormItem, FormMessage } from "@/ui/Form"; import type { FormValues } from ".."; -export const PaymentMethods = [ - { - id: "MERCADO_PAGO_PIX", - title: "Pix", - speed: "instant", - method: "pix", - }, -] as const; +export const ShopDonateStepProviders = () => { + const { data: providers = [] } = useQuery( + api.query.miforge.shop.providers.queryOptions(), + ); -export const ShopDonateStepPayments = () => { const form = useFormContext(); const step = form.watch("step"); - const paymentId = form.watch("paymentMethod"); + const paymentId = form.watch("providerId"); - if (step !== "payments") { + if (step !== "providers") { return null; } @@ -28,24 +25,28 @@ export const ShopDonateStepPayments = () => { { return (
- {PaymentMethods.map((method) => ( - { - form.clearErrors("paymentMethod"); - onChange(value === method.id ? undefined : method.id); - }} - /> - ))} + {providers.map((provider) => { + return ( + { + form.clearErrors("providerId"); + onChange( + value === provider.id ? undefined : provider.id, + ); + }} + /> + ); + })}
@@ -61,7 +62,7 @@ export const ShopDonateStepPayments = () => { type="button" onClick={() => { if (!paymentId) { - form.setError("paymentMethod", { + form.setError("providerId", { type: "required", message: "Please select a payment method.", }); diff --git a/apps/web/src/sections/shop_donate/form/review/index.tsx b/apps/web/src/sections/shop_donate/form/review/index.tsx index 9be211e..06ea933 100644 --- a/apps/web/src/sections/shop_donate/form/review/index.tsx +++ b/apps/web/src/sections/shop_donate/form/review/index.tsx @@ -12,9 +12,12 @@ import { InnerContainer } from "@/ui/Container/Inner"; import { FormControl, FormField, FormItem, FormMessage } from "@/ui/Form"; import { Label } from "@/ui/Label"; import type { FormValues } from ".."; -import { PaymentMethods } from "../payments"; export const ShopDonateStepReview = () => { + const { data: providers = [] } = useQuery( + api.query.miforge.shop.providers.queryOptions(), + ); + const { data: services } = useQuery( api.query.miforge.shop.services.queryOptions(), ); @@ -22,16 +25,16 @@ export const ShopDonateStepReview = () => { const form = useFormContext(); const step = form.watch("step"); - const paymentMethod = form.watch("paymentMethod"); + const providerId = form.watch("providerId"); const serviceId = form.watch("serviceId"); const selectedService = useMemo(() => { - return services?.find((service) => service.slug === serviceId); + return services?.find((service) => service.id === serviceId); }, [serviceId, services]); - const selectedPaymentMethod = useMemo(() => { - return PaymentMethods.find((method) => method.id === paymentMethod); - }, [paymentMethod]); + const selectedProvider = useMemo(() => { + return providers.find((provider) => provider.id === providerId); + }, [providerId, providers]); if (step !== "review") { return null; @@ -49,9 +52,7 @@ export const ShopDonateStepReview = () => { - - {selectedPaymentMethod?.title} - + {selectedProvider?.name} {selectedService?.type} diff --git a/apps/web/src/sections/shop_donate/form/services/index.tsx b/apps/web/src/sections/shop_donate/form/services/index.tsx index 4084d6a..9891c62 100644 --- a/apps/web/src/sections/shop_donate/form/services/index.tsx +++ b/apps/web/src/sections/shop_donate/form/services/index.tsx @@ -47,7 +47,7 @@ export const ShopDonateStepServices = () => {
{servicesWithSize.map((service) => { - const id = service.slug; + const id = service.id; const price = service.unit_price * service.quantity; if (service.type === "COINS") { @@ -86,7 +86,7 @@ export const ShopDonateStepServices = () => { variant="info" type="button" onClick={() => { - form.setValue("step", "payments"); + form.setValue("step", "providers"); }} > Back