﻿{"id":62,"date":"2026-10-06T03:07:15","date_gmt":"2026-10-06T03:07:15","guid":{"rendered":"https:\/\/catventures.lol\/?page_id=62"},"modified":"2026-10-06T04:39:49","modified_gmt":"2026-10-06T04:39:49","slug":"count-catula-tail-from-the-crypt","status":"publish","type":"page","link":"https:\/\/catventures.lol\/?page_id=62","title":{"rendered":"Count Catula: Tail from the Crypt"},"content":{"rendered":"<style>\n#app, #app * { box-sizing: border-box; }\n#app {\n  height: calc(100dvh - 7.5rem);\n  min-height: 320px;\n  width: 100%;\n  max-width: 100%;\n  margin: 0;\n  display: flex;\n  flex-direction: column;\n  background: #120814;\n  color: #f5e6ff;\n  font-family: \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  position: relative;\n  overflow: hidden;\n}\n#stage {\n  position: relative;\n  flex: 1;\n  min-height: 0;\n  overflow: hidden;\n  line-height: 0;\n  background: #120814;\n}\n#app canvas {\n  width: 100%;\n  height: 100%;\n  display: block;\n  background: #120814;\n  touch-action: none;\n}\n#overlay {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: rgba(10, 4, 16, 0.62);\n  padding: 16px;\n  z-index: 3;\n}\n#overlay[hidden] { display: none !important; }\n.card {\n  width: min(560px, 100%);\n  background: #1c1028;\n  border: 1px solid #6a2a7a;\n  border-radius: 22px;\n  padding: 10px 16px 14px;\n  box-shadow: 0 18px 50px rgba(0, 0, 0, 0.45);\n  text-align: center;\n  color: #f5e6ff;\n}\n.card[hidden] { display: none !important; }\n.card h1 {\n  font-family: Georgia, \"Palatino Linotype\", serif;\n  font-size: 22px;\n  line-height: 1.15;\n  margin: 0 0 10px;\n  color: #ff6688;\n}\n.howto, .controls {\n  margin: 0 0 8px;\n  line-height: 1.4;\n  font-size: 14px;\n  color: #d8c0e8;\n}\n.controls { color: #b098c0; font-size: 12px; text-align: left; }\n#cosmetics { margin: 0 0 12px; font-size: 13px; color: #88ffaa; }\nbutton.go {\n  margin-top: 6px;\n  background: #a02060;\n  color: #fff5fa;\n  border: 0;\n  border-radius: 999px;\n  padding: 12px 32px;\n  font: 700 18px\/1 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  cursor: pointer;\n}\nbutton.go:hover { background: #c03078; }\nbutton.go:focus-visible { outline: 3px solid #ff88aa; outline-offset: 2px; }\n.hero-cover {\n  width: min(200px, 42%);\n  height: auto;\n  border-radius: 14px;\n  margin: 0 auto 8px;\n  display: block;\n  box-shadow: 0 8px 24px rgba(0,0,0,0.4);\n}\n#load-err { color: #ff6688; min-height: 1.2em; }\n#rotate-hint {\n  display: none;\n  position: absolute;\n  inset: 0;\n  z-index: 20;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  padding: 24px;\n  background: rgba(8, 4, 14, 0.92);\n  color: #f5e6ff;\n  font: 700 18px\/1.35 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n}\n#rotate-hint.show { display: flex; }\n#fs-hud {\n  display: none;\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  z-index: 25;\n}\n#app.mobile-play #fs-hud {\n  display: block;\n  position: fixed;\n  z-index: 100000;\n}\n#fs-exit {\n  display: block;\n  width: 40px;\n  height: 40px;\n  border: 0;\n  border-radius: 999px;\n  background: rgba(0,0,0,0.55);\n  color: #fff;\n  font: 700 20px\/1 sans-serif;\n  touch-action: none;\n}\n#pads {\n  display: none;\n  position: absolute;\n  inset: 0;\n  z-index: 8;\n  pointer-events: none;\n}\n#pads[hidden] { display: none !important; }\n#pads.touch-on:not([hidden]) { display: block; }\n#pads br { display: none !important; }\n#stick-zone {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 42%;\n  height: 55%;\n  pointer-events: auto;\n  touch-action: none;\n}\n#stick-base {\n  position: absolute;\n  left: 18px;\n  bottom: 18px;\n  width: 110px;\n  height: 110px;\n  border-radius: 999px;\n  background: rgba(80, 30, 100, 0.28);\n  border: 2px solid rgba(255,200,255,0.28);\n  pointer-events: none;\n}\n#stick-knob {\n  position: absolute;\n  left: 43px;\n  bottom: 43px;\n  width: 60px;\n  height: 60px;\n  border-radius: 999px;\n  background: rgba(200, 80, 160, 0.55);\n  border: 2px solid rgba(255,230,255,0.5);\n  pointer-events: none;\n}\n.pad-right {\n  position: absolute;\n  right: 10px;\n  bottom: 14px;\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  align-items: flex-end;\n  pointer-events: auto;\n}\n.pad-right button {\n  width: 68px;\n  height: 68px;\n  min-width: 64px;\n  min-height: 64px;\n  border: 0;\n  border-radius: 999px;\n  background: rgba(58, 24, 72, 0.72);\n  color: #f5e6ff;\n  font: 700 11px\/1.1 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  touch-action: none;\n  box-shadow: 0 4px 14px rgba(0,0,0,0.35);\n}\n.pad-right button:active { background: rgba(160, 32, 96, 0.9); }\n#pad-rage[hidden] { display: none !important; }\n#pad-spell {\n  width: 44px;\n  height: 44px;\n  min-width: 44px;\n  min-height: 44px;\n  font-size: 9px;\n  opacity: 0.85;\n}\n#app.mobile-play {\n  position: fixed !important;\n  top: 0 !important;\n  left: 0 !important;\n  right: 0 !important;\n  bottom: 0 !important;\n  inset: 0 !important;\n  width: 100dvw !important;\n  height: 100dvh !important;\n  max-width: none !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  z-index: 9999;\n  background: #000;\n  overflow: hidden;\n}\n#app.mobile-play #stage {\n  flex: 0 0 auto;\n  width: auto;\n  height: auto;\n  max-width: calc(100dvw - 16px);\n  max-height: calc(100dvh - 16px);\n  min-height: 0;\n  overflow: hidden;\n  background: #000;\n}\n#app.mobile-play canvas {\n  width: auto !important;\n  height: auto !important;\n  max-width: calc(100dvw - 16px);\n  max-height: calc(100dvh - 16px);\n  aspect-ratio: auto;\n  margin: 0;\n}\n#app.mobile-play #rotate-hint {\n  position: fixed;\n  inset: 0;\n  z-index: 100001;\n}\n#app.mobile-play #pads {\n  position: absolute;\n  inset: 0;\n}\nbody.cv-lock-scroll {\n  overflow: hidden !important;\n  touch-action: none;\n  overscroll-behavior: none;\n}\n@media (orientation: portrait) {\n  #app.mobile-play #rotate-hint.show { display: flex; }\n}\n<\/style>\n<div id=\"app\">\n<div id=\"stage\">\n<canvas id=\"game\" width=\"960\" height=\"540\"><\/canvas><\/p>\n<div id=\"overlay\">\n<div class=\"card\" id=\"title-card\">\n<img decoding=\"async\" class=\"hero-cover\" id=\"cover-img\" alt=\"Count Catula cover art\" src=\"https:\/\/catventures.lol\/wp-content\/uploads\/2026\/10\/cover.jpg\"><\/p>\n<p class=\"howto\">Campy gothic action. Clear the parlor, library, and conservatory.<\/p>\n<p class=\"controls\">Move (A\/D or arrows). Jump (Space bar) and hold to glide. Dash (Shift). Bolt (J). Yarn (K). Curse (L). Rage (U). Interact (E). Mute (M).<\/p>\n<p id=\"cosmetics\">\n<p id=\"load-err\">\n<p><button type=\"button\" class=\"go\" id=\"start-btn\">Play<\/button>\n<\/div>\n<div class=\"card\" id=\"end-card\" hidden>\n<h1 id=\"end-title\">Done<\/h1>\n<p class=\"howto\" id=\"end-msg\">\n<p><button type=\"button\" class=\"go\" id=\"again-btn\">Play again<\/button>\n<\/div>\n<\/div>\n<div id=\"rotate-hint\">Turn your phone sideways<\/div>\n<div id=\"pads\" hidden>\n<div id=\"stick-zone\">\n<div id=\"stick-base\"><\/div>\n<div id=\"stick-knob\"><\/div>\n<\/div>\n<div class=\"pad-right\">\n<button type=\"button\" id=\"pad-spell\" tabindex=\"-1\" aria-label=\"Swap spell\">Bolt<\/button><br \/>\n<button type=\"button\" id=\"pad-rage\" tabindex=\"-1\" aria-label=\"Rage\" hidden>Rage<\/button><br \/>\n<button type=\"button\" id=\"pad-fire\" tabindex=\"-1\" aria-label=\"Attack\">Attack<\/button><br \/>\n<button type=\"button\" id=\"pad-jump\" tabindex=\"-1\" aria-label=\"Jump\">Jump<\/button>\n<\/div>\n<\/div>\n<div id=\"fs-hud\"><button type=\"button\" id=\"fs-exit\" aria-label=\"Exit fullscreen\">X<\/button><\/div>\n<\/div>\n<\/div>\n<p><script>\n(function () {\n  var el = document.createElement(\"script\");\n  el.text = atob(\"d2luZG93LkNBVFVMQV9BU1NFVFMgPSB7CiAgY292ZXI6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9jb3Zlci5qcGciLAogIHNoZWV0OiAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvY2F0dWxhX3NoZWV0LnBuZyIsCiAgZXh0cmE6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9jYXR1bGFfZXh0cmEucG5nIiwKICBlbmVtaWVzOiAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvZW5lbWllc19zaGVldF92Ml90cmFuc3BhcmVudC5wbmciLAogIGNlbGw6IDk2LAogIGVuZW15Q2VsbDogOTYsCiAgZXh0cmFXOiAxNDAsCiAgZXh0cmFIOiAxMjAsCiAgYW5pbXM6IHsKICAgIGlkbGU6IHsgcm93OiAwLCBjb3VudDogNSB9LAogICAgd2FsazogeyByb3c6IDEsIGNvdW50OiA1IH0sCiAgICBydW46IHsgcm93OiAyLCBjb3VudDogNSB9LAogICAganVtcDogeyByb3c6IDMsIGNvdW50OiA0IH0sCiAgICBmYWxsOiB7IHJvdzogNCwgY291bnQ6IDQgfSwKICAgIGNyb3VjaDogeyByb3c6IDUsIGNvdW50OiA0IH0sCiAgICBhdHRhY2s6IHsgcm93OiA2LCBjb3VudDogNCB9LAogICAgaGl0OiB7IHJvdzogNywgY291bnQ6IDQgfSwKICAgIGRlYXRoOiB7IHJvdzogOCwgY291bnQ6IDMgfQogIH0sCiAgZW5lbXlSb3dzOiB7CiAgICBjdWx0aXN0OiAwLAogICAgbWlzdDogMSwKICAgIHB1ZzogMiwKICAgIGN1Y3VtYmVyOiAzLAogICAgZ2hvc3RjYXQ6IDQsCiAgICB2YWN1dW06IDUsCiAgICBsYXNlcjogNiwKICAgIGNoYW5kZWxpZXI6IDcsCiAgICBib29rc2hlbGY6IDgKICB9LAogIGV4dHJhQ291bnQ6IDMKfTsKLyogQ291bnQgQ2F0dWxhOiBUYWlsIGZyb20gdGhlIENyeXB0ICovCihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgQVNTRVRTID0gd2luZG93LkNBVFVMQV9BU1NFVFMgfHwgewogICAgY292ZXI6ICJzcHJpdGVzL2NvdmVyLmpwZyIsCiAgICBzaGVldDogInNwcml0ZXMvY2F0dWxhX3NoZWV0LnBuZyIsCiAgICBleHRyYTogInNwcml0ZXMvY2F0dWxhX2V4dHJhLnBuZyIsCiAgICBlbmVtaWVzOiAiZW5lbWllcy9lbmVtaWVzX3NoZWV0LnBuZyIsCiAgICBjZWxsOiA5NiwKICAgIGVuZW15Q2VsbDogOTYsCiAgICBleHRyYVc6IDE0MCwKICAgIGV4dHJhSDogMTIwLAogICAgYW5pbXM6IHsKICAgICAgaWRsZTogeyByb3c6IDAsIGNvdW50OiA1IH0sCiAgICAgIHdhbGs6IHsgcm93OiAxLCBjb3VudDogNSB9LAogICAgICBydW46IHsgcm93OiAyLCBjb3VudDogNSB9LAogICAgICBqdW1wOiB7IHJvdzogMywgY291bnQ6IDQgfSwKICAgICAgZmFsbDogeyByb3c6IDQsIGNvdW50OiA0IH0sCiAgICAgIGNyb3VjaDogeyByb3c6IDUsIGNvdW50OiA0IH0sCiAgICAgIGF0dGFjazogeyByb3c6IDYsIGNvdW50OiA0IH0sCiAgICAgIGhpdDogeyByb3c6IDcsIGNvdW50OiA0IH0sCiAgICAgIGRlYXRoOiB7IHJvdzogOCwgY291bnQ6IDMgfQogICAgfSwKICAgIGVuZW15Um93czogewogICAgICBjdWx0aXN0OiAwLAogICAgICBtaXN0OiAxLAogICAgICBwdWc6IDIsCiAgICAgIGN1Y3VtYmVyOiAzLAogICAgICBnaG9zdGNhdDogNCwKICAgICAgdmFjdXVtOiA1LAogICAgICBsYXNlcjogNiwKICAgICAgY2hhbmRlbGllcjogNywKICAgICAgYm9va3NoZWxmOiA4CiAgICB9LAogICAgZXh0cmFDb3VudDogMwogIH07CgogIHZhciBWSUVXX1cgPSA5NjA7CiAgdmFyIFZJRVdfSCA9IDU0MDsKICB2YXIgRkxPT1JfWSA9IDQ3MDsKICB2YXIgR1JBViA9IDIxMDA7CiAgdmFyIEpVTVBfViA9IC04ODA7CiAgdmFyIE1BWF9TUEVFRCA9IDI4MDsKICB2YXIgUlVOX1NQRUVEID0gMzgwOwogIHZhciBBQ0NFTCA9IDI0MDA7CiAgdmFyIEdMSURFX0ZBTEwgPSA5MDsKICB2YXIgREFTSF9TUEVFRCA9IDYyMDsKICB2YXIgREFTSF9USU1FID0gMC4yMjsKICB2YXIgREFTSF9DRCA9IDAuODU7CiAgdmFyIElGUkFNRV9EQVNIID0gMC4yODsKICB2YXIgUkFHRV9USU1FID0gODsKICB2YXIgUkFHRV9ORUVEID0gMTI7CiAgdmFyIFNBVkVfS0VZID0gImNvdW50Q2F0dWxhU2F2ZV92MSI7CgogIHZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpOwogIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICB2YXIgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVybGF5Iik7CiAgdmFyIHRpdGxlQ2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aXRsZS1jYXJkIik7CiAgdmFyIGVuZENhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW5kLWNhcmQiKTsKICB2YXIgZW5kVGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW5kLXRpdGxlIik7CiAgdmFyIGVuZE1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmQtbXNnIik7CiAgdmFyIHBhZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFkcyIpOwogIHZhciBjb3ZlckltZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvdmVyLWltZyIpOwoKCiAgdmFyIHRvdWNoVWlBcm1lZCA9IGZhbHNlOwogIHZhciBtb2JpbGVQbGF5ID0gZmFsc2U7CiAgdmFyIHNwZWxsTW9kZSA9IDA7CiAgdmFyIHNwZWxsTmFtZXMgPSBbIkJvbHQiLCAiWWFybiIsICJDdXJzZSJdOwogIHZhciBzdGljayA9IHsgYWN0aXZlOiBmYWxzZSwgaWQ6IG51bGwsIG94OiAwLCBveTogMCwgZHg6IDAsIGR5OiAwLCBsYXN0VGFwOiAwLCB0YXBzOiAwIH07CiAgdmFyIGF1dG9JbnRlcmFjdENkID0gMDsKICB2YXIgcm90YXRlSGludCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyb3RhdGUtaGludCIpOwogIHZhciBmc0V4aXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnMtZXhpdCIpOwogIHZhciBzdGlja1pvbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RpY2stem9uZSIpOwogIHZhciBzdGlja0tub2IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RpY2sta25vYiIpOwogIHZhciBwYWRTcGVsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwYWQtc3BlbGwiKTsKICB2YXIgcGFkUmFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwYWQtcmFnZSIpOwogIHZhciBwYWRGaXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhZC1maXJlIik7CiAgdmFyIHBhZEp1bXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFkLWp1bXAiKTsKICB2YXIgYXBwRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXBwIik7CgogIGZ1bmN0aW9uIGlzVG91Y2hEZXZpY2UoKSB7CiAgICBpZiAodG91Y2hVaUFybWVkKSByZXR1cm4gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgiKHBvaW50ZXI6IGNvYXJzZSkiKS5tYXRjaGVzKSByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikge30KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHNldFBhZHNWaXNpYmxlKHNob3cpIHsKICAgIGlmICghcGFkcykgcmV0dXJuOwogICAgaWYgKHNob3cgJiYgaXNUb3VjaERldmljZSgpKSB7CiAgICAgIHBhZHMuaGlkZGVuID0gZmFsc2U7CiAgICAgIHBhZHMuY2xhc3NMaXN0LmFkZCgidG91Y2gtb24iKTsKICAgICAgdXBkYXRlUmFnZVBhZCgpOwogICAgICB1cGRhdGVTcGVsbFBhZCgpOwogICAgfSBlbHNlIHsKICAgICAgcGFkcy5oaWRkZW4gPSB0cnVlOwogICAgICBwYWRzLmNsYXNzTGlzdC5yZW1vdmUoInRvdWNoLW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVTcGVsbFBhZCgpIHsKICAgIGlmIChwYWRTcGVsbCkgcGFkU3BlbGwudGV4dENvbnRlbnQgPSBzcGVsbE5hbWVzW3NwZWxsTW9kZV0gfHwgIkJvbHQiOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUmFnZVBhZCgpIHsKICAgIGlmICghcGFkUmFnZSB8fCAhcGxheWVyKSByZXR1cm47CiAgICB2YXIgcmVhZHkgPSBwbGF5ZXIucmFnZSA+PSBSQUdFX05FRUQgJiYgIXBsYXllci5yYWdpbmc7CiAgICBwYWRSYWdlLmhpZGRlbiA9ICFyZWFkeTsKICB9CgogIGZ1bmN0aW9uIHJlcXVlc3RNb2JpbGVMYW5kc2NhcGUoKSB7CiAgICB2YXIgdGFyZ2V0ID0gYXBwRWwgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgdmFyIHJlcSA9IHRhcmdldC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCB0YXJnZXQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4gfHwgdGFyZ2V0LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuOwogICAgdmFyIHAgPSBudWxsOwogICAgdHJ5IHsKICAgICAgaWYgKHJlcSkgcCA9IHJlcS5jYWxsKHRhcmdldCk7CiAgICB9IGNhdGNoIChlcnIpIHsgcCA9IG51bGw7IH0KICAgIGZ1bmN0aW9uIGxvY2tPcigpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoc2NyZWVuLm9yaWVudGF0aW9uICYmIHNjcmVlbi5vcmllbnRhdGlvbi5sb2NrKSB7CiAgICAgICAgICBzY3JlZW4ub3JpZW50YXRpb24ubG9jaygibGFuZHNjYXBlIikuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyMikge30KICAgIH0KICAgIGlmIChwICYmIHAudGhlbikgcC50aGVuKGxvY2tPcikuY2F0Y2gobG9ja09yKTsKICAgIGVsc2UgbG9ja09yKCk7CiAgfQoKICBmdW5jdGlvbiBlbnRlck1vYmlsZVBsYXkoKSB7CiAgICBpZiAoIWlzVG91Y2hEZXZpY2UoKSkgcmV0dXJuOwogICAgbW9iaWxlUGxheSA9IHRydWU7CiAgICBpZiAoYXBwRWwpIGFwcEVsLmNsYXNzTGlzdC5hZGQoIm1vYmlsZS1wbGF5Iik7CiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImN2LWxvY2stc2Nyb2xsIik7CiAgICBzZXRQYWRzVmlzaWJsZSh0cnVlKTsKICAgIHJlcXVlc3RNb2JpbGVMYW5kc2NhcGUoKTsKICAgIGZpdE1vYmlsZUNhbnZhcygpOwogICAgdXBkYXRlUm90YXRlSGludCgpOwogICAgc2V0VGltZW91dChmaXRNb2JpbGVDYW52YXMsIDUwKTsKICAgIHNldFRpbWVvdXQoZml0TW9iaWxlQ2FudmFzLCAyNTApOwogIH0KCiAgZnVuY3Rpb24gZXhpdE1vYmlsZVBsYXkoKSB7CiAgICBtb2JpbGVQbGF5ID0gZmFsc2U7CiAgICBpZiAoYXBwRWwpIGFwcEVsLmNsYXNzTGlzdC5yZW1vdmUoIm1vYmlsZS1wbGF5Iik7CiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImN2LWxvY2stc2Nyb2xsIik7CiAgICB0cnkgewogICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQpIHsKICAgICAgICB2YXIgZXggPSBkb2N1bWVudC5leGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbjsKICAgICAgICBpZiAoZXgpIGV4LmNhbGwoZG9jdW1lbnQpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHt9CiAgICBpZiAocm90YXRlSGludCkgcm90YXRlSGludC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7CiAgICBzZXRQYWRzVmlzaWJsZShmYWxzZSk7CiAgICBmaXRNb2JpbGVDYW52YXMoKTsKICB9CgoKCiAgZnVuY3Rpb24gaXNGc0FjdGl2ZSgpIHsKICAgIHJldHVybiAhIShkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCk7CiAgfQoKCiAgZnVuY3Rpb24gcGxhY2VGc0V4aXQoY3csIGNoLCB2dywgdmgpIHsKICAgIHZhciBodWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnMtaHVkIikgfHwgZnNFeGl0OwogICAgaWYgKCFodWQpIHJldHVybjsKICAgIGlmIChmc0V4aXQgJiYgYXBwRWwgJiYgZnNFeGl0LnBhcmVudEVsZW1lbnQgIT09IGFwcEVsICYmICghaHVkLmlkIHx8IGh1ZC5pZCAhPT0gImZzLWh1ZCIgfHwgaHVkLnBhcmVudEVsZW1lbnQgIT09IGFwcEVsKSkgewogICAgICB0cnkgewogICAgICAgIGlmIChodWQuaWQgPT09ICJmcy1odWQiKSBhcHBFbC5hcHBlbmRDaGlsZChodWQpOwogICAgICAgIGVsc2UgYXBwRWwuYXBwZW5kQ2hpbGQoZnNFeGl0KTsKICAgICAgfSBjYXRjaCAoZXJyKSB7fQogICAgfQogICAgaWYgKGh1ZC5pZCA9PT0gImZzLWh1ZCIgJiYgYXBwRWwgJiYgaHVkLnBhcmVudEVsZW1lbnQgIT09IGFwcEVsKSB7CiAgICAgIHRyeSB7IGFwcEVsLmFwcGVuZENoaWxkKGh1ZCk7IH0gY2F0Y2ggKGVycjIpIHt9CiAgICB9CiAgICBpZiAoIShtb2JpbGVQbGF5IHx8IGlzRnNBY3RpdmUoKSkpIHsKICAgICAgaHVkLnN0eWxlLnBvc2l0aW9uID0gIiI7CiAgICAgIGh1ZC5zdHlsZS50b3AgPSAiIjsKICAgICAgaHVkLnN0eWxlLnJpZ2h0ID0gIiI7CiAgICAgIGh1ZC5zdHlsZS5sZWZ0ID0gIiI7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBzaWRlID0gTWF0aC5tYXgoMCwgKHZ3IC0gY3cpIC8gMik7CiAgICB2YXIgdG9wR2FwID0gTWF0aC5tYXgoMCwgKHZoIC0gY2gpIC8gMik7CiAgICB2YXIgYnRuVyA9IDQwOwogICAgaHVkLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgIGh1ZC5zdHlsZS56SW5kZXggPSAiMTAwMDAwIjsKICAgIGh1ZC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgIGh1ZC5zdHlsZS5sZWZ0ID0gIiI7CiAgICBpZiAoc2lkZSA+PSBidG5XICsgOCkgewogICAgICBodWQuc3R5bGUudG9wID0gTWF0aC5tYXgoNiwgdG9wR2FwICsgOCkgKyAicHgiOwogICAgICBodWQuc3R5bGUucmlnaHQgPSBNYXRoLm1heCg2LCBNYXRoLmZsb29yKChzaWRlIC0gYnRuVykgLyAyKSkgKyAicHgiOwogICAgfSBlbHNlIGlmICh0b3BHYXAgPj0gNDApIHsKICAgICAgaHVkLnN0eWxlLnRvcCA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IoKHRvcEdhcCAtIDM2KSAvIDIpKSArICJweCI7CiAgICAgIGh1ZC5zdHlsZS5yaWdodCA9ICI2cHgiOwogICAgfSBlbHNlIHsKICAgICAgaHVkLnN0eWxlLnRvcCA9IE1hdGgubWF4KDIsIHRvcEdhcCArIDIpICsgInB4IjsKICAgICAgaHVkLnN0eWxlLnJpZ2h0ID0gTWF0aC5tYXgoMiwgc2lkZSArIDIpICsgInB4IjsKICAgIH0KICB9CgoKCgogIGZ1bmN0aW9uIGZpdE1vYmlsZUNhbnZhcygpIHsKICAgIHZhciBzdGFnZSA9IGNhbnZhcyA\/IGNhbnZhcy5wYXJlbnRFbGVtZW50IDogbnVsbDsKICAgIHZhciBmc01vZGUgPSBtb2JpbGVQbGF5IHx8IGlzRnNBY3RpdmUoKTsKICAgIGlmIChmc01vZGUpIHsKICAgICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGggfHwgMzIwOwogICAgICB2YXIgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMTgwOwogICAgICB2YXIgcGFkID0gMTY7CiAgICAgIHZhciBhdmFpbFcgPSBNYXRoLm1heCg4MCwgdncgLSBwYWQpOwogICAgICB2YXIgYXZhaWxIID0gTWF0aC5tYXgoODAsIHZoIC0gcGFkKTsKICAgICAgdmFyIGN3ID0gYXZhaWxXOwogICAgICB2YXIgY2ggPSBjdyAqIDkgLyAxNjsKICAgICAgaWYgKGNoID4gYXZhaWxIKSB7CiAgICAgICAgY2ggPSBhdmFpbEg7CiAgICAgICAgY3cgPSBjaCAqIDE2IC8gOTsKICAgICAgfQogICAgICBjdyA9IE1hdGguZmxvb3IoY3cpOwogICAgICBjaCA9IE1hdGguZmxvb3IoY2gpOwogICAgICB2YXIgbGVmdCA9IE1hdGguZmxvb3IoKHZ3IC0gY3cpIC8gMik7CiAgICAgIHZhciB0b3AgPSBNYXRoLmZsb29yKCh2aCAtIGNoKSAvIDIpOwogICAgICBpZiAoc3RhZ2UpIHsKICAgICAgICAvLyBXb3JkUHJlc3MgbWF5IGluamVjdCBlbXB0eSA8cD4gdGFncyB0aGF0IHNoaWZ0IGxheW91dAogICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHN0YWdlLnF1ZXJ5U2VsZWN0b3JBbGwoInAiKSkuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgaWYgKCFwLnRleHRDb250ZW50ICYmICFwLmNoaWxkcmVuLmxlbmd0aCkgcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApOwogICAgICAgIH0pOwogICAgICAgIHN0YWdlLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgICBzdGFnZS5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgICAgc3RhZ2Uuc3R5bGUudG9wID0gdG9wICsgInB4IjsKICAgICAgICBzdGFnZS5zdHlsZS53aWR0aCA9IGN3ICsgInB4IjsKICAgICAgICBzdGFnZS5zdHlsZS5oZWlnaHQgPSBjaCArICJweCI7CiAgICAgICAgc3RhZ2Uuc3R5bGUuZmxleCA9ICIwIDAgYXV0byI7CiAgICAgICAgc3RhZ2Uuc3R5bGUubWF4V2lkdGggPSBjdyArICJweCI7CiAgICAgICAgc3RhZ2Uuc3R5bGUubWF4SGVpZ2h0ID0gY2ggKyAicHgiOwogICAgICAgIHN0YWdlLnN0eWxlLm1hcmdpbiA9ICIwIjsKICAgICAgICBzdGFnZS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgICAgIHN0YWdlLnN0eWxlLmxpbmVIZWlnaHQgPSAiMCI7CiAgICAgIH0KICAgICAgY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJkaXNwbGF5IiwgImJsb2NrIiwgImltcG9ydGFudCIpOwogICAgICBjYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoInBvc2l0aW9uIiwgImFic29sdXRlIiwgImltcG9ydGFudCIpOwogICAgICBjYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoImxlZnQiLCAiMHB4IiwgImltcG9ydGFudCIpOwogICAgICBjYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoInRvcCIsICIwcHgiLCAiaW1wb3J0YW50Iik7CiAgICAgIGNhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLCBjdyArICJweCIsICJpbXBvcnRhbnQiKTsKICAgICAgY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLCBjaCArICJweCIsICJpbXBvcnRhbnQiKTsKICAgICAgY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJtYXgtd2lkdGgiLCBjdyArICJweCIsICJpbXBvcnRhbnQiKTsKICAgICAgY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJtYXgtaGVpZ2h0IiwgY2ggKyAicHgiLCAiaW1wb3J0YW50Iik7CiAgICAgIGNhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgibWFyZ2luIiwgIjBweCIsICJpbXBvcnRhbnQiKTsKICAgICAgaWYgKGFwcEVsKSB7CiAgICAgICAgYXBwRWwuc3R5bGUudG9wID0gIjBweCI7CiAgICAgICAgYXBwRWwuc3R5bGUubGVmdCA9ICIwcHgiOwogICAgICAgIGFwcEVsLnN0eWxlLnJpZ2h0ID0gIjBweCI7CiAgICAgICAgYXBwRWwuc3R5bGUuYm90dG9tID0gIjBweCI7CiAgICAgIH0KICAgICAgcGxhY2VGc0V4aXQoY3csIGNoLCB2dywgdmgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoImRpc3BsYXkiKTsKICAgIGNhbnZhcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgicG9zaXRpb24iKTsKICAgIGNhbnZhcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgibGVmdCIpOwogICAgY2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0b3AiKTsKICAgIGNhbnZhcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgid2lkdGgiKTsKICAgIGNhbnZhcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0Iik7CiAgICBjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm1heC13aWR0aCIpOwogICAgY2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJtYXgtaGVpZ2h0Iik7CiAgICBjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm1hcmdpbiIpOwogICAgaWYgKHN0YWdlKSB7CiAgICAgIHN0YWdlLnN0eWxlLnBvc2l0aW9uID0gIiI7CiAgICAgIHN0YWdlLnN0eWxlLmxlZnQgPSAiIjsKICAgICAgc3RhZ2Uuc3R5bGUudG9wID0gIiI7CiAgICAgIHN0YWdlLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIHN0YWdlLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBzdGFnZS5zdHlsZS5mbGV4ID0gIiI7CiAgICAgIHN0YWdlLnN0eWxlLm1heFdpZHRoID0gIiI7CiAgICAgIHN0YWdlLnN0eWxlLm1heEhlaWdodCA9ICIiOwogICAgICBzdGFnZS5zdHlsZS5tYXJnaW4gPSAiIjsKICAgICAgc3RhZ2Uuc3R5bGUub3ZlcmZsb3cgPSAiIjsKICAgICAgc3RhZ2Uuc3R5bGUubGluZUhlaWdodCA9ICIiOwogICAgfQogICAgaWYgKGFwcEVsKSB7CiAgICAgIGFwcEVsLnN0eWxlLnRvcCA9ICIiOwogICAgICBhcHBFbC5zdHlsZS5sZWZ0ID0gIiI7CiAgICAgIGFwcEVsLnN0eWxlLnJpZ2h0ID0gIiI7CiAgICAgIGFwcEVsLnN0eWxlLmJvdHRvbSA9ICIiOwogICAgfQogICAgcGxhY2VGc0V4aXQoMCwgMCwgd2luZG93LmlubmVyV2lkdGggfHwgMCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOwogIH0KCgoKCiAgZnVuY3Rpb24gdXBkYXRlUm90YXRlSGludCgpIHsKICAgIGlmICghcm90YXRlSGludCkgcmV0dXJuOwogICAgdmFyIHBvcnRyYWl0ID0gd2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihvcmllbnRhdGlvbjogcG9ydHJhaXQpIikubWF0Y2hlczsKICAgIGlmIChtb2JpbGVQbGF5ICYmIHBvcnRyYWl0KSByb3RhdGVIaW50LmNsYXNzTGlzdC5hZGQoInNob3ciKTsKICAgIGVsc2Ugcm90YXRlSGludC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7CiAgfQoKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICB1cGRhdGVSb3RhdGVIaW50KCk7CiAgICBzZXRUaW1lb3V0KGZpdE1vYmlsZUNhbnZhcywgMjAwKTsKICB9KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgZnVuY3Rpb24gKCkgewogICAgdXBkYXRlUm90YXRlSGludCgpOwogICAgZml0TW9iaWxlQ2FudmFzKCk7CiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZnVsbHNjcmVlbmNoYW5nZSIsIGZpdE1vYmlsZUNhbnZhcyk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSIsIGZpdE1vYmlsZUNhbnZhcyk7CiAgaWYgKGZzRXhpdCkgewogICAgZnNFeGl0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBleGl0TW9iaWxlUGxheSgpOwogICAgfSk7CiAgfQoKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGZ1bmN0aW9uICgpIHsKICAgIHRvdWNoVWlBcm1lZCA9IHRydWU7CiAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICBpZiAobW9iaWxlUGxheSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZ2VzdHVyZXN0YXJ0IiwgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChtb2JpbGVQbGF5KSBlLnByZXZlbnREZWZhdWx0KCk7CiAgfSk7CgoKCiAgdmFyIGltYWdlcyA9IHsgY292ZXI6IG51bGwsIHNoZWV0OiBudWxsLCBleHRyYTogbnVsbCwgZW5lbWllczogbnVsbCB9OwogIHZhciByZWFkeSA9IGZhbHNlOwogIHZhciBtdXRlZCA9IGZhbHNlOwogIHZhciBhdWRpb0N0eCA9IG51bGw7CiAgdmFyIG11c2ljTm9kZXMgPSBudWxsOwogIHZhciBtdXNpY1JhdGUgPSAxOwoKICB2YXIga2V5cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIHRvdWNoID0geyBsZWZ0OiBmYWxzZSwgcmlnaHQ6IGZhbHNlLCBqdW1wOiBmYWxzZSwgZGFzaDogZmFsc2UsIGZpcmU6IGZhbHNlLCBzcGVjaWFsOiBmYWxzZSwgY3Vyc2U6IGZhbHNlLCByYWdlOiBmYWxzZSwgaW50ZXJhY3Q6IGZhbHNlLCBheGlzWDogMCwgYXhpc1k6IDAgfTsKCiAgdmFyIHN0YXRlID0gInRpdGxlIjsKICB2YXIgbGV2ZWxJbmRleCA9IDA7CiAgdmFyIHNjb3JlID0gMDsKICB2YXIgaGlnaFNjb3JlID0gMDsKICB2YXIgdW5sb2NrZWQgPSB7IGNvbGxhcjogZmFsc2UsIHRvcGhhdDogZmFsc2UgfTsKICB2YXIgbWF4TGV2ZWxSZWFjaGVkID0gMDsKICB2YXIgY2FtZXJhWCA9IDA7CiAgdmFyIHRpbWUgPSAwOwogIHZhciB3YXZlID0gMDsKICB2YXIgd2F2ZVRpbWVyID0gMDsKICB2YXIgbGV2ZWxDbGVhclRpbWVyID0gMDsKICB2YXIgbWVzc2FnZSA9ICIiOwogIHZhciBtZXNzYWdlVCA9IDA7CgogIHZhciBwbGF5ZXIgPSBudWxsOwogIHZhciBlbnRpdGllcyA9IFtdOwogIHZhciBwYXJ0aWNsZXMgPSBbXTsKICB2YXIgcHJvamVjdGlsZXMgPSBbXTsKICB2YXIgbGV2ZWwgPSBudWxsOwoKICBmdW5jdGlvbiBsb2FkU2F2ZSgpIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTQVZFX0tFWSk7CiAgICAgIGlmICghcmF3KSByZXR1cm47CiAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShyYXcpOwogICAgICBoaWdoU2NvcmUgPSBkYXRhLmhpZ2hTY29yZSB8fCAwOwogICAgICBtYXhMZXZlbFJlYWNoZWQgPSBkYXRhLm1heExldmVsUmVhY2hlZCB8fCAwOwogICAgICB1bmxvY2tlZCA9IGRhdGEudW5sb2NrZWQgfHwgdW5sb2NrZWQ7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gc2F2ZVByb2dyZXNzKCkgewogICAgdHJ5IHsKICAgICAgaWYgKHNjb3JlID4gaGlnaFNjb3JlKSBoaWdoU2NvcmUgPSBzY29yZTsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU0FWRV9LRVksIEpTT04uc3RyaW5naWZ5KHsKICAgICAgICBoaWdoU2NvcmU6IGhpZ2hTY29yZSwKICAgICAgICBtYXhMZXZlbFJlYWNoZWQ6IG1heExldmVsUmVhY2hlZCwKICAgICAgICB1bmxvY2tlZDogdW5sb2NrZWQKICAgICAgfSkpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGxvYWRJbWFnZShzcmMpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgaW1nLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7IHJlc29sdmUoaW1nKTsgfTsKICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChuZXcgRXJyb3IoImltZyAiICsgc3JjKSk7IH07CiAgICAgIGltZy5zcmMgPSBzcmM7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJhbmQoYSwgYikgeyByZXR1cm4gYSArIE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpOyB9CiAgZnVuY3Rpb24gY2xhbXAodiwgYSwgYikgeyByZXR1cm4gTWF0aC5tYXgoYSwgTWF0aC5taW4oYiwgdikpOyB9CiAgZnVuY3Rpb24gYWFiYihhLCBiKSB7CiAgICByZXR1cm4gYS54IDwgYi54ICsgYi53ICYmIGEueCArIGEudyA+IGIueCAmJiBhLnkgPCBiLnkgKyBiLmggJiYgYS55ICsgYS5oID4gYi55OwogIH0KICBmdW5jdGlvbiBkaXN0KGF4LCBheSwgYngsIGJ5KSB7CiAgICB2YXIgZHggPSBheCAtIGJ4LCBkeSA9IGF5IC0gYnk7CiAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKICB9CgogIC8qIC0tLS0tLS0tLS0gQXVkaW8gKFdlYkF1ZGlvIHN5bnRoKSAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gZW5zdXJlQXVkaW8oKSB7CiAgICBpZiAoYXVkaW9DdHgpIHJldHVybjsKICAgIHZhciBBQyA9IHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dDsKICAgIGlmICghQUMpIHJldHVybjsKICAgIGF1ZGlvQ3R4ID0gbmV3IEFDKCk7CiAgICBzdGFydE11c2ljKCk7CiAgfQoKICBmdW5jdGlvbiBzdGFydE11c2ljKCkgewogICAgaWYgKCFhdWRpb0N0eCB8fCBtdXNpY05vZGVzKSByZXR1cm47CiAgICB2YXIgY3R4QSA9IGF1ZGlvQ3R4OwogICAgdmFyIG1hc3RlciA9IGN0eEEuY3JlYXRlR2FpbigpOwogICAgbWFzdGVyLmdhaW4udmFsdWUgPSBtdXRlZCA\/IDAgOiAwLjA4OwogICAgbWFzdGVyLmNvbm5lY3QoY3R4QS5kZXN0aW5hdGlvbik7CgogICAgdmFyIG9zYzEgPSBjdHhBLmNyZWF0ZU9zY2lsbGF0b3IoKTsKICAgIHZhciBvc2MyID0gY3R4QS5jcmVhdGVPc2NpbGxhdG9yKCk7CiAgICB2YXIgZ2FpbjEgPSBjdHhBLmNyZWF0ZUdhaW4oKTsKICAgIHZhciBnYWluMiA9IGN0eEEuY3JlYXRlR2FpbigpOwogICAgb3NjMS50eXBlID0gInNhd3Rvb3RoIjsKICAgIG9zYzIudHlwZSA9ICJzcXVhcmUiOwogICAgZ2FpbjEuZ2Fpbi52YWx1ZSA9IDAuMzU7CiAgICBnYWluMi5nYWluLnZhbHVlID0gMC4xODsKICAgIG9zYzEuY29ubmVjdChnYWluMSk7IGdhaW4xLmNvbm5lY3QobWFzdGVyKTsKICAgIG9zYzIuY29ubmVjdChnYWluMik7IGdhaW4yLmNvbm5lY3QobWFzdGVyKTsKCiAgICB2YXIgbm90ZXMgPSBbMTEwLCAxMzAuODEsIDE0Ni44MywgMTY0LjgxLCAxNDYuODMsIDEzMC44MSwgMTEwLCA5OF07CiAgICB2YXIgc3RlcCA9IDA7CiAgICB2YXIgaW50ZXJ2YWwgPSBudWxsOwoKICAgIGZ1bmN0aW9uIHRpY2soKSB7CiAgICAgIGlmICghYXVkaW9DdHgpIHJldHVybjsKICAgICAgdmFyIG4gPSBub3Rlc1tzdGVwICUgbm90ZXMubGVuZ3RoXTsKICAgICAgdmFyIHQgPSBhdWRpb0N0eC5jdXJyZW50VGltZTsKICAgICAgb3NjMS5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUobiAqIG11c2ljUmF0ZSwgdCk7CiAgICAgIG9zYzIuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKG4gKiAxLjUgKiBtdXNpY1JhdGUsIHQpOwogICAgICBzdGVwICs9IDE7CiAgICB9CiAgICBvc2MxLnN0YXJ0KCk7CiAgICBvc2MyLnN0YXJ0KCk7CiAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKHRpY2ssIDI4MCk7CiAgICB0aWNrKCk7CiAgICBtdXNpY05vZGVzID0geyBtYXN0ZXI6IG1hc3Rlciwgb3NjMTogb3NjMSwgb3NjMjogb3NjMiwgaW50ZXJ2YWw6IGludGVydmFsIH07CiAgfQoKICBmdW5jdGlvbiBzZXRNdXRlKG0pIHsKICAgIG11dGVkID0gbTsKICAgIGlmIChtdXNpY05vZGVzKSBtdXNpY05vZGVzLm1hc3Rlci5nYWluLnZhbHVlID0gbXV0ZWQgPyAwIDogMC4wODsKICB9CgogIGZ1bmN0aW9uIHNmeChraW5kKSB7CiAgICBpZiAoIWF1ZGlvQ3R4IHx8IG11dGVkKSByZXR1cm47CiAgICB2YXIgdCA9IGF1ZGlvQ3R4LmN1cnJlbnRUaW1lOwogICAgdmFyIG8gPSBhdWRpb0N0eC5jcmVhdGVPc2NpbGxhdG9yKCk7CiAgICB2YXIgZyA9IGF1ZGlvQ3R4LmNyZWF0ZUdhaW4oKTsKICAgIG8uY29ubmVjdChnKTsgZy5jb25uZWN0KGF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTsKICAgIGlmIChraW5kID09PSAiYm9sdCIpIHsKICAgICAgby50eXBlID0gInNxdWFyZSI7IG8uZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKDg4MCwgdCk7IG8uZnJlcXVlbmN5LmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMjIwLCB0ICsgMC4xMik7CiAgICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjA4LCB0KTsgZy5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDEsIHQgKyAwLjEyKTsKICAgICAgby5zdGFydCh0KTsgby5zdG9wKHQgKyAwLjEzKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInlhcm4iKSB7CiAgICAgIG8udHlwZSA9ICJ0cmlhbmdsZSI7IG8uZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKDMyMCwgdCk7IG8uZnJlcXVlbmN5LmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDUyMCwgdCArIDAuMjUpOwogICAgICBnLmdhaW4uc2V0VmFsdWVBdFRpbWUoMC4wNywgdCk7IGcuZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMDAxLCB0ICsgMC4zKTsKICAgICAgby5zdGFydCh0KTsgby5zdG9wKHQgKyAwLjMxKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImhpdCIpIHsKICAgICAgby50eXBlID0gInNhd3Rvb3RoIjsgby5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUoMTgwLCB0KTsgby5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSg2MCwgdCArIDAuMTUpOwogICAgICBnLmdhaW4uc2V0VmFsdWVBdFRpbWUoMC4xLCB0KTsgZy5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDEsIHQgKyAwLjE2KTsKICAgICAgby5zdGFydCh0KTsgby5zdG9wKHQgKyAwLjE3KTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImRhc2giKSB7CiAgICAgIG8udHlwZSA9ICJzaW5lIjsgby5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUoMjAwLCB0KTsgby5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSg2MDAsIHQgKyAwLjE4KTsKICAgICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDYsIHQpOyBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMSwgdCArIDAuMik7CiAgICAgIG8uc3RhcnQodCk7IG8uc3RvcCh0ICsgMC4yMSk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJyYWdlIikgewogICAgICBvLnR5cGUgPSAic2F3dG9vdGgiOyBvLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSg5MCwgdCk7IG8uZnJlcXVlbmN5LmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDIyMCwgdCArIDAuNCk7CiAgICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjEyLCB0KTsgZy5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDEsIHQgKyAwLjUpOwogICAgICBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIDAuNTEpOwogICAgfSBlbHNlIGlmIChraW5kID09PSAicGlja3VwIikgewogICAgICBvLnR5cGUgPSAic2luZSI7IG8uZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKDY2MCwgdCk7IG8uZnJlcXVlbmN5LmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDk5MCwgdCArIDAuMSk7CiAgICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjA3LCB0KTsgZy5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDEsIHQgKyAwLjE1KTsKICAgICAgby5zdGFydCh0KTsgby5zdG9wKHQgKyAwLjE2KTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImludGVyYWN0IikgewogICAgICBvLnR5cGUgPSAidHJpYW5nbGUiOyBvLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSgyNDAsIHQpOyBvLmZyZXF1ZW5jeS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgxODAsIHQgKyAwLjIpOwogICAgICBnLmdhaW4uc2V0VmFsdWVBdFRpbWUoMC4wNiwgdCk7IGcuZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMDAxLCB0ICsgMC4yNSk7CiAgICAgIG8uc3RhcnQodCk7IG8uc3RvcCh0ICsgMC4yNik7CiAgICB9CiAgfQoKICAvKiAtLS0tLS0tLS0tIFBhcnRpY2xlcyAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYWRkUGFydGljbGUoeCwgeSwgb3B0cykgewogICAgcGFydGljbGVzLnB1c2goewogICAgICB4OiB4LCB5OiB5LAogICAgICB2eDogb3B0cy52eCB8fCAwLCB2eTogb3B0cy52eSB8fCAwLAogICAgICBsaWZlOiBvcHRzLmxpZmUgfHwgMC41LCBtYXg6IG9wdHMubGlmZSB8fCAwLjUsCiAgICAgIGNvbG9yOiBvcHRzLmNvbG9yIHx8ICIjZmY2NmFhIiwKICAgICAgc2l6ZTogb3B0cy5zaXplIHx8IDQsCiAgICAgIGdyYXY6IG9wdHMuZ3JhdiB8fCAwCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJ1cnN0KHgsIHksIGNvbG9yLCBuKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgYSA9IHJhbmQoMCwgTWF0aC5QSSAqIDIpOwogICAgICB2YXIgc3AgPSByYW5kKDQwLCAxODApOwogICAgICBhZGRQYXJ0aWNsZSh4LCB5LCB7IHZ4OiBNYXRoLmNvcyhhKSAqIHNwLCB2eTogTWF0aC5zaW4oYSkgKiBzcCwgbGlmZTogcmFuZCgwLjMsIDAuNyksIGNvbG9yOiBjb2xvciwgc2l6ZTogcmFuZCgyLCA1KSB9KTsKICAgIH0KICB9CgogIC8qIC0tLS0tLS0tLS0gTGV2ZWxzIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBtYWtlTGV2ZWxzKCkgewogICAgcmV0dXJuIFsKICAgICAgewogICAgICAgIG5hbWU6ICJUaGUgUGFybG9yIiwKICAgICAgICB3aWR0aDogMzIwMCwKICAgICAgICBzcGF3bjogMTIwLAogICAgICAgIHRoZW1lOiAicGFybG9yIiwKICAgICAgICBwbGF0Zm9ybXM6IFsKICAgICAgICAgIHsgeDogNDIwLCB5OiAzNjAsIHc6IDE2MCwgaDogMTgsIGtpbmQ6ICJzb2ZhIiB9LAogICAgICAgICAgeyB4OiA3ODAsIHk6IDMwMCwgdzogMjAwLCBoOiAxNiwga2luZDogInNoZWxmIiB9LAogICAgICAgICAgeyB4OiAxMTgwLCB5OiAzNDAsIHc6IDE0MCwgaDogMTYsIGtpbmQ6ICJ0YWJsZSIgfSwKICAgICAgICAgIHsgeDogMTYwMCwgeTogMjgwLCB3OiAyMjAsIGg6IDE2LCBraW5kOiAibWFudGxlIiB9LAogICAgICAgICAgeyB4OiAyMTAwLCB5OiAzNTAsIHc6IDE4MCwgaDogMTYsIGtpbmQ6ICJzb2ZhIiB9LAogICAgICAgICAgeyB4OiAyNTAwLCB5OiAzMDAsIHc6IDE2MCwgaDogMTYsIGtpbmQ6ICJzaGVsZiIgfSwKICAgICAgICAgIHsgeDogMjgwMCwgeTogMzYwLCB3OiAxNDAsIGg6IDE2LCBraW5kOiAidGFibGUiIH0KICAgICAgICBdLAogICAgICAgIGJyZWFrYWJsZXM6IFsKICAgICAgICAgIHsgeDogOTAwLCB5OiAyNTAsIHc6IDM2LCBoOiA0OCwga2luZDogInZhc2UiLCBocDogMSB9LAogICAgICAgICAgeyB4OiAxNzAwLCB5OiAyMzAsIHc6IDM2LCBoOiA0OCwga2luZDogInZhc2UiLCBocDogMSB9LAogICAgICAgICAgeyB4OiAyNTUwLCB5OiAyNTAsIHc6IDM2LCBoOiA0OCwga2luZDogInZhc2UiLCBocDogMSB9CiAgICAgICAgXSwKICAgICAgICBjaGFuZGVsaWVyOiB7IHg6IDE0MDAsIHk6IDgwLCB3OiAxMDAsIGg6IDcwLCBkcm9wcGVkOiBmYWxzZSwgZmFsbGluZzogZmFsc2UsIHZ5OiAwIH0sCiAgICAgICAgc3VuczogW10sCiAgICAgICAgZHJhcGVzOiBbXSwKICAgICAgICB0b3JjaGVzOiBbCiAgICAgICAgICB7IHg6IDYwMCwgeTogMjAwLCBvbjogdHJ1ZSB9LAogICAgICAgICAgeyB4OiAxOTAwLCB5OiAyMDAsIG9uOiB0cnVlIH0KICAgICAgICBdLAogICAgICAgIGN1Y3VtYmVyczogWwogICAgICAgICAgeyB4OiAxMDAwLCB5OiBGTE9PUl9ZIC0gMTAsIGFybWVkOiB0cnVlLCBwb3BwZWQ6IGZhbHNlLCB0OiAwIH0sCiAgICAgICAgICB7IHg6IDIzMDAsIHk6IEZMT09SX1kgLSAxMCwgYXJtZWQ6IHRydWUsIHBvcHBlZDogZmFsc2UsIHQ6IDAgfQogICAgICAgIF0sCiAgICAgICAgd2F2ZXM6IFsKICAgICAgICAgIHsgZGVsYXk6IDAuNSwgc3Bhd246IFt7IHR5cGU6ICJjdWx0aXN0IiwgeDogNzAwIH0sIHsgdHlwZTogIm1pc3QiLCB4OiA5MDAgfSwgeyB0eXBlOiAiY3VsdGlzdCIsIHg6IDExMDAgfV0gfSwKICAgICAgICAgIHsgZGVsYXk6IDYsIHNwYXduOiBbeyB0eXBlOiAicHVnIiwgeDogMTUwMCB9LCB7IHR5cGU6ICJtaXN0IiwgeDogMTY1MCB9LCB7IHR5cGU6ICJjdWx0aXN0IiwgeDogMTgwMCB9LCB7IHR5cGU6ICJnaG9zdGNhdCIsIHg6IDIwMDAgfV0gfSwKICAgICAgICAgIHsgZGVsYXk6IDEyLCBzcGF3bjogW3sgdHlwZTogImN1bHRpc3QiLCB4OiAyMjAwIH0sIHsgdHlwZTogIm1pc3QiLCB4OiAyNDAwIH0sIHsgdHlwZTogInB1ZyIsIHg6IDI2MDAgfSwgeyB0eXBlOiAiY3VsdGlzdCIsIHg6IDI5MDAgfV0gfQogICAgICAgIF0sCiAgICAgICAgYm9zczogbnVsbCwKICAgICAgICBnb2FsS2lsbHM6IDEwCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBuYW1lOiAiR3JhbmQgTGlicmFyeSIsCiAgICAgICAgd2lkdGg6IDM2MDAsCiAgICAgICAgc3Bhd246IDEwMCwKICAgICAgICB0aGVtZTogImxpYnJhcnkiLAogICAgICAgIHBsYXRmb3JtczogWwogICAgICAgICAgeyB4OiAzNTAsIHk6IDM1MCwgdzogMTgwLCBoOiAxNiwga2luZDogImJvb2tzIiB9LAogICAgICAgICAgeyB4OiA3MDAsIHk6IDI4MCwgdzogMjAwLCBoOiAxNiwga2luZDogImJvb2tzIiB9LAogICAgICAgICAgeyB4OiAxMTAwLCB5OiAzMzAsIHc6IDE2MCwgaDogMTYsIGtpbmQ6ICJ0YWJsZSIgfSwKICAgICAgICAgIHsgeDogMTUwMCwgeTogMjYwLCB3OiAyMjAsIGg6IDE2LCBraW5kOiAiYm9va3MiIH0sCiAgICAgICAgICB7IHg6IDIwMDAsIHk6IDMyMCwgdzogMTgwLCBoOiAxNiwga2luZDogInNoZWxmIiB9LAogICAgICAgICAgeyB4OiAyNDUwLCB5OiAyNzAsIHc6IDIwMCwgaDogMTYsIGtpbmQ6ICJib29rcyIgfSwKICAgICAgICAgIHsgeDogMjkwMCwgeTogMzQwLCB3OiAxNjAsIGg6IDE2LCBraW5kOiAidGFibGUiIH0sCiAgICAgICAgICB7IHg6IDMyMDAsIHk6IDI4MCwgdzogMTgwLCBoOiAxNiwga2luZDogInNoZWxmIiB9CiAgICAgICAgXSwKICAgICAgICBicmVha2FibGVzOiBbCiAgICAgICAgICB7IHg6IDgwMCwgeTogMjMwLCB3OiA0MCwgaDogNTAsIGtpbmQ6ICJ2YXNlIiwgaHA6IDEgfSwKICAgICAgICAgIHsgeDogMjEwMCwgeTogMjcwLCB3OiA0MCwgaDogNTAsIGtpbmQ6ICJ2YXNlIiwgaHA6IDEgfQogICAgICAgIF0sCiAgICAgICAgY2hhbmRlbGllcjogbnVsbCwKICAgICAgICBmYWxsaW5nU2hlbHZlczogWwogICAgICAgICAgeyB4OiAxMzAwLCB5OiA2MCwgdzogMTYwLCBoOiA0MCwgdHJpZ2dlcmVkOiBmYWxzZSwgZmFsbGluZzogZmFsc2UsIHZ5OiAwLCB0OiAwIH0sCiAgICAgICAgICB7IHg6IDI3MDAsIHk6IDYwLCB3OiAxNjAsIGg6IDQwLCB0cmlnZ2VyZWQ6IGZhbHNlLCBmYWxsaW5nOiBmYWxzZSwgdnk6IDAsIHQ6IDAgfQogICAgICAgIF0sCiAgICAgICAgc2Nyb2xsczogWwogICAgICAgICAgeyB4OiA5MDAsIHk6IDE4MCwgdng6IDgwLCB3OiAyOCwgaDogMjggfSwKICAgICAgICAgIHsgeDogMTgwMCwgeTogMjIwLCB2eDogLTcwLCB3OiAyOCwgaDogMjggfSwKICAgICAgICAgIHsgeDogMjUwMCwgeTogMTYwLCB2eDogOTAsIHc6IDI4LCBoOiAyOCB9CiAgICAgICAgXSwKICAgICAgICBzdW5zOiBbXSwKICAgICAgICBkcmFwZXM6IFtdLAogICAgICAgIHRvcmNoZXM6IFt7IHg6IDUwMCwgeTogMTkwLCBvbjogdHJ1ZSB9LCB7IHg6IDE2MDAsIHk6IDE5MCwgb246IHRydWUgfSwgeyB4OiAzMDAwLCB5OiAxOTAsIG9uOiB0cnVlIH1dLAogICAgICAgIGN1Y3VtYmVyczogW3sgeDogMTYwMCwgeTogRkxPT1JfWSAtIDEwLCBhcm1lZDogdHJ1ZSwgcG9wcGVkOiBmYWxzZSwgdDogMCB9XSwKICAgICAgICB3YXZlczogWwogICAgICAgICAgeyBkZWxheTogMC40LCBzcGF3bjogW3sgdHlwZTogImN1bHRpc3QiLCB4OiA2MDAgfSwgeyB0eXBlOiAibWlzdCIsIHg6IDgwMCB9LCB7IHR5cGU6ICJjdWx0aXN0IiwgeDogMTAwMCB9XSB9LAogICAgICAgICAgeyBkZWxheTogNywgc3Bhd246IFt7IHR5cGU6ICJwdWciLCB4OiAxNDAwIH0sIHsgdHlwZTogIm1pc3QiLCB4OiAxNjAwIH0sIHsgdHlwZTogImN1bHRpc3QiLCB4OiAxOTAwIH0sIHsgdHlwZTogInB1ZyIsIHg6IDIzMDAgfV0gfSwKICAgICAgICAgIHsgZGVsYXk6IDE0LCBzcGF3bjogW3sgdHlwZTogImN1bHRpc3QiLCB4OiAyODAwIH0sIHsgdHlwZTogImdob3N0Y2F0IiwgeDogMjk1MCB9LCB7IHR5cGU6ICJtaXN0IiwgeDogMzAwMCB9LCB7IHR5cGU6ICJjdWx0aXN0IiwgeDogMzEwMCB9XSB9CiAgICAgICAgXSwKICAgICAgICBib3NzOiB7IHR5cGU6ICJ2YWN1dW0iLCB4OiAzNDAwLCBzcGF3bmVkOiBmYWxzZSB9LAogICAgICAgIGdvYWxLaWxsczogMTEKICAgICAgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJTdW5saXQgQ29uc2VydmF0b3J5IiwKICAgICAgICB3aWR0aDogMzgwMCwKICAgICAgICBzcGF3bjogMTAwLAogICAgICAgIHRoZW1lOiAiY29uc2VydmF0b3J5IiwKICAgICAgICBwbGF0Zm9ybXM6IFsKICAgICAgICAgIHsgeDogNDAwLCB5OiAzNjAsIHc6IDE2MCwgaDogMTYsIGtpbmQ6ICJwbGFudGVyIiB9LAogICAgICAgICAgeyB4OiA3NTAsIHk6IDMwMCwgdzogMTgwLCBoOiAxNiwga2luZDogImJlbmNoIiB9LAogICAgICAgICAgeyB4OiAxMjAwLCB5OiAzNDAsIHc6IDE1MCwgaDogMTYsIGtpbmQ6ICJwbGFudGVyIiB9LAogICAgICAgICAgeyB4OiAxNjUwLCB5OiAyNzAsIHc6IDIwMCwgaDogMTYsIGtpbmQ6ICJzaGVsZiIgfSwKICAgICAgICAgIHsgeDogMjIwMCwgeTogMzMwLCB3OiAxNzAsIGg6IDE2LCBraW5kOiAiYmVuY2giIH0sCiAgICAgICAgICB7IHg6IDI3MDAsIHk6IDI4MCwgdzogMTkwLCBoOiAxNiwga2luZDogInBsYW50ZXIiIH0sCiAgICAgICAgICB7IHg6IDMyMDAsIHk6IDM1MCwgdzogMTYwLCBoOiAxNiwga2luZDogImJlbmNoIiB9CiAgICAgICAgXSwKICAgICAgICBicmVha2FibGVzOiBbCiAgICAgICAgICB7IHg6IDg1MCwgeTogMjUwLCB3OiAzNiwgaDogNDgsIGtpbmQ6ICJ2YXNlIiwgaHA6IDEgfSwKICAgICAgICAgIHsgeDogMTc1MCwgeTogMjIwLCB3OiAzNiwgaDogNDgsIGtpbmQ6ICJ2YXNlIiwgaHA6IDEgfSwKICAgICAgICAgIHsgeDogMjgwMCwgeTogMjMwLCB3OiAzNiwgaDogNDgsIGtpbmQ6ICJ2YXNlIiwgaHA6IDEgfQogICAgICAgIF0sCiAgICAgICAgY2hhbmRlbGllcjogbnVsbCwKICAgICAgICBzdW5zOiBbCiAgICAgICAgICB7IHg6IDU1MCwgdzogMTIwLCBhY3RpdmU6IHRydWUgfSwKICAgICAgICAgIHsgeDogMTQwMCwgdzogMTUwLCBhY3RpdmU6IHRydWUgfSwKICAgICAgICAgIHsgeDogMjQwMCwgdzogMTMwLCBhY3RpdmU6IHRydWUgfSwKICAgICAgICAgIHsgeDogMzAwMCwgdzogMTQwLCBhY3RpdmU6IHRydWUgfQogICAgICAgIF0sCiAgICAgICAgZHJhcGVzOiBbCiAgICAgICAgICB7IHg6IDUyMCwgeTogODAsIHc6IDQwLCBoOiAxMjAsIGNsb3NlZDogZmFsc2UsIHN1bkluZGV4OiAwIH0sCiAgICAgICAgICB7IHg6IDEzNzAsIHk6IDgwLCB3OiA0MCwgaDogMTIwLCBjbG9zZWQ6IGZhbHNlLCBzdW5JbmRleDogMSB9LAogICAgICAgICAgeyB4OiAyMzcwLCB5OiA4MCwgdzogNDAsIGg6IDEyMCwgY2xvc2VkOiBmYWxzZSwgc3VuSW5kZXg6IDIgfSwKICAgICAgICAgIHsgeDogMjk3MCwgeTogODAsIHc6IDQwLCBoOiAxMjAsIGNsb3NlZDogZmFsc2UsIHN1bkluZGV4OiAzIH0KICAgICAgICBdLAogICAgICAgIHRvcmNoZXM6IFtdLAogICAgICAgIGhlYXRWZW50czogWwogICAgICAgICAgeyB4OiAxMDAwLCB3OiA4MCwgdDogMCB9LAogICAgICAgICAgeyB4OiAyMDAwLCB3OiA4MCwgdDogMCB9LAogICAgICAgICAgeyB4OiAyNjAwLCB3OiA4MCwgdDogMCB9CiAgICAgICAgXSwKICAgICAgICBjdWN1bWJlcnM6IFsKICAgICAgICAgIHsgeDogMTEwMCwgeTogRkxPT1JfWSAtIDEwLCBhcm1lZDogdHJ1ZSwgcG9wcGVkOiBmYWxzZSwgdDogMCB9LAogICAgICAgICAgeyB4OiAyNTAwLCB5OiBGTE9PUl9ZIC0gMTAsIGFybWVkOiB0cnVlLCBwb3BwZWQ6IGZhbHNlLCB0OiAwIH0KICAgICAgICBdLAogICAgICAgIHdhdmVzOiBbCiAgICAgICAgICB7IGRlbGF5OiAwLjUsIHNwYXduOiBbeyB0eXBlOiAiY3VsdGlzdCIsIHg6IDcwMCB9LCB7IHR5cGU6ICJtaXN0IiwgeDogOTAwIH0sIHsgdHlwZTogInB1ZyIsIHg6IDExMDAgfV0gfSwKICAgICAgICAgIHsgZGVsYXk6IDgsIHNwYXduOiBbeyB0eXBlOiAiY3VsdGlzdCIsIHg6IDE2MDAgfSwgeyB0eXBlOiAibWlzdCIsIHg6IDE4MDAgfSwgeyB0eXBlOiAiY3VsdGlzdCIsIHg6IDIwMDAgfSwgeyB0eXBlOiAicHVnIiwgeDogMjMwMCB9XSB9LAogICAgICAgICAgeyBkZWxheTogMTUsIHNwYXduOiBbeyB0eXBlOiAicHVnIiwgeDogMjgwMCB9LCB7IHR5cGU6ICJnaG9zdGNhdCIsIHg6IDI5NTAgfSwgeyB0eXBlOiAibWlzdCIsIHg6IDMwNTAgfSwgeyB0eXBlOiAiY3VsdGlzdCIsIHg6IDMxMDAgfV0gfQogICAgICAgIF0sCiAgICAgICAgYm9zczogeyB0eXBlOiAibGFzZXIiLCB4OiAzNTAwLCBzcGF3bmVkOiBmYWxzZSB9LAogICAgICAgIGdvYWxLaWxsczogMTEKICAgICAgfQogICAgXTsKICB9CgogIHZhciBMRVZFTFMgPSBtYWtlTGV2ZWxzKCk7CgogIC8qIC0tLS0tLS0tLS0gUGxheWVyIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBtYWtlUGxheWVyKHgpIHsKICAgIHJldHVybiB7CiAgICAgIHg6IHgsIHk6IEZMT09SX1kgLSAxMzIsIHc6IDc0LCBoOiAxMzIsCiAgICAgIHZ4OiAwLCB2eTogMCwKICAgICAgZmFjaW5nOiAxLAogICAgICBvbkdyb3VuZDogZmFsc2UsCiAgICAgIGhwOiAxMDAsIG1heEhwOiAxMDAsCiAgICAgIGFuaW06ICJpZGxlIiwgZnJhbWU6IDAsIGZyYW1lVDogMCwKICAgICAganVtcEhlbGQ6IGZhbHNlLCB3YXNKdW1wOiBmYWxzZSwKICAgICAgZ2xpZGluZzogZmFsc2UsCiAgICAgIGRhc2hpbmc6IGZhbHNlLCBkYXNoVDogMCwgZGFzaENkOiAwLCBpZnJhbWU6IDAsCiAgICAgIGJvbHRDZDogMCwgeWFybkNkOiAwLCBjdXJzZUNkOiAwLAogICAgICByYWdlOiAwLCByYWdlVDogMCwgcmFnaW5nOiBmYWxzZSwKICAgICAgc2NhcmVkVDogMCwKICAgICAgaW52dWxuOiAwLAogICAgICBkZWFkOiBmYWxzZSwKICAgICAga2lsbHM6IDAsCiAgICAgIG1pc3Q6IFtdCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcGxheWVyQ2VudGVyKCkgewogICAgcmV0dXJuIHsgeDogcGxheWVyLnggKyBwbGF5ZXIudyAqIDAuNSwgeTogcGxheWVyLnkgKyBwbGF5ZXIuaCAqIDAuNSB9OwogIH0KCiAgZnVuY3Rpb24gaHVydFBsYXllcihkbWcsIGtub2NrKSB7CiAgICBpZiAocGxheWVyLmRlYWQgfHwgcGxheWVyLmlmcmFtZSA+IDAgfHwgcGxheWVyLmludnVsbiA+IDAgfHwgcGxheWVyLnJhZ2luZykgcmV0dXJuOwogICAgcGxheWVyLmhwIC09IGRtZzsKICAgIHBsYXllci5pbnZ1bG4gPSAwLjc7CiAgICBwbGF5ZXIuYW5pbSA9ICJoaXQiOwogICAgcGxheWVyLmZyYW1lID0gMDsKICAgIHBsYXllci5mcmFtZVQgPSAwOwogICAgaWYgKGtub2NrKSBwbGF5ZXIudnggKz0ga25vY2s7CiAgICBzZngoImhpdCIpOwogICAgYnVyc3QocGxheWVyLnggKyBwbGF5ZXIudyAvIDIsIHBsYXllci55ICsgcGxheWVyLmggLyAyLCAiI2ZmNjY4OCIsIDgpOwogICAgaWYgKHBsYXllci5ocCA8PSAwKSB7CiAgICAgIHBsYXllci5ocCA9IDA7CiAgICAgIHBsYXllci5kZWFkID0gdHJ1ZTsKICAgICAgcGxheWVyLmFuaW0gPSAiZGVhdGgiOwogICAgICBwbGF5ZXIuZnJhbWUgPSAwOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2hvd0VuZChmYWxzZSk7IH0sIDEyMDApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdHJ5RGFzaCgpIHsKICAgIGlmIChwbGF5ZXIuZGVhZCB8fCBwbGF5ZXIuZGFzaENkID4gMCB8fCBwbGF5ZXIuZGFzaGluZykgcmV0dXJuOwogICAgcGxheWVyLmRhc2hpbmcgPSB0cnVlOwogICAgcGxheWVyLmRhc2hUID0gREFTSF9USU1FOwogICAgcGxheWVyLmRhc2hDZCA9IERBU0hfQ0Q7CiAgICBwbGF5ZXIuaWZyYW1lID0gSUZSQU1FX0RBU0g7CiAgICBwbGF5ZXIudnggPSBwbGF5ZXIuZmFjaW5nICogREFTSF9TUEVFRDsKICAgIHBsYXllci52eSA9IE1hdGgubWluKHBsYXllci52eSwgLTQwKTsKICAgIHNmeCgiZGFzaCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgcGxheWVyLm1pc3QucHVzaCh7IHg6IHBsYXllci54LCB5OiBwbGF5ZXIueSwgbGlmZTogMC4zNSAtIGkgKiAwLjA0LCBmYWNpbmc6IHBsYXllci5mYWNpbmcgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaXJlQm9sdCgpIHsKICAgIGlmIChwbGF5ZXIuZGVhZCB8fCBwbGF5ZXIuYm9sdENkID4gMCkgcmV0dXJuOwogICAgcGxheWVyLmJvbHRDZCA9IHBsYXllci5yYWdpbmcgPyAwLjA4IDogMC4xNjsKICAgIHZhciBjID0gcGxheWVyQ2VudGVyKCk7CiAgICBwcm9qZWN0aWxlcy5wdXNoKHsKICAgICAgdHlwZTogImJvbHQiLAogICAgICB4OiBjLngsIHk6IGMueSAtIDgsCiAgICAgIHc6IDE4LCBoOiAxMCwKICAgICAgdng6IHBsYXllci5mYWNpbmcgKiAocGxheWVyLnJhZ2luZyA\/IDcyMCA6IDU2MCksCiAgICAgIHZ5OiAwLAogICAgICBsaWZlOiAxLjQsCiAgICAgIGRtZzogcGxheWVyLnJhZ2luZyA\/IDE4IDogMTIsCiAgICAgIHBpZXJjZTogMywKICAgICAgZnJpZW5kbHk6IHRydWUKICAgIH0pOwogICAgc2Z4KCJib2x0Iik7CiAgICBwbGF5ZXIuYW5pbSA9ICJhdHRhY2siOwogICAgcGxheWVyLmZyYW1lID0gMDsKICAgIHBsYXllci5mcmFtZVQgPSAwOwogIH0KCiAgZnVuY3Rpb24gZmlyZVlhcm4oKSB7CiAgICBpZiAocGxheWVyLmRlYWQgfHwgcGxheWVyLnlhcm5DZCA+IDApIHJldHVybjsKICAgIHBsYXllci55YXJuQ2QgPSAzLjI7CiAgICB2YXIgYyA9IHBsYXllckNlbnRlcigpOwogICAgcHJvamVjdGlsZXMucHVzaCh7CiAgICAgIHR5cGU6ICJ5YXJuIiwKICAgICAgeDogYy54LCB5OiBjLnkgLSAxMCwKICAgICAgdzogMjgsIGg6IDI4LAogICAgICB2eDogcGxheWVyLmZhY2luZyAqIDMyMCwKICAgICAgdnk6IC0yMjAsCiAgICAgIGxpZmU6IDMuNSwKICAgICAgZG1nOiA4LAogICAgICBib3VuY2U6IDYsCiAgICAgIHB1bGxSOiAxNDAsCiAgICAgIHBoYXNlOiAiYm91bmNlIiwKICAgICAgZnJpZW5kbHk6IHRydWUKICAgIH0pOwogICAgc2Z4KCJ5YXJuIik7CiAgfQoKICBmdW5jdGlvbiBjYXN0Q3Vyc2UoKSB7CiAgICBpZiAocGxheWVyLmRlYWQgfHwgcGxheWVyLmN1cnNlQ2QgPiAwKSByZXR1cm47CiAgICBwbGF5ZXIuY3Vyc2VDZCA9IDUuNTsKICAgIHZhciB0eCA9IHBsYXllci54ICsgcGxheWVyLmZhY2luZyAqIDEyMDsKICAgIHByb2plY3RpbGVzLnB1c2goewogICAgICB0eXBlOiAiY3Vyc2UiLAogICAgICB4OiB0eCwgeTogRkxPT1JfWSAtIDgsCiAgICAgIHc6IDUwLCBoOiAxMCwKICAgICAgbGlmZTogNC41LAogICAgICBmcmllbmRseTogdHJ1ZQogICAgfSk7CiAgICBidXJzdCh0eCArIDI1LCBGTE9PUl9ZIC0gMjAsICIjZmYyMjQ0IiwgMTQpOwogICAgc2Z4KCJ5YXJuIik7CiAgfQoKICBmdW5jdGlvbiB0cnlSYWdlKCkgewogICAgaWYgKHBsYXllci5kZWFkIHx8IHBsYXllci5yYWdpbmcgfHwgcGxheWVyLnJhZ2UgPCBSQUdFX05FRUQpIHJldHVybjsKICAgIHBsYXllci5yYWdpbmcgPSB0cnVlOwogICAgcGxheWVyLnJhZ2VUID0gUkFHRV9USU1FOwogICAgcGxheWVyLnJhZ2UgPSAwOwogICAgcGxheWVyLmlmcmFtZSA9IDAuNTsKICAgIG11c2ljUmF0ZSA9IDEuNTU7CiAgICBzZngoInJhZ2UiKTsKICAgIGJ1cnN0KHBsYXllci54ICsgcGxheWVyLncgLyAyLCBwbGF5ZXIueSwgIiNhYTIyZmYiLCAyNCk7CiAgICBzaG93TXNnKCJDQVROSVAgQkxPT0QtUkFHRSEiKTsKICB9CgogIGZ1bmN0aW9uIHRyeUludGVyYWN0KCkgewogICAgaWYgKCFsZXZlbCB8fCBwbGF5ZXIuZGVhZCkgcmV0dXJuOwogICAgdmFyIHB4ID0gcGxheWVyLnggKyBwbGF5ZXIudyAvIDI7CiAgICB2YXIgaW50ZXJhY3RlZCA9IGZhbHNlOwogICAgaWYgKGxldmVsLmRyYXBlcykgewogICAgICBsZXZlbC5kcmFwZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIGlmIChNYXRoLmFicyhweCAtIChkLnggKyBkLncgLyAyKSkgPCA3MCAmJiAhZC5jbG9zZWQpIHsKICAgICAgICAgIGQuY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgIGlmIChsZXZlbC5zdW5zICYmIGxldmVsLnN1bnNbZC5zdW5JbmRleF0pIGxldmVsLnN1bnNbZC5zdW5JbmRleF0uYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICBpbnRlcmFjdGVkID0gdHJ1ZTsKICAgICAgICAgIGJ1cnN0KGQueCArIDIwLCBkLnkgKyA0MCwgIiM4ODY2YWEiLCAxMCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGlmIChsZXZlbC50b3JjaGVzKSB7CiAgICAgIGxldmVsLnRvcmNoZXMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgIGlmIChNYXRoLmFicyhweCAtIHQueCkgPCA3MCAmJiB0Lm9uKSB7CiAgICAgICAgICB0Lm9uID0gZmFsc2U7CiAgICAgICAgICBpbnRlcmFjdGVkID0gdHJ1ZTsKICAgICAgICAgIGJ1cnN0KHQueCwgdC55LCAiI2ZmYWE0NCIsIDgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAobGV2ZWwuY2hhbmRlbGllciAmJiAhbGV2ZWwuY2hhbmRlbGllci5kcm9wcGVkICYmICFsZXZlbC5jaGFuZGVsaWVyLmZhbGxpbmcpIHsKICAgICAgaWYgKE1hdGguYWJzKHB4IC0gKGxldmVsLmNoYW5kZWxpZXIueCArIDUwKSkgPCAxMDAgJiYgcGxheWVyLnkgPCAyODApIHsKICAgICAgICBsZXZlbC5jaGFuZGVsaWVyLmZhbGxpbmcgPSB0cnVlOwogICAgICAgIGxldmVsLmNoYW5kZWxpZXIudnkgPSAwOwogICAgICAgIGludGVyYWN0ZWQgPSB0cnVlOwogICAgICAgIHNob3dNc2coIkNoYW5kZWxpZXIgZHJvcHBlZCEiKTsKICAgICAgfQogICAgfQogICAgaWYgKGludGVyYWN0ZWQpIHNmeCgiaW50ZXJhY3QiKTsKICB9CgogIC8qIC0tLS0tLS0tLS0gRW5lbWllcyAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gc3Bhd25FbmVteSh0eXBlLCB4KSB7CiAgICB2YXIgZSA9IHsKICAgICAgdHlwZTogdHlwZSwKICAgICAgeDogeCwgeTogRkxPT1JfWSAtIDY0LAogICAgICB3OiA1MiwgaDogNjQsCiAgICAgIHZ4OiAwLCB2eTogMCwKICAgICAgaHA6IDMwLCBtYXhIcDogMzAsCiAgICAgIGZhY2luZzogLTEsCiAgICAgIGRlYWQ6IGZhbHNlLAogICAgICBzdGF0ZTogImlkbGUiLAogICAgICB0OiAwLAogICAgICBmbGFzaDogMCwKICAgICAgZGVhdGhUOiAwLAogICAgICBmcmFtZTogMCwKICAgICAgYW5pbVQ6IDAKICAgIH07CiAgICBpZiAodHlwZSA9PT0gImN1bHRpc3QiKSB7CiAgICAgIGUuaHAgPSBlLm1heEhwID0gMjg7CiAgICAgIGUudyA9IDQ4OyBlLmggPSA3MDsgZS55ID0gRkxPT1JfWSAtIDcwOwogICAgfSBlbHNlIGlmICh0eXBlID09PSAibWlzdCIpIHsKICAgICAgZS5ocCA9IGUubWF4SHAgPSAxMjsKICAgICAgZS53ID0gMzY7IGUuaCA9IDQwOyBlLnkgPSBGTE9PUl9ZIC0gNzAgLSBNYXRoLnJhbmRvbSgpICogNDA7CiAgICAgIGUuZmx5ID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImdob3N0Y2F0IikgewogICAgICBlLmhwID0gZS5tYXhIcCA9IDE4OwogICAgICBlLncgPSA0NDsgZS5oID0gNDA7IGUueSA9IEZMT09SX1kgLSAxMjAgLSBNYXRoLnJhbmRvbSgpICogNjA7CiAgICAgIGUuZmx5ID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gInB1ZyIpIHsKICAgICAgZS5ocCA9IGUubWF4SHAgPSA1NTsKICAgICAgZS53ID0gNjA7IGUuaCA9IDUwOyBlLnkgPSBGTE9PUl9ZIC0gNzA7CiAgICAgIGUuc2xhbUNkID0gMjsKICAgICAgZS5ob3ZlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJ2YWN1dW0iKSB7CiAgICAgIGUuaHAgPSBlLm1heEhwID0gMjIwOwogICAgICBlLncgPSAxMTA7IGUuaCA9IDEwMDsgZS55ID0gRkxPT1JfWSAtIDEwMDsKICAgICAgZS5wdWxsQ2QgPSAxOwogICAgICBlLnNvbmljQ2QgPSAyLjU7CiAgICAgIGUuaXNCb3NzID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImxhc2VyIikgewogICAgICBlLmhwID0gZS5tYXhIcCA9IDIwMDsKICAgICAgZS53ID0gNDA7IGUuaCA9IDQwOyBlLnkgPSAxODA7CiAgICAgIGUuZG90WCA9IHg7IGUuZG90WSA9IDIwMDsKICAgICAgZS5waGFzZSA9ICJyb2FtIjsKICAgICAgZS5pc0Jvc3MgPSB0cnVlOwogICAgICBlLmRpc3RyYWN0ID0gMDsKICAgIH0KICAgIGVudGl0aWVzLnB1c2goZSk7CiAgICByZXR1cm4gZTsKICB9CgogIGZ1bmN0aW9uIGh1cnRFbmVteShlLCBkbWcsIGtub2NrLCBmcm9tQmVoaW5kKSB7CiAgICBpZiAoZS5kZWFkKSByZXR1cm47CiAgICBpZiAoZS50eXBlID09PSAicHVnIikga25vY2sgPSAwOwogICAgaWYgKGUuaXNCb3NzKSB7CiAgICAgIGRtZyA9IGRtZyAqIDIuNzU7CiAgICB9IGVsc2UgewogICAgICAvLyBvbmUgaGl0IGtpbGxzIHJlZ3VsYXIgc3BlY3RyYWwgZ2hvc3RzCiAgICAgIGRtZyA9IE1hdGgubWF4KGRtZywgZS5tYXhIcCB8fCBlLmhwIHx8IDEpOwogICAgfQogICAgZS5ocCAtPSBkbWc7CiAgICBlLmZsYXNoID0gMC4xNTsKICAgIGlmIChrbm9jaykgZS52eCArPSBrbm9jazsKICAgIGlmIChlLmhwIDw9IDApIHsKICAgICAgZS5kZWFkID0gdHJ1ZTsKICAgICAgZS5ocCA9IDA7CiAgICAgIGUuZGVhdGhUID0gMC41NTsKICAgICAgc2NvcmUgKz0gZS5pc0Jvc3MgPyA1MDAgOiAoZS50eXBlID09PSAibWlzdCIgfHwgZS50eXBlID09PSAiZ2hvc3RjYXQiID8gNDAgOiAxMDApOwogICAgICBwbGF5ZXIua2lsbHMgKz0gMTsKICAgICAgcGxheWVyLnJhZ2UgPSBNYXRoLm1pbihSQUdFX05FRUQsIHBsYXllci5yYWdlICsgKGUuaXNCb3NzID8gUkFHRV9ORUVEIDogKGUudHlwZSA9PT0gIm1pc3QiID8gMC4zNSA6IDEpKSk7CiAgICAgIGJ1cnN0KGUueCArIGUudyAvIDIsIGUueSArIGUuaCAvIDIsICIjNjZmZmNjIiwgMTYpOwogICAgICBzZngoImhpdCIpOwogICAgICBpZiAocGxheWVyLnJhZ2luZykgewogICAgICAgIHBsYXllci5ocCA9IE1hdGgubWluKHBsYXllci5tYXhIcCwgcGxheWVyLmhwICsgOCk7CiAgICAgIH0KICAgICAgaWYgKGUuaXNCb3NzKSB7CiAgICAgICAgbGV2ZWxDbGVhclRpbWVyID0gMi4yOwogICAgICAgIHNob3dNc2coIkJvc3MgZGVmZWF0ZWQhIik7CiAgICAgICAgaWYgKGxldmVsSW5kZXggPT09IDEpIHVubG9ja2VkLmNvbGxhciA9IHRydWU7CiAgICAgICAgaWYgKGxldmVsSW5kZXggPT09IDIpIHVubG9ja2VkLnRvcGhhdCA9IHRydWU7CiAgICAgICAgc2F2ZVByb2dyZXNzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qIC0tLS0tLS0tLS0gTGV2ZWwgbGlmZWN5Y2xlIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzdGFydExldmVsKGlkeCkgewogICAgbGV2ZWxJbmRleCA9IGlkeDsKICAgIGxldmVsID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShMRVZFTFNbaWR4XSkpOwogICAgcGxheWVyID0gbWFrZVBsYXllcihsZXZlbC5zcGF3bik7CiAgICBlbnRpdGllcyA9IFtdOwogICAgcGFydGljbGVzID0gW107CiAgICBwcm9qZWN0aWxlcyA9IFtdOwogICAgd2F2ZSA9IDA7CiAgICB3YXZlVGltZXIgPSAwOwogICAgbGV2ZWxDbGVhclRpbWVyID0gMDsKICAgIGNhbWVyYVggPSAwOwogICAgc3RhdGUgPSAicGxheSI7CiAgICBvdmVybGF5LmhpZGRlbiA9IHRydWU7CiAgICBzZXRQYWRzVmlzaWJsZSh0cnVlKTsKICAgIHNob3dNc2cobGV2ZWwubmFtZSk7CiAgICBpZiAoaWR4ID4gbWF4TGV2ZWxSZWFjaGVkKSB7CiAgICAgIG1heExldmVsUmVhY2hlZCA9IGlkeDsKICAgICAgc2F2ZVByb2dyZXNzKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzaG93TXNnKHQpIHsKICAgIG1lc3NhZ2UgPSB0OwogICAgbWVzc2FnZVQgPSAyLjI7CiAgfQoKICBmdW5jdGlvbiBzaG93RW5kKHdpbikgewogICAgc3RhdGUgPSB3aW4gPyAid2luIiA6ICJnYW1lb3ZlciI7CiAgICBzYXZlUHJvZ3Jlc3MoKTsKICAgIGlmICghbW9iaWxlUGxheSkgc2V0UGFkc1Zpc2libGUoZmFsc2UpOwogICAgaWYgKGVuZFRpdGxlKSBlbmRUaXRsZS50ZXh0Q29udGVudCA9IHdpbiA\/ICJWaWN0b3J5ISIgOiAiRGVmZWF0ZWQiOwogICAgaWYgKGVuZE1zZykgewogICAgICBlbmRNc2cudGV4dENvbnRlbnQgPSB3aW4KICAgICAgICA\/ICgiVGhlIENyeXB0IGlzIHNlY3VyZS4gU2NvcmUgIiArIHNjb3JlICsgIi4gSGlnaCAiICsgaGlnaFNjb3JlICsgIi4iKQogICAgICAgIDogKCJTY29yZSAiICsgc2NvcmUgKyAiLiBIaWdoICIgKyBoaWdoU2NvcmUgKyAiLiBUcnkgYWdhaW4sIENvdW50LiIpOwogICAgfQogICAgaWYgKHRpdGxlQ2FyZCkgdGl0bGVDYXJkLmhpZGRlbiA9IHRydWU7CiAgICBpZiAoZW5kQ2FyZCkgZW5kQ2FyZC5oaWRkZW4gPSBmYWxzZTsKICAgIG92ZXJsYXkuaGlkZGVuID0gZmFsc2U7CiAgICBzZXRQYWRzVmlzaWJsZShmYWxzZSk7CiAgICBtdXNpY1JhdGUgPSAxOwogIH0KCiAgZnVuY3Rpb24gbmV4dExldmVsT3JXaW4oKSB7CiAgICBpZiAobGV2ZWxJbmRleCA+PSBMRVZFTFMubGVuZ3RoIC0gMSkgewogICAgICBzaG93RW5kKHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgc3RhcnRMZXZlbChsZXZlbEluZGV4ICsgMSk7CiAgICB9CiAgfQoKICAvKiAtLS0tLS0tLS0tIElucHV0IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiB3YW50TGVmdCgpIHsKICAgIHZhciBmbGlwID0gcGxheWVyICYmIHBsYXllci5zY2FyZWRUID4gMDsKICAgIHZhciBheGlzID0gdG91Y2guYXhpc1ggfHwgMDsKICAgIHZhciBMID0ga2V5c1siQXJyb3dMZWZ0Il0gfHwga2V5c1siYSJdIHx8IGtleXNbIkEiXSB8fCB0b3VjaC5sZWZ0IHx8IGF4aXMgPCAtMC4yNTsKICAgIHZhciBSID0ga2V5c1siQXJyb3dSaWdodCJdIHx8IGtleXNbImQiXSB8fCBrZXlzWyJEIl0gfHwgdG91Y2gucmlnaHQgfHwgYXhpcyA+IDAuMjU7CiAgICByZXR1cm4gZmxpcCA\/IFIgOiBMOwogIH0KICBmdW5jdGlvbiB3YW50UmlnaHQoKSB7CiAgICB2YXIgZmxpcCA9IHBsYXllciAmJiBwbGF5ZXIuc2NhcmVkVCA+IDA7CiAgICB2YXIgYXhpcyA9IHRvdWNoLmF4aXNYIHx8IDA7CiAgICB2YXIgTCA9IGtleXNbIkFycm93TGVmdCJdIHx8IGtleXNbImEiXSB8fCBrZXlzWyJBIl0gfHwgdG91Y2gubGVmdCB8fCBheGlzIDwgLTAuMjU7CiAgICB2YXIgUiA9IGtleXNbIkFycm93UmlnaHQiXSB8fCBrZXlzWyJkIl0gfHwga2V5c1siRCJdIHx8IHRvdWNoLnJpZ2h0IHx8IGF4aXMgPiAwLjI1OwogICAgcmV0dXJuIGZsaXAgPyBMIDogUjsKICB9CiAgZnVuY3Rpb24gd2FudEp1bXAoKSB7CiAgICByZXR1cm4ga2V5c1siICJdIHx8IGtleXNbIkFycm93VXAiXSB8fCBrZXlzWyJ3Il0gfHwga2V5c1siVyJdIHx8IHRvdWNoLmp1bXAgfHwgdG91Y2guYXhpc1kgPCAtMC42NTsKICB9CgogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgIGtleXNbZS5rZXldID0gdHJ1ZTsKICAgIGlmIChbIkFycm93TGVmdCIsIkFycm93UmlnaHQiLCJBcnJvd1VwIiwiICJdLmluZGV4T2YoZS5rZXkpID49IDApIGUucHJldmVudERlZmF1bHQoKTsKICAgIGlmIChzdGF0ZSA9PT0gInBsYXkiKSB7CiAgICAgIGlmIChlLmtleSA9PT0gIlNoaWZ0IikgdHJ5RGFzaCgpOwogICAgICBpZiAoZS5rZXkgPT09ICJqIiB8fCBlLmtleSA9PT0gIkoiKSBmaXJlQm9sdCgpOwogICAgICBpZiAoZS5rZXkgPT09ICJrIiB8fCBlLmtleSA9PT0gIksiKSBmaXJlWWFybigpOwogICAgICBpZiAoZS5rZXkgPT09ICJsIiB8fCBlLmtleSA9PT0gIkwiKSBjYXN0Q3Vyc2UoKTsKICAgICAgaWYgKGUua2V5ID09PSAidSIgfHwgZS5rZXkgPT09ICJVIiB8fCBlLmtleSA9PT0gIjsiKSB0cnlSYWdlKCk7CiAgICAgIGlmIChlLmtleSA9PT0gImUiIHx8IGUua2V5ID09PSAiRSIpIHRyeUludGVyYWN0KCk7CiAgICB9CiAgICBpZiAoZS5rZXkgPT09ICJtIiB8fCBlLmtleSA9PT0gIk0iKSBzZXRNdXRlKCFtdXRlZCk7CiAgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgZnVuY3Rpb24gKGUpIHsga2V5c1tlLmtleV0gPSBmYWxzZTsgfSk7CgogIGZ1bmN0aW9uIGJpbmRIb2xkKGVsLCBvbkRvd24sIG9uVXApIHsKICAgIGlmICghZWwpIHJldHVybjsKICAgIHZhciBkb3duID0gZnVuY3Rpb24gKGV2KSB7CiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmIChldi5wb2ludGVySWQgIT0gbnVsbCkgdHJ5IHsgZWwuc2V0UG9pbnRlckNhcHR1cmUoZXYucG9pbnRlcklkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICBvbkRvd24oZXYpOwogICAgfTsKICAgIHZhciB1cCA9IGZ1bmN0aW9uIChldikgewogICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBvblVwKGV2KTsKICAgIH07CiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIGRvd24pOwogICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgdXApOwogICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIHVwKTsKICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsIHVwKTsKICB9CgogIGJpbmRIb2xkKHBhZEp1bXAsIGZ1bmN0aW9uICgpIHsgdG91Y2guanVtcCA9IHRydWU7IH0sIGZ1bmN0aW9uICgpIHsgdG91Y2guanVtcCA9IGZhbHNlOyB9KTsKICBiaW5kSG9sZChwYWRGaXJlLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoc3BlbGxNb2RlID09PSAwKSBmaXJlQm9sdCgpOwogICAgZWxzZSBpZiAoc3BlbGxNb2RlID09PSAxKSBmaXJlWWFybigpOwogICAgZWxzZSBjYXN0Q3Vyc2UoKTsKICB9LCBmdW5jdGlvbiAoKSB7fSk7CiAgYmluZEhvbGQocGFkU3BlbGwsIGZ1bmN0aW9uICgpIHsKICAgIHNwZWxsTW9kZSA9IChzcGVsbE1vZGUgKyAxKSAlIDM7CiAgICB1cGRhdGVTcGVsbFBhZCgpOwogIH0sIGZ1bmN0aW9uICgpIHt9KTsKICBiaW5kSG9sZChwYWRSYWdlLCBmdW5jdGlvbiAoKSB7IHRyeVJhZ2UoKTsgfSwgZnVuY3Rpb24gKCkge30pOwoKICBmdW5jdGlvbiBzdGlja1BvcyhldikgewogICAgaWYgKCFzdGlja1pvbmUpIHJldHVybiB7IHg6IDAsIHk6IDAgfTsKICAgIHZhciByID0gc3RpY2tab25lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgcmV0dXJuIHsgeDogZXYuY2xpZW50WCAtIHIubGVmdCwgeTogZXYuY2xpZW50WSAtIHIudG9wLCB3OiByLndpZHRoLCBoOiByLmhlaWdodCB9OwogIH0KICBmdW5jdGlvbiBzZXRLbm9iKGR4LCBkeSkgewogICAgaWYgKCFzdGlja0tub2IpIHJldHVybjsKICAgIHZhciBtYXggPSAzNjsKICAgIHZhciBsZW4gPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIHx8IDE7CiAgICBpZiAobGVuID4gbWF4KSB7IGR4ID0gZHggLyBsZW4gKiBtYXg7IGR5ID0gZHkgLyBsZW4gKiBtYXg7IH0KICAgIHN0aWNrS25vYi5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICB9CiAgZnVuY3Rpb24gZW5kU3RpY2soKSB7CiAgICBzdGljay5hY3RpdmUgPSBmYWxzZTsKICAgIHN0aWNrLmlkID0gbnVsbDsKICAgIHN0aWNrLmR4ID0gc3RpY2suZHkgPSAwOwogICAgdG91Y2guYXhpc1ggPSAwOwogICAgdG91Y2guYXhpc1kgPSAwOwogICAgc2V0S25vYigwLCAwKTsKICB9CiAgaWYgKHN0aWNrWm9uZSkgewogICAgc3RpY2tab25lLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGV2KSB7CiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgaWYgKG5vdyAtIHN0aWNrLmxhc3RUYXAgPCAyODApIHsKICAgICAgICBzdGljay50YXBzICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RpY2sudGFwcyA9IDE7CiAgICAgIH0KICAgICAgc3RpY2subGFzdFRhcCA9IG5vdzsKICAgICAgaWYgKHN0aWNrLnRhcHMgPj0gMikgewogICAgICAgIHRyeURhc2goKTsKICAgICAgICBzdGljay50YXBzID0gMDsKICAgICAgfQogICAgICBzdGljay5hY3RpdmUgPSB0cnVlOwogICAgICBzdGljay5pZCA9IGV2LnBvaW50ZXJJZDsKICAgICAgdHJ5IHsgc3RpY2tab25lLnNldFBvaW50ZXJDYXB0dXJlKGV2LnBvaW50ZXJJZCk7IH0gY2F0Y2ggKGVycikge30KICAgICAgdmFyIHAgPSBzdGlja1Bvcyhldik7CiAgICAgIHN0aWNrLm94ID0gcC54OwogICAgICBzdGljay5veSA9IHAueTsKICAgIH0pOwogICAgc3RpY2tab25lLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgZnVuY3Rpb24gKGV2KSB7CiAgICAgIGlmICghc3RpY2suYWN0aXZlIHx8IGV2LnBvaW50ZXJJZCAhPT0gc3RpY2suaWQpIHJldHVybjsKICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgdmFyIHAgPSBzdGlja1Bvcyhldik7CiAgICAgIHZhciBkeCA9IHAueCAtIHN0aWNrLm94OwogICAgICB2YXIgZHkgPSBwLnkgLSBzdGljay5veTsKICAgICAgLy8gZmxpY2sgZGFzaDogZmFzdCBob3Jpem9udGFsIGZsaWNrCiAgICAgIGlmIChNYXRoLmFicyhkeCkgPiA3MCAmJiBNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSkgKiAxLjQgJiYgTWF0aC5hYnMoZHgpIC8gTWF0aC5tYXgoMSwgZXYubW92ZW1lbnRYID8gMSA6IDEpKSB7CiAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+IDkwKSB0cnlEYXNoKCk7CiAgICAgIH0KICAgICAgdmFyIG1heCA9IDUwOwogICAgICB0b3VjaC5heGlzWCA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBkeCAvIG1heCkpOwogICAgICB0b3VjaC5heGlzWSA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBkeSAvIG1heCkpOwogICAgICBzZXRLbm9iKGR4LCBkeSk7CiAgICB9KTsKICAgIHN0aWNrWm9uZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBlbmRTdGljayk7CiAgICBzdGlja1pvbmUuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIGVuZFN0aWNrKTsKICB9CgogIC8qIC0tLS0tLS0tLS0gVXBkYXRlIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzb2xpZEF0KHgsIHksIHcsIGgpIHsKICAgIC8vIGZsb29yCiAgICBpZiAoeSArIGggPj0gRkxPT1JfWSkgcmV0dXJuIHsgeTogRkxPT1JfWSAtIGggfTsKICAgIGlmICghbGV2ZWwpIHJldHVybiBudWxsOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbC5wbGF0Zm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHAgPSBsZXZlbC5wbGF0Zm9ybXNbaV07CiAgICAgIGlmICh4ICsgdyA+IHAueCAmJiB4IDwgcC54ICsgcC53ICYmIHkgKyBoID49IHAueSAmJiB5ICsgaCA8PSBwLnkgKyAxOCAmJiBwbGF5ZXIgJiYgcGxheWVyLnZ5ID49IDApIHsKICAgICAgICByZXR1cm4geyB5OiBwLnkgLSBoLCBwbGF0OiBwIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUGxheWVyKGR0KSB7CiAgICBpZiAoIXBsYXllciB8fCBwbGF5ZXIuZGVhZCkgewogICAgICBpZiAocGxheWVyICYmIHBsYXllci5hbmltID09PSAiZGVhdGgiKSB7CiAgICAgICAgcGxheWVyLmZyYW1lVCArPSBkdDsKICAgICAgICBpZiAocGxheWVyLmZyYW1lVCA+IDAuMTUgJiYgcGxheWVyLmZyYW1lIDwgMikgeyBwbGF5ZXIuZnJhbWUgKz0gMTsgcGxheWVyLmZyYW1lVCA9IDA7IH0KICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgcGxheWVyLmJvbHRDZCA9IE1hdGgubWF4KDAsIHBsYXllci5ib2x0Q2QgLSBkdCk7CiAgICBwbGF5ZXIueWFybkNkID0gTWF0aC5tYXgoMCwgcGxheWVyLnlhcm5DZCAtIGR0KTsKICAgIHBsYXllci5jdXJzZUNkID0gTWF0aC5tYXgoMCwgcGxheWVyLmN1cnNlQ2QgLSBkdCk7CiAgICBwbGF5ZXIuZGFzaENkID0gTWF0aC5tYXgoMCwgcGxheWVyLmRhc2hDZCAtIGR0KTsKICAgIHBsYXllci5pZnJhbWUgPSBNYXRoLm1heCgwLCBwbGF5ZXIuaWZyYW1lIC0gZHQpOwogICAgcGxheWVyLmludnVsbiA9IE1hdGgubWF4KDAsIHBsYXllci5pbnZ1bG4gLSBkdCk7CiAgICBwbGF5ZXIuc2NhcmVkVCA9IE1hdGgubWF4KDAsIHBsYXllci5zY2FyZWRUIC0gZHQpOwoKICAgIHVwZGF0ZVJhZ2VQYWQoKTsKICAgIGF1dG9JbnRlcmFjdENkID0gTWF0aC5tYXgoMCwgYXV0b0ludGVyYWN0Q2QgLSBkdCk7CiAgICBpZiAoaXNUb3VjaERldmljZSgpICYmIGF1dG9JbnRlcmFjdENkIDw9IDApIHsKICAgICAgdHJ5SW50ZXJhY3QoKTsKICAgICAgYXV0b0ludGVyYWN0Q2QgPSAwLjM1OwogICAgfQoKICAgIGlmIChwbGF5ZXIucmFnaW5nKSB7CiAgICAgIHBsYXllci5yYWdlVCAtPSBkdDsKICAgICAgbXVzaWNSYXRlID0gMS41NTsKICAgICAgLy8gd2hpcmx3aW5kIGNsYXdzCiAgICAgIGlmIChNYXRoLmZsb29yKHRpbWUgKiA4KSAhPT0gTWF0aC5mbG9vcigodGltZSAtIGR0KSAqIDgpKSB7CiAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgaWYgKGUuZGVhZCkgcmV0dXJuOwogICAgICAgICAgaWYgKGRpc3QoZS54ICsgZS53IC8gMiwgZS55ICsgZS5oIC8gMiwgcGxheWVyLnggKyBwbGF5ZXIudyAvIDIsIHBsYXllci55ICsgcGxheWVyLmggLyAyKSA8IDkwKSB7CiAgICAgICAgICAgIGh1cnRFbmVteShlLCAxMCwgcGxheWVyLmZhY2luZyAqIDQwLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBidXJzdChwbGF5ZXIueCArIHBsYXllci53IC8gMiwgcGxheWVyLnkgKyAzMCwgIiNjYzQ0ZmYiLCAzKTsKICAgICAgfQogICAgICBpZiAocGxheWVyLnJhZ2VUIDw9IDApIHsKICAgICAgICBwbGF5ZXIucmFnaW5nID0gZmFsc2U7CiAgICAgICAgbXVzaWNSYXRlID0gMTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbXVzaWNSYXRlID0gMTsKICAgIH0KCiAgICBpZiAocGxheWVyLmRhc2hpbmcpIHsKICAgICAgcGxheWVyLmRhc2hUIC09IGR0OwogICAgICBwbGF5ZXIubWlzdC5wdXNoKHsgeDogcGxheWVyLngsIHk6IHBsYXllci55LCBsaWZlOiAwLjI1LCBmYWNpbmc6IHBsYXllci5mYWNpbmcgfSk7CiAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICBpZiAoZS5kZWFkKSByZXR1cm47CiAgICAgICAgaWYgKGFhYmIocGxheWVyLCBlKSkgaHVydEVuZW15KGUsIDQwLCBwbGF5ZXIuZmFjaW5nICogODAsIHRydWUpOwogICAgICB9KTsKICAgICAgaWYgKGxldmVsLmN1Y3VtYmVycykgewogICAgICAgIGxldmVsLmN1Y3VtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICBpZiAoIWMucG9wcGVkIHx8ICFjLmFybWVkKSByZXR1cm47CiAgICAgICAgICBpZiAoTWF0aC5hYnMoKHBsYXllci54ICsgcGxheWVyLncgLyAyKSAtIGMueCkgPCA0MCkgewogICAgICAgICAgICBjLmFybWVkID0gZmFsc2U7CiAgICAgICAgICAgIGMudCA9IDA7CiAgICAgICAgICAgIGJ1cnN0KGMueCwgYy55IC0gMjQsICIjNjZmZmNjIiwgMTQpOwogICAgICAgICAgICBzY29yZSArPSA0MDsKICAgICAgICAgICAgcGxheWVyLmtpbGxzICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHBsYXllci5kYXNoVCA8PSAwKSB7CiAgICAgICAgcGxheWVyLmRhc2hpbmcgPSBmYWxzZTsKICAgICAgICBwbGF5ZXIudnggKj0gMC40OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB2YXIgbGVmdCA9IHdhbnRMZWZ0KCk7CiAgICAgIHZhciByaWdodCA9IHdhbnRSaWdodCgpOwogICAgICB2YXIgdGFyZ2V0ID0gMDsKICAgICAgaWYgKGxlZnQpIHsgdGFyZ2V0ID0gLU1BWF9TUEVFRDsgcGxheWVyLmZhY2luZyA9IC0xOyB9CiAgICAgIGlmIChyaWdodCkgeyB0YXJnZXQgPSBNQVhfU1BFRUQ7IHBsYXllci5mYWNpbmcgPSAxOyB9CiAgICAgIGlmIChsZWZ0ICYmIHJpZ2h0KSB0YXJnZXQgPSAwOwogICAgICAvLyBhY2NlbGVyYXRlCiAgICAgIGlmIChNYXRoLmFicyh0YXJnZXQpID4gTWF0aC5hYnMocGxheWVyLnZ4KSB8fCB0YXJnZXQgKiBwbGF5ZXIudnggPCAwIHx8IHRhcmdldCA9PT0gMCkgewogICAgICAgIHZhciBhID0gQUNDRUwgKiBkdDsKICAgICAgICBpZiAocGxheWVyLnZ4IDwgdGFyZ2V0KSBwbGF5ZXIudnggPSBNYXRoLm1pbih0YXJnZXQsIHBsYXllci52eCArIGEpOwogICAgICAgIGVsc2UgcGxheWVyLnZ4ID0gTWF0aC5tYXgodGFyZ2V0LCBwbGF5ZXIudnggLSBhKTsKICAgICAgfQogICAgfQoKICAgIHZhciBqdW1wID0gd2FudEp1bXAoKTsKICAgIGlmIChqdW1wICYmICFwbGF5ZXIud2FzSnVtcCAmJiBwbGF5ZXIub25Hcm91bmQpIHsKICAgICAgcGxheWVyLnZ5ID0gSlVNUF9WOwogICAgICBwbGF5ZXIub25Hcm91bmQgPSBmYWxzZTsKICAgICAgcGxheWVyLmdsaWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIC8vIGdsaWRlOiBob2xkIGp1bXAgd2hpbGUgZmFsbGluZwogICAgcGxheWVyLmdsaWRpbmcgPSAoIXBsYXllci5vbkdyb3VuZCAmJiBqdW1wICYmIHBsYXllci52eSA+IDAgJiYgIXBsYXllci5kYXNoaW5nKTsKICAgIGlmIChwbGF5ZXIuZ2xpZGluZykgewogICAgICBwbGF5ZXIudnkgPSBNYXRoLm1pbihwbGF5ZXIudnksIEdMSURFX0ZBTEwpOwogICAgfQogICAgcGxheWVyLndhc0p1bXAgPSBqdW1wOwoKICAgIHBsYXllci52eSArPSBHUkFWICogZHQ7CiAgICBpZiAocGxheWVyLmdsaWRpbmcpIHBsYXllci52eSA9IE1hdGgubWluKHBsYXllci52eSwgR0xJREVfRkFMTCk7CgogICAgcGxheWVyLnggKz0gcGxheWVyLnZ4ICogZHQ7CiAgICBwbGF5ZXIueSArPSBwbGF5ZXIudnkgKiBkdDsKICAgIHBsYXllci54ID0gY2xhbXAocGxheWVyLngsIDAsIGxldmVsLndpZHRoIC0gcGxheWVyLncpOwoKICAgIHBsYXllci5vbkdyb3VuZCA9IGZhbHNlOwogICAgdmFyIGhpdCA9IHNvbGlkQXQocGxheWVyLngsIHBsYXllci55LCBwbGF5ZXIudywgcGxheWVyLmgpOwogICAgaWYgKGhpdCkgewogICAgICBwbGF5ZXIueSA9IGhpdC55OwogICAgICBwbGF5ZXIudnkgPSAwOwogICAgICBwbGF5ZXIub25Hcm91bmQgPSB0cnVlOwogICAgICBwbGF5ZXIuZ2xpZGluZyA9IGZhbHNlOwogICAgfQoKICAgIC8vIHN1bmxpZ2h0IGRyYWluCiAgICBpZiAobGV2ZWwuc3VucykgewogICAgICBsZXZlbC5zdW5zLmZvckVhY2goZnVuY3Rpb24gKHMpIHsKICAgICAgICBpZiAoIXMuYWN0aXZlKSByZXR1cm47CiAgICAgICAgaWYgKHBsYXllci54ICsgcGxheWVyLncgPiBzLnggJiYgcGxheWVyLnggPCBzLnggKyBzLncgJiYgcGxheWVyLm9uR3JvdW5kKSB7CiAgICAgICAgICBodXJ0UGxheWVyKDEyICogZHQsIDApOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvLyBoZWF0IHZlbnRzCiAgICBpZiAobGV2ZWwuaGVhdFZlbnRzKSB7CiAgICAgIGxldmVsLmhlYXRWZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChoKSB7CiAgICAgICAgaC50ICs9IGR0OwogICAgICAgIHZhciBvbiA9IChNYXRoLnNpbihoLnQgKiAyKSA+IDAuMik7CiAgICAgICAgaWYgKG9uICYmIHBsYXllci54ICsgcGxheWVyLncgPiBoLnggJiYgcGxheWVyLnggPCBoLnggKyBoLncgJiYgcGxheWVyLnkgKyBwbGF5ZXIuaCA+IEZMT09SX1kgLSA4MCkgewogICAgICAgICAgaHVydFBsYXllcigxOCAqIGR0LCAwKTsKICAgICAgICB9CiAgICAgICAgaC5vbiA9IG9uOwogICAgICB9KTsKICAgIH0KCiAgICAvLyBhbmltYXRpb24KICAgIHBsYXllci5mcmFtZVQgKz0gZHQ7CiAgICB2YXIgbmV4dEFuaW0gPSAiaWRsZSI7CiAgICBpZiAocGxheWVyLmludnVsbiA+IDAuNTUgJiYgcGxheWVyLmFuaW0gPT09ICJoaXQiKSBuZXh0QW5pbSA9ICJoaXQiOwogICAgZWxzZSBpZiAocGxheWVyLnJhZ2luZykgbmV4dEFuaW0gPSAicmFnZSI7CiAgICBlbHNlIGlmIChwbGF5ZXIuZGFzaGluZykgbmV4dEFuaW0gPSAicnVuIjsKICAgIGVsc2UgaWYgKCFwbGF5ZXIub25Hcm91bmQpIG5leHRBbmltID0gcGxheWVyLmdsaWRpbmcgPyAiZ2xpZGUiIDogKHBsYXllci52eSA8IDAgPyAianVtcCIgOiAiZmFsbCIpOwogICAgZWxzZSBpZiAoTWF0aC5hYnMocGxheWVyLnZ4KSA+IDQwKSBuZXh0QW5pbSA9ICJ3YWxrIjsKICAgIGVsc2UgbmV4dEFuaW0gPSAiaWRsZSI7CgogICAgaWYgKHBsYXllci5hbmltID09PSAiYXR0YWNrIiAmJiBwbGF5ZXIuZnJhbWVUIDwgMC4yNSkgbmV4dEFuaW0gPSAiYXR0YWNrIjsKCiAgICBpZiAobmV4dEFuaW0gIT09IHBsYXllci5hbmltKSB7CiAgICAgIHBsYXllci5hbmltID0gbmV4dEFuaW07CiAgICAgIHBsYXllci5mcmFtZSA9IDA7CiAgICAgIHBsYXllci5mcmFtZVQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHNwZCA9IChuZXh0QW5pbSA9PT0gInJ1biIpID8gMC4wNyA6IDAuMTE7CiAgICAgIGlmIChwbGF5ZXIuZnJhbWVUID4gc3BkKSB7CiAgICAgICAgcGxheWVyLmZyYW1lVCA9IDA7CiAgICAgICAgcGxheWVyLmZyYW1lICs9IDE7CiAgICAgIH0KICAgIH0KCiAgICAvLyBtaXN0IHRyYWlsIGRlY2F5CiAgICBwbGF5ZXIubWlzdCA9IHBsYXllci5taXN0LmZpbHRlcihmdW5jdGlvbiAobSkgewogICAgICBtLmxpZmUgLT0gZHQ7CiAgICAgIHJldHVybiBtLmxpZmUgPiAwOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVFbmVtaWVzKGR0KSB7CiAgICB2YXIgY3Vyc2UgPSBudWxsOwogICAgcHJvamVjdGlsZXMuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICBpZiAocC50eXBlID09PSAiY3Vyc2UiICYmIHAubGlmZSA+IDApIGN1cnNlID0gcDsKICAgIH0pOwoKICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgZS50ICs9IGR0OwogICAgICBlLmZsYXNoID0gTWF0aC5tYXgoMCwgZS5mbGFzaCAtIGR0KTsKICAgICAgZS5hbmltVCA9IChlLmFuaW1UIHx8IDApICsgZHQ7CiAgICAgIGlmIChlLmFuaW1UID4gMC4xNCkgeyBlLmFuaW1UID0gMDsgZS5mcmFtZSA9IChlLmZyYW1lIHx8IDApICsgMTsgfQogICAgICBpZiAoZS5kZWFkKSB7CiAgICAgICAgZS5kZWF0aFQgPSAoZS5kZWF0aFQgfHwgMCkgLSBkdDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHBjID0gcGxheWVyQ2VudGVyKCk7CiAgICAgIHZhciBleCA9IGUueCArIGUudyAvIDI7CgogICAgICBpZiAoY3Vyc2UpIHsKICAgICAgICB2YXIgY3ggPSBjdXJzZS54ICsgY3Vyc2UudyAvIDI7CiAgICAgICAgZS52eCA9IChjeCA8IGV4ID8gLTEgOiAxKSAqIDE0MDsKICAgICAgICBlLmZhY2luZyA9IGUudnggPCAwID8gLTEgOiAxOwogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gImN1bHRpc3QiKSB7CiAgICAgICAgdmFyIGR4ID0gcGMueCAtIGV4OwogICAgICAgIGUuZmFjaW5nID0gZHggPCAwID8gLTEgOiAxOwogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiA4MCkgZS52eCA9IGUuZmFjaW5nICogNzA7CiAgICAgICAgZWxzZSBlLnZ4ID0gMDsKICAgICAgICBlLnkgPSBGTE9PUl9ZIC0gZS5oICsgTWF0aC5zaW4oZS50ICogMykgKiAzOwogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gIm1pc3QiKSB7CiAgICAgICAgdmFyIGR4bSA9IHBjLnggLSBleDsKICAgICAgICBlLmZhY2luZyA9IGR4bSA8IDAgPyAtMSA6IDE7CiAgICAgICAgZS52eCA9IGUuZmFjaW5nICogOTU7CiAgICAgICAgZS55ID0gRkxPT1JfWSAtIDkwICsgTWF0aC5zaW4oZS50ICogNCArIGUueCAqIDAuMDEpICogMjg7CiAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAiZ2hvc3RjYXQiKSB7CiAgICAgICAgdmFyIGR4ZyA9IHBjLnggLSBleDsKICAgICAgICBlLmZhY2luZyA9IGR4ZyA8IDAgPyAtMSA6IDE7CiAgICAgICAgZS52eCA9IGUuZmFjaW5nICogMTIwOwogICAgICAgIGUueSA9IEZMT09SX1kgLSAxNDAgKyBNYXRoLnNpbihlLnQgKiAzLjIpICogMzY7CiAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAicHVnIikgewogICAgICAgIHZhciBkeDIgPSBwYy54IC0gZXg7CiAgICAgICAgZS5mYWNpbmcgPSBkeDIgPCAwID8gLTEgOiAxOwogICAgICAgIGUuc2xhbUNkID0gKGUuc2xhbUNkIHx8IDApIC0gZHQ7CiAgICAgICAgZS5zbGFtVCA9IE1hdGgubWF4KDAsIChlLnNsYW1UIHx8IDApIC0gZHQpOwogICAgICAgIGlmIChlLnNsYW1UID4gMCkgewogICAgICAgICAgZS52eCA9IDA7CiAgICAgICAgICBlLnkgPSBGTE9PUl9ZIC0gZS5oOwogICAgICAgICAgZS5zdGF0ZSA9ICJzbGFtIjsKICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGR4MikgPiAxMDApIHsKICAgICAgICAgIGUudnggPSBlLmZhY2luZyAqIDU1OwogICAgICAgICAgZS55ID0gRkxPT1JfWSAtIGUuaCAtIDE4ICsgTWF0aC5zaW4oZS50ICogNSkgKiA2OwogICAgICAgICAgZS5zdGF0ZSA9ICJob3ZlciI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGUudnggPSAwOwogICAgICAgICAgZS55ID0gRkxPT1JfWSAtIGUuaCAtIDEwICsgTWF0aC5zaW4oZS50ICogNCkgKiA1OwogICAgICAgICAgZS5zdGF0ZSA9ICJob3ZlciI7CiAgICAgICAgICBpZiAoZS5zbGFtQ2QgPD0gMCkgewogICAgICAgICAgICBlLnNsYW1DZCA9IDIuNDsKICAgICAgICAgICAgZS5zdGF0ZSA9ICJzbGFtIjsKICAgICAgICAgICAgZS5zbGFtVCA9IDAuNDU7CiAgICAgICAgICAgIHByb2plY3RpbGVzLnB1c2goewogICAgICAgICAgICAgIHR5cGU6ICJzaG9jayIsCiAgICAgICAgICAgICAgeDogZS54IC0gNDAsIHk6IEZMT09SX1kgLSAyMCwKICAgICAgICAgICAgICB3OiBlLncgKyA4MCwgaDogMjQsCiAgICAgICAgICAgICAgbGlmZTogMC4zNSwKICAgICAgICAgICAgICBkbWc6IDE4LAogICAgICAgICAgICAgIGZyaWVuZGx5OiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnVyc3QoZXgsIEZMT09SX1kgLSAxMCwgIiM4OGZmY2MiLCAxMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gInZhY3V1bSIpIHsKICAgICAgICBlLmZhY2luZyA9IHBjLnggPCBleCA\/IC0xIDogMTsKICAgICAgICBlLnB1bGxDZCAtPSBkdDsKICAgICAgICBlLnNvbmljQ2QgLT0gZHQ7CiAgICAgICAgLy8gc3VjdGlvbgogICAgICAgIGlmIChlLnB1bGxDZCA8PSAwKSB7CiAgICAgICAgICB2YXIgcHVsbCA9IGNsYW1wKDI4MCAvIE1hdGgubWF4KDQwLCBNYXRoLmFicyhwYy54IC0gZXgpKSwgMCwgNC41KTsKICAgICAgICAgIHBsYXllci52eCArPSAoZXggPCBwYy54ID8gLTEgOiAxKSAqIHB1bGwgKiAxMjAgKiBkdDsKICAgICAgICAgIGlmIChNYXRoLmFicyhwYy54IC0gZXgpIDwgNzAgJiYgTWF0aC5hYnMocGMueSAtIChlLnkgKyA0MCkpIDwgNjApIHsKICAgICAgICAgICAgaHVydFBsYXllcigyMiwgZS5mYWNpbmcgKiAtODApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZS5zb25pY0NkIDw9IDApIHsKICAgICAgICAgIGUuc29uaWNDZCA9IDMuMjsKICAgICAgICAgIHByb2plY3RpbGVzLnB1c2goewogICAgICAgICAgICB0eXBlOiAic29uaWMiLAogICAgICAgICAgICB4OiBlLnggKyAoZS5mYWNpbmcgPCAwID8gLTIwIDogZS53KSwKICAgICAgICAgICAgeTogZS55ICsgMzAsCiAgICAgICAgICAgIHc6IDMwLCBoOiA0MCwKICAgICAgICAgICAgdng6IGUuZmFjaW5nICogMjYwLAogICAgICAgICAgICBsaWZlOiAyLAogICAgICAgICAgICBkbWc6IDE0LAogICAgICAgICAgICBmcmllbmRseTogZmFsc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlLnZ4ID0gMDsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICJsYXNlciIpIHsKICAgICAgICAvLyByb2FtaW5nIGxhc2VyIGRvdCB0aGF0IGRpc3RyYWN0cyBDYXR1bGEKICAgICAgICBlLmRvdFggKz0gTWF0aC5zaW4oZS50ICogMS43KSAqIDE4MCAqIGR0OwogICAgICAgIGUuZG90WSA9IDE2MCArIE1hdGguc2luKGUudCAqIDIuMykgKiA4MDsKICAgICAgICBlLmRvdFggPSBjbGFtcChlLmRvdFgsIGNhbWVyYVggKyA4MCwgY2FtZXJhWCArIFZJRVdfVyAtIDgwKTsKICAgICAgICBlLnggPSBlLmRvdFggLSBlLncgLyAyOwogICAgICAgIGUueSA9IGUuZG90WSAtIGUuaCAvIDI7CiAgICAgICAgLy8gZGlzdHJhY3Rpb246IGlmIHBsYXllciBuZWFyLCBwdWxsIGZhY2luZyBhbmQgc2xvdwogICAgICAgIGlmIChkaXN0KHBjLngsIHBjLnksIGUuZG90WCwgZS5kb3RZKSA8IDE2MCkgewogICAgICAgICAgZS5kaXN0cmFjdCArPSBkdDsKICAgICAgICAgIHBsYXllci5mYWNpbmcgPSAoZS5kb3RYID4gcGMueCkgPyAxIDogLTE7CiAgICAgICAgICBwbGF5ZXIudnggKj0gMC45MjsKICAgICAgICAgIGlmIChlLmRpc3RyYWN0ID4gMS4yKSB7CiAgICAgICAgICAgIGh1cnRQbGF5ZXIoMTAsIDApOwogICAgICAgICAgICBlLmRpc3RyYWN0ID0gMDsKICAgICAgICAgICAgYnVyc3QoZS5kb3RYLCBlLmRvdFksICIjZmYyMjQ0IiwgMTApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlLmRpc3RyYWN0ID0gTWF0aC5tYXgoMCwgZS5kaXN0cmFjdCAtIGR0KTsKICAgICAgICB9CiAgICAgICAgLy8gY2FuIGJlIGhpdCBieSBib2x0cwogICAgICAgIGUudnggPSAwOwogICAgICB9CgogICAgICBlLnggKz0gZS52eCAqIGR0OwogICAgICBlLnggPSBjbGFtcChlLngsIDQwLCBsZXZlbC53aWR0aCAtIGUudyAtIDQwKTsKCiAgICAgIC8vIGNvbnRhY3QgZGFtYWdlCiAgICAgIGlmIChlLnR5cGUgIT09ICJsYXNlciIgJiYgYWFiYihwbGF5ZXIsIGUpKSB7CiAgICAgICAgaHVydFBsYXllcihlLnR5cGUgPT09ICJ2YWN1dW0iID8gMTYgOiAxMiwgZS5mYWNpbmcgKiAxMDApOwogICAgICB9CiAgICB9KTsKICAgIGVudGl0aWVzID0gZW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiAhZS5kZWFkIHx8IChlLmRlYXRoVCB8fCAwKSA+IDA7IH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlQ3VjdW1iZXJzKGR0KSB7CiAgICBpZiAoIWxldmVsLmN1Y3VtYmVycykgcmV0dXJuOwogICAgbGV2ZWwuY3VjdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgaWYgKCFjLmFybWVkKSByZXR1cm47CiAgICAgIGlmICghYy5wb3BwZWQpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoKHBsYXllci54ICsgcGxheWVyLncgLyAyKSAtIGMueCkgPCA1MCAmJiBwbGF5ZXIub25Hcm91bmQpIHsKICAgICAgICAgIGMucG9wcGVkID0gdHJ1ZTsKICAgICAgICAgIGMudCA9IDAuNjsKICAgICAgICAgIHBsYXllci5zY2FyZWRUID0gMi4yOwogICAgICAgICAgc2hvd01zZygiU0NBUkVEWS1DQVQhIENvbnRyb2xzIGZsaXBwZWQhIik7CiAgICAgICAgICBidXJzdChjLngsIGMueSAtIDIwLCAiIzQ0ZmY2NiIsIDEyKTsKICAgICAgICAgIHNmeCgiaGl0Iik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGMudCAtPSBkdDsKICAgICAgICBpZiAoYy50IDw9IDApIHsgYy5hcm1lZCA9IGZhbHNlOyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSGF6YXJkcyhkdCkgewogICAgLy8gY2hhbmRlbGllcgogICAgaWYgKGxldmVsLmNoYW5kZWxpZXIgJiYgbGV2ZWwuY2hhbmRlbGllci5mYWxsaW5nKSB7CiAgICAgIHZhciBjaCA9IGxldmVsLmNoYW5kZWxpZXI7CiAgICAgIGNoLnZ5ICs9IDE2MDAgKiBkdDsKICAgICAgY2gueSArPSBjaC52eSAqIGR0OwogICAgICBpZiAoY2gueSArIGNoLmggPj0gRkxPT1JfWSkgewogICAgICAgIGNoLnkgPSBGTE9PUl9ZIC0gY2guaDsKICAgICAgICBjaC5mYWxsaW5nID0gZmFsc2U7CiAgICAgICAgY2guZHJvcHBlZCA9IHRydWU7CiAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgaWYgKGUuZGVhZCkgcmV0dXJuOwogICAgICAgICAgaWYgKGUueCArIGUudyA+IGNoLnggLSAyMCAmJiBlLnggPCBjaC54ICsgY2gudyArIDIwKSB7CiAgICAgICAgICAgIGh1cnRFbmVteShlLCA4MCwgMCwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYnVyc3QoY2gueCArIDUwLCBGTE9PUl9ZIC0gMjAsICIjZmZjYzY2IiwgMjApOwogICAgICAgIHNmeCgiaGl0Iik7CiAgICAgIH0KICAgIH0KICAgIC8vIGZhbGxpbmcgc2hlbHZlcwogICAgaWYgKGxldmVsLmZhbGxpbmdTaGVsdmVzKSB7CiAgICAgIGxldmVsLmZhbGxpbmdTaGVsdmVzLmZvckVhY2goZnVuY3Rpb24gKHMpIHsKICAgICAgICBpZiAoIXMudHJpZ2dlcmVkICYmIE1hdGguYWJzKChwbGF5ZXIueCArIHBsYXllci53IC8gMikgLSAocy54ICsgcy53IC8gMikpIDwgMTIwKSB7CiAgICAgICAgICBzLnRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICBzLmZhbGxpbmcgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAocy5mYWxsaW5nKSB7CiAgICAgICAgICBzLnZ5ICs9IDE0MDAgKiBkdDsKICAgICAgICAgIHMueSArPSBzLnZ5ICogZHQ7CiAgICAgICAgICBpZiAocy55ICsgcy5oID49IEZMT09SX1kpIHsKICAgICAgICAgICAgcy55ID0gRkxPT1JfWSAtIHMuaDsKICAgICAgICAgICAgcy5mYWxsaW5nID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChhYWJiKHBsYXllciwgcykpIGh1cnRQbGF5ZXIoMjAsIDApOwogICAgICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgaWYgKCFlLmRlYWQgJiYgYWFiYihlLCBzKSkgaHVydEVuZW15KGUsIDQwLCAwLCB0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJ1cnN0KHMueCArIHMudyAvIDIsIEZMT09SX1ksICIjYWE4ODY2IiwgMTQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvLyBzY3JvbGxzCiAgICBpZiAobGV2ZWwuc2Nyb2xscykgewogICAgICBsZXZlbC5zY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKHNjKSB7CiAgICAgICAgc2MueCArPSBzYy52eCAqIGR0OwogICAgICAgIGlmIChzYy54IDwgMjAwIHx8IHNjLnggPiBsZXZlbC53aWR0aCAtIDIwMCkgc2MudnggKj0gLTE7CiAgICAgICAgc2MueSA9IDE2MCArIE1hdGguc2luKHRpbWUgKiAzICsgc2MueCAqIDAuMDEpICogNDA7CiAgICAgICAgaWYgKGFhYmIocGxheWVyLCB7IHg6IHNjLngsIHk6IHNjLnksIHc6IHNjLncsIGg6IHNjLmggfSkpIHsKICAgICAgICAgIGh1cnRQbGF5ZXIoMTAsIHNjLnZ4ID4gMCA\/IDgwIDogLTgwKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUHJvamVjdGlsZXMoZHQpIHsKICAgIHByb2plY3RpbGVzLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgcC5saWZlIC09IGR0OwogICAgICBpZiAocC50eXBlID09PSAiYm9sdCIgfHwgcC50eXBlID09PSAic29uaWMiKSB7CiAgICAgICAgcC54ICs9IChwLnZ4IHx8IDApICogZHQ7CiAgICAgICAgcC55ICs9IChwLnZ5IHx8IDApICogZHQ7CiAgICAgIH0gZWxzZSBpZiAocC50eXBlID09PSAieWFybiIpIHsKICAgICAgICBwLnZ5ICs9IDkwMCAqIGR0OwogICAgICAgIHAueCArPSBwLnZ4ICogZHQ7CiAgICAgICAgcC55ICs9IHAudnkgKiBkdDsKICAgICAgICBpZiAocC55ICsgcC5oID4gRkxPT1JfWSkgewogICAgICAgICAgcC55ID0gRkxPT1JfWSAtIHAuaDsKICAgICAgICAgIHAudnkgKj0gLTAuNzU7CiAgICAgICAgICBwLmJvdW5jZSAtPSAxOwogICAgICAgICAgaWYgKHAuYm91bmNlIDw9IDApIHAucGhhc2UgPSAiYnVyc3QiOwogICAgICAgIH0KICAgICAgICAvLyBwdWxsIGVuZW1pZXMKICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoZS5kZWFkKSByZXR1cm47CiAgICAgICAgICB2YXIgZCA9IGRpc3QoZS54ICsgZS53IC8gMiwgZS55ICsgZS5oIC8gMiwgcC54ICsgMTQsIHAueSArIDE0KTsKICAgICAgICAgIGlmIChkIDwgcC5wdWxsUikgewogICAgICAgICAgICB2YXIgcHVsbCA9ICgxIC0gZCAvIHAucHVsbFIpICogMjIwICogZHQ7CiAgICAgICAgICAgIGUueCArPSAocC54IDwgZS54ID8gLTEgOiAxKSAqIHB1bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYWFiYihlLCBwKSkgaHVydEVuZW15KGUsIHAuZG1nICogZHQgKiAzLCAwLCB0cnVlKTsKICAgICAgICB9KTsKICAgICAgICBpZiAocC5waGFzZSA9PT0gImJ1cnN0IiB8fCBwLmxpZmUgPCAwLjQpIHsKICAgICAgICAgIC8vIGJhdCBidXJzdAogICAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBpZiAoZS5kZWFkKSByZXR1cm47CiAgICAgICAgICAgIGlmIChkaXN0KGUueCArIGUudyAvIDIsIGUueSArIGUuaCAvIDIsIHAueCwgcC55KSA8IDEyMCkgewogICAgICAgICAgICAgIGh1cnRFbmVteShlLCAyOCwgMCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgYnVyc3QocC54LCBwLnksICIjNjYyMmFhIiwgMjApOwogICAgICAgICAgYnVyc3QocC54LCBwLnksICIjMTEwMDExIiwgMTApOwogICAgICAgICAgcC5saWZlID0gMDsKICAgICAgICAgIHNmeCgieWFybiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwLnR5cGUgPT09ICJzaG9jayIpIHsKICAgICAgICBpZiAoYWFiYihwbGF5ZXIsIHApKSBodXJ0UGxheWVyKHAuZG1nLCAwKTsKICAgICAgfQoKICAgICAgaWYgKHAuZnJpZW5kbHkgJiYgKHAudHlwZSA9PT0gImJvbHQiKSkgewogICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIGlmIChlLmRlYWQgfHwgcC5saWZlIDw9IDApIHJldHVybjsKICAgICAgICAgIGlmIChhYWJiKGUsIHApKSB7CiAgICAgICAgICAgIHZhciBmcm9tQmVoaW5kID0gKGUuZmFjaW5nID4gMCAmJiBwLnZ4IDwgMCkgfHwgKGUuZmFjaW5nIDwgMCAmJiBwLnZ4ID4gMCk7CiAgICAgICAgICAgIGh1cnRFbmVteShlLCBwLmRtZywgKHAudnggPiAwID8gMSA6IC0xKSAqIDYwLCBmcm9tQmVoaW5kKTsKICAgICAgICAgICAgcC5waWVyY2UgLT0gMTsKICAgICAgICAgICAgaWYgKHAucGllcmNlIDw9IDApIHAubGlmZSA9IDA7CiAgICAgICAgICAgIGJ1cnN0KHAueCwgcC55LCAiI2ZmOTljYyIsIDQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChsZXZlbC5jdWN1bWJlcnMgJiYgcC5saWZlID4gMCkgewogICAgICAgICAgbGV2ZWwuY3VjdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgaWYgKCFjLnBvcHBlZCB8fCAhYy5hcm1lZCkgcmV0dXJuOwogICAgICAgICAgICBpZiAoTWF0aC5hYnMocC54IC0gYy54KSA8IDI4ICYmIE1hdGguYWJzKHAueSAtIChjLnkgLSAzMCkpIDwgNDApIHsKICAgICAgICAgICAgICBjLmFybWVkID0gZmFsc2U7CiAgICAgICAgICAgICAgYy50ID0gMDsKICAgICAgICAgICAgICBwLmxpZmUgPSAwOwogICAgICAgICAgICAgIGJ1cnN0KGMueCwgYy55IC0gMjQsICIjNjZmZmNjIiwgMTQpOwogICAgICAgICAgICAgIHNjb3JlICs9IDQwOwogICAgICAgICAgICAgIHBsYXllci5raWxscyArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gYnJlYWthYmxlcwogICAgICAgIGlmIChsZXZlbC5icmVha2FibGVzKSB7CiAgICAgICAgICBsZXZlbC5icmVha2FibGVzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgaWYgKGIuaHAgPD0gMCkgcmV0dXJuOwogICAgICAgICAgICBpZiAoYWFiYihiLCBwKSkgewogICAgICAgICAgICAgIGIuaHAgPSAwOwogICAgICAgICAgICAgIHAubGlmZSA9IDA7CiAgICAgICAgICAgICAgLy8gZmFsbGluZyB2YXNlIGRhbWFnZXMgYmVsb3cKICAgICAgICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWUuZGVhZCAmJiBNYXRoLmFicygoZS54ICsgZS53IC8gMikgLSAoYi54ICsgYi53IC8gMikpIDwgNTAgJiYgZS55ID4gYi55KSB7CiAgICAgICAgICAgICAgICAgIGh1cnRFbmVteShlLCAzNSwgMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgYnVyc3QoYi54ICsgMTgsIGIueSArIDIwLCAiI2NjYWE2NiIsIDEyKTsKICAgICAgICAgICAgICBzY29yZSArPSAyNTsKICAgICAgICAgICAgICBzZngoInBpY2t1cCIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFwLmZyaWVuZGx5ICYmIHAudHlwZSA9PT0gInNvbmljIikgewogICAgICAgIGlmIChhYWJiKHBsYXllciwgcCkpIHsKICAgICAgICAgIGh1cnRQbGF5ZXIocC5kbWcsIChwLnZ4ID4gMCA\/IDEgOiAtMSkgKiAxMjApOwogICAgICAgICAgcC5saWZlID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcHJvamVjdGlsZXMgPSBwcm9qZWN0aWxlcy5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAubGlmZSA+IDA7IH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlV2F2ZXMoZHQpIHsKICAgIGlmICghbGV2ZWwud2F2ZXMgfHwgd2F2ZSA+PSBsZXZlbC53YXZlcy5sZW5ndGgpIHsKICAgICAgLy8gYm9zcyBzcGF3bgogICAgICBpZiAobGV2ZWwuYm9zcyAmJiAhbGV2ZWwuYm9zcy5zcGF3bmVkKSB7CiAgICAgICAgdmFyIGFsaXZlID0gZW50aXRpZXMuc29tZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gIWUuZGVhZDsgfSk7CiAgICAgICAgaWYgKCFhbGl2ZSAmJiBwbGF5ZXIua2lsbHMgPj0gTWF0aC5taW4obGV2ZWwuZ29hbEtpbGxzLCA0KSkgewogICAgICAgICAgbGV2ZWwuYm9zcy5zcGF3bmVkID0gdHJ1ZTsKICAgICAgICAgIHNwYXduRW5lbXkobGV2ZWwuYm9zcy50eXBlLCBsZXZlbC5ib3NzLngpOwogICAgICAgICAgc2hvd01zZyhsZXZlbC5ib3NzLnR5cGUgPT09ICJ2YWN1dW0iID8gIlZhY3V1bSBLbmlnaHQgYXBwZWFycyEiIDogIlNpciBWYW4gSGVsc2luZyBMYXNlciBQb2ludGVyISIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghbGV2ZWwuYm9zcykgewogICAgICAgIC8vIHBhcmxvcjogY2xlYXIgd2hlbiBraWxscyBtZXQgYW5kIG5vbmUgYWxpdmUKICAgICAgICB2YXIgYWxpdmUyID0gZW50aXRpZXMuc29tZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gIWUuZGVhZDsgfSk7CiAgICAgICAgaWYgKCFhbGl2ZTIgJiYgcGxheWVyLmtpbGxzID49IGxldmVsLmdvYWxLaWxscyAmJiBsZXZlbENsZWFyVGltZXIgPD0gMCkgewogICAgICAgICAgbGV2ZWxDbGVhclRpbWVyID0gMjsKICAgICAgICAgIHNob3dNc2coIlBhcmxvciBjbGVhcmVkISIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICB3YXZlVGltZXIgKz0gZHQ7CiAgICB2YXIgdyA9IGxldmVsLndhdmVzW3dhdmVdOwogICAgaWYgKHdhdmVUaW1lciA+PSB3LmRlbGF5KSB7CiAgICAgIHcuc3Bhd24uZm9yRWFjaChmdW5jdGlvbiAocykgeyBzcGF3bkVuZW15KHMudHlwZSwgcy54KTsgfSk7CiAgICAgIHdhdmUgKz0gMTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVBhcnRpY2xlcyhkdCkgewogICAgcGFydGljbGVzLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgcC5saWZlIC09IGR0OwogICAgICBwLnggKz0gcC52eCAqIGR0OwogICAgICBwLnkgKz0gcC52eSAqIGR0OwogICAgICBwLnZ5ICs9IChwLmdyYXYgfHwgMCkgKiBkdDsKICAgIH0pOwogICAgcGFydGljbGVzID0gcGFydGljbGVzLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5saWZlID4gMDsgfSk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGUoZHQpIHsKICAgIGlmIChzdGF0ZSAhPT0gInBsYXkiKSByZXR1cm47CiAgICB0aW1lICs9IGR0OwogICAgaWYgKG1lc3NhZ2VUID4gMCkgbWVzc2FnZVQgLT0gZHQ7CiAgICB1cGRhdGVQbGF5ZXIoZHQpOwogICAgdXBkYXRlRW5lbWllcyhkdCk7CiAgICB1cGRhdGVDdWN1bWJlcnMoZHQpOwogICAgdXBkYXRlSGF6YXJkcyhkdCk7CiAgICB1cGRhdGVQcm9qZWN0aWxlcyhkdCk7CiAgICB1cGRhdGVXYXZlcyhkdCk7CiAgICB1cGRhdGVQYXJ0aWNsZXMoZHQpOwoKICAgIC8vIGNhbWVyYQogICAgdmFyIHRhcmdldENhbSA9IHBsYXllci54IC0gVklFV19XICogMC4zNTsKICAgIGNhbWVyYVggKz0gKHRhcmdldENhbSAtIGNhbWVyYVgpICogTWF0aC5taW4oMSwgZHQgKiA1KTsKICAgIGNhbWVyYVggPSBjbGFtcChjYW1lcmFYLCAwLCBNYXRoLm1heCgwLCBsZXZlbC53aWR0aCAtIFZJRVdfVykpOwoKICAgIGlmIChsZXZlbENsZWFyVGltZXIgPiAwKSB7CiAgICAgIGxldmVsQ2xlYXJUaW1lciAtPSBkdDsKICAgICAgaWYgKGxldmVsQ2xlYXJUaW1lciA8PSAwKSBuZXh0TGV2ZWxPcldpbigpOwogICAgfQogIH0KCiAgLyogLS0tLS0tLS0tLSBEcmF3IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBkcmF3QmFja2dyb3VuZCgpIHsKICAgIHZhciB0aGVtZSA9IGxldmVsLnRoZW1lOwogICAgaWYgKHRoZW1lID09PSAicGFybG9yIikgewogICAgICB2YXIgZyA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAwLCBWSUVXX0gpOwogICAgICBnLmFkZENvbG9yU3RvcCgwLCAiIzFhMGEyMiIpOwogICAgICBnLmFkZENvbG9yU3RvcCgxLCAiIzJhMTAzMCIpOwogICAgICBjdHguZmlsbFN0eWxlID0gZzsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIFZJRVdfVywgVklFV19IKTsKICAgICAgLy8gd2FsbHBhcGVyIHBhdHRlcm4KICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDgwLDIwLDYwLDAuMjUpIjsKICAgICAgZm9yICh2YXIgeCA9IC0oKGNhbWVyYVggKiAwLjMpICUgODApOyB4IDwgVklFV19XOyB4ICs9IDgwKSB7CiAgICAgICAgZm9yICh2YXIgeSA9IDQwOyB5IDwgRkxPT1JfWSAtIDQwOyB5ICs9IDgwKSB7CiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICBjdHguYXJjKHggKyA0MCwgeSArIDQwLCAxOCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGhlbWUgPT09ICJsaWJyYXJ5IikgewogICAgICB2YXIgZzIgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgVklFV19IKTsKICAgICAgZzIuYWRkQ29sb3JTdG9wKDAsICIjMTIwYzE4Iik7CiAgICAgIGcyLmFkZENvbG9yU3RvcCgxLCAiIzFlMTQyOCIpOwogICAgICBjdHguZmlsbFN0eWxlID0gZzI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBWSUVXX1csIFZJRVdfSCk7CiAgICAgIC8vIGJvb2tjYXNlIHNpbGhvdWV0dGVzCiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzJhMWExNCI7CiAgICAgIGZvciAodmFyIGJ4ID0gLSgoY2FtZXJhWCAqIDAuNCkgJSAxMjApOyBieCA8IFZJRVdfVzsgYnggKz0gMTIwKSB7CiAgICAgICAgY3R4LmZpbGxSZWN0KGJ4LCA2MCwgOTAsIEZMT09SX1kgLSA4MCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjNGEyMDEwIjsKICAgICAgICBmb3IgKHZhciBieSA9IDgwOyBieSA8IEZMT09SX1kgLSAxMDA7IGJ5ICs9IDI4KSB7CiAgICAgICAgICBjdHguZmlsbFJlY3QoYnggKyA2LCBieSwgNzgsIDIwKTsKICAgICAgICB9CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMmExYTE0IjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGczID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIFZJRVdfSCk7CiAgICAgIGczLmFkZENvbG9yU3RvcCgwLCAiIzJhMjA0MCIpOwogICAgICBnMy5hZGRDb2xvclN0b3AoMC41LCAiIzNhMjg2MCIpOwogICAgICBnMy5hZGRDb2xvclN0b3AoMSwgIiMxYTE4MzAiKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9IGczOwogICAgICBjdHguZmlsbFJlY3QoMCwgMCwgVklFV19XLCBWSUVXX0gpOwogICAgICAvLyBnbGFzcyBwYW5lcwogICAgICBjdHguc3Ryb2tlU3R5bGUgPSAicmdiYSgxODAsMjIwLDI1NSwwLjE1KSI7CiAgICAgIGN0eC5saW5lV2lkdGggPSAyOwogICAgICBmb3IgKHZhciBneCA9IC0oKGNhbWVyYVggKiAwLjIpICUgMTQwKTsgZ3ggPCBWSUVXX1c7IGd4ICs9IDE0MCkgewogICAgICAgIGN0eC5zdHJva2VSZWN0KGd4LCA0MCwgMTIwLCAyMjApOwogICAgICB9CiAgICB9CgogICAgLy8gZmxvb3IKICAgIGN0eC5maWxsU3R5bGUgPSB0aGVtZSA9PT0gImNvbnNlcnZhdG9yeSIgPyAiIzNhNGEzMCIgOiAiIzFhMTAxOCI7CiAgICBjdHguZmlsbFJlY3QoMCwgRkxPT1JfWSwgVklFV19XLCBWSUVXX0ggLSBGTE9PUl9ZKTsKICAgIGN0eC5maWxsU3R5bGUgPSB0aGVtZSA9PT0gImNvbnNlcnZhdG9yeSIgPyAiIzRhNjAzOCIgOiAiIzJhMTgyNCI7CiAgICBjdHguZmlsbFJlY3QoMCwgRkxPT1JfWSwgVklFV19XLCAxMik7CgogICAgLy8gZ3JlZW4gcnVuZSBnbG93IGFjY2VudHMKICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSg4MCwyNTUsMTIwLDAuMDYpIjsKICAgIGN0eC5maWxsUmVjdCgwLCAwLCBWSUVXX1csIDQwKTsKICB9CgogIGZ1bmN0aW9uIHd4KHgpIHsgcmV0dXJuIHggLSBjYW1lcmFYOyB9CgogIGZ1bmN0aW9uIGRyYXdMZXZlbCgpIHsKICAgIC8vIHN1bnMKICAgIGlmIChsZXZlbC5zdW5zKSB7CiAgICAgIGxldmVsLnN1bnMuZm9yRWFjaChmdW5jdGlvbiAocykgewogICAgICAgIGlmICghcy5hY3RpdmUpIHJldHVybjsKICAgICAgICB2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIEZMT09SX1kpOwogICAgICAgIGdyZC5hZGRDb2xvclN0b3AoMCwgInJnYmEoMjU1LDIzMCwxMDAsMC4zNSkiKTsKICAgICAgICBncmQuYWRkQ29sb3JTdG9wKDEsICJyZ2JhKDI1NSwyMDAsNTAsMC4wNSkiKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gZ3JkOwogICAgICAgIGN0eC5maWxsUmVjdCh3eChzLngpLCAwLCBzLncsIEZMT09SX1kpOwogICAgICB9KTsKICAgIH0KICAgIC8vIGRyYXBlcwogICAgaWYgKGxldmVsLmRyYXBlcykgewogICAgICBsZXZlbC5kcmFwZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSBkLmNsb3NlZCA\/ICIjNGEyMDYwIiA6ICIjNmEyMDgwIjsKICAgICAgICBjdHguZmlsbFJlY3Qod3goZC54KSwgZC55LCBkLmNsb3NlZCA\/IGQudyAqIDIuNSA6IGQudywgZC5oKTsKICAgICAgICBpZiAoIWQuY2xvc2VkKSB7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjU1LDI1NSwyNTUsMC41KSI7CiAgICAgICAgICBjdHguZm9udCA9ICIxMnB4IHNhbnMtc2VyaWYiOwogICAgICAgICAgY3R4LmZpbGxUZXh0KCJFIiwgd3goZC54KSArIDEyLCBkLnkgLSA2KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gdG9yY2hlcwogICAgaWYgKGxldmVsLnRvcmNoZXMpIHsKICAgICAgbGV2ZWwudG9yY2hlcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjNWE0MDMwIjsKICAgICAgICBjdHguZmlsbFJlY3Qod3godC54KSAtIDQsIHQueSwgOCwgNTApOwogICAgICAgIGlmICh0Lm9uKSB7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmFhMzMiOwogICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgICAgY3R4LmFyYyh3eCh0LngpLCB0LnksIDEwICsgTWF0aC5zaW4odGltZSAqIDEwKSAqIDIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjU1LDI1NSwyNTUsMC41KSI7CiAgICAgICAgICBjdHguZm9udCA9ICIxMnB4IHNhbnMtc2VyaWYiOwogICAgICAgICAgY3R4LmZpbGxUZXh0KCJFIiwgd3godC54KSAtIDQsIHQueSAtIDE2KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMjIyIjsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgIGN0eC5hcmMod3godC54KSwgdC55LCA2LCAwLCBNYXRoLlBJICogMik7CiAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvLyBwbGF0Zm9ybXMKICAgIGxldmVsLnBsYXRmb3Jtcy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIGlmIChwLmtpbmQgPT09ICJib29rcyIpIGN0eC5maWxsU3R5bGUgPSAiIzZhMzAyMCI7CiAgICAgIGVsc2UgaWYgKHAua2luZCA9PT0gInNvZmEiKSBjdHguZmlsbFN0eWxlID0gIiM2YTIwNDAiOwogICAgICBlbHNlIGlmIChwLmtpbmQgPT09ICJwbGFudGVyIikgY3R4LmZpbGxTdHlsZSA9ICIjMmE2MDMwIjsKICAgICAgZWxzZSBpZiAocC5raW5kID09PSAiYmVuY2giKSBjdHguZmlsbFN0eWxlID0gIiM1YTQwMzAiOwogICAgICBlbHNlIGN0eC5maWxsU3R5bGUgPSAiIzRhMzA1MCI7CiAgICAgIGN0eC5maWxsUmVjdCh3eChwLngpLCBwLnksIHAudywgcC5oKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwxMDAsMTgwLDAuMjUpIjsKICAgICAgY3R4LmZpbGxSZWN0KHd4KHAueCksIHAueSwgcC53LCAzKTsKICAgIH0pOwogICAgLy8gYnJlYWthYmxlcwogICAgaWYgKGxldmVsLmJyZWFrYWJsZXMpIHsKICAgICAgbGV2ZWwuYnJlYWthYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CiAgICAgICAgaWYgKGIuaHAgPD0gMCkgcmV0dXJuOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2MwYTA2MCI7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGN0eC5lbGxpcHNlKHd4KGIueCkgKyBiLncgLyAyLCBiLnkgKyBiLmggKiAwLjU1LCBiLncgKiAwLjQsIGIuaCAqIDAuNDUsIDAsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzgwNjAzMCI7CiAgICAgICAgY3R4LmZpbGxSZWN0KHd4KGIueCkgKyBiLncgKiAwLjM1LCBiLnksIGIudyAqIDAuMywgMTApOwogICAgICB9KTsKICAgIH0KICAgIC8vIGNoYW5kZWxpZXIKICAgIGlmIChsZXZlbC5jaGFuZGVsaWVyKSB7CiAgICAgIHZhciBjaCA9IGxldmVsLmNoYW5kZWxpZXI7CiAgICAgIHZhciBjZWxsID0gQVNTRVRTLmVuZW15Q2VsbCB8fCA5NjsKICAgICAgdmFyIGNyb3cgPSAoQVNTRVRTLmVuZW15Um93cyAmJiBBU1NFVFMuZW5lbXlSb3dzLmNoYW5kZWxpZXIpIHx8IDc7CiAgICAgIHZhciBjY29sID0gTWF0aC5mbG9vcih0aW1lICogNCkgJSA0OwogICAgICBpZiAoIWNoLmRyb3BwZWQgJiYgIWNoLmZhbGxpbmcpIHsKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAiIzY2NiI7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDI7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGN0eC5tb3ZlVG8od3goY2gueCArIDUwKSwgMCk7CiAgICAgICAgY3R4LmxpbmVUbyh3eChjaC54ICsgNTApLCBjaC55KTsKICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgIH0KICAgICAgaWYgKGltYWdlcy5lbmVtaWVzKSB7CiAgICAgICAgZHJhd1Nwcml0ZShpbWFnZXMuZW5lbWllcywgY2NvbCAqIGNlbGwsIGNyb3cgKiBjZWxsLCBjZWxsLCBjZWxsLCB3eChjaC54KSAtIDEwLCBjaC55IC0gMTAsIGNoLncgKyAyMCwgY2guaCArIDMwLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMmEyYTMyIjsKICAgICAgICBjdHguZmlsbFJlY3Qod3goY2gueCksIGNoLnksIGNoLncsIGNoLmggKiAwLjMpOwogICAgICB9CiAgICAgIGlmICghY2guZHJvcHBlZCAmJiAhY2guZmFsbGluZykgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgxMzYsMjU1LDIwMCwwLjcpIjsKICAgICAgICBjdHguZm9udCA9ICIxMnB4IHNhbnMtc2VyaWYiOwogICAgICAgIGN0eC5maWxsVGV4dCgiRSBkcm9wIiwgd3goY2gueCkgKyAyMCwgY2gueSAtIDgpOwogICAgICB9CiAgICB9CiAgICBpZiAobGV2ZWwuZmFsbGluZ1NoZWx2ZXMpIHsKICAgICAgbGV2ZWwuZmFsbGluZ1NoZWx2ZXMuZm9yRWFjaChmdW5jdGlvbiAocykgewogICAgICAgIHZhciBjZWxsMiA9IEFTU0VUUy5lbmVteUNlbGwgfHwgOTY7CiAgICAgICAgdmFyIGJyb3cgPSAoQVNTRVRTLmVuZW15Um93cyAmJiBBU1NFVFMuZW5lbXlSb3dzLmJvb2tzaGVsZikgfHwgODsKICAgICAgICB2YXIgYmNvbCA9IE1hdGguZmxvb3IodGltZSAqIDMgKyBzLnggKiAwLjAxKSAlIDQ7CiAgICAgICAgaWYgKGltYWdlcy5lbmVtaWVzKSB7CiAgICAgICAgICBkcmF3U3ByaXRlKGltYWdlcy5lbmVtaWVzLCBiY29sICogY2VsbDIsIGJyb3cgKiBjZWxsMiwgY2VsbDIsIGNlbGwyLCB3eChzLngpIC0gOCwgcy55IC0gMjAsIHMudyArIDE2LCBzLmggKyA1MCwgZmFsc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gIiM1YTNhMjgiOwogICAgICAgICAgY3R4LmZpbGxSZWN0KHd4KHMueCksIHMueSwgcy53LCBzLmgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAobGV2ZWwuc2Nyb2xscykgewogICAgICBsZXZlbC5zY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKHNjKSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjYzhlOGZmIjsKICAgICAgICBjdHguZmlsbFJlY3Qod3goc2MueCksIHNjLnksIHNjLncsIHNjLmgpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzg4YWFjYyI7CiAgICAgICAgY3R4LmZpbGxSZWN0KHd4KHNjLngpICsgNCwgc2MueSArIDYsIHNjLncgLSA4LCAzKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMTAwLDIwMCwyNTUsMC40KSI7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGN0eC5hcmMod3goc2MueCkgKyAxNCwgc2MueSArIDE0LCAyMCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGN0eC5maWxsKCk7CiAgICAgIH0pOwogICAgfQogICAgaWYgKGxldmVsLmhlYXRWZW50cykgewogICAgICBsZXZlbC5oZWF0VmVudHMuZm9yRWFjaChmdW5jdGlvbiAoaCkgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzMzMyI7CiAgICAgICAgY3R4LmZpbGxSZWN0KHd4KGgueCksIEZMT09SX1kgLSA4LCBoLncsIDgpOwogICAgICAgIGlmIChoLm9uKSB7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjU1LDEyMCw0MCwwLjM1KSI7CiAgICAgICAgICBjdHguZmlsbFJlY3Qod3goaC54KSwgRkxPT1JfWSAtIDkwLCBoLncsIDkwKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKGxldmVsLmN1Y3VtYmVycykgewogICAgICBsZXZlbC5jdWN1bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoYykgewogICAgICAgIGlmICghYy5hcm1lZCAmJiAhYy5wb3BwZWQpIHJldHVybjsKICAgICAgICB2YXIgY2VsbDMgPSBBU1NFVFMuZW5lbXlDZWxsIHx8IDk2OwogICAgICAgIHZhciB1cm93ID0gKEFTU0VUUy5lbmVteVJvd3MgJiYgQVNTRVRTLmVuZW15Um93cy5jdWN1bWJlcikgfHwgMzsKICAgICAgICBpZiAoIWMucG9wcGVkKSB7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gIiMxYTNhMjAiOwogICAgICAgICAgY3R4LmZpbGxSZWN0KHd4KGMueCkgLSAxNCwgYy55LCAyOCwgOCk7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMCwyNTUsMTM2LDAuMjUpIjsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmVsbGlwc2Uod3goYy54KSwgYy55ICsgMiwgMTYsIDYsIDAsIDAsIE1hdGguUEkgKiAyKTsgY3R4LmZpbGwoKTsKICAgICAgICB9IGVsc2UgaWYgKGltYWdlcy5lbmVtaWVzKSB7CiAgICAgICAgICB2YXIgdWNvbCA9IGMudCA+IDAuMyA\/IDIgOiAzOwogICAgICAgICAgZHJhd1Nwcml0ZShpbWFnZXMuZW5lbWllcywgdWNvbCAqIGNlbGwzLCB1cm93ICogY2VsbDMsIGNlbGwzLCBjZWxsMywgd3goYy54KSAtIDQwLCBjLnkgLSA3OCwgODAsIDg0LCBmYWxzZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzY2ZmY2NiI7CiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICBjdHguZWxsaXBzZSh3eChjLngpLCBjLnkgLSAyMCwgMTAsIDI4LCAwLCAwLCBNYXRoLlBJICogMik7CiAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3U3ByaXRlKGltZywgc3gsIHN5LCBzdywgc2gsIGR4LCBkeSwgZHcsIGRoLCBmbGlwKSB7CiAgICBjdHguc2F2ZSgpOwogICAgaWYgKGZsaXApIHsKICAgICAgY3R4LnRyYW5zbGF0ZShkeCArIGR3LCBkeSk7CiAgICAgIGN0eC5zY2FsZSgtMSwgMSk7CiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBzeCwgc3ksIHN3LCBzaCwgMCwgMCwgZHcsIGRoKTsKICAgIH0gZWxzZSB7CiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBzeCwgc3ksIHN3LCBzaCwgZHgsIGR5LCBkdywgZGgpOwogICAgfQogICAgY3R4LnJlc3RvcmUoKTsKICB9CgogIGZ1bmN0aW9uIGRyYXdQbGF5ZXIoKSB7CiAgICAvLyBtaXN0IHRyYWlsCiAgICBwbGF5ZXIubWlzdC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWF4KDAsIG0ubGlmZSAqIDIpICogMC4zNTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjNjYyMmFhIjsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBjdHguZWxsaXBzZSh3eChtLngpICsgcGxheWVyLncgKiAwLjUsIG0ueSArIHBsYXllci5oICogMC41NSwgMzAsIDIyLCAwLCAwLCBNYXRoLlBJICogMik7CiAgICAgIGN0eC5maWxsKCk7CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICB9KTsKCiAgICB2YXIgZmxpcCA9IHBsYXllci5mYWNpbmcgPCAwOwogICAgLy8gTm9ybWFsaXplIGRyYXduIGhlaWdodCBzbyBDYXR1bGEgc3RheXMgdGFsbGVyIHRoYW4gYnV0bGVyIGdob3N0cyBpbiBldmVyeSBzdGF0ZS4KICAgIC8vIElkbGUvd2FsayB+MTI4cHg7IHVwcmlnaHQtc3F1YXNoIGxvdyB3YWxrL3J1biBhcnQgKG5hcnJvd2VyIGR3KSBzbyB0aGV5IHJlYWQgdGFsbC4KICAgIHZhciBhbmltTm93ID0gcGxheWVyLmFuaW07CiAgICB2YXIgdGFyZ2V0SCA9IDE0MDsKICAgIHZhciBhc3BlY3QgPSAwLjg2OwogICAgaWYgKHBsYXllci5yYWdpbmcpIHsgdGFyZ2V0SCA9IDE2NTsgYXNwZWN0ID0gMC45NTsgfQogICAgZWxzZSBpZiAocGxheWVyLmRhc2hpbmcgfHwgYW5pbU5vdyA9PT0gInJ1biIpIHsgdGFyZ2V0SCA9IDEzMjsgYXNwZWN0ID0gMC43NDsgfQogICAgZWxzZSBpZiAoYW5pbU5vdyA9PT0gIndhbGsiKSB7IHRhcmdldEggPSAxNDI7IGFzcGVjdCA9IDAuNjg7IH0KICAgIGVsc2UgaWYgKCFwbGF5ZXIub25Hcm91bmQpIHsgdGFyZ2V0SCA9IHBsYXllci5nbGlkaW5nID8gMTQ0IDogMTQwOyBhc3BlY3QgPSAwLjgyOyB9CiAgICBlbHNlIGlmIChhbmltTm93ID09PSAiYXR0YWNrIiB8fCBhbmltTm93ID09PSAiaGl0IikgeyB0YXJnZXRIID0gMTQwOyBhc3BlY3QgPSAwLjgwOyB9CiAgICB2YXIgZGggPSB0YXJnZXRIOwogICAgdmFyIGR3ID0gTWF0aC5yb3VuZCh0YXJnZXRIICogYXNwZWN0KTsKICAgIHZhciBkeCA9IHd4KHBsYXllci54ICsgcGxheWVyLncgLyAyKSAtIGR3IC8gMjsKICAgIHZhciBkeSA9IHBsYXllci55ICsgcGxheWVyLmggLSBkaDsKCiAgICBpZiAocGxheWVyLmludnVsbiA+IDAgJiYgTWF0aC5mbG9vcih0aW1lICogMjApICUgMiA9PT0gMCkgY3R4Lmdsb2JhbEFscGhhID0gMC40NTsKCiAgICBpZiAocGxheWVyLnJhZ2luZyAmJiBpbWFnZXMuZXh0cmEpIHsKICAgICAgdmFyIGZ3ID0gQVNTRVRTLmV4dHJhVywgZmggPSBBU1NFVFMuZXh0cmFIOwogICAgICBkcmF3U3ByaXRlKGltYWdlcy5leHRyYSwgMCwgMCwgZncsIGZoLCBkeCAtIDEyLCBkeSAtIDE0LCBkdyArIDI0LCBkaCArIDIwLCBmbGlwKTsKICAgIH0gZWxzZSBpZiAocGxheWVyLmdsaWRpbmcgJiYgaW1hZ2VzLmV4dHJhKSB7CiAgICAgIHZhciBmdzIgPSBBU1NFVFMuZXh0cmFXLCBmaDIgPSBBU1NFVFMuZXh0cmFIOwogICAgICBkcmF3U3ByaXRlKGltYWdlcy5leHRyYSwgMCwgMCwgZncyLCBmaDIsIGR4IC0gMTAsIGR5IC0gMTIsIGR3ICsgMjAsIGRoICsgMTYsIGZsaXApOwogICAgfSBlbHNlIGlmIChpbWFnZXMuc2hlZXQpIHsKICAgICAgdmFyIGFuaW1OYW1lID0gcGxheWVyLmFuaW07CiAgICAgIGlmIChhbmltTmFtZSA9PT0gImdsaWRlIikgYW5pbU5hbWUgPSAianVtcCI7CiAgICAgIGlmIChhbmltTmFtZSA9PT0gInJhZ2UiKSBhbmltTmFtZSA9ICJhdHRhY2siOwogICAgICB2YXIgYW5pbSA9IEFTU0VUUy5hbmltc1thbmltTmFtZV0gfHwgQVNTRVRTLmFuaW1zLmlkbGU7CiAgICAgIHZhciBjb3VudCA9IE1hdGgubWF4KDEsIGFuaW0uY291bnQpOwogICAgICB2YXIgZnIgPSBwbGF5ZXIuZnJhbWUgJSBjb3VudDsKICAgICAgaWYgKHBsYXllci5nbGlkaW5nICYmIEFTU0VUUy5hbmltcy5qdW1wKSBmciA9IEFTU0VUUy5hbmltcy5qdW1wLmNvdW50IC0gMTsKICAgICAgdmFyIGNlbGwgPSBBU1NFVFMuY2VsbDsKICAgICAgZHJhd1Nwcml0ZShpbWFnZXMuc2hlZXQsIGZyICogY2VsbCwgYW5pbS5yb3cgKiBjZWxsLCBjZWxsLCBjZWxsLCBkeCwgZHksIGR3LCBkaCwgZmxpcCk7CiAgICB9IGVsc2UgewogICAgICBjdHguZmlsbFN0eWxlID0gIiNlMDgwMzAiOwogICAgICBjdHguZmlsbFJlY3QoZHgsIGR5LCBkdywgZGgpOwogICAgfQogICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKCiAgICAvLyBzY2FyZWQgaW5kaWNhdG9yCiAgICBpZiAocGxheWVyLnNjYXJlZFQgPiAwKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzg4ZmY4OCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgMTRweCBzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJGTElQUEVEIiwgZHgsIGR5IC0gOCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlbmVteVNwcml0ZUNvbChlKSB7CiAgICBpZiAoZS5kZWFkKSB7CiAgICAgIHZhciBwID0gMSAtIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChlLmRlYXRoVCB8fCAwKSAvIDAuNTUpKTsKICAgICAgcmV0dXJuIDUgKyBNYXRoLm1pbigyLCBNYXRoLmZsb29yKHAgKiAzKSk7CiAgICB9CiAgICBpZiAoZS5mbGFzaCA+IDApIHJldHVybiA0OwogICAgaWYgKGUudHlwZSA9PT0gInB1ZyIgJiYgZS5zdGF0ZSA9PT0gInNsYW0iKSByZXR1cm4gMjsKICAgIHJldHVybiAoZS5mcmFtZSB8fCAwKSAlIDQ7CiAgfQoKICBmdW5jdGlvbiBkcmF3RW5lbXlTcHJpdGUocm93S2V5LCBlLCBkdywgZGgpIHsKICAgIHZhciByb3cgPSAoQVNTRVRTLmVuZW15Um93cyAmJiBBU1NFVFMuZW5lbXlSb3dzW3Jvd0tleV0gIT0gbnVsbCkgPyBBU1NFVFMuZW5lbXlSb3dzW3Jvd0tleV0gOiAwOwogICAgdmFyIGNlbGwgPSBBU1NFVFMuZW5lbXlDZWxsIHx8IDk2OwogICAgdmFyIGNvbCA9IGVuZW15U3ByaXRlQ29sKGUpOwogICAgdmFyIGR3MiA9IGR3IHx8IE1hdGgubWF4KGUudyAqIDEuMzUsIDY0KTsKICAgIHZhciBkaDIgPSBkaCB8fCBNYXRoLm1heChlLmggKiAxLjM1LCA2NCk7CiAgICB2YXIgZHggPSB3eChlLnggKyBlLncgLyAyKSAtIGR3MiAvIDI7CiAgICB2YXIgZHkgPSBlLnkgKyBlLmggLSBkaDI7CiAgICB2YXIgZmxpcCA9IGUuZmFjaW5nIDwgMDsKICAgIGlmIChpbWFnZXMuZW5lbWllcykgewogICAgICBpZiAoZS5mbGFzaCA+IDApIGN0eC5nbG9iYWxBbHBoYSA9IDAuNjU7CiAgICAgIGlmIChlLmRlYWQpIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWF4KDAsIChlLmRlYXRoVCB8fCAwKSAvIDAuNTUpOwogICAgICBkcmF3U3ByaXRlKGltYWdlcy5lbmVtaWVzLCBjb2wgKiBjZWxsLCByb3cgKiBjZWxsLCBjZWxsLCBjZWxsLCBkeCwgZHksIGR3MiwgZGgyLCBmbGlwKTsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBkcmF3RW5lbXkoZSkgewogICAgaWYgKGUuZGVhZCAmJiAoZS5kZWF0aFQgfHwgMCkgPD0gMCkgcmV0dXJuOwogICAgdmFyIGR4ID0gd3goZS54KTsKICAgIGlmIChlLnR5cGUgPT09ICJjdWx0aXN0IikgewogICAgICBpZiAoIWRyYXdFbmVteVNwcml0ZSgiY3VsdGlzdCIsIGUsIDc4LCA4NikpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiMxYTFhMWUiOwogICAgICAgIGN0eC5maWxsUmVjdChkeCArIDEwLCBlLnkgKyAyMCwgMjgsIDQwKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICJtaXN0IikgewogICAgICBpZiAoIWRyYXdFbmVteVNwcml0ZSgibWlzdCIsIGUsIDU2LCA2NCkpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMTAwLDI1NSwyMjAsMC41NSkiOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmVsbGlwc2UoZHggKyBlLncgLyAyLCBlLnkgKyBlLmggLyAyLCAxNiwgMjIsIDAsIDAsIE1hdGguUEkgKiAyKTsgY3R4LmZpbGwoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICJnaG9zdGNhdCIpIHsKICAgICAgaWYgKCFkcmF3RW5lbXlTcHJpdGUoImdob3N0Y2F0IiwgZSwgNzAsIDcwKSkgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzEyMTIxNiI7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOyBjdHguZWxsaXBzZShkeCArIGUudyAvIDIsIGUueSArIGUuaCAvIDIsIDE4LCAxNCwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gInB1ZyIpIHsKICAgICAgaWYgKCFkcmF3RW5lbXlTcHJpdGUoInB1ZyIsIGUsIDkyLCA4NCkpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiM4YThhOTAiOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmVsbGlwc2UoZHggKyBlLncgLyAyLCBlLnkgKyBlLmggKiAwLjU1LCBlLncgKiAwLjQsIGUuaCAqIDAuNCwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gInZhY3V1bSIpIHsKICAgICAgaWYgKCFkcmF3RW5lbXlTcHJpdGUoInZhY3V1bSIsIGUsIDEzMCwgMTIwKSkgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzFhMWEyOCI7CiAgICAgICAgY3R4LmZpbGxSZWN0KGR4LCBlLnkgKyAyMCwgZS53LCBlLmggLSAyMCk7CiAgICAgIH0KICAgICAgaWYgKCFlLmRlYWQpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiM2NmZmYWEiOwogICAgICAgIGN0eC5mb250ID0gImJvbGQgMTFweCBzYW5zLXNlcmlmIjsKICAgICAgICBjdHguZmlsbFRleHQoIlZBQ1VVTSBLTklHSFQiLCBkeCwgZS55IC0gOCk7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gInJnYmEoMTAwLDI1NSwyMjAsMC4zNSkiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICBjdHgubW92ZVRvKGR4ICsgZS53IC8gMiwgZS55ICsgNDApOwogICAgICAgICAgY3R4LmxpbmVUbyhkeCArIGUudyAvIDIgLSBlLmZhY2luZyAqICg2MCArIGkgKiAzMCksIGUueSArIDIwICsgaSAqIDE1KTsKICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAibGFzZXIiKSB7CiAgICAgIGlmICghZHJhd0VuZW15U3ByaXRlKCJsYXNlciIsIGUsIDcyLCA3MikpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNmZjEwMjAiOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyh3eChlLmRvdFgpLCBlLmRvdFksIDEwLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gc3ByaXRlIGFscmVhZHkgZHJhd24gYXQgZS54L2UueTsgYWxzbyBrZWVwIGEgYnJpZ2h0IGNvcmUgYXQgdGhlIGRvdAogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgY3R4LnNoYWRvd0NvbG9yID0gIiMwMGZmY2MiOwogICAgICAgIGN0eC5zaGFkb3dCbHVyID0gMTY7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmYyMDQwIjsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgY3R4LmFyYyh3eChlLmRvdFgpLCBlLmRvdFksIDYgKyBNYXRoLnNpbih0aW1lICogOCkgKiAxLjUsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgIH0KICAgICAgaWYgKCFlLmRlYWQpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiM4OGZmY2MiOwogICAgICAgIGN0eC5mb250ID0gImJvbGQgMTJweCBzYW5zLXNlcmlmIjsKICAgICAgICBjdHguZmlsbFRleHQoIkxBU0VSIFBPSU5URVIiLCB3eChlLmRvdFgpIC0gNDIsIGUuZG90WSAtIDI4KTsKICAgICAgfQogICAgfQogICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgIGlmICghZS5kZWFkICYmIChlLmhwIDwgZS5tYXhIcCB8fCBlLmlzQm9zcykpIHsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMzAwIjsKICAgICAgY3R4LmZpbGxSZWN0KGR4LCBlLnkgLSAxMCwgZS53LCA1KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9IGUuaXNCb3NzID8gIiNmZjQ0YWEiIDogIiM0NGZmODgiOwogICAgICBjdHguZmlsbFJlY3QoZHgsIGUueSAtIDEwLCBlLncgKiAoZS5ocCAvIGUubWF4SHApLCA1KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRyYXdQcm9qZWN0aWxlcygpIHsKICAgIHByb2plY3RpbGVzLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgaWYgKHAudHlwZSA9PT0gImJvbHQiKSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmY5OWNjIjsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgY3R4LmVsbGlwc2Uod3gocC54KSwgcC55LCAxMiwgNSwgMCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmIjsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgY3R4LmVsbGlwc2Uod3gocC54KSAtIDQsIHAueSwgNSwgMywgMCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGN0eC5maWxsKCk7CiAgICAgIH0gZWxzZSBpZiAocC50eXBlID09PSAieWFybiIpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiMzMzExNDQiOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICBjdHguYXJjKHd4KHAueCkgKyAxNCwgcC55ICsgMTQsIDE0LCAwLCBNYXRoLlBJICogMik7CiAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAiI2FhNjZmZiI7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDI7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGN0eC5hcmMod3gocC54KSArIDE0LCBwLnkgKyAxNCwgMTAsIDAsIE1hdGguUEkgKiAxLjUpOwogICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAvLyBwdWxsIHJhZGl1cyBoaW50CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gInJnYmEoMTUwLDUwLDIwMCwwLjIpIjsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgY3R4LmFyYyh3eChwLngpICsgMTQsIHAueSArIDE0LCBwLnB1bGxSLCAwLCBNYXRoLlBJICogMik7CiAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gImN1cnNlIikgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjAsNjAsMC41NSkiOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICBjdHguZWxsaXBzZSh3eChwLngpICsgcC53IC8gMiwgcC55LCAyOCwgOCwgMCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiNmZjIyNDQiOwogICAgICAgIGN0eC5saW5lV2lkdGggPSAyOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICBjdHguYXJjKHd4KHAueCkgKyBwLncgLyAyLCBwLnksIDE2ICsgTWF0aC5zaW4odGltZSAqIDYpICogMywgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgfSBlbHNlIGlmIChwLnR5cGUgPT09ICJzaG9jayIpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMTgwLDE4MCwyMDAsMC40KSI7CiAgICAgICAgY3R4LmZpbGxSZWN0KHd4KHAueCksIHAueSwgcC53LCBwLmgpOwogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gInNvbmljIikgewogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDEwMCwyNTUsMjAwLDAuNykiOwogICAgICAgIGN0eC5saW5lV2lkdGggPSAzOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICBjdHguYXJjKHd4KHAueCksIHAueSArIDIwLCAxNiwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBkcmF3UGFydGljbGVzKCkgewogICAgcGFydGljbGVzLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gTWF0aC5tYXgoMCwgcC5saWZlIC8gcC5tYXgpOwogICAgICBjdHguZmlsbFN0eWxlID0gcC5jb2xvcjsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBjdHguYXJjKHd4KHAueCksIHAueSwgcC5zaXplLCAwLCBNYXRoLlBJICogMik7CiAgICAgIGN0eC5maWxsKCk7CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRyYXdIVUQoKSB7CiAgICAvLyBIUAogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDAsMCwwLDAuNDUpIjsKICAgIGN0eC5maWxsUmVjdCgxMiwgMTIsIDIwMCwgNTgpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjZmY2Njk5IjsKICAgIGN0eC5mb250ID0gImJvbGQgMTRweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICBjdHguZmlsbFRleHQoIkhQIiwgMjAsIDMwKTsKICAgIGN0eC5maWxsU3R5bGUgPSAiIzQwMDAyMCI7CiAgICBjdHguZmlsbFJlY3QoNTAsIDE4LCAxNTAsIDEyKTsKICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmNDQ3NyI7CiAgICBjdHguZmlsbFJlY3QoNTAsIDE4LCAxNTAgKiAocGxheWVyLmhwIC8gcGxheWVyLm1heEhwKSwgMTIpOwoKICAgIC8vIFJhZ2UKICAgIGN0eC5maWxsU3R5bGUgPSAiI2NjODhmZiI7CiAgICBjdHguZmlsbFRleHQoIlJBR0UiLCAyMCwgNTIpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjMjAwMDQwIjsKICAgIGN0eC5maWxsUmVjdCg2MCwgNDAsIDE0MCwgMTIpOwogICAgY3R4LmZpbGxTdHlsZSA9IHBsYXllci5yYWdpbmcgPyAiI2ZmNDRmZiIgOiAiI2FhNDRmZiI7CiAgICBjdHguZmlsbFJlY3QoNjAsIDQwLCAxNDAgKiAocGxheWVyLnJhZ2luZyA\/IChwbGF5ZXIucmFnZVQgLyBSQUdFX1RJTUUpIDogKHBsYXllci5yYWdlIC8gUkFHRV9ORUVEKSksIDEyKTsKCiAgICAvLyBzY29yZSAvIGxldmVsCiAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMCwwLDAsMC40NSkiOwogICAgY3R4LmZpbGxSZWN0KFZJRVdfVyAtIDIyMCwgMTIsIDIwOCwgNTQpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZkMGFhIjsKICAgIGN0eC5mb250ID0gImJvbGQgMTRweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICBjdHguZmlsbFRleHQoIlNjb3JlICIgKyBzY29yZSwgVklFV19XIC0gMjA4LCAzMik7CiAgICBjdHguZmlsbFRleHQoIkxldmVsICIgKyAobGV2ZWxJbmRleCArIDEpICsgIiAvIDMgICIgKyBsZXZlbC5uYW1lLCBWSUVXX1cgLSAyMDgsIDUyKTsKCiAgICAvLyBjb29sZG93bnMgKGNvbXBhY3QgbGFiZWxlZCBrZXlzKQogICAgdmFyIGNkcyA9IFsKICAgICAgeyBrOiAiQm9sdCAoSikiLCB2OiBwbGF5ZXIuYm9sdENkLCBtOiAwLjE2IH0sCiAgICAgIHsgazogIllhcm4gKEspIiwgdjogcGxheWVyLnlhcm5DZCwgbTogMy4yIH0sCiAgICAgIHsgazogIkN1cnNlIChMKSIsIHY6IHBsYXllci5jdXJzZUNkLCBtOiA1LjUgfSwKICAgICAgeyBrOiAiRGFzaCAoU2hpZnQpIiwgdjogcGxheWVyLmRhc2hDZCwgbTogREFTSF9DRCB9LAogICAgICB7IGs6ICJSYWdlIChVKSIsIHY6IHBsYXllci5yYWdpbmcgPyAwIDogKHBsYXllci5yYWdlIDwgUkFHRV9ORUVEID8gUkFHRV9ORUVEIDogMCksIG06IFJBR0VfTkVFRCB9CiAgICBdOwogICAgdmFyIGJ3ID0gMTA4OwogICAgdmFyIGJoID0gMTg7CiAgICB2YXIgdG91Y2hQYWRzT24gPSBwYWRzICYmICFwYWRzLmhpZGRlbiAmJiBwYWRzLmNsYXNzTGlzdC5jb250YWlucygidG91Y2gtb24iKTsKICAgIGlmICghdG91Y2hQYWRzT24pIHsKICAgICAgY2RzLmZvckVhY2goZnVuY3Rpb24gKGMsIGkpIHsKICAgICAgICB2YXIgeCA9IDEwICsgaSAqIChidyArIDYpOwogICAgICAgIHZhciB5ID0gVklFV19IIC0gMjY7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDAsMCwwLDAuNDUpIjsKICAgICAgICBjdHguZmlsbFJlY3QoeCwgeSwgYncsIGJoKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gYy52ID4gMCA\/ICIjNzc3IiA6ICIjODhmZmFhIjsKICAgICAgICBjdHguZm9udCA9ICIxMHB4IHNhbnMtc2VyaWYiOwogICAgICAgIGN0eC5maWxsVGV4dChjLmssIHggKyA0LCB5ICsgMTMpOwogICAgICAgIGlmIChjLnYgPiAwICYmIGMubSA+IDAgJiYgYy5rLmluZGV4T2YoIlJhZ2UiKSA8IDApIHsKICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsODAsODAsMC40NSkiOwogICAgICAgICAgY3R4LmZpbGxSZWN0KHgsIHksIGJ3ICogTWF0aC5taW4oMSwgYy52IC8gYy5tKSwgYmgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgaWYgKG1lc3NhZ2VUID4gMCkgewogICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMCwwLDAsMC41NSkiOwogICAgICBjdHguZmlsbFJlY3QoVklFV19XIC8gMiAtIDE4MCwgODAsIDM2MCwgMzYpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmUwZmYiOwogICAgICBjdHguZm9udCA9ICJib2xkIDE4cHggR2VvcmdpYSxzZXJpZiI7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgICAgY3R4LmZpbGxUZXh0KG1lc3NhZ2UsIFZJRVdfVyAvIDIsIDEwNCk7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICB9CgogICAgaWYgKG11dGVkKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZiI7CiAgICAgIGN0eC5mb250ID0gIjEycHggc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dCgiTXV0ZWQgKE0pIiwgVklFV19XIC8gMiAtIDMwLCAyNCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3KCkgewogICAgaWYgKHN0YXRlID09PSAidGl0bGUiKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzEyMDgxNCI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBWSUVXX1csIFZJRVdfSCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghbGV2ZWwgfHwgIXBsYXllcikgcmV0dXJuOwogICAgZHJhd0JhY2tncm91bmQoKTsKICAgIGRyYXdMZXZlbCgpOwogICAgZW50aXRpZXMuZm9yRWFjaChkcmF3RW5lbXkpOwogICAgZHJhd1Byb2plY3RpbGVzKCk7CiAgICBkcmF3UGxheWVyKCk7CiAgICBkcmF3UGFydGljbGVzKCk7CiAgICBkcmF3SFVEKCk7CiAgfQoKICAvKiAtLS0tLS0tLS0tIExvb3AgLS0tLS0tLS0tLSAqLwogIHZhciBsYXN0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgZnVuY3Rpb24gZnJhbWUobm93KSB7CiAgICB2YXIgZHQgPSBNYXRoLm1pbigwLjAzMywgKG5vdyAtIGxhc3QpIC8gMTAwMCk7CiAgICBsYXN0ID0gbm93OwogICAgdXBkYXRlKGR0KTsKICAgIGRyYXcoKTsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgfQoKICBmdW5jdGlvbiBzdGFydEdhbWUoKSB7CiAgICBlbnN1cmVBdWRpbygpOwogICAgc2NvcmUgPSAwOwogICAgc3RhcnRMZXZlbCgwKTsKICAgIGlmIChpc1RvdWNoRGV2aWNlKCkgfHwgdG91Y2hVaUFybWVkKSBlbnRlck1vYmlsZVBsYXkoKTsKICB9CgogIGZ1bmN0aW9uIGJpbmRVSSgpIHsKICAgIHZhciBzdGFydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydC1idG4iKTsKICAgIHZhciBhZ2FpbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZ2Fpbi1idG4iKTsKICAgIGlmIChzdGFydEJ0bikgewogICAgICBzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICB0b3VjaFVpQXJtZWQgPSB0b3VjaFVpQXJtZWQgfHwgaXNUb3VjaERldmljZSgpOwogICAgICAgIGVuc3VyZUF1ZGlvKCk7CiAgICAgICAgc3RhcnRHYW1lKCk7CiAgICAgIH0pOwogICAgfQogICAgaWYgKGFnYWluQnRuKSB7CiAgICAgIGFnYWluQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgIGVuc3VyZUF1ZGlvKCk7CiAgICAgICAgaWYgKGVuZENhcmQpIGVuZENhcmQuaGlkZGVuID0gdHJ1ZTsKICAgICAgICBzdGFydEdhbWUoKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVUaXRsZUNvc21ldGljcygpIHsKICAgIHZhciBjb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29zbWV0aWNzIik7CiAgICBpZiAoIWNvcykgcmV0dXJuOwogICAgdmFyIHBhcnRzID0gW107CiAgICBpZiAodW5sb2NrZWQuY29sbGFyKSBwYXJ0cy5wdXNoKCJVbmxvY2tlZDogVGlueSBEcmFjdWxhIGNvbGxhciIpOwogICAgaWYgKHVubG9ja2VkLnRvcGhhdCkgcGFydHMucHVzaCgiVW5sb2NrZWQ6IFRvcCBoYXQiKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSBwYXJ0cy5wdXNoKCJDbGVhciBsYXRlciBsZXZlbHMgdG8gdW5sb2NrIGNvc21ldGljcy4iKTsKICAgIGNvcy50ZXh0Q29udGVudCA9IHBhcnRzLmpvaW4oIiAgfCAgIikgKyAiICBIaWdoIHNjb3JlOiAiICsgaGlnaFNjb3JlOwogIH0KCiAgUHJvbWlzZS5hbGwoWwogICAgbG9hZEltYWdlKEFTU0VUUy5jb3ZlcikuY2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSksCiAgICBsb2FkSW1hZ2UoQVNTRVRTLnNoZWV0KSwKICAgIGxvYWRJbWFnZShBU1NFVFMuZXh0cmEpLAogICAgbG9hZEltYWdlKEFTU0VUUy5lbmVtaWVzKS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KQogIF0pLnRoZW4oZnVuY3Rpb24gKGltZ3MpIHsKICAgIGltYWdlcy5jb3ZlciA9IGltZ3NbMF07CiAgICBpbWFnZXMuc2hlZXQgPSBpbWdzWzFdOwogICAgaW1hZ2VzLmV4dHJhID0gaW1nc1syXTsKICAgIGltYWdlcy5lbmVtaWVzID0gaW1nc1szXTsKICAgIGlmIChjb3ZlckltZ0VsICYmIGltYWdlcy5jb3ZlcikgY292ZXJJbWdFbC5zcmMgPSBBU1NFVFMuY292ZXI7CiAgICByZWFkeSA9IHRydWU7CiAgICBsb2FkU2F2ZSgpOwogICAgdXBkYXRlVGl0bGVDb3NtZXRpY3MoKTsKICAgIGJpbmRVSSgpOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsKICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICB2YXIgZXJyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZC1lcnIiKTsKICAgIGlmIChlcnJFbCkgZXJyRWwudGV4dENvbnRlbnQgPSAiRmFpbGVkIHRvIGxvYWQgc3ByaXRlcy4gUmVmcmVzaCBhbmQgdHJ5IGFnYWluLiI7CiAgfSk7Cn0pKCk7Cg==\");\n  document.body.appendChild(el);\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Campy gothic action. Clear the parlor, library, and conservatory. Move (A\/D or arrows). Jump (Space bar) and hold to glide. Dash (Shift). Bolt (J). Yarn (K). Curse (L). Rage (U). Interact (E). Mute (M). Play Done Play again Turn your phone sideways Bolt Rage Attack Jump X<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-62","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/62","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=62"}],"version-history":[{"count":5,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/62\/revisions"}],"predecessor-version":[{"id":131,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/62\/revisions\/131"}],"wp:attachment":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}