From 747726db0cec4d252f5375c63a1d906e991facf5 Mon Sep 17 00:00:00 2001 From: esharatnaparkhi Date: Sat, 26 Jul 2025 23:03:51 +0530 Subject: [PATCH 1/2] Fixed the realtime pulse anim --- __pycache__/config.cpython-311.pyc | Bin 0 -> 2887 bytes app.py | 778 ++++++++++++++++-- utils/__pycache__/air_quality.cpython-311.pyc | Bin 0 -> 1458 bytes utils/__pycache__/chatbot.cpython-311.pyc | Bin 0 -> 1589 bytes utils/__pycache__/crime.cpython-311.pyc | Bin 0 -> 1567 bytes utils/__pycache__/tourist.cpython-311.pyc | Bin 0 -> 2822 bytes utils/__pycache__/weather.cpython-311.pyc | Bin 0 -> 2471 bytes 7 files changed, 700 insertions(+), 78 deletions(-) create mode 100644 __pycache__/config.cpython-311.pyc create mode 100644 utils/__pycache__/air_quality.cpython-311.pyc create mode 100644 utils/__pycache__/chatbot.cpython-311.pyc create mode 100644 utils/__pycache__/crime.cpython-311.pyc create mode 100644 utils/__pycache__/tourist.cpython-311.pyc create mode 100644 utils/__pycache__/weather.cpython-311.pyc diff --git a/__pycache__/config.cpython-311.pyc b/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60a576b911ce746bcaf0a5ebfd5c7590b1deb4c6 GIT binary patch literal 2887 zcmai#dr(x@9mnqiyDZBa_+Qk%h%5X*}>-&%Lk@yt@lx5+y!r zVp4*Q8Z??xXQ*gr8mBfIo0>7&rtM5kH<5J6Hc3r2&DeyxYU)gk?euppmzMpjm$Uo( z?&o(Nzw`T@b2%Lvs^jpP{>xtB#UPHm#eU2`k&1Y*#E;`%1ANkxATo`S84CeQ=DiUu&lwmChi0ty1tAVQyP`@texE7)XfhXL7c2T8ULaLU#N zgR&ih9kLyUow9uzo{{aduuHbPVMMmi!5-P}JrOpk+RVW|BbT+`qpmeu1d*Qe|MI2G zla)Me*1urb+G6Ch{5<{^;>0hz&7)~?S$l{`AMNVs4JXaG z`u)>g+1WgO2R+8f4s5u zDxS__7}J9+4ufDdgS^y3T&(rG_tsfjpL#Jjv5eHlnz46)2;8*UH^VC1+U{ddW z^aM7$di!nmA?n@#`;K>K(AD?Z_JgC97=)&Y*w`S;j-8Xa4)k2?+5K@<4D+-S$~Y`+m}g zZ(vnwU$lJr-F2KmXA=9!Fc~61Xldo;_M^`g@btoie@*YmLT_LT0hfd|yMU3L|9Cl1 zZ|{Bm`q=}x4PA|0#53Y#+pk;U@;k0g=V>&#b|a^XC8lNA!8{FZkK-M$X7cpkHIHV$ z%4Fj@Byo_~Kyq2>`)B|7ktrkvkJpxD!@UZYoF+RhY#I*}4dplO-AUb^)58lGlMym0RGLbflXAX+VC?i?oI zxHz`MCgy1&HewO!q41rhKV8Q2w6h@lOms7Pw6$hI!aUk&;>u6cG#hcgV{acF3*Upj z00Wf>RToE=R_0ak6gU0mz7Zo&v5*z58}W2pgR@&Z-swPbBgee>eicuPM=tVv4q~5E z>#$B~xUbyl<9}Ov*QDIi!#GN=!?#G@;`jXZw+%?Pe&J62^DL6alOyR@O}G|b`!C$- zNW7=tYtjcHVF9}%ko@B-ynesL6Bxj*c3u~jZ+gd_^bat-X_p=!_~vOOO}`7QdMyS= zvDhzfL$cwG!{+Cs4Lm(335R9@Bea^H{n-T_5@+4vhnn;4JpFcpp8xxe44$$Rn*0s+ zDQNzQuI?jTYZUK8!zcJ63iD`9M8a%3M31(CNFw0j_Gs%}Lqs4>WLN_WzNM%q7+)!p zL;Ob@54dW}4SnWbaek)i6M9RN^IU>#zK5qC}UxqI(V#pqTU^ni_II(ScLCd*zTL^HO?cfJ_L zVtxC?F&6L37BiOM%Muw|;>(sYwv1DUEXYa{W68e#QW#71Wy=}k*jE~-jvCib>D|#q z*t{zkOXt)v<8+F;V@t7lGZ@R{)RE&EQyK24RoJ{)jAgS84q^eq^Ranz7|ZqTm&aJX z@8T;ND`5T7u~1Qk*t~^|tzw%oVX{MWv3ZLaE9TU?G5v(z9h`&BTf$hWZ({X~mHD#O zjFofh@bSQ@KzBp|Hg5%EmA>&+F}B7xzO{_;Dqm<&FWt|f|>ZF|05Gq=PNN2w`~4&&LpJF=Y1x2>HK+LC>P8doiLxPg{v)?A!f;c?-2Q4 PoGjRpVD=}K;??^PLM;%i literal 0 HcmV?d00001 diff --git a/app.py b/app.py index 82ed4e24..3dd11993 100644 --- a/app.py +++ b/app.py @@ -1,8 +1,12 @@ import streamlit as st import pandas as pd import datetime +import time +import plotly.graph_objects as go +import plotly.express as px +from plotly.subplots import make_subplots +import numpy as np -# Import your existing utility functions from utils.weather import get_current_weather, get_monthly_weather from utils.tourist import get_recommendations from config import CITY_COORDS @@ -10,134 +14,752 @@ from utils.crime import get_crime_news from utils.chatbot import search_google +st.set_page_config(page_title="City Pulse", layout="wide", initial_sidebar_state="expanded") -st.set_page_config(page_title="City Pulse", layout="wide") +st.markdown(""" + +""", unsafe_allow_html=True) + +# Enhanced Title with Animation +st.markdown("

🌃 City Pulse

", unsafe_allow_html=True) + +st.markdown("
Real-time Data Active
", unsafe_allow_html=True) + +# Enhanced City Selection with Animation +col_select1, col_select2, col_select3 = st.columns([1, 2, 1]) +with col_select2: + city = st.selectbox( + "Select a City", + list(CITY_COORDS.keys()), + help="Choose a city to explore real-time data" + ) if city: lat = CITY_COORDS[city]["lat"] lon = CITY_COORDS[city]["lon"] - # --- Initialize chat history in session state --- if "messages" not in st.session_state: st.session_state.messages = [] - # Create tabs - tabs = st.tabs(["Weather", "Air Quality", "Tourist Info", "Crime News", "Trends", "Find with City Pulse"]) + # Enhanced Tabs with Icons + tabs = st.tabs([ + "Weather", + "Air Quality", + "Tourist Info", + "Crime News", + "Trends", + "City Assistant" + ]) - # --- Existing Tabs (No changes needed for these sections) --- with tabs[0]: - st.header(f"Current Weather in {city}") - weather = get_current_weather(city, lat, lon) + st.markdown(f"

Current Weather in {city}

", unsafe_allow_html=True) + + # Create weather container with loading animation + weather_container = st.container() + with weather_container: + with st.spinner("Fetching weather data..."): + weather = get_current_weather(city, lat, lon) + time.sleep(0.5) # Brief pause for animation effect + if "error" in weather: - st.error(weather["error"]) + st.error(f"❌ {weather['error']}") else: + # Enhanced Weather Cards col1, col2, col3 = st.columns(3) - col1.metric("Temperature (°C)", weather["temperature"]) - col2.metric("Feels Like (°C)", weather["feels_like"]) - col3.metric("Humidity (%)", weather["humidity"]) - st.write(f"**Description:** {weather['description'].capitalize()}") - st.image(f"http://openweathermap.org/img/wn/{weather['icon']}@2x.png") + + with col1: + st.markdown(f""" +
+

Temperature

+

{weather["temperature"]}°C

+
+ """, unsafe_allow_html=True) + + with col2: + st.markdown(f""" +
+

Feels Like

+

{weather["feels_like"]}°C

+
+ """, unsafe_allow_html=True) + + with col3: + st.markdown(f""" +
+

Humidity

+

{weather["humidity"]}%

+
+ """, unsafe_allow_html=True) + + # Weather Description with Icon + st.markdown(f""" +
+
+ +
+

{weather['description']}

+

Current conditions in {city}

+
+
+
+ """, unsafe_allow_html=True) + # Enhanced Monthly Weather Chart monthly_weather = get_monthly_weather(city) if isinstance(monthly_weather, list) and monthly_weather: - st.subheader("Monthly Weather Summary") + st.markdown("

Monthly Weather Trends

", unsafe_allow_html=True) + df_monthly = pd.DataFrame(monthly_weather) - df_monthly = df_monthly.rename(columns={ - "month": "Month", - "avg_temp": "Avg Temp (°C)", - "humidity": "Humidity (%)", - "precip": "Precipitation (mm)" - }) - st.dataframe(df_monthly) + + # Create animated plotly chart + fig = make_subplots( + rows=2, cols=2, + subplot_titles=('Temperature Trend', 'Humidity Levels', 'Precipitation', 'Weather Overview'), + specs=[[{"secondary_y": False}, {"secondary_y": False}], + [{"secondary_y": False}, {"secondary_y": False}]] + ) + + # Temperature line + fig.add_trace( + go.Scatter( + x=df_monthly['month'], + y=df_monthly['avg_temp'], + mode='lines+markers', + name='Temperature (°C)', + line=dict(color='#ff6b6b', width=3), + marker=dict(size=8) + ), + row=1, col=1 + ) + + # Humidity bar + fig.add_trace( + go.Bar( + x=df_monthly['month'], + y=df_monthly['humidity'], + name='Humidity (%)', + marker_color='#4ecdc4' + ), + row=1, col=2 + ) + + # Precipitation area + fig.add_trace( + go.Scatter( + x=df_monthly['month'], + y=df_monthly['precip'], + fill='tonexty', + mode='lines', + name='Precipitation (mm)', + line=dict(color='#45b7d1') + ), + row=2, col=1 + ) + + # Combined overview + fig.add_trace( + go.Scatter( + x=df_monthly['month'], + y=df_monthly['avg_temp'], + mode='lines+markers', + name='Temp Overview', + line=dict(color='#96ceb4', width=2) + ), + row=2, col=2 + ) + + fig.update_layout( + height=600, + showlegend=True, + title_text="Weather Analytics Dashboard", + font=dict(family="Poppins, sans-serif") + ) + + st.plotly_chart(fig, use_container_width=True) with tabs[1]: - st.header(f"Air Quality in {city}") - air_quality = get_air_quality(city) + st.markdown(f"

Air Quality in {city}

", unsafe_allow_html=True) + + with st.spinner("Analyzing air quality..."): + air_quality = get_air_quality(city) + time.sleep(0.3) + if "error" in air_quality: - st.error(air_quality["error"]) + st.error(f"❌ {air_quality['error']}") else: aqi_level = {1: "Good", 2: "Fair", 3: "Moderate", 4: "Poor", 5: "Very Poor"} - st.markdown(f"### AQI Level: {air_quality['aqi']} - **{aqi_level.get(air_quality['aqi'], 'Unknown')}**") - with st.expander("Pollutant Details (μg/m³)"): - comp_df = pd.DataFrame(list(air_quality["components"].items()), columns=["Pollutant", "Value"]) - comp_df["Pollutant"] = comp_df["Pollutant"].str.upper() - st.table(comp_df) + aqi_colors = {1: "#00e400", 2: "#ffff00", 3: "#ff7e00", 4: "#ff0000", 5: "#8f3f97"} + + # AQI Gauge Chart + fig_gauge = go.Figure(go.Indicator( + mode = "gauge+number+delta", + value = air_quality['aqi'], + domain = {'x': [0, 1], 'y': [0, 1]}, + title = {'text': "Air Quality Index"}, + delta = {'reference': 3}, + gauge = { + 'axis': {'range': [None, 5]}, + 'bar': {'color': aqi_colors.get(air_quality['aqi'], "#gray")}, + 'steps': [ + {'range': [0, 1], 'color': "#e8f5e8"}, + {'range': [1, 2], 'color': "#fff8e1"}, + {'range': [2, 3], 'color': "#fff3e0"}, + {'range': [3, 4], 'color': "#ffebee"}, + {'range': [4, 5], 'color': "#f3e5f5"} + ], + 'threshold': { + 'line': {'color': "red", 'width': 4}, + 'thickness': 0.75, + 'value': 4 + } + } + )) + + fig_gauge.update_layout( + height=400, + font=dict(family="Poppins, sans-serif") + ) + + col1, col2 = st.columns([2, 1]) + with col1: + st.plotly_chart(fig_gauge, use_container_width=True) + + with col2: + st.markdown(f""" +
+

AQI Status

+

{air_quality['aqi']}

+

{aqi_level.get(air_quality['aqi'], 'Unknown')}

+
+
+ """, unsafe_allow_html=True) + + # Pollutant Details with Interactive Chart + st.markdown("

Pollutant Breakdown

", unsafe_allow_html=True) + + pollutants = air_quality["components"] + pollutant_df = pd.DataFrame(list(pollutants.items()), columns=["Pollutant", "Value"]) + pollutant_df["Pollutant"] = pollutant_df["Pollutant"].str.upper() + + fig_pollutants = px.bar( + pollutant_df, + x="Pollutant", + y="Value", + color="Value", + color_continuous_scale="Viridis", + title="Pollutant Concentrations (μg/m³)" + ) + fig_pollutants.update_layout( + xaxis_title="Pollutants", + yaxis_title="Concentration (μg/m³)", + font=dict(family="Poppins, sans-serif") + ) + st.plotly_chart(fig_pollutants, use_container_width=True) with tabs[2]: - st.header(f"Tourist Recommendations in {city}") - tourist_data = get_recommendations(city) + st.markdown(f"

Tourist Recommendations in {city}

", unsafe_allow_html=True) + + with st.spinner("Discovering amazing places..."): + tourist_data = get_recommendations(city) + time.sleep(0.4) + places = tourist_data.get("places", []) if places and not places[0].get("error"): - with st.expander("Top Tourist Places"): - for place in places: - st.markdown(f"**{place.get('name', 'N/A')}**") - st.write(f"Address: {place.get('address', 'N/A')}") - if place.get('rating'): - st.write(f"Rating: {place.get('rating', 'N/A')}") - st.markdown("---") + st.markdown("

Top Tourist Destinations

", unsafe_allow_html=True) + + for i, place in enumerate(places[:8]): + st.markdown(f""" +
+

{place.get('name', 'N/A')}

+

{place.get('address', 'N/A')}

+ {f"

Rating: {place.get('rating', 'N/A')}/5

" if place.get('rating') else ""} +
+ """, unsafe_allow_html=True) else: if places and places[0].get("error"): - st.error(f"Error fetching tourist places: {places[0]['error']}") + st.error(f"❌ Error fetching tourist places: {places[0]['error']}") else: - st.info("No tourist places data available or could not be fetched.") + st.info("No tourist places data available at the moment.") with tabs[3]: - st.header(f"Recent Crime News in {city}") - crime_news = get_crime_news(city) + st.markdown(f"

Recent Crime News in {city}

", unsafe_allow_html=True) + + with st.spinner("Gathering latest news..."): + crime_news = get_crime_news(city) + time.sleep(0.3) + if crime_news and not crime_news[0].get("error"): - with st.expander("Show Crime News Articles"): - for news in crime_news: - st.markdown(f"**[{news['title']}]({news['url']})**") - st.write(news["description"]) - st.write(f"*Published at: {news['publishedAt']}*") - st.markdown("---") + st.markdown("

Latest Crime Reports

", unsafe_allow_html=True) + + for i, news in enumerate(crime_news[:6]): # Limit to 6 articles + st.markdown(f""" +
+

{news['title']}

+

📢 {news['description'][:200]}{'...' if len(news['description']) > 200 else ''}

+

{news['publishedAt']}

+
+ """, unsafe_allow_html=True) else: if crime_news and crime_news[0].get("error"): - st.error(crime_news[0]["error"]) + st.error(f"❌ {crime_news[0]['error']}") else: - st.info("No crime news found.") + st.info("📰 No recent crime news found.") with tabs[4]: - st.header("How Popular is Your City? 📈") + st.markdown("

How Popular is Your City?

", unsafe_allow_html=True) + trends = tourist_data.get("trends", []) if trends and not trends[0].get("error"): + # Create animated trend chart dates = [trend["date"] for trend in trends] interests = [trend["interest"] for trend in trends] - df_trends = pd.DataFrame({"Date": pd.to_datetime(dates), "Interest": interests}) - df_trends = df_trends.set_index("Date") - st.line_chart(df_trends) + + fig_trends = go.Figure() + fig_trends.add_trace(go.Scatter( + x=dates, + y=interests, + mode='lines+markers', + name='Interest Level', + line=dict(color='#667eea', width=4), + marker=dict(size=10, color='#764ba2'), + fill='tonexty', + fillcolor='rgba(102, 126, 234, 0.1)' + )) + + fig_trends.update_layout( + title=f"Tourist Interest Trends for {city}", + xaxis_title="Date", + yaxis_title="Interest Level", + height=500, + font=dict(family="Poppins, sans-serif"), + hovermode='x unified' + ) + + st.plotly_chart(fig_trends, use_container_width=True) + + # Add trend insights + avg_interest = np.mean(interests) + max_interest = max(interests) + st.markdown(f""" +
+

Trend Insights

+

Average Interest Level: {avg_interest:.1f}

+

Peak Interest: {max_interest}

+

Tracking Period: Last 7 days

+
+ """, unsafe_allow_html=True) else: if trends and trends[0].get("error"): - st.error(trends[0]["error"]) + st.error(f"❌ {trends[0]['error']}") else: - st.info("No trends data available.") - + st.info("No trends data available at the moment.") - # --- Chatbot Tab --- - -with tabs[5]: - st.header("🤖 Search CityBot") + with tabs[5]: + st.markdown("

City Assistant

", unsafe_allow_html=True) + st.markdown("

Ask me anything about your city - restaurants, events, attractions, and more!

", unsafe_allow_html=True) - if "search_history" not in st.session_state: - st.session_state.search_history = [] + if "search_history" not in st.session_state: + st.session_state.search_history = [] - user_input = st.chat_input("Ask a question (e.g., top cafes, weekend events)") + # Chat interface + user_input = st.chat_input("Ask me about restaurants, events, attractions...") - if user_input: - st.session_state.search_history.append({"role": "user", "text": user_input}) + if user_input: + st.session_state.search_history.append({"role": "user", "text": user_input}) + + # Show typing indicator + typing_placeholder = st.empty() + typing_placeholder.markdown('
Assistant is thinking...
', unsafe_allow_html=True) + + with st.spinner("Searching for information..."): + time.sleep(1) # Simulate thinking time + answer = search_google(user_input) + + typing_placeholder.empty() + st.session_state.search_history.append({"role": "bot", "text": answer}) - with st.spinner("Searching Google..."): - answer = search_google(user_input) + # Display chat history with animations + for i, msg in enumerate(st.session_state.search_history): + if msg["role"] == "user": + st.chat_message("user").markdown(f'
{msg["text"]}
', unsafe_allow_html=True) + else: + st.chat_message("assistant").markdown(f'
{msg["text"]}
', unsafe_allow_html=True) - st.session_state.search_history.append({"role": "bot", "text": answer}) + # Quick action buttons + st.markdown("

Quick Questions

", unsafe_allow_html=True) + + col1, col2, col3, col4 = st.columns(4) + + with col1: + if st.button("🍕 Best Restaurants", use_container_width=True): + st.session_state.search_history.append({"role": "user", "text": f"best restaurants in {city}"}) + with st.spinner("Finding great restaurants..."): + answer = search_google(f"best restaurants in {city}") + st.session_state.search_history.append({"role": "bot", "text": answer}) + st.rerun() + + with col2: + if st.button("🎉 Weekend Events", use_container_width=True): + st.session_state.search_history.append({"role": "user", "text": f"weekend events in {city}"}) + with st.spinner("Discovering events..."): + answer = search_google(f"weekend events in {city}") + st.session_state.search_history.append({"role": "bot", "text": answer}) + st.rerun() + + with col3: + if st.button("☕ Coffee Shops", use_container_width=True): + st.session_state.search_history.append({"role": "user", "text": f"best coffee shops in {city}"}) + with st.spinner("Finding cozy cafes..."): + answer = search_google(f"best coffee shops in {city}") + st.session_state.search_history.append({"role": "bot", "text": answer}) + st.rerun() + + with col4: + if st.button("🛍️ Shopping", use_container_width=True): + st.session_state.search_history.append({"role": "user", "text": f"shopping places in {city}"}) + with st.spinner("Locating shopping areas..."): + answer = search_google(f"shopping places in {city}") + st.session_state.search_history.append({"role": "bot", "text": answer}) + st.rerun() - # Display chat messages - for msg in st.session_state.search_history: - if msg["role"] == "user": - st.chat_message("user").markdown(msg["text"]) - else: - st.chat_message("assistant").markdown(msg["text"]) +# Sidebar with Real-time City Pulse +with st.sidebar: + st.markdown(""" +
+

🌆 City Pulse Monitor

+
+
+ """, unsafe_allow_html=True) + + # Real-time data indicators + if city: + st.markdown(f"

📍 {city} Status

", unsafe_allow_html=True) + + # Simulate real-time data updates + current_time = datetime.datetime.now().strftime("%H:%M:%S") + st.markdown(f"**Last Update:** {current_time}") + + # Data freshness indicators + indicators = [ + ("Weather Data", "Fresh", "#00c851"), + ("Air Quality", "Live", "#00c851"), + ("News Feed", "Updated", "#ffa726"), + ("Tourist Info", "Active", "#00c851"), + ("Trends", "Real-time", "#00c851") + ] + + for indicator, status, color in indicators: + st.markdown(f""" +
+ {indicator}
+ ● {status} +
+ """, unsafe_allow_html=True) + + # Auto-refresh toggle + auto_refresh = st.toggle("🔄 Auto-refresh data", value=False) + if auto_refresh: + time.sleep(30) # Refresh every 30 seconds + st.rerun() + + # City statistics + st.markdown("

Quick Stats

", unsafe_allow_html=True) + if city and city in CITY_COORDS: + coords = CITY_COORDS[city] + st.markdown(f""" +
+

Coordinates:
+ Lat: {coords['lat']}
+ Lon: {coords['lon']}

+

Local Time:
{datetime.datetime.now().strftime('%I:%M %p')}

+

Date:
{datetime.datetime.now().strftime('%B %d, %Y')}

+
+ """, unsafe_allow_html=True) diff --git a/utils/__pycache__/air_quality.cpython-311.pyc b/utils/__pycache__/air_quality.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e60492956d4a6c68e6410fd6f9ed539bfa32e6b GIT binary patch literal 1458 zcma)5-D}%c6uxaa(S=UnNx zbXrBQ>imxzk41$3VaDkaPL!i6D8C|%FlV8)<2Sd)@yOsF@TZ$Gzt16b0MGGS6R_|D zS`#t1ii+Yh=3J&zw^r)Qcj`B8FV(+p-dMTW{Gxuhb(R8KfC6H$M}HqyJPAO+FMkq2j=@NjIoDZXC)1rc<`yd>9`-A^R#k#MTub1Y^x=EU@V_6;FbnK!)l2C@Em{3?j(K0=M`@*tQ zfQ^OCj&3njmR-=dbkoxBSq2r`x@l8E-!!S(a@wwA8@BHid7`m8lOT#BVc!o`h_Tr* zJl~_jy5Uptfd`;zDz>01O~WW!4mR!eW`|f*1+#h5bAsu_@TkHR20tQ76Rd|gBW~t+ zO0hG}U{01n6{eZ?eJAGSrGZdke7%_eY@xAY5a6U+SMNCFyT;<`s#AOK`dp)S^Y-1V zE8l#%T5rIlEU&?8os6U8KBOA7(;V}W8K^G9;~_ZF5Dnh?H2i9i&i1ppzq7N$gqV|u z2t@e#a}{aRJJ#OEf1Qsq)x%7+m#Kz}eJ%fU@HqJC(axiAX^@;6B2K#8pPY`)6(j9Z zq+A-Px!r3!mv@bx`gU0Bzhn(%q}91_aiHb;+MDn`{Cy$HR1PzhUZ(OYULw8wZIrkG zcMSPaq|Hal{6L%DlY83CQ?94I8!j=-N>4q%H`i0&32Oj4In~c!+zWd7D?>?0L4(Ia zl8;~zs3?&vyeRK@REBXG_E!8+#H0EHkpcwCMG!BPYTLmb%lL%Mg30~}uLfc$a2(f1 mS{Pq_G!e$vAV0Hv?-w&F%pK+{y?iA?Q$ul<1NhfP4Dv5ppl3V) literal 0 HcmV?d00001 diff --git a/utils/__pycache__/chatbot.cpython-311.pyc b/utils/__pycache__/chatbot.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78ca8a7451112376d1109adcd91080a6f53660bf GIT binary patch literal 1589 zcmZWpOH3PA6n*pck3Z&*f};|MX)zd^gi_;(pNJJisN4uap=g+y8pGIQW}a=Z?1HL9 zV$lVuB7qvJvZ9WlQl)OX=%QuSrCYJEMv4@v$|5^QWD&9I9UE+DuircGygTpSxt}-w zvAo=jKz<>gEceq0{iAO#g}fkVtw45>fCNH9b4VcP2!Wa-1^O|XqXfc_?93be=v1O} z*q7k^8^gX&`H`7!=S*nbJvR`G#x{aWF(n%MSn&7W4=js5t=jG6?h1WN{E}1Xb-D-o z+&ppdHhnR`q+p(X0oq+;Liozll_D1i3^88{W-l2+Nr-ZvI;IXGhoj3pP>M(rD@6-| zUd=yI9wdnares@Uhd_^t+Y~7XF! zy5B>{=ct%dicZpgB$!~DuSWYEeNXz)2MAY`{Iw&cHN^-PTwT&7nd|;^JD!|{?xmQo z81R~3<3t>-Q?n>e*vqC8UCS6p)WM#fcs%Y1$Z|juxkylT@N%e!kE&P>sUoNF%RMot zozkdPaYG~db&XiF6B--g6fUH``4d9Wm>?E`>#a+WX7jb4nm}0#^XxvrE($=87TQvT zfRcnjl&bd}ItLo+nuZ3=m5M`7>{Id^8{9lLL3MR~t}!@>B{4xR+}3C*7+y`#_O33o zW>CYyNJPXhke$>>N3TZb1Jv7Yvz_;k4bD%CiYkXWse49NR_7=DetERBuYZ2j_t|Xs z^rK1t_35 z%2>sV@n|+vH@)XRFzgQjfsr2jx&C;vz<F8` zuxk5Kj)nzCqGlrBINR{F&o-_ovNC8(G>xzGVgv`}uuX_6!EnGLM=-qDHSkwE*Q{SThx!Ym|x= zJF79^Pub8Ns}VV@!f}DaoMyO)RAc2RjzqCWh^qd5*z%(2mqIJQR!HR*==2Mt<^Z-( zj%;MyFKb(#d9q~#uN!W?tZ&WMHRlYpwIYXfU<_9CTLkbh%&^`?!dw>_C!uRhAW?_XQ2IYcn- z5@ah~Ke^ItFYX-Q$yB=ZVf^oS50az63RblplKy)5?g)$i@R$HkSo6q7)JawKNGEl2 zlhAo518Ap}dN`^y>Y!h=eBG2Poz>}}m-gJ~3CTiK61_?XZ1q1HwI2Z9Mi7t+QMFa6 Z|A5wfvQ?2awQjLFx`}}J{||Y${{kc9m6HGf literal 0 HcmV?d00001 diff --git a/utils/__pycache__/crime.cpython-311.pyc b/utils/__pycache__/crime.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a86a375b0ea6c590593076d4d9181dbce2e57169 GIT binary patch literal 1567 zcma)6TWcFf6rS0Ow7RZrnaaY&vZLZe1ji6J;25{Xm7S2f7=v1jjf>c7r}CzrE7xxeJ*?&MPf-VDwK%era;y#2t^{isamlDX?-EZcc`Sv^K z%#QRt5bz?fBjJbTKX`=xcAU0>-?HNg7`Bm$RGdSLZ$`X`IYjVX?u3I>ZVw}L0M8p+ zHAv?!=Jg%ZL`CpgRev(xjb^yJ)~^vv`^ro)9b4?Ir3V*wN)7q+m8^@r`R%zWy+zM+esAB(^S&d`_l`W_ zJWuuSUWj0{rJ3#&iX+3{?gF6?5PjeBr~yMhjhPpE&~O%KxCJ;(mghT9>SSEQYv?|| zfYxv#IJ-W$Y#2p-d}Jg~)^w$)T`SP+$m;bGvPx*#Sl05{b#I1hD`a4Dc4~leB+q=s z($_gnUnc6L@zOck36bG@%mr`HkTR2UNpk8nZBPPCnMfl`t8!~RH~4?eEr5! z^3E3v!*gGLo|;}N8Cp(XYHjMZVwnY@@N~;dJNonzXgZzhWANjxAlo}!N!tF{PEXAr zgS#^QBG7%*-Ea5w+TAg`=e?%S6?8QbK;>35D2wrC S$X6=D?lewDEg2$8g>99Po1Sm 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 literal 0 HcmV?d00001 From 99d57e7cc3da4315e0813dcbd65327929a1c8333 Mon Sep 17 00:00:00 2001 From: esharatnaparkhi Date: Sat, 26 Jul 2025 23:06:28 +0530 Subject: [PATCH 2/2] Remove pycache and pyc files from repo --- __pycache__/config.cpython-311.pyc | Bin 2887 -> 0 bytes _pycache_/air_quality.cpython-310.pyc | Bin 940 -> 0 bytes _pycache_/chatbot.cpython-310.pyc | Bin 1034 -> 0 bytes _pycache_/config.cpython-310.pyc | Bin 1680 -> 0 bytes _pycache_/crime.cpython-310.pyc | Bin 860 -> 0 bytes _pycache_/events.cpython-310.pyc | Bin 3806 -> 0 bytes _pycache_/tourist.cpython-310.pyc | Bin 1578 -> 0 bytes _pycache_/transport.cpython-310.pyc | Bin 3279 -> 0 bytes _pycache_/weather.cpython-310.pyc | Bin 1560 -> 0 bytes utils/__pycache__/air_quality.cpython-311.pyc | Bin 1458 -> 0 bytes utils/__pycache__/chatbot.cpython-311.pyc | Bin 1589 -> 0 bytes utils/__pycache__/crime.cpython-311.pyc | Bin 1567 -> 0 bytes utils/__pycache__/tourist.cpython-311.pyc | Bin 2822 -> 0 bytes utils/__pycache__/weather.cpython-311.pyc | Bin 2471 -> 0 bytes 14 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/config.cpython-311.pyc delete mode 100644 _pycache_/air_quality.cpython-310.pyc delete mode 100644 _pycache_/chatbot.cpython-310.pyc delete mode 100644 _pycache_/config.cpython-310.pyc delete mode 100644 _pycache_/crime.cpython-310.pyc delete mode 100644 _pycache_/events.cpython-310.pyc delete mode 100644 _pycache_/tourist.cpython-310.pyc delete mode 100644 _pycache_/transport.cpython-310.pyc delete mode 100644 _pycache_/weather.cpython-310.pyc delete mode 100644 utils/__pycache__/air_quality.cpython-311.pyc delete mode 100644 utils/__pycache__/chatbot.cpython-311.pyc delete mode 100644 utils/__pycache__/crime.cpython-311.pyc delete mode 100644 utils/__pycache__/tourist.cpython-311.pyc delete mode 100644 utils/__pycache__/weather.cpython-311.pyc diff --git a/__pycache__/config.cpython-311.pyc b/__pycache__/config.cpython-311.pyc deleted file mode 100644 index 60a576b911ce746bcaf0a5ebfd5c7590b1deb4c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2887 zcmai#dr(x@9mnqiyDZBa_+Qk%h%5X*}>-&%Lk@yt@lx5+y!r zVp4*Q8Z??xXQ*gr8mBfIo0>7&rtM5kH<5J6Hc3r2&DeyxYU)gk?euppmzMpjm$Uo( z?&o(Nzw`T@b2%Lvs^jpP{>xtB#UPHm#eU2`k&1Y*#E;`%1ANkxATo`S84CeQ=DiUu&lwmChi0ty1tAVQyP`@texE7)XfhXL7c2T8ULaLU#N zgR&ih9kLyUow9uzo{{aduuHbPVMMmi!5-P}JrOpk+RVW|BbT+`qpmeu1d*Qe|MI2G zla)Me*1urb+G6Ch{5<{^;>0hz&7)~?S$l{`AMNVs4JXaG z`u)>g+1WgO2R+8f4s5u zDxS__7}J9+4ufDdgS^y3T&(rG_tsfjpL#Jjv5eHlnz46)2;8*UH^VC1+U{ddW z^aM7$di!nmA?n@#`;K>K(AD?Z_JgC97=)&Y*w`S;j-8Xa4)k2?+5K@<4D+-S$~Y`+m}g zZ(vnwU$lJr-F2KmXA=9!Fc~61Xldo;_M^`g@btoie@*YmLT_LT0hfd|yMU3L|9Cl1 zZ|{Bm`q=}x4PA|0#53Y#+pk;U@;k0g=V>&#b|a^XC8lNA!8{FZkK-M$X7cpkHIHV$ z%4Fj@Byo_~Kyq2>`)B|7ktrkvkJpxD!@UZYoF+RhY#I*}4dplO-AUb^)58lGlMym0RGLbflXAX+VC?i?oI zxHz`MCgy1&HewO!q41rhKV8Q2w6h@lOms7Pw6$hI!aUk&;>u6cG#hcgV{acF3*Upj z00Wf>RToE=R_0ak6gU0mz7Zo&v5*z58}W2pgR@&Z-swPbBgee>eicuPM=tVv4q~5E z>#$B~xUbyl<9}Ov*QDIi!#GN=!?#G@;`jXZw+%?Pe&J62^DL6alOyR@O}G|b`!C$- zNW7=tYtjcHVF9}%ko@B-ynesL6Bxj*c3u~jZ+gd_^bat-X_p=!_~vOOO}`7QdMyS= zvDhzfL$cwG!{+Cs4Lm(335R9@Bea^H{n-T_5@+4vhnn;4JpFcpp8xxe44$$Rn*0s+ zDQNzQuI?jTYZUK8!zcJ63iD`9M8a%3M31(CNFw0j_Gs%}Lqs4>WLN_WzNM%q7+)!p zL;Ob@54dW}4SnWbaek)i6M9RN^IU>#zK5qC}UxqI(V#pqTU^ni_II(ScLCd*zTL^HO?cfJ_L zVtxC?F&6L37BiOM%Muw|;>(sYwv1DUEXYa{W68e#QW#71Wy=}k*jE~-jvCib>D|#q z*t{zkOXt)v<8+F;V@t7lGZ@R{)RE&EQyK24RoJ{)jAgS84q^eq^Ranz7|ZqTm&aJX z@8T;ND`5T7u~1Qk*t~^|tzw%oVX{MWv3ZLaE9TU?G5v(z9h`&BTf$hWZ({X~mHD#O zjFofh@bSQ@KzBp|Hg5%EmA>&+F}B7xzO{_;Dqm<&FWt|f|>ZF|05Gq=PNN2w`~4&&LpJF=Y1x2>HK+LC>P8doiLxPg{v)?A!f;c?-2Q4 PoGjRpVD=}K;??^PLM;%i diff --git a/_pycache_/air_quality.cpython-310.pyc b/_pycache_/air_quality.cpython-310.pyc deleted file mode 100644 index fb0827ab567c90fc4543029b710054cf4db0af5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmaJ;PiqrF6rY)$-E7h%RjY>{gq(zcBwEx%6={h9ixP`%5tl$1Gt+eAW@j@qsWfbE zo&>)^5A8+pE6vqY!A~G4zS#!M$p`a$e`enA{TW%SRS?MZ=hKrf6rmr^SrreQ9XR?P z07o1rD7w}-!UA6qPA+leagWo_D54x6pr(HXZ&A-~yxH&e-gS2mUv}RPcK7!Nue$Gt z*xfCq1{#W@4jlarfa3+u5hn(5@7!AugU2MtIpOpxS$Mg3;a#Ey&8gnxJ`Z9jmQ!BZ zL_FL?3x8>s!47z3QOf;10H!ry3Ja!E9u`dHyj(CAGRK}d91|H zT)Cl}p2bt^C-EdU)@NB3^Cq@I#uS@q>kFl%n%6tAIcucSG>+vg<;o>mFJT5irt?St zugaNW?XA}1HjC9DlSwi&u}qtuDg%vjAFTpMNRwEb`Q4suz{AFL#u8W6WjELwy{hF!+G^rwvE>vPV6WVC&jfAmutf6Sl(jl-$HCV+^ z@;Dt0W-5s);0~^5j!Mo}LPw!9T={>EMkO~xkx>j&Z0R~!WVoQqh(c$@>9H*O`i|5F zwDjvqXS;u-h0^`8G;G{|A@oNhvwmmq@O@+d==DLj54%Zp-(@cs(8|v2It(yaiMe&@ zEdWYDFu}p^x*uXnLR=+POuf};xQr4nz`-AN2hy6pS_fr`)HVQak)9SiD=v#xSKzjL X89tjxK1;-N_w_mi2vLYDq)Pq*D@^uB diff --git a/_pycache_/chatbot.cpython-310.pyc b/_pycache_/chatbot.cpython-310.pyc deleted file mode 100644 index 033a52e9f1b238f2253b0f37d4806bd4f085f966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1034 zcmY*Y&u<$=6rP#=k+oY_rNF@zhwTa0f=wI+wM0=wNUUH{r9q~OVq969oxxsby|bB_ zwd2(qA+;Pia4twKH~tg;1Td*9RWMx%~k{LXg9AKM81 zVHU3s0*g<<E>B{)}|Znt$UkWF*YGy4Hss^Z68ej z0#M#nXo4wLL|GMZ_{pNy4`hieJh7>LPDH!H&z$FINvKni84_UyUemC4zb8$!wCLJ1 zmwL4J1Xb1ndW@grrCr%4sE1Avt@jYUW@0@>KNGWOBek|T#%SqaR5s{!@6f};?)>x@rZm+M;=ksvH`6y*kp2#rf)AhKJicckrL_A)fwF66A z=WL-#e5vt8fVG=PBAUtuc?(M5U}Gk3P_Lnq=pt9kg0?y(Y6H&zbra1w@l@ zL)(UmXh5D7{JFWmJ$NXYkb?a5!N`*TqkE2xXg7fd`^7aw;1xwj1$`m-VNR{-z;YCKn z^48%>VSn$q>vx3UV%sm9oy(ZzD&d(=3z1|a|0>6}AJnub*hRsllG++ErEeTQcyM^X zGlcuYFFL2%-S2gV-2;71sz?=b7<07Pnv$?-+R3fZ2U5+p2S`l-|yi(;{WN=A}swz$3N=k;y+?u?@ul diff --git a/_pycache_/config.cpython-310.pyc b/_pycache_/config.cpython-310.pyc deleted file mode 100644 index 21a04f660e278c534a52003fdce92597e2b7d433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmYk6dr(wW9LIMLu)sk?Km|nw1bL(Q;31$MSQLO7dto1VcURMCv?svnkH&K2=P@STE7eDkM7K#`P}{9^E=<~@0@#` z!NJskS9)8n(rYppuIo4dzwkc;!=G!v(O^&wU;rZ!@Yz8&8^IU+z$Dop0w7Q_g&-Ip zIT!{)h~z;K3SpANVK5AlJQN}zQt~hu4pEXvz(^P+IT~UhR`O_wgLuhfAOR93CqXi# zNKS<`NS8bo#zBVU@h|}<_A{oL1euT}m2Aj?$&zy+5Ar2XfvGS}GJ^srlx&6~m@at+ z6hn#RQkV&4lFOk2DkaZ?Dwr*K4p^XCat+kNT*)uNJgAdAAL`*{$*;fySSXo812jqo zu)?B#Za0De1yub`HMSe;4A5jTBsY8gimWz875jW{txwvS&qR6l+Jc1@7M4uBJ~r;g z!RhdtDm?ZEu8N)&P2ae~Co*yD-md(#oH@)JSjZiM+nkzJShmKtdb*RDz)GFLi!3OX zECZ{?8#suQkCW;*G>m7W{oCUa2_K>8Z&s`h2Nq2{@z$qvQ&N~Xii#z)8l^I)t(m*I zShw%m?Jb+Kn7DUra@@>_TIThw@;I#G<6kFr<*c5-L?_xfzeM*@pxCX@x6~6{>4aZ4 z6Q}Yjf7uw1qG={qTRfULcjao(=G(bU_yn$tZhU}>pT(nbw^;sTa_*+oOeT^$gO6rp zqTpZdX>4{lmx}wVf2uzI8_sFEvUpub_UiKXG#4s|8dhGMGDKG@xzLrq zAY-uHlB+vH+rP)K!L_Q3H!Hk_yB*vvHgr6QKKliBqv##mt!Jn7sih9ko48|Q+n3p2 zV`6=^jwibLLdDs_ZQ@yO%jvfZF;?W3^MOho7WJ#rtBJ$!n(hz%U@{Xc^+!r-m^Z9i zQ8mvJ?%)nLu89%t;`H91FVqf*#jTqkQ_!8KPcL&e;?A4G22cCpQXCVbTRn@TLQ(K3 zcJlsE+r~06Fn#~dt~I(5i=x_Xyuater!f&xQq>z-h7$sctcu3L;}B8fF2|c@Pi11; zk*)8Ayn&jj0&Un-u`y(M*5{)b6Eztrd&0|6@vnjYZRsf(x=EFDc#+d|^Xq5*%jfz#%mWijk#eqBL z5}CN({^55qk1VXtuZY{7ipVJcgwD8t2cZ@Bz2uUGRVEv~LFUrxc?-<5X3Z(G>@jEw z_)YE`dQ#1~^))W5=BjUUx_MK5k=51gcDB^(&&O2Nlv}3PH#!}QR57+?nKvNc?gWp` zIu*a>23IQ%gis^-mlE=V`jF?;m-JFU@{F2D5A`QcX#n|$29m!iB~NG&c}xe8M>Lo` zqyxzV8bZ41Aab9E`gYMU@)r#!opdm{M~9HRbSSw)BgkzUN&ck6$SpdY+@w+D1|2~< d=ty#%jv{~1XmX9lkgGJ7{7y&vUZHXH@_!uaSDpX> diff --git a/_pycache_/crime.cpython-310.pyc b/_pycache_/crime.cpython-310.pyc deleted file mode 100644 index 1b1a904aad7df08047b1af73398b1223596e52b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 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 diff --git a/_pycache_/transport.cpython-310.pyc b/_pycache_/transport.cpython-310.pyc deleted file mode 100644 index 98bf53c81b3aa23bbe200b3d4b02c077831496da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3279 zcmaJ@Pj4H?6`z@1E|(NZ(UN0_Zk((G#}0u+LW=+?1feJ;G8SQx5-7@s777+C&WK!z z++}8$azreP04dN@FFm#{U>yte1N6{-h8}X8OAa~p-c#Ymc{5AOl&g9P&b*m<^Lu}0 z-g^_|^H~Jn_l5P|?@9>$AP4hb1_r-|e|Q27MHKguo%Gno48I_hTwq(H8r5m)IiUtk zQxp0O&8mKZ<~&UEv;gfQEh_p3v`cgu+MCZ!Tc_{PTfaqiir%L0LT^yKhsvdYfjra{ z%hgJ|;yl`U;?$c?Ww-7;t{vDP9_;M5oW_1*qf&P^_V=9D&VIWFU2P8*Hfv73YJW1% zv%Rxf*>>8k3V`gjEA9GD^9pyFi2Ttgba*g|Sm=1vzTFQxZr_Qx>-kO?xsez6YT+Y= zTdi$x)tyGI-P*Yp(7rdvcD;rm^TvQhJeY^)8dz3VnCvGm+Ukr;NKtE)|(dZ@{P|J6K-9>1RMMBV`l* z;oqT&PzX1b5)W=G)nfD~^k*``5t4C0jpy2gjBiEwgv2-|H2r%r(PHg|c7ZU0UcW#S zJ=P(5%r3ehPthLI5pbtYjPn{slN3hdBA{m^F3rX%K-WF|6dC9M(S=FsHz|;+`ezt+ zrq92e?#jcioZ<(~uIGP-%K7nD)`IT~7Ik_ov?#d3I_AN^ih4|qR=UC2isxGpa@KLc zE!XOLXUw-a3xg5wFsoi&Q4k`u+)k6W*;TC>JldCh8$s})8>&f`OjyYYlr(Gy?-)z{F)t{S6M6;x6hUN~rc+m$CE$$LIo2NKC?FEaOa%$r<8LBAB6i34Mzv8coF- z%zYFCRYEbQsdeQ4Jl3k{%a2uzVQN66VOf_h$OW0C)F>lIlVk-d70~H8Ma@%=(0Q2 z<%W{JG}R@eM$4+bd4WNTtfJph?JYI4FkXtY{11^HXTQZhWSmJZUf_R(@xpYRe~SD? z$O5UzI40+R#gJn#qPGu$bCN$mK7NK`uorCm2k8E;v<=3kI2Y&XovCeu*yP{QpGn(F z2yFPLq*ADa=zE_d4S`Q}dUtC1`}6}3cQK5tb?`V;>wDvlN(PTy$R9kkRKe_6!_iUS z>sXhU36ek(vQSK~WR<#4J=eE7UUaT-R4ST_&?ME2H=4l=`ZcCxv)nTXbeT^SY}A9q zBf*lKHV@P+>%x%gjY470>blGzJ_~scE~Khuin4R+IpFwEO&GV$WaQDY)?BUF3$PhV z>M-#9$j&gICM3TH7`C=C3PF(GJ|D7it|ea;Rx^P~?a6(%R`coD0y+W*!PCQ1=t+LM zG-ic=AT?68I5$<+@!bKlGa-bnB8AxpjA%re(0~$|e&Ba! z^PpW5kobqNCd};_MrM1q-PS;@@k8su%;oB_k__PZuDX3?e1B@oTe(Df0O`{0vhik% zx&2QgZ@{e45U`*KxtytLacRDF=DARi;4EiV==DAEpmIPO1rUkhOfkx7QK~nq^@@D! zHTQORTJ6h6;T~U>&Xie5818TgMPeO*mgg~1H`bRxQUg`SP Lzwv{4KX>OR*(1CY diff --git a/_pycache_/weather.cpython-310.pyc b/_pycache_/weather.cpython-310.pyc deleted file mode 100644 index dc8ca4dbbe2dacfedbb38515c52f99bed6fc1ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1560 zcmZvcTW{Mo6vs*3tT=IcUApXo8Uq^4C=dhP_7cqN0ypilwMkItf*KwSRb*@?lBkkY zHXHU{w(l@tZ27X?SwhzOlQvwR5z!x&PJH)9&WpcK4gDXYG~4?bgBO z`Uen3NAxAcH?lx&Ltc{C-q<#DVvQiau`_Z`Z04NW zY8B%X5Yxz+IOk;Sj$Bq+CCpzXv(mz4sa%v6p>+vzWtB|abL=&@EQ9sRD;L&xb$It7 zH(|dTW=iqIRKMea>2p=hv`Bi@-IOOsQ_GVeT_1khHzw5^^?HzsbqS5L?lCk<)vL3> z1oeCCpVepf`%z#TLw7BbNn?0(ElY&ajhGuH!nGhx1#7(d9X26%xl&RMZ$At~#97tI z>hb?Yl{;}DlH4&oPV@3H=aKG4;*{rpKZ^wuX3#FpW>yr(U1VH`N~A_ea1)_SYHq%W z?py^XQ(TpxoAOZ>P>`~kmzQ>rp5XcAzTz)3u8q#^9yj@-HsGeap=3OFPBe__8et+1 zJ_{kt-%Wy;=Qb=G1X}G(ML38~Wun0aH|RH_-i2xYyw}|59B8g|=R}&|r1OC5QzO$( zb9?_;b?@MDYpatP5$VosN$cq#zX4HnXJ^%&*)edv0CaXcYk3BYR@8QjeTlW2c8e zIuFRVH^<({owy^f0Mla#rNsWLv!X{h?-0tkK6RS=9P#HZuFgcrbsbK_)M4MJH6vmk ziGPIin&8qm1!J5uRQ<<%7oX+8SU4uYlPfq`ZL)D7@jy0r@Y%|5{k? zO^3?e;;-;6DDca@RPj)xHAj5_w%iZSdR+u{3g?Gl1IE0=CSs{7=(db<1?4J8?!krP z39FUVb+o;Mf>fwmDDQ*hp3F>|nPP^5!KtibTS3+=+BsQBj{X?LvMuUdSk$|)F3Qf7 zu_fvNX%6*fU-@sRq&|YqwT0Z0x`+{8)#AZa7Ea*-yzqLeC8(&|C^$jk^Hwx?H&hXl b|9LD~7V$3-UX6?NiBFecKIGfCmahE+g4CvV diff --git a/utils/__pycache__/air_quality.cpython-311.pyc b/utils/__pycache__/air_quality.cpython-311.pyc deleted file mode 100644 index 3e60492956d4a6c68e6410fd6f9ed539bfa32e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1458 zcma)5-D}%c6uxaa(S=UnNx zbXrBQ>imxzk41$3VaDkaPL!i6D8C|%FlV8)<2Sd)@yOsF@TZ$Gzt16b0MGGS6R_|D zS`#t1ii+Yh=3J&zw^r)Qcj`B8FV(+p-dMTW{Gxuhb(R8KfC6H$M}HqyJPAO+FMkq2j=@NjIoDZXC)1rc<`yd>9`-A^R#k#MTub1Y^x=EU@V_6;FbnK!)l2C@Em{3?j(K0=M`@*tQ zfQ^OCj&3njmR-=dbkoxBSq2r`x@l8E-!!S(a@wwA8@BHid7`m8lOT#BVc!o`h_Tr* zJl~_jy5Uptfd`;zDz>01O~WW!4mR!eW`|f*1+#h5bAsu_@TkHR20tQ76Rd|gBW~t+ zO0hG}U{01n6{eZ?eJAGSrGZdke7%_eY@xAY5a6U+SMNCFyT;<`s#AOK`dp)S^Y-1V zE8l#%T5rIlEU&?8os6U8KBOA7(;V}W8K^G9;~_ZF5Dnh?H2i9i&i1ppzq7N$gqV|u z2t@e#a}{aRJJ#OEf1Qsq)x%7+m#Kz}eJ%fU@HqJC(axiAX^@;6B2K#8pPY`)6(j9Z zq+A-Px!r3!mv@bx`gU0Bzhn(%q}91_aiHb;+MDn`{Cy$HR1PzhUZ(OYULw8wZIrkG zcMSPaq|Hal{6L%DlY83CQ?94I8!j=-N>4q%H`i0&32Oj4In~c!+zWd7D?>?0L4(Ia zl8;~zs3?&vyeRK@REBXG_E!8+#H0EHkpcwCMG!BPYTLmb%lL%Mg30~}uLfc$a2(f1 mS{Pq_G!e$vAV0Hv?-w&F%pK+{y?iA?Q$ul<1NhfP4Dv5ppl3V) diff --git a/utils/__pycache__/chatbot.cpython-311.pyc b/utils/__pycache__/chatbot.cpython-311.pyc deleted file mode 100644 index 78ca8a7451112376d1109adcd91080a6f53660bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmZWpOH3PA6n*pck3Z&*f};|MX)zd^gi_;(pNJJisN4uap=g+y8pGIQW}a=Z?1HL9 zV$lVuB7qvJvZ9WlQl)OX=%QuSrCYJEMv4@v$|5^QWD&9I9UE+DuircGygTpSxt}-w zvAo=jKz<>gEceq0{iAO#g}fkVtw45>fCNH9b4VcP2!Wa-1^O|XqXfc_?93be=v1O} z*q7k^8^gX&`H`7!=S*nbJvR`G#x{aWF(n%MSn&7W4=js5t=jG6?h1WN{E}1Xb-D-o z+&ppdHhnR`q+p(X0oq+;Liozll_D1i3^88{W-l2+Nr-ZvI;IXGhoj3pP>M(rD@6-| zUd=yI9wdnares@Uhd_^t+Y~7XF! zy5B>{=ct%dicZpgB$!~DuSWYEeNXz)2MAY`{Iw&cHN^-PTwT&7nd|;^JD!|{?xmQo z81R~3<3t>-Q?n>e*vqC8UCS6p)WM#fcs%Y1$Z|juxkylT@N%e!kE&P>sUoNF%RMot zozkdPaYG~db&XiF6B--g6fUH``4d9Wm>?E`>#a+WX7jb4nm}0#^XxvrE($=87TQvT zfRcnjl&bd}ItLo+nuZ3=m5M`7>{Id^8{9lLL3MR~t}!@>B{4xR+}3C*7+y`#_O33o zW>CYyNJPXhke$>>N3TZb1Jv7Yvz_;k4bD%CiYkXWse49NR_7=DetERBuYZ2j_t|Xs z^rK1t_35 z%2>sV@n|+vH@)XRFzgQjfsr2jx&C;vz<F8` zuxk5Kj)nzCqGlrBINR{F&o-_ovNC8(G>xzGVgv`}uuX_6!EnGLM=-qDHSkwE*Q{SThx!Ym|x= zJF79^Pub8Ns}VV@!f}DaoMyO)RAc2RjzqCWh^qd5*z%(2mqIJQR!HR*==2Mt<^Z-( zj%;MyFKb(#d9q~#uN!W?tZ&WMHRlYpwIYXfU<_9CTLkbh%&^`?!dw>_C!uRhAW?_XQ2IYcn- z5@ah~Ke^ItFYX-Q$yB=ZVf^oS50az63RblplKy)5?g)$i@R$HkSo6q7)JawKNGEl2 zlhAo518Ap}dN`^y>Y!h=eBG2Poz>}}m-gJ~3CTiK61_?XZ1q1HwI2Z9Mi7t+QMFa6 Z|A5wfvQ?2awQjLFx`}}J{||Y${{kc9m6HGf diff --git a/utils/__pycache__/crime.cpython-311.pyc b/utils/__pycache__/crime.cpython-311.pyc deleted file mode 100644 index a86a375b0ea6c590593076d4d9181dbce2e57169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1567 zcma)6TWcFf6rS0Ow7RZrnaaY&vZLZe1ji6J;25{Xm7S2f7=v1jjf>c7r}CzrE7xxeJ*?&MPf-VDwK%era;y#2t^{isamlDX?-EZcc`Sv^K z%#QRt5bz?fBjJbTKX`=xcAU0>-?HNg7`Bm$RGdSLZ$`X`IYjVX?u3I>ZVw}L0M8p+ zHAv?!=Jg%ZL`CpgRev(xjb^yJ)~^vv`^ro)9b4?Ir3V*wN)7q+m8^@r`R%zWy+zM+esAB(^S&d`_l`W_ zJWuuSUWj0{rJ3#&iX+3{?gF6?5PjeBr~yMhjhPpE&~O%KxCJ;(mghT9>SSEQYv?|| zfYxv#IJ-W$Y#2p-d}Jg~)^w$)T`SP+$m;bGvPx*#Sl05{b#I1hD`a4Dc4~leB+q=s z($_gnUnc6L@zOck36bG@%mr`HkTR2UNpk8nZBPPCnMfl`t8!~RH~4?eEr5! z^3E3v!*gGLo|;}N8Cp(XYHjMZVwnY@@N~;dJNonzXgZzhWANjxAlo}!N!tF{PEXAr zgS#^QBG7%*-Ea5w+TAg`=e?%S6?8QbK;>35D2wrC S$X6=D?lewDEg2$8g>99Po1Sm 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