Data handling
# Start Inf data
# ---------------
# read data
dtf <- read_dta("Data/Turkey/startinf_Turkey.dta", encoding = "latin1")
# labels of each variable
dtf_labels <- unlist(lapply(dtf, attr, which = "label"))
# remove labels
dtf <- as.data.frame(lapply(dtf, c))
# Notice that for a given frequency,
# the data begins at the start of the period
# it reports to (for example, monthly data's date is on the 1st of
# each month)
# fix date
datelookup <- seq.Date(from = as.Date("2013-01-01"),
to = as.Date("2021-06-01"),
by = "month")
dtf$date <- datelookup[dtf$date - abs(min(dtf$date)) + 1]
# order by date
dtf <- arrange(dtf, date)
# correct magnitude of certain variables
dtf <- dtf %>%
mutate_at(vars(-date ,-contains("_skew")),
~ ./100 ) #it's ok no skewness here
for (k in c(1,2,5,10)) {
var <- paste0("Ecpi",k,"_max_minus_min")
var_max <- paste0("Ecpi",k,"_max")
var_min <- paste0("Ecpi",k,"_min")
dtf[,var] <- dtf[,var_max]-dtf[,var_min]
}
# compute distribution skewness
# -----------------------------
sk <- function(x) {
# x matrix with probability buckets
y <- rep(c(1.5, seq(3.25, by= 0.5,length.out = ncol(x)-1)), nrow(x)) # midpoints
y <- matrix(y/100, nrow = nrow(x))
Ex <- rowSums(x*y)
Ex2 <- rowSums(x*(y^2))
Ex3 <- rowSums(x*(y^3))
stdev <- sqrt(Ex2 - Ex^2)
# https://en.wikipedia.org/wiki/Skewness
skewness <- (Ex3 - 3*Ex*stdev^2 - Ex^3)/(stdev^3)
return(skewness)
}
# 1 year
x <- as.matrix(dtf %>% select(starts_with("Ecpi1_p_"))) # probabilities
dtf$Ecpi1_skewness <- sk(x)
# 2 years
x <- as.matrix(dtf %>% select(starts_with("Ecpi2_p_"))) # probabilities
dtf$Ecpi2_skewness <- sk(x)
# adjustment of lead data
# -----------------------
# be careful. If you use more than one year horizons, you have
# to adjust the lagging
if (bAdjustPeriodTiming) {
dtf <- dtf %>%
mutate_at(vars(starts_with("Ecpi"),
starts_with("breakeven"),
bt_Eppi),
~ lag(.,12)
) # monthly data
}
# turkey's data is end of period, so no need for "-1"
# arrange data for plotting
dtf_long <- pivot_longer(dtf, !date,
names_to = "variable",
values_to = "value",
values_transform = as.numeric)
Timespan is 2013/01 - 2021/07
Figure(s) 12: Turkey’s drifting expected inflation anchor: 2018 - …
Subfigure 14(a): Actual inflation, markets and survey first-order moments
# Actual and expected inflation
vars1 <- c("pi",
"Ecpi1_median",
"breakeven",
"bt_Eppi")
breakss <- c(vars1, "Target")
legs <- c("Actual inflation",
"Cross-sectional median of professionals’ survey",
"Market-price implied expectation",
"Weighted mean of firms’ survey",
"Target")
legv <- c('red', 'blue', 'green4', 'orange3', 'black')
linev <- c('solid', 'dotted', 'dashed', "dotdash", 'longdash')
# inflation target
target <- 0.05
# thickness of line
vline_w <- 0.6 # mm
# ticks
labs <- c(0, target, seq(target, 0.3, length.out = 6)[2:6])
# plot
plot <- create_plot(dtf_long, date_lb = as.Date("2015-01-01"),
vars = vars1, scales = 0) +
theme(legend.position = c(0.27,0.8)) +
geom_hline(aes(yintercept = target,
colour = "Target", linetype = "Target"),
size = tfont(vline_w)) +
scale_linetype_manual(breaks = breakss,
values = linev, labels = legs) +
scale_colour_manual(breaks = breakss,
values = legv, labels = legs) +
scale_y_continuous(limits = c(0, 0.3),
breaks = labs,
labels = scales::percent(labs, accuracy = 1))
Scale for ‘y’ is already present. Adding another scale for ‘y’, which will replace the existing scale.
print(plot)

if (bSavePlots) my_ggsave(paste0(path_figure_out, "figure_12_a.pdf"), plot)
LS0tDQp0aXRsZTogIkJyb29raW5ncyBQYXBlciAtIFR1cmtleSAtIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc3RhcnRfUiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBJbml0aWF0aW9uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpybShsaXN0ID0gbHMoKSkNCg0KIyBjbGVhbiBjb25zb2xlDQpjYXQoIlwwMTQiKQ0KDQojIyMjIFBMRUFTRSBDSE9PU0UgIyMjIyMNCg0KIyBwcmludCBhbmQgc2F2ZSBwbG90cz8NCmJTYXZlUGxvdHMgPC0gMSAgICMgMDogbm8NCiAgICAgICAgICAgICAgICAgICMgMTogeWVzDQoNCiMgRXhwZWN0YXRpb25zIGF0IFQgPSBULWggb3IgVCtoPw0KIyB3aWxsIHNoaWZ0IGJ5IDEyIHBlcmlvZHMgKG1vbnRobHkpLCBiZSBjYXJlZnVsIGZvciBlLmcuIHF1YXJ0ZXJseSBkYXRhDQpiQWRqdXN0UGVyaW9kVGltaW5nIDwtIDAgICAjIDA6IFQraA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxOiBULWgNCg0KIyMjIyAgQ0hPSUNFIEVORCAgICMjIyMjDQoNCiMgQkVXQVJFIE9OTFkgVkFSSUFCTEVTIFVTRUQgQVJFIEFESlVTVEVEDQojIElGIFlPVSBXQU5UIFRPIFVTRSBPVEhFUiBWQVJJQUJMRVMNCiMgUExFQVNFIEFERCBUSEVNIEJFTE9XIFdIRU4gVEhFIEFESlVTVE1FTlQNCiMgSVMgTUFERQ0KDQojIHBhY2thZ2VzDQojIGxpc3Qgb2YgbGlicmFyaWVzDQpwYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiICAgIyBkYXRhIGFuYWx5c2lzDQogICAgICAgICAgICAgICwia25pdHIiICAgICAgIyBtYXJrZG93bg0KICAgICAgICAgICAgICAsImhhdmVuIiAgICAgICMgcmVhZCAuZHRhIGZpbGVzDQogICAgICAgICAgICAgICwicmVhZHhsIiAgICAgIyByZWFkIGV4Y2VsIGZpbGVzDQogICAgICAgICAgICAgICwibHVicmlkYXRlIiAgIyBkYXRlcw0KICAgICAgICAgICAgICAsInRpbnl0ZXgiICAgICMgZm9yIG1hcmtkb3duDQogICAgICAgICAgICAgICwia3MiICAgICAgICAgIyBrZXJuZWwgZXN0aW1hdGlvbg0KKQ0KDQojIGluc3RhbGwgdGhlbSBpZiBuZWVkZWQNCm5ld19wYWNrYWdlcyA8LQ0KICBwYWNrYWdlc1shKHBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCAiUGFja2FnZSJdKV0gDQoNCiBpZiAobGVuZ3RoKG5ld19wYWNrYWdlcykgPiAwKXsgI2luc3RhbGxzIHRoZW0NCiAgIGluc3RhbGwucGFja2FnZXMobmV3X3BhY2thZ2VzLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KfQ0KDQojIGxvYWQgbGlicmFyaWVzDQpsYXBwbHkocGFja2FnZXMsIHJlcXVpcmUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCg0KYGBgDQoNCg0KYGBge3IgcGxvdF9kZWYsIGluY2x1ZGUgPSBGQUxTRX0NCg0KIyBnZ3Bsb3QyIG9wdGlvbnMNCg0KIyBzaXplIG9mIGZpZ3VyZXMgZm9yIHNhdmluZyBhbmQgZGlzcGxheWluZyAoZGlzcCB3aWxsIGJlIGFkanVzdGVkKQ0KIyBmaWd1cmUgc2l6ZSBpbiBjbSAoZm9yIGluY2hlcyBkaXZpZGUgYnkgMC4zOTM3MDA3ODcpDQpmaWdfaCA8LSAyLjUgKiA4LjQzNzUqIDAuMzkzNzAwNzg3ICMgd2lkdGgNCmZpZ193IDwtIDIuNSAqIDE1ICogMC4zOTM3MDA3ODcgICAgIyBoZWlnaHQNCmZpZ19kaXNwX2FkaiA8LSAxICAgICAgICAgICAgICAgICAgIyBhZGp1c3RtZW50IGZvciBmaWd1cmUgZGlzcGxheQ0KDQoNCiMgQ29udmVydCBmcm9tIG1tIHRvIGludGVybmFsIHVuaXRzIHVzZWQgaW4gZ3JpZCBnZ3Bsb3QNCnRmb250IDwtIGZ1bmN0aW9uKHgpIHJldHVybigucHQqeCkgICAgICAgICMgdGhpcyB3YXkgbm8gcmVzIHByb2JsZW1zDQp0bHdkICA8LSBmdW5jdGlvbih4KSByZXR1cm4oLnN0cm9rZSp4KSANCg0KIyBnZ3Bsb3QyIG9wdGlvbnMNCiMgcGxvdCBkZWZpbml0aW9ucyANCg0KbGVnZW5kX3RleHRfc2l6ZSA8LSA3LjUNCmF4aXNfdGV4dF9zaXplICAgPC0gNw0KDQpsZWdlbmRfa2V5X3dpZHRoIDwtIDIwICMgbW0NCg0KIyBzaXplIG9mIGxpbmUgZm9yIHBsb3RzDQpsaW5lX3NpemVlIDwtIHRsd2QoMSkNCg0KdGhlbWVfc2V0KA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIHNpemUgPSB0Zm9udCg2KSksDQogICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiksDQogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IE5BLCBzaXplID0gMC41KSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4yNSwwLjgpLA0KICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IE5BKSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KGxlZ2VuZF9rZXlfd2lkdGgsICJtbSIpLA0KICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHRmb250KGxlZ2VuZF90ZXh0X3NpemUpKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dCAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHRmb250KGF4aXNfdGV4dF9zaXplKSksDQogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICkNCikNCg0KDQojIGZ1bmN0aW9ucyB0byBjcmVhdGUgY29sb3VyL2xpbmUgc2NoZW1lDQoNCmNyZWF0ZV9sZWd2IDwtIGZ1bmN0aW9uKHgpIHsNCg0KICAjY29sb3VycyB0byBiZSB1c2VkIGluIHBsb3RzDQogIHkgPC0gYygncmVkJywnYmx1ZScsJ2dyZWVuNCcsJ29yYW5nZTMnLCJwdXJwbGUyIikNCiAgbiA8LSBsZW5ndGgoeCkNCiAgeSA8LSB5WzE6bl0NCiAgbmFtZXMoeSkgPC0geCANCiAgcmV0dXJuKHkpDQoNCn0NCg0KY3JlYXRlX2xpbmV2IDwtIGZ1bmN0aW9uKHgpIHsNCg0KICAjIGxpbmV0eXBlcyB0byBiZSB1c2VkIGluIHBsb3RzDQogIHkgPC0gYygnc29saWQnLCdkb3R0ZWQnLCdkYXNoZWQnLCJkb3RkYXNoIiwnbG9uZ2Rhc2gnKQ0KICBuIDwtIGxlbmd0aCh4KQ0KICB5IDwtIHlbMTpuXQ0KICBuYW1lcyh5KSA8LSB4DQogIHJldHVybih5KQ0KDQp9DQoNCmNyZWF0ZV9wbG90IDwtIGZ1bmN0aW9uKGRmLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFycywNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ3MgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9sYiA9IGFzLkRhdGUoIjIwMTMtMDEtMDEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfdWIgPSBhcy5EYXRlKCIyMDIxLTEyLTMxIiksDQogICAgICAgICAgICAgICAgICAgICAgICBwZXJjID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemVlKSB7DQogIA0KICAjIGRhdGUgYm91bmRzDQogIGRhdGVfbGIgPC0gYXMuRGF0ZShkYXRlX2xiKQ0KICBkYXRlX3ViIDwtIGFzLkRhdGUoZGF0ZV91YikNCiAgDQogICMgY29sb3Vycy9saW5ldHlwZXMNCiAgbGVndiA8LSBjcmVhdGVfbGVndih2YXJzKQ0KICBsaW5ldiA8LSBjcmVhdGVfbGluZXYodmFycykNCiAgDQogIGRmIDwtIGRmICU+JQ0KICAgICAgICBmaWx0ZXIoZGF0ZSA+PSBkYXRlX2xiICYgZGF0ZSA8PSBkYXRlX3ViICYNCiAgICAgICAgICAgICAgIHZhcmlhYmxlICVpbiUgdmFycyAmICFpcy5uYSh2YWx1ZSkpICU+JQ0KICAgICAgICBtdXRhdGUodmFyaWFibGUgPSBmYWN0b3IodmFyaWFibGUsIGxldmVscyA9IHZhcnMpKQ0KICANCiAgcGxvdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF0ZSwgeSA9IHZhbHVlKSkgKw0KICAgIGdlb21fbGluZShhZXMoY29sb3VyID0gdmFyaWFibGUsIGxpbmV0eXBlID0gdmFyaWFibGUpLA0KICAgICAgICAgICAgICBzaXplID0gbGluZV9zaXplKSArDQogICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgeWVhciIsIGRhdGVfbGFiZWxzID0gIiVZIikNCiAgDQogIGlmIChzY2FsZXMpIHBsb3QgPC0gcGxvdCArIA0KICAgICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwoYnJlYWtzID0gdmFycywgdmFsdWVzPSBsaW5ldiwgbGFiZWxzID0gbGVncykgKw0KICAgICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKGJyZWFrcyA9IHZhcnMsIHZhbHVlcyA9IGxlZ3YsIGxhYmVscyA9IGxlZ3MpIA0KICANCiAgaWYgKHBlcmMpIHBsb3QgPC0gcGxvdCArIA0KICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKQ0KICANCiAgcmV0dXJuKHBsb3QpDQogIA0KfQ0KDQpteV9nZ3NhdmUgPC0gZnVuY3Rpb24oLmZpbGVuYW1lLCAucGxvdCwNCiAgICAgICAgICAgICAgICAgICAgICAuZGV2aWNlID0gInBkZiIsIC53aWR0aCA9IGZpZ193LA0KICAgICAgICAgICAgICAgICAgICAgIC5oZWlnaHQgPSBmaWdfaCwgLnVuaXRzID0gImluIiwgLmRwaSA9IDMwMCwgLi4uKSB7DQogIA0KICBnZ3NhdmUoZmlsZW5hbWUgPSAuZmlsZW5hbWUsIHBsb3QgPSAucGxvdCwNCiAgICAgICAgIGRldmljZSA9IC5kZXZpY2UsDQogICAgICAgICB3aWR0aCA9IC53aWR0aCwgaGVpZ2h0ID0gLmhlaWdodCwNCiAgICAgICAgIHVuaXRzID0gLnVuaXRzLCBkcGkgPSAuZHBpLCAuLi4pDQogIA0KfQ0KDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCg0KIyBkaXJlY3RvcnkNCmRpcmVjdG9yeSA8LSBnZXR3ZCgpDQpkaXJlY3RvcnkgPC0gZ3N1YigiL0NvZGUiLCAiIiwgZGlyZWN0b3J5KQ0Kb3B0c19rbml0JHNldChyb290LmRpciA9IGRpcmVjdG9yeSkNCg0KcGF0aF9maWd1cmVfb3V0IDwtICIuL0ZpZ3VyZXMvIg0KDQojIGRlZmF1bHQgY2h1bmsgb3B0aW9ucw0Kb3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAnYXNpcycsIGVjaG8gPSBUUlVFLA0KICAgICAgICAgICAgICAgZmlnLndpZHRoID0gZmlnX2Rpc3BfYWRqICogZmlnX3csIGZpZy5oZWlnaHQgPSBmaWdfZGlzcF9hZGogKiBmaWdfaCwNCiAgICAgICAgICAgICAgIGZpZy5yZXRpbmEgPSAxKSAjIGZpZ3VyZSBvcHRpb25zDQoNCmBgYA0KDQojIyBEYXRhIGhhbmRsaW5nDQoNCmBgYHtyIGxvYWRfZGF0YX0NCg0KIyBTdGFydCBJbmYgZGF0YQ0KIyAtLS0tLS0tLS0tLS0tLS0NCg0KIyByZWFkIGRhdGENCmR0ZiA8LSByZWFkX2R0YSgiRGF0YS9UdXJrZXkvc3RhcnRpbmZfVHVya2V5LmR0YSIsIGVuY29kaW5nID0gImxhdGluMSIpDQoNCiMgbGFiZWxzIG9mIGVhY2ggdmFyaWFibGUNCmR0Zl9sYWJlbHMgPC0gdW5saXN0KGxhcHBseShkdGYsIGF0dHIsIHdoaWNoID0gImxhYmVsIikpDQoNCiMgcmVtb3ZlIGxhYmVscw0KZHRmIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGR0ZiwgYykpDQoNCiMgTm90aWNlIHRoYXQgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5LA0KIyB0aGUgZGF0YSBiZWdpbnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwZXJpb2QNCiMgaXQgcmVwb3J0cyB0byAoZm9yIGV4YW1wbGUsIG1vbnRobHkgZGF0YSdzIGRhdGUgaXMgb24gdGhlIDFzdCBvZg0KIyBlYWNoIG1vbnRoKQ0KDQojIGZpeCBkYXRlDQpkYXRlbG9va3VwIDwtIHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDEzLTAxLTAxIiksDQogICAgICAgICAgICAgICAgICAgICAgIHRvID0gYXMuRGF0ZSgiMjAyMS0wNi0wMSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJtb250aCIpDQpkdGYkZGF0ZSA8LSBkYXRlbG9va3VwW2R0ZiRkYXRlIC0gYWJzKG1pbihkdGYkZGF0ZSkpICsgMV0NCg0KIyBvcmRlciBieSBkYXRlDQpkdGYgPC0gYXJyYW5nZShkdGYsIGRhdGUpDQoNCiMgY29ycmVjdCBtYWduaXR1ZGUgb2YgY2VydGFpbiB2YXJpYWJsZXMNCmR0ZiA8LSBkdGYgJT4lIA0KICAgICAgICBtdXRhdGVfYXQodmFycygtZGF0ZSAsLWNvbnRhaW5zKCJfc2tldyIpKSwNCiAgICAgICAgICAgICAgICAgIH4gLi8xMDAgKSAjaXQncyBvayBubyBza2V3bmVzcyBoZXJlDQoNCmZvciAoayBpbiBjKDEsMiw1LDEwKSkgew0KICANCiAgdmFyIDwtICAgICBwYXN0ZTAoIkVjcGkiLGssIl9tYXhfbWludXNfbWluIikNCiAgdmFyX21heCA8LSBwYXN0ZTAoIkVjcGkiLGssIl9tYXgiKQ0KICB2YXJfbWluIDwtIHBhc3RlMCgiRWNwaSIsaywiX21pbiIpDQogIGR0ZlssdmFyXSA8LSBkdGZbLHZhcl9tYXhdLWR0ZlssdmFyX21pbl0NCiAgDQp9DQoNCg0KIyBjb21wdXRlIGRpc3RyaWJ1dGlvbiBza2V3bmVzcw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpzayA8LSBmdW5jdGlvbih4KSB7DQogICANCiAgIyB4IG1hdHJpeCB3aXRoIHByb2JhYmlsaXR5IGJ1Y2tldHMNCiAgeSA8LSByZXAoYygxLjUsIHNlcSgzLjI1LCBieT0gMC41LGxlbmd0aC5vdXQgPSBuY29sKHgpLTEpKSwgbnJvdyh4KSkgIyBtaWRwb2ludHMNCiAgeSA8LSBtYXRyaXgoeS8xMDAsIG5yb3cgPSBucm93KHgpKQ0KDQogIEV4ICA8LSByb3dTdW1zKHgqeSkNCiAgRXgyIDwtIHJvd1N1bXMoeCooeV4yKSkNCiAgRXgzIDwtIHJvd1N1bXMoeCooeV4zKSkNCiAgc3RkZXYgIDwtIHNxcnQoRXgyIC0gRXheMikNCg0KICAjIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NrZXduZXNzDQogIHNrZXduZXNzIDwtIChFeDMgLSAzKkV4KnN0ZGV2XjIgLSBFeF4zKS8oc3RkZXZeMykNCg0KICByZXR1cm4oc2tld25lc3MpDQp9DQoNCiMgMSB5ZWFyDQp4IDwtIGFzLm1hdHJpeChkdGYgJT4lIHNlbGVjdChzdGFydHNfd2l0aCgiRWNwaTFfcF8iKSkpICAgICAgICAgICAjIHByb2JhYmlsaXRpZXMNCmR0ZiRFY3BpMV9za2V3bmVzcyA8LSBzayh4KQ0KDQojIDIgeWVhcnMgDQp4IDwtIGFzLm1hdHJpeChkdGYgJT4lIHNlbGVjdChzdGFydHNfd2l0aCgiRWNwaTJfcF8iKSkpICAgICAgICAgICAjIHByb2JhYmlsaXRpZXMNCmR0ZiRFY3BpMl9za2V3bmVzcyA8LSBzayh4KQ0KDQojIGFkanVzdG1lbnQgb2YgbGVhZCBkYXRhDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIGJlIGNhcmVmdWwuIElmIHlvdSB1c2UgbW9yZSB0aGFuIG9uZSB5ZWFyIGhvcml6b25zLCB5b3UgaGF2ZQ0KIyB0byBhZGp1c3QgdGhlIGxhZ2dpbmcNCg0KaWYgKGJBZGp1c3RQZXJpb2RUaW1pbmcpIHsNCiAgZHRmIDwtIGR0ZiAlPiUNCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRWNwaSIpLA0KICAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJicmVha2V2ZW4iKSwNCiAgICAgICAgICAgICAgICAgICBidF9FcHBpKSwNCiAgICAgICAgICAgICAgfiBsYWcoLiwxMikNCiAgICAgICAgICAgICApICMgbW9udGhseSBkYXRhDQp9DQoNCiMgdHVya2V5J3MgZGF0YSBpcyBlbmQgb2YgcGVyaW9kLCBzbyBubyBuZWVkIGZvciAiLTEiDQoNCiMgYXJyYW5nZSBkYXRhIGZvciBwbG90dGluZw0KZHRmX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKGR0ZiwgIWRhdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RyYW5zZm9ybSA9IGFzLm51bWVyaWMpDQoNCmBgYA0KDQojIFRpbWVzcGFuIGlzIDIwMTMvMDEgLSAyMDIxLzA3DQoNCiMjIEZpZ3VyZShzKSAxMjogVHVya2V54oCZcyBkcmlmdGluZyBleHBlY3RlZCBpbmZsYXRpb24gYW5jaG9yOiAyMDE4IC0gLi4uDQojIyBTdWJmaWd1cmUgMTQoYSk6IEFjdHVhbCBpbmZsYXRpb24sIG1hcmtldHMgYW5kIHN1cnZleSBmaXJzdC1vcmRlciBtb21lbnRzDQoNCmBgYHtyIGZpZ18xMl9hfQ0KDQojIEFjdHVhbCBhbmQgZXhwZWN0ZWQgaW5mbGF0aW9uIA0KDQp2YXJzMSA8LSBjKCJwaSIsDQogICAgICAgICAgICJFY3BpMV9tZWRpYW4iLA0KICAgICAgICAgICAiYnJlYWtldmVuIiwNCiAgICAgICAgICAgImJ0X0VwcGkiKQ0KDQpicmVha3NzIDwtIGModmFyczEsICJUYXJnZXQiKQ0KDQpsZWdzIDwtICBjKCJBY3R1YWwgaW5mbGF0aW9uIiwNCiAgICAgICAgICAgIkNyb3NzLXNlY3Rpb25hbCBtZWRpYW4gb2YgcHJvZmVzc2lvbmFsc+KAmSBzdXJ2ZXkiLA0KICAgICAgICAgICAiTWFya2V0LXByaWNlIGltcGxpZWQgZXhwZWN0YXRpb24iLA0KICAgICAgICAgICAiV2VpZ2h0ZWQgbWVhbiBvZiBmaXJtc+KAmSBzdXJ2ZXkiLA0KICAgICAgICAgICAiVGFyZ2V0IikNCmxlZ3YgPC0gYygncmVkJywgJ2JsdWUnLCAnZ3JlZW40JywgJ29yYW5nZTMnLCAnYmxhY2snKQ0KbGluZXYgPC0gYygnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCcsICJkb3RkYXNoIiwgJ2xvbmdkYXNoJykNCg0KDQojIGluZmxhdGlvbiB0YXJnZXQNCnRhcmdldCA8LSAwLjA1DQoNCiMgdGhpY2tuZXNzIG9mIGxpbmUNCnZsaW5lX3cgPC0gMC42ICMgbW0NCiMgdGlja3MNCmxhYnMgPC0gYygwLCB0YXJnZXQsIHNlcSh0YXJnZXQsIDAuMywgbGVuZ3RoLm91dCA9IDYpWzI6Nl0pDQoNCiMgcGxvdA0KcGxvdCA8LSBjcmVhdGVfcGxvdChkdGZfbG9uZywgZGF0ZV9sYiA9IGFzLkRhdGUoIjIwMTUtMDEtMDEiKSwNCiAgICAgICAgICAgICAgICAgICAgdmFycyA9IHZhcnMxLCBzY2FsZXMgPSAwKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4yNywwLjgpKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSB0YXJnZXQsDQogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJUYXJnZXQiLCBsaW5ldHlwZSA9ICJUYXJnZXQiKSwNCiAgICAgICAgICAgICBzaXplID0gdGZvbnQodmxpbmVfdykpICsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGJyZWFrcyA9IGJyZWFrc3MsDQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaW5ldiwgbGFiZWxzID0gbGVncykgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKGJyZWFrcyA9IGJyZWFrc3MsDQogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbGVndiwgbGFiZWxzID0gbGVncykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjMpLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbGFicywNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudChsYWJzLCBhY2N1cmFjeSA9IDEpKQ0KDQpwcmludChwbG90KQ0KaWYgKGJTYXZlUGxvdHMpIG15X2dnc2F2ZShwYXN0ZTAocGF0aF9maWd1cmVfb3V0LCAiZmlndXJlXzEyX2EucGRmIiksIHBsb3QpDQoNCmBgYA0KDQojIyBTdWJmaWd1cmUgMTIoYik6IChiKSBDcm9zcy1zZWN0aW9uYWwgc3VydmV5IGRpc3RyaWJ1dGlvbg0KDQpgYGB7ciBmaWdfMTJfYn0NCg0KIyBGb3JlY2FzdCBkaXN0cmlidXRpb24NCg0KIyBDSE9JQ0UNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpleCA8LSAxICMxIG9yIDIgeWVhcnMgZXhwZWN0YXRpb25zDQpkYXRlciA8LSBjKGFzLkRhdGUoIjIwMTctMDktMDEiKSwNCiAgICAgICAgICAgYXMuRGF0ZSgiMjAxOS0wOS0wMSIpLA0KICAgICAgICAgICBhcy5EYXRlKCIyMDIwLTA5LTAxIikpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBFTkQgT0YgQ0hPSUNFDQoNCnNjIDwtIHBhc3RlMCgiZGF0ZXxFY3BpIiwgZXgsICJfcF8iKSANCg0KYnVja2V0cyA8LSBjKDEuNSwgc2VxKDMuMjUsIGJ5ID0gMC41LCBsZW5ndGgub3V0ID0gbmNvbCh4KS0xKSkvMTAwDQoNCmR0Zl90ZW1wIDwtIGR0Zl9sb25nICU+JQ0KICBmaWx0ZXIoZ3JlcGwoc2MsIHZhcmlhYmxlKSwgZGF0ZSAlaW4lIGRhdGVyKSAlPiUNCiAgYXJyYW5nZSh2YXJpYWJsZSkgJT4lDQogIG11dGF0ZShidWNrID0gcmVwKGJ1Y2tldHMsbGVuZ3RoKGRhdGVyKSksDQogICAgICAgICB5ciA9IGZhY3Rvcih5ZWFyKGRhdGUpLA0KICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0geWVhcihkYXRlcikpDQogICAgICAgICApDQoNCnBsb3QgPC0gZ2dwbG90KGR0Zl90ZW1wLA0KICAgICAgICAgICAgICAgYWVzKHggPSBidWNrLCB5ID0gdmFsdWUsIGZpbGwgPSB5cikpICsNCiAgZ2VvbV9jb2wod2lkdGggPSB0Zm9udCgwLjAwNDUpLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGZhY2V0X3dyYXAoLiB+IHlyKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudChidWNrZXRzW3NlcSgxLCBsZW5ndGgoYnVja2V0cyksIGJ5ID0gMyldLCBhY2N1cmFjeSA9IDEpLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYnVja2V0c1tzZXEoMSxsZW5ndGgoYnVja2V0cyksIGJ5ID0gMyldDQogICAgICAgICAgICAgICAgICAgICkgKw0KICBzY2FsZV9maWxsX21hbnVhbChicmVha3MgPSB5ZWFyKGRhdGVyKSwgdmFsdWVzID0gYygicmVkMyIsImJsdWUzIiwib3JhbmdlIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjQsMC44NSksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZSgpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gdGZvbnQoNCkpLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkNCiAgICAgICApDQoNCnByaW50KHBsb3QpDQppZiAoYlNhdmVQbG90cykgbXlfZ2dzYXZlKHBhc3RlMChwYXRoX2ZpZ3VyZV9vdXQsICJmaWd1cmVfMTJfYi5wZGYiKSwgcGxvdCkNCg0KYGBg