Instrucciones generales
El Objetivo de este proyecto Desarrollar habilidades
del uso del CAS de Python SymPy para resolver problemas
de calculo en el curso de matemática básica 2.
Entregable
Un breve informe en formato PDF y enlace con un
vídeo de 5 minutos máximo explicando los resultados de su proyecto.El
PDF debe incluir:
- Caratula en la primera hoja con tus datos personales
- Enunciado de cada problema
- Código de Python con la solución de cada
inciso
- Capturas de pantalla con gráficas si se solicita
- Comentarios y Ecuaciones.
entrega tu proyecto utilizando el nombre
Proyecto_Taller_Apellido_Nombre_carnet.pdf
Criterios de evaluación
- Modelos y cálculos correctos : 40 pts
- código de Python comentado : 30 pts
- Interpretación y comunicación (explicaciones, conclusiones):
20 pts
- Presentación (orden, formato solicitado): 10
pts
Recomendación:
- Trabaja en gogle colab con Python
- Utiliza celdas de texto y código en tu cuaderno colab
- Para las ecuaciones o expresiones utiliza código latex
- Imprime tu documento como PDF y Agrega la caratula
- Carga los módulos SymPy y NumPy
- Declara variables simbólicas y constantes
- Deja todo el código comentado utilizado “#”
PROBLEMA 1
Una sala de cine tiene una pantalla que está colocada a 3 m del suelo
y tiene 10 m de altura. La primera fila de asientos está ubicada a 3
metros de la pantalla, y las filas están separadas 1 metro. El piso de
la zona de asientos está inclinado un ángulo de α = 20° arriba de la
horizontal, y la distancia inclinada hasta donde usted está sentado es
x. La sala tiene 21 filas de asientos, de modo que 0 ≤ x ≤ 20. Suponga
que decide que el mejor lugar para sentarse es la fila donde el ángulo θ
que subtiende la pantalla a sus ojos es un máximo. Suponga también que
sus ojos están 1.2 m arriba del piso, como se muestra en la figura.
Auditorio
1 Verificación de la fórmula
Explica por qué :
\[
\theta = \arccos\left(\frac{a^2+b^2-100}{2ab}\right)
\]
donde
\[
a = \sqrt{(3+x\cos \alpha)^2+(11.8-x\sin\alpha)^2}, \quad
b = \sqrt{(3+x\cos \alpha)^2+(1.8-x\sin\alpha)^2}
\]
Sugerencia en Python/SymPy:
- calcula las distancias b y a desde los ojos hacia el borde inferior y
superior de la pantalla.
- con estas distancias utiliza de la Ley de Cosenos.
from sympy import *
# Sugerencia: define x, alpha, a, b
2 Gráfica de \(\theta(x)\)
y estimación del máximo
Utilice un gráfico de \(\theta\)
como función de \(x\) para estimar el
valor que maximiza \(\theta\).
¿En qué fila debe sentarse? ¿Cuál es el ángulo de visión en esta fila?
(use \(\alpha = 20^\circ\)).
Sugerencia en Python/SymPy:
- Sustituye \(\alpha = 20
\pi/180\).
- usa una expresión simbolica para \(\theta(x)\) - Grafica \(\theta(x)\) en el intervalo [0,20].
- obtén una tabla de valores de \(\theta(x)\) para diferentes valores de x
puedes obtener la tabla utilizando listas por compresión sustituyendo
valores de x en el intervalo de [0,20]
# Sugerencia: sustituir alpha por su valor en radianes
# Crear función numérica de theta(x) y graficar con plot()
3 Derivada de \(\theta(x)\)
y comparación
Deriva simbólicamente \(\theta(x)\)
y encuentre un valor numérico para la raíz de la ecuación \(\theta'(x)=0\).
¿Este valor confirma su resultado del inciso (2)?
Sugerencia en Python/SymPy:
- Calcula la derivada con diff
.
- Usa nsolve
para resolver \(\theta'(x)=0\) dentro del intervalo
[0,20].
- Evalúa la segunda derivada para confirmar si es un máximo.
# Sugerencia: diff(theta_expr, x)
# Resolver con nsolve(theta'(x), valor_inicial)
4 Valor promedio de \(\theta\)
Use la gráfica de \(\theta\) para
estimar el valor promedio de \(\theta\)
en el intervalo [0,20].
Luego, use integración para calcular el valor promedio de forma más
precisa.
Sugerencia en Python/SymPy:
- Define \(L = 20\).
- Calcula \(\frac{1}{L}\int_0^{L}\theta(x)
dx\).
- Si la integral simbólica es complicada, aproxima con integración
numérica (quad
de mpmath).
#import mpmath as mp
#Define una función lambda para evaluar numéricamente theta
# utiliza quad() para calcular la integral y el valor promedio.
PROBLEMA 2
Se obtiene un modelo para la forma de un huevo de un ave mediante el
giro, respecto al eje x, de la región bajo la gráfica de
\[
f(x) = (ax^{3} + bx^{2} + cx + d)\sqrt{1 - x^{2}}
\] \[
\text{Utilice: } a=-0.06,\; b=0.0411,\; c=0.1,\; d=0.45
\] y la formula.
\[
volumen = \int_{l_i}^{l_s} \pi \, f(x)^{2}\, dx
\] Realiza lo siguiente.
1. Definir los parámetros y la función
- Usar los valores \(a=-0.06, b=0.0411,
c=0.1, d=0.45\).
- Plantear \(f(x) =
(ax^3+bx^2+cx+d)\sqrt{1-x^2}\).
2. Visualizar la función
- Graficar \(f(x)\) en el intervalo
\([-1,1]\).
- Verificar que la curva se asemeje a la forma de un huevo y observar
dónde la función es positiva.
3. Elegir los límites de integración
- Usar \([-1,1]\) o restringir a la
parte positiva de la función si se desea un sólido cerrado.
4. Plantear la integral de volumen
- La fórmula es
\[
V = \pi \int_{l_i}^{l_s} f(x)^2\,dx
\]
- Recordar que \(f(x)^2 =
(ax^3+bx^2+cx+d)^2(1-x^2)\), lo que simplifica la raíz.
5. Calcular el volumen
- Resolver la integral de forma simbólica (con SymPy).
- Si es muy complicada, calcularla de manera numérica.
6. Comparar métodos
- Revisar el resultado simbólico frente al numérico para confirmar
consistencia.
7. Interpretar el resultado
- Reportar el valor del volumen con 3–4 decimales.
- Explicar qué límites se usaron y por qué.
- Adjuntar la gráfica de \(f(x)\)
junto con el volumen calculado.
PROBLEMA 3
En este problema vas a calcular volúmenes que se generan al hacer
girar la región bajo la curva y=3sin(x) desde x=0.9 hasta \(x=\pi\)
Para ello utilizaras el método de capas cilíndricas completando el
siguiente código.
from sympy import *
x=symbols('x')
A='--' # Amplitud de la función
f=A*sin(x) # Función a rotar
b='--' # Eje de rotación x=b
r1=x # Radio desde rotación eje y
r2='--' # Radio de rotación desde x=b
expr1=2*pi*f*r1 # Expresión para cálculo de volumen 1
expr2='--' # Expresión para cálculo de volumen 2
v1=integrate('--',(x,'--')).n(5) # Volumen 1
v2=integrate(expr2,(x,'--')).n(5) # Volumen 2
print(v1,v2) # Impresión de resultados
- Calcula el volumen al hacer girar la región alrededor del eje y
- Encuentra el volumen al hacer girar la región alrededor de
x=b=0.4
Contenido
- Código en Python (Colab o Jupyter) con todos los cálculos.
- Gráficas y resultados numéricos.
- Breve explicación de cada paso.
LS0tDQp0aXRsZTogIlByb3llY3RvIFRhbGxlciBNYXRlbcOhdGljYSBCw6FzaWNhIDIiDQphdXRob3I6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW1hdGljYSBGSVVTQUMiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZC8lbS8lWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogdW5pdGVkDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCmZvbnRzaXplOiAxM3B0DQpnZW9tZXRyeTogbWFyZ2luPTIuMmNtDQpsYW5nOiBlcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KCWVjaG8gPSBUUlVFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCgl3YXJuaW5nID0gRkFMU0UsDQoJZXZhbCA9IEZBTFNFDQopDQpgYGANCg0KDQoNCiMgKipJbnN0cnVjY2lvbmVzIGdlbmVyYWxlcyoqDQoNCkVsICoqT2JqZXRpdm8qKiAgZGUgZXN0ZSBwcm95ZWN0byBEZXNhcnJvbGxhciBoYWJpbGlkYWRlcyBkZWwgdXNvIGRlbCBDQVMgZGUgKipQeXRob24gIFN5bVB5KiogcGFyYSByZXNvbHZlciBwcm9ibGVtYXMgZGUgY2FsY3VsbyAgZW4gZWwgY3Vyc28gZGUgbWF0ZW3DoXRpY2EgYsOhc2ljYSAyLg0KDQojIyAqKkVudHJlZ2FibGUqKg0KDQpVbiBicmV2ZSAqKmluZm9ybWUqKiBlbiBmb3JtYXRvIFBERiB5IGVubGFjZSBjb24gdW4gdsOtZGVvICBkZSA1IG1pbnV0b3MgbcOheGltbyBleHBsaWNhbmRvIGxvcyByZXN1bHRhZG9zIGRlIHN1IHByb3llY3RvLkVsIFBERiBkZWJlIGluY2x1aXI6DQoNCiogQ2FyYXR1bGEgZW4gbGEgcHJpbWVyYSBob2phIGNvbiB0dXMgZGF0b3MgcGVyc29uYWxlcw0KKiBFbnVuY2lhZG8gZGUgY2FkYSBwcm9ibGVtYQ0KKiBDw7NkaWdvIGRlICoqUHl0aG9uKiogY29uIGxhIHNvbHVjacOzbiBkZSBjYWRhIGluY2lzbyAgIA0KKiBDYXB0dXJhcyAgZGUgcGFudGFsbGEgY29uIGdyw6FmaWNhcyBzaSBzZSBzb2xpY2l0YQ0KKiBDb21lbnRhcmlvcyB5IEVjdWFjaW9uZXMuIA0KDQplbnRyZWdhIHR1ICBwcm95ZWN0byB1dGlsaXphbmRvIGVsIG5vbWJyZSAgYFByb3llY3RvX1RhbGxlcl9BcGVsbGlkb19Ob21icmVfY2FybmV0LnBkZmANCg0KIyMgKipDcml0ZXJpb3MgZGUgZXZhbHVhY2nDs24qKg0KDQotIE1vZGVsb3MgeSBjw6FsY3Vsb3MgY29ycmVjdG9zIDogKio0MCBwdHMqKiAgDQotIGPDs2RpZ28gZGUgUHl0aG9uIGNvbWVudGFkbyA6ICAqKjMwIHB0cyoqDQotIEludGVycHJldGFjacOzbiB5IGNvbXVuaWNhY2nDs24gKGV4cGxpY2FjaW9uZXMsIGNvbmNsdXNpb25lcyk6ICoqMjAgcHRzKiogIA0KLSBQcmVzZW50YWNpw7NuIChvcmRlbiwgZm9ybWF0byBzb2xpY2l0YWRvKTogKioxMCBwdHMqKg0KDQojIyAqKlJlY29tZW5kYWNpw7NuOioqIA0KDQoqIFRyYWJhamEgZW4gKipnb2dsZSBjb2xhYiBjb24gUHl0aG9uKioNCiogVXRpbGl6YSBjZWxkYXMgZGUgdGV4dG8geSBjw7NkaWdvIGVuIHR1IGN1YWRlcm5vIGNvbGFiDQoqIFBhcmEgbGFzIGVjdWFjaW9uZXMgbyBleHByZXNpb25lcyB1dGlsaXphIGPDs2RpZ28gbGF0ZXggDQoqIEltcHJpbWUgdHUgZG9jdW1lbnRvIGNvbW8gUERGIHkgQWdyZWdhIGxhIGNhcmF0dWxhDQoqIENhcmdhIGxvcyBtw7NkdWxvcyAqKlN5bVB5IHkgTnVtUHkqKg0KKiBEZWNsYXJhIHZhcmlhYmxlcyBzaW1iw7NsaWNhcyB5IGNvbnN0YW50ZXMNCiogRGVqYSB0b2RvIGVsIGPDs2RpZ28gY29tZW50YWRvIHV0aWxpemFkbyAqKiIjIioqIA0KDQoNCiMgKipQUk9CTEVNQSAxKioNCg0KVW5hIHNhbGEgZGUgY2luZSB0aWVuZSB1bmEgcGFudGFsbGEgcXVlIGVzdMOhIGNvbG9jYWRhIGEgMyBtIGRlbCBzdWVsbyB5IHRpZW5lIDEwIG0gZGUgYWx0dXJhLg0KTGEgcHJpbWVyYSBmaWxhIGRlIGFzaWVudG9zIGVzdMOhIHViaWNhZGEgYSAzIG1ldHJvcyBkZSBsYSBwYW50YWxsYSwgeSBsYXMgZmlsYXMgZXN0w6FuIHNlcGFyYWRhcyAxIG1ldHJvLiBFbCBwaXNvIGRlIGxhIHpvbmEgZGUgYXNpZW50b3MgZXN0w6EgaW5jbGluYWRvIHVuIMOhbmd1bG8gZGUgzrEgPSAyMMKwIGFycmliYSBkZSBsYSBob3Jpem9udGFsLCB5IGxhIGRpc3RhbmNpYSBpbmNsaW5hZGEgaGFzdGEgZG9uZGUgdXN0ZWQgZXN0w6Egc2VudGFkbyBlcyB4LiBMYSBzYWxhIHRpZW5lIDIxIGZpbGFzIGRlIGFzaWVudG9zLCBkZSBtb2RvIHF1ZSAwIOKJpCB4IOKJpCAyMC4gU3Vwb25nYSBxdWUgZGVjaWRlIHF1ZSBlbCBtZWpvciBsdWdhciBwYXJhIHNlbnRhcnNlIGVzIGxhIGZpbGEgZG9uZGUgZWwgw6FuZ3VsbyDOuCBxdWUgc3VidGllbmRlIGxhIHBhbnRhbGxhIGEgc3VzIG9qb3MgZXMgdW4gbcOheGltby4gU3Vwb25nYSB0YW1iacOpbiBxdWUgc3VzIG9qb3MgZXN0w6FuIDEuMiBtIGFycmliYSBkZWwgcGlzbywgY29tbyBzZSBtdWVzdHJhIGVuIGxhIGZpZ3VyYS4NCg0KIVtBdWRpdG9yaW9dKGF1ZGl0b3Jpb19tZWpvcmFkYV9ncmlzXzJ4LnBuZyl7d2lkdGg9NjAlfQ0KDQojIyMgKioxIFZlcmlmaWNhY2nDs24gIGRlIGxhIGbDs3JtdWxhKioNCg0KRXhwbGljYSBwb3IgcXXDqSA6DQoNCiQkDQpcdGhldGEgPSBcYXJjY29zXGxlZnQoXGZyYWN7YV4yK2JeMi0xMDB9ezJhYn1ccmlnaHQpDQokJA0KDQpkb25kZSAgDQoNCiQkDQphID0gXHNxcnR7KDMreFxjb3MgXGFscGhhKV4yKygxMS44LXhcc2luXGFscGhhKV4yfSwgXHF1YWQNCmIgPSBcc3FydHsoMyt4XGNvcyBcYWxwaGEpXjIrKDEuOC14XHNpblxhbHBoYSleMn0NCiQkDQoNCioqU3VnZXJlbmNpYSBlbiBQeXRob24vU3ltUHk6KiogIA0KLSBjYWxjdWxhIGxhcyBkaXN0YW5jaWFzIGIgeSBhICBkZXNkZSBsb3Mgb2pvcyBoYWNpYSBlbCBib3JkZSBpbmZlcmlvciB5IHN1cGVyaW9yIGRlIGxhIHBhbnRhbGxhLiAgDQotIGNvbiBlc3RhcyBkaXN0YW5jaWFzIHV0aWxpemEgICAgZGUgbGEgTGV5IGRlIENvc2Vub3MuICANCg0KYGBge3B5dGhvbiBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpmcm9tIHN5bXB5IGltcG9ydCAqDQoNCiMgU3VnZXJlbmNpYTogZGVmaW5lIHgsIGFscGhhLCBhLCBiIA0KYGBgDQoNCg0KDQoNCiMjIyAqKjIgR3LDoWZpY2EgZGUgXChcdGhldGEoeClcKSB5IGVzdGltYWNpw7NuIGRlbCBtw6F4aW1vKioNCg0KVXRpbGljZSB1biBncsOhZmljbyBkZSBcKFx0aGV0YVwpIGNvbW8gZnVuY2nDs24gZGUgXCh4XCkgcGFyYSBlc3RpbWFyIGVsIHZhbG9yIHF1ZSBtYXhpbWl6YSBcKFx0aGV0YVwpLiAgDQrCv0VuIHF1w6kgZmlsYSBkZWJlIHNlbnRhcnNlPyDCv0N1w6FsIGVzIGVsIMOhbmd1bG8gZGUgdmlzacOzbiBlbiBlc3RhIGZpbGE/ICh1c2UgXChcYWxwaGEgPSAyMF5cY2lyY1wpKS4gIA0KDQoNCioqU3VnZXJlbmNpYSBlbiBQeXRob24vU3ltUHk6KiogIA0KLSBTdXN0aXR1eWUgXChcYWxwaGEgPSAyMCBccGkvMTgwXCkuICANCi0gdXNhIHVuYSBleHByZXNpw7NuIHNpbWJvbGljYSBwYXJhIFwoXHRoZXRhKHgpXCkgDQotIEdyYWZpY2EgXChcdGhldGEoeClcKSBlbiBlbCBpbnRlcnZhbG8gWzAsMjBdLiAgDQotIG9idMOpbiB1bmEgdGFibGEgZGUgdmFsb3JlcyAgZGUgXChcdGhldGEoeClcKSBwYXJhIGRpZmVyZW50ZXMgdmFsb3JlcyBkZSB4IHB1ZWRlcyBvYnRlbmVyIGxhIHRhYmxhIHV0aWxpemFuZG8gbGlzdGFzIHBvciBjb21wcmVzacOzbiAgc3VzdGl0dXllbmRvICB2YWxvcmVzIGRlICB4IGVuIGVsIGludGVydmFsbyBkZSBbMCwyMF0NCg0KYGBge3B5dGhvbn0NCiMgU3VnZXJlbmNpYTogc3VzdGl0dWlyIGFscGhhIHBvciBzdSB2YWxvciBlbiByYWRpYW5lcw0KIyBDcmVhciBmdW5jacOzbiBudW3DqXJpY2EgZGUgdGhldGEoeCkgeSBncmFmaWNhciBjb24gcGxvdCgpDQpgYGANCg0KDQojIyMgKiozIERlcml2YWRhIGRlIFwoXHRoZXRhKHgpXCkgeSBjb21wYXJhY2nDs24qKg0KDQpEZXJpdmEgc2ltYsOzbGljYW1lbnRlIFwoXHRoZXRhKHgpXCkgeSBlbmN1ZW50cmUgdW4gdmFsb3IgbnVtw6lyaWNvIHBhcmEgbGEgcmHDrXogZGUgbGEgZWN1YWNpw7NuIFwoXHRoZXRhJyh4KT0wXCkuICANCsK/RXN0ZSB2YWxvciBjb25maXJtYSBzdSByZXN1bHRhZG8gZGVsIGluY2lzbyAoMik/ICANCg0KKipTdWdlcmVuY2lhIGVuIFB5dGhvbi9TeW1QeToqKiAgDQotIENhbGN1bGEgbGEgZGVyaXZhZGEgY29uIGBkaWZmYC4gIA0KLSBVc2EgYG5zb2x2ZWAgcGFyYSByZXNvbHZlciBcKFx0aGV0YScoeCk9MFwpIGRlbnRybyBkZWwgaW50ZXJ2YWxvIFswLDIwXS4gIA0KLSBFdmFsw7phIGxhIHNlZ3VuZGEgZGVyaXZhZGEgcGFyYSBjb25maXJtYXIgc2kgZXMgdW4gbcOheGltby4gIA0KDQpgYGB7cHl0aG9ufQ0KIyBTdWdlcmVuY2lhOiBkaWZmKHRoZXRhX2V4cHIsIHgpDQojIFJlc29sdmVyIGNvbiBuc29sdmUodGhldGEnKHgpLCB2YWxvcl9pbmljaWFsKQ0KYGBgDQoNCg0KDQojIyMgKio0IFZhbG9yIHByb21lZGlvIGRlIFwoXHRoZXRhXCkqKg0KDQpVc2UgbGEgZ3LDoWZpY2EgZGUgXChcdGhldGFcKSBwYXJhIGVzdGltYXIgZWwgdmFsb3IgcHJvbWVkaW8gZGUgXChcdGhldGFcKSBlbiBlbCBpbnRlcnZhbG8gWzAsMjBdLiAgDQpMdWVnbywgdXNlIGludGVncmFjacOzbiBwYXJhIGNhbGN1bGFyIGVsIHZhbG9yIHByb21lZGlvIGRlIGZvcm1hIG3DoXMgcHJlY2lzYS4gIA0KDQoqKlN1Z2VyZW5jaWEgZW4gUHl0aG9uL1N5bVB5OioqICANCi0gRGVmaW5lIFwoTCA9IDIwXCkuICANCi0gQ2FsY3VsYSBcKFxmcmFjezF9e0x9XGludF8wXntMfVx0aGV0YSh4KSBkeFwpLiAgDQotIFNpIGxhIGludGVncmFsIHNpbWLDs2xpY2EgZXMgY29tcGxpY2FkYSwgYXByb3hpbWEgY29uIGludGVncmFjacOzbiBudW3DqXJpY2EgKGBxdWFkYCBkZSBtcG1hdGgpLiAgDQoNCmBgYHtweXRob259DQojaW1wb3J0IG1wbWF0aCBhcyBtcA0KI0RlZmluZSAgIHVuYSBmdW5jacOzbiBsYW1iZGEgIHBhcmEgZXZhbHVhciBudW3DqXJpY2FtZW50ZSAgdGhldGEgDQojIHV0aWxpemEgcXVhZCgpIHBhcmEgIGNhbGN1bGFyICBsYSBpbnRlZ3JhbCB5IGVsIHZhbG9yIHByb21lZGlvLg0KYGBgDQoNCiMgKipQUk9CTEVNQSAyKioNCg0KU2Ugb2J0aWVuZSB1biBtb2RlbG8gcGFyYSBsYSBmb3JtYSBkZSB1biBodWV2byBkZSB1biBhdmUgbWVkaWFudGUgZWwgZ2lybywgcmVzcGVjdG8gYWwgZWplIHgsIGRlIGxhIHJlZ2nDs24gYmFqbyBsYSBncsOhZmljYSBkZQ0KDQokJA0KZih4KSA9IChheF57M30gKyBieF57Mn0gKyBjeCArIGQpXHNxcnR7MSAtIHheezJ9fQ0KJCQNCiQkDQpcdGV4dHtVdGlsaWNlOiB9IGE9LTAuMDYsXDsgYj0wLjA0MTEsXDsgYz0wLjEsXDsgZD0wLjQ1DQokJA0KeSBsYSBmb3JtdWxhLiAgDQoNCiQkDQp2b2x1bWVuID0gXGludF97bF9pfV57bF9zfSBccGkgXCwgZih4KV57Mn1cLCBkeA0KJCQNClJlYWxpemEgbG8gc2lndWllbnRlLg0KDQoNCg0KDQojIyMgMS4gKipEZWZpbmlyIGxvcyBwYXLDoW1ldHJvcyB5IGxhIGZ1bmNpw7NuKiogIA0KICAgLSBVc2FyIGxvcyB2YWxvcmVzIFwoYT0tMC4wNiwgYj0wLjA0MTEsIGM9MC4xLCBkPTAuNDVcKS4gIA0KICAgLSBQbGFudGVhciBcKGYoeCkgPSAoYXheMytieF4yK2N4K2QpXHNxcnR7MS14XjJ9XCkuICANCg0KIyMjIDIuICoqVmlzdWFsaXphciBsYSBmdW5jacOzbioqICANCiAgIC0gR3JhZmljYXIgXChmKHgpXCkgZW4gZWwgaW50ZXJ2YWxvIFwoWy0xLDFdXCkuICANCiAgIC0gVmVyaWZpY2FyIHF1ZSBsYSBjdXJ2YSBzZSBhc2VtZWplIGEgbGEgZm9ybWEgZGUgdW4gaHVldm8geSBvYnNlcnZhciBkw7NuZGUgbGEgZnVuY2nDs24gZXMgcG9zaXRpdmEuICANCg0KIyMjIDMuICoqRWxlZ2lyIGxvcyBsw61taXRlcyBkZSBpbnRlZ3JhY2nDs24qKiAgDQogICAtIFVzYXIgXChbLTEsMV1cKSBvIHJlc3RyaW5naXIgYSBsYSBwYXJ0ZSBwb3NpdGl2YSBkZSBsYSBmdW5jacOzbiBzaSBzZSBkZXNlYSB1biBzw7NsaWRvIGNlcnJhZG8uICANCg0KIyMjIDQuICoqUGxhbnRlYXIgbGEgaW50ZWdyYWwgZGUgdm9sdW1lbioqICANCiAgIC0gTGEgZsOzcm11bGEgZXMgIA0KICAgICBcWw0KICAgICBWID0gXHBpIFxpbnRfe2xfaX1ee2xfc30gZih4KV4yXCxkeA0KICAgICBcXSAgDQogICAtIFJlY29yZGFyIHF1ZSBcKGYoeCleMiA9IChheF4zK2J4XjIrY3grZCleMigxLXheMilcKSwgbG8gcXVlIHNpbXBsaWZpY2EgbGEgcmHDrXouICANCg0KIyMjIDUuICoqQ2FsY3VsYXIgZWwgdm9sdW1lbioqICANCiAgIC0gUmVzb2x2ZXIgbGEgaW50ZWdyYWwgZGUgZm9ybWEgc2ltYsOzbGljYSAoY29uIFN5bVB5KS4gIA0KICAgLSBTaSBlcyBtdXkgY29tcGxpY2FkYSwgY2FsY3VsYXJsYSBkZSBtYW5lcmEgbnVtw6lyaWNhLiAgDQoNCiMjIyA2LiAqKkNvbXBhcmFyIG3DqXRvZG9zKiogIA0KICAgLSBSZXZpc2FyIGVsIHJlc3VsdGFkbyBzaW1iw7NsaWNvIGZyZW50ZSBhbCBudW3DqXJpY28gcGFyYSBjb25maXJtYXIgY29uc2lzdGVuY2lhLiAgDQoNCiMjIyA3LiAqKkludGVycHJldGFyIGVsIHJlc3VsdGFkbyoqICANCiAgIC0gUmVwb3J0YXIgZWwgdmFsb3IgZGVsIHZvbHVtZW4gY29uIDPigJM0IGRlY2ltYWxlcy4gIA0KICAgLSBFeHBsaWNhciBxdcOpIGzDrW1pdGVzIHNlIHVzYXJvbiB5IHBvciBxdcOpLiAgDQogICAtIEFkanVudGFyIGxhIGdyw6FmaWNhIGRlIFwoZih4KVwpIGp1bnRvIGNvbiBlbCB2b2x1bWVuIGNhbGN1bGFkby4gIA0KDQoNCg0KDQojICoqUFJPQkxFTUEgMyoqDQoNCkVuIGVzdGUgcHJvYmxlbWEgdmFzIGEgY2FsY3VsYXIgdm9sw7ptZW5lcyBxdWUgc2UgZ2VuZXJhbiBhbCBoYWNlciBnaXJhciBsYSByZWdpw7NuIGJham8gbGEgY3VydmEgeT0zc2luKHgpIGRlc2RlIHg9MC45IGhhc3RhICBcKHg9XHBpXCkNCg0KUGFyYSBlbGxvICB1dGlsaXphcmFzIGVsIG3DqXRvZG8gZGUgY2FwYXMgY2lsw61uZHJpY2FzIGNvbXBsZXRhbmRvIGVsIHNpZ3VpZW50ZSBjw7NkaWdvLiAgDQoNCmBgYHtweXRob24gZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZnJvbSBzeW1weSBpbXBvcnQgKg0KeD1zeW1ib2xzKCd4JykNCkE9Jy0tJyAgICAgICAgICAjIEFtcGxpdHVkIGRlIGxhIGZ1bmNpw7NuIA0KZj1BKnNpbih4KSAgICAgICMgRnVuY2nDs24gIGEgcm90YXINCmI9Jy0tJyAgICAgICAgICAjIEVqZSAgZGUgcm90YWNpw7NuIHg9YiANCnIxPXggICAgICAgICAgICAjIFJhZGlvIGRlc2RlIHJvdGFjacOzbiAgZWplIHkNCnIyPSctLScgICAgICAgICAjIFJhZGlvIGRlIHJvdGFjacOzbiBkZXNkZSB4PWINCmV4cHIxPTIqcGkqZipyMSAjIEV4cHJlc2nDs24gcGFyYSBjw6FsY3VsbyBkZSB2b2x1bWVuIDENCmV4cHIyPSctLScgICAgICAjIEV4cHJlc2nDs24gcGFyYSBjw6FsY3VsbyBkZSB2b2x1bWVuIDINCnYxPWludGVncmF0ZSgnLS0nLCh4LCctLScpKS5uKDUpICAgIyBWb2x1bWVuIDENCnYyPWludGVncmF0ZShleHByMiwoeCwnLS0nKSkubig1KSAgIyBWb2x1bWVuIDINCnByaW50KHYxLHYyKSAgICAjIEltcHJlc2nDs24gZGUgcmVzdWx0YWRvcw0KDQoNCmBgYA0KDQoqIENhbGN1bGEgZWwgdm9sdW1lbiBhbCBoYWNlciBnaXJhciBsYSByZWdpw7NuICBhbHJlZGVkb3IgZGVsIGVqZSB5DQoqIEVuY3VlbnRyYSBlbCB2b2x1bWVuIGFsIGhhY2VyIGdpcmFyIGxhIHJlZ2nDs24gYWxyZWRlZG9yIGRlIHg9Yj0wLjQNCg0KDQojICoqQ29udGVuaWRvICoqDQoNCi0gQ8OzZGlnbyBlbiBQeXRob24gKENvbGFiIG8gSnVweXRlcikgY29uIHRvZG9zIGxvcyBjw6FsY3Vsb3MuICANCi0gR3LDoWZpY2FzIHkgcmVzdWx0YWRvcyBudW3DqXJpY29zLiAgDQotIEJyZXZlIGV4cGxpY2FjacOzbiBkZSBjYWRhIHBhc28uICANCg0KDQoNCg0KDQoNCg0K