serve-sim 0.0.0 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/serve-sim-bin CHANGED
Binary file
@@ -1,7 +1,12 @@
1
1
  // @bun
2
- import{readdirSync as J,readFileSync as P}from"fs";import{spawn as j}from"child_process";import{tmpdir as k}from"os";import{join as H}from"path";var F=H(k(),"serve-sim");function Z(){let U;try{U=J(F).filter((G)=>G.startsWith("server-")&&G.endsWith(".json"))}catch{return[]}let B=[];for(let G of U)try{let z=JSON.parse(P(H(F,G),"utf-8"));try{process.kill(z.pid,0),B.push(z)}catch{}}catch{}return B}var $=null;function D(){if(!$)$=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYjAsUCxiNCxqNSxLMCx3NCxwNCx2NCxYNCxDMCxVMCxqNCxLNCxZNCxaNCxSNCx3MD17fSxTMD1bXSxSNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLEEwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gWDAoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gUTQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gWTAoWCxZLFope3ZhciBKLHEsSyxRPXt9O2ZvcihLIGluIFkpSz09ImtleSI/Sj1ZW0tdOks9PSJyZWYiP3E9WVtLXTpRW0tdPVlbS107aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoUS5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YjAuY2FsbChhcmd1bWVudHMsMik6WiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihLIGluIFguZGVmYXVsdFByb3BzKVFbS109PT12b2lkIDAmJihRW0tdPVguZGVmYXVsdFByb3BzW0tdKTtyZXR1cm4gRTAoWCxRLEoscSxudWxsKX1mdW5jdGlvbiBFMChYLFksWixKLHEpe3ZhciBLPXt0eXBlOlgscHJvcHM6WSxrZXk6WixyZWY6SixfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmUC52bm9kZSE9bnVsbCYmUC52bm9kZShLKSxLfWZ1bmN0aW9uIHgoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gZyhYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX1mdW5jdGlvbiBMMChYLFkpe2lmKFk9PW51bGwpcmV0dXJuIFguX18/TDAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgWjtZPFguX19rLmxlbmd0aDtZKyspaWYoKFo9WC5fX2tbWV0pIT1udWxsJiZaLl9fZSE9bnVsbClyZXR1cm4gWi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/TDAoWCk6bnVsbH1mdW5jdGlvbiB5NShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBZPVguX192LFo9WS5fX2UsSj1bXSxxPVtdLEs9WDAoe30sWSk7Sy5fX3Y9WS5fX3YrMSxQLnZub2RlJiZQLnZub2RlKEspLCQ0KFguX19QLEssWSxYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWS5fX3U/W1pdOm51bGwsSixaPT1udWxsP0wwKFkpOlosISEoMzImWS5fX3UpLHEpLEsuX192PVkuX192LEsuX18uX19rW0suX19pXT1LLGQ0KEosSyxxKSxZLl9fZT1ZLl9fPW51bGwsSy5fX2UhPVomJnk0KEspfX1mdW5jdGlvbiB5NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFkpe2lmKFkhPW51bGwmJlkuX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVkuX19lfSkseTQoWCl9ZnVuY3Rpb24gSjQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmSzAucHVzaChYKSYmIVQwLl9fcisrfHx3NCE9UC5kZWJvdW5jZVJlbmRlcmluZykmJigodzQ9UC5kZWJvdW5jZVJlbmRlcmluZyl8fHA0KShUMCl9ZnVuY3Rpb24gVDAoKXt0cnl7Zm9yKHZhciBYLFk9MTtLMC5sZW5ndGg7KUswLmxlbmd0aD5ZJiZLMC5zb3J0KHY0KSxYPUswLnNoaWZ0KCksWT1LMC5sZW5ndGgseTUoWCl9ZmluYWxseXtLMC5sZW5ndGg9VDAuX19yPTB9fWZ1bmN0aW9uIGc0KFgsWSxaLEoscSxLLFEseixHLEwsRCl7dmFyIFcsTyxVLGssXyxDLE0sRj1KJiZKLl9fa3x8UzAsRT1ZLmxlbmd0aDtmb3IoRz1nNShaLFksRixHLEUpLFc9MDtXPEU7VysrKShVPVouX19rW1ddKSE9bnVsbCYmKE89VS5fX2khPS0xJiZGW1UuX19pXXx8dzAsVS5fX2k9VyxDPSQ0KFgsVSxPLHEsSyxRLHosRyxMLEQpLGs9VS5fX2UsVS5yZWYmJk8ucmVmIT1VLnJlZiYmKE8ucmVmJiZXNChPLnJlZixudWxsLFUpLEQucHVzaChVLnJlZixVLl9fY3x8ayxVKSksXz09bnVsbCYmayE9bnVsbCYmKF89ayksKE09ISEoNCZVLl9fdSkpfHxPLl9faz09PVUuX19rPyhHPXg0KFUsRyxYLE0pLE0mJk8uX19lJiYoTy5fX2U9bnVsbCkpOnR5cGVvZiBVLnR5cGU9PSJmdW5jdGlvbiImJkMhPT12b2lkIDA/Rz1DOmsmJihHPWsubmV4dFNpYmxpbmcpLFUuX191Jj0tNyk7cmV0dXJuIFouX19lPV8sR31mdW5jdGlvbiBnNShYLFksWixKLHEpe3ZhciBLLFEseixHLEwsRD1aLmxlbmd0aCxXPUQsTz0wO2ZvcihYLl9faz1BcnJheShxKSxLPTA7SzxxO0srKykoUT1ZW0tdKSE9bnVsbCYmdHlwZW9mIFEhPSJib29sZWFuIiYmdHlwZW9mIFEhPSJmdW5jdGlvbiI/KHR5cGVvZiBRPT0ic3RyaW5nInx8dHlwZW9mIFE9PSJudW1iZXIifHx0eXBlb2YgUT09ImJpZ2ludCJ8fFEuY29uc3RydWN0b3I9PVN0cmluZz9RPVguX19rW0tdPUUwKG51bGwsUSxudWxsLG51bGwsbnVsbCk6QTAoUSk/UT1YLl9fa1tLXT1FMCh4LHtjaGlsZHJlbjpRfSxudWxsLG51bGwsbnVsbCk6US5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmUS5fX2I+MD9RPVguX19rW0tdPUUwKFEudHlwZSxRLnByb3BzLFEua2V5LFEucmVmP1EucmVmOm51bGwsUS5fX3YpOlguX19rW0tdPVEsRz1LK08sUS5fXz1YLFEuX19iPVguX19iKzEsej1udWxsLChMPVEuX19pPXg1KFEsWixHLFcpKSE9LTEmJihXLS0sKHo9WltMXSkmJih6Ll9fdXw9MikpLHo9PW51bGx8fHouX192PT1udWxsPyhMPT0tMSYmKHE+RD9PLS06cTxEJiZPKyspLHR5cGVvZiBRLnR5cGUhPSJmdW5jdGlvbiImJihRLl9fdXw9NCkpOkwhPUcmJihMPT1HLTE/Ty0tOkw9PUcrMT9PKys6KEw+Rz9PLS06TysrLFEuX191fD00KSkpOlguX19rW0tdPW51bGw7aWYoVylmb3IoSz0wO0s8RDtLKyspKHo9WltLXSkhPW51bGwmJigyJnouX191KT09MCYmKHouX19lPT1KJiYoSj1MMCh6KSksaDQoeix6KSk7cmV0dXJuIEp9ZnVuY3Rpb24geDQoWCxZLFosSil7dmFyIHEsSztpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxLPTA7cSYmSzxxLmxlbmd0aDtLKyspcVtLXSYmKHFbS10uX189WCxZPXg0KHFbS10sWSxaLEopKTtyZXR1cm4gWX1YLl9fZSE9WSYmKEomJihZJiZYLnR5cGUmJiFZLnBhcmVudE5vZGUmJihZPUwwKFgpKSxaLmluc2VydEJlZm9yZShYLl9fZSxZfHxudWxsKSksWT1YLl9fZSk7ZG8gWT1ZJiZZLm5leHRTaWJsaW5nO3doaWxlKFkhPW51bGwmJlkubm9kZVR5cGU9PTgpO3JldHVybiBZfWZ1bmN0aW9uIFowKFgsWSl7cmV0dXJuIFk9WXx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KEEwKFgpP1guc29tZShmdW5jdGlvbihaKXtaMChaLFkpfSk6WS5wdXNoKFgpKSxZfWZ1bmN0aW9uIHg1KFgsWSxaLEope3ZhciBxLEssUSx6PVgua2V5LEc9WC50eXBlLEw9WVtaXSxEPUwhPW51bGwmJigyJkwuX191KT09MDtpZihMPT09bnVsbCYmej09bnVsbHx8RCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gWjtpZihKPihEPzE6MCkpe2ZvcihxPVotMSxLPVorMTtxPj0wfHxLPFkubGVuZ3RoOylpZigoTD1ZW1E9cT49MD9xLS06SysrXSkhPW51bGwmJigyJkwuX191KT09MCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gUX1yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFksWil7WVswXT09Ii0iP1guc2V0UHJvcGVydHkoWSxaPT1udWxsPyIiOlopOlhbWV09Wj09bnVsbD8iIjp0eXBlb2YgWiE9Im51bWJlciJ8fFI1LnRlc3QoWSk/WjpaKyJweCJ9ZnVuY3Rpb24gTTAoWCxZLFosSixxKXt2YXIgSyxRO1g6aWYoWT09InN0eWxlIilpZih0eXBlb2YgWj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PVo7ZWxzZXtpZih0eXBlb2YgSj09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9Sj0iIiksSilmb3IoWSBpbiBKKVomJlkgaW4gWnx8UzQoWC5zdHlsZSxZLCIiKTtpZihaKWZvcihZIGluIFopSiYmWltZXT09SltZXXx8UzQoWC5zdHlsZSxZLFpbWV0pfWVsc2UgaWYoWVswXT09Im8iJiZZWzFdPT0ibiIpSz1ZIT0oWT1ZLnJlcGxhY2UoajQsIiQxIikpLFE9WS50b0xvd2VyQ2FzZSgpLFk9USBpbiBYfHxZPT0ib25Gb2N1c091dCJ8fFk9PSJvbkZvY3VzSW4iP1Euc2xpY2UoMik6WS5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtZK0tdPVosWj9KP1pbVTBdPUpbVTBdOihaW1UwXT1LNCxYLmFkZEV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilZPVkucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWSE9IndpZHRoIiYmWSE9ImhlaWdodCImJlkhPSJocmVmIiYmWSE9Imxpc3QiJiZZIT0iZm9ybSImJlkhPSJ0YWJJbmRleCImJlkhPSJkb3dubG9hZCImJlkhPSJyb3dTcGFuIiYmWSE9ImNvbFNwYW4iJiZZIT0icm9sZSImJlkhPSJwb3BvdmVyIiYmWSBpbiBYKXRyeXtYW1ldPVo9PW51bGw/IiI6WjticmVhayBYfWNhdGNoKHope310eXBlb2YgWj09ImZ1bmN0aW9uInx8KFo9PW51bGx8fFo9PT0hMSYmWVs0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFkpOlguc2V0QXR0cmlidXRlKFksWT09InBvcG92ZXIiJiZaPT0xPyIiOlopKX19ZnVuY3Rpb24gVDQoWCl7cmV0dXJuIGZ1bmN0aW9uKFkpe2lmKHRoaXMubCl7dmFyIFo9dGhpcy5sW1kudHlwZStYXTtpZihZW0MwXT09bnVsbClZW0MwXT1LNCsrO2Vsc2UgaWYoWVtDMF08WltVMF0pcmV0dXJuO3JldHVybiBaKFAuZXZlbnQ/UC5ldmVudChZKTpZKX19fWZ1bmN0aW9uICQ0KFgsWSxaLEoscSxLLFEseixHLEwpe3ZhciBELFcsTyxVLGssXyxDLE0sRixFLEksdixyLGYsaSx5PVkudHlwZTtpZihZLmNvbnN0cnVjdG9yIT09dm9pZCAwKXJldHVybiBudWxsOzEyOCZaLl9fdSYmKEc9ISEoMzImWi5fX3UpLEs9W3o9WS5fX2U9Wi5fX2VdKSwoRD1QLl9fYikmJkQoWSk7WDppZih0eXBlb2YgeT09ImZ1bmN0aW9uIil0cnl7aWYoTT1ZLnByb3BzLEY9eS5wcm90b3R5cGUmJnkucHJvdG90eXBlLnJlbmRlcixFPShEPXkuY29udGV4dFR5cGUpJiZKW0QuX19jXSxJPUQ/RT9FLnByb3BzLnZhbHVlOkQuX186SixaLl9fYz9DPShXPVkuX19jPVouX19jKS5fXz1XLl9fRTooRj9ZLl9fYz1XPW5ldyB5KE0sSSk6KFkuX19jPVc9bmV3IGcoTSxJKSxXLmNvbnN0cnVjdG9yPXksVy5yZW5kZXI9bTUpLEUmJkUuc3ViKFcpLFcuc3RhdGV8fChXLnN0YXRlPXt9KSxXLl9fbj1KLE89Vy5fX2Q9ITAsVy5fX2g9W10sVy5fc2I9W10pLEYmJlcuX19zPT1udWxsJiYoVy5fX3M9Vy5zdGF0ZSksRiYmeS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMhPW51bGwmJihXLl9fcz09Vy5zdGF0ZSYmKFcuX19zPVgwKHt9LFcuX19zKSksWDAoVy5fX3MseS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoTSxXLl9fcykpKSxVPVcucHJvcHMsaz1XLnN0YXRlLFcuX192PVksTylGJiZ5LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09bnVsbCYmVy5jb21wb25lbnRXaWxsTW91bnQhPW51bGwmJlcuY29tcG9uZW50V2lsbE1vdW50KCksRiYmVy5jb21wb25lbnREaWRNb3VudCE9bnVsbCYmVy5fX2gucHVzaChXLmNvbXBvbmVudERpZE1vdW50KTtlbHNle2lmKEYmJnkuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiZNIT09VSYmVy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT1udWxsJiZXLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoTSxJKSxZLl9fdj09Wi5fX3Z8fCFXLl9fZSYmVy5zaG91bGRDb21wb25lbnRVcGRhdGUhPW51bGwmJlcuc2hvdWxkQ29tcG9uZW50VXBkYXRlKE0sVy5fX3MsSSk9PT0hMSl7WS5fX3YhPVouX192JiYoVy5wcm9wcz1NLFcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEpLFkuX19lPVouX19lLFkuX19rPVouX19rLFkuX19rLnNvbWUoZnVuY3Rpb24obSl7bSYmKG0uX189WSl9KSxTMC5wdXNoLmFwcGx5KFcuX19oLFcuX3NiKSxXLl9zYj1bXSxXLl9faC5sZW5ndGgmJlEucHVzaChXKTticmVhayBYfVcuY29tcG9uZW50V2lsbFVwZGF0ZSE9bnVsbCYmVy5jb21wb25lbnRXaWxsVXBkYXRlKE0sVy5fX3MsSSksRiYmVy5jb21wb25lbnREaWRVcGRhdGUhPW51bGwmJlcuX19oLnB1c2goZnVuY3Rpb24oKXtXLmNvbXBvbmVudERpZFVwZGF0ZShVLGssXyl9KX1pZihXLmNvbnRleHQ9SSxXLnByb3BzPU0sVy5fX1A9WCxXLl9fZT0hMSx2PVAuX19yLHI9MCxGKVcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFMwLnB1c2guYXBwbHkoVy5fX2gsVy5fc2IpLFcuX3NiPVtdO2Vsc2UgZG8gVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFcuc3RhdGU9Vy5fX3M7d2hpbGUoVy5fX2QmJisrcjwyNSk7Vy5zdGF0ZT1XLl9fcyxXLmdldENoaWxkQ29udGV4dCE9bnVsbCYmKEo9WDAoWDAoe30sSiksVy5nZXRDaGlsZENvbnRleHQoKSkpLEYmJiFPJiZXLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT1udWxsJiYoXz1XLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKFUsaykpLGY9RCE9bnVsbCYmRC50eXBlPT09eCYmRC5rZXk9PW51bGw/bTQoRC5wcm9wcy5jaGlsZHJlbik6RCx6PWc0KFgsQTAoZik/ZjpbZl0sWSxaLEoscSxLLFEseixHLEwpLFcuYmFzZT1ZLl9fZSxZLl9fdSY9LTE2MSxXLl9faC5sZW5ndGgmJlEucHVzaChXKSxDJiYoVy5fX0U9Vy5fXz1udWxsKX1jYXRjaChtKXtpZihZLl9fdj1udWxsLEd8fEshPW51bGwpaWYobS50aGVuKXtmb3IoWS5fX3V8PUc/MTYwOjEyODt6JiZ6Lm5vZGVUeXBlPT04JiZ6Lm5leHRTaWJsaW5nOyl6PXoubmV4dFNpYmxpbmc7S1tLLmluZGV4T2YoeildPW51bGwsWS5fX2U9en1lbHNle2ZvcihpPUsubGVuZ3RoO2ktLTspUTQoS1tpXSk7cTQoWSl9ZWxzZSBZLl9fZT1aLl9fZSxZLl9faz1aLl9fayxtLnRoZW58fHE0KFkpO1AuX19lKG0sWSxaKX1lbHNlIEs9PW51bGwmJlkuX192PT1aLl9fdj8oWS5fX2s9Wi5fX2ssWS5fX2U9Wi5fX2UpOno9WS5fX2U9ZDUoWi5fX2UsWSxaLEoscSxLLFEsRyxMKTtyZXR1cm4oRD1QLmRpZmZlZCkmJkQoWSksMTI4JlkuX191P3ZvaWQgMDp6fWZ1bmN0aW9uIHE0KFgpe1gmJihYLl9fYyYmKFguX19jLl9fZT0hMCksWC5fX2smJlguX19rLnNvbWUocTQpKX1mdW5jdGlvbiBkNChYLFksWil7Zm9yKHZhciBKPTA7SjxaLmxlbmd0aDtKKyspVzQoWltKXSxaWysrSl0sWlsrK0pdKTtQLl9fYyYmUC5fX2MoWSxYKSxYLnNvbWUoZnVuY3Rpb24ocSl7dHJ5e1g9cS5fX2gscS5fX2g9W10sWC5zb21lKGZ1bmN0aW9uKEspe0suY2FsbChxKX0pfWNhdGNoKEspe1AuX19lKEsscS5fX3YpfX0pfWZ1bmN0aW9uIG00KFgpe3JldHVybiB0eXBlb2YgWCE9Im9iamVjdCJ8fFg9PW51bGx8fFguX19iPjA/WDpBMChYKT9YLm1hcChtNCk6WDAoe30sWCl9ZnVuY3Rpb24gZDUoWCxZLFosSixxLEssUSx6LEcpe3ZhciBMLEQsVyxPLFUsayxfLEM9Wi5wcm9wc3x8dzAsTT1ZLnByb3BzLEY9WS50eXBlO2lmKEY9PSJzdmciP3E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjpGPT0ibWF0aCI/cT0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI6cXx8KHE9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiKSxLIT1udWxsKXtmb3IoTD0wO0w8Sy5sZW5ndGg7TCsrKWlmKChVPUtbTF0pJiYic2V0QXR0cmlidXRlImluIFU9PSEhRiYmKEY/VS5sb2NhbE5hbWU9PUY6VS5ub2RlVHlwZT09Mykpe1g9VSxLW0xdPW51bGw7YnJlYWt9fWlmKFg9PW51bGwpe2lmKEY9PW51bGwpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKE0pO1g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHEsRixNLmlzJiZNKSx6JiYoUC5fX20mJlAuX19tKFksSyksej0hMSksSz1udWxsfWlmKEY9PW51bGwpQz09PU18fHomJlguZGF0YT09TXx8KFguZGF0YT1NKTtlbHNle2lmKEs9SyYmYjAuY2FsbChYLmNoaWxkTm9kZXMpLCF6JiZLIT1udWxsKWZvcihDPXt9LEw9MDtMPFguYXR0cmlidXRlcy5sZW5ndGg7TCsrKUNbKFU9WC5hdHRyaWJ1dGVzW0xdKS5uYW1lXT1VLnZhbHVlO2ZvcihMIGluIEMpVT1DW0xdLEw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/Vz1VOkw9PSJjaGlsZHJlbiJ8fChMIGluIE0pfHxMPT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBNKXx8TD09ImNoZWNrZWQiJiYoImRlZmF1bHRDaGVja2VkImluIE0pfHxNMChYLEwsbnVsbCxVLHEpO2ZvcihMIGluIE0pVT1NW0xdLEw9PSJjaGlsZHJlbiI/Tz1VOkw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/RD1VOkw9PSJ2YWx1ZSI/az1VOkw9PSJjaGVja2VkIj9fPVU6eiYmdHlwZW9mIFUhPSJmdW5jdGlvbiJ8fENbTF09PT1VfHxNMChYLEwsVSxDW0xdLHEpO2lmKEQpenx8VyYmKEQuX19odG1sPT1XLl9faHRtbHx8RC5fX2h0bWw9PVguaW5uZXJIVE1MKXx8KFguaW5uZXJIVE1MPUQuX19odG1sKSxZLl9faz1bXTtlbHNlIGlmKFcmJihYLmlubmVySFRNTD0iIiksZzQoWS50eXBlPT0idGVtcGxhdGUiP1guY29udGVudDpYLEEwKE8pP086W09dLFksWixKLEY9PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6cSxLLFEsSz9LWzBdOlouX19rJiZMMChaLDApLHosRyksSyE9bnVsbClmb3IoTD1LLmxlbmd0aDtMLS07KVE0KEtbTF0pO3p8fChMPSJ2YWx1ZSIsRj09InByb2dyZXNzIiYmaz09bnVsbD9YLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTprIT1udWxsJiYoayE9PVhbTF18fEY9PSJwcm9ncmVzcyImJiFrfHxGPT0ib3B0aW9uIiYmayE9Q1tMXSkmJk0wKFgsTCxrLENbTF0scSksTD0iY2hlY2tlZCIsXyE9bnVsbCYmXyE9WFtMXSYmTTAoWCxMLF8sQ1tMXSxxKSl9cmV0dXJuIFh9ZnVuY3Rpb24gVzQoWCxZLFope3RyeXtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil7dmFyIEo9dHlwZW9mIFguX191PT0iZnVuY3Rpb24iO0omJlguX191KCksSiYmWT09bnVsbHx8KFguX191PVgoWSkpfWVsc2UgWC5jdXJyZW50PVl9Y2F0Y2gocSl7UC5fX2UocSxaKX19ZnVuY3Rpb24gaDQoWCxZLFope3ZhciBKLHE7aWYoUC51bm1vdW50JiZQLnVubW91bnQoWCksKEo9WC5yZWYpJiYoSi5jdXJyZW50JiZKLmN1cnJlbnQhPVguX19lfHxXNChKLG51bGwsWSkpLChKPVguX19jKSE9bnVsbCl7aWYoSi5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7Si5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKEspe1AuX19lKEssWSl9Si5iYXNlPUouX19QPW51bGx9aWYoSj1YLl9faylmb3IocT0wO3E8Si5sZW5ndGg7cSsrKUpbcV0mJmg0KEpbcV0sWSxafHx0eXBlb2YgWC50eXBlIT0iZnVuY3Rpb24iKTtafHxRNChYLl9fZSksWC5fX2M9WC5fXz1YLl9fZT12b2lkIDB9ZnVuY3Rpb24gbTUoWCxZLFope3JldHVybiB0aGlzLmNvbnN0cnVjdG9yKFgsWil9ZnVuY3Rpb24gcDAoWCxZLFope3ZhciBKLHEsSyxRO1k9PWRvY3VtZW50JiYoWT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLFAuX18mJlAuX18oWCxZKSxxPShKPXR5cGVvZiBaPT0iZnVuY3Rpb24iKT9udWxsOlomJlouX19rfHxZLl9fayxLPVtdLFE9W10sJDQoWSxYPSghSiYmWnx8WSkuX19rPVkwKHgsbnVsbCxbWF0pLHF8fHcwLHcwLFkubmFtZXNwYWNlVVJJLCFKJiZaP1taXTpxP251bGw6WS5maXJzdENoaWxkP2IwLmNhbGwoWS5jaGlsZE5vZGVzKTpudWxsLEssIUomJlo/WjpxP3EuX19lOlkuZmlyc3RDaGlsZCxKLFEpLGQ0KEssWCxRKX1mdW5jdGlvbiB6MChYKXtmdW5jdGlvbiBZKFope3ZhciBKLHE7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0fHwoSj1uZXcgU2V0LChxPXt9KVtZLl9fY109dGhpcyx0aGlzLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBxfSx0aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7Sj1udWxsfSx0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihLKXt0aGlzLnByb3BzLnZhbHVlIT1LLnZhbHVlJiZKLmZvckVhY2goZnVuY3Rpb24oUSl7US5fX2U9ITAsSjQoUSl9KX0sdGhpcy5zdWI9ZnVuY3Rpb24oSyl7Si5hZGQoSyk7dmFyIFE9Sy5jb21wb25lbnRXaWxsVW5tb3VudDtLLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7SiYmSi5kZWxldGUoSyksUSYmUS5jYWxsKEspfX0pLFouY2hpbGRyZW59cmV0dXJuIFkuX19jPSJfX2NDIitSNCsrLFkuX189WCxZLlByb3ZpZGVyPVkuX19sPShZLkNvbnN1bWVyPWZ1bmN0aW9uKFosSil7cmV0dXJuIFouY2hpbGRyZW4oSil9KS5jb250ZXh0VHlwZT1ZLFl9YjA9UzAuc2xpY2UsUD17X19lOmZ1bmN0aW9uKFgsWSxaLEope2Zvcih2YXIgcSxLLFE7WT1ZLl9fOylpZigocT1ZLl9fYykmJiFxLl9fKXRyeXtpZigoSz1xLmNvbnN0cnVjdG9yKSYmSy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPW51bGwmJihxLnNldFN0YXRlKEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKFgpKSxRPXEuX19kKSxxLmNvbXBvbmVudERpZENhdGNoIT1udWxsJiYocS5jb21wb25lbnREaWRDYXRjaChYLEp8fHt9KSxRPXEuX19kKSxRKXJldHVybiBxLl9fRT1xfWNhdGNoKHope1g9en10aHJvdyBYfX0sYjQ9MCxqNT1mdW5jdGlvbihYKXtyZXR1cm4gWCE9bnVsbCYmWC5jb25zdHJ1Y3Rvcj09PXZvaWQgMH0sZy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oWCxZKXt2YXIgWjtaPXRoaXMuX19zIT1udWxsJiZ0aGlzLl9fcyE9dGhpcy5zdGF0ZT90aGlzLl9fczp0aGlzLl9fcz1YMCh7fSx0aGlzLnN0YXRlKSx0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFg9WChYMCh7fSxaKSx0aGlzLnByb3BzKSksWCYmWDAoWixYKSxYIT1udWxsJiZ0aGlzLl9fdiYmKFkmJnRoaXMuX3NiLnB1c2goWSksSjQodGhpcykpfSxnLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihYKXt0aGlzLl9fdiYmKHRoaXMuX19lPSEwLFgmJnRoaXMuX19oLnB1c2goWCksSjQodGhpcykpfSxnLnByb3RvdHlwZS5yZW5kZXI9eCxLMD1bXSxwND10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpOnNldFRpbWVvdXQsdjQ9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gWC5fX3YuX19iLVkuX192Ll9fYn0sVDAuX19yPTAsWDQ9TWF0aC5yYW5kb20oKS50b1N0cmluZyg4KSxDMD0iX19kIitYNCxVMD0iX19hIitYNCxqND0vKFBvaW50ZXJDYXB0dXJlKSR8Q2FwdHVyZSQvaSxLND0wLFk0PVQ0KCExKSxaND1UNCghMCksUjQ9MDt2YXIgTjAsVCxMNCxmNCxEMD0wLHI0PVtdLGI9UCxhND1iLl9fYixjND1iLl9fcixsND1iLmRpZmZlZCxpND1iLl9fYyxzND1iLnVubW91bnQsbzQ9Yi5fXztmdW5jdGlvbiBqMChYLFkpe2IuX19oJiZiLl9faChULFgsRDB8fFkpLEQwPTA7dmFyIFo9VC5fX0h8fChULl9fSD17X186W10sX19oOltdfSk7cmV0dXJuIFg+PVouX18ubGVuZ3RoJiZaLl9fLnB1c2goe30pLFouX19bWF19ZnVuY3Rpb24gcChYKXtyZXR1cm4gRDA9MSxONChuNCxYKX1mdW5jdGlvbiBONChYLFksWil7dmFyIEo9ajAoTjArKywyKTtpZihKLnQ9WCwhSi5fX2MmJihKLl9fPVtaP1ooWSk6bjQodm9pZCAwLFkpLGZ1bmN0aW9uKHope3ZhciBHPUouX19OP0ouX19OWzBdOkouX19bMF0sTD1KLnQoRyx6KTtHIT09TCYmKEouX19OPVtMLEouX19bMV1dLEouX19jLnNldFN0YXRlKHt9KSl9XSxKLl9fYz1ULCFULl9fZikpe3ZhciBxPWZ1bmN0aW9uKHosRyxMKXtpZighSi5fX2MuX19IKXJldHVybiEwO3ZhciBEPUouX19jLl9fSC5fXy5maWx0ZXIoZnVuY3Rpb24oTyl7cmV0dXJuIE8uX19jfSk7aWYoRC5ldmVyeShmdW5jdGlvbihPKXtyZXR1cm4hTy5fX059KSlyZXR1cm4hS3x8Sy5jYWxsKHRoaXMseixHLEwpO3ZhciBXPUouX19jLnByb3BzIT09ejtyZXR1cm4gRC5zb21lKGZ1bmN0aW9uKE8pe2lmKE8uX19OKXt2YXIgVT1PLl9fWzBdO08uX189Ty5fX04sTy5fX049dm9pZCAwLFUhPT1PLl9fWzBdJiYoVz0hMCl9fSksSyYmSy5jYWxsKHRoaXMseixHLEwpfHxXfTtULl9fZj0hMDt2YXJ7c2hvdWxkQ29tcG9uZW50VXBkYXRlOkssY29tcG9uZW50V2lsbFVwZGF0ZTpRfT1UO1QuY29tcG9uZW50V2lsbFVwZGF0ZT1mdW5jdGlvbih6LEcsTCl7aWYodGhpcy5fX2Upe3ZhciBEPUs7Sz12b2lkIDAscSh6LEcsTCksSz1EfVEmJlEuY2FsbCh0aGlzLHosRyxMKX0sVC5zaG91bGRDb21wb25lbnRVcGRhdGU9cX1yZXR1cm4gSi5fX058fEouX199ZnVuY3Rpb24gZChYLFkpe3ZhciBaPWowKE4wKyssMyk7IWIuX19zJiZ0NChaLl9fSCxZKSYmKFouX189WCxaLnU9WSxULl9fSC5fX2gucHVzaChaKSl9ZnVuY3Rpb24gdyhYKXtyZXR1cm4gRDA9NSxSMChmdW5jdGlvbigpe3JldHVybntjdXJyZW50Olh9fSxbXSl9ZnVuY3Rpb24gUjAoWCxZKXt2YXIgWj1qMChOMCsrLDcpO3JldHVybiB0NChaLl9fSCxZKSYmKFouX189WCgpLFouX19IPVksWi5fX2g9WCksWi5fX31mdW5jdGlvbiBqKFgsWSl7cmV0dXJuIEQwPTgsUjAoZnVuY3Rpb24oKXtyZXR1cm4gWH0sWSl9ZnVuY3Rpb24gUDAoWCl7dmFyIFk9VC5jb250ZXh0W1guX19jXSxaPWowKE4wKyssOSk7cmV0dXJuIFouYz1YLFk/KFouX189PW51bGwmJihaLl9fPSEwLFkuc3ViKFQpKSxZLnByb3BzLnZhbHVlKTpYLl9ffWZ1bmN0aW9uIGg1KCl7Zm9yKHZhciBYO1g9cjQuc2hpZnQoKTspe3ZhciBZPVguX19IO2lmKFguX19QJiZZKXRyeXtZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXX1jYXRjaChaKXtZLl9faD1bXSxiLl9fZShaLFguX192KX19fWIuX19iPWZ1bmN0aW9uKFgpe1Q9bnVsbCxhNCYmYTQoWCl9LGIuX189ZnVuY3Rpb24oWCxZKXtYJiZZLl9fayYmWS5fX2suX19tJiYoWC5fX209WS5fX2suX19tKSxvNCYmbzQoWCxZKX0sYi5fX3I9ZnVuY3Rpb24oWCl7YzQmJmM0KFgpLE4wPTA7dmFyIFk9KFQ9WC5fX2MpLl9fSDtZJiYoTDQ9PT1UPyhZLl9faD1bXSxULl9faD1bXSxZLl9fLnNvbWUoZnVuY3Rpb24oWil7Wi5fX04mJihaLl9fPVouX19OKSxaLnU9Wi5fX049dm9pZCAwfSkpOihZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXSxOMD0wKSksTDQ9VH0sYi5kaWZmZWQ9ZnVuY3Rpb24oWCl7bDQmJmw0KFgpO3ZhciBZPVguX19jO1kmJlkuX19IJiYoWS5fX0guX19oLmxlbmd0aCYmKHI0LnB1c2goWSkhPT0xJiZmND09PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwoKGY0PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8ZjUpKGg1KSksWS5fX0guX18uc29tZShmdW5jdGlvbihaKXtaLnUmJihaLl9fSD1aLnUpLFoudT12b2lkIDB9KSksTDQ9VD1udWxsfSxiLl9fYz1mdW5jdGlvbihYLFkpe1kuc29tZShmdW5jdGlvbihaKXt0cnl7Wi5fX2guc29tZSh2MCksWi5fX2g9Wi5fX2guZmlsdGVyKGZ1bmN0aW9uKEope3JldHVybiFKLl9ffHx6NChKKX0pfWNhdGNoKEope1kuc29tZShmdW5jdGlvbihxKXtxLl9faCYmKHEuX19oPVtdKX0pLFk9W10sYi5fX2UoSixaLl9fdil9fSksaTQmJmk0KFgsWSl9LGIudW5tb3VudD1mdW5jdGlvbihYKXtzNCYmczQoWCk7dmFyIFksWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7dHJ5e3YwKEopfWNhdGNoKHEpe1k9cX19KSxaLl9fSD12b2lkIDAsWSYmYi5fX2UoWSxaLl9fdikpfTt2YXIgdTQ9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBmNShYKXt2YXIgWSxaPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KEopLHU0JiZjYW5jZWxBbmltYXRpb25GcmFtZShZKSxzZXRUaW1lb3V0KFgpfSxKPXNldFRpbWVvdXQoWiwzNSk7dTQmJihZPXJlcXVlc3RBbmltYXRpb25GcmFtZShaKSl9ZnVuY3Rpb24gdjAoWCl7dmFyIFk9VCxaPVguX19jO3R5cGVvZiBaPT0iZnVuY3Rpb24iJiYoWC5fX2M9dm9pZCAwLFooKSksVD1ZfWZ1bmN0aW9uIHo0KFgpe3ZhciBZPVQ7WC5fX2M9WC5fXygpLFQ9WX1mdW5jdGlvbiB0NChYLFkpe3JldHVybiFYfHxYLmxlbmd0aCE9PVkubGVuZ3RofHxZLnNvbWUoZnVuY3Rpb24oWixKKXtyZXR1cm4gWiE9PVhbSl19KX1mdW5jdGlvbiBuNChYLFkpe3JldHVybiB0eXBlb2YgWT09ImZ1bmN0aW9uIj9ZKFgpOll9ZnVuY3Rpb24gdTUoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gZTQoWCxZKXtmb3IodmFyIFogaW4gWClpZihaIT09Il9fc291cmNlIiYmIShaIGluIFkpKXJldHVybiEwO2Zvcih2YXIgSiBpbiBZKWlmKEohPT0iX19zb3VyY2UiJiZYW0pdIT09WVtKXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBYNShYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX0oWDUucHJvdG90eXBlPW5ldyBnKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxYNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWSl7cmV0dXJuIGU0KHRoaXMucHJvcHMsWCl8fGU0KHRoaXMuc3RhdGUsWSl9O3ZhciBZNT1QLl9fYjtQLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksWTUmJlk1KFgpfTt2YXIgcjU9UC5fX2U7UC5fX2U9ZnVuY3Rpb24oWCxZLFosSil7aWYoWC50aGVuKXtmb3IodmFyIHEsSz1ZO0s9Sy5fXzspaWYoKHE9Sy5fX2MpJiZxLl9fYylyZXR1cm4gWS5fX2U9PW51bGwmJihZLl9fZT1aLl9fZSxZLl9faz1aLl9faykscS5fX2MoWCxZKX1yNShYLFksWixKKX07dmFyIFo1PVAudW5tb3VudDtmdW5jdGlvbiBXNShYLFksWil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oSil7dHlwZW9mIEouX19jPT0iZnVuY3Rpb24iJiZKLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPXU1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1aJiYoWC5fX2MuX19QPVkpLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKEope3JldHVybiBXNShKLFksWil9KSksWH1mdW5jdGlvbiBMNShYLFksWil7cmV0dXJuIFgmJlomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEw1KEosWSxaKX0pLFguX19jJiZYLl9fYy5fX1A9PT1ZJiYoWC5fX2UmJlouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9WikpLFh9ZnVuY3Rpb24gRzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gejUoWCl7dmFyIFk9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFkmJlkuX19hJiZZLl9fYShYKX1mdW5jdGlvbiB5MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfVAudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWT1YLl9fYztZJiYoWS5fX3o9ITApLFkmJlkuX19SJiZZLl9fUigpLFkmJjMyJlguX191JiYoWC50eXBlPW51bGwpLFo1JiZaNShYKX0sKEc0LnByb3RvdHlwZT1uZXcgZykuX19jPWZ1bmN0aW9uKFgsWSl7dmFyIFo9WS5fX2MsSj10aGlzO0oubz09bnVsbCYmKEoubz1bXSksSi5vLnB1c2goWik7dmFyIHE9ejUoSi5fX3YpLEs9ITEsUT1mdW5jdGlvbigpe0t8fEouX196fHwoSz0hMCxaLl9fUj1udWxsLHE/cShHKTpHKCkpfTtaLl9fUj1RO3ZhciB6PVouX19QO1ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1KLl9fdSl7aWYoSi5zdGF0ZS5fX2Epe3ZhciBMPUouc3RhdGUuX19hO0ouX192Ll9fa1swXT1MNShMLEwuX19jLl9fUCxMLl9fYy5fX08pfXZhciBEO2ZvcihKLnNldFN0YXRlKHtfX2E6Si5fX2I9bnVsbH0pO0Q9Si5vLnBvcCgpOylELl9fUD16LEQuZm9yY2VVcGRhdGUoKX19O0ouX191Kyt8fDMyJlkuX191fHxKLnNldFN0YXRlKHtfX2E6Si5fX2I9Si5fX3YuX19rWzBdfSksWC50aGVuKFEsUSl9LEc0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFkpe2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBaPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09VzUodGhpcy5fX2IsWixKLl9fTz1KLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1ZLl9fYSYmWTAoeCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1kwKHgsbnVsbCxZLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgSjU9ZnVuY3Rpb24oWCxZLFope2lmKCsrWlsxXT09PVpbMF0mJlgubC5kZWxldGUoWSksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKFo9WC5pO1o7KXtmb3IoO1oubGVuZ3RoPjM7KVoucG9wKCkoKTtpZihaWzFdPFpbMF0pYnJlYWs7WC5pPVo9WlsyXX19Oyh5MC5wcm90b3R5cGU9bmV3IGcpLl9fYT1mdW5jdGlvbihYKXt2YXIgWT10aGlzLFo9ejUoWS5fX3YpLEo9WS5sLmdldChYKTtyZXR1cm4gSlswXSsrLGZ1bmN0aW9uKHEpe3ZhciBLPWZ1bmN0aW9uKCl7WS5wcm9wcy5yZXZlYWxPcmRlcj8oSi5wdXNoKHEpLEo1KFksWCxKKSk6cSgpfTtaP1ooSyk6SygpfX0seTAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWT1aMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZZLnJldmVyc2UoKTtmb3IodmFyIFo9WS5sZW5ndGg7Wi0tOyl0aGlzLmwuc2V0KFlbWl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHkwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9eTAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihZLFope0o1KFgsWixZKX0pfTt2YXIgdDU9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsbjU9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLGU1PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sWDY9L1tBLVowLTldL2csWTY9dHlwZW9mIGRvY3VtZW50PCJ1IixaNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2Z1bmN0aW9uIE41KFgsWSxaKXtyZXR1cm4gWS5fX2s9PW51bGwmJihZLnRleHRDb250ZW50PSIiKSxwMChYLFkpLHR5cGVvZiBaPT0iZnVuY3Rpb24iJiZaKCksWD9YLl9fYzpudWxsfWcucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGcucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihZKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6WX0pfX0pfSk7dmFyIHE1PVAuZXZlbnQ7UC5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gcTUmJihYPXE1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgRzUsSjY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEs1PVAudm5vZGU7UC52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWSl7dmFye3Byb3BzOlosdHlwZTpKfT1ZLHE9e30sSz1KLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBRIGluIFope3ZhciB6PVpbUV07aWYoIShRPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gWikmJno9PW51bGx8fFk2JiZRPT09ImNoaWxkcmVuIiYmSj09PSJub3NjcmlwdCJ8fFE9PT0iY2xhc3MifHxRPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1RLnRvTG93ZXJDYXNlKCk7UT09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gWiYmWi52YWx1ZT09bnVsbD9RPSJ2YWx1ZSI6UT09PSJkb3dubG9hZCImJno9PT0hMD96PSIiOkc9PT0idHJhbnNsYXRlIiYmej09PSJubyI/ej0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/UT0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fEohPT0iaW5wdXQiJiZKIT09InRleHRhcmVhInx8WjYoWi50eXBlKT9HPT09Im9uZm9jdXMiP1E9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP1E9Im9uZm9jdXNvdXQiOmU1LnRlc3QoUSkmJihRPUcpOkc9UT0ib25pbnB1dCI6SyYmbjUudGVzdChRKT9RPVEucmVwbGFjZShYNiwiLSQmIikudG9Mb3dlckNhc2UoKTp6PT09bnVsbCYmKHo9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW1E9R10mJihRPSJvbmlucHV0Q2FwdHVyZSIpLHFbUV09en19Sj09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9WjAoWi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihMKXtMLnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZihMLnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PUwucHJvcHMudmFsdWV9KSkpLFouY2xhc3MmJiFaLmNsYXNzTmFtZT8ocS5jbGFzcz1aLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEo2KSk6Wi5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPVouY2xhc3NOYW1lKSxZLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9dDUsSzUmJks1KFgpfTt2YXIgUTU9UC5fX3I7UC5fX3I9ZnVuY3Rpb24oWCl7UTUmJlE1KFgpLEc1PVguX19jfTt2YXIgJDU9UC5kaWZmZWQ7UC5kaWZmZWQ9ZnVuY3Rpb24oWCl7JDUmJiQ1KFgpO3Zhcntwcm9wczpZLF9fZTpafT1YO1ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBZJiZZLnZhbHVlIT09Wi52YWx1ZSYmKFoudmFsdWU9WS52YWx1ZT09bnVsbD8iIjpZLnZhbHVlKSxHNT1udWxsfTtmdW5jdGlvbiBWNShYKXtyZXR1cm4hIVguX19rJiYocDAobnVsbCxYKSwhMCl9ZnVuY3Rpb24gSDUoWCl7cmV0dXJue3JlbmRlcjpmdW5jdGlvbihZKXtONShZLFgpfSx1bm1vdW50OmZ1bmN0aW9uKCl7VjUoWCl9fX1mdW5jdGlvbiBJNShYLFkpe2Zvcih2YXIgWiBpbiBZKVhbWl09WVtaXTtyZXR1cm4gWH1mdW5jdGlvbiBPNShYLFkpe2Zvcih2YXIgWiBpbiBYKWlmKFohPT0iX19zb3VyY2UiJiYhKFogaW4gWSkpcmV0dXJuITA7Zm9yKHZhciBKIGluIFkpaWYoSiE9PSJfX3NvdXJjZSImJlhbSl0hPT1ZW0pdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFU1KFgsWSl7dGhpcy5wcm9wcz1YLHRoaXMuY29udGV4dD1ZfShVNS5wcm90b3R5cGU9bmV3IGcpLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwLFU1LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gTzUodGhpcy5wcm9wcyxYKXx8TzUodGhpcy5zdGF0ZSxZKX07dmFyIEE1PVAuX19iO1AuX19iPWZ1bmN0aW9uKFgpe1gudHlwZSYmWC50eXBlLl9fZiYmWC5yZWYmJihYLnByb3BzLnJlZj1YLnJlZixYLnJlZj1udWxsKSxBNSYmQTUoWCl9O3ZhciBxNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKXx8MzkxMTtmdW5jdGlvbiBHMChYKXtmdW5jdGlvbiBZKFope3ZhciBKPUk1KHt9LFopO3JldHVybiBkZWxldGUgSi5yZWYsWChKLFoucmVmfHxudWxsKX1yZXR1cm4gWS4kJHR5cGVvZj1xNixZLnJlbmRlcj1YLFkucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9WS5fX2Y9ITAsWS5kaXNwbGF5TmFtZT0iRm9yd2FyZFJlZigiKyhYLmRpc3BsYXlOYW1lfHxYLm5hbWUpKyIpIixZfXZhciBLNj1QLl9fZTtQLl9fZT1mdW5jdGlvbihYLFksWixKKXtpZihYLnRoZW4pe2Zvcih2YXIgcSxLPVk7Sz1LLl9fOylpZigocT1LLl9fYykmJnEuX19jKXJldHVybiBZLl9fZT09bnVsbCYmKFkuX19lPVouX19lLFkuX19rPVouX19rKSxxLl9fYyhYLFkpfUs2KFgsWSxaLEopfTt2YXIgRDU9UC51bm1vdW50O2Z1bmN0aW9uIE01KFgsWSxaKXtyZXR1cm4gWCYmKFguX19jJiZYLl9fYy5fX0gmJihYLl9fYy5fX0guX18uZm9yRWFjaChmdW5jdGlvbihKKXt0eXBlb2YgSi5fX2M9PSJmdW5jdGlvbiImJkouX19jKCl9KSxYLl9fYy5fX0g9bnVsbCksKFg9STUoe30sWCkpLl9fYyE9bnVsbCYmKFguX19jLl9fUD09PVomJihYLl9fYy5fX1A9WSksWC5fX2MuX19lPSEwLFguX19jPW51bGwpLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIE01KEosWSxaKX0pKSxYfWZ1bmN0aW9uIEM1KFgsWSxaKXtyZXR1cm4gWCYmWiYmKFguX192PW51bGwsWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihKKXtyZXR1cm4gQzUoSixZLFopfSksWC5fX2MmJlguX19jLl9fUD09PVkmJihYLl9fZSYmWi5hcHBlbmRDaGlsZChYLl9fZSksWC5fX2MuX19lPSEwLFguX19jLl9fUD1aKSksWH1mdW5jdGlvbiBINCgpe3RoaXMuX191PTAsdGhpcy5vPW51bGwsdGhpcy5fX2I9bnVsbH1mdW5jdGlvbiBFNShYKXt2YXIgWT1YLl9fJiZYLl9fLl9fYztyZXR1cm4gWSYmWS5fX2EmJlkuX19hKFgpfWZ1bmN0aW9uIGcwKCl7dGhpcy5pPW51bGwsdGhpcy5sPW51bGx9UC51bm1vdW50PWZ1bmN0aW9uKFgpe3ZhciBZPVguX19jO1kmJihZLl9fej0hMCksWSYmWS5fX1ImJlkuX19SKCksWSYmMzImWC5fX3UmJihYLnR5cGU9bnVsbCksRDUmJkQ1KFgpfSwoSDQucHJvdG90eXBlPW5ldyBnKS5fX2M9ZnVuY3Rpb24oWCxZKXt2YXIgWj1ZLl9fYyxKPXRoaXM7Si5vPT1udWxsJiYoSi5vPVtdKSxKLm8ucHVzaChaKTt2YXIgcT1FNShKLl9fdiksSz0hMSxRPWZ1bmN0aW9uKCl7S3x8Si5fX3p8fChLPSEwLFouX19SPW51bGwscT9xKEcpOkcoKSl9O1ouX19SPVE7dmFyIHo9Wi5fX1A7Wi5fX1A9bnVsbDt2YXIgRz1mdW5jdGlvbigpe2lmKCEtLUouX191KXtpZihKLnN0YXRlLl9fYSl7dmFyIEw9Si5zdGF0ZS5fX2E7Si5fX3YuX19rWzBdPUM1KEwsTC5fX2MuX19QLEwuX19jLl9fTyl9dmFyIEQ7Zm9yKEouc2V0U3RhdGUoe19fYTpKLl9fYj1udWxsfSk7RD1KLm8ucG9wKCk7KUQuX19QPXosRC5mb3JjZVVwZGF0ZSgpfX07Si5fX3UrK3x8MzImWS5fX3V8fEouc2V0U3RhdGUoe19fYTpKLl9fYj1KLl9fdi5fX2tbMF19KSxYLnRoZW4oUSxRKX0sSDQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5vPVtdfSxINC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgsWSl7aWYodGhpcy5fX2Ipe2lmKHRoaXMuX192Ll9fayl7dmFyIFo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksSj10aGlzLl9fdi5fX2tbMF0uX19jO3RoaXMuX192Ll9fa1swXT1NNSh0aGlzLl9fYixaLEouX19PPUouX19QKX10aGlzLl9fYj1udWxsfXZhciBxPVkuX19hJiZZMCh4LG51bGwsWC5mYWxsYmFjayk7cmV0dXJuIHEmJihxLl9fdSY9LTMzKSxbWTAoeCxudWxsLFkuX19hP251bGw6WC5jaGlsZHJlbikscV19O3ZhciBQNT1mdW5jdGlvbihYLFksWil7aWYoKytaWzFdPT09WlswXSYmWC5sLmRlbGV0ZShZKSxYLnByb3BzLnJldmVhbE9yZGVyJiYoWC5wcm9wcy5yZXZlYWxPcmRlclswXSE9PSJ0Inx8IVgubC5zaXplKSlmb3IoWj1YLmk7Wjspe2Zvcig7Wi5sZW5ndGg+MzspWi5wb3AoKSgpO2lmKFpbMV08WlswXSlicmVhaztYLmk9Wj1aWzJdfX07KGcwLnByb3RvdHlwZT1uZXcgZykuX19hPWZ1bmN0aW9uKFgpe3ZhciBZPXRoaXMsWj1FNShZLl9fdiksSj1ZLmwuZ2V0KFgpO3JldHVybiBKWzBdKyssZnVuY3Rpb24ocSl7dmFyIEs9ZnVuY3Rpb24oKXtZLnByb3BzLnJldmVhbE9yZGVyPyhKLnB1c2gocSksUDUoWSxYLEopKTpxKCl9O1o/WihLKTpLKCl9fSxnMC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgpe3RoaXMuaT1udWxsLHRoaXMubD1uZXcgTWFwO3ZhciBZPVowKFguY2hpbGRyZW4pO1gucmV2ZWFsT3JkZXImJlgucmV2ZWFsT3JkZXJbMF09PT0iYiImJlkucmV2ZXJzZSgpO2Zvcih2YXIgWj1ZLmxlbmd0aDtaLS07KXRoaXMubC5zZXQoWVtaXSx0aGlzLmk9WzEsMCx0aGlzLmldKTtyZXR1cm4gWC5jaGlsZHJlbn0sZzAucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1nMC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgWD10aGlzO3RoaXMubC5mb3JFYWNoKGZ1bmN0aW9uKFksWil7UDUoWCxaLFkpfSl9O3ZhciBRNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMywkNj0vXig/OmFjY2VudHxhbGlnbm1lbnR8YXJhYmljfGJhc2VsaW5lfGNhcHxjbGlwKD8hUGF0aFUpfGNvbG9yfGRvbWluYW50fGZpbGx8Zmxvb2R8Zm9udHxnbHlwaCg/IVIpfGhvcml6fGltYWdlKCFTKXxsZXR0ZXJ8bGlnaHRpbmd8bWFya2VyKD8hSHxXfFUpfG92ZXJsaW5lfHBhaW50fHBvaW50ZXJ8c2hhcGV8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dHJhbnNmb3JtfHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVjdG9yfHZlcnR8d29yZHx3cml0aW5nfHgoPyFDKSlbQS1aXS8sVzY9L15vbihBbml8VHJhfFRvdXxCZWZvcmVJbnB8Q29tcG8pLyxMNj0vW0EtWjAtOV0vZyx6Nj10eXBlb2YgZG9jdW1lbnQ8InUiLE42PWZ1bmN0aW9uKFgpe3JldHVybih0eXBlb2YgU3ltYm9sPCJ1IiYmdHlwZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj8vZmlsfGNoZXxyYWQvOi9maWx8Y2hlfHJhLykudGVzdChYKX07Zy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD0hMCxbImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVXBkYXRlIl0uZm9yRWFjaChmdW5jdGlvbihYKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZy5wcm90b3R5cGUsWCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzWyJVTlNBRkVfIitYXX0sc2V0OmZ1bmN0aW9uKFkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFgse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpZfSl9fSl9KTt2YXIgQjU9UC5ldmVudDtQLmV2ZW50PWZ1bmN0aW9uKFgpe3JldHVybiBCNSYmKFg9QjUoWCkpLFgucGVyc2lzdD1mdW5jdGlvbigpe30sWC5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbEJ1YmJsZX0sWC5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZhdWx0UHJldmVudGVkfSxYLm5hdGl2ZUV2ZW50PVh9O3ZhciB3NSxHNj17Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsYXNzfX0sXzU9UC52bm9kZTtQLnZub2RlPWZ1bmN0aW9uKFgpe3R5cGVvZiBYLnR5cGU9PSJzdHJpbmciJiZmdW5jdGlvbihZKXt2YXJ7cHJvcHM6Wix0eXBlOkp9PVkscT17fSxLPUouaW5kZXhPZigiLSIpPT0tMTtmb3IodmFyIFEgaW4gWil7dmFyIHo9WltRXTtpZighKFE9PT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBaKSYmej09bnVsbHx8ejYmJlE9PT0iY2hpbGRyZW4iJiZKPT09Im5vc2NyaXB0Inx8UT09PSJjbGFzcyJ8fFE9PT0iY2xhc3NOYW1lIikpe3ZhciBHPVEudG9Mb3dlckNhc2UoKTtRPT09ImRlZmF1bHRWYWx1ZSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlPT1udWxsP1E9InZhbHVlIjpRPT09ImRvd25sb2FkIiYmej09PSEwP3o9IiI6Rz09PSJ0cmFuc2xhdGUiJiZ6PT09Im5vIj96PSExOkdbMF09PT0ibyImJkdbMV09PT0ibiI/Rz09PSJvbmRvdWJsZWNsaWNrIj9RPSJvbmRibGNsaWNrIjpHIT09Im9uY2hhbmdlInx8SiE9PSJpbnB1dCImJkohPT0idGV4dGFyZWEifHxONihaLnR5cGUpP0c9PT0ib25mb2N1cyI/UT0ib25mb2N1c2luIjpHPT09Im9uYmx1ciI/UT0ib25mb2N1c291dCI6VzYudGVzdChRKSYmKFE9Ryk6Rz1RPSJvbmlucHV0IjpLJiYkNi50ZXN0KFEpP1E9US5yZXBsYWNlKEw2LCItJCYiKS50b0xvd2VyQ2FzZSgpOno9PT1udWxsJiYoej12b2lkIDApLEc9PT0ib25pbnB1dCImJnFbUT1HXSYmKFE9Im9uaW5wdXRDYXB0dXJlIikscVtRXT16fX1KPT0ic2VsZWN0IiYmKHEubXVsdGlwbGUmJkFycmF5LmlzQXJyYXkocS52YWx1ZSkmJihxLnZhbHVlPVowKFouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oTCl7TC5wcm9wcy5zZWxlY3RlZD1xLnZhbHVlLmluZGV4T2YoTC5wcm9wcy52YWx1ZSkhPS0xfSkpLHEuZGVmYXVsdFZhbHVlIT1udWxsJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS5tdWx0aXBsZT9xLmRlZmF1bHRWYWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMTpxLmRlZmF1bHRWYWx1ZT09TC5wcm9wcy52YWx1ZX0pKSksWi5jbGFzcyYmIVouY2xhc3NOYW1lPyhxLmNsYXNzPVouY2xhc3MsT2JqZWN0LmRlZmluZVByb3BlcnR5KHEsImNsYXNzTmFtZSIsRzYpKTpaLmNsYXNzTmFtZSYmKHEuY2xhc3M9cS5jbGFzc05hbWU9Wi5jbGFzc05hbWUpLFkucHJvcHM9cX0oWCksWC4kJHR5cGVvZj1RNixfNSYmXzUoWCl9O3ZhciBGNT1QLl9fcjtQLl9fcj1mdW5jdGlvbihYKXtGNSYmRjUoWCksdzU9WC5fX2N9O3ZhciBrNT1QLmRpZmZlZDtQLmRpZmZlZD1mdW5jdGlvbihYKXtrNSYmazUoWCk7dmFye3Byb3BzOlksX19lOlp9PVg7WiE9bnVsbCYmWC50eXBlPT09InRleHRhcmVhIiYmInZhbHVlImluIFkmJlkudmFsdWUhPT1aLnZhbHVlJiYoWi52YWx1ZT1ZLnZhbHVlPT1udWxsPyIiOlkudmFsdWUpLHc1PW51bGx9O3ZhciBWNj0wO2Z1bmN0aW9uICQoWCxZLFosSixxLEspe1l8fChZPXt9KTt2YXIgUSx6LEc9WTtpZigicmVmImluIEcpZm9yKHogaW4gRz17fSxZKXo9PSJyZWYiP1E9WVt6XTpHW3pdPVlbel07dmFyIEw9e3R5cGU6WCxwcm9wczpHLGtleTpaLHJlZjpRLF9fazpudWxsLF9fOm51bGwsX19iOjAsX19lOm51bGwsX19jOm51bGwsY29uc3RydWN0b3I6dm9pZCAwLF9fdjotLVY2LF9faTotMSxfX3U6MCxfX3NvdXJjZTpxLF9fc2VsZjpLfTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFE9WC5kZWZhdWx0UHJvcHMpKWZvcih6IGluIFEpR1t6XT09PXZvaWQgMCYmKEdbel09UVt6XSk7cmV0dXJuIFAudm5vZGUmJlAudm5vZGUoTCksTH12YXIgTzQ9YHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyMCcgaGVpZ2h0PScyMCclM0UlM0NjaXJjbGUgY3g9JzEwJyBjeT0nMTAnIHI9JzknIGZpbGw9J3JnYmEoMjU1LDI1NSwyNTUsMC40KScgc3Ryb2tlPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNyknIHN0cm9rZS13aWR0aD0nMScvJTNFJTNDL3N2ZyUzRSIpIDEwIDEwLCBwb2ludGVyYCxINj0zLE82PTQsVTY9NTtmdW5jdGlvbiB4MCh7dXJsOlgsd3NVcmw6WSxzdHlsZTpaLGltYWdlU3R5bGU6SixjbGFzc05hbWU6cSxvbkhvbWVQcmVzczpLLG9uU3RyZWFtVG91Y2g6USxvblN0cmVhbU11bHRpVG91Y2g6eixvblN0cmVhbUJ1dHRvbjpHLHN1YnNjcmliZUZyYW1lOkwsc3RyZWFtRnJhbWU6RCxzdHJlYW1Db25maWc6VyxoaWRlQ29udHJvbHM6TyxvblN0cmVhbWluZ0NoYW5nZTpVLGNvbm5lY3Rpb25RdWFsaXR5Omt9KXtsZXQgXz0hIVEsQz13KG51bGwpLE09dyhudWxsKSxGPXcobnVsbCksW0UsSV09cCghMSksW3Yscl09cChudWxsKSxbZixpXT1wKG51bGwpLHk9dyhudWxsKSxbbSxjMF09cChudWxsKTtkKCgpPT57bGV0IFY9eS5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKE4pPT57bGV0IEE9TlswXT8uY29udGVudFJlY3Q7aWYoQSljMCh7d2lkdGg6QS53aWR0aCxoZWlnaHQ6QS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W0Q0LFA0XT1wKDApLFcwPXcoMCksW3A1LGwwXT1wKCExKSx0PXcobnVsbCk7ZCgoKT0+e2lmKGs9PT0icG9vciIpe2lmKGwwKCEwKSx0LmN1cnJlbnQpY2xlYXJUaW1lb3V0KHQuY3VycmVudCk7dC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntsMCghMSksdC5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYobDAoITEpLHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KSx0LmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KX19LFtrXSk7bGV0IGkwPWAke1h9L3N0cmVhbS5tanBlZ2AsQjQ9dyhVKTtCNC5jdXJyZW50PVUsZCgoKT0+e0I0LmN1cnJlbnQ/LihFKX0sW0VdKSxkKCgpPT57aWYoXyYmVylpKFcpfSxbXyxXXSk7bGV0IF80PXcoITEpO180LmN1cnJlbnQ9RTtsZXQgczA9dyhudWxsKTtkKCgpPT57aWYoIV98fCFMKXJldHVybjtyZXR1cm4gTCgoVik9PntXMC5jdXJyZW50Kys7bGV0IEg9TS5jdXJyZW50O2lmKEgpe2lmKHMwLmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTChzMC5jdXJyZW50KTtzMC5jdXJyZW50PVYsSC5zcmM9Vn1pZighXzQuY3VycmVudCljb25zb2xlLmxvZygiW3NlcnZlLXNpbV0gZmlyc3QgZnJhbWUgcmVjZWl2ZWQsIHJlbmRlcmluZyIpLEkoITApLHIobnVsbCl9KX0sW18sTF0pO2xldCBjPWooKFYpPT57aWYoXyl7UT8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1INixBLnNldChOLDEpLEguc2VuZChBKX0sW18sUV0pLG8wPWooKFYpPT57aWYoXyl7Rz8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoe2J1dHRvbjpWfSkpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1PNixBLnNldChOLDEpLEguc2VuZChBKX0sW18sR10pLG49aigoVik9PntpZihfKXt6Py4oVik7cmV0dXJufWxldCBIPUYuY3VycmVudDtpZighSHx8SC5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBOPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShWKSksQT1uZXcgVWludDhBcnJheSgxK04ubGVuZ3RoKTtBWzBdPVU2LEEuc2V0KE4sMSksSC5zZW5kKEEpfSxbXyx6XSk7ZCgoKT0+e2lmKF8pcmV0dXJuO2ZldGNoKGAke1h9L2NvbmZpZ2ApLnRoZW4oKEIpPT5CLmpzb24oKSkudGhlbigoQik9PntpZihCLndpZHRoPjAmJkIuaGVpZ2h0PjApaShCKX0pLmNhdGNoKCgpPT57fSk7bGV0IFY9WT8/WC5yZXBsYWNlKC9eaHR0cC8sIndzIikrIi93cyIsSD1uZXcgV2ViU29ja2V0KFYpO0guYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLEYuY3VycmVudD1ILEgub25vcGVuPSgpPT57SSghMCkscihudWxsKX0sSC5vbmNsb3NlPSgpPT57SSghMSl9LEgub25lcnJvcj0oKT0+e3IoIldlYlNvY2tldCBjb25uZWN0aW9uIGZhaWxlZCIpLEkoITEpfTtsZXQgTj1uZXcgQWJvcnRDb250cm9sbGVyLEE9c2V0SW50ZXJ2YWwoKCk9PntQNChXMC5jdXJyZW50KSxXMC5jdXJyZW50PTB9LDEwMDApO3JldHVybihhc3luYygpPT57dHJ5e2xldCBTPShhd2FpdCBmZXRjaChpMCx7c2lnbmFsOk4uc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFTKXJldHVybjtsZXQgaD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6bCx2YWx1ZTp1fT1hd2FpdCBTLnJlYWQoKTtpZihsKWJyZWFrO2lmKHUpZm9yKGxldCBlMD0wO2UwPD11Lmxlbmd0aC1oLmxlbmd0aDtlMCsrKXtsZXQgRTQ9ITA7Zm9yKGxldCBJMD0wO0kwPGgubGVuZ3RoO0kwKyspaWYodVtlMCtJMF0hPT1oW0kwXSl7RTQ9ITE7YnJlYWt9aWYoRTQpVzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntOLmFib3J0KCksY2xlYXJJbnRlcnZhbChBKSxILmNsb3NlKCksRi5jdXJyZW50PW51bGx9fSxbWCxpMCxfXSksZCgoKT0+e2lmKCFfKXJldHVybjtsZXQgVj1zZXRJbnRlcnZhbCgoKT0+e1A0KFcwLmN1cnJlbnQpLFcwLmN1cnJlbnQ9MH0sMTAwMCk7cmV0dXJuKCk9PmNsZWFySW50ZXJ2YWwoVil9LFtfXSk7bGV0IGU9aigoKT0+e3JldHVybiBfP00uY3VycmVudDpDLmN1cnJlbnR9LFtfXSksQjA9aigoVixIKT0+e2xldCBOPWUoKTtpZighTilyZXR1cm47bGV0IEE9Ti5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxCPShILmNsaWVudFgtQS5sZWZ0KS9BLndpZHRoLFM9KEguY2xpZW50WS1BLnRvcCkvQS5oZWlnaHQ7Yyh7dHlwZTpWLHg6Qix5OlN9KX0sW2NdKSxRMD0zLGE9dyghMSksbz13KCExKSx1MD13KCExKSxyMD13KHtkeDowLGR5OjB9KSxWMD13KCExKSxbdDAsRjRdPXAoITEpLGs0PXcoe3g6MC41LHk6MC41fSksW3EwLHNdPXAobnVsbCk7ZCgoKT0+e2xldCBWPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpRjQoITApfSxIPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpe2lmKEY0KCExKSwhby5jdXJyZW50KXMobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxkKCgpPT57aWYodDAmJiFvLmN1cnJlbnQpe2xldCBWPWs0LmN1cnJlbnQ7cyh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIXQwJiYhby5jdXJyZW50KXMobnVsbCl9LFt0MF0pO2xldCBfMD13KG51bGwpLG4wPXcoITEpLEgwPXcoMCksSTQ9aigoVixIKT0+e24wLmN1cnJlbnQ9ITA7bGV0IE49XzAuY3VycmVudDtpZihOKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLEgwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57Ti5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLE4uc3R5bGUudG9wPWAke0gqMTAwfSVgLE4uc3R5bGUuZGlzcGxheT0iYmxvY2sifSl9LFtdKSxNND1qKChWLEgpPT57aWYoIW4wLmN1cnJlbnQpcmV0dXJuO2xldCBOPV8wLmN1cnJlbnQ7aWYoTiljYW5jZWxBbmltYXRpb25GcmFtZShIMC5jdXJyZW50KSxIMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e04uc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxOLnN0eWxlLnRvcD1gJHtIKjEwMH0lYH0pfSxbXSksRjA9aigoKT0+e24wLmN1cnJlbnQ9ITE7bGV0IFY9XzAuY3VycmVudDtpZihWKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLFYuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFtdKSxDND13KDApLE8wPXcobnVsbCksdjU9aigoKT0+e2xldCBWPURhdGUubm93KCksSD1WLUM0LmN1cnJlbnQ7aWYoQzQuY3VycmVudD1WLEg8MzAwKXtpZihPMC5jdXJyZW50KWNsZWFyVGltZW91dChPMC5jdXJyZW50KSxPMC5jdXJyZW50PW51bGw7aWYoSylLKCk7ZWxzZSBvMCgiYXBwX3N3aXRjaGVyIil9ZWxzZSBPMC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntpZihLKUsoKTtlbHNlIG8wKCJob21lIik7TzAuY3VycmVudD1udWxsfSwzMDApfSxbbzAsS10pLGswPSgoKT0+e2lmKCFmfHwhbSlyZXR1cm4gbnVsbDtpZihtLndpZHRoPT09MHx8bS5oZWlnaHQ9PT0wKXJldHVybiBudWxsO2xldCBWPU1hdGgubWluKG0ud2lkdGgvZi53aWR0aCxtLmhlaWdodC9mLmhlaWdodCk7cmV0dXJue3dpZHRoOmYud2lkdGgqVixoZWlnaHQ6Zi5oZWlnaHQqVn19KSgpO3JldHVybiAkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixmbGV4OjEsLi4uTz97fTp7Ym9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LG92ZXJmbG93OiJoaWRkZW4iLG1pbldpZHRoOjAsbWluSGVpZ2h0OjAsLi4uWn0sY2xhc3NOYW1lOnEsY2hpbGRyZW46WyQoImRpdiIse3JlZjp5LHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxtaW5IZWlnaHQ6MCxtaW5XaWR0aDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LGNoaWxkcmVuOiQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLHdpZHRoOmswP2Ake2swLndpZHRofXB4YDoiMTAwJSIsaGVpZ2h0OmswP2Ake2swLmhlaWdodH1weGA6IjEwMCUifSxjaGlsZHJlbjpbJCgiaW1nIix7cmVmOkMsc3JjOl8/dm9pZCAwOmkwLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKWkoKE4pPT5OJiZOLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJk4uaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P046e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6Xz97ZGlzcGxheToibm9uZSJ9Ontwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSxfJiYkKCJpbWciLHtyZWY6TSxkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClpKChOKT0+TiYmTi53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZOLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9OOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSwkKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpPNCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsdTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cjAuY3VycmVudD17ZHg6MS1BLUEsZHk6MS1CLUJ9LHMoUyksbih7dHlwZToiYmVnaW4iLC4uLlN9KTtyZXR1cm59aWYoSTQoQSxCKSxCPjAuODgpYS5jdXJyZW50PSEwLGMoe3R5cGU6ImJlZ2luIix4OkEseTpCLGVkZ2U6UTB9KTtlbHNlIGEuY3VycmVudD0hMSxCMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKGs0LmN1cnJlbnQ9e3g6QSx5OkJ9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KXMoe3gxOkEseTE6Qix4MjoxLUEseTI6MS1CfSk7cmV0dXJufWlmKG8uY3VycmVudCl7bGV0IFM7aWYodTAuY3VycmVudCl7bGV0IGg9cjAuY3VycmVudDtTPXt4MTpBLHkxOkIseDI6QStoLmR4LHkyOkIraC5keX19ZWxzZSBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cyhTKSxuKHt0eXBlOiJtb3ZlIiwuLi5TfSk7cmV0dXJufWlmKE00KEEsQiksYS5jdXJyZW50KWMoe3R5cGU6Im1vdmUiLHg6QSx5OkIsZWRnZTpRMH0pO2Vsc2UgQjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1lKCk7aWYoSCl7bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxBPShWLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLEI9KFYuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYodTAuY3VycmVudCl7bGV0IFM9cjAuY3VycmVudDtuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjpBK1MuZHgseTI6QitTLmR5fSl9ZWxzZSBuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjoxLUEseTI6MS1CfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1CMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKG8uY3VycmVudCl7aWYocTApbih7dHlwZToiZW5kIiwuLi5xMH0pO28uY3VycmVudD0hMSxzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1pZihWLmJ1dHRvbnM+MClCMCgiZW5kIixWKTtzKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtGMCgpO2xldCBoPVYudG91Y2hlc1swXSxsPVYudG91Y2hlc1sxXSx1PXt4MTooaC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MTooaC5jbGllbnRZLU4udG9wKS9OLmhlaWdodCx4MjoobC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MjoobC5jbGllbnRZLU4udG9wKS9OLmhlaWdodH07aWYoIVYwLmN1cnJlbnQmJiFhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OnUueDEseTp1LnkxfSk7VjAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYS5jdXJyZW50PSExLHModSksbih7dHlwZToiYmVnaW4iLC4uLnV9KTtyZXR1cm59bGV0IEE9Vi50b3VjaGVzWzBdO2lmKCFBKXJldHVybjtsZXQgQj0oQS5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxTPShBLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKEk0KEIsUyksUz4wLjg4KWEuY3VycmVudD0hMCxjKHt0eXBlOiJiZWdpbiIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBhLmN1cnJlbnQ9ITEsYyh7dHlwZToiYmVnaW4iLHg6Qix5OlN9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgaD1WLnRvdWNoZXNbMF0sbD1WLnRvdWNoZXNbMV0sdT17eDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6KGwuY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTI6KGwuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHR9O3ModSksbih7dHlwZToibW92ZSIsLi4udX0pO3JldHVybn1sZXQgQT1WLnRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoTTQoQixTKSxhLmN1cnJlbnQpYyh7dHlwZToibW92ZSIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBjKHt0eXBlOiJtb3ZlIix4OkIseTpTfSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBoPVYuY2hhbmdlZFRvdWNoZXNbMF0sbD1xMDtpZihoJiZsKW4oe3R5cGU6ImVuZCIseDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6bC54Mix5MjpsLnkyfSk7ZWxzZSBpZihsKW4oe3R5cGU6ImVuZCIsLi4ubH0pO1YwLmN1cnJlbnQ9ITEsby5jdXJyZW50PSExLHMobnVsbCl9cmV0dXJufWxldCBBPVYuY2hhbmdlZFRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoRjAoKSxhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OkIseTpTLGVkZ2U6UTB9KSxhLmN1cnJlbnQ9ITE7ZWxzZSBjKHt0eXBlOiJlbmQiLHg6Qix5OlN9KX19KSwkKCJkaXYiLHtyZWY6XzAsImRhdGEtdGVzdGlkIjoidG91Y2gtaW5kaWNhdG9yIixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJub25lIix3aWR0aDoyNCxoZWlnaHQ6MjQsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoNTksMTMwLDI0NiwwLjUpIixib3hTaGFkb3c6IjAgMCA4cHggcmdiYSg1OSwxMzAsMjQ2LDAuMykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19KSxxMCYmJCh4LHtjaGlsZHJlbjpbJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDEscTAueTEpfSksJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDIscTAueTIpfSldfSksIUUmJiF2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNH0sY2hpbGRyZW46IkNvbm5lY3RpbmcuLi4ifSl9KSx2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZjQ0Iixmb250U2l6ZToxNCxwYWRkaW5nOjIwLHRleHRBbGlnbjoiY2VudGVyIn0sY2hpbGRyZW46dn0pfSkscDUmJiQoImRpdiIse3N0eWxlOkE2LGNoaWxkcmVuOiQoInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmYmJmMjQiLGZvbnRTaXplOjEzLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSJ9LGNoaWxkcmVuOiJTbG93IGNvbm5lY3Rpb24ifSl9KV19KX0pLCFPJiYkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNHB4IDhweCIsYm9yZGVyVG9wOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LGNoaWxkcmVuOlskKCJidXR0b24iLHtvbkNsaWNrOnY1LHN0eWxlOntiYWNrZ3JvdW5kOiJub25lIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMikiLGNvbG9yOiIjYWFhIixmb250U2l6ZToxMSxmb250RmFtaWx5OiJtb25vc3BhY2UiLHBhZGRpbmc6IjJweCAxMHB4IixjdXJzb3I6InBvaW50ZXIiLGJvcmRlclJhZGl1czo0fSxjaGlsZHJlbjoiSG9tZSJ9KSwkKCJzcGFuIix7c3R5bGU6e2NvbG9yOkQ0PjA/IiM0ZjQiOiIjODg4Iixmb250U2l6ZToxMixmb250RmFtaWx5OiJtb25vc3BhY2UiLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjZ9LGNoaWxkcmVuOltrJiYkKCJzcGFuIix7ImRhdGEtdGVzdGlkIjoicXVhbGl0eS1kb3QiLHN0eWxlOnt3aWR0aDo4LGhlaWdodDo4LGJvcmRlclJhZGl1czoiNTAlIixkaXNwbGF5OiJpbmxpbmUtYmxvY2siLGJhY2tncm91bmQ6az09PSJnb29kIj8iIzRhZGU4MCI6az09PSJkZWdyYWRlZCI/IiNmYWNjMTUiOiIjZWY0NDQ0In19KSxENCwiIGZwcyJdfSldfSldfSl9dmFyIEE2PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDo4LGxlZnQ6IjUwJSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC01MCUpIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuNykiLGJvcmRlclJhZGl1czo2LHBhZGRpbmc6IjRweCAxMnB4Iixwb2ludGVyRXZlbnRzOiJub25lIn0sUzU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC44KSJ9LFQ1PTIwO2Z1bmN0aW9uIGI1KFgsWSl7cmV0dXJue3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDpgJHtYKjEwMH0lYCx0b3A6YCR7WSoxMDB9JWAsd2lkdGg6VDUsaGVpZ2h0OlQ1LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC43KSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX1mdW5jdGlvbiBkMChYKXtpZighWClyZXR1cm4iaXBob25lIjtsZXQgWT1YLnRvTG93ZXJDYXNlKCk7aWYoWS5pbmNsdWRlcygiaXBhZCIpKXJldHVybiJpcGFkIjtpZihZLmluY2x1ZGVzKCJ3YXRjaCIpKXJldHVybiJ3YXRjaCI7aWYoWS5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuInZpc2lvbiI7cmV0dXJuImlwaG9uZSJ9dmFyIFI9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LFU3PVIuaXBob25lLndpZHRoLEE3PVIuaXBob25lLmhlaWdodCxENz1SLmlwaG9uZS5iZXplbFgsUDc9Ui5pcGhvbmUuYmV6ZWxZLEI3PVIuaXBob25lLmlubmVyUmFkaXVzO2Z1bmN0aW9uIFU0KFg9ImlwaG9uZSIpe2xldCBZPVJbWF07cmV0dXJue3RvcDpgJHtZLmJlemVsWS9ZLmhlaWdodCoxMDB9JWAsbGVmdDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxyaWdodDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxib3R0b206YCR7WS5iZXplbFkvWS5oZWlnaHQqMTAwfSVgfX1mdW5jdGlvbiBtMChYPSJpcGhvbmUiKXtsZXQgWT1SW1hdLFo9WS53aWR0aC0yKlkuYmV6ZWxYLEo9WS5oZWlnaHQtMipZLmJlemVsWTtyZXR1cm5gJHtZLmlubmVyUmFkaXVzL1oqMTAwfSUgLyAke1kuaW5uZXJSYWRpdXMvSioxMDB9JWB9ZnVuY3Rpb24gaDAoe3R5cGU6WD0iaXBob25lIixzdHJlYW1pbmc6WT0hMX0pe3N3aXRjaChYKXtjYXNlImlwYWQiOnJldHVybiAkKEI2LHtzdHJlYW1pbmc6WX0pO2Nhc2Uid2F0Y2giOnJldHVybiAkKF82LHtzdHJlYW1pbmc6WX0pO2Nhc2UidmlzaW9uIjpyZXR1cm4gJChGNix7c3RyZWFtaW5nOll9KTtkZWZhdWx0OnJldHVybiAkKFA2LHtzdHJlYW1pbmc6WX0pfX1mdW5jdGlvbiBQNih7c3RyZWFtaW5nOlg9ITF9KXtyZXR1cm4gJCgic3ZnIix7dmlld0JveDoiMCAwIDQyNyA4ODEiLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjAiLHg6Ii0wLjE2Njk5MiIseToiMC4xNjY1MDQiLHdpZHRoOiI0MjciLGhlaWdodDoiODgwLjY2NyIsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiZWZmZWN0MV9mb3JlZ3JvdW5kQmx1ciJ9KV19KSwkKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjEiLHg6IjYuMzMyMzYiLHk6IjYuMzMzODIiLHdpZHRoOiI0MTQiLGhlaWdodDoiODY4IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuMzMzMzMzIixyZXN1bHQ6ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXIifSldfSldfSksJCgicmVjdCIse3g6IjMuODMyNjgiLHk6IjMuODMzNjYiLHdpZHRoOiI0MTkiLGhlaWdodDoiODczIixyeDoiNjYuMTY2NyIsc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiNC4zMzMzMyJ9KSwkKCJyZWN0Iix7eDoiMC44MzMzMzMiLHk6IjAuODMzMzMzIix3aWR0aDoiNDI1IixoZWlnaHQ6Ijg3OSIscng6IjY5LjE2NjciLHN0cm9rZToiIzM3MzczYSIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI2Nocm9tZS1maWx0ZXIwKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjEuNjY2MDIiLHk6IjIiLHdpZHRoOiI0MjMuMzMzIixoZWlnaHQ6Ijg3NyIscng6IjY4LjY2NjciLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjY2hyb21lLWZpbHRlcjEpIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiNy4zMzI2OCIseToiNy4zMzM2NiIsd2lkdGg6IjQxMiIsaGVpZ2h0OiI4NjYiLHJ4OiI2Mi42NjY3IixzdHJva2U6IiM2NDY0NjQiLHN0cm9rZVdpZHRoOiIwLjY2NjY2NyJ9KX0pLCQoInJlY3QiLHt4OiIxNTEuNjY2Iix5OiIzMS42NjciLHdpZHRoOiIxMjMuMzMzIixoZWlnaHQ6IjM2IixyeDoiMTgiLGZpbGw6ImJsYWNrIixzdHlsZTp7b3BhY2l0eTpYPzA6MSx0cmFuc2l0aW9uOiJvcGFjaXR5IDAuM3MgZWFzZSJ9fSldfSl9ZnVuY3Rpb24gQjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui5pcGFkLndpZHRoLFo9Ui5pcGFkLmhlaWdodCxKPTMwLHE9MjY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiaXBhZC1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJpcGFkLWdsb3cxIix4OiI1Iix5OiI1Iix3aWR0aDpZLTEwLGhlaWdodDpaLTEwLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46WyQoImZlRmxvb2QiLHtmbG9vZE9wYWNpdHk6IjAiLHJlc3VsdDoiQmFja2dyb3VuZEltYWdlRml4In0pLCQoImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluOiJTb3VyY2VHcmFwaGljIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJzaGFwZSJ9KSwkKCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC4zMzMzMzMiLHJlc3VsdDoiYmx1ciJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMy41Iix5OiIzLjUiLHdpZHRoOlktNyxoZWlnaHQ6Wi03LHJ4OjI2LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjQifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDozMCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mjksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MSkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiI2Iix5OiI2Iix3aWR0aDpZLTEyLGhlaWdodDpaLTEyLHJ4OjI0LHN0cm9rZToiIzY0NjQ2NCIsc3Ryb2tlV2lkdGg6IjAuNjY2In0pfSksJCgiY2lyY2xlIix7Y3g6WS8yLGN5OlIuaXBhZC5iZXplbFkvMisxLHI6IjMiLGZpbGw6IiMxYTFhMWEiLHN0eWxlOntvcGFjaXR5Olg/MDowLjgsdHJhbnNpdGlvbjoib3BhY2l0eSAwLjNzIGVhc2UifX0pLCQoInJlY3QiLHt4OihZLTEyMCkvMix5OlotUi5pcGFkLmJlemVsWS8yLTIuNSx3aWR0aDoiMTIwIixoZWlnaHQ6IjUiLHJ4OiIyLjUiLGZpbGw6IndoaXRlIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zNSxtaXhCbGVuZE1vZGU6ImRpZmZlcmVuY2UiLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX1mdW5jdGlvbiBfNih7c3RyZWFtaW5nOlg9ITF9KXtsZXQgWT1SLndhdGNoLndpZHRoLFo9Ui53YXRjaC5oZWlnaHQsSj04OCxxPTgyLEs9OCxRPTM2LHo9Wi8yLTE4LTE2LEc9MjIsTD1aLzItMTErMTY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixvdmVyZmxvdzoidmlzaWJsZSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjokKCJmaWx0ZXIiLHtpZDoid2F0Y2gtZ2xvdzAiLHg6IjAiLHk6IjAiLHdpZHRoOlkrMTIsaGVpZ2h0OlosZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiYmx1ciJ9KV19KX0pLCQoInJlY3QiLHt4OlktMix5Onosd2lkdGg6OCxoZWlnaHQ6MzYscng6IjMiLGZpbGw6IiMyYTJhMmMiLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEifSksJCgicmVjdCIse3g6WS0xLHk6TCx3aWR0aDo2LGhlaWdodDoyMixyeDoiMi41IixmaWxsOiIjMmEyYTJjIixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIwLjgifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDo4MixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzLjUifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDo4OCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjd2F0Y2gtZ2xvdzApIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiMS41Iix5OiIxLjUiLHdpZHRoOlktMyxoZWlnaHQ6Wi0zLHJ4Ojg3LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2In0pfSldfSl9ZnVuY3Rpb24gRjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui52aXNpb24ud2lkdGgsWj1SLnZpc2lvbi5oZWlnaHQsSj00MCxxPTM0O3JldHVybiAkKCJzdmciLHt2aWV3Qm94OmAwIDAgJHtZfSAke1p9YCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjpbJCgiZmlsdGVyIix7aWQ6InZpc2lvbi1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJ2aXNpb24tZ2xvdzEiLHg6IjUiLHk6IjUiLHdpZHRoOlktMTAsaGVpZ2h0OlotMTAsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjMzMyIscmVzdWx0OiJibHVyIn0pXX0pLCQoImxpbmVhckdyYWRpZW50Iix7aWQ6InZpc2lvbi1nbGFzcyIseDE6IjAiLHkxOiIwIix4MjoiMCIseTI6IjEiLGNoaWxkcmVuOlskKCJzdG9wIix7b2Zmc2V0OiIwJSIsc3RvcENvbG9yOiIjNTU1NTU4IixzdG9wT3BhY2l0eToiMC4zIn0pLCQoInN0b3AiLHtvZmZzZXQ6IjEwMCUiLHN0b3BDb2xvcjoiIzNhM2EzZCIsc3RvcE9wYWNpdHk6IjAuMSJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixyeDo0MCxmaWxsOiJ1cmwoI3Zpc2lvbi1nbGFzcykifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDozNCxzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzIn0pLCQoInJlY3QiLHt4OiIwLjgzMyIseToiMC44MzMiLHdpZHRoOlktMS42NjYsaGVpZ2h0OlotMS42NjYscng6NDAsc3Ryb2tlOiIjMzczNzNhIixzdHJva2VXaWR0aDoiMS42NjYifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI3Zpc2lvbi1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mzksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjdmlzaW9uLWdsb3cxKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjYiLHk6IjYiLHdpZHRoOlktMTIsaGVpZ2h0OlotMTIscng6MzIsc3Ryb2tlOiIjNjQ2NDY0IixzdHJva2VXaWR0aDoiMC42NjYifSl9KSwkKCJlbGxpcHNlIix7Y3g6WS8yLGN5OlovMixyeDpZLzItMzAscnk6Wi8yLTI0LHN0cm9rZToiIzRhNGE0ZCIsc3Ryb2tlV2lkdGg6IjAuNSIsb3BhY2l0eToiMC4zIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX12YXIgQTQ9ejAobnVsbCk7ZnVuY3Rpb24gZjAoWCl7bGV0IFk9UDAoQTQpO2lmKCFZKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWX12YXIgTTY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBDNih7ZXhlYzpYLGRldmljZVVkaWQ6WSxkZXZpY2VOYW1lOlosZGV2aWNlUnVudGltZTpKLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOks9ITEsY2hpbGRyZW46USxzdHlsZTp6LC4uLkd9KXtsZXQgTD1kMChaKSxXPXtleGVjOlgsZGV2aWNlVWRpZDpZLGRldmljZU5hbWU6WixkZXZpY2VSdW50aW1lOkosZGV2aWNlVHlwZTpMLHN0cmVhbWluZzpxLGRpc2FibGVkOkt8fCFZfHwhcX07cmV0dXJuICQoQTQuUHJvdmlkZXIse3ZhbHVlOlcsY2hpbGRyZW46JCgiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi5NNiwuLi56fSwuLi5HLGNoaWxkcmVuOlF9KX0pfXZhciBFNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sdzY9RzAoZnVuY3Rpb24oe25hbWU6WSxzdWJ0aXRsZTpaLGhpZGVDaGV2cm9uOkosc3R5bGU6cSxvbk1vdXNlRW50ZXI6Syxvbk1vdXNlTGVhdmU6USwuLi56fSxHKXtsZXQgTD1mMCgiVGl0bGUiKSxbRCxXXT1wKCExKSxPPVk/P0wuZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsVT1aPz8oTC5kZXZpY2VSdW50aW1lP0wuZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooayk9PntXKCEwKSxLPy4oayl9LG9uTW91c2VMZWF2ZTooayk9PntXKCExKSxRPy4oayl9LHN0eWxlOnsuLi5FNixiYWNrZ3JvdW5kOkQ/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi56LGNoaWxkcmVuOlskKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W08sIUomJiQoInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46JCgicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksJCgic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46VX0pXX0pfSksUzY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBUNih7c3R5bGU6WCwuLi5ZfSl7cmV0dXJuICQoImRpdiIse3N0eWxlOnsuLi5TNiwuLi5YfSwuLi5ZfSl9dmFyIGI2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LGEwPUcwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlksc3R5bGU6WixkaXNhYmxlZDpKLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpLLGNoaWxkcmVuOlEsLi4uen0sRyl7bGV0IEw9UDAoQTQpLEQ9Snx8WXx8TD8uZGlzYWJsZWQsW1csT109cCghMSk7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6RCxvbk1vdXNlRW50ZXI6KFUpPT57TyghMCkscT8uKFUpfSxvbk1vdXNlTGVhdmU6KFUpPT57TyghMSksSz8uKFUpfSxzdHlsZTp7Li4uYjYsY29sb3I6RD8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDpXJiYhRD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpEPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLlp9LC4uLnosY2hpbGRyZW46UX0pfSk7ZnVuY3Rpb24gcDYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFkpPT5gLWUgJyR7WX0nYCkucmVkdWNlKChZLFopPT5gJHtZfSAke1p9YCwib3Nhc2NyaXB0Iil9dmFyIHY2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOiQoInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxqNj0kKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbJCgicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLCQoImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLFI2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46JCgicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSkseTY9RzAoZnVuY3Rpb24oe29uQ2xpY2s6WSwuLi5afSxKKXtsZXQgcT1mMCgiSG9tZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMocDYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5aLGNoaWxkcmVuOnY2fSl9KSxnNj1HMChmdW5jdGlvbih7b25DbGljazpZLC4uLlp9LEope2xldCBxPWYwKCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuICQoYTAse3JlZjpKLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooSyk9PntpZihZPy4oSyksSy5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLlosY2hpbGRyZW46ajZ9KX0pLHg2PUcwKGZ1bmN0aW9uKHtvbkNsaWNrOlksLi4uWn0sSil7bGV0IHE9ZjAoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5aLGNoaWxkcmVuOlI2fSl9KSwkMD1DNjskMC5UaXRsZT13NjskMC5BY3Rpb25zPVQ2OyQwLkJ1dHRvbj1hMDskMC5Ib21lQnV0dG9uPXk2OyQwLlNjcmVlbnNob3RCdXR0b249ZzY7JDAuUm90YXRlQnV0dG9uPXg2O2Z1bmN0aW9uIGQ2KFgpe2xldFtZLFpdPXAobnVsbCksSj13KG5ldyBTZXQpLFtxLEtdPXAobnVsbCksUT1qKCh6KT0+e3JldHVybiBKLmN1cnJlbnQuYWRkKHopLCgpPT57Si5jdXJyZW50LmRlbGV0ZSh6KX19LFtdKTtyZXR1cm4gZCgoKT0+e2lmKCFYKXJldHVybjtsZXQgej1uZXcgQWJvcnRDb250cm9sbGVyLEc9WC5yZXBsYWNlKC9cL3N0cmVhbVwubWpwZWckLywiIik7cmV0dXJuIGZldGNoKGAke0d9L2NvbmZpZ2Ase3NpZ25hbDp6LnNpZ25hbH0pLnRoZW4oKEwpPT5MLmpzb24oKSkudGhlbigoTCk9PntpZihMLndpZHRoPjAmJkwuaGVpZ2h0PjApWihMKX0pLmNhdGNoKCgpPT57fSksKGFzeW5jKCk9Pnt0cnl7bGV0IEQ9KGF3YWl0IGZldGNoKFgse3NpZ25hbDp6LnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighRClyZXR1cm47bGV0IFc9bmV3IFVpbnQ4QXJyYXkoMCk7d2hpbGUoITApe2xldHtkb25lOk8sdmFsdWU6VX09YXdhaXQgRC5yZWFkKCk7aWYoTylicmVhaztsZXQgaz1uZXcgVWludDhBcnJheShXLmxlbmd0aCtVLmxlbmd0aCk7ay5zZXQoVyksay5zZXQoVSxXLmxlbmd0aCksVz1rO3doaWxlKCEwKXtsZXQgXz0tMTtmb3IobGV0IEk9MDtJPFcubGVuZ3RoLTE7SSsrKWlmKFdbSV09PT0yNTUmJldbSSsxXT09PTIxNil7Xz1JO2JyZWFrfWlmKF89PT0tMSlicmVhaztsZXQgQz0tMTtmb3IobGV0IEk9XysyO0k8Vy5sZW5ndGgtMTtJKyspaWYoV1tJXT09PTI1NSYmV1tJKzFdPT09MjE3KXtDPUkrMjticmVha31pZihDPT09LTEpYnJlYWs7bGV0IE09Vy5zbGljZShfLEMpO1c9Vy5zbGljZShDKTtsZXQgRj1uZXcgQmxvYihbTV0se3R5cGU6ImltYWdlL2pwZWcifSksRT1VUkwuY3JlYXRlT2JqZWN0VVJMKEYpO0soRSk7Zm9yKGxldCBJIG9mIEouY3VycmVudClJKEUpfX19Y2F0Y2h7fX0pKCksKCk9PnouYWJvcnQoKX0sW1hdKSx7c3Vic2NyaWJlRnJhbWU6USxmcmFtZTpxLGNvbmZpZzpZfX1mdW5jdGlvbiBtNigpe2xldCBYPXdpbmRvdy5fX1NJTV9QUkVWSUVXX18sW1ksWl09cCghMSk7aWYoZCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBPPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksVT1uZXcgTWFwLGs9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBfKEYpe2xldCBFPVUuZ2V0KEYpO2lmKCFFKXtsZXQgST0wO2ZvcihsZXQgdj0wO3Y8Ri5sZW5ndGg7disrKUk9KEk8PDUpLUkrRi5jaGFyQ29kZUF0KHYpfDA7RT1rW01hdGguYWJzKEkpJWsubGVuZ3RoXSxVLnNldChGLEUpfXJldHVybiBFfWxldCBDPSIiLE09ITE7cmV0dXJuIE8ub25tZXNzYWdlPShGKT0+e3RyeXtsZXQgRT1KU09OLnBhcnNlKEYuZGF0YSksST1FLnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P0Uuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIix2PUUuc3Vic3lzdGVtPz8iIixyPUUuY2F0ZWdvcnk/PyIiLGY9RS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFmKXJldHVybjtpZihJIT09Qyl7aWYoTSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IGMwPV8oSSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke0l9JHt2P2AgJWMke3Z9JHtyPyI6IityOiIifWA6IiJ9YCxgY29sb3I6JHtjMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4udj9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLE09ITAsQz1JfWxldCBpPShFLm1lc3NhZ2VUeXBlPz8iIikudG9Mb3dlckNhc2UoKSx5PXYmJkk9PT1DP2AlYyR7cnx8dn0lYyBgOiIiLG09eT9bImNvbG9yOiM4ODg7Zm9udC1zdHlsZTppdGFsaWMiLCJjb2xvcjppbmhlcml0Il06W107aWYoaT09PSJmYXVsdCJ8fGk9PT0iZXJyb3IiKWNvbnNvbGUubG9nKGAke3l9JWMke2Z9YCwuLi5tLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihpPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt5fSVjJHtmfWAsLi4ubSwiY29sb3I6IzYyNzJhNCIpO2Vsc2UgY29uc29sZS5sb2coYCR7eX0lYyR7Zn1gLC4uLm0sImNvbG9yOmluaGVyaXQiKX1jYXRjaHt9fSwoKT0+e2lmKE0pY29uc29sZS5ncm91cEVuZCgpO08uY2xvc2UoKX19LFtYPy5sb2dzRW5kcG9pbnRdKSwhWClyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjokKCJkaXYiLHtzdHlsZTpKMC5lbXB0eSxjaGlsZHJlbjpbJCgiaDEiLHtzdHlsZTpKMC5lbXB0eVRpdGxlLGNoaWxkcmVuOiJObyBzZXJ2ZS1zaW0gc3RyZWFtIHJ1bm5pbmcifSksJCgicCIse3N0eWxlOkowLmVtcHR5SGludCxjaGlsZHJlbjpbIkJvb3QgYW4gaU9TIHNpbXVsYXRvciBhbmQgc3RhcnQgYSBIYXRjaCBzdHJlYW0gd2l0aCIsIiAiLCQoImNvZGUiLHtzdHlsZTpKMC5jb2RlLGNoaWxkcmVuOiJidW54IHNlcnZlLXNpbSAtLWRldGFjaCJ9KSwiLCB0aGVuIHJlbG9hZC4iXX0pXX0pfSk7bGV0IEo9Ui5pcGhvbmUscT1VNCgiaXBob25lIiksSz1tMCgiaXBob25lIiksUT1kNihYLnN0cmVhbVVybCksej13KG51bGwpO2QoKCk9PntsZXQgTz1uZXcgV2ViU29ja2V0KFgud3NVcmwpO3JldHVybiBPLmJpbmFyeVR5cGU9ImFycmF5YnVmZmVyIix6LmN1cnJlbnQ9TywoKT0+e08uY2xvc2UoKSx6LmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IEc9aigoTyxVKT0+e2xldCBrPXouY3VycmVudDtpZigha3x8ay5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBfPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShVKSksQz1uZXcgVWludDhBcnJheSgxK18ubGVuZ3RoKTtDWzBdPU8sQy5zZXQoXywxKSxrLnNlbmQoQyl9LFtdKSxMPWooKE8pPT5HKDMsTyksW0ddKSxEPWooKE8pPT5HKDUsTyksW0ddKSxXPWooKE8pPT5HKDQse2J1dHRvbjpPfSksW0ddKTtyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjpbJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWF4V2lkdGg6MzIwLHdpZHRoOiIxMDAlIixhc3BlY3RSYXRpbzpgJHtKLndpZHRofSAvICR7Si5oZWlnaHR9YH0sY2hpbGRyZW46WyQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLnF9LGNoaWxkcmVuOiQoeDAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOkssY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOlosb25TdHJlYW1Ub3VjaDpMLG9uU3RyZWFtTXVsdGlUb3VjaDpELG9uU3RyZWFtQnV0dG9uOlcsc3Vic2NyaWJlRnJhbWU6US5zdWJzY3JpYmVGcmFtZSxzdHJlYW1GcmFtZTpRLmZyYW1lLHN0cmVhbUNvbmZpZzpRLmNvbmZpZ30pfSksJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxwb2ludGVyRXZlbnRzOiJub25lIix6SW5kZXg6MTB9LGNoaWxkcmVuOiQoaDAse3R5cGU6ImlwaG9uZSIsc3RyZWFtaW5nOll9KX0pXX0pLCQoImRpdiIse3N0eWxlOkowLmJhcixjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6ey4uLkowLmxpdmUsY29sb3I6WT8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbJCgic3BhbiIse3N0eWxlOnsuLi5KMC5kb3QsYmFja2dyb3VuZDpZPyIjNGFkZTgwIjoiIzY2NiJ9fSksWT8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIEowPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX07SDUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJvb3QiKSkucmVuZGVyKCQobTYse30pKTsKPC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+","base64").toString("utf-8");return $}function y(U){let B=(U?.basePath??"/.sim").replace(/\/+$/,"");return(G,z,w)=>{let M=G.url??"";if(M===B||M===B+"/"){let V=Z()[0]??null,K=D();if(V){let X=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...V,logsEndpoint:B+"/logs"})}</script>`;K=K.replace("<!--__SIM_PREVIEW_CONFIG__-->",X)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(K);return}if(M===B+"/api"){let Q=Z();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(Q[0]||null));return}if(M===B+"/logs"||M.startsWith(B+"/logs?")){let Q=Z();if(Q.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=Q[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
2
+ import{readdirSync as g,readFileSync as y,existsSync as N,unlinkSync as F}from"fs";import{execSync as R,spawn as U,exec as q,execFile as k}from"child_process";import{tmpdir as _}from"os";import{join as w}from"path";var B=w(_(),"serve-sim"),I=new Set(["host.exp.Exponent","dev.expo.Exponent"]),v=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],f=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;function m(Y){return!f.test(Y)}function p(Y,J){if(I.has(J))return Promise.resolve(!0);return new Promise((Q)=>{k("xcrun",["simctl","get_app_container",Y,J,"app"],{timeout:2000},(z,Z)=>{if(z)return Q(!1);let C=Z.trim();if(!C)return Q(!1);for(let X of v)if(N(w(C,X)))return Q(!0);Q(!1)})})}var O={at:0,booted:null};function S(){let Y=Date.now();if(O.booted&&Y-O.at<1500)return O.booted;try{let J=R("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),Q=JSON.parse(J),z=new Set;for(let Z of Object.values(Q.devices))for(let C of Z)if(C.state==="Booted")z.add(C.udid);return O={at:Y,booted:z},z}catch{return null}}function L(){let Y;try{Y=g(B).filter((z)=>z.startsWith("server-")&&z.endsWith(".json"))}catch{return[]}let J=S(),Q=[];for(let z of Y){let Z=w(B,z);try{let C=JSON.parse(y(Z,"utf-8"));try{process.kill(C.pid,0)}catch{try{F(Z)}catch{}continue}if(J&&!J.has(C.device)){try{process.kill(C.pid,"SIGTERM")}catch{}try{F(Z)}catch{}continue}Q.push(C)}catch{}}return Q}var A=null;function h(){if(!A)A=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLEMsVSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZNW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLEM9QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8QyxBKSksVT09bnVsbCYmQyE9bnVsbCYmKFU9QyksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLEMsVSxrLEksTSxoLEUsZSxaMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsQyxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLEMpKSxnPU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLEMsVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIU0mJihNP0EubG9jYWxOYW1lPT1NOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP0M9QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEseCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTt4KCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO3goKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxNLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO3goKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTt4KCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSx4KCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIWd8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC9nLndpZHRoLHIuaGVpZ2h0L2cuaGVpZ2h0KTtyZXR1cm57d2lkdGg6Zy53aWR0aCpWLGhlaWdodDpnLmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W0MmJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpDPT09Imdvb2QiPyIjNGFkZTgwIjpDPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooQyk9PnskKCEwKSxRPy4oQyl9LG9uTW91c2VMZWF2ZTooQyk9PnskKCExKSxLPy4oQyl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiB4KCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBDPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtDLnNldCgkKSxDLnNldChBLCQubGVuZ3RoKSwkPUM7d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBNPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoTSk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO3goKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLEM9WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLEMmJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoQy5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOkMubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBNPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFNKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOk0/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOk0/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6TT8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpNPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKHgoKCk9PntBKCl9LFtBXSkseCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxVPWswKEM/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLFUwPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTt4KCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return A}function o(Y){let J=(Y?.basePath??"/.sim").replace(/\/+$/,"");return(Q,z,Z)=>{let C=Q.url??"";if(C===J||C===J+"/"){let V=L()[0]??null,W=h();if(V){let H=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...V,logsEndpoint:J+"/logs"})}</script>`;W=W.replace("<!--__SIM_PREVIEW_CONFIG__-->",H)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(W);return}if(C===J+"/api"){let X=L();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(X[0]||null));return}if((C===J+"/exec"||C===J+"/exec/")&&Q.method==="POST"){let X="";Q.on("data",(V)=>{X+=typeof V==="string"?V:V.toString()}),Q.on("end",()=>{let V="";try{V=JSON.parse(X).command??""}catch{}if(!V){z.writeHead(400,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}q(V,{maxBuffer:16777216},(W,$,H)=>{z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:$.toString(),stderr:H.toString(),exitCode:W?W.code??1:0}))})});return}if(C===J+"/logs"||C.startsWith(J+"/logs?")){let X=L();if(X.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=X[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
3
3
 
4
- `);let K=j("xcrun",["simctl","spawn",V,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),L="";K.stdout.on("data",(X)=>{L+=X.toString();let Y;while((Y=L.indexOf(`
5
- `))!==-1){let C=L.slice(0,Y).trim();if(L=L.slice(Y+1),C)z.write("data: "+C+`
4
+ `);let W=U("xcrun",["simctl","spawn",V,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),$="";W.stdout.on("data",(H)=>{$+=H.toString();let G;while((G=$.indexOf(`
5
+ `))!==-1){let M=$.slice(0,G).trim();if($=$.slice(G+1),M)z.write("data: "+M+`
6
6
 
7
- `)}}),K.on("close",()=>z.end()),G.on("close",()=>K.kill());return}if(w)w()}}export{y as simMiddleware};
7
+ `)}}),W.on("close",()=>z.end()),Q.on("close",()=>W.kill());return}if(C===J+"/appstate"||C.startsWith(J+"/appstate?")){let X=L();if(X.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=X[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
8
+
9
+ `);let W=U("xcrun",["simctl","spawn",V,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),$=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,H="",G="";W.stdout.on("data",(M)=>{G+=M.toString();let P;while((P=G.indexOf(`
10
+ `))!==-1){let T=G.slice(0,P).trim();if(G=G.slice(P+1),!T)continue;let D;try{D=JSON.parse(T).eventMessage??""}catch{continue}let j=$.exec(D);if(!j)continue;let K=j[1],E=parseInt(j[2],10);if(!m(K))continue;if(K===H)continue;H=K,p(V,K).then((x)=>{z.write("data: "+JSON.stringify({bundleId:K,pid:E,isReactNative:x})+`
11
+
12
+ `)})}}),W.on("close",()=>z.end()),Q.on("close",()=>W.kill());return}if(Z)Z()}}export{o as simMiddleware};
package/dist/serve-sim.js CHANGED
@@ -1,17 +1,22 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var $e=Object.defineProperty;var ye=(e,_)=>{for(var t in _)$e(e,t,{get:_[t],enumerable:!0,configurable:!0,set:(C)=>_[t]=()=>C})};var ce=(e,_)=>()=>(e&&(_=e(e=0)),_);var U={};ye(U,{simMiddleware:()=>ge});import{readdirSync as pe,readFileSync as He}from"fs";import{spawn as Te}from"child_process";import{tmpdir as ue}from"os";import{join as P}from"path";function N(){let e;try{e=pe(k).filter((t)=>t.startsWith("server-")&&t.endsWith(".json"))}catch{return[]}let _=[];for(let t of e)try{let C=JSON.parse(He(P(k,t),"utf-8"));try{process.kill(C.pid,0),_.push(C)}catch{}}catch{}return _}function le(){if(!V)V=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYjAsUCxiNCxqNSxLMCx3NCxwNCx2NCxYNCxDMCxVMCxqNCxLNCxZNCxaNCxSNCx3MD17fSxTMD1bXSxSNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLEEwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gWDAoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gUTQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gWTAoWCxZLFope3ZhciBKLHEsSyxRPXt9O2ZvcihLIGluIFkpSz09ImtleSI/Sj1ZW0tdOks9PSJyZWYiP3E9WVtLXTpRW0tdPVlbS107aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoUS5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YjAuY2FsbChhcmd1bWVudHMsMik6WiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihLIGluIFguZGVmYXVsdFByb3BzKVFbS109PT12b2lkIDAmJihRW0tdPVguZGVmYXVsdFByb3BzW0tdKTtyZXR1cm4gRTAoWCxRLEoscSxudWxsKX1mdW5jdGlvbiBFMChYLFksWixKLHEpe3ZhciBLPXt0eXBlOlgscHJvcHM6WSxrZXk6WixyZWY6SixfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmUC52bm9kZSE9bnVsbCYmUC52bm9kZShLKSxLfWZ1bmN0aW9uIHgoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gZyhYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX1mdW5jdGlvbiBMMChYLFkpe2lmKFk9PW51bGwpcmV0dXJuIFguX18/TDAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgWjtZPFguX19rLmxlbmd0aDtZKyspaWYoKFo9WC5fX2tbWV0pIT1udWxsJiZaLl9fZSE9bnVsbClyZXR1cm4gWi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/TDAoWCk6bnVsbH1mdW5jdGlvbiB5NShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBZPVguX192LFo9WS5fX2UsSj1bXSxxPVtdLEs9WDAoe30sWSk7Sy5fX3Y9WS5fX3YrMSxQLnZub2RlJiZQLnZub2RlKEspLCQ0KFguX19QLEssWSxYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWS5fX3U/W1pdOm51bGwsSixaPT1udWxsP0wwKFkpOlosISEoMzImWS5fX3UpLHEpLEsuX192PVkuX192LEsuX18uX19rW0suX19pXT1LLGQ0KEosSyxxKSxZLl9fZT1ZLl9fPW51bGwsSy5fX2UhPVomJnk0KEspfX1mdW5jdGlvbiB5NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFkpe2lmKFkhPW51bGwmJlkuX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVkuX19lfSkseTQoWCl9ZnVuY3Rpb24gSjQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmSzAucHVzaChYKSYmIVQwLl9fcisrfHx3NCE9UC5kZWJvdW5jZVJlbmRlcmluZykmJigodzQ9UC5kZWJvdW5jZVJlbmRlcmluZyl8fHA0KShUMCl9ZnVuY3Rpb24gVDAoKXt0cnl7Zm9yKHZhciBYLFk9MTtLMC5sZW5ndGg7KUswLmxlbmd0aD5ZJiZLMC5zb3J0KHY0KSxYPUswLnNoaWZ0KCksWT1LMC5sZW5ndGgseTUoWCl9ZmluYWxseXtLMC5sZW5ndGg9VDAuX19yPTB9fWZ1bmN0aW9uIGc0KFgsWSxaLEoscSxLLFEseixHLEwsRCl7dmFyIFcsTyxVLGssXyxDLE0sRj1KJiZKLl9fa3x8UzAsRT1ZLmxlbmd0aDtmb3IoRz1nNShaLFksRixHLEUpLFc9MDtXPEU7VysrKShVPVouX19rW1ddKSE9bnVsbCYmKE89VS5fX2khPS0xJiZGW1UuX19pXXx8dzAsVS5fX2k9VyxDPSQ0KFgsVSxPLHEsSyxRLHosRyxMLEQpLGs9VS5fX2UsVS5yZWYmJk8ucmVmIT1VLnJlZiYmKE8ucmVmJiZXNChPLnJlZixudWxsLFUpLEQucHVzaChVLnJlZixVLl9fY3x8ayxVKSksXz09bnVsbCYmayE9bnVsbCYmKF89ayksKE09ISEoNCZVLl9fdSkpfHxPLl9faz09PVUuX19rPyhHPXg0KFUsRyxYLE0pLE0mJk8uX19lJiYoTy5fX2U9bnVsbCkpOnR5cGVvZiBVLnR5cGU9PSJmdW5jdGlvbiImJkMhPT12b2lkIDA/Rz1DOmsmJihHPWsubmV4dFNpYmxpbmcpLFUuX191Jj0tNyk7cmV0dXJuIFouX19lPV8sR31mdW5jdGlvbiBnNShYLFksWixKLHEpe3ZhciBLLFEseixHLEwsRD1aLmxlbmd0aCxXPUQsTz0wO2ZvcihYLl9faz1BcnJheShxKSxLPTA7SzxxO0srKykoUT1ZW0tdKSE9bnVsbCYmdHlwZW9mIFEhPSJib29sZWFuIiYmdHlwZW9mIFEhPSJmdW5jdGlvbiI/KHR5cGVvZiBRPT0ic3RyaW5nInx8dHlwZW9mIFE9PSJudW1iZXIifHx0eXBlb2YgUT09ImJpZ2ludCJ8fFEuY29uc3RydWN0b3I9PVN0cmluZz9RPVguX19rW0tdPUUwKG51bGwsUSxudWxsLG51bGwsbnVsbCk6QTAoUSk/UT1YLl9fa1tLXT1FMCh4LHtjaGlsZHJlbjpRfSxudWxsLG51bGwsbnVsbCk6US5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmUS5fX2I+MD9RPVguX19rW0tdPUUwKFEudHlwZSxRLnByb3BzLFEua2V5LFEucmVmP1EucmVmOm51bGwsUS5fX3YpOlguX19rW0tdPVEsRz1LK08sUS5fXz1YLFEuX19iPVguX19iKzEsej1udWxsLChMPVEuX19pPXg1KFEsWixHLFcpKSE9LTEmJihXLS0sKHo9WltMXSkmJih6Ll9fdXw9MikpLHo9PW51bGx8fHouX192PT1udWxsPyhMPT0tMSYmKHE+RD9PLS06cTxEJiZPKyspLHR5cGVvZiBRLnR5cGUhPSJmdW5jdGlvbiImJihRLl9fdXw9NCkpOkwhPUcmJihMPT1HLTE/Ty0tOkw9PUcrMT9PKys6KEw+Rz9PLS06TysrLFEuX191fD00KSkpOlguX19rW0tdPW51bGw7aWYoVylmb3IoSz0wO0s8RDtLKyspKHo9WltLXSkhPW51bGwmJigyJnouX191KT09MCYmKHouX19lPT1KJiYoSj1MMCh6KSksaDQoeix6KSk7cmV0dXJuIEp9ZnVuY3Rpb24geDQoWCxZLFosSil7dmFyIHEsSztpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxLPTA7cSYmSzxxLmxlbmd0aDtLKyspcVtLXSYmKHFbS10uX189WCxZPXg0KHFbS10sWSxaLEopKTtyZXR1cm4gWX1YLl9fZSE9WSYmKEomJihZJiZYLnR5cGUmJiFZLnBhcmVudE5vZGUmJihZPUwwKFgpKSxaLmluc2VydEJlZm9yZShYLl9fZSxZfHxudWxsKSksWT1YLl9fZSk7ZG8gWT1ZJiZZLm5leHRTaWJsaW5nO3doaWxlKFkhPW51bGwmJlkubm9kZVR5cGU9PTgpO3JldHVybiBZfWZ1bmN0aW9uIFowKFgsWSl7cmV0dXJuIFk9WXx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KEEwKFgpP1guc29tZShmdW5jdGlvbihaKXtaMChaLFkpfSk6WS5wdXNoKFgpKSxZfWZ1bmN0aW9uIHg1KFgsWSxaLEope3ZhciBxLEssUSx6PVgua2V5LEc9WC50eXBlLEw9WVtaXSxEPUwhPW51bGwmJigyJkwuX191KT09MDtpZihMPT09bnVsbCYmej09bnVsbHx8RCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gWjtpZihKPihEPzE6MCkpe2ZvcihxPVotMSxLPVorMTtxPj0wfHxLPFkubGVuZ3RoOylpZigoTD1ZW1E9cT49MD9xLS06SysrXSkhPW51bGwmJigyJkwuX191KT09MCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gUX1yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFksWil7WVswXT09Ii0iP1guc2V0UHJvcGVydHkoWSxaPT1udWxsPyIiOlopOlhbWV09Wj09bnVsbD8iIjp0eXBlb2YgWiE9Im51bWJlciJ8fFI1LnRlc3QoWSk/WjpaKyJweCJ9ZnVuY3Rpb24gTTAoWCxZLFosSixxKXt2YXIgSyxRO1g6aWYoWT09InN0eWxlIilpZih0eXBlb2YgWj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PVo7ZWxzZXtpZih0eXBlb2YgSj09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9Sj0iIiksSilmb3IoWSBpbiBKKVomJlkgaW4gWnx8UzQoWC5zdHlsZSxZLCIiKTtpZihaKWZvcihZIGluIFopSiYmWltZXT09SltZXXx8UzQoWC5zdHlsZSxZLFpbWV0pfWVsc2UgaWYoWVswXT09Im8iJiZZWzFdPT0ibiIpSz1ZIT0oWT1ZLnJlcGxhY2UoajQsIiQxIikpLFE9WS50b0xvd2VyQ2FzZSgpLFk9USBpbiBYfHxZPT0ib25Gb2N1c091dCJ8fFk9PSJvbkZvY3VzSW4iP1Euc2xpY2UoMik6WS5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtZK0tdPVosWj9KP1pbVTBdPUpbVTBdOihaW1UwXT1LNCxYLmFkZEV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilZPVkucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWSE9IndpZHRoIiYmWSE9ImhlaWdodCImJlkhPSJocmVmIiYmWSE9Imxpc3QiJiZZIT0iZm9ybSImJlkhPSJ0YWJJbmRleCImJlkhPSJkb3dubG9hZCImJlkhPSJyb3dTcGFuIiYmWSE9ImNvbFNwYW4iJiZZIT0icm9sZSImJlkhPSJwb3BvdmVyIiYmWSBpbiBYKXRyeXtYW1ldPVo9PW51bGw/IiI6WjticmVhayBYfWNhdGNoKHope310eXBlb2YgWj09ImZ1bmN0aW9uInx8KFo9PW51bGx8fFo9PT0hMSYmWVs0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFkpOlguc2V0QXR0cmlidXRlKFksWT09InBvcG92ZXIiJiZaPT0xPyIiOlopKX19ZnVuY3Rpb24gVDQoWCl7cmV0dXJuIGZ1bmN0aW9uKFkpe2lmKHRoaXMubCl7dmFyIFo9dGhpcy5sW1kudHlwZStYXTtpZihZW0MwXT09bnVsbClZW0MwXT1LNCsrO2Vsc2UgaWYoWVtDMF08WltVMF0pcmV0dXJuO3JldHVybiBaKFAuZXZlbnQ/UC5ldmVudChZKTpZKX19fWZ1bmN0aW9uICQ0KFgsWSxaLEoscSxLLFEseixHLEwpe3ZhciBELFcsTyxVLGssXyxDLE0sRixFLEksdixyLGYsaSx5PVkudHlwZTtpZihZLmNvbnN0cnVjdG9yIT09dm9pZCAwKXJldHVybiBudWxsOzEyOCZaLl9fdSYmKEc9ISEoMzImWi5fX3UpLEs9W3o9WS5fX2U9Wi5fX2VdKSwoRD1QLl9fYikmJkQoWSk7WDppZih0eXBlb2YgeT09ImZ1bmN0aW9uIil0cnl7aWYoTT1ZLnByb3BzLEY9eS5wcm90b3R5cGUmJnkucHJvdG90eXBlLnJlbmRlcixFPShEPXkuY29udGV4dFR5cGUpJiZKW0QuX19jXSxJPUQ/RT9FLnByb3BzLnZhbHVlOkQuX186SixaLl9fYz9DPShXPVkuX19jPVouX19jKS5fXz1XLl9fRTooRj9ZLl9fYz1XPW5ldyB5KE0sSSk6KFkuX19jPVc9bmV3IGcoTSxJKSxXLmNvbnN0cnVjdG9yPXksVy5yZW5kZXI9bTUpLEUmJkUuc3ViKFcpLFcuc3RhdGV8fChXLnN0YXRlPXt9KSxXLl9fbj1KLE89Vy5fX2Q9ITAsVy5fX2g9W10sVy5fc2I9W10pLEYmJlcuX19zPT1udWxsJiYoVy5fX3M9Vy5zdGF0ZSksRiYmeS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMhPW51bGwmJihXLl9fcz09Vy5zdGF0ZSYmKFcuX19zPVgwKHt9LFcuX19zKSksWDAoVy5fX3MseS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoTSxXLl9fcykpKSxVPVcucHJvcHMsaz1XLnN0YXRlLFcuX192PVksTylGJiZ5LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09bnVsbCYmVy5jb21wb25lbnRXaWxsTW91bnQhPW51bGwmJlcuY29tcG9uZW50V2lsbE1vdW50KCksRiYmVy5jb21wb25lbnREaWRNb3VudCE9bnVsbCYmVy5fX2gucHVzaChXLmNvbXBvbmVudERpZE1vdW50KTtlbHNle2lmKEYmJnkuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiZNIT09VSYmVy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT1udWxsJiZXLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoTSxJKSxZLl9fdj09Wi5fX3Z8fCFXLl9fZSYmVy5zaG91bGRDb21wb25lbnRVcGRhdGUhPW51bGwmJlcuc2hvdWxkQ29tcG9uZW50VXBkYXRlKE0sVy5fX3MsSSk9PT0hMSl7WS5fX3YhPVouX192JiYoVy5wcm9wcz1NLFcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEpLFkuX19lPVouX19lLFkuX19rPVouX19rLFkuX19rLnNvbWUoZnVuY3Rpb24obSl7bSYmKG0uX189WSl9KSxTMC5wdXNoLmFwcGx5KFcuX19oLFcuX3NiKSxXLl9zYj1bXSxXLl9faC5sZW5ndGgmJlEucHVzaChXKTticmVhayBYfVcuY29tcG9uZW50V2lsbFVwZGF0ZSE9bnVsbCYmVy5jb21wb25lbnRXaWxsVXBkYXRlKE0sVy5fX3MsSSksRiYmVy5jb21wb25lbnREaWRVcGRhdGUhPW51bGwmJlcuX19oLnB1c2goZnVuY3Rpb24oKXtXLmNvbXBvbmVudERpZFVwZGF0ZShVLGssXyl9KX1pZihXLmNvbnRleHQ9SSxXLnByb3BzPU0sVy5fX1A9WCxXLl9fZT0hMSx2PVAuX19yLHI9MCxGKVcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFMwLnB1c2guYXBwbHkoVy5fX2gsVy5fc2IpLFcuX3NiPVtdO2Vsc2UgZG8gVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFcuc3RhdGU9Vy5fX3M7d2hpbGUoVy5fX2QmJisrcjwyNSk7Vy5zdGF0ZT1XLl9fcyxXLmdldENoaWxkQ29udGV4dCE9bnVsbCYmKEo9WDAoWDAoe30sSiksVy5nZXRDaGlsZENvbnRleHQoKSkpLEYmJiFPJiZXLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT1udWxsJiYoXz1XLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKFUsaykpLGY9RCE9bnVsbCYmRC50eXBlPT09eCYmRC5rZXk9PW51bGw/bTQoRC5wcm9wcy5jaGlsZHJlbik6RCx6PWc0KFgsQTAoZik/ZjpbZl0sWSxaLEoscSxLLFEseixHLEwpLFcuYmFzZT1ZLl9fZSxZLl9fdSY9LTE2MSxXLl9faC5sZW5ndGgmJlEucHVzaChXKSxDJiYoVy5fX0U9Vy5fXz1udWxsKX1jYXRjaChtKXtpZihZLl9fdj1udWxsLEd8fEshPW51bGwpaWYobS50aGVuKXtmb3IoWS5fX3V8PUc/MTYwOjEyODt6JiZ6Lm5vZGVUeXBlPT04JiZ6Lm5leHRTaWJsaW5nOyl6PXoubmV4dFNpYmxpbmc7S1tLLmluZGV4T2YoeildPW51bGwsWS5fX2U9en1lbHNle2ZvcihpPUsubGVuZ3RoO2ktLTspUTQoS1tpXSk7cTQoWSl9ZWxzZSBZLl9fZT1aLl9fZSxZLl9faz1aLl9fayxtLnRoZW58fHE0KFkpO1AuX19lKG0sWSxaKX1lbHNlIEs9PW51bGwmJlkuX192PT1aLl9fdj8oWS5fX2s9Wi5fX2ssWS5fX2U9Wi5fX2UpOno9WS5fX2U9ZDUoWi5fX2UsWSxaLEoscSxLLFEsRyxMKTtyZXR1cm4oRD1QLmRpZmZlZCkmJkQoWSksMTI4JlkuX191P3ZvaWQgMDp6fWZ1bmN0aW9uIHE0KFgpe1gmJihYLl9fYyYmKFguX19jLl9fZT0hMCksWC5fX2smJlguX19rLnNvbWUocTQpKX1mdW5jdGlvbiBkNChYLFksWil7Zm9yKHZhciBKPTA7SjxaLmxlbmd0aDtKKyspVzQoWltKXSxaWysrSl0sWlsrK0pdKTtQLl9fYyYmUC5fX2MoWSxYKSxYLnNvbWUoZnVuY3Rpb24ocSl7dHJ5e1g9cS5fX2gscS5fX2g9W10sWC5zb21lKGZ1bmN0aW9uKEspe0suY2FsbChxKX0pfWNhdGNoKEspe1AuX19lKEsscS5fX3YpfX0pfWZ1bmN0aW9uIG00KFgpe3JldHVybiB0eXBlb2YgWCE9Im9iamVjdCJ8fFg9PW51bGx8fFguX19iPjA/WDpBMChYKT9YLm1hcChtNCk6WDAoe30sWCl9ZnVuY3Rpb24gZDUoWCxZLFosSixxLEssUSx6LEcpe3ZhciBMLEQsVyxPLFUsayxfLEM9Wi5wcm9wc3x8dzAsTT1ZLnByb3BzLEY9WS50eXBlO2lmKEY9PSJzdmciP3E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjpGPT0ibWF0aCI/cT0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI6cXx8KHE9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiKSxLIT1udWxsKXtmb3IoTD0wO0w8Sy5sZW5ndGg7TCsrKWlmKChVPUtbTF0pJiYic2V0QXR0cmlidXRlImluIFU9PSEhRiYmKEY/VS5sb2NhbE5hbWU9PUY6VS5ub2RlVHlwZT09Mykpe1g9VSxLW0xdPW51bGw7YnJlYWt9fWlmKFg9PW51bGwpe2lmKEY9PW51bGwpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKE0pO1g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHEsRixNLmlzJiZNKSx6JiYoUC5fX20mJlAuX19tKFksSyksej0hMSksSz1udWxsfWlmKEY9PW51bGwpQz09PU18fHomJlguZGF0YT09TXx8KFguZGF0YT1NKTtlbHNle2lmKEs9SyYmYjAuY2FsbChYLmNoaWxkTm9kZXMpLCF6JiZLIT1udWxsKWZvcihDPXt9LEw9MDtMPFguYXR0cmlidXRlcy5sZW5ndGg7TCsrKUNbKFU9WC5hdHRyaWJ1dGVzW0xdKS5uYW1lXT1VLnZhbHVlO2ZvcihMIGluIEMpVT1DW0xdLEw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/Vz1VOkw9PSJjaGlsZHJlbiJ8fChMIGluIE0pfHxMPT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBNKXx8TD09ImNoZWNrZWQiJiYoImRlZmF1bHRDaGVja2VkImluIE0pfHxNMChYLEwsbnVsbCxVLHEpO2ZvcihMIGluIE0pVT1NW0xdLEw9PSJjaGlsZHJlbiI/Tz1VOkw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/RD1VOkw9PSJ2YWx1ZSI/az1VOkw9PSJjaGVja2VkIj9fPVU6eiYmdHlwZW9mIFUhPSJmdW5jdGlvbiJ8fENbTF09PT1VfHxNMChYLEwsVSxDW0xdLHEpO2lmKEQpenx8VyYmKEQuX19odG1sPT1XLl9faHRtbHx8RC5fX2h0bWw9PVguaW5uZXJIVE1MKXx8KFguaW5uZXJIVE1MPUQuX19odG1sKSxZLl9faz1bXTtlbHNlIGlmKFcmJihYLmlubmVySFRNTD0iIiksZzQoWS50eXBlPT0idGVtcGxhdGUiP1guY29udGVudDpYLEEwKE8pP086W09dLFksWixKLEY9PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6cSxLLFEsSz9LWzBdOlouX19rJiZMMChaLDApLHosRyksSyE9bnVsbClmb3IoTD1LLmxlbmd0aDtMLS07KVE0KEtbTF0pO3p8fChMPSJ2YWx1ZSIsRj09InByb2dyZXNzIiYmaz09bnVsbD9YLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTprIT1udWxsJiYoayE9PVhbTF18fEY9PSJwcm9ncmVzcyImJiFrfHxGPT0ib3B0aW9uIiYmayE9Q1tMXSkmJk0wKFgsTCxrLENbTF0scSksTD0iY2hlY2tlZCIsXyE9bnVsbCYmXyE9WFtMXSYmTTAoWCxMLF8sQ1tMXSxxKSl9cmV0dXJuIFh9ZnVuY3Rpb24gVzQoWCxZLFope3RyeXtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil7dmFyIEo9dHlwZW9mIFguX191PT0iZnVuY3Rpb24iO0omJlguX191KCksSiYmWT09bnVsbHx8KFguX191PVgoWSkpfWVsc2UgWC5jdXJyZW50PVl9Y2F0Y2gocSl7UC5fX2UocSxaKX19ZnVuY3Rpb24gaDQoWCxZLFope3ZhciBKLHE7aWYoUC51bm1vdW50JiZQLnVubW91bnQoWCksKEo9WC5yZWYpJiYoSi5jdXJyZW50JiZKLmN1cnJlbnQhPVguX19lfHxXNChKLG51bGwsWSkpLChKPVguX19jKSE9bnVsbCl7aWYoSi5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7Si5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKEspe1AuX19lKEssWSl9Si5iYXNlPUouX19QPW51bGx9aWYoSj1YLl9faylmb3IocT0wO3E8Si5sZW5ndGg7cSsrKUpbcV0mJmg0KEpbcV0sWSxafHx0eXBlb2YgWC50eXBlIT0iZnVuY3Rpb24iKTtafHxRNChYLl9fZSksWC5fX2M9WC5fXz1YLl9fZT12b2lkIDB9ZnVuY3Rpb24gbTUoWCxZLFope3JldHVybiB0aGlzLmNvbnN0cnVjdG9yKFgsWil9ZnVuY3Rpb24gcDAoWCxZLFope3ZhciBKLHEsSyxRO1k9PWRvY3VtZW50JiYoWT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLFAuX18mJlAuX18oWCxZKSxxPShKPXR5cGVvZiBaPT0iZnVuY3Rpb24iKT9udWxsOlomJlouX19rfHxZLl9fayxLPVtdLFE9W10sJDQoWSxYPSghSiYmWnx8WSkuX19rPVkwKHgsbnVsbCxbWF0pLHF8fHcwLHcwLFkubmFtZXNwYWNlVVJJLCFKJiZaP1taXTpxP251bGw6WS5maXJzdENoaWxkP2IwLmNhbGwoWS5jaGlsZE5vZGVzKTpudWxsLEssIUomJlo/WjpxP3EuX19lOlkuZmlyc3RDaGlsZCxKLFEpLGQ0KEssWCxRKX1mdW5jdGlvbiB6MChYKXtmdW5jdGlvbiBZKFope3ZhciBKLHE7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0fHwoSj1uZXcgU2V0LChxPXt9KVtZLl9fY109dGhpcyx0aGlzLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBxfSx0aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7Sj1udWxsfSx0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihLKXt0aGlzLnByb3BzLnZhbHVlIT1LLnZhbHVlJiZKLmZvckVhY2goZnVuY3Rpb24oUSl7US5fX2U9ITAsSjQoUSl9KX0sdGhpcy5zdWI9ZnVuY3Rpb24oSyl7Si5hZGQoSyk7dmFyIFE9Sy5jb21wb25lbnRXaWxsVW5tb3VudDtLLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7SiYmSi5kZWxldGUoSyksUSYmUS5jYWxsKEspfX0pLFouY2hpbGRyZW59cmV0dXJuIFkuX19jPSJfX2NDIitSNCsrLFkuX189WCxZLlByb3ZpZGVyPVkuX19sPShZLkNvbnN1bWVyPWZ1bmN0aW9uKFosSil7cmV0dXJuIFouY2hpbGRyZW4oSil9KS5jb250ZXh0VHlwZT1ZLFl9YjA9UzAuc2xpY2UsUD17X19lOmZ1bmN0aW9uKFgsWSxaLEope2Zvcih2YXIgcSxLLFE7WT1ZLl9fOylpZigocT1ZLl9fYykmJiFxLl9fKXRyeXtpZigoSz1xLmNvbnN0cnVjdG9yKSYmSy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPW51bGwmJihxLnNldFN0YXRlKEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKFgpKSxRPXEuX19kKSxxLmNvbXBvbmVudERpZENhdGNoIT1udWxsJiYocS5jb21wb25lbnREaWRDYXRjaChYLEp8fHt9KSxRPXEuX19kKSxRKXJldHVybiBxLl9fRT1xfWNhdGNoKHope1g9en10aHJvdyBYfX0sYjQ9MCxqNT1mdW5jdGlvbihYKXtyZXR1cm4gWCE9bnVsbCYmWC5jb25zdHJ1Y3Rvcj09PXZvaWQgMH0sZy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oWCxZKXt2YXIgWjtaPXRoaXMuX19zIT1udWxsJiZ0aGlzLl9fcyE9dGhpcy5zdGF0ZT90aGlzLl9fczp0aGlzLl9fcz1YMCh7fSx0aGlzLnN0YXRlKSx0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFg9WChYMCh7fSxaKSx0aGlzLnByb3BzKSksWCYmWDAoWixYKSxYIT1udWxsJiZ0aGlzLl9fdiYmKFkmJnRoaXMuX3NiLnB1c2goWSksSjQodGhpcykpfSxnLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihYKXt0aGlzLl9fdiYmKHRoaXMuX19lPSEwLFgmJnRoaXMuX19oLnB1c2goWCksSjQodGhpcykpfSxnLnByb3RvdHlwZS5yZW5kZXI9eCxLMD1bXSxwND10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpOnNldFRpbWVvdXQsdjQ9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gWC5fX3YuX19iLVkuX192Ll9fYn0sVDAuX19yPTAsWDQ9TWF0aC5yYW5kb20oKS50b1N0cmluZyg4KSxDMD0iX19kIitYNCxVMD0iX19hIitYNCxqND0vKFBvaW50ZXJDYXB0dXJlKSR8Q2FwdHVyZSQvaSxLND0wLFk0PVQ0KCExKSxaND1UNCghMCksUjQ9MDt2YXIgTjAsVCxMNCxmNCxEMD0wLHI0PVtdLGI9UCxhND1iLl9fYixjND1iLl9fcixsND1iLmRpZmZlZCxpND1iLl9fYyxzND1iLnVubW91bnQsbzQ9Yi5fXztmdW5jdGlvbiBqMChYLFkpe2IuX19oJiZiLl9faChULFgsRDB8fFkpLEQwPTA7dmFyIFo9VC5fX0h8fChULl9fSD17X186W10sX19oOltdfSk7cmV0dXJuIFg+PVouX18ubGVuZ3RoJiZaLl9fLnB1c2goe30pLFouX19bWF19ZnVuY3Rpb24gcChYKXtyZXR1cm4gRDA9MSxONChuNCxYKX1mdW5jdGlvbiBONChYLFksWil7dmFyIEo9ajAoTjArKywyKTtpZihKLnQ9WCwhSi5fX2MmJihKLl9fPVtaP1ooWSk6bjQodm9pZCAwLFkpLGZ1bmN0aW9uKHope3ZhciBHPUouX19OP0ouX19OWzBdOkouX19bMF0sTD1KLnQoRyx6KTtHIT09TCYmKEouX19OPVtMLEouX19bMV1dLEouX19jLnNldFN0YXRlKHt9KSl9XSxKLl9fYz1ULCFULl9fZikpe3ZhciBxPWZ1bmN0aW9uKHosRyxMKXtpZighSi5fX2MuX19IKXJldHVybiEwO3ZhciBEPUouX19jLl9fSC5fXy5maWx0ZXIoZnVuY3Rpb24oTyl7cmV0dXJuIE8uX19jfSk7aWYoRC5ldmVyeShmdW5jdGlvbihPKXtyZXR1cm4hTy5fX059KSlyZXR1cm4hS3x8Sy5jYWxsKHRoaXMseixHLEwpO3ZhciBXPUouX19jLnByb3BzIT09ejtyZXR1cm4gRC5zb21lKGZ1bmN0aW9uKE8pe2lmKE8uX19OKXt2YXIgVT1PLl9fWzBdO08uX189Ty5fX04sTy5fX049dm9pZCAwLFUhPT1PLl9fWzBdJiYoVz0hMCl9fSksSyYmSy5jYWxsKHRoaXMseixHLEwpfHxXfTtULl9fZj0hMDt2YXJ7c2hvdWxkQ29tcG9uZW50VXBkYXRlOkssY29tcG9uZW50V2lsbFVwZGF0ZTpRfT1UO1QuY29tcG9uZW50V2lsbFVwZGF0ZT1mdW5jdGlvbih6LEcsTCl7aWYodGhpcy5fX2Upe3ZhciBEPUs7Sz12b2lkIDAscSh6LEcsTCksSz1EfVEmJlEuY2FsbCh0aGlzLHosRyxMKX0sVC5zaG91bGRDb21wb25lbnRVcGRhdGU9cX1yZXR1cm4gSi5fX058fEouX199ZnVuY3Rpb24gZChYLFkpe3ZhciBaPWowKE4wKyssMyk7IWIuX19zJiZ0NChaLl9fSCxZKSYmKFouX189WCxaLnU9WSxULl9fSC5fX2gucHVzaChaKSl9ZnVuY3Rpb24gdyhYKXtyZXR1cm4gRDA9NSxSMChmdW5jdGlvbigpe3JldHVybntjdXJyZW50Olh9fSxbXSl9ZnVuY3Rpb24gUjAoWCxZKXt2YXIgWj1qMChOMCsrLDcpO3JldHVybiB0NChaLl9fSCxZKSYmKFouX189WCgpLFouX19IPVksWi5fX2g9WCksWi5fX31mdW5jdGlvbiBqKFgsWSl7cmV0dXJuIEQwPTgsUjAoZnVuY3Rpb24oKXtyZXR1cm4gWH0sWSl9ZnVuY3Rpb24gUDAoWCl7dmFyIFk9VC5jb250ZXh0W1guX19jXSxaPWowKE4wKyssOSk7cmV0dXJuIFouYz1YLFk/KFouX189PW51bGwmJihaLl9fPSEwLFkuc3ViKFQpKSxZLnByb3BzLnZhbHVlKTpYLl9ffWZ1bmN0aW9uIGg1KCl7Zm9yKHZhciBYO1g9cjQuc2hpZnQoKTspe3ZhciBZPVguX19IO2lmKFguX19QJiZZKXRyeXtZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXX1jYXRjaChaKXtZLl9faD1bXSxiLl9fZShaLFguX192KX19fWIuX19iPWZ1bmN0aW9uKFgpe1Q9bnVsbCxhNCYmYTQoWCl9LGIuX189ZnVuY3Rpb24oWCxZKXtYJiZZLl9fayYmWS5fX2suX19tJiYoWC5fX209WS5fX2suX19tKSxvNCYmbzQoWCxZKX0sYi5fX3I9ZnVuY3Rpb24oWCl7YzQmJmM0KFgpLE4wPTA7dmFyIFk9KFQ9WC5fX2MpLl9fSDtZJiYoTDQ9PT1UPyhZLl9faD1bXSxULl9faD1bXSxZLl9fLnNvbWUoZnVuY3Rpb24oWil7Wi5fX04mJihaLl9fPVouX19OKSxaLnU9Wi5fX049dm9pZCAwfSkpOihZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXSxOMD0wKSksTDQ9VH0sYi5kaWZmZWQ9ZnVuY3Rpb24oWCl7bDQmJmw0KFgpO3ZhciBZPVguX19jO1kmJlkuX19IJiYoWS5fX0guX19oLmxlbmd0aCYmKHI0LnB1c2goWSkhPT0xJiZmND09PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwoKGY0PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8ZjUpKGg1KSksWS5fX0guX18uc29tZShmdW5jdGlvbihaKXtaLnUmJihaLl9fSD1aLnUpLFoudT12b2lkIDB9KSksTDQ9VD1udWxsfSxiLl9fYz1mdW5jdGlvbihYLFkpe1kuc29tZShmdW5jdGlvbihaKXt0cnl7Wi5fX2guc29tZSh2MCksWi5fX2g9Wi5fX2guZmlsdGVyKGZ1bmN0aW9uKEope3JldHVybiFKLl9ffHx6NChKKX0pfWNhdGNoKEope1kuc29tZShmdW5jdGlvbihxKXtxLl9faCYmKHEuX19oPVtdKX0pLFk9W10sYi5fX2UoSixaLl9fdil9fSksaTQmJmk0KFgsWSl9LGIudW5tb3VudD1mdW5jdGlvbihYKXtzNCYmczQoWCk7dmFyIFksWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7dHJ5e3YwKEopfWNhdGNoKHEpe1k9cX19KSxaLl9fSD12b2lkIDAsWSYmYi5fX2UoWSxaLl9fdikpfTt2YXIgdTQ9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBmNShYKXt2YXIgWSxaPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KEopLHU0JiZjYW5jZWxBbmltYXRpb25GcmFtZShZKSxzZXRUaW1lb3V0KFgpfSxKPXNldFRpbWVvdXQoWiwzNSk7dTQmJihZPXJlcXVlc3RBbmltYXRpb25GcmFtZShaKSl9ZnVuY3Rpb24gdjAoWCl7dmFyIFk9VCxaPVguX19jO3R5cGVvZiBaPT0iZnVuY3Rpb24iJiYoWC5fX2M9dm9pZCAwLFooKSksVD1ZfWZ1bmN0aW9uIHo0KFgpe3ZhciBZPVQ7WC5fX2M9WC5fXygpLFQ9WX1mdW5jdGlvbiB0NChYLFkpe3JldHVybiFYfHxYLmxlbmd0aCE9PVkubGVuZ3RofHxZLnNvbWUoZnVuY3Rpb24oWixKKXtyZXR1cm4gWiE9PVhbSl19KX1mdW5jdGlvbiBuNChYLFkpe3JldHVybiB0eXBlb2YgWT09ImZ1bmN0aW9uIj9ZKFgpOll9ZnVuY3Rpb24gdTUoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gZTQoWCxZKXtmb3IodmFyIFogaW4gWClpZihaIT09Il9fc291cmNlIiYmIShaIGluIFkpKXJldHVybiEwO2Zvcih2YXIgSiBpbiBZKWlmKEohPT0iX19zb3VyY2UiJiZYW0pdIT09WVtKXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBYNShYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX0oWDUucHJvdG90eXBlPW5ldyBnKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxYNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWSl7cmV0dXJuIGU0KHRoaXMucHJvcHMsWCl8fGU0KHRoaXMuc3RhdGUsWSl9O3ZhciBZNT1QLl9fYjtQLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksWTUmJlk1KFgpfTt2YXIgcjU9UC5fX2U7UC5fX2U9ZnVuY3Rpb24oWCxZLFosSil7aWYoWC50aGVuKXtmb3IodmFyIHEsSz1ZO0s9Sy5fXzspaWYoKHE9Sy5fX2MpJiZxLl9fYylyZXR1cm4gWS5fX2U9PW51bGwmJihZLl9fZT1aLl9fZSxZLl9faz1aLl9faykscS5fX2MoWCxZKX1yNShYLFksWixKKX07dmFyIFo1PVAudW5tb3VudDtmdW5jdGlvbiBXNShYLFksWil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oSil7dHlwZW9mIEouX19jPT0iZnVuY3Rpb24iJiZKLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPXU1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1aJiYoWC5fX2MuX19QPVkpLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKEope3JldHVybiBXNShKLFksWil9KSksWH1mdW5jdGlvbiBMNShYLFksWil7cmV0dXJuIFgmJlomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEw1KEosWSxaKX0pLFguX19jJiZYLl9fYy5fX1A9PT1ZJiYoWC5fX2UmJlouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9WikpLFh9ZnVuY3Rpb24gRzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gejUoWCl7dmFyIFk9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFkmJlkuX19hJiZZLl9fYShYKX1mdW5jdGlvbiB5MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfVAudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWT1YLl9fYztZJiYoWS5fX3o9ITApLFkmJlkuX19SJiZZLl9fUigpLFkmJjMyJlguX191JiYoWC50eXBlPW51bGwpLFo1JiZaNShYKX0sKEc0LnByb3RvdHlwZT1uZXcgZykuX19jPWZ1bmN0aW9uKFgsWSl7dmFyIFo9WS5fX2MsSj10aGlzO0oubz09bnVsbCYmKEoubz1bXSksSi5vLnB1c2goWik7dmFyIHE9ejUoSi5fX3YpLEs9ITEsUT1mdW5jdGlvbigpe0t8fEouX196fHwoSz0hMCxaLl9fUj1udWxsLHE/cShHKTpHKCkpfTtaLl9fUj1RO3ZhciB6PVouX19QO1ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1KLl9fdSl7aWYoSi5zdGF0ZS5fX2Epe3ZhciBMPUouc3RhdGUuX19hO0ouX192Ll9fa1swXT1MNShMLEwuX19jLl9fUCxMLl9fYy5fX08pfXZhciBEO2ZvcihKLnNldFN0YXRlKHtfX2E6Si5fX2I9bnVsbH0pO0Q9Si5vLnBvcCgpOylELl9fUD16LEQuZm9yY2VVcGRhdGUoKX19O0ouX191Kyt8fDMyJlkuX191fHxKLnNldFN0YXRlKHtfX2E6Si5fX2I9Si5fX3YuX19rWzBdfSksWC50aGVuKFEsUSl9LEc0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFkpe2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBaPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09VzUodGhpcy5fX2IsWixKLl9fTz1KLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1ZLl9fYSYmWTAoeCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1kwKHgsbnVsbCxZLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgSjU9ZnVuY3Rpb24oWCxZLFope2lmKCsrWlsxXT09PVpbMF0mJlgubC5kZWxldGUoWSksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKFo9WC5pO1o7KXtmb3IoO1oubGVuZ3RoPjM7KVoucG9wKCkoKTtpZihaWzFdPFpbMF0pYnJlYWs7WC5pPVo9WlsyXX19Oyh5MC5wcm90b3R5cGU9bmV3IGcpLl9fYT1mdW5jdGlvbihYKXt2YXIgWT10aGlzLFo9ejUoWS5fX3YpLEo9WS5sLmdldChYKTtyZXR1cm4gSlswXSsrLGZ1bmN0aW9uKHEpe3ZhciBLPWZ1bmN0aW9uKCl7WS5wcm9wcy5yZXZlYWxPcmRlcj8oSi5wdXNoKHEpLEo1KFksWCxKKSk6cSgpfTtaP1ooSyk6SygpfX0seTAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWT1aMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZZLnJldmVyc2UoKTtmb3IodmFyIFo9WS5sZW5ndGg7Wi0tOyl0aGlzLmwuc2V0KFlbWl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHkwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9eTAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihZLFope0o1KFgsWixZKX0pfTt2YXIgdDU9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsbjU9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLGU1PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sWDY9L1tBLVowLTldL2csWTY9dHlwZW9mIGRvY3VtZW50PCJ1IixaNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2Z1bmN0aW9uIE41KFgsWSxaKXtyZXR1cm4gWS5fX2s9PW51bGwmJihZLnRleHRDb250ZW50PSIiKSxwMChYLFkpLHR5cGVvZiBaPT0iZnVuY3Rpb24iJiZaKCksWD9YLl9fYzpudWxsfWcucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGcucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihZKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6WX0pfX0pfSk7dmFyIHE1PVAuZXZlbnQ7UC5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gcTUmJihYPXE1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgRzUsSjY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEs1PVAudm5vZGU7UC52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWSl7dmFye3Byb3BzOlosdHlwZTpKfT1ZLHE9e30sSz1KLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBRIGluIFope3ZhciB6PVpbUV07aWYoIShRPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gWikmJno9PW51bGx8fFk2JiZRPT09ImNoaWxkcmVuIiYmSj09PSJub3NjcmlwdCJ8fFE9PT0iY2xhc3MifHxRPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1RLnRvTG93ZXJDYXNlKCk7UT09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gWiYmWi52YWx1ZT09bnVsbD9RPSJ2YWx1ZSI6UT09PSJkb3dubG9hZCImJno9PT0hMD96PSIiOkc9PT0idHJhbnNsYXRlIiYmej09PSJubyI/ej0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/UT0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fEohPT0iaW5wdXQiJiZKIT09InRleHRhcmVhInx8WjYoWi50eXBlKT9HPT09Im9uZm9jdXMiP1E9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP1E9Im9uZm9jdXNvdXQiOmU1LnRlc3QoUSkmJihRPUcpOkc9UT0ib25pbnB1dCI6SyYmbjUudGVzdChRKT9RPVEucmVwbGFjZShYNiwiLSQmIikudG9Mb3dlckNhc2UoKTp6PT09bnVsbCYmKHo9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW1E9R10mJihRPSJvbmlucHV0Q2FwdHVyZSIpLHFbUV09en19Sj09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9WjAoWi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihMKXtMLnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZihMLnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PUwucHJvcHMudmFsdWV9KSkpLFouY2xhc3MmJiFaLmNsYXNzTmFtZT8ocS5jbGFzcz1aLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEo2KSk6Wi5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPVouY2xhc3NOYW1lKSxZLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9dDUsSzUmJks1KFgpfTt2YXIgUTU9UC5fX3I7UC5fX3I9ZnVuY3Rpb24oWCl7UTUmJlE1KFgpLEc1PVguX19jfTt2YXIgJDU9UC5kaWZmZWQ7UC5kaWZmZWQ9ZnVuY3Rpb24oWCl7JDUmJiQ1KFgpO3Zhcntwcm9wczpZLF9fZTpafT1YO1ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBZJiZZLnZhbHVlIT09Wi52YWx1ZSYmKFoudmFsdWU9WS52YWx1ZT09bnVsbD8iIjpZLnZhbHVlKSxHNT1udWxsfTtmdW5jdGlvbiBWNShYKXtyZXR1cm4hIVguX19rJiYocDAobnVsbCxYKSwhMCl9ZnVuY3Rpb24gSDUoWCl7cmV0dXJue3JlbmRlcjpmdW5jdGlvbihZKXtONShZLFgpfSx1bm1vdW50OmZ1bmN0aW9uKCl7VjUoWCl9fX1mdW5jdGlvbiBJNShYLFkpe2Zvcih2YXIgWiBpbiBZKVhbWl09WVtaXTtyZXR1cm4gWH1mdW5jdGlvbiBPNShYLFkpe2Zvcih2YXIgWiBpbiBYKWlmKFohPT0iX19zb3VyY2UiJiYhKFogaW4gWSkpcmV0dXJuITA7Zm9yKHZhciBKIGluIFkpaWYoSiE9PSJfX3NvdXJjZSImJlhbSl0hPT1ZW0pdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFU1KFgsWSl7dGhpcy5wcm9wcz1YLHRoaXMuY29udGV4dD1ZfShVNS5wcm90b3R5cGU9bmV3IGcpLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwLFU1LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gTzUodGhpcy5wcm9wcyxYKXx8TzUodGhpcy5zdGF0ZSxZKX07dmFyIEE1PVAuX19iO1AuX19iPWZ1bmN0aW9uKFgpe1gudHlwZSYmWC50eXBlLl9fZiYmWC5yZWYmJihYLnByb3BzLnJlZj1YLnJlZixYLnJlZj1udWxsKSxBNSYmQTUoWCl9O3ZhciBxNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKXx8MzkxMTtmdW5jdGlvbiBHMChYKXtmdW5jdGlvbiBZKFope3ZhciBKPUk1KHt9LFopO3JldHVybiBkZWxldGUgSi5yZWYsWChKLFoucmVmfHxudWxsKX1yZXR1cm4gWS4kJHR5cGVvZj1xNixZLnJlbmRlcj1YLFkucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9WS5fX2Y9ITAsWS5kaXNwbGF5TmFtZT0iRm9yd2FyZFJlZigiKyhYLmRpc3BsYXlOYW1lfHxYLm5hbWUpKyIpIixZfXZhciBLNj1QLl9fZTtQLl9fZT1mdW5jdGlvbihYLFksWixKKXtpZihYLnRoZW4pe2Zvcih2YXIgcSxLPVk7Sz1LLl9fOylpZigocT1LLl9fYykmJnEuX19jKXJldHVybiBZLl9fZT09bnVsbCYmKFkuX19lPVouX19lLFkuX19rPVouX19rKSxxLl9fYyhYLFkpfUs2KFgsWSxaLEopfTt2YXIgRDU9UC51bm1vdW50O2Z1bmN0aW9uIE01KFgsWSxaKXtyZXR1cm4gWCYmKFguX19jJiZYLl9fYy5fX0gmJihYLl9fYy5fX0guX18uZm9yRWFjaChmdW5jdGlvbihKKXt0eXBlb2YgSi5fX2M9PSJmdW5jdGlvbiImJkouX19jKCl9KSxYLl9fYy5fX0g9bnVsbCksKFg9STUoe30sWCkpLl9fYyE9bnVsbCYmKFguX19jLl9fUD09PVomJihYLl9fYy5fX1A9WSksWC5fX2MuX19lPSEwLFguX19jPW51bGwpLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIE01KEosWSxaKX0pKSxYfWZ1bmN0aW9uIEM1KFgsWSxaKXtyZXR1cm4gWCYmWiYmKFguX192PW51bGwsWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihKKXtyZXR1cm4gQzUoSixZLFopfSksWC5fX2MmJlguX19jLl9fUD09PVkmJihYLl9fZSYmWi5hcHBlbmRDaGlsZChYLl9fZSksWC5fX2MuX19lPSEwLFguX19jLl9fUD1aKSksWH1mdW5jdGlvbiBINCgpe3RoaXMuX191PTAsdGhpcy5vPW51bGwsdGhpcy5fX2I9bnVsbH1mdW5jdGlvbiBFNShYKXt2YXIgWT1YLl9fJiZYLl9fLl9fYztyZXR1cm4gWSYmWS5fX2EmJlkuX19hKFgpfWZ1bmN0aW9uIGcwKCl7dGhpcy5pPW51bGwsdGhpcy5sPW51bGx9UC51bm1vdW50PWZ1bmN0aW9uKFgpe3ZhciBZPVguX19jO1kmJihZLl9fej0hMCksWSYmWS5fX1ImJlkuX19SKCksWSYmMzImWC5fX3UmJihYLnR5cGU9bnVsbCksRDUmJkQ1KFgpfSwoSDQucHJvdG90eXBlPW5ldyBnKS5fX2M9ZnVuY3Rpb24oWCxZKXt2YXIgWj1ZLl9fYyxKPXRoaXM7Si5vPT1udWxsJiYoSi5vPVtdKSxKLm8ucHVzaChaKTt2YXIgcT1FNShKLl9fdiksSz0hMSxRPWZ1bmN0aW9uKCl7S3x8Si5fX3p8fChLPSEwLFouX19SPW51bGwscT9xKEcpOkcoKSl9O1ouX19SPVE7dmFyIHo9Wi5fX1A7Wi5fX1A9bnVsbDt2YXIgRz1mdW5jdGlvbigpe2lmKCEtLUouX191KXtpZihKLnN0YXRlLl9fYSl7dmFyIEw9Si5zdGF0ZS5fX2E7Si5fX3YuX19rWzBdPUM1KEwsTC5fX2MuX19QLEwuX19jLl9fTyl9dmFyIEQ7Zm9yKEouc2V0U3RhdGUoe19fYTpKLl9fYj1udWxsfSk7RD1KLm8ucG9wKCk7KUQuX19QPXosRC5mb3JjZVVwZGF0ZSgpfX07Si5fX3UrK3x8MzImWS5fX3V8fEouc2V0U3RhdGUoe19fYTpKLl9fYj1KLl9fdi5fX2tbMF19KSxYLnRoZW4oUSxRKX0sSDQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5vPVtdfSxINC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgsWSl7aWYodGhpcy5fX2Ipe2lmKHRoaXMuX192Ll9fayl7dmFyIFo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksSj10aGlzLl9fdi5fX2tbMF0uX19jO3RoaXMuX192Ll9fa1swXT1NNSh0aGlzLl9fYixaLEouX19PPUouX19QKX10aGlzLl9fYj1udWxsfXZhciBxPVkuX19hJiZZMCh4LG51bGwsWC5mYWxsYmFjayk7cmV0dXJuIHEmJihxLl9fdSY9LTMzKSxbWTAoeCxudWxsLFkuX19hP251bGw6WC5jaGlsZHJlbikscV19O3ZhciBQNT1mdW5jdGlvbihYLFksWil7aWYoKytaWzFdPT09WlswXSYmWC5sLmRlbGV0ZShZKSxYLnByb3BzLnJldmVhbE9yZGVyJiYoWC5wcm9wcy5yZXZlYWxPcmRlclswXSE9PSJ0Inx8IVgubC5zaXplKSlmb3IoWj1YLmk7Wjspe2Zvcig7Wi5sZW5ndGg+MzspWi5wb3AoKSgpO2lmKFpbMV08WlswXSlicmVhaztYLmk9Wj1aWzJdfX07KGcwLnByb3RvdHlwZT1uZXcgZykuX19hPWZ1bmN0aW9uKFgpe3ZhciBZPXRoaXMsWj1FNShZLl9fdiksSj1ZLmwuZ2V0KFgpO3JldHVybiBKWzBdKyssZnVuY3Rpb24ocSl7dmFyIEs9ZnVuY3Rpb24oKXtZLnByb3BzLnJldmVhbE9yZGVyPyhKLnB1c2gocSksUDUoWSxYLEopKTpxKCl9O1o/WihLKTpLKCl9fSxnMC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgpe3RoaXMuaT1udWxsLHRoaXMubD1uZXcgTWFwO3ZhciBZPVowKFguY2hpbGRyZW4pO1gucmV2ZWFsT3JkZXImJlgucmV2ZWFsT3JkZXJbMF09PT0iYiImJlkucmV2ZXJzZSgpO2Zvcih2YXIgWj1ZLmxlbmd0aDtaLS07KXRoaXMubC5zZXQoWVtaXSx0aGlzLmk9WzEsMCx0aGlzLmldKTtyZXR1cm4gWC5jaGlsZHJlbn0sZzAucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1nMC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgWD10aGlzO3RoaXMubC5mb3JFYWNoKGZ1bmN0aW9uKFksWil7UDUoWCxaLFkpfSl9O3ZhciBRNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMywkNj0vXig/OmFjY2VudHxhbGlnbm1lbnR8YXJhYmljfGJhc2VsaW5lfGNhcHxjbGlwKD8hUGF0aFUpfGNvbG9yfGRvbWluYW50fGZpbGx8Zmxvb2R8Zm9udHxnbHlwaCg/IVIpfGhvcml6fGltYWdlKCFTKXxsZXR0ZXJ8bGlnaHRpbmd8bWFya2VyKD8hSHxXfFUpfG92ZXJsaW5lfHBhaW50fHBvaW50ZXJ8c2hhcGV8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dHJhbnNmb3JtfHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVjdG9yfHZlcnR8d29yZHx3cml0aW5nfHgoPyFDKSlbQS1aXS8sVzY9L15vbihBbml8VHJhfFRvdXxCZWZvcmVJbnB8Q29tcG8pLyxMNj0vW0EtWjAtOV0vZyx6Nj10eXBlb2YgZG9jdW1lbnQ8InUiLE42PWZ1bmN0aW9uKFgpe3JldHVybih0eXBlb2YgU3ltYm9sPCJ1IiYmdHlwZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj8vZmlsfGNoZXxyYWQvOi9maWx8Y2hlfHJhLykudGVzdChYKX07Zy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD0hMCxbImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVXBkYXRlIl0uZm9yRWFjaChmdW5jdGlvbihYKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZy5wcm90b3R5cGUsWCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzWyJVTlNBRkVfIitYXX0sc2V0OmZ1bmN0aW9uKFkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFgse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpZfSl9fSl9KTt2YXIgQjU9UC5ldmVudDtQLmV2ZW50PWZ1bmN0aW9uKFgpe3JldHVybiBCNSYmKFg9QjUoWCkpLFgucGVyc2lzdD1mdW5jdGlvbigpe30sWC5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbEJ1YmJsZX0sWC5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZhdWx0UHJldmVudGVkfSxYLm5hdGl2ZUV2ZW50PVh9O3ZhciB3NSxHNj17Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsYXNzfX0sXzU9UC52bm9kZTtQLnZub2RlPWZ1bmN0aW9uKFgpe3R5cGVvZiBYLnR5cGU9PSJzdHJpbmciJiZmdW5jdGlvbihZKXt2YXJ7cHJvcHM6Wix0eXBlOkp9PVkscT17fSxLPUouaW5kZXhPZigiLSIpPT0tMTtmb3IodmFyIFEgaW4gWil7dmFyIHo9WltRXTtpZighKFE9PT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBaKSYmej09bnVsbHx8ejYmJlE9PT0iY2hpbGRyZW4iJiZKPT09Im5vc2NyaXB0Inx8UT09PSJjbGFzcyJ8fFE9PT0iY2xhc3NOYW1lIikpe3ZhciBHPVEudG9Mb3dlckNhc2UoKTtRPT09ImRlZmF1bHRWYWx1ZSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlPT1udWxsP1E9InZhbHVlIjpRPT09ImRvd25sb2FkIiYmej09PSEwP3o9IiI6Rz09PSJ0cmFuc2xhdGUiJiZ6PT09Im5vIj96PSExOkdbMF09PT0ibyImJkdbMV09PT0ibiI/Rz09PSJvbmRvdWJsZWNsaWNrIj9RPSJvbmRibGNsaWNrIjpHIT09Im9uY2hhbmdlInx8SiE9PSJpbnB1dCImJkohPT0idGV4dGFyZWEifHxONihaLnR5cGUpP0c9PT0ib25mb2N1cyI/UT0ib25mb2N1c2luIjpHPT09Im9uYmx1ciI/UT0ib25mb2N1c291dCI6VzYudGVzdChRKSYmKFE9Ryk6Rz1RPSJvbmlucHV0IjpLJiYkNi50ZXN0KFEpP1E9US5yZXBsYWNlKEw2LCItJCYiKS50b0xvd2VyQ2FzZSgpOno9PT1udWxsJiYoej12b2lkIDApLEc9PT0ib25pbnB1dCImJnFbUT1HXSYmKFE9Im9uaW5wdXRDYXB0dXJlIikscVtRXT16fX1KPT0ic2VsZWN0IiYmKHEubXVsdGlwbGUmJkFycmF5LmlzQXJyYXkocS52YWx1ZSkmJihxLnZhbHVlPVowKFouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oTCl7TC5wcm9wcy5zZWxlY3RlZD1xLnZhbHVlLmluZGV4T2YoTC5wcm9wcy52YWx1ZSkhPS0xfSkpLHEuZGVmYXVsdFZhbHVlIT1udWxsJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS5tdWx0aXBsZT9xLmRlZmF1bHRWYWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMTpxLmRlZmF1bHRWYWx1ZT09TC5wcm9wcy52YWx1ZX0pKSksWi5jbGFzcyYmIVouY2xhc3NOYW1lPyhxLmNsYXNzPVouY2xhc3MsT2JqZWN0LmRlZmluZVByb3BlcnR5KHEsImNsYXNzTmFtZSIsRzYpKTpaLmNsYXNzTmFtZSYmKHEuY2xhc3M9cS5jbGFzc05hbWU9Wi5jbGFzc05hbWUpLFkucHJvcHM9cX0oWCksWC4kJHR5cGVvZj1RNixfNSYmXzUoWCl9O3ZhciBGNT1QLl9fcjtQLl9fcj1mdW5jdGlvbihYKXtGNSYmRjUoWCksdzU9WC5fX2N9O3ZhciBrNT1QLmRpZmZlZDtQLmRpZmZlZD1mdW5jdGlvbihYKXtrNSYmazUoWCk7dmFye3Byb3BzOlksX19lOlp9PVg7WiE9bnVsbCYmWC50eXBlPT09InRleHRhcmVhIiYmInZhbHVlImluIFkmJlkudmFsdWUhPT1aLnZhbHVlJiYoWi52YWx1ZT1ZLnZhbHVlPT1udWxsPyIiOlkudmFsdWUpLHc1PW51bGx9O3ZhciBWNj0wO2Z1bmN0aW9uICQoWCxZLFosSixxLEspe1l8fChZPXt9KTt2YXIgUSx6LEc9WTtpZigicmVmImluIEcpZm9yKHogaW4gRz17fSxZKXo9PSJyZWYiP1E9WVt6XTpHW3pdPVlbel07dmFyIEw9e3R5cGU6WCxwcm9wczpHLGtleTpaLHJlZjpRLF9fazpudWxsLF9fOm51bGwsX19iOjAsX19lOm51bGwsX19jOm51bGwsY29uc3RydWN0b3I6dm9pZCAwLF9fdjotLVY2LF9faTotMSxfX3U6MCxfX3NvdXJjZTpxLF9fc2VsZjpLfTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFE9WC5kZWZhdWx0UHJvcHMpKWZvcih6IGluIFEpR1t6XT09PXZvaWQgMCYmKEdbel09UVt6XSk7cmV0dXJuIFAudm5vZGUmJlAudm5vZGUoTCksTH12YXIgTzQ9YHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyMCcgaGVpZ2h0PScyMCclM0UlM0NjaXJjbGUgY3g9JzEwJyBjeT0nMTAnIHI9JzknIGZpbGw9J3JnYmEoMjU1LDI1NSwyNTUsMC40KScgc3Ryb2tlPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNyknIHN0cm9rZS13aWR0aD0nMScvJTNFJTNDL3N2ZyUzRSIpIDEwIDEwLCBwb2ludGVyYCxINj0zLE82PTQsVTY9NTtmdW5jdGlvbiB4MCh7dXJsOlgsd3NVcmw6WSxzdHlsZTpaLGltYWdlU3R5bGU6SixjbGFzc05hbWU6cSxvbkhvbWVQcmVzczpLLG9uU3RyZWFtVG91Y2g6USxvblN0cmVhbU11bHRpVG91Y2g6eixvblN0cmVhbUJ1dHRvbjpHLHN1YnNjcmliZUZyYW1lOkwsc3RyZWFtRnJhbWU6RCxzdHJlYW1Db25maWc6VyxoaWRlQ29udHJvbHM6TyxvblN0cmVhbWluZ0NoYW5nZTpVLGNvbm5lY3Rpb25RdWFsaXR5Omt9KXtsZXQgXz0hIVEsQz13KG51bGwpLE09dyhudWxsKSxGPXcobnVsbCksW0UsSV09cCghMSksW3Yscl09cChudWxsKSxbZixpXT1wKG51bGwpLHk9dyhudWxsKSxbbSxjMF09cChudWxsKTtkKCgpPT57bGV0IFY9eS5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKE4pPT57bGV0IEE9TlswXT8uY29udGVudFJlY3Q7aWYoQSljMCh7d2lkdGg6QS53aWR0aCxoZWlnaHQ6QS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W0Q0LFA0XT1wKDApLFcwPXcoMCksW3A1LGwwXT1wKCExKSx0PXcobnVsbCk7ZCgoKT0+e2lmKGs9PT0icG9vciIpe2lmKGwwKCEwKSx0LmN1cnJlbnQpY2xlYXJUaW1lb3V0KHQuY3VycmVudCk7dC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntsMCghMSksdC5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYobDAoITEpLHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KSx0LmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KX19LFtrXSk7bGV0IGkwPWAke1h9L3N0cmVhbS5tanBlZ2AsQjQ9dyhVKTtCNC5jdXJyZW50PVUsZCgoKT0+e0I0LmN1cnJlbnQ/LihFKX0sW0VdKSxkKCgpPT57aWYoXyYmVylpKFcpfSxbXyxXXSk7bGV0IF80PXcoITEpO180LmN1cnJlbnQ9RTtsZXQgczA9dyhudWxsKTtkKCgpPT57aWYoIV98fCFMKXJldHVybjtyZXR1cm4gTCgoVik9PntXMC5jdXJyZW50Kys7bGV0IEg9TS5jdXJyZW50O2lmKEgpe2lmKHMwLmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTChzMC5jdXJyZW50KTtzMC5jdXJyZW50PVYsSC5zcmM9Vn1pZighXzQuY3VycmVudCljb25zb2xlLmxvZygiW3NlcnZlLXNpbV0gZmlyc3QgZnJhbWUgcmVjZWl2ZWQsIHJlbmRlcmluZyIpLEkoITApLHIobnVsbCl9KX0sW18sTF0pO2xldCBjPWooKFYpPT57aWYoXyl7UT8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1INixBLnNldChOLDEpLEguc2VuZChBKX0sW18sUV0pLG8wPWooKFYpPT57aWYoXyl7Rz8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoe2J1dHRvbjpWfSkpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1PNixBLnNldChOLDEpLEguc2VuZChBKX0sW18sR10pLG49aigoVik9PntpZihfKXt6Py4oVik7cmV0dXJufWxldCBIPUYuY3VycmVudDtpZighSHx8SC5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBOPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShWKSksQT1uZXcgVWludDhBcnJheSgxK04ubGVuZ3RoKTtBWzBdPVU2LEEuc2V0KE4sMSksSC5zZW5kKEEpfSxbXyx6XSk7ZCgoKT0+e2lmKF8pcmV0dXJuO2ZldGNoKGAke1h9L2NvbmZpZ2ApLnRoZW4oKEIpPT5CLmpzb24oKSkudGhlbigoQik9PntpZihCLndpZHRoPjAmJkIuaGVpZ2h0PjApaShCKX0pLmNhdGNoKCgpPT57fSk7bGV0IFY9WT8/WC5yZXBsYWNlKC9eaHR0cC8sIndzIikrIi93cyIsSD1uZXcgV2ViU29ja2V0KFYpO0guYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLEYuY3VycmVudD1ILEgub25vcGVuPSgpPT57SSghMCkscihudWxsKX0sSC5vbmNsb3NlPSgpPT57SSghMSl9LEgub25lcnJvcj0oKT0+e3IoIldlYlNvY2tldCBjb25uZWN0aW9uIGZhaWxlZCIpLEkoITEpfTtsZXQgTj1uZXcgQWJvcnRDb250cm9sbGVyLEE9c2V0SW50ZXJ2YWwoKCk9PntQNChXMC5jdXJyZW50KSxXMC5jdXJyZW50PTB9LDEwMDApO3JldHVybihhc3luYygpPT57dHJ5e2xldCBTPShhd2FpdCBmZXRjaChpMCx7c2lnbmFsOk4uc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFTKXJldHVybjtsZXQgaD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6bCx2YWx1ZTp1fT1hd2FpdCBTLnJlYWQoKTtpZihsKWJyZWFrO2lmKHUpZm9yKGxldCBlMD0wO2UwPD11Lmxlbmd0aC1oLmxlbmd0aDtlMCsrKXtsZXQgRTQ9ITA7Zm9yKGxldCBJMD0wO0kwPGgubGVuZ3RoO0kwKyspaWYodVtlMCtJMF0hPT1oW0kwXSl7RTQ9ITE7YnJlYWt9aWYoRTQpVzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntOLmFib3J0KCksY2xlYXJJbnRlcnZhbChBKSxILmNsb3NlKCksRi5jdXJyZW50PW51bGx9fSxbWCxpMCxfXSksZCgoKT0+e2lmKCFfKXJldHVybjtsZXQgVj1zZXRJbnRlcnZhbCgoKT0+e1A0KFcwLmN1cnJlbnQpLFcwLmN1cnJlbnQ9MH0sMTAwMCk7cmV0dXJuKCk9PmNsZWFySW50ZXJ2YWwoVil9LFtfXSk7bGV0IGU9aigoKT0+e3JldHVybiBfP00uY3VycmVudDpDLmN1cnJlbnR9LFtfXSksQjA9aigoVixIKT0+e2xldCBOPWUoKTtpZighTilyZXR1cm47bGV0IEE9Ti5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxCPShILmNsaWVudFgtQS5sZWZ0KS9BLndpZHRoLFM9KEguY2xpZW50WS1BLnRvcCkvQS5oZWlnaHQ7Yyh7dHlwZTpWLHg6Qix5OlN9KX0sW2NdKSxRMD0zLGE9dyghMSksbz13KCExKSx1MD13KCExKSxyMD13KHtkeDowLGR5OjB9KSxWMD13KCExKSxbdDAsRjRdPXAoITEpLGs0PXcoe3g6MC41LHk6MC41fSksW3EwLHNdPXAobnVsbCk7ZCgoKT0+e2xldCBWPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpRjQoITApfSxIPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpe2lmKEY0KCExKSwhby5jdXJyZW50KXMobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxkKCgpPT57aWYodDAmJiFvLmN1cnJlbnQpe2xldCBWPWs0LmN1cnJlbnQ7cyh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIXQwJiYhby5jdXJyZW50KXMobnVsbCl9LFt0MF0pO2xldCBfMD13KG51bGwpLG4wPXcoITEpLEgwPXcoMCksSTQ9aigoVixIKT0+e24wLmN1cnJlbnQ9ITA7bGV0IE49XzAuY3VycmVudDtpZihOKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLEgwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57Ti5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLE4uc3R5bGUudG9wPWAke0gqMTAwfSVgLE4uc3R5bGUuZGlzcGxheT0iYmxvY2sifSl9LFtdKSxNND1qKChWLEgpPT57aWYoIW4wLmN1cnJlbnQpcmV0dXJuO2xldCBOPV8wLmN1cnJlbnQ7aWYoTiljYW5jZWxBbmltYXRpb25GcmFtZShIMC5jdXJyZW50KSxIMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e04uc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxOLnN0eWxlLnRvcD1gJHtIKjEwMH0lYH0pfSxbXSksRjA9aigoKT0+e24wLmN1cnJlbnQ9ITE7bGV0IFY9XzAuY3VycmVudDtpZihWKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLFYuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFtdKSxDND13KDApLE8wPXcobnVsbCksdjU9aigoKT0+e2xldCBWPURhdGUubm93KCksSD1WLUM0LmN1cnJlbnQ7aWYoQzQuY3VycmVudD1WLEg8MzAwKXtpZihPMC5jdXJyZW50KWNsZWFyVGltZW91dChPMC5jdXJyZW50KSxPMC5jdXJyZW50PW51bGw7aWYoSylLKCk7ZWxzZSBvMCgiYXBwX3N3aXRjaGVyIil9ZWxzZSBPMC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntpZihLKUsoKTtlbHNlIG8wKCJob21lIik7TzAuY3VycmVudD1udWxsfSwzMDApfSxbbzAsS10pLGswPSgoKT0+e2lmKCFmfHwhbSlyZXR1cm4gbnVsbDtpZihtLndpZHRoPT09MHx8bS5oZWlnaHQ9PT0wKXJldHVybiBudWxsO2xldCBWPU1hdGgubWluKG0ud2lkdGgvZi53aWR0aCxtLmhlaWdodC9mLmhlaWdodCk7cmV0dXJue3dpZHRoOmYud2lkdGgqVixoZWlnaHQ6Zi5oZWlnaHQqVn19KSgpO3JldHVybiAkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixmbGV4OjEsLi4uTz97fTp7Ym9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LG92ZXJmbG93OiJoaWRkZW4iLG1pbldpZHRoOjAsbWluSGVpZ2h0OjAsLi4uWn0sY2xhc3NOYW1lOnEsY2hpbGRyZW46WyQoImRpdiIse3JlZjp5LHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxtaW5IZWlnaHQ6MCxtaW5XaWR0aDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LGNoaWxkcmVuOiQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLHdpZHRoOmswP2Ake2swLndpZHRofXB4YDoiMTAwJSIsaGVpZ2h0OmswP2Ake2swLmhlaWdodH1weGA6IjEwMCUifSxjaGlsZHJlbjpbJCgiaW1nIix7cmVmOkMsc3JjOl8/dm9pZCAwOmkwLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKWkoKE4pPT5OJiZOLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJk4uaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P046e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6Xz97ZGlzcGxheToibm9uZSJ9Ontwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSxfJiYkKCJpbWciLHtyZWY6TSxkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClpKChOKT0+TiYmTi53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZOLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9OOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSwkKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpPNCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsdTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cjAuY3VycmVudD17ZHg6MS1BLUEsZHk6MS1CLUJ9LHMoUyksbih7dHlwZToiYmVnaW4iLC4uLlN9KTtyZXR1cm59aWYoSTQoQSxCKSxCPjAuODgpYS5jdXJyZW50PSEwLGMoe3R5cGU6ImJlZ2luIix4OkEseTpCLGVkZ2U6UTB9KTtlbHNlIGEuY3VycmVudD0hMSxCMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKGs0LmN1cnJlbnQ9e3g6QSx5OkJ9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KXMoe3gxOkEseTE6Qix4MjoxLUEseTI6MS1CfSk7cmV0dXJufWlmKG8uY3VycmVudCl7bGV0IFM7aWYodTAuY3VycmVudCl7bGV0IGg9cjAuY3VycmVudDtTPXt4MTpBLHkxOkIseDI6QStoLmR4LHkyOkIraC5keX19ZWxzZSBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cyhTKSxuKHt0eXBlOiJtb3ZlIiwuLi5TfSk7cmV0dXJufWlmKE00KEEsQiksYS5jdXJyZW50KWMoe3R5cGU6Im1vdmUiLHg6QSx5OkIsZWRnZTpRMH0pO2Vsc2UgQjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1lKCk7aWYoSCl7bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxBPShWLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLEI9KFYuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYodTAuY3VycmVudCl7bGV0IFM9cjAuY3VycmVudDtuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjpBK1MuZHgseTI6QitTLmR5fSl9ZWxzZSBuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjoxLUEseTI6MS1CfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1CMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKG8uY3VycmVudCl7aWYocTApbih7dHlwZToiZW5kIiwuLi5xMH0pO28uY3VycmVudD0hMSxzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1pZihWLmJ1dHRvbnM+MClCMCgiZW5kIixWKTtzKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtGMCgpO2xldCBoPVYudG91Y2hlc1swXSxsPVYudG91Y2hlc1sxXSx1PXt4MTooaC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MTooaC5jbGllbnRZLU4udG9wKS9OLmhlaWdodCx4MjoobC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MjoobC5jbGllbnRZLU4udG9wKS9OLmhlaWdodH07aWYoIVYwLmN1cnJlbnQmJiFhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OnUueDEseTp1LnkxfSk7VjAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYS5jdXJyZW50PSExLHModSksbih7dHlwZToiYmVnaW4iLC4uLnV9KTtyZXR1cm59bGV0IEE9Vi50b3VjaGVzWzBdO2lmKCFBKXJldHVybjtsZXQgQj0oQS5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxTPShBLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKEk0KEIsUyksUz4wLjg4KWEuY3VycmVudD0hMCxjKHt0eXBlOiJiZWdpbiIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBhLmN1cnJlbnQ9ITEsYyh7dHlwZToiYmVnaW4iLHg6Qix5OlN9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgaD1WLnRvdWNoZXNbMF0sbD1WLnRvdWNoZXNbMV0sdT17eDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6KGwuY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTI6KGwuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHR9O3ModSksbih7dHlwZToibW92ZSIsLi4udX0pO3JldHVybn1sZXQgQT1WLnRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoTTQoQixTKSxhLmN1cnJlbnQpYyh7dHlwZToibW92ZSIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBjKHt0eXBlOiJtb3ZlIix4OkIseTpTfSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBoPVYuY2hhbmdlZFRvdWNoZXNbMF0sbD1xMDtpZihoJiZsKW4oe3R5cGU6ImVuZCIseDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6bC54Mix5MjpsLnkyfSk7ZWxzZSBpZihsKW4oe3R5cGU6ImVuZCIsLi4ubH0pO1YwLmN1cnJlbnQ9ITEsby5jdXJyZW50PSExLHMobnVsbCl9cmV0dXJufWxldCBBPVYuY2hhbmdlZFRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoRjAoKSxhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OkIseTpTLGVkZ2U6UTB9KSxhLmN1cnJlbnQ9ITE7ZWxzZSBjKHt0eXBlOiJlbmQiLHg6Qix5OlN9KX19KSwkKCJkaXYiLHtyZWY6XzAsImRhdGEtdGVzdGlkIjoidG91Y2gtaW5kaWNhdG9yIixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJub25lIix3aWR0aDoyNCxoZWlnaHQ6MjQsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoNTksMTMwLDI0NiwwLjUpIixib3hTaGFkb3c6IjAgMCA4cHggcmdiYSg1OSwxMzAsMjQ2LDAuMykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19KSxxMCYmJCh4LHtjaGlsZHJlbjpbJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDEscTAueTEpfSksJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDIscTAueTIpfSldfSksIUUmJiF2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNH0sY2hpbGRyZW46IkNvbm5lY3RpbmcuLi4ifSl9KSx2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZjQ0Iixmb250U2l6ZToxNCxwYWRkaW5nOjIwLHRleHRBbGlnbjoiY2VudGVyIn0sY2hpbGRyZW46dn0pfSkscDUmJiQoImRpdiIse3N0eWxlOkE2LGNoaWxkcmVuOiQoInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmYmJmMjQiLGZvbnRTaXplOjEzLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSJ9LGNoaWxkcmVuOiJTbG93IGNvbm5lY3Rpb24ifSl9KV19KX0pLCFPJiYkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNHB4IDhweCIsYm9yZGVyVG9wOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LGNoaWxkcmVuOlskKCJidXR0b24iLHtvbkNsaWNrOnY1LHN0eWxlOntiYWNrZ3JvdW5kOiJub25lIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMikiLGNvbG9yOiIjYWFhIixmb250U2l6ZToxMSxmb250RmFtaWx5OiJtb25vc3BhY2UiLHBhZGRpbmc6IjJweCAxMHB4IixjdXJzb3I6InBvaW50ZXIiLGJvcmRlclJhZGl1czo0fSxjaGlsZHJlbjoiSG9tZSJ9KSwkKCJzcGFuIix7c3R5bGU6e2NvbG9yOkQ0PjA/IiM0ZjQiOiIjODg4Iixmb250U2l6ZToxMixmb250RmFtaWx5OiJtb25vc3BhY2UiLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjZ9LGNoaWxkcmVuOltrJiYkKCJzcGFuIix7ImRhdGEtdGVzdGlkIjoicXVhbGl0eS1kb3QiLHN0eWxlOnt3aWR0aDo4LGhlaWdodDo4LGJvcmRlclJhZGl1czoiNTAlIixkaXNwbGF5OiJpbmxpbmUtYmxvY2siLGJhY2tncm91bmQ6az09PSJnb29kIj8iIzRhZGU4MCI6az09PSJkZWdyYWRlZCI/IiNmYWNjMTUiOiIjZWY0NDQ0In19KSxENCwiIGZwcyJdfSldfSldfSl9dmFyIEE2PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDo4LGxlZnQ6IjUwJSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC01MCUpIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuNykiLGJvcmRlclJhZGl1czo2LHBhZGRpbmc6IjRweCAxMnB4Iixwb2ludGVyRXZlbnRzOiJub25lIn0sUzU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC44KSJ9LFQ1PTIwO2Z1bmN0aW9uIGI1KFgsWSl7cmV0dXJue3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDpgJHtYKjEwMH0lYCx0b3A6YCR7WSoxMDB9JWAsd2lkdGg6VDUsaGVpZ2h0OlQ1LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC43KSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX1mdW5jdGlvbiBkMChYKXtpZighWClyZXR1cm4iaXBob25lIjtsZXQgWT1YLnRvTG93ZXJDYXNlKCk7aWYoWS5pbmNsdWRlcygiaXBhZCIpKXJldHVybiJpcGFkIjtpZihZLmluY2x1ZGVzKCJ3YXRjaCIpKXJldHVybiJ3YXRjaCI7aWYoWS5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuInZpc2lvbiI7cmV0dXJuImlwaG9uZSJ9dmFyIFI9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LFU3PVIuaXBob25lLndpZHRoLEE3PVIuaXBob25lLmhlaWdodCxENz1SLmlwaG9uZS5iZXplbFgsUDc9Ui5pcGhvbmUuYmV6ZWxZLEI3PVIuaXBob25lLmlubmVyUmFkaXVzO2Z1bmN0aW9uIFU0KFg9ImlwaG9uZSIpe2xldCBZPVJbWF07cmV0dXJue3RvcDpgJHtZLmJlemVsWS9ZLmhlaWdodCoxMDB9JWAsbGVmdDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxyaWdodDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxib3R0b206YCR7WS5iZXplbFkvWS5oZWlnaHQqMTAwfSVgfX1mdW5jdGlvbiBtMChYPSJpcGhvbmUiKXtsZXQgWT1SW1hdLFo9WS53aWR0aC0yKlkuYmV6ZWxYLEo9WS5oZWlnaHQtMipZLmJlemVsWTtyZXR1cm5gJHtZLmlubmVyUmFkaXVzL1oqMTAwfSUgLyAke1kuaW5uZXJSYWRpdXMvSioxMDB9JWB9ZnVuY3Rpb24gaDAoe3R5cGU6WD0iaXBob25lIixzdHJlYW1pbmc6WT0hMX0pe3N3aXRjaChYKXtjYXNlImlwYWQiOnJldHVybiAkKEI2LHtzdHJlYW1pbmc6WX0pO2Nhc2Uid2F0Y2giOnJldHVybiAkKF82LHtzdHJlYW1pbmc6WX0pO2Nhc2UidmlzaW9uIjpyZXR1cm4gJChGNix7c3RyZWFtaW5nOll9KTtkZWZhdWx0OnJldHVybiAkKFA2LHtzdHJlYW1pbmc6WX0pfX1mdW5jdGlvbiBQNih7c3RyZWFtaW5nOlg9ITF9KXtyZXR1cm4gJCgic3ZnIix7dmlld0JveDoiMCAwIDQyNyA4ODEiLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjAiLHg6Ii0wLjE2Njk5MiIseToiMC4xNjY1MDQiLHdpZHRoOiI0MjciLGhlaWdodDoiODgwLjY2NyIsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiZWZmZWN0MV9mb3JlZ3JvdW5kQmx1ciJ9KV19KSwkKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjEiLHg6IjYuMzMyMzYiLHk6IjYuMzMzODIiLHdpZHRoOiI0MTQiLGhlaWdodDoiODY4IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuMzMzMzMzIixyZXN1bHQ6ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXIifSldfSldfSksJCgicmVjdCIse3g6IjMuODMyNjgiLHk6IjMuODMzNjYiLHdpZHRoOiI0MTkiLGhlaWdodDoiODczIixyeDoiNjYuMTY2NyIsc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiNC4zMzMzMyJ9KSwkKCJyZWN0Iix7eDoiMC44MzMzMzMiLHk6IjAuODMzMzMzIix3aWR0aDoiNDI1IixoZWlnaHQ6Ijg3OSIscng6IjY5LjE2NjciLHN0cm9rZToiIzM3MzczYSIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI2Nocm9tZS1maWx0ZXIwKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjEuNjY2MDIiLHk6IjIiLHdpZHRoOiI0MjMuMzMzIixoZWlnaHQ6Ijg3NyIscng6IjY4LjY2NjciLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjY2hyb21lLWZpbHRlcjEpIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiNy4zMzI2OCIseToiNy4zMzM2NiIsd2lkdGg6IjQxMiIsaGVpZ2h0OiI4NjYiLHJ4OiI2Mi42NjY3IixzdHJva2U6IiM2NDY0NjQiLHN0cm9rZVdpZHRoOiIwLjY2NjY2NyJ9KX0pLCQoInJlY3QiLHt4OiIxNTEuNjY2Iix5OiIzMS42NjciLHdpZHRoOiIxMjMuMzMzIixoZWlnaHQ6IjM2IixyeDoiMTgiLGZpbGw6ImJsYWNrIixzdHlsZTp7b3BhY2l0eTpYPzA6MSx0cmFuc2l0aW9uOiJvcGFjaXR5IDAuM3MgZWFzZSJ9fSldfSl9ZnVuY3Rpb24gQjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui5pcGFkLndpZHRoLFo9Ui5pcGFkLmhlaWdodCxKPTMwLHE9MjY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiaXBhZC1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJpcGFkLWdsb3cxIix4OiI1Iix5OiI1Iix3aWR0aDpZLTEwLGhlaWdodDpaLTEwLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46WyQoImZlRmxvb2QiLHtmbG9vZE9wYWNpdHk6IjAiLHJlc3VsdDoiQmFja2dyb3VuZEltYWdlRml4In0pLCQoImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluOiJTb3VyY2VHcmFwaGljIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJzaGFwZSJ9KSwkKCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC4zMzMzMzMiLHJlc3VsdDoiYmx1ciJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMy41Iix5OiIzLjUiLHdpZHRoOlktNyxoZWlnaHQ6Wi03LHJ4OjI2LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjQifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDozMCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mjksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MSkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiI2Iix5OiI2Iix3aWR0aDpZLTEyLGhlaWdodDpaLTEyLHJ4OjI0LHN0cm9rZToiIzY0NjQ2NCIsc3Ryb2tlV2lkdGg6IjAuNjY2In0pfSksJCgiY2lyY2xlIix7Y3g6WS8yLGN5OlIuaXBhZC5iZXplbFkvMisxLHI6IjMiLGZpbGw6IiMxYTFhMWEiLHN0eWxlOntvcGFjaXR5Olg/MDowLjgsdHJhbnNpdGlvbjoib3BhY2l0eSAwLjNzIGVhc2UifX0pLCQoInJlY3QiLHt4OihZLTEyMCkvMix5OlotUi5pcGFkLmJlemVsWS8yLTIuNSx3aWR0aDoiMTIwIixoZWlnaHQ6IjUiLHJ4OiIyLjUiLGZpbGw6IndoaXRlIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zNSxtaXhCbGVuZE1vZGU6ImRpZmZlcmVuY2UiLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX1mdW5jdGlvbiBfNih7c3RyZWFtaW5nOlg9ITF9KXtsZXQgWT1SLndhdGNoLndpZHRoLFo9Ui53YXRjaC5oZWlnaHQsSj04OCxxPTgyLEs9OCxRPTM2LHo9Wi8yLTE4LTE2LEc9MjIsTD1aLzItMTErMTY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixvdmVyZmxvdzoidmlzaWJsZSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjokKCJmaWx0ZXIiLHtpZDoid2F0Y2gtZ2xvdzAiLHg6IjAiLHk6IjAiLHdpZHRoOlkrMTIsaGVpZ2h0OlosZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiYmx1ciJ9KV19KX0pLCQoInJlY3QiLHt4OlktMix5Onosd2lkdGg6OCxoZWlnaHQ6MzYscng6IjMiLGZpbGw6IiMyYTJhMmMiLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEifSksJCgicmVjdCIse3g6WS0xLHk6TCx3aWR0aDo2LGhlaWdodDoyMixyeDoiMi41IixmaWxsOiIjMmEyYTJjIixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIwLjgifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDo4MixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzLjUifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDo4OCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjd2F0Y2gtZ2xvdzApIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiMS41Iix5OiIxLjUiLHdpZHRoOlktMyxoZWlnaHQ6Wi0zLHJ4Ojg3LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2In0pfSldfSl9ZnVuY3Rpb24gRjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui52aXNpb24ud2lkdGgsWj1SLnZpc2lvbi5oZWlnaHQsSj00MCxxPTM0O3JldHVybiAkKCJzdmciLHt2aWV3Qm94OmAwIDAgJHtZfSAke1p9YCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjpbJCgiZmlsdGVyIix7aWQ6InZpc2lvbi1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJ2aXNpb24tZ2xvdzEiLHg6IjUiLHk6IjUiLHdpZHRoOlktMTAsaGVpZ2h0OlotMTAsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjMzMyIscmVzdWx0OiJibHVyIn0pXX0pLCQoImxpbmVhckdyYWRpZW50Iix7aWQ6InZpc2lvbi1nbGFzcyIseDE6IjAiLHkxOiIwIix4MjoiMCIseTI6IjEiLGNoaWxkcmVuOlskKCJzdG9wIix7b2Zmc2V0OiIwJSIsc3RvcENvbG9yOiIjNTU1NTU4IixzdG9wT3BhY2l0eToiMC4zIn0pLCQoInN0b3AiLHtvZmZzZXQ6IjEwMCUiLHN0b3BDb2xvcjoiIzNhM2EzZCIsc3RvcE9wYWNpdHk6IjAuMSJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixyeDo0MCxmaWxsOiJ1cmwoI3Zpc2lvbi1nbGFzcykifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDozNCxzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzIn0pLCQoInJlY3QiLHt4OiIwLjgzMyIseToiMC44MzMiLHdpZHRoOlktMS42NjYsaGVpZ2h0OlotMS42NjYscng6NDAsc3Ryb2tlOiIjMzczNzNhIixzdHJva2VXaWR0aDoiMS42NjYifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI3Zpc2lvbi1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mzksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjdmlzaW9uLWdsb3cxKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjYiLHk6IjYiLHdpZHRoOlktMTIsaGVpZ2h0OlotMTIscng6MzIsc3Ryb2tlOiIjNjQ2NDY0IixzdHJva2VXaWR0aDoiMC42NjYifSl9KSwkKCJlbGxpcHNlIix7Y3g6WS8yLGN5OlovMixyeDpZLzItMzAscnk6Wi8yLTI0LHN0cm9rZToiIzRhNGE0ZCIsc3Ryb2tlV2lkdGg6IjAuNSIsb3BhY2l0eToiMC4zIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX12YXIgQTQ9ejAobnVsbCk7ZnVuY3Rpb24gZjAoWCl7bGV0IFk9UDAoQTQpO2lmKCFZKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWX12YXIgTTY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBDNih7ZXhlYzpYLGRldmljZVVkaWQ6WSxkZXZpY2VOYW1lOlosZGV2aWNlUnVudGltZTpKLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOks9ITEsY2hpbGRyZW46USxzdHlsZTp6LC4uLkd9KXtsZXQgTD1kMChaKSxXPXtleGVjOlgsZGV2aWNlVWRpZDpZLGRldmljZU5hbWU6WixkZXZpY2VSdW50aW1lOkosZGV2aWNlVHlwZTpMLHN0cmVhbWluZzpxLGRpc2FibGVkOkt8fCFZfHwhcX07cmV0dXJuICQoQTQuUHJvdmlkZXIse3ZhbHVlOlcsY2hpbGRyZW46JCgiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi5NNiwuLi56fSwuLi5HLGNoaWxkcmVuOlF9KX0pfXZhciBFNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sdzY9RzAoZnVuY3Rpb24oe25hbWU6WSxzdWJ0aXRsZTpaLGhpZGVDaGV2cm9uOkosc3R5bGU6cSxvbk1vdXNlRW50ZXI6Syxvbk1vdXNlTGVhdmU6USwuLi56fSxHKXtsZXQgTD1mMCgiVGl0bGUiKSxbRCxXXT1wKCExKSxPPVk/P0wuZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsVT1aPz8oTC5kZXZpY2VSdW50aW1lP0wuZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooayk9PntXKCEwKSxLPy4oayl9LG9uTW91c2VMZWF2ZTooayk9PntXKCExKSxRPy4oayl9LHN0eWxlOnsuLi5FNixiYWNrZ3JvdW5kOkQ/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi56LGNoaWxkcmVuOlskKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W08sIUomJiQoInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46JCgicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksJCgic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46VX0pXX0pfSksUzY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBUNih7c3R5bGU6WCwuLi5ZfSl7cmV0dXJuICQoImRpdiIse3N0eWxlOnsuLi5TNiwuLi5YfSwuLi5ZfSl9dmFyIGI2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LGEwPUcwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlksc3R5bGU6WixkaXNhYmxlZDpKLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpLLGNoaWxkcmVuOlEsLi4uen0sRyl7bGV0IEw9UDAoQTQpLEQ9Snx8WXx8TD8uZGlzYWJsZWQsW1csT109cCghMSk7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6RCxvbk1vdXNlRW50ZXI6KFUpPT57TyghMCkscT8uKFUpfSxvbk1vdXNlTGVhdmU6KFUpPT57TyghMSksSz8uKFUpfSxzdHlsZTp7Li4uYjYsY29sb3I6RD8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDpXJiYhRD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpEPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLlp9LC4uLnosY2hpbGRyZW46UX0pfSk7ZnVuY3Rpb24gcDYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFkpPT5gLWUgJyR7WX0nYCkucmVkdWNlKChZLFopPT5gJHtZfSAke1p9YCwib3Nhc2NyaXB0Iil9dmFyIHY2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOiQoInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxqNj0kKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbJCgicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLCQoImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLFI2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46JCgicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSkseTY9RzAoZnVuY3Rpb24oe29uQ2xpY2s6WSwuLi5afSxKKXtsZXQgcT1mMCgiSG9tZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMocDYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5aLGNoaWxkcmVuOnY2fSl9KSxnNj1HMChmdW5jdGlvbih7b25DbGljazpZLC4uLlp9LEope2xldCBxPWYwKCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuICQoYTAse3JlZjpKLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooSyk9PntpZihZPy4oSyksSy5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLlosY2hpbGRyZW46ajZ9KX0pLHg2PUcwKGZ1bmN0aW9uKHtvbkNsaWNrOlksLi4uWn0sSil7bGV0IHE9ZjAoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5aLGNoaWxkcmVuOlI2fSl9KSwkMD1DNjskMC5UaXRsZT13NjskMC5BY3Rpb25zPVQ2OyQwLkJ1dHRvbj1hMDskMC5Ib21lQnV0dG9uPXk2OyQwLlNjcmVlbnNob3RCdXR0b249ZzY7JDAuUm90YXRlQnV0dG9uPXg2O2Z1bmN0aW9uIGQ2KFgpe2xldFtZLFpdPXAobnVsbCksSj13KG5ldyBTZXQpLFtxLEtdPXAobnVsbCksUT1qKCh6KT0+e3JldHVybiBKLmN1cnJlbnQuYWRkKHopLCgpPT57Si5jdXJyZW50LmRlbGV0ZSh6KX19LFtdKTtyZXR1cm4gZCgoKT0+e2lmKCFYKXJldHVybjtsZXQgej1uZXcgQWJvcnRDb250cm9sbGVyLEc9WC5yZXBsYWNlKC9cL3N0cmVhbVwubWpwZWckLywiIik7cmV0dXJuIGZldGNoKGAke0d9L2NvbmZpZ2Ase3NpZ25hbDp6LnNpZ25hbH0pLnRoZW4oKEwpPT5MLmpzb24oKSkudGhlbigoTCk9PntpZihMLndpZHRoPjAmJkwuaGVpZ2h0PjApWihMKX0pLmNhdGNoKCgpPT57fSksKGFzeW5jKCk9Pnt0cnl7bGV0IEQ9KGF3YWl0IGZldGNoKFgse3NpZ25hbDp6LnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighRClyZXR1cm47bGV0IFc9bmV3IFVpbnQ4QXJyYXkoMCk7d2hpbGUoITApe2xldHtkb25lOk8sdmFsdWU6VX09YXdhaXQgRC5yZWFkKCk7aWYoTylicmVhaztsZXQgaz1uZXcgVWludDhBcnJheShXLmxlbmd0aCtVLmxlbmd0aCk7ay5zZXQoVyksay5zZXQoVSxXLmxlbmd0aCksVz1rO3doaWxlKCEwKXtsZXQgXz0tMTtmb3IobGV0IEk9MDtJPFcubGVuZ3RoLTE7SSsrKWlmKFdbSV09PT0yNTUmJldbSSsxXT09PTIxNil7Xz1JO2JyZWFrfWlmKF89PT0tMSlicmVhaztsZXQgQz0tMTtmb3IobGV0IEk9XysyO0k8Vy5sZW5ndGgtMTtJKyspaWYoV1tJXT09PTI1NSYmV1tJKzFdPT09MjE3KXtDPUkrMjticmVha31pZihDPT09LTEpYnJlYWs7bGV0IE09Vy5zbGljZShfLEMpO1c9Vy5zbGljZShDKTtsZXQgRj1uZXcgQmxvYihbTV0se3R5cGU6ImltYWdlL2pwZWcifSksRT1VUkwuY3JlYXRlT2JqZWN0VVJMKEYpO0soRSk7Zm9yKGxldCBJIG9mIEouY3VycmVudClJKEUpfX19Y2F0Y2h7fX0pKCksKCk9PnouYWJvcnQoKX0sW1hdKSx7c3Vic2NyaWJlRnJhbWU6USxmcmFtZTpxLGNvbmZpZzpZfX1mdW5jdGlvbiBtNigpe2xldCBYPXdpbmRvdy5fX1NJTV9QUkVWSUVXX18sW1ksWl09cCghMSk7aWYoZCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBPPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksVT1uZXcgTWFwLGs9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBfKEYpe2xldCBFPVUuZ2V0KEYpO2lmKCFFKXtsZXQgST0wO2ZvcihsZXQgdj0wO3Y8Ri5sZW5ndGg7disrKUk9KEk8PDUpLUkrRi5jaGFyQ29kZUF0KHYpfDA7RT1rW01hdGguYWJzKEkpJWsubGVuZ3RoXSxVLnNldChGLEUpfXJldHVybiBFfWxldCBDPSIiLE09ITE7cmV0dXJuIE8ub25tZXNzYWdlPShGKT0+e3RyeXtsZXQgRT1KU09OLnBhcnNlKEYuZGF0YSksST1FLnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P0Uuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIix2PUUuc3Vic3lzdGVtPz8iIixyPUUuY2F0ZWdvcnk/PyIiLGY9RS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFmKXJldHVybjtpZihJIT09Qyl7aWYoTSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IGMwPV8oSSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke0l9JHt2P2AgJWMke3Z9JHtyPyI6IityOiIifWA6IiJ9YCxgY29sb3I6JHtjMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4udj9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLE09ITAsQz1JfWxldCBpPShFLm1lc3NhZ2VUeXBlPz8iIikudG9Mb3dlckNhc2UoKSx5PXYmJkk9PT1DP2AlYyR7cnx8dn0lYyBgOiIiLG09eT9bImNvbG9yOiM4ODg7Zm9udC1zdHlsZTppdGFsaWMiLCJjb2xvcjppbmhlcml0Il06W107aWYoaT09PSJmYXVsdCJ8fGk9PT0iZXJyb3IiKWNvbnNvbGUubG9nKGAke3l9JWMke2Z9YCwuLi5tLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihpPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt5fSVjJHtmfWAsLi4ubSwiY29sb3I6IzYyNzJhNCIpO2Vsc2UgY29uc29sZS5sb2coYCR7eX0lYyR7Zn1gLC4uLm0sImNvbG9yOmluaGVyaXQiKX1jYXRjaHt9fSwoKT0+e2lmKE0pY29uc29sZS5ncm91cEVuZCgpO08uY2xvc2UoKX19LFtYPy5sb2dzRW5kcG9pbnRdKSwhWClyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjokKCJkaXYiLHtzdHlsZTpKMC5lbXB0eSxjaGlsZHJlbjpbJCgiaDEiLHtzdHlsZTpKMC5lbXB0eVRpdGxlLGNoaWxkcmVuOiJObyBzZXJ2ZS1zaW0gc3RyZWFtIHJ1bm5pbmcifSksJCgicCIse3N0eWxlOkowLmVtcHR5SGludCxjaGlsZHJlbjpbIkJvb3QgYW4gaU9TIHNpbXVsYXRvciBhbmQgc3RhcnQgYSBIYXRjaCBzdHJlYW0gd2l0aCIsIiAiLCQoImNvZGUiLHtzdHlsZTpKMC5jb2RlLGNoaWxkcmVuOiJidW54IHNlcnZlLXNpbSAtLWRldGFjaCJ9KSwiLCB0aGVuIHJlbG9hZC4iXX0pXX0pfSk7bGV0IEo9Ui5pcGhvbmUscT1VNCgiaXBob25lIiksSz1tMCgiaXBob25lIiksUT1kNihYLnN0cmVhbVVybCksej13KG51bGwpO2QoKCk9PntsZXQgTz1uZXcgV2ViU29ja2V0KFgud3NVcmwpO3JldHVybiBPLmJpbmFyeVR5cGU9ImFycmF5YnVmZmVyIix6LmN1cnJlbnQ9TywoKT0+e08uY2xvc2UoKSx6LmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IEc9aigoTyxVKT0+e2xldCBrPXouY3VycmVudDtpZigha3x8ay5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBfPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShVKSksQz1uZXcgVWludDhBcnJheSgxK18ubGVuZ3RoKTtDWzBdPU8sQy5zZXQoXywxKSxrLnNlbmQoQyl9LFtdKSxMPWooKE8pPT5HKDMsTyksW0ddKSxEPWooKE8pPT5HKDUsTyksW0ddKSxXPWooKE8pPT5HKDQse2J1dHRvbjpPfSksW0ddKTtyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjpbJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWF4V2lkdGg6MzIwLHdpZHRoOiIxMDAlIixhc3BlY3RSYXRpbzpgJHtKLndpZHRofSAvICR7Si5oZWlnaHR9YH0sY2hpbGRyZW46WyQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLnF9LGNoaWxkcmVuOiQoeDAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOkssY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOlosb25TdHJlYW1Ub3VjaDpMLG9uU3RyZWFtTXVsdGlUb3VjaDpELG9uU3RyZWFtQnV0dG9uOlcsc3Vic2NyaWJlRnJhbWU6US5zdWJzY3JpYmVGcmFtZSxzdHJlYW1GcmFtZTpRLmZyYW1lLHN0cmVhbUNvbmZpZzpRLmNvbmZpZ30pfSksJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxwb2ludGVyRXZlbnRzOiJub25lIix6SW5kZXg6MTB9LGNoaWxkcmVuOiQoaDAse3R5cGU6ImlwaG9uZSIsc3RyZWFtaW5nOll9KX0pXX0pLCQoImRpdiIse3N0eWxlOkowLmJhcixjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6ey4uLkowLmxpdmUsY29sb3I6WT8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbJCgic3BhbiIse3N0eWxlOnsuLi5KMC5kb3QsYmFja2dyb3VuZDpZPyIjNGFkZTgwIjoiIzY2NiJ9fSksWT8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIEowPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX07SDUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJvb3QiKSkucmVuZGVyKCQobTYse30pKTsKPC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+","base64").toString("utf-8");return V}function ge(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,C,S)=>{let A=t.url??"";if(A===_||A===_+"/"){let i=N()[0]??null,r=le();if(i){let R=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...i,logsEndpoint:_+"/logs"})}</script>`;r=r.replace("<!--__SIM_PREVIEW_CONFIG__-->",R)}C.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),C.end(r);return}if(A===_+"/api"){let B=N();C.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),C.end(JSON.stringify(B[0]||null));return}if(A===_+"/logs"||A.startsWith(_+"/logs?")){let B=N();if(B.length===0){C.writeHead(404),C.end("No serve-sim device");return}let i=B[0].device;C.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),C.write(`:
3
+ var pe=Object.defineProperty;var De=(e)=>e;function Ee(e,_){this[e]=De.bind(null,_)}var de=(e,_)=>{for(var t in _)pe(e,t,{get:_[t],enumerable:!0,configurable:!0,set:Ee.bind(_,t)})};var le=(e,_)=>()=>(e&&(_=e(e=0)),_);var K={};de(K,{simMiddleware:()=>Ie});import{readdirSync as we,readFileSync as ve,existsSync as be,unlinkSync as X}from"fs";import{execSync as he,spawn as G,exec as Oe,execFile as me}from"child_process";import{tmpdir as He}from"os";import{join as P}from"path";function We(e){return!Le.test(e)}function Pe(e,_){if(Ne.has(_))return Promise.resolve(!0);return new Promise((t)=>{me("xcrun",["simctl","get_app_container",e,_,"app"],{timeout:2000},(s,i)=>{if(s)return t(!1);let S=i.trim();if(!S)return t(!1);for(let o of Ve)if(be(P(S,o)))return t(!0);t(!1)})})}function qe(){let e=Date.now();if(b.booted&&e-b.at<1500)return b.booted;try{let _=he("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let i of Object.values(t.devices))for(let S of i)if(S.state==="Booted")s.add(S.udid);return b={at:e,booted:s},s}catch{return null}}function h(){let e;try{e=we(x).filter((s)=>s.startsWith("server-")&&s.endsWith(".json"))}catch{return[]}let _=qe(),t=[];for(let s of e){let i=P(x,s);try{let S=JSON.parse(ve(i,"utf-8"));try{process.kill(S.pid,0)}catch{try{X(i)}catch{}continue}if(_&&!_.has(S.device)){try{process.kill(S.pid,"SIGTERM")}catch{}try{X(i)}catch{}continue}t.push(S)}catch{}}return t}function Me(){if(!W)W=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLEMsVSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZNW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLEM9QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8QyxBKSksVT09bnVsbCYmQyE9bnVsbCYmKFU9QyksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLEMsVSxrLEksTSxoLEUsZSxaMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsQyxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLEMpKSxnPU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLEMsVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIU0mJihNP0EubG9jYWxOYW1lPT1NOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP0M9QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEseCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTt4KCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO3goKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxNLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO3goKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTt4KCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSx4KCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIWd8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC9nLndpZHRoLHIuaGVpZ2h0L2cuaGVpZ2h0KTtyZXR1cm57d2lkdGg6Zy53aWR0aCpWLGhlaWdodDpnLmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W0MmJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpDPT09Imdvb2QiPyIjNGFkZTgwIjpDPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooQyk9PnskKCEwKSxRPy4oQyl9LG9uTW91c2VMZWF2ZTooQyk9PnskKCExKSxLPy4oQyl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiB4KCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBDPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtDLnNldCgkKSxDLnNldChBLCQubGVuZ3RoKSwkPUM7d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBNPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoTSk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO3goKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLEM9WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLEMmJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoQy5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOkMubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBNPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFNKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOk0/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOk0/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6TT8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpNPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKHgoKCk9PntBKCl9LFtBXSkseCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxVPWswKEM/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLFUwPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTt4KCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return W}function Ie(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,s,i)=>{let S=t.url??"";if(S===_||S===_+"/"){let C=h()[0]??null,$=Me();if(C){let a=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...C,logsEndpoint:_+"/logs"})}</script>`;$=$.replace("<!--__SIM_PREVIEW_CONFIG__-->",a)}s.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),s.end($);return}if(S===_+"/api"){let o=h();s.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),s.end(JSON.stringify(o[0]||null));return}if((S===_+"/exec"||S===_+"/exec/")&&t.method==="POST"){let o="";t.on("data",(C)=>{o+=typeof C==="string"?C:C.toString()}),t.on("end",()=>{let C="";try{C=JSON.parse(o).command??""}catch{}if(!C){s.writeHead(400,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}Oe(C,{maxBuffer:16777216},($,r,a)=>{s.writeHead(200,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:r.toString(),stderr:a.toString(),exitCode:$?$.code??1:0}))})});return}if(S===_+"/logs"||S.startsWith(_+"/logs?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
4
4
 
5
- `);let r=Te("xcrun",["simctl","spawn",i,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),s="";r.stdout.on("data",(R)=>{s+=R.toString();let D;while((D=s.indexOf(`
6
- `))!==-1){let o=s.slice(0,D).trim();if(s=s.slice(D+1),o)C.write("data: "+o+`
5
+ `);let $=G("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),r="";$.stdout.on("data",(a)=>{r+=a.toString();let n;while((n=r.indexOf(`
6
+ `))!==-1){let y=r.slice(0,n).trim();if(r=r.slice(n+1),y)s.write("data: "+y+`
7
7
 
8
- `)}}),r.on("close",()=>C.end()),t.on("close",()=>r.kill());return}if(S)S()}}var k,V=null;var K=ce(()=>{k=P(ue(),"serve-sim")});import{execSync as y,spawn as x}from"child_process";import{chmodSync as Fe,existsSync as u,mkdirSync as j,openSync as J,closeSync as Q,readFileSync as v,unlinkSync as L,writeFileSync as Z}from"fs";import{createHash as de}from"crypto";import{homedir as we,networkInterfaces as Oe}from"os";import{join as ve,resolve as W}from"path";import{tmpdir as be}from"os";import{join as g}from"path";import{readdirSync as he}from"fs";var b=g(be(),"serve-sim"),Ze=g(b,"server.json");function F(e){return g(b,`server-${e}.json`)}function d(){try{return he(b).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>g(b,e))}catch{return[]}}var T="./serve-sim-bin-pwrv9qme.";function q(){if(!u(b))j(b,{recursive:!0})}function p(e){if(e)return M(F(e));for(let _ of d()){let t=M(_);if(t)return t}return null}function M(e){try{if(!u(e))return null;let _=JSON.parse(v(e,"utf-8"));try{return process.kill(_.pid,0),_}catch{return L(e),null}}catch{return null}}function m(){let e=[];for(let _ of d()){let t=M(_);if(t)e.push(t)}return e}function X(e){q(),Z(F(e.device),JSON.stringify(e,null,2))}function l(e){if(e)try{L(F(e))}catch{}else for(let _ of d())try{L(_)}catch{}}function me(){let e=T.startsWith("/$bunfs/");if(!e&&u(T))return T;if(!e){let A=W(import.meta.dir,"../bin/serve-sim-bin");if(u(A))return A;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
9
- Checked: ${T}, ${A}`)}let _=v(T),t=de("sha256").update(_).digest("hex").slice(0,16),C=W(we(),"Library/Caches/serve-sim");j(C,{recursive:!0});let S=W(C,`serve-sim-bin-${t}`);if(!u(S)){Z(S,_),Fe(S,493);try{y(`codesign -s - -f ${JSON.stringify(S)}`,{stdio:"ignore"})}catch{}}return S}function Y(){try{let e=y("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let C of t)if(C.state==="Booted")return C.udid}catch{}return null}function z(e){try{let _=y("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let C of Object.values(t.devices))for(let S of C)if(S.udid===e)return S.name}catch{}return null}function E(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=y("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let C of Object.values(t.devices))for(let S of C)if(S.name.toLowerCase()===e.toLowerCase())return S.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function ee(e){try{let _=y("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let C of Object.values(t.devices))for(let S of C)if(S.udid===e)return S.state==="Booted"}catch{}return!1}function I(e){try{return process.kill(e,0),!0}catch{return!1}}function G(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function Ee(e){try{let _=y(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
10
- `).map((C)=>parseInt(C,10)).filter((C)=>Number.isFinite(C)&&C!==t)}catch{return[]}}function Ne(e){let _=Ee(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function Ve(e){if(!ee(e))try{y(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{y("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function We(){let e=Oe();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function _e(e){let _=new Set(m().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function Le(e){Ve(e);try{y(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!ee(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function te(e,_,t,C){let S=!1;for(let B=0;B<30;B++){if(!C())break;try{if((await fetch(`${_}/health`)).ok){S=!0;break}}catch{}await new Promise((i)=>setTimeout(i,100))}if(S){let B=Date.now()+8000;while(Date.now()<B){if(await new Promise((i)=>setTimeout(i,200)),!C()){S=!1;break}try{if(v(t,"utf-8").includes("Capture started"))break}catch{}}}let A="";try{A=v(t,"utf-8").trim()}catch{}return{ready:S,log:A}}async function Me(e){let{helperPath:_,udid:t,port:C,host:S,logFile:A}=e,B=`http://${S}:${C}`;q();let i=J(A,"w"),r=x(_,[t,"--port",String(C)],{detached:!0,stdio:["ignore",i,i]});r.unref(),Q(i);let s=r.pid,R=!1;r.once("exit",()=>{R=!0});let{ready:D,log:o}=await te(s,B,A,()=>!R&&I(s));return{ready:D,pid:s,exited:R||!I(s),log:o}}async function Ie(e){let{helperPath:_,udid:t,port:C,host:S,logFile:A}=e,B=`http://${S}:${C}`;q();let i=J(A,"w"),r=x(_,[t,"--port",String(C)],{detached:!1,stdio:["ignore",i,i]});Q(i);let s=r.pid,R=!1;r.once("exit",()=>{R=!0});let{ready:D,log:o}=await te(s,B,A,()=>!R&&I(s));return{ready:D,child:r,log:o}}async function Ce(e,_,t){await Le(e);let C="127.0.0.1",S=me(),A=ve(b,`server-${e}.log`),B={helperPath:S,udid:e,port:_,host:C,logFile:A},i="",r=2;for(let R=1;R<=r;R++){if(Ne(_),t.detach){let D=await Me(B);if(D.ready){let o={pid:D.pid,port:_,device:e,url:`http://${C}:${_}`,streamUrl:`http://${C}:${_}/stream.mjpeg`,wsUrl:`ws://${C}:${_}/ws`};return X(o),{pid:D.pid}}G(D.pid),i=D.log}else{let D=await Ie(B);if(D.ready){let o={pid:D.child.pid,port:_,device:e,url:`http://${C}:${_}`,streamUrl:`http://${C}:${_}/stream.mjpeg`,wsUrl:`ws://${C}:${_}/ws`};return X(o),{pid:D.child.pid,child:D.child}}G(D.child.pid),i=D.log}if(R<r)await new Promise((D)=>setTimeout(D,500))}let s=i?`Helper failed:
11
- ${i}`:"Helper process failed to start";console.error(s),process.exit(1)}async function Ge(e,_,t){let C=e.length>0?e.map(E):(()=>{let s=Y();if(!s)console.error("No device specified and no booted simulator found."),process.exit(1);return[s]})(),S=new Map,A=[],B=_;for(let s of C){let R=p(s);if(R){if(!t){let c=z(s)??s;if(C.length>1)console.log(`
12
- ==> ${c} (${s}) <==`);console.log(` Already running on port ${R.port}`),console.log(` Stream: ${R.streamUrl}`),console.log(` WebSocket: ${R.wsUrl}`)}A.push(R);continue}B=await _e(B);let{pid:D,child:o}=await Ce(s,B,{detach:!1});if(o)S.set(s,o);let H="127.0.0.1",h={pid:D,port:B,device:s,url:`http://${H}:${B}`,streamUrl:`http://${H}:${B}/stream.mjpeg`,wsUrl:`ws://${H}:${B}/ws`};if(A.push(h),!t){let c=z(s)??s;if(C.length>1)console.log(`
13
- ==> ${c} (${s}) <==`);console.log(` Stream: ${h.streamUrl}`),console.log(` WebSocket: ${h.wsUrl}`),console.log(` Port: ${B}`)}B++}if(A.length===1){let s=A[0];console.log(JSON.stringify({url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device}))}else console.log(JSON.stringify({devices:A.map((s)=>({url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device}))}));if(S.size===0)return;let i=!1,r=(s)=>{if(i)return;if(i=!0,!t)console.log(`
14
- Shutting down...`);for(let[R,D]of S){let o=D.pid;if(o)G(o);l(R)}S.clear(),process.exit(s)};for(let[s,R]of S)R.on("exit",(D)=>{if(i)return;if(!t)console.error(`[${s}] Helper exited (code ${D})`);if(l(s),S.delete(s),S.size===0)r(D??1)});process.on("SIGINT",()=>r(0)),process.on("SIGTERM",()=>r(0)),process.on("SIGHUP",()=>r(0)),process.on("exit",()=>{for(let[s,R]of S){try{if(R.pid)process.kill(R.pid,"SIGTERM")}catch{}try{l(s)}catch{}}}),await new Promise(()=>{})}async function se(e,_){let t=e.length>0?e.map(E):(()=>{let A=Y();if(!A)console.error("No device specified and no booted simulator found."),process.exit(1);return[A]})(),C=[],S=_;for(let A of t){let B=p(A);if(B){C.push(B);continue}S=await _e(S),await Ce(A,S,{detach:!0});let i="127.0.0.1";C.push({pid:p(A).pid,port:S,device:A,url:`http://${i}:${S}`,streamUrl:`http://${i}:${S}/stream.mjpeg`,wsUrl:`ws://${i}:${S}/ws`}),S++}return C}function qe(e){if(e.length===1){let _=e[0];console.log(JSON.stringify({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}else console.log(JSON.stringify({devices:e.map((_)=>({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}))}function ke(e){if(e){let t=E(e),C=p(t);if(!C)console.log(JSON.stringify({running:!1,device:t}));else console.log(JSON.stringify({running:!0,url:C.url,streamUrl:C.streamUrl,wsUrl:C.wsUrl,port:C.port,device:C.device,pid:C.pid}));return}let _=m();if(_.length===0)console.log(JSON.stringify({running:!1}));else if(_.length===1){let t=_[0];console.log(JSON.stringify({running:!0,url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}else console.log(JSON.stringify({running:!0,streams:_.map((t)=>({url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}))}function Pe(e){if(e){let _=E(e),t=p(_);if(!t){console.log(JSON.stringify({disconnected:!0,device:_}));return}try{process.kill(t.pid,"SIGTERM")}catch{}l(_),console.log(JSON.stringify({disconnected:!0,device:t.device}))}else{let _=m();if(_.length===0){console.log(JSON.stringify({disconnected:!0,devices:[]}));return}let t=[];for(let C of _){try{process.kill(C.pid,"SIGTERM")}catch{}t.push(C.device)}l(),console.log(JSON.stringify({disconnected:!0,devices:t}))}}async function Ue(e){let _,t=[];for(let B=0;B<e.length;B++)if(e[B]==="--device"||e[B]==="-d")_=e[++B];else t.push(e[B]);let C=p(_);if(!C)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let S=t[0];if(!S)console.error("Usage: serve-sim gesture '<json>'"),console.error(`Example: serve-sim gesture '{"type":"begin","x":0.5,"y":0.5}'`),process.exit(1);let A;try{A=JSON.parse(S)}catch{console.error("Invalid JSON:",S),process.exit(1)}return new Promise((B,i)=>{let r=new WebSocket(C.wsUrl);r.binaryType="arraybuffer",r.onopen=()=>{let s=new TextEncoder().encode(JSON.stringify(A)),R=new Uint8Array(1+s.length);R[0]=3,R.set(s,1),r.send(R),setTimeout(()=>{r.close(),B()},50)},r.onerror=()=>{console.error("Failed to connect to serve-sim server at",C.wsUrl),i(Error("WebSocket connection failed"))}})}async function Ke(e){let _,t=[];for(let A=0;A<e.length;A++)if(e[A]==="--device"||e[A]==="-d")_=e[++A];else t.push(e[A]);let C=p(_);if(!C)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let S=t[0]??"home";return new Promise((A,B)=>{let i=new WebSocket(C.wsUrl);i.binaryType="arraybuffer",i.onopen=()=>{let r=new TextEncoder().encode(JSON.stringify({button:S})),s=new Uint8Array(1+r.length);s[0]=4,s.set(r,1),i.send(s),setTimeout(()=>{i.close(),A()},50)},i.onerror=()=>{console.error("Failed to connect to serve-sim server at",C.wsUrl),B(Error("WebSocket connection failed"))}})}async function Xe(e,_){if(m().length===0)console.log("Starting simulator stream..."),await se(_,3100);let{simMiddleware:C}=await Promise.resolve().then(() => (K(),U)),S=C({basePath:"/"});Bun.serve({port:e,idleTimeout:255,async fetch(B){return new Promise((i)=>{let r=new URL(B.url),s={url:r.pathname+r.search,method:B.method,headers:Object.fromEntries(B.headers.entries()),on(n,$){}},R=[];s.on=(n,$)=>{if(n==="close")R.push($)},B.signal.addEventListener("abort",()=>{for(let n of R)n()});let D=200,o=new Headers,H=[],h=!1,c=null;S(s,{writeHead(n,$){if(D=n,$)for(let[f,ae]of Object.entries($))o.set(f,ae)},setHeader(n,$){o.set(n,$)},get statusCode(){return D},set statusCode(n){D=n},write(n){if(!h){h=!0;let $=new ReadableStream({start(f){c=f}});i(new Response($,{status:D,headers:o}))}try{c?.enqueue(typeof n==="string"?new TextEncoder().encode(n):n)}catch{}},end(n){if(h){if(n)try{c?.enqueue(typeof n==="string"?new TextEncoder().encode(n):n)}catch{}try{c?.close()}catch{}}else{if(n)H.push(n);let $=H.map((f)=>typeof f==="string"?f:new TextDecoder().decode(f)).join("");i(new Response($,{status:D,headers:o}))}}},()=>{i(new Response("Not found",{status:404}))})})}});let A=We();if(console.log(""),console.log(` - Local: http://localhost:${e}`),A)console.log(` - Network: http://${A}:${e}`);console.log(""),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0)),await new Promise(()=>{})}function Se(){console.log(`
8
+ `)}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(S===_+"/appstate"||S.startsWith(_+"/appstate?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
9
+
10
+ `);let $=G("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),r=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,a="",n="";$.stdout.on("data",(y)=>{n+=y.toString();let A;while((A=n.indexOf(`
11
+ `))!==-1){let c=n.slice(0,A).trim();if(n=n.slice(A+1),!c)continue;let R;try{R=JSON.parse(c).eventMessage??""}catch{continue}let E=r.exec(R);if(!E)continue;let d=E[1],fe=parseInt(E[2],10);if(!We(d))continue;if(d===a)continue;a=d,Pe(C,d).then((Te)=>{s.write("data: "+JSON.stringify({bundleId:d,pid:fe,isReactNative:Te})+`
12
+
13
+ `)})}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(i)i()}}var x,Ne,Ve,Le,b,W=null;var j=le(()=>{x=P(He(),"serve-sim"),Ne=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Ve=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],Le=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;b={at:0,booted:null}});import{execSync as f,spawn as J}from"child_process";import{chmodSync as Ue,existsSync as F,mkdirSync as Z,openSync as Y,closeSync as ee,readFileSync as H,unlinkSync as N,writeFileSync as _e}from"fs";import{createHash as ke}from"crypto";import{homedir as Xe,networkInterfaces as Ge}from"os";import{join as xe,resolve as q}from"path";import{tmpdir as Fe}from"os";import{join as g}from"path";import{readdirSync as ue}from"fs";var T=g(Fe(),"serve-sim"),c_=g(T,"server.json");function w(e){return g(T,`server-${e}.json`)}function v(){try{return ue(T).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>g(T,e))}catch{return[]}}var D="./serve-sim-bin-6s7pkkx4.";function k(){if(!F(T))Z(T,{recursive:!0})}function p(e){if(e)return M(w(e));for(let _ of v()){let t=M(_);if(t)return t}return null}var O={at:0,booted:null};function Ke(){let e=Date.now();if(O.booted&&e-O.at<1000)return O.booted;try{let _=f("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let i of Object.values(t.devices))for(let S of i)if(S.state==="Booted")s.add(S.udid);return O={at:e,booted:s},s}catch{return null}}function M(e){try{if(!F(e))return null;let _=JSON.parse(H(e,"utf-8"));try{process.kill(_.pid,0)}catch{return N(e),null}let t=Ke();if(t&&!t.has(_.device)){console.error(`[serve-sim] Helper pid ${_.pid} is bound to device ${_.device} which is no longer booted \u2014 killing stale helper.`);try{process.kill(_.pid,"SIGTERM")}catch{}try{N(e)}catch{}return null}return _}catch{return null}}function V(){let e=[];for(let _ of v()){let t=M(_);if(t)e.push(t)}return e}function z(e){k(),_e(w(e.device),JSON.stringify(e,null,2))}function u(e){if(e)try{N(w(e))}catch{}else for(let _ of v())try{N(_)}catch{}}function je(){let e=D.startsWith("/$bunfs/");if(!e&&F(D))return D;if(!e){let S=q(import.meta.dir,"../bin/serve-sim-bin");if(F(S))return S;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
14
+ Checked: ${D}, ${S}`)}let _=H(D),t=ke("sha256").update(_).digest("hex").slice(0,16),s=q(Xe(),"Library/Caches/serve-sim");Z(s,{recursive:!0});let i=q(s,`serve-sim-bin-${t}`);if(!F(i)){_e(i,_),Ue(i,493);try{f(`codesign -s - -f ${JSON.stringify(i)}`,{stdio:"ignore"})}catch{}}return i}function te(){try{let e=f("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let s of t)if(s.state==="Booted")return s.udid}catch{}return null}function Q(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.udid===e)return i.name}catch{}return null}function L(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.name.toLowerCase()===e.toLowerCase())return i.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function se(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.udid===e)return i.state==="Booted"}catch{}return!1}function I(e){try{return process.kill(e,0),!0}catch{return!1}}function U(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function ze(e){try{let _=f(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
15
+ `).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function Qe(e){let _=ze(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function Je(e){if(!se(e))try{f(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{f("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function Ze(){let e=Ge();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function Se(e){let _=new Set(V().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function Ye(e){Je(e);try{f(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!se(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function ie(e,_,t,s){let i=!1;for(let o=0;o<30;o++){if(!s())break;try{if((await fetch(`${_}/health`)).ok){i=!0;break}}catch{}await new Promise((C)=>setTimeout(C,100))}if(i){let o=Date.now()+8000;while(Date.now()<o){if(await new Promise((C)=>setTimeout(C,200)),!s()){i=!1;break}try{if(H(t,"utf-8").includes("Capture started"))break}catch{}}}let S="";try{S=H(t,"utf-8").trim()}catch{}return{ready:i,log:S}}async function e_(e){let{helperPath:_,udid:t,port:s,host:i,logFile:S}=e,o=`http://${i}:${s}`;k();let C=Y(S,"w"),$=J(_,[t,"--port",String(s)],{detached:!0,stdio:["ignore",C,C]});$.unref(),ee(C);let r=$.pid,a=!1;$.once("exit",()=>{a=!0});let{ready:n,log:y}=await ie(r,o,S,()=>!a&&I(r));return{ready:n,pid:r,exited:a||!I(r),log:y}}async function __(e){let{helperPath:_,udid:t,port:s,host:i,logFile:S}=e,o=`http://${i}:${s}`;k();let C=Y(S,"w"),$=J(_,[t,"--port",String(s)],{detached:!1,stdio:["ignore",C,C]});ee(C);let r=$.pid,a=!1;$.once("exit",()=>{a=!0});let{ready:n,log:y}=await ie(r,o,S,()=>!a&&I(r));return{ready:n,child:$,log:y}}async function re(e,_,t){await Ye(e);let s="127.0.0.1",i=je(),S=xe(T,`server-${e}.log`),o={helperPath:i,udid:e,port:_,host:s,logFile:S},C="",$=2;for(let a=1;a<=$;a++){if(Qe(_),t.detach){let n=await e_(o);if(n.ready){let y={pid:n.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return z(y),{pid:n.pid}}U(n.pid),C=n.log}else{let n=await __(o);if(n.ready){let y={pid:n.child.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return z(y),{pid:n.child.pid,child:n.child}}U(n.child.pid),C=n.log}if(a<$)await new Promise((n)=>setTimeout(n,500))}let r=C?`Helper failed:
16
+ ${C}`:"Helper process failed to start";console.error(r),process.exit(1)}async function t_(e,_,t){let s=e.length>0?e.map(L):(()=>{let r=te();if(!r)console.error("No device specified and no booted simulator found."),process.exit(1);return[r]})(),i=new Map,S=[],o=_;for(let r of s){let a=p(r);if(a){if(!t){let R=Q(r)??r;if(s.length>1)console.log(`
17
+ ==> ${R} (${r}) <==`);console.log(` Already running on port ${a.port}`),console.log(` Stream: ${a.streamUrl}`),console.log(` WebSocket: ${a.wsUrl}`)}S.push(a);continue}o=await Se(o);let{pid:n,child:y}=await re(r,o,{detach:!1});if(y)i.set(r,y);let A="127.0.0.1",c={pid:n,port:o,device:r,url:`http://${A}:${o}`,streamUrl:`http://${A}:${o}/stream.mjpeg`,wsUrl:`ws://${A}:${o}/ws`};if(S.push(c),!t){let R=Q(r)??r;if(s.length>1)console.log(`
18
+ ==> ${R} (${r}) <==`);console.log(` Stream: ${c.streamUrl}`),console.log(` WebSocket: ${c.wsUrl}`),console.log(` Port: ${o}`)}o++}if(S.length===1){let r=S[0];console.log(JSON.stringify({url:r.url,streamUrl:r.streamUrl,wsUrl:r.wsUrl,port:r.port,device:r.device}))}else console.log(JSON.stringify({devices:S.map((r)=>({url:r.url,streamUrl:r.streamUrl,wsUrl:r.wsUrl,port:r.port,device:r.device}))}));if(i.size===0)return;let C=!1,$=(r)=>{if(C)return;if(C=!0,!t)console.log(`
19
+ Shutting down...`);for(let[a,n]of i){let y=n.pid;if(y)U(y);u(a)}i.clear(),process.exit(r)};for(let[r,a]of i)a.on("exit",(n)=>{if(C)return;if(!t)console.error(`[${r}] Helper exited (code ${n})`);if(u(r),i.delete(r),i.size===0)$(n??1)});process.on("SIGINT",()=>$(0)),process.on("SIGTERM",()=>$(0)),process.on("SIGHUP",()=>$(0)),process.on("exit",()=>{for(let[r,a]of i){try{if(a.pid)process.kill(a.pid,"SIGTERM")}catch{}try{u(r)}catch{}}}),await new Promise(()=>{})}async function Ce(e,_){let t=e.length>0?e.map(L):(()=>{let S=te();if(!S)console.error("No device specified and no booted simulator found."),process.exit(1);return[S]})(),s=[],i=_;for(let S of t){let o=p(S);if(o){s.push(o);continue}i=await Se(i),await re(S,i,{detach:!0});let C="127.0.0.1";s.push({pid:p(S).pid,port:i,device:S,url:`http://${C}:${i}`,streamUrl:`http://${C}:${i}/stream.mjpeg`,wsUrl:`ws://${C}:${i}/ws`}),i++}return s}function s_(e){if(e.length===1){let _=e[0];console.log(JSON.stringify({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}else console.log(JSON.stringify({devices:e.map((_)=>({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}))}function S_(e){if(e){let t=L(e),s=p(t);if(!s)console.log(JSON.stringify({running:!1,device:t}));else console.log(JSON.stringify({running:!0,url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device,pid:s.pid}));return}let _=V();if(_.length===0)console.log(JSON.stringify({running:!1}));else if(_.length===1){let t=_[0];console.log(JSON.stringify({running:!0,url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}else console.log(JSON.stringify({running:!0,streams:_.map((t)=>({url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}))}function i_(e){if(e){let _=L(e),t=p(_);if(!t){console.log(JSON.stringify({disconnected:!0,device:_}));return}try{process.kill(t.pid,"SIGTERM")}catch{}u(_),console.log(JSON.stringify({disconnected:!0,device:t.device}))}else{let _=V();if(_.length===0){console.log(JSON.stringify({disconnected:!0,devices:[]}));return}let t=[];for(let s of _){try{process.kill(s.pid,"SIGTERM")}catch{}t.push(s.device)}u(),console.log(JSON.stringify({disconnected:!0,devices:t}))}}async function r_(e){let _,t=[];for(let o=0;o<e.length;o++)if(e[o]==="--device"||e[o]==="-d")_=e[++o];else t.push(e[o]);let s=p(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let i=t[0];if(!i)console.error("Usage: serve-sim gesture '<json>'"),console.error(`Example: serve-sim gesture '{"type":"begin","x":0.5,"y":0.5}'`),process.exit(1);let S;try{S=JSON.parse(i)}catch{console.error("Invalid JSON:",i),process.exit(1)}return new Promise((o,C)=>{let $=new WebSocket(s.wsUrl);$.binaryType="arraybuffer",$.onopen=()=>{let r=new TextEncoder().encode(JSON.stringify(S)),a=new Uint8Array(1+r.length);a[0]=3,a.set(r,1),$.send(a),setTimeout(()=>{$.close(),o()},50)},$.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),C(Error("WebSocket connection failed"))}})}async function C_(e){let _,t=[];for(let S=0;S<e.length;S++)if(e[S]==="--device"||e[S]==="-d")_=e[++S];else t.push(e[S]);let s=p(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let i=t[0]??"home";return new Promise((S,o)=>{let C=new WebSocket(s.wsUrl);C.binaryType="arraybuffer",C.onopen=()=>{let $=new TextEncoder().encode(JSON.stringify({button:i})),r=new Uint8Array(1+$.length);r[0]=4,r.set($,1),C.send(r),setTimeout(()=>{C.close(),S()},50)},C.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),o(Error("WebSocket connection failed"))}})}async function o_(e,_,t){if(V().length===0)console.log("Starting simulator stream..."),await Ce(_,3100);let{simMiddleware:i}=await Promise.resolve().then(() => (j(),K)),S=i({basePath:"/"}),o=t?1:50,C=e,$,r=!1;for(let n=0;n<o;n++){let y=e+n;try{$_(y,S),C=y,r=!0;break}catch(A){if($=A,A?.code!=="EADDRINUSE")break}}if(!r){if($?.code==="EADDRINUSE")if(t)console.error(`Port ${e} is already in use. Pass a different --port or stop the other process.`);else console.error(`No available port found in range ${e}-${e+o-1}.`);else console.error(`Failed to start preview server: ${$?.message??$}`);process.exit(1)}let a=Ze();if(console.log(""),console.log(` - Local: http://localhost:${C}`),a)console.log(` - Network: http://${a}:${C}`);console.log(""),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0)),await new Promise(()=>{})}function $_(e,_){return Bun.serve({port:e,idleTimeout:255,async fetch(t){return new Promise((s)=>{let i=new URL(t.url),S={url:i.pathname+i.search,method:t.method,headers:Object.fromEntries(t.headers.entries()),on(A,c){}},o=[];S.on=(A,c)=>{if(A==="close")o.push(c)},t.signal.addEventListener("abort",()=>{for(let A of o)A()});let C=200,$=new Headers,r=[],a=!1,n=null;_(S,{writeHead(A,c){if(C=A,c)for(let[R,E]of Object.entries(c))$.set(R,E)},setHeader(A,c){$.set(A,c)},get statusCode(){return C},set statusCode(A){C=A},write(A){if(!a){a=!0;let c=new ReadableStream({start(R){n=R}});s(new Response(c,{status:C,headers:$}))}try{n?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}},end(A){if(a){if(A)try{n?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}try{n?.close()}catch{}}else{if(A)r.push(A);let c=r.map((R)=>typeof R==="string"?R:new TextDecoder().decode(R)).join("");s(new Response(c,{status:C,headers:$}))}}},()=>{s(new Response("Not found",{status:404}))})})}})}function oe(){console.log(`
15
20
  serve-sim - Stream iOS Simulator to the browser
16
21
 
17
22
  Usage:
@@ -37,4 +42,4 @@ Examples:
37
42
  serve-sim --detach Start streaming in background (daemon)
38
43
  serve-sim --list Show all running streams
39
44
  serve-sim --kill Stop all streams
40
- `)}var a=process.argv.slice(2);if(a[0]==="gesture")await Ue(a.slice(1)),process.exit(0);if(a[0]==="button")await Ke(a.slice(1)),process.exit(0);var w,Ae=!1,Be=!1,ie=!1,re=!1,De=!1,Re=!1,O=[],oe,ne;for(let e=0;e<a.length;e++){let _=a[e];switch(_){case"--port":case"-p":w=parseInt(a[++e]??"3100",10);break;case"--detach":case"-d":Ae=!0;break;case"--quiet":case"-q":Be=!0;break;case"--no-preview":Re=!0;break;case"--list":case"-l":if(ie=!0,a[e+1]&&!a[e+1].startsWith("-"))oe=a[++e];break;case"--kill":case"-k":if(re=!0,a[e+1]&&!a[e+1].startsWith("-"))ne=a[++e];break;case"--help":case"-h":case"help":De=!0;break;default:if(!_.startsWith("-"))O.push(_);else console.error(`Unknown flag: ${_}`),Se(),process.exit(1)}}if(De)Se(),process.exit(0);if(ie)ke(oe),process.exit(0);if(re)Pe(ne),process.exit(0);if(Ae){let e=await se(O,w??3100);qe(e)}else if(Re)await Ge(O,w??3100,Be);else await Xe(w??3200,O);
45
+ `)}var B=process.argv.slice(2);if(B[0]==="gesture")await r_(B.slice(1)),process.exit(0);if(B[0]==="button")await C_(B.slice(1)),process.exit(0);var l,$e=!1,ne=!1,ae=!1,Ae=!1,ye=!1,ce=!1,m=[],Re,Be;for(let e=0;e<B.length;e++){let _=B[e];switch(_){case"--port":case"-p":l=parseInt(B[++e]??"3100",10);break;case"--detach":case"-d":$e=!0;break;case"--quiet":case"-q":ne=!0;break;case"--no-preview":ce=!0;break;case"--list":case"-l":if(ae=!0,B[e+1]&&!B[e+1].startsWith("-"))Re=B[++e];break;case"--kill":case"-k":if(Ae=!0,B[e+1]&&!B[e+1].startsWith("-"))Be=B[++e];break;case"--help":case"-h":case"help":ye=!0;break;default:if(!_.startsWith("-"))m.push(_);else console.error(`Unknown flag: ${_}`),oe(),process.exit(1)}}if(ye)oe(),process.exit(0);if(ae)S_(Re),process.exit(0);if(Ae)i_(Be),process.exit(0);if($e){let e=await Ce(m,l??3100);s_(e)}else if(ce)await t_(m,l??3100,ne);else await o_(l??3200,m,l!==void 0);
package/package.json CHANGED
@@ -1,7 +1,13 @@
1
1
  {
2
2
  "name": "serve-sim",
3
- "version": "0.0.0",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
+ "author": {
6
+ "name": "Evan Bacon",
7
+ "email": "baconbrix@gmail.com",
8
+ "url": "https://evanbacon.dev"
9
+ },
10
+ "license": "Apache-2.0",
5
11
  "bin": {
6
12
  "serve-sim": "dist/serve-sim.js"
7
13
  },
package/src/middleware.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { readdirSync, readFileSync } from "fs";
2
- import { spawn, type ChildProcess } from "child_process";
1
+ import { readdirSync, readFileSync, existsSync, unlinkSync } from "fs";
2
+ import { execSync, spawn, exec, execFile, type ChildProcess } from "child_process";
3
3
  import { tmpdir } from "os";
4
4
  import { join } from "path";
5
5
 
@@ -16,6 +16,79 @@ interface ServeSimState {
16
16
  wsUrl: string;
17
17
  }
18
18
 
19
+ // Known bundle IDs that are always React Native shells (used as a fallback
20
+ // before the app-container path resolves, since simctl can lag after launch).
21
+ const RN_BUNDLE_IDS = new Set<string>([
22
+ "host.exp.Exponent", // Expo Go (App Store)
23
+ "dev.expo.Exponent", // Expo Go dev builds
24
+ ]);
25
+
26
+ const RN_MARKERS = [
27
+ "Frameworks/React.framework",
28
+ "Frameworks/hermes.framework",
29
+ "Frameworks/Hermes.framework",
30
+ "Frameworks/ExpoModulesCore.framework",
31
+ "main.jsbundle",
32
+ ];
33
+
34
+ // Processes that SpringBoard logs as "Foreground" but are not the visible
35
+ // user-facing app — widgets, extensions, background services. Emitting
36
+ // these to the client causes the app indicator to flicker as the user
37
+ // actually-foreground app switches mid-launch.
38
+ const NON_UI_BUNDLE_RE = /(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;
39
+
40
+ function isUserFacingBundle(bundleId: string): boolean {
41
+ return !NON_UI_BUNDLE_RE.test(bundleId);
42
+ }
43
+
44
+ function detectReactNative(udid: string, bundleId: string): Promise<boolean> {
45
+ if (RN_BUNDLE_IDS.has(bundleId)) return Promise.resolve(true);
46
+ return new Promise((resolve) => {
47
+ execFile("xcrun", ["simctl", "get_app_container", udid, bundleId, "app"],
48
+ { timeout: 2000 },
49
+ (err, stdout) => {
50
+ if (err) return resolve(false);
51
+ const appPath = stdout.trim();
52
+ if (!appPath) return resolve(false);
53
+ for (const marker of RN_MARKERS) {
54
+ if (existsSync(join(appPath, marker))) return resolve(true);
55
+ }
56
+ resolve(false);
57
+ });
58
+ });
59
+ }
60
+
61
+ // Cache simctl's booted-device set briefly so per-request cost stays bounded.
62
+ // The middleware runs inside the user's dev server (Metro etc.) and
63
+ // readServeSimStates() is called on every /api and every page load.
64
+ let bootedSnapshot: { at: number; booted: Set<string> | null } = { at: 0, booted: null };
65
+ function getBootedUdids(): Set<string> | null {
66
+ const now = Date.now();
67
+ if (bootedSnapshot.booted && now - bootedSnapshot.at < 1500) {
68
+ return bootedSnapshot.booted;
69
+ }
70
+ try {
71
+ const output = execSync("xcrun simctl list devices booted -j", {
72
+ encoding: "utf-8",
73
+ stdio: ["ignore", "pipe", "pipe"],
74
+ timeout: 3_000,
75
+ });
76
+ const data = JSON.parse(output) as {
77
+ devices: Record<string, Array<{ udid: string; state: string }>>;
78
+ };
79
+ const booted = new Set<string>();
80
+ for (const runtime of Object.values(data.devices)) {
81
+ for (const device of runtime) {
82
+ if (device.state === "Booted") booted.add(device.udid);
83
+ }
84
+ }
85
+ bootedSnapshot = { at: now, booted };
86
+ return booted;
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
19
92
  function readServeSimStates(): ServeSimState[] {
20
93
  let files: string[];
21
94
  try {
@@ -25,14 +98,28 @@ function readServeSimStates(): ServeSimState[] {
25
98
  } catch {
26
99
  return [];
27
100
  }
101
+ const booted = getBootedUdids();
28
102
  const states: ServeSimState[] = [];
29
103
  for (const f of files) {
104
+ const path = join(STATE_DIR, f);
30
105
  try {
31
- const state: ServeSimState = JSON.parse(readFileSync(join(STATE_DIR, f), "utf-8"));
106
+ const state: ServeSimState = JSON.parse(readFileSync(path, "utf-8"));
32
107
  try {
33
108
  process.kill(state.pid, 0);
34
- states.push(state);
35
- } catch {}
109
+ } catch {
110
+ try { unlinkSync(path); } catch {}
111
+ continue;
112
+ }
113
+ // Helper alive but its simulator was shut down — the MJPEG stream
114
+ // would accept connections yet never produce frames, leaving the
115
+ // preview stuck on "Connecting...". Recycle the stale state so the
116
+ // caller can spawn a fresh helper bound to whatever is booted.
117
+ if (booted && !booted.has(state.device)) {
118
+ try { process.kill(state.pid, "SIGTERM"); } catch {}
119
+ try { unlinkSync(path); } catch {}
120
+ continue;
121
+ }
122
+ states.push(state);
36
123
  } catch {}
37
124
  }
38
125
  return states;
@@ -102,6 +189,36 @@ export function simMiddleware(options?: SimMiddlewareOptions) {
102
189
  return;
103
190
  }
104
191
 
192
+ // POST /exec — run a shell command on the host. The preview server binds
193
+ // to localhost only and is meant for local dev, so we shell through
194
+ // /bin/sh and return stdout/stderr/exitCode.
195
+ if ((url === base + "/exec" || url === base + "/exec/") && req.method === "POST") {
196
+ let body = "";
197
+ req.on("data", (chunk: Buffer | string) => {
198
+ body += typeof chunk === "string" ? chunk : chunk.toString();
199
+ });
200
+ req.on("end", () => {
201
+ let command = "";
202
+ try {
203
+ command = JSON.parse(body).command ?? "";
204
+ } catch {}
205
+ if (!command) {
206
+ res.writeHead(400, { "Content-Type": "application/json" });
207
+ res.end(JSON.stringify({ stdout: "", stderr: "Missing command", exitCode: 1 }));
208
+ return;
209
+ }
210
+ exec(command, { maxBuffer: 16 * 1024 * 1024 }, (err, stdout, stderr) => {
211
+ res.writeHead(200, { "Content-Type": "application/json" });
212
+ res.end(JSON.stringify({
213
+ stdout: stdout.toString(),
214
+ stderr: stderr.toString(),
215
+ exitCode: err ? (err as any).code ?? 1 : 0,
216
+ }));
217
+ });
218
+ });
219
+ return;
220
+ }
221
+
105
222
  // SSE: simctl log stream
106
223
  if (url === base + "/logs" || url.startsWith(base + "/logs?")) {
107
224
  const states = readServeSimStates();
@@ -141,6 +258,65 @@ export function simMiddleware(options?: SimMiddlewareOptions) {
141
258
  return;
142
259
  }
143
260
 
261
+ // SSE: foreground-app change stream. Emits `{bundleId, pid}` events
262
+ // parsed from SpringBoard's "Setting process visibility to: Foreground"
263
+ // log line. Filtering is done here (not in the browser) so the SSE stream
264
+ // stays narrow and the client can listen without rate-limit concerns.
265
+ if (url === base + "/appstate" || url.startsWith(base + "/appstate?")) {
266
+ const states = readServeSimStates();
267
+ if (states.length === 0) {
268
+ res.writeHead(404);
269
+ res.end("No serve-sim device");
270
+ return;
271
+ }
272
+ const udid = states[0].device;
273
+ res.writeHead(200, {
274
+ "Content-Type": "text/event-stream",
275
+ "Cache-Control": "no-cache",
276
+ Connection: "keep-alive",
277
+ "X-Accel-Buffering": "no",
278
+ });
279
+ res.write(":\n\n");
280
+
281
+ const child: ChildProcess = spawn("xcrun", [
282
+ "simctl", "spawn", udid, "log", "stream",
283
+ "--style", "ndjson",
284
+ "--level", "info",
285
+ "--predicate",
286
+ 'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"',
287
+ ], { stdio: ["ignore", "pipe", "ignore"] });
288
+
289
+ // e.g. "[app<com.apple.mobilesafari>:43117] Setting process visibility to: Foreground"
290
+ const FG_RE = /\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/;
291
+ let lastBundle = "";
292
+ let buf = "";
293
+ child.stdout!.on("data", (chunk: Buffer) => {
294
+ buf += chunk.toString();
295
+ let nl: number;
296
+ while ((nl = buf.indexOf("\n")) !== -1) {
297
+ const line = buf.slice(0, nl).trim();
298
+ buf = buf.slice(nl + 1);
299
+ if (!line) continue;
300
+ let msg: string;
301
+ try { msg = JSON.parse(line).eventMessage ?? ""; } catch { continue; }
302
+ const m = FG_RE.exec(msg);
303
+ if (!m) continue;
304
+ const bundleId = m[1]!;
305
+ const pid = parseInt(m[2]!, 10);
306
+ if (!isUserFacingBundle(bundleId)) continue;
307
+ if (bundleId === lastBundle) continue;
308
+ lastBundle = bundleId;
309
+ detectReactNative(udid, bundleId).then((isReactNative) => {
310
+ res.write("data: " + JSON.stringify({ bundleId, pid, isReactNative }) + "\n\n");
311
+ });
312
+ }
313
+ });
314
+
315
+ child.on("close", () => res.end());
316
+ req.on("close", () => child.kill());
317
+ return;
318
+ }
319
+
144
320
  // Not ours — pass through
145
321
  if (next) next();
146
322
  };