1. Introduction
  2. Research Objectives
  3. Data & Method Overview
  4. Conjoint Analysis
  5. Brand Perceptions & Attitudes toward UNO
  6. Purchase Intent & Willingness to Pay
  7. Consumer Segmentation (Demographics)
  8. Managerial Implications
  9. Limitations & Conclusion
library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)
library(broom)
library(forcats)

excel_path <- "UNO Survey Responses v4.xlsx"

1 Data Import (from scratch, explicit)

# Conjoint (individual-level)
conjointData <- read_excel(excel_path, sheet = "Conjoint_Long")

# UNO Brand & Attitudes (aggregated)
uno_q1 <- read_excel(excel_path, sheet = "UNO Question1")
uno_q2 <- read_excel(excel_path, sheet = "UNO Question2")
uno_q3 <- read_excel(excel_path, sheet = "UNO Question3")

# Demographics (aggregated)
ageData <- read_excel(excel_path, sheet = "Age")
incomeData <- read_excel(excel_path, sheet = "Income")
genderData <- read_excel(excel_path, sheet = "Gender")
educationData <- read_excel(excel_path, sheet = "Education")

Rule:
- conjointData → modeling
- everything else → visualization & interpretation


2 1. Introduction

The packaged bread market has evolved beyond basic functional needs, with consumers increasingly valuing health, quality, sustainability, and premium cues. UNO is a leading brand in this category and is well positioned to explore premium product extensions.

The objective of this study is to analyze consumer perceptions, behavioral intentions, and product attribute trade-offs related to packaged bread, with a specific focus on UNO. The analysis combines survey-based descriptive insights with a rating-based conjoint model to derive actionable managerial implications.

3 2. Conjoint Analysis

rating_model <- lm(
  Rating ~ Bread_Type + Slice_Type + Package_Type + Price,
  data = conjointData
)

summary(rating_model)
## 
## Call:
## lm(formula = Rating ~ Bread_Type + Slice_Type + Package_Type + 
##     Price, data = conjointData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.3940 -1.4284 -0.2546  1.3089  4.8860 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              4.10782    0.17067  24.069  < 2e-16 ***
## Bread_TypeTraditional   -0.01912    0.12146  -0.157  0.87496    
## Bread_TypeWhole grain    0.38851    0.12146   3.199  0.00141 ** 
## Slice_TypeThick         -0.29523    0.12207  -2.419  0.01570 *  
## Slice_TypeThin          -0.37151    0.12740  -2.916  0.00360 ** 
## Package_TypePlastic Bag -0.89179    0.10087  -8.841  < 2e-16 ***
## Price150 TL             -0.78767    0.15431  -5.105 3.74e-07 ***
## Price25 TL              -0.10233    0.17102  -0.598  0.54969    
## Price35 TL              -0.17494    0.14914  -1.173  0.24098    
## Price50 TL              -0.35000    0.15710  -2.228  0.02604 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.876 on 1484 degrees of freedom
## Multiple R-squared:  0.08997,    Adjusted R-squared:  0.08446 
## F-statistic:  16.3 on 9 and 1484 DF,  p-value: < 2.2e-16

📌 This is your only regression model in the project.


3.1 Coefficient plot (MANDATORY visual)

coef_df <- tidy(rating_model) %>%
  filter(term != "(Intercept)")

ggplot(coef_df, aes(x = estimate, y = reorder(term, estimate))) +
  geom_point(size = 3) +
  geom_errorbarh(
    aes(xmin = estimate - 1.96 * std.error,
        xmax = estimate + 1.96 * std.error),
    height = 0.2
  ) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  labs(
    title = "Conjoint Part-Worth Utilities",
    x = "Impact on Rating",
    y = "Attribute Level"
  ) +
  theme_minimal()
## Warning: `geom_errorbarh()` was deprecated in ggplot2 4.0.0.
## ℹ Please use the `orientation` argument of `geom_errorbar()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `height` was translated to `width`.


3.2 Price sensitivity (derived from conjoint)

conjointData %>%
  group_by(Price) %>%
  summarise(MeanRating = mean(Rating), .groups = "drop") %>%
  ggplot(aes(x = Price, y = MeanRating)) +
  geom_line() +
  geom_point(size = 2) +
  labs(
    title = "Price Sensitivity of Bread Ratings",
    x = "Price Level",
    y = "Average Rating"
  ) +
  theme_minimal()
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?


4 Demographic Profile (DESCRIPTIVE)

4.1 Demographic Profile of Respondents

ggplot(ageData, aes(x = Age_Range, y = Count)) +
  geom_col() +
  labs(
    title = "Age Distribution of Respondents",
    x = "Age Range",
    y = "Number of Respondents"
  ) +
  theme_minimal()

(Same logic for Income, Gender, Education → all geom_col())


5 UNO Question 1 – Brand Perceptions

5.1 Brand Perceptions of UNO

library(dplyr)
library(tidyr)
library(ggplot2)
library(stringr)

uno_q1_long <- uno_q1 %>%
  pivot_longer(
    cols = c("1","2","3","4","5"),
    names_to = "Level",
    values_to = "Count"
  ) %>%
  mutate(
    Level = factor(Level, levels = c("1","2","3","4","5")),
    Statement = UNO_Agreement_Level
  )

ggplot(uno_q1_long, aes(x = Level, y = Count)) +
  geom_col() +
  facet_wrap(~ Statement, ncol = 2, labeller = label_wrap_gen(width = 35)) +
  labs(
    title = "UNO Q1 – Agreement Distribution by Statement",
    x = "Agreement Level (1–5)",
    y = "Number of Respondents"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    strip.text = element_text(size = 10),
    axis.text.x = element_text(size = 9)
  )

5.2 Interpretation of Agreement Distributions

Figure X presents the distribution of agreement levels (1–5) for each brand statement related to UNO.
Across all statements, responses are concentrated around agreement levels 3 and 4, indicating a generally positive but moderate brand perception.

Statements related to quality, taste, and trust show low frequencies at the extreme negative end (level 1), suggesting that strong dissatisfaction is rare.
However, the relatively limited number of responses at level 5 indicates that very strong agreement is also uncommon.

Overall, these distributions suggest that UNO is perceived as a reliable, good-quality, and good-value everyday bread brand, rather than a strongly differentiated premium or innovative brand.
This moderate perception highlights both stability in current brand equity and potential room for improvement through targeted positioning and communication strategies.


6 UNO Question 2 – Action Likelihood (FUNNEL)

6.1 Behavioral Intentions toward UNO Premium Bread

library(dplyr)
library(tidyr)
library(ggplot2)

uno_q2_long <- uno_q2 %>%
  pivot_longer(
    cols = c("1","2","3","4","5","6","7"),
    names_to = "Likelihood_Level",
    values_to = "Count"
  ) %>%
  mutate(
    Likelihood_Level = factor(Likelihood_Level, levels = c("1","2","3","4","5","6","7")),
    Action = UNO_Premium_Bread_Action_Likelihood
  )

ggplot(uno_q2_long, aes(x = Likelihood_Level, y = Count)) +
  geom_col() +
  facet_wrap(~ Action, ncol = 2, labeller = label_wrap_gen(width = 35)) +
  labs(
    title = "UNO Q2 – Likelihood of Actions for Premium Bread",
    x = "Likelihood Level (1–7)",
    y = "Number of Respondents"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    strip.text = element_text(size = 10),
    axis.text.x = element_text(size = 9)
  )

6.2 Interpretation of Likelihood Distributions

Figure Y shows the distribution of likelihood levels (1–7) for different consumer actions related to a potential UNO premium bread line.
Across actions, responses tend to cluster around the mid-to-upper range (roughly levels 4–6), indicating generally positive but not extreme intentions.

Lower-commitment actions (e.g., trying at least once or buying on promotion) typically receive higher likelihood responses than higher-commitment actions (e.g., switching brands or purchasing weekly).
Overall, this suggests consumers are open to engaging with UNO’s premium offering, but stronger commitment may require clearer differentiation and a compelling value proposition.

LS0tCnRpdGxlOiAiRGF0YSBJbnNpZ2h0cyBmb3IgTWFya2V0aW5nIChNaU04MTApIC0gR3JvdXA0IgpzdWJ0aXRsZTogIlVOTyBCcmVhZCBDb25zdW1lciBTdXJ2ZXkgJiBDb25qb2ludCBBbmFseXNpcyBSZXN1bHRzIgphdXRob3I6ICJHcm91cCA0IgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBtYXRoamF4OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgoxLiBJbnRyb2R1Y3Rpb24KMi4gUmVzZWFyY2ggT2JqZWN0aXZlcwozLiBEYXRhICYgTWV0aG9kIE92ZXJ2aWV3CjQuIENvbmpvaW50IEFuYWx5c2lzCjUuIEJyYW5kIFBlcmNlcHRpb25zICYgQXR0aXR1ZGVzIHRvd2FyZCBVTk8KNi4gUHVyY2hhc2UgSW50ZW50ICYgV2lsbGluZ25lc3MgdG8gUGF5CjcuIENvbnN1bWVyIFNlZ21lbnRhdGlvbiAoRGVtb2dyYXBoaWNzKQo4LiBNYW5hZ2VyaWFsIEltcGxpY2F0aW9ucwo5LiBMaW1pdGF0aW9ucyAmIENvbmNsdXNpb24KCgpgYGB7ciBwYWNrYWdlX2luc3RhbGwgfQoKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShicm9vbSkKbGlicmFyeShmb3JjYXRzKQoKZXhjZWxfcGF0aCA8LSAiVU5PIFN1cnZleSBSZXNwb25zZXMgdjQueGxzeCIKCmBgYAoKCiMgRGF0YSBJbXBvcnQgKGZyb20gc2NyYXRjaCwgZXhwbGljaXQpCgpgYGB7ciBkYXRhLWltcG9ydH0KIyBDb25qb2ludCAoaW5kaXZpZHVhbC1sZXZlbCkKY29uam9pbnREYXRhIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiQ29uam9pbnRfTG9uZyIpCgojIFVOTyBCcmFuZCAmIEF0dGl0dWRlcyAoYWdncmVnYXRlZCkKdW5vX3ExIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiVU5PIFF1ZXN0aW9uMSIpCnVub19xMiA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIlVOTyBRdWVzdGlvbjIiKQp1bm9fcTMgPC0gcmVhZF9leGNlbChleGNlbF9wYXRoLCBzaGVldCA9ICJVTk8gUXVlc3Rpb24zIikKCiMgRGVtb2dyYXBoaWNzIChhZ2dyZWdhdGVkKQphZ2VEYXRhIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiQWdlIikKaW5jb21lRGF0YSA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIkluY29tZSIpCmdlbmRlckRhdGEgPC0gcmVhZF9leGNlbChleGNlbF9wYXRoLCBzaGVldCA9ICJHZW5kZXIiKQplZHVjYXRpb25EYXRhIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiRWR1Y2F0aW9uIikKCmBgYAoKCioqUnVsZToqKiAgCi0gYGNvbmpvaW50RGF0YWAg4oaSIG1vZGVsaW5nICAKLSBldmVyeXRoaW5nIGVsc2Ug4oaSIHZpc3VhbGl6YXRpb24gJiBpbnRlcnByZXRhdGlvbgoKLS0tCgojIDEuIEludHJvZHVjdGlvbgoKVGhlIHBhY2thZ2VkIGJyZWFkIG1hcmtldCBoYXMgZXZvbHZlZCBiZXlvbmQgYmFzaWMgZnVuY3Rpb25hbCBuZWVkcywgd2l0aCBjb25zdW1lcnMgaW5jcmVhc2luZ2x5IHZhbHVpbmcgaGVhbHRoLCBxdWFsaXR5LCBzdXN0YWluYWJpbGl0eSwgYW5kIHByZW1pdW0gY3Vlcy4gVU5PIGlzIGEgbGVhZGluZyBicmFuZCBpbiB0aGlzIGNhdGVnb3J5IGFuZCBpcyB3ZWxsIHBvc2l0aW9uZWQgdG8gZXhwbG9yZSBwcmVtaXVtIHByb2R1Y3QgZXh0ZW5zaW9ucy4KClRoZSBvYmplY3RpdmUgb2YgdGhpcyBzdHVkeSBpcyB0byBhbmFseXplIGNvbnN1bWVyIHBlcmNlcHRpb25zLCBiZWhhdmlvcmFsIGludGVudGlvbnMsIGFuZCBwcm9kdWN0IGF0dHJpYnV0ZSB0cmFkZS1vZmZzIHJlbGF0ZWQgdG8gcGFja2FnZWQgYnJlYWQsIHdpdGggYSBzcGVjaWZpYyBmb2N1cyBvbiBVTk8uIFRoZSBhbmFseXNpcyBjb21iaW5lcyBzdXJ2ZXktYmFzZWQgZGVzY3JpcHRpdmUgaW5zaWdodHMgd2l0aCBhIHJhdGluZy1iYXNlZCBjb25qb2ludCBtb2RlbCB0byBkZXJpdmUgYWN0aW9uYWJsZSBtYW5hZ2VyaWFsIGltcGxpY2F0aW9ucy4KCiMgMi4gQ29uam9pbnQgQW5hbHlzaXMKCmBgYHtyIGNvbmpvaW50LW1vZGVsfQpyYXRpbmdfbW9kZWwgPC0gbG0oCiAgUmF0aW5nIH4gQnJlYWRfVHlwZSArIFNsaWNlX1R5cGUgKyBQYWNrYWdlX1R5cGUgKyBQcmljZSwKICBkYXRhID0gY29uam9pbnREYXRhCikKCnN1bW1hcnkocmF0aW5nX21vZGVsKQoKYGBgCgoK8J+TjCBUaGlzIGlzIHlvdXIgKipvbmx5IHJlZ3Jlc3Npb24gbW9kZWwqKiBpbiB0aGUgcHJvamVjdC4KCi0tLQoKIyMgQ29lZmZpY2llbnQgcGxvdCAoTUFOREFUT1JZIHZpc3VhbCkKCmBgYHtyIGNvbmpvaW50LWNvZWYtcGxvdH0KY29lZl9kZiA8LSB0aWR5KHJhdGluZ19tb2RlbCkgJT4lCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikKCmdncGxvdChjb2VmX2RmLCBhZXMoeCA9IGVzdGltYXRlLCB5ID0gcmVvcmRlcih0ZXJtLCBlc3RpbWF0ZSkpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBlc3RpbWF0ZSAtIDEuOTYgKiBzdGQuZXJyb3IsCiAgICAgICAgeG1heCA9IGVzdGltYXRlICsgMS45NiAqIHN0ZC5lcnJvciksCiAgICBoZWlnaHQgPSAwLjIKICApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkNvbmpvaW50IFBhcnQtV29ydGggVXRpbGl0aWVzIiwKICAgIHggPSAiSW1wYWN0IG9uIFJhdGluZyIsCiAgICB5ID0gIkF0dHJpYnV0ZSBMZXZlbCIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKLS0tCgojIyBQcmljZSBzZW5zaXRpdml0eSAoZGVyaXZlZCBmcm9tIGNvbmpvaW50KQoKCmBgYHtyIGNvbmpvaW50LXByaWNlfQpjb25qb2ludERhdGEgJT4lCiAgZ3JvdXBfYnkoUHJpY2UpICU+JQogIHN1bW1hcmlzZShNZWFuUmF0aW5nID0gbWVhbihSYXRpbmcpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQcmljZSwgeSA9IE1lYW5SYXRpbmcpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUHJpY2UgU2Vuc2l0aXZpdHkgb2YgQnJlYWQgUmF0aW5ncyIsCiAgICB4ID0gIlByaWNlIExldmVsIiwKICAgIHkgPSAiQXZlcmFnZSBSYXRpbmciCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCgotLS0KCiMgRGVtb2dyYXBoaWMgUHJvZmlsZSAoREVTQ1JJUFRJVkUpCgojIyBEZW1vZ3JhcGhpYyBQcm9maWxlIG9mIFJlc3BvbmRlbnRzCgpgYGB7ciBhZ2UtcGxvdH0KZ2dwbG90KGFnZURhdGEsIGFlcyh4ID0gQWdlX1JhbmdlLCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicygKICAgIHRpdGxlID0gIkFnZSBEaXN0cmlidXRpb24gb2YgUmVzcG9uZGVudHMiLAogICAgeCA9ICJBZ2UgUmFuZ2UiLAogICAgeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKCgooU2FtZSBsb2dpYyBmb3IgSW5jb21lLCBHZW5kZXIsIEVkdWNhdGlvbiDihpIgYWxsIGBnZW9tX2NvbCgpYCkKCi0tLQoKIyBVTk8gUXVlc3Rpb24gMSDigJMgQnJhbmQgUGVyY2VwdGlvbnMKCiMjIEJyYW5kIFBlcmNlcHRpb25zIG9mIFVOTwoKYGBge3IgdW5vLXExfQoKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN0cmluZ3IpCgp1bm9fcTFfbG9uZyA8LSB1bm9fcTEgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiksCiAgICBuYW1lc190byA9ICJMZXZlbCIsCiAgICB2YWx1ZXNfdG8gPSAiQ291bnQiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBMZXZlbCA9IGZhY3RvcihMZXZlbCwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiKSksCiAgICBTdGF0ZW1lbnQgPSBVTk9fQWdyZWVtZW50X0xldmVsCiAgKQoKZ2dwbG90KHVub19xMV9sb25nLCBhZXMoeCA9IExldmVsLCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfd3JhcCh+IFN0YXRlbWVudCwgbmNvbCA9IDIsIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGggPSAzNSkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVU5PIFExIOKAkyBBZ3JlZW1lbnQgRGlzdHJpYnV0aW9uIGJ5IFN0YXRlbWVudCIsCiAgICB4ID0gIkFncmVlbWVudCBMZXZlbCAoMeKAkzUpIiwKICAgIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkKICApCgoKCmBgYAoKIyMgKipJbnRlcnByZXRhdGlvbiBvZiBBZ3JlZW1lbnQgRGlzdHJpYnV0aW9ucyoqCgpGaWd1cmUgWCBwcmVzZW50cyB0aGUgZGlzdHJpYnV0aW9uIG9mIGFncmVlbWVudCBsZXZlbHMgKDHigJM1KSBmb3IgZWFjaCBicmFuZCBzdGF0ZW1lbnQgcmVsYXRlZCB0byBVTk8uICAKQWNyb3NzIGFsbCBzdGF0ZW1lbnRzLCByZXNwb25zZXMgYXJlIGNvbmNlbnRyYXRlZCBhcm91bmQgYWdyZWVtZW50IGxldmVscyAqKjMgYW5kIDQqKiwgaW5kaWNhdGluZyBhIGdlbmVyYWxseSBwb3NpdGl2ZSBidXQgbW9kZXJhdGUgYnJhbmQgcGVyY2VwdGlvbi4KClN0YXRlbWVudHMgcmVsYXRlZCB0byAqKnF1YWxpdHksIHRhc3RlLCBhbmQgdHJ1c3QqKiBzaG93IGxvdyBmcmVxdWVuY2llcyBhdCB0aGUgZXh0cmVtZSBuZWdhdGl2ZSBlbmQgKGxldmVsIDEpLCBzdWdnZXN0aW5nIHRoYXQgc3Ryb25nIGRpc3NhdGlzZmFjdGlvbiBpcyByYXJlLiAgCkhvd2V2ZXIsIHRoZSByZWxhdGl2ZWx5IGxpbWl0ZWQgbnVtYmVyIG9mIHJlc3BvbnNlcyBhdCBsZXZlbCA1IGluZGljYXRlcyB0aGF0IHZlcnkgc3Ryb25nIGFncmVlbWVudCBpcyBhbHNvIHVuY29tbW9uLgoKT3ZlcmFsbCwgdGhlc2UgZGlzdHJpYnV0aW9ucyBzdWdnZXN0IHRoYXQgVU5PIGlzIHBlcmNlaXZlZCBhcyBhICoqcmVsaWFibGUsIGdvb2QtcXVhbGl0eSwgYW5kIGdvb2QtdmFsdWUgZXZlcnlkYXkgYnJlYWQgYnJhbmQqKiwgcmF0aGVyIHRoYW4gYSBzdHJvbmdseSBkaWZmZXJlbnRpYXRlZCBwcmVtaXVtIG9yIGlubm92YXRpdmUgYnJhbmQuICAKVGhpcyBtb2RlcmF0ZSBwZXJjZXB0aW9uIGhpZ2hsaWdodHMgYm90aCBzdGFiaWxpdHkgaW4gY3VycmVudCBicmFuZCBlcXVpdHkgYW5kIHBvdGVudGlhbCByb29tIGZvciBpbXByb3ZlbWVudCB0aHJvdWdoIHRhcmdldGVkIHBvc2l0aW9uaW5nIGFuZCBjb21tdW5pY2F0aW9uIHN0cmF0ZWdpZXMuCgotLS0KCiMgVU5PIFF1ZXN0aW9uIDIg4oCTIEFjdGlvbiBMaWtlbGlob29kIChGVU5ORUwpCgojIyBCZWhhdmlvcmFsIEludGVudGlvbnMgdG93YXJkIFVOTyBQcmVtaXVtIEJyZWFkCgpgYGB7ciB1bm8tcTJ9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKCnVub19xMl9sb25nIDwtIHVub19xMiAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLAogICAgbmFtZXNfdG8gPSAiTGlrZWxpaG9vZF9MZXZlbCIsCiAgICB2YWx1ZXNfdG8gPSAiQ291bnQiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBMaWtlbGlob29kX0xldmVsID0gZmFjdG9yKExpa2VsaWhvb2RfTGV2ZWwsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSksCiAgICBBY3Rpb24gPSBVTk9fUHJlbWl1bV9CcmVhZF9BY3Rpb25fTGlrZWxpaG9vZAogICkKCmdncGxvdCh1bm9fcTJfbG9uZywgYWVzKHggPSBMaWtlbGlob29kX0xldmVsLCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfd3JhcCh+IEFjdGlvbiwgbmNvbCA9IDIsIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGggPSAzNSkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVU5PIFEyIOKAkyBMaWtlbGlob29kIG9mIEFjdGlvbnMgZm9yIFByZW1pdW0gQnJlYWQiLAogICAgeCA9ICJMaWtlbGlob29kIExldmVsICgx4oCTNykiLAogICAgeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KQogICkKCmBgYAoKCiMjICoqSW50ZXJwcmV0YXRpb24gb2YgTGlrZWxpaG9vZCBEaXN0cmlidXRpb25zKioKCkZpZ3VyZSBZIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgbGlrZWxpaG9vZCBsZXZlbHMgKDHigJM3KSBmb3IgZGlmZmVyZW50IGNvbnN1bWVyIGFjdGlvbnMgcmVsYXRlZCB0byBhIHBvdGVudGlhbCBVTk8gcHJlbWl1bSBicmVhZCBsaW5lLiAgCkFjcm9zcyBhY3Rpb25zLCByZXNwb25zZXMgdGVuZCB0byBjbHVzdGVyIGFyb3VuZCB0aGUgbWlkLXRvLXVwcGVyIHJhbmdlIChyb3VnaGx5IGxldmVscyA04oCTNiksIGluZGljYXRpbmcgZ2VuZXJhbGx5IHBvc2l0aXZlIGJ1dCBub3QgZXh0cmVtZSBpbnRlbnRpb25zLgoKTG93ZXItY29tbWl0bWVudCBhY3Rpb25zIChlLmcuLCB0cnlpbmcgYXQgbGVhc3Qgb25jZSBvciBidXlpbmcgb24gcHJvbW90aW9uKSB0eXBpY2FsbHkgcmVjZWl2ZSBoaWdoZXIgbGlrZWxpaG9vZCByZXNwb25zZXMgdGhhbiBoaWdoZXItY29tbWl0bWVudCBhY3Rpb25zIChlLmcuLCBzd2l0Y2hpbmcgYnJhbmRzIG9yIHB1cmNoYXNpbmcgd2Vla2x5KS4gIApPdmVyYWxsLCB0aGlzIHN1Z2dlc3RzIGNvbnN1bWVycyBhcmUgb3BlbiB0byBlbmdhZ2luZyB3aXRoIFVOT+KAmXMgcHJlbWl1bSBvZmZlcmluZywgYnV0IHN0cm9uZ2VyIGNvbW1pdG1lbnQgbWF5IHJlcXVpcmUgY2xlYXJlciBkaWZmZXJlbnRpYXRpb24gYW5kIGEgY29tcGVsbGluZyB2YWx1ZSBwcm9wb3NpdGlvbi4KCgo=