├── .gitignore
├── config.cpython-311.pyc
├── facerec.cpython-311.pyc
├── drawpage.cpython-311.pyc
├── detectclick.cpython-311.pyc
├── profiles_settings.xml
├── README.md
├── misc.xml
├── modules.xml
├── BIO METRIC TRANSACTION CONTROL-ATM-main.iml
├── detectclick.py
├── facerec.py
├── workspace.xml
├── Project_Default.xml
├── drawpage.py
├── main.py
└── config.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/config.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/config.cpython-311.pyc
--------------------------------------------------------------------------------
/facerec.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/facerec.cpython-311.pyc
--------------------------------------------------------------------------------
/drawpage.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/drawpage.cpython-311.pyc
--------------------------------------------------------------------------------
/detectclick.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/detectclick.cpython-311.pyc
--------------------------------------------------------------------------------
/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Gesture-ATM
2 | GestureATM is an innovative project leveraging deep learning techniques for computer vision to enhance ATM security and accessibility. This repository provides a comprehensive solution for biometric transactions at ATMs through gesture recognition.
3 |
--------------------------------------------------------------------------------
/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/BIO METRIC TRANSACTION CONTROL-ATM-main.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/detectclick.py:
--------------------------------------------------------------------------------
1 | from config import cfg
2 |
3 |
4 | class DetectClick():
5 |
6 | def __init__(self, circleCenters):
7 | self.circleCenters = circleCenters
8 |
9 |
10 | def detectClick(self, fingertip):
11 | curPg = cfg["currentpage"]
12 | buttons = cfg["pages"][curPg]["buttons"]
13 | radius = cfg["btnparams"]["R"]
14 |
15 | # Check if finger print point resides in any of the eight circles of buttons.
16 | for i, button in enumerate(buttons):
17 | if button and button.strip():
18 | center_x = self.circleCenters[i][0]
19 | center_y = self.circleCenters[i][1]
20 | if ((fingertip[0] - center_x)**2 + (fingertip[1] - center_y)**2) < radius**2:
21 | return i
22 |
--------------------------------------------------------------------------------
/facerec.py:
--------------------------------------------------------------------------------
1 | import face_recognition
2 | import os
3 | from config import cfg
4 |
5 |
6 | class FaceRec():
7 |
8 | def __init__(self, facespath = "C:/Users/Dell/Downloads/Gesture-Based-Touchless-ATM-main/Gesture-Based-Touchless-ATM-main/Faces"):
9 | self.faces = []
10 | # Store encodings of all the pictures from our database in memory.
11 | for file in os.listdir(facespath):
12 | if file.endswith(".jpeg") or file.endswith(".jpg"):
13 | img = face_recognition.load_image_file(os.path.join(facespath, file))
14 | self.faces.append(face_recognition.face_encodings(img)[0])
15 |
16 |
17 | def MatchTheFace(self, img):
18 | # Get encodings of the image/frame from the camera.
19 | encodings = face_recognition.face_encodings(img)
20 |
21 | # If encoding of any face is present then get it, else say no face matched.
22 | if len(encodings) > 0:
23 | encodings = encodings[0]
24 | else:
25 | return False
26 |
27 | comparisons = face_recognition.compare_faces(self.faces, encodings, tolerance=cfg["tolerance"])
28 |
29 | # Return true only if at least one of the face matches in database matches wit clicked picture.
30 | return True if any(comparisons) else False
31 |
--------------------------------------------------------------------------------
/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
19 |
20 |
21 |
22 |
23 |
24 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | 1711497321352
45 |
46 |
47 | 1711497321352
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/drawpage.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | from config import cfg
4 | import cv2
5 | from operator import itemgetter
6 |
7 | class DrawPage():
8 |
9 | def __init__(self, pages):
10 | self.pages = pages
11 |
12 | def drawThePage(self, pageName, img):
13 | buttons = self.pages[pageName]["buttons"]
14 | btnclr = cfg["btnclr"]
15 | R = cfg["btnparams"]["R"]
16 | txt = cfg["txtparams"]
17 | xadj,yadj,font,fontScale,tness = itemgetter("xadj","yadj","font","fontScale","thickness")(txt)
18 | txtclr = cfg["txtclr"]
19 |
20 |
21 | coords = self.getCoordintates() if "coords" not in cfg else cfg["coords"]
22 |
23 | for i in range(0, len(buttons)):
24 | if buttons[i] and buttons[i].strip():
25 | # Draw rectangle which will show text
26 | cv2.rectangle(img, coords[i][0], coords[i][1], btnclr, cv2.FILLED)
27 | # Put text on the rectangle you just drew
28 | cv2.putText(img, buttons[i], (coords[i][0][0] + xadj, coords[i][1][1] + yadj),
29 | font, fontScale, txtclr, tness)
30 | # Draw the circle which will act as a button
31 | cv2.circle(img, coords[i][2], R, btnclr, 2)
32 | # Add title text for this page if it exists
33 | if "pagetitle" in self.pages[pageName]:
34 | title,titleY,fontSize,titleclr,titletness = self.pages[pageName]["pagetitle"]
35 | titleX = self.getXOrgofText(title,font,fontSize,titletness)
36 | # Make the text smaller if it's too big to fit in the screen.
37 | while titleX >= (cfg["screen_x"]+50):
38 | fontSize = fontSize - 0.25
39 | titleX = self.getXOrgofText(title,font,fontSize,titletness)
40 | cv2.putText(img, title, (titleX, titleY), font, fontSize, titleclr, titletness)
41 |
42 | # This function returns the width of the text.
43 | def getXOrgofText(self, text, fontFace, fontScale, thickness):
44 | (W, H), baseline = cv2.getTextSize(text, fontFace, fontScale, thickness)
45 | rem = cfg["screen_x"] - W
46 | return (rem-1)//2 if rem%2 == 1 else rem//2
47 |
48 |
49 | # Based on frame size and all the configurations, get coordinates of all the buttons and circles to be drawn.
50 | def getCoordintates(self):
51 | btnpr = cfg["btnparams"]
52 | W, H, BtnSp, CirSp = btnpr["W"], btnpr["H"], btnpr["BtnSp"], btnpr["CirSp"]
53 | scr_x = cfg["screen_x"]
54 | scr_y = cfg["screen_y"]
55 | coords = []
56 |
57 | # Sequence of buttons wrt this list is as follows:
58 | # 1 - - 2
59 | # 3 - - 4
60 | # 5 - - 6
61 | # 7 - - 8
62 |
63 | # button 1
64 | pt1 = (0, scr_y - (4*H + 3*BtnSp))
65 | pt2 = (W, scr_y - (3*H + 3*BtnSp))
66 | c = (W + CirSp, pt2[1] - (H//2))
67 | coords.append((pt1, pt2, c))
68 |
69 | # button 2
70 | pt1 = (scr_x - W, scr_y - (4*H + 3*BtnSp))
71 | pt2 = (scr_x, scr_y - (3*H + 3*BtnSp))
72 | c = (pt1[0] - CirSp , pt2[1] - (H//2))
73 | coords.append((pt1, pt2, c))
74 |
75 | # button 3
76 | pt1 = (0, scr_y - (3*H + 2*BtnSp))
77 | pt2 = (W, scr_y - (2*H + 2*BtnSp))
78 | c = (W + CirSp , pt2[1] - (H//2))
79 | coords.append((pt1, pt2, c))
80 |
81 | # button 4
82 | pt1 = (scr_x - W, scr_y - (3*H + 2*BtnSp))
83 | pt2 = (scr_x, scr_y - (2*H + 2*BtnSp))
84 | c = (pt1[0] - CirSp , pt2[1] - (H//2))
85 | coords.append((pt1, pt2, c))
86 |
87 | # button 5
88 | pt1 = (0, scr_y - (2*H + BtnSp))
89 | pt2 = (W, scr_y - (H + BtnSp))
90 | c = (W + CirSp , pt2[1] - (H//2))
91 | coords.append((pt1, pt2, c))
92 |
93 | # button 6
94 | pt1 = (scr_x - W, scr_y - (2*H + BtnSp))
95 | pt2 = (scr_x, scr_y - (H + BtnSp))
96 | c = (pt1[0] - CirSp , pt2[1] - (H//2))
97 | coords.append((pt1, pt2, c))
98 |
99 | # button 7
100 | pt1 = (0, (scr_y - H))
101 | pt2 = (W, scr_y)
102 | c = (W + CirSp, pt2[1] - (H//2))
103 | coords.append((pt1, pt2, c))
104 |
105 | # button 8
106 | pt1 = (scr_x - W, scr_y - H)
107 | pt2 = (scr_x, scr_y)
108 | c = (pt1[0] - CirSp , pt2[1] - (H//2))
109 | coords.append((pt1, pt2, c))
110 |
111 | cfg["coords"] = coords
112 |
113 | return coords
114 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | import cv2
2 | from config import cfg
3 | import mediapipe as mp
4 | from drawpage import DrawPage
5 | from detectclick import DetectClick
6 | import datetime
7 | from facerec import FaceRec
8 |
9 |
10 | def main():
11 | # For webcam input.
12 | cap = cv2.VideoCapture(0)
13 |
14 | # Set the window size as per the configuration
15 | cap.set(cv2.CAP_PROP_FRAME_WIDTH, cfg["screen_x"])
16 | cap.set(cv2.CAP_PROP_FRAME_HEIGHT, cfg["screen_y"])
17 |
18 | # Initialise the class draw page with info of all the pages we're going to show
19 | dwPg = DrawPage(cfg["pages"])
20 |
21 | # Get coordinates of buttons and other shapes we're going to draw on screen
22 | coords = dwPg.getCoordintates()
23 |
24 | # coords is a list of tuples where last element is center of a circle on screen
25 | detClick = DetectClick([s[-1] for s in coords])
26 |
27 | # Iniitalise the face recognition class and the face detection classifier
28 | facerec = FaceRec()
29 | face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
30 |
31 | # Initialise hand detection model
32 | mp_hands = mp.solutions.hands.Hands(
33 | min_detection_confidence = cfg["min_detection_confidence"],
34 | min_tracking_confidence = cfg["min_tracking_confidence"],
35 | max_num_hands = cfg["max_num_hands"]
36 | )
37 |
38 | with mp_hands as hands:
39 |
40 | while cap.isOpened():
41 | success, image = cap.read()
42 | if not success:
43 | print("Ignoring empty camera frame.")
44 | # If loading a video, use 'break' instead of 'continue'.
45 | break
46 | # Flip the image to make it mirror like and intuitive.
47 | # We use one image to draw and other to detect hands.
48 | overlay = cv2.flip(image, 1).copy()
49 | output = cv2.flip(image, 1).copy()
50 | # Try to match face only when Match button is clicked.
51 | if (("face_matched" in cfg and not cfg["face_matched"]) or "face_matched" not in cfg) and cfg["currentpage"] == "Match":
52 | gray = cv2.cvtColor(output, cv2.COLOR_BGR2GRAY)
53 | faces = face_cascade.detectMultiScale(gray, 1.05, 5)
54 | cfg["face_matched"] = facerec.MatchTheFace(image) if len(faces) >= 1 else False
55 | cfg["currentpage"] = "Transactions" if cfg["face_matched"] == True else "FaceRec"
56 |
57 |
58 | # Draw the buttons as per the current page to be shown to customer.
59 | dwPg.drawThePage(cfg["currentpage"], overlay)
60 |
61 | # Converting the image and making it non-writable for better performance.
62 | output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
63 | output.flags.writeable = False
64 |
65 | # Processing the image to be able to detect hands in it if any.
66 | results = hands.process(output)
67 |
68 | # Reversing the color conversion and making image writable.
69 | output.flags.writeable = True
70 | output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR)
71 |
72 | if results and results.multi_hand_landmarks:
73 | hand = results.multi_hand_landmarks[0]
74 |
75 | imgH, imgW, imgC = output.shape
76 |
77 | # Get position of the fingertip in form of pixels.
78 | xpos, ypos = int(hand.landmark[8].x * imgW), int(hand.landmark[8].y * imgH)
79 |
80 | # Draw a circle around the fingertip to make it more visible while being tracked.
81 | cv2.circle(overlay, (xpos, ypos), 20, (255, 0, 255), cv2.FILLED)
82 |
83 | # Detect if the fingertip has clicked any button or not.
84 | clickedBtnIndex = detClick.detectClick((xpos, ypos))
85 |
86 | if clickedBtnIndex != None and clickedBtnIndex>-1 and clickedBtnIndex <8:
87 | # endtime is timestamp till which the fingertip needs to be on a button for it to qualify as a click.
88 |
89 | # Calculate the endtime if not already calculated.
90 | if "endtime" not in cfg:
91 | cfg["endtime"] = datetime.datetime.now() + datetime.timedelta(seconds=cfg["btnClickDelay"])
92 | cfg["endtime"] = cfg["endtime"].strftime("%H:%M:%S.%f")[:-5]
93 |
94 | # After some seconds, check if the fingertip is still on button. If yes, then navigate.
95 | elif cfg["endtime"] <= datetime.datetime.now().strftime("%H:%M:%S.%f")[:-5]:
96 | cPage = cfg["currentpage"]
97 | cfg["currentpage"] = cfg["pages"][cPage]["navigation"][clickedBtnIndex]
98 | del cfg["endtime"]
99 |
100 | elif clickedBtnIndex == None and "endtime" in cfg:
101 | if "face_matched" in cfg:
102 | del cfg["face_matched"]
103 | del cfg["endtime"]
104 |
105 | # After all the drawing and hand tracking, put both images on top of each other.
106 | alpha = cfg["alpha"]
107 | cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)
108 |
109 | # Show the image in window.
110 | cv2.imshow("Bio-Metric transaction control ATM", output)
111 |
112 | # Stop running the code when Escape key is pressed or if any Exit option is chosen.
113 | if cv2.waitKey(5) & 0xFF == 27 or cfg["currentpage"] == "Exit":
114 | break
115 |
116 | cap.release()
117 |
118 |
119 | if __name__ == "__main__":
120 | main()
121 |
--------------------------------------------------------------------------------
/config.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | cfg = {
4 | "screen_x": 1280,
5 | "screen_y": 720,
6 | "min_detection_confidence": 0.65, # What % of confidence is required to detect the hand
7 | "min_tracking_confidence": 0.65, # What % of confidence is required to track the hand
8 | "max_num_hands": 1, # How many hands are allowed to be tracked.
9 | "tolerance": 0.75, # the confidence or matching % for matching two faces
10 | "alpha": 0.75, # The amount bleding to be done while overlaying one image on top of another
11 | "btnClickDelay": 1.5, # Amount of seconds the fingertips has to be inside the circle to make a click
12 | "btnclr" : (255, 0, 0), # BGR Colour of all the buttons
13 | "txtclr" : (255,255,255), # BGR Colour of all the text only on buttons
14 | "btnparams": {
15 | "W": 400, # width of the button
16 | "H": 80, # height of the button
17 | "BtnSp": 20, # space between two buttons
18 | "R": 40, # Radius of the button circles for each rectangle button. 1/2 * H
19 | "CirSp": 50 # Space between edge of rectangle and center of the circle button
20 | },
21 | "txtparams": {
22 | # amount of pixels by which putText origin has to be adjusted w.r.t top left corner
23 | # of the rectangle button
24 | "xadj": +20,
25 | "yadj": -20,
26 | # Integer denoting font which is HERSHEY as per CV2 module
27 | "font": 0,
28 | # Size of the font
29 | "fontScale": 1.8,
30 | # How thick the font should be
31 | "thickness": 2
32 | },
33 | "currentpage": "FaceRec", # Starting page is always facerec as it's the login page.
34 | "pages": {
35 | "FaceRec":{
36 | "pagetitle":["Select Match to match your face and Login", 100, 1.5, (255,0,0), 4],
37 | "buttons": ["","","","","","","","Match"],
38 | "navigation": ["","","","","","","","Match"]
39 | },
40 | "Transactions":{
41 | # List corresponding to pagetitle is as follows from left to right:
42 | # title text, H of text, font size, text colour, text thickness
43 | "pagetitle": ["Select Any Transaction", 150, 2, (255,0,0), 4],
44 | # Sequence of buttons wrt this list is as follows:
45 | # 1 - - 2
46 | # 3 - - 4
47 | # 5 - - 6
48 | # 7 - - 8
49 | "buttons":["Withdraw", "Balance", "Transfer", "Deposit", "", "" , "Exit", ""],
50 | # This is the "pages" to which each of these buttons will navigate to when selected.
51 | "navigation": ["Withdraw-SelAccType", "Balance-SelAccType", "Transfer-SelAccType",
52 | "Deposit-SelAccType", "", "", "Exit", ""]
53 | },
54 |
55 | # All the pages for Withdrawal transaction
56 | "Withdraw-SelAccType" : {
57 | "pagetitle": ["Select Account Type", 150, 2, (255,0,0), 4],
58 | "buttons":["", "Savings", "", "Checking", "", "Credit"],
59 | "navigation": ["", "SelectAmountW", "", "SelectAmountW", "", "SelectAmountW"]
60 | },
61 | "SelectAmountW": {
62 | "pagetitle": ["Select Amount to Withdraw", 150, 2, (255,0,0), 4],
63 | "buttons":["Rs.100", "Rs.200", "Rs.500", "Rs.2000"],
64 | "navigation": ["ReceiptW","ReceiptW","ReceiptW","ReceiptW"]
65 | },
66 | "ReceiptW": {
67 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4],
68 | "buttons":["Yes", "", "No"],
69 | "navigation": ["WDDoneR", "", "WDDone"]
70 | },
71 | "WDDoneR": {
72 | "pagetitle": ["Please take your Card, Cash, & Receipt", 150, 1.8, (255,0,0), 4],
73 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
74 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
75 | },
76 | "WDDone": {
77 | "pagetitle": ["Please take your Card & Cash", 150, 2, (255,0,0), 4],
78 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
79 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
80 | },
81 |
82 | # All the pages for Balance Enquiry transaction
83 | "Balance-SelAccType" : {
84 | "pagetitle": ["Select Account Type", 150, 2, (255,0,0), 4],
85 | "buttons":["", "Savings", "", "Checking"],
86 | "navigation": ["", "ReceiptBL", "", "ReceiptBL"]
87 | },
88 | "ReceiptBL": {
89 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4],
90 | "buttons":["Yes", "", "No"],
91 | "navigation": ["BLDoneR", "", "BLDone"]
92 | },
93 | "BLDoneR": {
94 | "pagetitle": ["Your Balance is Rs.5000. Please take Receipt", 150, 1.5, (255,0,0), 4],
95 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
96 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
97 | },
98 | "BLDone": {
99 | "pagetitle": ["Your Balance is Rs.5000.", 150, 2, (255,0,0), 4],
100 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
101 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
102 | },
103 |
104 | # All the pages for Transfer transaction
105 | "Transfer-SelAccType" : {
106 | "pagetitle": ["Select Transfer Type", 150, 2, (255,0,0), 4],
107 | "buttons":["", "Sav>Check", "", "Check>Sav"],
108 | "navigation": ["", "SelectAmountT", "", "SelectAmountT"]
109 | },
110 | "SelectAmountT": {
111 | "pagetitle": ["Select Amount to Transfer", 150, 2, (255,0,0), 4],
112 | "buttons":["Rs.100", "Rs.200", "Rs.500", "Rs.2000"],
113 | "navigation": ["ReceiptT","ReceiptT","ReceiptT","ReceiptT"]
114 | },
115 | "ReceiptT": {
116 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4],
117 | "buttons":["Yes", "", "No"],
118 | "navigation": ["TDoneR", "", "TDone"]
119 | },
120 | "TDoneR": {
121 | "pagetitle": ["Your Transfer was Successful! Please take Receipt.", 150, 1.5, (255,0,0), 4],
122 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
123 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
124 | },
125 | "TDone": {
126 | "pagetitle": ["Your Transfer was Successful!", 150, 2, (255,0,0), 4],
127 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
128 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
129 | },
130 |
131 | # All the pages for Deposit transaction
132 | "Deposit-SelAccType" : {
133 | "pagetitle": ["Select Account Type", 150, 2, (255,0,0), 4],
134 | "buttons":["", "Savings", "", "Checking"],
135 | "navigation": ["", "SelectAmountD", "", "SelectAmountD"]
136 | },
137 | "SelectAmountD": {
138 | "pagetitle": ["Select Amount to Deposit", 150, 2, (255,0,0), 4],
139 | "buttons":["Rs.100", "Rs.200", "Rs.500", "Rs.2000"],
140 | "navigation": ["Deposit","Deposit","Deposit","Deposit"]
141 | },
142 | "Deposit":{
143 | "pagetitle": ["Please Insert the Money", 150, 2, (255,0,0), 4],
144 | "buttons": ["","","","","","","","Done"],
145 | "navigation": ["","","","","","","","ReceiptD"]
146 | },
147 | "ReceiptD": {
148 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4],
149 | "buttons":["Yes", "", "No"],
150 | "navigation": ["DDoneR", "", "DDone"]
151 | },
152 | "DDoneR": {
153 | "pagetitle": ["Your Deposit was Successful! Please take Receipt.", 150, 1.5, (255,0,0), 4],
154 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
155 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
156 | },
157 | "DDone": {
158 | "pagetitle": ["Your Deposit was Successful!", 150, 2, (255,0,0), 4],
159 | "buttons":["", "", "", "", "", "", "New Txn", "Done"],
160 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"]
161 | }
162 | }
163 | }
164 |
--------------------------------------------------------------------------------