데이터의 종류
변수 : var_ // variable
상수 : const_ // constant
값 : data
스페이스 두 번 줄 바꾸기
샵 글자 크기 키우기
var.a <- 1
var.b <- 2
var.a + var.b
함수의 종류
c() 숫자타입의 벡터를 생성
vec.a <- c(1,2,5,7,8)
vec.a
vec.b <- c(1:5)
vec.c <- seq(1,10,by=2)
vec.c
vec.b + vec.c
c() 문자타입의 벡터를 생성
var.a <- c("Hello", "world","is","good!!!")
var.a
[1] "Hello" "world" "is" "good!!!"
scalar
스칼라(영어: scalar 스케일러[*])란 크기와 방향을 가지는 벡터에 대비하는 개념으로, 크기만 있고 방향을 가지지 않는 양을 말한다.
위키백과
vector
벡터(vector)는 방향과 크기의 의미를 모두 포함하는 표현 도구로서 주로 힘이나 자기장, 전기장, 변위 등의 물리적 개념을 설명할 때 이용된다. 위키백과 동일한 패턴.,
dataframe
정형 데이터를 저장하는 장소 벡터가 확장된 개념 > row(case, 대상 하나의 정보)과 column(var.data)로 구성된 표
vec.name <- c("김지훈","이유진","박동현","김민지")
vec.name
vec.eng <- c(90,80,60,70)
vec.eng
vec.math <- c(50,60,100,20)
vec.math
df.score <- data.frame(vec.name, vec.eng, vec.math)
df.score
id <- c(1:6)
class <- c(1,1,1,1,2,2)
math <- c(50,60,45,30,23,50)
english <- c(98,97,86,98,80,89)
science <- c(50,60,78,58,65,98)
df.score <- data.frame(id,class,math,english,science)
df.score
vec.name <- c(“김지훈”,“이유진”,“박동현”,“김민지”) vec.name vec.eng <- c(90,80,60,70) vec.eng vec.math <- c(50,60,100,20) vec.math vec.class <- c(1,1,2,2) vec.class df.score <- data.frame(vec.name, vec.eng, vec.math, vec.class) df.score
id <- c(1:10) class <- c(1,1,1,1,1,2,2,2,2,2) math <- c(50,60,45,30,23,50,30,25,50,50) english <- c(98,97,86,98,80,89,30,25,50,50) science <- c(50,60,78,58,65,98,30,25,50,50)
df.score <- data.frame(id,class,math,english,science) #전체 학생 점수 보기 df.score # n번째 row 까지만 보여주기 head(df.n) 함수 p.101 head(df.score, 8)
밑에서 n번째 row 까지만 보여주기 tail(df.n) 함수 p.102
tail(df.score, 8)
뷰어창에서 df 확인 View(df) *View의 V는 대문자 View(df.score)
df , row count, col count // 디멘션은 쓰지 말고 보통 스트럭쳐 씀
dim(df.score)
str() structure 를 나타내는 함수
str(df.score)
summary() 요약
summary(df.score)
df.score <- difly::rename( df.score, id=uid)
df.score %>% #파이프라인
data.table::setnames(
)
library(dplyr)
df.score %>% data.table::setnames( old = “id”, new = “아이디” ) df.score df.score\(총점 <- df.score\)math + df.score\(english + df.score\)science df.score\(평균 <- df.score\)총점 / 3 df.score
hist(df.score$총점) #p.116
ifelse()
df.score\(합격여부 <- ifelse(df.score\)평균>=50, “합격”, “불합격”)
df.score\(등급 <- ifelse(df.score\)평균>=50, “A”, ifelse(df.score$평균>=30, “B”, “C”))
table()
library(ggplot2) ggplot2::qplot(df.score$합격여부)
package
library(ggplot2) # 이 파일로 불러오는 것 df.mpg <- as.data.frame(ggplot2::mpg)
4함수 :: headm tail, str, summary
head(df.mpg) tail(df.mpg) str(df.mpg) summary(df.mpg)
‘data.frame’: 234 obs. of 11 variables:
$ manufacturer(제조회사): chr “audi” “audi” “audi” “audi” …
$ model(모델) : chr “a4” “a4” “a4” “a4” …
$ displ(배기량) : num 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 …
$ year(생산연도) : int 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 …
$ cyl(실린더 개수) : int 4 4 4 4 6 6 6 4 4 4 …
$ trans(변속기 종류) : chr “auto(l5)” “manual(m5)” “manual(m6)” “auto(av)” …
$ drv(구동 방식) : chr “f” “f” “f” “f” …
$ cty(도시 연비) : int 18 21 20 21 16 18 18 18 16 20 …
$ hwy(고속도로 연비) : int 29 29 31 30 26 26 27 26 25 28 …
$ fl(연료 종류) : chr “p” “p” “p” “p” …
$ class(자동차 종류) : chr “compact” “compact” “compact” “compact” …
> summary(df.mpg)
manufacturer model displ year
Length:234 Length:234 Min. :1.600 Min. :1999
Class :character Class :character 1st Qu.:2.400 1st Qu.:1999
Mode :character Mode :character Median :3.300 Median :2004
Mean :3.472 Mean :2004
3rd Qu.:4.600 3rd Qu.:2008
Max. :7.000 Max. :2008
cyl trans drv cty
Min. :4.000 Length:234 Length:234 Min. : 9.00
1st Qu.:4.000 Class :character Class :character 1st Qu.:14.00
Median :6.000 Mode :character Mode :character Median :17.00
Mean :5.889 Mean :16.86
3rd Qu.:8.000 3rd Qu.:19.00
Max. :8.000 Max. :35.00
hwy fl class
Min. :12.00 Length:234 Length:234
1st Qu.:18.00 Class :character Class :character
Median :24.00 Mode :character Mode :character
Mean :23.44
3rd Qu.:27.00
Max. :44.00
library(ggplot2) midwest <- as.data.frame(ggplot2::midwest)
head(midwest)
library(dplyr) df.midwest %>% data.table::setnames(old = “popasian”, new = “asian”) df.midwest
midwest\(ratio <- midwest\)asian/midwest\(total*100 hist(midwest\)ratio)
mean(midwest$ratio)
midwest\(group <- ifelse(midwest\)ratio > 0.4872462, “large”, “small”)
table(midwest$group)
library(ggplot2) qplot(midwest$group)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyMjIOuNsOydtO2EsOydmCDsooXrpZgNCuuzgOyImCA6IHZhcl8gLy8gdmFyaWFibGUgIA0K7IOB7IiYIDogY29uc3RfIC8vIGNvbnN0YW50ICANCuqwkiA6IGRhdGEgIA0K7Iqk7Y6Y7J207IqkIOuRkCDrsogg7KSEIOuwlOq+uOq4sCAgDQrsg7Ug6riA7J6QIO2BrOq4sCDtgqTsmrDquLAgIA0KDQpgYGB7cn0NCnZhci5hIDwtIDENCnZhci5iIDwtIDINCnZhci5hICsgdmFyLmINCg0KYGBgDQoNCiMjIyDtlajsiJjsnZgg7KKF66WYDQojIyMjIyBjKCkg7Iir7J6Q7YOA7J6F7J2YIOuyoe2EsOulvCDsg53shLENCg0KYGBge3J9DQp2ZWMuYSA8LSBjKDEsMiw1LDcsOCkNCnZlYy5hDQp2ZWMuYiA8LSBjKDE6NSkNCnZlYy5jIDwtIHNlcSgxLDEwLGJ5PTIpDQp2ZWMuYw0KdmVjLmIgKyB2ZWMuYw0KYGBgDQoNCg0KIyMjIyMgYygpIOusuOyekO2DgOyeheydmCDrsqHthLDrpbwg7IOd7ISxDQpgYGB7cn0NCnZhci5hIDwtIGMoIkhlbGxvIiwid29ybGQiLCJpcyIsImdvb2QhISEiKQ0KdmFyLmENCmBgYA0KDQojIyMjIHNjYWxhciANCj7siqTsubzrnbwo7JiB7Ja0OiBzY2FsYXIg7Iqk7LyA7J2865+sWypdKeuegCDtgazquLDsmYAg67Cp7Zal7J2EIOqwgOyngOuKlCDrsqHthLDsl5Ag64yA67mE7ZWY64qUIOqwnOuFkOycvOuhnCwg7YGs6riw66eMIOyeiOqzoCDrsKntlqXsnYQg6rCA7KeA7KeAIOyViuuKlCDslpHsnYQg66eQ7ZWc64ukLiAgDQpb7JyE7YKk67Cx6rO8XShodHRwczovL2tvLndpa2lwZWRpYS5vcmcvd2lraS8lRUMlOEElQTQlRUMlQjklQkMlRUIlOUQlQkNfKCVFQyU4OCU5OCVFRCU5NSU5OSkpICANCg0KIyMjIyB2ZWN0b3INCj7rsqHthLAodmVjdG9yKeuKlCDrsKntlqXqs7wg7YGs6riw7J2YIOydmOuvuOulvCDrqqjrkZAg7Y+s7ZWo7ZWY64qUIO2RnO2YhCDrj4TqtazroZzshJwg7KO866GcIO2emOydtOuCmCDsnpDquLDsnqUsIOyghOq4sOyepSwg67OA7JyEIOuTseydmCDrrLzrpqzsoIEg6rCc64WQ7J2EIOyEpOuqhe2VoCDrlYwg7J207Jqp65Cc64ukLiANClvsnITtgqTrsLHqs7xdKGh0dHBzOi8va28ud2lraXBlZGlhLm9yZy93aWtpLyVFQiVCMiVBMSVFRCU4NCVCMF8oJUVCJUFDJUJDJUVCJUE2JUFDKSkNCuuPmeydvO2VnCDtjKjthLQuLCANCg0KDQojIyMjIGRhdGFmcmFtZQ0K7KCV7ZiVIOuNsOydtO2EsOulvCDsoIDsnqXtlZjripQg7J6l7IaMDQrrsqHthLDqsIAg7ZmV7J6l65CcIOqwnOuFkA0KPiByb3coY2FzZSwg64yA7IOBIO2VmOuCmOydmCDsoJXrs7Qp6rO8IGNvbHVtbih2YXIuZGF0YSnroZwg6rWs7ISx65CcIO2RnCAgDQogIA0KICANCg0KYGBge3J9DQp2ZWMubmFtZSA8LSBjKCLquYDsp4Dtm4giLCLsnbTsnKDsp4QiLCLrsJXrj5ntmIQiLCLquYDrr7zsp4AiKQ0KdmVjLm5hbWUNCnZlYy5lbmcgPC0gYyg5MCw4MCw2MCw3MCkNCnZlYy5lbmcNCnZlYy5tYXRoIDwtIGMoNTAsNjAsMTAwLDIwKQ0KdmVjLm1hdGgNCmRmLnNjb3JlIDwtIGRhdGEuZnJhbWUodmVjLm5hbWUsIHZlYy5lbmcsIHZlYy5tYXRoKQ0KZGYuc2NvcmUNCmBgYA0KDQoNCmBgYHtyfQ0KaWQgPC0gYygxOjYpDQpjbGFzcyA8LSBjKDEsMSwxLDEsMiwyKQ0KbWF0aCA8LSBjKDUwLDYwLDQ1LDMwLDIzLDUwKQ0KZW5nbGlzaCA8LSBjKDk4LDk3LDg2LDk4LDgwLDg5KQ0Kc2NpZW5jZSA8LSBjKDUwLDYwLDc4LDU4LDY1LDk4KQ0KDQpkZi5zY29yZSA8LSBkYXRhLmZyYW1lKGlkLGNsYXNzLG1hdGgsZW5nbGlzaCxzY2llbmNlKQ0KZGYuc2NvcmUNCmBgYA0KDQoNCg0KdmVjLm5hbWUgPC0gYygi6rmA7KeA7ZuIIiwi7J207Jyg7KeEIiwi67CV64+Z7ZiEIiwi6rmA66+87KeAIikNCnZlYy5uYW1lDQp2ZWMuZW5nIDwtIGMoOTAsODAsNjAsNzApDQp2ZWMuZW5nDQp2ZWMubWF0aCA8LSBjKDUwLDYwLDEwMCwyMCkNCnZlYy5tYXRoDQp2ZWMuY2xhc3MgPC0gYygxLDEsMiwyKQ0KdmVjLmNsYXNzDQpkZi5zY29yZSA8LSBkYXRhLmZyYW1lKHZlYy5uYW1lLCB2ZWMuZW5nLCB2ZWMubWF0aCwgdmVjLmNsYXNzKQ0KZGYuc2NvcmUNCg0KDQppZCA8LSBjKDE6MTApDQpjbGFzcyA8LSBjKDEsMSwxLDEsMSwyLDIsMiwyLDIpDQptYXRoIDwtIGMoNTAsNjAsNDUsMzAsMjMsNTAsMzAsMjUsNTAsNTApDQplbmdsaXNoIDwtIGMoOTgsOTcsODYsOTgsODAsODksMzAsMjUsNTAsNTApDQpzY2llbmNlIDwtIGMoNTAsNjAsNzgsNTgsNjUsOTgsMzAsMjUsNTAsNTApDQoNCmRmLnNjb3JlIDwtIGRhdGEuZnJhbWUoaWQsY2xhc3MsbWF0aCxlbmdsaXNoLHNjaWVuY2UpDQoj7KCE7LK0IO2VmeyDnSDsoJDsiJgg67O06riwDQpkZi5zY29yZQ0KIyBu67KI7Ke4IHJvdyDquYzsp4Drp4wg67O07Jes7KO86riwIGhlYWQoZGYubikg7ZWo7IiYIHAuMTAxDQpoZWFkKGRmLnNjb3JlLCA4KQ0KDQojIOuwkeyXkOyEnCBu67KI7Ke4IHJvdyDquYzsp4Drp4wg67O07Jes7KO86riwIHRhaWwoZGYubikg7ZWo7IiYIHAuMTAyDQp0YWlsKGRmLnNjb3JlLCA4KQ0KDQojIOu3sOyWtOywveyXkOyEnCBkZiDtmZXsnbggVmlldyhkZikgKlZpZXfsnZggVuuKlCDrjIDrrLjsnpANClZpZXcoZGYuc2NvcmUpDQoNCiMgZGYgLCByb3cgY291bnQsIGNvbCBjb3VudCAvLyDrlJTrqZjshZjsnYAg7JOw7KeAIOunkOqzoCDrs7TthrUg7Iqk7Yq465+t7LOQIOyUgA0KZGltKGRmLnNjb3JlKQ0KDQojIHN0cigpIHN0cnVjdHVyZSDrpbwg64KY7YOA64K064qUIO2VqOyImA0Kc3RyKGRmLnNjb3JlKQ0KDQojIHN1bW1hcnkoKSDsmpTslb0NCnN1bW1hcnkoZGYuc2NvcmUpDQoNCg0KIyBkZi5zY29yZSA8LSBkaWZseTo6cmVuYW1lKCBkZi5zY29yZSwgaWQ9dWlkKSAgICANCg0KI2RmLnNjb3JlICU+JSAgI+2MjOydtO2UhOudvOyduA0KIyAgZGF0YS50YWJsZTo6c2V0bmFtZXMoDQogICAgDQojICApDQpsaWJyYXJ5KGRwbHlyKQ0KDQpkZi5zY29yZSAlPiUgDQogIGRhdGEudGFibGU6OnNldG5hbWVzKA0KICAgIG9sZCA9ICJpZCIsDQogICAgbmV3ID0gIuyVhOydtOuUlCINCiAgKQ0KZGYuc2NvcmUNCmRmLnNjb3JlJOy0neygkCA8LSBkZi5zY29yZSRtYXRoICsgZGYuc2NvcmUkZW5nbGlzaCArIGRmLnNjb3JlJHNjaWVuY2UNCmRmLnNjb3JlJO2Pieq3oCA8LSBkZi5zY29yZSTstJ3soJAgLyAzDQpkZi5zY29yZQ0KDQpoaXN0KGRmLnNjb3JlJOy0neygkCkgI3AuMTE2DQoNCiNpZmVsc2UoKQ0KDQpkZi5zY29yZSTtlanqsqnsl6zrtoAgPC0gaWZlbHNlKGRmLnNjb3JlJO2Pieq3oD49NTAsICLtlanqsqkiLCAi67aI7ZWp6rKpIikNCg0KZGYuc2NvcmUk65Ox6riJIDwtIGlmZWxzZShkZi5zY29yZSTtj4nqt6A+PTUwLA0KICAgICAgICAgICAgICAgICAgICAgICJBIiwNCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGYuc2NvcmUk7Y+J6regPj0zMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQyIpKQ0KDQoNCiMgdGFibGUoKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90Mjo6cXBsb3QoZGYuc2NvcmUk7ZWp6rKp7Jes67aAKQ0KDQoNCg0KDQoNCg0KIyBwYWNrYWdlDQpsaWJyYXJ5KGdncGxvdDIpICMg7J20IO2MjOydvOuhnCDrtojrn6zsmKTripQg6rKDIA0KZGYubXBnIDwtIGFzLmRhdGEuZnJhbWUoZ2dwbG90Mjo6bXBnKQ0KDQojIyA07ZWo7IiYIDo6IGhlYWRtIHRhaWwsIHN0ciwgc3VtbWFyeQ0KaGVhZChkZi5tcGcpDQp0YWlsKGRmLm1wZykNCnN0cihkZi5tcGcpDQpzdW1tYXJ5KGRmLm1wZykNCg0KDQojICdkYXRhLmZyYW1lJzoJMjM0IG9icy4gb2YgIDExIHZhcmlhYmxlczoNCiMgICQgbWFudWZhY3R1cmVyKOygnOyhsO2ajOyCrCk6IGNociAgImF1ZGkiICJhdWRpIiAiYXVkaSIgImF1ZGkiIC4uLg0KIyAgJCBtb2RlbCjrqqjrjbgpICAgICAgIDogY2hyICAiYTQiICJhNCIgImE0IiAiYTQiIC4uLg0KIyAgJCBkaXNwbCjrsLDquLDrn4kpICAgICAgIDogbnVtICAxLjggMS44IDIgMiAyLjggMi44IDMuMSAxLjggMS44IDIgLi4uDQojICAkIHllYXIo7IOd7IKw7Jew64+EKSAgICAgICAgOiBpbnQgIDE5OTkgMTk5OSAyMDA4IDIwMDggMTk5OSAxOTk5IDIwMDggMTk5OSAxOTk5IDIwMDggLi4uDQojICAkIGN5bCjsi6TrprDrjZQg6rCc7IiYKSAgICAgICAgIDogaW50ICA0IDQgNCA0IDYgNiA2IDQgNCA0IC4uLg0KIyAgJCB0cmFucyjrs4Dsho3quLAg7KKF66WYKSAgICAgICA6IGNociAgImF1dG8obDUpIiAibWFudWFsKG01KSIgIm1hbnVhbChtNikiICJhdXRvKGF2KSIgLi4uDQojICAkIGRydijqtazrj5kg67Cp7IudKSAgICAgICAgIDogY2hyICAiZiIgImYiICJmIiAiZiIgLi4uDQojICAkIGN0eSjrj4Tsi5wg7Jew67mEKSAgICAgICAgIDogaW50ICAxOCAyMSAyMCAyMSAxNiAxOCAxOCAxOCAxNiAyMCAuLi4NCiMgICQgaHd5KOqzoOyGjeuPhOuhnCDsl7DruYQpICAgICAgICAgOiBpbnQgIDI5IDI5IDMxIDMwIDI2IDI2IDI3IDI2IDI1IDI4IC4uLg0KIyAgJCBmbCjsl7Dro4wg7KKF66WYKSAgICAgICAgICA6IGNociAgInAiICJwIiAicCIgInAiIC4uLg0KIyAgJCBjbGFzcyjsnpDrj5nssKgg7KKF66WYKSAgICAgICA6IGNociAgImNvbXBhY3QiICJjb21wYWN0IiAiY29tcGFjdCIgImNvbXBhY3QiIC4uLg0KDQojID4gc3VtbWFyeShkZi5tcGcpDQojICBtYW51ZmFjdHVyZXIgICAgICAgICAgbW9kZWwgICAgICAgICAgICAgICBkaXNwbCAgICAgICAgICAgIHllYXIgICAgIA0KIyAgTGVuZ3RoOjIzNCAgICAgICAgIExlbmd0aDoyMzQgICAgICAgICBNaW4uICAgOjEuNjAwICAgTWluLiAgIDoxOTk5ICANCiMgIENsYXNzIDpjaGFyYWN0ZXIgICBDbGFzcyA6Y2hhcmFjdGVyICAgMXN0IFF1LjoyLjQwMCAgIDFzdCBRdS46MTk5OSAgDQojICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgIE1lZGlhbiA6My4zMDAgICBNZWRpYW4gOjIwMDQgIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuICAgOjMuNDcyICAgTWVhbiAgIDoyMDA0ICANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM3JkIFF1Ljo0LjYwMCAgIDNyZCBRdS46MjAwOCAgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heC4gICA6Ny4wMDAgICBNYXguICAgOjIwMDggIA0KIyAgICAgICBjeWwgICAgICAgICAgIHRyYW5zICAgICAgICAgICAgICAgZHJ2ICAgICAgICAgICAgICAgICBjdHkgICAgICAgDQojICBNaW4uICAgOjQuMDAwICAgTGVuZ3RoOjIzNCAgICAgICAgIExlbmd0aDoyMzQgICAgICAgICBNaW4uICAgOiA5LjAwICANCiMgIDFzdCBRdS46NC4wMDAgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIDFzdCBRdS46MTQuMDAgIA0KIyAgTWVkaWFuIDo2LjAwMCAgIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTWVkaWFuIDoxNy4wMCAgDQojICBNZWFuICAgOjUuODg5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuICAgOjE2Ljg2ICANCiMgIDNyZCBRdS46OC4wMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNyZCBRdS46MTkuMDAgIA0KIyAgTWF4LiAgIDo4LjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4LiAgIDozNS4wMCAgDQojICAgICAgIGh3eSAgICAgICAgICAgICBmbCAgICAgICAgICAgICAgIGNsYXNzICAgICAgICAgIA0KIyAgTWluLiAgIDoxMi4wMCAgIExlbmd0aDoyMzQgICAgICAgICBMZW5ndGg6MjM0ICAgICAgICANCiMgIDFzdCBRdS46MTguMDAgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgDQojICBNZWRpYW4gOjI0LjAwICAgTW9kZSAgOmNoYXJhY3RlciAgIE1vZGUgIDpjaGFyYWN0ZXIgIA0KIyAgTWVhbiAgIDoyMy40NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgIDNyZCBRdS46MjcuMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQojICBNYXguICAgOjQ0LjAwICAgICAgICAgICAgICAgICAgICAgICANCg0KDQpsaWJyYXJ5KGdncGxvdDIpDQptaWR3ZXN0IDwtIGFzLmRhdGEuZnJhbWUoZ2dwbG90Mjo6bWlkd2VzdCkNCg0KaGVhZChtaWR3ZXN0KQ0KDQoNCmxpYnJhcnkoZHBseXIpDQpkZi5taWR3ZXN0ICU+JSANCiAgZGF0YS50YWJsZTo6c2V0bmFtZXMob2xkID0gInBvcGFzaWFuIiwgbmV3ID0gImFzaWFuIikNCmRmLm1pZHdlc3QNCg0KbWlkd2VzdCRyYXRpbyA8LSBtaWR3ZXN0JGFzaWFuL21pZHdlc3QkdG90YWwqMTAwDQpoaXN0KG1pZHdlc3QkcmF0aW8pDQoNCm1lYW4obWlkd2VzdCRyYXRpbykNCg0KbWlkd2VzdCRncm91cCA8LSBpZmVsc2UobWlkd2VzdCRyYXRpbyA+IDAuNDg3MjQ2MiwgImxhcmdlIiwgInNtYWxsIikNCg0KDQp0YWJsZShtaWR3ZXN0JGdyb3VwKQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpxcGxvdChtaWR3ZXN0JGdyb3VwKQ0KDQoNCg0KDQoNCg0K