knitr::opts_chunk$set(include = FALSE)
library(caret)

HACKATON AM 2017

Descripcion

El siguiente desafío surge como propuesta dentro de la Cátedra de Aprendizaje de Maquinas(AM) de la Universidad Tecnológica Nacional Facultad Regional Mendoza, el laboratorio DHARMA y el ITIC de la Universidad Nacional de Cuyo.

La actividad esta fundamentalmente orientada a los estudiantes de la materia optativa, sin embargo se invita a participar a todo aquel interesado.

¿Se puede predecir el grado de peligrosidad de una árbol dado sus características?

La Secretaría de Ambiente y Desarrollo Sustentable de la Ciudad de Mendoza Argentina, destaca a la cultura del árbol tanto como patrimonio cultural y como un aliado indispensable del progreso y el desarrollo de la vida en la provincia de Mendoza. Sin embargo, todos sabemos del peligro que suponen los arboles durante las temporadas de fuertes tormentas y sobre todo la época de viento Zonda. El grado de inclinación de un árbol es un factor fundamental a tener en cuenta a la hora de prevenir los posibles accidentes ocasionados por los fenomenos meteorologicos severos a los que muchas veces esta sujeta la provincia de Mendoza.

El objetivo detras del presente desafio es el de predecir aquellos especimenes que tengan un grado de inclinación peligroso (i.e. mayor a 30 grados) a partir de sus caracteristcas biologicas e información geografica/administrativa. Para tal fin se cuenta con un conjunto de datos que contiene el censo georeferenciado del arbolado publico en la ciudad de Mendoza al año 2012.

Habilidades:

Se espera que durante el desarrollo de esta actividad el participante aprenda a:

  1. Lidiar con conjuntos de datos reales

  2. Trabajar sobre conjuntos de datos con clases no balanceadas
    • Aprender o reforzar nuevas metricas para evaluar los resultados obtenidos
    • Aprender tecnicas de muestreo
  3. Experimentar con el ajuste fino de algoritmos de aprendizaje

  4. Proponer nuevas tecnicas/estrategias para mejorar los algoritmos

  5. Trabajar en Equipo

Conjunto de Datos

Los datos fueron generados a partir del Censo digital georeferenciado del arbolado público de la Ciudad de Mendoza, realizado en el año 2012. Mediante el mismo se permitió registrar de cada forestal una serie de datos que permiten definir su ubicación de un modo más preciso, actualizar la información en forma permanente y, sobre todo, planificar acciones futuras. El archivo original forma parte del del programa de Datos Abierto de la Ciudad de Mendoza

Del archivo original se eliminaron los registros sin información y se agrego información relativa a los limites administrativos de la ciudad de Mendoza. Por ultimo se crea la clase inclinacion_peligrosa donde se indica si la inclinacion del arbol se encuentra bajo una situación de gravedad (o no).

Descripción de los Archivos

Campos

  • id - (integer) - Identificacion
  • especie- (integer) - Especie del Forestal (arbol)
  • ultima_modificacion - (character) - Fecha de la ultima modificacion del registro
  • altura - (integer) - Altura del Forestal
  • circ_tronco_cm - (double) - Circunferencia del Tronco del Forestal
  • diametro_tronco - (character) - Diametro del Tronco del Forestal
  • long - (double) - Longitud (Posicion Geografica)
  • lat (double) - Latitud (Posicion Geografica)
  • seccion - (integer) - Numero de Seccion Administrativa a la que pertenece el Forestal
  • nombre_seccion - (character) - Nombre de la Seccion Administrativa
  • area_seccion - (double) - Area de la Seccion Administrativa, en Km2
  • inclinacion_peligrosa - (integer) - Clase: Inclinación grave

Evaluacion

Dado el alto nivel de desbalanceo de las clases, ara esta competencia vamos a usar la metrica ** ROC (Area Under de Curve)**.

(De Wikipedia)

Para dibujar una curva ROC sólo son necesarias las razones de Verdaderos Positivos (VPR) y de falsos positivos (FPR). La VPR mide hasta qué punto un clasificador es capaz de detectar o clasificar los casos positivos correctamente, de entre todos los casos positivos disponibles durante la prueba. La FPR define cuántos resultados positivos son incorrectos de entre todos los casos negativos disponibles durante la prueba.

Un espacio ROC se define por FPR y VPR como ejes x e y respectivamente, y representa los intercambios entre verdaderos positivos (en principio, beneficios) y falsos positivos (en principio, costes). Dado que VPR es equivalente a sensibilidad y FPR es igual a 1-especificidad, el gráfico ROC también es conocido como la representación de sensibilidad frente a (1-especificidad). Cada resultado de predicción o instancia de la matriz de confusión representa un punto en el espacio ROC.

El mejor método posible de predicción se situaría en un punto en la esquina superior izquierda, o coordenada (0,1) del espacio ROC, representando un 100% de sensibilidad (ningún falso negativo) y un 100% también de especificidad (ningún falso positivo). A este punto (0,1) también se le llama una clasificación perfecta. Por el contrario, una clasificación totalmente aleatoria (o adivinación aleatoria) daría un punto a lo largo de la línea diagonal, que se llama también línea de no-discriminación, desde el extremo inferior izquierdo hasta la esquina superior derecha (independientemente de los tipos de base positivas y negativas). Un ejemplo típico de adivinación aleatoria sería decidir a partir de los resultados de lanzar una moneda al aire, a medida que el tamaño de la muestra aumenta, el punto de un clasificador aleatorio de ROC se desplazará hacia la posición (0.5, 0.5).

La diagonal divide el espacio ROC. Los puntos por encima de la diagonal representan los buenos resultados de clasificación (mejor que el azar), puntos por debajo de la línea de los resultados pobres (peor que al azar). Nótese que la salida de un predictor consistentemente pobre simplemente podría ser invertida para obtener un buen predictor.

Se recurre a las curvas ROC, ya que es una medida global e independiente del punto de corte. La elección se realiza mediante la comparación del área bajo la curva (AUC) de ambas pruebas. Esta área posee un valor comprendido entre 0,5 y 1, donde 1 representa un valor diagnóstico perfecto y 0,5 es una prueba sin capacidad discriminatoria diagnóstica. Es decir, si AUC para una prueba diagnóstica es 0,8 significa que existe un 80% de probabilidad de que el diagnóstico realizado a un enfermo sea más correcto que el de una persona sana escogida al azar. Por esto, siempre se elige la prueba diagnóstica que presente un mayor área bajo la curva.

Formato para el envio de soluciones

Por cada Forestal/árbol en el conjunto de datos de evaluación, los archivos debe contener dos columnas, ID y inclinación_peligrosa.

El archivo debe contener una cabecera en el siguiente formato:

ID,inclinacion_peligrosa
1,si
12,no
13,no
122,si
1356,no
etc.

Material Extra

Videos:

¿Que es la Ciencia de Datos? Duración (15min)

Video que explica las herramientas y las tecnicas utilizadas en lo que se conoce como Ciencias de Datos

¿Cual es la Metodología de la Ciencia de Datos ? Duración (10min)

Video que detalla la metodología a seguir para aplicar las diferentes herramientas de la llamada Ciencia de Datos

Informacion sobre KAGGLE

Como funciona Kaggle? (5 Mins)

Que es Kaggle, para que sirve y por que lo vamos a usar para gestionar este desafio

Explorando el sitio del desafio en Kaggle (5 Mins)

Como acceder al sitio con el desafio y que vamos a encontar en el.

Hacer un envio al sitio del desafio Duracion (1.5 Mins)

Como hacer un envio con las predicciones de nuestro modelo. La tabla de resultados.

Agradecimientos

Gracias al programa Open Data de la Ciudad de Mendoza, Argentina

LS0tCnRpdGxlOiAnSGFja2F0b24gQXByZW5kaXphamUgZGUgTWFxdWluYXMgMjAxNzogU2UgcHVlZGUgcHJlZGVjaXIgZWwgZ3JhZG8gZGUgcGVsaWdyb3NpZGFkCiAgZGUgdW5hIGFyYm9sIGRhZG8gc3VzIGNhcmFjdGVyaXN0aWNhcz8nCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAotLS0KYGBge3Igc2V0dXB9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gRkFMU0UpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoY2FyZXQpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMjIEdlbmVyYWNpb24gZGUgbG9zIGFyY2hpdm9zIHBhcmEgZWwgZGVzYWZpbwoKbG9hZCgifi9kYXRhL2FyYm9sYWRvbWVuZG96YS5yZGEiKQoKZGF0YV9hcmJvbGFkbzwtZGF0YV9hcmJvbGFkbyAlPiUgc2VsZWN0KGlkLGVzcGVjaWUsdWx0aW1hX21vZGlmaWNhY2lvbixhbHR1cmEsY2lyY190cm9uY29fY20sZGlhbWV0cm9fdHJvbmNvLGxvbmcsbGF0LHNlY2Npb24sbm9tYnJlX3NlY2Npb24sYXJlYV9zZWNjaW9uLGluY2xpbmFjaW9uX2dyYXZlKQoKbmFtZXMoZGF0YV9hcmJvbGFkbylbMTJdPC0iaW5jbGluYWNpb25fcGVsaWdyb3NhIgpkYXRhX2FyYm9sYWRvPC0gZGF0YV9hcmJvbGFkbyAlPiUgbXV0YXRlKGluY2xpbmFjaW9uX3BlbGlncm9zYT1pZmVsc2UoaW5jbGluYWNpb25fcGVsaWdyb3NhPT0ic2kiLDEsMCkpCnNldC5zZWVkKDMwMSkKdHJhaW5zZXQ8LWRhdGFfYXJib2xhZG8KdHJhaW5JbmRleCA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKHRyYWluc2V0JGluY2xpbmFjaW9uX3BlbGlncm9zYSwgcD0wLjcwLCBsaXN0PUZBTFNFKQpkYXRhX3RyYWluIDwtIHRyYWluc2V0WyB0cmFpbkluZGV4LF0KZGF0YV90ZXN0IDwtICB0cmFpbnNldFstdHJhaW5JbmRleCxdCnNhbXBsZV9zb2x1dGlvbjwtZGF0YV90ZXN0ICU+JSBzZWxlY3QoaWQsaW5jbGluYWNpb25fcGVsaWdyb3NhKSAKc2FtcGxlX3NvbHV0aW9uJGluY2xpbmFjaW9uX3BlbGlncm9zYTwtc2FtcGxlKGMoMCwxKSxucm93KGRhdGFfdGVzdCkscmVwbGFjZT1UUlVFKQojIyBBZ3JlZ2Ftb3MgaW5mb3JtYWNpb24gZGVsIGNsdXN0ZXIKI2RhdGFfdHJhaW48LWNiaW5kKGRhdGFfdHJhaW4sY2x1c3Rlcj1kYXRhX2FyYm9sYWRvX2NsdXN0ZXJbdHJhaW5JbmRleCxdJGNsdXN0ZXIpCiNkYXRhX3Rlc3QgPC1jYmluZChkYXRhX3Rlc3QsY2x1c3Rlcj1kYXRhX2FyYm9sYWRvX2NsdXN0ZXJbLXRyYWluSW5kZXgsXSRjbHVzdGVyKQpyZWFkcjo6d3JpdGVfY3N2KGRhdGFfdHJhaW4sIi4vYXJib2xhZG8tbXphLWRhdGFzZXQuY3N2IikKcmVhZHI6OndyaXRlX2NzdihzYW1wbGVfc29sdXRpb24sIi4vYXJib2xhZG8tbXphLWRhdGFzZXQtc2FtcGxlLXNvbHV0aW9uLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YoZGF0YV90ZXN0WywtMTJdLCIuL2FyYm9sYWRvLW16YS1kYXRhc2V0LXRlc3QuY3N2IikKcmVhZHI6OndyaXRlX2NzdihkYXRhX3Rlc3RbLGMoMSwxMildLCIuL2FyYm9sYWRvLW16YS1kYXRhc2V0LXNvbHV0aW9ucy5jc3YiKQpkYXRhX3Rlc3QgJT4lIGdyb3VwX2J5KGluY2xpbmFjaW9uX3BlbGlncm9zYSkgJT4lIHN1bW1hcmlzZShuPW4oKSkKZGF0YV9hcmJvbGFkbzwtZGF0YV90cmFpbgpkYXRhX2FyYm9sYWRvCmRhdGFfdHJhaW5bMjU4NixdCmBgYAoKI0hBQ0tBVE9OIEFNIDIwMTcKIVtdKC4vYXJib2wtY2FpZG8uanBnKSAKCgojIyBEZXNjcmlwY2lvbiAKCkVsIHNpZ3VpZW50ZSBkZXNhZsOtbyBzdXJnZSBjb21vIHByb3B1ZXN0YSBkZW50cm8gZGUgbGEgKkPDoXRlZHJhIGRlIEFwcmVuZGl6YWplIGRlIE1hcXVpbmFzKEFNKSogZGUgbGEgVW5pdmVyc2lkYWQgVGVjbm9sw7NnaWNhIE5hY2lvbmFsIEZhY3VsdGFkIFJlZ2lvbmFsIE1lbmRvemEsIGVsIGxhYm9yYXRvcmlvICoqREhBUk1BKiogeSBlbCAqKklUSUMqKiBkZSBsYSBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZSBDdXlvLiAKCkxhIGFjdGl2aWRhZCBlc3RhIGZ1bmRhbWVudGFsbWVudGUgb3JpZW50YWRhIGEgbG9zIGVzdHVkaWFudGVzIGRlIGxhIG1hdGVyaWEgb3B0YXRpdmEsIHNpbiBlbWJhcmdvIHNlIGludml0YSBhIHBhcnRpY2lwYXIgYSB0b2RvIGFxdWVsIGludGVyZXNhZG8uCgoqKsK/U2UgcHVlZGUgcHJlZGVjaXIgZWwgZ3JhZG8gZGUgcGVsaWdyb3NpZGFkIGRlIHVuYSDDoXJib2wgZGFkbyBzdXMgY2FyYWN0ZXLDrXN0aWNhcz8qKgoKTGEgU2VjcmV0YXLDrWEgZGUgQW1iaWVudGUgeSBEZXNhcnJvbGxvIFN1c3RlbnRhYmxlIGRlIGxhIENpdWRhZCBkZSBNZW5kb3phIEFyZ2VudGluYSwgZGVzdGFjYSBhIGxhIGN1bHR1cmEgZGVsIMOhcmJvbCB0YW50byBjb21vIHBhdHJpbW9uaW8gY3VsdHVyYWwgeSBjb21vIHVuIGFsaWFkbyBpbmRpc3BlbnNhYmxlIGRlbCBwcm9ncmVzbyB5IGVsIGRlc2Fycm9sbG8gZGUgbGEgdmlkYSBlbiBsYSBwcm92aW5jaWEgZGUgTWVuZG96YS4gU2luIGVtYmFyZ28sIHRvZG9zIHNhYmVtb3MgZGVsIHBlbGlncm8gcXVlIHN1cG9uZW4gbG9zIGFyYm9sZXMgZHVyYW50ZSBsYXMgdGVtcG9yYWRhcyBkZSBmdWVydGVzIHRvcm1lbnRhcyB5IHNvYnJlIHRvZG8gbGEgw6lwb2NhIGRlIHZpZW50byBab25kYS4gRWwgZ3JhZG8gZGUgaW5jbGluYWNpw7NuIGRlIHVuIMOhcmJvbCBlcyB1biBmYWN0b3IgZnVuZGFtZW50YWwgYSB0ZW5lciBlbiBjdWVudGEgYSBsYSBob3JhIGRlIHByZXZlbmlyIGxvcyBwb3NpYmxlcyBhY2NpZGVudGVzIG9jYXNpb25hZG9zIHBvciBsb3MgZmVub21lbm9zIG1ldGVvcm9sb2dpY29zIHNldmVyb3MgYSBsb3MgcXVlIG11Y2hhcyB2ZWNlcyBlc3RhIHN1amV0YSBsYSBwcm92aW5jaWEgZGUgTWVuZG96YS4KCkVsICoqb2JqZXRpdm8qKiBkZXRyYXMgZGVsIHByZXNlbnRlIGRlc2FmaW8gZXMgZWwgZGUgcHJlZGVjaXIgYXF1ZWxsb3MgZXNwZWNpbWVuZXMgcXVlIHRlbmdhbiB1biBncmFkbyBkZSBpbmNsaW5hY2nDs24gcGVsaWdyb3NvIChpLmUuIG1heW9yIGEgMzAgZ3JhZG9zKSBhIHBhcnRpciBkZSBzdXMgY2FyYWN0ZXJpc3RjYXMgYmlvbG9naWNhcyBlIGluZm9ybWFjacOzbiBnZW9ncmFmaWNhL2FkbWluaXN0cmF0aXZhLiBQYXJhIHRhbCBmaW4gc2UgY3VlbnRhIGNvbiB1biBjb25qdW50byBkZSBkYXRvcyBxdWUgY29udGllbmUgZWwgY2Vuc28gZ2VvcmVmZXJlbmNpYWRvIGRlbCBhcmJvbGFkbyBwdWJsaWNvIGVuIGxhIGNpdWRhZCBkZSBNZW5kb3phIGFsIGHDsW8gMjAxMi4gCgojIyBIYWJpbGlkYWRlczoKClNlIGVzcGVyYSBxdWUgZHVyYW50ZSBlbCBkZXNhcnJvbGxvIGRlIGVzdGEgYWN0aXZpZGFkIGVsIHBhcnRpY2lwYW50ZSBhcHJlbmRhIGE6CgoxLiBMaWRpYXIgY29uIGNvbmp1bnRvcyBkZSBkYXRvcyByZWFsZXMKCjIuIFRyYWJhamFyIHNvYnJlIGNvbmp1bnRvcyBkZSBkYXRvcyBjb24gY2xhc2VzIG5vIGJhbGFuY2VhZGFzCiAgICArIEFwcmVuZGVyIG8gcmVmb3J6YXIgbnVldmFzIG1ldHJpY2FzIHBhcmEgZXZhbHVhciBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MKICAgICsgQXByZW5kZXIgdGVjbmljYXMgZGUgbXVlc3RyZW8KCjMuIEV4cGVyaW1lbnRhciBjb24gIGVsIGFqdXN0ZSBmaW5vIGRlIGFsZ29yaXRtb3MgZGUgYXByZW5kaXphamUgCgo0LiBQcm9wb25lciBudWV2YXMgdGVjbmljYXMvZXN0cmF0ZWdpYXMgIHBhcmEgbWVqb3JhciBsb3MgYWxnb3JpdG1vcwoKNS4gVHJhYmFqYXIgZW4gRXF1aXBvCgoKIyMgQ29uanVudG8gZGUgRGF0b3MKCkxvcyBkYXRvcyBmdWVyb24gZ2VuZXJhZG9zIGEgcGFydGlyIGRlbCBDZW5zbyBkaWdpdGFsIGdlb3JlZmVyZW5jaWFkbyBkZWwgYXJib2xhZG8gcMO6YmxpY28gZGUgbGEgQ2l1ZGFkIGRlIE1lbmRvemEsIHJlYWxpemFkbyBlbiBlbCBhw7FvIDIwMTIuIE1lZGlhbnRlIGVsIG1pc21vIHNlIHBlcm1pdGnDsyByZWdpc3RyYXIgZGUgY2FkYSBmb3Jlc3RhbCB1bmEgc2VyaWUgZGUgZGF0b3MgcXVlIHBlcm1pdGVuIGRlZmluaXIgc3UgdWJpY2FjacOzbiBkZSB1biBtb2RvIG3DoXMgcHJlY2lzbywgYWN0dWFsaXphciBsYSBpbmZvcm1hY2nDs24gZW4gZm9ybWEgcGVybWFuZW50ZSB5LCBzb2JyZSB0b2RvLCBwbGFuaWZpY2FyIGFjY2lvbmVzIGZ1dHVyYXMuIEVsIGFyY2hpdm8gb3JpZ2luYWwgZm9ybWEgcGFydGUgZGVsIGRlbCBwcm9ncmFtYSBkZSAqRGF0b3MgQWJpZXJ0byBkZSBsYSBDaXVkYWQgZGUgTWVuZG96YSogCgpEZWwgYXJjaGl2byBvcmlnaW5hbCBzZSBlbGltaW5hcm9uIGxvcyByZWdpc3Ryb3Mgc2luIGluZm9ybWFjacOzbiB5IHNlIGFncmVnbyBpbmZvcm1hY2nDs24gcmVsYXRpdmEgYSBsb3MgbGltaXRlcyBhZG1pbmlzdHJhdGl2b3MgZGUgbGEgY2l1ZGFkIGRlIE1lbmRvemEuIFBvciB1bHRpbW8gc2UgY3JlYSBsYSBjbGFzZSAqaW5jbGluYWNpb25fcGVsaWdyb3NhKiBkb25kZSBzZSBpbmRpY2Egc2kgbGEgaW5jbGluYWNpb24gZGVsIGFyYm9sIHNlIGVuY3VlbnRyYSBiYWpvIHVuYSBzaXR1YWNpw7NuIGRlIGdyYXZlZGFkIChvIG5vKS4KCiMjI0Rlc2NyaXBjacOzbiBkZSBsb3MgQXJjaGl2b3MKCiogKipbYXJib2xhZG8tbXphLWRhdGFzZXQuY3N2XShodHRwczovL3d3dy5kcm9wYm94LmNvbS9zLzVhMHU0aDU1cW52a2xobC9hcmJvbGFkby1temEtZGF0YXNldC5jc3Y/ZGw9MSkqKiAtIGNvbmp1bnRvIGRlIGRhdG9zIHBhcmEgZW50cmVuYW1pZW50bwoqICoqW2FyYm9sYWRvLW16YS1kYXRhc2V0LXRlc3QuY3N2XShodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL3Y2bm1nMW55NDdrajlkdS9hcmJvbGFkby1temEtZGF0YXNldC10ZXN0LmNzdj9kbD0xKSoqIC0gY29uanVudG8gZGUgZGF0b3MgcGFyYSBldmFsdWFjaW9uCiogKipbYXJib2xhZG8tbXphLWRhdGFzZXQtZW52aW8tZWplbXBsby1ycGFydC5jc3ZdKCkqKiAtIEVqZW1wbG8gZGVsIGZvcm1hdG8gcGFyYSByZWFsaXphciBlbnZpb3MgdXNhbmRvIGFyYm9sZXMgZGUgZGVjaXNpb24gcnBhcnQKKiAqKlthcmJvbGFkby1temEtZGF0YXNldC1kZXNjcmlwY2lvbi5jc3ZdKGh0dHBzOi8vd3d3LmRyb3Bib3guY29tL3MvcXZmMGZyazFlanB1NDc2L2FyYm9sYWRvLW16YS1kYXRhc2V0LWRlc2NyaXBjaW9uLmNzdj9kbD0xKSoqIC0gSW5mb3JtYWNpw7NuIGV4dHJhIHNvYnJlIGxvcyBkYXRvcy4KCgojIyNDYW1wb3MKCiogKmlkKiAtIChpbnRlZ2VyKSAtIElkZW50aWZpY2FjaW9uCiogKmVzcGVjaWUtKiAoaW50ZWdlcikgLSBFc3BlY2llIGRlbCBGb3Jlc3RhbCAoYXJib2wpCiogKnVsdGltYV9tb2RpZmljYWNpb24qIC0gKGNoYXJhY3RlcikgLSBGZWNoYSBkZSBsYSB1bHRpbWEgbW9kaWZpY2FjaW9uIGRlbCByZWdpc3RybwoqICphbHR1cmEqIC0gKGludGVnZXIpIC0gQWx0dXJhIGRlbCBGb3Jlc3RhbAoqICpjaXJjX3Ryb25jb19jbSogLSAoZG91YmxlKSAtIENpcmN1bmZlcmVuY2lhIGRlbCBUcm9uY28gZGVsIEZvcmVzdGFsCiogKmRpYW1ldHJvX3Ryb25jbyogLSAoY2hhcmFjdGVyKSAtIERpYW1ldHJvIGRlbCBUcm9uY28gZGVsIEZvcmVzdGFsCiogKmxvbmcqIC0gKGRvdWJsZSkgLSBMb25naXR1ZCAoUG9zaWNpb24gR2VvZ3JhZmljYSkKKiAqbGF0KiAoZG91YmxlKSAtIExhdGl0dWQgKFBvc2ljaW9uIEdlb2dyYWZpY2EpCiogKnNlY2Npb24qIC0gKGludGVnZXIpIC0gTnVtZXJvIGRlIFNlY2Npb24gQWRtaW5pc3RyYXRpdmEgYSBsYSBxdWUgcGVydGVuZWNlIGVsIEZvcmVzdGFsCiogKm5vbWJyZV9zZWNjaW9uKiAtIChjaGFyYWN0ZXIpIC0gTm9tYnJlIGRlIGxhIFNlY2Npb24gQWRtaW5pc3RyYXRpdmEKKiAqYXJlYV9zZWNjaW9uKiAtIChkb3VibGUpIC0gQXJlYSBkZSBsYSBTZWNjaW9uIEFkbWluaXN0cmF0aXZhLCBlbiBLbTIKKiAqKmluY2xpbmFjaW9uX3BlbGlncm9zYSoqIC0gKGludGVnZXIpIC0gQ2xhc2U6IEluY2xpbmFjacOzbiBncmF2ZQoKIyMgRXZhbHVhY2lvbgpEYWRvIGVsIGFsdG8gbml2ZWwgZGUgZGVzYmFsYW5jZW8gZGUgbGFzIGNsYXNlcywgYXJhIGVzdGEgY29tcGV0ZW5jaWEgdmFtb3MgYSB1c2FyIGxhIG1ldHJpY2EgKiogUk9DIChBcmVhIFVuZGVyIGRlIEN1cnZlKSoqLgoKKiooRGUgV2lraXBlZGlhKSoqIAoKUGFyYSBkaWJ1amFyIHVuYSBjdXJ2YSBST0Mgc8OzbG8gc29uIG5lY2VzYXJpYXMgbGFzIHJhem9uZXMgZGUgVmVyZGFkZXJvcyBQb3NpdGl2b3MgKFZQUikgeSBkZSBmYWxzb3MgcG9zaXRpdm9zIChGUFIpLiBMYSBWUFIgbWlkZSBoYXN0YSBxdcOpIHB1bnRvIHVuIGNsYXNpZmljYWRvciAgZXMgY2FwYXogZGUgZGV0ZWN0YXIgbyBjbGFzaWZpY2FyIGxvcyBjYXNvcyBwb3NpdGl2b3MgY29ycmVjdGFtZW50ZSwgZGUgZW50cmUgdG9kb3MgbG9zIGNhc29zIHBvc2l0aXZvcyBkaXNwb25pYmxlcyBkdXJhbnRlIGxhIHBydWViYS4gTGEgRlBSIGRlZmluZSBjdcOhbnRvcyByZXN1bHRhZG9zIHBvc2l0aXZvcyBzb24gaW5jb3JyZWN0b3MgZGUgZW50cmUgdG9kb3MgbG9zIGNhc29zIG5lZ2F0aXZvcyBkaXNwb25pYmxlcyBkdXJhbnRlIGxhIHBydWViYS4KClVuIGVzcGFjaW8gUk9DIHNlIGRlZmluZSBwb3IgRlBSIHkgVlBSIGNvbW8gZWplcyB4IGUgeSByZXNwZWN0aXZhbWVudGUsIHkgcmVwcmVzZW50YSBsb3MgaW50ZXJjYW1iaW9zIGVudHJlIHZlcmRhZGVyb3MgcG9zaXRpdm9zIChlbiBwcmluY2lwaW8sIGJlbmVmaWNpb3MpIHkgZmFsc29zIHBvc2l0aXZvcyAoZW4gcHJpbmNpcGlvLCBjb3N0ZXMpLiBEYWRvIHF1ZSBWUFIgZXMgZXF1aXZhbGVudGUgYSBzZW5zaWJpbGlkYWQgeSBGUFIgZXMgaWd1YWwgYSAxLWVzcGVjaWZpY2lkYWQsIGVsIGdyw6FmaWNvIFJPQyB0YW1iacOpbiBlcyBjb25vY2lkbyBjb21vIGxhIHJlcHJlc2VudGFjacOzbiBkZSBzZW5zaWJpbGlkYWQgZnJlbnRlIGEgKDEtZXNwZWNpZmljaWRhZCkuIENhZGEgcmVzdWx0YWRvIGRlIHByZWRpY2Npw7NuIG8gaW5zdGFuY2lhIGRlIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuIHJlcHJlc2VudGEgdW4gcHVudG8gZW4gZWwgZXNwYWNpbyBST0MuCgohW10oLi9yb2MucG5nKSAKCkVsIG1lam9yIG3DqXRvZG8gcG9zaWJsZSBkZSBwcmVkaWNjacOzbiBzZSBzaXR1YXLDrWEgZW4gdW4gcHVudG8gZW4gbGEgZXNxdWluYSBzdXBlcmlvciBpenF1aWVyZGEsIG8gY29vcmRlbmFkYSAoMCwxKSBkZWwgZXNwYWNpbyBST0MsIHJlcHJlc2VudGFuZG8gdW4gMTAwJSBkZSBzZW5zaWJpbGlkYWQgKG5pbmfDum4gZmFsc28gbmVnYXRpdm8pIHkgdW4gMTAwJSB0YW1iacOpbiBkZSBlc3BlY2lmaWNpZGFkIChuaW5nw7puIGZhbHNvIHBvc2l0aXZvKS4gQSBlc3RlIHB1bnRvICgwLDEpIHRhbWJpw6luIHNlIGxlIGxsYW1hIHVuYSBjbGFzaWZpY2FjacOzbiBwZXJmZWN0YS4gUG9yIGVsIGNvbnRyYXJpbywgdW5hIGNsYXNpZmljYWNpw7NuIHRvdGFsbWVudGUgYWxlYXRvcmlhIChvIGFkaXZpbmFjacOzbiBhbGVhdG9yaWEpIGRhcsOtYSB1biBwdW50byBhIGxvIGxhcmdvIGRlIGxhIGzDrW5lYSBkaWFnb25hbCwgcXVlIHNlIGxsYW1hIHRhbWJpw6luIGzDrW5lYSBkZSBuby1kaXNjcmltaW5hY2nDs24sIGRlc2RlIGVsIGV4dHJlbW8gaW5mZXJpb3IgaXpxdWllcmRvIGhhc3RhIGxhIGVzcXVpbmEgc3VwZXJpb3IgZGVyZWNoYSAoaW5kZXBlbmRpZW50ZW1lbnRlIGRlIGxvcyB0aXBvcyBkZSBiYXNlIHBvc2l0aXZhcyB5IG5lZ2F0aXZhcykuIFVuIGVqZW1wbG8gdMOtcGljbyBkZSBhZGl2aW5hY2nDs24gYWxlYXRvcmlhIHNlcsOtYSBkZWNpZGlyIGEgcGFydGlyIGRlIGxvcyByZXN1bHRhZG9zIGRlIGxhbnphciB1bmEgbW9uZWRhIGFsIGFpcmUsIGEgbWVkaWRhIHF1ZSBlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEgYXVtZW50YSwgZWwgcHVudG8gZGUgdW4gY2xhc2lmaWNhZG9yIGFsZWF0b3JpbyBkZSBST0Mgc2UgZGVzcGxhemFyw6EgaGFjaWEgbGEgcG9zaWNpw7NuICgwLjUsIDAuNSkuCgpMYSBkaWFnb25hbCBkaXZpZGUgZWwgZXNwYWNpbyBST0MuIExvcyBwdW50b3MgcG9yIGVuY2ltYSBkZSBsYSBkaWFnb25hbCByZXByZXNlbnRhbiBsb3MgYnVlbm9zIHJlc3VsdGFkb3MgZGUgY2xhc2lmaWNhY2nDs24gKG1lam9yIHF1ZSBlbCBhemFyKSwgcHVudG9zIHBvciBkZWJham8gZGUgbGEgbMOtbmVhIGRlIGxvcyByZXN1bHRhZG9zIHBvYnJlcyAocGVvciBxdWUgYWwgYXphcikuIE7Ds3Rlc2UgcXVlIGxhIHNhbGlkYSBkZSB1biBwcmVkaWN0b3IgY29uc2lzdGVudGVtZW50ZSBwb2JyZSBzaW1wbGVtZW50ZSBwb2Ryw61hIHNlciBpbnZlcnRpZGEgcGFyYSBvYnRlbmVyIHVuIGJ1ZW4gcHJlZGljdG9yLgoKU2UgcmVjdXJyZSBhIGxhcyBjdXJ2YXMgUk9DLCB5YSBxdWUgZXMgdW5hIG1lZGlkYSBnbG9iYWwgZSBpbmRlcGVuZGllbnRlIGRlbCBwdW50byBkZSBjb3J0ZS4gTGEgZWxlY2Npw7NuIHNlIHJlYWxpemEgbWVkaWFudGUgbGEgY29tcGFyYWNpw7NuIGRlbCDDoXJlYSBiYWpvIGxhIGN1cnZhIChBVUMpIGRlIGFtYmFzIHBydWViYXMuIEVzdGEgw6FyZWEgcG9zZWUgdW4gdmFsb3IgY29tcHJlbmRpZG8gZW50cmUgMCw1IHkgMSwgZG9uZGUgMSByZXByZXNlbnRhIHVuIHZhbG9yIGRpYWduw7NzdGljbyBwZXJmZWN0byB5IDAsNSBlcyB1bmEgcHJ1ZWJhIHNpbiBjYXBhY2lkYWQgZGlzY3JpbWluYXRvcmlhIGRpYWduw7NzdGljYS4gRXMgZGVjaXIsIHNpIEFVQyBwYXJhIHVuYSBwcnVlYmEgZGlhZ27Ds3N0aWNhIGVzIDAsOCBzaWduaWZpY2EgcXVlIGV4aXN0ZSB1biA4MCUgZGUgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlbCBkaWFnbsOzc3RpY28gcmVhbGl6YWRvIGEgdW4gZW5mZXJtbyBzZWEgbcOhcyBjb3JyZWN0byBxdWUgZWwgZGUgdW5hIHBlcnNvbmEgc2FuYSBlc2NvZ2lkYSBhbCBhemFyLiBQb3IgZXN0bywgc2llbXByZSBzZSBlbGlnZSBsYSBwcnVlYmEgZGlhZ27Ds3N0aWNhIHF1ZSBwcmVzZW50ZSB1biBtYXlvciDDoXJlYSBiYWpvIGxhIGN1cnZhLgoKIyMjIEZvcm1hdG8gcGFyYSBlbCBlbnZpbyBkZSBzb2x1Y2lvbmVzCgoqUG9yIGNhZGEgRm9yZXN0YWwvw6FyYm9sKiBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBkZSBldmFsdWFjacOzbiwgbG9zIGFyY2hpdm9zIGRlYmUgY29udGVuZXIgZG9zIGNvbHVtbmFzLCAqKklEKiogeSAqKmluY2xpbmFjacOzbl9wZWxpZ3Jvc2EuKiogCgoqKkVsIGFyY2hpdm8gZGViZSBjb250ZW5lciB1bmEgY2FiZWNlcmEgZW4gZWwgc2lndWllbnRlIGZvcm1hdG86KioKYGBgCklELGluY2xpbmFjaW9uX3BlbGlncm9zYQoxLHNpCjEyLG5vCjEzLG5vCjEyMixzaQoxMzU2LG5vCmV0Yy4KCmBgYAoKIyMgTWF0ZXJpYWwgRXh0cmEKCiMjI1ZpZGVvczoKClvCv1F1ZSBlcyBsYSBDaWVuY2lhIGRlIERhdG9zP10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1yTkR3WHAyT0hwOCkgRHVyYWNpw7NuICgxNW1pbikKClZpZGVvIHF1ZSBleHBsaWNhIGxhcyBoZXJyYW1pZW50YXMgeSBsYXMgdGVjbmljYXMgdXRpbGl6YWRhcyBlbiBsbyBxdWUgc2UgY29ub2NlIGNvbW8gQ2llbmNpYXMgZGUgRGF0b3MKCgpbwr9DdWFsIGVzIGxhIE1ldG9kb2xvZ8OtYSBkZSBsYSBDaWVuY2lhIGRlIERhdG9zID9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9MlpyazRINDNKMGspIER1cmFjacOzbiAoMTBtaW4pCgpWaWRlbyBxdWUgZGV0YWxsYSBsYSBtZXRvZG9sb2fDrWEgYSBzZWd1aXIgcGFyYSBhcGxpY2FyIGxhcyBkaWZlcmVudGVzIGhlcnJhbWllbnRhcyBkZSBsYSBsbGFtYWRhIENpZW5jaWEgZGUgRGF0b3MKCioqSW5mb3JtYWNpb24gc29icmUgS0FHR0xFKioKCltDb21vIGZ1bmNpb25hIEthZ2dsZT9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9MENCVl9hRGNYYTgpICg1IE1pbnMpCgpRdWUgZXMgS2FnZ2xlLCBwYXJhIHF1ZSBzaXJ2ZSB5IHBvciBxdWUgbG8gdmFtb3MgYSB1c2FyIHBhcmEgZ2VzdGlvbmFyIGVzdGUgZGVzYWZpbwoKW0V4cGxvcmFuZG8gZWwgc2l0aW8gZGVsIGRlc2FmaW8gZW4gS2FnZ2xlXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXdIaC1pc3dVTUxFKSAoNSBNaW5zKQoKQ29tbyBhY2NlZGVyIGFsIHNpdGlvIGNvbiBlbCBkZXNhZmlvIHkgcXVlIHZhbW9zIGEgZW5jb250YXIgZW4gZWwuCgpbSGFjZXIgdW4gZW52aW8gYWwgc2l0aW8gZGVsIGRlc2FmaW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WXNoQWVTZEYyaDAmdD0zcykgRHVyYWNpb24gKDEuNSBNaW5zKQoKQ29tbyBoYWNlciB1biBlbnZpbyBjb24gbGFzIHByZWRpY2Npb25lcyBkZSBudWVzdHJvIG1vZGVsby4gTGEgdGFibGEgZGUgcmVzdWx0YWRvcy4KCiMjIEFncmFkZWNpbWllbnRvcwoKR3JhY2lhcyBhbCBwcm9ncmFtYSBPcGVuIERhdGEgZGUgbGEgQ2l1ZGFkIGRlIE1lbmRvemEsIEFyZ2VudGluYQoKCg==