ActionButton

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  actionButton("action",
               label = "액션버튼"
               ),
  hr(),
  verbatimTextOutput("value")
)

server <- function(input, output, session) {
  onclick("btn",info(date()))
}

shinyApp(ui, server)

Action Button choices

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  actionButton("chk",
               label = h3("선택"),
               value = TRUE
  ),
  hr(),
  fluidRow()
)

server <- function(input, output, session) {
  output$value <- renderText({input$chk})
}

shinyApp(ui, server)

Calendar

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  dateInput("date",
            label = h3("날짜입력"),
            value = "2018-01-01"),
hr(),
fluidRow(column(3, verbatimTextOutput("value")))
)

server <- function(input, output, session) {
  output$value <- renderPrint({input$date})
}

shinyApp(ui, server)

Check Box

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  actionButton("chk",
               label = h3("체크박스그룹"),
               choices = list("선택1"=1,
                              "선택2"=2,
                              "선택3"=3
                              ),
               selected = 1
                ),
  hr(),
  fluidRow()
)

server <- function(input, output, session) {
  output$value <- renderText({input$chk})
}

shinyApp(ui, server)

Date

install.packages("rvest")
install.packages("shiny")
install.packages("shinydashboard")
install.packages("shinyjs")

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  actionButton("date",
               label = "액션버튼"
  ),
  hr(),
  verbatimTextOutput("value")
)

server <- function(input, output, session) {
  output$value = renderText({input$action})
}

shinyApp(ui, server)

File

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  fileInput("file",
                 label = h3("파일 업로드")
  ),
  hr(),
  fluidRow(column(4, verbatimTextOutput("value")))
)

server <- function(input, output, session) {
  output$value <- renderPrint({str(input$file)})
}

shinyApp(ui, server)

Gender Check

library(shiny)
library(shinyjs)

gender <- function(x){
  t <- substr(x,8,8) # x는 주민등록번호이고 여기서 8번째, 8자리까지만 추출해라
  cat('\n SSN 에서 추출한 값:',t)  # print(t)는 값만 보여주므로  cat으로 추출값 확인
  y <- switch(t,
         '1'='남성',
         '2'='여성',
         '3'='남성',
         '4'='여성',
         '5'='외국인',
         '6'='외국인',
         '잘못된 값'
         )
  cat('\n 결과값:', y)
  return(y)
}

ui <- fluidPage(
  useShinyjs(),
  textInput("txt",
            label = h3("주민번호앞자리 입력"),
            value ="(예시)900101-2"),
  actionButton("btn", "확 인")
)

server <- function(input, output, session) {
  onclick("btn",
          info({gender(input$txt)})
          )
  # output $value <- renderText({gender(input$txt)})
  # 성별을 체크하는 함수 코딩
}

shinyApp(ui, server)

Radio Button

if("plotly" %in% installed.packages("plotly") == FALSE)install.packages("plotly")
library(plotly)
library(shiny)
data <- data.frame(
  Population <- sample(1:20,10,replace = T),
  HouseHolds <- sample(1:20,10,replace = T),
  year <- sample(c(2000,2010),10,replace = T)
)

ui <- fluidPage(
  titlePanel(
    title = h4("인구 조사", align = "center")
  ),
  sidebarPanel(
    sidebarLayout(
      radioButtons("YEAR","10년 주기선택",
                   choices = c("2000", "2010"),
                   selected = "2000"
      )
    )
  ),
  mainPanel(
    plotOutput("bar",height=500)
  )
)

server <- function(input, output, session){
  reactive_data <- reactive({
    selected.year <- as.numeric(input$YEAR)
    return(data[data$year == selected_year])
  })
  output$bar <- renderPlot({
    color <- c("blud", "red")
    our_data <- reactive_data()
    barplot(colSums(our_data[,c("Population","HouseHolds")]),
            ylab <- "Total",
            xlab <- "Census Year",
            names.arg = c("Population","HouseHolds"),
            col = color)
  })
}

shinyApp(ui, server)

Reservation

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  dateRangeInput("date",
                 label = h3("기간 설정")
                 ),
  hr(),
  fluidRow(column(4, verbatimTextOutput("value")))
)

server <- function(input, output, session) {
  output$value <- renderPrint({input$action})
}

shinyApp(ui, server)

Selectinput

library(shiny)
library(shinydashboard)
library(shinyjs)

library(shiny)

ui <- fluidPage(
  selectInput("select",
            label = h3("셀렉트 박스"),
            choices = list(
              "선택1" = 1,
              "선택2" = 2,
              "선택3" = 3
              ),
            selected = 1,
  hr(),
  fluidRow(column(3, verbatimTextOutput("value")))
)

server <- function(input, output, session) {
  output$value <- renderPrint({input$date})
}

shinyApp(ui, server)

Slider

if("shiny" %in% installed.packages("shiny") == FALSE)install.packages("shiny")
library(shiny)
ui <- shiny::fluidPage(
  sliderInput(
    inputId = "num1",
    label = "숫자를 선택하세요",
    value = 25,
    min =1,
    max = 50,
    step = 1
  ),
  plotOutput("hist")
)
server <- function(input, output){
          output$hist <- renderPlot({
          hist(rnorm(input$num1),
          maing = "50 범위내에서 선택")
    })
}

shiny::shinyApp(ui, server)

TextInput

library(shiny)
library(shiny)

ui <- fluidPage(
  textInput("txt",
            label = h3("로그인"),
            value = "ID를 입력"
            ),
  hr(),
  fluidRow(column(3, verbatimTextOutput("value")))
)

server <- function(input, output, session) {
  output $value <- renderText({input$txt})
}

shinyApp(ui, server)
LS0tDQp0aXRsZTogIlNoaW55IEJ1dHRvbiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMgQWN0aW9uQnV0dG9uDQoNCmBgYHtyfQ0KbGlicmFyeShzaGlueSkNCmxpYnJhcnkoc2hpbnlkYXNoYm9hcmQpDQpsaWJyYXJ5KHNoaW55anMpDQoNCmxpYnJhcnkoc2hpbnkpDQoNCnVpIDwtIGZsdWlkUGFnZSgNCiAgYWN0aW9uQnV0dG9uKCJhY3Rpb24iLA0KICAgICAgICAgICAgICAgbGFiZWwgPSAi7JWh7IWY67KE7Yq8Ig0KICAgICAgICAgICAgICAgKSwNCiAgaHIoKSwNCiAgdmVyYmF0aW1UZXh0T3V0cHV0KCJ2YWx1ZSIpDQopDQoNCnNlcnZlciA8LSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBzZXNzaW9uKSB7DQogIG9uY2xpY2soImJ0biIsaW5mbyhkYXRlKCkpKQ0KfQ0KDQpzaGlueUFwcCh1aSwgc2VydmVyKQ0KDQpgYGANCiMjIyMgQWN0aW9uIEJ1dHRvbiBjaG9pY2VzDQpgYGB7cn0NCmxpYnJhcnkoc2hpbnkpDQpsaWJyYXJ5KHNoaW55ZGFzaGJvYXJkKQ0KbGlicmFyeShzaGlueWpzKQ0KDQpsaWJyYXJ5KHNoaW55KQ0KDQp1aSA8LSBmbHVpZFBhZ2UoDQogIGFjdGlvbkJ1dHRvbigiY2hrIiwNCiAgICAgICAgICAgICAgIGxhYmVsID0gaDMoIuyEoO2DnSIpLA0KICAgICAgICAgICAgICAgdmFsdWUgPSBUUlVFDQogICksDQogIGhyKCksDQogIGZsdWlkUm93KCkNCikNCg0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIHNlc3Npb24pIHsNCiAgb3V0cHV0JHZhbHVlIDwtIHJlbmRlclRleHQoe2lucHV0JGNoa30pDQp9DQoNCnNoaW55QXBwKHVpLCBzZXJ2ZXIpDQoNCmBgYA0KDQojIyMjIENhbGVuZGFyDQpgYGB7cn0NCmxpYnJhcnkoc2hpbnkpDQpsaWJyYXJ5KHNoaW55ZGFzaGJvYXJkKQ0KbGlicmFyeShzaGlueWpzKQ0KDQpsaWJyYXJ5KHNoaW55KQ0KDQp1aSA8LSBmbHVpZFBhZ2UoDQogIGRhdGVJbnB1dCgiZGF0ZSIsDQogICAgICAgICAgICBsYWJlbCA9IGgzKCLrgqDsp5zsnoXroKUiKSwNCiAgICAgICAgICAgIHZhbHVlID0gIjIwMTgtMDEtMDEiKSwNCmhyKCksDQpmbHVpZFJvdyhjb2x1bW4oMywgdmVyYmF0aW1UZXh0T3V0cHV0KCJ2YWx1ZSIpKSkNCikNCg0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIHNlc3Npb24pIHsNCiAgb3V0cHV0JHZhbHVlIDwtIHJlbmRlclByaW50KHtpbnB1dCRkYXRlfSkNCn0NCg0Kc2hpbnlBcHAodWksIHNlcnZlcikNCg0KYGBgDQoNCiMjIyMgQ2hlY2sgQm94DQpgYGB7cn0NCmxpYnJhcnkoc2hpbnkpDQpsaWJyYXJ5KHNoaW55ZGFzaGJvYXJkKQ0KbGlicmFyeShzaGlueWpzKQ0KDQpsaWJyYXJ5KHNoaW55KQ0KDQp1aSA8LSBmbHVpZFBhZ2UoDQogIGFjdGlvbkJ1dHRvbigiY2hrIiwNCiAgICAgICAgICAgICAgIGxhYmVsID0gaDMoIuyytO2BrOuwleyKpOq3uOujuSIpLA0KICAgICAgICAgICAgICAgY2hvaWNlcyA9IGxpc3QoIuyEoO2DnTEiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi7ISg7YOdMiI9MiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLshKDtg50zIj0zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAxDQogICAgICAgICAgICAgICAgKSwNCiAgaHIoKSwNCiAgZmx1aWRSb3coKQ0KKQ0KDQpzZXJ2ZXIgPC0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgc2Vzc2lvbikgew0KICBvdXRwdXQkdmFsdWUgPC0gcmVuZGVyVGV4dCh7aW5wdXQkY2hrfSkNCn0NCg0Kc2hpbnlBcHAodWksIHNlcnZlcikNCg0KYGBgDQoNCiMjIyMgRGF0ZQ0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJydmVzdCIpDQppbnN0YWxsLnBhY2thZ2VzKCJzaGlueSIpDQppbnN0YWxsLnBhY2thZ2VzKCJzaGlueWRhc2hib2FyZCIpDQppbnN0YWxsLnBhY2thZ2VzKCJzaGlueWpzIikNCg0KbGlicmFyeShzaGlueSkNCmxpYnJhcnkoc2hpbnlkYXNoYm9hcmQpDQpsaWJyYXJ5KHNoaW55anMpDQoNCmxpYnJhcnkoc2hpbnkpDQoNCnVpIDwtIGZsdWlkUGFnZSgNCiAgYWN0aW9uQnV0dG9uKCJkYXRlIiwNCiAgICAgICAgICAgICAgIGxhYmVsID0gIuyVoeyFmOuyhO2KvCINCiAgKSwNCiAgaHIoKSwNCiAgdmVyYmF0aW1UZXh0T3V0cHV0KCJ2YWx1ZSIpDQopDQoNCnNlcnZlciA8LSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBzZXNzaW9uKSB7DQogIG91dHB1dCR2YWx1ZSA9IHJlbmRlclRleHQoe2lucHV0JGFjdGlvbn0pDQp9DQoNCnNoaW55QXBwKHVpLCBzZXJ2ZXIpDQoNCmBgYA0KDQojIyMjIEZpbGUNCmBgYHtyfQ0KbGlicmFyeShzaGlueSkNCmxpYnJhcnkoc2hpbnlkYXNoYm9hcmQpDQpsaWJyYXJ5KHNoaW55anMpDQoNCmxpYnJhcnkoc2hpbnkpDQoNCnVpIDwtIGZsdWlkUGFnZSgNCiAgZmlsZUlucHV0KCJmaWxlIiwNCiAgICAgICAgICAgICAgICAgbGFiZWwgPSBoMygi7YyM7J28IOyXheuhnOuTnCIpDQogICksDQogIGhyKCksDQogIGZsdWlkUm93KGNvbHVtbig0LCB2ZXJiYXRpbVRleHRPdXRwdXQoInZhbHVlIikpKQ0KKQ0KDQpzZXJ2ZXIgPC0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgc2Vzc2lvbikgew0KICBvdXRwdXQkdmFsdWUgPC0gcmVuZGVyUHJpbnQoe3N0cihpbnB1dCRmaWxlKX0pDQp9DQoNCnNoaW55QXBwKHVpLCBzZXJ2ZXIpDQoNCmBgYA0KDQojIyMjIEdlbmRlciBDaGVjaw0KYGBge3J9DQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzaGlueWpzKQ0KDQpnZW5kZXIgPC0gZnVuY3Rpb24oeCl7DQogIHQgPC0gc3Vic3RyKHgsOCw4KSAjIHjripQg7KO866+865Ox66Gd67KI7Zi47J206rOgIOyXrOq4sOyEnCA467KI7Ke4LCA47J6Q66as6rmM7KeA66eMIOy2lOy2nO2VtOudvA0KICBjYXQoJ1xuIFNTTiDsl5DshJwg7LaU7Lac7ZWcIOqwkjonLHQpICAjIHByaW50KHQp64qUIOqwkuunjCDrs7Tsl6zso7zrr4DroZwgIGNhdOycvOuhnCDstpTstpzqsJIg7ZmV7J24DQogIHkgPC0gc3dpdGNoKHQsDQogICAgICAgICAnMSc9J+uCqOyEsScsDQogICAgICAgICAnMic9J+yXrOyEsScsDQogICAgICAgICAnMyc9J+uCqOyEsScsDQogICAgICAgICAnNCc9J+yXrOyEsScsDQogICAgICAgICAnNSc9J+yZuOq1reyduCcsDQogICAgICAgICAnNic9J+yZuOq1reyduCcsDQogICAgICAgICAn7J6Y66q765CcIOqwkicNCiAgICAgICAgICkNCiAgY2F0KCdcbiDqsrDqs7zqsJI6JywgeSkNCiAgcmV0dXJuKHkpDQp9DQoNCnVpIDwtIGZsdWlkUGFnZSgNCiAgdXNlU2hpbnlqcygpLA0KICB0ZXh0SW5wdXQoInR4dCIsDQogICAgICAgICAgICBsYWJlbCA9IGgzKCLso7zrr7zrsojtmLjslZ7snpDrpqwg7J6F66ClIiksDQogICAgICAgICAgICB2YWx1ZSA9IijsmIjsi5wpOTAwMTAxLTIiKSwNCiAgYWN0aW9uQnV0dG9uKCJidG4iLCAi7ZmVIOyduCIpDQopDQoNCnNlcnZlciA8LSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBzZXNzaW9uKSB7DQogIG9uY2xpY2soImJ0biIsDQogICAgICAgICAgaW5mbyh7Z2VuZGVyKGlucHV0JHR4dCl9KQ0KICAgICAgICAgICkNCiAgIyBvdXRwdXQgJHZhbHVlIDwtIHJlbmRlclRleHQoe2dlbmRlcihpbnB1dCR0eHQpfSkNCiAgIyDshLHrs4TsnYQg7LK07YGs7ZWY64qUIO2VqOyImCDsvZTrlKkNCn0NCg0Kc2hpbnlBcHAodWksIHNlcnZlcikNCg0KDQpgYGANCg0KIyMjIyBSYWRpbyBCdXR0b24NCmBgYHtyfQ0KaWYoInBsb3RseSIgJWluJSBpbnN0YWxsZWQucGFja2FnZXMoInBsb3RseSIpID09IEZBTFNFKWluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoc2hpbnkpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIFBvcHVsYXRpb24gPC0gc2FtcGxlKDE6MjAsMTAscmVwbGFjZSA9IFQpLA0KICBIb3VzZUhvbGRzIDwtIHNhbXBsZSgxOjIwLDEwLHJlcGxhY2UgPSBUKSwNCiAgeWVhciA8LSBzYW1wbGUoYygyMDAwLDIwMTApLDEwLHJlcGxhY2UgPSBUKQ0KKQ0KDQp1aSA8LSBmbHVpZFBhZ2UoDQogIHRpdGxlUGFuZWwoDQogICAgdGl0bGUgPSBoNCgi7J246rWsIOyhsOyCrCIsIGFsaWduID0gImNlbnRlciIpDQogICksDQogIHNpZGViYXJQYW5lbCgNCiAgICBzaWRlYmFyTGF5b3V0KA0KICAgICAgcmFkaW9CdXR0b25zKCJZRUFSIiwiMTDrhYQg7KO86riw7ISg7YOdIiwNCiAgICAgICAgICAgICAgICAgICBjaG9pY2VzID0gYygiMjAwMCIsICIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAiMjAwMCINCiAgICAgICkNCiAgICApDQogICksDQogIG1haW5QYW5lbCgNCiAgICBwbG90T3V0cHV0KCJiYXIiLGhlaWdodD01MDApDQogICkNCikNCg0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIHNlc3Npb24pew0KICByZWFjdGl2ZV9kYXRhIDwtIHJlYWN0aXZlKHsNCiAgICBzZWxlY3RlZC55ZWFyIDwtIGFzLm51bWVyaWMoaW5wdXQkWUVBUikNCiAgICByZXR1cm4oZGF0YVtkYXRhJHllYXIgPT0gc2VsZWN0ZWRfeWVhcl0pDQogIH0pDQogIG91dHB1dCRiYXIgPC0gcmVuZGVyUGxvdCh7DQogICAgY29sb3IgPC0gYygiYmx1ZCIsICJyZWQiKQ0KICAgIG91cl9kYXRhIDwtIHJlYWN0aXZlX2RhdGEoKQ0KICAgIGJhcnBsb3QoY29sU3VtcyhvdXJfZGF0YVssYygiUG9wdWxhdGlvbiIsIkhvdXNlSG9sZHMiKV0pLA0KICAgICAgICAgICAgeWxhYiA8LSAiVG90YWwiLA0KICAgICAgICAgICAgeGxhYiA8LSAiQ2Vuc3VzIFllYXIiLA0KICAgICAgICAgICAgbmFtZXMuYXJnID0gYygiUG9wdWxhdGlvbiIsIkhvdXNlSG9sZHMiKSwNCiAgICAgICAgICAgIGNvbCA9IGNvbG9yKQ0KICB9KQ0KfQ0KDQpzaGlueUFwcCh1aSwgc2VydmVyKQ0KDQpgYGANCg0KIyMjIyBSZXNlcnZhdGlvbg0KYGBge3J9DQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzaGlueWRhc2hib2FyZCkNCmxpYnJhcnkoc2hpbnlqcykNCg0KbGlicmFyeShzaGlueSkNCg0KdWkgPC0gZmx1aWRQYWdlKA0KICBkYXRlUmFuZ2VJbnB1dCgiZGF0ZSIsDQogICAgICAgICAgICAgICAgIGxhYmVsID0gaDMoIuq4sOqwhCDshKTsoJUiKQ0KICAgICAgICAgICAgICAgICApLA0KICBocigpLA0KICBmbHVpZFJvdyhjb2x1bW4oNCwgdmVyYmF0aW1UZXh0T3V0cHV0KCJ2YWx1ZSIpKSkNCikNCg0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIHNlc3Npb24pIHsNCiAgb3V0cHV0JHZhbHVlIDwtIHJlbmRlclByaW50KHtpbnB1dCRhY3Rpb259KQ0KfQ0KDQpzaGlueUFwcCh1aSwgc2VydmVyKQ0KDQoNCg0KYGBgDQoNCiMjIyMgU2VsZWN0aW5wdXQNCmBgYHtyfQ0KbGlicmFyeShzaGlueSkNCmxpYnJhcnkoc2hpbnlkYXNoYm9hcmQpDQpsaWJyYXJ5KHNoaW55anMpDQoNCmxpYnJhcnkoc2hpbnkpDQoNCnVpIDwtIGZsdWlkUGFnZSgNCiAgc2VsZWN0SW5wdXQoInNlbGVjdCIsDQogICAgICAgICAgICBsYWJlbCA9IGgzKCLshYDroIntirgg67CV7IqkIiksDQogICAgICAgICAgICBjaG9pY2VzID0gbGlzdCgNCiAgICAgICAgICAgICAgIuyEoO2DnTEiID0gMSwNCiAgICAgICAgICAgICAgIuyEoO2DnTIiID0gMiwNCiAgICAgICAgICAgICAgIuyEoO2DnTMiID0gMw0KICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgc2VsZWN0ZWQgPSAxLA0KICBocigpLA0KICBmbHVpZFJvdyhjb2x1bW4oMywgdmVyYmF0aW1UZXh0T3V0cHV0KCJ2YWx1ZSIpKSkNCikNCg0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIHNlc3Npb24pIHsNCiAgb3V0cHV0JHZhbHVlIDwtIHJlbmRlclByaW50KHtpbnB1dCRkYXRlfSkNCn0NCg0Kc2hpbnlBcHAodWksIHNlcnZlcikNCmBgYA0KDQojIyMjIFNsaWRlcg0KYGBge3J9DQppZigic2hpbnkiICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKCJzaGlueSIpID09IEZBTFNFKWluc3RhbGwucGFja2FnZXMoInNoaW55IikNCmxpYnJhcnkoc2hpbnkpDQp1aSA8LSBzaGlueTo6Zmx1aWRQYWdlKA0KICBzbGlkZXJJbnB1dCgNCiAgICBpbnB1dElkID0gIm51bTEiLA0KICAgIGxhYmVsID0gIuyIq+yekOulvCDshKDtg53tlZjshLjsmpQiLA0KICAgIHZhbHVlID0gMjUsDQogICAgbWluID0xLA0KICAgIG1heCA9IDUwLA0KICAgIHN0ZXAgPSAxDQogICksDQogIHBsb3RPdXRwdXQoImhpc3QiKQ0KKQ0Kc2VydmVyIDwtIGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpew0KICAgICAgICAgIG91dHB1dCRoaXN0IDwtIHJlbmRlclBsb3Qoew0KICAgICAgICAgIGhpc3Qocm5vcm0oaW5wdXQkbnVtMSksDQogICAgICAgICAgbWFpbmcgPSAiNTAg67KU7JyE64K07JeQ7IScIOyEoO2DnSIpDQogICAgfSkNCn0NCg0Kc2hpbnk6OnNoaW55QXBwKHVpLCBzZXJ2ZXIpDQoNCmBgYA0KDQojIyMjIFRleHRJbnB1dA0KYGBge3J9DQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzaGlueSkNCg0KdWkgPC0gZmx1aWRQYWdlKA0KICB0ZXh0SW5wdXQoInR4dCIsDQogICAgICAgICAgICBsYWJlbCA9IGgzKCLroZzqt7jsnbgiKSwNCiAgICAgICAgICAgIHZhbHVlID0gIklE66W8IOyeheugpSINCiAgICAgICAgICAgICksDQogIGhyKCksDQogIGZsdWlkUm93KGNvbHVtbigzLCB2ZXJiYXRpbVRleHRPdXRwdXQoInZhbHVlIikpKQ0KKQ0KDQpzZXJ2ZXIgPC0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgc2Vzc2lvbikgew0KICBvdXRwdXQgJHZhbHVlIDwtIHJlbmRlclRleHQoe2lucHV0JHR4dH0pDQp9DQoNCnNoaW55QXBwKHVpLCBzZXJ2ZXIpDQpgYGANCg0K