Climate change timeline history
# Instalación de paquetes necesarios (descomenta si no los tienes)
# install.packages("ggplot2")
# install.packages("dplyr")
# install.packages("ggtext")
options(warn = -1)
library(ggplot2)
suppressPackageStartupMessages(library(dplyr))
suppressWarnings(library(ggtext))
# Datos de las Conferencias COP
cop_data <- data.frame(
year = c(1997, 2005, 2007, 2009, 2011, 2012, 2015, 2021, 2024, 2025),
event = c("COP3", "COP11/MOP1", "COP13", "COP15", "COP17", "COP18", "COP21", "COP26", "COP29", "COP30"),
title = c(
"Protocolo de Kioto",
"Entrada en vigor de Kioto",
"Plan de Acción de Bali",
"Acuerdo de Copenhague",
"Plataforma de Durban",
"Enmienda de Doha",
"Acuerdo de París",
"Pacto de Glasgow",
"COP29",
"COP30"
),
location = c(
"Kioto, Japón",
"Montreal, Canadá",
"Bali, Indonesia",
"Copenhague, Dinamarca",
"Durban, Sudáfrica",
"Doha, Catar",
"París, Francia",
"Glasgow, Reino Unido",
"Bakú, Azerbaiyán",
"Belém, Brasil"
),
description = c(
"Metas vinculantes de reducción de\nemisiones 6-8% vs 1990",
"Primera reunión de las Partes\ndel protocolo. +10,000 delegados",
"Cronograma para el marco post-2012.\nGrupo de acción cooperativa",
"192 países. Compromiso de\n$30 mil millones 2010-2012",
"Negociaciones para acuerdo vinculante.\nFondo Verde $100 mil millones",
"Segundo período de compromiso\nKioto 2013-2020",
"Mantener calentamiento <2°C.\nParticipación universal",
"Primer balance global del\nAcuerdo de París. +40,000 participantes",
"Acuerdo de $300,000 millones\nanuales para países en desarrollo",
"Prevista para noviembre 2025.\nNuevas NDCs 3.0"
),
highlight = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE),
side = c("left", "right", "left", "right", "left", "right", "left", "right", "left", "right")
)
# Crear el gráfico
p <- ggplot(cop_data, aes(x = year, y = 0)) +
# Línea de tiempo central
geom_segment(aes(x = min(year), xend = max(year), y = 0, yend = 0),
color = "#667eea", size = 1.5, lineend = "round") +
# Puntos en la línea de tiempo
geom_point(aes(color = highlight), size = 8, show.legend = FALSE) +
scale_color_manual(values = c("TRUE" = "#e74c3c", "FALSE" = "#667eea")) +
# Líneas conectoras a las cajas de texto
geom_segment(data = cop_data %>% filter(side == "left"),
aes(x = year, xend = year, y = 0, yend = 0.3),
color = "#667eea", size = 0.8, linetype = "solid") +
geom_segment(data = cop_data %>% filter(side == "right"),
aes(x = year, xend = year, y = 0, yend = -0.3),
color = "#667eea", size = 0.8, linetype = "solid") +
# Cajas de eventos (lado izquierdo/arriba)
geom_label(data = cop_data %>% filter(side == "left"),
aes(x = year, y = 0.35,
label = paste0("**", year, " - ", title, "**\n",
"📍 ", location, "\n\n",
description),
fill = highlight),
hjust = 0.5, vjust = 0, size = 3.5,
lineheight = 0.9, label.padding = unit(0.5, "lines"),
label.size = 0.5, show.legend = FALSE) +
# Cajas de eventos (lado derecho/abajo)
geom_label(data = cop_data %>% filter(side == "right"),
aes(x = year, y = -0.35,
label = paste0("**", year, " - ", title, "**\n",
"📍 ", location, "\n\n",
description),
fill = highlight),
hjust = 0.5, vjust = 1, size = 3.5,
lineheight = 0.9, label.padding = unit(0.5, "lines"),
label.size = 0.5, show.legend = FALSE) +
scale_fill_manual(values = c("TRUE" = "#667eea", "FALSE" = "#ecf0f1")) +
# Etiquetas de años en la línea
geom_text(aes(label = year), y = -0.05, vjust = 1.5,
size = 3, fontface = "bold", color = "#2c3e50") +
# Configuración de escalas y tema
scale_x_continuous(breaks = cop_data$year, limits = c(1995, 2027)) +
scale_y_continuous(limits = c(-0.8, 0.8)) +
labs(
title = "🌍 UN Climate Change Conference UNCCC",
subtitle = "Del Protocolo de Kioto (1997) a la COP30 (2025)",
caption = "Fuente: UNFCCC | Eventos destacados: Kioto, París y COP30"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 20, face = "bold", hjust = 0.5,
color = "#2c3e50", margin = margin(b = 5)),
plot.subtitle = element_text(size = 14, hjust = 0.5,
color = "#7f8c8d", margin = margin(b = 20)),
plot.caption = element_text(size = 10, color = "#95a5a6", hjust = 0.5,
margin = margin(t = 20)),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
plot.background = element_rect(fill = "#f8f9fa", color = NA),
panel.background = element_rect(fill = "#f8f9fa", color = NA),
plot.margin = margin(30, 30, 30, 30)
)
# Mostrar el gráfico
print(p)

# Guardar el gráfico (opcional)
# ggsave("timeline_cop_conferencias.png", plot = p,
# width = 16, height = 10, dpi = 300, bg = "#f8f9fa")
suppressPackageStartupMessages(library(kableExtra))
# kable(cop_data[ ,1:5], format = "html")
cop_data[ ,1:5] %>%
kbl() %>%
kable_material(c("striped", "hover"))
|
year
|
event
|
title
|
location
|
description
|
|
1997
|
COP3
|
Protocolo de Kioto
|
Kioto, Japón
|
Metas vinculantes de reducción de emisiones 6-8% vs 1990
|
|
2005
|
COP11/MOP1
|
Entrada en vigor de Kioto
|
Montreal, Canadá
|
Primera reunión de las Partes del protocolo. +10,000 delegados
|
|
2007
|
COP13
|
Plan de Acción de Bali
|
Bali, Indonesia
|
Cronograma para el marco post-2012. Grupo de acción cooperativa
|
|
2009
|
COP15
|
Acuerdo de Copenhague
|
Copenhague, Dinamarca
|
192 países. Compromiso de $30 mil millones 2010-2012
|
|
2011
|
COP17
|
Plataforma de Durban
|
Durban, Sudáfrica
|
Negociaciones para acuerdo vinculante. Fondo Verde $100 mil millones
|
|
2012
|
COP18
|
Enmienda de Doha
|
Doha, Catar
|
Segundo período de compromiso Kioto 2013-2020
|
|
2015
|
COP21
|
Acuerdo de París
|
París, Francia
|
Mantener calentamiento <2°C. Participación universal
|
|
2021
|
COP26
|
Pacto de Glasgow
|
Glasgow, Reino Unido
|
Primer balance global del Acuerdo de París. +40,000 participantes
|
|
2024
|
COP29
|
COP29
|
Bakú, Azerbaiyán
|
Acuerdo de $300,000 millones anuales para países en desarrollo
|
|
2025
|
COP30
|
COP30
|
Belém, Brasil
|
Prevista para noviembre 2025. Nuevas NDCs 3.0
|
Metrics of the globalization
Those are the so-called “end of globalization” metrics.

Offshoring
Offshoring is the practice of relocating a business
process, manufacturing, or service to a distant foreign country,
typically to take advantage of lower labor costs or other economic
benefits (environmental).
Location: A country far from the company’s home
country (e.g., a U.S. company moving manufacturing to China or a
European company moving IT support to India).
Primary Motivation: Significant cost savings,
access to specialized skills, and global market expansion.
Trade-offs: Potential for long supply chains,
significant time zone differences, cultural/language barriers, and
reduced supply chain visibility/control.
Re-shoring (also called Onshoring)
Re-shoring is the process of bringing business
operations, production, or services back to the company’s original home
country after they were previously moved overseas (offshored).
Location: The company’s home country.
Primary Motivation: Increasing supply chain
resilience and control, reducing lead times, improving product quality
oversight, avoiding geopolitical risks, and leveraging the “Made in
[Home Country]” appeal.
Trade-offs: Generally involves higher labor and
operational costs compared to offshore locations.
Near-shoring
Near-shoring involves relocating business operations
or services to a nearby foreign country, typically one that is
geographically proximate, often sharing a border or being within a close
time zone.
Location: A neighboring or geographically close
country (e.g., a U.S. company moving production to Mexico or a French
company moving IT to Romania).
Primary Motivation: Seeking a balance between
cost savings (lower costs than the home country) and the benefits of
proximity, such as shorter shipping times, fewer time zone issues, and
easier communication and travel for oversight.
Trade-offs: Costs are typically lower than
re-shoring but potentially higher than far-off offshoring. The goal is
to mitigate the complexity and risk associated with long-distance
offshoring while still achieving some cost advantages
One man is One man everywhere
Think of the developing countries vs developed ones.
* A US citizen emits seven times more than a European citizen. China proposes reducing emissions based on quotas per country.
* A Chinese citizen emits 15 times less than a European, but uses coal. Furthermore, they have a huge population. The US proposes reducing China's emissions and quality without altering its own emition rate. (MAGA)
* India has lowered its energy intensity (TOE vs. GDP), proposing that one man equals one man. Developed countries have already "burned" their share of fuel. Then their need to reduce his emissions and allow developing countries to close the inequality gap.
LS0tCnRpdGxlOiAiVGhlIGVuZCBvZiBnbG9iYWxpemF0aW9uIElJIgphdXRob3I6ICJSLlBhbG1hIDxyaWNhcmRvLnJwYWxtYUBnbWFpbC5jb20+IgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpjc2w6IGFwYS5jc2wKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgMXN0IENvb3JkaW5hdGlvbiBNZWV0aW5nIG9mIHRoZSBJbmR1c3RyaWFsIEVuZ2luZWVyaW5nIE5ldHdvcmsKCiMjIFByb2dyYW1hIE1BUkNBIC0gTWVyY29zdXIKCiMjIyBJbnRlcm5hbCBjb21tdW5pY2F0aW9uIG5vdGVzIG92ZXIgbmV4dCBzdGVwcyBpbiByZXNlYXJjaCBhcmVhcyBvZiB0aGUgbmV0d29yawoKQXJ0aWNsZSBzdWJtaXR0ZWQgdG8gQklTIChCYW5rIGZvciBJbnRlcm5hdGlvbmFsIFNldHRsZW1lbnRzKSB0byBwb3N0dWxhdGUgdG8gYW55IGNhbGwgZm9yIHVuaXZlcnNpdHkgcmVzZWFyY2ggaW5pdGlhdGl2ZSBvcGVuIGluIDIwMjYuCgpUaGUgZ2VuZXJhbCBuYXJyYXRpdmUgYXJvdW5kIGFuIGVtZXJnaW5nIHRoZW1lIGNhbGxlZCAqKiJ0aGUgZW5kIG9mIGdsb2JhbGl6YXRpb24uIioqIGlzIGEgZmFjdCB0aGF0IGV2ZXJ5IGRheSBnYWluaW5nIGZvbGxvd2VycyAuRXZpZGVuY2UgaGFzIGJlZW4gZm91bmQgcmVnYXJkaW5nIHRoZSByZXNwb25zZXMgdGhhdCB0aGUgVVMsIEV1cm9wZSwgYW5kIEphcGFuIGFyZSBkZXZlbG9waW5nIHRvIGFkZHJlc3MgdGhpcyBwYXJhZGlnbS4KCi0gICBUaGUgVVMgaGFzIGltcGxlbWVudGVkIEluZHVzdHJ5IDUuMCwKCi0gICBFdXJvcGUgaGFzIHJlbWFpbmVkIHdpdGhpbiBJbmR1c3RyeSA0LjAgYnV0IHdpdGggZ3JlYXRlciByZXNpbGllbmNlLAoKLSAgIFdoaWxlIEphcGFuIGhhcyByZXNwb25kZWQgd2l0aCBpdHMgYWR2YW5jZWQgY29uY2VwdCBvZiBTb2NpZXR5IDUuMCwgYmFzZWQgb24gdGhlIHBpbGxhcnMgb2YgcXVhbGl0eSwgaHVtYW4gY2VudHJpYyBwZXJzcGVjdGl2ZSwgYW5kIG9wZXJhdGlvbmFsIGV4Y2VsbGVuY2UuIFRoZXJlIGFyZSBldmlkZW5jZSBpbiBzY2llbnRpZmljIHB1YmxpY2F0aW9ucyBvciB0aGUgcHJlc3MgcmVnYXJkaW5nIG1lYXN1cmVzIHRoYXQgTGF0aW4gQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbiBuZWVkcyBjb25zaWRlcmluZyBhZG9wdCBzdHJhdGVnaWVzIGluIHJlc3BvbnNlIHRvIHRoZSBlbmQgb2YgZ2xvYmFsaXphdGlvbi4KCldoeSB0aGUgZ2xvYmFsaXphdGlvbiBpcyBlbmRpbmc/CgojIENsaW1hdGUgY2hhbmdlIHRpbWVsaW5lIGhpc3RvcnkKCmBgYHtyIH0KIyBJbnN0YWxhY2nDs24gZGUgcGFxdWV0ZXMgbmVjZXNhcmlvcyAoZGVzY29tZW50YSBzaSBubyBsb3MgdGllbmVzKQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3RleHQiKQpvcHRpb25zKHdhcm4gPSAtMSkKbGlicmFyeShnZ3Bsb3QyKQoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoZHBseXIpKQoKc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KGdndGV4dCkpCgojIERhdG9zIGRlIGxhcyBDb25mZXJlbmNpYXMgQ09QCmNvcF9kYXRhIDwtIGRhdGEuZnJhbWUoCiAgeWVhciA9IGMoMTk5NywgMjAwNSwgMjAwNywgMjAwOSwgMjAxMSwgMjAxMiwgMjAxNSwgMjAyMSwgMjAyNCwgMjAyNSksCiAgZXZlbnQgPSBjKCJDT1AzIiwgIkNPUDExL01PUDEiLCAiQ09QMTMiLCAiQ09QMTUiLCAiQ09QMTciLCAiQ09QMTgiLCAiQ09QMjEiLCAiQ09QMjYiLCAiQ09QMjkiLCAiQ09QMzAiKSwKICB0aXRsZSA9IGMoCiAgICAiUHJvdG9jb2xvIGRlIEtpb3RvIiwKICAgICJFbnRyYWRhIGVuIHZpZ29yIGRlIEtpb3RvIiwKICAgICJQbGFuIGRlIEFjY2nDs24gZGUgQmFsaSIsCiAgICAiQWN1ZXJkbyBkZSBDb3BlbmhhZ3VlIiwKICAgICJQbGF0YWZvcm1hIGRlIER1cmJhbiIsCiAgICAiRW5taWVuZGEgZGUgRG9oYSIsCiAgICAiQWN1ZXJkbyBkZSBQYXLDrXMiLAogICAgIlBhY3RvIGRlIEdsYXNnb3ciLAogICAgIkNPUDI5IiwKICAgICJDT1AzMCIKICApLAogIGxvY2F0aW9uID0gYygKICAgICJLaW90bywgSmFww7NuIiwKICAgICJNb250cmVhbCwgQ2FuYWTDoSIsCiAgICAiQmFsaSwgSW5kb25lc2lhIiwKICAgICJDb3BlbmhhZ3VlLCBEaW5hbWFyY2EiLAogICAgIkR1cmJhbiwgU3Vkw6FmcmljYSIsCiAgICAiRG9oYSwgQ2F0YXIiLAogICAgIlBhcsOtcywgRnJhbmNpYSIsCiAgICAiR2xhc2dvdywgUmVpbm8gVW5pZG8iLAogICAgIkJha8O6LCBBemVyYmFpecOhbiIsCiAgICAiQmVsw6ltLCBCcmFzaWwiCiAgKSwKICBkZXNjcmlwdGlvbiA9IGMoCiAgICAiTWV0YXMgdmluY3VsYW50ZXMgZGUgcmVkdWNjacOzbiBkZVxuZW1pc2lvbmVzIDYtOCUgdnMgMTk5MCIsCiAgICAiUHJpbWVyYSByZXVuacOzbiBkZSBsYXMgUGFydGVzXG5kZWwgcHJvdG9jb2xvLiArMTAsMDAwIGRlbGVnYWRvcyIsCiAgICAiQ3Jvbm9ncmFtYSBwYXJhIGVsIG1hcmNvIHBvc3QtMjAxMi5cbkdydXBvIGRlIGFjY2nDs24gY29vcGVyYXRpdmEiLAogICAgIjE5MiBwYcOtc2VzLiBDb21wcm9taXNvIGRlXG4kMzAgbWlsIG1pbGxvbmVzIDIwMTAtMjAxMiIsCiAgICAiTmVnb2NpYWNpb25lcyBwYXJhIGFjdWVyZG8gdmluY3VsYW50ZS5cbkZvbmRvIFZlcmRlICQxMDAgbWlsIG1pbGxvbmVzIiwKICAgICJTZWd1bmRvIHBlcsOtb2RvIGRlIGNvbXByb21pc29cbktpb3RvIDIwMTMtMjAyMCIsCiAgICAiTWFudGVuZXIgY2FsZW50YW1pZW50byA8MsKwQy5cblBhcnRpY2lwYWNpw7NuIHVuaXZlcnNhbCIsCiAgICAiUHJpbWVyIGJhbGFuY2UgZ2xvYmFsIGRlbFxuQWN1ZXJkbyBkZSBQYXLDrXMuICs0MCwwMDAgcGFydGljaXBhbnRlcyIsCiAgICAiQWN1ZXJkbyBkZSAkMzAwLDAwMCBtaWxsb25lc1xuYW51YWxlcyBwYXJhIHBhw61zZXMgZW4gZGVzYXJyb2xsbyIsCiAgICAiUHJldmlzdGEgcGFyYSBub3ZpZW1icmUgMjAyNS5cbk51ZXZhcyBORENzIDMuMCIKICApLAogIGhpZ2hsaWdodCA9IGMoVFJVRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUpLAogIHNpZGUgPSBjKCJsZWZ0IiwgInJpZ2h0IiwgImxlZnQiLCAicmlnaHQiLCAibGVmdCIsICJyaWdodCIsICJsZWZ0IiwgInJpZ2h0IiwgImxlZnQiLCAicmlnaHQiKQopCgojIENyZWFyIGVsIGdyw6FmaWNvCnAgPC0gZ2dwbG90KGNvcF9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSAwKSkgKwogIAogICMgTMOtbmVhIGRlIHRpZW1wbyBjZW50cmFsCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gbWluKHllYXIpLCB4ZW5kID0gbWF4KHllYXIpLCB5ID0gMCwgeWVuZCA9IDApLAogICAgICAgICAgICAgICBjb2xvciA9ICIjNjY3ZWVhIiwgc2l6ZSA9IDEuNSwgbGluZWVuZCA9ICJyb3VuZCIpICsKICAKICAjIFB1bnRvcyBlbiBsYSBsw61uZWEgZGUgdGllbXBvCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBoaWdobGlnaHQpLCBzaXplID0gOCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9ICIjZTc0YzNjIiwgIkZBTFNFIiA9ICIjNjY3ZWVhIikpICsKICAKICAjIEzDrW5lYXMgY29uZWN0b3JhcyBhIGxhcyBjYWphcyBkZSB0ZXh0bwogIGdlb21fc2VnbWVudChkYXRhID0gY29wX2RhdGEgJT4lIGZpbHRlcihzaWRlID09ICJsZWZ0IiksCiAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgeGVuZCA9IHllYXIsIHkgPSAwLCB5ZW5kID0gMC4zKSwKICAgICAgICAgICAgICAgY29sb3IgPSAiIzY2N2VlYSIsIHNpemUgPSAwLjgsIGxpbmV0eXBlID0gInNvbGlkIikgKwogIGdlb21fc2VnbWVudChkYXRhID0gY29wX2RhdGEgJT4lIGZpbHRlcihzaWRlID09ICJyaWdodCIpLAogICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHhlbmQgPSB5ZWFyLCB5ID0gMCwgeWVuZCA9IC0wLjMpLAogICAgICAgICAgICAgICBjb2xvciA9ICIjNjY3ZWVhIiwgc2l6ZSA9IDAuOCwgbGluZXR5cGUgPSAic29saWQiKSArCiAgCiAgIyBDYWphcyBkZSBldmVudG9zIChsYWRvIGl6cXVpZXJkby9hcnJpYmEpCiAgZ2VvbV9sYWJlbChkYXRhID0gY29wX2RhdGEgJT4lIGZpbHRlcihzaWRlID09ICJsZWZ0IiksCiAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSAwLjM1LCAKICAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKioiLCB5ZWFyLCAiIC0gIiwgdGl0bGUsICIqKlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLwn5ONICIsIGxvY2F0aW9uLCAiXG5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiksCiAgICAgICAgICAgICAgICAgZmlsbCA9IGhpZ2hsaWdodCksCiAgICAgICAgICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLCBzaXplID0gMy41LAogICAgICAgICAgICAgbGluZWhlaWdodCA9IDAuOSwgbGFiZWwucGFkZGluZyA9IHVuaXQoMC41LCAibGluZXMiKSwKICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAKICAjIENhamFzIGRlIGV2ZW50b3MgKGxhZG8gZGVyZWNoby9hYmFqbykKICBnZW9tX2xhYmVsKGRhdGEgPSBjb3BfZGF0YSAlPiUgZmlsdGVyKHNpZGUgPT0gInJpZ2h0IiksCiAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSAtMC4zNSwgCiAgICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIioqIiwgeWVhciwgIiAtICIsIHRpdGxlLCAiKipcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi8J+TjSAiLCBsb2NhdGlvbiwgIlxuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pLAogICAgICAgICAgICAgICAgIGZpbGwgPSBoaWdobGlnaHQpLAogICAgICAgICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMSwgc2l6ZSA9IDMuNSwKICAgICAgICAgICAgIGxpbmVoZWlnaHQgPSAwLjksIGxhYmVsLnBhZGRpbmcgPSB1bml0KDAuNSwgImxpbmVzIiksCiAgICAgICAgICAgICBsYWJlbC5zaXplID0gMC41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAiIzY2N2VlYSIsICJGQUxTRSIgPSAiI2VjZjBmMSIpKSArCiAgCiAgIyBFdGlxdWV0YXMgZGUgYcOxb3MgZW4gbGEgbMOtbmVhCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHllYXIpLCB5ID0gLTAuMDUsIHZqdXN0ID0gMS41LCAKICAgICAgICAgICAgc2l6ZSA9IDMsIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMmMzZTUwIikgKwogIAogICMgQ29uZmlndXJhY2nDs24gZGUgZXNjYWxhcyB5IHRlbWEKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gY29wX2RhdGEkeWVhciwgbGltaXRzID0gYygxOTk1LCAyMDI3KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDAuOCkpICsKICAKICBsYWJzKAogICAgdGl0bGUgPSAi8J+MjSBVTiBDbGltYXRlIENoYW5nZSBDb25mZXJlbmNlIFVOQ0NDIiwKICAgIHN1YnRpdGxlID0gIkRlbCBQcm90b2NvbG8gZGUgS2lvdG8gKDE5OTcpIGEgbGEgQ09QMzAgKDIwMjUpIiwKICAgIGNhcHRpb24gPSAiRnVlbnRlOiBVTkZDQ0MgfCBFdmVudG9zIGRlc3RhY2Fkb3M6IEtpb3RvLCBQYXLDrXMgeSBDT1AzMCIKICApICsKICAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzJjM2U1MCIsIG1hcmdpbiA9IG1hcmdpbihiID0gNSkpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGhqdXN0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzdmOGM4ZCIsIG1hcmdpbiA9IG1hcmdpbihiID0gMjApKSwKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG9yID0gIiM5NWE1YTYiLCBoanVzdCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMjApKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjhmOWZhIiwgY29sb3IgPSBOQSksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y4ZjlmYSIsIGNvbG9yID0gTkEpLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMzAsIDMwLCAzMCwgMzApCiAgKQoKIyBNb3N0cmFyIGVsIGdyw6FmaWNvCnByaW50KHApCgojIEd1YXJkYXIgZWwgZ3LDoWZpY28gKG9wY2lvbmFsKQojIGdnc2F2ZSgidGltZWxpbmVfY29wX2NvbmZlcmVuY2lhcy5wbmciLCBwbG90ID0gcCwgCiMgICAgICAgIHdpZHRoID0gMTYsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDAsIGJnID0gIiNmOGY5ZmEiKQpgYGAKCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShrYWJsZUV4dHJhKSkKIyBrYWJsZShjb3BfZGF0YVsgLDE6NV0sIGZvcm1hdCA9ICJodG1sIikKY29wX2RhdGFbICwxOjVdICU+JQogIGtibCgpICU+JQogIGthYmxlX21hdGVyaWFsKGMoInN0cmlwZWQiLCAiaG92ZXIiKSkKCmBgYAoKIyMgTWV0cmljcyBvZiB0aGUgZ2xvYmFsaXphdGlvbgoKVGhvc2UgYXJlIHRoZSBzby1jYWxsZWQgImVuZCBvZiBnbG9iYWxpemF0aW9uIiBtZXRyaWNzLgoKIVtdKGltYWdlbi9yZXNob3JpbmcucG5nKQoKIyMjIE9mZnNob3JpbmcKCioqT2Zmc2hvcmluZyoqIGlzIHRoZSBwcmFjdGljZSBvZiByZWxvY2F0aW5nIGEgYnVzaW5lc3MgcHJvY2VzcywgbWFudWZhY3R1cmluZywgb3Igc2VydmljZSB0byBhIGRpc3RhbnQgZm9yZWlnbiBjb3VudHJ5LCB0eXBpY2FsbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbG93ZXIgbGFib3IgY29zdHMgb3Igb3RoZXIgZWNvbm9taWMgYmVuZWZpdHMgKGVudmlyb25tZW50YWwpLgoKLSAgICoqTG9jYXRpb246KiogQSBjb3VudHJ5IGZhciBmcm9tIHRoZSBjb21wYW55J3MgaG9tZSBjb3VudHJ5IChlLmcuLCBhIFUuUy4gY29tcGFueSBtb3ZpbmcgbWFudWZhY3R1cmluZyB0byBDaGluYSBvciBhIEV1cm9wZWFuIGNvbXBhbnkgbW92aW5nIElUIHN1cHBvcnQgdG8gSW5kaWEpLgoKLSAgICoqUHJpbWFyeSBNb3RpdmF0aW9uOioqIFNpZ25pZmljYW50IGNvc3Qgc2F2aW5ncywgYWNjZXNzIHRvIHNwZWNpYWxpemVkIHNraWxscywgYW5kIGdsb2JhbCBtYXJrZXQgZXhwYW5zaW9uLgoKLSAgICoqVHJhZGUtb2ZmczoqKiBQb3RlbnRpYWwgZm9yIGxvbmcgc3VwcGx5IGNoYWlucywgc2lnbmlmaWNhbnQgdGltZSB6b25lIGRpZmZlcmVuY2VzLCBjdWx0dXJhbC9sYW5ndWFnZSBiYXJyaWVycywgYW5kIHJlZHVjZWQgc3VwcGx5IGNoYWluIHZpc2liaWxpdHkvY29udHJvbC4KCjxocj4KCiMjIyBSZS1zaG9yaW5nIChhbHNvIGNhbGxlZCBPbnNob3JpbmcpCgoqKlJlLXNob3JpbmcqKiBpcyB0aGUgcHJvY2VzcyBvZiBicmluZ2luZyBidXNpbmVzcyBvcGVyYXRpb25zLCBwcm9kdWN0aW9uLCBvciBzZXJ2aWNlcyBiYWNrIHRvIHRoZSBjb21wYW55J3Mgb3JpZ2luYWwgaG9tZSBjb3VudHJ5IGFmdGVyIHRoZXkgd2VyZSBwcmV2aW91c2x5IG1vdmVkIG92ZXJzZWFzIChvZmZzaG9yZWQpLgoKLSAgICoqTG9jYXRpb246KiogVGhlIGNvbXBhbnkncyBob21lIGNvdW50cnkuCgotICAgKipQcmltYXJ5IE1vdGl2YXRpb246KiogSW5jcmVhc2luZyBzdXBwbHkgY2hhaW4gcmVzaWxpZW5jZSBhbmQgY29udHJvbCwgcmVkdWNpbmcgbGVhZCB0aW1lcywgaW1wcm92aW5nIHByb2R1Y3QgcXVhbGl0eSBvdmVyc2lnaHQsIGF2b2lkaW5nIGdlb3BvbGl0aWNhbCByaXNrcywgYW5kIGxldmVyYWdpbmcgdGhlICJNYWRlIGluIFtIb21lIENvdW50cnldIiBhcHBlYWwuCgotICAgKipUcmFkZS1vZmZzOioqIEdlbmVyYWxseSBpbnZvbHZlcyBoaWdoZXIgbGFib3IgYW5kIG9wZXJhdGlvbmFsIGNvc3RzIGNvbXBhcmVkIHRvIG9mZnNob3JlIGxvY2F0aW9ucy4KCjxocj4KCiMjIyBOZWFyLXNob3JpbmcKCioqTmVhci1zaG9yaW5nKiogaW52b2x2ZXMgcmVsb2NhdGluZyBidXNpbmVzcyBvcGVyYXRpb25zIG9yIHNlcnZpY2VzIHRvIGEgbmVhcmJ5IGZvcmVpZ24gY291bnRyeSwgdHlwaWNhbGx5IG9uZSB0aGF0IGlzIGdlb2dyYXBoaWNhbGx5IHByb3hpbWF0ZSwgb2Z0ZW4gc2hhcmluZyBhIGJvcmRlciBvciBiZWluZyB3aXRoaW4gYSBjbG9zZSB0aW1lIHpvbmUuCgotICAgKipMb2NhdGlvbjoqKiBBIG5laWdoYm9yaW5nIG9yIGdlb2dyYXBoaWNhbGx5IGNsb3NlIGNvdW50cnkgKGUuZy4sIGEgVS5TLiBjb21wYW55IG1vdmluZyBwcm9kdWN0aW9uIHRvIE1leGljbyBvciBhIEZyZW5jaCBjb21wYW55IG1vdmluZyBJVCB0byBSb21hbmlhKS4KCi0gICAqKlByaW1hcnkgTW90aXZhdGlvbjoqKiBTZWVraW5nIGEgYmFsYW5jZSBiZXR3ZWVuIGNvc3Qgc2F2aW5ncyAobG93ZXIgY29zdHMgdGhhbiB0aGUgaG9tZSBjb3VudHJ5KSBhbmQgdGhlIGJlbmVmaXRzIG9mIHByb3hpbWl0eSwgc3VjaCBhcyBzaG9ydGVyIHNoaXBwaW5nIHRpbWVzLCBmZXdlciB0aW1lIHpvbmUgaXNzdWVzLCBhbmQgZWFzaWVyIGNvbW11bmljYXRpb24gYW5kIHRyYXZlbCBmb3Igb3ZlcnNpZ2h0LgoKLSAgICoqVHJhZGUtb2ZmczoqKiBDb3N0cyBhcmUgdHlwaWNhbGx5IGxvd2VyIHRoYW4gcmUtc2hvcmluZyBidXQgcG90ZW50aWFsbHkgaGlnaGVyIHRoYW4gZmFyLW9mZiBvZmZzaG9yaW5nLiBUaGUgZ29hbCBpcyB0byBtaXRpZ2F0ZSB0aGUgY29tcGxleGl0eSBhbmQgcmlzayBhc3NvY2lhdGVkIHdpdGggbG9uZy1kaXN0YW5jZSBvZmZzaG9yaW5nIHdoaWxlIHN0aWxsIGFjaGlldmluZyBzb21lIGNvc3QgYWR2YW50YWdlcwoKIyMgT25lIG1hbiBpcyBPbmUgbWFuIGV2ZXJ5d2hlcmUKClRoaW5rIG9mIHRoZSBkZXZlbG9waW5nIGNvdW50cmllcyB2cyBkZXZlbG9wZWQgb25lcy4KCmBgYCAgICAgICAgIAoqIEEgVVMgY2l0aXplbiBlbWl0cyBzZXZlbiB0aW1lcyBtb3JlIHRoYW4gYSBFdXJvcGVhbiBjaXRpemVuLiBDaGluYSBwcm9wb3NlcyByZWR1Y2luZyBlbWlzc2lvbnMgYmFzZWQgb24gcXVvdGFzIHBlciBjb3VudHJ5LgoKCiogQSBDaGluZXNlIGNpdGl6ZW4gZW1pdHMgMTUgdGltZXMgbGVzcyB0aGFuIGEgRXVyb3BlYW4sIGJ1dCB1c2VzIGNvYWwuIEZ1cnRoZXJtb3JlLCB0aGV5IGhhdmUgYSBodWdlIHBvcHVsYXRpb24uIFRoZSBVUyBwcm9wb3NlcyByZWR1Y2luZyBDaGluYSdzIGVtaXNzaW9ucyBhbmQgcXVhbGl0eSB3aXRob3V0IGFsdGVyaW5nIGl0cyBvd24gZW1pdGlvbiByYXRlLiAoTUFHQSkKCgoqIEluZGlhIGhhcyBsb3dlcmVkIGl0cyBlbmVyZ3kgaW50ZW5zaXR5IChUT0UgdnMuIEdEUCksIHByb3Bvc2luZyB0aGF0IG9uZSBtYW4gZXF1YWxzIG9uZSBtYW4uIERldmVsb3BlZCBjb3VudHJpZXMgaGF2ZSBhbHJlYWR5ICJidXJuZWQiIHRoZWlyIHNoYXJlIG9mIGZ1ZWwuIFRoZW4gdGhlaXIgbmVlZCB0byByZWR1Y2UgaGlzIGVtaXNzaW9ucyBhbmQgYWxsb3cgZGV2ZWxvcGluZyBjb3VudHJpZXMgdG8gY2xvc2UgdGhlIGluZXF1YWxpdHkgZ2FwLgpgYGAKCiMgVGhlIHJvbGUgb2YgaGVnZW1vbmljIHBvd2VycwoKIVtdKGltYWdlcy9jbGlwYm9hcmQtMTM1Mjg5ODc1Ny5wbmcpCgohW10oaW1hZ2VzL2NsaXBib2FyZC0xNTA3OTA2MDg3LnBuZykKCiFbXShpbWFnZXMvY2xpcGJvYXJkLTE1MTI2NjE3Ny5wbmcpCgohW10oaW1hZ2VzL2NsaXBib2FyZC0zMDM0MTY0NTY2LnBuZykKCgoKYGBgICAgICAgICAgClRoZXJlIGFyZSBodW5kcmVkcyBvZiBleGFtcGxlcyB0aHJvdWdob3V0IGhpc3Rvcnkgb2Ygd2hhdCBoYXBwZW5zIHdoZW4gYSBoZWdlbW9uaWMgcG93ZXIgZGlzYXBwZWFycyAodGhlIFJvbWFuIEVtcGlyZSkuIFRoZXJlIGlzIGEgdHJhbnNpdGlvbiBwZXJpb2Qgd2l0aCB3YXJzIGFuZCBhIGRyYW1hdGljIHJlZHVjdGlvbiBpbiAiaW50ZXJuYXRpb25hbCIgdHJhZGUuCmBgYAoKYGBgICAgICAgICAgCkl0IGlzIGEgcGFpbmZ1bCBwcm9jZXNzIHRoYXQgcmVxdWlyZXMgYSBjaGFuZ2UgaW4gKipjdWx0dXJlKiogdW50aWwgdGhlIG5ldyBwb3dlciBtYW5hZ2VzIHRvIGVzdGFibGlzaCBpdHNlbGYuIFRoZSBoZWdlbW9uaWMgcG93ZXIgdGhhdCB0ZW5kcyB0byBkaXNhcHBlYXIgdXNlcyBhICoqY29weSBvZiB0aGUgc3RyYXRlZ2llcyoqIHRoYXQgYWxsb3dlZCB0aGUgZW1lcmdpbmcgcG93ZXIgdG8gZ3Jvdy4qKlRydXN0KiogaXMgYWxzbyBsb3N0IGJldHdlZW4gc3RyYXRlZ2ljIHBhcnRuZXJzLgpgYGAKCmBgYCAgICAgICAgIApUaGUgVVMgaXMgYnJlYWtpbmcgdGllcyB3aXRoIEV1cm9wZS4gSXQgd2FudHMgdG8gYmVjb21lIGdyZWF0IGFnYWluIGJ5IGltaXRhdGluZyB0aGUgZWNvbm9taWMgcHJvY2Vzc2VzIG9mIEluZHVzdHJ5IDIuMC4gSXQncyBjbG9zaW5nIGl0cyBkb29ycyB0byBicmFpbnMuIEl0IGRvZXNuJ3Qgc3VwcG9ydCBlbGVjdHJpYyBjYXJzIG9yIDVHLgpgYGAKCmBgYCAgICAgICAgIApJdCBjcmVhdGUgSW5kdXN0cnkgNS4wIGluIFNpbGljb24gVmFsbGV5IGFuZCBvcGVyYXRlIG9ubHkgd2l0aCB0YXJpZmZzIHRoYXQgaW1wYWN0IHRoZSBnbG9iYWwgc3VwcGx5IGNoYWlucy4KYGBgCgojIyBUaGUgZW5kIG9mIGdsb2JhbGl6YXRpb24KClRoZSAqKiJlbmQgb2YgZ2xvYmFsaXphdGlvbiIqKiBpcyBhIHdpZGVseSBkaXNjdXNzZWQgY29uY2VwdCBzdWdnZXN0aW5nIHRoYXQgdGhlIGRlZXAsIGZhc3QsIGFuZCBleHRlbnNpdmUgaW50ZWdyYXRpb24gb2YgdGhlIHdvcmxkJ3MgZWNvbm9taWVzLCBjdWx0dXJlcywgYW5kIHBvbGl0aWNz4oCUYSBwcm9jZXNzIGtub3duIGFzIGdsb2JhbGl6YXRpb27igJRpcyBzbG93aW5nIGRvd24sIHN0YWduYXRpbmcsIG9yIGV2ZW4gcmV2ZXJzaW5nLgoKMS0gUmlzZSBvZiBFY29ub21pYyBOYXRpb25hbGlzbSBhbmQgUHJvdGVjdGlvbmlzbQoKMi0gVHJhZGUgV2FycyBhbmQgVGFyaWZmcwoKMy0gUG9wdWxpc3QgQmFja2xhc2gKCjQtIEdyb3dpbmcgZXJvc2lvbiBvZiBpbnN0aXR1dGlvbmFsaXNtIChpbmNsdWRpbmcgV2VzdGVybiBkZW1vY3JhY2llcykKCjUtIFN1cHBseSBDaGFpbiBWdWxuZXJhYmlsaXR5Cgo2LSBTaG9ja3MgYW5kIERpc3J1cHRpb25zOiBNYWpvciBldmVudHMgbGlrZSB0aGUgMjAwOCBmaW5hbmNpYWwgY3Jpc2lzLCB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIGFuZCB0aGUgUnVzc2lhLVVrcmFpbmUgd2FyIGV4cG9zZWQgdGhlIGZyYWdpbGl0eSBvZiBoaWdobHkgb3B0aW1pemVkLCBqdXN0LWluLXRpbWUgZ2xvYmFsIHN1cHBseSBjaGFpbnMuCgo3LSBGb2N1cyBvbiBSZXNpbGllbmNlCgojIERldmVsb3BtZW50IFRyYXBzIGluIE91ciBMYXRpbiBBbWVyaWNhIGFuZCB0aGUgQ2FyaWJiZWFuCgpcKmxvdyBjYXBhY2l0eSBmb3IgZ3Jvd3RoLAoKXCpoaWdoIGluZXF1YWxpdHkgYW5kIGxvdyBzb2NpYWwgbW9iaWxpdHksCgpcKmxvdyBpbnN0aXR1dGlvbmFsIGNhcGFjaXR5IGFuZCBpbmVmZmVjdGl2ZSBnb3Zlcm5hbmNlLgoKIyBXaGF0IGFyZSB1bml2ZXJzaXRpZXMgaW4gdGhlIHdvcmxkIGRvaW5nIGZvcj8KCi0gICBUaGUgSW5kdXN0cnkgNC4wIGluIEV1cm9wZWFuIFVuaW9uICg0aHQgUmV2b2x1dGlvbikKCi0gICBUaGUgSW5kdXN0cnkgNS4wIChub3QgZSByZXZvbHV0aW9uKQoKLSAgIEphcGFuOiAiU29jaWV0eSA1LjAiIGludHJhcHJlbmV1cnNoaXAKCiMjIFN1bW1hcnk6IFdoYXQgTEFDIGlzIENvbnNpZGVyaW5nIGFuZCBEb2luZwoKMS4gICoqUHJvbW90aW5nIG5lYXJzaG9yaW5nIC8gYXR0cmFjdGluZyByZWxvY2F0ZWQgaW52ZXN0bWVudCoqIOKAlCBwb2xpY2llcyBhbmQgaW5jZW50aXZlcyB0byBjYXB0dXJlIGNvbXBhbmllcyBzZWVraW5nIHRvIHJlbG9jYXRlIHBhcnRzIG9mIHRoZWlyIHN1cHBseSBjaGFpbnMgY2xvc2VyIHRvIHRoZSBVLlMuIG9yIGZpbmFsIG1hcmtldHMgKHRheCBpbmNlbnRpdmVzLCBzcGVjaWFsIGVjb25vbWljIHpvbmVzLCBpbnZlc3RtZW50IHByb21vdGlvbiBjYW1wYWlnbnMpLiBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlIHRvIHRoZSByZWNvbmZpZ3VyYXRpb24gb2YgZ2xvYmFsIHZhbHVlIGNoYWlucy4KCjIuICAqKlJlbmV3ZWQgaW5kdXN0cmlhbCBwb2xpY2llcyAoYWN0aXZlIGluZHVzdHJpYWwgcG9saWN5KSoqIOKAlCBzZXZlcmFsIGNvdW50cmllcyBhcmUgbGF1bmNoaW5nIG9yIHVwZGF0aW5nIHN0cmF0ZWdpZXMgdG8gZm9zdGVyIGluZHVzdHJpYWxpemF0aW9uLCBwcm9kdWN0aXZlIGxpbmthZ2VzLCBhbmQgdGVjaG5vbG9naWNhbCB1cGdyYWRpbmcgKHN1cHBvcnQgZm9yIGNsdXN0ZXJzLCBwdWJsaWMgcHJvY3VyZW1lbnQsIHNlY3RvcmFsIHRhcmdldGluZykuIFVOSURPIGFuZCBFQ0xBQyBkb2N1bWVudCB0aGlzIHJlc3VyZ2VuY2Ugb2YgaW5kdXN0cmlhbCBhY3RpdmlzbSBpbiB0aGUgcmVnaW9uLgoKMy4gICoqU3RyZW5ndGhlbmluZyBsb2dpc3RpY3MgYW5kIHBvcnQgaW5mcmFzdHJ1Y3R1cmUgLyBpbXByb3ZpbmcgZXhwb3J0IGNvbXBldGl0aXZlbmVzcyoqIOKAlCBpbnZlc3RtZW50cyBpbiBwb3J0cywgdHJhbnNwb3J0IGNvcnJpZG9ycywgYW5kIGN1c3RvbXMgZmFjaWxpdGF0aW9uIHRvIGNhcHR1cmUgcmVnaW9uYWwgdHJhZGUgYW5kIG5lYXJzaG9yaW5nIGZsb3dzIChvZnRlbiBkaXNjdXNzZWQgYXMgYSBwcmVyZXF1aXNpdGUgdG8gYmVuZWZpdCBmcm9tIHByb2R1Y3Rpb24gcmVsb2NhdGlvbnMpLgoKNC4gICoqRGl2ZXJzaWZpY2F0aW9uIG9mIG1hcmtldHMgYW5kIHN1cHBsaWVycyAobm90IGp1c3Qg4oCcZ29pbmcgbG9jYWzigJ0pKiog4oCUIHJhdGhlciB0aGFuIHRvdGFsIGRpc2Nvbm5lY3Rpb24sIG1hbnkgc3RyYXRlZ2llcyBhaW0gdG8gZGl2ZXJzaWZ5IHRyYWRpbmcgcGFydG5lcnMgYW5kIHNvdXJjZXMsIGNyZWF0aW5nIOKAnG11bHRpLXZlY3RvcuKAnSBjb25uZWN0aW9ucyDigJQgZXNwZWNpYWxseSB3aXRoIE5vcnRoIEFtZXJpY2EgYW5kIEFzaWEsIGRlcGVuZGluZyBvbiBvcHBvcnR1bml0aWVzLiBVTkNUQUQgYW5kIEJJUyBzaG93IHRoYXQgY2hhaW5zIGFyZSBkaXZlcnNpZnlpbmcgcmF0aGVyIHRoYW4gc2ltcGx5IOKAnGRlZ2xvYmFsaXppbmcu4oCdCgo1LiAgKipGb2N1cyBvbiBwcm9kdWN0aXZlIGNhcGFiaWxpdGllcyBhbmQgaHVtYW4gY2FwaXRhbCoqIOKAlCBwcm9ncmFtcyBmb3Igd29ya2ZvcmNlIHRyYWluaW5nLCBTTUUgZGlnaXRhbGl6YXRpb24sIGFuZCBzZWxlY3RpdmUgYWRvcHRpb24gb2YgSW5kdXN0cnkgNC4wLzUuMCB0ZWNobm9sb2dpZXMgdG8gcmFpc2UgcHJvZHVjdGl2aXR5IGFuZCBhdHRyYWN0IGhpZ2hlci12YWx1ZSBpbnZlc3RtZW50LiBEb2N1bWVudGVkIGluIE9FQ0QsIElEQiwgYW5kIEVDTEFDIHJlcG9ydHMuCgo2LiAgKipSZWdpb25hbCBpbnRlZ3JhdGlvbiBhbmQgcG9saWN5IGNvb3JkaW5hdGlvbioqIOKAlCBpbml0aWF0aXZlcyAoVU5DVEFELCBDQUYsIEJJRCwgZXRjLikgcHJvbW90aW5nIGNvb3JkaW5hdGVkIGluZHVzdHJpYWwgYW5kIHRyYWRlIHBvbGljaWVzIHRvIGNyZWF0ZSBzdHJvbmdlciByZWdpb25hbCB2YWx1ZSBjaGFpbnMuCgo3LiAqKkZvY3VzIG9uIGhpcyBvdW4gT3BlcmF0aW9uYWwgRXhjZWxsZW5jZSoqIAoKOC4gKipOb3QgdG8gZGVsdmUgZGVlcGVyIGludG8gZW50cmVwcmVuZXVyc2hpcCoqIHRoaW5rIG9uIElOVFJBcHJlbmV1cnNoaXAgKFNlZSB0aGUgaW52ZW50b3Igb2YgdGhlIGJsdWUgTEVEIGluIEphcGFuIG9yIHRoZSBpbnZlbnRvciBvZiB0aGUgUVIgY29kZSkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgRXhhbXBsZXMgYnkgQ291bnRyaWVzIC8gU3VicmVnaW9ucyAoRXZpZGVuY2UpCgotICAgKipNZXhpY286KiogZXhwbGljaXQgbmVhcnNob3Jpbmcgc3RyYXRlZ3ksIHdpdGggbXVsdGlsYXRlcmFsIHN1cHBvcnQgKGUuZy4sIElEQikgdG8gYXR0cmFjdCBtYW51ZmFjdHVyaW5nIGludmVzdG1lbnQgdG8gc291dGhlcm4gYW5kIHNvdXRoZWFzdGVybiByZWdpb25zOyBpbmZyYXN0cnVjdHVyZSBhbmQgdHJhaW5pbmcgcHJvZ3JhbXMuCgotICAgKipDZW50cmFsIEFtZXJpY2EgLyBEb21pbmljYW4gUmVwdWJsaWMgLyBQYW5hbWEgLyBDb3N0YSBSaWNhOioqIGdhaW5pbmcgc2hhcmUgaW4gY2VydGFpbiBzdXBwbHkgY2hhaW5zIChsb2dpc3RpY3MsIHNlcnZpY2VzLCBtZWRpY2FsIHRlY2hub2xvZ2llcyksIGltcHJvdmluZyBmcmVlIHRyYWRlIHpvbmVzIGFuZCBwb3J0IGNhcGFjaXR5LiBCSVMgYW5kIHJlZ2lvbmFsIHN0dWRpZXMgaGlnaGxpZ2h0IHRoZXNlIHRyZW5kcy4KCi0gICAqKkJyYXppbCwgQ29sb21iaWEsIENoaWxlLCBQZXJ1OioqIHJlYWN0aXZhdGlvbiBvZiBpbmR1c3RyaWFsIHBvbGljeSAobmF0aW9uYWwgcmVpbmR1c3RyaWFsaXphdGlvbiBvciBzZWN0b3JhbCBzdHJhdGVnaWVzKSB0byBhZGQgbG9jYWwgdmFsdWUgKGhlYWx0aCwgcGhhcm1hY2V1dGljYWxzLCBhdXRvIGNvbXBvbmVudHMsIHJlbmV3YWJsZSBlbmVyZ3kpLiBVTklETyBhbmQgRUNMQUMgYW5hbHl6ZSB0aGVzZSBpbml0aWF0aXZlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgSG93IFRoaXMgRml0cyB3aXRoaW4gdGhlIOKAnEVuZCBvZiBHbG9iYWxpemF0aW9u4oCdIE5hcnJhdGl2ZQoKVGhlIGV2aWRlbmNlIHBvaW50cyAqKm5vdCB0byBhIGNvbGxhcHNlKiogb2YgaW50ZXJuYXRpb25hbCB0cmFkZSBidXQgcmF0aGVyIHRvIGEgKipyZWNvbmZpZ3VyYXRpb24qKjogZ3JlYXRlciBlbXBoYXNpcyBvbiByZXNpbGllbmNlLCBkaXZlcnNpZmljYXRpb24sIGFuZCAqKnN0cmF0ZWdpYyByZWdpb25hbGl6YXRpb24qKiAoKm5lYXJzaG9yaW5nL2ZyaWVuZHNob3JpbmcqKSwgY29tYmluZWQgd2l0aCB0aGUgdXNlIG9mIHB1YmxpYyBwb2xpY3kgdG8gc2VpemUgb3Bwb3J0dW5pdGllcy4gVU5DVEFEIGFuZCBCSVMgc2hvdyB0aGF0IHN1cHBseSBjaGFpbnMgYXJlIGRpdmVyc2lmeWluZyBhbmQgdGhhdCBuZWFyc2hvcmluZyBpcyByZWFsLCB0aG91Z2ggc2VsZWN0aXZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBLZXkgU291cmNlcyAoZm9yIENpdGF0aW9uKQoKLSAgICoqSW50ZXItQW1lcmljYW4gRGV2ZWxvcG1lbnQgQmFuayAoSURCKToqKiBzdHVkaWVzIGFuZCBicmllZnMgb24gbmVhcnNob3JpbmcgcG90ZW50aWFsIGFuZCBiZW5lZml0aW5nIHNlY3RvcnMgKGF1dG9tb3RpdmUsIHRleHRpbGVzLCBwaGFybWFjZXV0aWNhbHMsIHJlbmV3YWJsZXMpLgotICAgKipVTklETzoqKiBwb2xpY3kgYnJpZWZzIG9uIHRoZSDigJxuZXcgZXJh4oCdIG9mIGluZHVzdHJpYWwgcG9saWN5IGluIExBQyAoMjAyMeKAkzIwMjQgcGxhbnMsIHByaW9yaXRpZXMsIGFuZCBuZWFyc2hvcmluZyBvcHBvcnR1bml0aWVzKS4KLSAgICoqVU5DVEFEOioqIHJlcG9ydHMgb24gZ2xvYmFsIHRyYWRlIHN0YXR1cyBhbmQgc3VwcGx5IGNoYWluIHJlY29uZmlndXJhdGlvbiAoMjAyNOKAkzIwMjUpLgotICAgKipCSVMgKEJhbmsgZm9yIEludGVybmF0aW9uYWwgU2V0dGxlbWVudHMpOioqIG1hY3JvZWNvbm9taWMgZXZpZGVuY2Ugb2YgVS5TLiBpbXBvcnQgc2hpZnRzIGZyb20gQ2hpbmEgdG93YXJkIE1leGljbyBhbmQgb3RoZXIgY291bnRyaWVzLgotICAgKipDQUYgKERldmVsb3BtZW50IEJhbmsgb2YgTGF0aW4gQW1lcmljYSk6KiogcmVnaW9uYWwgZG9jdW1lbnRzIGFuZCBwYXBlcnMgb24gTEFD4oCZcyBwcmVwYXJlZG5lc3MgZm9yIHRoZSBuZXcgZ2xvYmFsIHZhbHVlIGNoYWluIGdlb21ldHJ5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBSZWNvbW1lbmRhdGlvbnMgcmVhZGluZ3MgZm9yIFlvdXIgQXJ0aWNsZSAoQW5nbGVzIGFuZCBTdHJ1Y3R1cmUpCgoxLiAgKipDb250cmFzdCB3aXRoIHRoZSBVLlMuIC8gRVUgLyBKYXBhbiByZXNwb25zZXMqKiDigJQgeW91IGFscmVhZHkgaGF2ZSB0aG9zZToKCiAgICAtICAgVS5TLjogKkluZHVzdHJ5IDUuMCogLyByZWluZHVzdHJpYWxpemF0aW9uCgogICAgLSAgIEVVOiAqUmVzaWxpZW50IEluZHVzdHJ5IDQuMCoKCiAgICAtICAgSmFwYW46ICpTb2NpZXR5IDUuMCoKCiAgICAgICAgRm9yIExBQywgc2hvdyB0aGF0IHRoZSByZXNwb25zZSBpcyAqKm1vcmUgcHJhZ21hdGljIGFuZCBzZWxlY3RpdmUqKjogKm5lYXJzaG9yaW5nICsgaW5kdXN0cmlhbCBwb2xpY3kgKyBsb2dpc3RpY3MgaW1wcm92ZW1lbnQqICh3aXRoIGZpc2NhbCBhbmQgaW5zdGl0dXRpb25hbCBjb25zdHJhaW50cykuCg==