1. PLN y Lenguaje natural

1.1. ¿Qué es un lenguaje natural?



Para Sarkar (2019):

El lenguaje natural es un lenguaje desarrollado y evolucionado por los humanos a través del uso y comunicación “natural” (distinto a un lenguaje de programación). Tal lenguaje puede ser expresado de manera escrita, verbal o incluso mediante señas.


1.2. Conocimiento del lenguaje usado en PLN



Acorde a Villalonga (2019):

  • Para el procesamiento del lenguaje natural se requiere del conocimiento de áreas como la fonética, la fonología, la morfología, la sintaxis, la semántica, la pragmática y el discurso.
  • La fonética y la fonología se relacionan al conocimiento sobre los sonidos linguísticos.
  • La morfología es el conocimiento de los componentes significativos de las palabras. Esta nos sirve por ejemplo, para identificar que ‘’puertas’’ es el plural de ‘’puerta’’.
  • La sintaxis es el conocimiento de las relaciones estructurales entre palabras. Por ejemplo, nos sirve para saber cómo encadenar las palabras en una respuesta.
  • La semántica es el conocimiento del significado. Esta se aplica por ejemplo, para entender el significado de palabras aisladas o en conjunto, y de saber que dicho significado puede variar en distintos escenarios.
  • La pragmática es el conocimiento de la relación del significado con los objetivos y las intenciones. Es decir, nos sirve para saber el tipo de expresión que alguien ha utilizado.
  • El discurso es el conocimiento sobre unidades lingüísticas más grandes que un solo enunciado. Esto es útil para resolver referencias cruzadas por ejemplo.

2. Morfología, morfosintaxis, sintaxis y semántica

2.1. Morfología



En la lingüística

  • La morfología es la parte de la gramática que estudia la estructura de las palabras y sus elementos constitutivos.

En el procesamiento del lenguaje natural

  • La morfología computacional trata de reconocer de forma automática los morfemas que contiene una palabra. Esta es importante para reconocer palabras como ‘pensar’ y ‘piénsalo’ como una sola, además de reconocer el género y número de un nombre para encajarlo con un adjetivo por ejemplo.
  • En el análisis morfológico automático se obtiene como salida la raíz de las palabras (lema) y la información gramatical que aportan los diferentes morfemas, a lo que se llama características morfológicas.
    • Ejemplo: ‘Cantábamos’ tiene 3 morfemas: ‘cant’ (cantar), ‘-aba’ (pasado) y ‘-mos’ (plural).
  • La dificultad del análisis morfológico varía según el idioma. En inglés por ejemplo este es más sencillo que en español, pero en chino es más complicado que en los otros dos idiomas.
  • Para construir un sistema capaz de realizar análisis morfológico se necesita:
    • Un lexicón, el cual es un catálogo de las palabras de una lengua. Esto es inviable y lo que se suele hacer es crear una base de datos con información básica de los morfemas; es decir, una lista de morfemas y la información básica sobre ellos, con un conjunto de hechos morfosintácticos que expliquen cómo se pueden concatenar los morfemas para formar palabras.
    • Un conjunto de hechos morfotácticos, los cuales hacen referencia al modelo que describe el orden de los morfemas y del cual es posible generar todas las palabras de un léxico. Estos describen el orden de los morfemas, es decir, por qué unas clases de morfemas siguen a otras dentro de las palabras.
    • Un conjunto de reglas ortográficas, las cuales se usan para modelar los cambios de ortografía que ocurren en una palabra cuando se concatenan dos morfemas.
  • Los trasductores de automátas finitos suelen ser la forma más habitual de realizar el análisis morfológico. Un transductor de autómatas finitos es un modelo computacional que permite producir de forma automática una salida a partir de una entrada con base en una serie de transiciones entre estados. Por ejemplo, se traduce la entrada ‘vino’ como la salida ‘vino + N + Masc + Pl’.

2.2. Morfosintaxis



En la lingüística

  • La morfosintaxis se define como la parte de la gramática que integra la morfología y la sintaxis para determinar las diferentes partes de la oración, llamadas part-of-speech (POS).
  • Las categorías morfosintácticas del lenguaje, también llamadas en español como categorías gramaticales proporcionan clasificación de las diferentes partes de la oración según su tipo de palabra.
  • El conocer las distintas partes de la oración es útil debido a la gran cantidad de información que brindan sobre una palabra y sus vecinos, además de los detalles que presentan sobre la estructura sintáctica de la oración.
    • Ejemplo (vecinos): Los sustantivos suelen ir precedidos de determinantes o seguidos de adjetivos.
    • Ejemplo (estructura sintáctica): Los sustantivos forman parte del sintagma nominal.
  • Las categorías morfosintácticas o gramaticales existentes son:
    • Sustantivo / nombre: son palabras cuyos elementos tienen género y número y forman sintagmas nominales, denominando entidades de distinta naturaleza.
    • Determinante: son palabras cuyos elementos determinan al sustantivo o al grupo nominal, ubicándose generalmente en posición prenominal.
    • Adjetivo: son palabras que modifican a un sustantivo y denotan cualidades, propiedades y relaciones de diversa naturaleza.
    • Pronombre: son palabras cuyos elementos hacen las veces del sustantivo o del sintagma nominal.
    • Verbo: son palabras que denotan una acción y tienen variación de persona, número, tiempo, modo y aspecto.
    • Adverbio: son palabras cuyos elementos son invariables y tónicos, y pueden modificar el significado de varias categorías.
    • Preposición: son palabras invariantes cuyos elementos se caracterizan por introducir un término.
    • Conjunción: son palabras invariables átonas cuyos elementos manifiestan relaciones de coordinación o subordinación entre palabras.
    • Interjección: son palabras invariables con cuyos elementos forman enunciados exclamativos, verbalizan sentimientos o realizan actos de habla apelativos.

En el procesamiento del lenguaje natural

  • El etiquetado morfosintáctico es el proceso de identificar las distintas partes de la oración y consiste en asignar una etiqueta (tag) sobre la categoría gramatical a cada una de las palabras de un texto de entrada.
  • La entrada del algoritmo es una secuencia de palabras y la salida es una secuencia de pares formados por la palabra y la correspondiente etiqueta indicando su categoría gramatical.
  • El etiquetado morfosintáctico realiza durante su funcionamiento un proceso de desambiguación donde reconoce correctamente la etiqueta de una palabra que puede pertenecer a más de una categoría gramatical.
  • Así también, una parte del algoritmo de etiquetado es el preprocesamiento de la oración. Esto se realiza una vez que que la oración haya sido tokenizada.
  • Una de las técnicas más usuales de etiquetado morfosintácticos son los modelos ocultos de Markov (HMM).
  • Un modelo oculto de Markov es un modelo estadístico que se puede representar como una máquina de estados finitos, pero donde las transiciones entre estados son probabilísticas y no determinísticas. El objetivo es determinar los parámetros desconocidos (ocultos) a partir de los parámetros observables.
    • Ejemplo: Si una palabra es etiquetada como determinante, la próxima será un nombre con 40% de probabilidad, un adjetivo con 40% y un número con 20%.
  • Para el etiquetado morfosintáctico los HMM son entrenados en un conjunto de datos totalmente etiquetados.
  • Veamos un recurso online para afianzar nuestras ideas: Analizador morfosintáctico Linguakit.

2.3. Sintaxis



En la lingüística

  • La sintaxis es la parte de la gramática que estudia el modo en que se combinan las palabras y los grupos que estas forman para expresar significados, así como las relaciones que se establecen entre todas esas unidades.
  • El análisis sintáctico determina las relaciones estructurales entre palabras.
  • Este es un paso esencial para la posterior identificación de las relaciones semánticas de las oraciones.
  • Su resultado es un árbol sintáctico donde los nodos son los constituyentes sintácticos y las hojas son las palabras que componen la oración.
  • Un constituyente sintáctico es una palabra, o una secuencia de palabras que realizan una función conjunta dentro de la estructura jerárquica de la oración. Al constituyente compuesto de dos o más elementos se lo llama sintagma o grupo sintáctico.
  • Los principales tipos de sintagma del español son:
    • Sintagma nominal (SN), cuyo núcleo es un sustantivo o pronombre.
    • Sintagma verbal (SV), cuyo núcleo es un verbo.
    • Sintagma preposicional (SP o SPrep), cuyo núcleo es una preposición.
    • Sintagma adjetival (SAdj), cuyo núcleo es un adjetivo.
    • Sintagma adverbial (SAdv), cuyo núcleo es un adverbio.

En el procesamiento del lenguaje natural

  • Los analizadores sintácticos suelen basarse en programación dinámica y métodos probabilistas. Uno de los algoritmos más comunes es el algoritmo CKY probabilístico.
  • Estos suelen enfrentar el problema de la ambigüedad estructural. Esta se debe a las múltiples reglas representadas en una gramática que provienen del uso común de una lengua y que permiten que se pueda encontrar varios resultados del análisis sintáctico que se ajuste correctamente a una frase analizada.
  • Al final la selección del resultado final se realiza normalmente a través de procesos de desambiguación sintáctica que requieren fuentes de conocimiento estadístico, semántico y contextual.
  • Afiancemos nuestras ideas con un recurso online: Analizador sintáctico Linguakit.

2.4. Semántica



En la lingüística

  • La semántica se define como la disciplina que estudia el significado de las unidades lingüísticas y de sus combinaciones.
  • Esto es necesario en algunas tareas del procesamiento del lenguaje natural. Es decir, necesitamos no solo el conocimiento lingüístico (morfología y sintaxis) sino también información no lingüística (semántica).
  • La semántica léxica estudia el significado de las palabras, así como las diversas relaciones de sentido que se establecen entre ellas.
  • Conocer además el significado de una oración, y no solo de una palabra es también imprescindible para realizar eficientemente diversas tareas de procesamiento del lenguaje natural.
  • La semántica composicional estudia el significado de los sintagmas y las oraciones.
  • El análisis semántico tiene como objetivo producir una representación del significado en una oración.

En el procesamiento del lenguaje natural

  • La creación automática de una representación rigurosa del significado de la oración requiere de múltiples fuentes de conocimiento y técnicas de inferencia. Algunos de los conocimientos necesarios son:
    • Los significados de las palabras
    • Los significados asociados a las construcciones gramaticales
    • La estructura del discurso
    • El tema en cuestión
    • El estado de las cosas en el momento en el que tiene lugar el discurso
  • La representación formal del significado debe ser verificable, inequívoca, expresiva y permitir la inferencia de nuevo conocimiento.
  • La mayoría de los modelos que se utilizan para representar el significado tienen en común la capacidad para representar objetos, sus propiedades y las relaciones entre estos.
  • Entre las estrategias que sirven para representar el lenguaje tenemos:
    • Lógica de primer orden
    • Redes semánticas
    • Diagramas de dependencias conceptuales
    • Sistemas basados en plantillas
  • En la realidad no es muy común usar el análisis sintáctico como input en el análisis semántico (debido a que se necesita conocimiento específico sobre el ejemplo) y por ello lo que se hace es integrar el conocimiento en el análisis sintáctico.+
  • Al añadir el conocimiento semántico a las reglas gramaticales y a las entradas léxicas que conforman la gramática se lo conoce como rule-to-rule hypothesis.

3. Ejercicio práctico

Como un primer acercamiento utilizaremos una de las librerías más completas de PLN: UDPipe, creada por la Facultad de Matemáticas y Física de la Universidad de República Checa y descargaremos un modelo pre-entrenado guardado como un objeto en R:

# Descarga de modelo preentrenado udpipe
library(udpipe)
#udpipe::udpipe_download_model('spanish') # Descomentar al ejecutar por primera vez

Ahora cargaremos el modelo en español descargado y lo utilizaremos para anotar una frase (ayudándonos de la librería stringr para evitar problemas con la codificación, y de la librería dplyr para manipular los resultados):

library(stringi)
library(dplyr)

# Carga de modelo pre-entrenado
model = udpipe_load_model(file = "spanish-gsd-ud-2.4-190531.udpipe")

# Anotación
text = "Estamos muy interesados en saber cuál será el proyecto de fin de curso."
text_annotated = udpipe_annotate(model, x = stri_enc_toutf8(text))
text_annotated = text_annotated %>% as_tibble(encoding="latin-1")

Finalmente presentaremos el resultado tabular (con la librería kableExtra para que la tabla se vea bien):

library(kableExtra)
text_annotated %>% select(token, lemma, upos, feats, head_token_id) %>% kable() %>% kable_styling(font_size = 14)
token lemma upos feats head_token_id
Estamos estar AUX Mood=Ind|Number=Plur|Person=1|Tense=Pres|VerbForm=Fin 3
muy mucho ADV NA 3
interesados interesado ADJ Gender=Masc|Number=Plur|VerbForm=Part 0
en en ADP NA 5
saber saber VERB VerbForm=Inf 3
cuál cuál PRON Number=Sing|PronType=Int,Rel 9
será ser AUX Mood=Ind|Number=Sing|Person=3|Tense=Fut|VerbForm=Fin 9
el el DET Definite=Def|Gender=Masc|Number=Sing|PronType=Art 9
proyecto proyecto NOUN Gender=Masc|Number=Sing 5
de de ADP NA 11
fin fin NOUN Gender=Masc|Number=Sing 9
de de ADP NA 13
curso curso NOUN Gender=Masc|Number=Sing 11
. . PUNCT NA 3

Y con un gráfico (basado en las librerías ggplot2, igraph y ggraph, adaptado de la entrada ‘dependency parsing with udpipe’, r-bloggers.com):

library(igraph)
library(ggraph)
library(ggplot2)

# Función para graficar dependencias
plot_annotation = function(x, size = 3){
  stopifnot(is.data.frame(x) & all(c("sentence_id", "token_id", "head_token_id", "dep_rel",
                                     "token_id", "token", "lemma", "upos", "xpos", "feats") %in% colnames(x)))
  x = x[!is.na(x$head_token_id), ]
  x = x[x$sentence_id %in% min(x$sentence_id), ]
  edges = x[x$head_token_id != 0, c("token_id", "head_token_id", "dep_rel")]
  edges$label = edges$dep_rel
  g = graph_from_data_frame(edges,
                             vertices = x[, c("token_id", "token", "lemma", "upos", "xpos", "feats")],
                             directed = TRUE)
  gf = ggraph(g, layout = "linear") +
    geom_edge_arc(aes(label = dep_rel, vjust = -0.20),
                  arrow = grid::arrow(length = unit(4, 'mm'), ends = "last", type = "closed"),
                  label_colour = "red", check_overlap = TRUE, label_size = size) +
    geom_node_label(aes(label = token), col = "darkgreen", size = size, fontface = "bold") +
    geom_node_text(aes(label = upos), nudge_y = -0.35, size = size) +
    labs(title = "Resultado UDpipe", 
         subtitle = "Tokenización, etiquetado POS y relaciones de dependencia")
  return(gf)
}

# Gráfico
plot_annotation(text_annotated)

Para interpretar los resultados de dependencias es necesario referirnos a universaldependencies.org, la cual está construida sobre la investigación de De Marneffe y otros (2014).

4. Tarea: Análisis morfológico y morfosintáctico

El siguiente deber se entregará como un script en R de tal manera que el instructor lo pueda replicar en su máquina sin la necesidad de cargar un archivo. A continuación las instrucciones:

  • Elabora una oración en idioma español.
  • Realiza su análisis sintáctico y morfosintáctico a través de la librería UDpipe (no es necesario que realices el gráfico).
  • Comenta los resultados.

Al final, envía el ejercicio al correo de tu instructor (). Aquellos trabajos sin comentarios sobre los resultados serán calificados con una nota de cero puntos sobre diez.

5. Bibliografía

De Marneffe, M. C. y otros (2014), «Universal stanford dependencies: A cross-linguistic typology», Proceedings of the 9th International Conference on Language Resources and Evaluation, LREC 2014.

Sarkar, D. (2019), Text Analytics with Python.

Villalonga, C. (2019), Procesamiento del Lenguaje Natural, Universidad Internacional de la Rioja.

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBjb21wb3J0YW1pZW50byBlbiByZWRlcyBzb2NpYWxlcyB1c2FuZG8gUHJvY2VzYW1pZW50byBkZWwgTGVuZ3VhamUgTmF0dXJhbCINCnN1YnRpdGxlOiAnQ2Fww610dWxvIDI6ICBDb25vY2ltaWVudG9zIGRlbCBsZW5ndWFqZSwgbW9yZm9sb2fDrWEsIHNpbnRheGlzLCB5IHNlbcOhbnRpY2EnDQphdXRob3I6IEh1Z28gUG9ycmFzDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogRXN0aWxvcy5jc3MNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQpiaWJsaW9ncmFwaHk6IEJpYmxpb2dyYWZpYS5iaWINCmNzbDogY2VwYWwueG1sDQotLS0NCg0KIyAqKjEuIFBMTiB5IExlbmd1YWplIG5hdHVyYWwqKg0KDQojIyAqKjEuMS4gwr9RdcOpIGVzIHVuIGxlbmd1YWplIG5hdHVyYWw/KioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0xlbmd1YWplTmF0dXJhbC5qcGciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpQYXJhIEBTYXJrYXIyMDE5Og0KDQpFbCBsZW5ndWFqZSBuYXR1cmFsIGVzIHVuIGxlbmd1YWplIGRlc2Fycm9sbGFkbyB5IGV2b2x1Y2lvbmFkbyBwb3IgbG9zIGh1bWFub3MgYSB0cmF2w6lzIGRlbCB1c28geSBjb211bmljYWNpw7NuICJuYXR1cmFsIiAoZGlzdGludG8gYSB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuKS4gVGFsIGxlbmd1YWplIHB1ZWRlIHNlciBleHByZXNhZG8gZGUgbWFuZXJhIGVzY3JpdGEsIHZlcmJhbCBvIGluY2x1c28gbWVkaWFudGUgc2XDsWFzLg0KDQo8YnI+PC9icj4NCg0KIyMgKioxLjIuIENvbm9jaW1pZW50byBkZWwgbGVuZ3VhamUgdXNhZG8gZW4gUExOKioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0NTX0xpbmd1aXN0aWNzLmpwZWciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpBY29yZGUgYSBAVmlsbGFsb25nYTIwMTk6DQoNCisgUGFyYSBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsIHNlIHJlcXVpZXJlIGRlbCBjb25vY2ltaWVudG8gZGUgw6FyZWFzIGNvbW8gbGEgZm9uw6l0aWNhLCBsYSBmb25vbG9nw61hLCBsYSBtb3Jmb2xvZ8OtYSwgbGEgc2ludGF4aXMsIGxhIHNlbcOhbnRpY2EsIGxhIHByYWdtw6F0aWNhIHkgZWwgZGlzY3Vyc28uDQorIExhICoqZm9uw6l0aWNhKiogeSBsYSAqKmZvbm9sb2fDrWEqKiBzZSByZWxhY2lvbmFuIGFsIGNvbm9jaW1pZW50byBzb2JyZSBsb3Mgc29uaWRvcyBsaW5ndcOtc3RpY29zLg0KKyBMYSAqKm1vcmZvbG9nw61hKiogZXMgZWwgY29ub2NpbWllbnRvIGRlIGxvcyBjb21wb25lbnRlcyBzaWduaWZpY2F0aXZvcyBkZSBsYXMgcGFsYWJyYXMuIEVzdGEgbm9zIHNpcnZlIHBvciBlamVtcGxvLCBwYXJhIGlkZW50aWZpY2FyIHF1ZSAnJ3B1ZXJ0YXMnJyBlcyBlbCBwbHVyYWwgZGUgJydwdWVydGEnJy4NCisgTGEgKipzaW50YXhpcyoqIGVzIGVsIGNvbm9jaW1pZW50byBkZSBsYXMgcmVsYWNpb25lcyBlc3RydWN0dXJhbGVzIGVudHJlIHBhbGFicmFzLiBQb3IgZWplbXBsbywgbm9zIHNpcnZlIHBhcmEgc2FiZXIgY8OzbW8gZW5jYWRlbmFyIGxhcyBwYWxhYnJhcyBlbiB1bmEgcmVzcHVlc3RhLg0KKyBMYSAqKnNlbcOhbnRpY2EqKiBlcyBlbCBjb25vY2ltaWVudG8gZGVsIHNpZ25pZmljYWRvLiBFc3RhIHNlIGFwbGljYSBwb3IgZWplbXBsbywgcGFyYSBlbnRlbmRlciBlbCBzaWduaWZpY2FkbyBkZSBwYWxhYnJhcyBhaXNsYWRhcyBvIGVuIGNvbmp1bnRvLCB5IGRlIHNhYmVyIHF1ZSBkaWNobyBzaWduaWZpY2FkbyBwdWVkZSB2YXJpYXIgZW4gZGlzdGludG9zIGVzY2VuYXJpb3MuDQorIExhICoqcHJhZ23DoXRpY2EqKiBlcyBlbCBjb25vY2ltaWVudG8gZGUgbGEgcmVsYWNpw7NuIGRlbCBzaWduaWZpY2FkbyBjb24gbG9zIG9iamV0aXZvcyB5IGxhcyBpbnRlbmNpb25lcy4gRXMgZGVjaXIsIG5vcyBzaXJ2ZSBwYXJhIHNhYmVyIGVsIHRpcG8gZGUgZXhwcmVzacOzbiBxdWUgYWxndWllbiBoYSB1dGlsaXphZG8uDQorIEVsICoqZGlzY3Vyc28qKiBlcyBlbCBjb25vY2ltaWVudG8gc29icmUgdW5pZGFkZXMgbGluZ8O8w61zdGljYXMgbcOhcyBncmFuZGVzIHF1ZSB1biBzb2xvIGVudW5jaWFkby4gRXN0byBlcyDDunRpbCBwYXJhIHJlc29sdmVyIHJlZmVyZW5jaWFzIGNydXphZGFzIHBvciBlamVtcGxvLg0KDQoNCjwhLS0gIyMgKioxLjIuIExhIGZpbG9zb2bDrWEgZGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gRXhpc3RlbiBjdWF0cm8gcHJvYmxlbWFzIGZpbG9zw7NmaWNvcyBkZWwgbGVuZ3VhamU6IC0tPg0KDQo8IS0tICMjIyAqKkxhIG5hdHVyYWxlemEgZGVsIHNpZ25pZmljYWRvIGVuIGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfTmF0dXJhbGV6YVNpZ25pZmljYWRvLmpwZyI+PC9jZW50ZXI+IC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSArIExhIG5hdHVyYWxlemEgZGVsIHNpZ25pZmljYWRvIGVuIGVsIGxlbmd1YWplIHNlIHByZW9jdXBhIGRlIGxhIHNlbcOhbnRpY2EgZGUgdW4gbGVuZ3VhamUgeSBsYSBuYXR1cmFsZXphIGRlbCBzaWduaWZpY2FkbyBlbiBzw60uICAtLT4NCjwhLS0gKyBGaWzDs3NvZm9zIHkgbGluZ8O8aXN0YXMgaW50ZW50YW4gZW5jb250cmFyIHF1w6kgc2lnbmlmaWNhICoqKnNpZ25pZmljYXIqKiosIGPDs21vIGVsIHNpZ25pZmljYWRvIGRlIHVuYSBwYWxhYnJhIHUgb3JhY2nDs24gc2Ugb3JpZ2luYSB5IGPDs21vIHNlIGhhIGZvcm1hZG8uIC0tPg0KPCEtLSArIMK/Q8OzbW8gbGFzIHBhbGFicmFzIGZvcm1hcm9uIHJlbGFjaW9uZXMgeSBwb3IgcXXDqSBhcGFyZWNlbiBsb3Mgc2luw7NuaW1vcz8gLS0+DQo8IS0tICsgwr9Dw7NtbyBsYXMgcGFsYWJyYXMsIGNvbiBzdXMgcHJvcGlvcyBzaWduaWZpY2Fkb3Mgc2UgdW5lbiBwYXJhIGZvcm1hciBvcmFjaW9uZXMgY29uIHN1IHByb3BpbyBzaWduaWZpY2Fkbz8gLS0+DQo8IS0tICsgRXN0byBzZSBwdWVkZSByZXByZXNlbnRhciB5IGFuYWxpemFyIGRlIGRpdmVyc2FzIG1hbmVyYXM6IGVtaXNvcmVzIHkgcmVjZXB0b3Jlcywgw6FyYm9sZXMgc2ludMOhY3RpY2FzIChwYXJzZSB0cmVlcykuIC0tPg0KDQo8IS0tICMjIyAqKkVsIHVzbyBkZWwgbGVuZ3VhamUqKiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gPGNlbnRlcj48aW1nIHdpZHRoPSI4MCUiIHNyYz0iZmlncy8wMV9BY3RvSGFibGEuanBnIj48L2NlbnRlcj4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICsgU2UgcHJlb2N1cGEgZGUgY8OzbW8gZWwgbGVuZ3VhamUgZXMgdXNhZG8gZW4gdmFyaW9zIGVzY2VuYXJpb3MgeSB0aXBvcyBkZSBjb211bmljYWNpw7NuIGVudHJlIHNlcmVzIGh1bWFub3MuIC0tPg0KPCEtLSArIEluY2x1eWUgZWwgZXN0dWRpbyBkZSBsYSBpbnRlbmNpw7NuLCBlbCB0b25vLCBlbCBjb250ZW5pZG8geSBsYXMgYWNjaW9uZXMgZW52dWVsdGFzIGVuIGxhIGV4cHJlc2nDs24gZGUgdW4gbWVuc2FqZSAoYWN0byBkZWwgaGFibGEgbyAqc3BlZWNoIGFjdCopLiAtLT4NCjwhLS0gKyBDb25jZXB0b3MgbcOhcyBhdmFuemFkb3Mgc2UgcmVsYWNpb25hbiBhbCBvcmlnZW4gZGUgbGEgY3JlYWNpw7NuIGRlbCBsZW5ndWFqZSB5IGxhcyBhY3RpdmlkYWRlcyBjb2duaXRpdmFzIGh1bWFuYXMsIHJlc3BvbnNhYmxlcyBkZSBsYSBhZHF1aXNpY2nDs24geSB1c28gZGVsIGxlbmd1YWplLiAtLT4NCg0KPCEtLSAjIyMgKipMYSBjb2duaWNpw7NuIGRlbCBsZW5ndWFqZSoqIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0NvZ25pY2lvbi5qcGciPjwvY2VudGVyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gKyBTZSBjZW50cmEgZW4gY8OzbW8gbGFzIGZ1bmNpb25lcyBjb2duaXRpdmFzIGRlbCBjZXJlYnJvIGh1bWFubyBzb24gcmVzcG9uc2FibGVzIGRlIGVudGVuZGVyIGUgaW50ZXJwcmV0YXIgZWwgbGVuZ3VhamUuIC0tPg0KPCEtLSArIExhIGNvZ25pY2nDs24gaW50ZW50YSBlbmNvbnRyYXIgY8OzbW8gbGEgbWVudGUgdHJhYmFqYSBhbCBjb21iaW5hciB5IHJlbGFjaW9uYXIgcGFsYWJyYXMgZXNwZWPDrWZpY2FzIGVuIG9yYWNpb25lcyB5IHVuIG1lbnNhamUgY29uIHNpZ25pZmljYWRvLiAtLT4NCg0KPCEtLSAjIyMgKipMYSByZWxhY2nDs24gZW50cmUgZWwgbGVuZ3VhamUgeSBsYSByZWFsaWRhZCoqIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX1RyaWFuZ3Vsb1NlbWlvdGljby5qcGciPjwvY2VudGVyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gKyBFeHBsb3JhIGxhIGV4dGVuc2nDs24gZGUgdmVyb3NpbWlsaXR1ZCBkZSBsYXMgZXhwcmVzaW9uZXMgcXVlIHNlIG9yaWdpbmFuIGVuIGVsIGxlbmd1YWplLiAtLT4NCjwhLS0gKyBMb3MgZmlsw7Nzb2ZvcyBidXNjYW4gbWVkaXIgcXXDqSB0YW50byByZXByZXNlbnRhbiBlc3RhcyBleHByZXNpb25lcyBsb3MgaGVjaG9zLiAtLT4NCjwhLS0gKyBTZSByZWxhY2lvbmEgbGFzIGV4cHJlc2lvbmVzIGNvbiBsbyBxdWUgc3VjZWRlIGVuIGVsIG11bmRvLiAtLT4NCjwhLS0gKyBUYWxlcyByZWxhY2lvbmVzIHB1ZWRlbiBzZXIgZXhwcmVzYWRhcyBkZSBtdWNoYXMgbWFuZXJhcy4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfRGlyZWN0aW9uT2ZGaXQucG5nIj48L2NlbnRlcj4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICMjICoqMS4zLiBBZHF1aXNpY2nDs24gZGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gRXN0YSBzZSBkZWZpbmUgY29tbyBlbCBwcm9jZXNvIGEgdHJhdsOpcyBkZWwgY3VhbCBlbCBzZXIgaHVtYW5vIHV0aWxpemEgc3VzIGhhYmlsaWRhZGVzIGNvZ25pdGl2YXMsIGNvbm9jaW1pZW50byB5IGV4cGVyaWVuY2lhIHBhcmEgZW50ZW5kZXIgZWwgbGVuZ3VhamUgZW4gYmFzZSBhIGVzY3VjaGFyIHkgcGVyY2liaXIgcGFsYWJyYXMgeSBvcmFjaW9uZXMgcGFyYSBjb211bmljYXJzZSBjb24gb3Ryb3MuIC0tPg0KDQo8IS0tIEV4aXN0ZW4gdmFyaWFzIHRlb3LDrWFzIGFjZXJjYSBkZSBsYSBhZHF1aXNpY2nDs24gZGVsIGxlbmd1YWplOiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gPGNlbnRlcj48aW1nIHdpZHRoPSI4MCUiIHNyYz0iZmlncy8wMV9BZHF1aXNpY2lvbi5qcGciPjwvY2VudGVyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gKyAqKlByaW1lcm9zIGZpbMOzc29mb3MqKjogSGFiaWxpZGFkIG90b3JnYWRhIHBvciBEaW9zLiAtLT4NCjwhLS0gKyAqKlBsYXTDs24qKjogTWFwZW8gcGFsYWJyYS1zaWduaWZpY2Fkby4gLS0+DQo8IS0tICsgKipCLiBTa2lubmVyKio6IFJlZnVlcnpvIGRlIGxhIG1lbW9yaWEgYW50ZSBlc3TDrW11bG9zIChhY29uZGljaW9uYW1pZW50byBpbnN0cnVtZW50YWwgdSBvcGVyYXRpdm8pLiAtLT4NCjwhLS0gKyAqKk4uIENob21za3kqKjogQXByZW5kaXphamUgc3VnZXJpZG8gcG9yIFNraW5uZXIgbcOhcyBpbmZlcmVuY2lhIGRlIHJlZ2xhcyBkZSBzaW50YXhpcywgc2Vtw6FudGljYSwgY29uY2VwdG9zIHkgZ3JhbcOhdGljYS4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICMjICoqMS40LiBVc28gZGVsIGxlbmd1YWplKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfVXNvTGVuZ3VhamUuanBnIj48L2NlbnRlcj4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIFNlIGhhYmxhIGRlIGNvbmNlcHRvcyByZWxhY2lvbmFkb3MgYSBsb3MgImFjdG9zIGRlbCBoYWJsYSIgcXVlIGRlZmluZW4gY29tbyB1biBsZW5ndWFqZSBlcyB1c2FkbyBlbiBsYSBjb211bmljYWNpw7NuLiAtLT4NCg0KPCEtLSBFeGlzdGVuIDMgY2F0ZWdvcsOtYXMgZGUgImFjdG9zIGRlbCBoYWJsYSI6IC0tPg0KDQo8IS0tICsgKipMb2N1dGl2YSoqOiBFbWlzacOzbiB5IGVudHJlZ2EgZGVsIG1lbnNhamUuIC0tPg0KPCEtLSArICoqSWxvY3V0aXZhKio6IFNlbcOhbnRpY2EgeSBzaWduaWZpY2FkbyBkZWwgbWVuc2FqZS4gLS0+DQo8IS0tICsgKipQZXJsb2N1dGl2YSoqOiBFZmVjdG9zIGRlbCBtZW5zYWplIGVuIHN1IHJlY2VwdG9yLiAtLT4NCg0KPCEtLSBFeGlzdGVuIDUgY2xhc2VzIGRpc3RpbnRhcyBkZSBhY3RvcyAqaWxvY3V0aXZvcyo6IC0tPg0KDQo8IS0tICsgKipBc2VydGl2byoqOiBQcm9wb3NpY2nDs24gcXVlIHB1ZWRlIHNlciB2ZXJkYWRlcmEgbyBmYWxzYS4gLS0+DQo8IS0tICsgKipEaXJlY3Rpdm8qKjogUHJlZ3VudGEgbyBkaXJlY2Npw7NuIGRlIHJlYWxpemFyIGFsZ3VuYSBhY3RpdmlkYWQuIC0tPg0KPCEtLSArICoqQ29taXNpdm8qKjogQ29tcHJvbWlzbyBkZWwgZW1pc29yIGRlIHJlYWxpemFyIGFsZ8O6biBhY3RvIHZvbHVudGFyaW8uIC0tPg0KPCEtLSArICoqRXhwcmVzaXZvKio6IERpc3Bvc2ljacOzbiB1IG9waW5pw7NuIGhhY2lhIHVuYSBwcm9wb3NpY2nDs24gcGFydGljdWxhci4gLS0+DQo8IS0tICsgKipEZWNsYXJhY2nDs24qKjogQWN0byBkZWwgaGFibGEgY2FwYXogZGUgY2FtYmlhciBsYSByZWFsaWRhZCBlbiBiYXNlIGEgbGEgcHJvcG9zaWNpw7NuIGRlY2xhcmFkYS4gLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tICMjICoqMS40LiBMaW5nw7zDrXN0aWNhKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxhIGhyZWY9Imh0dHBzOi8vY2VzYXJhZ3VpbGFyLndlZWJseS5jb20vaW50cm9kdWNjaW9hY3V0ZW4tYS1sYS1saW5ndXVtbGlhY3V0ZXN0aWNhLWNvbXB1dGFjaW9uYWwuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPiAtLT4NCjwhLS0gPGltZyBzcmM9ImZpZ3MvMDFfUmFtYXNMaW5ndWlzdGljYS5wbmciIHdpZHRoPSI3NTAiIGhlaWdodD0iNTAwIiBib3JkZXI9IjEwIi8+PC9hPjxwIGNsYXNzPSJjYXB0aW9uIj5Dw6lzYXIgQWd1aWxhciwgTGluZ8O8w61zdGljYSBDb21wdXRhY2lvbmFsLCBjbGljayBlbiBsYSBpbWFnZW4uPC9wPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIFNlIGRlZmluZSBjb21vIGVsIGVzdHVkaW8gY2llbnTDrWZpY28gZGVsIGxlbmd1YWplLCBpbmNsdXllbmRvIGZvcm1hLCBzaW50YXhpcywgc2lnbmlmaWNhZG8geSBzZW3DoW50aWNhLiAtLT4NCg0KPCEtLSBQYXJhIGVsIGFuw6FsaXNpcyBkZSB0ZXh0byBlcyDDunRpbCBjb25vY2VyIGFsZ3VuYXMgw6FyZWFzIGRlIGxhIGxpbmfDvMOtc3RpY2EgeWEgcXVlIHNvbiB1c2FkYXMgZW4gdmFyaW9zIGFsZ29yaXRtb3MuIFNpbiBlbWJhcmdvIGVzIHByZWNpc28gbm8gb2x2aWRhciBxdWUgZXN0ZSBjYW1wbyBlcyBhbXBsaW8geSB2YSBtdWNoYSBtw6FzIGFsbMOhIGRlIG51ZXN0cm8gYW7DoWxpc2lzOiAtLT4NCg0KPCEtLSArICoqRm9uw6l0aWNhOioqIEVzIGVsIGVzdHVkaW8gZGUgbGFzIHByb3BpZWRhZGVzIGFjw7pzdGljYXMgZGUgbG9zIHNvbmlkb3MgcHJvZHVjaWRvcyBwb3IgbGEgdm96IGh1bWFuYSBkdXJhbnRlIGVsIGhhYmxhLiAtLT4NCjwhLS0gKyAqKkZvbm9sb2fDrWE6KiogRXN0dWRpbyBkZSBsb3MgcGF0cm9uZXMgZGUgc29uaWRvIG1pZW50cmFzIHNvbiBpbnRlcnByZXRhZG9zIGVuIGxhIG1lbnRlIGh1bWFuYSBwYXJhIGRpc3Rpbmd1aXIgZW50ZSBkaXN0aW50b3MgZm9uZW1hcy4gRXN0dWRpYSBhZGVtw6FzIGxvcyBhY2VudG9zLCB0b25vcyB5IGVzdHJ1Y3R1cmEgZGUgbGFzIHPDrWxhYmFzLiAtLT4NCjwhLS0gICArICpGb25lbWE6KiBFcyBsYSBhcnRpY3VsYWNpw7NuIG3DrW5pbWEgZGUgdW4gc29uaWRvLiBFeGlzdGVuIGFsIG1lbm9zIDIyIGVuIGVsIGVzcGHDsW9sIHkgNDUgZW4gZWwgaW5nbMOpcyAoaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvRm9uZW1hKS4gLS0+DQo8IS0tICsgKipTaW50YXhpczoqKiBFc3R1ZGlvIGRlIGxhcyBvcmFjaW9uZXMsIGZyYXNlcywgcGFsYWJyYXMgeSBzdXMgZXN0cnVjdHVyYXMgKGZyYXNlIHkgb3JhY2nDs24gc2UgZGlmZXJlbmNpYW4gZW4gZWwgdXNvIGRlbCB2ZXJibyBlbiBmb3JtYSBwZXJzb25hbCkuICpFbCBjYW1iaW8gZGUgb3JkZW4gZGUgbGFzIHBhbGFicmFzIHBvZHLDrWEgY2FtYmlhciBlbCBzZW50aWRvIGRlIGxhIG9yYWNpw7NuKiAqKip0b3RhbG1lbnRlKioqLiAtLT4NCjwhLS0gKyAqKlNlbcOhbnRpY2E6KiogRXN0dWRpbyBkZWwgc2lnbmlmaWNhZG8sIGRpdmlkaWRhIGVuIHNlbcOhbnRpY2EgbMOpeGljYSB5IGNvbXBvc2ljaW9uYWwuIC0tPg0KPCEtLSAgICsgKlNlbcOhbnRpY2EgbMOpeGljYToqIEVzdHVkaW8gZGVsIHNpZ25pZmljYWRvIGRlIGxhcyBwYWxhYnJhcyB5IHPDrW1ib2xvcyB1c2FuZG8gbW9yZm9sb2fDrWEgeSBzaW50YXhpcyAocmVsYWNpb25lcyBzaW1wbGVzKS4gLS0+DQo8IS0tICAgKyAqU2Vtw6FudGljYSBjb21wb3NpY2lvbmFsOiogRXN0dWRpbyBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBwYWxhYnJhcyB5IGNvbWJpbmFjaW9uZXMgZGUgcGFsYWJyYXMgcGFyYSBlbnRlbmRlciBlbCBzaWduaWZpY2FkbyBkZSBmcmFzZXMgeSBvcmFjaW9uZXMgKHJlbGFjaW9uZXMgY29tcGxlamFzKS4gLS0+DQo8IS0tICsgKipNb3Jmb2xvZ8OtYToqKiBFc3R1ZGlvIGRlIGxhIGVzdHJ1Y3R1cmEgeSBzaWduaWZpY2FkbyBkZSBsb3MgbW9yZmVtYXMuIExvcyBtb3JmZW1hcyBzb24gbGEgdW5pZGFkIG3DoXMgcGVxdWXDsWEgZGVsIGxlbmd1YWplIHF1ZSB0aWVuZSB1biBzaWduaWZpY2Fkby4gLS0+DQo8IS0tICsgKipMw6l4aWNvOioqIEVzdHVkaW8gZGUgbGFzIHByb3BpZWRhZGVzIGRlIGxhIHBhbGFicmFzIHkgZnJhc2VzIHVzYWRhcyBlbiB1biBsZW5ndWFqZSB5IGNvbW8gY29uc3RydXllbiBlbCB2b2NhYnVsYXJpby4gLS0+DQo8IS0tICsgKipQcmFnbcOhdGljYToqKiBFc3R1ZGlvIGRlIGPDs21vIGZhY3RvcmVzIGxpbmfDvMOtc3RpY29zIHkgbm8gbGluZ8O8w61zdGljb3MgYWZlY3RhbiBlbCBzaWduaWZpY2FkbyBkZSB1biBtZW5zYWplLiAtLT4NCjwhLS0gKyAqKkFuw6FsaXNpcyBkZWwgZGlzY3Vyc286KiogQW5hbGl6YSBlbCBsZW5ndWFqZSB5IGVsIGludGVyY2FtYmlvIGRlIGluZm9ybWFjacOzbiBhIG1vZG8gZGUgb3JhY2lvbmVzIGVuIGNvbnZlcnNhY2lvbmVzLiBFc3RhcyBjb252ZXJzYWNpb25lcyBwdWVkZW4gc2VyIGVzY3JpdGFzLCBoYWJsYWRhcyBvIGVuIHNlw7Fhcy4gLS0+DQo8IS0tICsgKipFc3RpbMOtc3RpY2E6KiogRXN0dWRpYSBlbCBsZW5ndWFqZSBjZW50csOhbmRvc2UgZW4gZWwgZXN0aWxvIGRlIGVzY3JpdHVyYSB5IHRvZG8gbG8gcXVlIGVsbG8gY29ubGxldmEuIC0tPg0KPCEtLSArICoqU2VtacOzdGljYToqKiBFc3R1ZGlhIGxvcyBzaWdub3MsIHPDrW1ib2xvcyB5IHByb2Nlc29zIGRlIHNlw7FhbGVzIHkgY8OzbW8gY29tdW5pY2FuIHNpZ25pZmljYWRvcy4gQ29zYXMgY29tbyBsb3Mgc2ltYm9saXNtb3MsIGFuYWxvZ8OtYXMgeSBtZXTDoWZvcmFzIHNvbiBjdWJpZXJ0YXMgcG9yIGVzdGEgw6FyZWEuIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCjwhLS0gPGNlbnRlcj48YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0xlbmluL3N0YXR1cy8xMjgwMjM2MTQzNTc4MTU3MDU2P3JlZl9zcmM9dHdzcmMlNUVnb29nbGUlN0N0d2NhbXAlNUVzZXJwJTdDdHdnciU1RXR3ZWV0IiB0YXJnZXQ9Il9ibGFuayI+IC0tPg0KPCEtLSA8aW1nIHNyYz0iZmlncy8wMV9Nb3Jlbm8ucG5nIiB3aWR0aD0iNzUwIiBoZWlnaHQ9IjUwMCIgYm9yZGVyPSIxMCIvPjwvYT48cCBjbGFzcz0iY2FwdGlvbiI+VHdlZXQgZGUgTGVuw61uIE1vcmVubywgY2xpY2sgZW4gbGEgaW1hZ2VuLjwvcD48L2NlbnRlcj4gLS0+DQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSBgYGB7cn0gLS0+DQo8IS0tIE1vcmVub3R3ZWV0ID0gJ8KhRW4gdW4gbW9tZW50byBjcsOtdGljbywgbG9ncmFtb3MgdW4gYWN1ZXJkbyBoaXN0w7NyaWNvIGNvbiBsb3MgbcOhcyBpbXBvcnRhbnRlcyB0ZW5lZG9yZXMgZGUgbGEgZGV1ZGEgcXVlIG5vcyBwZXJtaXRpcsOhIGxpYmVyYXIgVVMkMTYuMDAwIG1pbGxvbmVzIGRlIHBhZ28gZGUgbGEgZGV1ZGEgZW4gbG9zIHByw7N4aW1vcyAxMCBhw7FvcyEgI0p1bnRvc0VjdWFkb3InIC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vTGFzc29HdWlsbGVybW8vc3RhdHVzLzEyNzk5NzY2Mzc2Nzc5Mjg0NTQ/cmVmX3NyYz10d3NyYyU1RWdvb2dsZSU3Q3R3Y2FtcCU1RXNlcnAlN0N0d2dyJTVFdHdlZXQiIHRhcmdldD0iX2JsYW5rIj4gLS0+DQo8IS0tIDxpbWcgc3JjPSJmaWdzLzAxX0xhc3NvLnBuZyIgd2lkdGg9Ijc1MCIgaGVpZ2h0PSI1MDAiIGJvcmRlcj0iMTAiLz48L2E+PHAgY2xhc3M9ImNhcHRpb24iPlR3ZWV0IGRlIEd1aWxsZXJtbyBMYXNzbywgY2xpY2sgZW4gbGEgaW1hZ2VuLjwvcD48L2NlbnRlcj4gLS0+DQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSBgYGB7cn0gLS0+DQo8IS0tIExhc3NvVHdlZXQgPSAnR3JhbiBlbnRyZXZpc3RhIGVuIEBDYW5hbFVub1R2IGNvbiBSYWZhZWwgQ3Vlc3RhLiBNdWNoYXMgZ3JhY2lhcyBwb3IgcmVjaWJpcm1lIHkgYWJyaXIgdW4gZXNwYWNpbyBwYXJhIGNvbnZlcnNhciBzb2JyZSBsYXMgcHJlb2N1cGFjaW9uZXMgZGUgbG9zIGVjdWF0b3JpYW5vcyBjb24gbWlyYXMgYWwgMjAyMS4gVmFtb3MgYSBzYWx2YXIgYWwgRWN1YWRvciDwn5Kq8J+PvPCfh6rwn4eoLicgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSAjIyAqKjEuNS4gU2ludGF4aXMgeSBlc3RydWN0dXJhIGRlbCBsZW5ndWFqZSoqIC0tPg0KDQo8IS0tIEVsIGNvbm9jZXIgbGEgZXN0cnVjdHVyYSB5IGxhIHNpbnRheGlzIGRlbCBsZW5ndWFqZSBlcyDDunRpbCBwYXJhIGVsIHByb2Nlc2FtaWVudG8gZGUgdGV4dG8sIHJlYWxpemFyIGFub3RhY2lvbmVzIHkgYW7DoWxpc2lzIHNpbnTDoWN0aWNvLCBxdWUgbHVlZ28gc2Vyw6FuIHVzYWRvcyBlbiBsYSBjbGFzaWZpY2FjacOzbiB5IHJlc3VtZW4gZGVsIHRleHRvLiAtLT4NCg0KPCEtLSBFbiBlbCBlc3Bhw7FvbCBsYXMgcGFsYWJyYXMgc2UgdW5lbiBwYXJhIGZvcm1hciB1bmlkYWRlcyBjb25zdGl0dXllbnRlcyBkZSBsYSBlc3RydWN0dXJhIGplcsOhcnF1aWNhIGRlIGxhIG9yYWNpw7NuLiAtLT4NCg0KPCEtLSAjIyMgKipFc3RydWN0dXJhIGplcsOhcnF1aWNhIGRlIGxhIG9yYWNpw7NuKiogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX0VzdHJ1Y3R1cmFKZXJhcnF1aWNhT3JhY2lvbi5wbmciPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIExvcyBub2RvcyBzZSBjb21wb25lbiBkZSBsYSB1bmlkYWQgbcOhcyBwZXF1ZcOxYSBkZSBsYSBvcmFjacOzbiAocGFsYWJyYSwgc8OtbWJvbG9zIHRlcm1pbmFsZXMpLCBzdXMgY29tYmluYWNpb25lcyBmb3JtYW4gc2ludGFnbWFzIChmcmFzZXMsIHPDrW1ib2xvcyBubyB0ZXJtaW5hbGVzKSB5IHN1IHVuacOzbiBmaW5hbDsgbGEgb3JhY2nDs24gKHF1ZSBwdWVkZSBzZXIgc2ltcGxlIG8gY29tcGxlamEpLiBFc3RhcyBvcmFjaW9uZXMgYWRlbcOhcyBwdWVkZW4gc2VyIGNvbWJpbmFkYXMgcGFyYSBmb3JtYXIgdGV4dG9zICh2aXNpdGEgZWwgbGluayBhIHVuIFthbmFsaXphZG9yIHNpbnTDoWN0aWNvXShodHRwczovL3NpbnRheGlzLm9yZy9hbmFsaXphZG9yLykgbyBhbCBvdHJvIFthbmFsaXphZG9yIHNpbnTDoWN0aWNvXShodHRwczovL3d3dy5teXN0aWx1cy5jb20vaGVycmFtaWVudGFzL2FuYWxpemFkb3ItbW9yZm9zaW50YWN0aWNvKSkuIC0tPg0KDQo8IS0tIDxicj48L2JyPiAtLT4NCjwhLS0gPGNlbnRlcj48aW1nIHdpZHRoPSI4MCUiIHNyYz0iRmlncy8wMV9BbmFsaXNpc1NpbnRhY3RpY29Nb3Jlbm8ucG5nIj48cCBjbGFzcz0iY2FwdGlvbiI+VHdlZXQgZGUgTGVuw61uIE1vcmVubywgYW7DoWxpc2lzIHNpbnTDoWN0aWNvLjwvcD48L2NlbnRlcj4gLS0+DQo8IS0tIDxicj48L2JyPiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQo8IS0tIDxjZW50ZXI+PGltZyB3aWR0aD0iODAlIiBzcmM9IkZpZ3MvMDFfQW5hbGlzaXNTaW50YWN0aWNvTGFzc28ucG5nIj48cCBjbGFzcz0iY2FwdGlvbiI+VHdlZXQgZGUgR3VpbGxlcm1vIExhc3NvLCBhbsOhbGlzaXMgc2ludMOhY3RpY28uPC9wPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIFkgZW4gUiB1dGlsaXphcmVtb3MgcGFyYSBlamVtcGxpZmljYXIsIHVuIG1vZGVsbyBlbnRyZW5hZG8gcG9yIFtVRFBpcGUsIGRlIGxhIEZhY3VsdGFkIGRlIE1hdGVtw6F0aWNhcyB5IEbDrXNpY2EgZGUgbGEgVW5pdmVyc2lkYWQgZGUgUmVww7pibGljYSBDaGVjYV0oaHR0cDovL3VmYWwubWZmLmN1bmkuY3ovdWRwaXBlKTogLS0+DQoNCjwhLS0gYGBge3J9IC0tPg0KPCEtLSAjIENhcmdhIHLDoXBpZGEgZGUgbGlicmVyw61hcyAtLT4NCjwhLS0gbGlicmFyeSh1ZHBpcGUpIC0tPg0KPCEtLSBsaWJyYXJ5KHRpZHl2ZXJzZSkgLS0+DQo8IS0tIGBgYCAtLT4NCg0KDQo8IS0tIGBgYHtyfSAtLT4NCjwhLS0gIyBEZXNjYXJnYSBkZSBtb2RlbG8gcHJlZW50cmVuYWRvIHVkcGlwZSAgLS0+DQo8IS0tICN1ZHBpcGU6OnVkcGlwZV9kb3dubG9hZF9tb2RlbCgnc3BhbmlzaCcpICMgRGVzY29tZW50YXIgYWwgZWplY3V0YXIgcG9yIHByaW1lcmEgdmV6IC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gVHdlZXQgZGUgR3VpbGxlcm1vIExhc3NvIGNvbiBhbm90YWNpb25lczogLS0+DQoNCjwhLS0gYGBge3J9IC0tPg0KPCEtLSAjIEVqZW1wbG8gZGUgZXRpcXVldGFkbyBQT1MgKHR3ZWV0IGRlIExhc3NvKSAtLT4NCjwhLS0gbGlicmFyeShzdHJpbmdpKSAtLT4NCjwhLS0gbW9kZWwgPSB1ZHBpcGVfbG9hZF9tb2RlbChmaWxlID0gInNwYW5pc2gtZ3NkLXVkLTIuNC0xOTA1MzEudWRwaXBlIikgLS0+DQo8IS0tIExhc3NvVHdlZXRfYW5ub3RhdGVkID0gdWRwaXBlX2Fubm90YXRlKG1vZGVsLCB4ID0gc3RyaV9lbmNfdG91dGY4KExhc3NvVHdlZXQpKSAtLT4NCjwhLS0gTGFzc29Ud2VldF9hbm5vdGF0ZWQgPSBhc190aWJibGUoTGFzc29Ud2VldF9hbm5vdGF0ZWQsIGVuY29kaW5nPSJsYXRpbi0xIikgLS0+DQo8IS0tIExhc3NvVHdlZXRfYW5ub3RhdGVkWywgYygidG9rZW4iLCJsZW1tYSIsInVwb3MiKV0gLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSBUd2VldCBkZSBMZW5pbiBNb3Jlbm8gY29uIGFub3RhY2lvbmVzOiAtLT4NCg0KPCEtLSBgYGB7cn0gLS0+DQo8IS0tICMgRWplbXBsbyBkZSBldGlxdWV0YWRvIFBPUyAodHdlZXQgZGUgTGVubmluKSAtLT4NCjwhLS0gTW9yZW5vdHdlZXRfYW5ub3RhdGVkID0gdWRwaXBlX2Fubm90YXRlKG1vZGVsLCB4ID0gc3RyaV9lbmNfdG91dGY4KE1vcmVub3R3ZWV0KSkgLS0+DQo8IS0tIE1vcmVub3R3ZWV0X2Fubm90YXRlZCA9IGFzX3RpYmJsZShNb3Jlbm90d2VldF9hbm5vdGF0ZWQpIC0tPg0KPCEtLSBNb3Jlbm90d2VldF9hbm5vdGF0ZWRbLCBjKCJ0b2tlbiIsImxlbW1hIiwidXBvcyIpXSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tICMjIyAqKlBhbGFicmFzKiogLS0+DQoNCjwhLS0gU29uIGxhIHVuaWRhZCBtw6FzIHBlcXVlw7FhIGRlbCBsZW5ndWFqZSwgc29uIGluZGVwZW5kaWVudGVzIHkgdGllbmVuIHN1IHByb3BpbyBzaWduaWZpY2Fkby4gTG9zIG1vcmZlbWFzIGVuIGNhbWJpbyBubyBzb24gaW5kZXBlbmRpZW50ZXMuIEVsIG1vcmZlbWEgZXMgbGEgcGFydGUgZGUgbGEgcGFsYWJyYSAgcXVlIHZhcsOtYS4gLS0+DQoNCjwhLS0gUG9yIGxvIGdlbmVyYWwgZXMgw7p0aWwgZXRpcXVldGFyIGxhcyBwYWxhYnJhcyB5IGFuYWxpemFybGFzIGNvbW8gKiJwYXJ0ZXMgZGVsIGhhYmxhIiogKGV0aXF1ZXRhZG8gKipQT1MqKiwgcGFydHMgb2Ygc3BlZWNoKS4gRXN0YXMgZXRpcXVldGFzIHNvbjogLS0+DQoNCjwhLS0gKyAqU3VzdGFudGl2byAoTiwgbm91bikqIC0tPg0KPCEtLSArICpWZXJibyAoViwgdmVyYikqIC0tPg0KPCEtLSArICpBZGpldGl2byAoQWRqLCBhZGplY3RpdmUpKiAtLT4NCjwhLS0gKyAqQWR2ZXJiaW8gKEFkdiwgYWR2ZXJiKSogLS0+DQoNCjwhLS0gQ2FkYSB1bmEgZGUgZXN0YXMgcHVlZGUgc2VyIHN1YmRpdmlkaWRhIHNlZ8O6biBlbCBsZW5ndWFqZSBhbmFsaXphZG8gKFtTdGFuZm9yZCBOTFAgRkFRXShodHRwczovL25scC5zdGFuZm9yZC5lZHUvc29mdHdhcmUvc3BhbmlzaC1mYXEuc2h0bWwjdGFnc2V0KSkuIC0tPg0KDQo8IS0tICMjIyAqKlNpbnRhZ21hcyoqIC0tPg0KDQo8IS0tICsgRWwgc2ludGFnbWEgbm9taW5hbCAoU04sIE5QKSBlcyBhcXVlbCBxdWUgZXN0w6EgY29uc3RpdHVpZG8gYWxyZWRlZG9yIGRlIHVuIHN1c3RhbnRpdm8gbyBwcm9ub21icmUuICpMYSBtYWRyZS4qIC0tPg0KPCEtLSArIEVsIHNpbnRhZ21hIHZlcmJhbCAoU1YsIFZQKSBlcyBhcXVlbCBjdXlvIG7DumNsZW8gZXN0w6EgY29tcHVlc3RvIHBvciB1bmEgZm9ybWEgdmVyYmFsLiAqQ29tcHLDsyB1biBsaWJyby4qIC0tPg0KPCEtLSArIEVsIHNpbnRhZ21hIHByZXBvc2ljaW9uYWwgKFNQLCBQUCkgZXMgYXF1ZWwgcXVlIGVzdMOhIGZvcm1hZG8gcG9yIHVuIHByZXBvc2ljacOzbiB5IHVuIHTDqXJtaW5vIGN1eW8gbsO6Y2xlbyBwdWVkZSBzZXIgdW4gc3VzdGFudGl2bywgdW4gYWRqZXRpdm8gbyB1biBhZHZlcmJpby4gKkNvbiBzdSBsbGF2ZSogLS0+DQo8IS0tICsgRWwgc2ludGFnbWEgYWRqZXRpdm8gKFNBZGosIEFESlApIGVzIGFxdWVsIGN1eW8gbsO6Y2xlbyBlc3TDoSBjb21wdWVzdG8gcG9yIHVuIGFkamV0aXZvLiAqU29ycHJlbmRlbnRlbWVudGUgZsOhY2lsLiogLS0+DQo8IS0tICsgRWwgc2ludGFnbWEgYWR2ZXJiaWFsIChTQWR2LCBBRFZQKSBlcyBhcXVlbCBjdXlvIG7DumNsZW8gZXN0w6EgY29tcHVlc3RvIHBvciB1biBhZHZlcmJpby4gKkNlcmNhIGRlIHRvZG8uKiAtLT4NCg0KDQo8IS0tICMjICoqMS42LiBHcmFtw6F0aWNhKiogLS0+DQoNCjwhLS0gRXN0YSBjb25zaXN0ZSBlbiB1biBjb25qdW50byBkZSByZWdsYXMgdXNhZGFzIHBhcmEgZGV0ZXJtaW5hciBjw7NtbyBwb3NpY2lvbmFyIHBhbGFicmFzLCBmcmFzZXMgeSBjbMOhdXN1bGFzIGFsIG1vbWVudG8gZGUgY29uc3RydWlyIG9yYWNpb25lcyBwYXJhIGN1YWxxdWllciBsZW5ndWFqZSBuYXR1cmFsLiBBeXVkYSBhIGhhYmlsaXRhciB0YW50byBsYSBzaW50YXhpcyBjb21vIGxhIGVzdHJ1Y3R1cmEgZW4gZWwgbGVuZ3VhamUuIEFsZ3VuYXMgZGUgc3VzIGNhcmFjdGVyw61zdGljYXMgc29uOiAtLT4NCg0KPCEtLSArIExhIGdyYW3DoXRpY2Egbm8gc2UgbGltaXRhIHNvbG8gYWwgbGVuZ3VhamUgZXNjcml0bywgeWEgcXVlIG9wZXJhIHRhbWJpw6luIHZlcmJhbG1lbnRlLiAtLT4NCjwhLS0gKyBTdXMgcmVnbGFzIHB1ZWRlbiBzZXIgZXNwZWPDrWZpY2FzIGEgdW5hIHJlZ2nDs24sIGxlbmd1YWplIG8gZGlhbGVjdG8sIG8gYSBzdSB2ZXo7IHNlciBhbGdvIHVuaXZlcnNhbGVzIGNvbW8gZWwgbW9kZWxvIHN1amV0by12ZXJiby1vYmpldG8gKFNWTykuIC0tPg0KPCEtLSArIFN1IGV2b2x1Y2nDs24gc2UgYmFzYSBlbiBlbCB1c28gZGVsIGxlbmd1YWplIGEgdHJhdsOpcyBkZWwgdGllbXBvLiAtLT4NCg0KPCEtLSAjIyAqKjEuNy4gVGlwb2xvZ8OtYSBkZWwgb3JkZW4gZGUgbGFzIHBhbGFicmFzKiogLS0+DQoNCjwhLS0gTGEgdGlwb2xvZ8OtYSBjb21vIHBhcnRlIGRlIGxhIGxpbmfDvMOtc3RpY2EgZXMgdW4gY2FtcG8gcXVlIHRyYXRhIGRlIGNsYXNpZmljYXIgbG9zIGxlbmd1YWplcyBiYXPDoW5kb3NlIGVuIHN1IHNpbnRheGlzLCBlc3RydWN0dXJhIHkgZnVuY2lvbmFsaWRhZC4gVW5hIGRlIGxhIG1hbmVyYSBtw6FzIGNvbXVuZXMgZGUgY2xhc2lmaWNhciB1biBsZW5ndWFqZSBlcyBhIHRyYXbDqXMgZGVsIG9yZGVuIGRvbWluYW50ZSBkZSBzdXMgcGFsYWJyYXMsIGNvbm9jaWRvIGNvbW8gbGEgdGlwb2xvZ8OtYSBkZWwgb3JkZW4gZGUgbGFzIHBhbGFicmFzLiBSdXNlbGwgVG9tbGluIGVuIDE5ODYgc3VnZXLDrWEgZWwgc2lndWllbnRlIGFuw6FsaXNpczogLS0+DQoNCjwhLS0gPGJyPjwvYnI+IC0tPg0KPCEtLSA8Y2VudGVyPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJGaWdzLzAxX1RpcG9sb2dpYU9yZGVuLnBuZyI+PC9jZW50ZXI+IC0tPg0KPCEtLSA8YnI+PC9icj4gLS0+DQoNCjwhLS0gIyMgKioxLjguIFNlbcOhbnRpY2EqKiAtLT4NCg0KPCEtLSBFcyBlbCBlc3R1ZGlvIGRlbCBzaWduaWZpY2FkbyBlbiBlbCBsZW5ndWFqZSwgbGFzIHJlbGFjaW9uZXMgZW50cmUgcGFsYWJyYXMsIGZyYXNlcyB5IHPDrW1ib2xvczsgYXPDrSBjb21vIGVsIGNvbm9jaW1pZW50byBxdWUgcmVwcmVzZW50YW4uIC0tPg0KDQo8IS0tICsgQSBwYXJ0aXIgZGUgdW5hIHBhbGFicmEgc2UgcHVlZGVuIGFybWFyIHJlZGVzIHNlbcOhbnRpY2FzOiBodHRwczovL3d3dy5ub2RlYm94Lm5ldC9wZXJjZXB0aW9uLiAtLT4NCjwhLS0gKyBMYSBzZW3DoW50aWNhIHNlIHB1ZWRlIHJlcHJlc2VudGFyIGEgdHJhdsOpcyBkZSBsYSAqKmzDs2dpY2EgcHJvcG9zaWNpb25hbCoqIHkgbGEgKipsw7NnaWNhIGRlIHByaW1lciBvcmRlbioqIChGT0wpLCBlbiBlc3BlY2lhbCBjdWFuZG8gYW5hbGl6YW1vcyBtZW5zYWplcyBlc2NyaXRvcyBvIGhhYmxhZG9zIChsYSBwcmluY2lwYWwgZm9ybWEgZGUgY29tdW5pY2Fyc2UgZGVsIHNlciBodW1hbm8pLiAtLT4NCg0KPCEtLSA8YnI+PC9icj4gLS0+DQo8IS0tIDxjZW50ZXI+IC0tPg0KPCEtLSA8aW1nIHNyYz0iZmlncy8wMV9GT0xFamVtcGxvLnBuZyIgd2lkdGg9Ijc1MCIgaGVpZ2h0PSI1MDAiIGJvcmRlcj0iMTAiLz48L2E+PHAgY2xhc3M9ImNhcHRpb24iPkzDs2dpY2EgZGUgcHJpbWVyIG9yZGVuLCBMaW5nw7zDrXN0aWNhIENvbXB1dGFjaW9uYWwuPC9wPjwvY2VudGVyPiAtLT4NCjwhLS0gPGJyPjwvYnI+IC0tPg0KDQo8IS0tIExhcyByZWxhY2lvbmVzIGzDqXhpY28tc2Vtw6FudGljYXMgcG9yIHN1IGxhZG8gc2UgcHJlb2N1cGFuIGRlIGlkZW50aWZpY2FyIGxhIHJlbGFjacOzbiBzZW3DoW50aWNhIGVudHJlIHVuaWRhZGVzIGRlbCBsw6l4aWNvIChtb3JmZW1hcykuIEFsZ3Vub3MgY29uY2VwdG9zIGNsYXZlIGRlIGxhcyByZWxhY2lvbmVzIGzDqXhpY28tc2Vtw6FudGljYXMgcXVlIGRlYmVtb3MgY29ub2NlciBzb246IC0tPg0KDQo8IS0tICsgKipMZW1hOioqIEVzIGxhIGZvcm1hIGNhbsOzbmljYSBkZSB1biBjb25qdW50byBkZSBwYWxhYnJhcy4gRXMgZGVjaXIgcXVlIGVzIHVzdWFsbWVudGUgbGEgZm9ybWEgYmFzZSBkZSBkaWNobyBjb25qdW50by4gLS0+DQo8IS0tICsgKipIb23Ds25pbW9zIChIb23Ds2dyYWZvcy1Ib23Ds2ZvbmFzKToqKiBTb24gcGFsYWJyYXMgcXVlIGNvbXBhcnRlbiBsYSBtaXNtYSBmb3JtYSBkZSBlc2NyaWJpciAoaG9tw7NncmFmb3MpIG8gcHJvbnVuY2lhciAoaG9tw7NuaW1hcykgcGVybyBzaWduaWZpY2FuIGNvc2FzIGRpc3RpbnRhcy4gTGFzIHBhbGFicmFzIGhvbcOzZm9uYXMgc29uIGVuIGdlbmVyYWwgdW4gZ3JhbiBwcm9ibGVtYSBwYXJhIGVsIE5MUC4gLS0+DQo8IS0tICsgKipQb2xpc2VtYXM6KiogU29uIHBhbGFicmFzIHF1ZSBzZSBlc2NyaWJlbiBpZ3VhbCBwZXJvIHRpZW5lbiBzaWduaWZpY2Fkb3MgZGlzdGludG9zLCBhdW5xdWUgcmVsYWNpb25hZG9zIHNlZ8O6biBzdSBjb250ZXh0by4gLS0+DQo8IS0tICsgKipDYXBpdMOzbmltb3M6KiogU29uIHBhbGFicmFzIHF1ZSBzZSBlc2NyaWJlbiBpZ3VhbCBwZXJvIHRpZW5lbiBzaWduaWZpY2Fkb3MgZGlzdGludG9zIGN1YW5kbyBzb24gZXNjcml0YXMgY29uIG1hecO6c2N1bGFzLiAtLT4NCjwhLS0gKyAqKlNpbsOzbmltb3M6KiogU29uIGFxdWVsbGFzIHBhbGFicmFzIHF1ZSBzZSBlc2NyaWJlbiB5IHByb251bmNpYW4gZGlzdGludG8gcGVybyBzaWduaWZpY2FuIGxvIG1pc21vIGVuIGNhc2kgY3VhbHF1aWVyIGNvbnRleHRvLCB5IHB1ZWRlbiBzZXIgcmVlbXBsYXphZGFzIHVuYXMgcG9yIG90cmFzLiAtLT4NCjwhLS0gKyAqKkFudMOzbmltb3M6KiogU29uIHBhcmVzIGRlIHBhbGFicmFzIHF1ZSBkZWZpbmFuIHVuYSByZWxhY2nDs24gZGUgb3Bvc2ljacOzbiBiaW5hcmlhLiAtLT4NCjwhLS0gKyAqKkhpcGVybmltb3M6KiogU29uIHBhbGFicmFzIGRlIGxhcyBxdWUgc2UgZGVyaXZhbiBvdHJhcy4gKkZydXRhcyouIC0tPg0KPCEtLSArICoqSGlww7NuaW1vczoqKiBTb24gcGFsYWJyYXMgcXVlIHNlIGRlcml2YW4gZGUgb3RyYXMsIGN1eW8gc2lnbmlmaWNhZG8gZXMgbcOhcyBlc3BlY8OtZmljbyBhIHVuIGRldGVybWluYWRvIGNvbnRleHRvLiAqTWFuZ28qLiAtLT4NCg0KIyAqKjIuIE1vcmZvbG9nw61hLCBtb3Jmb3NpbnRheGlzLCBzaW50YXhpcyB5IHNlbcOhbnRpY2EqKg0KDQojIyAqKjIuMS4gTW9yZm9sb2fDrWEqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iOTUlIiBzcmM9ImZpZ3MvMDFfTW9yZm9sb2dpYS5wbmciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQoqKipFbiBsYSBsaW5nw7zDrXN0aWNhKioqDQoNCisgTGEgKiptb3Jmb2xvZ8OtYSoqIGVzIGxhIHBhcnRlIGRlIGxhIGdyYW3DoXRpY2EgcXVlIGVzdHVkaWEgbGEgZXN0cnVjdHVyYSBkZSBsYXMgcGFsYWJyYXMgeSBzdXMgZWxlbWVudG9zIGNvbnN0aXR1dGl2b3MuDQoNCioqKkVuIGVsIHByb2Nlc2FtaWVudG8gZGVsIGxlbmd1YWplIG5hdHVyYWwqKioNCg0KKyBMYSAqKm1vcmZvbG9nw61hIGNvbXB1dGFjaW9uYWwqKiB0cmF0YSBkZSByZWNvbm9jZXIgZGUgZm9ybWEgYXV0b23DoXRpY2EgbG9zIG1vcmZlbWFzIHF1ZSBjb250aWVuZSB1bmEgcGFsYWJyYS4gRXN0YSBlcyBpbXBvcnRhbnRlIHBhcmEgcmVjb25vY2VyIHBhbGFicmFzIGNvbW8g4oCYcGVuc2Fy4oCZIHkg4oCYcGnDqW5zYWxv4oCZIGNvbW8gdW5hIHNvbGEsIGFkZW3DoXMgZGUgcmVjb25vY2VyIGVsIGfDqW5lcm8geSBuw7ptZXJvIGRlIHVuIG5vbWJyZSBwYXJhIGVuY2FqYXJsbyBjb24gdW4gYWRqZXRpdm8gcG9yIGVqZW1wbG8uDQorIEVuIGVsICoqYW7DoWxpc2lzIG1vcmZvbMOzZ2ljbyoqIGF1dG9tw6F0aWNvIHNlIG9idGllbmUgY29tbyBzYWxpZGEgbGEgcmHDrXogZGUgbGFzIHBhbGFicmFzIChsZW1hKSB5IGxhIGluZm9ybWFjacOzbiBncmFtYXRpY2FsIHF1ZSBhcG9ydGFuIGxvcyBkaWZlcmVudGVzIG1vcmZlbWFzLCBhIGxvIHF1ZSBzZSBsbGFtYSBjYXJhY3RlcsOtc3RpY2FzIG1vcmZvbMOzZ2ljYXMuDQogICsgKipFamVtcGxvOioqICdDYW50w6FiYW1vcycgdGllbmUgMyBtb3JmZW1hczog4oCYY2FudOKAmSAoY2FudGFyKSwg4oCYLWFiYeKAmSAocGFzYWRvKSB5IOKAmC1tb3PigJkgKHBsdXJhbCkuDQorIExhIGRpZmljdWx0YWQgZGVsIGFuw6FsaXNpcyBtb3Jmb2zDs2dpY28gdmFyw61hIHNlZ8O6biBlbCBpZGlvbWEuIEVuIGluZ2zDqXMgcG9yIGVqZW1wbG8gZXN0ZSBlcyBtw6FzIHNlbmNpbGxvIHF1ZSBlbiBlc3Bhw7FvbCwgcGVybyBlbiBjaGlubyBlcyBtw6FzIGNvbXBsaWNhZG8gcXVlIGVuIGxvcyBvdHJvcyBkb3MgaWRpb21hcy4NCisgUGFyYSBjb25zdHJ1aXIgdW4gc2lzdGVtYSBjYXBheiBkZSByZWFsaXphciBhbsOhbGlzaXMgbW9yZm9sw7NnaWNvIHNlIG5lY2VzaXRhOg0KICArIFVuICoqbGV4aWPDs24qKiwgZWwgY3VhbCBlcyB1biBjYXTDoWxvZ28gZGUgbGFzIHBhbGFicmFzIGRlIHVuYSBsZW5ndWEuIEVzdG8gZXMgaW52aWFibGUgeSBsbyBxdWUgc2Ugc3VlbGUgaGFjZXIgZXMgY3JlYXIgdW5hIGJhc2UgZGUgZGF0b3MgY29uIGluZm9ybWFjacOzbiBiw6FzaWNhIGRlIGxvcyBtb3JmZW1hczsgZXMgZGVjaXIsIHVuYSBsaXN0YSBkZSBtb3JmZW1hcyB5IGxhIGluZm9ybWFjacOzbiBiw6FzaWNhIHNvYnJlIGVsbG9zLCBjb24gdW4gY29uanVudG8gZGUgaGVjaG9zIG1vcmZvc2ludMOhY3RpY29zIHF1ZSBleHBsaXF1ZW4gY8OzbW8gc2UgcHVlZGVuIGNvbmNhdGVuYXIgbG9zIG1vcmZlbWFzIHBhcmEgZm9ybWFyIHBhbGFicmFzLg0KICArIFVuIGNvbmp1bnRvIGRlICoqaGVjaG9zIG1vcmZvdMOhY3RpY29zKiosIGxvcyBjdWFsZXMgaGFjZW4gcmVmZXJlbmNpYSBhbCBtb2RlbG8gcXVlIGRlc2NyaWJlIGVsIG9yZGVuIGRlIGxvcyBtb3JmZW1hcyB5IGRlbCBjdWFsIGVzIHBvc2libGUgZ2VuZXJhciB0b2RhcyBsYXMgcGFsYWJyYXMgZGUgdW4gbMOpeGljby4gRXN0b3MgZGVzY3JpYmVuIGVsIG9yZGVuIGRlIGxvcyBtb3JmZW1hcywgZXMgZGVjaXIsIHBvciBxdcOpIHVuYXMgY2xhc2VzIGRlIG1vcmZlbWFzIHNpZ3VlbiBhIG90cmFzIGRlbnRybyBkZSBsYXMgcGFsYWJyYXMuDQogICsgVW4gY29uanVudG8gZGUgKipyZWdsYXMgb3J0b2dyw6FmaWNhcyoqLCBsYXMgY3VhbGVzIHNlIHVzYW4gcGFyYSBtb2RlbGFyIGxvcyBjYW1iaW9zIGRlIG9ydG9ncmFmw61hIHF1ZSBvY3VycmVuIGVuIHVuYSBwYWxhYnJhIGN1YW5kbyBzZSBjb25jYXRlbmFuIGRvcyBtb3JmZW1hcy4NCisgTG9zICoqdHJhc2R1Y3RvcmVzIGRlIGF1dG9tw6F0YXMgZmluaXRvcyoqIHN1ZWxlbiBzZXIgbGEgZm9ybWEgbcOhcyBoYWJpdHVhbCBkZSByZWFsaXphciBlbCBhbsOhbGlzaXMgbW9yZm9sw7NnaWNvLiBVbiB0cmFuc2R1Y3RvciBkZSBhdXTDs21hdGFzIGZpbml0b3MgZXMgdW4gbW9kZWxvIGNvbXB1dGFjaW9uYWwgcXVlIHBlcm1pdGUgcHJvZHVjaXIgZGUgZm9ybWEgYXV0b23DoXRpY2EgdW5hIHNhbGlkYSBhIHBhcnRpciBkZSB1bmEgZW50cmFkYSBjb24gYmFzZSBlbiB1bmEgc2VyaWUgZGUgdHJhbnNpY2lvbmVzIGVudHJlIGVzdGFkb3MuIFBvciBlamVtcGxvLCBzZSB0cmFkdWNlIGxhIGVudHJhZGEgJ3Zpbm8nIGNvbW8gbGEgc2FsaWRhICd2aW5vICsgTiArIE1hc2MgKyBQbCcuDQoNCiMjICoqMi4yLiBNb3Jmb3NpbnRheGlzKioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9IjgwJSIgc3JjPSJmaWdzLzAxX01vcmZvc2ludGF4aXMucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KKioqRW4gbGEgbGluZ8O8w61zdGljYSoqKg0KDQorIExhICoqbW9yZm9zaW50YXhpcyoqIHNlIGRlZmluZSBjb21vIGxhIHBhcnRlIGRlIGxhICoqZ3JhbcOhdGljYSoqIHF1ZSBpbnRlZ3JhIGxhICoqbW9yZm9sb2fDrWEqKiB5IGxhICoqc2ludGF4aXMqKiBwYXJhIGRldGVybWluYXIgbGFzIGRpZmVyZW50ZXMgcGFydGVzIGRlIGxhIG9yYWNpw7NuLCBsbGFtYWRhcyAqKnBhcnQtb2Ytc3BlZWNoIChQT1MpKiouDQorIExhcyAqKmNhdGVnb3LDrWFzIG1vcmZvc2ludMOhY3RpY2FzKiogZGVsIGxlbmd1YWplLCB0YW1iacOpbiBsbGFtYWRhcyBlbiBlc3Bhw7FvbCBjb21vIGNhdGVnb3LDrWFzIGdyYW1hdGljYWxlcyBwcm9wb3JjaW9uYW4gY2xhc2lmaWNhY2nDs24gZGUgbGFzIGRpZmVyZW50ZXMgcGFydGVzIGRlIGxhIG9yYWNpw7NuIHNlZ8O6biBzdSB0aXBvIGRlIHBhbGFicmEuDQorIEVsIGNvbm9jZXIgbGFzIGRpc3RpbnRhcyBwYXJ0ZXMgZGUgbGEgb3JhY2nDs24gZXMgw7p0aWwgZGViaWRvIGEgbGEgZ3JhbiBjYW50aWRhZCBkZSBpbmZvcm1hY2nDs24gcXVlIGJyaW5kYW4gc29icmUgdW5hIHBhbGFicmEgeSBzdXMgdmVjaW5vcywgYWRlbcOhcyBkZSBsb3MgZGV0YWxsZXMgcXVlIHByZXNlbnRhbiBzb2JyZSBsYSBlc3RydWN0dXJhIHNpbnTDoWN0aWNhIGRlIGxhIG9yYWNpw7NuLiANCiAgKyAqKkVqZW1wbG8gKHZlY2lub3MpOioqIExvcyBzdXN0YW50aXZvcyBzdWVsZW4gaXIgcHJlY2VkaWRvcyBkZSBkZXRlcm1pbmFudGVzIG8gc2VndWlkb3MgZGUgYWRqZXRpdm9zLg0KICArICoqRWplbXBsbyAoZXN0cnVjdHVyYSBzaW50w6FjdGljYSk6KiogTG9zIHN1c3RhbnRpdm9zIGZvcm1hbiBwYXJ0ZSBkZWwgc2ludGFnbWEgbm9taW5hbC4NCisgTGFzIGNhdGVnb3LDrWFzIG1vcmZvc2ludMOhY3RpY2FzIG8gZ3JhbWF0aWNhbGVzIGV4aXN0ZW50ZXMgc29uOg0KICArICoqU3VzdGFudGl2byAvIG5vbWJyZToqKiBzb24gcGFsYWJyYXMgY3V5b3MgZWxlbWVudG9zIHRpZW5lbiBnw6luZXJvIHkgbsO6bWVybyB5IGZvcm1hbiBzaW50YWdtYXMgbm9taW5hbGVzLCBkZW5vbWluYW5kbyBlbnRpZGFkZXMgZGUgZGlzdGludGEgbmF0dXJhbGV6YS4NCiAgKyAqKkRldGVybWluYW50ZToqKiBzb24gcGFsYWJyYXMgY3V5b3MgZWxlbWVudG9zIGRldGVybWluYW4gYWwgc3VzdGFudGl2byBvIGFsIGdydXBvIG5vbWluYWwsIHViaWPDoW5kb3NlIGdlbmVyYWxtZW50ZSBlbiBwb3NpY2nDs24gcHJlbm9taW5hbC4NCiAgKyAqKkFkamV0aXZvOioqIHNvbiBwYWxhYnJhcyBxdWUgbW9kaWZpY2FuIGEgdW4gc3VzdGFudGl2byB5IGRlbm90YW4gY3VhbGlkYWRlcywgcHJvcGllZGFkZXMgeSByZWxhY2lvbmVzIGRlIGRpdmVyc2EgbmF0dXJhbGV6YS4NCiAgKyAqKlByb25vbWJyZToqKiBzb24gcGFsYWJyYXMgY3V5b3MgZWxlbWVudG9zIGhhY2VuIGxhcyB2ZWNlcyBkZWwgc3VzdGFudGl2byBvIGRlbCBzaW50YWdtYSBub21pbmFsLg0KICArICoqVmVyYm86Kiogc29uIHBhbGFicmFzIHF1ZSBkZW5vdGFuIHVuYSBhY2Npw7NuIHkgdGllbmVuIHZhcmlhY2nDs24gZGUgcGVyc29uYSwgbsO6bWVybywgdGllbXBvLCBtb2RvIHkgYXNwZWN0by4NCiAgKyAqKkFkdmVyYmlvOioqIHNvbiBwYWxhYnJhcyBjdXlvcyBlbGVtZW50b3Mgc29uIGludmFyaWFibGVzIHkgdMOzbmljb3MsIHkgcHVlZGVuIG1vZGlmaWNhciBlbCBzaWduaWZpY2FkbyBkZSB2YXJpYXMgY2F0ZWdvcsOtYXMuDQogICsgKipQcmVwb3NpY2nDs246Kiogc29uIHBhbGFicmFzIGludmFyaWFudGVzIGN1eW9zIGVsZW1lbnRvcyBzZSBjYXJhY3Rlcml6YW4gcG9yIGludHJvZHVjaXIgdW4gdMOpcm1pbm8uDQogICsgKipDb25qdW5jacOzbjoqKiBzb24gcGFsYWJyYXMgaW52YXJpYWJsZXMgw6F0b25hcyBjdXlvcyBlbGVtZW50b3MgbWFuaWZpZXN0YW4gcmVsYWNpb25lcyBkZSBjb29yZGluYWNpw7NuIG8gc3Vib3JkaW5hY2nDs24gZW50cmUgcGFsYWJyYXMuDQogICsgKipJbnRlcmplY2Npw7NuOioqIHNvbiBwYWxhYnJhcyBpbnZhcmlhYmxlcyBjb24gY3V5b3MgZWxlbWVudG9zIGZvcm1hbiBlbnVuY2lhZG9zIGV4Y2xhbWF0aXZvcywgdmVyYmFsaXphbiBzZW50aW1pZW50b3MgbyByZWFsaXphbiBhY3RvcyBkZSBoYWJsYSBhcGVsYXRpdm9zLg0KDQoqKipFbiBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsKioqDQoNCisgRWwgKipldGlxdWV0YWRvIG1vcmZvc2ludMOhY3RpY28qKiBlcyBlbCBwcm9jZXNvIGRlIGlkZW50aWZpY2FyIGxhcyBkaXN0aW50YXMgcGFydGVzIGRlIGxhIG9yYWNpw7NuIHkgY29uc2lzdGUgZW4gYXNpZ25hciB1bmEgZXRpcXVldGEgKHRhZykgc29icmUgbGEgY2F0ZWdvcsOtYSBncmFtYXRpY2FsIGEgY2FkYSB1bmEgZGUgbGFzIHBhbGFicmFzIGRlIHVuIHRleHRvIGRlIGVudHJhZGEuDQorIExhICoqZW50cmFkYSBkZWwgYWxnb3JpdG1vKiogZXMgdW5hIHNlY3VlbmNpYSBkZSBwYWxhYnJhcyB5IGxhIHNhbGlkYSBlcyB1bmEgc2VjdWVuY2lhIGRlIHBhcmVzIGZvcm1hZG9zIHBvciBsYSBwYWxhYnJhIHkgbGEgY29ycmVzcG9uZGllbnRlIGV0aXF1ZXRhIGluZGljYW5kbyBzdSBjYXRlZ29yw61hIGdyYW1hdGljYWwuDQorIEVsIGV0aXF1ZXRhZG8gbW9yZm9zaW50w6FjdGljbyByZWFsaXphIGR1cmFudGUgc3UgZnVuY2lvbmFtaWVudG8gdW4gcHJvY2VzbyBkZSAqKmRlc2FtYmlndWFjacOzbioqIGRvbmRlIHJlY29ub2NlIGNvcnJlY3RhbWVudGUgbGEgZXRpcXVldGEgZGUgdW5hIHBhbGFicmEgcXVlIHB1ZWRlIHBlcnRlbmVjZXIgYSBtw6FzIGRlIHVuYSBjYXRlZ29yw61hIGdyYW1hdGljYWwuDQorIEFzw60gdGFtYmnDqW4sIHVuYSBwYXJ0ZSBkZWwgYWxnb3JpdG1vIGRlIGV0aXF1ZXRhZG8gZXMgZWwgKipwcmVwcm9jZXNhbWllbnRvKiogZGUgbGEgb3JhY2nDs24uIEVzdG8gc2UgcmVhbGl6YSB1bmEgdmV6IHF1ZSBxdWUgbGEgb3JhY2nDs24gaGF5YSBzaWRvICoqdG9rZW5pemFkYSoqLg0KKyBVbmEgZGUgbGFzIHTDqWNuaWNhcyBtw6FzIHVzdWFsZXMgZGUgZXRpcXVldGFkbyBtb3Jmb3NpbnTDoWN0aWNvcyBzb24gbG9zICoqbW9kZWxvcyBvY3VsdG9zIGRlIE1hcmtvdiAoSE1NKSoqLiANCisgVW4gbW9kZWxvIG9jdWx0byBkZSBNYXJrb3YgZXMgdW4gbW9kZWxvIGVzdGFkw61zdGljbyBxdWUgc2UgcHVlZGUgcmVwcmVzZW50YXIgY29tbyB1bmEgbcOhcXVpbmEgZGUgZXN0YWRvcyBmaW5pdG9zLCBwZXJvIGRvbmRlIGxhcyAqKnRyYW5zaWNpb25lcyoqIGVudHJlIGVzdGFkb3Mgc29uICoqcHJvYmFiaWzDrXN0aWNhcyoqIHkgbm8gZGV0ZXJtaW7DrXN0aWNhcy4gRWwgb2JqZXRpdm8gZXMgZGV0ZXJtaW5hciBsb3MgcGFyw6FtZXRyb3MgZGVzY29ub2NpZG9zIChvY3VsdG9zKSBhIHBhcnRpciBkZSBsb3MgcGFyw6FtZXRyb3Mgb2JzZXJ2YWJsZXMuDQogICsgKipFamVtcGxvOioqIFNpIHVuYSBwYWxhYnJhIGVzIGV0aXF1ZXRhZGEgY29tbyBkZXRlcm1pbmFudGUsIGxhIHByw7N4aW1hIHNlcsOhIHVuIG5vbWJyZSBjb24gNDAlIGRlIHByb2JhYmlsaWRhZCwgdW4gYWRqZXRpdm8gY29uIDQwJSB5IHVuIG7Dum1lcm8gY29uIDIwJS4NCisgUGFyYSBlbCBldGlxdWV0YWRvIG1vcmZvc2ludMOhY3RpY28gbG9zIEhNTSBzb24gZW50cmVuYWRvcyBlbiB1biAqKmNvbmp1bnRvIGRlIGRhdG9zIHRvdGFsbWVudGUgZXRpcXVldGFkb3MqKi4NCisgVmVhbW9zIHVuIHJlY3Vyc28gb25saW5lIHBhcmEgYWZpYW56YXIgbnVlc3RyYXMgaWRlYXM6IFtBbmFsaXphZG9yIG1vcmZvc2ludMOhY3RpY28gTGluZ3Vha2l0XShodHRwczovL2xpbmd1YWtpdC5jb20vZXMvZXRpcXVldGFkb3ItbW9yZm9zaW50YWN0aWNvKS4NCiAgDQojIyAqKjIuMy4gU2ludGF4aXMqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDFfU2ludGF4aXMuanBnIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KKioqRW4gbGEgbGluZ8O8w61zdGljYSoqKg0KDQorIExhICoqc2ludGF4aXMqKiBlcyBsYSBwYXJ0ZSBkZSBsYSBncmFtw6F0aWNhIHF1ZSBlc3R1ZGlhIGVsIG1vZG8gZW4gcXVlIHNlIGNvbWJpbmFuIGxhcyBwYWxhYnJhcyB5IGxvcyBncnVwb3MgcXVlIGVzdGFzIGZvcm1hbiBwYXJhIGV4cHJlc2FyIHNpZ25pZmljYWRvcywgYXPDrSBjb21vIGxhcyByZWxhY2lvbmVzIHF1ZSBzZSBlc3RhYmxlY2VuIGVudHJlIHRvZGFzIGVzYXMgdW5pZGFkZXMuDQorIEVsICoqYW7DoWxpc2lzIHNpbnTDoWN0aWNvKiogZGV0ZXJtaW5hIGxhcyByZWxhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgZW50cmUgcGFsYWJyYXMuDQorIEVzdGUgZXMgdW4gKipwYXNvIGVzZW5jaWFsKiogcGFyYSBsYSBwb3N0ZXJpb3IgaWRlbnRpZmljYWNpw7NuIGRlIGxhcyAqKnJlbGFjaW9uZXMgc2Vtw6FudGljYXMqKiBkZSBsYXMgb3JhY2lvbmVzLg0KKyBTdSByZXN1bHRhZG8gZXMgdW4gKirDoXJib2wgc2ludMOhY3RpY28qKiBkb25kZSBsb3MgKipub2RvcyoqIHNvbiBsb3MgKipjb25zdGl0dXllbnRlcyBzaW50w6FjdGljb3MqKiB5IGxhcyAqKmhvamFzKiogc29uIGxhcyAqKnBhbGFicmFzKiogcXVlIGNvbXBvbmVuIGxhIG9yYWNpw7NuLg0KKyBVbiAqKmNvbnN0aXR1eWVudGUgc2ludMOhY3RpY28qKiBlcyB1bmEgcGFsYWJyYSwgbyB1bmEgc2VjdWVuY2lhIGRlIHBhbGFicmFzIHF1ZSByZWFsaXphbiB1bmEgZnVuY2nDs24gY29uanVudGEgZGVudHJvIGRlIGxhICoqZXN0cnVjdHVyYSBqZXLDoXJxdWljYSoqIGRlIGxhIG9yYWNpw7NuLiBBbCBjb25zdGl0dXllbnRlIGNvbXB1ZXN0byBkZSBkb3MgbyBtw6FzIGVsZW1lbnRvcyBzZSBsbyBsbGFtYSBzaW50YWdtYSBvIGdydXBvIHNpbnTDoWN0aWNvLg0KKyBMb3MgcHJpbmNpcGFsZXMgdGlwb3MgZGUgc2ludGFnbWEgZGVsIGVzcGHDsW9sIHNvbjoNCiAgKyBTaW50YWdtYSAqKm5vbWluYWwqKiAoU04pLCBjdXlvIG7DumNsZW8gZXMgdW4gc3VzdGFudGl2byBvIHByb25vbWJyZS4NCiAgKyBTaW50YWdtYSAqKnZlcmJhbCoqIChTViksIGN1eW8gbsO6Y2xlbyBlcyB1biB2ZXJiby4NCiAgKyBTaW50YWdtYSAqKnByZXBvc2ljaW9uYWwqKiAoU1AgbyBTUHJlcCksIGN1eW8gbsO6Y2xlbyBlcyB1bmEgcHJlcG9zaWNpw7NuLg0KICArIFNpbnRhZ21hICoqYWRqZXRpdmFsKiogKFNBZGopLCBjdXlvIG7DumNsZW8gZXMgdW4gYWRqZXRpdm8uDQogICsgU2ludGFnbWEgKiphZHZlcmJpYWwqKiAoU0FkdiksIGN1eW8gbsO6Y2xlbyBlcyB1biBhZHZlcmJpby4NCg0KKioqRW4gZWwgcHJvY2VzYW1pZW50byBkZWwgbGVuZ3VhamUgbmF0dXJhbCoqKg0KDQorIExvcyAqKmFuYWxpemFkb3JlcyBzaW50w6FjdGljb3MqKiBzdWVsZW4gYmFzYXJzZSBlbiAqKnByb2dyYW1hY2nDs24gZGluw6FtaWNhKiogeSAqKm3DqXRvZG9zIHByb2JhYmlsaXN0YXMqKi4gVW5vIGRlIGxvcyBhbGdvcml0bW9zIG3DoXMgY29tdW5lcyBlcyBlbCAqKmFsZ29yaXRtbyBDS1kgcHJvYmFiaWzDrXN0aWNvKiouDQorIEVzdG9zIHN1ZWxlbiBlbmZyZW50YXIgZWwgcHJvYmxlbWEgZGUgbGEgKiphbWJpZ8O8ZWRhZCBlc3RydWN0dXJhbCoqLiBFc3RhIHNlIGRlYmUgYSBsYXMgbcO6bHRpcGxlcyByZWdsYXMgcmVwcmVzZW50YWRhcyBlbiB1bmEgZ3JhbcOhdGljYSBxdWUgcHJvdmllbmVuIGRlbCB1c28gY29tw7puIGRlIHVuYSBsZW5ndWEgeSBxdWUgcGVybWl0ZW4gcXVlIHNlIHB1ZWRhIGVuY29udHJhciAqKnZhcmlvcyByZXN1bHRhZG9zIGRlbCBhbsOhbGlzaXMgc2ludMOhY3RpY28qKiBxdWUgc2UgYWp1c3RlIGNvcnJlY3RhbWVudGUgYSB1bmEgZnJhc2UgYW5hbGl6YWRhLiANCisgQWwgZmluYWwgbGEgKipzZWxlY2Npw7NuIGRlbCByZXN1bHRhZG8gZmluYWwqKiBzZSByZWFsaXphIG5vcm1hbG1lbnRlIGEgdHJhdsOpcyBkZSBwcm9jZXNvcyBkZSAqKmRlc2FtYmlndWFjacOzbiBzaW50w6FjdGljYSoqIHF1ZSByZXF1aWVyZW4gZnVlbnRlcyBkZSBjb25vY2ltaWVudG8gKiplc3RhZMOtc3RpY28qKiwgKipzZW3DoW50aWNvKiogeSAqKmNvbnRleHR1YWwqKi4gDQorIEFmaWFuY2Vtb3MgbnVlc3RyYXMgaWRlYXMgY29uIHVuIHJlY3Vyc28gb25saW5lOiBbQW5hbGl6YWRvciBzaW50w6FjdGljbyBMaW5ndWFraXRdKGh0dHBzOi8vbGluZ3Vha2l0LmNvbS9lcy9hbmFsaXphZG9yLXNpbnRhY3RpY28pLg0KDQojIyAqKjIuNC4gU2Vtw6FudGljYSoqDQoNCjxicj48L2JyPg0KPGNlbnRlcj48YT48aW1nIHdpZHRoPSI4MCUiIHNyYz0iZmlncy8wMV9TZW1hbnRpY0FuYWxpc2lzLmdpZiI+PC9hPjwvY2VudGVyPg0KPGJyPjwvYnI+DQoNCioqKkVuIGxhIGxpbmfDvMOtc3RpY2EqKioNCg0KKyBMYSAqKnNlbcOhbnRpY2EqKiBzZSBkZWZpbmUgY29tbyBsYSBkaXNjaXBsaW5hIHF1ZSBlc3R1ZGlhIGVsIHNpZ25pZmljYWRvIGRlIGxhcyB1bmlkYWRlcyBsaW5nw7zDrXN0aWNhcyB5IGRlIHN1cyBjb21iaW5hY2lvbmVzLg0KKyBFc3RvIGVzIG5lY2VzYXJpbyBlbiBhbGd1bmFzIHRhcmVhcyBkZWwgcHJvY2VzYW1pZW50byBkZWwgbGVuZ3VhamUgbmF0dXJhbC4gRXMgZGVjaXIsIG5lY2VzaXRhbW9zIG5vIHNvbG8gZWwgKipjb25vY2ltaWVudG8gbGluZ8O8w61zdGljbyoqIChtb3Jmb2xvZ8OtYSB5IHNpbnRheGlzKSBzaW5vIHRhbWJpw6luICoqaW5mb3JtYWNpw7NuIG5vIGxpbmfDvMOtc3RpY2EqKiAoc2Vtw6FudGljYSkuDQorIExhICoqc2Vtw6FudGljYSBsw6l4aWNhKiogZXN0dWRpYSBlbCBzaWduaWZpY2FkbyBkZSBsYXMgcGFsYWJyYXMsIGFzw60gY29tbyBsYXMgZGl2ZXJzYXMgcmVsYWNpb25lcyBkZSBzZW50aWRvIHF1ZSBzZSBlc3RhYmxlY2VuIGVudHJlIGVsbGFzLg0KKyBDb25vY2VyIGFkZW3DoXMgZWwgc2lnbmlmaWNhZG8gZGUgdW5hICoqb3JhY2nDs24qKiwgeSAqKm5vIHNvbG8gZGUgdW5hIHBhbGFicmEqKiBlcyB0YW1iacOpbiBpbXByZXNjaW5kaWJsZSBwYXJhIHJlYWxpemFyIGVmaWNpZW50ZW1lbnRlIGRpdmVyc2FzIHRhcmVhcyBkZSBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsLg0KKyBMYSAqKnNlbcOhbnRpY2EgY29tcG9zaWNpb25hbCoqIGVzdHVkaWEgZWwgc2lnbmlmaWNhZG8gZGUgbG9zIHNpbnRhZ21hcyB5IGxhcyBvcmFjaW9uZXMuIA0KKyBFbCAqKmFuw6FsaXNpcyBzZW3DoW50aWNvKiogdGllbmUgY29tbyBvYmpldGl2byBwcm9kdWNpciB1bmEgcmVwcmVzZW50YWNpw7NuIGRlbCBzaWduaWZpY2FkbyBlbiB1bmEgb3JhY2nDs24uDQoNCioqKkVuIGVsIHByb2Nlc2FtaWVudG8gZGVsIGxlbmd1YWplIG5hdHVyYWwqKioNCg0KKyBMYSAqKmNyZWFjacOzbiBhdXRvbcOhdGljYSoqIGRlIHVuYSByZXByZXNlbnRhY2nDs24gcmlndXJvc2EgZGVsIHNpZ25pZmljYWRvIGRlIGxhIG9yYWNpw7NuIHJlcXVpZXJlIGRlICoqbcO6bHRpcGxlcyBmdWVudGVzIGRlIGNvbm9jaW1pZW50byB5IHTDqWNuaWNhcyBkZSBpbmZlcmVuY2lhKiouIEFsZ3Vub3MgZGUgbG9zIGNvbm9jaW1pZW50b3MgbmVjZXNhcmlvcyBzb246DQogICsgTG9zIHNpZ25pZmljYWRvcyBkZSBsYXMgcGFsYWJyYXMNCiAgKyBMb3Mgc2lnbmlmaWNhZG9zIGFzb2NpYWRvcyBhIGxhcyBjb25zdHJ1Y2Npb25lcyBncmFtYXRpY2FsZXMNCiAgKyBMYSBlc3RydWN0dXJhIGRlbCBkaXNjdXJzbw0KICArIEVsIHRlbWEgZW4gY3Vlc3Rpw7NuDQogICsgRWwgZXN0YWRvIGRlIGxhcyBjb3NhcyBlbiBlbCBtb21lbnRvIGVuIGVsIHF1ZSB0aWVuZSBsdWdhciBlbCBkaXNjdXJzbw0KKyBMYSAqKnJlcHJlc2VudGFjacOzbiBmb3JtYWwqKiBkZWwgc2lnbmlmaWNhZG8gZGViZSBzZXIgdmVyaWZpY2FibGUsIGluZXF1w612b2NhLCBleHByZXNpdmEgeSBwZXJtaXRpciBsYSBpbmZlcmVuY2lhIGRlIG51ZXZvIGNvbm9jaW1pZW50by4NCisgTGEgbWF5b3LDrWEgZGUgbG9zIG1vZGVsb3MgcXVlIHNlIHV0aWxpemFuIHBhcmEgcmVwcmVzZW50YXIgZWwgc2lnbmlmaWNhZG8gdGllbmVuIGVuIGNvbcO6biBsYSBjYXBhY2lkYWQgcGFyYSByZXByZXNlbnRhciBvYmpldG9zLCBzdXMgcHJvcGllZGFkZXMgeSBsYXMgcmVsYWNpb25lcyBlbnRyZSBlc3Rvcy4NCisgRW50cmUgbGFzICoqZXN0cmF0ZWdpYXMqKiBxdWUgc2lydmVuIHBhcmEgcmVwcmVzZW50YXIgZWwgbGVuZ3VhamUgdGVuZW1vczoNCiAgKyBMw7NnaWNhIGRlIHByaW1lciBvcmRlbg0KICArIFJlZGVzIHNlbcOhbnRpY2FzDQogICsgRGlhZ3JhbWFzIGRlIGRlcGVuZGVuY2lhcyBjb25jZXB0dWFsZXMNCiAgKyBTaXN0ZW1hcyBiYXNhZG9zIGVuIHBsYW50aWxsYXMNCisgRW4gbGEgcmVhbGlkYWQgbm8gZXMgbXV5IGNvbcO6biB1c2FyIGVsIGFuw6FsaXNpcyBzaW50w6FjdGljbyBjb21vIGlucHV0IGVuIGVsIGFuw6FsaXNpcyBzZW3DoW50aWNvIChkZWJpZG8gYSBxdWUgc2UgbmVjZXNpdGEgY29ub2NpbWllbnRvIGVzcGVjw61maWNvIHNvYnJlIGVsIGVqZW1wbG8pIHkgcG9yIGVsbG8gbG8gcXVlIHNlIGhhY2UgZXMgaW50ZWdyYXIgZWwgY29ub2NpbWllbnRvIGVuIGVsIGFuw6FsaXNpcyBzaW50w6FjdGljby4rDQorIEFsIGHDsWFkaXIgZWwgY29ub2NpbWllbnRvIHNlbcOhbnRpY28gYSBsYXMgcmVnbGFzIGdyYW1hdGljYWxlcyB5IGEgbGFzIGVudHJhZGFzIGzDqXhpY2FzIHF1ZSBjb25mb3JtYW4gbGEgZ3JhbcOhdGljYSBzZSBsbyBjb25vY2UgY29tbyAqKnJ1bGUtdG8tcnVsZSBoeXBvdGhlc2lzKiouDQoNCjwhLS0gIyAqKjIuIEVqZXJjaWNpbyBwcsOhY3RpY28qKiAgLS0+DQoNCjwhLS0gIyMgKirDgXJib2xlcyBzaW50w6FjdGljb3MqKiAtLT4NCg0KPCEtLSBFbGFib3JhIHVuYSBvcmFjacOzbiBlbiBpZGlvbWEgZXNwYcOxb2wsIHJlYWxpemEgZWwgYW7DoWxpc2lzIGRlIHN1IMOhcmJvbCBzaW50w6FjdGljbyBjb24gY3VhbHF1aWVyYSBkZSBsYXMgaGVycmFtaWVudGFzIGRpc3BvbmliaWxpemFkYXMgeSBlbnbDrWEgdW5hIGNhcHR1cmEgZGUgcGFudGFsbGEgZGUgdHUgZWplcmNpY2lvIGFsIGNvcnJlbyBkZSB0dSBpbnN0cnVjdG9yIChodWdvLXNYZUBob3RtYWlsLmNvbSkuIC0tPg0KDQojICoqMy4gRWplcmNpY2lvIHByw6FjdGljbyoqDQoNCkNvbW8gdW4gcHJpbWVyIGFjZXJjYW1pZW50byB1dGlsaXphcmVtb3MgdW5hIGRlIGxhcyBsaWJyZXLDrWFzIG3DoXMgY29tcGxldGFzIGRlIFBMTjogW1VEUGlwZSwgY3JlYWRhIHBvciBsYSBGYWN1bHRhZCBkZSBNYXRlbcOhdGljYXMgeSBGw61zaWNhIGRlIGxhIFVuaXZlcnNpZGFkIGRlIFJlcMO6YmxpY2EgQ2hlY2FdKGh0dHA6Ly91ZmFsLm1mZi5jdW5pLmN6L3VkcGlwZSkgeSBkZXNjYXJnYXJlbW9zIHVuIG1vZGVsbyBwcmUtZW50cmVuYWRvIGd1YXJkYWRvIGNvbW8gdW4gb2JqZXRvIGVuIFI6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCiMgRGVzY2FyZ2EgZGUgbW9kZWxvIHByZWVudHJlbmFkbyB1ZHBpcGUNCmxpYnJhcnkodWRwaXBlKQ0KI3VkcGlwZTo6dWRwaXBlX2Rvd25sb2FkX21vZGVsKCdzcGFuaXNoJykgIyBEZXNjb21lbnRhciBhbCBlamVjdXRhciBwb3IgcHJpbWVyYSB2ZXoNCmBgYA0KDQpBaG9yYSBjYXJnYXJlbW9zIGVsIG1vZGVsbyBlbiBlc3Bhw7FvbCBkZXNjYXJnYWRvIHkgbG8gdXRpbGl6YXJlbW9zIHBhcmEgKiphbm90YXIqKiB1bmEgZnJhc2UgKGF5dWTDoW5kb25vcyBkZSBsYSBsaWJyZXLDrWEgKnN0cmluZ3IqIHBhcmEgZXZpdGFyIHByb2JsZW1hcyBjb24gbGEgY29kaWZpY2FjacOzbiwgeSBkZSBsYSBsaWJyZXLDrWEgKmRwbHlyKiBwYXJhIG1hbmlwdWxhciBsb3MgcmVzdWx0YWRvcyk6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ2FyZ2EgZGUgbW9kZWxvIHByZS1lbnRyZW5hZG8NCm1vZGVsID0gdWRwaXBlX2xvYWRfbW9kZWwoZmlsZSA9ICJzcGFuaXNoLWdzZC11ZC0yLjQtMTkwNTMxLnVkcGlwZSIpDQoNCiMgQW5vdGFjacOzbg0KdGV4dCA9ICJFc3RhbW9zIG11eSBpbnRlcmVzYWRvcyBlbiBzYWJlciBjdcOhbCBzZXLDoSBlbCBwcm95ZWN0byBkZSBmaW4gZGUgY3Vyc28uIg0KdGV4dF9hbm5vdGF0ZWQgPSB1ZHBpcGVfYW5ub3RhdGUobW9kZWwsIHggPSBzdHJpX2VuY190b3V0ZjgodGV4dCkpDQp0ZXh0X2Fubm90YXRlZCA9IHRleHRfYW5ub3RhdGVkICU+JSBhc190aWJibGUoZW5jb2Rpbmc9ImxhdGluLTEiKQ0KYGBgDQoNCkZpbmFsbWVudGUgcHJlc2VudGFyZW1vcyBlbCByZXN1bHRhZG8gdGFidWxhciAoY29uIGxhIGxpYnJlcsOtYSAqa2FibGVFeHRyYSogcGFyYSBxdWUgbGEgdGFibGEgc2UgdmVhIGJpZW4pOg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpsaWJyYXJ5KGthYmxlRXh0cmEpDQp0ZXh0X2Fubm90YXRlZCAlPiUgc2VsZWN0KHRva2VuLCBsZW1tYSwgdXBvcywgZmVhdHMsIGhlYWRfdG9rZW5faWQpICU+JSBrYWJsZSgpICU+JSBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDE0KQ0KYGBgDQoNClkgY29uIHVuIGdyw6FmaWNvIChiYXNhZG8gZW4gbGFzIGxpYnJlcsOtYXMgKmdncGxvdDIqLCAqaWdyYXBoKiB5ICpnZ3JhcGgqLCBhZGFwdGFkbyBkZSBsYSBlbnRyYWRhIFsnZGVwZW5kZW5jeSBwYXJzaW5nIHdpdGggdWRwaXBlJywgci1ibG9nZ2Vycy5jb21dKGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tLzIwMTkvMDcvZGVwZW5kZW5jeS1wYXJzaW5nLXdpdGgtdWRwaXBlLykpOg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpsaWJyYXJ5KGlncmFwaCkNCmxpYnJhcnkoZ2dyYXBoKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIEZ1bmNpw7NuIHBhcmEgZ3JhZmljYXIgZGVwZW5kZW5jaWFzDQpwbG90X2Fubm90YXRpb24gPSBmdW5jdGlvbih4LCBzaXplID0gMyl7DQogIHN0b3BpZm5vdChpcy5kYXRhLmZyYW1lKHgpICYgYWxsKGMoInNlbnRlbmNlX2lkIiwgInRva2VuX2lkIiwgImhlYWRfdG9rZW5faWQiLCAiZGVwX3JlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuX2lkIiwgInRva2VuIiwgImxlbW1hIiwgInVwb3MiLCAieHBvcyIsICJmZWF0cyIpICVpbiUgY29sbmFtZXMoeCkpKQ0KICB4ID0geFshaXMubmEoeCRoZWFkX3Rva2VuX2lkKSwgXQ0KICB4ID0geFt4JHNlbnRlbmNlX2lkICVpbiUgbWluKHgkc2VudGVuY2VfaWQpLCBdDQogIGVkZ2VzID0geFt4JGhlYWRfdG9rZW5faWQgIT0gMCwgYygidG9rZW5faWQiLCAiaGVhZF90b2tlbl9pZCIsICJkZXBfcmVsIildDQogIGVkZ2VzJGxhYmVsID0gZWRnZXMkZGVwX3JlbA0KICBnID0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGVkZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IHhbLCBjKCJ0b2tlbl9pZCIsICJ0b2tlbiIsICJsZW1tYSIsICJ1cG9zIiwgInhwb3MiLCAiZmVhdHMiKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gVFJVRSkNCiAgZ2YgPSBnZ3JhcGgoZywgbGF5b3V0ID0gImxpbmVhciIpICsNCiAgICBnZW9tX2VkZ2VfYXJjKGFlcyhsYWJlbCA9IGRlcF9yZWwsIHZqdXN0ID0gLTAuMjApLA0KICAgICAgICAgICAgICAgICAgYXJyb3cgPSBncmlkOjphcnJvdyhsZW5ndGggPSB1bml0KDQsICdtbScpLCBlbmRzID0gImxhc3QiLCB0eXBlID0gImNsb3NlZCIpLA0KICAgICAgICAgICAgICAgICAgbGFiZWxfY29sb3VyID0gInJlZCIsIGNoZWNrX292ZXJsYXAgPSBUUlVFLCBsYWJlbF9zaXplID0gc2l6ZSkgKw0KICAgIGdlb21fbm9kZV9sYWJlbChhZXMobGFiZWwgPSB0b2tlbiksIGNvbCA9ICJkYXJrZ3JlZW4iLCBzaXplID0gc2l6ZSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSB1cG9zKSwgbnVkZ2VfeSA9IC0wLjM1LCBzaXplID0gc2l6ZSkgKw0KICAgIGxhYnModGl0bGUgPSAiUmVzdWx0YWRvIFVEcGlwZSIsIA0KICAgICAgICAgc3VidGl0bGUgPSAiVG9rZW5pemFjacOzbiwgZXRpcXVldGFkbyBQT1MgeSByZWxhY2lvbmVzIGRlIGRlcGVuZGVuY2lhIikNCiAgcmV0dXJuKGdmKQ0KfQ0KDQojIEdyw6FmaWNvDQpwbG90X2Fubm90YXRpb24odGV4dF9hbm5vdGF0ZWQpDQpgYGANCg0KUGFyYSBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBkZSBkZXBlbmRlbmNpYXMgZXMgbmVjZXNhcmlvIHJlZmVyaXJub3MgYSBbdW5pdmVyc2FsZGVwZW5kZW5jaWVzLm9yZ10oaHR0cHM6Ly91bml2ZXJzYWxkZXBlbmRlbmNpZXMub3JnL3UvZGVwLyksIGxhIGN1YWwgZXN0w6EgY29uc3RydWlkYSBzb2JyZSBsYSBpbnZlc3RpZ2FjacOzbiBkZSBARGVNYXJuZWZmZTIwMTQuDQoNCiMgKio0LiBUYXJlYTogQW7DoWxpc2lzIG1vcmZvbMOzZ2ljbyB5IG1vcmZvc2ludMOhY3RpY28qKg0KDQpFbCBzaWd1aWVudGUgZGViZXIgc2UgZW50cmVnYXLDoSBjb21vIHVuIHNjcmlwdCBlbiBSIGRlIHRhbCBtYW5lcmEgcXVlIGVsIGluc3RydWN0b3IgbG8gcHVlZGEgcmVwbGljYXIgZW4gc3UgbcOhcXVpbmEgc2luIGxhIG5lY2VzaWRhZCBkZSBjYXJnYXIgdW4gYXJjaGl2by4gQSBjb250aW51YWNpw7NuIGxhcyBpbnN0cnVjY2lvbmVzOg0KDQorIEVsYWJvcmEgdW5hIG9yYWNpw7NuIGVuIGlkaW9tYSBlc3Bhw7FvbC4NCisgUmVhbGl6YSBzdSBhbsOhbGlzaXMgc2ludMOhY3RpY28geSBtb3Jmb3NpbnTDoWN0aWNvIGEgdHJhdsOpcyBkZSBsYSBsaWJyZXLDrWEgVURwaXBlIChubyBlcyBuZWNlc2FyaW8gcXVlIHJlYWxpY2VzIGVsIGdyw6FmaWNvKS4NCisgQ29tZW50YSBsb3MgcmVzdWx0YWRvcy4NCg0KQWwgZmluYWwsIGVudsOtYSBlbCBlamVyY2ljaW8gYWwgY29ycmVvIGRlIHR1IGluc3RydWN0b3IgKGh1Z28tc1hlQGhvdG1haWwuY29tKS4gQXF1ZWxsb3MgdHJhYmFqb3Mgc2luIGNvbWVudGFyaW9zIHNvYnJlIGxvcyByZXN1bHRhZG9zIHNlcsOhbiBjYWxpZmljYWRvcyBjb24gdW5hIG5vdGEgZGUgY2VybyBwdW50b3Mgc29icmUgZGllei4NCg0KIyAqKjUuIEJpYmxpb2dyYWbDrWEqKg==