diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1a31f6b3..a23de84f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,3 +1,4 @@ + // For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/python { @@ -21,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "sudo apt-get update -y && sudo apt-get install xdg-utils -y && pip3 install pytest==6.2.5 pytest-testdox mock && npm i @learnpack/learnpack@2.1.47 -g && learnpack plugins:install @learnpack/python@1.0.3" + "onCreateCommand": "sudo apt-get update -y && sudo apt-get install xdg-utils -y && pip3 install pytest==6.2.5 pytest-testdox mock && npm i @learnpack/learnpack@5.0.19 -g && learnpack plugins:install @learnpack/python@1.0.6" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, diff --git a/.github/workflows/learnpack-audit.yml b/.github/workflows/learnpack-audit.yml index 52644d89..95814c2a 100644 --- a/.github/workflows/learnpack-audit.yml +++ b/.github/workflows/learnpack-audit.yml @@ -5,9 +5,9 @@ name: Learnpack audit on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] jobs: build: @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [14.x] + node-version: [20.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 25ac192d..3de43aa2 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -25,4 +25,4 @@ RUN echo "unset DATABASE_URL" >> $HOME/.bashrc RUN echo "export DATABASE_URL" >> $HOME/.bashrc RUN pip3 install pytest==6.2.5 pytest-testdox mock -RUN npm i @learnpack/learnpack@2.1.47 -g && learnpack plugins:install @learnpack/python@1.0.3 +RUN npm i @learnpack/learnpack@2.1.56 -g && learnpack plugins:install @learnpack/python@1.0.3 diff --git a/badge-python-bg.png b/.learn/assets/badge-python-bg.png similarity index 100% rename from badge-python-bg.png rename to .learn/assets/badge-python-bg.png diff --git a/preview.png b/.learn/assets/preview.png similarity index 100% rename from preview.png rename to .learn/assets/preview.png diff --git a/python-intro.gif b/.learn/assets/python-intro.gif similarity index 100% rename from python-intro.gif rename to .learn/assets/python-intro.gif diff --git a/.learn/assets/run-exercise.png b/.learn/assets/run-exercise.png new file mode 100644 index 00000000..eb50a61a Binary files /dev/null and b/.learn/assets/run-exercise.png differ diff --git a/README.es.md b/README.es.md index 5b2caf10..3172b5e7 100644 --- a/README.es.md +++ b/README.es.md @@ -1,7 +1,7 @@ # 馃悕 Tutorial y Ejercicios para Principiantes de Python -Por @alesanchezr y otros colaboradores en 4Geeks Academy +Por @alesanchezr y otros colaboradores en 4Geeks Academy Esta serie en particular es para principiantes de Python. Aprender谩s los siguientes conceptos: diff --git a/README.md b/README.md index 661b029b..ffbcfff7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - + # 馃悕 Python Beginner Tutorial and Exercises diff --git a/exercises/00-Welcome/README.es.md b/exercises/00-Welcome/README.es.md index 7b1b9591..5d1bf37a 100644 --- a/exercises/00-Welcome/README.es.md +++ b/exercises/00-Welcome/README.es.md @@ -1,4 +1,8 @@ -# Welcome to the Python Beginner Course! +--- +intro: "https://www.youtube.com/watch?v=IXNSwnN-YqM" +--- + +# Bienvenid@ al curso de Python para principiantes! 隆Estamos muy entusiasmados por tenerte aqu铆! 馃帀 馃槀 diff --git a/exercises/01-Console/README.es.md b/exercises/01-Console/README.es.md index 46371ece..22e276e0 100644 --- a/exercises/01-Console/README.es.md +++ b/exercises/01-Console/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=z6OnN4s__TU" +--- + # `01` Console En Python, usamos **print** para que el computador escriba cualquier cosa que queramos (el contenido de una variable, una string dado, etc.) en algo llamado "la consola". @@ -20,6 +24,6 @@ print("Un texto en la consola") + Recuerda, para ejecutar el c贸digo y ver el resultado en la consola, haz clic en el 铆cono de caja en la esquina superior izquierda de la pantalla: -![Bot贸n de compilar](https://i.imgur.com/w6u4aDd.png) +![Bot贸n de compilar](https://github.com/4GeeksAcademy/python-beginner-programming-exercises/blob/1d9d7f83b678411be8ff9efc3bad9dab4265d057/.learn/assets/run-exercise.png?raw=true) + Si茅ntete libre de intentar otras cosas tambi茅n. diff --git a/exercises/01-Console/README.md b/exercises/01-Console/README.md index 8ccdcda4..7250c5cf 100644 --- a/exercises/01-Console/README.md +++ b/exercises/01-Console/README.md @@ -25,6 +25,6 @@ print("How are you?") + Remember, to run the code and see the output on the console, click on the box icon in the top left of the screen: -![The compile button](https://i.imgur.com/w6u4aDd.png) +![The compile button](https://github.com/4GeeksAcademy/python-beginner-programming-exercises/blob/1d9d7f83b678411be8ff9efc3bad9dab4265d057/.learn/assets/run-exercise.png?raw=true) + Feel free to try other things as well. diff --git a/exercises/02-Declare-Variables/README.es.md b/exercises/02-Declare-Variables/README.es.md index eaacd6fa..5db277e6 100644 --- a/exercises/02-Declare-Variables/README.es.md +++ b/exercises/02-Declare-Variables/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=FeSo8xlnrTI" +--- + # `02` Declare Variables En la programaci贸n, usamos variables como si fueran cajas (o contenedores) para guardar diferentes tipos de informaci贸n. As铆 es c贸mo creamos una variable: @@ -10,12 +14,12 @@ En este ejemplo, `name` es la variable, actuando como una caja para almacenar el ## 馃摑 Instrucciones: -1. Declara una variable con el valor `"Yellow"` y luego impr铆melo en la consola. +1. Declara una variable llamada `name` con el valor `"Yellow"` y luego impr铆melo en la consola. 2. Luego, imprime su valor en la consola usando `print(name)`. ## 馃挕 Pistas: -+ Puedes darle el nombre que quieras a la variable, pero su valor tiene que ser el texto "Yellow". ++ El nombre de la variable debe ser `name` para pasar los tests y su valor tiene que ser el texto "Yellow". + Si necesitas m谩s explicaci贸n sobre qu茅 son los **strings** y c贸mo funcionan en Python, puedes ver este clip: https://www.youtube.com/watch?v=yT0jixU3M2c&ab_channel=ProgramaResuelto (`ctrl + click` en el enlace para abrir el video) diff --git a/exercises/02-Declare-Variables/README.md b/exercises/02-Declare-Variables/README.md index 55a5d4fb..53bd3c51 100644 --- a/exercises/02-Declare-Variables/README.md +++ b/exercises/02-Declare-Variables/README.md @@ -14,12 +14,12 @@ In this example, `name` is the variable, acting like a box to store the value `" ## 馃摑 Instructions: -1. Declare a new variable with the string value `"Yellow"` and print the value to the console. +1. Declare a new variable named `name` with the string value `"Yellow"` and print the value to the console. 2. Then, print its value on the console using `print(name)`. ## 馃挕 Hints: -+ The name of the variable can be whatever you want, but the value inside has to be the string "Yellow". ++ The variable's name must be `name` to pass the tests, and the value inside has to be the string "Yellow". + If you need further explanation on what **strings** are and how they work in Python, you can watch this clip: https://youtube.com/clip/UgkxyQ_JLmgSUL4l25c8Ly7cCRvk1Gm-EchU (`ctrl + click` on the link to open the video) diff --git a/exercises/03-Print-Variables-In-The-Console/README.es.md b/exercises/03-Print-Variables-In-The-Console/README.es.md index 12b5a6fd..fed43da0 100644 --- a/exercises/03-Print-Variables-In-The-Console/README.es.md +++ b/exercises/03-Print-Variables-In-The-Console/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=SM71mzjuvfA" +--- + # `03` Print more Variables in The Console Tambi茅n puedes imprimir m谩s de una variable en la misma funci贸n `print()` separando con una coma `,` las variables a imprimir. De esta manera: diff --git a/exercises/04-Multiply-Two-Values/README.es.md b/exercises/04-Multiply-Two-Values/README.es.md index a1f5dd5b..a80a49d4 100644 --- a/exercises/04-Multiply-Two-Values/README.es.md +++ b/exercises/04-Multiply-Two-Values/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=p4PY8s6asfw" +--- + # `04` Multiply Two Values Cualquier lenguaje de programaci贸n te permite realizar operaciones matem谩ticas b谩sicas como multiplicaci贸n, divisi贸n, etc. diff --git a/exercises/05-User-Inputed-Values/README.es.md b/exercises/05-User-Inputed-Values/README.es.md index ecbbf140..b3b5fb59 100644 --- a/exercises/05-User-Inputed-Values/README.es.md +++ b/exercises/05-User-Inputed-Values/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=pe_DEzC-528" +--- + # `05` User Inputed Values Otra cosa genial de las variables es que no necesitas saber su valor para poder trabajar con ellas. diff --git a/exercises/06-String-Concatenation/README.es.md b/exercises/06-String-Concatenation/README.es.md index 56b080d2..e7fcf43e 100644 --- a/exercises/06-String-Concatenation/README.es.md +++ b/exercises/06-String-Concatenation/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=4y8xYy273f4" +--- + # `06` String Concatenation La concatenaci贸n de strings es una tarea com煤n en la programaci贸n que implica combinar o unir dos o m谩s strings. diff --git a/exercises/07-Create-a-Basic-HTML/README.es.md b/exercises/07-Create-a-Basic-HTML/README.es.md index 0abe48b4..13fe96e8 100644 --- a/exercises/07-Create-a-Basic-HTML/README.es.md +++ b/exercises/07-Create-a-Basic-HTML/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=zbTM_T6an4k" +--- + # `07` Create a Basic HTML Continuemos concatenando strings para generar un documento HTML b谩sico... diff --git a/exercises/08.1-Your-First-If/README.es.md b/exercises/08.1-Your-First-If/README.es.md index b7ea9ac6..53295eda 100644 --- a/exercises/08.1-Your-First-If/README.es.md +++ b/exercises/08.1-Your-First-If/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=n5skqOQfQ84" +--- + # `08.1` Your First If... La aplicaci贸n actual est谩 preguntando cu谩nto dinero tiene el usuario. Una vez el usuario ingresa la cantidad, debemos 'imprimir' usando **print** una de las siguientes respuestas: diff --git a/exercises/08.2-How-Much-The-Wedding-Costs/README.es.md b/exercises/08.2-How-Much-The-Wedding-Costs/README.es.md index 37b763c1..5658a3c0 100644 --- a/exercises/08.2-How-Much-The-Wedding-Costs/README.es.md +++ b/exercises/08.2-How-Much-The-Wedding-Costs/README.es.md @@ -1,3 +1,8 @@ +--- +tutorial: "https://www.youtube.com/watch?v=z3_0x8MlpFs" +--- + + # `08.2` How Much The Wedding Costs (if...else) Aqu铆 tenemos una tabla de precios de una compa帽铆a de catering de bodas: diff --git a/exercises/09-Random-Numbers/README.es.md b/exercises/09-Random-Numbers/README.es.md index b77ad09e..39fca4cd 100644 --- a/exercises/09-Random-Numbers/README.es.md +++ b/exercises/09-Random-Numbers/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=9IjotW64sxA" +--- + # `09` Random Numbers Puedes usar la funci贸n `randint()` para obtener un n煤mero entero aleatorio. `randint()` es una funci贸n interna del m贸dulo `random` en Python3. diff --git a/exercises/10-Calling-Your-First-Function/README.es.md b/exercises/10-Calling-Your-First-Function/README.es.md index 29bc48a1..c9627071 100644 --- a/exercises/10-Calling-Your-First-Function/README.es.md +++ b/exercises/10-Calling-Your-First-Function/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=0Jxyc4eClNA" +--- + # `10` Calling Your First Function Las funciones son incre铆bles por muchas cosas, pero principalmente porque puedes encapsular tu c贸digo en piezas y reusar esas piezas muchas veces sin tener que escribir todo el c贸digo cada vez. diff --git a/exercises/10.1-Creating-Your-First-Function/README.es.md b/exercises/10.1-Creating-Your-First-Function/README.es.md index 978f547f..47665d11 100644 --- a/exercises/10.1-Creating-Your-First-Function/README.es.md +++ b/exercises/10.1-Creating-Your-First-Function/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=ePn8AzCG57Y" +--- + # `10.1` Creating Your First Function ## 馃摑 Instrucciones: diff --git a/exercises/11-Create-A-New-Function/README.es.md b/exercises/11-Create-A-New-Function/README.es.md index 05923095..affe02e8 100644 --- a/exercises/11-Create-A-New-Function/README.es.md +++ b/exercises/11-Create-A-New-Function/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=6LhV15O9kvQ" +--- + # `11` Create a New Function Como sabes, las funciones son un bloque de c贸digo 煤til que puedes reusar tantas veces como necesites. diff --git a/exercises/11-Create-A-New-Function/test.py b/exercises/11-Create-A-New-Function/test.py index 2872531b..964a103a 100644 --- a/exercises/11-Create-A-New-Function/test.py +++ b/exercises/11-Create-A-New-Function/test.py @@ -7,21 +7,25 @@ import mock path = os.path.dirname(os.path.abspath(__file__))+'/app.py' + @pytest.mark.it('The function generate_random should exist') def test_function_exists(): try: from app import generate_random except ImportError: - raise ImportError("The function 'generate_random' should exist on app.py") + raise ImportError( + "The function 'generate_random' should exist on app.py") + @pytest.mark.it("The function 'generate_random' should return a random number between 0 and 9") def test_for_return(): from app import generate_random result = generate_random() assert result is not None - for x in range(0,20): + for x in range(0, 20): result = generate_random() - assert result <= 9 and result >= 0 + assert result <= 9 and result >= 0 + @pytest.mark.it('Use the function randinit() or randrange()') def test_for_type_random(): @@ -29,12 +33,16 @@ def test_for_type_random(): content = content_file.read() regex = re.compile(r"random.randint\s*\(") regex2 = re.compile(r"random.randrange\s*\(") - assert bool(regex.search(content)) == True or bool(regex2.search(content)) == True + assert bool(regex.search(content)) == True or bool( + regex2.search(content)) == True + @pytest.mark.it('You should print() the output of the function') def test_function_called_for(): - - with open(path, 'r') as content_file: - content = content_file.read() - regex = re.compile(r"print\s*\(\s*generate_random\s*\(\s*\)\s*\)") - assert bool(regex.search(content)) == True + captured_output = io.StringIO() + sys.stdout = captured_output + app.generate_random() + sys.stdout = sys.__stdout__ + output = captured_output.getvalue() + regex = re.compile(r"\d{0,9}") + assert bool(regex.search(output)) == True diff --git a/exercises/12-Rand-From-One-to-Twelve/README.es.md b/exercises/12-Rand-From-One-to-Twelve/README.es.md index 995d8094..320f6776 100644 --- a/exercises/12-Rand-From-One-to-Twelve/README.es.md +++ b/exercises/12-Rand-From-One-to-Twelve/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=tqZIlc1gVi8" +--- + # `12` Rand From One to Twelve ## 馃摑 Instrucciones: diff --git a/exercises/13-Your-First-Loop/README.es.md b/exercises/13-Your-First-Loop/README.es.md index 5749d0bd..5cc23101 100644 --- a/exercises/13-Your-First-Loop/README.es.md +++ b/exercises/13-Your-First-Loop/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=0-vljraNvwE" +--- + # `13` Your First Loop ## 馃摑 Instrucciones: diff --git a/exercises/14-Create-A-For-Loop/README.es.md b/exercises/14-Create-A-For-Loop/README.es.md index 4dce8fc3..a7c29fd8 100644 --- a/exercises/14-Create-A-For-Loop/README.es.md +++ b/exercises/14-Create-A-For-Loop/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=ckSAqxzi5vs" +--- + # `14` Create A For Loop Los bucles o loops son muy 煤tiles. No tienes que reescribir las mismas l铆neas muchas veces. diff --git a/exercises/15-Looping-With-FizzBuzz/README.es.md b/exercises/15-Looping-With-FizzBuzz/README.es.md index fbaa200d..a64bd0fe 100644 --- a/exercises/15-Looping-With-FizzBuzz/README.es.md +++ b/exercises/15-Looping-With-FizzBuzz/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=VkAccivrOPM" +--- + # `15` Looping With FizzBuzz Esta es una t铆pica prueba de principiante que es exigida para las entrevistas en Google, Facebook y las dem谩s grandes compa帽铆as de tecnolog铆a. diff --git a/exercises/16-Random-Colors-Loop/README.es.md b/exercises/16-Random-Colors-Loop/README.es.md index 493f0c12..85106922 100644 --- a/exercises/16-Random-Colors-Loop/README.es.md +++ b/exercises/16-Random-Colors-Loop/README.es.md @@ -1,3 +1,8 @@ +--- +tutorial: "https://www.youtube.com/watch?v=jYK2i0_dtns" +--- + + # `16` Random Colors (Loop) Hemos creado una funci贸n que devuelve un color basado en un n煤mero entre 0 y 3 (cualquier otro n煤mero retornar谩 el color `black`). diff --git a/exercises/17-Russian-Roulette/README.es.md b/exercises/17-Russian-Roulette/README.es.md index 25da2194..54e19d2c 100644 --- a/exercises/17-Russian-Roulette/README.es.md +++ b/exercises/17-Russian-Roulette/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=KqO8ebdqs5I" +--- + # `17` Russian Roulette 驴Has jugado a la ruleta rusa? 隆Es muy divertido! Si no pierdes... (隆隆隆muuuajajajaja!!!). diff --git a/exercises/18-The-Beatles/README.es.md b/exercises/18-The-Beatles/README.es.md index d0fa4cf3..e1aee34c 100644 --- a/exercises/18-The-Beatles/README.es.md +++ b/exercises/18-The-Beatles/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=0Y2mHwwQBGE" +--- + # `18` The Beatles 驴A qui茅n no le gusta The Beatles? diff --git a/exercises/18-The-Beatles/solution.hide.py b/exercises/18-The-Beatles/solution.hide.py index 49901bf0..c907bc03 100644 --- a/exercises/18-The-Beatles/solution.hide.py +++ b/exercises/18-The-Beatles/solution.hide.py @@ -1,12 +1,13 @@ # 鉁呪啌 Write your code here 鈫撯渽 def sing(): + song = "" for i in range(11): if i == 4: - print("there will be an answer,") + song += "there will be an answer,\n" elif i == 10: - print("whisper words of wisdom, let it be") + song += "whisper words of wisdom, let it be" else: - print("let it be,") - return None + song += "let it be,\n" + return song sing() diff --git a/exercises/19-Bottles-Of-Milk/README.es.md b/exercises/19-Bottles-Of-Milk/README.es.md index 3df3fb1e..155e476e 100644 --- a/exercises/19-Bottles-Of-Milk/README.es.md +++ b/exercises/19-Bottles-Of-Milk/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=iLH9Hg4PAmw" +--- + # `19` Bottles Of Milk 驴Has escuchado la canci贸n sobre las 99 botellas de leche? Es una gran canci贸n, para nada aburrida... diff --git a/learn.json b/learn.json index e2aaf2ef..0d3eb8f8 100644 --- a/learn.json +++ b/learn.json @@ -1,26 +1,36 @@ + { - "slug": "python-beginner-programming-exercises", - "title": { - "us": "Learn Python Interactively (beginner)", - "es": "Aprende Python Interactivamente (Principiante)" - }, - "intro": "https://www.youtube.com/watch?v=amyDNhZwGJQ", - "repository": "https://github.com/4GeeksAcademy/python-beginner-programming-exercises", - "preview": "https://github.com/4GeeksAcademy/python-beginner-programming-exercises/blob/master/preview.png?raw=true", - "description": { - "us": "Python Exercises for beginners, from Hello World to variables, loops and a little bit of functions.", - "es": "Ejercicios de Python para principiantos, desde Hello World hasta variables, ciclos y un poco de funciones." - }, - "duration": 10, - "difficulty": "easy", - "videoSolutions": true, - "projectType": "tutorial", - "bugsLink": "https://github.com/learnpack/learnpack/issues/new", - "graded": true, - "language": "python3", - - "editor": { - "version": "3.1.24" - } - +"slug": "python-beginner-programming-exercises", +"title": { + "us": "Learn Python Interactively (beginner)", + "es": "Aprende Python Interactivamente (Principiante)" +}, +"intro": "https://www.youtube.com/watch?v=amyDNhZwGJQ", +"repository": "https://github.com/4GeeksAcademy/python-beginner-programming-exercises", +"preview": "https://github.com/4GeeksAcademy/python-beginner-programming-exercises/blob/master/.learn/assets/preview.png?raw=true", +"description": { + "us": "Python exercises for beginners, starting from the basics like `Hello World` to more advanced concepts like variables, loops, functions, and data structures. These hands-on challenges guide you step by step through Python programming, offering interactive and auto-graded lessons to build a solid foundation.", + "es": "Ejercicios de Python para principiantes, comenzando desde lo b谩sico como `Hola Mundo` hasta conceptos m谩s avanzados como variables, bucles, funciones y estructuras de datos. Estos desaf铆os pr谩cticos te gu铆an paso a paso en la programaci贸n con Python, ofreciendo lecciones interactivas y autoevaluadas para construir una base s贸lida." +}, +"duration": 10, +"difficulty": "easy", +"videoSolutions": true, +"projectType": "tutorial", +"bugsLink": "https://github.com/learnpack/learnpack/issues/new", +"graded": true, +"technologies": ["strings", "python-functions", "conditionals", "variables", "condicionales", "funciones-de-python"], +"editor": { + "version": "5.0" +}, +"telemetry": { + "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry?asset_id=145" +}, +"video": { + "intro": { + "es": "https://www.youtube.com/watch?v=IXNSwnN-YqM", + "en": "https://www.youtube.com/watch?v=amyDNhZwGJQ" + } +} + + } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy