Integrantes:

  • A01424709, Armando Arredondo Valle
  • A01424731, Aldo Olascoaga Olmedo
  • A01423655, Diego Efraín Antonio Pérez


Introducción


En este proyecto, se busca saber así como analizar las variantes de interés Ómicron y Delta, buscando ver si es que cumplen con ciertas características así como un número específico de mutaciones, las cuales afectan de forma directa al organismo del cuerpo humano.

Tanto Ómicron como Delta son variantes de interés, las cuales estuvieron en su pleno auge en su mayoría durante el año 2021, este año fue uno de los años con mayor tasa de crecimiento de la pandemia así como lo que muchos llaman el punto de quiebre de la misma a finales del mismo año.

Cabe recalcar, que para hacer el análisis de de cada una de las variantes, fue necesario realizar la alineación de ambas, esto con base a que ambas variantes tenían diferentes tamaños en su espícula, es por ello que utilizando código (previamente visto en clase), realizamos la alineación de ambas.


Objetivo

El objetivo de este proyecto es hacer un análisis parcial de las variantes Ómicron y Delta, para poder así llegar a un posible restultado del porqué es que una es más contagiosa que otra, y por qué una representó un mayor peligro a nivel mundial.


Hipótesis

Con este proyecto su busca demostrar la estrecha relación que hay entre el número de mutaciones encontradas en la espícula de la variante Ómicron y su formidable capacidad de infección en humanos, además de proporcionar una gran carga viral entre los individuos infectados.


Marco teórico

¿Qué es el virus Sars-Cov2?

Los coronavirus son una familia de virus que causan enfermedades (desde el resfriado común hasta enfermedades respiratorias más graves) y circulan entre humanos y animales.
Información de la variante Ómicron
  • Ómicron es de dos a cuatro veces más contagiosa que Delta.
  • Ómicron es más eficiente al evadir anticuerpos proporcionados por las actuales vacunas.
  • Ómicron cuenta con aproximadamente 36 mutaciones en su espícula.
  • Debido a un gran número de mutaciones en el RBD, la variante Ómicron es mucho más transmisible que Delta.
  • Un dominio de unión al receptor (RBD) es una parte clave de un virus ubicado en su dominio de “espícula” que le permite acoplarse a los receptores del cuerpo para ingresar a las células y provocar una infección.
Información de la variante Delta
  • La variante Delta fue detectada por primera vez en la India en diciembre de 2020.
  • Se determinó que Delta fue 2 veces más contagiosa que la variante original de Wuhan.
  • La carga viral de Delta era bastante elevada en personas contagiadas con esta variante.
  • Delta fue la variante del SARS-CoV-2 que dominó al mundo hasta finales de 2021.
  • Las mutaciones en el receptor RBD impactaron de manera significativa a la hora de evadir cierta inmunidad por parte de los infectados.


Experimentación

Para poder realizar este proyecto, fue necesario hacer la modificación necesaria a los archivos FASTA.

Es por ello que hicimos el cambio de ADN a ARN para poder hacer así una mejor comparativa de los datos.


Función para realizar la traducción:

  # Realizamos aquí la parte de cambiar a mayúsculas las partes de la secuencia
  A = toupper(Delta[[1]])[1:100] 
  B = toupper(Omicron[[1]])[1:100]
  # Función para el cambio a realizar:
  ADN_to_ARNm = function(nucleotido){
    return (switch(nucleotido,"C"="G","G"="C","T"="A","A"="U"))
  }
  # Ejecutamos la función dentro de A y B
  A = as.vector(sapply(A, ADN_to_ARNm))
  B = as.vector(sapply(B, ADN_to_ARNm))

Análisis de los archivos FASTA

Análisis de la variante Ómicron después de hacer la alineación

  [1] "A" "U" "G" "U" "U" "U" "G" "U" "U" "U" "U" "U" "C" "U" "U" "G" "U" "U" "U" "U"
 [21] "A" "U" "U" "G" "C" "C" "A" "C" "U" "A" "G" "U" "C" "U" "C" "U" "A" "G" "U" "C"
 [41] "A" "G" "U" "G" "U" "G" "U" "U" "A" "A" "U" "C" "U" "U" "A" "G" "A" "A" "C" "C"
 [61] "A" "G" "A" "A" "C" "U" "C" "A" "A" "U" "U" "A" "C" "C" "C" "C" "C" "U" "G" "C"
 [81] "A" "U" "A" "C" "A" "C" "U" "A" "A" "U" "U" "C" "U" "U" "U" "C" "A" "C" "A" "C"
[101] "_"

Análisis de la variante Delta después de hacer la alineación

  [1] "A" "U" "G" "U" "U" "U" "G" "U" "U" "U" "U" "U" "C" "U" "U" "G" "U" "U" "U" "U"
 [21] "A" "U" "U" "G" "C" "C" "A" "C" "U" "A" "G" "U" "C" "U" "C" "U" "A" "G" "U" "C"
 [41] "A" "G" "U" "G" "U" "G" "U" "U" "A" "A" "U" "C" "U" "U" "A" "U" "A" "A" "C" "C"
 [61] "A" "G" "A" "A" "C" "U" "C" "A" "A" "U" "C" "A" "U" "A" "C" "A" "C" "U" "A" "_"
 [81] "A" "U" "U" "C" "U" "U" "U" "C" "A" "C" "A" "C" "G" "U" "G" "G" "U" "G" "U" "U"
[101] "U"

Dando así una matriz final después de la alineación de este tipo:
(Contando así como la primer fila para la variante Ómicron, y la segunda para Delta)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
[1,] "A"  "U"  "G"  "U"  "U"  "U"  "G"  "U"  "U"  "U"   "U"   "U"   "C"   "U"   "U"  
[2,] "A"  "U"  "G"  "U"  "U"  "U"  "G"  "U"  "U"  "U"   "U"   "U"   "C"   "U"   "U"  
     [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28]
[1,] "G"   "U"   "U"   "U"   "U"   "A"   "U"   "U"   "G"   "C"   "C"   "A"   "C"  
[2,] "G"   "U"   "U"   "U"   "U"   "A"   "U"   "U"   "G"   "C"   "C"   "A"   "C"  
     [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40] [,41]
[1,] "U"   "A"   "G"   "U"   "C"   "U"   "C"   "U"   "A"   "G"   "U"   "C"   "A"  
[2,] "U"   "A"   "G"   "U"   "C"   "U"   "C"   "U"   "A"   "G"   "U"   "C"   "A"  
     [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49] [,50] [,51] [,52] [,53] [,54]
[1,] "G"   "U"   "G"   "U"   "G"   "U"   "U"   "A"   "A"   "U"   "C"   "U"   "U"  
[2,] "G"   "U"   "G"   "U"   "G"   "U"   "U"   "A"   "A"   "U"   "C"   "U"   "U"  
     [,55] [,56] [,57] [,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] [,67]
[1,] "A"   "G"   "A"   "A"   "C"   "C"   "A"   "G"   "A"   "A"   "C"   "U"   "C"  
[2,] "A"   "U"   "A"   "A"   "C"   "C"   "A"   "G"   "A"   "A"   "C"   "U"   "C"  
     [,68] [,69] [,70] [,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79] [,80]
[1,] "A"   "A"   "U"   "U"   "A"   "C"   "C"   "C"   "C"   "C"   "U"   "G"   "C"  
[2,] "A"   "A"   "U"   "C"   "A"   "U"   "A"   "C"   "A"   "C"   "U"   "A"   "_"  
     [,81] [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90] [,91] [,92] [,93]
[1,] "A"   "U"   "A"   "C"   "A"   "C"   "U"   "A"   "A"   "U"   "U"   "C"   "U"  
[2,] "A"   "U"   "U"   "C"   "U"   "U"   "U"   "C"   "A"   "C"   "A"   "C"   "G"  
     [,94] [,95] [,96] [,97] [,98] [,99] [,100] [,101]
[1,] "U"   "U"   "C"   "A"   "C"   "A"   "C"    "_"   
[2,] "U"   "G"   "G"   "U"   "G"   "U"   "U"    "U"   

Es por ello que fue necesario hacer uso de un algoritmo para poder así realizar la comparativa, utilizando una sentencia de tronctrol para verificar la longitud de las diferencias, así como un ciclo de for para realizar el análisis:

if (length(diferentes) > 0){
  for (k in diferentes){
    mutation = paste(genOmi[k], "to", genDelta[k], sep="")
    inicio = k - (k-1) %% 3
    global = 0+inicio # 21563 valor original
    index = as.integer(k/3+1)  # %/%
    codonOmi = paste(genOmi[inicio], genOmi[inicio+1], genOmi[inicio+2],sep="")
    codonDelta = paste(genDelta[inicio], genDelta[inicio+1], genDelta[inicio+2],sep="")
    codonChange = paste(codonOmi,global,codonDelta, sep="")
    aminoChange = paste(trad[codonOmi],index,trad[codonDelta], sep="")
    print(paste(mutation, global, codonChange, aminoChange, index))
    newRow = list(mutation, global, codonChange, aminoChange, index)
    df[nrow(df)+1, ] = newRow
  }
}

Resultados

Una vez realizados los análisis así como las respectivas comparativas utilizando el algoritmo resultó en un dataframe con exactamente 19 resultados, teniendo así un rango de entre 19 y 36 resultados posibles. Es por eso, que realizamos una visualización a forma tabulada de las mutaciones dentro de un dataframe.

Resultando en el siguiente dataframe

Dataframe

'data.frame':   21 obs. of  5 variables:
 $ Mutation  : chr  "G to U" "U to C" "C to U" "C to A" ...
 $ Nucleotide: num  55 70 73 73 76 79 79 82 85 85 ...
 $ Codon     : chr  "AGA to AUA" "UUA to UCA" "CCC to UAC" "CCC to UAC" ...
 $ Protein   : chr  "R to I" "L to S" "P to Y" "P to Y" ...
 $ index     : num  19 24 25 25 26 27 27 28 29 29 ...

Gráfica

Para tener un mejor análisis, decidimos realizar la graficación de los resultados. En el que podemos ver un número mayor de mutaciones en la parte de AtoU así como en la parte de GtoA, demostrando así las mutaciones del mismo.

Conclusión

En conclusión, gracias al análisis elaborado en R, se logra apreciar estadísticamente el gran número de mutaciones en el gene “S” del virus SARS-CoV-2, específicamente entre las variantes actuales de interés a nivel mundial: Delta y Ómicron. De acuerdo con diversas investigaciones científicas, la variante Ómicron presenta aproximadamente 36 mutaciones en su espícula, pero en este análisis se lograron detectar únicamente 19 de ellas. Esto se puede deber a que las muestras que se tomaron para llevar a cabo este proyecto son recientes y no de finales del año 2021, las cuales respaldan esas más de 3 decenas de mutaciones. Aún así, se concluye que la variante Ómicron es mucho más infecciosa que Delta debido a las mutaciones presentes en el receptor RBD, el cual se ubica en la espícula del coronavirus. Éste le permite al virus acoplarse e infectar a las células huéspedes, y es así como Ómicron es mucho más eficiente al evadir la inmunidad actual de los seres humanos contra el SARS-CoV-2.


Referencias

LS0tDQp0aXRsZTogJyoqQ09NUEFSQVRJVkEgREUgTEEgRVNQw41DVUxBIEVOIERFTFRBIFkgw5NNSUNST04qKicNCmRhdGU6IDA1IGRlIE1heW8gZGVsIDIwMjINCmF1dGhvcjogQW7DoWxpc2lzIGRlIEJpb2xvZ8OtYSBDb21wdXRhY2lvbmFsDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA2DQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KKioqDQojIyMgSW50ZWdyYW50ZXM6DQo8ZGl2Pg0KICA8dWw+DQogICAgPGxpPkEwMTQyNDcwOSwgQXJtYW5kbyBBcnJlZG9uZG8gVmFsbGU8L2xpPg0KICAgIDxsaT5BMDE0MjQ3MzEsIEFsZG8gT2xhc2NvYWdhIE9sbWVkbzwvbGk+DQogICAgPGxpPkEwMTQyMzY1NSwgRGllZ28gRWZyYcOtbiBBbnRvbmlvIFDDqXJlejwvbGk+DQogIDwvdWw+DQoNCjwvZGl2Pg0KDQo8ZGl2Pg0KICA8cD4NCiAgPGNlbnRlcj4NCiAgIVtdKEZPVE9TL0xPR08uc3ZnKXt3aWR0aD0xMDBweH0NCiAgPC9jZW50ZXI+DQogIDwvcD4NCjwvZGl2Pg0KDQoqKioNCjxoMj4gKipJbnRyb2R1Y2Npw7NuKiogPC9oMj4NCioqKg0KPGRpdj4NCiAgPHN0eWxlPg0KICAgIHB7DQogICAgICB0ZXh0LWFsaWduOmp1c3RpZnk7DQogICAgfQ0KICA8L3N0eWxlPiAgDQogIDxwPg0KRW4gZXN0ZSBwcm95ZWN0bywgc2UgYnVzY2Egc2FiZXIgYXPDrSBjb21vIGFuYWxpemFyIGxhcyB2YXJpYW50ZXMgZGUgaW50ZXLDqXMgw5NtaWNyb24geSBEZWx0YSwgYnVzY2FuZG8gdmVyIHNpIGVzIHF1ZSBjdW1wbGVuIGNvbiBjaWVydGFzIGNhcmFjdGVyw61zdGljYXMgYXPDrSBjb21vIHVuIG7Dum1lcm8gZXNwZWPDrWZpY28gZGUgbXV0YWNpb25lcywgbGFzIGN1YWxlcyBhZmVjdGFuIGRlIGZvcm1hIGRpcmVjdGEgYWwgb3JnYW5pc21vIGRlbCBjdWVycG8gaHVtYW5vLiANCg0KVGFudG8gw5NtaWNyb24gY29tbyBEZWx0YSBzb24gdmFyaWFudGVzIGRlIGludGVyw6lzLCBsYXMgY3VhbGVzIGVzdHV2aWVyb24gZW4gc3UgcGxlbm8gYXVnZSBlbiBzdSBtYXlvcsOtYSBkdXJhbnRlIGVsIGHDsW8gMjAyMSwgZXN0ZSBhw7FvIGZ1ZSB1bm8gZGUgbG9zIGHDsW9zIGNvbiBtYXlvciB0YXNhIGRlIGNyZWNpbWllbnRvIGRlIGxhIHBhbmRlbWlhIGFzw60gY29tbyBsbyBxdWUgbXVjaG9zIGxsYW1hbiBlbCBwdW50byBkZSBxdWllYnJlIGRlIGxhIG1pc21hIGEgZmluYWxlcyBkZWwgbWlzbW8gYcOxby4NCg0KICA8L3A+ICANCjwvZGl2Pg0KDQo8ZGl2Pg0KICA8cD4NCiAgPGNlbnRlcj4NCiAgIVtdKEZPVE9TL1NUUlVDVFVSRS5qcGcpe3dpZHRoPTMwMHB4fQ0KICA8L2NlbnRlcj4NCiAgPC9wPg0KPC9kaXY+DQoNCjxkaXY+DQo8c3R5bGU+DQogIHB7DQogICAgdGV4dC1hbGlnbjpqdXN0aWZ5Ow0KICB9DQo8L3N0eWxlPg0KICA8cD4NCkNhYmUgcmVjYWxjYXIsIHF1ZSBwYXJhIGhhY2VyIGVsIGFuw6FsaXNpcyBkZSBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFudGVzLCBmdWUgbmVjZXNhcmlvIHJlYWxpemFyIGxhIGFsaW5lYWNpw7NuIGRlIGFtYmFzLCBlc3RvIGNvbiBiYXNlIGEgcXVlIGFtYmFzIHZhcmlhbnRlcyB0ZW7DrWFuIGRpZmVyZW50ZXMgdGFtYcOxb3MgZW4gc3UgZXNww61jdWxhLCBlcyBwb3IgZWxsbyBxdWUgdXRpbGl6YW5kbyBjw7NkaWdvIChwcmV2aWFtZW50ZSB2aXN0byBlbiBjbGFzZSksIHJlYWxpemFtb3MgbGEgYWxpbmVhY2nDs24gZGUgYW1iYXMuIA0KICA8L3A+DQo8L2Rpdj4NCioqKiANCjwhLS1BcXXDrSBpbmljaWEgZWwgT2JqZXRpdm8tLT4NCjxoMj4qKk9iamV0aXZvKio8L2gyPg0KDQo8ZGl2Pg0KICA8c3R5bGU+DQogICAgcHsNCiAgICAgIHRleHQtYWxpZ246anVzdGlmeTsNCiAgICB9DQogIDwvc3R5bGU+ICANCiAgPHA+DQogICAgRWwgb2JqZXRpdm8gZGUgZXN0ZSBwcm95ZWN0byBlcyBoYWNlciB1biBhbsOhbGlzaXMgcGFyY2lhbCBkZSBsYXMgdmFyaWFudGVzIMOTbWljcm9uIHkgRGVsdGEsIHBhcmEgcG9kZXIgYXPDrSBsbGVnYXIgYSB1biBwb3NpYmxlIHJlc3R1bHRhZG8gZGVsIHBvcnF1w6kgZXMgcXVlIHVuYSBlcyBtw6FzIGNvbnRhZ2lvc2EgcXVlIG90cmEsIHkgcG9yIHF1w6kgdW5hIHJlcHJlc2VudMOzIHVuIG1heW9yIHBlbGlncm8gYSBuaXZlbCBtdW5kaWFsLg0KICA8L3A+DQo8L2Rpdj4NCioqKg0KPCEtLUFxdcOtIGluaWNpYSBsYSBwYXJ0ZSBkZSBsYSBoaXDDs3Rlc2lzLS0+DQo8aDI+KipIaXDDs3Rlc2lzKio8L2gyPg0KPGRpdj4NCiAgPHN0eWxlPg0KICAgIHB7DQogICAgICB0ZXh0LWFsaWduOmp1c3RpZnk7DQogICAgfQ0KICA8L3N0eWxlPiANCiAgPHA+DQpDb24gZXN0ZSBwcm95ZWN0byBzdSBidXNjYSBkZW1vc3RyYXIgbGEgZXN0cmVjaGEgcmVsYWNpw7NuIHF1ZSBoYXkgZW50cmUgZWwgbsO6bWVybyBkZSBtdXRhY2lvbmVzIGVuY29udHJhZGFzIGVuIGxhIGVzcMOtY3VsYSBkZSBsYSB2YXJpYW50ZSDDk21pY3JvbiB5IHN1IGZvcm1pZGFibGUgY2FwYWNpZGFkIGRlIGluZmVjY2nDs24gZW4gaHVtYW5vcywgYWRlbcOhcyBkZSBwcm9wb3JjaW9uYXIgdW5hIGdyYW4gY2FyZ2EgdmlyYWwgZW50cmUgbG9zIGluZGl2aWR1b3MgaW5mZWN0YWRvcy4NCiAgPC9wPg0KPC9kaXY+ICANCioqKg0KPCEtLUFxdWkgaW5pY2lhbW9zIGNvbiBlbCBtYXJjbyB0ZcOzcmljby0tPg0KPGgyPioqTWFyY28gdGXDs3JpY28qKjwvaDI+DQo8ZGl2Pg0KICA8c3R5bGU+DQogICAgcHsNCiAgICAgIHRleHQtYWxpZ246anVzdGlmeTsNCiAgICB9DQogIDwvc3R5bGU+ICANCiAgPHA+DQogICAgPGg0Pioqwr9RdcOpIGVzIGVsIHZpcnVzIFNhcnMtQ292Mj8qKjwvaDQ+DQogICAgTG9zIGNvcm9uYXZpcnVzIHNvbiB1bmEgZmFtaWxpYSBkZSB2aXJ1cyBxdWUgY2F1c2FuIGVuZmVybWVkYWRlcyAoZGVzZGUgZWwgcmVzZnJpYWRvIGNvbcO6biBoYXN0YSBlbmZlcm1lZGFkZXMgcmVzcGlyYXRvcmlhcyBtw6FzIGdyYXZlcykgeSBjaXJjdWxhbiBlbnRyZSBodW1hbm9zIHkgYW5pbWFsZXMuDQogICAgPGg1PioqSW5mb3JtYWNpw7NuIGRlIGxhIHZhcmlhbnRlIMOTbWljcm9uKio8L2g1Pg0KICAgIDx1bD4NCiAgICA8bGk+w5NtaWNyb24gZXMgZGUgZG9zIGEgY3VhdHJvIHZlY2VzIG3DoXMgY29udGFnaW9zYSBxdWUgRGVsdGEuPC9saT4NCiAgICA8bGk+w5NtaWNyb24gZXMgbcOhcyBlZmljaWVudGUgYWwgZXZhZGlyIGFudGljdWVycG9zIHByb3BvcmNpb25hZG9zIHBvciBsYXMgYWN0dWFsZXMgdmFjdW5hcy48L2xpPg0KICAgIDxsaT7Dk21pY3JvbiBjdWVudGEgY29uIGFwcm94aW1hZGFtZW50ZSAzNiBtdXRhY2lvbmVzIGVuIHN1IGVzcMOtY3VsYS48L2xpPg0KICAgIDxsaT5EZWJpZG8gYSB1biBncmFuIG7Dum1lcm8gZGUgbXV0YWNpb25lcyBlbiBlbCBSQkQsIGxhIHZhcmlhbnRlIMOTbWljcm9uIGVzIG11Y2hvIG3DoXMgdHJhbnNtaXNpYmxlIHF1ZSBEZWx0YS48L2xpPg0KICAgIDxsaT5VbiBkb21pbmlvIGRlIHVuacOzbiBhbCByZWNlcHRvciAoUkJEKSBlcyB1bmEgcGFydGUgY2xhdmUgZGUgdW4gdmlydXMgdWJpY2FkbyBlbiBzdSBkb21pbmlvIGRlICJlc3DDrWN1bGEiIHF1ZSBsZSBwZXJtaXRlIGFjb3BsYXJzZSBhIGxvcyByZWNlcHRvcmVzIGRlbCBjdWVycG8gcGFyYSBpbmdyZXNhciBhIGxhcyBjw6lsdWxhcyB5IHByb3ZvY2FyIHVuYSBpbmZlY2Npw7NuLjwvbGk+DQogICAgPC91bD4NCiAgICA8aDU+KipJbmZvcm1hY2nDs24gZGUgbGEgdmFyaWFudGUgRGVsdGEqKjwvaDU+DQogICAgPHVsPg0KICAgICAgPGxpPkxhIHZhcmlhbnRlIERlbHRhIGZ1ZSBkZXRlY3RhZGEgcG9yIHByaW1lcmEgdmV6IGVuIGxhIEluZGlhIGVuIGRpY2llbWJyZSBkZSAyMDIwLjwvbGk+DQogICAgICA8bGk+U2UgZGV0ZXJtaW7DsyBxdWUgRGVsdGEgZnVlIDIgdmVjZXMgbcOhcyBjb250YWdpb3NhIHF1ZSBsYSB2YXJpYW50ZSBvcmlnaW5hbCBkZSBXdWhhbi48L2xpPg0KICAgICAgPGxpPkxhIGNhcmdhIHZpcmFsIGRlIERlbHRhIGVyYSBiYXN0YW50ZSBlbGV2YWRhIGVuIHBlcnNvbmFzIGNvbnRhZ2lhZGFzIGNvbiBlc3RhIHZhcmlhbnRlLjwvbGk+DQogICAgICA8bGk+IERlbHRhIGZ1ZSBsYSB2YXJpYW50ZSBkZWwgU0FSUy1Db1YtMiBxdWUgZG9taW7DsyBhbCBtdW5kbyBoYXN0YSBmaW5hbGVzIGRlIDIwMjEuIDwvbGk+DQogICAgICA8bGk+TGFzIG11dGFjaW9uZXMgZW4gZWwgcmVjZXB0b3IgUkJEIGltcGFjdGFyb24gZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEgYSBsYSBob3JhIGRlIGV2YWRpciBjaWVydGEgaW5tdW5pZGFkIHBvciBwYXJ0ZSBkZSBsb3MgaW5mZWN0YWRvcy48L2xpPg0KICAgIDwvdWw+DQogIDwvcD4NCjwvZGl2Pg0KDQoqKioNCjxoMj4qKkV4cGVyaW1lbnRhY2nDs24qKjwvaDI+DQo8ZGl2Pg0KICA8c3R5bGU+DQogICAgcHsNCiAgICAgIHRleHQtYWxpZ246anVzdGlmeTsNCiAgICB9DQogIDwvc3R5bGU+ICANCiAgPHA+DQpQYXJhIHBvZGVyIHJlYWxpemFyIGVzdGUgcHJveWVjdG8sIGZ1ZSBuZWNlc2FyaW8gaGFjZXIgbGEgbW9kaWZpY2FjacOzbiBuZWNlc2FyaWEgYSBsb3MgYXJjaGl2b3MgRkFTVEEuIA0KDQpFcyBwb3IgZWxsbyBxdWUgaGljaW1vcyBlbCBjYW1iaW8gZGUgQUROIGEgQVJOIHBhcmEgcG9kZXIgaGFjZXIgYXPDrSB1bmEgbWVqb3IgY29tcGFyYXRpdmEgZGUgbG9zIGRhdG9zLg0KPC9wPiA8YnI+DQo8L2Rpdj4NCg0KKipGdW5jacOzbiBwYXJhIHJlYWxpemFyIGxhIHRyYWR1Y2Npw7NuOioqDQpgYGB7cn0NCiAgIyBSZWFsaXphbW9zIGFxdcOtIGxhIHBhcnRlIGRlIGNhbWJpYXIgYSBtYXnDunNjdWxhcyBsYXMgcGFydGVzIGRlIGxhIHNlY3VlbmNpYQ0KICBBID0gdG91cHBlcihEZWx0YVtbMV1dKVsxOjEwMF0gDQogIEIgPSB0b3VwcGVyKE9taWNyb25bWzFdXSlbMToxMDBdDQogICMgRnVuY2nDs24gcGFyYSBlbCBjYW1iaW8gYSByZWFsaXphcjoNCiAgQUROX3RvX0FSTm0gPSBmdW5jdGlvbihudWNsZW90aWRvKXsNCiAgICByZXR1cm4gKHN3aXRjaChudWNsZW90aWRvLCJDIj0iRyIsIkciPSJDIiwiVCI9IkEiLCJBIj0iVSIpKQ0KICB9DQogICMgRWplY3V0YW1vcyBsYSBmdW5jacOzbiBkZW50cm8gZGUgQSB5IEINCiAgQSA9IGFzLnZlY3RvcihzYXBwbHkoQSwgQUROX3RvX0FSTm0pKQ0KICBCID0gYXMudmVjdG9yKHNhcHBseShCLCBBRE5fdG9fQVJObSkpDQpgYGANCg0KKioqDQo8aDU+IEFuw6FsaXNpcyBkZSBsb3MgYXJjaGl2b3MgRkFTVEEgPC9oNT4NCg0KDQoqKkFuw6FsaXNpcyBkZSBsYSB2YXJpYW50ZSDDk21pY3JvbiBkZXNwdcOpcyBkZSBoYWNlciBsYSBhbGluZWFjacOzbioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQogICMgVmFyaWFudGUgw5NtaWNyb24gZGVzcHXDqXMgZGUgbGEgYWxpbmVhY2nDs246DQogIHNvbEEgIyBWYXJpYWJsZSByZWZpcmllbmRvIGEgw5NtaWNyb24NCmBgYA0KKioqDQoqKkFuw6FsaXNpcyBkZSBsYSB2YXJpYW50ZSBEZWx0YSBkZXNwdcOpcyBkZSBoYWNlciBsYSBhbGluZWFjacOzbioqDQpgYGB7ciBlY2hvID0gRkFMU0V9DQogICMgVmFyaWFudGUgRGVsdGEgZGVzcHXDqXMgZGUgbGEgYWxpbmVhY2nDs246DQogIHNvbEIjIFZhcmlhYmxlIHJlZmlyaWVuZG8gYSBEZWx0YQ0KYGBgDQoNCkRhbmRvIGFzw60gdW5hIG1hdHJpeiBmaW5hbCBkZXNwdcOpcyBkZSBsYSBhbGluZWFjacOzbiBkZSBlc3RlIHRpcG86ICANCihfKipDb250YW5kbyBhc8OtIGNvbW8gbGEgcHJpbWVyIGZpbGEgcGFyYSBsYSB2YXJpYW50ZSDDk21pY3JvbiwgeSBsYSBzZWd1bmRhIHBhcmEgRGVsdGEqKl8pDQoNCmBgYHtyIGVjaG89RkFMU0V9DQogICMgQW1iYXMgdmFyaWFibGVzIGRlbnRybyBkZSB1bmEgbWF0cml6Og0KICBzb2wgIyBWYXJpYWJsZSBwYXJhIGxhIG1hdHJpeiBmaW5hbCBkZSBEZWx0YSB5IMOTbWljcm9uLg0KYGBgDQpFcyBwb3IgZWxsbyBxdWUgZnVlIG5lY2VzYXJpbyBoYWNlciB1c28gZGUgdW4gYWxnb3JpdG1vIHBhcmEgcG9kZXIgYXPDrSByZWFsaXphciBsYSBjb21wYXJhdGl2YSwgdXRpbGl6YW5kbyB1bmEgc2VudGVuY2lhIGRlIHRyb25jdHJvbCBwYXJhIHZlcmlmaWNhciBsYSBsb25naXR1ZCBkZSBsYXMgZGlmZXJlbmNpYXMsIGFzw60gY29tbyB1biBjaWNsbyBkZSBmb3IgcGFyYSByZWFsaXphciBlbCBhbsOhbGlzaXM6DQpgYGB7ciBldmFsPUZBTFNFfQ0KaWYgKGxlbmd0aChkaWZlcmVudGVzKSA+IDApew0KICBmb3IgKGsgaW4gZGlmZXJlbnRlcyl7DQogICAgbXV0YXRpb24gPSBwYXN0ZShnZW5PbWlba10sICJ0byIsIGdlbkRlbHRhW2tdLCBzZXA9IiIpDQogICAgaW5pY2lvID0gayAtIChrLTEpICUlIDMNCiAgICBnbG9iYWwgPSAwK2luaWNpbyAjIDIxNTYzIHZhbG9yIG9yaWdpbmFsDQogICAgaW5kZXggPSBhcy5pbnRlZ2VyKGsvMysxKSAgIyAlLyUNCiAgICBjb2Rvbk9taSA9IHBhc3RlKGdlbk9taVtpbmljaW9dLCBnZW5PbWlbaW5pY2lvKzFdLCBnZW5PbWlbaW5pY2lvKzJdLHNlcD0iIikNCiAgICBjb2RvbkRlbHRhID0gcGFzdGUoZ2VuRGVsdGFbaW5pY2lvXSwgZ2VuRGVsdGFbaW5pY2lvKzFdLCBnZW5EZWx0YVtpbmljaW8rMl0sc2VwPSIiKQ0KICAgIGNvZG9uQ2hhbmdlID0gcGFzdGUoY29kb25PbWksZ2xvYmFsLGNvZG9uRGVsdGEsIHNlcD0iIikNCiAgICBhbWlub0NoYW5nZSA9IHBhc3RlKHRyYWRbY29kb25PbWldLGluZGV4LHRyYWRbY29kb25EZWx0YV0sIHNlcD0iIikNCiAgICBwcmludChwYXN0ZShtdXRhdGlvbiwgZ2xvYmFsLCBjb2RvbkNoYW5nZSwgYW1pbm9DaGFuZ2UsIGluZGV4KSkNCiAgICBuZXdSb3cgPSBsaXN0KG11dGF0aW9uLCBnbG9iYWwsIGNvZG9uQ2hhbmdlLCBhbWlub0NoYW5nZSwgaW5kZXgpDQogICAgZGZbbnJvdyhkZikrMSwgXSA9IG5ld1Jvdw0KICB9DQp9DQpgYGANCioqKg0KPGgyPioqUmVzdWx0YWRvcyoqPC9oMj4NCjxkaXY+DQogIDxzdHlsZT4NCiAgICBwew0KICAgICAgdGV4dC1hbGlnbjpqdXN0aWZ5Ow0KICAgIH0NCiAgPC9zdHlsZT4gIA0KICA8cD4NCiAgICBVbmEgdmV6IHJlYWxpemFkb3MgbG9zIGFuw6FsaXNpcyBhc8OtIGNvbW8gbGFzIHJlc3BlY3RpdmFzIGNvbXBhcmF0aXZhcyB1dGlsaXphbmRvIGVsIGFsZ29yaXRtbyByZXN1bHTDsyBlbiB1biBkYXRhZnJhbWUgY29uIGV4YWN0YW1lbnRlICoqMTkqKiByZXN1bHRhZG9zLCB0ZW5pZW5kbyBhc8OtIHVuIHJhbmdvIGRlIGVudHJlIDE5IHkgMzYgcmVzdWx0YWRvcyAqKnBvc2libGVzKiouIEVzIHBvciBlc28sIHF1ZSByZWFsaXphbW9zIHVuYSB2aXN1YWxpemFjacOzbiBhIGZvcm1hIHRhYnVsYWRhIGRlIGxhcyBtdXRhY2lvbmVzIGRlbnRybyBkZSB1biBkYXRhZnJhbWUuDQogIDwvcD4NCjwvZGl2Pg0KDQoNCioqUmVzdWx0YW5kbyBlbiBlbCBzaWd1aWVudGUgZGF0YWZyYW1lKioNCjxoMz4gKipEYXRhZnJhbWUgKio8L2gzPg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KICBzdHIoZGYpDQogIGRmDQpgYGANCjxoMz4qKkdyw6FmaWNhKio8L2gzDQoNCioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KICBwDQpgYGANCg0KDQpQYXJhIHRlbmVyIHVuIG1lam9yIGFuw6FsaXNpcywgZGVjaWRpbW9zIHJlYWxpemFyIGxhIGdyYWZpY2FjacOzbiBkZSBsb3MgcmVzdWx0YWRvcy4gRW4gZWwgcXVlIHBvZGVtb3MgdmVyIHVuIG7Dum1lcm8gbWF5b3IgZGUgbXV0YWNpb25lcyBlbiBsYSBwYXJ0ZSBkZSBBdG9VIGFzw60gY29tbyBlbiBsYSBwYXJ0ZSBkZSBHdG9BLCBkZW1vc3RyYW5kbyBhc8OtIGxhcyBtdXRhY2lvbmVzIGRlbCBtaXNtby4NCg0KPGgyPiAqKkNvbmNsdXNpw7NuKiogPC9oMj4NCjxkaXY+DQogIDxzdHlsZT4NCiAgICBwew0KICAgICAgdGV4dC1hbGlnbjpqdXN0aWZ5Ow0KICAgIH0NCiAgPC9zdHlsZT4gIA0KICA8cD4NCiAgICBFbiBjb25jbHVzacOzbiwgZ3JhY2lhcyBhbCBhbsOhbGlzaXMgZWxhYm9yYWRvIGVuIFIsIHNlIGxvZ3JhIGFwcmVjaWFyIGVzdGFkw61zdGljYW1lbnRlIGVsIGdyYW4gbsO6bWVybyBkZSBtdXRhY2lvbmVzIGVuIGVsIGdlbmUg4oCcU+KAnSBkZWwgdmlydXMgU0FSUy1Db1YtMiwgZXNwZWPDrWZpY2FtZW50ZSBlbnRyZSBsYXMgdmFyaWFudGVzIGFjdHVhbGVzIGRlIGludGVyw6lzIGEgbml2ZWwgbXVuZGlhbDogRGVsdGEgeSDDk21pY3Jvbi4NCkRlIGFjdWVyZG8gY29uIGRpdmVyc2FzIGludmVzdGlnYWNpb25lcyBjaWVudMOtZmljYXMsIGxhIHZhcmlhbnRlIMOTbWljcm9uIHByZXNlbnRhIGFwcm94aW1hZGFtZW50ZSAzNiBtdXRhY2lvbmVzIGVuIHN1IGVzcMOtY3VsYSwgcGVybyBlbiBlc3RlIGFuw6FsaXNpcyBzZSBsb2dyYXJvbiBkZXRlY3RhciDDum5pY2FtZW50ZSAxOSBkZSBlbGxhcy4gRXN0byBzZSBwdWVkZSBkZWJlciBhIHF1ZSBsYXMgbXVlc3RyYXMgcXVlIHNlIHRvbWFyb24gcGFyYSBsbGV2YXIgYSBjYWJvIGVzdGUgcHJveWVjdG8gc29uIHJlY2llbnRlcyB5IG5vIGRlIGZpbmFsZXMgZGVsIGHDsW8gMjAyMSwgbGFzIGN1YWxlcyByZXNwYWxkYW4gZXNhcyBtw6FzIGRlIDMgZGVjZW5hcyBkZSBtdXRhY2lvbmVzLg0KQcO6biBhc8OtLCBzZSBjb25jbHV5ZSBxdWUgbGEgdmFyaWFudGUgw5NtaWNyb24gZXMgbXVjaG8gbcOhcyBpbmZlY2Npb3NhIHF1ZSBEZWx0YSBkZWJpZG8gYSBsYXMgbXV0YWNpb25lcyBwcmVzZW50ZXMgZW4gZWwgcmVjZXB0b3IgUkJELCBlbCBjdWFsIHNlIHViaWNhIGVuIGxhIGVzcMOtY3VsYSBkZWwgY29yb25hdmlydXMuIMOJc3RlIGxlIHBlcm1pdGUgYWwgdmlydXMgYWNvcGxhcnNlIGUgaW5mZWN0YXIgYSBsYXMgY8OpbHVsYXMgaHXDqXNwZWRlcywgeSBlcyBhc8OtIGNvbW8gw5NtaWNyb24gZXMgbXVjaG8gbcOhcyBlZmljaWVudGUgYWwgZXZhZGlyIGxhIGlubXVuaWRhZCBhY3R1YWwgZGUgbG9zIHNlcmVzIGh1bWFub3MgY29udHJhIGVsIFNBUlMtQ29WLTIuDQogIDwvcD4NCjwvZGl2PiAgDQoqKioNCjxoMj4gKipSZWZlcmVuY2lhcyoqIDwvaDI+DQo8ZGl2Pg0KICA8c3R5bGU+DQogICAgcHsNCiAgICAgIHRleHQtYWxpZ246anVzdGlmeTsNCiAgICB9DQogIDwvc3R5bGU+ICANCiAgPHA+DQogICAgPHVsPg0KICAgIDxsaT4gTkNCSSAtIFdXVyBFcnJvciBCbG9ja2VkIERpYWdub3N0aWMuIChzLiBmLikuIE5DQkkuTkxNLk5JSC5HT1YuIFJlY3VwZXJhZG8gMSBkZSBtYXlvIGRlIDIwMjIsIGRlIGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvIDwvbGk+DQogICAgPGxpPiBHbG9iYWwgVmlydXMgbmV0d29yay4gKDIwMjEsIDIyIG9jdHVicmUpLiBEZWx0YSAoQi4xLjYxNy4yKS4gR1ZOLiBSZWN1cGVyYWRvIDEgZGUgbWF5byBkZSAyMDIyLCBkZSBodHRwczovL2d2bi5vcmcvY292aWQtMTkvZGVsdGEtYi0xLTYxNy0yLyA8L2xpPg0KICAgIDxsaT4gQ29yb25hdmlydXMuICgyMDIwLCAxMCBlbmVybykuIFdIT0lOVC4gUmVjdXBlcmFkbyAxIGRlIG1heW8gZGUgMjAyMiwgZGUgaHR0cHM6Ly93d3cud2hvLmludC9oZWFsdGgtdG9waWNzL2Nvcm9uYXZpcnVzI3RhYj10YWJfMTwvbGk+DQogICAgPGxpPkthdGVsbGEsIEsuICgyMDIyLCAyMCBhYnJpbCkuIE9taWNyb24sIERlbHRhLCBBbHBoYSwgYW5kIE1vcmU6IFdoYXQgVG8gS25vdyBBYm91dCB0aGUgQ29yb25hdmlydXMgVmFyaWFudHMuIFlhbGUgTWVkaWNpbmUuIFJlY3VwZXJhZG8gMSBkZSBtYXlvIGRlIDIwMjIsIGRlIGh0dHBzOi8vd3d3LnlhbGVtZWRpY2luZS5vcmcvbmV3cy9jb3ZpZC0xOS12YXJpYW50cy1vZi1jb25jZXJuLW9taWNyb248L2xpPg0KICAgIDxsaT5QZXNoZXZhLCBCLiBFLiAoMjAyMiwgMyBmZWJyZXJvKS4gQmV5b25kIE9taWNyb24uIEhhcnZhcmQgTWVkaWNhbCBTY2hvb2wuIFJlY3VwZXJhZG8gMSBkZSBtYXlvIGRlIDIwMjIsIGRlIGh0dHBzOi8vaG1zLmhhcnZhcmQuZWR1L25ld3MvYmV5b25kLW9taWNyb248L2xpPg0KICAgIDwvdWw+DQogIDwvcD4NCjwvZGl2PiAgDQoNCg==