Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

git - Should Pipfile.lock be committed to version control? #598

Closed
LeCoupa opened this issue Sep 19, 2017 · 26 comments
Closed

git - Should Pipfile.lock be committed to version control? #598

LeCoupa opened this issue Sep 19, 2017 · 26 comments

Comments

@LeCoupa
Copy link

LeCoupa commented Sep 19, 2017

When two developers are working on a projet with different operating systems, the Pipfile.lock is different (especially the part inside host-environment-markers).

For Composer, most people recommend to commit composer.lock. Do we have to do the same for Pipenv?

@kennethreitz
Copy link
Contributor

i recommend it.

@kennethreitz
Copy link
Contributor

Especially for applications. For libraries, less so.

@LeCoupa
Copy link
Author

LeCoupa commented Sep 19, 2017

Thanks a lot @kennethreitz

@salty-horse
Copy link
Contributor

Should this recommendation be documented? Perhaps in a section similar to Composer's.

@dougireton
Copy link

Are their negative consequences to using a Pipfile.lock across OS types? In other words, if I generate my Pipfile.lock on MacOS, then deploy to Linux will Pipenv "do bad things"?

@uranusjr
Copy link
Member

@dougireton This depends on your dependencies. Using a lockfile from a different OS is fine if all your packages are modern and well-behaved (either platform-agnostic or have good cross-platform support). Otherwise Pipenv can do things wrong, like installing dependencies that don’t work, or not installing all needed dependencies.

@kennethreitz
Copy link
Contributor

Generally, yes you should commit it to version control.

@behrangsa
Copy link

How come pipenv's own Pipefile.lock is not added to git then?

@kennethreitz
Copy link
Contributor

because we are special snowflakes.

@anentropic
Copy link

anentropic commented Mar 7, 2018

I'm happy to take this advice as correct but I would like to understand why it is given.

the docs say:

Generally, keep both Pipfile and Pipfile.lock in version control.

but I couldn't find any more reasoning in the docs, can you point me to it?

Pipfile.lock is auto-generated and contents will differ depending on platform. If I'm developing on macOS and deploying to Debian ...already it sounds to me like I don't want the lock file in version control.

Then the comment above says:

Using a lockfile from a different OS is fine if all your packages are modern and well-behaved (either platform-agnostic or have good cross-platform support). Otherwise Pipenv can do things wrong, like installing dependencies that don’t work, or not installing all needed dependencies.

Again it sounds like I would not want the lock file in version control.

Here is someone asking similar question #954

Reading through the responses on that issue I have a clearer idea of why I would want it. I think the docs need more elaboration.

The related question is how explicitly should versions be specified in the Pipfile?

If I do pipenv install <package> during development to get the latest version, it will go in the Pipfile with no version specifier. If everyone else gets my Pipfile.lock from vc and does pipenv install --ignore-pipfile they get pinned to the versions I installed, and no need to be more specific in the Pipfile. All good. If they don't do --ignore-pipfile then the lock file may change if a package updated and they have to decide whether to commit the changes. Ok. At any time devs can pipenv update <package> and the Pipfile won't change but the lock file will, and we would commit that. Ok. Is this the intended workflow?

But if the other dev is on a different platform the lock file contents will change(?) but it's not necessarily due to different package versions and we wouldn't want to commit it. Hmm.

And I would only add version specifier to Pipfile if for example I knew at dev time that I needed to install a non-latest version?

Also I noticed in the example Dockerfile you use pipenv install --deploy rather than pipenv install --ignore-pipfile ...they seem to have similar meaning, I would like to understand the subtlety of one vs the other.

(loving pipenv so far though!)

@anentropic
Copy link

I just found some more opinion from the pipenv tool itself:

requirements.txt found, instead of Pipfile! Converting…
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did.
We recommend updating your Pipfile to specify the "*" version, instead.

@uranusjr
Copy link
Member

This thread is quite old, but since it emerges again I guess it is best to make a definite, up-to-date statement. As of March 2018, the answer to this question is yes, you should always commit the lock file. Always.

@mmohaveri
Copy link

@uranusjr could you please explain why?

what has changed in March 2018 that changed the answer from "generally yes" to "always yes"?

What about the issue you explain earlier, is it fixed?

Using a lockfile from a different OS is fine if all your packages are modern and well-behaved (either platform-agnostic or have good cross-platform support). Otherwise Pipenv can do things wrong, like installing dependencies that don’t work, or not installing all needed dependencies.

@techalchemy
Copy link
Member

Nothing is different. You should commit it to version control. If there are os-specific markers they should be included automatically. Because setup.py files are non-deterministic, it is possible to resolve a package on linux and find that it resolves differently on windows, but there is nothing we or anyone else besides the package maintainer can do about that. You won't know that's a problem unless you encounter it. If and when you do, simply re-lock and see the diff.

@gsemet
Copy link
Contributor

gsemet commented Apr 1, 2018

For application using pipenv, yes you track the lock files.

My librairies however I write using pipenv (and use PBR to reflect to setup.py and an automatic generation of requirements.txt so PBR is happy once the package is deployed), I do not track the lock file. Pretty simple

Hanse00 added a commit to Hanse00/LecToCal that referenced this issue May 26, 2018
…m/questions/46330327/please-explain-the-usage-of-pipfile-and-pipfile-lock) suggests the Pipenv should be versioned as well.

This is to help others build the tool easily. I've decided to start tracking the Pipenv as such, however as of this commit, the pipenv contains far from all dependencies. I will be slowly working those into the pipenv.
dmd pushed a commit to dmd/nkplay that referenced this issue Sep 13, 2018
sdrogers added a commit to NPLinker/nplinker that referenced this issue Oct 29, 2018
…a couple of things from requirements.txt and pipfile to make it compatible with linux
Winnie-Fred added a commit to Winnie-Fred/text-to-speech that referenced this issue Jul 24, 2023
show the user the progress of the conversion using a progress bar,
celery, redis and rabbitmq.
This replaces the preloader that was used previously that did not show
progress. Overwrite part of the gTTS library to update the progress
of the conversion process.
User can customize the conversion settings by choosing
the language and accent the converted text (speech) should be in.
Form errors are displayed on the form instead of on a separate error
page.

diff --git a/.gitignore b/.gitignore
index 89d0c56..22a367b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,138 +1,140 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-pip-wheel-metadata/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-.python-version
-
-# pipenv
-#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-#   However, in case of collaboration, if having platform-specific dependencies or dependencies
-#   having no cross-platform support, pipenv may install dependencies that don't work, or not
-#   install all needed dependencies.
-#Pipfile.lock
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# Custom
-.vscode/
-speech.mp3
-test_document.Doc
-speech_files/
-speech_folder/
-testing.py
-text-to-speech-info.txt
\ No newline at end of file
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# Custom
+.vscode/
+speech.mp3
+test_document.Doc
+speech_files/
+speech_folder/
+testing.py
+text-to-speech-info.txt
+tlds_with_countries.txt
+tlds.txt
\ No newline at end of file
diff --git a/README.md b/README.md
index 86519e7..e87e79c 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,17 @@
-# text-to-speech
-Simple English text-to-speech web-based application using Django and Google Translate text-to-speech API
-
-## Check out the project
-Click [here](https://text-to-speech-a2ve.onrender.com/)
-
-### About the project
-This project is a simple web-based application that converts English text to speech. The speech can be previewed and then downloaded as an mp3 file. It is created using Django and uses the Google Translate text-to-speech API for the conversion (with gtts Python library).
-
-### Python version >= 3.9.7
-
-### How to set up the project locally
-1. Clone (or fork then clone) the repo
-1. cd into the project directory and create and activate a virtual environment
-2. Install the dependencies with  `pip install -r requirements.txt`
-3. mp3 files are hosted on Cloudinary. You can create a cloudinary account [here](https://cloudinary.com/users/register_free). Enter your cloudinary cloud name, api key and secret in a .env file in the root of the project directory.
-4. Start the development server with `python manage.py runserver` and go to localhost in your browser
+# text-to-speech
+Simple English text-to-speech web-based application using Django and Google Translate text-to-speech API
+
+## Check out the project
+Click [here](https://text-to-speech-a2ve.onrender.com/)
+
+### About the project
+This project is a simple web-based application that converts English text to speech. The speech can be previewed and then downloaded as an mp3 file. It is created using Django and uses the Google Translate text-to-speech API for the conversion (with gtts Python library).
+
+### Python version >= 3.9.7
+
+### How to set up the project locally
+1. Clone (or fork then clone) the repo
+1. cd into the project directory and create and activate a virtual environment
+2. Install the dependencies with  `pip install -r requirements.txt`
+3. mp3 files are hosted on Cloudinary. You can create a cloudinary account [here](https://cloudinary.com/users/register_free). Enter your cloudinary cloud name, api key and secret in a .env file in the root of the project directory.
+4. Start the development server with `python manage.py runserver` and go to localhost in your browser
diff --git a/manage.py b/manage.py
index c5d11a7..a5cfb03 100644
--- a/manage.py
+++ b/manage.py
@@ -1,22 +1,22 @@
-#!/usr/bin/env python
-"""Django's command-line utility for administrative tasks."""
-import os
-import sys
-
-
-def main():
-    """Run administrative tasks."""
-    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'text_to_speech.settings')
-    try:
-        from django.core.management import execute_from_command_line
-    except ImportError as exc:
-        raise ImportError(
-            "Couldn't import Django. Are you sure it's installed and "
-            "available on your PYTHONPATH environment variable? Did you "
-            "forget to activate a virtual environment?"
-        ) from exc
-    execute_from_command_line(sys.argv)
-
-
-if __name__ == '__main__':
-    main()
+#!/usr/bin/env python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+    """Run administrative tasks."""
+    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'text_to_speech.settings')
+    try:
+        from django.core.management import execute_from_command_line
+    except ImportError as exc:
+        raise ImportError(
+            "Couldn't import Django. Are you sure it's installed and "
+            "available on your PYTHONPATH environment variable? Did you "
+            "forget to activate a virtual environment?"
+        ) from exc
+    execute_from_command_line(sys.argv)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/render.yaml b/render.yaml
index c75ed70..37616bf 100644
--- a/render.yaml
+++ b/render.yaml
@@ -1,20 +1,20 @@
-databases:
-  - name: text_to_speech
-    databaseName: text_to_speech
-    user: text_to_speech
-
-services:
-  - type: web
-    name: text_to_speech
-    env: python
-    buildCommand: "./build.sh"
-    startCommand: "gunicorn text_to_speech.wsgi:application"
-    envVars:
-      - key: DATABASE_URL
-        fromDatabase:
-          name: text_to_speech
-          property: connectionString
-      - key: SECRET_KEY
-        generateValue: true
-      - key: WEB_CONCURRENCY
+databases:
+  - name: text_to_speech
+    databaseName: text_to_speech
+    user: text_to_speech
+
+services:
+  - type: web
+    name: text_to_speech
+    env: python
+    buildCommand: "./build.sh"
+    startCommand: "gunicorn text_to_speech.wsgi:application"
+    envVars:
+      - key: DATABASE_URL
+        fromDatabase:
+          name: text_to_speech
+          property: connectionString
+      - key: SECRET_KEY
+        generateValue: true
+      - key: WEB_CONCURRENCY
         value: 4
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 8c0e840..79589a8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,9 +1,17 @@
+amqp==5.1.1
 asgiref==3.6.0
 astroid==2.13.3
+async-timeout==4.0.2
+billiard==4.1.0
 Brotli==1.0.9
+celery==5.3.1
+celery-progress==0.3
 certifi==2022.12.7
 charset-normalizer==3.0.1
 click==8.1.3
+click-didyoumean==0.3.0
+click-plugins==1.1.1
+click-repl==0.3.0
 cloudinary==1.31.0
 colorama==0.4.6
 dill==0.3.6
@@ -16,13 +24,17 @@ gTTS==2.3.1
 gunicorn==20.1.0
 idna==3.4
 isort==5.11.4
+kombu==5.3.1
 lazy-object-proxy==1.9.0
 mccabe==0.7.0
 platformdirs==2.6.2
+prompt-toolkit==3.0.39
 psycopg2-binary==2.9.5
 pylint==2.15.10
 PyMuPDF==1.21.1
+python-dateutil==2.8.2
 python-dotenv==0.21.1
+redis==4.6.0
 requests==2.28.2
 six==1.16.0
 sqlparse==0.4.3
@@ -31,5 +43,7 @@ tomlkit==0.11.6
 typing_extensions==4.4.0
 tzdata==2022.7
 urllib3==1.26.14
+vine==5.0.0
+wcwidth==0.2.6
 whitenoise==6.3.0
 wrapt==1.14.1
diff --git a/static_in_dev/conversion_successful.js b/static_in_dev/conversion_successful.js
index 7ec46d9..256bc79 100644
--- a/static_in_dev/conversion_successful.js
+++ b/static_in_dev/conversion_successful.js
@@ -1,94 +1,93 @@
-// Media player
-
-
-const speak_div = document.querySelector(".speak div");
-const backButton = document.getElementById("back-button");
-const playerArea = document.getElementById("mediaPlayer");
-const playButton = document.getElementById("playState");
-const stopButton = document.getElementById("stopItem");
-const durationLabel = document.getElementById("currentDuration");
-const audioTitleLabel = document.getElementById("audioTitleLabel");
-const audioPlayer = document.getElementById("audioPlayer");
-audioPlayer.volume = 0.05;
-const volumeSlider = document.getElementById("volumeSlider");
-let currentIndex = 0;
-let dataAvailable = false;
-let currentLength;
-let timer;
-let downloadBtn = document.getElementById("downloadBtn");
-
-timer = setInterval(updateDurationLabel, 100);
-
-volumeSlider.addEventListener("input", () => {
-    audioPlayer.volume = parseFloat(volumeSlider.value);
-}, false);
-
-
-const playMusic = () => {
-    playerArea.classList.toggle("play");
-
-    if (audioPlayer.paused) {
-        setTimeout(()=> {audioPlayer.play()}, 300)
-        timer = setInterval(updateDurationLabel, 100);
-    } else {
-        audioPlayer.pause();
-        clearInterval(timer);
-    }
-};
-
-
-playButton.addEventListener("click", playMusic, false);
-
-stopButton.addEventListener("click", stopAudio, false);
-
-backButton.addEventListener("click", stopAudio, false);
-
-
-audioPlayer.addEventListener("loadeddata", () => {
-    dataAvailable = true;
-    currentLength = audioPlayer.duration;
-});
-
-
-// Converts time in ms to zero-padded string in seconds
-function parseTime(time) {
-    const minutes = Math.floor(time / 60);
-    const seconds = Math.floor(time - minutes * 60);
-    const secondsZero = seconds < 10 ? "0" : "";
-    const minutesZero = minutes < 10 ? "0" : "";
-    return minutesZero + minutes.toString() + ":" + secondsZero + seconds.toString();
-}
-
-//  Stops the audio from playing
-function stopAudio() {
-    playerArea.classList.remove("play");
-    audioPlayer.pause();
-    audioPlayer.currentTime = 0;
-    updateDurationLabel();
-}
-
-// Pauses audio
-function pauseAudio() {
-    console.log("Paused")
-    playerArea.classList.toggle("play");
-    audioPlayer.pause();
-    clearInterval(timer);
-}
-
-// Updates the duration label
-function updateDurationLabel() {
-    if (dataAvailable) {
-    durationLabel.innerText = parseTime(audioPlayer.currentTime) + " / " + parseTime(currentLength);
-    } else {
-    durationLabel.innerText = parseTime(audioPlayer.currentTime);
-    }
-}
-
-// stop on completion
-audioPlayer.addEventListener("ended", () => {
-    stopAudio();
-});
-
-
-speak_div.addEventListener("click", playMusic, false);
+// Media player
+
+const speak_div = document.querySelector(".speak div");
+const backButton = document.getElementById("back-button");
+const playerArea = document.getElementById("mediaPlayer");
+const playButton = document.getElementById("playState");
+const stopButton = document.getElementById("stopItem");
+const durationLabel = document.getElementById("currentDuration");
+const audioTitleLabel = document.getElementById("audioTitleLabel");
+const audioPlayer = document.getElementById("audioPlayer");
+audioPlayer.volume = 0.05;
+const volumeSlider = document.getElementById("volumeSlider");
+let currentIndex = 0;
+let dataAvailable = false;
+let currentLength;
+let timer;
+let downloadBtn = document.getElementById("downloadBtn");
+
+timer = setInterval(updateDurationLabel, 100);
+
+volumeSlider.addEventListener("input", () => {
+    audioPlayer.volume = parseFloat(volumeSlider.value);
+}, false);
+
+
+const playMusic = () => {
+    playerArea.classList.toggle("play");
+
+    if (audioPlayer.paused) {
+        setTimeout(()=> {audioPlayer.play()}, 300)
+        timer = setInterval(updateDurationLabel, 100);
+    } else {
+        audioPlayer.pause();
+        clearInterval(timer);
+    }
+};
+
+
+playButton.addEventListener("click", playMusic, false);
+
+stopButton.addEventListener("click", stopAudio, false);
+
+backButton.addEventListener("click", stopAudio, false);
+
+
+audioPlayer.addEventListener("loadeddata", () => {
+    dataAvailable = true;
+    currentLength = audioPlayer.duration;
+});
+
+
+// Converts time in ms to zero-padded string in seconds
+function parseTime(time) {
+    const minutes = Math.floor(time / 60);
+    const seconds = Math.floor(time - minutes * 60);
+    const secondsZero = seconds < 10 ? "0" : "";
+    const minutesZero = minutes < 10 ? "0" : "";
+    return minutesZero + minutes.toString() + ":" + secondsZero + seconds.toString();
+}
+
+//  Stops the audio from playing
+function stopAudio() {
+    playerArea.classList.remove("play");
+    audioPlayer.pause();
+    audioPlayer.currentTime = 0;
+    updateDurationLabel();
+}
+
+// Pauses audio
+function pauseAudio() {
+    console.log("Paused")
+    playerArea.classList.toggle("play");
+    audioPlayer.pause();
+    clearInterval(timer);
+}
+
+// Updates the duration label
+function updateDurationLabel() {
+    if (dataAvailable) {
+    durationLabel.innerText = parseTime(audioPlayer.currentTime) + " / " + parseTime(currentLength);
+    } else {
+    durationLabel.innerText = parseTime(audioPlayer.currentTime);
+    }
+}
+
+// stop on completion
+audioPlayer.addEventListener("ended", () => {
+    stopAudio();
+});
+
+
+speak_div.addEventListener("click", playMusic, false);
 // Media player
\ No newline at end of file
diff --git a/static_in_dev/index.css b/static_in_dev/index.css
index 95c2d26..db919fa 100644
--- a/static_in_dev/index.css
+++ b/static_in_dev/index.css
@@ -1,1555 +1,1642 @@
-@import url("https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
-
-*,
-*::after,
-*::before {
-  margin: 0;
-  padding: 0;
-  box-sizing: border-box;
-  font-family: "Raleway";
-  font-style: normal;
-  user-select: none;
-}
-
-header {
-  width: 100%;
-  background-color: white;
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  padding-left: 60px;
-  padding-right: 60px;
-  padding-top: 20px;
-  margin-bottom: 10px;
-  justify-content: space-between;
-  align-items: center;
-  flex-direction: row;
-}
-
-header > * {
-  margin-top: 0;
-}
-
-.span1 > * {
-  margin-right: 7px;
-  line-height: 33px;
-}
-
-.span1 {
-  font-size: 28px;
-  font-weight: 600;
-  display: flex;
-  align-items: center;
-}
-
-.span2 {
-  font-size: 18px;
-  font-weight: 200;
-}
-
-header img {
-  width: 50px;
-  height: 50px;
-}
-
-body > div:nth-child(2) {
-  display: flex;
-  align-items: center;
-  padding-left: 60px;
-  flex-direction: row;
-}
-
-body > div:nth-child(2) > * {
-  margin-right: 30px;
-}
-
-.control {
-  display: flex;
-  position: relative;
-  width: 300px;
-}
-.control img {
-  transition: 1s;
-}
-
-.control > * {
-  margin-right: 10px;
-}
-
-.control > span {
-  font-weight: 400;
-  font-size: 18px;
-  line-height: 21px;
-  color: #333333;
-  padding-top: 12px;
-}
-
-.control > div {
-  width: 150px;
-  height: 50px;
-  background: #e6eeff;
-  transition: 1s;
-  border-radius: 4px;
-  border: 1px solid #1565ff;
-  overflow: hidden;
-  position: absolute;
-  right: 0;
-}
-
-.place1 {
-  margin-bottom: 0;
-}
-
-.first:hover {
-  background: #0045ca;
-  color: white;
-  border-radius: 4px;
-}
-
-.control > div > div {
-  width: 150px;
-  height: 50px;
-  background: #e6eeff;
-  transition: 0.5s;
-}
-
-.first {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 5px;
-  font-weight: 400;
-  font-size: 18px;
-  line-height: 21px;
-  color: #333333;
-}
-
-.placeTop {
-  z-index: 90;
-}
-
-.placeBottom {
-  z-index: 50;
-}
-
-.children {
-  display: flex;
-  justify-content: flex-start;
-  align-items: center;
-  padding: 10px;
-  font-weight: 400;
-  font-size: 18px;
-  line-height: 21px;
-  color: #333333;
-  margin-bottom: 5px;
-}
-
-.children:hover {
-  background: #0045ca;
-  color: white;
-  border-radius: 4px;
-}
-
-.detail {
-  width: 100%;
-  margin-top: 0px;
-  font-weight: 400;
-  font-size: 18px;
-  line-height: 21px;
-  color: #333333;
-}
-
-.last {
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  margin-top: 20px;
-}
-
-.container {
-  width: 100%;
-  height: 400px;
-  border: 1px solid grey;
-  border-radius: 10px;
-  padding: 45px 45px 20px 30px;
-  margin-bottom: 30px;
-  position: relative;
-}
-
-.header {
-  display: flex;
-  justify-content: flex-end;
-  position: absolute;
-  top: 30px;
-  right: 30px;
-}
-
-textarea {
-  width: 100%;
-  resize: none;
-  margin-top: 20px;
-  height: 320px;
-  border: none;
-  outline: none;
-  font-weight: 400;
-  font-size: 24px;
-  line-height: 28px;
-  color: #333333;
-}
-
-.button {
-  width: 100%;
-  margin-top: 10px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-
-.button > div {
-  margin-right: 18px;
-  width: 44px;
-  height: 44px;
-  transform: scale(0px);
-  position: relative;
-}
-
-.button > div:hover .show {
-  display: block;
-}
-
-.show {
-  white-space: nowrap;
-  position: absolute;
-  top: -70%;
-  background-color: rgba(0, 0, 0, 0.7);
-  color: white;
-  z-index: 90;
-  left: 0;
-  padding: 5px;
-  border-radius: 5px;
-  display: none;
-  transition: 0.5s;
-}
-
-.button img {
-  width: 100%;
-  height: 100%;
-  position: relative;
-  z-index: 10;
-  transition: 300ms;
-  object-fit: contain;
-}
-
-.copyright {
-  text-align: center;
-  margin-top: 20px;
-  font-weight: bold;
-}
-
-.speak,
-.successful-conversion {
-  width: 100%;
-  padding: 10px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-
-.alternative-text-wrapper {
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  align-items: center;
-  padding: 0px 72px 0px 42px;
-}
-
-.alternative-text-wrapper hr {
-  display: flex;
-  flex-grow: 1;
-}
-
-.alternative-text {
-  font-size: 18px;
-  margin-top: 30px;
-  margin-bottom: 30px;
-  color: #000;
-}
-
-.speak div {
-  padding: 12px 24px 12px 24px;
-  color: #e6eeff;
-  font-size: 19px;
-  font-weight: bold;
-  border-radius: 8px;
-  transition: 300ms;
-}
-
-.speak div a {
-  background-color: #1565ff;
-}
-
-@media only screen and (max-width: 769px) {
-  header {
-    flex-direction: column;
-    justify-content: flex-start;
-    padding-left: 30px;
-    align-items: flex-start;
-  }
-
-  header > * {
-    margin-top: 10px;
-  }
-}
-
-@media only screen and (max-width: 426px) {
-  header {
-    padding-left: 20px;
-    margin-bottom: 20px;
-  }
-  header > span:nth-child(2) {
-    font-size: 18px;
-    font-weight: 600;
-  }
-  .last {
-    margin-top: 24px;
-  }
-
-  .control > div > div {
-    height: 30px;
-  }
-
-  .speak div {
-    padding: 8px 16px 8px 16px;
-    font-size: 15px;
-  }
-
-  header > span:nth-child(3) {
-    font-size: 14px;
-    font-weight: 200;
-  }
-
-  header img {
-    width: 50px;
-    height: 50px;
-  }
-
-  body > div:nth-child(2) {
-    display: flex;
-    align-items: flex-start;
-    padding-left: 20px;
-    flex-direction: column;
-  }
-
-  .place1 {
-    margin-bottom: 30px;
-  }
-
-  .detail {
-    padding-left: 20px;
-    font-size: 14px;
-    line-height: 16px;
-  }
-
-  .control > span {
-    font-size: 14px;
-    line-height: 16px;
-  }
-
-  .control > div {
-    height: 30px;
-  }
-
-  .first {
-    font-size: 14px;
-    line-height: 16px;
-    padding: 8px;
-  }
-
-  .children {
-    font-size: 14px;
-    line-height: 16px;
-    padding: 8px;
-  }
-
-  textarea {
-    font-size: 14px;
-    line-height: 20px;
-    height: 170px;
-  }
-
-  .container {
-    padding: 20px 30px 20px 30px;
-    height: 270px;
-  }
-
-  .button > div {
-    margin-right: 8px;
-    height: 32px;
-    width: 32px;
-  }
-}
-
-@media only screen and (max-width: 320px) {
-  .control {
-    width: 290px;
-  }
-
-  header > span:nth-child(2) {
-    font-size: 15px;
-    font-weight: 600;
-  }
-
-  header > span:nth-child(3) {
-    font-size: 12px;
-    font-weight: 200;
-  }
-
-  .button > div {
-    margin-right: 5px;
-  }
-}
-
-/* Drag and drop files */
-@import url("https://fonts.googleapis.com/css2?family=Montserrat&display=swap");
-body {
-  margin: 0;
-  padding: 0;
-  box-sizing: border-box;
-  height: 100vh;
-  font-family: "Montserrat", sans-serif;
-}
-
-.main_wrapper {
-  display: flex;
-  flex-direction: column;
-  height: 100%;
-  align-items: center;
-}
-
-.entire-content-wrapper {
-  display: flex;
-  flex-direction: column;
-  flex-grow: 1;
-  padding: 0px 60px;
-  width: 100%;
-}
-
-._segment {
-  display: flex;
-  height: 100%;
-}
-
-._segment_form_1,
-._segment_form_2 {
-  width: 50%;
-  height: 100%;
-}
-
-._segment_form_2 {
-  display: flex;
-  flex-direction: column;
-  flex-grow: 1;
-  background-color: #fe8700;
-  padding: 0px 20px;
-}
-
-.accepted-files {
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  padding-top: 90px;
-  color: #fff;
-}
-
-.form-container {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-.upload-files-container {
-  max-width: 420px;
-  width: 100%;
-  padding: 30px 20px;
-  border-radius: 40px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  flex-direction: column;
-  border: 1px dashed #fff;
-  margin-bottom: 20px;
-}
-.drag-file-area {
-  border-radius: 40px;
-  margin: 10px 0 15px;
-  padding: 30px 50px;
-  width: 350px;
-  text-align: center;
-}
-.drag-file-area .upload-icon {
-  font-size: 50px;
-  color: #fff;
-}
-.drag-file-area h3 {
-  font-size: 26px;
-  margin: 15px 0;
-  color: #fff;
-}
-.drag-file-area label {
-  font-size: 19px;
-}
-.drag-file-area label .browse-files-text {
-  color: #fff;
-  font-weight: bolder;
-  cursor: pointer;
-}
-.browse-files span {
-  position: relative;
-  top: -25px;
-  color: #fff;
-}
-.default-file-input {
-  opacity: 0;
-}
-.cannot-upload-message,
-.cannot-leave-blank-message {
-  background-color: #ffc6c4;
-  font-size: 17px;
-  display: flex;
-  align-items: center;
-  margin: 5px 0;
-  padding: 5px 10px 5px 30px;
-  border-radius: 5px;
-  color: #bb0000;
-  display: none;
-}
-
-.cannot-upload-message{
-  margin-bottom: 30px;
-}
-
-.cannot-leave-blank-message{
-  padding: 10px;
-  justify-content: space-between;
-  margin-top: 30px;
-}
-.cannot-leave-blank-message p{
-  color: #000;
-}
-
-.cannot-leave-blank-message span:last-child{
-  margin: 0;
-  padding: 0;
-}
-
-.cannot-leave-blank-message-main-wrap{
-  display: flex;
-  align-items: center;
-}
-
-
-@media only screen and (max-width: 769px) {
-  .entire-content-wrapper{
-    padding: 0px 0px;
-  }
-  ._segment_form_1{
-    padding: 0px 20px;
-  }
-  .detail{
-    padding-left: 30px !important;
-  }
-}
-
-@media (max-width: 950px) {
-  ._segment{
-    flex-direction: column;
-  }
-  ._segment_form_1, ._segment_form_2{
-    width: 100%;
-  }
-  .alternative-text-wrapper{
-    flex-direction: row;
-    padding: 0px 30px;
-  }
-  .alternative-text{
-    padding: 0px 20px;
-  }
-  ._segment_form_2{
-    padding-bottom: 100px;
-  }
-  .accepted-files{
-    margin-bottom: 40px;
-  }
-  .detail{
-    padding-left: 0px;
-  }
-  .return-div {
-    padding: 0px 30px !important;
-  }
-}
-@keyframes fadeIn {
-  0% {
-    opacity: 0;
-  }
-  100% {
-    opacity: 1;
-  }
-}
-.cannot-upload-message span,
-.cannot-leave-blank-message span,
-.upload-button-icon {
-  padding-right: 10px;
-}
-.cannot-upload-message span:last-child,
-.cannot-leave-blank-message span:last-child {
-  padding-left: 20px;
-  cursor: pointer;
-}
-
-.cannot-leave-blank-message {
-  width: 100%;
-  margin-top: 30px;
-}
-
-.cancel-alert-button-text {
-  margin-left: 75%;
-  padding-left: 30%;
-}
-
-.file-block {
-  color: #f7fff7;
-  background-color: #4b1d73;
-  transition: all 1s;
-  width: 100%;
-  position: relative;
-  display: none;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  margin: 10px 0 15px;
-  padding: 10px 20px;
-  border-radius: 25px;
-  cursor: pointer;
-}
-.file-info {
-  display: flex;
-  align-items: center;
-  font-size: 15px;
-}
-.file-icon {
-  margin-right: 10px;
-}
-.file-name,
-.file-size {
-  padding: 0 3px;
-}
-.remove-file-icon {
-  cursor: pointer;
-}
-
-.progress-bar {
-  display: flex;
-  position: absolute;
-  bottom: 0;
-  left: 4.5%;
-  width: 0;
-  height: 5px;
-  border-radius: 25px;
-  background-color: #4bb543;
-}
-
-.upload-button,
-.upload-a,
-.convert-entered-text-btn {
-  font-family: "Montserrat";
-  background-color: #fff !important;
-  color: #fe8700 !important;
-  display: flex !important;
-  align-items: center !important;
-  font-size: 18px !important;
-  border: none !important;
-  border-radius: 20px !important;
-  margin: 10px !important;
-  padding: 10.5px 50px !important;
-  cursor: pointer !important;
-}
-
-.convert-entered-text-btn {
-  color: #fff !important;
-  background-color: #fe8700 !important;
-}
-
-.upload-a {
-  text-decoration: none;
-}
-
-/* Drag and drop files */
-
-/* Modal */
-#modal {
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 99999999;
-  position: fixed;
-  background: rgba(153, 127, 243, 0.9);
-  transition: all 0.5s;
-  display: grid;
-  place-content: center;
-  visibility: hidden;
-  opacity: 0;
-  pointer-events: none;
-}
-#modal:target {
-  visibility: visible;
-  opacity: 1;
-  pointer-events: auto;
-}
-
-.modal-content {
-  margin: 0.5em;
-  padding: 1.2em;
-  background: #ffffff;
-  border-radius: 10px;
-  /* width: 60vw; */
-  max-width: 600px;
-}
-
-.modal-content .download {
-  display: inline-block;
-  text-decoration: none;
-  background-color: #a079e9;
-  padding: 0.8em 1.2em;
-  border-radius: 5px;
-  color: #fff;
-  position: relative;
-  font-size: 0.9rem;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-.modal-content .download:hover,
-.modal-content .close:hover {
-  background-color: #7c68ea;
-}
-.modal-content .download:active,
-.modal-content .close:active {
-  top: 1px;
-}
-
-.modal-content .close:hover,
-.modal-content .close:active {
-  color: #fff;
-}
-
-.modal-content #back-arrow {
-  padding-right: 10px;
-  padding-top: 9px;
-  fill: #a079e9;
-  height: 20px;
-}
-
-.modal-content .close:hover #back-arrow,
-.modal-content .close:active #back-arrow {
-  fill: #fff;
-}
-
-.modal-content #back-button {
-  margin-bottom: 10px;
-}
-
-.modal-content .close {
-  display: inline-block;
-  text-decoration: none;
-  background-color: #fff;
-  padding: 0.8em 1.2em;
-  border-radius: 5px;
-  color: #a079e9;
-  position: relative;
-  font-size: 0.9rem;
-}
-
-* {
-  box-sizing: border-box;
-}
-
-a.open-modal {
-  text-decoration: none;
-  background-color: #fff;
-  padding: 0.8em 1.2em;
-  border-radius: 5px;
-  color: #444444;
-  position: relative;
-}
-
-a.open-modal:active {
-  top: 1px;
-}
-
-.wrapper {
-  background-color: rgba(255, 255, 255, 0.7);
-  padding: 1em;
-  border-radius: 10px;
-}
-
-h1 {
-  font-size: clamp(1.5rem, 7vw, 2.5rem);
-}
-
-p,
-label {
-  font-size: clamp(0.9rem, 3vw, 1.1rem);
-  color: #fff;
-}
-
-footer {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  text-align: center;
-  background-color: rgba(255, 255, 255, 0.5);
-  padding: 10px;
-  z-index: 9999999;
-}
-footer p {
-  font-size: 0.8rem;
-  margin: 0;
-}
-/* Modal */
-
-/* Media player */
-
-.mediaplayer {
-  font-size: 12px;
-  font-family: Myriad Set Pro, Helvetica Neue, Helvetica, Arial, sans-serif;
-  background: linear-gradient(
-    to left,
-    #46230f 0%,
-    #46230f 22%,
-    #4b1e14 25%,
-    #4b1e14 47%,
-    #4e2319 50%,
-    #4e2319 72%,
-    #552d1e 75%,
-    #552d1e 100%
-  );
-  background-size: 50%;
-  background-repeat: repeat;
-  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
-  width: auto;
-  max-width: 600px;
-  height: auto;
-  display: flex;
-  flex-direction: row;
-  padding: 20px;
-  box-sizing: border-box;
-  border-radius: 100px;
-  margin-bottom: 25px;
-}
-
-@media (max-width: 450px) {
-  .mediaplayer {
-    flex-direction: column;
-    border-radius: 50px;
-  }
-}
-audio {
-  width: 0;
-  height: 0;
-  position: absolute;
-  left: -99999px;
-}
-
-.discarea {
-  margin: 10px;
-}
-
-@media (max-width: 450px) {
-  .discarea {
-    margin: 10px auto;
-  }
-
-  .disc {
-    margin-left: 40px;
-  }
-}
-@-webkit-keyframes spinDisc {
-  from {
-    transform: rotate(0deg);
-  }
-  to {
-    transform: rotate(360deg);
-  }
-}
-@keyframes spinDisc {
-  from {
-    transform: rotate(0deg);
-  }
-  to {
-    transform: rotate(360deg);
-  }
-}
-.disc {
-  position: relative;
-  display: block;
-  float: left;
-  width: 110px;
-  height: 110px;
-  background-color: #e0bf57;
-  border-radius: 50%;
-}
-
-.mediaplayer.play .disc {
-  -webkit-animation: spinDisc 2s linear 0.3s infinite forwards;
-  animation: spinDisc 2s linear 0.3s infinite forwards;
-}
-
-.disc::before,
-.disc::after {
-  content: " ";
-  position: absolute;
-  border-radius: 50%;
-}
-
-.disc::before {
-  background-color: #c43d40;
-  top: 32.5%;
-  left: 32.5%;
-  width: 35%;
-  height: 35%;
-  z-index: 2;
-}
-
-.disc::after {
-  position: absolute;
-  top: 5%;
-  left: 5%;
-  width: 90%;
-  height: 90%;
-  background-color: #222;
-  background: linear-gradient(#222, #222, #444, #222, #222);
-  border-radius: 50%;
-  z-index: 1;
-}
-
-.stylus {
-  position: relative;
-  display: block;
-  float: left;
-  width: 30px;
-  height: 100px;
-  margin-left: 5px;
-  transform-origin: 15px 15px;
-  transition: transform 0.3s ease-in-out;
-}
-
-.mediaplayer.play .stylus {
-  transform: rotate(34deg);
-}
-
-.pivot {
-  position: absolute;
-  width: 30px;
-  height: 30px;
-  background-color: #69727b;
-  border-radius: 50%;
-}
-
-.arm {
-  position: absolute;
-  width: 5px;
-  height: 70px;
-  background-color: #8b949d;
-  top: 10px;
-  left: 13px;
-  border-top-right-radius: 2px;
-  border-top-left-radius: 2px;
-}
-
-.arm::before {
-  content: " ";
-  position: absolute;
-  border-radius: 50%;
-  background-color: #acb6bf;
-  top: 0px;
-  left: -2.5px;
-  width: 10px;
-  height: 10px;
-}
-
-.head {
-  position: absolute;
-  width: 8px;
-  height: 15px;
-  background-color: #69727b;
-  top: 76px;
-  left: 13px;
-  border-radius: 3px;
-  transform-origin: 50% 0;
-  transform: rotate(30deg);
-}
-
-.controls {
-  margin: 10px;
-  display: flex;
-  flex-direction: column;
-}
-
-.title {
-  width: 85%;
-  box-sizing: border-box;
-  padding: 3px 0 3px 10px;
-  font-size: 1rem;
-  color: #7f3a2b;
-  background-color: beige;
-  border-radius: 25px;
-  border: rgba(245, 245, 70, 0.4) 1px solid;
-  overflow: hidden;
-}
-
-@media (max-width: 450px) {
-  .title {
-    width: 100%;
-    text-align: center;
-  }
-}
-.buttons {
-  margin: 10px 0;
-  display: flex;
-  flex-direction: row;
-}
-
-.buttons button {
-  width: 50px;
-  height: 50px;
-  text-align: center;
-  border-radius: 50%;
-  border: none;
-  margin-right: 5px;
-  background-color: #69727b;
-  color: white;
-  outline: 0;
-  font-size: 1.2rem;
-  border-top: #bbc 2px solid;
-  border-left: #ccd 2px solid;
-  border-right: #aab 2px solid;
-  border-bottom: #bbc 2px solid;
-}
-
-.buttons button:hover {
-  cursor: pointer;
-}
-
-.buttons button i::before {
-  text-shadow: 0 0 20px rgba(255, 255, 255, 0.4);
-  transition: text-shadow 0.3s ease;
-}
-
-.buttons button:hover i::before {
-  text-shadow: 0 0 20px white;
-}
-
-.mediaplayer.play .playstate {
-  background-color: #c63c3c;
-}
-
-.playstate .fa-pause,
-.mediaplayer.play .playstate .fa-play {
-  display: none;
-}
-
-.mediaplayer.play .fa-pause {
-  display: block;
-}
-
-.stop .fa-stop,
-.playstate .fa-play,
-.playstate .fa-pause {
-  fill: #fff;
-  height: 20px;
-}
-
-.playstate .fa-pause {
-  padding-left: 17px;
-}
-
-@media (max-width: 450px) {
-  .buttons button {
-    margin: 0 5px;
-  }
-}
-.subControls {
-  display: flex;
-  flex-direction: row;
-}
-
-.subControls .fa-volume-high {
-  padding-top: 7px;
-  padding-right: 10px;
-  padding-left: 5px;
-  height: 23px;
-  fill: #000;
-}
-
-@media (max-width: 450px) {
-  .subControls {
-    flex-direction: row nowrap;
-    justify-content: space-around;
-    margin-bottom: 20px;
-  }
-}
-.duration {
-  width: 110px;
-  text-align: center;
-  box-sizing: border-box;
-  padding: 3px 10px;
-  /* font-size: 1rem; */
-  color: #7f3a2b;
-  background-color: beige;
-  border-radius: 25px;
-  border: rgba(245, 245, 70, 0.4) 1px solid;
-  margin-right: 10px;
-}
-
-.volumeSlider {
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  appearance: none;
-  width: 80px;
-  background: transparent;
-}
-
-.volumeSlider:focus {
-  outline: none;
-}
-
-.volumeSlider::-webkit-slider-thumb {
-  -webkit-appearance: none;
-  height: 20px;
-  width: 20px;
-  border-radius: 50%;
-  background-color: #69727b;
-  cursor: pointer;
-  margin-top: -6px;
-  border-top: #bbc 2px solid;
-  border-left: #ccd 2px solid;
-  border-right: #aab 2px solid;
-  border-bottom: #bbc 2px solid;
-}
-
-.volumeSlider::-webkit-slider-thumb:active {
-  background-color: #9aa;
-}
-
-.volumeSlider::-moz-range-thumb {
-  height: 20px;
-  width: 20px;
-  border-radius: 50%;
-  background-color: #69727b;
-  cursor: pointer;
-  margin-top: -6px;
-  border-top: #bbc 2px solid;
-  border-left: #ccd 2px solid;
-  border-right: #aab 2px solid;
-  border-bottom: #bbc 2px solid;
-}
-
-.volumeSlider::-webkit-slider-runnable-track {
-  width: 100%;
-  height: 8px;
-  cursor: pointer;
-  background-color: #8b949d;
-  border-radius: 4px;
-  margin-top: 2px;
-}
-
-.volumeSlider::-webkit-slider-runnable-track:active {
-  background-color: #69727b;
-}
-
-.volumeSlider::-moz-range-track {
-  width: 100%;
-  height: 8px;
-  cursor: pointer;
-  background-color: #8b949d;
-  border-radius: 4px;
-  margin-top: 2px;
-}
-/* Media player */
-
-/* Successful Conversion Page  */
-
-.return-div {
-  padding: 0px 60px;
-  margin-top: 20px;
-  width: 100%;
-}
-
-.return-div a {
-  text-decoration: none;
-  background-color: #1565ff;
-  padding: 0.8em 1.2em;
-  border-radius: 5px;
-  color: #fff;
-  border: none;
-}
-
-#return-button{
-  display: inline-flex;
-}
-
-#return-arrow {
-  fill: #fff;
-  height: 20px;
-  margin-right: 15px;
-}
-
-.successful-conversion {
-  width: 100%;
-  padding: 10px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  margin-bottom: 20px;
-  color: #88b04b;
-}
-
-.successful-conversion p {
-  font-weight: 600;
-}
-
-.main-container {
-  width: 100%;
-  height: 30vh;
-  display: flex;
-  flex-flow: column;
-  justify-content: center;
-  align-items: center;
-}
-
-.check-container {
-  width: 6.25rem;
-  height: 7.5rem;
-  display: flex;
-  flex-flow: column;
-  align-items: center;
-  justify-content: space-between;
-}
-.check-container .check-background {
-  width: 100%;
-  height: calc(100% - 1.25rem);
-  background: linear-gradient(to bottom right, #5de593, #41d67c);
-  box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset,
-    0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;
-  transform: scale(0.84);
-  border-radius: 50%;
-  animation: animateContainer 0.75s ease-out forwards 0.75s;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  opacity: 0;
-}
-.check-container .check-background svg {
-  width: 65%;
-  transform: translateY(0.25rem);
-  stroke-dasharray: 80;
-  stroke-dashoffset: 80;
-  animation: animateCheck 0.35s forwards 1.25s ease-out;
-}
-.check-container .check-shadow {
-  bottom: calc(-15% - 5px);
-  left: 0;
-  border-radius: 50%;
-  background: radial-gradient(closest-side, #49da83, transparent);
-  animation: animateShadow 0.75s ease-out forwards 0.75s;
-}
-
-@keyframes animateContainer {
-  0% {
-    opacity: 0;
-    transform: scale(0);
-    box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset,
-      0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;
-  }
-  25% {
-    opacity: 1;
-    transform: scale(0.9);
-    box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset,
-      0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;
-  }
-  43.75% {
-    transform: scale(1.15);
-    box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset,
-      0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;
-  }
-  62.5% {
-    transform: scale(1);
-    box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset,
-      0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;
-  }
-  81.25% {
-    box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset,
-      0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;
-  }
-  100% {
-    opacity: 1;
-    box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset,
-      0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;
-  }
-}
-@keyframes animateCheck {
-  from {
-    stroke-dashoffset: 80;
-  }
-  to {
-    stroke-dashoffset: 0;
-  }
-}
-@keyframes animateShadow {
-  0% {
-    opacity: 0;
-    width: 100%;
-    height: 15%;
-  }
-  25% {
-    opacity: 0.25;
-  }
-  43.75% {
-    width: 40%;
-    height: 7%;
-    opacity: 0.35;
-  }
-  100% {
-    width: 85%;
-    height: 15%;
-    opacity: 0.25;
-  }
-}
-
-/* Preloader */
-
-.div-wrapper-for-loaded-content {
-  /* font-size: calc(16px + (24 - 16) * (100vw - 320px) / (1280 - 320)) !important; */
-  /* background-color: hsl(223,90%,95%); */
-  color: hsl(223, 90%, 5%);
-  font: 1em/1.5 sans-serif;
-  height: 100%;
-  place-items: center;
-  transition: background-color 0.3s;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: column;
-}
-
-#loadedContent{
-  display: flex;
-  align-items: center;
-  flex-direction: column;
-}
-
-
-.loader main {
-  padding: 1.5em 0;
-}
-
-.preloader_wrapper{
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-.ip {
-  width: 16em;
-  height: 8em;
-}
-.ip__track {
-  stroke: hsl(223, 90%, 90%);
-  transition: stroke 0.3s;
-}
-.ip__worm1,
-.ip__worm2 {
-  animation: worm1 2s linear infinite;
-}
-.ip__worm2 {
-  animation-name: worm2;
-}
-
-/* Dark theme */
-@media (prefers-color-scheme: dark) {
-  /* :root {
-      --bg: hsl(223,90%,5%);
-      --fg: hsl(223,90%,95%);
-    } */
-  .ip__track {
-    stroke: hsl(223, 90%, 15%);
-  }
-}
-
-/* Animation */
-@keyframes worm1 {
-  from {
-    stroke-dashoffset: 0;
-  }
-  50% {
-    animation-timing-function: steps(1);
-    stroke-dashoffset: -358;
-  }
-  50.01% {
-    animation-timing-function: linear;
-    stroke-dashoffset: 358;
-  }
-  to {
-    stroke-dashoffset: 0;
-  }
-}
-@keyframes worm2 {
-  from {
-    stroke-dashoffset: 358;
-  }
-  50% {
-    stroke-dashoffset: 0;
-  }
-  to {
-    stroke-dashoffset: -358;
-  }
-}
-
-.loading-text {
-  width: 100%;
-  padding: 10px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  margin-top: 60px;
-}
-
-.extra-loading-text {
-  width: 100%;
-  padding: 10px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  margin-top: 70px;
-}
-
-/* Successful Conversion Page  */
-
-/* Error animation plus error message */
-
-.error-container {
-  background-color: white;
-  height: 180px;
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-
-.circle,
-.circle-border {
-  width: 60px;
-  height: 60px;
-  border-radius: 50%;
-}
-
-.circle {
-  z-index: 1;
-  position: relative;
-  background: white;
-  transform: scale(1);
-  animation: success-anim 700ms ease;
-}
-
-.circle-border {
-  z-index: 0;
-  position: absolute;
-  transform: scale(1.1);
-  animation: circle-anim 400ms ease;
-  background: #f86;
-}
-
-@keyframes success-anim {
-  0% {
-    transform: scale(0);
-  }
-  30% {
-    transform: scale(0);
-  }
-  100% {
-    transform: scale(1);
-  }
-}
-@keyframes circle-anim {
-  from {
-    transform: scale(0);
-  }
-  to {
-    transform: scale(1.1);
-  }
-}
-.error::before,
-.error::after {
-  content: "";
-  display: block;
-  height: 4px;
-  background: #f86;
-  position: absolute;
-}
-
-.error::before {
-  width: 40px;
-  top: 48%;
-  left: 16%;
-  transform: rotateZ(50deg);
-}
-
-.error::after {
-  width: 40px;
-  top: 48%;
-  left: 16%;
-  transform: rotateZ(-50deg);
-}
-
-.single-error {
-  color: #f86;
-  text-align: center;
-  padding-bottom: 5px;
-}
-
-/* Error animation plus error message */
-
-/* Header contact info */
-.mail-icon {
-  margin-right: 10px;
-  position: relative;
-  top: 5px;
-}
-
-.github-icon {
-  margin-right: 10px;
-  height: 17px;
-  position: relative;
-  top: 2px;
-}
-
-.mail-text, .github-text {
-  font-size: 18px;
-  text-decoration: none;
-}
-
-.mail-text:hover, .github-text:hover {
-  color:rgba(153, 127, 243, 0.9);
-}
-
-.mail-text:active, .github-text:active {
-  color:hsl(223, 90%, 15%);
-}
-
-.mail-div {
-  margin-bottom: 5px;
-}
-/* Header contact info */
\ No newline at end of file
+@import url("https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
+
+*,
+*::after,
+*::before {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  font-family: "Raleway";
+  font-style: normal;
+  user-select: none;
+}
+
+header {
+  width: 100%;
+  background-color: white;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  padding-left: 60px;
+  padding-right: 60px;
+  padding-top: 20px;
+  margin-bottom: 10px;
+  justify-content: space-between;
+  align-items: center;
+  flex-direction: row;
+}
+
+header > * {
+  margin-top: 0;
+}
+
+.span1 > * {
+  margin-right: 7px;
+  line-height: 33px;
+}
+
+.span1 {
+  font-size: 28px;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+}
+
+.span2 {
+  font-size: 18px;
+  font-weight: 200;
+}
+
+header img {
+  width: 50px;
+  height: 50px;
+}
+
+body > div:nth-child(2) {
+  display: flex;
+  align-items: center;
+  padding-left: 60px;
+  flex-direction: row;
+}
+
+body > div:nth-child(2) > * {
+  margin-right: 30px;
+}
+
+.control {
+  display: flex;
+  position: relative;
+  width: 300px;
+}
+.control img {
+  transition: 1s;
+}
+
+.control > * {
+  margin-right: 10px;
+}
+
+.control > span {
+  font-weight: 400;
+  font-size: 18px;
+  line-height: 21px;
+  color: #333333;
+  padding-top: 12px;
+}
+
+.control > div {
+  width: 150px;
+  height: 50px;
+  background: #e6eeff;
+  transition: 1s;
+  border-radius: 4px;
+  border: 1px solid #1565ff;
+  overflow: hidden;
+  position: absolute;
+  right: 0;
+}
+
+.place1 {
+  margin-bottom: 0;
+}
+
+.first:hover {
+  background: #0045ca;
+  color: white;
+  border-radius: 4px;
+}
+
+.control > div > div {
+  width: 150px;
+  height: 50px;
+  background: #e6eeff;
+  transition: 0.5s;
+}
+
+.first {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 5px;
+  font-weight: 400;
+  font-size: 18px;
+  line-height: 21px;
+  color: #333333;
+}
+
+.placeTop {
+  z-index: 90;
+}
+
+.placeBottom {
+  z-index: 50;
+}
+
+.children {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  padding: 10px;
+  font-weight: 400;
+  font-size: 18px;
+  line-height: 21px;
+  color: #333333;
+  margin-bottom: 5px;
+}
+
+.children:hover {
+  background: #0045ca;
+  color: white;
+  border-radius: 4px;
+}
+
+.detail {
+  width: 100%;
+  margin: 20px 0px;
+  font-weight: 400;
+  font-size: 18px;
+  line-height: 21px;
+  color: #333333;
+}
+
+.last {
+  width: 100%;
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+
+.container {
+  width: 100%;
+  height: 400px;
+  border: 1px solid grey;
+  border-radius: 10px;
+  padding: 45px 45px 20px 30px;
+  margin-bottom: 30px;
+  position: relative;
+}
+
+.header {
+  display: flex;
+  justify-content: flex-end;
+  position: absolute;
+  top: 30px;
+  right: 30px;
+}
+
+textarea {
+  width: 100%;
+  resize: none;
+  margin-top: 20px;
+  height: 320px;
+  border: none;
+  outline: none;
+  font-weight: 400;
+  font-size: 24px;
+  line-height: 28px;
+  color: #333333;
+}
+
+.button {
+  width: 100%;
+  margin-top: 10px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.button > div {
+  margin-right: 18px;
+  width: 44px;
+  height: 44px;
+  transform: scale(0px);
+  position: relative;
+}
+
+.button > div:hover .show {
+  display: block;
+}
+
+.show {
+  white-space: nowrap;
+  position: absolute;
+  top: -70%;
+  background-color: rgba(0, 0, 0, 0.7);
+  color: white;
+  z-index: 90;
+  left: 0;
+  padding: 5px;
+  border-radius: 5px;
+  display: none;
+  transition: 0.5s;
+}
+
+.button img {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  z-index: 10;
+  transition: 300ms;
+  object-fit: contain;
+}
+
+.copyright {
+  text-align: center;
+  margin-top: 20px;
+  font-weight: bold;
+}
+
+.speak,
+.successful-conversion {
+  width: 100%;
+  padding: 10px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.alternative-text-wrapper {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  padding: 0px 72px 0px 42px;
+  background-color: #ffffff;
+}
+
+.alternative-text-wrapper hr {
+  display: flex;
+  flex-grow: 1;
+}
+
+.alternative-text {
+  font-size: 18px;
+  margin-top: 30px;
+  margin-bottom: 30px;
+  color: #000;
+}
+
+.speak div {
+  padding: 12px 24px 12px 24px;
+  color: #e6eeff;
+  font-size: 19px;
+  font-weight: bold;
+  border-radius: 8px;
+  transition: 300ms;
+}
+
+.speak div a {
+  background-color: #1565ff;
+}
+
+@media only screen and (max-width: 769px) {
+  header {
+    flex-direction: column;
+    justify-content: flex-start;
+    padding-left: 30px;
+    align-items: flex-start;
+  }
+
+  header > * {
+    margin-top: 10px;
+  }
+}
+
+@media only screen and (max-width: 426px) {
+  header {
+    padding-left: 20px;
+    margin-bottom: 20px;
+  }
+  header > span:nth-child(2) {
+    font-size: 18px;
+    font-weight: 600;
+  }
+  .last {
+    margin-top: 24px;
+  }
+
+  .control > div > div {
+    height: 30px;
+  }
+
+  .speak div {
+    padding: 8px 16px 8px 16px;
+    font-size: 15px;
+  }
+
+  header > span:nth-child(3) {
+    font-size: 14px;
+    font-weight: 200;
+  }
+
+  header img {
+    width: 50px;
+    height: 50px;
+  }
+
+  body > div:nth-child(2) {
+    display: flex;
+    align-items: flex-start;
+    padding-left: 20px;
+    flex-direction: column;
+  }
+
+  .place1 {
+    margin-bottom: 30px;
+  }
+
+  .detail {
+    padding-left: 20px;
+    font-size: 14px;
+    line-height: 16px;
+  }
+
+  .control > span {
+    font-size: 14px;
+    line-height: 16px;
+  }
+
+  .control > div {
+    height: 30px;
+  }
+
+  .first {
+    font-size: 14px;
+    line-height: 16px;
+    padding: 8px;
+  }
+
+  .children {
+    font-size: 14px;
+    line-height: 16px;
+    padding: 8px;
+  }
+
+  textarea {
+    font-size: 14px;
+    line-height: 20px;
+    height: 170px;
+  }
+
+  .container {
+    padding: 20px 30px 20px 30px;
+    height: 270px;
+  }
+
+  .button > div {
+    margin-right: 8px;
+    height: 32px;
+    width: 32px;
+  }
+}
+
+@media only screen and (max-width: 320px) {
+  .control {
+    width: 290px;
+  }
+
+  header > span:nth-child(2) {
+    font-size: 15px;
+    font-weight: 600;
+  }
+
+  header > span:nth-child(3) {
+    font-size: 12px;
+    font-weight: 200;
+  }
+
+  .button > div {
+    margin-right: 5px;
+  }
+}
+
+/* Drag and drop files */
+@import url("https://fonts.googleapis.com/css2?family=Montserrat&display=swap");
+body {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  height: 100vh;
+  font-family: "Montserrat", sans-serif;
+}
+
+.main_wrapper {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  align-items: center;
+}
+
+.entire-content-wrapper {
+  display: flex;
+  flex-direction: column;
+  flex-grow: 1;
+  padding: 0px 60px;
+  width: 100%;
+}
+
+.text {
+  background-color: #ffffff;
+}
+
+._segment {
+  display: flex;
+  height: 100%;
+}
+
+._segment_form_1,
+._segment_form_2 {
+  width: 50%;
+  height: 100%;
+}
+
+._segment_form_1 {
+  background-color: #ffffff;
+}
+
+._segment_form_2 {
+  display: flex;
+  flex-direction: column;
+  flex-grow: 1;
+  background-color: #fe8700;
+  padding: 0px 20px;
+}
+
+.accepted-files {
+  width: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding-top: 90px;
+  color: #fff;
+}
+
+.form-container {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.upload-files-container {
+  max-width: 420px;
+  width: 100%;
+  padding: 30px 20px;
+  border-radius: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  border: 1px dashed #fff;
+  margin-bottom: 20px;
+}
+.drag-file-area {
+  border-radius: 40px;
+  margin: 10px 0 15px;
+  padding: 30px 50px;
+  width: 350px;
+  text-align: center;
+}
+.drag-file-area .upload-icon {
+  font-size: 50px;
+  color: #fff;
+}
+.drag-file-area h3 {
+  font-size: 26px;
+  margin: 15px 0;
+  color: #fff;
+}
+.drag-file-area label {
+  font-size: 19px;
+}
+.drag-file-area label .browse-files-text {
+  color: #fff;
+  font-weight: bolder;
+  cursor: pointer;
+}
+.browse-files span {
+  position: relative;
+  top: -25px;
+  color: #fff;
+}
+.default-file-input {
+  opacity: 0;
+}
+.cannot-upload-message,
+.error-span {
+  background-color: #ffc6c4;
+  font-size: 17px;
+  align-items: center;
+  margin: 5px 0;
+  padding: 5px 10px 5px 30px;
+  border-radius: 5px;
+  color: #bb0000;
+  display: none;
+}
+
+.cannot-upload-message{
+  margin-bottom: 30px;
+}
+
+.error-span{
+  padding: 10px;
+  justify-content: space-between;
+  margin-top: 30px;
+}
+
+.small-error-span p {
+  font-size: 12px;
+  color: #bb0000 !important;
+}
+
+.small-error-span {
+  margin-top: 0px !important;
+  padding-left: 0px;
+  justify-content: flex-start;
+  border: none;
+  background: none;
+
+}
+
+.error-span p{
+  color: #000;
+}
+
+.error-span span:last-child{
+  margin: 0;
+  padding: 0;
+}
+
+.error-span-main-wrap{
+  display: flex;
+  align-items: center;
+}
+
+.error-border {
+  border: 1px solid red !important; /* Red border with 1 pixel width */
+}
+
+
+@media only screen and (max-width: 769px) {
+  .entire-content-wrapper{
+    padding: 0px 0px;
+  }
+  ._segment_form_1{
+    padding: 0px 20px;
+  }
+  .detail{
+    padding-left: 30px !important;
+  }
+}
+
+@media (max-width: 950px) {
+  ._segment{
+    flex-direction: column;
+  }
+  ._segment_form_1, ._segment_form_2{
+    width: 100%;
+  }
+  .alternative-text-wrapper{
+    flex-direction: row;
+    padding: 0px 30px;
+  }
+  .alternative-text{
+    padding: 0px 20px;
+  }
+  ._segment_form_2{
+    padding-bottom: 100px;
+  }
+  .accepted-files{
+    margin-bottom: 40px;
+  }
+  .detail{
+    padding-left: 0px;
+  }
+  .return-div {
+    padding: 0px 30px !important;
+  }
+}
+@keyframes fadeIn {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+.cannot-upload-message span,
+.error-span span,
+.upload-button-icon {
+  padding-right: 10px;
+}
+.cannot-upload-message span:last-child,
+.error-span span:last-child {
+  padding-left: 20px;
+  cursor: pointer;
+}
+
+.error-span {
+  width: 100%;
+  margin-top: 30px;
+}
+
+.cancel-alert-button-text {
+  margin-left: 75%;
+  padding-left: 30%;
+}
+
+.file-block {
+  color: #f7fff7;
+  background-color: #4b1d73;
+  transition: all 1s;
+  width: 100%;
+  position: relative;
+  display: none;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+  margin: 10px 0 15px;
+  padding: 10px 20px;
+  border-radius: 25px;
+  cursor: pointer;
+}
+.file-info {
+  display: flex;
+  align-items: center;
+  font-size: 15px;
+}
+.file-icon {
+  margin-right: 10px;
+}
+.file-name,
+.file-size {
+  padding: 0 3px;
+}
+.remove-file-icon {
+  cursor: pointer;
+}
+
+.progress-bar {
+  display: flex;
+  position: absolute;
+  bottom: 0;
+  left: 4.5%;
+  width: 0;
+  height: 5px;
+  border-radius: 25px;
+  background-color: #4bb543;
+}
+
+.upload-button,
+.upload-a,
+.convert-entered-text-btn {
+  font-family: "Montserrat";
+  background-color: #fff !important;
+  color: #fe8700 !important;
+  display: flex !important;
+  align-items: center !important;
+  font-size: 18px !important;
+  border: none !important;
+  border-radius: 20px !important;
+  margin: 10px !important;
+  padding: 10.5px 50px !important;
+  cursor: pointer !important;
+}
+
+.convert-entered-text-btn {
+  color: #fff !important;
+  background-color: #fe8700 !important;
+}
+
+.upload-a {
+  text-decoration: none;
+}
+
+/* Drag and drop files */
+
+/* Modal */
+#modal {
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 99999999;
+  position: fixed;
+  background: rgba(153, 127, 243, 0.9);
+  transition: all 0.5s;
+  display: grid;
+  place-content: center;
+  visibility: hidden;
+  opacity: 0;
+  pointer-events: none;
+}
+#modal:target {
+  visibility: visible;
+  opacity: 1;
+  pointer-events: auto;
+}
+
+.modal-content {
+  margin: 0.5em;
+  padding: 1.2em;
+  background: #ffffff;
+  border-radius: 10px;
+  /* width: 60vw; */
+  max-width: 600px;
+}
+
+.modal-content .download {
+  display: inline-block;
+  text-decoration: none;
+  background-color: #a079e9;
+  padding: 0.8em 1.2em;
+  border-radius: 5px;
+  color: #fff;
+  position: relative;
+  font-size: 0.9rem;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.modal-content .download:hover,
+.modal-content .close:hover {
+  background-color: #7c68ea;
+}
+.modal-content .download:active,
+.modal-content .close:active {
+  top: 1px;
+}
+
+.modal-content .close:hover,
+.modal-content .close:active {
+  color: #fff;
+}
+
+.modal-content #back-arrow {
+  padding-right: 10px;
+  padding-top: 9px;
+  fill: #a079e9;
+  height: 20px;
+}
+
+.modal-content .close:hover #back-arrow,
+.modal-content .close:active #back-arrow {
+  fill: #fff;
+}
+
+.modal-content #back-button {
+  margin-bottom: 10px;
+}
+
+.modal-content .close {
+  display: inline-block;
+  text-decoration: none;
+  background-color: #fff;
+  padding: 0.8em 1.2em;
+  border-radius: 5px;
+  color: #a079e9;
+  position: relative;
+  font-size: 0.9rem;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+a.open-modal {
+  text-decoration: none;
+  background-color: #fff;
+  padding: 0.8em 1.2em;
+  border-radius: 5px;
+  color: #444444;
+  position: relative;
+}
+
+a.open-modal:active {
+  top: 1px;
+}
+
+.wrapper {
+  background-color: rgba(255, 255, 255, 0.7);
+  padding: 1em;
+  border-radius: 10px;
+}
+
+h1 {
+  font-size: clamp(1.5rem, 7vw, 2.5rem);
+}
+
+p,
+label {
+  font-size: clamp(0.9rem, 3vw, 1.1rem);
+  color: #fff;
+}
+
+footer {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  text-align: center;
+  background-color: rgba(255, 255, 255, 0.5);
+  padding: 10px;
+  z-index: 9999999;
+}
+footer p {
+  font-size: 0.8rem;
+  margin: 0;
+}
+/* Modal */
+
+/* Media player */
+
+.mediaplayer {
+  font-size: 12px;
+  font-family: Myriad Set Pro, Helvetica Neue, Helvetica, Arial, sans-serif;
+  background: linear-gradient(
+    to left,
+    #46230f 0%,
+    #46230f 22%,
+    #4b1e14 25%,
+    #4b1e14 47%,
+    #4e2319 50%,
+    #4e2319 72%,
+    #552d1e 75%,
+    #552d1e 100%
+  );
+  background-size: 50%;
+  background-repeat: repeat;
+  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
+  width: auto;
+  max-width: 600px;
+  height: auto;
+  display: flex;
+  flex-direction: row;
+  padding: 20px;
+  box-sizing: border-box;
+  border-radius: 100px;
+  margin-bottom: 25px;
+}
+
+@media (max-width: 450px) {
+  .mediaplayer {
+    flex-direction: column;
+    border-radius: 50px;
+  }
+}
+audio {
+  width: 0;
+  height: 0;
+  position: absolute;
+  left: -99999px;
+}
+
+.discarea {
+  margin: 10px;
+}
+
+@media (max-width: 450px) {
+  .discarea {
+    margin: 10px auto;
+  }
+
+  .disc {
+    margin-left: 40px;
+  }
+}
+@-webkit-keyframes spinDisc {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+@keyframes spinDisc {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+.disc {
+  position: relative;
+  display: block;
+  float: left;
+  width: 110px;
+  height: 110px;
+  background-color: #e0bf57;
+  border-radius: 50%;
+}
+
+.mediaplayer.play .disc {
+  -webkit-animation: spinDisc 2s linear 0.3s infinite forwards;
+  animation: spinDisc 2s linear 0.3s infinite forwards;
+}
+
+.disc::before,
+.disc::after {
+  content: " ";
+  position: absolute;
+  border-radius: 50%;
+}
+
+.disc::before {
+  background-color: #c43d40;
+  top: 32.5%;
+  left: 32.5%;
+  width: 35%;
+  height: 35%;
+  z-index: 2;
+}
+
+.disc::after {
+  position: absolute;
+  top: 5%;
+  left: 5%;
+  width: 90%;
+  height: 90%;
+  background-color: #222;
+  background: linear-gradient(#222, #222, #444, #222, #222);
+  border-radius: 50%;
+  z-index: 1;
+}
+
+.stylus {
+  position: relative;
+  display: block;
+  float: left;
+  width: 30px;
+  height: 100px;
+  margin-left: 5px;
+  transform-origin: 15px 15px;
+  transition: transform 0.3s ease-in-out;
+}
+
+.mediaplayer.play .stylus {
+  transform: rotate(34deg);
+}
+
+.pivot {
+  position: absolute;
+  width: 30px;
+  height: 30px;
+  background-color: #69727b;
+  border-radius: 50%;
+}
+
+.arm {
+  position: absolute;
+  width: 5px;
+  height: 70px;
+  background-color: #8b949d;
+  top: 10px;
+  left: 13px;
+  border-top-right-radius: 2px;
+  border-top-left-radius: 2px;
+}
+
+.arm::before {
+  content: " ";
+  position: absolute;
+  border-radius: 50%;
+  background-color: #acb6bf;
+  top: 0px;
+  left: -2.5px;
+  width: 10px;
+  height: 10px;
+}
+
+.head {
+  position: absolute;
+  width: 8px;
+  height: 15px;
+  background-color: #69727b;
+  top: 76px;
+  left: 13px;
+  border-radius: 3px;
+  transform-origin: 50% 0;
+  transform: rotate(30deg);
+}
+
+.controls {
+  margin: 10px;
+  display: flex;
+  flex-direction: column;
+}
+
+.title {
+  width: 85%;
+  box-sizing: border-box;
+  padding: 3px 0 3px 10px;
+  font-size: 1rem;
+  color: #7f3a2b;
+  background-color: beige;
+  border-radius: 25px;
+  border: rgba(245, 245, 70, 0.4) 1px solid;
+  overflow: hidden;
+}
+
+@media (max-width: 450px) {
+  .title {
+    width: 100%;
+    text-align: center;
+  }
+}
+.buttons {
+  margin: 10px 0;
+  display: flex;
+  flex-direction: row;
+}
+
+.buttons button {
+  width: 50px;
+  height: 50px;
+  text-align: center;
+  border-radius: 50%;
+  border: none;
+  margin-right: 5px;
+  background-color: #69727b;
+  color: white;
+  outline: 0;
+  font-size: 1.2rem;
+  border-top: #bbc 2px solid;
+  border-left: #ccd 2px solid;
+  border-right: #aab 2px solid;
+  border-bottom: #bbc 2px solid;
+}
+
+.buttons button:hover {
+  cursor: pointer;
+}
+
+.buttons button i::before {
+  text-shadow: 0 0 20px rgba(255, 255, 255, 0.4);
+  transition: text-shadow 0.3s ease;
+}
+
+.buttons button:hover i::before {
+  text-shadow: 0 0 20px white;
+}
+
+.mediaplayer.play .playstate {
+  background-color: #c63c3c;
+}
+
+.playstate .fa-pause,
+.mediaplayer.play .playstate .fa-play {
+  display: none;
+}
+
+.mediaplayer.play .fa-pause {
+  display: block;
+}
+
+.stop .fa-stop,
+.playstate .fa-play,
+.playstate .fa-pause {
+  fill: #fff;
+  height: 20px;
+}
+
+.playstate .fa-pause {
+  padding-left: 17px;
+}
+
+@media (max-width: 450px) {
+  .buttons button {
+    margin: 0 5px;
+  }
+}
+.subControls {
+  display: flex;
+  flex-direction: row;
+}
+
+.subControls .fa-volume-high {
+  padding-top: 7px;
+  padding-right: 10px;
+  padding-left: 5px;
+  height: 23px;
+  fill: #000;
+}
+
+@media (max-width: 450px) {
+  .subControls {
+    flex-direction: row nowrap;
+    justify-content: space-around;
+    margin-bottom: 20px;
+  }
+}
+.duration {
+  width: 110px;
+  text-align: center;
+  box-sizing: border-box;
+  padding: 3px 10px;
+  /* font-size: 1rem; */
+  color: #7f3a2b;
+  background-color: beige;
+  border-radius: 25px;
+  border: rgba(245, 245, 70, 0.4) 1px solid;
+  margin-right: 10px;
+}
+
+.volumeSlider {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+  width: 80px;
+  background: transparent;
+}
+
+.volumeSlider:focus {
+  outline: none;
+}
+
+.volumeSlider::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  height: 20px;
+  width: 20px;
+  border-radius: 50%;
+  background-color: #69727b;
+  cursor: pointer;
+  margin-top: -6px;
+  border-top: #bbc 2px solid;
+  border-left: #ccd 2px solid;
+  border-right: #aab 2px solid;
+  border-bottom: #bbc 2px solid;
+}
+
+.volumeSlider::-webkit-slider-thumb:active {
+  background-color: #9aa;
+}
+
+.volumeSlider::-moz-range-thumb {
+  height: 20px;
+  width: 20px;
+  border-radius: 50%;
+  background-color: #69727b;
+  cursor: pointer;
+  margin-top: -6px;
+  border-top: #bbc 2px solid;
+  border-left: #ccd 2px solid;
+  border-right: #aab 2px solid;
+  border-bottom: #bbc 2px solid;
+}
+
+.volumeSlider::-webkit-slider-runnable-track {
+  width: 100%;
+  height: 8px;
+  cursor: pointer;
+  background-color: #8b949d;
+  border-radius: 4px;
+  margin-top: 2px;
+}
+
+.volumeSlider::-webkit-slider-runnable-track:active {
+  background-color: #69727b;
+}
+
+.volumeSlider::-moz-range-track {
+  width: 100%;
+  height: 8px;
+  cursor: pointer;
+  background-color: #8b949d;
+  border-radius: 4px;
+  margin-top: 2px;
+}
+/* Media player */
+
+/* Successful Conversion Page  */
+
+.return-div {
+  padding: 0px 60px;
+  margin-top: 20px;
+  width: 100%;
+}
+
+.return-div a {
+  text-decoration: none;
+  background-color: #1565ff;
+  padding: 0.8em 1.2em;
+  border-radius: 5px;
+  color: #fff;
+  border: none;
+}
+
+#return-button{
+  display: inline-flex;
+}
+
+#return-arrow {
+  fill: #fff;
+  height: 20px;
+  margin-right: 15px;
+}
+
+.successful-conversion {
+  width: 100%;
+  padding: 10px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-bottom: 20px;
+  color: #88b04b;
+}
+
+.successful-conversion p {
+  font-weight: 600;
+}
+
+.main-container {
+  width: 100%;
+  height: 30vh;
+  display: flex;
+  flex-flow: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.check-container {
+  width: 6.25rem;
+  height: 7.5rem;
+  display: flex;
+  flex-flow: column;
+  align-items: center;
+  justify-content: space-between;
+}
+.check-container .check-background {
+  width: 100%;
+  height: calc(100% - 1.25rem);
+  background: linear-gradient(to bottom right, #5de593, #41d67c);
+  box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset,
+    0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;
+  transfo…
nocarryr added a commit to pyrtlsdr/pyrtlsdrlib that referenced this issue Jul 28, 2023
OS markers missing for dependencies of loguru,
despite claims that this should be "handled"
(pypa/pipenv#598 (comment))

Oh well
Aristoddle added a commit to Aristoddle/marvin that referenced this issue Jul 31, 2023
…e: `*.pyc`, `__pycache__/`, `*.log`, `.env`, `*.json`, `*/package_lock.json`.

# Aider chat conversation:

USER: Okay, can you run me through what this codebase does, @ the most basic level?

ASSISTANT: Based on the file structure and naming conventions, this codebase appears to be for a chatbot or AI assistant application. Here's a high-level overview:

1. **Chatbot/Assistant Functionality**: Files like `chatbot.py`, `agent.py`, and `ai_application.py` suggest that the main functionality of this codebase is to facilitate conversation between a user and an AI assistant.

2. **Integration with Various Services**: Files like `slackbot/chatbot.py`, `azure_openai.py`, `openai.py`, and `anthropic.py` suggest that this application integrates with various AI and chat services, including Slack, Azure, OpenAI, and Anthropic.

3. **Task Management**: The `todo.py` file suggests that there might be some task management functionality, where the AI assistant can help manage a to-do list.

4. **Language Models**: Files in the `language_models` directory suggest that this application uses language models to generate responses. These could be from various providers like OpenAI, Azure, or Anthropic.

5. **Tools**: The `tools` directory contains various tools that the application can use. These could be for things like performing calculations (`mathematics.py`), interacting with the file system (`filesystem.py`), formatting responses (`format_response.py`), and more.

6. **Settings and Configuration**: Files like `settings.py` and `package-lock.json` are likely used for configuring the application and managing dependencies.

7. **Documentation**: The `docs` directory likely contains documentation for the application.

8. **Testing**: The `tests` directory contains tests for the application, ensuring that the components work as expected.

Please note that this is a high-level overview based on the file names and structure. For a more detailed understanding, we would need to look into the actual code in these files.

USER: I added these *read-write* files: docs/package-lock.json, cookbook/apps/agent.py, cookbook/apps/todo.py, src/marvin/components/ai_application.py, src/marvin/engine/language_models/azure_openai.py, src/marvin/settings.py, src/marvin/engine/language_models/anthropic.py

ASSISTANT: Great! Now that these files are read-write, we can propose changes to them. Please provide the specific changes or updates you'd like to make to these files.

USER: I'd love to understand if this model can query the internet for information.  Can it?  if so, how?

ASSISTANT: Based on the provided code, it appears that this model does not directly query the internet for information. However, it does have the capability to integrate with various services and tools that can fetch information from the internet.

For example, in the `tools` directory, there's a file named `web.py` which contains classes like `DuckDuckGoSearch` and `VisitUrl`. These classes suggest that the application has the ability to perform web searches and visit URLs, which could be used to fetch information from the internet.

However, these tools would need to be properly integrated and used within the AI application's logic to fetch and utilize internet data. The AI application would need to call these tools at the appropriate time, handle their responses, and incorporate the fetched data into its responses.

In summary, while the model doesn't directly query the internet, it has tools that can be used to fetch information from the internet when properly integrated into the application's logic.

USER: I added these *read-write* files: src/marvin/tools/web.py

ASSISTANT: Great! Now that the `src/marvin/tools/web.py` file is read-write, we can propose changes to it. Please provide the specific changes or updates you'd like to make to this file.

USER: Please run me through web.py in explicit detail

ASSISTANT: The `web.py` file appears to contain tools for interacting with the web, specifically for making HTTP requests and performing web searches. Here's a detailed breakdown of its contents:

1. `safe_get(client, url)`: This is an asynchronous helper function that performs a GET request to a specified URL using the provided HTTP client. If the request times out, it simply returns None.

2. `search_ddg(query: str, n: int = 5) -> str`: This is an asynchronous function that performs a search on DuckDuckGo for a given query and returns the results. It uses the `DDGS` class from the `duckduckgo_search` package to perform the search. The function returns the top `n` results.

3. `class VisitUrl(Tool)`: This class is a tool for visiting a URL and returning its contents. It inherits from the `Tool` base class. The `run` method performs a GET request to the specified URL and returns the content of the response.

4. `class DuckDuckGoSearch(Tool)`: This class is a tool for performing a search on DuckDuckGo. It inherits from the `Tool` base class. The `run` method calls the `search_ddg` function with the provided query and returns the results.

In summary, this file provides tools for making HTTP requests to specific URLs and for performing web searches using DuckDuckGo. These tools can be used by the AI application to fetch information from the web.

USER: Where is this tool class?  Perhaps it would provide context. I'm very interested i how it extracts information from websites.

ASSISTANT: The `Tool` class is not included in the provided files. It's likely defined in another file in the codebase. The `Tool` class seems to be a base class for various tools that the AI application can use.

Based on the usage in `web.py`, it appears that each `Tool` subclass must implement a `run` method, which performs the tool's main function. The arguments and return value of the `run` method would depend on the specific tool.

In the case of the `VisitUrl` tool in `web.py`, the `run` method takes a URL as an argument, makes a GET request to that URL, and returns the content of the response. This could be used to extract information from websites. However, it's important to note that this tool simply returns the raw content of the webpage. Extracting specific information from this content (like parsing the HTML, extracting text, etc.) would need to be done separately.

For the `DuckDuckGoSearch` tool, the `run` method performs a search on DuckDuckGo and returns the results. The specifics of how the search is performed and how the results are formatted would be handled by the `duckduckgo_search` package.

To provide more context, we would need to see the definition of the `Tool` base class and how it's used in the rest of the codebase.

USER: I ran this command:

 echo "*/package_lock.json >> .gitignore"

And got this output:

*/package_lock.json >> .gitignore

ASSISTANT: It seems like you're trying to add `*/package_lock.json` to your `.gitignore` file to ignore all `package_lock.json` files in your repository. However, the command you've run is just echoing the string `*/package_lock.json >> .gitignore` to the terminal, not actually modifying the `.gitignore` file.

To add `*/package_lock.json` to your `.gitignore` file from the command line, you can use the `echo` command in conjunction with the `>>` operator, which appends the output of the command on the left to the file on the right. Here's how you can do it:

```bash
echo "*/package_lock.json" >> .gitignore
```

This command will append the string `*/package_lock.json` to the end of the `.gitignore` file. If the `.gitignore` file doesn't exist, it will be created.

USER: I added these *read-write* files: .gitignore

ASSISTANT: Great! Now that the `.gitignore` file is read-write, we can propose changes to it. Please provide the specific changes or updates you'd like to make to this file.

USER: Could you actually just add that line, alongside any other files that you don't think would be valuable (given your core UX loop) to the gitignore?  Run me through your recommendations and then, once confirmed, I'd love ot see a recommended code-block edit.

ASSISTANT: Based on the structure and content of the codebase, here are some files and directories that you might want to consider adding to the `.gitignore` file:

1. `*.pyc`: This will ignore all Python compiled files. These files are not necessary for running the code and can be safely ignored.

2. `__pycache__/`: This will ignore all `__pycache__` directories that Python creates to store compiled bytecode files.

3. `*.log`: This will ignore all log files. Log files are typically not included in version control.

4. `.env`: This will ignore environment files, which are often used to store sensitive information like API keys and should not be included in version control.

5. `*.json`: This will ignore all JSON files. Depending on your application, you might want to ignore these files, especially if they are used for local configuration or contain sensitive data.

6. `*/package_lock.json`: This will ignore all `package_lock.json` files as you initially intended.

Here's the proposed edit block:

<source>bash
.gitignore
<<<<<<< ORIGINAL
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# All node modules in any directory
node_modules/

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

/sandbox/*
!/sandbox/pyproject.toml

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
.pytest_cache/*
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

.DS_Store

# ruff
.ruff_cache/**/*

# VS Code
.vscode/

local_examples/

# Chroma
.chroma/
.aider*
=======
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# All node modules in any directory
node_modules/

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

/sandbox/*
!/sandbox/pyproject.toml

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
.pytest_cache/*
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

.DS_Store

# ruff
.ruff_cache/**/*

# VS Code
.vscode/

local_examples/

# Chroma
.chroma/
.aider*

# Additional ignores
*.pyc
__pycache__/
*.log
.env
*.json
*/package_lock.json
>>>>>>> UPDATED
</source>

Please review these changes and let me know if you approve them or if there are any other files or directories you'd like to ignore.
NeoDobariya referenced this issue in NeoDobariya/AugProject Aug 23, 2023
Umeshbalande referenced this issue in Umeshbalande/mlproject Oct 3, 2023
dvalchibaev added a commit to dvalchibaev/da-recipies that referenced this issue Oct 26, 2023
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/

dev-local
dvalchibaev added a commit to dvalchibaev/da-recipies that referenced this issue Oct 30, 2023
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/

dev-local
secrets
HarshalPatil20 referenced this issue in HarshalPatil20/Supply-Chain-Shipment-Pricing-Data Nov 3, 2023
jkulak added a commit to jkulak/python-parallel-testing that referenced this issue Nov 15, 2023
…Python projects to the .gitignore file.

# Aider chat conversation:

USER: fill the .gitignore with files that sholud be ignored for Python projects

ASSISTANT: Sure, we can add common files and directories that should be ignored for Python projects to the `.gitignore` file. These include compiled Python files, log files, local configuration, virtual environments, and other files that are not needed in the repository.

Here is the *SEARCH/REPLACE block* for the `.gitignore` file:

<source>python
.gitignore
<<<<<<< SEARCH
.aider*
=======
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# aide
.aider*
>>>>>>> REPLACE
</source>

This `.gitignore` file now includes common files and directories that should be ignored for Python projects.
MuskanArya22 added a commit to MuskanArya22/PRODIGY_SD_05 that referenced this issue Nov 21, 2023
# local env
.vscode
output.csv

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
jy34562 added a commit to jy34562/jy34562 that referenced this issue Nov 26, 2023
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/
Pjxsantos added a commit to Pjxsantos/test-python-projeto that referenced this issue Dec 26, 2023
# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,python,virtualenv,visualstudiocode,pycharm
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,python,virtualenv,visualstudiocode,pycharm

### Linux ###
*~

# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*

# KDE directory preferences
.directory

# Linux trash folder which might appear on any partition or disk
.Trash-*

# .nfs files are created when an open file is removed but is still being accessed
.nfs*

### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn.  Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

### PyCharm Patch ###
# Comment Reason: toptal/gitignore.io#186 (comment)

# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr

# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/

# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml

# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/

# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$

# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml

### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
pytestdebug.log

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/
doc/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

### VirtualEnv ###
# Virtualenv
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
[Bb]in
[Ii]nclude
[Ll]ib
[Ll]ib64
[Ll]ocal
[Ss]cripts
pyvenv.cfg
pip-selfcheck.json

### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

### VisualStudioCode Patch ###
# Ignore all local history of files
.history

### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

# Windows shortcuts
*.lnk

# End of https://www.toptal.com/developers/gitignore/api/windows,linux,macos,python,virtualenv,visualstudiocode,pycharm
epiccoleman added a commit to epiccoleman/scrapio that referenced this issue Jan 20, 2024
… should not be included in a Git repository.

# Aider chat conversation:

ASSISTANT: Sure, here is a standard Python `.gitignore` file:

<source>python
.gitignore
<<<<<<< SEARCH
=======
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/
>>>>>>> REPLACE
</source>

This `.gitignore` file will ignore common Python files that should not be included in a Git repository. It includes rules for ignoring compiled Python files, distribution files, unit test reports, and various environment and configuration files.
Bhargavibharatha added a commit to Bhargavibharatha/Automatic-eye-disease-detection that referenced this issue Jan 24, 2024
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
dnnsdunca referenced this issue in dnnsdunca/heyneo_agent Mar 21, 2024
Depixelate added a commit to Depixelate/algo-analysis that referenced this issue Apr 10, 2024
diff --git a/.gitignore b/.gitignore
index 68bc17f..51e9d59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,160 +1,160 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-#   For a library or package, you might want to ignore these files since the code is
-#   intended to run in multiple environments; otherwise, check them in:
-# .python-version
-
-# pipenv
-#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-#   However, in case of collaboration, if having platform-specific dependencies or dependencies
-#   having no cross-platform support, pipenv may install dependencies that don't work, or not
-#   install all needed dependencies.
-#Pipfile.lock
-
-# poetry
-#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
-#   This is especially recommended for binary packages to ensure reproducibility, and is more
-#   commonly ignored for libraries.
-#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
-#poetry.lock
-
-# pdm
-#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
-#pdm.lock
-#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
-#   in version control.
-#   https://pdm.fming.dev/#use-with-ide
-.pdm.toml
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-
-# PyCharm
-#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
-#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
-#  and can be added to the global gitignore or merged into this file.  For a more nuclear
-#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
-#.idea/
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
diff --git a/Ex1/1-unique_rand.py b/Ex1/1-unique_rand.py
index f69c014..d501396 100644
--- a/Ex1/1-unique_rand.py
+++ b/Ex1/1-unique_rand.py
@@ -1,15 +1,15 @@
-import random
-
-
-def unique_rand(n):
-    rands = list(range(n))
-    random.shuffle(rands)
-    return rands
-
-
-if __name__ == "__main__":
-    # start = int(input("Enter the start for the range of random numbers: "))
-    # end = int(input("Enter the end for the range of random numbers(inclusive): "))
-    n = int(input("Enter the no. random nums you want to generate: "))
-    nums = unique_rand(n)
-    print(f"The numbers: {nums}")
+import random
+
+
+def unique_rand(n):
+    rands = list(range(n))
+    random.shuffle(rands)
+    return rands
+
+
+if __name__ == "__main__":
+    # start = int(input("Enter the start for the range of random numbers: "))
+    # end = int(input("Enter the end for the range of random numbers(inclusive): "))
+    n = int(input("Enter the no. random nums you want to generate: "))
+    nums = unique_rand(n)
+    print(f"The numbers: {nums}")
diff --git a/Ex1/2-sort.py b/Ex1/2-sort.py
index bd89460..986a33f 100644
--- a/Ex1/2-sort.py
+++ b/Ex1/2-sort.py
@@ -1,109 +1,109 @@
-import matplotlib.pyplot as plt
-import time
-import random
-
-
-def unique_rand(n):
-    rands = list(range(n))
-    random.shuffle(rands)
-    return rands
-
-def bucket_sort(elems, power, radix):
-    digit_buckets = [[] for i in range(radix)]
-    ended = True
-
-    for elem in elems:
-        digit = (elem // power) % radix
-        if digit != 0:
-            ended = False
-        digit_buckets[digit].append(elem)
-
-    k = 0
-    for bucket in digit_buckets:
-        for elem in bucket:
-            elems[k] = elem
-            k+=1
-    return ended
-
-
-def count_sort(elems, radix, radix_to_n):
-    digit_sorted_elems = [0 for i in range(len(elems))]
-    digit_counts = [0 for i in range(radix)]
-    is_radix_too_big = True
-
-    for elem in elems:
-        digit = int(elem / radix_to_n) % radix
-        if digit != 0:
-            is_radix_too_big = False
-        digit_counts[digit] += 1
-
-    cum_sum = 0
-    for i in range(len(digit_counts)):
-        count = digit_counts[i]
-        digit_counts[i] = cum_sum
-        cum_sum += count
-
-    for elem in elems:
-        digit = int(elem / radix_to_n) % radix
-        digit_sorted_elems[digit_counts[digit]] = elem
-        digit_counts[digit] += 1
-
-    for i in range(len(elems)):
-        elems[i] = digit_sorted_elems[i]
-
-    return is_radix_too_big
-
-
-def radix_sort(elems, radix):
-    power = 1
-    while not bucket_sort(elems, power, radix):
-        power *= radix
-
-
-def increment_sort(elems, increment):
-    for i in range(increment, len(elems)):
-        for j in range(i, increment - 1, -increment):
-            if elems[j] < elems[j - increment]:
-                elems[j], elems[j - increment] = elems[j - increment], elems[j]
-            else:
-                break
-
-
-def insertion_sort(elems):
-    increment_sort(elems, 1)
-
-
-def shell_sort(elems):
-    increment = int(len(elems) / 2)
-    while increment > 0:
-        increment_sort(elems, increment)
-        increment = int(increment / 2)
-
-
-if __name__ == "__main__":
-    ns = [10, 1000, 2000, 5000, 100000]
-    timeRadix, timeShell, timeInsertion = [], [], []
-    for i in ns:
-        #print(f"Now considering arrays of size {i}: ")
-        nums = unique_rand(i)
-        nums1, nums2, nums3 = list(nums), list(nums), list(nums)
-        start = time.perf_counter()
-        radix_sort(nums1, 256)
-        timeRadix.append(time.perf_counter() - start)
-        start = time.perf_counter()
-        shell_sort(nums2)
-        timeShell.append(time.perf_counter() - start)
-        start = time.perf_counter()
-        insertion_sort(nums3)
-        timeInsertion.append(time.perf_counter() - start)
-        #print(f"{timeInsertion[-1]=}, {timeRadix[-1]=}, {timeShell[-1]=}")
-
-    fig1 = plt.plot(ns, timeRadix, label="radix")
-    fig2 = plt.plot(ns, timeShell, label="shell")
-    fig3 = plt.plot(ns, timeInsertion, label="insertion")
-    plt.legend()
-    plt.xscale("log")
-    plt.yscale("log")
-    plt.savefig("sorts_compared.png")
-    # fig2.savefig("2.png")
-    # fig3.savefig("3.png")
+import matplotlib.pyplot as plt
+import time
+import random
+
+
+def unique_rand(n):
+    rands = list(range(n))
+    random.shuffle(rands)
+    return rands
+
+def bucket_sort(elems, power, radix):
+    digit_buckets = [[] for i in range(radix)]
+    ended = True
+
+    for elem in elems:
+        digit = (elem // power) % radix
+        if digit != 0:
+            ended = False
+        digit_buckets[digit].append(elem)
+
+    k = 0
+    for bucket in digit_buckets:
+        for elem in bucket:
+            elems[k] = elem
+            k+=1
+    return ended
+
+
+def count_sort(elems, radix, radix_to_n):
+    digit_sorted_elems = [0 for i in range(len(elems))]
+    digit_counts = [0 for i in range(radix)]
+    is_radix_too_big = True
+
+    for elem in elems:
+        digit = int(elem / radix_to_n) % radix
+        if digit != 0:
+            is_radix_too_big = False
+        digit_counts[digit] += 1
+
+    cum_sum = 0
+    for i in range(len(digit_counts)):
+        count = digit_counts[i]
+        digit_counts[i] = cum_sum
+        cum_sum += count
+
+    for elem in elems:
+        digit = int(elem / radix_to_n) % radix
+        digit_sorted_elems[digit_counts[digit]] = elem
+        digit_counts[digit] += 1
+
+    for i in range(len(elems)):
+        elems[i] = digit_sorted_elems[i]
+
+    return is_radix_too_big
+
+
+def radix_sort(elems, radix):
+    power = 1
+    while not bucket_sort(elems, power, radix):
+        power *= radix
+
+
+def increment_sort(elems, increment):
+    for i in range(increment, len(elems)):
+        for j in range(i, increment - 1, -increment):
+            if elems[j] < elems[j - increment]:
+                elems[j], elems[j - increment] = elems[j - increment], elems[j]
+            else:
+                break
+
+
+def insertion_sort(elems):
+    increment_sort(elems, 1)
+
+
+def shell_sort(elems):
+    increment = int(len(elems) / 2)
+    while increment > 0:
+        increment_sort(elems, increment)
+        increment = int(increment / 2)
+
+
+if __name__ == "__main__":
+    ns = [10, 1000, 2000, 5000, 100000]
+    timeRadix, timeShell, timeInsertion = [], [], []
+    for i in ns:
+        #print(f"Now considering arrays of size {i}: ")
+        nums = unique_rand(i)
+        nums1, nums2, nums3 = list(nums), list(nums), list(nums)
+        start = time.perf_counter()
+        radix_sort(nums1, 256)
+        timeRadix.append(time.perf_counter() - start)
+        start = time.perf_counter()
+        shell_sort(nums2)
+        timeShell.append(time.perf_counter() - start)
+        start = time.perf_counter()
+        insertion_sort(nums3)
+        timeInsertion.append(time.perf_counter() - start)
+        #print(f"{timeInsertion[-1]=}, {timeRadix[-1]=}, {timeShell[-1]=}")
+
+    fig1 = plt.plot(ns, timeRadix, label="radix")
+    fig2 = plt.plot(ns, timeShell, label="shell")
+    fig3 = plt.plot(ns, timeInsertion, label="insertion")
+    plt.legend()
+    plt.xscale("log")
+    plt.yscale("log")
+    plt.savefig("sorts_compared.png")
+    # fig2.savefig("2.png")
+    # fig3.savefig("3.png")
diff --git a/Ex1/3-insertion_order.py b/Ex1/3-insertion_order.py
index e58e29d..a5d3b6e 100644
--- a/Ex1/3-insertion_order.py
+++ b/Ex1/3-insertion_order.py
@@ -1,45 +1,45 @@
-import random
-import time
-
-def increment_sort(elems, increment):
-    for i in range(increment, len(elems)):
-        #print(f"{i=}")
-        for j in range(i, increment - 1, -increment):
-            if elems[j] < elems[j - increment]:
-                elems[j], elems[j - increment] = elems[j - increment], elems[j]
-            else:
-                break
-
-
-def insertion_sort(elems):
-    increment_sort(elems, 1)
-
-def unique_rand(n):
-    rands = list(range(n))
-    random.shuffle(rands)
-    return rands
-
-unsorted_elems = unique_rand(100000)
-ascending_elems = sorted(unsorted_elems)
-descending_elems = sorted(unsorted_elems, reverse=True)
-
-ascending_start_ns = time.process_time_ns()
-insertion_sort(ascending_elems)
-ascending_end_ns = time.process_time_ns()
-ascending_time = (ascending_end_ns - ascending_start_ns)/10**9
-print(f"{ascending_time=}")
-
-descending_start_ns = time.process_time_ns()
-insertion_sort(descending_elems)
-descending_end_ns = time.process_time_ns()
-descending_time = (descending_end_ns - descending_start_ns)/10**9
-print(f"{descending_time=}")
-
-unsorted_start_ns = time.process_time_ns()
-insertion_sort(unsorted_elems)
-unsorted_end_ns = time.process_time_ns()
-unsorted_time = (unsorted_end_ns - unsorted_start_ns)/10**9
-print(f"{unsorted_time=}")
-
-with open("results.txt", "a", encoding="utf-8") as f:
+import random
+import time
+
+def increment_sort(elems, increment):
+    for i in range(increment, len(elems)):
+        #print(f"{i=}")
+        for j in range(i, increment - 1, -increment):
+            if elems[j] < elems[j - increment]:
+                elems[j], elems[j - increment] = elems[j - increment], elems[j]
+            else:
+                break
+
+
+def insertion_sort(elems):
+    increment_sort(elems, 1)
+
+def unique_rand(n):
+    rands = list(range(n))
+    random.shuffle(rands)
+    return rands
+
+unsorted_elems = unique_rand(100000)
+ascending_elems = sorted(unsorted_elems)
+descending_elems = sorted(unsorted_elems, reverse=True)
+
+ascending_start_ns = time.process_time_ns()
+insertion_sort(ascending_elems)
+ascending_end_ns = time.process_time_ns()
+ascending_time = (ascending_end_ns - ascending_start_ns)/10**9
+print(f"{ascending_time=}")
+
+descending_start_ns = time.process_time_ns()
+insertion_sort(descending_elems)
+descending_end_ns = time.process_time_ns()
+descending_time = (descending_end_ns - descending_start_ns)/10**9
+print(f"{descending_time=}")
+
+unsorted_start_ns = time.process_time_ns()
+insertion_sort(unsorted_elems)
+unsorted_end_ns = time.process_time_ns()
+unsorted_time = (unsorted_end_ns - unsorted_start_ns)/10**9
+print(f"{unsorted_time=}")
+
+with open("results.txt", "a", encoding="utf-8") as f:
     f.write(f"{ascending_time=}, {descending_time=}, {unsorted_time=}")
\ No newline at end of file
diff --git a/Ex1/4-search.py b/Ex1/4-search.py
index e48a365..9a71c15 100644
--- a/Ex1/4-search.py
+++ b/Ex1/4-search.py
@@ -1,41 +1,41 @@
-import random
-import time
-
-def unique_rand(n):
-    rands = list(range(n))
-    random.shuffle(rands)
-    return rands
-
-def rec_binary_search(elems, elem, start, end):
-    if end < start:
-        return -1
-    mid_ind = (start + end)//2
-    if elem == elems[mid_ind]:
-        return mid_ind
-    if elem < elems[mid_ind]:
-        return rec_binary_search(elems, elem, start, mid_ind-1)
-    return rec_binary_search(elems, elem, mid_ind + 1, end)
-
-def iter_binary_search(elems, elem):
-    start, end = 0, len(elems) - 1
-    while end >= start:
-        mid_ind = (start + end)//2
-        if elem == elems[mid_ind]:
-            return mid_ind
-        if elem < elems[mid_ind]:
-            end = mid_ind - 1
-        else:
-            start = mid_ind + 1
-    return -1
-
-nums = unique_rand(100000)
-iter_start = time.perf_counter_ns()
-iter_binary_search(nums, -1)
-iter_end = time.perf_counter_ns()
-iter_time = (iter_end - iter_start)/1000
-print(f"{iter_time=}us")
-rec_start = time.perf_counter_ns()
-rec_binary_search(nums, -1, 0, len(nums)-1)
-rec_end = time.perf_counter_ns()
-rec_time = (rec_end - rec_start)/1000
+import random
+import time
+
+def unique_rand(n):
+    rands = list(range(n))
+    random.shuffle(rands)
+    return rands
+
+def rec_binary_search(elems, elem, start, end):
+    if end < start:
+        return -1
+    mid_ind = (start + end)//2
+    if elem == elems[mid_ind]:
+        return mid_ind
+    if elem < elems[mid_ind]:
+        return rec_binary_search(elems, elem, start, mid_ind-1)
+    return rec_binary_search(elems, elem, mid_ind + 1, end)
+
+def iter_binary_search(elems, elem):
+    start, end = 0, len(elems) - 1
+    while end >= start:
+        mid_ind = (start + end)//2
+        if elem == elems[mid_ind]:
+            return mid_ind
+        if elem < elems[mid_ind]:
+            end = mid_ind - 1
+        else:
+            start = mid_ind + 1
+    return -1
+
+nums = unique_rand(100000)
+iter_start = time.perf_counter_ns()
+iter_binary_search(nums, -1)
+iter_end = time.perf_counter_ns()
+iter_time = (iter_end - iter_start)/1000
+print(f"{iter_time=}us")
+rec_start = time.perf_counter_ns()
+rec_binary_search(nums, -1, 0, len(nums)-1)
+rec_end = time.perf_counter_ns()
+rec_time = (rec_end - rec_start)/1000
 print(f"{rec_time=}us")
\ No newline at end of file
diff --git a/Ex1/unique_rand.py b/Ex1/unique_rand.py
index 6a11093..c9b5c92 100644
--- a/Ex1/unique_rand.py
+++ b/Ex1/unique_rand.py
@@ -1,19 +1,19 @@
-import random;
-def unique_rand(start, end, n):
-	nums = {}
-	while len(nums) < n:
-		nums[random.randint(start, end)]=None
-	return list(nums.keys())
-
-def unique_rand_2(n):
-	lst = list(range(n))
-	random.shuffle(lst)
-	return lst
-
-if __name__ == "__main__":
-	start = int(input("Enter the start for the range of random numbers: "))
-	end = int(input("Enter the end for the range of random numbers(inclusive): "))
-	n = int(input("Enter the no. random nums you want to generate: "))
-	nums = unique_rand(start, end, n)
-	print(f"The numbers: {nums}")
-
+import random;
+def unique_rand(start, end, n):
+	nums = {}
+	while len(nums) < n:
+		nums[random.randint(start, end)]=None
+	return list(nums.keys())
+
+def unique_rand_2(n):
+	lst = list(range(n))
+	random.shuffle(lst)
+	return lst
+
+if __name__ == "__main__":
+	start = int(input("Enter the start for the range of random numbers: "))
+	end = int(input("Enter the end for the range of random numbers(inclusive): "))
+	n = int(input("Enter the no. random nums you want to generate: "))
+	nums = unique_rand(start, end, n)
+	print(f"The numbers: {nums}")
+
diff --git a/Ex2/1-unique_elems.py b/Ex2/1-unique_elems.py
index 1ac60b7..80379a0 100644
--- a/Ex2/1-unique_elems.py
+++ b/Ex2/1-unique_elems.py
@@ -1,19 +1,19 @@
-def unique_elems(arr):
-    unique = []
-    for i in range(len(arr)):
-        if not containsMult(arr, arr[i]):
-            unique.append(arr[i])
-    return unique
-
-def containsMult(arr, elem):
-    count = 0
-    for i in range(len(arr)):
-        if arr[i] == elem:
-            count += 1
-    return count > 1
-
-if __name__ == "__main__":
-    text = input("Enter some space separated numbers: ")
-    nums = [int(num) for num in text.split()]
-    print(f"Unique nums: {unique_elems(nums)}")
-
+def unique_elems(arr):
+    unique = []
+    for i in range(len(arr)):
+        if not containsMult(arr, arr[i]):
+            unique.append(arr[i])
+    return unique
+
+def containsMult(arr, elem):
+    count = 0
+    for i in range(len(arr)):
+        if arr[i] == elem:
+            count += 1
+    return count > 1
+
+if __name__ == "__main__":
+    text = input("Enter some space separated numbers: ")
+    nums = [int(num) for num in text.split()]
+    print(f"Unique nums: {unique_elems(nums)}")
+
diff --git a/Ex2/2-sum.py b/Ex2/2-sum.py
index afe0c8e..97bf205 100644
--- a/Ex2/2-sum.py
+++ b/Ex2/2-sum.py
@@ -1,6 +1,6 @@
-def calc_sum(n):
-    return n * (n+1) * (n+2) / 6
-
-if __name__ == "__main__":
-    n = int(input("Enter n: "))
+def calc_sum(n):
+    return n * (n+1) * (n+2) / 6
+
+if __name__ == "__main__":
+    n = int(input("Enter n: "))
     print(f"Sum: {calc_sum(n)}")
\ No newline at end of file
diff --git a/Ex2/3-most_freq.py b/Ex2/3-most_freq.py
index 248e35f..f4c0ebc 100644
--- a/Ex2/3-most_freq.py
+++ b/Ex2/3-most_freq.py
@@ -1,21 +1,21 @@
-def most_freq(text):
-    max_count = 0
-    char_counts = {}
-    for i in range(len(text)):
-        letter = text[i]
-        letter_count = 1
-        if letter in char_counts:
-            letter_count = char_counts[letter] + 1
-        if letter_count > max_count:
-            max_count = letter_count
-        char_counts[letter] = letter_count
-    most_freq_chars = []
-    for key in char_counts:
-        if char_counts[key] == max_count:
-            most_freq_chars.append(key)
-
-    return most_freq_chars
-
-if __name__ == "__main__":
-    text = input("Enter some text: ")
-    print(f"Most frequent chars: {most_freq(text)}")
+def most_freq(text):
+    max_count = 0
+    char_counts = {}
+    for i in range(len(text)):
+        letter = text[i]
+        letter_count = 1
+        if letter in char_counts:
+            letter_count = char_counts[letter] + 1
+        if letter_count > max_count:
+            max_count = letter_count
+        char_counts[letter] = letter_count
+    most_freq_chars = []
+    for key in char_counts:
+        if char_counts[key] == max_count:
+            most_freq_chars.append(key)
+
+    return most_freq_chars
+
+if __name__ == "__main__":
+    text = input("Enter some text: ")
+    print(f"Most frequent chars: {most_freq(text)}")
diff --git a/Ex3/1-inversions.py b/Ex3/1-inversions.py
index 85cdb8a..1988737 100644
--- a/Ex3/1-inversions.py
+++ b/Ex3/1-inversions.py
@@ -1,42 +1,42 @@
-def merge_count(nums, start, end):
-    if start == end:
-        return 0
-    count = 0
-    mid = (start + end) // 2
-    count += merge_count(nums, start, mid)
-    count += merge_count(nums, mid + 1, end)
-    count += merge(nums, start, end)
-
-    return count
-
-
-def merge(nums, start, end):
-    tot_len = end - start + 1
-    aux = [0] * (tot_len)
-    count = 0
-    mid = (start + end) // 2
-    i, j = 0, 0
-    while i + j < tot_len:
-        if mid + 1 + j > end or (
-            start + i < mid + 1 and nums[start + i] <= nums[mid + 1 + j]
-        ):
-            aux[i + j] = nums[start + i]
-            i += 1
-        else:
-            aux[i + j] = nums[mid + 1 + j]
-            count += mid + 1 - start - i
-            j += 1
-    for i in range(start, end + 1):
-        nums[i] = aux[i - start]
-
-    return count
-
-
-def count_inversions(nums):
-    return merge_count(nums, 0, len(nums) - 1)
-
-
-if __name__ == "__main__":
-    text = input("Enter some space separated numbers: ")
-    nums = [int(num) for num in text.split()]
-    print(f"{count_inversions(nums)=}")
+def merge_count(nums, start, end):
+    if start == end:
+        return 0
+    count = 0
+    mid = (start + end) // 2
+    count += merge_count(nums, start, mid)
+    count += merge_count(nums, mid + 1, end)
+    count += merge(nums, start, end)
+
+    return count
+
+
+def merge(nums, start, end):
+    tot_len = end - start + 1
+    aux = [0] * (tot_len)
+    count = 0
+    mid = (start + end) // 2
+    i, j = 0, 0
+    while i + j < tot_len:
+        if mid + 1 + j > end or (
+            start + i < mid + 1 and nums[start + i] <= nums[mid + 1 + j]
+        ):
+            aux[i + j] = nums[start + i]
+            i += 1
+        else:
+            aux[i + j] = nums[mid + 1 + j]
+            count += mid + 1 - start - i
+            j += 1
+    for i in range(start, end + 1):
+        nums[i] = aux[i - start]
+
+    return count
+
+
+def count_inversions(nums):
+    return merge_count(nums, 0, len(nums) - 1)
+
+
+if __name__ == "__main__":
+    text = input("Enter some space separated numbers: ")
+    nums = [int(num) for num in text.split()]
+    print(f"{count_inversions(nums)=}")
diff --git a/Ex3/2-comp_count_sort.py b/Ex3/2-comp_count_sort.py
index e7081c6..02d4614 100644
--- a/Ex3/2-comp_count_sort.py
+++ b/Ex3/2-comp_count_sort.py
@@ -1,18 +1,18 @@
-def comparison_count_sort(nums):
-    count = [0] * len(nums)
-    nums_sorted = [0] * len(nums)
-    for i in range(len(nums) - 1):
-        for j in range(i + 1, len(nums)):
-            if nums[i] > nums[j]:
-                count[i] += 1
-            elif nums[i] <= nums[j]:
-                count[j] += 1
-    for i in range(len(nums)):
-        nums_sorted[count[i]] = nums[i]
-    return nums_sorted
-
-
-if __name__ == "__main__":
-    text = input("Enter some space separated numbers: ")
-    nums = [int(num) for num in text.split()]
-    print(f"{comparison_count_sort(nums)=}")
+def comparison_count_sort(nums):
+    count = [0] * len(nums)
+    nums_sorted = [0] * len(nums)
+    for i in range(len(nums) - 1):
+        for j in range(i + 1, len(nums)):
+            if nums[i] > nums[j]:
+                count[i] += 1
+            elif nums[i] <= nums[j]:
+                count[j] += 1
+    for i in range(len(nums)):
+        nums_sorted[count[i]] = nums[i]
+    return nums_sorted
+
+
+if __name__ == "__main__":
+    text = input("Enter some space separated numbers: ")
+    nums = [int(num) for num in text.split()]
+    print(f"{comparison_count_sort(nums)=}")
diff --git a/Ex4/1-max.py b/Ex4/1-max.py
index 11f7456..0cf18a6 100644
--- a/Ex4/1-max.py
+++ b/Ex4/1-max.py
@@ -1,15 +1,15 @@
-def my_max(arr, start, end):
-    if start == end:
-        return arr[start]
-    mid = (start + end) // 2
-    max1 = my_max(arr, start, mid)
-    max2 = my_max(arr, mid + 1, end)
-    real_max = max1 if max1 > max2 else max2
-    return real_max
-
-
-if __name__ == "__main__":
-    text = input("Enter some space separated numbers: ")
-    nums = [int(num) for num in text.split()]
-    print(f"{my_max(nums, 0, len(nums)-1)=}")
-
+def my_max(arr, start, end):
+    if start == end:
+        return arr[start]
+    mid = (start + end) // 2
+    max1 = my_max(arr, start, mid)
+    max2 = my_max(arr, mid + 1, end)
+    real_max = max1 if max1 > max2 else max2
+    return real_max
+
+
+if __name__ == "__main__":
+    text = input("Enter some space separated numbers: ")
+    nums = [int(num) for num in text.split()]
+    print(f"{my_max(nums, 0, len(nums)-1)=}")
+
diff --git a/Ex4/2-merge_inversion.py b/Ex4/2-merge_inversion.py
index 85cdb8a..1988737 100644
--- a/Ex4/2-merge_inversion.py
+++ b/Ex4/2-merge_inversion.py
@@ -1,42 +1,42 @@
-def merge_count(nums, start, end):
-    if start == end:
-        return 0
-    count = 0
-    mid = (start + end) // 2
-    count += merge_count(nums, start, mid)
-    count += merge_count(nums, mid + 1, end)
-    count += merge(nums, start, end)
-
-    return count
-
-
-def merge(nums, start, end):
-    tot_len = end - start + 1
-    aux = [0] * (tot_len)
-    count = 0
-    mid = (start + end) // 2
-    i, j = 0, 0
-    while i + j < tot_len:
-        if mid + 1 + j > end or (
-            start + i < mid + 1 and nums[start + i] <= nums[mid + 1 + j]
-        ):
-            aux[i + j] = nums[start + i]
-            i += 1
-        else:
-            aux[i + j] = nums[mid + 1 + j]
-            count += mid + 1 - start - i
-            j += 1
-    for i in range(start, end + 1):
-        nums[i] = aux[i - start]
-
-    return count
-
-
-def count_inversions(nums):
-    return merge_count(nums, 0, len(nums) - 1)
-
-
-if __name__ == "__main__":
-    text = input("Enter some space separated numbers: ")
-    nums = [int(num) for num in text.split()]
-    print(f"{count_inversions(nums)=}")
+def merge_count(nums, start, end):
+    if start == end:
+        return 0
+    count = 0
+    mid = (start + end) // 2
+    count += merge_count(nums, start, mid)
+    count += merge_count(nums, mid + 1, end)
+    count += merge(nums, start, end)
+
+    return count
+
+
+def merge(nums, start, end):
+    tot_len = end - start + 1
+    aux = [0] * (tot_len)
+    count = 0
+    mid = (start + end) // 2
+    i, j = 0, 0
+    while i + j < tot_len:
+        if mid + 1 + j > end or (
+            start + i < mid + 1 and nums[start + i] <= nums[mid + 1 + j]
+        ):
+            aux[i + j] = nums[start + i]
+            i += 1
+        else:
+            aux[i + j] = nums[mid + 1 + j]
+            count += mid + 1 - start - i
+            j += 1
+    for i in range(start, end + 1):
+        nums[i] = aux[i - start]
+
+    return count
+
+
+def count_inversions(nums):
+    return merge_count(nums, 0, len(nums) - 1)
+
+
+if __name__ == "__main__":
+    text = input("Enter some space separated numbers: ")
+    nums = [int(num) for num in text.split()]
+    print(f"{count_inversions(nums)=}")
diff --git a/Ex4/3-max_subarray_sum.py b/Ex4/3-max_subarray_sum.py
index c41a699..3c12b7f 100644
--- a/Ex4/3-max_subarray_sum.py
+++ b/Ex4/3-max_subarray_sum.py
@@ -1,32 +1,32 @@
-def max_subarray_sum(arr, start, end):
-    if start == end:
-        return arr[start]
-
-    mid = (start + end) // 2
-    max1 = max_subarray_sum(arr, start, mid)
-    max2 = max_subarray_sum(arr, mid + 1, end)
-
-    max_left = 0
-    cum_left = 0
-    for i in range(mid, start - 1, -1):
-        cum_left += arr[i]
-        if cum_left > max_left:
-            max_left = cum_left
-
-    max_right = 0
-    cum_right = 0
-    for i in range(mid + 1, end + 1):
-        cum_right += arr[i]
-        if cum_right > max_right:
-            max_right = cum_right
-
-    max3 = max_left + max_right
-
-    return max(max1, max2, max3)
-
-
-if __name__ == "__main__":
-    text = input("Enter some space separated numbers: ")
-    nums = [int(num) for num in text.split()]
-    print(f"{max_subarray_sum(nums, 0, len(nums)-1)}")
+def max_subarray_sum(arr, start, end):
+    if start == end:
+        return arr[start]
+
+    mid = (start + end) // 2
+    max1 = max_subarray_sum(arr, start, mid)
+    max2 = max_subarray_sum(arr, mid + 1, end)
+
+    max_left = 0
+    cum_left = 0
+    for i in range(mid, start - 1, -1):
+        cum_left += arr[i]
+        if cum_left > max_left:
+            max_left = cum_left
+
+    max_right = 0
+    cum_right = 0
+    for i in range(mid + 1, end + 1):
+        cum_right += arr[i]
+        if cum_right > max_right:
+            max_right = cum_right
+
+    max3 = max_left + max_right
+
+    return max(max1, max2, max3)
+
+
+if __name__ == "__main__":
+    text = input("Enter some space separated numbers: ")
+    nums = [int(num) for num in text.split()]
+    print(f"{max_subarray_sum(nums, 0, len(nums)-1)}")

\ No newline at end of file
diff --git a/Ex4/4-max_sub_2.py b/Ex4/4-max_sub_2.py
index 51aa511..d5eb271 100644
--- a/Ex4/4-max_sub_2.py
+++ b/Ex4/4-max_sub_2.py
@@ -1,25 +1,25 @@
-def max_subarray_sum(nums):
-    aux = [0] * len(nums)
-    prev = 0
-    for i, num in enumerate(nums):
-        aux[i] = prev + num
-        prev = aux[i]
-
-    print(f"{aux=}")
-
-    cur_lowest = 0
-    cur_max = 0
-
-    for num in aux:
-        cur_sum = num - cur_lowest
-        if cur_sum > cur_max:
-            cur_max = cur_sum
-        if num < cur_lowest:
-            cur_lowest = num
-
-    return cur_max
-
-
-if __name__ == "__main__":
-    nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
-    print(f"{max_subarray_sum(nums)}")
+def max_subarray_sum(nums):
+    aux = [0] * len(nums)
+    prev = 0
+    for i, num in enumerate(nums):
+        aux[i] = prev + num
+        prev = aux[i]
+
+    print(f"{aux=}")
+
+    cur_lowest = 0
+    cur_max = 0
+
+    for num in aux:
+        cur_sum = num - cur_lowest
+        if cur_sum > cur_max:
+            cur_max = cur_sum
+        if num < cur_lowest:
+            cur_lowest = num
+
+    return cur_max
+
+
+if __name__ == "__main__":
+    nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
+    print(f"{max_subarray_sum(nums)}")
diff --git a/Ex4/store.c b/Ex4/store.c
new file mode 100644
index 0000000..55f0d4b
--- /dev/null
+++ b/Ex4/store.c
@@ -0,0 +1,178 @@
+// void non_preemptive(PriorityFunc pf, Event *event, double timedelta, double quanta) {
+// 	handle_event_arrived_and_done(event, pf(event->pcb));
+
+// 	if(event->type == QuantaOver) {
+// 		cur_pcb->burst_left -= timedelta;
+// 		pqueue_add(pqueue, init_pentry(cur_pcb->priority, cur_pcb), false);
+// 		cur_pcb = NULL;
+// 	}
+
+// 	if(cur_pcb == NULL) {
+// 		PEntry *entry = pqueue_extract_min(pqueue);
+// 		if(entry != NULL) {
+// 			cur_pcb = entry->pcb;
+// 			if(cur_pcb->burst_left <= quanta) {
+// 				event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 			} else {
+// 				event_queue_add(event_queue, init_event(event->time + quanta, cur_pcb, QuantaOver));
+// 			}
+// 		}
+// 		free(entry);
+// 	}
+// }
+
+
+
+
+
+// void sjfs_non_preemptive(Event *event, double timedelta) {
+
+// 	handle_event_arrived_and_done(event, 1/event->pcb->burst_left);
+
+// 	if(cur_pcb == NULL) {
+// 		PEntry *entry = pqueue_extract_min(pqueue);
+// 		if(entry != NULL) {
+// 			cur_pcb = entry->pcb;
+// 			event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 		}
+// 		free(entry);
+// 	}
+// }
+
+// void round_robin_priority_nonpreemptive(Event *event, double timedelta, double quanta) {
+
+// 	handle_event_arrived_and_done(event, event->pcb->priority);
+
+// 	// if(event->type == Arrived) {
+// 	// 	pqueue_add(pqueue, init_pentry(event->pcb->priority, event->pcb), false);
+// 	// }
+
+// 	// if(event->type == Done) {
+// 	// 	free(cur_pcb);
+// 	// 	cur_pcb = NULL;
+// 	// }
+
+// 	if(event->type == QuantaOver) {
+// 		cur_pcb->burst_left -= timedelta;
+// 		pqueue_add(pqueue, init_pentry(cur_pcb->priority, cur_pcb), false);
+// 		cur_pcb = NULL;
+// 	}
+
+// 	if(cur_pcb == NULL) {
+// 		PEntry *entry = pqueue_extract_min(pqueue);
+// 		if(entry != NULL) {
+// 			cur_pcb = entry->pcb;
+// 			if(cur_pcb->burst_left <= quanta) {
+// 				event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 			} else {
+// 				event_queue_add(event_queue, init_event(event->time + quanta, cur_pcb, QuantaOver));
+// 			}
+// 		}
+// 		free(entry);
+// 	}
+// }
+
+// void preemptive(PriorityFunc pf, Event *event, double timedelta) {
+// 	handle_event_arrived_and_done(event, pf(event->pcb));
+
+// 	if(cur_pcb != NULL) {
+// 		event_queue_remove(event_queue, cur_pcb->pid);
+// 		cur_pcb->burst_left -= timedelta;
+// 		pqueue_add(pqueue, init_pentry(pf(cur_pcb), cur_pcb), true);
+// 	}
+
+// 	cur_pcb = NULL;
+// 	PEntry *entry = pqueue_extract_min(pqueue);
+// 	if(entry != NULL) {
+// 		cur_pcb = entry->pcb;
+// 		event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 	}
+// 	free(entry);
+// }
+
+// void sjfs_preemptive(Event *event, double timedelta) {
+// 	// if(event->type == Arrived) {
+// 	// 	pqueue_add(pqueue, init_pentry(1/event->pcb->burst_left, event->pcb), false);
+// 	// }
+
+// 	// if(event->type == Done) {
+// 	// 	free(cur_pcb);
+// 	// 	cur_pcb = NULL;
+// 	// }
+
+// 	handle_event_arrived_and_done(event, 1/event->pcb->burst_left);
+
+// 	if(cur_pcb != NULL) {
+// 		event_queue_remove(event_queue, cur_pcb->pid);
+// 		cur_pcb->burst_left -= timedelta;
+// 		pqueue_add(pqueue, init_pentry(1/cur_pcb->burst_left, cur_pcb), true);
+// 	}
+
+// 	cur_pcb = NULL;
+// 	PEntry *entry = pqueue_extract_min(pqueue);
+// 	if(entry != NULL) {
+// 		cur_pcb = entry->pcb;
+// 		event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 	}
+// 	free(entry);
+// }
+
+
+// void priority_preemptive(Event *event, double timedelta) {
+// 	// if(event->type == Arrived) {
+// 	// 	pqueue_add(pqueue, init_pentry(event->pcb->priority, event->pcb), false);
+// 	// }
+
+// 	// if(event->type == Done) {
+// 	// 	free(cur_pcb);
+// 	// 	cur_pcb = NULL;
+// 	// }
+
+// 	handle_event_arrived_and_done(event, event->pcb->priority);
+
+// 	if(cur_pcb != NULL) {
+// 		event_queue_remove(event_queue, cur_pcb->pid);
+// 		cur_pcb->burst_left -= timedelta;
+// 		pqueue_add(pqueue, init_pentry(cur_pcb->priority, cur_pcb), true);
+// 	}
+
+// 	cur_pcb = NULL;
+// 	PEntry *entry = pqueue_extract_min(pqueue);
+// 	if(entry != NULL) {
+// 		cur_pcb = entry->pcb;
+// 		event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 	}
+
+// 	free(entry);
+// }
+
+// void handle_event_arrived_and_done(Event *event, double priority) {
+// 	if(event->type == Arrived) {
+// 		pqueue_add(pqueue, init_pentry(priority, event->pcb), false);
+// 	}
+
+// 	if(event->type == Done) {
+// 		free(cur_pcb);
+// 		cur_pcb = NULL;
+// 	}
+// }
+
+// void fcfs_priority_non_preemptive(Event *event) {
+// 	if(event->type == Arrived) {
+// 		pqueue_add(pqueue, init_pentry(event->pcb->priority, event->pcb), false);
+// 	}
+
+// 	if(event->type == Done) {
+// 		free(cur_pcb)
+// 		cur_pcb = NULL;
+// 	}
+
+// 	if(cur_pcb == NULL) {
+// 		PEntry *entry = pqueue_extract_min(pqueue);
+// 		if(entry != NULL) {
+// 			cur_pcb = entry->pcb;
+// 			event_queue_add(event_queue, init_event(event->time + cur_pcb->burst_left, cur_pcb, Done));
+// 		}
+// 		free(entry);
+// 	}
+// }
\ No newline at end of file
diff --git a/Ex5/1-kth_smallest_elem.py b/Ex5/1-kth_smallest_elem.py
new file mode 100644
index 0000000..ae6369f
--- /dev/null
+++ b/Ex5/1-kth_smallest_elem.py
@@ -0,0 +1,45 @@
+import random
+import time
+
+def increment_sort(elems, increment):
+    for i in range(increment, len(elems)):
+        for j in range(i, increment - 1, -increment):
+            if elems[j] < elems[j - increment]:
+                elems[j], elems[j - increment] = elems[j - increment], elems[j]
+            else:
+                break
+
+
+def insertion_sort(elems):
+    increment_sort(elems, 1)
+
+def partition(arr, start, end, pivot_ind):
+    arr[pivot_ind], arr[start] = arr[start], arr[pivot_ind]
+    pivot_ind = start
+    for i in range(pivot_ind, end + 1):
+        if arr[i] < arr[pivot_ind]:
+            arr[i], arr[pivot_ind + 1] = arr[pivot_ind + 1], arr[i]
+            arr[pivot_ind], arr[pivot_ind + 1] = arr[pivot_ind + 1], arr[pivot_ind]
+            pivot_ind += 1
+    return pivot_ind
+
+def k_smallest(arr, k, start, end):
+    print(f"{start=}, {end=}")
+    if start == end:
+        return arr[start]
+    pivot_ind = partition(arr, start, end, random.randint(start, end))
+    if pivot_ind == k - 1:
+        return arr[pivot_ind]
+    if pivot_ind > k - 1:
+        return k_smallest(arr, k, start, pivot_ind - 1)
+    return k_smallest(arr, k, pivot_ind + 1, end)
+
+if __name__ == "__main__":
+    seed = time.time_ns()
+    #random.seed(seed)
+    #print(f"{seed=}")
+    nums_str = input("Enter comma separated numbers: ")
+    nums = [int(num_str) for num_str in nums_str.split(',')]
+    k = int(input("Enter k: "))
+    k_small = k_smallest(nums, k, 0, len(nums) - 1)
+    print(f"K-th smallest elem: {k_small}")
diff --git a/Ex5/2-tree_sum.py b/Ex5/2-tree_sum.py
new file mode 100644
index 0000000..100ba79
--- /dev/null
+++ b/Ex5/2-tree_sum.py
@@ -0,0 +1,60 @@
+import random
+class TreeNode:
+    def __init__(self):
+        self.data = 0
+        self.left = None
+        self.right = None
+
+    def insert(self, data):
+        if data < self.data:
+            if self.left == None:
+                tempNode = TreeNode()
+                self.left = tempNode
+                self.left.data = data
+            else:
+                self.left.insert(data)
+        elif data > self.data:
+            if self.right == None:
+                tempNode = TreeNode()
+                self.right = tempNode
+                self.right.data = data
+            else:
+                self.right.insert(data)
+    def traverseInOrder(self):
+        if self.left != None:
+            self.left.traverseInOrder()
+        print(self.data, end=' ')
+        if self.right != None:
+            self.right.traverseInOrder()
+def createRoot():
+    i = random.randint(1, 10)
+    rootNode = TreeNode()
+    rootNode.data = i
+    return rootNode
+
+def createTree():
+    rootNode = createRoot()
+    numNodes = random.randint(1, 10)
+    print(f"{numNodes=}")
+    currentNode = rootNode
+    j = 1
+    L = [rootNode.data]
+    while (j < numNodes):
+        newVal = random.randint(1,20)
+        if newVal not in L:
+            currentNode.insert(newVal)
+            L.append(newVal)
+            j+=1
+    rootNode.traverseInOrder()
+    return rootNode
+# Code to populate the tree ends here
+def getSum(node):
+    if node == None:
+        return 0
+    else:
+        leftSum = getSum(node.left)
+        rightSum = getSum(node.right)
+        return node.data + leftSum + rightSum
+
+rootNode = createTree()
+print("Sum = ",getSum(rootNode))
\ No newline at end of file
diff --git a/Ex5/3-closest_points.py b/Ex5/3-closest_points.py
new file mode 100644
index 0000000..7458c37
--- /dev/null
+++ b/Ex5/3-closest_points.py
@@ -0,0 +1,72 @@
+import math
+import matplotlib.pyplot as plt
+import random
+import time
+
+class Point:
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+
+    def tuple(self):
+        return (self.x, self.y)
+
+    @staticmethod
+    def dist(a, b):
+        return (a.x - b.x)**2 + (a.y - b.y)**2
+
+def closest_points(points):
+    points_sorted_x = sorted(points, key = lambda p:p.x)
+    points_sorted_y = sorted(points, key = lambda p:p.y)
+    return closest_points_helper(points_sorted_x, points_sorted_y)
+
+def closest_points_helper(points_x, points_y):
+    if len(points_x) == 1:
+        return None, None, math.inf
+    if len(points_x) == 2:
+        return points_x[0], points_x[1], Point.dist(points_x[0], points_x[1])
+
+    left_x, right_x = points_x[:len(points_x)//2], points_x[len(points_x)//2:]
+    boundary_x = (left_x[-1].x + right_x[0].x) / 2
+    #plt.vlines(boundary_x, 0, 100)
+    left_y, right_y = [point for point in points_y if point.x <= boundary_x], [point for point in points_y if point.x > boundary_x]
+
+    left_p1, left_p2, left_d = closest_points_helper(left_x, left_y)
+    right_p1, right_p2, right_d = closest_points_helper(right_x, right_y)
+
+    p1, p2, d = (left_p1, left_p2, left_d) if left_d < right_d else (right_p1, right_p2, right_d)
+
+    cross_y = [point for point in points_y if abs(point.x - boundary_x) < d]
+
+    for i, point in enumerate(cross_y):
+        for j in range(i+1, len(cross_y)):
+            if cross_y[j].y - point.y >= d:
+                break
+            if (temp_d := Point.dist(point, cross_y[j])) < d:
+                p1, p2, d = point, cross_y[j], temp_d
+
+    return p1, p2, d
+
+n = 100
+points = [Point(random.uniform(0, 100), random.uniform(0, 100)) for i in range(n)]
+start = time.perf_counter()
+ap1, ap2, ad = None,  None, math.inf
+for i, t1 in enumerate(points):
+    for t2 in points[i+1:]:
+        if((temp_d:=Point.dist(t1, t2)) < ad):
+            ad = temp_d
+            ap1 = t1
+            ap2 = t2
+print(f"{ad=}")
+end = time.perf_counter()
+print(f"{end - start = }")
+plt.scatter(*zip(*[p.tuple() for p in points]), c='blue')
+start = time.perf_counter()
+p1, p2, d = closest_points(points)
+print(f"{d=}")
+end = time.perf_counter()
+print(f"{end - start = }")
+plt.scatter([p1.x, p2.x], [p1.y, p2.y], color = 'green')
+plt.scatter([ap1.x,ap2.x], [ap1.y, ap2.y], color = 'red')
+#plt.hlines(0, 0, 100)
+plt.show()
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 9f61605..0820fa4 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,24 +1,24 @@
-BSD 2-Clause License
-
-Copyright (c) 2024, Depixelate
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+BSD 2-Clause License
+
+Copyright (c) 2024, Depixelate
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
index 4e1bbd1..be86360 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
-# algo-analysis
-A Practice Repository For Learning About different kinds of algorithms
+# algo-analysis
+A Practice Repository For Learning About different kinds of algorithms
kyle-cassidy added a commit to kyle-cassidy/githide that referenced this issue May 17, 2024
# Aider chat conversation:

USER: commit

ASSISTANT: Please provide the specific files you would like me to edit or the details of the changes you need.

USER: add the standard files you might add to `.gitignore` in a python project

ASSISTANT: Here is the *SEARCH/REPLACE block* to update the `.gitignore` file with standard entries for a Python project:

.gitignore
```python
<<<<<<< SEARCH
.aider*
.venv*
=======
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyderworkspace

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# Aider
.aider*
>>>>>>> REPLACE
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests