관악구 신림동
신림푸르지오 시세
서울특별시 관악구 신림동 · 12개월 거래 58건 · 중위 평당가 3,743만원
중위 평당가
3,743만원
12개월 거래 58건
최근 거래
10억
26-09-07
건축년도
2005년
21년차
전세가율 (84.8㎡)
61.5%
안전
전세 6억 5,500만
12개월 평당가 추이
거래가 없던 달은 건너뛰고 이어 그립니다. 단지 하나의 월별 표본은 원래 얇으니 방향만 보세요.
평형별 시세
전세가율은 최근 6개월 신규 전세 보증금 ÷ 매매가입니다. 80% 이상이면 집이 경매로 넘어갔을 때 보증금을 다 못 받을 수 있습니다. 갱신계약은 뺐습니다.
| 전용면적 | 거래 | 중위가 | 최저 | 최고 | 최근 | 전세가율 |
|---|---|---|---|---|---|---|
| 60.0㎡ 18.2평 | 1건 | 8억 9,000만 | 8억 9,000만 | 8억 9,000만 | 8억 9,000만 26-04-16 | — |
| 84.8㎡ 25.7평 | 27건 | 10억 800만 | 9억 | 11억 7,000만 | 10억 26-09-07 | 61.5% 전세 6억 5,500만 |
| 84.9㎡ 25.7평 | 7건 | 10억 3,000만 | 9억 5,000만 | 11억 | 10억 9,000만 26-08-08 | 61.9% 전세 6억 5,500만 |
| 114.8㎡ 34.7평 | 12건 | 10억 6,000만 | 9억 6,000만 | 12억 5,000만 | 11억 4,000만 26-07-23 | — |
| 138.6㎡ 41.9평 | 4건 | 11억 8,250만 | 10억 9,000만 | 13억 | 11억 3,500만 26-08-22 | — |
| 138.7㎡ 42.0평 | 7건 | 12억 3,000만 | 10억 8,500만 | 12억 8,500만 | 12억 7,500만 26-08-11 | — |
최근 거래
26-09-07신림푸르지오84.8㎡2층10억
26-08-31신림푸르지오84.8㎡7층11억 7,000만
26-08-29신림푸르지오84.8㎡18층11억 7,000만
신림동의 다른 단지
관악산휴먼시아2단지거래 124건 · 최근 26-09-07
2,879만
›
신림현대거래 102건 · 최근 26-09-05
3,479만
›
LIG대학마을(건영아파트3차)거래 57건 · 최근 26-09-02
3,001만
›
삼성산주공(주공3단지)거래 57건 · 최근 26-08-21
2,384만
›
힐스테이트뉴포레거래 45건 · 최근 26-08-29
7,383만
›
이 숫자는 무엇인가요
국토교통부가 공개하는 아파트 매매 실거래가입니다. 호가가 아니라 실제로 계약되고 신고된 금액입니다. 평당가는 전용면적 기준이라 분양 광고의 공급면적 기준보다 높게 나옵니다.
시세·변동률 통계에서는 직거래와 토지임대부를 뺐습니다. 직거래는 가족·특수관계인 간 거래가 섞여 시세보다 크게 낮거나 높습니다. 위 개별 거래 목록에는 그대로 보입니다.
기준월 2026-08 · 12개월 거래 58건 · 국토교통부 실거래가 · 해제된 거래 제외 · 같은 단지·같은 전용면적끼리만 비교합니다.
dmFyIEQ9SlNPTi5wYXJzZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHBoLWRhdGE3MzknKS50ZXh0Q29udGVudCk7CnZhciBUSEVNRV9JQ089ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0nZGFyayc/JzxzdmcgY2xhc3M9InRwaC1pIGljby1zIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHBhdGggZD0iTTIwIDE0LjVBOC41IDguNSAwIDAgMSA5LjUgNGE4LjUgOC41IDAgMSAwIDEwLjUgMTAuNXoiLz48L3N2Zz4nOnQ9PT0nbGlnaHQnPyc8c3ZnIGNsYXNzPSJ0cGgtaSBpY28tcyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgYXJpYS1oaWRkZW49InRydWUiPjxwYXRoIGQ9Ik0xMiA3LjVhNC41IDQuNSAwIDEgMCAwIDkgNC41IDQuNSAwIDAgMCAwLTl6TTEyIDJ2Mk0xMiAyMHYyTTQuMiA0LjJsMS40IDEuNE0xOC40IDE4LjRsMS40IDEuNE0yIDEyaDJNMjAgMTJoMk00LjIgMTkuOGwxLjQtMS40TTE4LjQgNS42bDEuNC0xLjQiLz48L3N2Zz4nOic8c3ZnIGNsYXNzPSJ0cGgtaSBpY28tcyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgYXJpYS1oaWRkZW49InRydWUiPjxwYXRoIGQ9Ik0xMiAzYTkgOSAwIDEgMCAwIDE4IDkgOSAwIDAgMCAwLTE4ek0xMiAzdjE4YTkgOSAwIDAgMCAwLTE4eiIvPjwvc3ZnPic7fTsKCnZhciAkPWZ1bmN0aW9uKGkpe3JldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHBoLScraSk7fTsKdmFyIHY9ZnVuY3Rpb24oaSl7dmFyIGU9JChpKTtyZXR1cm4gZT8oK2UudmFsdWV8fDApOjA7fTsKdmFyIHM9ZnVuY3Rpb24oaSl7dmFyIGU9JChpKTtyZXR1cm4gZT9lLnZhbHVlOicnO307CnZhciBmPWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKG4pLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpKyfsm5AnO307CnZhciBmZD1mdW5jdGlvbihuLGQpe3JldHVybiBuLnRvTG9jYWxlU3RyaW5nKCdrby1LUicse21heGltdW1GcmFjdGlvbkRpZ2l0czpkfHwxfSk7fTsKdmFyIGN1dDEwPWZ1bmN0aW9uKHgpe3JldHVybiBNYXRoLmZsb29yKE1hdGgucm91bmQoeCkvMTApKjEwO307CnZhciBzZXQ9ZnVuY3Rpb24oaSx0KXt2YXIgZT0kKGkpO2lmKCFlKXJldHVybjtpZihpPT09J21haW4nKXtjb3VudFVwKGUsdCk7fWVsc2V7ZS50ZXh0Q29udGVudD10O319OwoKLyog7JWI7KCE7ZWcIOyggOyepeyGjCDsoJHqt7wg4oCUIOyLnO2BrOumvyDrqqjrk5wv7LCo64uoIO2ZmOqyveyXkOyEnOuPhCDso73sp4Ag7JWK6rKMICovCnZhciBzdG9yZT17CiAgZ2V0OmZ1bmN0aW9uKGspe3RyeXtyZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oayk7fWNhdGNoKGUpe3JldHVybiBudWxsO319LAogIHNldDpmdW5jdGlvbihrLHZhbCl7dHJ5e2xvY2FsU3RvcmFnZS5zZXRJdGVtKGssdmFsKTt9Y2F0Y2goZSl7fX0sCiAgZGVsOmZ1bmN0aW9uKGspe3RyeXtsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrKTt9Y2F0Y2goZSl7fX0KfTsKCnZhciB0b2FzdD1mdW5jdGlvbihtc2cpewogIHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50cGgtdG9hc3QnKTsKICBpZighdCl7dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTt0LmNsYXNzTmFtZT0ndHBoLXRvYXN0Jztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO30KICB0LnRleHRDb250ZW50PW1zZzt0LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsKICBjbGVhclRpbWVvdXQodC5faCk7dC5faD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7fSwxOTAwKTsKfTsKCi8qIO2FjOuniCDthqDquIA6IOyLnOyKpO2FnCDshKTsoJUg4oaSIOudvOydtO2KuCDihpIg64uk7YGsIOyInO2ZmCAqLwpmdW5jdGlvbiBpbml0VGhlbWUocm9vdCl7CiAgdmFyIEs9J3RwaC10aGVtZScsIGN1cj1zdG9yZS5nZXQoSyk7CiAgaWYoY3VyKSByb290LnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsY3VyKTsKICB2YXIgYj0kKCd0aGVtZScpOwogIGlmKCFiKSByZXR1cm47CiAgdmFyIGxhYmVsPWZ1bmN0aW9uKCl7CiAgICB2YXIgdD1yb290LmdldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScpOwogICAgYi5pbm5lckhUTUw9VEhFTUVfSUNPKHQpKycgPHNwYW4+JysodD09PSdkYXJrJz8n64uk7YGsJzp0PT09J2xpZ2h0Jz8n65287J207Yq4Jzon7J6Q64+ZJykrJzwvc3Bhbj4nOwogIH07CiAgbGFiZWwoKTsKICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgdmFyIHQ9cm9vdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnKTsKICAgIHZhciBueD0hdD8nbGlnaHQnOnQ9PT0nbGlnaHQnPydkYXJrJzonJzsKICAgIGlmKG54KXtyb290LnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsbngpO3N0b3JlLnNldChLLG54KTt9CiAgICBlbHNle3Jvb3QucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRoZW1lJyk7c3RvcmUuZGVsKEspO30KICAgIGxhYmVsKCk7CiAgfSk7Cn0KCi8qIOyeheugpeqwkiDihpQgVVJMIO2MjOudvOuvuO2EsCDihpQgbG9jYWxTdG9yYWdlICovCmZ1bmN0aW9uIGluaXRTdGF0ZShzbHVnLCBpZHMsIG9uY2hhbmdlKXsKICB2YXIgS0VZPSd0cGgtaW4tJytzbHVnLCBxPW5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKSwgdXNlZD1mYWxzZTsKICBpZHMuZm9yRWFjaChmdW5jdGlvbihpKXsKICAgIHZhciBlPSQoaSk7IGlmKCFlKSByZXR1cm47CiAgICBpZihxLmhhcyhpKSl7IGUudmFsdWU9cS5nZXQoaSk7IHVzZWQ9dHJ1ZTsgfQogIH0pOwogIGlmKCF1c2VkKXsKICAgIHZhciByYXc9c3RvcmUuZ2V0KEtFWSk7CiAgICBpZihyYXcpeyB0cnl7IHZhciBvPUpTT04ucGFyc2UocmF3KTsKICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24oaSl7IHZhciBlPSQoaSk7IGlmKGUmJm9baV0hPT11bmRlZmluZWQmJm9baV0hPT0nJykgZS52YWx1ZT1vW2ldOyB9KTsKICAgIH1jYXRjaChlKXt9IH0KICB9CiAgdmFyIHNhdmU9ZnVuY3Rpb24oKXsKICAgIHZhciBvPXt9OyBpZHMuZm9yRWFjaChmdW5jdGlvbihpKXsgdmFyIGU9JChpKTsgaWYoZSkgb1tpXT1lLnZhbHVlOyB9KTsKICAgIHN0b3JlLnNldChLRVksIEpTT04uc3RyaW5naWZ5KG8pKTsKICB9OwogIHZhciBzaGFyZT0kKCdzaGFyZScpOwogIGlmKHNoYXJlKSBzaGFyZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHZhciBwPW5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGkpeyB2YXIgZT0kKGkpOyBpZihlKSBwLnNldChpLGUudmFsdWUpOyB9KTsKICAgIHZhciB1cmw9bG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lKyc/JytwLnRvU3RyaW5nKCk7CiAgICB2YXIgZG9uZT1mdW5jdGlvbigpe3RvYXN0KCfrp4Htgazrpbwg67O17IKs7ZaI7Iq164uI64ukJyk7fTsKICAgIGlmKG5hdmlnYXRvci5jbGlwYm9hcmQmJm5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KXsKICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodXJsKS50aGVuKGRvbmUsZnVuY3Rpb24oKXtwcm9tcHQoJ+yVhOuemCDso7zshozrpbwg67O17IKs7ZWY7IS47JqUJyx1cmwpO30pOwogICAgfSBlbHNlIHByb21wdCgn7JWE656YIOyjvOyGjOulvCDrs7XsgqztlZjshLjsmpQnLHVybCk7CiAgfSk7CiAgdmFyIGNvcHk9JCgnY29weScpOwogIGlmKGNvcHkpIGNvcHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICB2YXIgbGluZXM9W2RvY3VtZW50LnRpdGxlLnNwbGl0KCd8JylbMF0udHJpbSgpXTsKICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGkpewogICAgICB2YXIgZT0kKGkpOyBpZighZSkgcmV0dXJuOwogICAgICB2YXIgbGFiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj10cGgtJytpKyddJyk7CiAgICAgIHZhciB2YWw9ZS50YWdOYW1lPT09J1NFTEVDVCc/ZS5vcHRpb25zW2Uuc2VsZWN0ZWRJbmRleF0udGV4dDooK2UudmFsdWV8fDApLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpOwogICAgICBpZihsYWIpIGxpbmVzLnB1c2goJ8K3ICcrbGFiLnRleHRDb250ZW50LnRyaW0oKSsnOiAnK3ZhbCk7CiAgICB9KTsKICAgIGxpbmVzLnB1c2goJycpOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRwaC10b3RhbCcpLmZvckVhY2goZnVuY3Rpb24odCl7CiAgICAgIHZhciBsPXQucXVlcnlTZWxlY3RvcignLmwnKSwgdmFsPXQucXVlcnlTZWxlY3RvcignLnYnKTsKICAgICAgaWYobCYmdmFsKSBsaW5lcy5wdXNoKGwudGV4dENvbnRlbnQudHJpbSgpKyc6ICcrdmFsLnRleHRDb250ZW50LnRyaW0oKSk7CiAgICB9KTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50cGgtcGFnZSB0YWJsZScpLmZvckVhY2goZnVuY3Rpb24odGIpewogICAgICB0Yi5xdWVyeVNlbGVjdG9yQWxsKCd0cicpLmZvckVhY2goZnVuY3Rpb24odHIpewogICAgICAgIHZhciB0ZD10ci5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpOwogICAgICAgIGlmKHRkLmxlbmd0aD09PTIpIGxpbmVzLnB1c2goJ8K3ICcrdGRbMF0udGV4dENvbnRlbnQudHJpbSgpKyc6ICcrdGRbMV0udGV4dENvbnRlbnQudHJpbSgpKTsKICAgICAgfSk7CiAgICB9KTsKICAgIGxpbmVzLnB1c2goJycsIGxvY2F0aW9uLm9yaWdpbitsb2NhdGlvbi5wYXRobmFtZSk7CiAgICB2YXIgdHh0PWxpbmVzLmpvaW4oJ1xuJyk7CiAgICB2YXIgZG9uZT1mdW5jdGlvbigpe3RvYXN0KCfqsrDqs7zrpbwg67O17IKs7ZaI7Iq164uI64ukJyk7fTsKICAgIGlmKG5hdmlnYXRvci5jbGlwYm9hcmQmJm5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0eHQpLnRoZW4oZG9uZSxkb25lKTsKICAgIGVsc2UgeyB2YXIgdGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsgdGEudmFsdWU9dHh0OyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsKICAgICAgICAgICB0YS5zZWxlY3QoKTsgdHJ5e2RvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7fWNhdGNoKGUpe30gdGEucmVtb3ZlKCk7IGRvbmUoKTsgfQogIH0pOwogIHZhciByZXNldD0kKCdyZXNldCcpOwogIGlmKHJlc2V0KSByZXNldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHN0b3JlLmRlbChLRVkpOyBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLnBhdGhuYW1lOwogIH0pOwogIHJldHVybiBzYXZlOwp9CgovKiDquIjslaEg7J6F66ClIOuwkSDruaDrpbgg7KGw7KCVIOy5qSAqLwpmdW5jdGlvbiBpbml0Q2hpcHMob25jaGFuZ2UpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50cGgtY2hpcCcpLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICBjLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICB2YXIgZT0kKGMuZGF0YXNldC50KTsgaWYoIWUpIHJldHVybjsKICAgICAgdmFyIGQ9Yy5kYXRhc2V0LmQ7CiAgICAgIGUudmFsdWUgPSBkPT09JzAnID8gMCA6IE1hdGgubWF4KDAsKCtlLnZhbHVlfHwwKSsoK2QpKTsKICAgICAgb25jaGFuZ2UoKTsKICAgIH0pOwogIH0pOwp9CgovKiDsnoXroKXqsJLsnYQg7IKs656M7J20IOydveuKlCDrrLjsnqXsnLzroZwgKDMsMDAwLDAwMCDihpIgMzAw66eM7JuQKSAqLwpmdW5jdGlvbiBrb3JNb25leShuKXsKICBuPU1hdGgucm91bmQobik7IGlmKCFuKSByZXR1cm4gJzDsm5AnOwogIHZhciBlb2s9TWF0aC5mbG9vcihuLzEwMDAwMDAwMCksIG1hbj1NYXRoLmZsb29yKChuJTEwMDAwMDAwMCkvMTAwMDApLCB3b249biUxMDAwMCwgcD1bXTsKICBpZihlb2spIHAucHVzaChlb2srJ+yWtScpOwogIGlmKG1hbikgcC5wdXNoKG1hbi50b0xvY2FsZVN0cmluZygna28tS1InKSsn66eMJyk7CiAgaWYod29uKSBwLnB1c2god29uLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpKTsKICByZXR1cm4gcC5qb2luKCcgJykrJ+ybkCc7Cn0KZnVuY3Rpb24gaW5pdFJlYWQobWFwKXsKICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24oaWQpewogICAgdmFyIGU9JChpZCksIG91dD0kKG1hcFtpZF0pOyBpZighZXx8IW91dCkgcmV0dXJuOwogICAgdmFyIHVwZD1mdW5jdGlvbigpeyBvdXQudGV4dENvbnRlbnQgPSAoK2UudmFsdWU+MCkgPyBrb3JNb25leSgrZS52YWx1ZSkgOiAnJzsgfTsKICAgIGUuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHVwZCk7IHVwZCgpOwogIH0pOwp9CgoKLyog7Iir7J6QIOy5tOyatO2KuOyXhSDigJQg6rKw6rO86rCAIOuwlOuAlCDrlYwg67aA65Oc65+96rKMICovCmZ1bmN0aW9uIGNvdW50VXAoZWwsIHRleHQpewogIGlmKCFlbCkgcmV0dXJuOwogIHZhciBwcmV2PWVsLl9yYXd8fCcnLCBjdXI9dGV4dDsKICBlbC5fcmF3PWN1cjsKICB2YXIgcG49cGFyc2VGbG9hdChTdHJpbmcocHJldikucmVwbGFjZSgvW14wLTkuLV0vZywnJykpOwogIHZhciBjbj1wYXJzZUZsb2F0KFN0cmluZyhjdXIpLnJlcGxhY2UoL1teMC05Li1dL2csJycpKTsKICB2YXIgcmVkdWNlPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSknKS5tYXRjaGVzOwogIGlmKHJlZHVjZXx8IWlzRmluaXRlKHBuKXx8IWlzRmluaXRlKGNuKXx8cG49PT1jbnx8TWF0aC5hYnMoY24tcG4pPDEpe2VsLnRleHRDb250ZW50PWN1cjtyZXR1cm47fQogIHZhciBwcmU9Y3VyLnNsaWNlKDAsY3VyLnNlYXJjaCgvWzAtOS1dLykpOwogIHZhciBwb3N0PWN1ci5zbGljZShjdXIuc2VhcmNoKC9bMC05XVteMC05XSokLykrMSkucmVwbGFjZSgvXlswLTldLywnJyk7CiAgdmFyIHN1ZmZpeD1jdXIucmVwbGFjZSgvXlteMC05LV0qLywnJykucmVwbGFjZSgvXlswLTksLlwtXSsvLCcnKTsKICB2YXIgdDA9bnVsbCwgZHVyPTM4MDsKICBjYW5jZWxBbmltYXRpb25GcmFtZShlbC5fYWZ8fDApOwogIGZ1bmN0aW9uIHN0ZXAodCl7CiAgICBpZighdDApIHQwPXQ7CiAgICB2YXIgaz1NYXRoLm1pbigxLCh0LXQwKS9kdXIpLCBlPTEtTWF0aC5wb3coMS1rLDMpOwogICAgdmFyIHZhbD1wbisoY24tcG4pKmU7CiAgICBlbC50ZXh0Q29udGVudD1wcmUrTWF0aC5yb3VuZCh2YWwpLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpK3N1ZmZpeDsKICAgIGlmKGs8MSkgZWwuX2FmPXJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTsgZWxzZSBlbC50ZXh0Q29udGVudD1jdXI7CiAgfQogIGVsLl9hZj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7Cn0KCi8qIOuqqOuwlOydvCDqs6DsoJUg6rKw6rO867CUICsg66eoIOychOuhnCAqLwpmdW5jdGlvbiBpbml0U3RpY2t5KHJvb3QsIGxhYmVsKXsKICBpZighcm9vdCkgcmV0dXJuOwogIHZhciBtYWluPSQoJ21haW4nKTsgaWYoIW1haW4pIHJldHVybjsKICB2YXIgYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGJhci5jbGFzc05hbWU9J3RwaC1zdGlja3knOwogIGJhci5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImwiPicrbGFiZWwrJzwvZGl2PjxkaXYgY2xhc3M9InYiIGlkPSJ0cGgtc3RpY2t5diI+4oCmPC9kaXY+JzsKICByb290LmFwcGVuZENoaWxkKGJhcik7CiAgdmFyIHRvcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICB0b3AudHlwZT0nYnV0dG9uJzsgdG9wLmNsYXNzTmFtZT0ndHBoLXRvcCc7IHRvcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCfrp6gg7JyE66GcJyk7CiAgdG9wLmlubmVySFRNTD0nPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMiAxOVY1Ii8+PHBhdGggZD0iTTUgMTJsNy03IDcgNyIvPjwvc3ZnPic7CiAgdG9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3dpbmRvdy5zY3JvbGxUbyh7dG9wOjAsYmVoYXZpb3I6J3Ntb290aCd9KTt9KTsKICByb290LmFwcGVuZENoaWxkKHRvcCk7CiAgdmFyIHN2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cGgtc3RpY2t5dicpOwogIHZhciBzeW5jPWZ1bmN0aW9uKCl7CiAgICBpZihzdiYmc3YudGV4dENvbnRlbnQhPT1tYWluLnRleHRDb250ZW50KSBzdi50ZXh0Q29udGVudD1tYWluLnRleHRDb250ZW50OwogICAgdmFyIHI9bWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGJhci5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHIuYm90dG9tPDU2KTsKICAgIHRvcC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHdpbmRvdy5zY3JvbGxZPjUwMCk7CiAgfTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxzeW5jLHtwYXNzaXZlOnRydWV9KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxzeW5jKTsKICBpZih3aW5kb3cuTXV0YXRpb25PYnNlcnZlcikgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc3luYykub2JzZXJ2ZShtYWluLHtjaGlsZExpc3Q6dHJ1ZSxjaGFyYWN0ZXJEYXRhOnRydWUsc3VidHJlZTp0cnVlfSk7CiAgc3luYygpOwp9CgovKiDilIDilIAg7LCo7Yq4IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICDsg4nsnYAgQ1NTIOuzgOyImCAtLXMxLy0tczIvLS1zMyAo6rKA7Kad65CcIOy5tO2FjOqzoOumrCDtjJTroIjtirgpLgogICDqs4Tsl7TsnbQgMuqwnCDsnbTsg4HsnbTrqbQg67KU66GA66W8IO2VreyDgSDrtpnsnbTqs6AsIOqwkuydgCDtkZzsl5Drj4Qg6re464yA66GcIOyeiOuLpC4gKi8KdmFyIFNWR05TPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CmZ1bmN0aW9uIGVsKHQsYSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR05TLHQpO2Zvcih2YXIgayBpbiBhKWUuc2V0QXR0cmlidXRlKGssYVtrXSk7cmV0dXJuIGU7fQoKZnVuY3Rpb24gdGlwKGJveCl7CiAgdmFyIHQ9Ym94LnF1ZXJ5U2VsZWN0b3IoJy50cGgtdGlwJyk7CiAgaWYoIXQpe3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7dC5jbGFzc05hbWU9J3RwaC10aXAnO2JveC5hcHBlbmRDaGlsZCh0KTt9CiAgcmV0dXJuIHQ7Cn0KZnVuY3Rpb24gc2hvd1RpcChib3gseCx5LGh0bWwpewogIHZhciB0PXRpcChib3gpOyB0LmlubmVySFRNTD1odG1sOyB0LnN0eWxlLm9wYWNpdHk9JzEnOwogIHZhciB3PXQub2Zmc2V0V2lkdGgsIGJ3PWJveC5jbGllbnRXaWR0aDsKICB0LnN0eWxlLmxlZnQ9TWF0aC5tYXgoNCxNYXRoLm1pbihidy13LTQseC13LzIpKSsncHgnOwogIHQuc3R5bGUudG9wPU1hdGgubWF4KDIseS10Lm9mZnNldEhlaWdodC0xMCkrJ3B4JzsKfQpmdW5jdGlvbiBoaWRlVGlwKGJveCl7dmFyIHQ9Ym94LnF1ZXJ5U2VsZWN0b3IoJy50cGgtdGlwJyk7aWYodCl0LnN0eWxlLm9wYWNpdHk9JzAnO30KCi8qIOyEuOuhnCDriITsoIEg66eJ64yAIOKAlCBjYXRzOlvrnbzrsqhdLCBzZXJpZXM6W3tuYW1lLGNscyxkYXRhOltdfV0gKi8KZnVuY3Rpb24gc3RhY2tDaGFydChib3hJZCwgY2F0cywgc2VyaWVzLCBmbXQpewogIHZhciBib3g9JChib3hJZCk7IGlmKCFib3gpIHJldHVybjsKICBib3gucXVlcnlTZWxlY3RvckFsbCgnc3ZnLC50cGgtbGVnZW5kJykuZm9yRWFjaChmdW5jdGlvbihuKXtuLnJlbW92ZSgpO30pOwogIHZhciBXPTY2MCxIPTIzNixQTD04LFBSPTgsUFQ9MTQsUEI9MjY7CiAgdmFyIG49Y2F0cy5sZW5ndGg7IGlmKCFuKSByZXR1cm47CiAgdmFyIHRvdGFscz1jYXRzLm1hcChmdW5jdGlvbihfLGkpe3JldHVybiBzZXJpZXMucmVkdWNlKGZ1bmN0aW9uKGEscyl7cmV0dXJuIGErKHMuZGF0YVtpXXx8MCk7fSwwKTt9KTsKICB2YXIgbWF4PU1hdGgubWF4LmFwcGx5KG51bGwsdG90YWxzKXx8MTsKICB2YXIgaXc9Vy1QTC1QUiwgaWg9SC1QVC1QQjsKICB2YXIgYnc9TWF0aC5tYXgoNixNYXRoLm1pbig0Nixpdy9uKjAuNjgpKSwgc3RlcD1pdy9uOwogIHZhciBzdmc9ZWwoJ3N2Zycse3ZpZXdCb3g6JzAgMCAnK1crJyAnK0gscm9sZTonaW1nJ30pOwogIGZvcih2YXIgZz0wO2c8PTM7ZysrKXsKICAgIHZhciBneT1QVCtpaCpnLzM7CiAgICBzdmcuYXBwZW5kQ2hpbGQoZWwoJ2xpbmUnLHt4MTpQTCx5MTpneSx4MjpXLVBSLHkyOmd5LCdjbGFzcyc6J2dsJ30pKTsKICB9CiAgY2F0cy5mb3JFYWNoKGZ1bmN0aW9uKGMsaSl7CiAgICB2YXIgY3g9UEwrc3RlcCppK3N0ZXAvMiwgeT1QVCtpaCwgYWNjPTA7CiAgICBzZXJpZXMuZm9yRWFjaChmdW5jdGlvbihzLHNpKXsKICAgICAgdmFyIHZhbD1zLmRhdGFbaV18fDA7IGlmKHZhbDw9MCkgcmV0dXJuOwogICAgICB2YXIgaD12YWwvbWF4KmloOyB5LT1oOyBhY2MrPXZhbDsKICAgICAgdmFyIGlzVG9wID0gc2k9PT1zZXJpZXMubGVuZ3RoLTEgfHwgIXNlcmllcy5zbGljZShzaSsxKS5zb21lKGZ1bmN0aW9uKHope3JldHVybiAoei5kYXRhW2ldfHwwKT4wO30pOwogICAgICB2YXIgcj1lbCgncmVjdCcse3g6Y3gtYncvMix5Onksd2lkdGg6YncsaGVpZ2h0Ok1hdGgubWF4KDEsaCksJ2NsYXNzJzpzLmNscywKICAgICAgICAgICAgICAgICAgICAgICByeDppc1RvcD80OjAscnk6aXNUb3A/NDowfSk7CiAgICAgIHN2Zy5hcHBlbmRDaGlsZChyKTsKICAgIH0pOwogICAgdmFyIGhpdD1lbCgncmVjdCcse3g6Y3gtc3RlcC8yKzEseTpQVCx3aWR0aDpzdGVwLTIsaGVpZ2h0OmloLCdjbGFzcyc6J2hpdCd9KTsKICAgIGhpdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLGZ1bmN0aW9uKGV2KXsKICAgICAgdmFyIGJyPWJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIHJvd3M9c2VyaWVzLm1hcChmdW5jdGlvbihzKXsKICAgICAgICByZXR1cm4gJzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItcmFkaXVzOjJweDsnCiAgICAgICAgICAgICArICdiYWNrZ3JvdW5kOnZhcigtLScrcy5jbHMrJyk7bWFyZ2luLXJpZ2h0OjZweCI+PC9zcGFuPicrcy5uYW1lKycgJytmbXQocy5kYXRhW2ldfHwwKTsKICAgICAgfSkuam9pbignPGJyPicpOwogICAgICBzaG93VGlwKGJveCxldi5jbGllbnRYLWJyLmxlZnQsZXYuY2xpZW50WS1ici50b3AsCiAgICAgICAgICAgICAgJzxiPicrYysnPC9iPjxicj4nK3Jvd3MrJzxicj7tlanqs4QgJytmbXQoYWNjKSk7CiAgICB9KTsKICAgIGhpdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyxmdW5jdGlvbigpe2hpZGVUaXAoYm94KTt9KTsKICAgIHN2Zy5hcHBlbmRDaGlsZChoaXQpOwogICAgaWYobjw9MTR8fGklTWF0aC5jZWlsKG4vMTIpPT09MCkKICAgICAgc3ZnLmFwcGVuZENoaWxkKE9iamVjdC5hc3NpZ24oZWwoJ3RleHQnLHt4OmN4LHk6SC04LCdjbGFzcyc6J2xiJywndGV4dC1hbmNob3InOidtaWRkbGUnfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0ZXh0Q29udGVudDpjfSkpOwogIH0pOwogIGJveC5hcHBlbmRDaGlsZChzdmcpOwogIGJveC5hcHBlbmRDaGlsZChsZWdlbmQoc2VyaWVzKSk7Cn0KCi8qIOqwgOuhnCDriITsoIEg66eJ64yAKOq1rOyEsSkg4oCUIHNlZ3M6W3tuYW1lLGNscyx2YWx1ZX1dIMK3IOyngeygkSDrnbzrsqggKi8KZnVuY3Rpb24gaFN0YWNrKGJveElkLCBzZWdzLCBmbXQpewogIHZhciBib3g9JChib3hJZCk7IGlmKCFib3gpIHJldHVybjsKICBib3gucXVlcnlTZWxlY3RvckFsbCgnc3ZnLC50cGgtbGVnZW5kJykuZm9yRWFjaChmdW5jdGlvbihuKXtuLnJlbW92ZSgpO30pOwogIHZhciB0b3RhbD1zZWdzLnJlZHVjZShmdW5jdGlvbihhLHMpe3JldHVybiBhK01hdGgubWF4KDAscy52YWx1ZSk7fSwwKXx8MTsKICB2YXIgVz02NjAsSD02NCxQTD04LFBSPTgsQkg9MzQsVFk9MTI7CiAgdmFyIHN2Zz1lbCgnc3ZnJyx7dmlld0JveDonMCAwICcrVysnICcrSCxyb2xlOidpbWcnfSk7CiAgdmFyIHg9UEwsIGl3PVctUEwtUFI7CiAgc2Vncy5mb3JFYWNoKGZ1bmN0aW9uKHMsaSl7CiAgICB2YXIgdz1NYXRoLm1heCgwLHMudmFsdWUpL3RvdGFsKml3OyBpZih3PD0wKSByZXR1cm47CiAgICB2YXIgZmlyc3Q9aT09PTAsIGxhc3Q9aT09PXNlZ3MubGVuZ3RoLTE7CiAgICBzdmcuYXBwZW5kQ2hpbGQoZWwoJ3JlY3QnLHt4OngseTpUWSx3aWR0aDp3LGhlaWdodDpCSCwnY2xhc3MnOnMuY2xzLAogICAgICByeDooZmlyc3R8fGxhc3QpPzQ6MCxyeTooZmlyc3R8fGxhc3QpPzQ6MH0pKTsKICAgIHZhciBwY3Q9cy52YWx1ZS90b3RhbCoxMDA7CiAgICBpZihwY3Q+PTkpCiAgICAgIHN2Zy5hcHBlbmRDaGlsZChPYmplY3QuYXNzaWduKGVsKCd0ZXh0Jyx7eDp4K3cvMix5OlRZK0JILzIrNCwnY2xhc3MnOid2bCcsCiAgICAgICAgJ3RleHQtYW5jaG9yJzonbWlkZGxlJyxmaWxsOicjZmZmJ30pLHt0ZXh0Q29udGVudDpwY3QudG9GaXhlZCgwKSsnJSd9KSk7CiAgICB2YXIgaGl0PWVsKCdyZWN0Jyx7eDp4LHk6VFksd2lkdGg6dyxoZWlnaHQ6QkgsJ2NsYXNzJzonaGl0J30pOwogICAgKGZ1bmN0aW9uKHNlZyxweCxwdyl7CiAgICAgIGhpdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLGZ1bmN0aW9uKGV2KXsKICAgICAgICB2YXIgYnI9Ym94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHNob3dUaXAoYm94LGV2LmNsaWVudFgtYnIubGVmdCxldi5jbGllbnRZLWJyLnRvcCwKICAgICAgICAgICc8Yj4nK3NlZy5uYW1lKyc8L2I+PGJyPicrZm10KHNlZy52YWx1ZSkrJyDCtyAnKyhzZWcudmFsdWUvdG90YWwqMTAwKS50b0ZpeGVkKDEpKyclJyk7CiAgICAgIH0pOwogICAgICBoaXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsZnVuY3Rpb24oKXtoaWRlVGlwKGJveCk7fSk7CiAgICB9KShzLHgsdyk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoaGl0KTsKICAgIHgrPXc7CiAgfSk7CiAgYm94LmFwcGVuZENoaWxkKHN2Zyk7CiAgYm94LmFwcGVuZENoaWxkKGxlZ2VuZChzZWdzLm1hcChmdW5jdGlvbihzKXtyZXR1cm4ge25hbWU6cy5uYW1lKycgJytmbXQocy52YWx1ZSksY2xzOnMuY2xzfTt9KSkpOwp9CgovKiDshKDtmJUg7LaU7J20IOywqO2KuCDigJQgc2VyaWVzOlt7bmFtZSxjbHMsZGF0YTpbXX1dLCBjYXRzOlvrnbzrsqhdICovCmZ1bmN0aW9uIGxpbmVDaGFydChib3hJZCwgY2F0cywgc2VyaWVzLCBmbXQpewogIHZhciBib3g9JChib3hJZCk7IGlmKCFib3gpIHJldHVybjsKICBib3gucXVlcnlTZWxlY3RvckFsbCgnc3ZnLC50cGgtbGVnZW5kJykuZm9yRWFjaChmdW5jdGlvbihuKXtuLnJlbW92ZSgpO30pOwogIHZhciBuPWNhdHMubGVuZ3RoOyBpZihuPDIpIHJldHVybjsKICB2YXIgVz02NjAsSD0yNDAsUEw9NTQsUFI9MTIsUFQ9MTQsUEI9MjY7CiAgdmFyIGFsbD1bXTsgc2VyaWVzLmZvckVhY2goZnVuY3Rpb24ocyl7YWxsPWFsbC5jb25jYXQocy5kYXRhLmZpbHRlcihmdW5jdGlvbih2KXtyZXR1cm4gdiE9bnVsbDt9KSk7fSk7CiAgaWYoIWFsbC5sZW5ndGgpIHJldHVybjsKICB2YXIgbXg9TWF0aC5tYXguYXBwbHkobnVsbCxhbGwpLCBtbj1NYXRoLm1pbi5hcHBseShudWxsLGFsbCk7CiAgdmFyIHBhZD0obXgtbW4pKjAuMTV8fG14KjAuMDJ8fDE7IG14Kz1wYWQ7IG1uPU1hdGgubWF4KDAsbW4tcGFkKTsKICB2YXIgaXc9Vy1QTC1QUiwgaWg9SC1QVC1QQjsKICB2YXIgWD1mdW5jdGlvbihpKXtyZXR1cm4gUEwraXcqKG49PT0xPzAuNTppLyhuLTEpKTt9OwogIHZhciBZPWZ1bmN0aW9uKHYpe3JldHVybiBQVCtpaCooMS0odi1tbikvKChteC1tbil8fDEpKTt9OwogIHZhciBzdmc9ZWwoJ3N2Zycse3ZpZXdCb3g6JzAgMCAnK1crJyAnK0gscm9sZTonaW1nJ30pOwogIGZvcih2YXIgZz0wO2c8PTQ7ZysrKXsKICAgIHZhciBndj1tbisobXgtbW4pKmcvNCwgZ3k9WShndik7CiAgICBzdmcuYXBwZW5kQ2hpbGQoZWwoJ2xpbmUnLHt4MTpQTCx5MTpneSx4MjpXLVBSLHkyOmd5LCdjbGFzcyc6J2dsJ30pKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChPYmplY3QuYXNzaWduKGVsKCd0ZXh0Jyx7eDpQTC04LHk6Z3krNCwnY2xhc3MnOidsYicsJ3RleHQtYW5jaG9yJzonZW5kJ30pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RleHRDb250ZW50Ok1hdGgucm91bmQoZ3YpLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpfSkpOwogIH0KICBzZXJpZXMuZm9yRWFjaChmdW5jdGlvbihzKXsKICAgIHZhciBkPScnLCBzdGFydGVkPWZhbHNlOwogICAgcy5kYXRhLmZvckVhY2goZnVuY3Rpb24odixpKXsKICAgICAgaWYodj09bnVsbCkgcmV0dXJuOwogICAgICBkKz0oc3RhcnRlZD8nTCc6J00nKStYKGkpLnRvRml4ZWQoMSkrJyAnK1kodikudG9GaXhlZCgxKSsnICc7IHN0YXJ0ZWQ9dHJ1ZTsKICAgIH0pOwogICAgaWYoZCkgc3ZnLmFwcGVuZENoaWxkKGVsKCdwYXRoJyx7ZDpkLGZpbGw6J25vbmUnLCdzdHJva2UnOid2YXIoLS0nK3MuY2xzKycpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJva2Utd2lkdGgnOjIuMiwnc3Ryb2tlLWxpbmVqb2luJzoncm91bmQnLCdzdHJva2UtbGluZWNhcCc6J3JvdW5kJ30pKTsKICAgIHZhciBsYXN0PXMuZGF0YS5sZW5ndGgtMTsKICAgIGlmKHMuZGF0YVtsYXN0XSE9bnVsbCkKICAgICAgc3ZnLmFwcGVuZENoaWxkKGVsKCdjaXJjbGUnLHtjeDpYKGxhc3QpLGN5Olkocy5kYXRhW2xhc3RdKSxyOjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDondmFyKC0tJytzLmNscysnKScsc3Ryb2tlOid2YXIoLS1zdXJmYWNlKScsJ3N0cm9rZS13aWR0aCc6Mn0pKTsKICB9KTsKICBjYXRzLmZvckVhY2goZnVuY3Rpb24oYyxpKXsKICAgIGlmKG4+MTAgJiYgaSVNYXRoLmNlaWwobi83KSE9PTAgJiYgaSE9PW4tMSkgcmV0dXJuOwogICAgc3ZnLmFwcGVuZENoaWxkKE9iamVjdC5hc3NpZ24oZWwoJ3RleHQnLHt4OlgoaSkseTpILTgsJ2NsYXNzJzonbGInLCd0ZXh0LWFuY2hvcic6J21pZGRsZSd9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0ZXh0Q29udGVudDpjfSkpOwogIH0pOwogIGZvcih2YXIgaT0wO2k8bjtpKyspewogICAgKGZ1bmN0aW9uKGlkeCl7CiAgICAgIHZhciBoaXQ9ZWwoJ3JlY3QnLHt4OlgoaWR4KS1pdy8obi0xKS8yLHk6UFQsd2lkdGg6aXcvKG4tMSl8fDIwLGhlaWdodDppaCwnY2xhc3MnOidoaXQnfSk7CiAgICAgIGhpdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLGZ1bmN0aW9uKGV2KXsKICAgICAgICB2YXIgYnI9Ym94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciByb3dzPXNlcmllcy5tYXAoZnVuY3Rpb24ocyl7CiAgICAgICAgICByZXR1cm4gJzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItcmFkaXVzOjJweDsnCiAgICAgICAgICAgICAgICsgJ2JhY2tncm91bmQ6dmFyKC0tJytzLmNscysnKTttYXJnaW4tcmlnaHQ6NnB4Ij48L3NwYW4+JytzLm5hbWUrJyAnCiAgICAgICAgICAgICAgICsgKHMuZGF0YVtpZHhdPT1udWxsPyctJzpmbXQocy5kYXRhW2lkeF0pKTsKICAgICAgICB9KS5qb2luKCc8YnI+Jyk7CiAgICAgICAgc2hvd1RpcChib3gsZXYuY2xpZW50WC1ici5sZWZ0LGV2LmNsaWVudFktYnIudG9wLCc8Yj4nK2NhdHNbaWR4XSsnPC9iPjxicj4nK3Jvd3MpOwogICAgICB9KTsKICAgICAgaGl0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLGZ1bmN0aW9uKCl7aGlkZVRpcChib3gpO30pOwogICAgICBzdmcuYXBwZW5kQ2hpbGQoaGl0KTsKICAgIH0pKGkpOwogIH0KICBib3guYXBwZW5kQ2hpbGQoc3ZnKTsKICBib3guYXBwZW5kQ2hpbGQobGVnZW5kKHNlcmllcykpOwp9CgpmdW5jdGlvbiBsZWdlbmQoaXRlbXMpewogIHZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBkLmNsYXNzTmFtZT0ndHBoLWxlZ2VuZCc7CiAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihzKXsKICAgIHZhciBzcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzcC5pbm5lckhUTUw9JzxpIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLScrcy5jbHMrJykiPjwvaT4nK3MubmFtZTsKICAgIGQuYXBwZW5kQ2hpbGQoc3ApOwogIH0pOwogIHJldHVybiBkOwp9CjsKZnVuY3Rpb24gbWFuKG4peyByZXR1cm4gTWF0aC5yb3VuZChuKS50b0xvY2FsZVN0cmluZygna28tS1InKSsn66eMJzsgfQppZihELmggJiYgRC5oLmxlbmd0aCkKICBsaW5lQ2hhcnQoJ2N4Y2hhcnQnLCBELmhpc3QubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLnNsaWNlKDIpO30pLAogICAgW3tuYW1lOiftj4nri7nqsIAnLGNsczonczEnLGRhdGE6RC5oLm1hcChmdW5jdGlvbih2KXtyZXR1cm4gdnx8bnVsbDt9KX1dLCBtYW4pOwppbml0VGhlbWUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRwaC1wYWdlJykpOwo=