thealper2 commited on
Commit
509af96
·
verified ·
1 Parent(s): a85c6db

Upload 13 files

Browse files
Dockerfile ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the official Python 3.10 image
2
+ FROM python:3.10
3
+
4
+ # Set the working directory to /code
5
+ WORKDIR /code
6
+
7
+ # Copy the current directory contents into the container at /code
8
+ COPY ./requirements.txt /code/requirements.txt
9
+
10
+ # Flask uygulamasını ve ilgili dizinleri kopyala
11
+ COPY static/ /code/static
12
+ COPY templates/ /code/templates
13
+
14
+ # Install requirements.txt
15
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
16
+
17
+ # Set up a new user named "user" with user ID 1000
18
+ RUN useradd -m -u 1000 user
19
+ # Switch to the "user" user
20
+ USER user
21
+ # Set home to the user's home directory
22
+ ENV HOME=/home/user PATH=/home/user/.local/bin:$PATH
23
+
24
+ # Set the working directory to the user's home directory
25
+ WORKDIR $HOME/code
26
+
27
+ # Copy the current directory contents into the container at $HOME/app setting the owner to the user
28
+ COPY --chown=user . $HOME/code
29
+
30
+ ENV FLASK_APP=app.py
31
+
32
+ EXPOSE 8000
33
+
34
+ # Start the FastAPI app on port 7860, the default port expected by Spaces
35
+ CMD ["flask", "run", "--host=0.0.0.0"]
app.py ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request
2
+ from bs4 import BeautifulSoup
3
+ from urllib.request import urlopen, Request
4
+ from google_play_scraper import reviews
5
+ from app_store_scraper import AppStore
6
+ import re
7
+
8
+ app = Flask(__name__)
9
+
10
+ ################################################################################################
11
+ # Sikayetvar
12
+ ################################################################################################
13
+
14
+ headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.28 Safari/537.36'}
15
+
16
+ def sikayetvar_get_complaint_links(url):
17
+ yorum_linkleri = []
18
+ page_url = f"{url}?page=1"
19
+ req = Request(page_url, headers=headers)
20
+ page_request = urlopen(req)
21
+ soup = BeautifulSoup(page_request.read(), "html.parser")
22
+ containers = soup.find_all("article", class_="card-v2 card-v3 ga-v ga-c")
23
+ for i in range(3):
24
+ a_div = containers[i].find("a", class_="complaint-layer card-v3-container")
25
+ data_url = a_div['href']
26
+ print(data_url)
27
+ yorum_linkleri.append("https://www.sikayetvar.com" + data_url)
28
+ return yorum_linkleri
29
+
30
+ def sikayetvar_scrape_complaint(url):
31
+ req = Request(url, headers=headers)
32
+ page_request = urlopen(req)
33
+ soup = BeautifulSoup(page_request, "html.parser")
34
+ try:
35
+ yorum = soup.find("div", class_="complaint-detail-description").text.strip()
36
+ return yorum
37
+ except Exception as e:
38
+ print(f"Error processing {url}: {e}")
39
+ return None
40
+
41
+ def sikayetvar_find(search):
42
+ url = f"https://www.sikayetvar.com/{search}"
43
+ review_links = sikayetvar_get_complaint_links(url)
44
+ reviews_arr = []
45
+
46
+ for idx, link in enumerate(review_links, 1):
47
+ complaint_data = sikayetvar_scrape_complaint(link)
48
+ reviews_arr.append({f"{idx}": complaint_data})
49
+
50
+ return reviews_arr
51
+
52
+ ################################################################################################
53
+
54
+ ################################################################################################
55
+ # Google Play Store
56
+ ################################################################################################
57
+
58
+ def playstore_get_reviews(url):
59
+ result = reviews(url, lang="tr", country="tr", count=3)
60
+ reviews_arr = []
61
+ for idx, r in enumerate(result[0]):
62
+ reviews_arr.append({f"{idx}": r["content"]})
63
+
64
+ return reviews_arr
65
+
66
+
67
+ def playstore_find(search):
68
+ search_json = {
69
+ "paycell": "com.turkcell.paycell",
70
+ "turkcell": "com.ttech.android.onlineislem",
71
+ "bip": "com.turkcell.bip",
72
+ "gnç": "com.solidict.gnc2",
73
+ "upcall": "com.turkcell.sesplus",
74
+ "platinum": "com.turkcellplatinum.main",
75
+ "calarkendinlet": "tr.com.turkcell.calarkendinlet",
76
+ "tv+": "com.turkcell.ott",
77
+ "fizy": "com.turkcell.gncplay",
78
+ "lifebox": "tr.com.turkcell.akillidepo"
79
+ }
80
+
81
+ url = search_json[search]
82
+ result = playstore_get_reviews(url)
83
+ return result
84
+
85
+ ################################################################################################
86
+
87
+ ################################################################################################
88
+ # App Store
89
+ ################################################################################################
90
+
91
+ def appstore_get_reviews(app_name, app_id):
92
+ data = AppStore(country='tr', app_name=app_name, app_id=app_id)
93
+ data.review(how_many=1)
94
+
95
+ reviews_arr = []
96
+ print(data.reviews)
97
+ print(len(data.reviews))
98
+ for idx, r in enumerate(data.reviews[:3]):
99
+ reviews_arr.append({f"{idx}": r["review"]})
100
+
101
+ return reviews_arr
102
+
103
+ def appstore_find(search):
104
+ search_json = {
105
+ "paycell": { "app_name": "Paycell - Digital Wallet", "app_id": 1198609962 },
106
+ "turkcell": { "app_name": "Turkcell", "app_id": 335162906 },
107
+ "bip": { "app_name": "BiP - Messenger, Video Call", "app_id": 583274826 },
108
+ "gnç": { "app_name": "GNÇ", "app_id": 894318685 },
109
+ "upcall": { "app_name": "UpCall", "app_id": 1149307476 },
110
+ "platinum": { "app_name": "Turkcell Platinum", "app_id": 671494224 },
111
+ "calarkendinlet": { "app_name": "ÇalarkenDinlet", "app_id": 1026830839 },
112
+ "tv+": { "app_name": "TV+", "app_id": 835880015 },
113
+ "fizy": { "app_name": "fizy – Music & Video", "app_id": 404239912 },
114
+ "lifebox": { "app_name": "Lifebox: Storage & Backup", "app_id": 665036334 }
115
+ }
116
+
117
+ app_name = search_json[search]["app_name"]
118
+ app_id = search_json[search]["app_id"]
119
+ result = appstore_get_reviews(app_name, app_id)
120
+ return result
121
+
122
+ ################################################################################################
123
+
124
+
125
+ @app.route("/")
126
+ def main():
127
+ return render_template('./home.html')
128
+
129
+ """ @app.route("/predict", methods=['POST'])
130
+ def home():
131
+ search = request.form['search']
132
+ firm = request.form["firm"]
133
+ if firm == "sikayetvar":
134
+ reviews_arr = sikayetvar_find(search)
135
+ elif firm == "playstore":
136
+ reviews_arr = playstore_find(search)
137
+ elif firm == "appstore":
138
+ reviews_arr = appstore_find(search)
139
+
140
+ pred = "Negative"
141
+ return render_template('./after.html', data=reviews_arr) """
142
+ @app.route("/predict", methods=['POST'])
143
+ def home():
144
+ search = request.form['search']
145
+ firm = request.form["firm"]
146
+ if firm == "sikayetvar":
147
+ reviews_arr = sikayetvar_find(search)
148
+ elif firm == "playstore":
149
+ reviews_arr = playstore_find(search)
150
+ elif firm == "appstore":
151
+ reviews_arr = appstore_find(search)
152
+
153
+ # Başlığı dinamik olarak ayarla
154
+ title = f"{firm} sitesinde {search} firmasi için yapılan yorumlar"
155
+ print(reviews_arr)
156
+ def clean_comment(comment_dict):
157
+ comment = next(iter(comment_dict.values()))
158
+ return re.sub(r"\{'\d+':\s'(.+)'\}", r"\1", comment)
159
+ reviews_arr = [clean_comment(review) for review in reviews_arr]
160
+ return render_template('./after.html', data=reviews_arr, title=title, search=search)
161
+
162
+ app.run(port=8000, debug=True)
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ Flask
2
+ re
3
+ urllib
4
+ google-play-scraper
5
+ app-store-scraper
6
+ beautifulsoup4
static/banner.png ADDED
static/comment_logo.png ADDED
static/crystal_background.jpg ADDED
static/css/style.css ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ --bg-color: #ff;
3
+ --glass-color: rgb(0, 0, 0, 0.8);
4
+ --searchbar-height: 3.0rem;
5
+ }
6
+
7
+ body {
8
+ background: var(--bg-color);
9
+ margin: 0;
10
+ font-family: 'Poppins', 'Helvetica Neue', Helvetica, Arial, sans-serif;
11
+ display: flex;
12
+ flex-direction: column;
13
+ justify-content: space-between;
14
+ height: 100vh;
15
+ }
16
+
17
+ nav {
18
+ height: 3em;
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: space-between;
22
+ padding: 0 1rem;
23
+ }
24
+
25
+ .links:hover {
26
+ text-decoration: underline;
27
+ }
28
+
29
+ .icon-container img {
30
+ height: 1.5em;
31
+ border-radius: 50%;
32
+ display: flex;
33
+ }
34
+
35
+ .center-container {
36
+ display: flex;
37
+ flex-direction: column;
38
+ align-items: center;
39
+ gap: 1rem;
40
+ }
41
+
42
+ .searchbar-container {
43
+ border: 1px solid var(--glass-color);
44
+ height: var(--searchbar-height);
45
+ width: 90%;
46
+ max-width: 600px;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: space-between;
50
+ }
51
+
52
+ .searchbar-container img {
53
+ height: 1.5rem;
54
+ padding: 0 0.5rem;
55
+ }
56
+
57
+ .searchbar-container input {
58
+ height: 40px;
59
+ outline: none;
60
+ border: none;
61
+ margin-top: 5px;
62
+ width: 100%;
63
+ color: black;
64
+ background-color: white;
65
+ font-family: poppins, monospace;
66
+ }
67
+
68
+ .buttons-container {
69
+ display: flex;
70
+ gap: 1rem;
71
+ }
72
+
73
+ .buttons-container input {
74
+ height: var(--searchbar-height);
75
+ background-color: var(--hover-color);
76
+ color: white;
77
+ background-color: #9c9c9c;
78
+ font-family: poppins, monospace;
79
+ padding: 0 1rem;
80
+ font-weight: 300;
81
+ border: 1px solid transparent;
82
+ }
83
+
84
+ .buttons-container input:hover {
85
+ border: 1px solid var(--glass-color);
86
+ }
87
+
88
+ footer {
89
+ background-color: #ebeaea;
90
+ }
91
+
92
+ footer a {
93
+ color: black;
94
+ text-decoration: none;
95
+ opacity: 0.6;
96
+ font-weight: 300;
97
+ font-size: 0.8rem;
98
+ }
99
+
100
+ footer a:hover {
101
+ text-decoration: underline;
102
+ }
103
+
104
+ .footer-links div:not(:nth-of-type(2)) a {
105
+ padding: 0 0.5rem;
106
+ }
107
+
108
+ footer img {
109
+ height: 0.7rem;
110
+ }
111
+
112
+ .footer-links {
113
+ display: flex;
114
+ flex-wrap: wrap;
115
+ gap: 1rem;
116
+ justify-content: space-evenly;
117
+ padding: 1rem;
118
+ }
119
+
120
+ form {
121
+ padding-top: 16;
122
+ width: 700;
123
+ display: flex;
124
+ }
static/gator_logo.jpeg ADDED
static/logo.jpg ADDED
static/turkcell_logo.png ADDED
templates/after.html ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>{{ title }}</title>
8
+ <!-- Bootstrap CSS -->
9
+ <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet">
10
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
11
+ <style>
12
+ .custom-heading {
13
+ color: #0f0b5d;
14
+ font-family: 'Montserrat', sans-serif;
15
+ font-weight: bold;
16
+ font-size: 18px;
17
+ /* İstediğiniz boyutu ayarlayın */
18
+ }
19
+
20
+ body {
21
+ background-image: url("{{ url_for('static', filename='crystal_background.jpg') }}");
22
+ background-size: cover;
23
+ /* Görseli merkeze hizala */
24
+ background-repeat: repeat;
25
+ /* Görselin tekrarını engelle */
26
+ }
27
+
28
+ .container {
29
+ border-radius: 8px;
30
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
31
+ padding: 20px;
32
+ }
33
+
34
+ .data-item {
35
+ background-color: #e9ecef;
36
+ border-radius: 4px;
37
+ padding: 15px;
38
+ color: #495057;
39
+ font-size: 18px;
40
+ margin-bottom: 10px;
41
+ word-wrap: break-word;
42
+ }
43
+
44
+ .data-title {
45
+ font-weight: bold;
46
+ margin-bottom: 10px;
47
+
48
+ }
49
+ </style>
50
+ </head>
51
+
52
+ <body>
53
+ <div class="container">
54
+ <h1 class="mb-4" style=" text-align: center;"> YORUMLAR </h1>
55
+ <div style="display: flex; flex-direction: row;">
56
+ <div
57
+ style="height: 600px; width: 360px; margin-left: 60px; margin-right: 60px; background-color: rgb(255, 255, 255); display: flex; flex-direction: column; align-items: center; border-color: rgb(213, 210, 210); border-width: 1px; border-style: solid;">
58
+ <img src="{{ url_for('static', filename='gator_logo.jpeg') }}" alt="Logo" class="img-fluid"
59
+ style="max-width: 200px; margin-top: 20px; margin-bottom: 10px;">
60
+ <h3 style="font-family: 'Montserrat', sans-serif;"> G4TOR </h3>
61
+ <p style="font-family: 'Montserrat', sans-serif; font-size: 18px; color: black;"> Türkçe Doğal Dil İşleme Yarışması </p>
62
+ <div
63
+ style="display: flex; width: 80%; background-color: #35afd4; border-bottom: 2px,solid,rgb(138, 36, 172); margin-bottom: 3px; justify-content: center; align-items: center;">
64
+ <p class="custom-heading" > GÜNCEL YORUMLAR </p>
65
+ </div>
66
+ <div
67
+ style="display: flex; width: 80%; background-color: #35afd4; border-bottom: 1px,solid,rgb(43, 122, 117); justify-content: center; align-items: center;">
68
+ <p class="custom-heading" > YORUM ANALİZİ </p>
69
+ </div>
70
+ </div>
71
+ <div style="width: 70%;">
72
+ {% for item in data %}
73
+ <div
74
+ style="padding: 10px; display: flex; flex-direction: column; width: 90%; background-color: #fff; height: 200px; border-color: rgb(213, 210, 210); border-width: 1px; border-style: solid; border-radius: 4px; margin-bottom: 10px;">
75
+ <div style="display: flex; flex-direction: row;">
76
+ <img src="{{ url_for('static', filename='comment_logo.png') }}" alt="Logo" class="img-fluid"
77
+ style="max-width: 50px; margin-bottom: 25px;">
78
+ <div
79
+ style="display: flex; background-color: #15a84f; width: 100px; height: 30px; justify-content: center; align-items: center; margin-left: 30px; margin-top: 5px;">
80
+ <p style="color: #fff;"> OLUMLU </p>
81
+ </div>
82
+ </div>
83
+ <span style="font-size: 20px; color: black; font-weight: 600;">
84
+ {{ item }}
85
+ </span>
86
+ <br>
87
+ <div style="display: flex; flex-direction: row;">
88
+ <p style="font-size: 18px; color: rgb(162, 162, 162); font-weight: 600;"> 2024-08-05 12.59.45
89
+ Sikayetvar - Turkcell </p>
90
+ <div
91
+ style="display: flex; background-color: #35afd4; width: 80px; height: 30px; margin-left: 30px; margin-top: 10px; justify-content: center; align-items: center;">
92
+ <h3> Turkcell </h3>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ {% endfor %}
97
+ </div>
98
+ </div>
99
+ </div>
100
+ <!-- Bootstrap JS, Popper.js, and jQuery (optional) -->
101
+ <script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
102
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/5.3.0/js/bootstrap.min.js"></script>
103
+ </body>
104
+
105
+ </html>
templates/home.html ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- <!DOCTYPE html>
2
+ <html lang="tr">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <title>G4T0R2 SEARCH</title>
9
+ <link rel="stylesheet" href="{{ url_for('static', filename = 'css/style.css') }}" />
10
+ <link rel="preconnect" href="https://fonts.googleapis.com">
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
12
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
13
+ </head>
14
+
15
+ <body>
16
+ <div class="center-container">
17
+ <div class="logo-container">
18
+ <img src="{{ url_for('static', filename = 'banner.png') }}" alt="Logo" width="250"
19
+ style="margin-top: 350px;">
20
+ </div>
21
+
22
+ <div class="searchbar-container">
23
+ <form method="POST" , action="/predict" style="width: 700px;">
24
+ <input type="text" , name='search' , placeholder="Cumle giriniz.">
25
+
26
+ <select name="firm">
27
+ <option value="sikayetvar">Sikayetvar</option>
28
+ <option value="playstore">Play Store</option>
29
+ <option value="appstore">App Store</option>
30
+ </select>
31
+
32
+ <div class="buttons-container">
33
+ <input type="submit" value="Sınıflandır">
34
+ </div>
35
+ </form>
36
+ </div>
37
+
38
+
39
+ </div>
40
+
41
+ <footer>
42
+ <div class="footer-links">
43
+ <div>
44
+ <a href="https://github.com/thealper2/gat0r-nlp">Github</a>
45
+ </div>
46
+ <div>
47
+ <img src="{{ url_for('static', filename = 'logo.jpg') }}" alt="logo" width="20">
48
+ <a href="https://github.com/thealper2/gat0r-nlp ">GAT0R</a>
49
+ </div>
50
+ </div>
51
+ </footer>
52
+
53
+ </body>
54
+
55
+ </html> -->
56
+
57
+ <!DOCTYPE html>
58
+ <html lang="tr">
59
+ <style>
60
+ body {
61
+ font-family: 'Poppins', sans-serif;
62
+ }
63
+
64
+ footer {
65
+ background-color: #f8f9fa;
66
+ }
67
+ </style>
68
+
69
+ <head>
70
+ <meta charset="UTF-8">
71
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
72
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
73
+ <title>G4T0R2 SEARCH</title>
74
+ <!-- Bootstrap CSS -->
75
+ <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
76
+ <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
77
+ <!-- Google Fonts -->
78
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
79
+ </head>
80
+
81
+ <body>
82
+ <div class="container text-center mt-5">
83
+ <div class="mb-5">
84
+ <img src="{{ url_for('static', filename='gator_logo.jpeg') }}" alt="Logo" class="img-fluid"
85
+ style="max-width: 200px;margin-top: 20px; margin-bottom: 25px;">
86
+ </div>
87
+
88
+ <div class="row justify-content-center">
89
+ <div class="col-md-8">
90
+ <form method="POST" action="/predict" class="form-inline justify-content-center">
91
+ <input type="text" name="search" class="form-control mr-2" placeholder="Cümle giriniz."
92
+ style="width: 300px;">
93
+ <select name="firm" class="form-control mr-2">
94
+ <option value="sikayetvar">Sikayetvar</option>
95
+ <option value="playstore">Play Store</option>
96
+ <option value="appstore">App Store</option>
97
+ </select>
98
+ <button type="submit" class="btn btn-primary">Sınıflandır</button>
99
+ </form>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ <footer>
105
+ <div class="footer-links">
106
+ <div>
107
+ <a href="https://github.com/thealper2/gat0r-nlp">Github</a>
108
+ </div>
109
+ <div>
110
+ <img src="{{ url_for('static', filename = 'logo.jpg') }}" alt="logo" width="20">
111
+ <a href="https://github.com/thealper2/gat0r-nlp ">GAT0R</a>
112
+ </div>
113
+ </div>
114
+ </footer>
115
+
116
+ <!-- Bootstrap JS and dependencies -->
117
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
118
+ <script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
119
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
120
+ </body>
121
+
122
+ </html>
templates/image/crystal_background.jpg ADDED