Huggins Briefing - 2025/11/19

Important Notes

  1. Children dataset contains ONLY children aged 0-6 years
  2. All analyses use proper population weights (coefin/10,000)
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
library(scales)
# Update these paths to your local file locations
data_adult <- read.csv("C:/Users/satya/OneDrive - Politecnico di Milano/Joint Folder - Pekerti & Fratesi/cardiff_periodabroad/cardiff_project/analysis/data/avq2023_sub_adult.csv")
data_children <- read.csv("C:/Users/satya/OneDrive - Politecnico di Milano/Joint Folder - Pekerti & Fratesi/cardiff_periodabroad/cardiff_project/analysis/data/avq2023_sub_children.csv")
data_hh <- read.csv("C:/Users/satya/OneDrive - Politecnico di Milano/Joint Folder - Pekerti & Fratesi/cardiff_periodabroad/cardiff_project/analysis/data/avq2023_sub_hh.csv")

# Create weights (divide coefin by 10,000)
data_adult$weight <- data_adult$coefin / 10000
data_children$weight <- data_children$coefin / 10000
cat("Adult dataset dimensions:", dim(data_adult), "\n")
Adult dataset dimensions: 36844 127 
cat("Children dataset dimensions:", dim(data_children), "\n")
Children dataset dimensions: 1925 24 
cat("Household dataset dimensions:", dim(data_hh), "\n\n")
Household dataset dimensions: 18565 7 
cat("Weighted populations:\n")
Weighted populations:
cat("Adults (15+):", format(sum(data_adult$weight), big.mark=","), "\n")
Adults (15+): 51,121,050 
cat("Children (0-6):", format(sum(data_children$weight), big.mark=","), "\n")
Children (0-6): 3,006,816 
# Region names mapping
region_names <- c(
  '10' = "Piemonte", '20' = "Valle d'Aosta", '30' = "Liguria",
  '41' = "Lombardia", '42' = "Provincia Autonoma Bolzano/Bozen",
  '50' = "Provincia Autonoma Trento", '60' = "Veneto", '70' = "Friuli-Venezia Giulia",
  '80' = "Emilia-Romagna", '90' = "Toscana", '100' = "Umbria",
  '110' = "Marche", '120' = "Lazio", '130' = "Abruzzo",
  '140' = "Molise", '150' = "Campania", '160' = "Puglia",
  '170' = "Basilicata", '180' = "Calabria", '190' = "Sicilia", '200' = "Sardegna"
)

# Ripartizione mapping
rip_names <- c(
  '1' = "Nord-Ovest", '2' = "Nord-Est", '3' = "Centro",
  '4' = "Sud", '5' = "Isole"
)

# Add to adult data
data_adult <- data_adult %>%
  mutate(
    region_name = region_names[as.character(reg)],
    rip_name = rip_names[as.character(rip)]
  )

Data Description

This analysis uses the AVQ (Aspetti della Vita Quotidiana) 2023 survey data from ISTAT with proper population weights (coefin variable divided by 10,000).

Dataset Overview

  • Adult dataset: 36,844 individuals aged 15+ (weighted population: 51.1 million)
  • Household dataset: 18,565 households (weighted: 26.2 million households)
  • Children dataset: 1,925 children aged 0-6 years only (weighted population: 3.0 million)

Important Note: The children dataset contains only children aged 0-6 years, not all children aged 0-14. This is specifically focused on the pre-school age range.

Geographic Coverage: - National level (Italy) - Regional breakdown: 21 regions - Macro-area classification (Ripartizioni): - Nord-Ovest (Northwest) - Nord-Est (Northeast) - Centro (Center) - Sud (South) - Isole (Islands)

Weighting: All results use the ISTAT survey weights (coefin/10,000) to provide population-representative estimates.


1. Family Size Distribution (Weighted)

# Get household weights (from household head)
household_weights <- data_adult %>%
  filter(demo_relpar == 1) %>%
  select(hhid, weight, reg, rip)

# Count family size
family_size <- data_adult %>%
  group_by(hhid) %>%
  summarise(family_size = n()) %>%
  left_join(household_weights, by = "hhid")

total_households <- sum(family_size$weight, na.rm = TRUE)

cat("=== ITALY ===\n")
=== ITALY ===
cat("Total weighted households:", format(total_households, big.mark=","), "\n\n")
Total weighted households: 26,201,432 
# Weighted distribution
family_size_dist <- family_size %>%
  group_by(family_size) %>%
  summarise(
    households = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(percentage = households / total_households * 100)

print(family_size_dist)

# Weighted average
weighted_avg <- sum(family_size$family_size * family_size$weight, na.rm = TRUE) / 
                sum(family_size$weight, na.rm = TRUE)
cat("\nWeighted average family size:", round(weighted_avg, 2), "\n")

Weighted average family size: 1.95 
# Lombardy
cat("\n=== LOMBARDY ===\n")

=== LOMBARDY ===
lombardy_families <- family_size %>% filter(reg == 41)
total_lom <- sum(lombardy_families$weight, na.rm = TRUE)
cat("Total weighted households:", format(total_lom, big.mark=","), "\n\n")
Total weighted households: 230,150 
lom_dist <- lombardy_families %>%
  group_by(family_size) %>%
  summarise(
    households = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(percentage = households / total_lom * 100)

print(lom_dist)

weighted_avg_lom <- sum(lombardy_families$family_size * lombardy_families$weight, na.rm = TRUE) / 
                    sum(lombardy_families$weight, na.rm = TRUE)
cat("\nWeighted average family size:", round(weighted_avg_lom, 2), "\n")

Weighted average family size: 1.94 

Visualization

# Italy
p1 <- ggplot(family_size_dist, aes(x = factor(family_size), y = households/1e6)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = sprintf("%.2fM", households/1e6)), vjust = -0.5, size = 3) +
  labs(title = "Family Size Distribution - Italy (Weighted)",
       x = "Family Size (members)", y = "Households (millions)") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold"))

# Lombardy
p2 <- ggplot(lom_dist, aes(x = factor(family_size), y = households/1e3)) +
  geom_col(fill = "coral") +
  geom_text(aes(label = sprintf("%.0fK", households/1e3)), vjust = -0.5, size = 3) +
  labs(title = "Family Size Distribution - Lombardy (Weighted)",
       x = "Family Size (members)", y = "Households (thousands)") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold"))

gridExtra::grid.arrange(p1, p2, ncol = 2)


2. North vs South Comparison (Weighted)

# Add macro area
family_size <- family_size %>%
  mutate(macro_area = case_when(
    rip %in% c(1, 2) ~ "North",
    rip == 3 ~ "Center",
    rip %in% c(4, 5) ~ "South"
  ))

# Macro area statistics
macro_stats <- family_size %>%
  filter(!is.na(macro_area)) %>%
  group_by(macro_area) %>%
  summarise(
    avg_size = sum(family_size * weight, na.rm = TRUE) / sum(weight, na.rm = TRUE),
    households = sum(weight, na.rm = TRUE),
    .groups = "drop"
  )

cat("=== Macro Area Comparison ===\n")
=== Macro Area Comparison ===
print(macro_stats)

# By ripartizione
rip_stats <- family_size %>%
  filter(!is.na(rip)) %>%
  group_by(rip) %>%
  summarise(
    avg_size = sum(family_size * weight, na.rm = TRUE) / sum(weight, na.rm = TRUE),
    households = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(rip_name = rip_names[as.character(rip)])

cat("\n=== By Ripartizione ===\n")

=== By Ripartizione ===
print(rip_stats)

Visualization

ggplot(rip_stats, aes(x = reorder(rip_name, -avg_size), y = avg_size)) +
  geom_col(aes(fill = rip_name)) +
  geom_hline(yintercept = weighted_avg, linetype = "dashed", color = "black") +
  geom_text(aes(label = sprintf("%.2f", avg_size)), vjust = -0.5, fontface = "bold") +
  annotate("text", x = 5, y = weighted_avg + 0.05, label = "National Average", size = 3) +
  labs(title = "Average Family Size by Ripartizione (Weighted)",
       x = "", y = "Average Family Size (members)") +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold"),
        axis.text.x = element_text(angle = 15, hjust = 1))


3. Female Employment Rate (Weighted)

# Working-age females (15-64)
working_age_females <- data_adult %>%
  filter(demo_female == 1, demo_age >= 15, demo_age <= 64)

total_females <- sum(working_age_females$weight, na.rm = TRUE)
employed_females <- sum(working_age_females$weight[working_age_females$demo_empl == 1], na.rm = TRUE)

emp_rate_italy <- employed_females / total_females * 100

cat("=== ITALY ===\n")
=== ITALY ===
cat("Employment Rate:", round(emp_rate_italy, 2), "%\n")
Employment Rate: 51.14 %
cat("Employed females:", format(employed_females, big.mark=","), "\n")
Employed females: 9,472,721 
cat("Working-age females:", format(total_females, big.mark=","), "\n")
Working-age females: 18,523,550 
# Lombardy
lom_females <- working_age_females %>% filter(reg == 41)
total_lom_fem <- sum(lom_females$weight, na.rm = TRUE)
employed_lom <- sum(lom_females$weight[lom_females$demo_empl == 1], na.rm = TRUE)
emp_rate_lom <- employed_lom / total_lom_fem * 100

cat("\n=== LOMBARDY ===\n")

=== LOMBARDY ===
cat("Employment Rate:", round(emp_rate_lom, 2), "%\n")
Employment Rate: 66.62 %
cat("Employed females:", format(employed_lom, big.mark=","), "\n")
Employed females: 112,350.4 
cat("Working-age females:", format(total_lom_fem, big.mark=","), "\n")
Working-age females: 168,637.8 
# By Ripartizione
emp_by_rip <- working_age_females %>%
  group_by(rip) %>%
  summarise(
    employed = sum(weight[demo_empl == 1], na.rm = TRUE),
    total = sum(weight, na.rm = TRUE),
    rate = employed / total * 100,
    .groups = "drop"
  ) %>%
  mutate(rip_name = rip_names[as.character(rip)])

cat("\n=== By Ripartizione ===\n")

=== By Ripartizione ===
print(emp_by_rip)

Visualization

ggplot(emp_by_rip, aes(x = reorder(rip_name, -rate), y = rate)) +
  geom_col(aes(fill = rip_name)) +
  geom_hline(yintercept = emp_rate_italy, linetype = "dashed", color = "black") +
  geom_text(aes(label = sprintf("%.1f%%", rate)), vjust = -0.5, fontface = "bold") +
  annotate("text", x = 5, y = emp_rate_italy + 2, label = "National Average", size = 3) +
  labs(title = "Female Employment Rate (15-64) by Ripartizione (Weighted)",
       x = "", y = "Employment Rate (%)") +
  ylim(0, 70) +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold"),
        axis.text.x = element_text(angle = 15, hjust = 1))


4. Distribution of Children per Family (Weighted)

Note: Children dataset contains only ages 0-6

# Household info
household_info <- data_adult %>%
  filter(demo_relpar == 1) %>%
  select(hhid, weight, reg, rip)

# Count children per family
children_per_family <- data_children %>%
  group_by(profam) %>%
  summarise(
    n_children = n(),
    coefin = first(coefin),
    .groups = "drop"
  ) %>%
  mutate(weight = coefin / 10000) %>%
  rename(hhid = profam) %>%
  left_join(
    data_adult %>% filter(demo_relpar == 1) %>% 
      select(hhid, reg, rip) %>% distinct(),
    by = "hhid"
  )

total_fam_children <- sum(children_per_family$weight, na.rm = TRUE)

cat("=== ITALY - Families with Children (0-6) ===\n")
=== ITALY - Families with Children (0-6) ===
cat("Total families:", format(total_fam_children, big.mark=","), "\n\n")
Total families: 2,397,253 
children_dist <- children_per_family %>%
  group_by(n_children) %>%
  summarise(
    families = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(percentage = families / total_fam_children * 100)

print(children_dist)

weighted_avg_children <- sum(children_per_family$n_children * children_per_family$weight, na.rm = TRUE) / 
                         sum(children_per_family$weight, na.rm = TRUE)
cat("\nWeighted average:", round(weighted_avg_children, 2), "children per family\n")

Weighted average: 1.25 children per family
# Lombardy
lom_children_fam <- children_per_family %>% filter(reg == 41)
total_lom_fam <- sum(lom_children_fam$weight, na.rm = TRUE)

cat("\n=== LOMBARDY - Families with Children (0-6) ===\n")

=== LOMBARDY - Families with Children (0-6) ===
cat("Total families:", format(total_lom_fam, big.mark=","), "\n\n")
Total families: 27,147.6 
lom_children_dist <- lom_children_fam %>%
  group_by(n_children) %>%
  summarise(
    families = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(percentage = families / total_lom_fam * 100)

print(lom_children_dist)

weighted_avg_lom_child <- sum(lom_children_fam$n_children * lom_children_fam$weight, na.rm = TRUE) / 
                          sum(lom_children_fam$weight, na.rm = TRUE)
cat("\nWeighted average:", round(weighted_avg_lom_child, 2), "children per family\n")

Weighted average: 1.33 children per family
# All families (including those without children 0-6)
all_families <- household_info %>%
  left_join(children_per_family %>% select(hhid, n_children), by = "hhid") %>%
  mutate(n_children = ifelse(is.na(n_children), 0, n_children))

total_all_fam <- sum(all_families$weight, na.rm = TRUE)

cat("\n=== ALL FAMILIES (including without children 0-6) ===\n")

=== ALL FAMILIES (including without children 0-6) ===
cat("Total families:", format(total_all_fam, big.mark=","), "\n\n")
Total families: 26,201,432 
all_children_dist <- all_families %>%
  group_by(n_children) %>%
  summarise(
    families = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(percentage = families / total_all_fam * 100)

print(head(all_children_dist, 6))

Visualization

p1 <- ggplot(children_dist, aes(x = factor(n_children), y = families/1e3)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = sprintf("%.0fK", families/1e3)), vjust = -0.5, size = 3) +
  labs(title = "Children per Family - Among Families with Children (Weighted)",
       x = "Number of Children (0-6)", y = "Families (thousands)") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold"))

p2 <- ggplot(head(all_children_dist, 5), aes(x = factor(n_children), y = families/1e6)) +
  geom_col(fill = "coral") +
  geom_text(aes(label = sprintf("%.2fM", families/1e6)), vjust = -0.5, size = 3) +
  labs(title = "Children per Family - All Families (Weighted)",
       x = "Number of Children (0-6)", y = "Families (millions)") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold"))

gridExtra::grid.arrange(p1, p2, ncol = 2)


5. Working Mothers (Weighted)

# Employed females aged 15-64
employed_females_data <- data_adult %>%
  filter(demo_female == 1, demo_empl == 1, demo_age >= 15, demo_age <= 64)

total_emp_women <- sum(employed_females_data$weight, na.rm = TRUE)
working_mothers <- sum(employed_females_data$weight[employed_females_data$demo_mother == 1], na.rm = TRUE)

mothers_share_italy <- working_mothers / total_emp_women * 100

cat("=== ITALY ===\n")
=== ITALY ===
cat("Total employed women:", format(total_emp_women, big.mark=","), "\n")
Total employed women: 9,472,721 
cat("Working mothers:", format(working_mothers, big.mark=","), "\n")
Working mothers: 6,337,612 
cat("Share:", round(mothers_share_italy, 2), "%\n")
Share: 66.9 %
# Lombardy
lom_emp <- employed_females_data %>% filter(reg == 41)
total_lom_emp <- sum(lom_emp$weight, na.rm = TRUE)
lom_mothers <- sum(lom_emp$weight[lom_emp$demo_mother == 1], na.rm = TRUE)
mothers_share_lom <- lom_mothers / total_lom_emp * 100

cat("\n=== LOMBARDY ===\n")

=== LOMBARDY ===
cat("Total employed women:", format(total_lom_emp, big.mark=","), "\n")
Total employed women: 112,350.4 
cat("Working mothers:", format(lom_mothers, big.mark=","), "\n")
Working mothers: 74,324.23 
cat("Share:", round(mothers_share_lom, 2), "%\n")
Share: 66.15 %
# By Ripartizione
mothers_by_rip <- employed_females_data %>%
  group_by(rip) %>%
  summarise(
    working_mothers = sum(weight[demo_mother == 1], na.rm = TRUE),
    total_employed = sum(weight, na.rm = TRUE),
    share = working_mothers / total_employed * 100,
    .groups = "drop"
  ) %>%
  mutate(rip_name = rip_names[as.character(rip)])

cat("\n=== By Ripartizione ===\n")

=== By Ripartizione ===
print(mothers_by_rip)

Visualization

ggplot(mothers_by_rip, aes(x = reorder(rip_name, -share), y = share)) +
  geom_col(aes(fill = rip_name)) +
  geom_hline(yintercept = mothers_share_italy, linetype = "dashed", color = "black") +
  geom_text(aes(label = sprintf("%.1f%%", share)), vjust = -0.5, fontface = "bold") +
  annotate("text", x = 5, y = mothers_share_italy + 1.5, label = "National Average", size = 3) +
  labs(title = "Working Mothers Among Employed Women by Ripartizione (Weighted)",
       x = "", y = "Share of Working Mothers (%)") +
  ylim(0, 80) +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold"),
        axis.text.x = element_text(angle = 15, hjust = 1))


6. Pre-School Attendance (Weighted)

Note: Children dataset contains ONLY ages 0-6

total_children <- sum(data_children$weight, na.rm = TRUE)

# Merge with household info
children_with_region <- data_children %>%
  left_join(
    data_adult %>% filter(demo_relpar == 1) %>% 
      select(hhid, reg, rip) %>% distinct(),
    by = c("profam" = "hhid")
  )

# Formal childcare
attending_formal <- sum(children_with_region$weight[children_with_region$childcare_formal == 1], na.rm = TRUE)
not_attending <- sum(children_with_region$weight[children_with_region$childcare_formal == 0], na.rm = TRUE)

attendance_rate <- attending_formal / total_children * 100

cat("=== ITALY ===\n")
=== ITALY ===
cat("Total children (0-6):", format(total_children, big.mark=","), "\n")
Total children (0-6): 3,006,816 
cat("Children in formal childcare:", format(attending_formal, big.mark=","), "\n")
Children in formal childcare: 1,613,274 
cat("Children not in formal childcare:", format(not_attending, big.mark=","), "\n")
Children not in formal childcare: 1,393,543 
cat("Attendance rate:", round(attendance_rate, 2), "%\n")
Attendance rate: 53.65 %
# By type of care
care_types <- children_with_region %>%
  group_by(care_enrolled) %>%
  summarise(
    children = sum(weight, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    percentage = children / total_children * 100,
    care_type = case_when(
      care_enrolled == 1 ~ "Asilo Nido (Nursery, 0-2)",
      care_enrolled == 14 ~ "Not enrolled",
      care_enrolled == 15 ~ "Scuola Infanzia (Kindergarten, 3-5)",
      care_enrolled == 16 ~ "Scuola Primaria (Primary, 6+)",
      TRUE ~ as.character(care_enrolled)
    )
  )

cat("\n=== By Type of Care ===\n")

=== By Type of Care ===
print(care_types %>% select(care_type, children, percentage))

# Pre-school specific
preschool_rate <- sum(children_with_region$weight[children_with_region$care_enrolled %in% c(1, 15)], na.rm = TRUE) / 
                  total_children * 100
cat("\nPre-school (Asilo Nido + Scuola Infanzia) rate:", round(preschool_rate, 2), "%\n")

Pre-school (Asilo Nido + Scuola Infanzia) rate: 70.47 %
# Lombardy
lom_children <- children_with_region %>% filter(reg == 41)
total_lom_child <- sum(lom_children$weight, na.rm = TRUE)
lom_attending <- sum(lom_children$weight[lom_children$childcare_formal == 1], na.rm = TRUE)
lom_attendance <- lom_attending / total_lom_child * 100

cat("\n=== LOMBARDY ===\n")

=== LOMBARDY ===
cat("Total children (0-6):", format(total_lom_child, big.mark=","), "\n")
Total children (0-6): 36,075.57 
cat("Children in formal childcare:", format(lom_attending, big.mark=","), "\n")
Children in formal childcare: 16,995.04 
cat("Attendance rate:", round(lom_attendance, 2), "%\n")
Attendance rate: 47.11 %
# By Ripartizione
attendance_by_rip <- children_with_region %>%
  group_by(rip) %>%
  summarise(
    attending = sum(weight[childcare_formal == 1], na.rm = TRUE),
    total = sum(weight, na.rm = TRUE),
    rate = attending / total * 100,
    .groups = "drop"
  ) %>%
  mutate(rip_name = rip_names[as.character(rip)])

cat("\n=== By Ripartizione ===\n")

=== By Ripartizione ===
print(attendance_by_rip)

Visualization

ggplot(attendance_by_rip, aes(x = reorder(rip_name, -rate), y = rate)) +
  geom_col(aes(fill = rip_name)) +
  geom_hline(yintercept = attendance_rate, linetype = "dashed", color = "black") +
  geom_text(aes(label = sprintf("%.1f%%", rate)), vjust = -0.5, fontface = "bold") +
  annotate("text", x = 5, y = attendance_rate + 2, label = "National Average", size = 3) +
  labs(title = "Pre-School Attendance Rate by Ripartizione (Children 0-6, Weighted)",
       x = "", y = "Attendance Rate (%)") +
  ylim(0, 70) +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold"),
        axis.text.x = element_text(angle = 15, hjust = 1))


Summary Statistics Table

summary_data <- data.frame(
  Indicator = c(
    "Total households (millions)",
    "Average family size (Italy)",
    "Average family size (Lombardy)",
    "Average family size (North)",
    "Average family size (South)",
    "Female employment rate - Italy (%)",
    "Female employment rate - Lombardy (%)",
    "Female employment rate - North (%)",
    "Female employment rate - South (%)",
    "Working mothers share - Italy (%)",
    "Working mothers share - Sud (%)",
    "Pre-school attendance - Italy (%)",
    "Pre-school attendance - Lombardy (%)",
    "Children (0-6) per family (with children)"
  ),
  Value = c(
    round(total_households/1e6, 2),
    round(weighted_avg, 2),
    round(weighted_avg_lom, 2),
    round(macro_stats$avg_size[macro_stats$macro_area == "North"], 2),
    round(macro_stats$avg_size[macro_stats$macro_area == "South"], 2),
    round(emp_rate_italy, 2),
    round(emp_rate_lom, 2),
    round(mean(emp_by_rip$rate[emp_by_rip$rip %in% c(1,2)]), 2),
    round(mean(emp_by_rip$rate[emp_by_rip$rip %in% c(4,5)]), 2),
    round(mothers_share_italy, 2),
    round(mothers_by_rip$share[mothers_by_rip$rip == 4], 2),
    round(attendance_rate, 2),
    round(lom_attendance, 2),
    round(weighted_avg_children, 2)
  )
)

kable(summary_data, caption = "Key Indicators Summary (Weighted)")
Key Indicators Summary (Weighted)
Indicator Value
Total households (millions) 26.20
Average family size (Italy) 1.95
Average family size (Lombardy) 1.94
Average family size (North) 1.90
Average family size (South) 2.05
Female employment rate - Italy (%) 51.14
Female employment rate - Lombardy (%) 66.62
Female employment rate - North (%) 60.70
Female employment rate - South (%) 35.13
Working mothers share - Italy (%) 66.90
Working mothers share - Sud (%) 73.69
Pre-school attendance - Italy (%) 53.65
Pre-school attendance - Lombardy (%) 47.11
Children (0-6) per family (with children) 1.25

Report generated: 2025-11-20

All analyses use proper population weights (coefin/10,000)

Points of Discussion

  1. The AVQ survey doesn’t have any questions regarding religious stance or conservativeness. I was thinking that maybe this can be proxied with Euroskepticism?
  1. There is a question asking about ‘how much do you believe in: European Parliament?’

  2. There are also several questions asking the perception of several disorders on their community, such as:

  • How safe do you feel walking on the street when it’s dark and you’re alone in the area where you live?

  • In the area where you live, how often do you see: people using drugs

  • In the area where you live, how often do you see: people dealing drugs

  • In the area where you live, how often do you see: prostitutes looking for clients

  • In the area where you live, how often do you see: acts of vandalism against public property (broken phone booths, trash bins, etc.)

  • In the area where you live, how often do you see: vagrants, people with no fixed address -

LS0tDQp0aXRsZTogIkh1Z2dpbnMgQnJpZWZpbmcgLSAyMDI1LzExLzE5Ig0Kc3VidGl0bGU6ICJEYXRhIERlc2NyaXB0aW9uIGFuZCBQcmVsaW1pbmFyeSBBbmFseXNpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIyBJbXBvcnRhbnQgTm90ZXMNCg0KMS4gKipDaGlsZHJlbiBkYXRhc2V0IGNvbnRhaW5zIE9OTFkgY2hpbGRyZW4gYWdlZCAwLTYgeWVhcnMqKg0KMi4gKipBbGwgYW5hbHlzZXMgdXNlIHByb3BlciBwb3B1bGF0aW9uIHdlaWdodHMqKiAoY29lZmluLzEwLDAwMCkNCg0KYGBge3IgbG9hZF9saWJyYXJpZXN9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KYGBge3IgbG9hZF9kYXRhfQ0KIyBVcGRhdGUgdGhlc2UgcGF0aHMgdG8geW91ciBsb2NhbCBmaWxlIGxvY2F0aW9ucw0KZGF0YV9hZHVsdCA8LSByZWFkLmNzdigiQzovVXNlcnMvc2F0eWEvT25lRHJpdmUgLSBQb2xpdGVjbmljbyBkaSBNaWxhbm8vSm9pbnQgRm9sZGVyIC0gUGVrZXJ0aSAmIEZyYXRlc2kvY2FyZGlmZl9wZXJpb2RhYnJvYWQvY2FyZGlmZl9wcm9qZWN0L2FuYWx5c2lzL2RhdGEvYXZxMjAyM19zdWJfYWR1bHQuY3N2IikNCmRhdGFfY2hpbGRyZW4gPC0gcmVhZC5jc3YoIkM6L1VzZXJzL3NhdHlhL09uZURyaXZlIC0gUG9saXRlY25pY28gZGkgTWlsYW5vL0pvaW50IEZvbGRlciAtIFBla2VydGkgJiBGcmF0ZXNpL2NhcmRpZmZfcGVyaW9kYWJyb2FkL2NhcmRpZmZfcHJvamVjdC9hbmFseXNpcy9kYXRhL2F2cTIwMjNfc3ViX2NoaWxkcmVuLmNzdiIpDQpkYXRhX2hoIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9zYXR5YS9PbmVEcml2ZSAtIFBvbGl0ZWNuaWNvIGRpIE1pbGFuby9Kb2ludCBGb2xkZXIgLSBQZWtlcnRpICYgRnJhdGVzaS9jYXJkaWZmX3BlcmlvZGFicm9hZC9jYXJkaWZmX3Byb2plY3QvYW5hbHlzaXMvZGF0YS9hdnEyMDIzX3N1Yl9oaC5jc3YiKQ0KDQojIENyZWF0ZSB3ZWlnaHRzIChkaXZpZGUgY29lZmluIGJ5IDEwLDAwMCkNCmRhdGFfYWR1bHQkd2VpZ2h0IDwtIGRhdGFfYWR1bHQkY29lZmluIC8gMTAwMDANCmRhdGFfY2hpbGRyZW4kd2VpZ2h0IDwtIGRhdGFfY2hpbGRyZW4kY29lZmluIC8gMTAwMDANCmBgYA0KDQpgYGB7ciBkYXRhX292ZXJ2aWV3fQ0KY2F0KCJBZHVsdCBkYXRhc2V0IGRpbWVuc2lvbnM6IiwgZGltKGRhdGFfYWR1bHQpLCAiXG4iKQ0KY2F0KCJDaGlsZHJlbiBkYXRhc2V0IGRpbWVuc2lvbnM6IiwgZGltKGRhdGFfY2hpbGRyZW4pLCAiXG4iKQ0KY2F0KCJIb3VzZWhvbGQgZGF0YXNldCBkaW1lbnNpb25zOiIsIGRpbShkYXRhX2hoKSwgIlxuXG4iKQ0KDQpjYXQoIldlaWdodGVkIHBvcHVsYXRpb25zOlxuIikNCmNhdCgiQWR1bHRzICgxNSspOiIsIGZvcm1hdChzdW0oZGF0YV9hZHVsdCR3ZWlnaHQpLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KY2F0KCJDaGlsZHJlbiAoMC02KToiLCBmb3JtYXQoc3VtKGRhdGFfY2hpbGRyZW4kd2VpZ2h0KSwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmBgYA0KDQpgYGB7ciByZWdpb25fbWFwcGluZ30NCiMgUmVnaW9uIG5hbWVzIG1hcHBpbmcNCnJlZ2lvbl9uYW1lcyA8LSBjKA0KICAnMTAnID0gIlBpZW1vbnRlIiwgJzIwJyA9ICJWYWxsZSBkJ0Fvc3RhIiwgJzMwJyA9ICJMaWd1cmlhIiwNCiAgJzQxJyA9ICJMb21iYXJkaWEiLCAnNDInID0gIlByb3ZpbmNpYSBBdXRvbm9tYSBCb2x6YW5vL0JvemVuIiwNCiAgJzUwJyA9ICJQcm92aW5jaWEgQXV0b25vbWEgVHJlbnRvIiwgJzYwJyA9ICJWZW5ldG8iLCAnNzAnID0gIkZyaXVsaS1WZW5lemlhIEdpdWxpYSIsDQogICc4MCcgPSAiRW1pbGlhLVJvbWFnbmEiLCAnOTAnID0gIlRvc2NhbmEiLCAnMTAwJyA9ICJVbWJyaWEiLA0KICAnMTEwJyA9ICJNYXJjaGUiLCAnMTIwJyA9ICJMYXppbyIsICcxMzAnID0gIkFicnV6em8iLA0KICAnMTQwJyA9ICJNb2xpc2UiLCAnMTUwJyA9ICJDYW1wYW5pYSIsICcxNjAnID0gIlB1Z2xpYSIsDQogICcxNzAnID0gIkJhc2lsaWNhdGEiLCAnMTgwJyA9ICJDYWxhYnJpYSIsICcxOTAnID0gIlNpY2lsaWEiLCAnMjAwJyA9ICJTYXJkZWduYSINCikNCg0KIyBSaXBhcnRpemlvbmUgbWFwcGluZw0KcmlwX25hbWVzIDwtIGMoDQogICcxJyA9ICJOb3JkLU92ZXN0IiwgJzInID0gIk5vcmQtRXN0IiwgJzMnID0gIkNlbnRybyIsDQogICc0JyA9ICJTdWQiLCAnNScgPSAiSXNvbGUiDQopDQoNCiMgQWRkIHRvIGFkdWx0IGRhdGENCmRhdGFfYWR1bHQgPC0gZGF0YV9hZHVsdCAlPiUNCiAgbXV0YXRlKA0KICAgIHJlZ2lvbl9uYW1lID0gcmVnaW9uX25hbWVzW2FzLmNoYXJhY3RlcihyZWcpXSwNCiAgICByaXBfbmFtZSA9IHJpcF9uYW1lc1thcy5jaGFyYWN0ZXIocmlwKV0NCiAgKQ0KYGBgDQoNCiMgRGF0YSBEZXNjcmlwdGlvbg0KDQpUaGlzIGFuYWx5c2lzIHVzZXMgdGhlICoqQVZRIChBc3BldHRpIGRlbGxhIFZpdGEgUXVvdGlkaWFuYSkgMjAyMyoqIHN1cnZleSBkYXRhIGZyb20gSVNUQVQgd2l0aCAqKnByb3BlciBwb3B1bGF0aW9uIHdlaWdodHMqKiAoY29lZmluIHZhcmlhYmxlIGRpdmlkZWQgYnkgMTAsMDAwKS4NCg0KIyMgRGF0YXNldCBPdmVydmlldw0KDQotICoqQWR1bHQgZGF0YXNldCoqOiAzNiw4NDQgaW5kaXZpZHVhbHMgYWdlZCAxNSsgKHdlaWdodGVkIHBvcHVsYXRpb246ICoqNTEuMSBtaWxsaW9uKiopDQotICoqSG91c2Vob2xkIGRhdGFzZXQqKjogMTgsNTY1IGhvdXNlaG9sZHMgKHdlaWdodGVkOiAqKjI2LjIgbWlsbGlvbiBob3VzZWhvbGRzKiopDQotICoqQ2hpbGRyZW4gZGF0YXNldCoqOiAxLDkyNSBjaGlsZHJlbiAqKmFnZWQgMC02IHllYXJzIG9ubHkqKiAod2VpZ2h0ZWQgcG9wdWxhdGlvbjogKiozLjAgbWlsbGlvbioqKQ0KDQoqKkltcG9ydGFudCBOb3RlKio6IFRoZSBjaGlsZHJlbiBkYXRhc2V0IGNvbnRhaW5zICoqb25seSBjaGlsZHJlbiBhZ2VkIDAtNiB5ZWFycyoqLCBub3QgYWxsIGNoaWxkcmVuIGFnZWQgMC0xNC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgZm9jdXNlZCBvbiB0aGUgcHJlLXNjaG9vbCBhZ2UgcmFuZ2UuDQoNCioqR2VvZ3JhcGhpYyBDb3ZlcmFnZToqKg0KLSBOYXRpb25hbCBsZXZlbCAoSXRhbHkpDQotIFJlZ2lvbmFsIGJyZWFrZG93bjogMjEgcmVnaW9ucw0KLSBNYWNyby1hcmVhIGNsYXNzaWZpY2F0aW9uIChSaXBhcnRpemlvbmkpOg0KICAtIE5vcmQtT3Zlc3QgKE5vcnRod2VzdCkNCiAgLSBOb3JkLUVzdCAoTm9ydGhlYXN0KQ0KICAtIENlbnRybyAoQ2VudGVyKQ0KICAtIFN1ZCAoU291dGgpDQogIC0gSXNvbGUgKElzbGFuZHMpDQoNCioqV2VpZ2h0aW5nKio6IEFsbCByZXN1bHRzIHVzZSB0aGUgSVNUQVQgc3VydmV5IHdlaWdodHMgKGNvZWZpbi8xMCwwMDApIHRvIHByb3ZpZGUgcG9wdWxhdGlvbi1yZXByZXNlbnRhdGl2ZSBlc3RpbWF0ZXMuDQoNCi0tLQ0KDQojIDEuIEZhbWlseSBTaXplIERpc3RyaWJ1dGlvbiAoV2VpZ2h0ZWQpDQoNCmBgYHtyIGZhbWlseV9zaXplfQ0KIyBHZXQgaG91c2Vob2xkIHdlaWdodHMgKGZyb20gaG91c2Vob2xkIGhlYWQpDQpob3VzZWhvbGRfd2VpZ2h0cyA8LSBkYXRhX2FkdWx0ICU+JQ0KICBmaWx0ZXIoZGVtb19yZWxwYXIgPT0gMSkgJT4lDQogIHNlbGVjdChoaGlkLCB3ZWlnaHQsIHJlZywgcmlwKQ0KDQojIENvdW50IGZhbWlseSBzaXplDQpmYW1pbHlfc2l6ZSA8LSBkYXRhX2FkdWx0ICU+JQ0KICBncm91cF9ieShoaGlkKSAlPiUNCiAgc3VtbWFyaXNlKGZhbWlseV9zaXplID0gbigpKSAlPiUNCiAgbGVmdF9qb2luKGhvdXNlaG9sZF93ZWlnaHRzLCBieSA9ICJoaGlkIikNCg0KdG90YWxfaG91c2Vob2xkcyA8LSBzdW0oZmFtaWx5X3NpemUkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQoNCmNhdCgiPT09IElUQUxZID09PVxuIikNCmNhdCgiVG90YWwgd2VpZ2h0ZWQgaG91c2Vob2xkczoiLCBmb3JtYXQodG90YWxfaG91c2Vob2xkcywgYmlnLm1hcms9IiwiKSwgIlxuXG4iKQ0KDQojIFdlaWdodGVkIGRpc3RyaWJ1dGlvbg0KZmFtaWx5X3NpemVfZGlzdCA8LSBmYW1pbHlfc2l6ZSAlPiUNCiAgZ3JvdXBfYnkoZmFtaWx5X3NpemUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgaG91c2Vob2xkcyA9IHN1bSh3ZWlnaHQsIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUocGVyY2VudGFnZSA9IGhvdXNlaG9sZHMgLyB0b3RhbF9ob3VzZWhvbGRzICogMTAwKQ0KDQpwcmludChmYW1pbHlfc2l6ZV9kaXN0KQ0KDQojIFdlaWdodGVkIGF2ZXJhZ2UNCndlaWdodGVkX2F2ZyA8LSBzdW0oZmFtaWx5X3NpemUkZmFtaWx5X3NpemUgKiBmYW1pbHlfc2l6ZSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkgLyANCiAgICAgICAgICAgICAgICBzdW0oZmFtaWx5X3NpemUkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQpjYXQoIlxuV2VpZ2h0ZWQgYXZlcmFnZSBmYW1pbHkgc2l6ZToiLCByb3VuZCh3ZWlnaHRlZF9hdmcsIDIpLCAiXG4iKQ0KDQojIExvbWJhcmR5DQpjYXQoIlxuPT09IExPTUJBUkRZID09PVxuIikNCmxvbWJhcmR5X2ZhbWlsaWVzIDwtIGZhbWlseV9zaXplICU+JSBmaWx0ZXIocmVnID09IDQxKQ0KdG90YWxfbG9tIDwtIHN1bShsb21iYXJkeV9mYW1pbGllcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiVG90YWwgd2VpZ2h0ZWQgaG91c2Vob2xkczoiLCBmb3JtYXQodG90YWxfbG9tLCBiaWcubWFyaz0iLCIpLCAiXG5cbiIpDQoNCmxvbV9kaXN0IDwtIGxvbWJhcmR5X2ZhbWlsaWVzICU+JQ0KICBncm91cF9ieShmYW1pbHlfc2l6ZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBob3VzZWhvbGRzID0gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gaG91c2Vob2xkcyAvIHRvdGFsX2xvbSAqIDEwMCkNCg0KcHJpbnQobG9tX2Rpc3QpDQoNCndlaWdodGVkX2F2Z19sb20gPC0gc3VtKGxvbWJhcmR5X2ZhbWlsaWVzJGZhbWlseV9zaXplICogbG9tYmFyZHlfZmFtaWxpZXMkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpIC8gDQogICAgICAgICAgICAgICAgICAgIHN1bShsb21iYXJkeV9mYW1pbGllcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiXG5XZWlnaHRlZCBhdmVyYWdlIGZhbWlseSBzaXplOiIsIHJvdW5kKHdlaWdodGVkX2F2Z19sb20sIDIpLCAiXG4iKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIGZhbWlseV9zaXplX3Bsb3QsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD01fQ0KIyBJdGFseQ0KcDEgPC0gZ2dwbG90KGZhbWlseV9zaXplX2Rpc3QsIGFlcyh4ID0gZmFjdG9yKGZhbWlseV9zaXplKSwgeSA9IGhvdXNlaG9sZHMvMWU2KSkgKw0KICBnZW9tX2NvbChmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMmZNIiwgaG91c2Vob2xkcy8xZTYpKSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICBsYWJzKHRpdGxlID0gIkZhbWlseSBTaXplIERpc3RyaWJ1dGlvbiAtIEl0YWx5IChXZWlnaHRlZCkiLA0KICAgICAgIHggPSAiRmFtaWx5IFNpemUgKG1lbWJlcnMpIiwgeSA9ICJIb3VzZWhvbGRzIChtaWxsaW9ucykiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpDQoNCiMgTG9tYmFyZHkNCnAyIDwtIGdncGxvdChsb21fZGlzdCwgYWVzKHggPSBmYWN0b3IoZmFtaWx5X3NpemUpLCB5ID0gaG91c2Vob2xkcy8xZTMpKSArDQogIGdlb21fY29sKGZpbGwgPSAiY29yYWwiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjBmSyIsIGhvdXNlaG9sZHMvMWUzKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJGYW1pbHkgU2l6ZSBEaXN0cmlidXRpb24gLSBMb21iYXJkeSAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIkZhbWlseSBTaXplIChtZW1iZXJzKSIsIHkgPSAiSG91c2Vob2xkcyAodGhvdXNhbmRzKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkNCg0KZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sID0gMikNCmBgYA0KDQotLS0NCg0KIyAyLiBOb3J0aCB2cyBTb3V0aCBDb21wYXJpc29uIChXZWlnaHRlZCkNCg0KYGBge3Igbm9ydGhfc291dGh9DQojIEFkZCBtYWNybyBhcmVhDQpmYW1pbHlfc2l6ZSA8LSBmYW1pbHlfc2l6ZSAlPiUNCiAgbXV0YXRlKG1hY3JvX2FyZWEgPSBjYXNlX3doZW4oDQogICAgcmlwICVpbiUgYygxLCAyKSB+ICJOb3J0aCIsDQogICAgcmlwID09IDMgfiAiQ2VudGVyIiwNCiAgICByaXAgJWluJSBjKDQsIDUpIH4gIlNvdXRoIg0KICApKQ0KDQojIE1hY3JvIGFyZWEgc3RhdGlzdGljcw0KbWFjcm9fc3RhdHMgPC0gZmFtaWx5X3NpemUgJT4lDQogIGZpbHRlcighaXMubmEobWFjcm9fYXJlYSkpICU+JQ0KICBncm91cF9ieShtYWNyb19hcmVhKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGF2Z19zaXplID0gc3VtKGZhbWlseV9zaXplICogd2VpZ2h0LCBuYS5ybSA9IFRSVUUpIC8gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICBob3VzZWhvbGRzID0gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KY2F0KCI9PT0gTWFjcm8gQXJlYSBDb21wYXJpc29uID09PVxuIikNCnByaW50KG1hY3JvX3N0YXRzKQ0KDQojIEJ5IHJpcGFydGl6aW9uZQ0KcmlwX3N0YXRzIDwtIGZhbWlseV9zaXplICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHJpcCkpICU+JQ0KICBncm91cF9ieShyaXApICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX3NpemUgPSBzdW0oZmFtaWx5X3NpemUgKiB3ZWlnaHQsIG5hLnJtID0gVFJVRSkgLyBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIGhvdXNlaG9sZHMgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHJpcF9uYW1lID0gcmlwX25hbWVzW2FzLmNoYXJhY3RlcihyaXApXSkNCg0KY2F0KCJcbj09PSBCeSBSaXBhcnRpemlvbmUgPT09XG4iKQ0KcHJpbnQocmlwX3N0YXRzKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIG5vcnRoX3NvdXRoX3Bsb3QsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQ0KZ2dwbG90KHJpcF9zdGF0cywgYWVzKHggPSByZW9yZGVyKHJpcF9uYW1lLCAtYXZnX3NpemUpLCB5ID0gYXZnX3NpemUpKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gcmlwX25hbWUpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHdlaWdodGVkX2F2ZywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjJmIiwgYXZnX3NpemUpKSwgdmp1c3QgPSAtMC41LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSA1LCB5ID0gd2VpZ2h0ZWRfYXZnICsgMC4wNSwgbGFiZWwgPSAiTmF0aW9uYWwgQXZlcmFnZSIsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBGYW1pbHkgU2l6ZSBieSBSaXBhcnRpemlvbmUgKFdlaWdodGVkKSIsDQogICAgICAgeCA9ICIiLCB5ID0gIkF2ZXJhZ2UgRmFtaWx5IFNpemUgKG1lbWJlcnMpIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLS0tDQoNCiMgMy4gRmVtYWxlIEVtcGxveW1lbnQgUmF0ZSAoV2VpZ2h0ZWQpDQoNCmBgYHtyIGZlbWFsZV9lbXBsb3ltZW50fQ0KIyBXb3JraW5nLWFnZSBmZW1hbGVzICgxNS02NCkNCndvcmtpbmdfYWdlX2ZlbWFsZXMgPC0gZGF0YV9hZHVsdCAlPiUNCiAgZmlsdGVyKGRlbW9fZmVtYWxlID09IDEsIGRlbW9fYWdlID49IDE1LCBkZW1vX2FnZSA8PSA2NCkNCg0KdG90YWxfZmVtYWxlcyA8LSBzdW0od29ya2luZ19hZ2VfZmVtYWxlcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmVtcGxveWVkX2ZlbWFsZXMgPC0gc3VtKHdvcmtpbmdfYWdlX2ZlbWFsZXMkd2VpZ2h0W3dvcmtpbmdfYWdlX2ZlbWFsZXMkZGVtb19lbXBsID09IDFdLCBuYS5ybSA9IFRSVUUpDQoNCmVtcF9yYXRlX2l0YWx5IDwtIGVtcGxveWVkX2ZlbWFsZXMgLyB0b3RhbF9mZW1hbGVzICogMTAwDQoNCmNhdCgiPT09IElUQUxZID09PVxuIikNCmNhdCgiRW1wbG95bWVudCBSYXRlOiIsIHJvdW5kKGVtcF9yYXRlX2l0YWx5LCAyKSwgIiVcbiIpDQpjYXQoIkVtcGxveWVkIGZlbWFsZXM6IiwgZm9ybWF0KGVtcGxveWVkX2ZlbWFsZXMsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIldvcmtpbmctYWdlIGZlbWFsZXM6IiwgZm9ybWF0KHRvdGFsX2ZlbWFsZXMsIGJpZy5tYXJrPSIsIiksICJcbiIpDQoNCiMgTG9tYmFyZHkNCmxvbV9mZW1hbGVzIDwtIHdvcmtpbmdfYWdlX2ZlbWFsZXMgJT4lIGZpbHRlcihyZWcgPT0gNDEpDQp0b3RhbF9sb21fZmVtIDwtIHN1bShsb21fZmVtYWxlcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmVtcGxveWVkX2xvbSA8LSBzdW0obG9tX2ZlbWFsZXMkd2VpZ2h0W2xvbV9mZW1hbGVzJGRlbW9fZW1wbCA9PSAxXSwgbmEucm0gPSBUUlVFKQ0KZW1wX3JhdGVfbG9tIDwtIGVtcGxveWVkX2xvbSAvIHRvdGFsX2xvbV9mZW0gKiAxMDANCg0KY2F0KCJcbj09PSBMT01CQVJEWSA9PT1cbiIpDQpjYXQoIkVtcGxveW1lbnQgUmF0ZToiLCByb3VuZChlbXBfcmF0ZV9sb20sIDIpLCAiJVxuIikNCmNhdCgiRW1wbG95ZWQgZmVtYWxlczoiLCBmb3JtYXQoZW1wbG95ZWRfbG9tLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KY2F0KCJXb3JraW5nLWFnZSBmZW1hbGVzOiIsIGZvcm1hdCh0b3RhbF9sb21fZmVtLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KDQojIEJ5IFJpcGFydGl6aW9uZQ0KZW1wX2J5X3JpcCA8LSB3b3JraW5nX2FnZV9mZW1hbGVzICU+JQ0KICBncm91cF9ieShyaXApICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZW1wbG95ZWQgPSBzdW0od2VpZ2h0W2RlbW9fZW1wbCA9PSAxXSwgbmEucm0gPSBUUlVFKSwNCiAgICB0b3RhbCA9IHN1bSh3ZWlnaHQsIG5hLnJtID0gVFJVRSksDQogICAgcmF0ZSA9IGVtcGxveWVkIC8gdG90YWwgKiAxMDAsDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUocmlwX25hbWUgPSByaXBfbmFtZXNbYXMuY2hhcmFjdGVyKHJpcCldKQ0KDQpjYXQoIlxuPT09IEJ5IFJpcGFydGl6aW9uZSA9PT1cbiIpDQpwcmludChlbXBfYnlfcmlwKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIGVtcGxveW1lbnRfcGxvdCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9DQpnZ3Bsb3QoZW1wX2J5X3JpcCwgYWVzKHggPSByZW9yZGVyKHJpcF9uYW1lLCAtcmF0ZSksIHkgPSByYXRlKSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IHJpcF9uYW1lKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBlbXBfcmF0ZV9pdGFseSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjFmJSUiLCByYXRlKSksIHZqdXN0ID0gLTAuNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gNSwgeSA9IGVtcF9yYXRlX2l0YWx5ICsgMiwgbGFiZWwgPSAiTmF0aW9uYWwgQXZlcmFnZSIsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiRmVtYWxlIEVtcGxveW1lbnQgUmF0ZSAoMTUtNjQpIGJ5IFJpcGFydGl6aW9uZSAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiRW1wbG95bWVudCBSYXRlICglKSIpICsNCiAgeWxpbSgwLCA3MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLS0tDQoNCiMgNC4gRGlzdHJpYnV0aW9uIG9mIENoaWxkcmVuIHBlciBGYW1pbHkgKFdlaWdodGVkKQ0KDQoqKk5vdGUqKjogQ2hpbGRyZW4gZGF0YXNldCBjb250YWlucyBvbmx5IGFnZXMgMC02DQoNCmBgYHtyIGNoaWxkcmVuX2Rpc3RyaWJ1dGlvbn0NCiMgSG91c2Vob2xkIGluZm8NCmhvdXNlaG9sZF9pbmZvIDwtIGRhdGFfYWR1bHQgJT4lDQogIGZpbHRlcihkZW1vX3JlbHBhciA9PSAxKSAlPiUNCiAgc2VsZWN0KGhoaWQsIHdlaWdodCwgcmVnLCByaXApDQoNCiMgQ291bnQgY2hpbGRyZW4gcGVyIGZhbWlseQ0KY2hpbGRyZW5fcGVyX2ZhbWlseSA8LSBkYXRhX2NoaWxkcmVuICU+JQ0KICBncm91cF9ieShwcm9mYW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbl9jaGlsZHJlbiA9IG4oKSwNCiAgICBjb2VmaW4gPSBmaXJzdChjb2VmaW4pLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHdlaWdodCA9IGNvZWZpbiAvIDEwMDAwKSAlPiUNCiAgcmVuYW1lKGhoaWQgPSBwcm9mYW0pICU+JQ0KICBsZWZ0X2pvaW4oDQogICAgZGF0YV9hZHVsdCAlPiUgZmlsdGVyKGRlbW9fcmVscGFyID09IDEpICU+JSANCiAgICAgIHNlbGVjdChoaGlkLCByZWcsIHJpcCkgJT4lIGRpc3RpbmN0KCksDQogICAgYnkgPSAiaGhpZCINCiAgKQ0KDQp0b3RhbF9mYW1fY2hpbGRyZW4gPC0gc3VtKGNoaWxkcmVuX3Blcl9mYW1pbHkkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQoNCmNhdCgiPT09IElUQUxZIC0gRmFtaWxpZXMgd2l0aCBDaGlsZHJlbiAoMC02KSA9PT1cbiIpDQpjYXQoIlRvdGFsIGZhbWlsaWVzOiIsIGZvcm1hdCh0b3RhbF9mYW1fY2hpbGRyZW4sIGJpZy5tYXJrPSIsIiksICJcblxuIikNCg0KY2hpbGRyZW5fZGlzdCA8LSBjaGlsZHJlbl9wZXJfZmFtaWx5ICU+JQ0KICBncm91cF9ieShuX2NoaWxkcmVuKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGZhbWlsaWVzID0gc3VtKHdlaWdodCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gZmFtaWxpZXMgLyB0b3RhbF9mYW1fY2hpbGRyZW4gKiAxMDApDQoNCnByaW50KGNoaWxkcmVuX2Rpc3QpDQoNCndlaWdodGVkX2F2Z19jaGlsZHJlbiA8LSBzdW0oY2hpbGRyZW5fcGVyX2ZhbWlseSRuX2NoaWxkcmVuICogY2hpbGRyZW5fcGVyX2ZhbWlseSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkgLyANCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY2hpbGRyZW5fcGVyX2ZhbWlseSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiXG5XZWlnaHRlZCBhdmVyYWdlOiIsIHJvdW5kKHdlaWdodGVkX2F2Z19jaGlsZHJlbiwgMiksICJjaGlsZHJlbiBwZXIgZmFtaWx5XG4iKQ0KDQojIExvbWJhcmR5DQpsb21fY2hpbGRyZW5fZmFtIDwtIGNoaWxkcmVuX3Blcl9mYW1pbHkgJT4lIGZpbHRlcihyZWcgPT0gNDEpDQp0b3RhbF9sb21fZmFtIDwtIHN1bShsb21fY2hpbGRyZW5fZmFtJHdlaWdodCwgbmEucm0gPSBUUlVFKQ0KDQpjYXQoIlxuPT09IExPTUJBUkRZIC0gRmFtaWxpZXMgd2l0aCBDaGlsZHJlbiAoMC02KSA9PT1cbiIpDQpjYXQoIlRvdGFsIGZhbWlsaWVzOiIsIGZvcm1hdCh0b3RhbF9sb21fZmFtLCBiaWcubWFyaz0iLCIpLCAiXG5cbiIpDQoNCmxvbV9jaGlsZHJlbl9kaXN0IDwtIGxvbV9jaGlsZHJlbl9mYW0gJT4lDQogIGdyb3VwX2J5KG5fY2hpbGRyZW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZmFtaWxpZXMgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSBmYW1pbGllcyAvIHRvdGFsX2xvbV9mYW0gKiAxMDApDQoNCnByaW50KGxvbV9jaGlsZHJlbl9kaXN0KQ0KDQp3ZWlnaHRlZF9hdmdfbG9tX2NoaWxkIDwtIHN1bShsb21fY2hpbGRyZW5fZmFtJG5fY2hpbGRyZW4gKiBsb21fY2hpbGRyZW5fZmFtJHdlaWdodCwgbmEucm0gPSBUUlVFKSAvIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0obG9tX2NoaWxkcmVuX2ZhbSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmNhdCgiXG5XZWlnaHRlZCBhdmVyYWdlOiIsIHJvdW5kKHdlaWdodGVkX2F2Z19sb21fY2hpbGQsIDIpLCAiY2hpbGRyZW4gcGVyIGZhbWlseVxuIikNCg0KIyBBbGwgZmFtaWxpZXMgKGluY2x1ZGluZyB0aG9zZSB3aXRob3V0IGNoaWxkcmVuIDAtNikNCmFsbF9mYW1pbGllcyA8LSBob3VzZWhvbGRfaW5mbyAlPiUNCiAgbGVmdF9qb2luKGNoaWxkcmVuX3Blcl9mYW1pbHkgJT4lIHNlbGVjdChoaGlkLCBuX2NoaWxkcmVuKSwgYnkgPSAiaGhpZCIpICU+JQ0KICBtdXRhdGUobl9jaGlsZHJlbiA9IGlmZWxzZShpcy5uYShuX2NoaWxkcmVuKSwgMCwgbl9jaGlsZHJlbikpDQoNCnRvdGFsX2FsbF9mYW0gPC0gc3VtKGFsbF9mYW1pbGllcyR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCg0KY2F0KCJcbj09PSBBTEwgRkFNSUxJRVMgKGluY2x1ZGluZyB3aXRob3V0IGNoaWxkcmVuIDAtNikgPT09XG4iKQ0KY2F0KCJUb3RhbCBmYW1pbGllczoiLCBmb3JtYXQodG90YWxfYWxsX2ZhbSwgYmlnLm1hcms9IiwiKSwgIlxuXG4iKQ0KDQphbGxfY2hpbGRyZW5fZGlzdCA8LSBhbGxfZmFtaWxpZXMgJT4lDQogIGdyb3VwX2J5KG5fY2hpbGRyZW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZmFtaWxpZXMgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSBmYW1pbGllcyAvIHRvdGFsX2FsbF9mYW0gKiAxMDApDQoNCnByaW50KGhlYWQoYWxsX2NoaWxkcmVuX2Rpc3QsIDYpKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIGNoaWxkcmVuX3Bsb3QsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD01fQ0KcDEgPC0gZ2dwbG90KGNoaWxkcmVuX2Rpc3QsIGFlcyh4ID0gZmFjdG9yKG5fY2hpbGRyZW4pLCB5ID0gZmFtaWxpZXMvMWUzKSkgKw0KICBnZW9tX2NvbChmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMGZLIiwgZmFtaWxpZXMvMWUzKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJDaGlsZHJlbiBwZXIgRmFtaWx5IC0gQW1vbmcgRmFtaWxpZXMgd2l0aCBDaGlsZHJlbiAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBDaGlsZHJlbiAoMC02KSIsIHkgPSAiRmFtaWxpZXMgKHRob3VzYW5kcykiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpDQoNCnAyIDwtIGdncGxvdChoZWFkKGFsbF9jaGlsZHJlbl9kaXN0LCA1KSwgYWVzKHggPSBmYWN0b3Iobl9jaGlsZHJlbiksIHkgPSBmYW1pbGllcy8xZTYpKSArDQogIGdlb21fY29sKGZpbGwgPSAiY29yYWwiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjJmTSIsIGZhbWlsaWVzLzFlNikpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiQ2hpbGRyZW4gcGVyIEZhbWlseSAtIEFsbCBGYW1pbGllcyAoV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBDaGlsZHJlbiAoMC02KSIsIHkgPSAiRmFtaWxpZXMgKG1pbGxpb25zKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkNCg0KZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sID0gMikNCmBgYA0KDQotLS0NCg0KIyA1LiBXb3JraW5nIE1vdGhlcnMgKFdlaWdodGVkKQ0KDQpgYGB7ciB3b3JraW5nX21vdGhlcnN9DQojIEVtcGxveWVkIGZlbWFsZXMgYWdlZCAxNS02NA0KZW1wbG95ZWRfZmVtYWxlc19kYXRhIDwtIGRhdGFfYWR1bHQgJT4lDQogIGZpbHRlcihkZW1vX2ZlbWFsZSA9PSAxLCBkZW1vX2VtcGwgPT0gMSwgZGVtb19hZ2UgPj0gMTUsIGRlbW9fYWdlIDw9IDY0KQ0KDQp0b3RhbF9lbXBfd29tZW4gPC0gc3VtKGVtcGxveWVkX2ZlbWFsZXNfZGF0YSR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCndvcmtpbmdfbW90aGVycyA8LSBzdW0oZW1wbG95ZWRfZmVtYWxlc19kYXRhJHdlaWdodFtlbXBsb3llZF9mZW1hbGVzX2RhdGEkZGVtb19tb3RoZXIgPT0gMV0sIG5hLnJtID0gVFJVRSkNCg0KbW90aGVyc19zaGFyZV9pdGFseSA8LSB3b3JraW5nX21vdGhlcnMgLyB0b3RhbF9lbXBfd29tZW4gKiAxMDANCg0KY2F0KCI9PT0gSVRBTFkgPT09XG4iKQ0KY2F0KCJUb3RhbCBlbXBsb3llZCB3b21lbjoiLCBmb3JtYXQodG90YWxfZW1wX3dvbWVuLCBiaWcubWFyaz0iLCIpLCAiXG4iKQ0KY2F0KCJXb3JraW5nIG1vdGhlcnM6IiwgZm9ybWF0KHdvcmtpbmdfbW90aGVycywgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiU2hhcmU6Iiwgcm91bmQobW90aGVyc19zaGFyZV9pdGFseSwgMiksICIlXG4iKQ0KDQojIExvbWJhcmR5DQpsb21fZW1wIDwtIGVtcGxveWVkX2ZlbWFsZXNfZGF0YSAlPiUgZmlsdGVyKHJlZyA9PSA0MSkNCnRvdGFsX2xvbV9lbXAgPC0gc3VtKGxvbV9lbXAkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQpsb21fbW90aGVycyA8LSBzdW0obG9tX2VtcCR3ZWlnaHRbbG9tX2VtcCRkZW1vX21vdGhlciA9PSAxXSwgbmEucm0gPSBUUlVFKQ0KbW90aGVyc19zaGFyZV9sb20gPC0gbG9tX21vdGhlcnMgLyB0b3RhbF9sb21fZW1wICogMTAwDQoNCmNhdCgiXG49PT0gTE9NQkFSRFkgPT09XG4iKQ0KY2F0KCJUb3RhbCBlbXBsb3llZCB3b21lbjoiLCBmb3JtYXQodG90YWxfbG9tX2VtcCwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiV29ya2luZyBtb3RoZXJzOiIsIGZvcm1hdChsb21fbW90aGVycywgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiU2hhcmU6Iiwgcm91bmQobW90aGVyc19zaGFyZV9sb20sIDIpLCAiJVxuIikNCg0KIyBCeSBSaXBhcnRpemlvbmUNCm1vdGhlcnNfYnlfcmlwIDwtIGVtcGxveWVkX2ZlbWFsZXNfZGF0YSAlPiUNCiAgZ3JvdXBfYnkocmlwKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHdvcmtpbmdfbW90aGVycyA9IHN1bSh3ZWlnaHRbZGVtb19tb3RoZXIgPT0gMV0sIG5hLnJtID0gVFJVRSksDQogICAgdG90YWxfZW1wbG95ZWQgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIHNoYXJlID0gd29ya2luZ19tb3RoZXJzIC8gdG90YWxfZW1wbG95ZWQgKiAxMDAsDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUocmlwX25hbWUgPSByaXBfbmFtZXNbYXMuY2hhcmFjdGVyKHJpcCldKQ0KDQpjYXQoIlxuPT09IEJ5IFJpcGFydGl6aW9uZSA9PT1cbiIpDQpwcmludChtb3RoZXJzX2J5X3JpcCkNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbg0KDQpgYGB7ciBtb3RoZXJzX3Bsb3QsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQ0KZ2dwbG90KG1vdGhlcnNfYnlfcmlwLCBhZXMoeCA9IHJlb3JkZXIocmlwX25hbWUsIC1zaGFyZSksIHkgPSBzaGFyZSkpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSByaXBfbmFtZSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW90aGVyc19zaGFyZV9pdGFseSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjFmJSUiLCBzaGFyZSkpLCB2anVzdCA9IC0wLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDUsIHkgPSBtb3RoZXJzX3NoYXJlX2l0YWx5ICsgMS41LCBsYWJlbCA9ICJOYXRpb25hbCBBdmVyYWdlIiwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJXb3JraW5nIE1vdGhlcnMgQW1vbmcgRW1wbG95ZWQgV29tZW4gYnkgUmlwYXJ0aXppb25lIChXZWlnaHRlZCkiLA0KICAgICAgIHggPSAiIiwgeSA9ICJTaGFyZSBvZiBXb3JraW5nIE1vdGhlcnMgKCUpIikgKw0KICB5bGltKDAsIDgwKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAxNSwgaGp1c3QgPSAxKSkNCmBgYA0KDQotLS0NCg0KIyA2LiBQcmUtU2Nob29sIEF0dGVuZGFuY2UgKFdlaWdodGVkKQ0KDQoqKk5vdGUqKjogQ2hpbGRyZW4gZGF0YXNldCBjb250YWlucyBPTkxZIGFnZXMgMC02DQoNCmBgYHtyIHByZXNjaG9vbH0NCnRvdGFsX2NoaWxkcmVuIDwtIHN1bShkYXRhX2NoaWxkcmVuJHdlaWdodCwgbmEucm0gPSBUUlVFKQ0KDQojIE1lcmdlIHdpdGggaG91c2Vob2xkIGluZm8NCmNoaWxkcmVuX3dpdGhfcmVnaW9uIDwtIGRhdGFfY2hpbGRyZW4gJT4lDQogIGxlZnRfam9pbigNCiAgICBkYXRhX2FkdWx0ICU+JSBmaWx0ZXIoZGVtb19yZWxwYXIgPT0gMSkgJT4lIA0KICAgICAgc2VsZWN0KGhoaWQsIHJlZywgcmlwKSAlPiUgZGlzdGluY3QoKSwNCiAgICBieSA9IGMoInByb2ZhbSIgPSAiaGhpZCIpDQogICkNCg0KIyBGb3JtYWwgY2hpbGRjYXJlDQphdHRlbmRpbmdfZm9ybWFsIDwtIHN1bShjaGlsZHJlbl93aXRoX3JlZ2lvbiR3ZWlnaHRbY2hpbGRyZW5fd2l0aF9yZWdpb24kY2hpbGRjYXJlX2Zvcm1hbCA9PSAxXSwgbmEucm0gPSBUUlVFKQ0Kbm90X2F0dGVuZGluZyA8LSBzdW0oY2hpbGRyZW5fd2l0aF9yZWdpb24kd2VpZ2h0W2NoaWxkcmVuX3dpdGhfcmVnaW9uJGNoaWxkY2FyZV9mb3JtYWwgPT0gMF0sIG5hLnJtID0gVFJVRSkNCg0KYXR0ZW5kYW5jZV9yYXRlIDwtIGF0dGVuZGluZ19mb3JtYWwgLyB0b3RhbF9jaGlsZHJlbiAqIDEwMA0KDQpjYXQoIj09PSBJVEFMWSA9PT1cbiIpDQpjYXQoIlRvdGFsIGNoaWxkcmVuICgwLTYpOiIsIGZvcm1hdCh0b3RhbF9jaGlsZHJlbiwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiQ2hpbGRyZW4gaW4gZm9ybWFsIGNoaWxkY2FyZToiLCBmb3JtYXQoYXR0ZW5kaW5nX2Zvcm1hbCwgYmlnLm1hcms9IiwiKSwgIlxuIikNCmNhdCgiQ2hpbGRyZW4gbm90IGluIGZvcm1hbCBjaGlsZGNhcmU6IiwgZm9ybWF0KG5vdF9hdHRlbmRpbmcsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIkF0dGVuZGFuY2UgcmF0ZToiLCByb3VuZChhdHRlbmRhbmNlX3JhdGUsIDIpLCAiJVxuIikNCg0KIyBCeSB0eXBlIG9mIGNhcmUNCmNhcmVfdHlwZXMgPC0gY2hpbGRyZW5fd2l0aF9yZWdpb24gJT4lDQogIGdyb3VwX2J5KGNhcmVfZW5yb2xsZWQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgY2hpbGRyZW4gPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHBlcmNlbnRhZ2UgPSBjaGlsZHJlbiAvIHRvdGFsX2NoaWxkcmVuICogMTAwLA0KICAgIGNhcmVfdHlwZSA9IGNhc2Vfd2hlbigNCiAgICAgIGNhcmVfZW5yb2xsZWQgPT0gMSB+ICJBc2lsbyBOaWRvIChOdXJzZXJ5LCAwLTIpIiwNCiAgICAgIGNhcmVfZW5yb2xsZWQgPT0gMTQgfiAiTm90IGVucm9sbGVkIiwNCiAgICAgIGNhcmVfZW5yb2xsZWQgPT0gMTUgfiAiU2N1b2xhIEluZmFuemlhIChLaW5kZXJnYXJ0ZW4sIDMtNSkiLA0KICAgICAgY2FyZV9lbnJvbGxlZCA9PSAxNiB+ICJTY3VvbGEgUHJpbWFyaWEgKFByaW1hcnksIDYrKSIsDQogICAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKGNhcmVfZW5yb2xsZWQpDQogICAgKQ0KICApDQoNCmNhdCgiXG49PT0gQnkgVHlwZSBvZiBDYXJlID09PVxuIikNCnByaW50KGNhcmVfdHlwZXMgJT4lIHNlbGVjdChjYXJlX3R5cGUsIGNoaWxkcmVuLCBwZXJjZW50YWdlKSkNCg0KIyBQcmUtc2Nob29sIHNwZWNpZmljDQpwcmVzY2hvb2xfcmF0ZSA8LSBzdW0oY2hpbGRyZW5fd2l0aF9yZWdpb24kd2VpZ2h0W2NoaWxkcmVuX3dpdGhfcmVnaW9uJGNhcmVfZW5yb2xsZWQgJWluJSBjKDEsIDE1KV0sIG5hLnJtID0gVFJVRSkgLyANCiAgICAgICAgICAgICAgICAgIHRvdGFsX2NoaWxkcmVuICogMTAwDQpjYXQoIlxuUHJlLXNjaG9vbCAoQXNpbG8gTmlkbyArIFNjdW9sYSBJbmZhbnppYSkgcmF0ZToiLCByb3VuZChwcmVzY2hvb2xfcmF0ZSwgMiksICIlXG4iKQ0KDQojIExvbWJhcmR5DQpsb21fY2hpbGRyZW4gPC0gY2hpbGRyZW5fd2l0aF9yZWdpb24gJT4lIGZpbHRlcihyZWcgPT0gNDEpDQp0b3RhbF9sb21fY2hpbGQgPC0gc3VtKGxvbV9jaGlsZHJlbiR3ZWlnaHQsIG5hLnJtID0gVFJVRSkNCmxvbV9hdHRlbmRpbmcgPC0gc3VtKGxvbV9jaGlsZHJlbiR3ZWlnaHRbbG9tX2NoaWxkcmVuJGNoaWxkY2FyZV9mb3JtYWwgPT0gMV0sIG5hLnJtID0gVFJVRSkNCmxvbV9hdHRlbmRhbmNlIDwtIGxvbV9hdHRlbmRpbmcgLyB0b3RhbF9sb21fY2hpbGQgKiAxMDANCg0KY2F0KCJcbj09PSBMT01CQVJEWSA9PT1cbiIpDQpjYXQoIlRvdGFsIGNoaWxkcmVuICgwLTYpOiIsIGZvcm1hdCh0b3RhbF9sb21fY2hpbGQsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIkNoaWxkcmVuIGluIGZvcm1hbCBjaGlsZGNhcmU6IiwgZm9ybWF0KGxvbV9hdHRlbmRpbmcsIGJpZy5tYXJrPSIsIiksICJcbiIpDQpjYXQoIkF0dGVuZGFuY2UgcmF0ZToiLCByb3VuZChsb21fYXR0ZW5kYW5jZSwgMiksICIlXG4iKQ0KDQojIEJ5IFJpcGFydGl6aW9uZQ0KYXR0ZW5kYW5jZV9ieV9yaXAgPC0gY2hpbGRyZW5fd2l0aF9yZWdpb24gJT4lDQogIGdyb3VwX2J5KHJpcCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBhdHRlbmRpbmcgPSBzdW0od2VpZ2h0W2NoaWxkY2FyZV9mb3JtYWwgPT0gMV0sIG5hLnJtID0gVFJVRSksDQogICAgdG90YWwgPSBzdW0od2VpZ2h0LCBuYS5ybSA9IFRSVUUpLA0KICAgIHJhdGUgPSBhdHRlbmRpbmcgLyB0b3RhbCAqIDEwMCwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShyaXBfbmFtZSA9IHJpcF9uYW1lc1thcy5jaGFyYWN0ZXIocmlwKV0pDQoNCmNhdCgiXG49PT0gQnkgUmlwYXJ0aXppb25lID09PVxuIikNCnByaW50KGF0dGVuZGFuY2VfYnlfcmlwKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCmBgYHtyIHByZXNjaG9vbF9wbG90LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0NCmdncGxvdChhdHRlbmRhbmNlX2J5X3JpcCwgYWVzKHggPSByZW9yZGVyKHJpcF9uYW1lLCAtcmF0ZSksIHkgPSByYXRlKSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IHJpcF9uYW1lKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdHRlbmRhbmNlX3JhdGUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3ByaW50ZigiJS4xZiUlIiwgcmF0ZSkpLCB2anVzdCA9IC0wLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDUsIHkgPSBhdHRlbmRhbmNlX3JhdGUgKyAyLCBsYWJlbCA9ICJOYXRpb25hbCBBdmVyYWdlIiwgc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJQcmUtU2Nob29sIEF0dGVuZGFuY2UgUmF0ZSBieSBSaXBhcnRpemlvbmUgKENoaWxkcmVuIDAtNiwgV2VpZ2h0ZWQpIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiQXR0ZW5kYW5jZSBSYXRlICglKSIpICsNCiAgeWxpbSgwLCA3MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLS0tDQoNCiMgU3VtbWFyeSBTdGF0aXN0aWNzIFRhYmxlDQoNCmBgYHtyIHN1bW1hcnlfdGFibGV9DQpzdW1tYXJ5X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgSW5kaWNhdG9yID0gYygNCiAgICAiVG90YWwgaG91c2Vob2xkcyAobWlsbGlvbnMpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoSXRhbHkpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoTG9tYmFyZHkpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoTm9ydGgpIiwNCiAgICAiQXZlcmFnZSBmYW1pbHkgc2l6ZSAoU291dGgpIiwNCiAgICAiRmVtYWxlIGVtcGxveW1lbnQgcmF0ZSAtIEl0YWx5ICglKSIsDQogICAgIkZlbWFsZSBlbXBsb3ltZW50IHJhdGUgLSBMb21iYXJkeSAoJSkiLA0KICAgICJGZW1hbGUgZW1wbG95bWVudCByYXRlIC0gTm9ydGggKCUpIiwNCiAgICAiRmVtYWxlIGVtcGxveW1lbnQgcmF0ZSAtIFNvdXRoICglKSIsDQogICAgIldvcmtpbmcgbW90aGVycyBzaGFyZSAtIEl0YWx5ICglKSIsDQogICAgIldvcmtpbmcgbW90aGVycyBzaGFyZSAtIFN1ZCAoJSkiLA0KICAgICJQcmUtc2Nob29sIGF0dGVuZGFuY2UgLSBJdGFseSAoJSkiLA0KICAgICJQcmUtc2Nob29sIGF0dGVuZGFuY2UgLSBMb21iYXJkeSAoJSkiLA0KICAgICJDaGlsZHJlbiAoMC02KSBwZXIgZmFtaWx5ICh3aXRoIGNoaWxkcmVuKSINCiAgKSwNCiAgVmFsdWUgPSBjKA0KICAgIHJvdW5kKHRvdGFsX2hvdXNlaG9sZHMvMWU2LCAyKSwNCiAgICByb3VuZCh3ZWlnaHRlZF9hdmcsIDIpLA0KICAgIHJvdW5kKHdlaWdodGVkX2F2Z19sb20sIDIpLA0KICAgIHJvdW5kKG1hY3JvX3N0YXRzJGF2Z19zaXplW21hY3JvX3N0YXRzJG1hY3JvX2FyZWEgPT0gIk5vcnRoIl0sIDIpLA0KICAgIHJvdW5kKG1hY3JvX3N0YXRzJGF2Z19zaXplW21hY3JvX3N0YXRzJG1hY3JvX2FyZWEgPT0gIlNvdXRoIl0sIDIpLA0KICAgIHJvdW5kKGVtcF9yYXRlX2l0YWx5LCAyKSwNCiAgICByb3VuZChlbXBfcmF0ZV9sb20sIDIpLA0KICAgIHJvdW5kKG1lYW4oZW1wX2J5X3JpcCRyYXRlW2VtcF9ieV9yaXAkcmlwICVpbiUgYygxLDIpXSksIDIpLA0KICAgIHJvdW5kKG1lYW4oZW1wX2J5X3JpcCRyYXRlW2VtcF9ieV9yaXAkcmlwICVpbiUgYyg0LDUpXSksIDIpLA0KICAgIHJvdW5kKG1vdGhlcnNfc2hhcmVfaXRhbHksIDIpLA0KICAgIHJvdW5kKG1vdGhlcnNfYnlfcmlwJHNoYXJlW21vdGhlcnNfYnlfcmlwJHJpcCA9PSA0XSwgMiksDQogICAgcm91bmQoYXR0ZW5kYW5jZV9yYXRlLCAyKSwNCiAgICByb3VuZChsb21fYXR0ZW5kYW5jZSwgMiksDQogICAgcm91bmQod2VpZ2h0ZWRfYXZnX2NoaWxkcmVuLCAyKQ0KICApDQopDQoNCmthYmxlKHN1bW1hcnlfZGF0YSwgY2FwdGlvbiA9ICJLZXkgSW5kaWNhdG9ycyBTdW1tYXJ5IChXZWlnaHRlZCkiKQ0KYGBgDQoNCi0tLQ0KDQoqUmVwb3J0IGdlbmVyYXRlZDogYHIgU3lzLkRhdGUoKWAqDQoNCipBbGwgYW5hbHlzZXMgdXNlIHByb3BlciBwb3B1bGF0aW9uIHdlaWdodHMgKGNvZWZpbi8xMCwwMDApKg0KDQoNCiMgUG9pbnRzIG9mIERpc2N1c3Npb24NCg0KMS4gVGhlIEFWUSBzdXJ2ZXkgZG9lc24ndCBoYXZlIGFueSBxdWVzdGlvbnMgcmVnYXJkaW5nIHJlbGlnaW91cyBzdGFuY2Ugb3IgY29uc2VydmF0aXZlbmVzcy4gSSB3YXMgdGhpbmtpbmcgdGhhdCBtYXliZSB0aGlzIGNhbiBiZSBwcm94aWVkIHdpdGggRXVyb3NrZXB0aWNpc20/DQoNCiAgYS4gVGhlcmUgaXMgYSBxdWVzdGlvbiBhc2tpbmcgYWJvdXQgJ2hvdyBtdWNoIGRvIHlvdSBiZWxpZXZlIGluOiBFdXJvcGVhbiBQYXJsaWFtZW50PycNCiAgDQogIGIuIFRoZXJlIGFyZSBhbHNvIHNldmVyYWwgcXVlc3Rpb25zIGFza2luZyB0aGUgcGVyY2VwdGlvbiBvZiBzZXZlcmFsIGRpc29yZGVycyBvbiB0aGVpciBjb21tdW5pdHksIHN1Y2ggYXM6DQogIA0KICAtIEhvdyBzYWZlIGRvIHlvdSBmZWVsIHdhbGtpbmcgb24gdGhlIHN0cmVldCB3aGVuIGl0J3MgZGFyayBhbmQgeW91J3JlIGFsb25lIGluIHRoZSBhcmVhIHdoZXJlIHlvdSBsaXZlPw0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IHBlb3BsZSB1c2luZyBkcnVncw0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IHBlb3BsZSBkZWFsaW5nIGRydWdzDQogIA0KICAtIEluIHRoZSBhcmVhIHdoZXJlIHlvdSBsaXZlLCBob3cgb2Z0ZW4gZG8geW91IHNlZTogcHJvc3RpdHV0ZXMgbG9va2luZyBmb3IgY2xpZW50cw0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IGFjdHMgb2YgdmFuZGFsaXNtIGFnYWluc3QgcHVibGljIHByb3BlcnR5IChicm9rZW4gcGhvbmUgYm9vdGhzLCB0cmFzaCBiaW5zLCBldGMuKQ0KICANCiAgLSBJbiB0aGUgYXJlYSB3aGVyZSB5b3UgbGl2ZSwgaG93IG9mdGVuIGRvIHlvdSBzZWU6IHZhZ3JhbnRzLCBwZW9wbGUgd2l0aCBubyBmaXhlZCBhZGRyZXNzICAtIA==