diff --git a/components/Alert.tsx b/components/Alert.tsx index 53294bd..669a9ee 100644 --- a/components/Alert.tsx +++ b/components/Alert.tsx @@ -1,5 +1,5 @@ -import { LucideIcon } from "lucide-react-native"; import { View } from "react-native"; +import { SvgProps } from "react-native-svg"; import { Card, CardContent, @@ -10,7 +10,7 @@ import { cn } from "~/lib/utils"; type Props = { type: "error" | "warn" | "info"; - icon: LucideIcon; + icon: React.FunctionComponent; title: string; description: string; className?: string; @@ -37,7 +37,7 @@ function Alert({ title, description, type, icon: Icon, className }: Props) { )} > - + {title} {description} diff --git a/components/DualCurrencyInput.tsx b/components/DualCurrencyInput.tsx index aa61f15..c666a16 100644 --- a/components/DualCurrencyInput.tsx +++ b/components/DualCurrencyInput.tsx @@ -1,5 +1,6 @@ import React from "react"; import { StyleSheet, TouchableOpacity, View } from "react-native"; +import { SwapIcon } from "~/components/Icons"; import { useGetFiatAmount, useGetSatsAmount } from "~/hooks/useGetFiatAmount"; import { CURSOR_COLOR, @@ -9,7 +10,6 @@ import { } from "~/lib/constants"; import { useAppStore } from "~/lib/state/appStore"; import { cn } from "~/lib/utils"; -import { RefreshCw } from "./Icons"; import { Input } from "./ui/input"; import { Text } from "./ui/text"; @@ -88,7 +88,7 @@ export function DualCurrencyInput({ {inputMode === "fiat" ? fiatCurrency : "sats"} - + { diff --git a/components/Icons.tsx b/components/Icons.tsx index b716ef0..67f34a2 100644 --- a/components/Icons.tsx +++ b/components/Icons.tsx @@ -1,51 +1,38 @@ import { - AlertCircle, - ArchiveRestore, - ArrowDown, - ArrowLeftRight, - Bitcoin, - BookUser, - Camera, - CameraOff, - CheckCircle, - ChevronDown, - ChevronUp, - CircleCheck, - ClipboardPaste, - Cog, - Copy, - Currency, - Egg, - Fingerprint, - HelpCircle, - Hotel, - Keyboard, - LogOut, - LucideIcon, - Menu, - MoveDown, - MoveDownLeft, - MoveDownRight, - MoveUp, - MoveUpRight, - Palette, - PlusCircle, - Power, - RefreshCw, - Settings2, - Share2, - Trash2, - TriangleAlert, - UserCircle2, - Wallet2, - WalletIcon, - X, - XCircle, - ZapIcon, -} from "lucide-react-native"; + PopiconsCircleExclamationLine as AlertCircleIcon, + PopiconsBitcoinSolid as BitcoinIcon, + PopiconsAddressBookSolid as BookUserIcon, + PopiconsCameraWebOffSolid as CameraOffIcon, + PopiconsCircleCheckLine as CheckCircleIcon, + PopiconsChevronTopLine as ChevronUpIcon, + PopiconsCopySolid as CopyIcon, + PopiconsEditSolid as EditIcon, + PopiconsUploadSolid as ExportIcon, + PopiconsTouchIdSolid as FingerprintIcon, + PopiconsCircleInfoLine as HelpCircleIcon, + PopiconsArrowDownLine as MoveDownIcon, + PopiconsArrowUpLine as MoveUpIcon, + PopiconsLifebuoySolid as OnboardingIcon, + PopiconsClipboardTextSolid as PasteIcon, + PopiconsReloadLine as RefreshIcon, + PopiconsReloadSolid as ResetIcon, + PopiconsSettingsMinimalLine as SettingsIcon, + PopiconsShareSolid as ShareIcon, + PopiconsLogoutSolid as SignOutIcon, + PopiconsLoopSolid as SwapIcon, + PopiconsPaintSolid as ThemeIcon, + PopiconsBinSolid as TrashIcon, + PopiconsTriangleExclamationLine as TriangleAlertIcon, + PopiconsWalletHorizontalOpenSolid as WalletIcon, + PopiconsDownloadSolid as WithdrawIcon, + PopiconsCircleXLine as XCircleIcon, + PopiconsXSolid as XIcon, + PopiconsBoltSolid as ZapIcon, +} from "@popicons/react-native"; import { cssInterop } from "nativewind"; +import { SvgProps } from "react-native-svg"; -function interopIcon(icon: LucideIcon) { +function interopIcon(icon: React.FunctionComponent) { cssInterop(icon, { className: { target: "style", @@ -57,90 +44,64 @@ function interopIcon(icon: LucideIcon) { }); } -interopIcon(AlertCircle); -interopIcon(ArrowDown); -interopIcon(CheckCircle); -interopIcon(Bitcoin); -interopIcon(XCircle); -interopIcon(MoveUp); -interopIcon(MoveDown); -interopIcon(ChevronDown); -interopIcon(ChevronUp); -interopIcon(MoveDownRight); -interopIcon(MoveUpRight); -interopIcon(MoveDownLeft); -interopIcon(Camera); -interopIcon(Menu); -interopIcon(ZapIcon); +interopIcon(AlertCircleIcon); +interopIcon(BitcoinIcon); +interopIcon(BookUserIcon); +interopIcon(CameraOffIcon); +interopIcon(CheckCircleIcon); +interopIcon(ChevronUpIcon); +interopIcon(CopyIcon); +interopIcon(EditIcon); +interopIcon(ExportIcon); +interopIcon(FingerprintIcon); +interopIcon(HelpCircleIcon); +interopIcon(MoveDownIcon); +interopIcon(MoveUpIcon); +interopIcon(OnboardingIcon); +interopIcon(PasteIcon); +interopIcon(RefreshIcon); +interopIcon(ResetIcon); +interopIcon(SettingsIcon); +interopIcon(ShareIcon); +interopIcon(SignOutIcon); +interopIcon(SwapIcon); +interopIcon(ThemeIcon); +interopIcon(TrashIcon); +interopIcon(TriangleAlertIcon); interopIcon(WalletIcon); -interopIcon(Copy); -interopIcon(Currency); -interopIcon(Settings2); -interopIcon(ArrowLeftRight); -interopIcon(PlusCircle); -interopIcon(Cog); -interopIcon(ClipboardPaste); -interopIcon(Keyboard); -interopIcon(BookUser); -interopIcon(Wallet2); -interopIcon(Share2); -interopIcon(RefreshCw); -interopIcon(X); -interopIcon(Hotel); -interopIcon(Power); -interopIcon(CameraOff); -interopIcon(Palette); -interopIcon(Egg); -interopIcon(Fingerprint); -interopIcon(HelpCircle); -interopIcon(CircleCheck); -interopIcon(TriangleAlert); -interopIcon(LogOut); -interopIcon(ArchiveRestore); -interopIcon(UserCircle2); -interopIcon(Trash2); +interopIcon(WithdrawIcon); +interopIcon(XCircleIcon); +interopIcon(XIcon); +interopIcon(ZapIcon); export { - AlertCircle, - ArchiveRestore, - ArrowDown, - ArrowLeftRight, - Bitcoin, - BookUser, - Camera, - CameraOff, - CheckCircle, - ChevronDown, - ChevronUp, - CircleCheck, - ClipboardPaste, - Cog, - Copy, - Currency, - Egg, - Fingerprint, - HelpCircle, - Hotel, - Keyboard, - LogOut, - Menu, - MoveDown, - MoveDownLeft, - MoveDownRight, - MoveUp, - MoveUpRight, - Palette, - PlusCircle, - Power, - RefreshCw, - Settings2, - Share2, - Trash2, - TriangleAlert, - UserCircle2, - Wallet2, + AlertCircleIcon, + BitcoinIcon, + BookUserIcon, + CameraOffIcon, + CheckCircleIcon, + ChevronUpIcon, + CopyIcon, + EditIcon, + ExportIcon, + FingerprintIcon, + HelpCircleIcon, + MoveDownIcon, + MoveUpIcon, + OnboardingIcon, + PasteIcon, + RefreshIcon, + ResetIcon, + SettingsIcon, + ShareIcon, + SignOutIcon, + SwapIcon, + ThemeIcon, + TrashIcon, + TriangleAlertIcon, WalletIcon, - X, - XCircle, + WithdrawIcon, + XCircleIcon, + XIcon, ZapIcon, }; diff --git a/components/QRCodeScanner.tsx b/components/QRCodeScanner.tsx index 56a780c..3fd892c 100644 --- a/components/QRCodeScanner.tsx +++ b/components/QRCodeScanner.tsx @@ -2,12 +2,19 @@ import { useIsFocused } from "@react-navigation/native"; import { Camera } from "expo-camera"; import { PermissionStatus } from "expo-modules-core/src/PermissionsInterface"; import React, { useEffect } from "react"; -import { View } from "react-native"; +import { StyleSheet, View } from "react-native"; +import { CameraOffIcon } from "~/components/Icons"; import { Text } from "~/components/ui/text"; import { FocusableCamera } from "./FocusableCamera"; -import { CameraOff } from "./Icons"; import Loading from "./Loading"; +const styles = StyleSheet.create({ + icon: { + width: 64, + height: 64, + }, +}); + interface QRCodeScannerProps { onScanned: (data: string) => void; startScanning: boolean; @@ -63,7 +70,7 @@ function QRCodeScanner({ <> {!isScanning && permissionStatus === PermissionStatus.DENIED && ( - + Camera Permission Denied diff --git a/components/ToastConfig.tsx b/components/ToastConfig.tsx index fea7a80..dd4028f 100644 --- a/components/ToastConfig.tsx +++ b/components/ToastConfig.tsx @@ -1,7 +1,7 @@ import { Link } from "expo-router"; import { View } from "react-native"; import { ToastConfig } from "react-native-toast-message"; -import { CircleCheck, XCircle } from "./Icons"; +import { CheckCircleIcon, XCircleIcon } from "~/components/Icons"; import { Button } from "./ui/button"; import { Text } from "./ui/text"; @@ -9,7 +9,7 @@ export const toastConfig: ToastConfig = { success: ({ text1, text2 }) => ( - + {text1} {text2 && {text2}} @@ -18,7 +18,7 @@ export const toastConfig: ToastConfig = { info: ({ text1, text2, hide }) => ( - + {text1} {text2 && {text2}} @@ -27,7 +27,7 @@ export const toastConfig: ToastConfig = { error: ({ text1, text2, hide }) => ( - + {text1} {text2 && {text2}} @@ -37,7 +37,7 @@ export const toastConfig: ToastConfig = { return ( - + {text1} diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx index c0ecbe6..043b771 100644 --- a/components/ui/dialog.tsx +++ b/components/ui/dialog.tsx @@ -2,8 +2,8 @@ import * as DialogPrimitive from "@rn-primitives/dialog"; import * as React from "react"; import { Platform, StyleSheet, View } from "react-native"; import Animated, { FadeIn, FadeOut } from "react-native-reanimated"; +import { XIcon } from "~/components/Icons"; import { cn } from "~/lib/utils"; -import { X } from "../Icons"; const Dialog = DialogPrimitive.Root; @@ -93,12 +93,13 @@ const DialogContent = React.forwardRef< "absolute right-4 top-4 p-0.5 web:group rounded-sm opacity-70 web:ring-offset-background web:transition-opacity web:hover:opacity-100 web:focus:outline-none web:focus:ring-2 web:focus:ring-ring web:focus:ring-offset-2 web:disabled:pointer-events-none" } > - diff --git a/package.json b/package.json index 4779d2a..3e91781 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "dependencies": { "@getalby/lightning-tools": "^5.1.1", "@getalby/sdk": "^3.8.2", + "@popicons/react-native": "^0.0.20", "@react-native-async-storage/async-storage": "1.23.1", "@rn-primitives/dialog": "^1.0.3", "@rn-primitives/portal": "^1.0.3", @@ -48,7 +49,6 @@ "expo-secure-store": "~14.0.0", "expo-status-bar": "~2.0.0", "lottie-react-native": "7.1.0", - "lucide-react-native": "^0.376.0", "message-port-polyfill": "^0.2.0", "nativewind": "^4.0.1", "react": "18.3.1", diff --git a/pages/Home.tsx b/pages/Home.tsx index cb7a7ab..e0c2262 100644 --- a/pages/Home.tsx +++ b/pages/Home.tsx @@ -12,7 +12,7 @@ import { TouchableOpacity, View, } from "react-native"; -import { ChevronUp, Settings2 } from "~/components/Icons"; +import { ChevronUpIcon, SettingsIcon } from "~/components/Icons"; import { Text } from "~/components/ui/text"; import { LinearGradient } from "expo-linear-gradient"; @@ -21,7 +21,6 @@ import AlbyBanner from "~/components/AlbyBanner"; import LargeArrowDown from "~/components/icons/LargeArrowDown"; import LargeArrowUp from "~/components/icons/LargeArrowUp"; import Screen from "~/components/Screen"; -import { Button } from "~/components/ui/button"; import { Skeleton } from "~/components/ui/skeleton"; import { useGetFiatAmount } from "~/hooks/useGetFiatAmount"; @@ -68,7 +67,7 @@ export function Home() { right={() => ( - + )} @@ -132,12 +131,11 @@ export function Home() { - + diff --git a/pages/Transactions.tsx b/pages/Transactions.tsx index 39536e4..a8c06c3 100644 --- a/pages/Transactions.tsx +++ b/pages/Transactions.tsx @@ -9,7 +9,7 @@ import { ScrollView, View, } from "react-native"; -import { X } from "~/components/Icons"; +import { XIcon } from "~/components/Icons"; import FailedTransactionIcon from "~/components/icons/FailedTransaction"; import ReceivedTransactionIcon from "~/components/icons/ReceivedTransaction"; import SentTransactionIcon from "~/components/icons/SentTransaction"; @@ -78,7 +78,7 @@ export function Transactions() { router.back(); }} > - + )} /> diff --git a/pages/receive/Receive.tsx b/pages/receive/Receive.tsx index af048b4..08b0b37 100644 --- a/pages/receive/Receive.tsx +++ b/pages/receive/Receive.tsx @@ -6,7 +6,7 @@ import { Image, Share, TouchableOpacity, View } from "react-native"; import Toast from "react-native-toast-message"; import DismissableKeyboardView from "~/components/DismissableKeyboardView"; import { DualCurrencyInput } from "~/components/DualCurrencyInput"; -import { ArchiveRestore, Copy, Share2, ZapIcon } from "~/components/Icons"; +import { CopyIcon, ShareIcon, WithdrawIcon, ZapIcon } from "~/components/Icons"; import Loading from "~/components/Loading"; import QRCode from "~/components/QRCode"; import Screen from "~/components/Screen"; @@ -209,7 +209,7 @@ export function Receive() { router.push("/withdraw"); }} > - + Withdraw @@ -267,7 +267,7 @@ export function Receive() { variant="secondary" className="flex-1 flex flex-col gap-2" > - + Share {!enterCustomAmount && invoice && ( @@ -276,7 +276,7 @@ export function Receive() { onPress={copy} className="flex-1 flex flex-col gap-2" > - + Copy )} @@ -298,7 +298,7 @@ export function Receive() { router.push("/withdraw"); }} > - + Withdraw )} diff --git a/pages/send/AddressBook.tsx b/pages/send/AddressBook.tsx index c3f60e2..48b1f9b 100644 --- a/pages/send/AddressBook.tsx +++ b/pages/send/AddressBook.tsx @@ -1,6 +1,6 @@ import { Link, router } from "expo-router"; import { Pressable, ScrollView, TouchableOpacity, View } from "react-native"; -import { Trash2 } from "~/components/Icons"; +import { TrashIcon } from "~/components/Icons"; import Screen from "~/components/Screen"; import { Button } from "~/components/ui/button"; import { @@ -58,7 +58,7 @@ export function AddressBook() { useAppStore.getState().removeAddressBookEntry(index); }} > - + diff --git a/pages/send/ConfirmPayment.tsx b/pages/send/ConfirmPayment.tsx index 7a26855..12b2fbb 100644 --- a/pages/send/ConfirmPayment.tsx +++ b/pages/send/ConfirmPayment.tsx @@ -4,7 +4,7 @@ import { Link, router, useLocalSearchParams } from "expo-router"; import React from "react"; import { Pressable, View } from "react-native"; import Alert from "~/components/Alert"; -import { AlertCircle, ZapIcon } from "~/components/Icons"; +import { AlertCircleIcon, ZapIcon } from "~/components/Icons"; import Loading from "~/components/Loading"; import { Receiver } from "~/components/Receiver"; import Screen from "~/components/Screen"; @@ -120,7 +120,7 @@ export function ConfirmPayment() { type="info" title="One or more pending payments" description="Please check your transaction list before paying to ensure you do not make a payment twice." - icon={AlertCircle} + icon={AlertCircleIcon} /> diff --git a/pages/send/Send.tsx b/pages/send/Send.tsx index 0111e1d..36bf59c 100644 --- a/pages/send/Send.tsx +++ b/pages/send/Send.tsx @@ -5,11 +5,7 @@ import { lnurl } from "lib/lnurl"; import React from "react"; import { View } from "react-native"; import DismissableKeyboardView from "~/components/DismissableKeyboardView"; -import { - BookUser, - ClipboardPaste, - Keyboard as KeyboardIcon, -} from "~/components/Icons"; +import { BookUserIcon, EditIcon, PasteIcon } from "~/components/Icons"; import Loading from "~/components/Loading"; import QRCodeScanner from "~/components/QRCodeScanner"; import Screen from "~/components/Screen"; @@ -194,7 +190,7 @@ export function Send() { variant="secondary" className="flex flex-col gap-2 flex-1" > - + Manual diff --git a/pages/settings/Security.tsx b/pages/settings/Security.tsx index 9eb030e..ccaf9e2 100644 --- a/pages/settings/Security.tsx +++ b/pages/settings/Security.tsx @@ -1,7 +1,7 @@ import React from "react"; import { Text, View } from "react-native"; import Alert from "~/components/Alert"; -import { AlertCircle } from "~/components/Icons"; +import { TriangleAlertIcon } from "~/components/Icons"; import Loading from "~/components/Loading"; import Screen from "~/components/Screen"; import { Label } from "~/components/ui/label"; @@ -37,7 +37,7 @@ export function Security() { title="Setup Device Security" description="To protect your wallet, please set up a phone lock in your device settings first." - icon={AlertCircle} + icon={TriangleAlertIcon} /> )} diff --git a/pages/settings/Settings.tsx b/pages/settings/Settings.tsx index 151543e..b9c36b0 100644 --- a/pages/settings/Settings.tsx +++ b/pages/settings/Settings.tsx @@ -1,13 +1,13 @@ import { Link, router } from "expo-router"; import { Alert, TouchableOpacity, View } from "react-native"; import { - Bitcoin, - Egg, - Fingerprint, - LogOut, - Palette, - Power, - Wallet2, + BitcoinIcon, + FingerprintIcon, + OnboardingIcon, + ResetIcon, + SignOutIcon, + ThemeIcon, + WalletIcon, } from "~/components/Icons"; import Constants from "expo-constants"; @@ -35,7 +35,7 @@ export function Settings() { - + Wallets @@ -51,7 +51,7 @@ export function Settings() { - + Fiat Currency @@ -63,7 +63,7 @@ export function Settings() { - + Security @@ -74,7 +74,7 @@ export function Settings() { className="flex flex-row gap-4" onPress={toggleColorScheme} > - + Theme ({colorScheme.charAt(0).toUpperCase() + colorScheme.substring(1)}) @@ -93,7 +93,7 @@ export function Settings() { signOut(); }} > - + Sign out - + Open Onboarding - + Reset Wallet diff --git a/pages/settings/Wallets.tsx b/pages/settings/Wallets.tsx index 1901068..24e806d 100644 --- a/pages/settings/Wallets.tsx +++ b/pages/settings/Wallets.tsx @@ -1,6 +1,6 @@ import { Link, router } from "expo-router"; import { FlatList, TouchableOpacity, View } from "react-native"; -import { Settings2, Wallet2 } from "~/components/Icons"; +import { SettingsIcon, WalletIcon } from "~/components/Icons"; import { Button } from "~/components/ui/button"; import Toast from "react-native-toast-message"; @@ -43,7 +43,7 @@ export function Wallets() { )} > - + - + )} diff --git a/pages/settings/wallets/EditWallet.tsx b/pages/settings/wallets/EditWallet.tsx index 40b3d56..c725f0b 100644 --- a/pages/settings/wallets/EditWallet.tsx +++ b/pages/settings/wallets/EditWallet.tsx @@ -5,10 +5,10 @@ import Toast from "react-native-toast-message"; import * as Clipboard from "expo-clipboard"; import Alert from "~/components/Alert"; import { - ArchiveRestore, - Trash2, - TriangleAlert, - Wallet2, + ExportIcon, + TrashIcon, + TriangleAlertIcon, + WalletIcon, ZapIcon, } from "~/components/Icons"; import Screen from "~/components/Screen"; @@ -40,7 +40,7 @@ export function EditWallet() { capability, ), ).join(", ")}`} - icon={TriangleAlert} + icon={TriangleAlertIcon} className="mb-0" /> )} @@ -48,7 +48,7 @@ export function EditWallet() { - + Wallet Name @@ -110,7 +110,7 @@ export function EditWallet() { > - + Export Wallet @@ -146,7 +146,7 @@ export function EditWallet() { > - + Delete Wallet diff --git a/pages/settings/wallets/SetupWallet.tsx b/pages/settings/wallets/SetupWallet.tsx index 9af50f5..fde2111 100644 --- a/pages/settings/wallets/SetupWallet.tsx +++ b/pages/settings/wallets/SetupWallet.tsx @@ -9,10 +9,10 @@ import Toast from "react-native-toast-message"; import Alert from "~/components/Alert"; import DismissableKeyboardView from "~/components/DismissableKeyboardView"; import { - ClipboardPaste, - HelpCircle, - TriangleAlert, - X, + HelpCircleIcon, + PasteIcon, + TriangleAlertIcon, + XIcon, } from "~/components/Icons"; import Loading from "~/components/Loading"; import QRCodeScanner from "~/components/QRCodeScanner"; @@ -158,13 +158,13 @@ export function SetupWallet() { router.replace("/"); }} > - + ) : ( - + @@ -214,7 +214,7 @@ export function SetupWallet() { variant="secondary" className="flex-1 flex flex-col gap-2" > - + Paste @@ -249,7 +249,7 @@ export function SetupWallet() { description={`Missing capabilities: ${REQUIRED_CAPABILITIES.filter( (capability) => !capabilities.includes(capability), ).join(", ")}`} - icon={TriangleAlert} + icon={TriangleAlertIcon} /> )} diff --git a/yarn.lock b/yarn.lock index d539a40..3ed274e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1633,6 +1633,11 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@popicons/react-native@^0.0.20": + version "0.0.20" + resolved "https://registry.yarnpkg.com/@popicons/react-native/-/react-native-0.0.20.tgz#0bb9d84f63a8057e918c86a8f809e101b95eb35b" + integrity sha512-oBTQ6DNBA4NGEnODr/IhGujcDVZPgKB0uXNYEkrg9znsCYN/CZC1CTyoKnQzQSnmsZj/7+JLFd0TpUD7v1DCug== + "@radix-ui/primitive@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" @@ -6585,11 +6590,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lucide-react-native@^0.376.0: - version "0.376.0" - resolved "https://registry.yarnpkg.com/lucide-react-native/-/lucide-react-native-0.376.0.tgz#e66640581eb290911956e64cf11bc62d791f64b8" - integrity sha512-Mo+w+cCkVpy8AeMQk9si8oLomaCsOsPi4WHR9oFm9YHz3I9nFvVdiMIUNvuWLSL5dPD1i+AVzn0ahpNFviEPlQ== - make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"