“လူကလေးရယ်ငို … တက်ဗလက်ကို လက်ထဲပေး” ရတဲ့ခေတ်မှာ ကျနော်ကဘာများတတ်နိင်ဦးမှာလဲ။
ကိုယ်တိုင်ကသူငယ်နာမစင်သေးတော့ သူငယ်ချင်း၊ မိတ်ဆွေတွေတရားဆွေးနွေးချိန်မှာ ကျနော်ကကွန်ပျူတာနဲ့
ဆော့ဝဲနဲ့ဆော့ကောင်းတုန်း။
တကယ်တော့ဝန်ထမ်းဘဝကမိတ်ဆွေ၊ညီလေး(ကြီး)မျိုးသန့်ပြောသလို လူကြီးကစားတာဘဲပေါ့။ ခုလဲဘဲ
မြန်မာကျောက်စာစာသားတွေကိုခေတ်မြန်မာစာစု ၃-စုနဲ့ ယှဉ်ပြီး NLP ဆော့ဝဲနဲ့ကလိထားတာလေးတခုကို
ပြောပြမလို့ပါ။ သေးမွှားပေါ့တန်နေရင်လဲ သည်းခံပေးတော်မူကြပါ။
ရှေ့မှာရေးတင်ခဲ့တဲ့ “မြန်မာကျောက်စာဒီဂျစ်တယ်ရင်းမြစ်ရှာပုံတော်” မှာပြောခဲ့တဲ့
ပြည့်စုံတဲ့မြန်မာကျောက်စာဒီဂျစ်တယ်ဖိုင်တွေကိုဒေါင်းလုတ်ဆွဲပြီးတဲ့အခါမှာ အရင်ကရေးတင်ဘူးတဲ့
ခေတ်မြန်မဘာသာစကားစာစု ၃-စုရဲ့ဗျည်းအသုံးပြုမှုကြိမ်ရေနှိုင်းယှဉ်ကြည့်မှု လေ့လာချက် (https://bayanathi.blogspot.com/2022/11/most-used-myanmar-alphabets-in-text.html)
ကိုသတိရပြီးကျောက်စာမှာဗျည်းအသုံးပြုမှုကိုလေ့လာကြည့်ဘို့စိတ်ကူးပေါက်ပါတယ်။ ဒါကြောင့် R
ကွန်တာဘာသာစကားထဲက quanteda package နဲ့ဗျည်းအသုံးပြုမှုကြိမ်ရေတွေကိုတွက်ထုတ်၊
ကြိမ်ရေရာခိုင်နှုန်းအဖြစ်ပြောင်းလဲပြီး၊ ဂရပ်ဆွဲကာ နှိုင်းယှဉ်ကြည့်ပါတယ်။
အောက်ပါဂရပ်မှာတွေ့ရတဲ့အတိုင်း ခေတ်မြန်မာစာစု ၃-စုမှာတထပ်ထဲနည်းပါးတူပြီး၊
ကျောက်စာမှာလဲဗျည်းတချို့မှာကွာခြားမှုသိသိသာသာများတာမှအပ
ခေတ်မြန်မာစာစုတွေနဲ့တော်တော်ဆင်တူတာကိုတွေ့ရပါတယ်။
ဒီဆင်တူနေတာဘာကြောင့်ဖြစ်တယ်၊အဲဒါကဘာအဓိပ္ပါယ်ဆောင်တယ်ဆိုတာမျိုးတွေကို ဘာသာဗေဒပညာရှင်တွေ၊
မြန်စာစာပညာရှိတွေလို ကြွမ်းကျင်သူတွေမှပြောပြတတ်မယ်ထင်ပါတယ်။

အထက်ကဂရပ်မှာ -
(အပြာရောင် bar) = OB = Old Burmese = ကျောက်စာစာစု
(ခရမ်းရောင်မျဉ်း) = Atl = Asian Language Treebank Parallel Corpus; 20,000
sentences. (https://www2.nict.go.jp/astrec-att/member/mutiyama/ALT/
)
(အမဲရောင်မျဉ်း) = Okell = A Corpus of Modern Burmese; 20,106 sentences.
This is a corpus of modern Burmese compiled by John Okell in the 1990s
and converted into Unicode more recently. (https://zenodo.org/record/1202324#.Y3cr8XZBz59)
(အနီရောင်မျဉ်း) = Wiki = My own corpus of Wikipedia articles extracted from
the Myanmar Language Wikipedia site. This consisted of 306,405
sentences. I had posted about the compilation of this corpus in a series
of posts in my “Bayanathi Technology” blog beginning with “An Ambitious
Big Myanmar Corpus” of February 28, 2019.
အဲဒီဂရပ်ကိုရဖို့ ပထမ ဆိုင်ရာစာစုကို R ကွန်ပျူတာစကားရဲ့ Quanteda NLP package
သုံးပြီးဗျည်းအသုံးပြုမှုရာခိုင်နှုန်းတွေကိုတွက်ထုတ်တယ်။ နောက် ရလာဒ်တွေကိုဂရပ်ဆွဲဘို့ ggplot2 package
ကိုအဓိကသုံးပါတယ်။ ပရိုဂရမ်အပြည့်အစုံကိုအောက်မှာကြည့်ပါ။
library(quanteda)
library(stringr)
library(ggplot2)
library(scales)
OBcorpus_dfm <- readRDS("insc_OBIcorpus.rds") %>%
as.character(.) %>%
str_extract_all(., "[\u1000-\u1021]") %>%
tokens() %>%
dfm()
OBff <- featfreq(OBcorpus_dfm)
# Sort Alphabetically by Names (က-အ)
OBff[order(names(OBff))]
# extract consonent frequencis from Wiki corpus
load("x100_itN_Sen5.rda")
wikiCorpus_dfm <- str_extract_all(x100_itN_Sen.5, "[\u1000-\u1021]") %>%
tokens() %>%
dfm()
x <- featfreq(wikiCorpus_dfm)
# Sort Alphabetically by Names (က-အ)
x[order(names(x))]
# extract consonent frequencis from Okell corpus
okellCorpus <- readLines("allfiles.txt", encoding = "UTF-8", skipNul = TRUE)
okellCorpus_dfm <- str_extract_all(okellCorpus, "[\u1000-\u1021]") %>%
tokens() %>%
dfm()
y <- featfreq(okellCorpus_dfm)
# Sort Alphabetically by Names (က-အ)
y[order(names(y))]
# extract consonent frequencis from Alt corpus
altCorpus <- readLines("data_my.txt", encoding = "UTF-8", skipNul = TRUE)
altCorpus_dfm <- str_extract_all(altCorpus, "[\u1000-\u1021]") %>%
tokens() %>%
dfm()
z <- featfreq(altCorpus_dfm)
# append missing alphabet for this corpus
z34 <- z %>% append(., c(ဎ = 0))
# Sort Alphabetically by Names (က-အ)
z34[order(names(z34))]
# create graph
df <- data.frame(
Category = sort(names(OBff)),
BarPct = OBff[order(names(OBff))]/sum(OBff),
LinePct1 = x[order(names(x))]/sum(x),
LinePct2 = y[order(names(y))]/sum(y),
LinePct3 = z34[order(names(z34))]/sum(z34)
)
# 2. Plotting with automatic legend mapping
ggplot(df, aes(x = Category)) +
# Map fill to a string label
geom_col(aes(y = BarPct, fill = "OB")) +
# Map color to a string label (remember group = 1)
geom_line(aes(y = LinePct1, group = 1, color = "Wiki"), size = 1) +
#geom_point(aes(y = LinePct1, color = "Wiki"), size = 2) +
geom_line(aes(y = LinePct2, group = 1, color = "Okell"), size = 1) +
#geom_point(aes(y = LinePct2, color = "Okell"), size = 2) +
geom_line(aes(y = LinePct3, group = 1, color = "Atl"), size = 1) +
# 3. Define the custom colors manually
scale_fill_manual(name = NULL, values = c("OB" = "skyblue")) +
scale_color_manual(values = c("Wiki" = "red",
"Okell" = "darkgreen",
"Atl" = "purple"),name = NULL) +
scale_y_continuous(labels = percent) +
labs(title = "ကျောက်စာနှင့်ခေတ်မြန်မာစာ စာစု ၃-စု၏ဗျည်းအသုံးပြုမှုကြိမ်ရေနှိုင်းယှဉ်ချက်", x = "ဗျည်း", y ="ကြိမ်ရေ %") +
theme_minimal() +
theme(aspect.ratio = 0.6)+
theme(panel.background = element_rect(fill = "lightyellow"))+
# Move legend to the top so it doesn't crowd the bars
theme(axis.text.x = element_text(face="bold", size = 12))+
theme(legend.position = "top")
LS0tDQp0aXRsZTogIuGAoeGAreGAr+GAuOGAleGAr+GAkOGAuuGAm+GAmuGAuuGBiuGAgeGAu+GAreGAr+GAuOGAm+GAr+GAleGAuuGAm+GAmuGAuiDhgJnhgJ/hgK/hgJDhgLrhgJDhgLHhgKzhgLfhgJXhgKsiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQrigJzhgJzhgLDhgIDhgJzhgLHhgLjhgJvhgJrhgLrhgIThgK3hgK8g4oCmIOGAkOGAgOGAuuGAl+GAnOGAgOGAuuGAgOGAreGAryDhgJzhgIDhgLrhgJHhgLLigIzhgJXhgLHhgLjigJ0g4YCb4YCQ4YCy4YC34YCB4YCx4YCQ4YC64YCZ4YC+4YCsIOGAgOGAu+GAlOGAseGArOGAuuGAgOGAmOGArOGAmeGAu+GArOGAuOGAkOGAkOGAuuGAlOGAreGAhOGAuuGApuGAuOGAmeGAvuGArOGAnOGAsuGBiyAgICAgDQrhgIDhgK3hgK/hgJrhgLrhgJDhgK3hgK/hgIThgLrhgIDhgJ7hgLDhgIThgJrhgLrhgJThgKzhgJnhgIXhgIThgLrhgJ7hgLHhgLjhgJDhgLHhgKzhgLcg4YCe4YCw4YCE4YCa4YC64YCB4YC74YCE4YC64YC44YGKIOGAmeGAreGAkOGAuuGAhuGAveGAseGAkOGAveGAseGAkOGAm+GArOGAuOGAhuGAveGAseGAuOGAlOGAveGAseGAuOGAgeGAu+GAreGAlOGAuuGAmeGAvuGArCDhgIDhgLvhgJThgLHhgKzhgLrhgIDhgIDhgL3hgJThgLrhgJXhgLvhgLDhgJDhgKzhgJThgLLhgLcg4YCG4YCx4YCs4YC34YCd4YCy4YCU4YCy4YC34YCG4YCx4YCs4YC34YCA4YCx4YCs4YCE4YC64YC44YCQ4YCv4YCU4YC64YC44YGLICAgIA0KDQrhgJDhgIDhgJrhgLrhgJDhgLHhgKzhgLfhgJ3hgJThgLrhgJHhgJnhgLrhgLjhgJjhgJ3hgIDhgJnhgK3hgJDhgLrhgIbhgL3hgLHhgYrhgIrhgK7hgJzhgLHhgLgo4YCA4YC84YCu4YC4KeGAmeGAu+GAreGAr+GAuOGAnuGAlOGAt+GAuuGAleGAvOGAseGArOGAnuGAnOGAreGAryDhgJzhgLDhgIDhgLzhgK7hgLjhgIDhgIXhgKzhgLjhgJDhgKzhgJjhgLLhgJXhgLHhgKvhgLfhgYsg4YCB4YCv4YCc4YCy4YCY4YCyIOGAmeGAvOGAlOGAuuGAmeGArOGAgOGAu+GAseGArOGAgOGAuuGAheGArOGAheGArOGAnuGArOGAuOGAkOGAveGAseGAgOGAreGAr+GAgeGAseGAkOGAuuGAmeGAvOGAlOGAuuGAmeGArOGAheGArOGAheGAryDhgYMt4YCF4YCv4YCU4YCy4YC3IOGAmuGAvuGAieGAuuGAleGAvOGAruGAuCBOTFAg4YCG4YCx4YCs4YC34YCd4YCy4YCU4YCy4YC34YCA4YCc4YCt4YCR4YCs4YC44YCQ4YCs4YCc4YCx4YC44YCQ4YCB4YCv4YCA4YCt4YCvIOGAleGAvOGAseGArOGAleGAvOGAmeGAnOGAreGAr+GAt+GAleGAq+GBiyDhgJ7hgLHhgLjhgJnhgL3hgL7hgKzhgLjhgJXhgLHhgKvhgLfhgJDhgJThgLrhgJThgLHhgJvhgIThgLrhgJzhgLIg4YCe4YCK4YC64YC44YCB4YC24YCV4YCx4YC44YCQ4YCx4YCs4YC64YCZ4YCw4YCA4YC84YCV4YCr4YGLDQoNCuGAm+GAvuGAseGAt+GAmeGAvuGArOGAm+GAseGAuOGAkOGAhOGAuuGAgeGAsuGAt+GAkOGAsuGAtyDigJzhgJnhgLzhgJThgLrhgJnhgKzhgIDhgLvhgLHhgKzhgIDhgLrhgIXhgKzhgJLhgK7hgILhgLvhgIXhgLrhgJDhgJrhgLrhgJvhgIThgLrhgLjhgJnhgLzhgIXhgLrhgJvhgL7hgKzhgJXhgK/hgLbhgJDhgLHhgKzhgLoiIOGAmeGAvuGArOGAleGAvOGAseGArOGAgeGAsuGAt+GAkOGAsuGAtyDhgJXhgLzhgIrhgLfhgLrhgIXhgK/hgLbhgJDhgLLhgLfhgJnhgLzhgJThgLrhgJnhgKzhgIDhgLvhgLHhgKzhgIDhgLrhgIXhgKzhgJLhgK7hgILhgLvhgIXhgLrhgJDhgJrhgLrhgJbhgK3hgK/hgIThgLrhgJDhgL3hgLHhgIDhgK3hgK/hgJLhgLHhgKvhgIThgLrhgLjhgJzhgK/hgJDhgLrhgIbhgL3hgLLhgJXhgLzhgK7hgLjhgJDhgLLhgLfhgKHhgIHhgKvhgJnhgL7hgKwg4YCh4YCb4YCE4YC64YCA4YCb4YCx4YC44YCQ4YCE4YC64YCY4YCw4YC44YCQ4YCy4YC3IOGAgeGAseGAkOGAuuGAmeGAvOGAlOGAuuGAmeGAmOGArOGAnuGArOGAheGAgOGArOGAuOGAheGArOGAheGAryDhgYMt4YCF4YCv4YCb4YCy4YC34YCX4YC74YCK4YC64YC44YCh4YCe4YCv4YC24YC44YCV4YC84YCv4YCZ4YC+4YCv4YCA4YC84YCt4YCZ4YC64YCb4YCx4YCU4YC+4YCt4YCv4YCE4YC64YC44YCa4YC+4YCJ4YC64YCA4YC84YCK4YC34YC64YCZ4YC+4YCvIOGAnOGAseGAt+GAnOGArOGAgeGAu+GAgOGAuiAoaHR0cHM6Ly9iYXlhbmF0aGkuYmxvZ3Nwb3QuY29tLzIwMjIvMTEvbW9zdC11c2VkLW15YW5tYXItYWxwaGFiZXRzLWluLXRleHQuaHRtbCkg4YCA4YCt4YCv4YCe4YCQ4YCt4YCb4YCV4YC84YCu4YC44YCA4YC74YCx4YCs4YCA4YC64YCF4YCs4YCZ4YC+4YCs4YCX4YC74YCK4YC64YC44YCh4YCe4YCv4YC24YC44YCV4YC84YCv4YCZ4YC+4YCv4YCA4YCt4YCv4YCc4YCx4YC34YCc4YCs4YCA4YC84YCK4YC34YC64YCY4YCt4YCv4YC34YCF4YCt4YCQ4YC64YCA4YCw4YC44YCV4YCx4YCr4YCA4YC64YCV4YCr4YCQ4YCa4YC64YGLIOGAkuGAq+GAgOGAvOGAseGArOGAhOGAt+GAuiBSIOGAgOGAveGAlOGAuuGAkOGArOGAmOGArOGAnuGArOGAheGAgOGArOGAuOGAkeGAsuGAgCBxdWFudGVkYSBwYWNrYWdlIOGAlOGAsuGAt+GAl+GAu+GAiuGAuuGAuOGAoeGAnuGAr+GAtuGAuOGAleGAvOGAr+GAmeGAvuGAr+GAgOGAvOGAreGAmeGAuuGAm+GAseGAkOGAveGAseGAgOGAreGAr+GAkOGAveGAgOGAuuGAkeGAr+GAkOGAuuGBiiDhgIDhgLzhgK3hgJnhgLrhgJvhgLHhgJvhgKzhgIHhgK3hgK/hgIThgLrhgJThgL7hgK/hgJThgLrhgLjhgKHhgJbhgLzhgIXhgLrhgJXhgLzhgLHhgKzhgIThgLrhgLjhgJzhgLLhgJXhgLzhgK7hgLjhgYog4YCC4YCb4YCV4YC64YCG4YC94YCy4YCA4YCsIOGAlOGAvuGAreGAr+GAhOGAuuGAuOGAmuGAvuGAieGAuuGAgOGAvOGAiuGAt+GAuuGAleGAq+GAkOGAmuGAuuGBiyAgIA0KDQrhgKHhgLHhgKzhgIDhgLrhgJXhgKvhgILhgJvhgJXhgLrhgJnhgL7hgKzhgJDhgL3hgLHhgLfhgJvhgJDhgLLhgLfhgKHhgJDhgK3hgK/hgIThgLrhgLgg4YCB4YCx4YCQ4YC64YCZ4YC84YCU4YC64YCZ4YCs4YCF4YCs4YCF4YCvIOGBgy3hgIXhgK/hgJnhgL7hgKzhgJDhgJHhgJXhgLrhgJHhgLLhgJThgIrhgLrhgLjhgJXhgKvhgLjhgJDhgLDhgJXhgLzhgK7hgLjhgYog4YCA4YC74YCx4YCs4YCA4YC64YCF4YCs4YCZ4YC+4YCs4YCc4YCy4YCX4YC74YCK4YC64YC44YCQ4YCB4YC74YCt4YCv4YC34YCZ4YC+4YCs4YCA4YC94YCs4YCB4YC84YCs4YC44YCZ4YC+4YCv4YCe4YCt4YCe4YCt4YCe4YCs4YCe4YCs4YCZ4YC74YCs4YC44YCQ4YCs4YCZ4YC+4YCh4YCVIOGAgeGAseGAkOGAuuGAmeGAvOGAlOGAuuGAmeGArOGAheGArOGAheGAr+GAkOGAveGAseGAlOGAsuGAt+GAkOGAseGArOGAuuGAkOGAseGArOGAuuGAhuGAhOGAuuGAkOGAsOGAkOGArOGAgOGAreGAr+GAkOGAveGAseGAt+GAm+GAleGAq+GAkOGAmuGAuuGBiw0KDQrhgJLhgK7hgIbhgIThgLrhgJDhgLDhgJThgLHhgJDhgKzhgJjhgKzhgIDhgLzhgLHhgKzhgIThgLfhgLrhgJbhgLzhgIXhgLrhgJDhgJrhgLrhgYrhgKHhgLLhgJLhgKvhgIDhgJjhgKzhgKHhgJPhgK3hgJXhgLnhgJXhgKvhgJrhgLrhgIbhgLHhgKzhgIThgLrhgJDhgJrhgLrhgIbhgK3hgK/hgJDhgKzhgJnhgLvhgK3hgK/hgLjhgJDhgL3hgLHhgIDhgK3hgK8g4YCY4YCs4YCe4YCs4YCX4YCx4YCS4YCV4YCK4YCs4YCb4YC+4YCE4YC64YCQ4YC94YCx4YGKIOGAmeGAvOGAlOGAuuGAheGArOGAheGArOGAleGAiuGArOGAm+GAvuGAreGAkOGAveGAseGAnOGAreGAryDhgIDhgLzhgL3hgJnhgLrhgLjhgIDhgLvhgIThgLrhgJ7hgLDhgJDhgL3hgLHhgJnhgL7hgJXhgLzhgLHhgKzhgJXhgLzhgJDhgJDhgLrhgJnhgJrhgLrhgJHhgIThgLrhgJXhgKvhgJDhgJrhgLrhgYsNCg0KIVtdKGZycUNvbXBhcmUucG5nKSAgICAgIA0KICAgDQrhgKHhgJHhgIDhgLrhgIDhgILhgJvhgJXhgLrhgJnhgL7hgKwgLSAgIA0KKOGAoeGAleGAvOGArOGAm+GAseGArOGAhOGAuiBiYXIpID0gT0IgPSBPbGQgQnVybWVzZSA9IOGAgOGAu+GAseGArOGAgOGAuuGAheGArOGAheGArOGAheGAryAgIA0KKOGAgeGAm+GAmeGAuuGAuOGAm+GAseGArOGAhOGAuuGAmeGAu+GAieGAuuGAuCkgPSBBdGwgPSBBc2lhbiBMYW5ndWFnZSBUcmVlYmFuayBQYXJhbGxlbCBDb3JwdXM7IDIwLDAwMCBzZW50ZW5jZXMuwqAoaHR0cHM6Ly93d3cyLm5pY3QuZ28uanAvYXN0cmVjLWF0dC9tZW1iZXIvbXV0aXlhbWEvQUxULyApICAgICANCijhgKHhgJnhgLLhgJvhgLHhgKzhgIThgLrhgJnhgLvhgInhgLrhgLgpID0gT2tlbGwgPSBBIENvcnB1cyBvZiBNb2Rlcm4gQnVybWVzZTsgMjAsMTA2IHNlbnRlbmNlcy4gVGhpcyBpcyBhIGNvcnB1cyBvZiBtb2Rlcm4gQnVybWVzZSBjb21waWxlZCBieSBKb2huIE9rZWxsIGluIHRoZSAxOTkwcyBhbmQgY29udmVydGVkIGludG8gVW5pY29kZSBtb3JlIHJlY2VudGx5LsKgKGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmQvMTIwMjMyNCMuWTNjcjhYWkJ6NTkpICANCijhgKHhgJThgK7hgJvhgLHhgKzhgIThgLrhgJnhgLvhgInhgLrhgLgpID0gV2lraSA9IE15IG93biBjb3JwdXMgb2YgV2lraXBlZGlhIGFydGljbGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBNeWFubWFyIExhbmd1YWdlIFdpa2lwZWRpYSBzaXRlLiBUaGlzIGNvbnNpc3RlZCBvZiAzMDYsNDA1IHNlbnRlbmNlcy4gSSBoYWQgcG9zdGVkIGFib3V0IHRoZSBjb21waWxhdGlvbiBvZiB0aGlzIGNvcnB1cyBpbiBhIHNlcmllcyBvZiBwb3N0cyBpbiBtecKg4oCcQmF5YW5hdGhpIFRlY2hub2xvZ3nigJ3CoGJsb2cgYmVnaW5uaW5nIHdpdGgg4oCcQW4gQW1iaXRpb3VzIEJpZyBNeWFubWFyIENvcnB1c+KAnSBvZiBGZWJydWFyeSAyOCwgMjAxOS4gICAgICANCg0K4YCh4YCy4YCS4YCu4YCC4YCb4YCV4YC64YCA4YCt4YCv4YCb4YCW4YCt4YCv4YC3IOGAleGAkeGAmSDhgIbhgK3hgK/hgIThgLrhgJvhgKzhgIXhgKzhgIXhgK/hgIDhgK3hgK8gUiDhgIDhgL3hgJThgLrhgJXhgLvhgLDhgJDhgKzhgIXhgIDhgKzhgLjhgJvhgLLhgLcgUXVhbnRlZGEgTkxQIHBhY2thZ2Ug4YCe4YCv4YC24YC44YCV4YC84YCu4YC44YCX4YC74YCK4YC64YC44YCh4YCe4YCv4YC24YC44YCV4YC84YCv4YCZ4YC+4YCv4YCb4YCs4YCB4YCt4YCv4YCE4YC64YCU4YC+4YCv4YCU4YC64YC44YCQ4YC94YCx4YCA4YCt4YCv4YCQ4YC94YCA4YC64YCR4YCv4YCQ4YC64YCQ4YCa4YC64YGLIOGAlOGAseGArOGAgOGAuiDhgJvhgJzhgKzhgJLhgLrhgJDhgL3hgLHhgIDhgK3hgK/hgILhgJvhgJXhgLrhgIbhgL3hgLLhgJjhgK3hgK/hgLcgZ2dwbG90MiAgcGFja2FnZSDhgIDhgK3hgK/hgKHhgJPhgK3hgIDhgJ7hgK/hgLbhgLjhgJXhgKvhgJDhgJrhgLrhgYsg4YCV4YCb4YCt4YCv4YCC4YCb4YCZ4YC64YCh4YCV4YC84YCK4YC34YC64YCh4YCF4YCv4YC24YCA4YCt4YCv4YCh4YCx4YCs4YCA4YC64YCZ4YC+4YCs4YCA4YC84YCK4YC34YC64YCV4YCr4YGLDQoNCmBgYA0KbGlicmFyeShxdWFudGVkYSkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KDQpPQmNvcnB1c19kZm0gPC0gcmVhZFJEUygiaW5zY19PQkljb3JwdXMucmRzIikgJT4lDQogICAgYXMuY2hhcmFjdGVyKC4pICU+JQ0KICAgIHN0cl9leHRyYWN0X2FsbCguLCAiW1x1MTAwMC1cdTEwMjFdIikgJT4lDQogICAgdG9rZW5zKCkgJT4lDQogICAgZGZtKCkNCk9CZmYgPC0gZmVhdGZyZXEoT0Jjb3JwdXNfZGZtKQ0KIyBTb3J0IEFscGhhYmV0aWNhbGx5IGJ5IE5hbWVzICjhgIAt4YChKQ0KT0JmZltvcmRlcihuYW1lcyhPQmZmKSldIA0KDQojIGV4dHJhY3QgY29uc29uZW50IGZyZXF1ZW5jaXMgZnJvbSBXaWtpIGNvcnB1cw0KbG9hZCgieDEwMF9pdE5fU2VuNS5yZGEiKQ0Kd2lraUNvcnB1c19kZm0gPC0gc3RyX2V4dHJhY3RfYWxsKHgxMDBfaXROX1Nlbi41LCAiW1x1MTAwMC1cdTEwMjFdIikgJT4lDQogICAgICB0b2tlbnMoKSAlPiUNCiAgICAgIGRmbSgpDQoNCnggPC0gZmVhdGZyZXEod2lraUNvcnB1c19kZm0pDQojIFNvcnQgQWxwaGFiZXRpY2FsbHkgYnkgTmFtZXMgKOGAgC3hgKEpDQp4W29yZGVyKG5hbWVzKHgpKV0NCg0KIyBleHRyYWN0IGNvbnNvbmVudCBmcmVxdWVuY2lzIGZyb20gT2tlbGwgY29ycHVzDQpva2VsbENvcnB1cyA8LSByZWFkTGluZXMoImFsbGZpbGVzLnR4dCIsIGVuY29kaW5nID0gIlVURi04Iiwgc2tpcE51bCA9IFRSVUUpDQpva2VsbENvcnB1c19kZm0gPC0gc3RyX2V4dHJhY3RfYWxsKG9rZWxsQ29ycHVzLCAiW1x1MTAwMC1cdTEwMjFdIikgJT4lDQogICAgICB0b2tlbnMoKSAlPiUNCiAgICAgIGRmbSgpDQp5IDwtIGZlYXRmcmVxKG9rZWxsQ29ycHVzX2RmbSkNCiMgU29ydCBBbHBoYWJldGljYWxseSBieSBOYW1lcyAo4YCALeGAoSkNCnlbb3JkZXIobmFtZXMoeSkpXSANCg0KIyBleHRyYWN0IGNvbnNvbmVudCBmcmVxdWVuY2lzIGZyb20gQWx0IGNvcnB1cw0KYWx0Q29ycHVzIDwtIHJlYWRMaW5lcygiZGF0YV9teS50eHQiLCBlbmNvZGluZyA9ICJVVEYtOCIsIHNraXBOdWwgPSBUUlVFKQ0KYWx0Q29ycHVzX2RmbSA8LSBzdHJfZXh0cmFjdF9hbGwoYWx0Q29ycHVzLCAiW1x1MTAwMC1cdTEwMjFdIikgJT4lDQogICAgICB0b2tlbnMoKSAlPiUNCiAgICAgIGRmbSgpDQp6IDwtIGZlYXRmcmVxKGFsdENvcnB1c19kZm0pDQojIGFwcGVuZCBtaXNzaW5nIGFscGhhYmV0IGZvciB0aGlzIGNvcnB1cw0KejM0IDwtIHogJT4lIGFwcGVuZCguLCBjKOGAjiA9IDApKQ0KIyBTb3J0IEFscGhhYmV0aWNhbGx5IGJ5IE5hbWVzICjhgIAt4YChKQ0KejM0W29yZGVyKG5hbWVzKHozNCkpXSANCg0KIyBjcmVhdGUgZ3JhcGgNCmRmIDwtIGRhdGEuZnJhbWUoDQogIENhdGVnb3J5ID0gc29ydChuYW1lcyhPQmZmKSksDQogIEJhclBjdCA9IE9CZmZbb3JkZXIobmFtZXMoT0JmZikpXS9zdW0oT0JmZiksDQogIExpbmVQY3QxID0geFtvcmRlcihuYW1lcyh4KSldL3N1bSh4KSwNCiAgTGluZVBjdDIgPSB5W29yZGVyKG5hbWVzKHkpKV0vc3VtKHkpLA0KICBMaW5lUGN0MyA9IHozNFtvcmRlcihuYW1lcyh6MzQpKV0vc3VtKHozNCkNCiAgKQ0KDQojIDIuIFBsb3R0aW5nIHdpdGggYXV0b21hdGljIGxlZ2VuZCBtYXBwaW5nDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gQ2F0ZWdvcnkpKSArDQogICMgTWFwIGZpbGwgdG8gYSBzdHJpbmcgbGFiZWwNCiAgZ2VvbV9jb2woYWVzKHkgPSBCYXJQY3QsIGZpbGwgPSAiT0IiKSkgKw0KICAjIE1hcCBjb2xvciB0byBhIHN0cmluZyBsYWJlbCAocmVtZW1iZXIgZ3JvdXAgPSAxKQ0KICBnZW9tX2xpbmUoYWVzKHkgPSBMaW5lUGN0MSwgZ3JvdXAgPSAxLCBjb2xvciA9ICJXaWtpIiksIHNpemUgPSAxKSArDQogICNnZW9tX3BvaW50KGFlcyh5ID0gTGluZVBjdDEsIGNvbG9yID0gIldpa2kiKSwgc2l6ZSA9IDIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gTGluZVBjdDIsIGdyb3VwID0gMSwgY29sb3IgPSAiT2tlbGwiKSwgc2l6ZSA9IDEpICsNCiAgI2dlb21fcG9pbnQoYWVzKHkgPSBMaW5lUGN0MiwgY29sb3IgPSAiT2tlbGwiKSwgc2l6ZSA9IDIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gTGluZVBjdDMsIGdyb3VwID0gMSwgY29sb3IgPSAiQXRsIiksIHNpemUgPSAxKSArDQogDQogICMgMy4gRGVmaW5lIHRoZSBjdXN0b20gY29sb3JzIG1hbnVhbGx5DQogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSBOVUxMLCB2YWx1ZXMgPSBjKCJPQiIgPSAic2t5Ymx1ZSIpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJXaWtpIiA9ICJyZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2tlbGwiID0gImRhcmtncmVlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdGwiID0gInB1cnBsZSIpLG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHRpdGxlID0gIuGAgOGAu+GAseGArOGAgOGAuuGAheGArOGAlOGAvuGAhOGAt+GAuuGAgeGAseGAkOGAuuGAmeGAvOGAlOGAuuGAmeGArOGAheGArCDhgIXhgKzhgIXhgK8g4YGDLeGAheGAr+GBj+GAl+GAu+GAiuGAuuGAuOGAoeGAnuGAr+GAtuGAuOGAleGAvOGAr+GAmeGAvuGAr+GAgOGAvOGAreGAmeGAuuGAm+GAseGAlOGAvuGAreGAr+GAhOGAuuGAuOGAmuGAvuGAieGAuuGAgeGAu+GAgOGAuiIsIHggPSAi4YCX4YC74YCK4YC64YC4IiwgeSA9IuGAgOGAvOGAreGAmeGAuuGAm+GAsSAlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShhc3BlY3QucmF0aW8gPSAwLjYpKyANCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImxpZ2h0eWVsbG93IikpKw0KICAjIE1vdmUgbGVnZW5kIHRvIHRoZSB0b3Agc28gaXQgZG9lc24ndCBjcm93ZCB0aGUgYmFycw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgc2l6ZSA9IDEyKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSANCmBgYA0K