This version added a eplisepsy warning at the begining and a enemy in the desert
data:text/html;charset=UTF-8;base64,PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAqIHsKICAgICAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KICAgIAogICAgaHRtbCwgYm9keSB7IG1hcmdpbjogMDsKICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMDsKICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIH0KICAgIAogICAgPC9zdHlsZT4KCiAgICAKCjwhLS0gICAgPGxpbmsgcmVsPSJtYW5pZmVzdCIgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo0MjA5Ni9tYW5pZmVzdC5qc29uIj4tLT4KICAgIAogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8nOyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iYmxhY2siPgogICAgICAgIAogICAgPG1ldGEgbmFtZT0ibW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj4KICAgICAgICAKICAgIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNQUFBQURBQ0FZQUFBQlMzR3dIQUFBQUFYTlNSMElBcnM0YzZRQUFBRVJsV0VsbVRVMEFLZ0FBQUFnQUFZZHBBQVFBQUFBQkFBQUFHZ0FBQUFBQUE2QUJBQU1BQUFBQkFBRUFBS0FDQUFRQUFBQUJBQUFBd0tBREFBUUFBQUFCQUFBQXdBQUFBQUJOT3puS0FBQUFIR2xFVDFRQUFBQUNBQUFBQUFBQUFHQUFBQUFvQUFBQVlBQUFBR0FBQUJMSDhFMHhNZ0FBRXBOSlJFRlVlQUhzbllkN0hOVVZ4Zms3MHdpZGhOQkxRZ0tFSkJEU0lBbUIwTklnQkVpREFJR0VhbHV5TGR0eXcxWHVUVExHY3RYMnBwZnp1N3VqckcxSk83djdWcnYrNXU3SElGazdPenZ2dlh2dXVmWE5OYXUrTkJmODhEbklxZ3hjazlXQis3Z2Q5TWlBQThBWk1OTVdnQVBBQWVBQWNIUEF6WUdzeW9BemdET0FNMEJXMGUvamR1WnpCbkFHY0Fad1RlaWFNS3N5NEF6Z0RPQU1rRlgwKzdpZCtad0JuQUdjQVZ3VHVpYk1xZ3c0QXpnRE9BTmtGZjArYm1jK1p3Qm5BR2NBMTRTdUNiTXFBODRBemdET0FGbEZ2NC9ibWM4WndCbkFHY0Exb1d2Q3JNcUFNNEF6Z0ROQVZ0SHY0M2JtY3dad0JuQUdjRTNvbWpDck11QU00QXpnREpCVjlQdTRuZm1jQVp3Qm5BRmNFN29tektvTU9BTTRBemdEWkJYOVBtNW5QbWNBWndCbkFOZUVyZ216S2dQT0FNNEF6Z0JaUmIrUDI1blBHY0Fad0JuQU5hRnJ3cXpLZ0RPQU00QXpRRmJSNytOMjVuTUdjQVp3Qm5CTjZKb3dxekxnRE9BTTRBeVFWZlQ3dUozNW5BR2NBWndCWEJPNkpzeXFERGdET0FNNEEyUVYvU00zN2kvUGhkVmYxZkcxdWJEbVdoMWZieDM4Zm0wdXJOSjdJM2ZQZlNxUTFWOXBqdG5HMnhyemF2MWtEbGJwdlVHUDF4bWd6d1dNdGtBUzdqWFh6WVYxMzVnTEUzZm13c2I3OG1IeXdYell4UEZBUG15OEp4L1czcG96VUVUN3ppR1BmYlVBUDNaOUxxeS9YZU85VitQOGRuUE1HKy9QMnh5c3ZhVUZoQUhlNStBQTBOSm1ZOWZQaGZHYjVtengxbjFUZy8xV2M4QU1ldUlPRFZRSHYzYzYwcDZYWExmVDlaTHowbDUzNGJ6YmNoTFNYQmkvT1JmR2JtZ3RrTWJhaTFDaS9SQ0FkYnJtcHUva3c3YkhDbUhYcjR0aDZxVlNPUERuVWpqODk3SWRoMTdYdjE4dWg1Mi9Lb1l0M3krRWlidjAvWnBUMDVJREZJNWV4dFR4TThpRnRQdjRUVTJoMy81NE1leDl2aGdPdkZJS2g5NW9qdmZnWDhvMkJ6dWZZcndDLy8yU2xkdnpwaUE2WHIvTCtSZ01BTm9HdWVHZVhOajh2WHpZK29OQzJQNUVNZXg4c2hoMi9WS0hGcFBGdG9QZk94MmMyK21jNVAyMDUzYjcvYnJ2SFQ4dmh1MlBGOExtUi9KaGc3UVdnZ2g5OTdJd2ZHN0RYWG03NXNGWHkrSEVmeXJoODdGcU9MMnhHczVzcTRWenUrcmgzTTVhT1B0WkxaelpXclAzanI1WkRudCtXd3lUMzlWMzN5S3pxRWZ3OVhLL01UNkRpUWVUVFVvbXBsN1NtTit2aGkvV1Y4T3N4bmQyUjNQTVo3Zlh3dWxOdFhCeWRUVWNlN2RzeW9DMWh4bGptNEh4QVlCV0U1V2o2VmtrQkh6L3k5Sm0veWlINCs5WGJGQ24xbXJRNjY2KzQ5UjROY3g4VXJGRk9maGFLZXorVFZNUTEybXMyT3RkMmF5YXAvVzNTZmgvVVF6VEgxZEQ3bGc5MU12ekllaS9KVjk2cjN5bUlXR3BobjIvTDJsK0MwMnRlTFdBUVBjNWZ1TmMyUHhRM21UaS9KNTZxQlhudzN4amtYSHpwMGF3T2NtZnFBZm0vck9mRlFKbVVWZnozSUVSNGdKQUE4VE0yZjdqUWpqOHQzTDRZcUlhR09UY29ib3RjR0dtRVlxbmRKeHVoSktPY3V2ZzkwNEg1M1k2SjNrLzdibmRmbi94aTBZb2ZONEkrZWxHbUR0YzE5aWtwVDZ0U2tPVmphclJiR2swY3FJRlVReXpXMm9ocjNtcDVodGh2cjZjOURkaEFVaktaeHRpaUdvNCtwYSs5NUdDektqZUdDaUdSazk3RGNZOGZ2T2NzZWNSc2RoRnlVVGxnb1MvTGtGZll0ajh2U0Z3VlBQem9hUjVoeDMzUEZzVUNPSXhRVHdBYUlCb2ZkTm9IMVRDeFlNSnVyVndTd3h3U1UxM05ieWhNYzNYUWloSkk1L2JYUXRIM3k1TFF4WE5sMWxPUXlFSStCODdwTTNPYks2RldtRUpEZGhoRGlvWEd1SENWTTNNQTVoMlRKbzFyVEN1OUhsTjRjZnNLWVFqQXUyRmZacTRMbVFDSU1BR0tFN01JbndsL0NaajNRNGF2dE5ZNHdCQW1uL3N1cHdKd013bjFWQVRZa0YyTjRQc3NONmorM1lMQ05XTDg2YWg4RytXOHduR2I5UTgvYVFZVHE2cUdodjJPa2NJUlhWdVh2NUNMZXovVTBsT2RHRmtBY0NZaVdUdGZiNGs1bXlFZXFVTDZXOWJlVUNRUDk0SXg5NnBHSk1Rak9nazRKM2U3eDhBc21VSjN4R1pPUHBtSmN3ZHFTL1FtbEZiYjJOdEcvWm8vMnJhU2Y5clZPZEQ3bWc5UU85UU5GcHZzY2tuekRuMVV0Rk1RclIvcnkrK0YwRXFuS3liMDJ5bWdVeU01ZGhuc2ZzWitOK2tIR0dvZlg4c2hWUHkrOHJuVUk2OWpac3hsOC9NaDFrNXlQaGY2KzhZQVFDUXRGZ3J1My9iandwaFZwUnVqcHhXbFp2TnpFdGpuZGVBY2VoT0thSkJkSWhBd0JYQ0pXVXhvYWdQNFUzVGd0Sm8vYnh3SGdFZXZna0JoaTJQNm5zVm1rM2poMXh4YjMyYUVvdGREeVd3VmxxYXFCWEN6MzB5N241a0EzK0FnTUVCK1U4Yjd4c0JBT0RWazZ5WlVsVGk0Z0ZwL3o0WHRSK0JHT1puV2RSR2JUNFF3a01aR0QxTCt5MElobjZIS2JjOFhEQmg3VWNJRnNacHdCTVRDSGdFR282OVd6RW1Kcit3OEwwREVPeTAxOGJwSlpZLzgzSEZoQmF3OWlzZnpESE1lZlJmWllzbTljdDRmWnRBUkQ2MmFzR1B2S1ZCSHNlbFgxaWViUDJDTUlyYWNZaFo5QW5vdVYwUTlUdkpuKzFQRkN5VUdtMXlXc0Nybkc5WUhCMGZoS1RSc0ZrQXNKUEpCcFE0dlRqdEJ2bys1WU5yTU0va1RMYitVR0Znd3MvdGlxWkx3UGNOQUx6eEhZcCtUSDlVc1JCaHRJVzlDaS9Fd3B4WFpHYlBNNld3NGU1OGFOZkVaZzdJTnlCS2RuSk5OZXJvTUw4d1BRc25HeFlhaFlHR21pV1dRQklSM0Nrd3dvaUViUnM5T3I2TFRwUkFNUDJoSEdHRjJ5MEVQRXdBRU5JajJVVTJqemg4bGw4QWdORGtubWNGQU5YdVhBSUFNUURPOFNBQXdKempEMVJ6ODVaQjN2ZTdraVdNbG5MRTA1b3d2WjdIdUNsaElQbEozZ2ZUSjVwbHdLVWtaZ1lBWmVSaG1xRXlBT25wdmMrMWtDNFBQOHN2TTRGMjFZd1JVUXlYbTBBNHFOQTJpeGROSUZvVG5wZ0dtRUlXS3hjTDRJRDJJeHk5QUlBUThEcVp4UWRVMm5GaEtza0Z4Wk1Md3V2MTBudzRwcndMR2VWTDVyaEw4NGZ4OVcwQ1Vjc3k5VUxKYWxiSTdHWDFoUUEyeEFEVThHeVdvN3RXeFhLWENCOU9zSVNEb3Jkajc1VDdkZ1lYbldmZEF5QWt5M3JrbitVd0tRRlpMaWZSaTRBdit4bU5NVEdKS1YwQWpNd0pjeFByVlpQd0UwMDYrSG81YkZSdVlkbjdTUUdJL2dFZ1czZnFSUUZBbWkrekFFRHdXblk0NVI5V3VTaGh2Mkp4SkNBVFlvWkRiNVJNaTFteU1KWmt0SzVqNFZoRlNlYVVrOWdqWnJieWpIWm5QSVZRWEhIZktUK0QzMEcxNm96OFFVS1ZSR3hpdjhybm1zNCtTVFZ5VDczZWEvSzVhQUE0citoSFpnR2dWYVlzSW5lc0ljMWJzV2pQVXZZM2ZnQk84dm5kelZxWTJBTEM5UUJXUlZsaTZwVHdPU2pkdm9TTlVncDBJaVJwZmlMOCtEMWtwZk1uR2hhcWpHM21NYmFjRXEyVVMxTURaVFZCZlk3RkFjQ3M5dkhDSWF1WFZSTTBPNjk0dHdSTzVkSnI2R1phWW1Fb0djRkVvbGd3ZDFTaHdRSEZEUUJrWG1GcHlnWTJVenF0Y29UbDdtdXArKzM0ZDdFYVRpOGcyLzEwTXhqU2lCdmthcTZPeUFSUWsxRGIrbWd6ejJKZGNrdk1jOGY3Ym4wdUdnQ3lhZ0lSZml6TmlwWmwreFAvSjlhL3JMWkZXSFFPRHR3WlZZSWlMREZ0NUFUTDVwTW8rc0s2WUFwdGVxRFpSSk5XTUZLZmgyK2pXUHpFM1RubE55aDFFS0xOSkV6dXBQK2ZqQVZXdTdDdnFmMWpsa1NQTEFCc0FXVkRVdkJWUGo4Zktvb3dVVWVTNWtoN0x1ZDFjeTd4YkJ5d25DaWVyRGVOS2lkWFZTemNadzBiQ2dnc1pmcTBDeFRtQW1YakIxOXJSa29zUXhyZlhEWmdjYitFcVBmOVFmMERjc0RUM0YvN3ZYYjZuWVlnbWxzd2ZRZ0JMeFM2UlJvUGNwQW9HY3EvdHlxOFN2bE5wL3RLKy83b0FzRGkyZzJydWFmR2FIWnkrQWVkV2pUejBNQnk5TzJLOVFIc1VJZWJkV2QxMDZMWTBwcmJIaXVHNC8rdVdKTUxpYUpCbUVORVRVb0NBYlgwdTJTaVdHZzBobE9NNlNNZzA3Kzc5NFZpT0szMWdRbWpqZ0hOTHlWSUdUUnN5VnhUWHJFc3czWnBFbzBzQU5DS2RBTFJIMHZzSEx0dnE0cTkwaDFweiszbXVqcFgybWZ6dzJyY2xrMU5lUytGYlRoaVk2VGp1NXg0RnBGUUtXWVRUVEVrRVMxaDFML0ZjTWtWRUVpdVM2WHF0UG8weUo3R3FLT0hTUWg1a2dTbDFvZFNoem9KcjFndmhGLzNUb0VoQ2hEL3dsb2lZNEMzYmExR0ZnQlFLVTAxTkQ5QXMrTTNTTkRVK1pUbVNIc3U1M1Z6YnZMZFpCOFJJbUxzWmxKSW1Mc0dnQmFCejA2cWp2L1FYOHRXUTFTZFE0UEdqWnNuOWppMk9mM0ZkS0ZSUnR4WGZrRGpIZFBjNGN4VC9vMmZRY2dUY3lYV2kzbkE5QUc0bUQ3c2tqR0lTdGZSQnNEK3VtbmNmck45dlFqblNuMW0zYTFpTldWdHA2VkZDelBxQzVZV2pTbElpVUFpVEpRbDhEM2JWRUp3UmJWcW0xYnNOSFpzY0VDMCt4bXgxMlN6ekRuNW5oZy9FLzhQbit0ejFVMmgvWWxpeFc2SVo1d09nQzRXdnBOZzlQSStMQUNiWU9waDUxYlVXV1lKcElqYU5CRktXSlh5QkxZZm1YeElCWFA2N2w3dUdmQUFJaW85Y2JKamh6MFpQOEVQb2o0a1dUZmUyMy9DYTZseE9nQ0dEQUJ6NkdSUzRGTk1xWWlOUmFlb2paS0cyQyt1V2Iyb1htSXhLN3RLSU1qZGdvQ1lQOEpQT2JMZEsrMnZrWElaYUg1TUgwb296dTl0OWxteldWWU1uOFVCTUd4QjcvRDk0eXFVbzFubWhEcTcwTklWaFg3TkZJcUlnNlpwb1lTU1dJYndyV1dKeVZ0MHVMZmtmUVNSYk8vQlY1WEpWc2l6ck5xdmhoSnVzVjRBbEdhWGl3ZHFpbzZWclhlQ2hxdmsrd2Z4TXhvRHhDNkZhS2hnOHFMNUFMMVQ5U0FtYkpEWEpLSzBTMUdoRSs5cFY0Mmt1eTRpQUJKQkphbEVjL25NUjJyZmxFQ3ZTV01LaWFXbzh0ejlkRWw1aFpxeFZISzlXRDhKQmJQdEROV3NSTWNzMDl0amdDSHRPa1VEUU94TXNFV0JNdUFFdHkrVU9aY3FscU9SaEpKcG5OYTZGRUhzbC9VT2FCOGlRTGJuT2ZVdXFJZTV2WGVoL1o2UzN5M3FvK3cxVGluN08wVnRjTkVBQVNYeGZucWJTU3F5bzJETWVIOHlqc3QvT2dCUzB2L2xFemV3ZjB2ajBVMUdVdzBseFVSQ0VJNllMeXBHRFFUSlZpNks1Vk9lc1NRSThGRWVMRmdJbGJaWElrcGNJK2FMSk5ycFRhcWxVcktML0lvMXVxekEyamdBVm1DU3V3VUxpMCtwTDVsYnREUUNGL3RsSUJDd3FPQTkvbDdaTks3dFpMR0l5VUhHZCtyRnN2VWNzeXNENElrcy85cjd0Rm11WWNMZlMyS3h4M1YwQVBRNGNkMEtkVmZuSzlKQzBzZWFaeFJxWk1lSDJDOFRZT0VLSjVaTmFZa0tFWWxDMkJmdVZXQ2d5cFBTNCtrUEZPOXZaYXRqQ2orWjN2eDBQUnhSKytUQ3RpNlJzNzBMNDFsa3JSMEFpMHpLY2hPMlV1OGxCWE9VR2xESFV5ODF0MTJKSm53SnFlZ256ZlRZOXV6Y2pTT2VoRWF0ZzAyZzJLOU5yYzd1K0g5N1k0eDc0QnFFVDhralVPTE1PR21rVDc1N3BlYlpBVENpQUVBQUFBR21FSldjRmhwbE05a1kwbmNablZBd2gyUExYanRidE8yN2dVQmFlSzEyc1VNd2FmTXNuMjJhUHBkOXRMZC9tdkFyNUprUGRtMHl2YmFMUmp2N3JOQzZPQUJXYUtKNzBtZ3lRYkRMcVljNnJ0Qm9ualpESzVWSTFIZHY4bmY1cDZ6b1RMYjlySnhRSGxaQmhTY21HRVYvN0dKblZaNlIraFpNOCt0L3pXSkhSWDNZekV0T2Y3KzdPL1EwdjFwN0I4QW9BNEI3a3libStRT2YvYlRaYlVWUjJ5Q2NVSHdCVENIMmQ5cjVWTUUydGFKd0R1ZlVuSEF3RndGM01CaU44aFZscEsxbGt3NDZQU1ZuSlVLZWk0SEVBVERxQU9EK2NFWlZER1laV0pVSUpHSEkyTllRNFZaMmxPQ3BMRFM0VUtaTncxQ3NVZ2VZSnhGK3lqRjJLOVJMY20xWXdnOGdIQUJYQXdCMGovZ0QxTVZRT2szdkFJbENtQ0RxUzVkano1MFNuVzlLd2xHVEZLdlVJVEY5MkRyL25LSk90cVg3NVZHbklheEZOQUI0S1VSYitIQVFDd2tMcUFhZlp3dVFJQ3ZvS1RYMVlsVHhIK3pGRlBFaGtzV1RkWTZwbTI1U2lUWHJueDdFWEhWeHpXZ0E4RktJQVFPZ3RhanJ0ZkV0cFFLMFpxS2xZNW9uQTBPQW1JWFNDVm96NlI3YithUWU1aUZBRDlQMFNmd0JCMEFYMmlLWnRHSCtYS050VmRoNUdnZVZKeW15WVVBc00yVlFBTUJuSVluR2t5QUpxMXByNDRqTXV3TmdSQmFpSzFCSmU3SUQyd0hLa3ZXZ1BwcEhZdGNMUlFHRE5EOE1sVHpGaGcydE5tajdsSlZPZGkwM3R3NkFxeEVBdW1mYlcwZ04raWYrMjJxbGxQTTZhaStFbjI0eG5uR00wOHZ6QW13Nzh4R2E4OUVHZ0FyQnR1Z0IyOWFFZm0xelp6TjJOK3Q0cEQyWDg1WTVsOGlMYWFzUnNWZmJOUm4zUmVrQXJaUThsb2s2K2hoeCtwZ2dJc1BNSHFIczVNeHVGTlFWalpMMlp6NUhHZ0E4Y0kveVdHaHo0azV0UXlMYk45V1I5bHpPNjNBdVFyYjIxcWJHUlh2WlRoQXJXS3pWTHZTWC9DNVFrcTNGRkVLN250R0RLQWExdDFBdm9LQzdpMGZJem54YXNRZmFiYVRuZ0ZJSGxJa3pRT2NwcFRHYUZQek1oMVhiUi9PdzR0L0V3Tk1jYWMvbHZHWFBWZk00dTdmdGY2VmsxWkxVckxBVnlIcnRoMk9MT2VTRnREMDVWY2RQeVFMYm9iT0ZDSEg4VVhpeFR4QTc1L0UwUjRSLzFFeWZCSVFqeXdBa1RzZ2EwaU9LazFkVFVvYWZhWTYwNTNKZXAzUFprSldhZWFvV2VmNFhUejJCenRuYTBQYldHYlpHMC9leld4cWI4dEpGVnBiV3hmWWVSTkZjSjJBbHlTNisvOEorTmJWcnp5RDI4N0dtOW1IUDB4TEthbVFCMEdteVYvSjlBNk9jT1lCQWd3bzlxL3RmYVFHQm5SV2c5aVVtZUNYK3p2ZGp5cEVmUU92UzlMNVFMN1JTaEtEdllaNEllYkovSzYyTnRxa1orL21NcVBDek50RUFFRHNUdkpJQzN1MTNWUVVFeXBQSmFHS0QyME1vaGdnQUZoTG5jZ01QSzlmVE9nR3A1UVpXU3ZpVENaVG1wMnlhQitQdFZyeC9iTVNGbjNuN0h3QUFBUC8vdERTVmZ3QUFFbDlKUkVGVTdaMEhleHpWRlliNW5lbDBFZ2d0UUFvdEJFSm9JU0gwRUZxQUZKSlFRb0RRNGlJMzJiTGxnbVZiY3Jkc3VkdlM5cWFiN3oyekVrSzJwWlhtenU0c1B2TThBeXZ2N3V3dDV6djluSHZGaW05TmhUVDNodHVLWWZjZksrSGN6a2Fvblo4T2w4TTEzUXloUGpVZHp1OXFobjEvcVlZdHZ5eWxXc00wNnovNzNXOVBoZFZYRnNLbVh4VERvWC9YUW0xeU9rdzN1cnNielZvSVo3WTN3NDRueTJIRHJjV3c4cnZwYUd0MmJpbHBkS0huWExIUW01MjhOd09BczE5ZVJnQVF6bHYxNlZBNTJRckhWdFRDbDc4djl4NEFJcEtWQXNIQXRZV3c2M2t4Sk51UFZwaHVkWUVwdGRlamVMZ1pEbjFRTmVKZmRXWCtpUi82ZGdBc2swbE90MEpvbEtmRDJlMk5zT2VWU2k0QXdJYXUvTjVVMlBwd0tZeC9WZ3VsbzgwdzNjd2VBTlA2aVdabE9wemEzQWk3WGl5SDFWY1Z3Z3FCc1JNRzJ1dlBPQUNXQ3dCdE9zUTFPZFlNWTI4S0FOL0p3WWFqQmwwOUZVYWVyWVN6T3hxaGVxNDdFZ0FBdEdwYWk3MVNDZjlXTlNtVWkvWG9RSFZ5QUN3VEFIeU5qWi9hcjAzL2F6WFJkM3ZNOVZaZk5SVTIzMWNNaHorb2hlcnBWbWlLS0tjWlpOWVh6RUNxVnZWc0t4eGZVdy9ERDViQzJoLzFoeFJ3QUtRZ2psd0JRT0JiZTJNaGpMNVdDV2UyTmswbGdTaTdRZjhzSVVCclZoT0p1UC90V2hpNnAyVHFXSzlWbk1WKzN3R3dUQUJBV0syOHFFQnQxV2ZvM2xLWUdLaUZ5b251cUQ3emx3NFFWTTlPR3dCM1BsTUphNjZYRk1pRGFyaUFLdVFBbUwrTEhmNXRSbkNKelc2RTNYL3FyUkdNeHdYMzUraWZLNmFTWVpCMlJmV1p0MVl3QmFRQUlEanlVUzBNLzdxVWUzdkFBVEJ2RXp2OTh5czNhTDEzYmxCeC9sVS9tQXJyYnkwWUNFOXZhWVI2b1FzNmZ3ZUxkSDVQTXh4NHB4bzIvclJvaG5sZUpZRURvSVBOblA4UjAzZmxBcDBjYThnQXJpZ1FWdXlKeXcrWEozby9iczlqcTJxaElZbUVaTXJEaFJTYUhHMkduWDhvRzBEekdoZUlCb0RMS1JMY0ZLRVZEN2ZDMGMvcUlyNXlXSGRqOXdHd1VycjEyaHNLNGN2ZmxVM2RLQnlReno4bnhBOEFHVXROcXRERVFNUGNzb00vYVVlR2Urd3BtMjhVUndOQTlFaXd1ZGEwa0VvN0lLVGY2dFZkVC9UYWhqZ2E2UThWdVJmUDdXNkdvNS9Yd3M1bnkySE5EM3ZqN2h1NFppb00zYTIwQjBWZXAwVDg5V0wzUEQ2ZFNCaXpCK1NHTFN0YVB2NXBQV3gvb215dVVhVFdmQ0xzNWQrNUJZQjVXUm9KMGNGSk1LeXFaenE4Ty8zc29zOXRXYnBEOFVnclRFcW5QVG5ZQ0FmZnE1cFlSN2RkSXc3Y3Ezd1gvUDFqYnlqbFlTVFIrL0ZJNWUxQ0NqU1ZNa0tBN01nblNobDVXZ3hEYTlaTGdwLy8yN2tGQUJ0YVBhTmNtNVYxSTdxRDc5Yk1xTUt3V3V6dTlMTjhidEhQL3JOcWdhN1IxNnBoNUpseTJLSWdEMFlueG1jdnd2Mzg3cm9mRnl6OTRzUzZ1a21rbGhnRkRDTjNGMUpjZC9XY0VnZGxEd0FDRWdjSHJzdVBGTWd2QUNRK2liSnVmMElFZDB0Qm0xNjBqV2Z6Rjc4Ny9TeWZXK0N6TittM2RHTm9FdGxjYzExQmVTNUp2azB2aUIvdXhYaTJQU2FqOTMvMVVEelNsR3FZVStLZmcwYkdXQ043VmxLVXZLbU5QNVBOaEMyUUEzc2d0d0Fnakk4WFllaGVMVmJPZ3luenhXb21mNHRZVm41ZmVyL1dBelVNWXFvcjVibGZMbk1ieTM0NnRrSnU0NmRJbU5OOGNwQXU3UUJZSUVxWUNTRXY4L2NnbGcyM1MvVjVWY0d1ZlNKK2NWU0lLdWFGem00M2o0MzdhSHN1VEswNDNncEgvbHNMbSs5UGJLaGVTd0VId0RJSnN0dmdRUGZmL2ppcWo0cGR6cmNTMVNlbTIxTUVqNnBpdCt5dldTREVRcGllenpNSjFPRXgzUHVXZ21SM0tWK294OUxkQWRBSEFGaGxBUytwUHUvWFp2WCsrQndhajF2TE1qcHJreTJyZGNqQ3M4UXpBZkM1WFkyd1F6R01BYVZ2ZDV1WnpQMDlCMERPQVlEcU0zaEhNZXg2UVZtZTIrVHlMTVpQZENPeVRSVDUxS1o2T1B5Zm1oWFRuRlp4UytVMEJqYXNPNVlZU0tRQXFsQkZIcjV4cVVMYkhpa2xIclVlN1lNRG9FY0xQNWNMWGVvMXhJL2ZIS09SR0VUbFZIemloN1RyQmNVNTVLc2ZlN01haGg4cWhhMGl5dEhYcTFKVm1pWUpVRjFpWG1BS1ZZdm85Y0gzYW1HRG9zUzlxaUtMQm9EWXFSQXRGVmduWGlEcGlUbndGbHlLU0xQNmQrcDc4WlNRVjMvNHc1cXlMQlB1R1pNUVo1NEZJVkpJUC95clVsaDlEVEdPZ3VublJ6NnVoL0p4Z1U3UitDd3VubnR1UlBsQ0NwQlJXNzdxKzkwUGtrVURRT3hVaU12YURTcml4K2lGTSs1L3UycXBGNmdoY001WTZvaHBOa292SVVoRlRJR0VPdUlkTTBZcHdTcGlNQlQ5NDNHeWxKU0lxdERNUEZDelRteVFhMVJKYy94K3QxM2VEb0FjcWtBUVA4RS8yb3VjVWRGOVRjYXBYYkVJRURDcFdxeWgvQ0VyNmxjOUE4VXJjeVV0cndrNDducXhZbEZjQTRFaE1LNHNhQ25YQ3FNYktZZjZOWEN0ak9JdWVvWWNBRGtFQU1TUDNrL1FpT1M3Mk40WTZOaDg4c3B4MnZOU05RemVlZkVlUHFzVWVOdjQ4MkxZcTZKL0VnQXo2VENoc1RBL2JCQU1jS0xFM1V5ZGRnRGtDQUJ3M2JYS0xzVXpja2d1VDdJOGsrcXV5RnhYQmlnQktRQzIrYjUyMWRiRjBoTDBieGpoNU8rTWY1TFlBd1RmWWdzQ25sZFRCd3VrRVJKbmswQTNvTFNUck95cnVjOTFBT1FJQUJpZ0VPU1lTaHRQYlVxeVBHTWFvQkNhcVQ1eWVaN1U4L2RJOVNFWGFxN3FNNWM0ZUUzNkJhRGM4MG8xbkI3V21Nd2VpQThDMnFxVUpwSW84VTRsSFNLVnVxRUtPUUJ5QWdEVHVXK1d6cTAya3hpZUJYVlppMzBaOGF1dW9UU0IrN0ZxSGliYUtjNG4rZ3YrbGs1T3F4TytVenFxZGl1cSsrVlpzUzlpRWFSM0gzcS9Hclk5S284VVFiS003UUVIUUU0QVFHRU4vdmZqU25HR3lPZzZGL1A2U3U5dldvbzVCU3I0M21lOFBoY1EvYngxd1VnR0JIaHN5dW82a1lVcTFCTG1LZXc1cDU2ckIvNVZ0UjVIcTYvdUFLRHp4cnJZWE9hKzd3QklzWGh6RnpMVmErbmFteCtReTFPMUI0VkQyUVNmTENWWkxzK1RHK3RoUkwxRFNheGJ5cGl0QkZPcDJDVGpuVkx4UGVuTlNJSFk5Z0R1VVpwNm9XN3RmVXZqdkUwZ3piQ0t6QUhRWXdDZytzQ0pyYnBMK1RIUkM5dlIrM1hEV2EyTG5Wb1hMdGZmamoyQWg0cjJoOVFpWktVS0dWamxHaVcyaEZUTTBpQ09CZ0NQQkM4dnFRc2o5TXVuS3VIRU92WHlGT2VMYWZTYUNnVUFGRVlvSEpDdlhXNUdpL1l1czNrdFVnQ3dibnUwSE1ZVkpaNGNsVDFRaWFtb3RaK2xNUk1mcUp5WXRzWUQyeDlUOSsyTGVha2lNQzhIUUlSRlhJb3FNZnRaRWRPQTlOdXR2eW1IaVZXcTdwTGV6NmJIdnVoZ2dVMXg3SXU2QmRZczRKWFNzRngvY3pIcytDM2RLR1N2SEV1TTR0ampSaFhpdklIaW9aYVZyZEpWd3V5QnlFQ0lCZ0JQaFZpYUJFRDEyYWdzVHhyclV2dWNHSlhhOWNnWC92NXgxZUphdmcxNmZ3UUNRaEtzdVdIS0dvS2RHbEtTbmpvL3hMN01aYXYvMEkzampEcGRqNzZxY3djRWdoampuMlZDWW40T2dCNUlBSWlmQU5Qb3k5V2trUzF1UlcwMm14N3JRdTBoeitmRWVuRitIZUJoR1pkcXBUSjM4OU84eGg3QVY0L3RjbEpwMUJCcWJQWE5RS0FvTVZtd1o0YWJCamhpRWpGZG93NkFMZ1BBdU9mMTh2cW9KSEJpZGQyYVI1RmlFSXY0aldoUUh3UXEwaGVRTUJ0dUo5TXlzazlka2dRLy9SWmxrTzcvUjl0N0pVTTc5Z1ZqSUVoV0U1Z1B2cXZZaGRyQjJGd2k3WnNESU5KQ2RzcE5yWWYvQXdvcUtkaFRPSmdZdlRHTFRnQUFUY1FvT0RHQ1VUcDFacmsxQWdIZE1raGl3MitmUmZBT1c4Q2tvK1pFZkFDSll3bHprZmJOQVJCcElUc0NnSFJuWEpBajZpaG5XWjdpYWx5eHVMODlTNzU1bW9pZFZ0ZHE5SDRJRktuVDBmaVdzUllBZXIwT3hDT3dSb3lCdy9rU29yV3BSZm1Qclk5VU9sUWhqbjVDOWJLdUVoSG01UUJZeHFZdmk1akVMUzI3VWgzbDl2KzlhcHZaa3BvUzY0SklURjFRc2hvdFUvYXBqb0RXaWFSV0wydThIYTZMeFRHa0NsRzJpUlFncXhNSlpGdzcxdlI0am00U0F3bVFiWHRjL1ZpVk5oSkRzamtBT3R6b3RFUUVGNmJJaEJ3WGNuM1kwSmlYRWIreVBEbW02T2pueXZLOHZ4MUFpdUQxNldUdUVDTU51NDUra1JUUUVNeGlUTEd2d3NGbTJLdU8zTmdDTVFKazZRRWc4Y2M1d2U0R1haalR3djBwKzl1cnVsc09zSXQ1R2ZlWElVMjNCWEoxUnA1RFQvNTZnVXNuUkp6cU13STRuaTNVTHM1UEpyMTUxcmlQaUlPU1NqUnBEYk5ES2hkZDhsS05XY3d2TlFEUS84amhOZ0MwZGRyVW00dTRrM3BBUDhtaGU3cVRGcHQySVJmN1Bxb0lEWFdKeHBLU0VQTWlKNGRVQjlRUGF6Mm8zNG50TDE5c2Z2YStRREI0bDJJYk9qejhyQTVPdDFxR3lQbENadDlJRFJwNVR1Y09LQzJqbzNFdElPVlRBd0N1WmdBUVY4TlZGZXRxcVFnY1hkWU9XNHRnN0tSZHFMVGZKNFdBdVZDRVF2UTA1a1VFbVdmU1NCaGRQRXVqZDdGMVdLWDBhaUxGaHorc1d6ZnYyTEVCR210TnFqTWVnVEdpdzR1Tlo3SDNVd05ndll3UlRnRTVPWmlVNzhYWVdCYU53Z3M4R2JPTlZCZEE4V0tUek1QN3E2VWowOWNUM3orZEZxSmM0amVzRlhvL2RzVjJHWWMwOE8wSjkyL3ZEK0FEQkRTOVlreU1MV1lwSlFCQWdwS1ZTbndqN2Q2bUJzQTZ1ZlZ3Z1IyVlhrWkZUNHdMOVllY2M4NmMzWEJIZWpHWGRwRmlmQjhBY0pEZHVBeFUwaE5pWEtSUGNBREY2ZUc2N0xEa3NBNjhNakhHbS9ZWmFBYTRlMUdOT2JDYnNjYTRjTE1TRDlqOUVxblNPUUFBaFJ5Y0JrZ1ZUMEZGMWpFdVM5MVZQZXlSajJ0aHZmTEIwMjVHSHI2UERZRC8rc0E3TlZQdG9xeVR1Q0crOTlIWFZVY3JjTVZNRVVpN1pnQ1I5QXNDZnFpeUZoK0lNR21hQk15MFVhRnJSZHB4cHBZQWhNTUg3MVJ3NTNsWi8zUU9pSUFCSnNtSmgyeXM1YTczdWZyREpsSFVnZTk2ejhzVm0xdGFXcUNQSjBidlBzVVVLRnJIQTVPV0dHSi9IMDhVYmw4WUdSMnRFNk00M2N5Um5qZ1NySThSZVVFcGFTTTFBSER2a1JtNFJSVk50TytiS2VWYmpnc1k4Q0FxQ2FsekJoZXFWWjVPRTBtejJETUpjUFQ2d1ZoTmlrbVdUZ3kyUnJRVlZPVVk5Z1RQd3gxSWNscWE4V1h4WFFPOXVQUnVlUWxSWjJkU3A1ZE1HMjN0aWRnQ25zSFIxeEtKRnlNbElqVUFNTGhzb3RvRWtxSXdVTmlrSlU5U3RBRHhreHBNazFiY2VSallNUk9mc3Rqa2pwOUpKTGp0Q3Qwck55RWdiNVNYRGdENitaalJLeERSTUJkWFlKWWxneDNQNzFLY1dFWXg3bC9HQ2xNamRacEk4Vkl1b3lXQmdIa0QrczF0aVJlRE50SURnSWxyYzFHRlNMdWQwTWJnRGswNFhEdkxjVEg3Uis5RC9EVk5rTW95dWc4ZzRteGp1eFRKVEwzUmx5S0F1Zit1dWFDcXdMVW4yaHdSRjZaRlRCZGFvL1o3Y0VDSWdNNEpNM3EvRVVITzE0aUlMZDY4WFM4a1JqSDBZWjZoaGViY1JzaE1oQnRtWVNrZTdaSk9NL1lqekRzT0FMVEpadlNvNEFMTC8vaWFSbExjcldva0M0bVQ3a3RBNUlKYm00L2FvNDJsVlFmRkZVUkthUXdGOSs4S1VjNGwwQzY4UmxYQmZRZXpPSzR6ZE12SGs1TmVMR3A2d2ZyTVdiTzJ1NU5jR0lnZmwrb2FwVlgzd3hwQkc2aXlnSUNETVpEd2RzaEh1K0h2MStoQzdIN3Uzd1o2ZVpFbXgxcVdhelQ4WU56OHBtZ0FzSTBRSXRjcENMTHo2WXBWSVJFU1IrOGppdy9WQnU3MXRmdVUzSGdUNmxMVzFtZlI3ZkNVY0FadUw0TTVtUk9WMW1sQVRiQlFDd0FCK1Myb0JraEFqRnZhbGR1dDEvUUZaYzF3TWVNWUdGT25CTlFlU3dUcnB3Q2g1anlqQXM0NEFrZ0hyNm81THIxQm1XK2ptTnk4QmlEVVNGUE9TVHlJdzBHMktJMDhkcHVVdUFBUUJ6V2pXRDFrQnVXLzN5cjNLTG84V1lLSFA5TEJDNThtaHkrTVN4Y2tyWlVqU29ubzdYaXlaSm1MR0hNc1VwN2NlVm1CQVlCVDNUUjBkOG42Z05JRitxanFkbkZybnRxc2UwaXZ4U2x4K1ZIU09QYUdldmRyUFpHTVp2QkdFUDlaemUyU3o5V1lpWWV3ejBnd01naG95ODV4cjRDYjFvaWtpYU1Kb09zZmtyZG5WQUV2T2tPc3Z5V3BDWTdOR0tNRFlHYnlKdmJrQnR1bzNCRGNkRnNmTGxzM0FUb0tVT1cvWGY4SDBieFB6am9keW1KUGJtWXNlZjQvdmZqWDMxUzBsb2hFY25jK1U3RmtOaExhUnZRYWFicnRrWExZSlBYQm9yejl4UFV2b1ZLeXp6QTZWRUdhYmUxVUkrQmQ2bFZFVWlVM2M4ZE9HbjZvbk5CSGhpN2V6QUF3UzNSd0trMllTYy9lMGdsblgzOEROblIycnBmWThFWGZuMWtqMXVWaWQzdnRGbjNPY24rL1I5OHpHcGc3WDhWS2NIek1yZ0cwa2JHa3l4NEFQVnJjYnhxeCtId0VoZ3hveVFHUXdhSm1zVkgrVEFkQUpoekFDU3Nid3VxWGRYVUo0Qkxnc21Zc0RnQUhnQU9nWDhTVmovUHlWbGV5MkgrWEFDNEJYQUprZ1N4L3BuUHJmcUFCbHdBdUFWd0M5QU5TZll3dVViS2dBWmNBTGdGY0FtU0JMSCttYyt4K29BR1hBQzRCWEFMMEExSjlqQzVSc3FBQmx3QXVBVndDWklFc2Y2Wno3SDZnQVpjQUxnRmNBdlFEVW4yTUxsR3lvQUdYQUM0QlhBSmtnU3gvcG5Qc2ZxQUJsd0F1QVZ3QzlBTlNmWXd1VWJLZ0FaY0FMZ0ZjQW1TQkxIK21jK3grb0FHWEFDNEJYQUwwQTFKOWpDNVJzcUFCbHdBdUFWd0NaSUVzZjZaejdINmdBWmNBTGdGY0F2UURVbjJNTGxHeW9BR1hBQzRCWEFKa2dTeC9wblBzZnFBQmx3QXVBVndDOUFOU2ZZd3VVYktnQVpjQUxnRmNBbVNCTEgrbWMreCtvQUdYQUM0QlhBTDBBMUo5akM1UnNxQUJsd0F1QVZ3Q1pJRXNmNlp6N0g2Z0FaY0FMZ0V1YXdud2Yxa2pWVCtGRXFxNEFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICAgIAogICAgICAgIAogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgICFmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBpKG8sYSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgbD0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZQppZighYSYmbClyZXR1cm4gbChvLCEwKQppZihzKXJldHVybiBzKG8sITApCnZhciBoPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKQp0aHJvdyBoLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGh9dmFyIHU9bltvXT17ZXhwb3J0czp7fX0KdFtvXVswXS5jYWxsKHUuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdCnJldHVybiBpKG4/bjplKX0sdSx1LmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c31mb3IodmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsbz0wO288ci5sZW5ndGg7bysrKWkocltvXSkKcmV0dXJuIGl9KHsxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9e2lzRG9tUHJlc2VudDohMCxuYXZpZ2F0b3I6bmF2aWdhdG9yLHdpbmRvdzp3aW5kb3csZG9jdW1lbnQ6ZG9jdW1lbnQsYWpheDpmdW5jdGlvbihlKXt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3QKaWYodC5vcGVuKCJHRVQiLGUsITEpLHQub3ZlcnJpZGVNaW1lVHlwZSYmdC5vdmVycmlkZU1pbWVUeXBlKCJ0ZXh0L3BsYWluIiksdC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsIkZyaSwgMDEgSmFuIDE5NjAgMDA6MDA6MDAgR01UIiksdC5zZW5kKG51bGwpLDIwMCE9PXQuc3RhdHVzJiYwIT09dC5zdGF0dXMpdGhyb3ciWE1MSHR0cFJlcXVlc3QgZmFpbGVkLCBzdGF0dXMgY29kZSAiK3Quc3RhdHVzCnJldHVybiB0LnJlc3BvbnNlVGV4dH19CndpbmRvdy5Qcm9jZXNzaW5nPWUoIi4vc3JjLyIpKHIpfSx7Ii4vc3JjLyI6Mjh9XSwyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtuYW1lOiJwcm9jZXNzaW5nLWpzIix2ZXJzaW9uOiIxLjYuNiIsYXV0aG9yOiJQcm9jZXNzaW5nLmpzIixyZXBvc2l0b3J5Ont0eXBlOiJnaXQiLHVybDoiZ2l0QGdpdGh1Yi5jb20vcHJvY2Vzc2luZy1qcy9wcm9jZXNzaW5nLWpzLmdpdCJ9LG1haW46InByb2Nlc3NpbmcubWluLmpzIixidWdzOiJodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy1qcy9wcm9jZXNzaW5nLWpzL2lzc3VlcyIsZGV2RGVwZW5kZW5jaWVzOnthcmd2OiJ+MC4wLjIiLGJyb3dzZXJpZnk6Il4xMS4wLjEiLGV4cHJlc3M6In4zLjMuMyIsZ3J1bnQ6In4wLjQuMSIsImdydW50LWNsaSI6In4wLjEuOCIsImdydW50LWNvbnRyaWItanNoaW50IjoifjAuNC4zIiwiaHR0cC1zZXJ2ZXIiOiJeMC45LjAiLG1pbmlmaWVyOiJeMC43LjEiLCJub2RlLW1pbmlmeSI6In4wLjcuMyIsbnVuanVja3M6In4wLjEuOSIsb3BlbjoiMC4wLjMifSxzY3JpcHRzOnt0ZXN0OiJub2RlIHRlc3QiLCJ0ZXN0Om1hbnVhbCI6Imh0dHAtc2VydmVyIC1vIHRlc3QvbWFudWFsIixzdGFydDoiYnJvd3NlcmlmeSBidWlsZC5qcyAtbyBwcm9jZXNzaW5nLmpzICYmIG1pbmlmeSAtLW91dHB1dCBwcm9jZXNzaW5nLm1pbi5qcyBwcm9jZXNzaW5nLmpzIn0sbGljZW5zZToiTUlUIixkZXBlbmRlbmNpZXM6e21pbmlmaWVyOiJeMC43LjEifX19LHt9XSwzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEFycmF5KSl7aWYoZS5pdGVyYXRvciBpbnN0YW5jZW9mIEZ1bmN0aW9uKXJldHVybiBlLml0ZXJhdG9yKCkKdGhyb3ciVW5hYmxlIHRvIGl0ZXJhdGU6ICIrZX12YXIgdD0tMQp0aGlzLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4rK3Q8ZS5sZW5ndGh9LHRoaXMubmV4dD1mdW5jdGlvbigpe3JldHVybiBlW3RdfX19LHt9XSw0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtYOjAsWToxLFo6MixSOjMsRzo0LEI6NSxBOjYsVTo3LFY6OCxOWDo5LE5ZOjEwLE5aOjExLEVER0U6MTIsU1I6MTMsU0c6MTQsU0I6MTUsU0E6MTYsU1c6MTcsVFg6MTgsVFk6MTksVFo6MjAsVlg6MjEsVlk6MjIsVlo6MjMsVlc6MjQsQVI6MjUsQUc6MjYsQUI6MjcsRFI6MyxERzo0LERCOjUsREE6NixTUFI6MjgsU1BHOjI5LFNQQjozMCxTSElORTozMSxFUjozMixFRzozMyxFQjozNCxCRUVOX0xJVDozNSxWRVJURVhfRklFTERfQ09VTlQ6MzYsUDJEOjEsSkFWQTJEOjEsV0VCR0w6MixQM0Q6MixPUEVOR0w6MixQREY6MCxEWEY6MCxPVEhFUjowLFdJTkRPV1M6MSxNQVhPU1g6MixMSU5VWDozLEVQU0lMT046MWUtNCxNQVhfRkxPQVQ6My40MDI4MjM1ZTM4LE1JTl9GTE9BVDotMy40MDI4MjM1ZTM4LE1BWF9JTlQ6MjE0NzQ4MzY0NyxNSU5fSU5UOi0yMTQ3NDgzNjQ4LFBJOk1hdGguUEksVFdPX1BJOjIqTWF0aC5QSSxUQVU6MipNYXRoLlBJLEhBTEZfUEk6TWF0aC5QSS8yLFRISVJEX1BJOk1hdGguUEkvMyxRVUFSVEVSX1BJOk1hdGguUEkvNCxERUdfVE9fUkFEOk1hdGguUEkvMTgwLFJBRF9UT19ERUc6MTgwL01hdGguUEksV0hJVEVTUEFDRToiIFx0XG5cclxmwqAiLFJHQjoxLEFSR0I6MixIU0I6MyxBTFBIQTo0LENNWUs6NSxUSUZGOjAsVEFSR0E6MSxKUEVHOjIsR0lGOjMsQkxVUjoxMSxHUkFZOjEyLElOVkVSVDoxMyxPUEFRVUU6MTQsUE9TVEVSSVpFOjE1LFRIUkVTSE9MRDoxNixFUk9ERToxNyxESUxBVEU6MTgsUkVQTEFDRTowLEJMRU5EOjEsQUREOjIsU1VCVFJBQ1Q6NCxMSUdIVEVTVDo4LERBUktFU1Q6MTYsRElGRkVSRU5DRTozMixFWENMVVNJT046NjQsTVVMVElQTFk6MTI4LFNDUkVFTjoyNTYsT1ZFUkxBWTo1MTIsSEFSRF9MSUdIVDoxMDI0LFNPRlRfTElHSFQ6MjA0OCxET0RHRTo0MDk2LEJVUk46ODE5MixBTFBIQV9NQVNLOjQyNzgxOTAwODAsUkVEX01BU0s6MTY3MTE2ODAsR1JFRU5fTUFTSzo2NTI4MCxCTFVFX01BU0s6MjU1LENVU1RPTTowLE9SVEhPR1JBUEhJQzoyLFBFUlNQRUNUSVZFOjMsUE9JTlQ6MixQT0lOVFM6MixMSU5FOjQsTElORVM6NCxUUklBTkdMRTo4LFRSSUFOR0xFUzo5LFRSSUFOR0xFX1NUUklQOjEwLFRSSUFOR0xFX0ZBTjoxMSxRVUFEOjE2LFFVQURTOjE2LFFVQURfU1RSSVA6MTcsUE9MWUdPTjoyMCxQQVRIOjIxLFJFQ1Q6MzAsRUxMSVBTRTozMSxBUkM6MzIsU1BIRVJFOjQwLEJPWDo0MSxDSE9SRDoyLFBJRTozLEdST1VQOjAsUFJJTUlUSVZFOjEsR0VPTUVUUlk6MyxWRVJURVg6MCxCRVpJRVJfVkVSVEVYOjEsQ1VSVkVfVkVSVEVYOjIsQlJFQUs6MyxDTE9TRVNIQVBFOjQsT1BFTjoxLENMT1NFOjIsQ09STkVSOjAsQ09STkVSUzoxLFJBRElVUzoyLENFTlRFUl9SQURJVVM6MixDRU5URVI6MyxESUFNRVRFUjozLENFTlRFUl9ESUFNRVRFUjozLEJBU0VMSU5FOjAsVE9QOjEwMSxCT1RUT006MTAyLE5PUk1BTDoxLE5PUk1BTElaRUQ6MSxJTUFHRToyLE1PREVMOjQsU0hBUEU6NSxTUVVBUkU6ImJ1dHQiLFJPVU5EOiJyb3VuZCIsUFJPSkVDVDoic3F1YXJlIixNSVRFUjoibWl0ZXIiLEJFVkVMOiJiZXZlbCIsQU1CSUVOVDowLERJUkVDVElPTkFMOjEsU1BPVDozLEJBQ0tTUEFDRTo4LFRBQjo5LEVOVEVSOjEwLFJFVFVSTjoxMyxFU0M6MjcsREVMRVRFOjEyNyxDT0RFRDo2NTUzNSxTSElGVDoxNixDT05UUk9MOjE3LEFMVDoxOCxDQVBTTEs6MjAsUEdVUDozMyxQR0ROOjM0LEVORDozNSxIT01FOjM2LExFRlQ6MzcsVVA6MzgsUklHSFQ6MzksRE9XTjo0MCxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMyxOVU1MSzoxNDQsTUVUQToxNTcsSU5TRVJUOjE1NSxBUlJPVzoiZGVmYXVsdCIsQ1JPU1M6ImNyb3NzaGFpciIsSEFORDoicG9pbnRlciIsTU9WRToibW92ZSIsVEVYVDoidGV4dCIsV0FJVDoid2FpdCIsTk9DVVJTT1I6InVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PScpLCBhdXRvIixESVNBQkxFX09QRU5HTF8yWF9TTU9PVEg6MSxFTkFCTEVfT1BFTkdMXzJYX1NNT09USDotMSxFTkFCTEVfT1BFTkdMXzRYX1NNT09USDoyLEVOQUJMRV9OQVRJVkVfRk9OVFM6MyxESVNBQkxFX0RFUFRIX1RFU1Q6NCxFTkFCTEVfREVQVEhfVEVTVDotNCxFTkFCTEVfREVQVEhfU09SVDo1LERJU0FCTEVfREVQVEhfU09SVDotNSxESVNBQkxFX09QRU5HTF9FUlJPUl9SRVBPUlQ6NixFTkFCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVDotNixFTkFCTEVfQUNDVVJBVEVfVEVYVFVSRVM6NyxESVNBQkxFX0FDQ1VSQVRFX1RFWFRVUkVTOi03LEhJTlRfQ09VTlQ6MTAsU0lOQ09TX0xFTkdUSDo3MjAsUFJFQ0lTSU9OQjoxNSxQUkVDSVNJT05GOjMyNzY4LFBSRUNfTUFYVkFMOjMyNzY3LFBSRUNfQUxQSEFfU0hJRlQ6OSxQUkVDX1JFRF9TSElGVDoxLE5PUk1BTF9NT0RFX0FVVE86MCxOT1JNQUxfTU9ERV9TSEFQRToxLE5PUk1BTF9NT0RFX1ZFUlRFWDoyLE1BWF9MSUdIVFM6OH19LHt9XSw1OltmdW5jdGlvbihlLG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciBuPXtCdWZmZXJNYXg6MjAwfSxyPWUuY3JlYXRlRWxlbWVudCgic3R5bGUiKSxpPSExCnJldHVybiByLnRleHRDb250ZW50PVsiLnBqc2NvbnNvbGUuaGlkZGVuIHsiLCIgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50OyIsIn0iXS5qb2luKCJcbiIpLG4ud3JhcHBlcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHIudGV4dENvbnRlbnQrPVsiIiwiLnBqc2NvbnNvbGUgeyIsIiAgb3BhY2l0eTogLjc1OyIsIiAgZGlzcGxheTogYmxvY2s7IiwiICBwb3NpdGlvbjogZml4ZWQ7IiwiICBib3R0b206IDBweDsiLCIgIGxlZnQ6IDBweDsiLCIgIHJpZ2h0OiAwcHg7IiwiICBoZWlnaHQ6IDUwcHg7IiwiICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhOyIsIn0iXS5qb2luKCJcbiIpLG4ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCJwanNjb25zb2xlIiksbi5kcmFnZ2VyPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksci50ZXh0Q29udGVudCs9WyIiLCIucGpzY29uc29sZSAuZHJhZ2dlciB7IiwiICBkaXNwbGF5OiBibG9jazsiLCIgIGJvcmRlcjogM3B4IGJsYWNrIHJhaXNlZDsiLCIgIGN1cnNvcjogbi1yZXNpemU7IiwiICBwb3NpdGlvbjogYWJzb2x1dGU7IiwiICB0b3A6IDBweDsiLCIgIGxlZnQ6IDBweDsiLCIgIHJpZ2h0OiAwcHg7IiwiICBoZWlnaHQ6IDVweDsiLCIgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7IiwifSJdLmpvaW4oIlxuIiksbi5kcmFnZ2VyLmNsYXNzTGlzdC5hZGQoImRyYWdnZXIiKSxuLmNsb3Nlcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHIudGV4dENvbnRlbnQrPVsiIiwiLnBqc2NvbnNvbGUgLmNsb3NlciB7IiwiICBvcGFjaXR5OiAuNTsiLCIgIGRpc3BsYXk6IGJsb2NrOyIsIiAgYm9yZGVyOiAzcHggYmxhY2sgcmFpc2VkOyIsIiAgcG9zaXRpb246IGFic29sdXRlOyIsIiAgdG9wOiAxMHB4OyIsIiAgcmlnaHQ6IDMwcHg7IiwiICBoZWlnaHQ6IDIwcHg7IiwiICB3aWR0aDogMjBweDsiLCIgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7IiwiICBjb2xvcjogIzAwMDsiLCIgIGxpbmUtaGVpZ2h0OiAyMHB4OyIsIiAgdGV4dC1hbGlnbjogY2VudGVyOyIsIiAgY3Vyc29yOiBwb2ludGVyIiwifSJdLmpvaW4oIlxuIiksbi5jbG9zZXIuY2xhc3NMaXN0LmFkZCgiY2xvc2VyIiksbi5jbG9zZXIuaW5uZXJIVE1MPSImIzEwMDA2OyIsbi5qYXZhY29uc29sZT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHIudGV4dENvbnRlbnQrPVsiIiwiLnBqc2NvbnNvbGUgLmNvbnNvbGUgeyIsIiAgb3ZlcmZsb3cteDogYXV0bzsiLCIgIGRpc3BsYXk6IGJsb2NrOyIsIiAgcG9zaXRpb246IGFic29sdXRlOyIsIiAgbGVmdDogMTBweDsiLCIgIHJpZ2h0OiAwcHg7IiwiICBib3R0b206IDVweDsiLCIgIHRvcDogMTBweDsiLCIgIG92ZXJmbG93LXk6IHNjcm9sbDsiLCIgIGhlaWdodDogNDBweDsiLCJ9Il0uam9pbigiXG4iKSxuLmphdmFjb25zb2xlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJjb25zb2xlIiksbi53cmFwcGVyLmFwcGVuZENoaWxkKG4uZHJhZ2dlciksbi53cmFwcGVyLmFwcGVuZENoaWxkKG4uamF2YWNvbnNvbGUpLG4ud3JhcHBlci5hcHBlbmRDaGlsZChuLmNsb3Nlciksbi5kcmFnZ2VyLm9ubW91c2Vkb3duPWZ1bmN0aW9uKHQpe24uZGl2aGVpZ2h0PW4ud3JhcHBlci5zdHlsZS5oZWlnaHQsZS5zZWxlY3Rpb24/ZS5zZWxlY3Rpb24uZW1wdHkoKTp3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCkKdmFyIHI9dC5zY3JlZW5ZCndpbmRvdy5vbm1vdXNlbW92ZT1mdW5jdGlvbihlKXtuLndyYXBwZXIuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobi5kaXZoZWlnaHQpKyhyLWUuc2NyZWVuWSkrInB4IixuLmphdmFjb25zb2xlLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KG4uZGl2aGVpZ2h0KSsoci1lLnNjcmVlblkpLTEwKyJweCJ9LHdpbmRvdy5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ZS5zZWxlY3Rpb24/ZS5zZWxlY3Rpb24uZW1wdHkoKTp3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCksbi53cmFwcGVyLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KG4uZGl2aGVpZ2h0KSsoci10LnNjcmVlblkpKyJweCIsbi5qYXZhY29uc29sZS5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChuLmRpdmhlaWdodCkrKHItdC5zY3JlZW5ZKS0xMCsicHgiLHdpbmRvdy5vbm1vdXNlbW92ZT1udWxsLHdpbmRvdy5vbm1vdXNldXA9bnVsbH19LG4uQnVmZmVyQXJyYXk9W10sbi5wcmludD1uLmxvZz1mdW5jdGlvbigpe2l8fChlLmJvZHkuYXBwZW5kQ2hpbGQociksZS5ib2R5LmFwcGVuZENoaWxkKG4ud3JhcHBlciksaT0hMCkKdmFyIHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKQp0PXMubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrKHQrMT09PXMubGVuZ3RoPyIiOiIgIil9KS5qb2luKCIiKSxuLkJ1ZmZlckFycmF5W24uQnVmZmVyQXJyYXkubGVuZ3RoLTFdP24uQnVmZmVyQXJyYXlbbi5CdWZmZXJBcnJheS5sZW5ndGgtMV0rPXQrIiI6bi5CdWZmZXJBcnJheS5wdXNoKHQpLG4uamF2YWNvbnNvbGUuaW5uZXJIVE1MPW4uQnVmZmVyQXJyYXkuam9pbigiIiksbi5zaG93Y29uc29sZSgpfSxuLnByaW50bG49ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpCmUucHVzaCgiPGJyPiIpLG4ucHJpbnQuYXBwbHkobixlKSxuLkJ1ZmZlckFycmF5Lmxlbmd0aD5uLkJ1ZmZlck1heD9uLkJ1ZmZlckFycmF5LnNwbGljZSgwLDEpOm4uamF2YWNvbnNvbGUuc2Nyb2xsVG9wPW4uamF2YWNvbnNvbGUuc2Nyb2xsSGVpZ2h0fSxuLnNob3djb25zb2xlPWZ1bmN0aW9uKCl7bi53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpfSxuLmhpZGVjb25zb2xlPWZ1bmN0aW9uKCl7bi53cmFwcGVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxuLmNsb3Nlci5vbmNsaWNrPWZ1bmN0aW9uKCl7bi5oaWRlY29uc29sZSgpfSxuLmhpZGVjb25zb2xlKCksbn19LHt9XSw2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gbihlLHQsbil7aWYoIWUuaGFzT3duUHJvcGVydHkodCl8fCJmdW5jdGlvbiIhPXR5cGVvZiBlW3RdKXJldHVybiB2b2lkKGVbdF09bikKdmFyIHI9ZVt0XQppZigiJG92ZXJsb2FkcyJpbiByKXJldHVybiB2b2lkKHIuJGRlZmF1bHRPdmVybG9hZD1uKQppZigiJG92ZXJsb2FkcyJpbiBufHxyLmxlbmd0aCE9PW4ubGVuZ3RoKXt2YXIgaSxzCiIkb3ZlcmxvYWRzImluIG4/KGk9bi4kb3ZlcmxvYWRzLnNsaWNlKDApLGlbci5sZW5ndGhdPXIscz1uLiRkZWZhdWx0T3ZlcmxvYWQpOihpPVtdLGlbbi5sZW5ndGhdPW4saVtyLmxlbmd0aF09cixzPXIpCnZhciBvPWZ1bmN0aW9uKCl7dmFyIGU9by4kb3ZlcmxvYWRzW2FyZ3VtZW50cy5sZW5ndGhdfHwoIiRtZXRob2RBcmdzSW5kZXgiaW4gbyYmYXJndW1lbnRzLmxlbmd0aD5vLiRtZXRob2RBcmdzSW5kZXg/by4kb3ZlcmxvYWRzW28uJG1ldGhvZEFyZ3NJbmRleF06bnVsbCl8fG8uJGRlZmF1bHRPdmVybG9hZApyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Cm8uJG92ZXJsb2Fkcz1pLCIkbWV0aG9kQXJnc0luZGV4ImluIG4mJihvLiRtZXRob2RBcmdzSW5kZXg9bi4kbWV0aG9kQXJnc0luZGV4KSxvLiRkZWZhdWx0T3ZlcmxvYWQ9cyxvLm5hbWU9dCxlW3RdPW99fWZ1bmN0aW9uIHIoZSx0KXtmdW5jdGlvbiByKG4pe3MuZGVmaW5lUHJvcGVydHkoZSxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKGUpe3Rbbl09ZX0sZW51bWVyYWJsZTohMH0pfXZhciBpPVtdCmZvcih2YXIgbyBpbiB0KSJmdW5jdGlvbiI9PXR5cGVvZiB0W29dP24oZSxvLHRbb10pOiIkIj09PW8uY2hhckF0KDApfHxvIGluIGV8fGkucHVzaChvKQpmb3IoO2kubGVuZ3RoPjA7KXIoaS5zaGlmdCgpKQplLiRzdXBlcj10fWZ1bmN0aW9uIGkoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZbImJ5dGUiLCJpbnQiLCJjaGFyIiwiY29sb3IiLCJmbG9hdCIsImxvbmciLCJkb3VibGUiXS5pbmRleE9mKGUpIT09LTF9dC5wcm90b3R5cGU9ZS5QQ29uc3RhbnRzCnZhciBzPW5ldyB0CnJldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3NbdF09ZVt0XX0pLHMuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oZSx0LG4peyJkZWZpbmVQcm9wZXJ0eSJpbiBPYmplY3Q/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxuKToobi5oYXNPd25Qcm9wZXJ0eSgiZ2V0IikmJmUuX19kZWZpbmVHZXR0ZXJfXyh0LG4uZ2V0KSxuLmhhc093blByb3BlcnR5KCJzZXQiKSYmZS5fX2RlZmluZVNldHRlcl9fKHQsbi5zZXQpKX0scy5leHRlbmRDbGFzc0NoYWluPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bZV0sbj1lLiR1cGNhc3Q7bjtuPW4uJHVwY2FzdClyKG4sZSksdC5wdXNoKG4pLGU9bgpmb3IoO3QubGVuZ3RoPjA7KXQucG9wKCkuJHNlbGY9ZX0scy5leHRlbmRTdGF0aWNNZW1iZXJzPWZ1bmN0aW9uKGUsdCl7cihlLHQpfSxzLmV4dGVuZEludGVyZmFjZU1lbWJlcnM9ZnVuY3Rpb24oZSx0KXtyKGUsdCl9LHMuYWRkTWV0aG9kPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWVbdF0KaWYoaXx8cil7dmFyIHM9bi5sZW5ndGgKaWYoIiRvdmVybG9hZHMiaW4gaSlpLiRvdmVybG9hZHNbc109bgplbHNle3ZhciBvPWZ1bmN0aW9uKCl7dmFyIGU9by4kb3ZlcmxvYWRzW2FyZ3VtZW50cy5sZW5ndGhdfHwoIiRtZXRob2RBcmdzSW5kZXgiaW4gbyYmYXJndW1lbnRzLmxlbmd0aD5vLiRtZXRob2RBcmdzSW5kZXg/by4kb3ZlcmxvYWRzW28uJG1ldGhvZEFyZ3NJbmRleF06bnVsbCl8fG8uJGRlZmF1bHRPdmVybG9hZApyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGE9W10KaSYmKGFbaS5sZW5ndGhdPWkpLGFbc109bixvLiRvdmVybG9hZHM9YSxvLiRkZWZhdWx0T3ZlcmxvYWQ9aXx8bixyJiYoby4kbWV0aG9kQXJnc0luZGV4PXMpLG8ubmFtZT10LGVbdF09b319ZWxzZSBlW3RdPW59LHMuY3JlYXRlSmF2YUFycmF5PWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbCxyPW51bGwKaWYoInN0cmluZyI9PXR5cGVvZiBlJiYoImJvb2xlYW4iPT09ZT9yPSExOmkoZSkmJihyPTApKSwibnVtYmVyIj09dHlwZW9mIHRbMF0pe3ZhciBvPTB8dFswXQppZih0Lmxlbmd0aDw9MSl7bj1bXSxuLmxlbmd0aD1vCmZvcih2YXIgYT0wO2E8bzsrK2EpblthXT1yfWVsc2V7bj1bXQpmb3IodmFyIGw9dC5zbGljZSgxKSxoPTA7aDxvOysraCluLnB1c2gocy5jcmVhdGVKYXZhQXJyYXkoZSxsKSl9fXJldHVybiBufSxzLmRlZmluZVByb3BlcnR5KHMsInNjcmVlbldpZHRoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbm5lcldpZHRofX0pLHMuZGVmaW5lUHJvcGVydHkocywic2NyZWVuSGVpZ2h0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodH19KSxzfX0se31dLDc6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQud2luZG93LGk9dC5kb2N1bWVudCxzPXIuWE1MSHR0cFJlcXVlc3Qsbz10Lm5vb3AsYT10LmlzRE9NUHJlc2VudCxoPXQudmVyc2lvbgplLnZlcnNpb249aD9oOiJAREVWLVZFUlNJT05AIixlLmxpYj17fSxlLnJlZ2lzdGVyTGlicmFyeT1mdW5jdGlvbih0LG4pe2UubGliW3RdPW4sbi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpJiZuLmluaXQoZGVmYXVsdFNjb3BlKX0sZS5Ta2V0Y2g9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2hGdW5jdGlvbj1lLHRoaXMub3B0aW9ucz17cGF1c2VPbkJsdXI6ITEsZ2xvYmFsS2V5RXZlbnRzOiExfSx0aGlzLm9uTG9hZD1vLHRoaXMub25TZXR1cD1vLHRoaXMub25QYXVzZT1vLHRoaXMub25Mb29wPW8sdGhpcy5vbkZyYW1lU3RhcnQ9byx0aGlzLm9uRnJhbWVFbmQ9byx0aGlzLm9uRXhpdD1vLHRoaXMucGFyYW1zPXt9LHRoaXMuaW1hZ2VDYWNoZT17cGVuZGluZzowLGltYWdlczp7fSxvcGVyYUNhY2hlOnt9LGFkZDpmdW5jdGlvbihlLHQpe2lmKCF0aGlzLmltYWdlc1tlXSYmKGF8fCh0aGlzLmltYWdlc1tlXT1udWxsKSx0fHwodD1uZXcgSW1hZ2UsdC5vbmxvYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZS5wZW5kaW5nLS19fSh0aGlzKSx0aGlzLnBlbmRpbmcrKyx0LnNyYz1lKSx0aGlzLmltYWdlc1tlXT10LHIub3BlcmEpKXt2YXIgbj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpCm4uYXBwZW5kQ2hpbGQodCksbi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLG4uc3R5bGUub3BhY2l0eT0wLG4uc3R5bGUud2lkdGg9IjFweCIsbi5zdHlsZS5oZWlnaHQ9IjFweCIsdGhpcy5vcGVyYUNhY2hlW2VdfHwoaS5ib2R5LmFwcGVuZENoaWxkKG4pLHRoaXMub3BlcmFDYWNoZVtlXT1uKX19fSx0aGlzLnNvdXJjZUNvZGU9dm9pZCAwLHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmF0dGFjaEZ1bmN0aW9uKXRoaXMuYXR0YWNoRnVuY3Rpb24oZSkKZWxzZXtpZighdGhpcy5zb3VyY2VDb2RlKXRocm93IlVuYWJsZSB0byBhdHRhY2ggc2tldGNoIHRvIHRoZSBwcm9jZXNzaW5nIGluc3RhbmNlIgp2YXIgdD1uZXcgRnVuY3Rpb24oInJldHVybiAoIit0aGlzLnNvdXJjZUNvZGUrIik7IikoKQp0KGUpLHRoaXMuYXR0YWNoRnVuY3Rpb249dH19LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZSx0PSIoKGZ1bmN0aW9uKFNrZXRjaCkge1xuIgp0Kz0idmFyIHNrZXRjaCA9IG5ldyBTa2V0Y2goXG4iK3RoaXMuc291cmNlQ29kZSsiKTtcbiIKZm9yKGUgaW4gdGhpcy5vcHRpb25zKWlmKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIG49dGhpcy5vcHRpb25zW2VdCnQrPSJza2V0Y2gub3B0aW9ucy4iK2UrIiA9ICIrKCJzdHJpbmciPT10eXBlb2Ygbj8nIicrbisnIic6IiIrbikrIjtcbiJ9Zm9yKGUgaW4gdGhpcy5pbWFnZUNhY2hlKXRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPSdza2V0Y2guaW1hZ2VDYWNoZS5hZGQoIicrZSsnIik7XG4nKQpyZXR1cm4gdCs9InJldHVybiBza2V0Y2g7XG59KShQcm9jZXNzaW5nLlNrZXRjaCkpIn19CnZhciB1PWUubG9hZFNrZXRjaEZyb21Tb3VyY2VzPWZ1bmN0aW9uKHQsbixvKXtmdW5jdGlvbiBhKGUsdCl7dmFyIG49bmV3IHMKbi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT09bi5yZWFkeVN0YXRlKXt2YXIgZQoyMDAhPT1uLnN0YXR1cyYmMCE9PW4uc3RhdHVzP2U9IkludmFsaWQgWEhSIHN0YXR1cyAiK24uc3RhdHVzOiIiPT09bi5yZXNwb25zZVRleHQmJihlPSJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IHMmJihuZXcgcykud2l0aENyZWRlbnRpYWxzPT09ITEmJiJmaWxlOiI9PT1yLmxvY2F0aW9uLnByb3RvY29sPyJYTUxIdHRwUmVxdWVzdCBmYWlsdXJlLCBwb3NzaWJseSBkdWUgdG8gYSBzYW1lLW9yaWdpbiBwb2xpY3kgdmlvbGF0aW9uLiBZb3UgY2FuIHRyeSBsb2FkaW5nIHRoaXMgcGFnZSBpbiBhbm90aGVyIGJyb3dzZXIsIG9yIGxvYWQgaXQgZnJvbSBodHRwOi8vbG9jYWxob3N0IHVzaW5nIGEgbG9jYWwgd2Vic2VydmVyLiBTZWUgdGhlIFByb2Nlc3NpbmcuanMgUkVBRE1FIGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhpcyBwcm9ibGVtIGFuZCBzb2x1dGlvbnMuIjoiRmlsZSBpcyBlbXB0eS4iKSx0KG4ucmVzcG9uc2VUZXh0LGUpfX0sbi5vcGVuKCJHRVQiLGUsITApLG4ub3ZlcnJpZGVNaW1lVHlwZSYmbi5vdmVycmlkZU1pbWVUeXBlKCJhcHBsaWNhdGlvbi9qc29uIiksbi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsIkZyaSwgMDEgSmFuIDE5NjAgMDA6MDA6MDAgR01UIiksbi5zZW5kKG51bGwpfWZ1bmN0aW9uIGwobixyKXtmdW5jdGlvbiBzKGkscyl7aWYoaFtuXT1pLCsrZixzJiZ1LnB1c2gocisiID09PiAiK3MpLGY9PT1jKXtpZigwIT09dS5sZW5ndGgpdGhyb3ciUHJvY2Vzc2luZy5qczogVW5hYmxlIHRvIGxvYWQgcGpzIHNrZXRjaCBmaWxlczogIit1LmpvaW4oIlxuIikKdmFyIGE9bmV3IGUodCxoLmpvaW4oIlxuIikpCm8mJm8oYSl9fWlmKCIjIj09PXIuY2hhckF0KDApKXt2YXIgbD1pLmdldEVsZW1lbnRCeUlkKHIuc3Vic3RyaW5nKDEpKQpyZXR1cm4gdm9pZChsP3MobC50ZXh0fHxsLnRleHRDb250ZW50KTpzKCIiLCJVbmFibGUgdG8gbG9hZCBwanMgc2tldGNoOiBlbGVtZW50IHdpdGggaWQgJyIrci5zdWJzdHJpbmcoMSkrIicgd2FzIG5vdCBmb3VuZCIpKX1hKHIscyl9Zm9yKHZhciBoPVtdLHU9W10sYz1uLmxlbmd0aCxmPTAscD0wO3A8YzsrK3ApbChwLG5bcF0pfSxjPWZ1bmN0aW9uKCl7aS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixjLCExKQpmb3IodmFyIHQ7ZS5pbnN0YW5jZXMubGVuZ3RoPjA7KWZvcih0PWUuaW5zdGFuY2VzLmxlbmd0aC0xO3Q+PTA7dC0tKWUuaW5zdGFuY2VzW3RdJiZlLmluc3RhbmNlc1t0XS5leGl0KCkKdmFyIHIscz1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjYW52YXMiKQpmb3IodD0wLGw9cy5sZW5ndGg7dDxsO3QrKyl7dmFyIG89c1t0XS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvY2Vzc2luZy1zb3VyY2VzIikKaWYobnVsbD09PW8mJihvPXNbdF0uZ2V0QXR0cmlidXRlKCJkYXRhLXNyYyIpLG51bGw9PT1vJiYobz1zW3RdLmdldEF0dHJpYnV0ZSgiZGF0YXNyYyIpKSksbyl7cj1vLnNwbGl0KC9ccysvZykKZm9yKHZhciBhPTA7YTxyLmxlbmd0aDspclthXT9hKys6ci5zcGxpY2UoYSwxKQp1KHNbdF0scil9fXZhciBoLGYscCxtLGc9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZD1bXQpmb3IoaD1nLmxlbmd0aC0xO2g+PTA7aC0tKWQucHVzaChnW2hdKQpmb3IoaD0wLGY9ZC5sZW5ndGg7aDxmO2grKyl7dmFyIHY9ZFtoXQppZih2LmdldEF0dHJpYnV0ZSl7dmFyIHk9di5nZXRBdHRyaWJ1dGUoInR5cGUiKQppZih5JiYoInRleHQvcHJvY2Vzc2luZyI9PT15LnRvTG93ZXJDYXNlKCl8fCJhcHBsaWNhdGlvbi9wcm9jZXNzaW5nIj09PXkudG9Mb3dlckNhc2UoKSkpe3ZhciB4PXYuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2Nlc3NpbmctdGFyZ2V0IikKaWYocz1uLHgpcz1pLmdldEVsZW1lbnRCeUlkKHgpCmVsc2V7Zm9yKHZhciBBPXYubmV4dFNpYmxpbmc7QSYmMSE9PUEubm9kZVR5cGU7KUE9QS5uZXh0U2libGluZwpBJiYiY2FudmFzIj09PUEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKHM9QSl9aWYocyl7aWYodi5nZXRBdHRyaWJ1dGUoInNyYyIpKXtyPXYuZ2V0QXR0cmlidXRlKCJzcmMiKS5zcGxpdCgvXHMrLyksdShzLHIpCmNvbnRpbnVlfXA9di50ZXh0Q29udGVudHx8di50ZXh0LG09bmV3IGUocyxwKX19fX19CnJldHVybiBpLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGMsITEpLGUucmVsb2FkPWMsZS5kaXNhYmxlSW5pdD1mdW5jdGlvbigpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYywhMSl9LGV9fSx7fV0sODpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT09ZXx8bnVsbD09PXQ/bnVsbD09PWUmJm51bGw9PT10OiJzdHJpbmciPT10eXBlb2YgZT9lPT09dDoib2JqZWN0IiE9dHlwZW9mIGU/ZT09PXQ6ZS5lcXVhbHMgaW5zdGFuY2VvZiBGdW5jdGlvbj9lLmVxdWFscyh0KTplPT09dH19LHt9XSw5OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtmb3IodmFyIG49MCxyPTA7cjxlLmxlbmd0aDsrK3Ipbj0zMSpuK2UuY2hhckNvZGVBdChyKSY0Mjk0OTY3Mjk1CnJldHVybiBufXJldHVybiJvYmplY3QiIT10eXBlb2YgZT80Mjk0OTY3Mjk1JmU6ZS5oYXNoQ29kZSBpbnN0YW5jZW9mIEZ1bmN0aW9uP2UuaGFzaENvZGUoKTooZS4kaWQ9PT10JiYoZS4kaWQ9TWF0aC5mbG9vcig2NTUzNipNYXRoLnJhbmRvbSgpKS0zMjc2ODw8MTZ8TWF0aC5mbG9vcig2NTUzNipNYXRoLnJhbmRvbSgpKSksZS4kaWQpfX0se31dLDEwOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7dmFyIHQ9LTEKdGhpcy5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHQrMTxlLmxlbmd0aH0sdGhpcy5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIGVbKyt0XX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oKXtlLnNwbGljZSh0LS0sMSl9fWZ1bmN0aW9uIG4oZSl7dmFyIGk9W10KZSYmZS50b0FycmF5JiYoaT1lLnRvQXJyYXkoKSksdGhpcy5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGlbZV19LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5kZXhPZihlKT4tMX0sdGhpcy5pbmRleE9mPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49aS5sZW5ndGg7dDxuOysrdClpZihyKGUsaVt0XSkpcmV0dXJuIHQKcmV0dXJuLTF9LHRoaXMubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYocihlLGlbdF0pKXJldHVybiB0CnJldHVybi0xfSx0aGlzLmFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWkucHVzaChhcmd1bWVudHNbMF0pCmVsc2V7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3ciUGxlYXNlIHVzZSB0aGUgcHJvcGVyIG51bWJlciBvZiBwYXJhbWV0ZXJzLiIKdmFyIGU9YXJndW1lbnRzWzBdCmlmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyB0eXBlb2YgZSsiIGlzIG5vdCBhIG51bWJlciIKaWYoIShlPj0wJiZlPD1pLmxlbmd0aCkpdGhyb3cgZSsiIGlzIG5vdCBhIHZhbGlkIGluZGV4IgppLnNwbGljZShlLDAsYXJndW1lbnRzWzFdKX19LHRoaXMuYWRkQWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG4KaWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZihlPDB8fGU+aS5sZW5ndGgpdGhyb3ciSW5kZXggb3V0IG9mIGJvdW5kcyBmb3IgYWRkQWxsOiAiK2UrIiBncmVhdGVyIG9yIGVxdWFsIHRoYW4gIitpLmxlbmd0aApmb3Iobj1uZXcgT2JqZWN0SXRlcmF0b3IodCk7bi5oYXNOZXh0KCk7KWkuc3BsaWNlKGUrKywwLG4ubmV4dCgpKX1lbHNlIGZvcihuPW5ldyBPYmplY3RJdGVyYXRvcihlKTtuLmhhc05leHQoKTspaS5wdXNoKG4ubmV4dCgpKX0sdGhpcy5zZXQ9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyJQbGVhc2UgdXNlIHRoZSBwcm9wZXIgbnVtYmVyIG9mIHBhcmFtZXRlcnMuIgp2YXIgZT1hcmd1bWVudHNbMF0KaWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IHR5cGVvZiBlKyIgaXMgbm90IGEgbnVtYmVyIgppZighKGU+PTAmJmU8aS5sZW5ndGgpKXRocm93IGUrIiBpcyBub3QgYSB2YWxpZCBpbmRleC4iCmkuc3BsaWNlKGUsMSxhcmd1bWVudHNbMV0pfSx0aGlzLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gaS5sZW5ndGh9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oKXtpLmxlbmd0aD0wfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/aS5zcGxpY2UoZSwxKVswXTooZT10aGlzLmluZGV4T2YoZSksZT4tMSYmKGkuc3BsaWNlKGUsMSksITApKX0sdGhpcy5yZW1vdmVBbGw9ZnVuY3Rpb24oZSl7dmFyIHQscixpLHM9bmV3IG4KZm9yKHMuYWRkQWxsKHRoaXMpLHRoaXMuY2xlYXIoKSx0PTAscj0wO3Q8cy5zaXplKCk7dCsrKWk9cy5nZXQodCksZS5jb250YWlucyhpKXx8dGhpcy5hZGQocisrLGkpCnJldHVybiB0aGlzLnNpemUoKTxzLnNpemUoKX0sdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIWkubGVuZ3RofSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMpfSx0aGlzLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gaS5zbGljZSgwKX0sdGhpcy5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgdChpKX19dmFyIHI9KGUudmlydEhhc2hDb2RlLGUudmlydEVxdWFscykKcmV0dXJuIG59fSx7fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihyKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHImJjE9PT1yLmxlbmd0aD90aGlzLmNvZGU9ci5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2Ygcj90aGlzLmNvZGU9cjpyIGluc3RhbmNlb2Ygbj90aGlzLmNvZGU9cjp0aGlzLmNvZGU9TmFOLGVbdGhpcy5jb2RlXT09PXQ/ZVt0aGlzLmNvZGVdPXRoaXM6ZVt0aGlzLmNvZGVdfQpyZXR1cm4gbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmNvZGUpfSxuLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29kZX0sbn0oe30pfSx7fV0sMTI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9bihlKSV1Lmxlbmd0aApyZXR1cm4gdDwwP3UubGVuZ3RoK3Q6dH1mdW5jdGlvbiBpKCl7aWYoIShjPD1oKnUubGVuZ3RoKSl7Zm9yKHZhciB0PVtdLG49MDtuPHUubGVuZ3RoOysrbil2b2lkIDAhPT11W25dJiYodD10LmNvbmNhdCh1W25dKSkKdmFyIHI9Mip1Lmxlbmd0aAp1PVtdLHUubGVuZ3RoPXIKZm9yKHZhciBpPTA7aTx0Lmxlbmd0aDsrK2kpe3ZhciBzPWUodFtpXS5rZXkpLG89dVtzXQp2b2lkIDA9PT1vJiYodVtzXT1vPVtdKSxvLnB1c2godFtpXSl9fX1mdW5jdGlvbiBzKGUsdCl7ZnVuY3Rpb24gbigpe2Zvcig7IW87KWlmKCsrcyxpPj11Lmxlbmd0aClvPSEwCmVsc2V7aWYoISh2b2lkIDA9PT11W2ldfHxzPj11W2ldLmxlbmd0aCkpcmV0dXJuCnM9LTEsKytpfX12YXIgcixpPTAscz0tMSxvPSExCnRoaXMuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiFvfSx0aGlzLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcj1lKHVbaV1bc10pLG4oKSxyfSx0aGlzLnJlbW92ZT1mdW5jdGlvbigpe3ZvaWQgMCE9PXImJih0KHIpLC0tcyxuKCkpfSxuKCl9ZnVuY3Rpb24gbyhlLHQsbil7dGhpcy5jbGVhcj1mdW5jdGlvbigpe2YuY2xlYXIoKX0sdGhpcy5jb250YWlucz1mdW5jdGlvbihlKXtyZXR1cm4gdChlKX0sdGhpcy5jb250YWluc0FsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOylpZighdGhpcy5jb250YWlucyh0Lm5leHQoKSkpcmV0dXJuITEKcmV0dXJuITB9LHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiBmLmlzRW1wdHkoKX0sdGhpcy5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcyhlLG4pfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMuY29udGFpbnMoZSkmJihuKGUpLCEwKX0sdGhpcy5yZW1vdmVBbGw9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaXRlcmF0b3IoKSxyPSExO3QuaGFzTmV4dCgpOyl7dmFyIGk9dC5uZXh0KCkKdGhpcy5jb250YWlucyhpKSYmKG4oaSkscj0hMCl9cmV0dXJuITB9LHRoaXMucmV0YWluQWxsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLml0ZXJhdG9yKCkscj1bXTt0Lmhhc05leHQoKTspe3ZhciBpPXQubmV4dCgpCmUuY29udGFpbnMoaSl8fHIucHVzaChpKX1mb3IodmFyIHM9MDtzPHIubGVuZ3RoOysrcyluKHJbc10pCnJldHVybiByLmxlbmd0aD4wfSx0aGlzLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gZi5zaXplKCl9LHRoaXMudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PXRoaXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspZS5wdXNoKHQubmV4dCgpKQpyZXR1cm4gZX19ZnVuY3Rpb24gYShlKXt0aGlzLl9pc0luPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZiYmdm9pZCAwPT09ZS5yZW1vdmVkfSx0aGlzLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gcihlLmtleSx0LmdldEtleSgpKX0sdGhpcy5nZXRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5rZXl9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gZS52YWx1ZX0sdGhpcy5oYXNoQ29kZT1mdW5jdGlvbih0KXtyZXR1cm4gbihlLmtleSl9LHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24odCl7dmFyIG49ZS52YWx1ZQpyZXR1cm4gZS52YWx1ZT10LG59fWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpcmV0dXJuIGFyZ3VtZW50c1swXS5jbG9uZSgpCnZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06MTYsaD1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOi43NSx1PVtdCnUubGVuZ3RoPWwKdmFyIGM9MCxmPXRoaXMKdGhpcy5jbGVhcj1mdW5jdGlvbigpe2M9MCx1PVtdLHUubGVuZ3RoPWx9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdApyZXR1cm4gZS5wdXRBbGwodGhpcyksZX0sdGhpcy5jb250YWluc0tleT1mdW5jdGlvbih0KXt2YXIgbj1lKHQpLGk9dVtuXQppZih2b2lkIDA9PT1pKXJldHVybiExCmZvcih2YXIgcz0wO3M8aS5sZW5ndGg7KytzKWlmKHIoaVtzXS5rZXksdCkpcmV0dXJuITAKcmV0dXJuITF9LHRoaXMuY29udGFpbnNWYWx1ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHUubGVuZ3RoOysrdCl7dmFyIG49dVt0XQppZih2b2lkIDAhPT1uKWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7KytpKWlmKHIobltpXS52YWx1ZSxlKSlyZXR1cm4hMH1yZXR1cm4hMX0sdGhpcy5lbnRyeVNldD1mdW5jdGlvbigpe3JldHVybiBuZXcgbyhmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGEoZSl9LGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYSYmZS5faXNJbihmKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGYucmVtb3ZlKGUuZ2V0S2V5KCkpfSl9LHRoaXMuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBuPWUodCksaT11W25dCmlmKHZvaWQgMD09PWkpcmV0dXJuIG51bGwKZm9yKHZhciBzPTA7czxpLmxlbmd0aDsrK3MpaWYocihpW3NdLmtleSx0KSlyZXR1cm4gaVtzXS52YWx1ZQpyZXR1cm4gbnVsbH0sdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1jfSx0aGlzLmtleVNldD1mdW5jdGlvbigpe3JldHVybiBuZXcgbyhmdW5jdGlvbihlKXtyZXR1cm4gZS5rZXl9LGZ1bmN0aW9uKGUpe3JldHVybiBmLmNvbnRhaW5zS2V5KGUpfSxmdW5jdGlvbihlKXtyZXR1cm4gZi5yZW1vdmUoZSl9KX0sdGhpcy52YWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8oZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWV9LGZ1bmN0aW9uKGUpe3JldHVybiBmLmNvbnRhaW5zVmFsdWUoZSl9LGZ1bmN0aW9uKGUpe3JldHVybiBmLnJlbW92ZUJ5VmFsdWUoZSl9KX0sdGhpcy5wdXQ9ZnVuY3Rpb24odCxuKXt2YXIgcz1lKHQpLG89dVtzXQppZih2b2lkIDA9PT1vKXJldHVybisrYyx1W3NdPVt7a2V5OnQsdmFsdWU6bn1dLGkoKSxudWxsCmZvcih2YXIgYT0wO2E8by5sZW5ndGg7KythKWlmKHIob1thXS5rZXksdCkpe3ZhciBsPW9bYV0udmFsdWUKcmV0dXJuIG9bYV0udmFsdWU9bixsfXJldHVybisrYyxvLnB1c2goe2tleTp0LHZhbHVlOm59KSxpKCksbnVsbH0sdGhpcy5wdXRBbGw9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuZW50cnlTZXQoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIG49dC5uZXh0KCkKdGhpcy5wdXQobi5nZXRLZXkoKSxuLmdldFZhbHVlKCkpfX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIG49ZSh0KSxpPXVbbl0KaWYodm9pZCAwPT09aSlyZXR1cm4gbnVsbApmb3IodmFyIHM9MDtzPGkubGVuZ3RoOysrcylpZihyKGlbc10ua2V5LHQpKXstLWMKdmFyIG89aVtzXS52YWx1ZQpyZXR1cm4gaVtzXS5yZW1vdmVkPSEwLGkubGVuZ3RoPjE/aS5zcGxpY2UocywxKTp1W25dPXZvaWQgMCxvfXJldHVybiBudWxsfSx0aGlzLnJlbW92ZUJ5VmFsdWU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkKZm9yKHQgaW4gdSlpZih1Lmhhc093blByb3BlcnR5KHQpKWZvcihuPTAscj11W3RdLmxlbmd0aDtuPHI7bisrKWlmKGk9dVt0XVtuXSxpLnZhbHVlPT09ZSlyZXR1cm4gdVt0XS5zcGxpY2UobiwxKSwhMApyZXR1cm4hMX0sdGhpcy5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIGN9fXZhciBuPWUudmlydEhhc2hDb2RlLHI9ZS52aXJ0RXF1YWxzCnJldHVybiB0fX0se31dLDEzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXt2YXIgdD0yNTAsbj1lLnNpemUvdCxyPWkuY3JlYXRlRWxlbWVudCgiY2FudmFzIikKci53aWR0aD0yKnQsci5oZWlnaHQ9Mip0LHIuc3R5bGUub3BhY2l0eT0wCnZhciBvPWUuZ2V0Q1NTRGVmaW5pdGlvbih0KyJweCIsIm5vcm1hbCIpLGE9ci5nZXRDb250ZXh0KCIyZCIpCmEuZm9udD1vCnZhciBsPSJkYmZsa2h5anFwZyIKci53aWR0aD1hLm1lYXN1cmVUZXh0KGwpLndpZHRoLGEuZm9udD1vCnZhciBoPWkuY3JlYXRlRWxlbWVudCgiZGl2IikKaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGguc3R5bGUub3BhY2l0eT0wLGguc3R5bGUuZm9udEZhbWlseT0nIicrZS5uYW1lKyciJyxoLnN0eWxlLmZvbnRTaXplPXQrInB4IixoLmlubmVySFRNTD1sKyI8YnIvPiIrbCxpLmJvZHkuYXBwZW5kQ2hpbGQoaCkKdmFyIHU9ci53aWR0aCxjPXIuaGVpZ2h0LGY9Yy8yCmEuZmlsbFN0eWxlPSJ3aGl0ZSIsYS5maWxsUmVjdCgwLDAsdSxjKSxhLmZpbGxTdHlsZT0iYmxhY2siLGEuZmlsbFRleHQobCwwLGYpCmZvcih2YXIgcD1hLmdldEltYWdlRGF0YSgwLDAsdSxjKS5kYXRhLG09MCxnPTQqdSxkPXAubGVuZ3RoOysrbTxkJiYyNTU9PT1wW21dOylzKCkKdmFyIHY9TWF0aC5yb3VuZChtL2cpCmZvcihtPWQtMTstLW0+MCYmMjU1PT09cFttXTspcygpCnZhciB5PU1hdGgucm91bmQobS9nKQppZihlLmFzY2VudD1uKihmLXYpLGUuZGVzY2VudD1uKih5LWYpLGkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSl7dmFyIHg9aS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGgsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgiaGVpZ2h0IikKeD1uKngucmVwbGFjZSgicHgiLCIiKSx4Pj0yKmUuc2l6ZSYmKGUubGVhZGluZz1NYXRoLnJvdW5kKHgvMikpfWlmKGkuYm9keS5yZW1vdmVDaGlsZChoKSxlLmNhY2hpbmcpcmV0dXJuIGF9ZnVuY3Rpb24gcihlLHIpe2U9PT10JiYoZT0iIiksdGhpcy5uYW1lPWUscj09PXQmJihyPTApLHRoaXMuc2l6ZT1yLHRoaXMuZ2x5cGg9ITEsdGhpcy5hc2NlbnQ9MCx0aGlzLmRlc2NlbnQ9MCx0aGlzLmxlYWRpbmc9MS4yKnIKdmFyIGk9ZS5pbmRleE9mKCIgSXRhbGljIEJvbGQiKQppIT09LTEmJihlPWUuc3Vic3RyaW5nKDAsaSkpLHRoaXMuc3R5bGU9Im5vcm1hbCIKdmFyIHM9ZS5pbmRleE9mKCIgSXRhbGljIikKcyE9PS0xJiYoZT1lLnN1YnN0cmluZygwLHMpLHRoaXMuc3R5bGU9Iml0YWxpYyIpLHRoaXMud2VpZ2h0PSJub3JtYWwiCnZhciBvPWUuaW5kZXhPZigiIEJvbGQiKQppZihvIT09LTEmJihlPWUuc3Vic3RyaW5nKDAsbyksdGhpcy53ZWlnaHQ9ImJvbGQiKSx0aGlzLmZhbWlseT0ic2Fucy1zZXJpZiIsZSE9PXQpc3dpdGNoKGUpe2Nhc2Uic2Fucy1zZXJpZiI6Y2FzZSJzZXJpZiI6Y2FzZSJtb25vc3BhY2UiOmNhc2UiZmFudGFzeSI6Y2FzZSJjdXJzaXZlIjp0aGlzLmZhbWlseT1lCmJyZWFrCmRlZmF1bHQ6dGhpcy5mYW1pbHk9JyInK2UrJyIsIHNhbnMtc2VyaWYnfXRoaXMuY29udGV4dDJkPW4odGhpcyksdGhpcy5jc3M9dGhpcy5nZXRDU1NEZWZpbml0aW9uKCksdGhpcy5jb250ZXh0MmQmJih0aGlzLmNvbnRleHQyZC5mb250PXRoaXMuY3NzKX12YXIgaT0oZS5Ccm93c2VyLndpbmRvdyxlLkJyb3dzZXIuZG9jdW1lbnQpLHM9ZS5ub29wCnJldHVybiByLnByb3RvdHlwZS5jYWNoaW5nPSEwLHIucHJvdG90eXBlLmdldENTU0RlZmluaXRpb249ZnVuY3Rpb24oZSxuKXtlPT09dCYmKGU9dGhpcy5zaXplKyJweCIpLG49PT10JiYobj10aGlzLmxlYWRpbmcrInB4IikKdmFyIHI9W3RoaXMuc3R5bGUsIm5vcm1hbCIsdGhpcy53ZWlnaHQsZSsiLyIrbix0aGlzLmZhbWlseV0KcmV0dXJuIHIuam9pbigiICIpfSxyLnByb3RvdHlwZS5tZWFzdXJlVGV4dFdpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbnRleHQyZC5tZWFzdXJlVGV4dChlKS53aWR0aH0sci5wcm90b3R5cGUubWVhc3VyZVRleHRXaWR0aEZhbGxiYWNrPWZ1bmN0aW9uKGUpe3ZhciB0PWkuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksbj10LmdldENvbnRleHQoIjJkIikKcmV0dXJuIG4uZm9udD10aGlzLmNzcyxuLm1lYXN1cmVUZXh0KGUpLndpZHRofSxyLlBGb250Q2FjaGU9e2xlbmd0aDowfSxyLmdldD1mdW5jdGlvbihlLHQpe3Q9KDEwKnQrLjV8MCkvMTAKdmFyIG49ci5QRm9udENhY2hlLGk9ZSsiLyIrdAppZighbltpXSl7aWYobltpXT1uZXcgcihlLHQpLG4ubGVuZ3RoKyssNTA9PT1uLmxlbmd0aCl7ci5wcm90b3R5cGUubWVhc3VyZVRleHRXaWR0aD1yLnByb3RvdHlwZS5tZWFzdXJlVGV4dFdpZHRoRmFsbGJhY2ssci5wcm90b3R5cGUuY2FjaGluZz0hMQp2YXIgcwpmb3IocyBpbiBuKSJsZW5ndGgiIT09cyYmKG5bc10uY29udGV4dDJkPW51bGwpCnJldHVybiBuZXcgcihlLHQpfWlmKDQwMD09PW4ubGVuZ3RoKXJldHVybiByLlBGb250Q2FjaGU9e30sci5nZXQ9ci5nZXRGYWxsYmFjayxuZXcgcihlLHQpfXJldHVybiBuW2ldfSxyLmdldEZhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyByKGUsdCl9LHIubGlzdD1mdW5jdGlvbigpe3JldHVyblsic2Fucy1zZXJpZiIsInNlcmlmIiwibW9ub3NwYWNlIiwiZmFudGFzeSIsImN1cnNpdmUiXX0sci5wcmVsb2FkaW5nPXt0ZW1wbGF0ZTp7fSxpbml0aWFsaXplZDohMSxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXt2YXIgZT0iI0UzS0FJMndBZ1QxTXZNZzdFbzNWbU50WVg3QUJpM0N4bmJIbG03QWJ3M2thR1ZoWjdBQ3MzT0dob1pXRTdBNTNDUm9iWFI0N0FZM0FHYkc5allRN0cwM0JtMWhlSDdBQkMzQ0J1WVcxbDdBZTNBZ2NHOXpkN0FJM0FFI0IzQVEya2dUWTE4UFBQVUFDd0FnM0FMU1JvbzMjeWxkMHhnMzJRQUI3NyNFNzc3NzczQiNFM0MjSSNRNzc3NzNFI1E3Nzc3Nzc3NzcyQ01BSXc3QUI3NzczMkIjTSNRM3dBQiNnM0IjRSNFMkJCLy84MkJCLy8vL3cjQjcjZ0FFZzNFNzd4MkIzMkIjRSNRI01UY0JBUTMyZ0FlI00jUVFKI0UzMk0jUVFKI0kjZzMyUTc3IyIsdD1mdW5jdGlvbihlKXtyZXR1cm4iQUFBQUFBQUEiLnN1YnN0cih+fmU/Ny1lOjYpfQpyZXR1cm4gZS5yZXBsYWNlKC9bIzIzN10vZyx0KX0sdD1pLmNyZWF0ZUVsZW1lbnQoInN0eWxlIikKdC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpLHQuaW5uZXJIVE1MPSdAZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICJQanNFbXB0eUZvbnQiO1xuICBzcmM6IHVybChcJ2RhdGE6YXBwbGljYXRpb24veC1mb250LXR0ZjtiYXNlNjQsJytlKCkrIicpXG4gICAgICAgZm9ybWF0KCd0cnVldHlwZScpO1xufSIsaS5oZWFkLmFwcGVuZENoaWxkKHQpCnZhciBuPWkuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uc3R5bGUuY3NzVGV4dD0ncG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDAwOyBsZWZ0OiAwOyBvcGFjaXR5OiAwOyBmb250LWZhbWlseTogIlBqc0VtcHR5Rm9udCIsIGZhbnRhc3k7JyxuLmlubmVySFRNTD0iQUFBQUFBQUEiLGkuYm9keS5hcHBlbmRDaGlsZChuKSx0aGlzLnRlbXBsYXRlPW4sdGhpcy5pbml0aWFsaXplZD0hMH0sZ2V0RWxlbWVudFdpZHRoOmZ1bmN0aW9uKGUpe3JldHVybiBpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZSwiIikuZ2V0UHJvcGVydHlWYWx1ZSgid2lkdGgiKX0sdGltZUF0dGVtcHRlZDowLHBlbmRpbmc6ZnVuY3Rpb24oZSl7dGhpcy5pbml0aWFsaXplZHx8dGhpcy5pbml0aWFsaXplKCkKZm9yKHZhciB0LG4scj10aGlzLmdldEVsZW1lbnRXaWR0aCh0aGlzLnRlbXBsYXRlKSxzPTA7czx0aGlzLmZvbnRMaXN0Lmxlbmd0aDtzKyspe2lmKHQ9dGhpcy5mb250TGlzdFtzXSxuPXRoaXMuZ2V0RWxlbWVudFdpZHRoKHQpLHRoaXMudGltZUF0dGVtcHRlZDw0ZTMmJm49PT1yKXJldHVybiB0aGlzLnRpbWVBdHRlbXB0ZWQrPWUsITAKaS5ib2R5LnJlbW92ZUNoaWxkKHQpLHRoaXMuZm9udExpc3Quc3BsaWNlKHMtLSwxKSx0aGlzLnRpbWVBdHRlbXB0ZWQ9MH1yZXR1cm4gMCE9PXRoaXMuZm9udExpc3QubGVuZ3RofSxmb250TGlzdDpbXSxhZGRlZExpc3Q6e30sYWRkOmZ1bmN0aW9uKGUpe3RoaXMuaW5pdGlhbGl6ZWR8fHRoaXMuaW5pdGlhbGl6ZSgpCnZhciB0PSJvYmplY3QiPT10eXBlb2YgZT9lLmZvbnRGYWNlOmUsbj0ib2JqZWN0Ij09dHlwZW9mIGU/ZS51cmw6ZQppZighdGhpcy5hZGRlZExpc3RbdF0pe3ZhciByPWkuY3JlYXRlRWxlbWVudCgic3R5bGUiKQpyLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvY3NzIiksci5pbm5lckhUTUw9IkBmb250LWZhY2V7XG4gIGZvbnQtZmFtaWx5OiAnIit0KyInO1xuICBzcmM6ICB1cmwoJyIrbisiJyk7XG59XG4iLGkuaGVhZC5hcHBlbmRDaGlsZChyKSx0aGlzLmFkZGVkTGlzdFt0XT0hMAp2YXIgcz1pLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpzLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBvcGFjaXR5OiAwOyIscy5zdHlsZS5mb250RmFtaWx5PSciJyt0KyciLCAiUGpzRW1wdHlGb250IiwgZmFudGFzeScscy5pbm5lckhUTUw9IkFBQUFBQUFBIixpLmJvZHkuYXBwZW5kQ2hpbGQocyksdGhpcy5mb250TGlzdC5wdXNoKHMpfX19LHJ9fSx7fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnAscj1mdW5jdGlvbigpezA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMucmVzZXQoKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP3RoaXMuc2V0KGFyZ3VtZW50c1swXS5hcnJheSgpKTo2PT09YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5zZXQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0pfQpyZXR1cm4gci5wcm90b3R5cGU9e3NldDpmdW5jdGlvbigpe2lmKDY9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHMKdGhpcy5zZXQoW2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdXSl9ZWxzZSAxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP3RoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLmFycmF5KCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJih0aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5zbGljZSgpKX0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9bmV3IHIKcmV0dXJuIGUuc2V0KHRoaXMuZWxlbWVudHMpLGV9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zZXQoWzEsMCwwLDAsMSwwXSl9LGFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMuc2xpY2UoKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5lbGVtZW50c1syXT1lKnRoaXMuZWxlbWVudHNbMF0rdCp0aGlzLmVsZW1lbnRzWzFdK3RoaXMuZWxlbWVudHNbMl0sdGhpcy5lbGVtZW50c1s1XT1lKnRoaXMuZWxlbWVudHNbM10rdCp0aGlzLmVsZW1lbnRzWzRdK3RoaXMuZWxlbWVudHNbNV19LGludlRyYW5zbGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMudHJhbnNsYXRlKC1lLC10KX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7fSxtdWx0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scgpyZXR1cm4gZSBpbnN0YW5jZW9mIFBWZWN0b3I/KG49ZS54LHI9ZS55LHR8fCh0PW5ldyBQVmVjdG9yKSk6ZSBpbnN0YW5jZW9mIEFycmF5JiYobj1lWzBdLHI9ZVsxXSx0fHwodD1bXSkpLHQgaW5zdGFuY2VvZiBBcnJheT8odFswXT10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0sdFsxXT10aGlzLmVsZW1lbnRzWzNdKm4rdGhpcy5lbGVtZW50c1s0XSpyK3RoaXMuZWxlbWVudHNbNV0pOnQgaW5zdGFuY2VvZiBQVmVjdG9yJiYodC54PXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSx0Lnk9dGhpcy5lbGVtZW50c1szXSpuK3RoaXMuZWxlbWVudHNbNF0qcit0aGlzLmVsZW1lbnRzWzVdLHQuej0wKSx0fSxtdWx0WDpmdW5jdGlvbihlLHQpe3JldHVybiBlKnRoaXMuZWxlbWVudHNbMF0rdCp0aGlzLmVsZW1lbnRzWzFdK3RoaXMuZWxlbWVudHNbMl19LG11bHRZOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqdGhpcy5lbGVtZW50c1szXSt0KnRoaXMuZWxlbWVudHNbNF0rdGhpcy5lbGVtZW50c1s1XX0sc2tld1g6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSxlLDAsMCl9LHNrZXdZOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsMCxlLDApfSxzaGVhclg6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSxNYXRoLnRhbihlKSwwLDApfSxzaGVhclk6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSwwLE1hdGgudGFuKGUpLDApfSxkZXRlcm1pbmFudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbNF0tdGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzNdfSxpbnZlcnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRldGVybWluYW50KCkKaWYoTWF0aC5hYnMoZSk+UENvbnN0YW50cy5NSU5fSU5UKXt2YXIgdD10aGlzLmVsZW1lbnRzWzBdLG49dGhpcy5lbGVtZW50c1sxXSxyPXRoaXMuZWxlbWVudHNbMl0saT10aGlzLmVsZW1lbnRzWzNdLHM9dGhpcy5lbGVtZW50c1s0XSxvPXRoaXMuZWxlbWVudHNbNV0KcmV0dXJuIHRoaXMuZWxlbWVudHNbMF09cy9lLHRoaXMuZWxlbWVudHNbM109LWkvZSx0aGlzLmVsZW1lbnRzWzFdPS1uL2UsdGhpcy5lbGVtZW50c1s0XT10L2UsdGhpcy5lbGVtZW50c1syXT0obipvLXMqcikvZSx0aGlzLmVsZW1lbnRzWzVdPShpKnItdCpvKS9lLCEwfXJldHVybiExfSxzY2FsZTpmdW5jdGlvbihlLG4pe2UmJm49PT10JiYobj1lKSxlJiZuJiYodGhpcy5lbGVtZW50c1swXSo9ZSx0aGlzLmVsZW1lbnRzWzFdKj1uLHRoaXMuZWxlbWVudHNbM10qPWUsdGhpcy5lbGVtZW50c1s0XSo9bil9LGludlNjYWxlOmZ1bmN0aW9uKGUsdCl7ZSYmIXQmJih0PWUpLHRoaXMuc2NhbGUoMS9lLDEvdCl9LGFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQpmb3IodmFyIHQ9WzAsMCx0aGlzLmVsZW1lbnRzWzJdLDAsMCx0aGlzLmVsZW1lbnRzWzVdXSxuPTAsaT0wO2k8MjtpKyspZm9yKHZhciBzPTA7czwzO3MrKyxuKyspdFtuXSs9dGhpcy5lbGVtZW50c1szKmkrMF0qZVtzKzBdK3RoaXMuZWxlbWVudHNbMyppKzFdKmVbcyszXQp0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0scHJlQXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6Nj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCnZhciB0PVswLDAsZVsyXSwwLDAsZVs1XV0KdFsyXT1lWzJdK3RoaXMuZWxlbWVudHNbMl0qZVswXSt0aGlzLmVsZW1lbnRzWzVdKmVbMV0sdFs1XT1lWzVdK3RoaXMuZWxlbWVudHNbMl0qZVszXSt0aGlzLmVsZW1lbnRzWzVdKmVbNF0sdFswXT10aGlzLmVsZW1lbnRzWzBdKmVbMF0rdGhpcy5lbGVtZW50c1szXSplWzFdLHRbM109dGhpcy5lbGVtZW50c1swXSplWzNdK3RoaXMuZWxlbWVudHNbM10qZVs0XSx0WzFdPXRoaXMuZWxlbWVudHNbMV0qZVswXSt0aGlzLmVsZW1lbnRzWzRdKmVbMV0sdFs0XT10aGlzLmVsZW1lbnRzWzFdKmVbM10rdGhpcy5lbGVtZW50c1s0XSplWzRdLHRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxyb3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKSxyPXRoaXMuZWxlbWVudHNbMF0saT10aGlzLmVsZW1lbnRzWzFdCnRoaXMuZWxlbWVudHNbMF09dCpyK24qaSx0aGlzLmVsZW1lbnRzWzFdPS1uKnIrdCppLHI9dGhpcy5lbGVtZW50c1szXSxpPXRoaXMuZWxlbWVudHNbNF0sdGhpcy5lbGVtZW50c1szXT10KnIrbippLHRoaXMuZWxlbWVudHNbNF09LW4qcit0Kml9LHJvdGF0ZVo6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGUoZSl9LGludlJvdGF0ZVo6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGVaKGUtTWF0aC5QSSl9LHByaW50OmZ1bmN0aW9uKCl7dmFyIGU9cHJpbnRNYXRyaXhIZWxwZXIodGhpcy5lbGVtZW50cyksdD0iIituLm5mcyh0aGlzLmVsZW1lbnRzWzBdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMV0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1syXSxlLDQpKyJcbiIrbi5uZnModGhpcy5lbGVtZW50c1szXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzRdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbNV0sZSw0KSsiXG5cbiIKbi5wcmludGxuKHQpfX0scn19LHt9XSwxNTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWUucCxyPWZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfQpyZXR1cm4gci5wcm90b3R5cGU9e3NldDpmdW5jdGlvbigpezE2PT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj90aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5hcnJheSgpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYodGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uc2xpY2UoKSl9LGdldDpmdW5jdGlvbigpe3ZhciBlPW5ldyByCnJldHVybiBlLnNldCh0aGlzLmVsZW1lbnRzKSxlfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdfSxhcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKCl9LHRyYW5zbGF0ZTpmdW5jdGlvbihlLG4scil7cj09PXQmJihyPTApLHRoaXMuZWxlbWVudHNbM10rPWUqdGhpcy5lbGVtZW50c1swXStuKnRoaXMuZWxlbWVudHNbMV0rcip0aGlzLmVsZW1lbnRzWzJdLHRoaXMuZWxlbWVudHNbN10rPWUqdGhpcy5lbGVtZW50c1s0XStuKnRoaXMuZWxlbWVudHNbNV0rcip0aGlzLmVsZW1lbnRzWzZdLHRoaXMuZWxlbWVudHNbMTFdKz1lKnRoaXMuZWxlbWVudHNbOF0rbip0aGlzLmVsZW1lbnRzWzldK3IqdGhpcy5lbGVtZW50c1sxMF0sdGhpcy5lbGVtZW50c1sxNV0rPWUqdGhpcy5lbGVtZW50c1sxMl0rbip0aGlzLmVsZW1lbnRzWzEzXStyKnRoaXMuZWxlbWVudHNbMTRdfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnRzWzRdCnRoaXMuZWxlbWVudHNbNF09dGhpcy5lbGVtZW50c1sxXSx0aGlzLmVsZW1lbnRzWzFdPWUsZT10aGlzLmVsZW1lbnRzWzhdLHRoaXMuZWxlbWVudHNbOF09dGhpcy5lbGVtZW50c1syXSx0aGlzLmVsZW1lbnRzWzJdPWUsZT10aGlzLmVsZW1lbnRzWzZdLHRoaXMuZWxlbWVudHNbNl09dGhpcy5lbGVtZW50c1s5XSx0aGlzLmVsZW1lbnRzWzldPWUsZT10aGlzLmVsZW1lbnRzWzNdLHRoaXMuZWxlbWVudHNbM109dGhpcy5lbGVtZW50c1sxMl0sdGhpcy5lbGVtZW50c1sxMl09ZSxlPXRoaXMuZWxlbWVudHNbN10sdGhpcy5lbGVtZW50c1s3XT10aGlzLmVsZW1lbnRzWzEzXSx0aGlzLmVsZW1lbnRzWzEzXT1lLGU9dGhpcy5lbGVtZW50c1sxMV0sdGhpcy5lbGVtZW50c1sxMV09dGhpcy5lbGVtZW50c1sxNF0sdGhpcy5lbGVtZW50c1sxNF09ZX0sbXVsdDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzCnJldHVybiBlIGluc3RhbmNlb2YgUFZlY3Rvcj8obj1lLngscj1lLnksaT1lLnoscz0xLHR8fCh0PW5ldyBQVmVjdG9yKSk6ZSBpbnN0YW5jZW9mIEFycmF5JiYobj1lWzBdLHI9ZVsxXSxpPWVbMl0scz1lWzNdfHwxLCghdHx8MyE9PXQubGVuZ3RoJiY0IT09dC5sZW5ndGgpJiYodD1bMCwwLDBdKSksdCBpbnN0YW5jZW9mIEFycmF5JiYoMz09PXQubGVuZ3RoPyh0WzBdPXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSppK3RoaXMuZWxlbWVudHNbM10sdFsxXT10aGlzLmVsZW1lbnRzWzRdKm4rdGhpcy5lbGVtZW50c1s1XSpyK3RoaXMuZWxlbWVudHNbNl0qaSt0aGlzLmVsZW1lbnRzWzddLHRbMl09dGhpcy5lbGVtZW50c1s4XSpuK3RoaXMuZWxlbWVudHNbOV0qcit0aGlzLmVsZW1lbnRzWzEwXSppK3RoaXMuZWxlbWVudHNbMTFdKTo0PT09dC5sZW5ndGgmJih0WzBdPXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSppK3RoaXMuZWxlbWVudHNbM10qcyx0WzFdPXRoaXMuZWxlbWVudHNbNF0qbit0aGlzLmVsZW1lbnRzWzVdKnIrdGhpcy5lbGVtZW50c1s2XSppK3RoaXMuZWxlbWVudHNbN10qcyx0WzJdPXRoaXMuZWxlbWVudHNbOF0qbit0aGlzLmVsZW1lbnRzWzldKnIrdGhpcy5lbGVtZW50c1sxMF0qaSt0aGlzLmVsZW1lbnRzWzExXSpzLHRbM109dGhpcy5lbGVtZW50c1sxMl0qbit0aGlzLmVsZW1lbnRzWzEzXSpyK3RoaXMuZWxlbWVudHNbMTRdKmkrdGhpcy5lbGVtZW50c1sxNV0qcykpLHQgaW5zdGFuY2VvZiBQVmVjdG9yJiYodC54PXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSppK3RoaXMuZWxlbWVudHNbM10sdC55PXRoaXMuZWxlbWVudHNbNF0qbit0aGlzLmVsZW1lbnRzWzVdKnIrdGhpcy5lbGVtZW50c1s2XSppK3RoaXMuZWxlbWVudHNbN10sdC56PXRoaXMuZWxlbWVudHNbOF0qbit0aGlzLmVsZW1lbnRzWzldKnIrdGhpcy5lbGVtZW50c1sxMF0qaSt0aGlzLmVsZW1lbnRzWzExXSksdH0scHJlQXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6MTY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQpmb3IodmFyIHQ9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLG49MCxpPTA7aTw0O2krKylmb3IodmFyIHM9MDtzPDQ7cysrLG4rKyl0W25dKz10aGlzLmVsZW1lbnRzW3MrMF0qZVs0KmkrMF0rdGhpcy5lbGVtZW50c1tzKzRdKmVbNCppKzFdK3RoaXMuZWxlbWVudHNbcys4XSplWzQqaSsyXSt0aGlzLmVsZW1lbnRzW3MrMTJdKmVbNCppKzNdCnRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxhcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKToxNj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCmZvcih2YXIgdD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sbj0wLGk9MDtpPDQ7aSsrKWZvcih2YXIgcz0wO3M8NDtzKyssbisrKXRbbl0rPXRoaXMuZWxlbWVudHNbNCppKzBdKmVbcyswXSt0aGlzLmVsZW1lbnRzWzQqaSsxXSplW3MrNF0rdGhpcy5lbGVtZW50c1s0KmkrMl0qZVtzKzhdK3RoaXMuZWxlbWVudHNbNCppKzNdKmVbcysxMl0KdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LHJvdGF0ZTpmdW5jdGlvbihlLHQsbixyKXtpZihuKXt2YXIgaT1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLG89MS1pCnRoaXMuYXBwbHkobyp0KnQraSxvKnQqbi1zKnIsbyp0KnIrcypuLDAsbyp0Km4rcypyLG8qbipuK2ksbypuKnItcyp0LDAsbyp0KnItcypuLG8qbipyK3MqdCxvKnIqcitpLDAsMCwwLDAsMSl9ZWxzZSB0aGlzLnJvdGF0ZVooZSl9LGludkFwcGx5OmZ1bmN0aW9uKCl7aW52ZXJzZUNvcHk9PT10JiYoaW52ZXJzZUNvcHk9bmV3IHIpCnZhciBlPWFyZ3VtZW50cwpyZXR1cm4gaW52ZXJzZUNvcHkuc2V0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdLGVbOV0sZVsxMF0sZVsxMV0sZVsxMl0sZVsxM10sZVsxNF0sZVsxNV0pLCEhaW52ZXJzZUNvcHkuaW52ZXJ0KCkmJih0aGlzLnByZUFwcGx5KGludmVyc2VDb3B5KSwhMCl9LHJvdGF0ZVg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKQp0aGlzLmFwcGx5KFsxLDAsMCwwLDAsdCwtbiwwLDAsbix0LDAsMCwwLDAsMV0pfSxyb3RhdGVZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkKdGhpcy5hcHBseShbdCwwLG4sMCwwLDEsMCwwLC1uLDAsdCwwLDAsMCwwLDFdKX0scm90YXRlWjpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpCnRoaXMuYXBwbHkoW3QsLW4sMCwwLG4sdCwwLDAsMCwwLDEsMCwwLDAsMCwxXSl9LHNjYWxlOmZ1bmN0aW9uKGUsbixyKXtlJiZuPT09dCYmcj09PXQ/bj1yPWU6ZSYmbiYmcj09PXQmJihyPTEpLGUmJm4mJnImJih0aGlzLmVsZW1lbnRzWzBdKj1lLHRoaXMuZWxlbWVudHNbMV0qPW4sdGhpcy5lbGVtZW50c1syXSo9cix0aGlzLmVsZW1lbnRzWzRdKj1lLHRoaXMuZWxlbWVudHNbNV0qPW4sdGhpcy5lbGVtZW50c1s2XSo9cix0aGlzLmVsZW1lbnRzWzhdKj1lLHRoaXMuZWxlbWVudHNbOV0qPW4sdGhpcy5lbGVtZW50c1sxMF0qPXIsdGhpcy5lbGVtZW50c1sxMl0qPWUsdGhpcy5lbGVtZW50c1sxM10qPW4sdGhpcy5lbGVtZW50c1sxNF0qPXIpfSxza2V3WDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsdCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxza2V3WTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsMCwwLDAsdCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxzaGVhclg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLHQsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sc2hlYXJZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSwwLDAsMCx0LDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LG11bHRYOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuP3I/dGhpcy5lbGVtZW50c1swXSplK3RoaXMuZWxlbWVudHNbMV0qdCt0aGlzLmVsZW1lbnRzWzJdKm4rdGhpcy5lbGVtZW50c1szXSpyOnRoaXMuZWxlbWVudHNbMF0qZSt0aGlzLmVsZW1lbnRzWzFdKnQrdGhpcy5lbGVtZW50c1syXSpuK3RoaXMuZWxlbWVudHNbM106dGhpcy5lbGVtZW50c1swXSplK3RoaXMuZWxlbWVudHNbMV0qdCt0aGlzLmVsZW1lbnRzWzNdfSxtdWx0WTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbj9yP3RoaXMuZWxlbWVudHNbNF0qZSt0aGlzLmVsZW1lbnRzWzVdKnQrdGhpcy5lbGVtZW50c1s2XSpuK3RoaXMuZWxlbWVudHNbN10qcjp0aGlzLmVsZW1lbnRzWzRdKmUrdGhpcy5lbGVtZW50c1s1XSp0K3RoaXMuZWxlbWVudHNbNl0qbit0aGlzLmVsZW1lbnRzWzddOnRoaXMuZWxlbWVudHNbNF0qZSt0aGlzLmVsZW1lbnRzWzVdKnQrdGhpcy5lbGVtZW50c1s3XX0sbXVsdFo6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHI/dGhpcy5lbGVtZW50c1s4XSplK3RoaXMuZWxlbWVudHNbOV0qdCt0aGlzLmVsZW1lbnRzWzEwXSpuK3RoaXMuZWxlbWVudHNbMTFdKnI6dGhpcy5lbGVtZW50c1s4XSplK3RoaXMuZWxlbWVudHNbOV0qdCt0aGlzLmVsZW1lbnRzWzEwXSpuK3RoaXMuZWxlbWVudHNbMTFdfSxtdWx0VzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gcj90aGlzLmVsZW1lbnRzWzEyXSplK3RoaXMuZWxlbWVudHNbMTNdKnQrdGhpcy5lbGVtZW50c1sxNF0qbit0aGlzLmVsZW1lbnRzWzE1XSpyOnRoaXMuZWxlbWVudHNbMTJdKmUrdGhpcy5lbGVtZW50c1sxM10qdCt0aGlzLmVsZW1lbnRzWzE0XSpuK3RoaXMuZWxlbWVudHNbMTVdfSxpbnZlcnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbNV0tdGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzRdLHQ9dGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzZdLXRoaXMuZWxlbWVudHNbMl0qdGhpcy5lbGVtZW50c1s0XSxuPXRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s3XS10aGlzLmVsZW1lbnRzWzNdKnRoaXMuZWxlbWVudHNbNF0scj10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbNl0tdGhpcy5lbGVtZW50c1syXSp0aGlzLmVsZW1lbnRzWzVdLGk9dGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzddLXRoaXMuZWxlbWVudHNbM10qdGhpcy5lbGVtZW50c1s1XSxzPXRoaXMuZWxlbWVudHNbMl0qdGhpcy5lbGVtZW50c1s3XS10aGlzLmVsZW1lbnRzWzNdKnRoaXMuZWxlbWVudHNbNl0sbz10aGlzLmVsZW1lbnRzWzhdKnRoaXMuZWxlbWVudHNbMTNdLXRoaXMuZWxlbWVudHNbOV0qdGhpcy5lbGVtZW50c1sxMl0sYT10aGlzLmVsZW1lbnRzWzhdKnRoaXMuZWxlbWVudHNbMTRdLXRoaXMuZWxlbWVudHNbMTBdKnRoaXMuZWxlbWVudHNbMTJdLGw9dGhpcy5lbGVtZW50c1s4XSp0aGlzLmVsZW1lbnRzWzE1XS10aGlzLmVsZW1lbnRzWzExXSp0aGlzLmVsZW1lbnRzWzEyXSxoPXRoaXMuZWxlbWVudHNbOV0qdGhpcy5lbGVtZW50c1sxNF0tdGhpcy5lbGVtZW50c1sxMF0qdGhpcy5lbGVtZW50c1sxM10sdT10aGlzLmVsZW1lbnRzWzldKnRoaXMuZWxlbWVudHNbMTVdLXRoaXMuZWxlbWVudHNbMTFdKnRoaXMuZWxlbWVudHNbMTNdLGM9dGhpcy5lbGVtZW50c1sxMF0qdGhpcy5lbGVtZW50c1sxNV0tdGhpcy5lbGVtZW50c1sxMV0qdGhpcy5lbGVtZW50c1sxNF0sZj1lKmMtdCp1K24qaCtyKmwtaSphK3MqbwppZihNYXRoLmFicyhmKTw9MWUtOSlyZXR1cm4hMQp2YXIgcD1bXQpwWzBdPSt0aGlzLmVsZW1lbnRzWzVdKmMtdGhpcy5lbGVtZW50c1s2XSp1K3RoaXMuZWxlbWVudHNbN10qaCxwWzRdPS10aGlzLmVsZW1lbnRzWzRdKmMrdGhpcy5lbGVtZW50c1s2XSpsLXRoaXMuZWxlbWVudHNbN10qYSxwWzhdPSt0aGlzLmVsZW1lbnRzWzRdKnUtdGhpcy5lbGVtZW50c1s1XSpsK3RoaXMuZWxlbWVudHNbN10qbyxwWzEyXT0tdGhpcy5lbGVtZW50c1s0XSpoK3RoaXMuZWxlbWVudHNbNV0qYS10aGlzLmVsZW1lbnRzWzZdKm8scFsxXT0tdGhpcy5lbGVtZW50c1sxXSpjK3RoaXMuZWxlbWVudHNbMl0qdS10aGlzLmVsZW1lbnRzWzNdKmgscFs1XT0rdGhpcy5lbGVtZW50c1swXSpjLXRoaXMuZWxlbWVudHNbMl0qbCt0aGlzLmVsZW1lbnRzWzNdKmEscFs5XT0tdGhpcy5lbGVtZW50c1swXSp1K3RoaXMuZWxlbWVudHNbMV0qbC10aGlzLmVsZW1lbnRzWzNdKm8scFsxM109K3RoaXMuZWxlbWVudHNbMF0qaC10aGlzLmVsZW1lbnRzWzFdKmErdGhpcy5lbGVtZW50c1syXSpvLHBbMl09K3RoaXMuZWxlbWVudHNbMTNdKnMtdGhpcy5lbGVtZW50c1sxNF0qaSt0aGlzLmVsZW1lbnRzWzE1XSpyLHBbNl09LXRoaXMuZWxlbWVudHNbMTJdKnMrdGhpcy5lbGVtZW50c1sxNF0qbi10aGlzLmVsZW1lbnRzWzE1XSp0LHBbMTBdPSt0aGlzLmVsZW1lbnRzWzEyXSppLXRoaXMuZWxlbWVudHNbMTNdKm4rdGhpcy5lbGVtZW50c1sxNV0qZSxwWzE0XT0tdGhpcy5lbGVtZW50c1sxMl0qcit0aGlzLmVsZW1lbnRzWzEzXSp0LXRoaXMuZWxlbWVudHNbMTRdKmUscFszXT0tdGhpcy5lbGVtZW50c1s5XSpzK3RoaXMuZWxlbWVudHNbMTBdKmktdGhpcy5lbGVtZW50c1sxMV0qcixwWzddPSt0aGlzLmVsZW1lbnRzWzhdKnMtdGhpcy5lbGVtZW50c1sxMF0qbit0aGlzLmVsZW1lbnRzWzExXSp0LHBbMTFdPS10aGlzLmVsZW1lbnRzWzhdKmkrdGhpcy5lbGVtZW50c1s5XSpuLXRoaXMuZWxlbWVudHNbMTFdKmUscFsxNV09K3RoaXMuZWxlbWVudHNbOF0qci10aGlzLmVsZW1lbnRzWzldKnQrdGhpcy5lbGVtZW50c1sxMF0qZQp2YXIgbT0xL2YKcmV0dXJuIHBbMF0qPW0scFsxXSo9bSxwWzJdKj1tLHBbM10qPW0scFs0XSo9bSxwWzVdKj1tLHBbNl0qPW0scFs3XSo9bSxwWzhdKj1tLHBbOV0qPW0scFsxMF0qPW0scFsxMV0qPW0scFsxMl0qPW0scFsxM10qPW0scFsxNF0qPW0scFsxNV0qPW0sdGhpcy5lbGVtZW50cz1wLnNsaWNlKCksITB9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPSIiLHQ9MDt0PDE1O3QrKyllKz10aGlzLmVsZW1lbnRzW3RdKyIsICIKcmV0dXJuIGUrPXRoaXMuZWxlbWVudHNbMTVdfSxwcmludDpmdW5jdGlvbigpe3ZhciBlPXByaW50TWF0cml4SGVscGVyKHRoaXMuZWxlbWVudHMpLHQ9IiIrbi5uZnModGhpcy5lbGVtZW50c1swXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzFdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMl0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1szXSxlLDQpKyJcbiIrbi5uZnModGhpcy5lbGVtZW50c1s0XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzVdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbNl0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1s3XSxlLDQpKyJcbiIrbi5uZnModGhpcy5lbGVtZW50c1s4XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzldLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMTBdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMTFdLGUsNCkrIlxuIituLm5mcyh0aGlzLmVsZW1lbnRzWzEyXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzEzXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzE0XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzE1XSxlLDQpKyJcblxuIgpuLnByaW50bG4odCl9LGludlRyYW5zbGF0ZTpmdW5jdGlvbihlLHQsbil7dGhpcy5wcmVBcHBseSgxLDAsMCwtZSwwLDEsMCwtdCwwLDAsMSwtbiwwLDAsMCwxKX0saW52Um90YXRlWDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcygtZSksbj1NYXRoLnNpbigtZSkKdGhpcy5wcmVBcHBseShbMSwwLDAsMCwwLHQsLW4sMCwwLG4sdCwwLDAsMCwwLDFdKX0saW52Um90YXRlWTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcygtZSksbj1NYXRoLnNpbigtZSkKdGhpcy5wcmVBcHBseShbdCwwLG4sMCwwLDEsMCwwLC1uLDAsdCwwLDAsMCwwLDFdKX0saW52Um90YXRlWjpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcygtZSksbj1NYXRoLnNpbigtZSkKdGhpcy5wcmVBcHBseShbdCwtbiwwLDAsbix0LDAsMCwwLDAsMSwwLDAsMCwwLDFdKX0saW52U2NhbGU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMucHJlQXBwbHkoWzEvZSwwLDAsMCwwLDEvdCwwLDAsMCwwLDEvbiwwLDAsMCwwLDFdKX19LHJ9fSx7fV0sMTY6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5QQ29uc3RhbnRzLG49ZS5QTWF0cml4MkQscj1lLlBNYXRyaXgzRCxpPWZ1bmN0aW9uKGUpe3RoaXMuZmFtaWx5PWV8fHQuR1JPVVAsdGhpcy52aXNpYmxlPSEwLHRoaXMuc3R5bGU9ITAsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLm5hbWVUYWJsZT1bXSx0aGlzLnBhcmFtcz1bXSx0aGlzLm5hbWU9IiIsdGhpcy5pbWFnZT1udWxsLHRoaXMubWF0cml4PW51bGwsdGhpcy5raW5kPW51bGwsdGhpcy5jbG9zZT1udWxsLHRoaXMud2lkdGg9bnVsbCx0aGlzLmhlaWdodD1udWxsLHRoaXMucGFyZW50PW51bGx9CnJldHVybiBpLnByb3RvdHlwZT17aXNWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlzaWJsZX0sc2V0VmlzaWJsZTpmdW5jdGlvbihlKXt0aGlzLnZpc2libGU9ZX0sZGlzYWJsZVN0eWxlOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZT0hMQpmb3IodmFyIGU9MCx0PXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2U8dDtlKyspdGhpcy5jaGlsZHJlbltlXS5kaXNhYmxlU3R5bGUoKX0sZW5hYmxlU3R5bGU6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlPSEwCmZvcih2YXIgZT0wLHQ9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTx0O2UrKyl0aGlzLmNoaWxkcmVuW2VdLmVuYWJsZVN0eWxlKCl9LGdldEZhbWlseTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZhbWlseX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aH0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVpZ2h0fSxzZXROYW1lOmZ1bmN0aW9uKGUpe3RoaXMubmFtZT1lfSxnZXROYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0sZHJhdzpmdW5jdGlvbihlKXtpZighZSl0aHJvdyJyZW5kZXIgY29udGV4dCBtaXNzaW5nIGZvciBkcmF3KCkgaW4gUFNoYXBlIgp0aGlzLnZpc2libGUmJih0aGlzLnByZShlKSx0aGlzLmRyYXdJbXBsKGUpLHRoaXMucG9zdChlKSl9LGRyYXdJbXBsOmZ1bmN0aW9uKGUpe3RoaXMuZmFtaWx5PT09dC5HUk9VUD90aGlzLmRyYXdHcm91cChlKTp0aGlzLmZhbWlseT09PXQuUFJJTUlUSVZFP3RoaXMuZHJhd1ByaW1pdGl2ZShlKTp0aGlzLmZhbWlseT09PXQuR0VPTUVUUlk/dGhpcy5kcmF3R2VvbWV0cnkoZSk6dGhpcy5mYW1pbHk9PT10LlBBVEgmJnRoaXMuZHJhd1BhdGgoZSl9LGRyYXdQYXRoOmZ1bmN0aW9uKGUpe3ZhciBuLHIKaWYoMCE9PXRoaXMudmVydGljZXMubGVuZ3RoKXtpZihlLmJlZ2luU2hhcGUoKSwwPT09dGhpcy52ZXJ0ZXhDb2Rlcy5sZW5ndGgpaWYoMj09PXRoaXMudmVydGljZXNbMF0ubGVuZ3RoKWZvcihuPTAscj10aGlzLnZlcnRpY2VzLmxlbmd0aDtuPHI7bisrKWUudmVydGV4KHRoaXMudmVydGljZXNbbl1bMF0sdGhpcy52ZXJ0aWNlc1tuXVsxXSkKZWxzZSBmb3Iobj0wLHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7bjxyO24rKyllLnZlcnRleCh0aGlzLnZlcnRpY2VzW25dWzBdLHRoaXMudmVydGljZXNbbl1bMV0sdGhpcy52ZXJ0aWNlc1tuXVsyXSkKZWxzZXt2YXIgaT0wCmlmKDI9PT10aGlzLnZlcnRpY2VzWzBdLmxlbmd0aClmb3Iobj0wLHI9dGhpcy52ZXJ0ZXhDb2Rlcy5sZW5ndGg7bjxyO24rKyl0aGlzLnZlcnRleENvZGVzW25dPT09dC5WRVJURVg/KGUudmVydGV4KHRoaXMudmVydGljZXNbaV1bMF0sdGhpcy52ZXJ0aWNlc1tpXVsxXSx0aGlzLnZlcnRpY2VzW2ldLm1vdmVUbyksZS5icmVha1NoYXBlPSExLGkrKyk6dGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuQkVaSUVSX1ZFUlRFWD8oZS5iZXppZXJWZXJ0ZXgodGhpcy52ZXJ0aWNlc1tpKzBdWzBdLHRoaXMudmVydGljZXNbaSswXVsxXSx0aGlzLnZlcnRpY2VzW2krMV1bMF0sdGhpcy52ZXJ0aWNlc1tpKzFdWzFdLHRoaXMudmVydGljZXNbaSsyXVswXSx0aGlzLnZlcnRpY2VzW2krMl1bMV0pLGkrPTMpOnRoaXMudmVydGV4Q29kZXNbbl09PT10LkNVUlZFX1ZFUlRFWD8oZS5jdXJ2ZVZlcnRleCh0aGlzLnZlcnRpY2VzW2ldWzBdLHRoaXMudmVydGljZXNbaV1bMV0pLGkrKyk6dGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuQlJFQUsmJihlLmJyZWFrU2hhcGU9ITApCmVsc2UgZm9yKG49MCxyPXRoaXMudmVydGV4Q29kZXMubGVuZ3RoO248cjtuKyspdGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuVkVSVEVYPyhlLnZlcnRleCh0aGlzLnZlcnRpY2VzW2ldWzBdLHRoaXMudmVydGljZXNbaV1bMV0sdGhpcy52ZXJ0aWNlc1tpXVsyXSksdGhpcy52ZXJ0aWNlc1tpXS5tb3ZlVG89PT0hMD92ZXJ0QXJyYXlbdmVydEFycmF5Lmxlbmd0aC0xXS5tb3ZlVG89ITA6dGhpcy52ZXJ0aWNlc1tpXS5tb3ZlVG89PT0hMSYmKHZlcnRBcnJheVt2ZXJ0QXJyYXkubGVuZ3RoLTFdLm1vdmVUbz0hMSksZS5icmVha1NoYXBlPSExKTp0aGlzLnZlcnRleENvZGVzW25dPT09dC5CRVpJRVJfVkVSVEVYPyhlLmJlemllclZlcnRleCh0aGlzLnZlcnRpY2VzW2krMF1bMF0sdGhpcy52ZXJ0aWNlc1tpKzBdWzFdLHRoaXMudmVydGljZXNbaSswXVsyXSx0aGlzLnZlcnRpY2VzW2krMV1bMF0sdGhpcy52ZXJ0aWNlc1tpKzFdWzFdLHRoaXMudmVydGljZXNbaSsxXVsyXSx0aGlzLnZlcnRpY2VzW2krMl1bMF0sdGhpcy52ZXJ0aWNlc1tpKzJdWzFdLHRoaXMudmVydGljZXNbaSsyXVsyXSksaSs9Myk6dGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuQ1VSVkVfVkVSVEVYPyhlLmN1cnZlVmVydGV4KHRoaXMudmVydGljZXNbaV1bMF0sdGhpcy52ZXJ0aWNlc1tpXVsxXSx0aGlzLnZlcnRpY2VzW2ldWzJdKSxpKyspOnRoaXMudmVydGV4Q29kZXNbbl09PT10LkJSRUFLJiYoZS5icmVha1NoYXBlPSEwKX1lLmVuZFNoYXBlKHRoaXMuY2xvc2U/dC5DTE9TRTp0Lk9QRU4pfX0sZHJhd0dlb21ldHJ5OmZ1bmN0aW9uKGUpe3ZhciB0LG4KaWYoZS5iZWdpblNoYXBlKHRoaXMua2luZCksdGhpcy5zdHlsZSlmb3IodD0wLG49dGhpcy52ZXJ0aWNlcy5sZW5ndGg7dDxuO3QrKyllLnZlcnRleCh0aGlzLnZlcnRpY2VzW3RdKQplbHNlIGZvcih0PTAsbj10aGlzLnZlcnRpY2VzLmxlbmd0aDt0PG47dCsrKXt2YXIgcj10aGlzLnZlcnRpY2VzW3RdCjA9PT1yWzJdP2UudmVydGV4KHJbMF0sclsxXSk6ZS52ZXJ0ZXgoclswXSxyWzFdLHJbMl0pfWUuZW5kU2hhcGUoKX0sZHJhd0dyb3VwOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7dDxuO3QrKyl0aGlzLmNoaWxkcmVuW3RdLmRyYXcoZSl9LGRyYXdQcmltaXRpdmU6ZnVuY3Rpb24oZSl7aWYodGhpcy5raW5kPT09dC5QT0lOVCllLnBvaW50KHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdKQplbHNlIGlmKHRoaXMua2luZD09PXQuTElORSk0PT09dGhpcy5wYXJhbXMubGVuZ3RoP2UubGluZSh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSk6ZS5saW5lKHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdLHRoaXMucGFyYW1zWzRdLHRoaXMucGFyYW1zWzVdKQplbHNlIGlmKHRoaXMua2luZD09PXQuVFJJQU5HTEUpZS50cmlhbmdsZSh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSx0aGlzLnBhcmFtc1s0XSx0aGlzLnBhcmFtc1s1XSkKZWxzZSBpZih0aGlzLmtpbmQ9PT10LlFVQUQpZS5xdWFkKHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdLHRoaXMucGFyYW1zWzRdLHRoaXMucGFyYW1zWzVdLHRoaXMucGFyYW1zWzZdLHRoaXMucGFyYW1zWzddKQplbHNlIGlmKHRoaXMua2luZD09PXQuUkVDVClpZihudWxsIT09dGhpcy5pbWFnZSl7dmFyIG49aW1hZ2VNb2RlQ29udmVydAplLmltYWdlTW9kZSh0LkNPUk5FUiksZS5pbWFnZSh0aGlzLmltYWdlLHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdKSxpbWFnZU1vZGVDb252ZXJ0PW59ZWxzZXt2YXIgcj1lLmN1clJlY3RNb2RlCmUucmVjdE1vZGUodC5DT1JORVIpLGUucmVjdCh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSksZS5jdXJSZWN0TW9kZT1yfWVsc2UgaWYodGhpcy5raW5kPT09dC5FTExJUFNFKXt2YXIgaT1lLmN1ckVsbGlwc2VNb2RlCmUuZWxsaXBzZU1vZGUodC5DT1JORVIpLGUuZWxsaXBzZSh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSksZS5jdXJFbGxpcHNlTW9kZT1pfWVsc2UgaWYodGhpcy5raW5kPT09dC5BUkMpe3ZhciBzPWN1ckVsbGlwc2VNb2RlCmUuZWxsaXBzZU1vZGUodC5DT1JORVIpLGUuYXJjKHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdLHRoaXMucGFyYW1zWzRdLHRoaXMucGFyYW1zWzVdKSxjdXJFbGxpcHNlTW9kZT1zfWVsc2UgdGhpcy5raW5kPT09dC5CT1g/MT09PXRoaXMucGFyYW1zLmxlbmd0aD9lLmJveCh0aGlzLnBhcmFtc1swXSk6ZS5ib3godGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0pOnRoaXMua2luZD09PXQuU1BIRVJFJiZlLnNwaGVyZSh0aGlzLnBhcmFtc1swXSl9LHByZTpmdW5jdGlvbihlKXt0aGlzLm1hdHJpeCYmKGUucHVzaE1hdHJpeCgpLGUudHJhbnNmb3JtKHRoaXMubWF0cml4KSksdGhpcy5zdHlsZSYmKGUucHVzaFN0eWxlKCksdGhpcy5zdHlsZXMoZSkpfSxwb3N0OmZ1bmN0aW9uKGUpe3RoaXMubWF0cml4JiZlLnBvcE1hdHJpeCgpLHRoaXMuc3R5bGUmJmUucG9wU3R5bGUoKX0sc3R5bGVzOmZ1bmN0aW9uKGUpe3RoaXMuc3Ryb2tlPyhlLnN0cm9rZSh0aGlzLnN0cm9rZUNvbG9yKSxlLnN0cm9rZVdlaWdodCh0aGlzLnN0cm9rZVdlaWdodCksZS5zdHJva2VDYXAodGhpcy5zdHJva2VDYXApLGUuc3Ryb2tlSm9pbih0aGlzLnN0cm9rZUpvaW4pKTplLm5vU3Ryb2tlKCksdGhpcy5maWxsP2UuZmlsbCh0aGlzLmZpbGxDb2xvcik6ZS5ub0ZpbGwoKX0sZ2V0Q2hpbGQ6ZnVuY3Rpb24oZSl7dmFyIHQsbgppZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIHRoaXMuY2hpbGRyZW5bZV0KdmFyIHIKaWYoIiI9PT1lfHx0aGlzLm5hbWU9PT1lKXJldHVybiB0aGlzCmlmKHRoaXMubmFtZVRhYmxlLmxlbmd0aD4wKXtmb3IodD0wLG49dGhpcy5uYW1lVGFibGUubGVuZ3RoO3Q8bnx8cjt0KyspaWYodGhpcy5uYW1lVGFibGVbdF0uZ2V0TmFtZT09PWUpe3I9dGhpcy5uYW1lVGFibGVbdF0KYnJlYWt9aWYocilyZXR1cm4gcn1mb3IodD0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7dDxuO3QrKylpZihyPXRoaXMuY2hpbGRyZW5bdF0uZ2V0Q2hpbGQoZSkpcmV0dXJuIHIKcmV0dXJuIG51bGx9LGdldENoaWxkQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGh9LGFkZENoaWxkOmZ1bmN0aW9uKGUpe3RoaXMuY2hpbGRyZW4ucHVzaChlKSxlLnBhcmVudD10aGlzLG51bGwhPT1lLmdldE5hbWUoKSYmdGhpcy5hZGROYW1lKGUuZ2V0TmFtZSgpLGUpfSxhZGROYW1lOmZ1bmN0aW9uKGUsdCl7bnVsbCE9PXRoaXMucGFyZW50P3RoaXMucGFyZW50LmFkZE5hbWUoZSx0KTp0aGlzLm5hbWVUYWJsZS5wdXNoKFtlLHRdKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Mj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXgudHJhbnNsYXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pKToodGhpcy5jaGVja01hdHJpeCgzKSx0aGlzLm1hdHJpeC50cmFuc2xhdGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSwwKSl9LGNoZWNrTWF0cml4OmZ1bmN0aW9uKGUpe251bGw9PT10aGlzLm1hdHJpeD8yPT09ZT90aGlzLm1hdHJpeD1uZXcgbjp0aGlzLm1hdHJpeD1uZXcgcjozPT09ZSYmdGhpcy5tYXRyaXggaW5zdGFuY2VvZiBuJiYodGhpcy5tYXRyaXg9bmV3IHIpfSxyb3RhdGVYOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlKGUsMSwwLDApfSxyb3RhdGVZOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlKGUsMCwxLDApfSxyb3RhdGVaOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlKGUsMCwwLDEpfSxyb3RhdGU6ZnVuY3Rpb24oKXsxPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC5yb3RhdGUoYXJndW1lbnRzWzBdKSk6KHRoaXMuY2hlY2tNYXRyaXgoMyksdGhpcy5tYXRyaXgucm90YXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSkpfSxzY2FsZTpmdW5jdGlvbigpezI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LnNjYWxlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pKTozPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC5zY2FsZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkpOih0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LnNjYWxlKGFyZ3VtZW50c1swXSkpfSxyZXNldE1hdHJpeDpmdW5jdGlvbigpe3RoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXgucmVzZXQoKX0sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oZSl7MT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5hcHBseU1hdHJpeChlLmVsZW1lbnRzWzBdLGUuZWxlbWVudHNbMV0sMCxlLmVsZW1lbnRzWzJdLGUuZWxlbWVudHNbM10sZS5lbGVtZW50c1s0XSwwLGUuZWxlbWVudHNbNV0sMCwwLDEsMCwwLDAsMCwxKTo2PT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC5hcHBseShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSwwLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdLDAsMCwwLDEsMCwwLDAsMCwxKSk6MTY9PT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5jaGVja01hdHJpeCgzKSx0aGlzLm1hdHJpeC5hcHBseShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSxhcmd1bWVudHNbNl0sYXJndW1lbnRzWzddLGFyZ3VtZW50c1s4XSxhcmd1bWVudHNbOV0sYXJndW1lbnRzWzEwXSxhcmd1bWVudHNbMTFdLGFyZ3VtZW50c1sxMl0sYXJndW1lbnRzWzEzXSxhcmd1bWVudHNbMTRdLGFyZ3VtZW50c1sxNV0pKX19LGl9fSx7fV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5Db21tb25GdW5jdGlvbnMsbj1lLlBDb25zdGFudHMscj1lLlBTaGFwZSxpPWUuWE1MRWxlbWVudCxzPWUuY29sb3JzLG89ZnVuY3Rpb24oKXtpZihyLmNhbGwodGhpcyksMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKHRoaXMuZWxlbWVudD1hcmd1bWVudHNbMF0sdGhpcy52ZXJ0ZXhDb2Rlcz1bXSx0aGlzLnZlcnRpY2VzPVtdLHRoaXMub3BhY2l0eT0xLHRoaXMuc3Ryb2tlPSExLHRoaXMuc3Ryb2tlQ29sb3I9bi5BTFBIQV9NQVNLLHRoaXMuc3Ryb2tlV2VpZ2h0PTEsdGhpcy5zdHJva2VDYXA9bi5TUVVBUkUsdGhpcy5zdHJva2VKb2luPW4uTUlURVIsdGhpcy5zdHJva2VHcmFkaWVudD1udWxsLHRoaXMuc3Ryb2tlR3JhZGllbnRQYWludD1udWxsLHRoaXMuc3Ryb2tlTmFtZT1udWxsLHRoaXMuc3Ryb2tlT3BhY2l0eT0xLHRoaXMuZmlsbD0hMCx0aGlzLmZpbGxDb2xvcj1uLkFMUEhBX01BU0ssdGhpcy5maWxsR3JhZGllbnQ9bnVsbCx0aGlzLmZpbGxHcmFkaWVudFBhaW50PW51bGwsdGhpcy5maWxsTmFtZT1udWxsLHRoaXMuZmlsbE9wYWNpdHk9MSwic3ZnIiE9PXRoaXMuZWxlbWVudC5nZXROYW1lKCkpdGhyb3cicm9vdCBpcyBub3QgPHN2Zz4sIGl0J3MgPCIrdGhpcy5lbGVtZW50LmdldE5hbWUoKSsiPiJ9ZWxzZSAyPT09YXJndW1lbnRzLmxlbmd0aCYmKCJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXS5pbmRleE9mKCIuc3ZnIik+LTEmJih0aGlzLmVsZW1lbnQ9bmV3IGkoKCEwKSxhcmd1bWVudHNbMV0pLHRoaXMudmVydGV4Q29kZXM9W10sdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLm9wYWNpdHk9MSx0aGlzLnN0cm9rZT0hMSx0aGlzLnN0cm9rZUNvbG9yPW4uQUxQSEFfTUFTSyx0aGlzLnN0cm9rZVdlaWdodD0xLHRoaXMuc3Ryb2tlQ2FwPW4uU1FVQVJFLHRoaXMuc3Ryb2tlSm9pbj1uLk1JVEVSLHRoaXMuc3Ryb2tlR3JhZGllbnQ9IiIsdGhpcy5zdHJva2VHcmFkaWVudFBhaW50PSIiLHRoaXMuc3Ryb2tlTmFtZT0iIix0aGlzLnN0cm9rZU9wYWNpdHk9MSx0aGlzLmZpbGw9ITAsdGhpcy5maWxsQ29sb3I9bi5BTFBIQV9NQVNLLHRoaXMuZmlsbEdyYWRpZW50PW51bGwsdGhpcy5maWxsR3JhZGllbnRQYWludD1udWxsLHRoaXMuZmlsbE9wYWNpdHk9MSk6YXJndW1lbnRzWzBdJiYodGhpcy5lbGVtZW50PWFyZ3VtZW50c1sxXSx0aGlzLnZlcnRleENvZGVzPWFyZ3VtZW50c1swXS52ZXJ0ZXhDb2Rlcy5zbGljZSgpLHRoaXMudmVydGljZXM9YXJndW1lbnRzWzBdLnZlcnRpY2VzLnNsaWNlKCksdGhpcy5zdHJva2U9YXJndW1lbnRzWzBdLnN0cm9rZSx0aGlzLnN0cm9rZUNvbG9yPWFyZ3VtZW50c1swXS5zdHJva2VDb2xvcix0aGlzLnN0cm9rZVdlaWdodD1hcmd1bWVudHNbMF0uc3Ryb2tlV2VpZ2h0LHRoaXMuc3Ryb2tlQ2FwPWFyZ3VtZW50c1swXS5zdHJva2VDYXAsdGhpcy5zdHJva2VKb2luPWFyZ3VtZW50c1swXS5zdHJva2VKb2luLHRoaXMuc3Ryb2tlR3JhZGllbnQ9YXJndW1lbnRzWzBdLnN0cm9rZUdyYWRpZW50LHRoaXMuc3Ryb2tlR3JhZGllbnRQYWludD1hcmd1bWVudHNbMF0uc3Ryb2tlR3JhZGllbnRQYWludCx0aGlzLnN0cm9rZU5hbWU9YXJndW1lbnRzWzBdLnN0cm9rZU5hbWUsdGhpcy5maWxsPWFyZ3VtZW50c1swXS5maWxsLHRoaXMuZmlsbENvbG9yPWFyZ3VtZW50c1swXS5maWxsQ29sb3IsdGhpcy5maWxsR3JhZGllbnQ9YXJndW1lbnRzWzBdLmZpbGxHcmFkaWVudCx0aGlzLmZpbGxHcmFkaWVudFBhaW50PWFyZ3VtZW50c1swXS5maWxsR3JhZGllbnRQYWludCx0aGlzLmZpbGxOYW1lPWFyZ3VtZW50c1swXS5maWxsTmFtZSx0aGlzLnN0cm9rZU9wYWNpdHk9YXJndW1lbnRzWzBdLnN0cm9rZU9wYWNpdHksdGhpcy5maWxsT3BhY2l0eT1hcmd1bWVudHNbMF0uZmlsbE9wYWNpdHksdGhpcy5vcGFjaXR5PWFyZ3VtZW50c1swXS5vcGFjaXR5KSkKdGhpcy5uYW1lPXRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoImlkIikKdmFyIGU9dGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgiZGlzcGxheSIsImlubGluZSIpCnRoaXMudmlzaWJsZT0ibm9uZSIhPT1lCnZhciB0PXRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpCnQmJih0aGlzLm1hdHJpeD10aGlzLnBhcnNlTWF0cml4KHQpKQp2YXIgcz10aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJ2aWV3Qm94IikKaWYobnVsbCE9PXMpe3ZhciBvPXMuc3BsaXQoIiAiKQp0aGlzLndpZHRoPW9bMl0sdGhpcy5oZWlnaHQ9b1szXX12YXIgYT10aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJ3aWR0aCIpLGw9dGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgiaGVpZ2h0IikKaWYobnVsbCE9PWEpdGhpcy53aWR0aD10aGlzLnBhcnNlVW5pdFNpemUoYSksdGhpcy5oZWlnaHQ9dGhpcy5wYXJzZVVuaXRTaXplKGwpCmVsc2UgaWYoMD09PXRoaXMud2lkdGh8fDA9PT10aGlzLmhlaWdodCl0aHJvdyB0aGlzLndpZHRoPTEsdGhpcy5oZWlnaHQ9MSwiVGhlIHdpZHRoIGFuZC9vciBoZWlnaHQgaXMgbm90IHJlYWRhYmxlIGluIHRoZSA8c3ZnPiB0YWcgb2YgdGhpcyBmaWxlLiIKdGhpcy5wYXJzZUNvbG9ycyh0aGlzLmVsZW1lbnQpLHRoaXMucGFyc2VDaGlsZHJlbih0aGlzLmVsZW1lbnQpfQpyZXR1cm4gby5wcm90b3R5cGU9bmV3IHIsby5wcm90b3R5cGUucGFyc2VNYXRyaXg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciB0PVtdCnJldHVybiBlLnJlcGxhY2UoL1woKC4qPylcKS8sZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt0PW4ucmVwbGFjZSgvLCsvZywiICIpLnNwbGl0KC9ccysvKX19KCkpLHR9cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuY2hlY2tNYXRyaXgoMikKdmFyIHI9W10KaWYobi5yZXBsYWNlKC9ccyooXHcrKVwoKC4qPylcKS9nLGZ1bmN0aW9uKGUpe3IucHVzaCh0LnRyaW0oZSkpfSksMD09PXIubGVuZ3RoKXJldHVybiBudWxsCmZvcih2YXIgaT0wLHM9ci5sZW5ndGg7aTxzO2krKyl7dmFyIG89ZShyW2ldKQppZihyW2ldLmluZGV4T2YoIm1hdHJpeCIpIT09LTEpdGhpcy5tYXRyaXguc2V0KG9bMF0sb1syXSxvWzRdLG9bMV0sb1szXSxvWzVdKQplbHNlIGlmKHJbaV0uaW5kZXhPZigidHJhbnNsYXRlIikhPT0tMSl7dmFyIGE9b1swXSxsPTI9PT1vLmxlbmd0aD9vWzFdOjAKdGhpcy5tYXRyaXgudHJhbnNsYXRlKGEsbCl9ZWxzZSBpZihyW2ldLmluZGV4T2YoInNjYWxlIikhPT0tMSl7dmFyIGg9b1swXSx1PTI9PT1vLmxlbmd0aD9vWzFdOm9bMF0KdGhpcy5tYXRyaXguc2NhbGUoaCx1KX1lbHNlIGlmKHJbaV0uaW5kZXhPZigicm90YXRlIikhPT0tMSl7dmFyIGM9b1swXQoxPT09by5sZW5ndGg/dGhpcy5tYXRyaXgucm90YXRlKHQucmFkaWFucyhjKSk6Mz09PW8ubGVuZ3RoJiYodGhpcy5tYXRyaXgudHJhbnNsYXRlKG9bMV0sb1syXSksdGhpcy5tYXRyaXgucm90YXRlKHQucmFkaWFucyhvWzBdKSksdGhpcy5tYXRyaXgudHJhbnNsYXRlKC1vWzFdLC1vWzJdKSl9ZWxzZSByW2ldLmluZGV4T2YoInNrZXdYIikhPT0tMT90aGlzLm1hdHJpeC5za2V3WChwYXJzZUZsb2F0KG9bMF0pKTpyW2ldLmluZGV4T2YoInNrZXdZIikhPT0tMT90aGlzLm1hdHJpeC5za2V3WShvWzBdKTpyW2ldLmluZGV4T2YoInNoZWFyWCIpIT09LTE/dGhpcy5tYXRyaXguc2hlYXJYKG9bMF0pOnJbaV0uaW5kZXhPZigic2hlYXJZIikhPT0tMSYmdGhpcy5tYXRyaXguc2hlYXJZKG9bMF0pfXJldHVybiB0aGlzLm1hdHJpeH19KCksby5wcm90b3R5cGUucGFyc2VDaGlsZHJlbj1mdW5jdGlvbihlKXt2YXIgdCxuLGk9ZS5nZXRDaGlsZHJlbigpLHM9bmV3IHIKZm9yKHQ9MCxuPWkubGVuZ3RoO3Q8bjt0Kyspe3ZhciBvPXRoaXMucGFyc2VDaGlsZChpW3RdKQpvJiZzLmFkZENoaWxkKG8pfWZvcih0PTAsbj1zLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKXRoaXMuY2hpbGRyZW4ucHVzaChzLmNoaWxkcmVuW3RdKX0sby5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LG8ucHJvdG90eXBlLnBhcnNlQ2hpbGQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmdldE5hbWUoKQpyZXR1cm4iZyI9PT1uP3Q9bmV3IG8odGhpcyxlKToiZGVmcyI9PT1uP3Q9bmV3IG8odGhpcyxlKToibGluZSI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZUxpbmUoKSk6ImNpcmNsZSI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZUVsbGlwc2UoITApKToiZWxsaXBzZSI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZUVsbGlwc2UoITEpKToicmVjdCI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZVJlY3QoKSk6InBvbHlnb24iPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VQb2x5KCEwKSk6InBvbHlsaW5lIj09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlUG9seSghMSkpOiJwYXRoIj09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlUGF0aCgpKToicmFkaWFsR3JhZGllbnQiPT09bj91bmltcGxlbWVudGVkKCJQU2hhcGVTVkcucHJvdG90eXBlLnBhcnNlQ2hpbGQsIG5hbWUgPSByYWRpYWxHcmFkaWVudCIpOiJsaW5lYXJHcmFkaWVudCI9PT1uP3VuaW1wbGVtZW50ZWQoIlBTaGFwZVNWRy5wcm90b3R5cGUucGFyc2VDaGlsZCwgbmFtZSA9IGxpbmVhckdyYWRpZW50Iik6InRleHQiPT09bj91bmltcGxlbWVudGVkKCJQU2hhcGVTVkcucHJvdG90eXBlLnBhcnNlQ2hpbGQsIG5hbWUgPSB0ZXh0Iik6ImZpbHRlciI9PT1uP3VuaW1wbGVtZW50ZWQoIlBTaGFwZVNWRy5wcm90b3R5cGUucGFyc2VDaGlsZCwgbmFtZSA9IGZpbHRlciIpOiJtYXNrIj09PW4mJnVuaW1wbGVtZW50ZWQoIlBTaGFwZVNWRy5wcm90b3R5cGUucGFyc2VDaGlsZCwgbmFtZSA9IG1hc2siKSx0fSxvLnByb3RvdHlwZS5wYXJzZVBhdGg9ZnVuY3Rpb24oKXt0aGlzLmZhbWlseT1uLlBBVEgsdGhpcy5raW5kPTAKdmFyIGU9dC50cmltKHRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoImQiKS5yZXBsYWNlKC9bXHMsXSsvZywiICIpKQppZihudWxsIT09ZSl7ZT1lLnNwbGl0KCIiKQpmb3IodmFyIHIsaSxzLG8sYT0wLGw9MCxoPTAsdT0wLGM9MCxmPTAscD0wLG09MCxnPTAsZD0wLHY9MCx5PTAseD0wLEE9MCxiPTAsdz0wLEU9IiIsUz1bXSxQPSExO2I8ZS5sZW5ndGg7KWlmKHc9ZVtiXS5jaGFyQ29kZUF0KDApLHc+PTY1JiZ3PD05MHx8dz49OTcmJnc8PTEyMil7aWYocz1iLGIrKyxiPGUubGVuZ3RoKWZvcihTPVtdLHc9ZVtiXS5jaGFyQ29kZUF0KDApOyEodz49NjUmJnc8PTkwfHx3Pj05NyYmdzw9MTAwfHx3Pj0xMDImJnc8PTEyMikmJlA9PT0hMTspMzI9PT13PygiIiE9PUUmJihTLnB1c2gocGFyc2VGbG9hdChFKSksRT0iIiksYisrKTo0NT09PXc/MTAxPT09ZVtiLTFdLmNoYXJDb2RlQXQoMCk/KEUrPWVbYl0udG9TdHJpbmcoKSxiKyspOigiIiE9PUUmJlMucHVzaChwYXJzZUZsb2F0KEUpKSxFPWVbYl0udG9TdHJpbmcoKSxiKyspOihFKz1lW2JdLnRvU3RyaW5nKCksYisrKSxiPT09ZS5sZW5ndGg/UD0hMDp3PWVbYl0uY2hhckNvZGVBdCgwKQppZigiIiE9PUUmJihTLnB1c2gocGFyc2VGbG9hdChFKSksRT0iIiksaT1lW3NdLHc9aS5jaGFyQ29kZUF0KDApLDc3PT09dyl7aWYoUy5sZW5ndGg+PTImJlMubGVuZ3RoJTI9PT0wJiYoYT1TWzBdLGw9U1sxXSx0aGlzLnBhcnNlUGF0aE1vdmV0byhhLGwpLFMubGVuZ3RoPjIpKWZvcihzPTIsbz1TLmxlbmd0aDtzPG87cys9MilhPVNbc10sbD1TW3MrMV0sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKX1lbHNlIGlmKDEwOT09PXcpe2lmKFMubGVuZ3RoPj0yJiZTLmxlbmd0aCUyPT09MCYmKGErPVNbMF0sbCs9U1sxXSx0aGlzLnBhcnNlUGF0aE1vdmV0byhhLGwpLFMubGVuZ3RoPjIpKWZvcihzPTIsbz1TLmxlbmd0aDtzPG87cys9MilhKz1TW3NdLGwrPVNbcysxXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpfWVsc2UgaWYoNzY9PT13KXtpZihTLmxlbmd0aD49MiYmUy5sZW5ndGglMj09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz0yKWE9U1tzXSxsPVNbcysxXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpfWVsc2UgaWYoMTA4PT09dyl7aWYoUy5sZW5ndGg+PTImJlMubGVuZ3RoJTI9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9MilhKz1TW3NdLGwrPVNbcysxXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpfWVsc2UgaWYoNzI9PT13KWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cysrKWE9U1tzXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpCmVsc2UgaWYoMTA0PT09dylmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrKylhKz1TW3NdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCkKZWxzZSBpZig4Nj09PXcpZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKyspbD1TW3NdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCkKZWxzZSBpZigxMTg9PT13KWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cysrKWwrPVNbc10sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKQplbHNlIGlmKDY3PT09dyl7aWYoUy5sZW5ndGg+PTYmJlMubGVuZ3RoJTY9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9NiljPVNbc10scD1TW3MrMV0sZj1TW3MrMl0sbT1TW3MrM10sZz1TW3MrNF0sZD1TW3MrNV0sdGhpcy5wYXJzZVBhdGhDdXJ2ZXRvKGMscCxmLG0sZyxkKSxhPWcsbD1kfWVsc2UgaWYoOTk9PT13KXtpZihTLmxlbmd0aD49NiYmUy5sZW5ndGglNj09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz02KWM9YStTW3NdLHA9bCtTW3MrMV0sZj1hK1NbcysyXSxtPWwrU1tzKzNdLGc9YStTW3MrNF0sZD1sK1Nbcys1XSx0aGlzLnBhcnNlUGF0aEN1cnZldG8oYyxwLGYsbSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZig4Mz09PXcpe2lmKFMubGVuZ3RoPj00JiZTLmxlbmd0aCU0PT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTQpImMiPT09ci50b0xvd2VyQ2FzZSgpfHwicyI9PT1yLnRvTG93ZXJDYXNlKCk/KHY9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVswXSx5PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMV0seD10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzBdLEE9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVsxXSxjPXgrKHgtdikscD1BKyhBLXkpKTooYz10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzBdLHA9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVsxXSksZj1TW3NdLG09U1tzKzFdLGc9U1tzKzJdLGQ9U1tzKzNdLHRoaXMucGFyc2VQYXRoQ3VydmV0byhjLHAsZixtLGcsZCksYT1nLGw9ZH1lbHNlIGlmKDExNT09PXcpe2lmKFMubGVuZ3RoPj00JiZTLmxlbmd0aCU0PT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTQpImMiPT09ci50b0xvd2VyQ2FzZSgpfHwicyI9PT1yLnRvTG93ZXJDYXNlKCk/KHY9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVswXSx5PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMV0seD10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzBdLEE9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVsxXSxjPXgrKHgtdikscD1BKyhBLXkpKTooYz10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzBdLHA9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVsxXSksZj1hK1Nbc10sbT1sK1NbcysxXSxnPWErU1tzKzJdLGQ9bCtTW3MrM10sdGhpcy5wYXJzZVBhdGhDdXJ2ZXRvKGMscCxmLG0sZyxkKSxhPWcsbD1kfWVsc2UgaWYoODE9PT13KXtpZihTLmxlbmd0aD49NCYmUy5sZW5ndGglND09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz00KWg9U1tzXSx1PVNbcysxXSxnPVNbcysyXSxkPVNbcyszXSx0aGlzLnBhcnNlUGF0aFF1YWR0byhhLGwsaCx1LGcsZCksYT1nLGw9ZH1lbHNlIGlmKDExMz09PXcpe2lmKFMubGVuZ3RoPj00JiZTLmxlbmd0aCU0PT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTQpaD1hK1Nbc10sdT1sK1NbcysxXSxnPWErU1tzKzJdLGQ9bCtTW3MrM10sdGhpcy5wYXJzZVBhdGhRdWFkdG8oYSxsLGgsdSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZig4ND09PXcpe2lmKFMubGVuZ3RoPj0yJiZTLmxlbmd0aCUyPT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTIpInEiPT09ci50b0xvd2VyQ2FzZSgpfHwidCI9PT1yLnRvTG93ZXJDYXNlKCk/KHY9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVswXSx5PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMV0seD10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzBdLEE9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVsxXSxoPXgrKHgtdiksdT1BKyhBLXkpKTooaD1hLHU9bCksZz1TW3NdLGQ9U1tzKzFdLHRoaXMucGFyc2VQYXRoUXVhZHRvKGEsbCxoLHUsZyxkKSxhPWcsbD1kfWVsc2UgaWYoMTE2PT09dyl7aWYoUy5sZW5ndGg+PTImJlMubGVuZ3RoJTI9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9MikicSI9PT1yLnRvTG93ZXJDYXNlKCl8fCJ0Ij09PXIudG9Mb3dlckNhc2UoKT8odj10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzBdLHk9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVsxXSx4PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMF0sQT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzFdLGg9eCsoeC12KSx1PUErKEEteSkpOihoPWEsdT1sKSxnPWErU1tzXSxkPWwrU1tzKzFdLHRoaXMucGFyc2VQYXRoUXVhZHRvKGEsbCxoLHUsZyxkKSxhPWcsbD1kfWVsc2UgOTAhPT13JiYxMjIhPT13fHwodGhpcy5jbG9zZT0hMCkKcj1pLnRvU3RyaW5nKCl9ZWxzZSBiKyt9fSxvLnByb3RvdHlwZS5wYXJzZVBhdGhRdWFkdG89ZnVuY3Rpb24oZSx0LHIsaSxzLG8pe2lmKCEodGhpcy52ZXJ0aWNlcy5sZW5ndGg+MCkpdGhyb3ciUGF0aCBtdXN0IHN0YXJ0IHdpdGggTS9tIgp0aGlzLnBhcnNlUGF0aENvZGUobi5CRVpJRVJfVkVSVEVYKSx0aGlzLnBhcnNlUGF0aFZlcnRleChlKzIqKHItZSkvMyx0KzIqKGktdCkvMyksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgocysyKihyLXMpLzMsbysyKihpLW8pLzMpLHRoaXMucGFyc2VQYXRoVmVydGV4KHMsbyl9LG8ucHJvdG90eXBlLnBhcnNlUGF0aEN1cnZldG89ZnVuY3Rpb24oZSx0LHIsaSxzLG8pe2lmKCEodGhpcy52ZXJ0aWNlcy5sZW5ndGg+MCkpdGhyb3ciUGF0aCBtdXN0IHN0YXJ0IHdpdGggTS9tIgp0aGlzLnBhcnNlUGF0aENvZGUobi5CRVpJRVJfVkVSVEVYKSx0aGlzLnBhcnNlUGF0aFZlcnRleChlLHQpLHRoaXMucGFyc2VQYXRoVmVydGV4KHIsaSksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgocyxvKX0sby5wcm90b3R5cGUucGFyc2VQYXRoTGluZXRvPWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzLnZlcnRpY2VzLmxlbmd0aD4wKSl0aHJvdyJQYXRoIG11c3Qgc3RhcnQgd2l0aCBNL20iCnRoaXMucGFyc2VQYXRoQ29kZShuLlZFUlRFWCksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgoZSx0KSx0aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdLm1vdmVUbz0hMX0sby5wcm90b3R5cGUucGFyc2VQYXRoTW92ZXRvPWZ1bmN0aW9uKGUsdCl7dGhpcy52ZXJ0aWNlcy5sZW5ndGg+MCYmdGhpcy5wYXJzZVBhdGhDb2RlKG4uQlJFQUspLHRoaXMucGFyc2VQYXRoQ29kZShuLlZFUlRFWCksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgoZSx0KSx0aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdLm1vdmVUbz0hMH0sby5wcm90b3R5cGUucGFyc2VQYXRoVmVydGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49W10KblswXT1lLG5bMV09dCx0aGlzLnZlcnRpY2VzLnB1c2gobil9LG8ucHJvdG90eXBlLnBhcnNlUGF0aENvZGU9ZnVuY3Rpb24oZSl7dGhpcy52ZXJ0ZXhDb2Rlcy5wdXNoKGUpfSxvLnByb3RvdHlwZS5wYXJzZVBvbHk9ZnVuY3Rpb24oZSl7dGhpcy5mYW1pbHk9bi5QQVRILHRoaXMuY2xvc2U9ZQp2YXIgcj10LnRyaW0odGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgicG9pbnRzIikucmVwbGFjZSgvWyxcc10rL2csIiAiKSkKaWYobnVsbCE9PXIpe3ZhciBpPXIuc3BsaXQoIiAiKQppZihpLmxlbmd0aCUyIT09MCl0aHJvdyJFcnJvciBwYXJzaW5nIHBvbHlnb24gcG9pbnRzOiBvZGQgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIHByb3ZpZGVkIgpmb3IodmFyIHM9MCxvPWkubGVuZ3RoO3M8bztzKyspe3ZhciBhPVtdCmFbMF09aVtzXSxhWzFdPWlbKytzXSx0aGlzLnZlcnRpY2VzLnB1c2goYSl9fX0sby5wcm90b3R5cGUucGFyc2VSZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5raW5kPW4uUkVDVCx0aGlzLmZhbWlseT1uLlBSSU1JVElWRSx0aGlzLnBhcmFtcz1bXSx0aGlzLnBhcmFtc1swXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoIngiKSx0aGlzLnBhcmFtc1sxXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoInkiKSx0aGlzLnBhcmFtc1syXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoIndpZHRoIiksdGhpcy5wYXJhbXNbM109dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJoZWlnaHQiKSx0aGlzLnBhcmFtc1syXTwwfHx0aGlzLnBhcmFtc1szXTwwKXRocm93InN2ZyBlcnJvcjogbmVnYXRpdmUgd2lkdGggb3IgaGVpZ2h0IGZvdW5kIHdoaWxlIHBhcnNpbmcgPHJlY3Q+In0sby5wcm90b3R5cGUucGFyc2VFbGxpcHNlPWZ1bmN0aW9uKGUpe3RoaXMua2luZD1uLkVMTElQU0UsdGhpcy5mYW1pbHk9bi5QUklNSVRJVkUsdGhpcy5wYXJhbXM9W10sdGhpcy5wYXJhbXNbMF09MHx0aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoImN4IiksdGhpcy5wYXJhbXNbMV09MHx0aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoImN5IikKdmFyIHQscgppZihlKXtpZih0PXI9dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJyIiksdDwwKXRocm93InN2ZyBlcnJvcjogbmVnYXRpdmUgcmFkaXVzIGZvdW5kIHdoaWxlIHBhcnNpbmcgPGNpcmNsZT4ifWVsc2UgaWYodD10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoInJ4Iikscj10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoInJ5IiksdDwwfHxyPDApdGhyb3cic3ZnIGVycm9yOiBuZWdhdGl2ZSB4LWF4aXMgcmFkaXVzIG9yIHktYXhpcyByYWRpdXMgZm91bmQgd2hpbGUgcGFyc2luZyA8ZWxsaXBzZT4iCnRoaXMucGFyYW1zWzBdLT10LHRoaXMucGFyYW1zWzFdLT1yLHRoaXMucGFyYW1zWzJdPTIqdCx0aGlzLnBhcmFtc1szXT0yKnJ9LG8ucHJvdG90eXBlLnBhcnNlTGluZT1mdW5jdGlvbigpe3RoaXMua2luZD1uLkxJTkUsdGhpcy5mYW1pbHk9bi5QUklNSVRJVkUsdGhpcy5wYXJhbXM9W10sdGhpcy5wYXJhbXNbMF09dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ4MSIpLHRoaXMucGFyYW1zWzFdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgieTEiKSx0aGlzLnBhcmFtc1syXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoIngyIiksdGhpcy5wYXJhbXNbM109dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ5MiIpfSxvLnByb3RvdHlwZS5wYXJzZUNvbG9ycz1mdW5jdGlvbihlKXtpZihlLmhhc0F0dHJpYnV0ZSgib3BhY2l0eSIpJiZ0aGlzLnNldE9wYWNpdHkoZS5nZXRBdHRyaWJ1dGUoIm9wYWNpdHkiKSksZS5oYXNBdHRyaWJ1dGUoInN0cm9rZSIpJiZ0aGlzLnNldFN0cm9rZShlLmdldEF0dHJpYnV0ZSgic3Ryb2tlIikpLGUuaGFzQXR0cmlidXRlKCJzdHJva2Utd2lkdGgiKSYmdGhpcy5zZXRTdHJva2VXZWlnaHQoZS5nZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIpKSxlLmhhc0F0dHJpYnV0ZSgic3Ryb2tlLWxpbmVqb2luIikmJnRoaXMuc2V0U3Ryb2tlSm9pbihlLmdldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVqb2luIikpLGUuaGFzQXR0cmlidXRlKCJzdHJva2UtbGluZWNhcCIpJiZ0aGlzLnNldFN0cm9rZUNhcChlLmdldFN0cmluZ0F0dHJpYnV0ZSgic3Ryb2tlLWxpbmVjYXAiKSksZS5oYXNBdHRyaWJ1dGUoImZpbGwiKSYmdGhpcy5zZXRGaWxsKGUuZ2V0U3RyaW5nQXR0cmlidXRlKCJmaWxsIikpLGUuaGFzQXR0cmlidXRlKCJzdHlsZSIpKWZvcih2YXIgbj1lLmdldFN0cmluZ0F0dHJpYnV0ZSgic3R5bGUiKSxyPW4udG9TdHJpbmcoKS5zcGxpdCgiOyIpLGk9MCxzPXIubGVuZ3RoO2k8cztpKyspe3ZhciBvPXQudHJpbShyW2ldLnNwbGl0KCI6IikpCiJmaWxsIj09PW9bMF0/dGhpcy5zZXRGaWxsKG9bMV0pOiJmaWxsLW9wYWNpdHkiPT09b1swXT90aGlzLnNldEZpbGxPcGFjaXR5KG9bMV0pOiJzdHJva2UiPT09b1swXT90aGlzLnNldFN0cm9rZShvWzFdKToic3Ryb2tlLXdpZHRoIj09PW9bMF0/dGhpcy5zZXRTdHJva2VXZWlnaHQob1sxXSk6InN0cm9rZS1saW5lY2FwIj09PW9bMF0/dGhpcy5zZXRTdHJva2VDYXAob1sxXSk6InN0cm9rZS1saW5lam9pbiI9PT1vWzBdP3RoaXMuc2V0U3Ryb2tlSm9pbihvWzFdKToic3Ryb2tlLW9wYWNpdHkiPT09b1swXT90aGlzLnNldFN0cm9rZU9wYWNpdHkob1sxXSk6Im9wYWNpdHkiPT09b1swXSYmdGhpcy5zZXRPcGFjaXR5KG9bMV0pfX0sby5wcm90b3R5cGUuc2V0RmlsbE9wYWNpdHk9ZnVuY3Rpb24oZSl7dGhpcy5maWxsT3BhY2l0eT1wYXJzZUZsb2F0KGUpLHRoaXMuZmlsbENvbG9yPTI1NSp0aGlzLmZpbGxPcGFjaXR5PDwyNHwxNjc3NzIxNSZ0aGlzLmZpbGxDb2xvcn0sby5wcm90b3R5cGUuc2V0RmlsbD1mdW5jdGlvbihlKXt2YXIgdD00Mjc4MTkwMDgwJnRoaXMuZmlsbENvbG9yCiJub25lIj09PWU/dGhpcy5maWxsPSExOjA9PT1lLmluZGV4T2YoIiMiKT8odGhpcy5maWxsPSEwLDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC8jKC4pKC4pKC4pLywiIyQxJDEkMiQyJDMkMyIpKSx0aGlzLmZpbGxDb2xvcj10fDE2Nzc3MjE1JnBhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDE2KSk6MD09PWUuaW5kZXhPZigicmdiIik/KHRoaXMuZmlsbD0hMCx0aGlzLmZpbGxDb2xvcj10fHRoaXMucGFyc2VSR0IoZSkpOjA9PT1lLmluZGV4T2YoInVybCgjIik/dGhpcy5maWxsTmFtZT1lLnN1YnN0cmluZyg1LGUubGVuZ3RoLTEpOnNbZV0mJih0aGlzLmZpbGw9ITAsdGhpcy5maWxsQ29sb3I9dHwxNjc3NzIxNSZwYXJzZUludChzW2VdLnN1YnN0cmluZygxKSwxNikpfSxvLnByb3RvdHlwZS5zZXRPcGFjaXR5PWZ1bmN0aW9uKGUpe3RoaXMuc3Ryb2tlQ29sb3I9MjU1KnBhcnNlRmxvYXQoZSk8PDI0fDE2Nzc3MjE1JnRoaXMuc3Ryb2tlQ29sb3IsdGhpcy5maWxsQ29sb3I9MjU1KnBhcnNlRmxvYXQoZSk8PDI0fDE2Nzc3MjE1JnRoaXMuZmlsbENvbG9yfSxvLnByb3RvdHlwZS5zZXRTdHJva2U9ZnVuY3Rpb24oZSl7dmFyIHQ9NDI3ODE5MDA4MCZ0aGlzLnN0cm9rZUNvbG9yCiJub25lIj09PWU/dGhpcy5zdHJva2U9ITE6IiMiPT09ZS5jaGFyQXQoMCk/KHRoaXMuc3Ryb2tlPSEwLDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC8jKC4pKC4pKC4pLywiIyQxJDEkMiQyJDMkMyIpKSx0aGlzLnN0cm9rZUNvbG9yPXR8MTY3NzcyMTUmcGFyc2VJbnQoZS5zdWJzdHJpbmcoMSksMTYpKTowPT09ZS5pbmRleE9mKCJyZ2IiKT8odGhpcy5zdHJva2U9ITAsdGhpcy5zdHJva2VDb2xvcj10fHRoaXMucGFyc2VSR0IoZSkpOjA9PT1lLmluZGV4T2YoInVybCgjIik/dGhpcy5zdHJva2VOYW1lPWUuc3Vic3RyaW5nKDUsZS5sZW5ndGgtMSk6c1tlXSYmKHRoaXMuc3Ryb2tlPSEwLHRoaXMuc3Ryb2tlQ29sb3I9dHwxNjc3NzIxNSZwYXJzZUludChzW2VdLnN1YnN0cmluZygxKSwxNikpfSxvLnByb3RvdHlwZS5zZXRTdHJva2VXZWlnaHQ9ZnVuY3Rpb24oZSl7dGhpcy5zdHJva2VXZWlnaHQ9dGhpcy5wYXJzZVVuaXRTaXplKGUpfSxvLnByb3RvdHlwZS5zZXRTdHJva2VKb2luPWZ1bmN0aW9uKGUpeyJtaXRlciI9PT1lP3RoaXMuc3Ryb2tlSm9pbj1uLk1JVEVSOiJyb3VuZCI9PT1lP3RoaXMuc3Ryb2tlSm9pbj1uLlJPVU5EOiJiZXZlbCI9PT1lJiYodGhpcy5zdHJva2VKb2luPW4uQkVWRUwpfSxvLnByb3RvdHlwZS5zZXRTdHJva2VDYXA9ZnVuY3Rpb24oZSl7ImJ1dHQiPT09ZT90aGlzLnN0cm9rZUNhcD1uLlNRVUFSRToicm91bmQiPT09ZT90aGlzLnN0cm9rZUNhcD1uLlJPVU5EOiJzcXVhcmUiPT09ZSYmKHRoaXMuc3Ryb2tlQ2FwPW4uUFJPSkVDVCl9LG8ucHJvdG90eXBlLnNldFN0cm9rZU9wYWNpdHk9ZnVuY3Rpb24oZSl7dGhpcy5zdHJva2VPcGFjaXR5PXBhcnNlRmxvYXQoZSksdGhpcy5zdHJva2VDb2xvcj0yNTUqdGhpcy5zdHJva2VPcGFjaXR5PDwyNHwxNjc3NzIxNSZ0aGlzLnN0cm9rZUNvbG9yfSxvLnByb3RvdHlwZS5wYXJzZVJHQj1mdW5jdGlvbihlKXt2YXIgdD1lLnN1YnN0cmluZyhlLmluZGV4T2YoIigiKSsxLGUuaW5kZXhPZigiKSIpKSxuPXQuc3BsaXQoIiwgIikKcmV0dXJuIG5bMF08PDE2fG5bMV08PDh8blsyXX0sby5wcm90b3R5cGUucGFyc2VVbml0U2l6ZT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aC0yCnJldHVybiB0PDA/ZTplLmluZGV4T2YoInB0Iik9PT10PzEuMjUqcGFyc2VGbG9hdChlLnN1YnN0cmluZygwLHQpKTplLmluZGV4T2YoInBjIik9PT10PzE1KnBhcnNlRmxvYXQoZS5zdWJzdHJpbmcoMCx0KSk6ZS5pbmRleE9mKCJtbSIpPT09dD8zLjU0MzMwNypwYXJzZUZsb2F0KGUuc3Vic3RyaW5nKDAsdCkpOmUuaW5kZXhPZigiY20iKT09PXQ/MzUuNDMzMDcqcGFyc2VGbG9hdChlLnN1YnN0cmluZygwLHQpKTplLmluZGV4T2YoImluIik9PT10PzkwKnBhcnNlRmxvYXQoZS5zdWJzdHJpbmcoMCx0KSk6ZS5pbmRleE9mKCJweCIpPT09dD9wYXJzZUZsb2F0KGUuc3Vic3RyaW5nKDAsdCkpOnBhcnNlRmxvYXQoZSl9LG99fSx7fV0sMTg6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXt0aGlzLng9ZXx8MCx0aGlzLnk9dHx8MCx0aGlzLno9bnx8MH1mdW5jdGlvbiByKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3ZhciByPXQuZ2V0KCkKcmV0dXJuIHJbZV0obikscn19dmFyIGk9ZS5QQ29uc3RhbnRzCm4uZnJvbUFuZ2xlPWZ1bmN0aW9uKGUscil7cmV0dXJuIHIhPT10JiZudWxsIT09cnx8KHI9bmV3IG4pLHIueD1NYXRoLmNvcyhlKSxyLnk9TWF0aC5zaW4oZSkscn0sbi5yYW5kb20yRD1mdW5jdGlvbihlKXtyZXR1cm4gbi5mcm9tQW5nbGUoTWF0aC5yYW5kb20oKSppLlRXT19QSSxlKX0sbi5yYW5kb20zRD1mdW5jdGlvbihlKXt2YXIgcj1NYXRoLnJhbmRvbSgpKmkuVFdPX1BJLHM9MipNYXRoLnJhbmRvbSgpLTEsbz1NYXRoLnNxcnQoMS1zKnMpLGE9bypNYXRoLmNvcyhyKSxsPW8qTWF0aC5zaW4ocikKcmV0dXJuIGU9PT10fHxudWxsPT09ZT9lPW5ldyBuKGEsbCxzKTplLnNldChhLGwscyksZX0sbi5kaXN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZGlzdCh0KX0sbi5kb3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5kb3QodCl9LG4uY3Jvc3M9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jcm9zcyh0KX0sbi5zdWI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IG4oZS54LXQueCxlLnktdC55LGUuei10LnopfSxuLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmFjb3MoZS5kb3QodCkvTWF0aC5zcXJ0KGUubWFnU3EoKSp0Lm1hZ1NxKCkpKX0sbi5sZXJwPWZ1bmN0aW9uKGUsdCxyKXt2YXIgaT1uZXcgbihlLngsZS55LGUueikKcmV0dXJuIGkubGVycCh0LHIpLGl9LG4ucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pezE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuc2V0KGUueHx8ZVswXXx8MCxlLnl8fGVbMV18fDAsZS56fHxlWzJdfHwwKToodGhpcy54PWUsdGhpcy55PXQsdGhpcy56PW4pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy54LHRoaXMueSx0aGlzLnopfSxtYWc6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLngsdD10aGlzLnksbj10aGlzLnoKcmV0dXJuIE1hdGguc3FydChlKmUrdCp0K24qbil9LG1hZ1NxOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy54LHQ9dGhpcy55LG49dGhpcy56CnJldHVybiBlKmUrdCp0K24qbn0sc2V0TWFnOmZ1bmN0aW9uKGUsbil7aWYobiE9PXQpe3ZhciByPWUKcmV0dXJuIHIubm9ybWFsaXplKCksci5tdWx0KG4pLHJ9bj1lLHRoaXMubm9ybWFsaXplKCksdGhpcy5tdWx0KG4pfSxhZGQ6ZnVuY3Rpb24oZSx0LG4pezE9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLngrPWUueCx0aGlzLnkrPWUueSx0aGlzLnorPWUueik6Mj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMueCs9ZSx0aGlzLnkrPXQpOih0aGlzLngrPWUsdGhpcy55Kz10LHRoaXMueis9bil9LHN1YjpmdW5jdGlvbihlLHQsbil7MT09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMueC09ZS54LHRoaXMueS09ZS55LHRoaXMuei09ZS56KToyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy54LT1lLHRoaXMueS09dCk6KHRoaXMueC09ZSx0aGlzLnktPXQsdGhpcy56LT1uKX0sbXVsdDpmdW5jdGlvbihlKXsibnVtYmVyIj09dHlwZW9mIGU/KHRoaXMueCo9ZSx0aGlzLnkqPWUsdGhpcy56Kj1lKToodGhpcy54Kj1lLngsdGhpcy55Kj1lLnksdGhpcy56Kj1lLnopfSxkaXY6ZnVuY3Rpb24oZSl7Im51bWJlciI9PXR5cGVvZiBlPyh0aGlzLngvPWUsdGhpcy55Lz1lLHRoaXMuei89ZSk6KHRoaXMueC89ZS54LHRoaXMueS89ZS55LHRoaXMuei89ZS56KX0scm90YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMueCxuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSkKdGhpcy54PW4qdGhpcy54LXIqdGhpcy55LHRoaXMueT1yKnQrbip0aGlzLnl9LGRpc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy54LWUueCxuPXRoaXMueS1lLnkscj10aGlzLnotZS56CnJldHVybiBNYXRoLnNxcnQodCp0K24qbityKnIpfSxkb3Q6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLngqZS54K3RoaXMueSplLnkrdGhpcy56KmUuejp0aGlzLngqZSt0aGlzLnkqdCt0aGlzLnoqbn0sY3Jvc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy54LHI9dGhpcy55LGk9dGhpcy56CnJldHVybiBuZXcgbihyKmUuei1lLnkqaSxpKmUueC1lLnoqdCx0KmUueS1lLngqcil9LGxlcnA6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGkscyxvPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSsodC1lKSpufQoyPT09YXJndW1lbnRzLmxlbmd0aD8ocj10LGk9ZS54LHM9ZS55LG49ZS56KTooaT1lLHM9dCksdGhpcy54PW8odGhpcy54LGksciksdGhpcy55PW8odGhpcy55LHMsciksdGhpcy56PW8odGhpcy56LG4scil9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWFnKCkKZT4wJiZ0aGlzLmRpdihlKX0sbGltaXQ6ZnVuY3Rpb24oZSl7dGhpcy5tYWcoKT5lJiYodGhpcy5ub3JtYWxpemUoKSx0aGlzLm11bHQoZSkpfSxoZWFkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuLU1hdGguYXRhbjIoLXRoaXMueSx0aGlzLngpfSxoZWFkaW5nMkQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWFkaW5nKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIlsiK3RoaXMueCsiLCAiK3RoaXMueSsiLCAiK3RoaXMueisiXSJ9LGFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMueCx0aGlzLnksdGhpcy56XX19CmZvcih2YXIgcyBpbiBuLnByb3RvdHlwZSluLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShzKSYmIW4uaGFzT3duUHJvcGVydHkocykmJihuW3NdPXIocykpCnJldHVybiBufX0se31dLDE5OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLmZ1bGxOYW1lPWV8fCIiLHRoaXMubmFtZT10fHwiIix0aGlzLm5hbWVzcGFjZT1ufHwiIix0aGlzLnZhbHVlPXIsdGhpcy50eXBlPWl9CnJldHVybiBlLnByb3RvdHlwZT17Z2V0TmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LGdldEZ1bGxOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnVsbE5hbWV9LGdldE5hbWVzcGFjZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWVzcGFjZX0sZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9LHNldFZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZX19LGV9fSx7fV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLkJyb3dzZXIscj1uLmFqYXgsaT1uLndpbmRvdyxzPShpLlhNTEh0dHBSZXF1ZXN0LGkuRE9NUGFyc2VyKSxvPWUuWE1MQXR0cmlidXRlLGE9ZnVuY3Rpb24oZSxuLHIsaSl7dGhpcy5hdHRyaWJ1dGVzPVtdLHRoaXMuY2hpbGRyZW49W10sdGhpcy5mdWxsTmFtZT1udWxsLHRoaXMubmFtZT1udWxsLHRoaXMubmFtZXNwYWNlPSIiLHRoaXMuY29udGVudD1udWxsLHRoaXMucGFyZW50PW51bGwsdGhpcy5saW5lTnI9IiIsdGhpcy5zeXN0ZW1JRD0iIix0aGlzLnR5cGU9IkVMRU1FTlQiLGUmJigic3RyaW5nIj09dHlwZW9mIGU/bj09PXQmJmUuaW5kZXhPZigiPCIpPi0xP3RoaXMucGFyc2UoZSk6KHRoaXMuZnVsbE5hbWU9ZSx0aGlzLm5hbWVzcGFjZT1uLHRoaXMuc3lzdGVtSWQ9cix0aGlzLmxpbmVOcj1pKTp0aGlzLnBhcnNlKG4sITApKX0KcmV0dXJuIGEucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlLHQpe3ZhciBuCnRyeXt0JiYoZT1yKGUpKSxuPShuZXcgcykucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIikKdmFyIGk9bi5kb2N1bWVudEVsZW1lbnQKaWYoIWkpdGhyb3ciRXJyb3IgbG9hZGluZyBkb2N1bWVudCIKcmV0dXJuIHRoaXMucGFyc2VDaGlsZHJlblJlY3Vyc2l2ZShudWxsLGkpLHRoaXN9Y2F0Y2goZSl7dGhyb3cgZX19LHBhcnNlQ2hpbGRyZW5SZWN1cnNpdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxsLGgKaWYoZT8obj1uZXcgYSh0Lm5vZGVOYW1lKSxuLnBhcmVudD1lKToodGhpcy5mdWxsTmFtZT10LmxvY2FsTmFtZSx0aGlzLm5hbWU9dC5ub2RlTmFtZSxuPXRoaXMpLDM9PT10Lm5vZGVUeXBlJiYiIiE9PXQudGV4dENvbnRlbnQpcmV0dXJuIHRoaXMuY3JlYXRlUENEYXRhRWxlbWVudCh0LnRleHRDb250ZW50KQppZig0PT09dC5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jcmVhdGVDRGF0YUVsZW1lbnQodC50ZXh0Q29udGVudCkKaWYodC5hdHRyaWJ1dGVzKWZvcihzPTAsbD10LmF0dHJpYnV0ZXMubGVuZ3RoO3M8bDtzKyspaT10LmF0dHJpYnV0ZXNbc10scj1uZXcgbyhpLmdldG5hbWUsaS5ub2RlTmFtZSxpLm5hbWVzcGFjZVVSSSxpLm5vZGVWYWx1ZSxpLm5vZGVUeXBlKSxuLmF0dHJpYnV0ZXMucHVzaChyKQppZih0LmNoaWxkTm9kZXMpZm9yKHM9MCxsPXQuY2hpbGROb2Rlcy5sZW5ndGg7czxsO3MrKyl7dmFyIHU9dC5jaGlsZE5vZGVzW3NdCmg9bi5wYXJzZUNoaWxkcmVuUmVjdXJzaXZlKG4sdSksbnVsbCE9PWgmJm4uY2hpbGRyZW4ucHVzaChoKX1yZXR1cm4gbn0sY3JlYXRlRWxlbWVudDpmdW5jdGlvbihlLG4scixpKXtyZXR1cm4gcj09PXQ/bmV3IGEoZSxuKTpuZXcgYShlLG4scixpKX0sY3JlYXRlUENEYXRhRWxlbWVudDpmdW5jdGlvbihlLHQpe2lmKCIiPT09ZS5yZXBsYWNlKC9eXHMrJC9nLCIiKSlyZXR1cm4gbnVsbAp2YXIgbj1uZXcgYQpyZXR1cm4gbi50eXBlPSJURVhUIixuLmNvbnRlbnQ9ZSxufSxjcmVhdGVDRGF0YUVsZW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jcmVhdGVQQ0RhdGFFbGVtZW50KGUpCmlmKG51bGw9PT10KXJldHVybiBudWxsCnQudHlwZT0iQ0RBVEEiCnZhciBuLHI9eyI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwiJyI6IiZhcG9zOyIsJyInOiImcXVvdDsifQpmb3IobiBpbiByKU9iamVjdC5oYXNPd25Qcm9wZXJ0eShyLG4pfHwoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cChuLCJnIikscltuXSkpCnJldHVybiB0LmNkYXRhPWUsdH0saGFzQXR0cmlidXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP251bGwhPT10aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0pOjI9PT1hcmd1bWVudHMubGVuZ3RoP251bGwhPT10aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp2b2lkIDB9LGVxdWFsczpmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBhKSlyZXR1cm4hMQp2YXIgdCxuCmlmKHRoaXMuZnVsbE5hbWUhPT1lLmZ1bGxOYW1lKXJldHVybiExCmlmKHRoaXMuYXR0cmlidXRlcy5sZW5ndGghPT1lLmdldEF0dHJpYnV0ZUNvdW50KCkpcmV0dXJuITEKaWYodGhpcy5hdHRyaWJ1dGVzLmxlbmd0aCE9PWUuYXR0cmlidXRlcy5sZW5ndGgpcmV0dXJuITEKdmFyIHIsaSxzCmZvcih0PTAsbj10aGlzLmF0dHJpYnV0ZXMubGVuZ3RoO3Q8bjt0Kyspe2lmKHI9dGhpcy5hdHRyaWJ1dGVzW3RdLmdldE5hbWUoKSxpPXRoaXMuYXR0cmlidXRlc1t0XS5nZXROYW1lc3BhY2UoKSxzPWUuZmluZEF0dHJpYnV0ZShyLGkpLG51bGw9PT1zKXJldHVybiExCmlmKHRoaXMuYXR0cmlidXRlc1t0XS5nZXRWYWx1ZSgpIT09cy5nZXRWYWx1ZSgpKXJldHVybiExCmlmKHRoaXMuYXR0cmlidXRlc1t0XS5nZXRUeXBlKCkhPT1zLmdldFR5cGUoKSlyZXR1cm4hMX1pZih0aGlzLmNoaWxkcmVuLmxlbmd0aCE9PWUuZ2V0Q2hpbGRDb3VudCgpKXJldHVybiExCmlmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe3ZhciBvLGwKZm9yKHQ9MCxuPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0KyspaWYobz10aGlzLmdldENoaWxkKHQpLGw9ZS5nZXRDaGlsZCh0KSwhby5lcXVhbHMobCkpcmV0dXJuITEKcmV0dXJuITB9cmV0dXJuIHRoaXMuY29udGVudD09PWUuY29udGVudH0sZ2V0Q29udGVudDpmdW5jdGlvbigpe2lmKCJURVhUIj09PXRoaXMudHlwZXx8IkNEQVRBIj09PXRoaXMudHlwZSlyZXR1cm4gdGhpcy5jb250ZW50CnZhciBlPXRoaXMuY2hpbGRyZW4KcmV0dXJuIDEhPT1lLmxlbmd0aHx8IlRFWFQiIT09ZVswXS50eXBlJiYiQ0RBVEEiIT09ZVswXS50eXBlP251bGw6ZVswXS5jb250ZW50fSxnZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXt2YXIgZQpyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dGhpcy5maW5kQXR0cmlidXRlKGFyZ3VtZW50c1swXSksZT9lLmdldFZhbHVlKCk6YXJndW1lbnRzWzFdKToxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10aGlzLmZpbmRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdKSxlP2UuZ2V0VmFsdWUoKTpudWxsKTozPT09YXJndW1lbnRzLmxlbmd0aD8oZT10aGlzLmZpbmRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSksZT9lLmdldFZhbHVlKCk6YXJndW1lbnRzWzJdKTp2b2lkIDB9LGdldFN0cmluZ0F0dHJpYnV0ZTpmdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0pOjI9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnRoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKX0sZ2V0U3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZShlKX0sZ2V0RmxvYXRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/cGFyc2VGbG9hdCh0aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sMCkpOjI9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnRoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKX0sZ2V0RmxvYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0RmxvYXRBdHRyaWJ1dGUoZSl9LGdldEludEF0dHJpYnV0ZTpmdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sMCk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pfSxnZXRJbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0SW50QXR0cmlidXRlKGUpfSxoYXNDaGlsZHJlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD4wfSxhZGRDaGlsZDpmdW5jdGlvbihlKXtudWxsIT09ZSYmKGUucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKGUpKX0saW5zZXJ0Q2hpbGQ6ZnVuY3Rpb24oZSx0KXtpZihlKXtpZihudWxsPT09ZS5nZXRMb2NhbE5hbWUoKSYmIXRoaXMuaGFzQ2hpbGRyZW4oKSl7dmFyIG49dGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aC0xXQppZihudWxsPT09bi5nZXRMb2NhbE5hbWUoKSlyZXR1cm4gdm9pZCBuLnNldENvbnRlbnQobi5nZXRDb250ZW50KCkrZS5nZXRDb250ZW50KCkpfWUucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5zcGxpY2UodCwwLGUpfX0sZ2V0Q2hpbGQ6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiB0aGlzLmNoaWxkcmVuW2VdCmlmKGUuaW5kZXhPZigiLyIpIT09LTEpcmV0dXJuIHRoaXMuZ2V0Q2hpbGRSZWN1cnNpdmUoZS5zcGxpdCgiLyIpLDApCmZvcih2YXIgdCxuLHI9MCxpPXRoaXMuZ2V0Q2hpbGRDb3VudCgpO3I8aTtyKyspaWYodD10aGlzLmdldENoaWxkKHIpLG49dC5nZXROYW1lKCksbnVsbCE9PW4mJm49PT1lKXJldHVybiB0CnJldHVybiBudWxsfSxnZXRDaGlsZHJlbjpmdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSlyZXR1cm4gdGhpcy5nZXRDaGlsZChhcmd1bWVudHNbMF0pCmlmKGFyZ3VtZW50c1swXS5pbmRleE9mKCIvIikhPT0tMSlyZXR1cm4gdGhpcy5nZXRDaGlsZHJlblJlY3Vyc2l2ZShhcmd1bWVudHNbMF0uc3BsaXQoIi8iKSwwKQpmb3IodmFyIGUsdCxuPVtdLHI9MCxpPXRoaXMuZ2V0Q2hpbGRDb3VudCgpO3I8aTtyKyspZT10aGlzLmdldENoaWxkKHIpLHQ9ZS5nZXROYW1lKCksbnVsbCE9PXQmJnQ9PT1hcmd1bWVudHNbMF0mJm4ucHVzaChlKQpyZXR1cm4gbn1yZXR1cm4gdGhpcy5jaGlsZHJlbn0sZ2V0Q2hpbGRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aH0sZ2V0Q2hpbGRSZWN1cnNpdmU6ZnVuY3Rpb24oZSx0KXtpZih0PT09ZS5sZW5ndGgpcmV0dXJuIHRoaXMKZm9yKHZhciBuLHIsaT1lW3RdLHM9MCxvPXRoaXMuZ2V0Q2hpbGRDb3VudCgpO3M8bztzKyspaWYobj10aGlzLmdldENoaWxkKHMpLHI9bi5nZXROYW1lKCksbnVsbCE9PXImJnI9PT1pKXJldHVybiBuLmdldENoaWxkUmVjdXJzaXZlKGUsdCsxKQpyZXR1cm4gbnVsbH0sZ2V0Q2hpbGRyZW5SZWN1cnNpdmU6ZnVuY3Rpb24oZSx0KXtpZih0PT09ZS5sZW5ndGgtMSlyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbihlW3RdKQpmb3IodmFyIG49dGhpcy5nZXRDaGlsZHJlbihlW3RdKSxyPVtdLGk9MDtpPG4ubGVuZ3RoO2krKylyPXIuY29uY2F0KG5baV0uZ2V0Q2hpbGRyZW5SZWN1cnNpdmUoZSx0KzEpKQpyZXR1cm4gcn0saXNMZWFmOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaGFzQ2hpbGRyZW4oKX0sbGlzdENoaWxkcmVuOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0KyspZS5wdXNoKHRoaXMuZ2V0Q2hpbGQodCkuZ2V0TmFtZSgpKQpyZXR1cm4gZX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5uYW1lc3BhY2U9dHx8IiIKZm9yKHZhciBuPTAscj10aGlzLmF0dHJpYnV0ZXMubGVuZ3RoO248cjtuKyspaWYodGhpcy5hdHRyaWJ1dGVzW25dLmdldE5hbWUoKT09PWUmJnRoaXMuYXR0cmlidXRlc1tuXS5nZXROYW1lc3BhY2UoKT09PXRoaXMubmFtZXNwYWNlKXt0aGlzLmF0dHJpYnV0ZXMuc3BsaWNlKG4sMSkKYnJlYWt9fSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgdD0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7dDxuO3QrKylpZih0aGlzLmNoaWxkcmVuW3RdLmVxdWFscyhlKSl7dGhpcy5jaGlsZHJlbi5zcGxpY2UodCwxKQpicmVha319LHJlbW92ZUNoaWxkQXRJbmRleDpmdW5jdGlvbihlKXt0aGlzLmNoaWxkcmVuLmxlbmd0aD5lJiZ0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpfSxmaW5kQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5uYW1lc3BhY2U9dHx8IiIKZm9yKHZhciBuPTAscj10aGlzLmF0dHJpYnV0ZXMubGVuZ3RoO248cjtuKyspaWYodGhpcy5hdHRyaWJ1dGVzW25dLmdldE5hbWUoKT09PWUmJnRoaXMuYXR0cmlidXRlc1tuXS5nZXROYW1lc3BhY2UoKT09PXRoaXMubmFtZXNwYWNlKXJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbl0KcmV0dXJuIG51bGx9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbigpe3ZhciBlCmlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0uaW5kZXhPZigiOiIpLG49YXJndW1lbnRzWzBdLnN1YnN0cmluZyh0KzEpCmU9dGhpcy5maW5kQXR0cmlidXRlKG4sYXJndW1lbnRzWzFdKSxlP2Uuc2V0VmFsdWUoYXJndW1lbnRzWzJdKTooZT1uZXcgbyhhcmd1bWVudHNbMF0sbixhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLCJDREFUQSIpLHRoaXMuYXR0cmlidXRlcy5wdXNoKGUpKX1lbHNlIGU9dGhpcy5maW5kQXR0cmlidXRlKGFyZ3VtZW50c1swXSksZT9lLnNldFZhbHVlKGFyZ3VtZW50c1sxXSk6KGU9bmV3IG8oYXJndW1lbnRzWzBdLGFyZ3VtZW50c1swXSxudWxsLGFyZ3VtZW50c1sxXSwiQ0RBVEEiKSx0aGlzLmF0dHJpYnV0ZXMucHVzaChlKSl9LHNldFN0cmluZzpmdW5jdGlvbihlLHQpe3RoaXMuc2V0QXR0cmlidXRlKGUsdCl9LHNldEludDpmdW5jdGlvbihlLHQpe3RoaXMuc2V0QXR0cmlidXRlKGUsdCl9LHNldEZsb2F0OmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXRBdHRyaWJ1dGUoZSx0KX0sc2V0Q29udGVudDpmdW5jdGlvbihlKXt0aGlzLmNoaWxkcmVuLmxlbmd0aD4wJiZQcm9jZXNzaW5nLmRlYnVnKCJUcmllZCB0byBzZXQgY29udGVudCBmb3IgWE1MRWxlbWVudCB3aXRoIGNoaWxkcmVuIiksdGhpcy5jb250ZW50PWV9LHNldE5hbWU6ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLm5hbWU9YXJndW1lbnRzWzBdLHRoaXMuZnVsbE5hbWU9YXJndW1lbnRzWzBdLHRoaXMubmFtZXNwYWNlPW51bGwKZWxzZXt2YXIgZT1hcmd1bWVudHNbMF0uaW5kZXhPZigiOiIpCm51bGw9PT1hcmd1bWVudHNbMV18fGU8MD90aGlzLm5hbWU9YXJndW1lbnRzWzBdOnRoaXMubmFtZT1hcmd1bWVudHNbMF0uc3Vic3RyaW5nKGUrMSksdGhpcy5mdWxsTmFtZT1hcmd1bWVudHNbMF0sdGhpcy5uYW1lc3BhY2U9YXJndW1lbnRzWzFdfX0sZ2V0TmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZ1bGxOYW1lfSxnZXRMb2NhbE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lfSxnZXRBdHRyaWJ1dGVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RofSx0b1N0cmluZzpmdW5jdGlvbigpe2lmKCJURVhUIj09PXRoaXMudHlwZSlyZXR1cm4gdGhpcy5jb250ZW50fHwiIgppZigiQ0RBVEEiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLmNkYXRhfHwiIgp2YXIgZSx0LG49dGhpcy5mdWxsTmFtZSxyPSI8IituCmZvcihlPTA7ZTx0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5hdHRyaWJ1dGVzW2VdCnIrPSIgIitpLmdldE5hbWUoKSsnPSInK2kuZ2V0VmFsdWUoKSsnIid9aWYoMD09PXRoaXMuY2hpbGRyZW4ubGVuZ3RoKXIrPSIiPT09dGhpcy5jb250ZW50fHxudWxsPT09dGhpcy5jb250ZW50fHx2b2lkIDA9PT10aGlzLmNvbnRlbnQ/Ii8+IjoiPiIrdGhpcy5jb250ZW50KyI8LyIrbisiPiIKZWxzZXtmb3Iocis9Ij4iLHQ9MDt0PHRoaXMuY2hpbGRyZW4ubGVuZ3RoO3QrKylyKz10aGlzLmNoaWxkcmVuW3RdLnRvU3RyaW5nKCkKcis9IjwvIituKyI+In1yZXR1cm4gcn19LGEucGFyc2U9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IGEKcmV0dXJuIHQucGFyc2UoZSksdH0sYX19LHt9XSwyMTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZDgiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkODcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIifX0se31dLDIyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocixpKXtyLl9fY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/ZS5jb250YWlucy5hcHBseShlLGkoYXJndW1lbnRzKSk6bnVsbCE9PWUmJm51bGwhPT10JiYic3RyaW5nIj09dHlwZW9mIHQmJmUuaW5kZXhPZih0KT4tMX0sci5fX3JlcGxhY2VBbGw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9lLnJlcGxhY2VBbGwuYXBwbHkoZSxpKGFyZ3VtZW50cykpOmUucmVwbGFjZShuZXcgUmVnRXhwKHQsImciKSxuKX0sci5fX3JlcGxhY2VGaXJzdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2UucmVwbGFjZUZpcnN0LmFwcGx5KGUsaShhcmd1bWVudHMpKTplLnJlcGxhY2UobmV3IFJlZ0V4cCh0LCIiKSxuKX0sci5fX3JlcGxhY2U9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZS5yZXBsYWNlLmFwcGx5KGUsaShhcmd1bWVudHMpKQppZih0IGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiBlLnJlcGxhY2UodCxuKQppZigic3RyaW5nIiE9dHlwZW9mIHQmJih0PXQudG9TdHJpbmcoKSksIiI9PT10KXJldHVybiBlCnZhciByPWUuaW5kZXhPZih0KQppZihyPDApcmV0dXJuIGUKdmFyIHM9MCxvPSIiCmRvIG8rPWUuc3Vic3RyaW5nKHMscikrbixzPXIrdC5sZW5ndGgKd2hpbGUoKHI9ZS5pbmRleE9mKHQscykpPj0wKQpyZXR1cm4gbytlLnN1YnN0cmluZyhzKX0sci5fX2VxdWFscz1mdW5jdGlvbihlLG4pe3JldHVybiBlLmVxdWFscyBpbnN0YW5jZW9mIEZ1bmN0aW9uP2UuZXF1YWxzLmFwcGx5KGUsaShhcmd1bWVudHMpKTp0KGUsbil9LHIuX19lcXVhbHNJZ25vcmVDYXNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2UuZXF1YWxzSWdub3JlQ2FzZS5hcHBseShlLGkoYXJndW1lbnRzKSk6ZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfSxyLl9fdG9DaGFyQXJyYXk9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlLnRvQ2hhckFycmF5LmFwcGx5KGUsaShhcmd1bWVudHMpKQpmb3IodmFyIHQ9W10sbj0wLHI9ZS5sZW5ndGg7bjxyOysrbil0W25dPW5ldyBDaGFyKGUuY2hhckF0KG4pKQpyZXR1cm4gdH0sci5fX3NwbGl0PWZ1bmN0aW9uKGUsdCxyKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGUuc3BsaXQuYXBwbHkoZSxpKGFyZ3VtZW50cykpCnZhciBzPW5ldyBSZWdFeHAodCkKaWYocj09PW58fHI8MSlyZXR1cm4gZS5zcGxpdChzKQpmb3IodmFyIG8sYT1bXSxsPWU7KG89bC5zZWFyY2gocykpIT09LTEmJmEubGVuZ3RoPHItMTspe3ZhciBoPXMuZXhlYyhsKS50b1N0cmluZygpCmEucHVzaChsLnN1YnN0cmluZygwLG8pKSxsPWwuc3Vic3RyaW5nKG8raC5sZW5ndGgpfXJldHVybiBvPT09LTEmJiIiPT09bHx8YS5wdXNoKGwpLGF9LHIuX19jb2RlUG9pbnRBdD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLmNoYXJDb2RlQXQodCkKcmV0dXJuIDU1Mjk2PD1pJiZpPD01NjMxOT8obj1pLHI9ZS5jaGFyQ29kZUF0KHQrMSksMTAyNCoobi01NTI5NikrKHItNTYzMjApKzY1NTM2KTppfSxyLl9fbWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUmVnRXhwKHQpLnRlc3QoZSl9LHIuX19zdGFydHNXaXRoPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/ZS5zdGFydHNXaXRoLmFwcGx5KGUsaShhcmd1bWVudHMpKToobj1ufHwwLCEobjwwfHxuPmUubGVuZ3RoKSYmKCIiPT09dHx8dD09PWV8fGUuaW5kZXhPZih0KT09PW4pKX0sci5fX2VuZHNXaXRoPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlLmVuZHNXaXRoLmFwcGx5KGUsaShhcmd1bWVudHMpKQp2YXIgbj10P3QubGVuZ3RoOjAKcmV0dXJuIiI9PT10fHx0PT09ZXx8ZS5pbmRleE9mKHQpPT09ZS5sZW5ndGgtbn0sci5fX2hhc2hDb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0Lmhhc2hDb2RlIGluc3RhbmNlb2YgRnVuY3Rpb24/dC5oYXNoQ29kZS5hcHBseSh0LGkoYXJndW1lbnRzKSk6ZSh0KX0sci5fX3ByaW50U3RhY2tUcmFjZT1mdW5jdGlvbihlKXtyLnByaW50bG4oIkV4Y2VwdGlvbjogIitlLnRvU3RyaW5nKCkpfX19fSx7fV0sMjM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7dmFyIG49ZXx8MzYyNDM2MDY5LHI9dHx8NTIxMjg4NjI5LGk9ZnVuY3Rpb24oKXtyZXR1cm4gbj0zNjk2OSooNjU1MzUmbikrKG4+Pj4xNikmNDI5NDk2NzI5NSxyPTE4ZTMqKDY1NTM1JnIpKyhyPj4+MTYpJjQyOTQ5NjcyOTUsNDI5NDk2NzI5NSYoKDY1NTM1Jm4pPDwxNnw2NTUzNSZyKX0KdGhpcy5kb3VibGVHZW5lcmF0b3I9ZnVuY3Rpb24oKXt2YXIgZT1pKCkvNDI5NDk2NzI5NgpyZXR1cm4gZTwwPzErZTplfSx0aGlzLmludEdlbmVyYXRvcj1pfWZ1bmN0aW9uIHIoZSl7ZnVuY3Rpb24gcihlLHQsbixyKXt2YXIgaT0xNSZlLHM9aTw4P3Q6bixvPWk8ND9uOjEyPT09aXx8MTQ9PT1pP3Q6cgpyZXR1cm4oMD09PSgxJmkpP3M6LXMpKygwPT09KDImaSk/bzotbyl9ZnVuY3Rpb24gaShlLHQsbil7dmFyIHI9MD09PSgxJmUpP3Q6bgpyZXR1cm4gMD09PSgyJmUpPy1yOnJ9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiAwPT09KDEmZSk/LXQ6dH1mdW5jdGlvbiBvKGUsdCxuKXtyZXR1cm4gdCtlKihuLXQpfXZhciBhLGwsaD1lIT09dD9uZXcgbihlLChlPDwxNikrKGU+PjE2KSk6bi5jcmVhdGVSYW5kb21pemVkKCksdT1uZXcgVWludDhBcnJheSg1MTIpCmZvcihhPTA7YTwyNTY7KythKXVbYV09YQpmb3IoYT0wO2E8MjU2OysrYSl7dmFyIGM9dVtsPTI1NSZoLmludEdlbmVyYXRvcigpXQp1W2xdPXVbYV0sdVthXT1jfWZvcihhPTA7YTwyNTY7KythKXVbYSsyNTZdPXVbYV0KdGhpcy5ub2lzZTNkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT0yNTUmTWF0aC5mbG9vcihlKSxzPTI1NSZNYXRoLmZsb29yKHQpLGE9MjU1Jk1hdGguZmxvb3IobikKZS09TWF0aC5mbG9vcihlKSx0LT1NYXRoLmZsb29yKHQpLG4tPU1hdGguZmxvb3IobikKdmFyIGw9KDMtMiplKSplKmUsaD0oMy0yKnQpKnQqdCxjPSgzLTIqbikqbipuLGY9dVtpXStzLHA9dVtmXSthLG09dVtmKzFdK2EsZz11W2krMV0rcyxkPXVbZ10rYSx2PXVbZysxXSthCnJldHVybiBvKGMsbyhoLG8obCxyKHVbcF0sZSx0LG4pLHIodVtkXSxlLTEsdCxuKSksbyhsLHIodVttXSxlLHQtMSxuKSxyKHVbdl0sZS0xLHQtMSxuKSkpLG8oaCxvKGwscih1W3ArMV0sZSx0LG4tMSkscih1W2QrMV0sZS0xLHQsbi0xKSksbyhsLHIodVttKzFdLGUsdC0xLG4tMSkscih1W3YrMV0sZS0xLHQtMSxuLTEpKSkpfSx0aGlzLm5vaXNlMmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yNTUmTWF0aC5mbG9vcihlKSxyPTI1NSZNYXRoLmZsb29yKHQpCmUtPU1hdGguZmxvb3IoZSksdC09TWF0aC5mbG9vcih0KQp2YXIgcz0oMy0yKmUpKmUqZSxhPSgzLTIqdCkqdCp0LGw9dVtuXStyLGg9dVtuKzFdK3IKcmV0dXJuIG8oYSxvKHMsaSh1W2xdLGUsdCksaSh1W2hdLGUtMSx0KSksbyhzLGkodVtsKzFdLGUsdC0xKSxpKHVbaCsxXSxlLTEsdC0xKSkpfSx0aGlzLm5vaXNlMWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9MjU1Jk1hdGguZmxvb3IoZSkKZS09TWF0aC5mbG9vcihlKQp2YXIgbj0oMy0yKmUpKmUqZQpyZXR1cm4gbyhuLHModVt0XSxlKSxzKHVbdCsxXSxlLTEpKX19dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yYW5kb20oKX0KZS5hYnM9TWF0aC5hYnMsZS5jZWlsPU1hdGguY2VpbCxlLmV4cD1NYXRoLmV4cCxlLmZsb29yPU1hdGguZmxvb3IsZS5sb2c9TWF0aC5sb2csZS5wb3c9TWF0aC5wb3csZS5yb3VuZD1NYXRoLnJvdW5kLGUuc3FydD1NYXRoLnNxcnQsZS5hY29zPU1hdGguYWNvcyxlLmFzaW49TWF0aC5hc2luLGUuYXRhbj1NYXRoLmF0YW4sZS5hdGFuMj1NYXRoLmF0YW4yLGUuY29zPU1hdGguY29zLGUuc2luPU1hdGguc2luLGUudGFuPU1hdGgudGFuLGUuY29uc3RyYWluPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT5uP246ZTx0P3Q6ZX0sZS5kaXN0PWZ1bmN0aW9uKCl7dmFyIGUsdCxuCnJldHVybiA0PT09YXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHNbMF0tYXJndW1lbnRzWzJdLHQ9YXJndW1lbnRzWzFdLWFyZ3VtZW50c1szXSxNYXRoLnNxcnQoZSplK3QqdCkpOjY9PT1hcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50c1swXS1hcmd1bWVudHNbM10sdD1hcmd1bWVudHNbMV0tYXJndW1lbnRzWzRdLG49YXJndW1lbnRzWzJdLWFyZ3VtZW50c1s1XSxNYXRoLnNxcnQoZSplK3QqdCtuKm4pKTp2b2lkIDB9LGUubGVycD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKHQtZSkqbitlfSxlLm1hZz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/TWF0aC5zcXJ0KGUqZSt0KnQrbipuKTpNYXRoLnNxcnQoZSplK3QqdCl9LGUubWFwPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIHIrKGktcikqKChlLXQpLyhuLXQpKX0sZS5tYXg9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYXJndW1lbnRzWzBdPGFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06YXJndW1lbnRzWzBdCnZhciBlPTE9PT1hcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTphcmd1bWVudHMKaWYoISgibGVuZ3RoImluIGUmJmUubGVuZ3RoPjApKXRocm93Ik5vbi1lbXB0eSBhcnJheSBpcyBleHBlY3RlZCIKZm9yKHZhciB0PWVbMF0sbj1lLmxlbmd0aCxyPTE7cjxuOysrcil0PGVbcl0mJih0PWVbcl0pCnJldHVybiB0fSxlLm1pbj1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBhcmd1bWVudHNbMF08YXJndW1lbnRzWzFdP2FyZ3VtZW50c1swXTphcmd1bWVudHNbMV0KdmFyIGU9MT09PWFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOmFyZ3VtZW50cwppZighKCJsZW5ndGgiaW4gZSYmZS5sZW5ndGg+MCkpdGhyb3ciTm9uLWVtcHR5IGFycmF5IGlzIGV4cGVjdGVkIgpmb3IodmFyIHQ9ZVswXSxuPWUubGVuZ3RoLHI9MTtyPG47KytyKXQ+ZVtyXSYmKHQ9ZVtyXSkKcmV0dXJuIHR9LGUubm9ybT1mdW5jdGlvbihlLHQsbil7cmV0dXJuKGUtdCkvKG4tdCl9LGUuc3E9ZnVuY3Rpb24oZSl7cmV0dXJuIGUqZX0sZS5kZWdyZWVzPWZ1bmN0aW9uKGUpe3JldHVybiAxODAqZS9NYXRoLlBJfSxlLnJhbmRvbT1mdW5jdGlvbihlLHQpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0PTEsZT0wKToxPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9ZSxlPTApLGU9PT10KXJldHVybiBlCmZvcih2YXIgbj0wO248MTAwO24rKyl7dmFyIHI9aSgpLHM9cioodC1lKStlCmlmKHMhPT10KXJldHVybiBzfXJldHVybiBlfSxuLmNyZWF0ZVJhbmRvbWl6ZWQ9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgRGF0ZQpyZXR1cm4gbmV3IG4oZS82ZTQmNDI5NDk2NzI5NSw0Mjk0OTY3Mjk1JmUpfSxlLnJhbmRvbVNlZWQ9ZnVuY3Rpb24oZSl7aT1uZXcgbihlLChlPDwxNikrKGU+PjE2KSkuZG91YmxlR2VuZXJhdG9yLHRoaXMuaGF2ZU5leHROZXh0R2F1c3NpYW49ITF9LGUucmFuZG9tR2F1c3NpYW49ZnVuY3Rpb24oKXtpZih0aGlzLmhhdmVOZXh0TmV4dEdhdXNzaWFuKXJldHVybiB0aGlzLmhhdmVOZXh0TmV4dEdhdXNzaWFuPSExLHRoaXMubmV4dE5leHRHYXVzc2lhbgp2YXIgZSx0LG4KZG8gZT0yKmkoKS0xLHQ9MippKCktMSxuPWUqZSt0KnQKd2hpbGUobj49MXx8MD09PW4pCnZhciByPU1hdGguc3FydCgtMipNYXRoLmxvZyhuKS9uKQpyZXR1cm4gdGhpcy5uZXh0TmV4dEdhdXNzaWFuPXQqcix0aGlzLmhhdmVOZXh0TmV4dEdhdXNzaWFuPSEwLGUqcn0KdmFyIHM9e2dlbmVyYXRvcjp0LG9jdGF2ZXM6NCxmYWxsb3V0Oi41LHNlZWQ6dH0KZS5ub2lzZT1mdW5jdGlvbihlLG4saSl7cy5nZW5lcmF0b3I9PT10JiYocy5nZW5lcmF0b3I9bmV3IHIocy5zZWVkKSkKZm9yKHZhciBvPXMuZ2VuZXJhdG9yLGE9MSxsPTEsaD0wLHU9MDt1PHMub2N0YXZlczsrK3Upe3N3aXRjaChhKj1zLmZhbGxvdXQsYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOmgrPWEqKDErby5ub2lzZTFkKGwqZSkpLzIKYnJlYWsKY2FzZSAyOmgrPWEqKDErby5ub2lzZTJkKGwqZSxsKm4pKS8yCmJyZWFrCmNhc2UgMzpoKz1hKigxK28ubm9pc2UzZChsKmUsbCpuLGwqaSkpLzJ9bCo9Mn1yZXR1cm4gaH0sZS5ub2lzZURldGFpbD1mdW5jdGlvbihlLG4pe3Mub2N0YXZlcz1lLG4hPT10JiYocy5mYWxsb3V0PW4pfSxlLm5vaXNlU2VlZD1mdW5jdGlvbihlKXtzLnNlZWQ9ZSxzLmdlbmVyYXRvcj10fX19LHt9XSwyNDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD17dHJpbTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKGVbbl0ucmVwbGFjZSgvXlxzKi8sIiIpLnJlcGxhY2UoL1xzKiQvLCIiKS5yZXBsYWNlKC9cciokLywiIikpCnJldHVybiB0fXJldHVybiBlLnJlcGxhY2UoL15ccyovLCIiKS5yZXBsYWNlKC9ccyokLywiIikucmVwbGFjZSgvXHIqJC8sIiIpfSxyYWRpYW5zOmZ1bmN0aW9uKGUpe3JldHVybiBlLzE4MCpNYXRoLlBJfSxuZkNvcmVTY2FsYXI6ZnVuY3Rpb24odCxuLHIsaSxzLG8pe3ZhciBhPXQ8MD9yOm4sbD0wPT09cyxoPXM9PT1lfHxzPDA/MDpzLHU9TWF0aC5hYnModCkKaWYobClmb3IoaD0xLHUqPTEwO01hdGguYWJzKE1hdGgucm91bmQodSktdSk+MWUtNiYmaDw3OykrK2gsdSo9MTAKZWxzZSAwIT09aCYmKHUqPU1hdGgucG93KDEwLGgpKQp2YXIgYyxmPTIqdQppZihNYXRoLmZsb29yKHUpPT09dSljPXUKZWxzZSBpZihNYXRoLmZsb29yKGYpPT09Zil7dmFyIHA9TWF0aC5mbG9vcih1KQpjPXArcCUyfWVsc2UgYz1NYXRoLnJvdW5kKHUpCmZvcih2YXIgbT0iIixnPWkraDtnPjB8fGM+MDspZy0tLG09IiIrYyUxMCttLGM9TWF0aC5mbG9vcihjLzEwKQppZihvIT09ZSlmb3IodmFyIGQ9bS5sZW5ndGgtMy1oO2Q+MDspbT1tLnN1YnN0cmluZygwLGQpK28rbS5zdWJzdHJpbmcoZCksZC09MwpyZXR1cm4gaD4wP2ErbS5zdWJzdHJpbmcoMCxtLmxlbmd0aC1oKSsiLiIrbS5zdWJzdHJpbmcobS5sZW5ndGgtaCxtLmxlbmd0aCk6YSttfSxuZkNvcmU6ZnVuY3Rpb24oZSxuLHIsaSxzLG8pe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBhPVtdLGw9MCxoPWUubGVuZ3RoO2w8aDtsKyspYS5wdXNoKHQubmZDb3JlU2NhbGFyKGVbbF0sbixyLGkscyxvKSkKcmV0dXJuIGF9cmV0dXJuIHQubmZDb3JlU2NhbGFyKGUsbixyLGkscyxvKX0sbmY6ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0Lm5mQ29yZShlLCIiLCItIixuLHIpfSxuZnM6ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0Lm5mQ29yZShlLCIgIiwiLSIsbixyKX0sbmZwOmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdC5uZkNvcmUoZSwiKyIsIi0iLG4scil9LG5mYzpmdW5jdGlvbihlLG4pe3JldHVybiB0Lm5mQ29yZShlLCIiLCItIiwwLG4sIiwiKX0sd2l0aENvbW1vbkZ1bmN0aW9uczpmdW5jdGlvbihlKXtbInRyaW0iLCJyYWRpYW5zIiwibmYiLCJuZnMiLCJuZnAiLCJuZmMiXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Vbbl09dFtuXX0pfX0KcmV0dXJuIHR9KCl9LHt9XSwyNTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyLGkscyxvKXtmdW5jdGlvbiBhKHQsbil7dmFyIHI9dCxzPTAsbz0wCmlmKGUucG1vdXNlWD1lLm1vdXNlWCxlLnBtb3VzZVk9ZS5tb3VzZVksci5vZmZzZXRQYXJlbnQpZG8gcys9ci5vZmZzZXRMZWZ0LG8rPXIub2Zmc2V0VG9wCndoaWxlKHI9ci5vZmZzZXRQYXJlbnQpCnI9dApkbyBzLT1yLnNjcm9sbExlZnR8fDAsby09ci5zY3JvbGxUb3B8fDAKd2hpbGUocj1yLnBhcmVudE5vZGUpCnZhciBhLGwsaCx1CnJldHVybiBpLmRlZmF1bHRWaWV3JiZpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihhPXBhcnNlSW50KGkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLnBhZGRpbmdMZWZ0LDEwKXx8MCxsPXBhcnNlSW50KGkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLnBhZGRpbmdUb3AsMTApfHwwLGg9cGFyc2VJbnQoaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuYm9yZGVyTGVmdFdpZHRoLDEwKXx8MCx1PXBhcnNlSW50KGkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmJvcmRlclRvcFdpZHRoLDEwKXx8MCkscys9YSxvKz1sLHMrPWgsbys9dSxzKz13aW5kb3cucGFnZVhPZmZzZXQsbys9d2luZG93LnBhZ2VZT2Zmc2V0LHtYOnMsWTpvfX1mdW5jdGlvbiBsKHQsbil7dmFyIHI9YSh0LG4pCmUubW91c2VYPW4ucGFnZVgtci5YLGUubW91c2VZPW4ucGFnZVktci5ZfWZ1bmN0aW9uIGgoZSl7dmFyIHQsbj1hKGUuY2hhbmdlZFRvdWNoZXNbMF0udGFyZ2V0LGUuY2hhbmdlZFRvdWNoZXNbMF0pCmZvcih0PTA7dDxlLnRvdWNoZXMubGVuZ3RoO3QrKyl7dmFyIHI9ZS50b3VjaGVzW3RdCnIub2Zmc2V0WD1yLnBhZ2VYLW4uWCxyLm9mZnNldFk9ci5wYWdlWS1uLll9Zm9yKHQ9MDt0PGUudGFyZ2V0VG91Y2hlcy5sZW5ndGg7dCsrKXt2YXIgaT1lLnRhcmdldFRvdWNoZXNbdF0KaS5vZmZzZXRYPWkucGFnZVgtbi5YLGkub2Zmc2V0WT1pLnBhZ2VZLW4uWX1mb3IodD0wO3Q8ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7dCsrKXt2YXIgcz1lLmNoYW5nZWRUb3VjaGVzW3RdCnMub2Zmc2V0WD1zLnBhZ2VYLW4uWCxzLm9mZnNldFk9cy5wYWdlWS1uLll9cmV0dXJuIGV9dmFyIHU9WyJtb3VzZW91dCIsIm1vdXNlbW92ZSIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJET01Nb3VzZVNjcm9sbCIsIm1vdXNld2hlZWwiLCJ0b3VjaHN0YXJ0Il0Kbih0LCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihpKXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCItd2Via2l0LXVzZXItc2VsZWN0OiBub25lIiksdC5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJ2b2lkKDApIiksdC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCkiKSxyKHQsdSksZS50b3VjaFN0YXJ0IT09b3x8ZS50b3VjaE1vdmUhPT1vfHxlLnRvdWNoRW5kIT09b3x8ZS50b3VjaENhbmNlbCE9PW8/KG4odCwidG91Y2hzdGFydCIsZnVuY3Rpb24odCl7ZS50b3VjaFN0YXJ0IT09byYmKHQ9aCh0KSxlLnRvdWNoU3RhcnQodCkpfSksbih0LCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKHQpe2UudG91Y2hNb3ZlIT09byYmKHQucHJldmVudERlZmF1bHQoKSx0PWgodCksZS50b3VjaE1vdmUodCkpfSksbih0LCJ0b3VjaGVuZCIsZnVuY3Rpb24odCl7ZS50b3VjaEVuZCE9PW8mJih0PWgodCksZS50b3VjaEVuZCh0KSl9KSxuKHQsInRvdWNoY2FuY2VsIixmdW5jdGlvbih0KXtlLnRvdWNoQ2FuY2VsIT09byYmKHQ9aCh0KSxlLnRvdWNoQ2FuY2VsKHQpKX0pKToobih0LCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihuKXtsKHQsbi50b3VjaGVzWzBdKSxlLl9fbW91c2VQcmVzc2VkPSEwLGUubW91c2VEcmFnZ2luZz0hMSxlLm1vdXNlQnV0dG9uPXMuTEVGVCwiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZVByZXNzZWQmJmUubW91c2VQcmVzc2VkKCl9KSxuKHQsInRvdWNobW92ZSIsZnVuY3Rpb24obil7bi5wcmV2ZW50RGVmYXVsdCgpLGwodCxuLnRvdWNoZXNbMF0pLCJmdW5jdGlvbiIhPXR5cGVvZiBlLm1vdXNlTW92ZWR8fGUuX19tb3VzZVByZXNzZWR8fGUubW91c2VNb3ZlZCgpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlRHJhZ2dlZCYmZS5fX21vdXNlUHJlc3NlZCYmKGUubW91c2VEcmFnZ2VkKCksZS5tb3VzZURyYWdnaW5nPSEwKX0pLG4odCwidG91Y2hlbmQiLGZ1bmN0aW9uKHQpe2UuX19tb3VzZVByZXNzZWQ9ITEsImZ1bmN0aW9uIiE9dHlwZW9mIGUubW91c2VDbGlja2VkfHxlLm1vdXNlRHJhZ2dpbmd8fGUubW91c2VDbGlja2VkKCksImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VSZWxlYXNlZCYmZS5tb3VzZVJlbGVhc2VkKCl9KSl9KSxmdW5jdGlvbigpe3ZhciByPSEwLGk9ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCl9CmUuZGlzYWJsZUNvbnRleHRNZW51PWZ1bmN0aW9uKCl7ciYmKG4odCwiY29udGV4dG1lbnUiLGkpLHI9ITEpfSxlLmVuYWJsZUNvbnRleHRNZW51PWZ1bmN0aW9uKCl7cnx8KGRldGFjaEV2ZW50SGFuZGxlcih7ZWxlbTp0LHR5cGU6ImNvbnRleHRtZW51IixmbjppfSkscj0hMCl9fSgpLG4odCwibW91c2Vtb3ZlIixmdW5jdGlvbihuKXtsKHQsbiksImZ1bmN0aW9uIiE9dHlwZW9mIGUubW91c2VNb3ZlZHx8ZS5fX21vdXNlUHJlc3NlZHx8ZS5tb3VzZU1vdmVkKCksImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VEcmFnZ2VkJiZlLl9fbW91c2VQcmVzc2VkJiYoZS5tb3VzZURyYWdnZWQoKSxlLm1vdXNlRHJhZ2dpbmc9ITApfSksbih0LCJtb3VzZW91dCIsZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VPdXQmJmUubW91c2VPdXQoKX0pLG4odCwibW91c2VvdmVyIixmdW5jdGlvbihuKXtsKHQsbiksImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VPdmVyJiZlLm1vdXNlT3ZlcigpfSksdC5vbm1vdXNlZG93bj1mdW5jdGlvbigpe3JldHVybiB0LmZvY3VzKCksITF9LG4odCwibW91c2Vkb3duIixmdW5jdGlvbih0KXtzd2l0Y2goZS5fX21vdXNlUHJlc3NlZD0hMCxlLm1vdXNlRHJhZ2dpbmc9ITEsdC53aGljaCl7Y2FzZSAxOmUubW91c2VCdXR0b249cy5MRUZUCmJyZWFrCmNhc2UgMjplLm1vdXNlQnV0dG9uPXMuQ0VOVEVSCmJyZWFrCmNhc2UgMzplLm1vdXNlQnV0dG9uPXMuUklHSFR9ImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VQcmVzc2VkJiZlLm1vdXNlUHJlc3NlZCgpfSksbih0LCJtb3VzZXVwIixmdW5jdGlvbih0KXtlLl9fbW91c2VQcmVzc2VkPSExLCJmdW5jdGlvbiIhPXR5cGVvZiBlLm1vdXNlQ2xpY2tlZHx8ZS5tb3VzZURyYWdnaW5nfHxlLm1vdXNlQ2xpY2tlZCgpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlUmVsZWFzZWQmJmUubW91c2VSZWxlYXNlZCgpfSkKdmFyIGM9ZnVuY3Rpb24obil7aWYobi50YXJnZXQ9PT10KXt2YXIgcj0wCm4ud2hlZWxEZWx0YT8ocj1uLndoZWVsRGVsdGEvMTIwLHdpbmRvdy5vcGVyYSYmKHI9LXIpKTpuLmRldGFpbCYmKHI9LW4uZGV0YWlsLzMpLGUubW91c2VTY3JvbGw9cixyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZVNjcm9sbGVkJiYobi5zdG9wUHJvcGFnYXRpb24oKSxuLnByZXZlbnREZWZhdWx0KCksZS5tb3VzZVNjcm9sbGVkKCkpfX0KbihpLCJET01Nb3VzZVNjcm9sbCIsYyksbihpLCJtb3VzZXdoZWVsIixjKX19LHt9XSwyNjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt2YXIgZT1bImFicyIsImFjb3MiLCJhbHBoYSIsImFtYmllbnQiLCJhbWJpZW50TGlnaHQiLCJhcHBlbmQiLCJhcHBseU1hdHJpeCIsImFyYyIsImFycmF5Q29weSIsImFzaW4iLCJhdGFuIiwiYXRhbjIiLCJiYWNrZ3JvdW5kIiwiYmVnaW5DYW1lcmEiLCJiZWdpbkRyYXciLCJiZWdpblNoYXBlIiwiYmV6aWVyIiwiYmV6aWVyRGV0YWlsIiwiYmV6aWVyUG9pbnQiLCJiZXppZXJUYW5nZW50IiwiYmV6aWVyVmVydGV4IiwiYmluYXJ5IiwiYmxlbmQiLCJibGVuZENvbG9yIiwiYmxpdF9yZXNpemUiLCJibHVlIiwiYm94IiwiYnJlYWtTaGFwZSIsImJyaWdodG5lc3MiLCJjYW1lcmEiLCJjZWlsIiwiQ2hhcmFjdGVyIiwiY29sb3IiLCJjb2xvck1vZGUiLCJjb25jYXQiLCJjb25zdHJhaW4iLCJjb3B5IiwiY29zIiwiY3JlYXRlRm9udCIsImNyZWF0ZUdyYXBoaWNzIiwiY3JlYXRlSW1hZ2UiLCJjdXJzb3IiLCJjdXJ2ZSIsImN1cnZlRGV0YWlsIiwiY3VydmVQb2ludCIsImN1cnZlVGFuZ2VudCIsImN1cnZlVGlnaHRuZXNzIiwiY3VydmVWZXJ0ZXgiLCJkYXkiLCJkZWdyZWVzIiwiZGlyZWN0aW9uYWxMaWdodCIsImRpc2FibGVDb250ZXh0TWVudSIsImRpc3QiLCJkcmF3IiwiZWxsaXBzZSIsImVsbGlwc2VNb2RlIiwiZW1pc3NpdmUiLCJlbmFibGVDb250ZXh0TWVudSIsImVuZENhbWVyYSIsImVuZERyYXciLCJlbmRTaGFwZSIsImV4aXQiLCJleHAiLCJleHBhbmQiLCJleHRlcm5hbHMiLCJmaWxsIiwiZmlsdGVyIiwiZmxvb3IiLCJmb2N1c2VkIiwiZnJhbWVDb3VudCIsImZyYW1lUmF0ZSIsImZydXN0dW0iLCJnZXQiLCJnbHlwaExvb2siLCJnbHlwaFRhYmxlIiwiZ3JlZW4iLCJoZWlnaHQiLCJoZXgiLCJoaW50IiwiaG91ciIsImh1ZSIsImltYWdlIiwiaW1hZ2VNb2RlIiwiaW50ZXJzZWN0Iiwiam9pbiIsImtleSIsImtleUNvZGUiLCJrZXlQcmVzc2VkIiwia2V5UmVsZWFzZWQiLCJrZXlUeXBlZCIsImxlcnAiLCJsZXJwQ29sb3IiLCJsaWdodEZhbGxvZmYiLCJsaWdodHMiLCJsaWdodFNwZWN1bGFyIiwibGluZSIsImxpbmsiLCJsb2FkQnl0ZXMiLCJsb2FkRm9udCIsImxvYWRHbHlwaHMiLCJsb2FkSW1hZ2UiLCJsb2FkUGl4ZWxzIiwibG9hZFNoYXBlIiwibG9hZFhNTCIsImxvYWRTdHJpbmdzIiwibG9nIiwibG9vcCIsIm1hZyIsIm1hcCIsIm1hdGNoIiwibWF0Y2hBbGwiLCJtYXgiLCJtaWxsaXMiLCJtaW4iLCJtaW51dGUiLCJtaXgiLCJtb2RlbFgiLCJtb2RlbFkiLCJtb2RlbFoiLCJtb2RlcyIsIm1vbnRoIiwibW91c2VCdXR0b24iLCJtb3VzZUNsaWNrZWQiLCJtb3VzZURyYWdnZWQiLCJtb3VzZU1vdmVkIiwibW91c2VPdXQiLCJtb3VzZU92ZXIiLCJtb3VzZVByZXNzZWQiLCJtb3VzZVJlbGVhc2VkIiwibW91c2VTY3JvbGwiLCJtb3VzZVNjcm9sbGVkIiwibW91c2VYIiwibW91c2VZIiwibmFtZSIsIm5mIiwibmZjIiwibmZwIiwibmZzIiwibm9DdXJzb3IiLCJub0ZpbGwiLCJub2lzZSIsIm5vaXNlRGV0YWlsIiwibm9pc2VTZWVkIiwibm9MaWdodHMiLCJub0xvb3AiLCJub3JtIiwibm9ybWFsIiwibm9TbW9vdGgiLCJub1N0cm9rZSIsIm5vVGludCIsIm9ydGhvIiwicGFyYW0iLCJwYXJzZUJvb2xlYW4iLCJwYXJzZUJ5dGUiLCJwYXJzZUNoYXIiLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJwYXJzZVhNTCIsInBlZyIsInBlcnNwZWN0aXZlIiwiUEltYWdlIiwicGl4ZWxzIiwiUE1hdHJpeDJEIiwiUE1hdHJpeDNEIiwiUE1hdHJpeFN0YWNrIiwicG1vdXNlWCIsInBtb3VzZVkiLCJwb2ludCIsInBvaW50TGlnaHQiLCJwb3BNYXRyaXgiLCJwb3BTdHlsZSIsInBvdyIsInByaW50IiwicHJpbnRDYW1lcmEiLCJwcmludGxuIiwicHJpbnRNYXRyaXgiLCJwcmludFByb2plY3Rpb24iLCJQU2hhcGUiLCJQU2hhcGVTVkciLCJwdXNoTWF0cml4IiwicHVzaFN0eWxlIiwicXVhZCIsInJhZGlhbnMiLCJyYW5kb20iLCJyYW5kb21HYXVzc2lhbiIsInJhbmRvbVNlZWQiLCJyZWN0IiwicmVjdE1vZGUiLCJyZWQiLCJyZWRyYXciLCJyZXF1ZXN0SW1hZ2UiLCJyZXNldE1hdHJpeCIsInJldmVyc2UiLCJyb3RhdGUiLCJyb3RhdGVYIiwicm90YXRlWSIsInJvdGF0ZVoiLCJyb3VuZCIsInNhdHVyYXRpb24iLCJzYXZlIiwic2F2ZUZyYW1lIiwic2F2ZVN0cmluZ3MiLCJzY2FsZSIsInNjcmVlblgiLCJzY3JlZW5ZIiwic2NyZWVuWiIsInNlY29uZCIsInNldCIsInNldHVwIiwic2hhcGUiLCJzaGFwZU1vZGUiLCJzaGFyZWQiLCJzaGVhclgiLCJzaGVhclkiLCJzaGluaW5lc3MiLCJzaG9ydGVuIiwic2luIiwic2l6ZSIsInNtb290aCIsInNvcnQiLCJzcGVjdWxhciIsInNwaGVyZSIsInNwaGVyZURldGFpbCIsInNwbGljZSIsInNwbGl0Iiwic3BsaXRUb2tlbnMiLCJzcG90TGlnaHQiLCJzcSIsInNxcnQiLCJzdGF0dXMiLCJzdHIiLCJzdHJva2UiLCJzdHJva2VDYXAiLCJzdHJva2VKb2luIiwic3Ryb2tlV2VpZ2h0Iiwic3Vic2V0IiwidGFuIiwidGV4dCIsInRleHRBbGlnbiIsInRleHRBc2NlbnQiLCJ0ZXh0RGVzY2VudCIsInRleHRGb250IiwidGV4dExlYWRpbmciLCJ0ZXh0TW9kZSIsInRleHRTaXplIiwidGV4dHVyZSIsInRleHR1cmVNb2RlIiwidGV4dFdpZHRoIiwidGludCIsInRvSW1hZ2VEYXRhIiwidG91Y2hDYW5jZWwiLCJ0b3VjaEVuZCIsInRvdWNoTW92ZSIsInRvdWNoU3RhcnQiLCJ0cmFuc2xhdGUiLCJ0cmFuc2Zvcm0iLCJ0cmlhbmdsZSIsInRyaW0iLCJ1bmJpbmFyeSIsInVuaGV4IiwidXBkYXRlUGl4ZWxzIiwidXNlM0RDb250ZXh0IiwidmVydGV4Iiwid2lkdGgiLCJYTUxFbGVtZW50IiwiWE1MIiwieWVhciIsIl9fY29udGFpbnMiLCJfX2VxdWFscyIsIl9fZXF1YWxzSWdub3JlQ2FzZSIsIl9fZnJhbWVSYXRlIiwiX19oYXNoQ29kZSIsIl9faW50X2Nhc3QiLCJfX2luc3RhbmNlb2YiLCJfX2tleVByZXNzZWQiLCJfX21vdXNlUHJlc3NlZCIsIl9fcHJpbnRTdGFja1RyYWNlIiwiX19yZXBsYWNlIiwiX19yZXBsYWNlQWxsIiwiX19yZXBsYWNlRmlyc3QiLCJfX3RvQ2hhckFycmF5IiwiX19zcGxpdCIsIl9fY29kZVBvaW50QXQiLCJfX3N0YXJ0c1dpdGgiLCJfX2VuZHNXaXRoIiwiX19tYXRjaGVzIl0KaCYmT2JqZWN0LmtleXMoaCkuZm9yRWFjaChmdW5jdGlvbih0KXtlLnB1c2godCl9KQp2YXIgbixyLGk9e30KZm9yKG49MCxyPWUubGVuZ3RoO248cjsrK24paVtlW25dXT1udWxsCmZvcih2YXIgcyBpbiB0LmxpYilpZih0LmxpYi5oYXNPd25Qcm9wZXJ0eShzKSYmdC5saWJbc10uZXhwb3J0cyl7dmFyIG89dC5saWJbc10uZXhwb3J0cwpmb3Iobj0wLHI9by5sZW5ndGg7bjxyOysrbilpW29bbl1dPW51bGx9cmV0dXJuIGl9ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUpe2Zvcih2YXIgdD1bXSxuPWUuc3BsaXQoLyhbXHtcW1woXClcXVx9XSkvKSxyPW5bMF0saT1bXSxzPTE7czxuLmxlbmd0aDtzKz0yKXt2YXIgbz1uW3NdCmlmKCJbIj09PW98fCJ7Ij09PW98fCIoIj09PW8paS5wdXNoKHIpLHI9bwplbHNlIGlmKCJdIj09PW98fCJ9Ij09PW98fCIpIj09PW8pe3ZhciBhPSJ9Ij09PW8/IkEiOiIpIj09PW8/IkIiOiJDIixsPXQubGVuZ3RoCnQucHVzaChyK28pLHI9aS5wb3AoKSsnIicrYSsobCsxKSsnIid9cis9bltzKzFdfXJldHVybiB0LnVuc2hpZnQociksdH1mdW5jdGlvbiBuKGUsdCl7cmV0dXJuIGUucmVwbGFjZSgvJyhcZCspJy9nLGZ1bmN0aW9uKGUsbil7dmFyIHI9dFtuXQpyZXR1cm4iLyI9PT1yLmNoYXJBdCgwKT9yOi9eJygoPzpbXidcXFxuXSl8KD86XFwuWzAtOUEtRmEtZl0qKSknJC8udGVzdChyKT8iKG5ldyAkcC5DaGFyYWN0ZXIoIityKyIpKSI6cn0pfWZ1bmN0aW9uIGkoZSl7dmFyIHQsbj0vXlxzKi8uZXhlYyhlKQppZihuWzBdLmxlbmd0aD09PWUubGVuZ3RoKXQ9e2xlZnQ6blswXSxtaWRkbGU6IiIscmlnaHQ6IiJ9CmVsc2V7dmFyIHI9L1xzKiQvLmV4ZWMoZSkKdD17bGVmdDpuWzBdLG1pZGRsZTplLnN1YnN0cmluZyhuWzBdLmxlbmd0aCxyLmluZGV4KSxyaWdodDpyWzBdfX1yZXR1cm4gdC51bnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGVmdCtlK3RoaXMucmlnaHR9LHR9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfWZ1bmN0aW9uIGgoZSx0KXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjsrK24pZVt0W25dXT1udWxsCnJldHVybiBlfWZ1bmN0aW9uIHUoZSl7Zm9yKHZhciB0IGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4hMQpyZXR1cm4hMH1mdW5jdGlvbiBjKGUpe3JldHVybiBlLnN1YnN0cmluZygyLGUubGVuZ3RoLTEpfWZ1bmN0aW9uIGYoZSx0KXt2YXIgbj1fZS5sZW5ndGgKcmV0dXJuIF9lLnB1c2goZSksJyInK3QrbisnIid9ZnVuY3Rpb24gcCgpe3JldHVybiJjbGFzcyIrICsrTGV9ZnVuY3Rpb24gbShlLHQsbil7ZS5jbGFzc0lkPXQsZS5zY29wZUlkPW4sUmVbdF09ZX1mdW5jdGlvbiBnKGUpe3ZhciB0PWUKcmV0dXJuIHQ9dC5yZXBsYWNlKEllLGZ1bmN0aW9uKGUpe3JldHVybiBmKGUsIkUiKX0pLHQ9dC5yZXBsYWNlKERlLGZ1bmN0aW9uKGUpe3JldHVybiBmKGUsIkQiKX0pLHQ9dC5yZXBsYWNlKGtlLGZ1bmN0aW9uKGUpe3JldHVybiBmKGUsIkgiKX0pfWZ1bmN0aW9uIGQoZSx0KXt2YXIgbj1lLnJlcGxhY2UoTmUsZnVuY3Rpb24oZSxuLHIsaSxzLG8pe3JldHVybiByIT09dD9lOmYoZSwiRyIpfSkKcmV0dXJuIG59ZnVuY3Rpb24gdihlKXt0aGlzLm5hbWU9ZX1mdW5jdGlvbiB5KGUsdCl7dGhpcy5wYXJhbXM9ZSx0aGlzLm1ldGhvZEFyZ3NQYXJhbT10fWZ1bmN0aW9uIHgoZSl7dmFyIHQ9cyhlLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKSxuPVtdLHI9bnVsbAppZigiIiE9PXQpZm9yKHZhciBpPXQuc3BsaXQoIiwiKSxvPTA7bzxpLmxlbmd0aDsrK28pe3ZhciBhPS9cYihbQS1aYS16XyRdW1x3JF0qXGIpKFxzKiJbQUJDXVtcZF0qIikqXHMqJC8uZXhlYyhpW29dKQppZihvPT09aS5sZW5ndGgtMSYmaVtvXS5pbmRleE9mKCIuLi4iKT49MCl7cj1uZXcgdihhWzFdKQpicmVha31uLnB1c2gobmV3IHYoYVsxXSkpfXJldHVybiBuZXcgeShuLHIpfWZ1bmN0aW9uIEEoZSl7ZnVuY3Rpb24gdChlLHQsbixyKXt2YXIgbz1fZVtyXQpzPSEwCnZhciBhPWkoby5zdWJzdHJpbmcoMSxvLmxlbmd0aC0xKSkKcmV0dXJuIl9fIituKygiIj09PWEubWlkZGxlP2YoIigiK3QucmVwbGFjZSgvXC5ccyokLywiIikrIikiLCJCIik6ZigiKCIrdC5yZXBsYWNlKC9cLlxzKiQvLCIiKSsiLCIrYS5taWRkbGUrIikiLCJCIikpfWZ1bmN0aW9uIG4oZSx0LG4pe3JldHVybiBzPSEwLCJfX2luc3RhbmNlb2YiK2YoIigiK3QrIiwgIituKyIpIiwiQiIpfXZhciByPWUKcj1yLnJlcGxhY2UoL1xibmV3XHMrKFtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopKD86XHMqIkNcZCsiKStccyooIkFcZCsiKS9nLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbn0pLHI9ci5yZXBsYWNlKC9cYm5ld1xzKyhbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKSg/OlxzKiJCXGQrIilccyooIkFcZCsiKS9nLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZihlLCJGIil9KSxyPXIucmVwbGFjZShrZSxmdW5jdGlvbihlKXtyZXR1cm4gZihlLCJIIil9KSxyPXIucmVwbGFjZSgvXGJuZXdccysoW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKilccyooIkNcZCsiKD86XHMqIkNcZCsiKSopL2csZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4ucmVwbGFjZSgvIkMoXGQrKSIvZyxmdW5jdGlvbihlLHQpe3JldHVybiBfZVt0XX0pLnJlcGxhY2UoL1xbXHMqXF0vZywiW251bGxdIikucmVwbGFjZSgvXHMqXF1ccypcW1xzKi9nLCIsICIpLGk9InsiK3Iuc3Vic3RyaW5nKDEsci5sZW5ndGgtMSkrIn0iLHM9IignIit0KyInLCAiK2YoaSwiQSIpKyIpIgpyZXR1cm4iJHAuY3JlYXRlSmF2YUFycmF5IitmKHMsIkIiKX0pLHI9ci5yZXBsYWNlKC8oXC5ccypsZW5ndGgpXHMqIkJcZCsiL2csIiQxIikscj1yLnJlcGxhY2UoLyMoWzAtOUEtRmEtZl17Nn0pXGIvZyxmdW5jdGlvbihlLHQpe3JldHVybiIweEZGIit0fSkscj1yLnJlcGxhY2UoLyJCKFxkKykiKFxzKig/OltcdyQnXXwiQikpL2csZnVuY3Rpb24oZSx0LG4pe3ZhciByPV9lW3RdCmlmKCEvXlwoXHMqW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKlxzKig/OiJDXGQrIlxzKikqXCkkLy50ZXN0KHIpKXJldHVybiBlCmlmKC9eXChccyppbnRccypcKSQvLnRlc3QocikpcmV0dXJuIihpbnQpIituCnZhciBpPXIuc3BsaXQoLyJDKFxkKykiL2cpCnJldHVybiBpLmxlbmd0aD4xJiYhL15cW1xzKlxdJC8udGVzdChfZVtpWzFdXSk/ZToiIitufSkscj1yLnJlcGxhY2UoL1woaW50XCkoW14sXF1cKVx9XD9cOlwqXCtcLVwvXF5cfFwlXCZcfjxcPlw9XSspL2csZnVuY3Rpb24oZSx0KXt2YXIgbj1pKHQpCnJldHVybiBuLnVudHJpbSgiX19pbnRfY2FzdCgiK24ubWlkZGxlKyIpIil9KSxyPXIucmVwbGFjZSgvXGJzdXBlcihccyoiQlxkKyIpL2csIiQkc3VwZXJDc3RyJDEiKS5yZXBsYWNlKC9cYnN1cGVyKFxzKlwuKS9nLCIkJHN1cGVyJDEiKSxyPXIucmVwbGFjZSgvXGIwKygoXGQqKSg/OlwuW1xkKl0pPyg/OltlRV1bXC1cK10/XGQrKT9bZkZdPylcYi8sZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09bj9lOiIiPT09bj8iMCIrdDp0fSkscj1yLnJlcGxhY2UoL1xiKFwuP1xkK1wuPylbZkZdXGIvZywiJDEiKSxyPXIucmVwbGFjZSgvKFteXHNdKSUoW149XHNdKS9nLCIkMSAlICQyIikscj1yLnJlcGxhY2UoL1xiKGZyYW1lUmF0ZXxrZXlQcmVzc2VkfG1vdXNlUHJlc3NlZClcYig/IVxzKiJCKS9nLCJfXyQxIikscj1yLnJlcGxhY2UoL1xiKGJvb2xlYW58Ynl0ZXxjaGFyfGZsb2F0fGludClccyoiQi9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuInBhcnNlIit0LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSkrJyJCJ30pLHI9ci5yZXBsYWNlKC9cYnBpeGVsc1xiXHMqKCgiQyhcZCspIil8XC5sZW5ndGgpPyhccyo9KD8hPSkoW14sXF1cKVx9XSspKT8vZyxmdW5jdGlvbihlLHQsbixyLGkscyl7aWYobil7dmFyIG89X2Vbcl0KcmV0dXJuIGk/InBpeGVscy5zZXRQaXhlbCIrZigiKCIrby5zdWJzdHJpbmcoMSxvLmxlbmd0aC0xKSsiLCIrcysiKSIsIkIiKToicGl4ZWxzLmdldFBpeGVsIitmKCIoIitvLnN1YnN0cmluZygxLG8ubGVuZ3RoLTEpKyIpIiwiQiIpfXJldHVybiB0PyJwaXhlbHMuZ2V0TGVuZ3RoIitmKCIoKSIsIkIiKTppPyJwaXhlbHMuc2V0IitmKCIoIitzKyIpIiwiQiIpOiJwaXhlbHMudG9BcnJheSIrZigiKCkiLCJCIil9KQp2YXIgcwpkbyBzPSExLHI9ci5yZXBsYWNlKC8oKD86J1xkKyd8XGJbQS1aYS16XyRdW1x3JF0qXHMqKD86IltCQ11cZCsiKSopXHMqXC5ccyooPzpbQS1aYS16XyRdW1x3JF0qXHMqKD86IltCQ11cZCsiXHMqKSpcLlxzKikqKShyZXBsYWNlfHJlcGxhY2VBbGx8cmVwbGFjZUZpcnN0fGNvbnRhaW5zfGVxdWFsc3xlcXVhbHNJZ25vcmVDYXNlfGhhc2hDb2RlfHRvQ2hhckFycmF5fHByaW50U3RhY2tUcmFjZXxzcGxpdHxzdGFydHNXaXRofGVuZHNXaXRofGNvZGVQb2ludEF0fG1hdGNoZXMpXHMqIkIoXGQrKSIvZyx0KQp3aGlsZShzKQpkbyBzPSExLHI9ci5yZXBsYWNlKC8oKD86J1xkKyd8XGJbQS1aYS16XyRdW1x3JF0qXHMqKD86IltCQ11cZCsiKSopXHMqKD86XC5ccypbQS1aYS16XyRdW1x3JF0qXHMqKD86IltCQ11cZCsiXHMqKSopKilpbnN0YW5jZW9mXHMrKFtBLVphLXpfJF1bXHckXSpccyooPzpcLlxzKltBLVphLXpfJF1bXHckXSopKikvZyxuKQp3aGlsZShzKQpyZXR1cm4gcj1yLnJlcGxhY2UoL1xidGhpcyhccyoiQlxkKyIpL2csIiQkY29uc3RyJDEiKX1mdW5jdGlvbiBiKGUsdCl7dGhpcy5iYXNlSW50ZXJmYWNlTmFtZT1lLHRoaXMuYm9keT10LHQub3duZXI9dGhpc31mdW5jdGlvbiB3KGUpe3ZhciB0PW5ldyBSZWdFeHAoL1xibmV3XHMqKFtBLVphLXpfJF1bXHckXSpccyooPzpcLlxzKltBLVphLXpfJF1bXHckXSopKilccyoiQlxkKyJccyoiQShcZCspIi8pLmV4ZWMoZSksbj13ZSxyPXAoKQp3ZT1yCnZhciBpPXRbMV0rIiQiK3Iscz1uZXcgYihpLEVlKF9lW3RbMl1dLGksIiIsImltcGxlbWVudHMgIit0WzFdKSkKcmV0dXJuIG0ocyxyLG4pLHdlPW4sc31mdW5jdGlvbiBFKGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLnBhcmFtcz10LHRoaXMuYm9keT1ufWZ1bmN0aW9uIFMoZSl7dmFyIHQ9bmV3IFJlZ0V4cCgvXGIoW0EtWmEtel8kXVtcdyRdKilccyoiQihcZCspIlxzKiJBKFxkKykiLykuZXhlYyhlKQpyZXR1cm4gbmV3IEUoImZ1bmN0aW9uIiE9PXRbMV0/dFsxXTpudWxsLHgoX2VbdFsyXV0pLFBlKF9lW3RbM11dKSl9ZnVuY3Rpb24gUChlKXt0aGlzLm1lbWJlcnM9ZX1mdW5jdGlvbiBDKGUpe2Zvcih2YXIgdD1lLnNwbGl0KCIsIiksbj0wO248dC5sZW5ndGg7KytuKXt2YXIgcj10W25dLmluZGV4T2YoIjoiKQpyPDA/dFtuXT17dmFsdWU6VGUodFtuXSl9OnRbbl09e2xhYmVsOnModFtuXS5zdWJzdHJpbmcoMCxyKSksdmFsdWU6VGUocyh0W25dLnN1YnN0cmluZyhyKzEpKSl9fXJldHVybiBuZXcgUCh0KX1mdW5jdGlvbiBNKGUpe2lmKCIoIj09PWUuY2hhckF0KDApfHwiWyI9PT1lLmNoYXJBdCgwKSlyZXR1cm4gZS5jaGFyQXQoMCkrTShlLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKStlLmNoYXJBdChlLmxlbmd0aC0xKQppZigieyI9PT1lLmNoYXJBdCgwKSlyZXR1cm4vXlx7XHMqKD86W0EtWmEtel8kXVtcdyRdKnwnXGQrJylccyo6Ly50ZXN0KGUpPyJ7IitmKGUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSksIkkiKSsifSI6IlsiK00oZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSkrIl0iCnZhciB0PWkoZSksbj1BKHQubWlkZGxlKQpyZXR1cm4gbj1uLnJlcGxhY2UoLyJbQUJDXShcZCspIi9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE0oX2VbdF0pfSksdC51bnRyaW0obil9ZnVuY3Rpb24gVChlKXtyZXR1cm4gZS5yZXBsYWNlKC8oXC5ccyopPygoPzpcYltBLVphLXpfXXxcJClbXHckXSopKFxzKlwuXHMqKFtBLVphLXpfJF1bXHckXSopKFxzKlwoKT8pPy9nLGZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZih0KXJldHVybiBlCnZhciBhPXtuYW1lOm4sbWVtYmVyOmksY2FsbFNpZ246ISFzfQpyZXR1cm4gYmUoYSkrKHI9PT1vPyIiOnIpfSl9ZnVuY3Rpb24gXyhlLHQpe3RoaXMuZXhwcj1lLHRoaXMudHJhbnNmb3Jtcz10fWZ1bmN0aW9uIFIoZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMudmFsdWU9dCx0aGlzLmlzRGVmYXVsdD1ufWZ1bmN0aW9uIEwoZSx0KXt2YXIgbixyLGksbz1lLmluZGV4T2YoIj0iKQpyZXR1cm4gbzwwPyhuPWUscj10LGk9ITApOihuPWUuc3Vic3RyaW5nKDAsbykscj1UZShlLnN1YnN0cmluZyhvKzEpKSxpPSExKSxuZXcgUihzKG4ucmVwbGFjZSgvKFxzKiJDXGQrIikrL2csIiIpKSxyLGkpfWZ1bmN0aW9uIEkoZSl7cmV0dXJuImludCI9PT1lfHwiZmxvYXQiPT09ZT8iMCI6ImJvb2xlYW4iPT09ZT8iZmFsc2UiOiJjb2xvciI9PT1lPyIweDAwMDAwMDAwIjoibnVsbCJ9ZnVuY3Rpb24gRChlLHQpe3RoaXMuZGVmaW5pdGlvbnM9ZSx0aGlzLnZhclR5cGU9dH1mdW5jdGlvbiBPKGUpe3RoaXMuZXhwcmVzc2lvbj1lfWZ1bmN0aW9uIE4oZSl7aWYoT2UudGVzdChlKSl7Zm9yKHZhciB0PUZlLmV4ZWMoZSksbj1lLnN1YnN0cmluZyh0WzBdLmxlbmd0aCkuc3BsaXQoIiwiKSxyPUkodFsyXSksaT0wO2k8bi5sZW5ndGg7KytpKW5baV09TChuW2ldLHIpCnJldHVybiBuZXcgRChuLHRbMl0pfXJldHVybiBuZXcgTyhUZShlKSl9ZnVuY3Rpb24gRihlLHQsbil7dGhpcy5pbml0U3RhdGVtZW50PWUsdGhpcy5jb25kaXRpb249dCx0aGlzLnN0ZXA9bn1mdW5jdGlvbiBrKGUsdCl7dGhpcy5pbml0U3RhdGVtZW50PWUsdGhpcy5jb250YWluZXI9dH1mdW5jdGlvbiBCKGUsdCl7dGhpcy5pbml0U3RhdGVtZW50PWUsdGhpcy5jb250YWluZXI9dH1mdW5jdGlvbiAkKGUpe3ZhciB0CnJldHVybi9cYmluXGIvLnRlc3QoZSk/KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKS5zcGxpdCgvXGJpblxiL2cpLG5ldyBrKE4ocyh0WzBdKSksVGUodFsxXSkpKTplLmluZGV4T2YoIjoiKT49MCYmZS5pbmRleE9mKCI7Iik8MD8odD1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpLnNwbGl0KCI6IiksbmV3IEIoTihzKHRbMF0pKSxUZSh0WzFdKSkpOih0PWUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkuc3BsaXQoIjsiKSxuZXcgRihOKHModFswXSkpLFRlKHRbMV0pLFRlKHRbMl0pKSl9ZnVuY3Rpb24gRyhlKXtlLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC53ZWlnaHQtZS53ZWlnaHR9KX1mdW5jdGlvbiBWKGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLmJvZHk9dCx0aGlzLmlzU3RhdGljPW4sdC5vd25lcj10aGlzfWZ1bmN0aW9uIHooZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMuYm9keT10LHRoaXMuaXNTdGF0aWM9bix0Lm93bmVyPXRoaXN9ZnVuY3Rpb24gVShlKXt2YXIgdD1JZS5leGVjKGUpCkllLmxhc3RJbmRleD0wCnZhciBuLHI9dFsxXS5pbmRleE9mKCJzdGF0aWMiKT49MCxpPV9lW2ModFs2XSldLHM9d2Usbz1wKCkKcmV0dXJuIHdlPW8sbj0iaW50ZXJmYWNlIj09PXRbMl0/bmV3IFYodFszXSxTZShpLHRbM10sdFs0XSkscik6bmV3IHoodFszXSxFZShpLHRbM10sdFs0XSx0WzVdKSxyKSxtKG4sbyxzKSx3ZT1zLG59ZnVuY3Rpb24gSChlLHQsbixyKXt0aGlzLm5hbWU9ZSx0aGlzLnBhcmFtcz10LHRoaXMuYm9keT1uLHRoaXMuaXNTdGF0aWM9cn1mdW5jdGlvbiBYKGUpe3ZhciB0PURlLmV4ZWMoZSkKRGUubGFzdEluZGV4PTAKdmFyIG49dFsxXS5pbmRleE9mKCJzdGF0aWMiKT49MCxyPSI7IiE9PXRbNl0/X2VbYyh0WzZdKV06Int9IgpyZXR1cm4gbmV3IEgodFszXSx4KF9lW2ModFs0XSldKSxQZShyKSxuKX1mdW5jdGlvbiBZKGUsdCxuKXt0aGlzLmRlZmluaXRpb25zPWUsdGhpcy5maWVsZFR5cGU9dCx0aGlzLmlzU3RhdGljPW59ZnVuY3Rpb24gaihlKXtmb3IodmFyIHQ9RmUuZXhlYyhlKSxuPXRbMV0uaW5kZXhPZigic3RhdGljIik+PTAscj1lLnN1YnN0cmluZyh0WzBdLmxlbmd0aCkuc3BsaXQoLyxccyovZyksaT1JKHRbMl0pLHM9MDtzPHIubGVuZ3RoOysrcylyW3NdPUwocltzXSxpKQpyZXR1cm4gbmV3IFkocix0WzJdLG4pfWZ1bmN0aW9uIEsoZSx0KXt0aGlzLnBhcmFtcz1lLHRoaXMuYm9keT10fWZ1bmN0aW9uIFcoZSl7dmFyIHQ9bmV3IFJlZ0V4cCgvIkIoXGQrKSJccyoiQShcZCspIi8pLmV4ZWMoZSksbj14KF9lW3RbMV1dKQpyZXR1cm4gbmV3IEsobixQZShfZVt0WzJdXSkpfWZ1bmN0aW9uIFooZSx0LG4scixpLHMpe3ZhciBvLGEKZm9yKHRoaXMubmFtZT1lLHRoaXMuaW50ZXJmYWNlc05hbWVzPXQsdGhpcy5tZXRob2RzTmFtZXM9bix0aGlzLmZpZWxkcz1yLHRoaXMuaW5uZXJDbGFzc2VzPWksdGhpcy5taXNjPXMsbz0wLGE9ci5sZW5ndGg7bzxhOysrbylyW29dLm93bmVyPXRoaXN9ZnVuY3Rpb24gcShlLHQsbixyLGkscyxvLGEsbCl7dmFyIGgsdQpmb3IodGhpcy5uYW1lPWUsdGhpcy5iYXNlQ2xhc3NOYW1lPXQsdGhpcy5pbnRlcmZhY2VzTmFtZXM9bix0aGlzLmZ1bmN0aW9ucz1yLHRoaXMubWV0aG9kcz1pLHRoaXMuZmllbGRzPXMsdGhpcy5jc3Rycz1vLHRoaXMuaW5uZXJDbGFzc2VzPWEsdGhpcy5taXNjPWwsaD0wLHU9cy5sZW5ndGg7aDx1OysraClzW2hdLm93bmVyPXRoaXN9ZnVuY3Rpb24gUShlLHQpe3RoaXMubmFtZT1lLHRoaXMuYm9keT10LHQub3duZXI9dGhpc31mdW5jdGlvbiBKKGUsdCl7dGhpcy5uYW1lPWUsdGhpcy5ib2R5PXQsdC5vd25lcj10aGlzfWZ1bmN0aW9uIGVlKGUpe3ZhciB0PUllLmV4ZWMoZSkKSWUubGFzdEluZGV4PTAKdmFyIG49X2VbYyh0WzZdKV0scj13ZSxpPXAoKQp3ZT1pCnZhciBzCnJldHVybiBzPSJpbnRlcmZhY2UiPT09dFsyXT9uZXcgUSh0WzNdLFNlKG4sdFszXSx0WzRdKSk6bmV3IEoodFszXSxFZShuLHRbM10sdFs0XSx0WzVdKSksbShzLGksciksd2U9cixzfWZ1bmN0aW9uIHRlKGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLnBhcmFtcz10LHRoaXMuYm9keT1ufWZ1bmN0aW9uIG5lKGUpe3ZhciB0PURlLmV4ZWMoZSkKRGUubGFzdEluZGV4PTAKcmV0dXJuIG5ldyB0ZSh0WzNdLHgoX2VbYyh0WzRdKV0pLFBlKF9lW2ModFs2XSldKSl9ZnVuY3Rpb24gcmUoZSl7dmFyIHQ9ZQpyZXR1cm4gdD10LnJlcGxhY2UoL1xiKGNhdGNoXHMqIkJcZCsiXHMqIkFcZCsiKShccypjYXRjaFxzKiJCXGQrIlxzKiJBXGQrIikrL2csIiQxIil9ZnVuY3Rpb24gaWUoZSx0KXt0aGlzLmFyZ3VtZW50PWUsdGhpcy5taXNjPXR9ZnVuY3Rpb24gc2UoZSx0KXt0aGlzLmFyZ3VtZW50PWUsdGhpcy5taXNjPXR9ZnVuY3Rpb24gb2UoZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMuYXJndW1lbnQ9dCx0aGlzLm1pc2M9bn1mdW5jdGlvbiBhZShlKXt0aGlzLmV4cHI9ZX1mdW5jdGlvbiBsZShlKXt0aGlzLmxhYmVsPWV9ZnVuY3Rpb24gaGUoZSl7Zm9yKHZhciB0PVtdLG49MCxyPWUubGVuZ3RoO248cjsrK24pe3ZhciBpPWVbbl0KaSBpbnN0YW5jZW9mIEQ/dD10LmNvbmNhdChpLmdldE5hbWVzKCkpOmkgaW5zdGFuY2VvZiBpZSYmaS5hcmd1bWVudC5pbml0U3RhdGVtZW50IGluc3RhbmNlb2YgRD90PXQuY29uY2F0KGkuYXJndW1lbnQuaW5pdFN0YXRlbWVudC5nZXROYW1lcygpKTooaSBpbnN0YW5jZW9mIFZ8fGkgaW5zdGFuY2VvZiB6fHxpIGluc3RhbmNlb2YgUXx8aSBpbnN0YW5jZW9mIEp8fGkgaW5zdGFuY2VvZiB0ZXx8aSBpbnN0YW5jZW9mIEUpJiZ0LnB1c2goaS5uYW1lKX1yZXR1cm4gaCh7fSx0KX1mdW5jdGlvbiB1ZShlKXt0aGlzLnN0YXRlbWVudHM9ZX1mdW5jdGlvbiBjZShlKXt0aGlzLnN0YXRlbWVudHM9ZX1mdW5jdGlvbiBmZShlKXtmdW5jdGlvbiB0KGUsdCl7Zm9yKHZhciBuLHI9dC5zcGxpdCgiLiIpLHM9ZS5zY29wZTtzOyl7aWYocy5oYXNPd25Qcm9wZXJ0eShyWzBdKSl7bj1zW3JbMF1dCmJyZWFrfXM9cy5zY29wZX1uPT09byYmKG49aVtyWzBdXSkKZm9yKHZhciBhPTEsbD1yLmxlbmd0aDthPGwmJm47KythKW49bi5pblNjb3BlW3JbYV1dCnJldHVybiBufXZhciBuLHIsaT17fQpmb3IobiBpbiBSZSlpZihSZS5oYXNPd25Qcm9wZXJ0eShuKSl7cj1SZVtuXQp2YXIgcz1yLnNjb3BlSWQsYT1yLm5hbWUKaWYocyl7dmFyIGw9UmVbc10Kci5zY29wZT1sLGwuaW5TY29wZT09PW8mJihsLmluU2NvcGU9e30pLGwuaW5TY29wZVthXT1yfWVsc2UgaVthXT1yfWZvcihuIGluIFJlKWlmKFJlLmhhc093blByb3BlcnR5KG4pKXtyPVJlW25dCnZhciBoPXIuYm9keS5iYXNlQ2xhc3NOYW1lCmlmKGgpe3ZhciB1PXQocixoKQp1JiYoci5iYXNlPXUsdS5kZXJpdmVkfHwodS5kZXJpdmVkPVtdKSx1LmRlcml2ZWQucHVzaChyKSl9dmFyIGMsZixwPXIuYm9keS5pbnRlcmZhY2VzTmFtZXMsbT1bXQppZihwJiZwLmxlbmd0aD4wKXtmb3IoYz0wLGY9cC5sZW5ndGg7YzxmOysrYyl7dmFyIGc9dChyLHBbY10pCm0ucHVzaChnKSxnJiYoZy5kZXJpdmVkfHwoZy5kZXJpdmVkPVtdKSxnLmRlcml2ZWQucHVzaChyKSl9bS5sZW5ndGg+MCYmKHIuaW50ZXJmYWNlcz1tKX19fWZ1bmN0aW9uIHBlKGUpe2Z1bmN0aW9uIHQoZSx0KXt2YXIgbj1vW2VdCmlmKCFuKXJldHVybiExCnZhciByPW4uaW5kZXhPZih0KQpyZXR1cm4hKHI8MCkmJihuLnNwbGljZShyLDEpLCEobi5sZW5ndGg+MCkmJihkZWxldGUgb1tlXSwhMCkpfXZhciBuLHIsaSxzPVtdLG89e30KZm9yKG4gaW4gUmUpaWYoUmUuaGFzT3duUHJvcGVydHkobikpaWYoaT1SZVtuXSxpLmluU2NvcGV8fGkuZGVyaXZlZCl7dmFyIGE9W10KaWYoaS5pblNjb3BlKWZvcihyIGluIGkuaW5TY29wZSlpLmluU2NvcGUuaGFzT3duUHJvcGVydHkocikmJmEucHVzaChpLmluU2NvcGVbcl0pCmkuZGVyaXZlZCYmKGE9YS5jb25jYXQoaS5kZXJpdmVkKSksb1tuXT1hfWVsc2Ugcy5wdXNoKG4pLGkud2VpZ2h0PTAKZm9yKDtzLmxlbmd0aD4wOylpZihuPXMuc2hpZnQoKSxpPVJlW25dLGkuc2NvcGVJZCYmdChpLnNjb3BlSWQsaSkmJihzLnB1c2goaS5zY29wZUlkKSxSZVtpLnNjb3BlSWRdLndlaWdodD1pLndlaWdodCsxKSxpLmJhc2UmJnQoaS5iYXNlLmNsYXNzSWQsaSkmJihzLnB1c2goaS5iYXNlLmNsYXNzSWQpLGkuYmFzZS53ZWlnaHQ9aS53ZWlnaHQrMSksaS5pbnRlcmZhY2VzKXt2YXIgbCxoCmZvcihsPTAsaD1pLmludGVyZmFjZXMubGVuZ3RoO2w8aDsrK2wpaS5pbnRlcmZhY2VzW2xdJiZ0KGkuaW50ZXJmYWNlc1tsXS5jbGFzc0lkLGkpJiYocy5wdXNoKGkuaW50ZXJmYWNlc1tsXS5jbGFzc0lkKSxpLmludGVyZmFjZXNbbF0ud2VpZ2h0PWkud2VpZ2h0KzEpfX12YXIgbWU9cigpLGdlPWUucmVwbGFjZSgvXHJcbj98XG5cci9nLCJcbiIpLGRlPVtdLHZlPWdlLnJlcGxhY2UoLygiKD86W14iXFxcbl18XFwuKSoiKXwoJyg/OlteJ1xcXG5dfFxcLikqJyl8KChbXFtcKD18JiFcXjo/XVxzKikoXC8oPyFbKlwvXSkoPzpbXlwvXFxcbl18XFwuKSpcL1tnaW1dKilcYil8KFwvXC9bXlxuXSpcbil8KFwvXCooPzooPyFcKlwvKSg/Oi58XG4pKSpcKlwvKS9nLGZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSl7dmFyIGwKcmV0dXJuIHR8fG4/KGw9ZGUubGVuZ3RoLGRlLnB1c2goZSksIiciK2wrIiciKTpyPyhsPWRlLmxlbmd0aCxkZS5wdXNoKHMpLGkrIiciK2wrIiciKToiIiE9PWE/IiAiOiJcbiJ9KQp2ZT12ZS5yZXBsYWNlKC9fX3goWzAtOUEtRl17NH0pL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4iX194MDA1Rl94Iit0fSksdmU9dmUucmVwbGFjZSgvXCQvZywiX194MDAyNCIpLHZlPXZlLnJlcGxhY2UoL3JldHVyblxzKltcblxyXSsvZywicmV0dXJuICIpCnZhciB5ZSx4ZT12ZSxBZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdHx8cj9lOih5ZT0hMCwiIil9CmRvIHllPSExLHhlPXhlLnJlcGxhY2UoLyhbPF0/KTxccyooKD86XD98W0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKikoPzpcW1xdKSooPzpccysoPzpleHRlbmRzfHN1cGVyKVxzK1tBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopPyg/OlxzKixccyooPzpcP3xbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKSg/OlxbXF0pKig/OlxzKyg/OmV4dGVuZHN8c3VwZXIpXHMrW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKik/KSopXHMqPihbPV0/KS9nLEFlKQp3aGlsZSh5ZSkKdmFyIGJlLHdlLEVlLFNlLFBlLENlLE1lLFRlLF9lPXQoeGUpLFJlPXt9LExlPTAsSWU9L1xiKCg/Oig/OnB1YmxpY3xwcml2YXRlfGZpbmFsfHByb3RlY3RlZHxzdGF0aWN8YWJzdHJhY3QpXHMrKSopKGNsYXNzfGludGVyZmFjZSlccysoW0EtWmEtel8kXVtcdyRdKlxiKShccytleHRlbmRzXHMrW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKixccypbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqXGIpKik/KFxzK2ltcGxlbWVudHNccytbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqLFxzKltBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSpcYikqKT9ccyooIkFcZCsiKS9nLERlPS9cYigoPzooPzpwdWJsaWN8cHJpdmF0ZXxmaW5hbHxwcm90ZWN0ZWR8c3RhdGljfGFic3RyYWN0fHN5bmNocm9uaXplZClccyspKikoKD8hKD86ZWxzZXxuZXd8cmV0dXJufHRocm93fGZ1bmN0aW9ufHB1YmxpY3xwcml2YXRlfHByb3RlY3RlZClcYilbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqIkNcZCsiKSopXHMqKFtBLVphLXpfJF1bXHckXSpcYilccyooIkJcZCsiKShccyp0aHJvd3NccytbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqLFxzKltBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopKik/XHMqKCJBXGQrInw7KS9nLE9lPS9eKCg/Oig/OnB1YmxpY3xwcml2YXRlfGZpbmFsfHByb3RlY3RlZHxzdGF0aWMpXHMrKSopKCg/ISg/OmVsc2V8bmV3fHJldHVybnx0aHJvdylcYilbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqIkNcZCsiKSopXHMqKFtBLVphLXpfJF1bXHckXSpcYilccyooPzoiQ1xkKyJccyopKihbPSxdfCQpLyxOZT0vXGIoKD86KD86cHVibGljfHByaXZhdGV8ZmluYWx8cHJvdGVjdGVkfHN0YXRpY3xhYnN0cmFjdClccyspKikoKD8hKD86bmV3fHJldHVybnx0aHJvdylcYilbQS1aYS16XyRdW1x3JF0qXGIpXHMqKCJCXGQrIikoXHMqdGhyb3dzXHMrW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKixccypbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKSopP1xzKigiQVxkKyIpL2csRmU9L14oKD86KD86cHVibGljfHByaXZhdGV8ZmluYWx8cHJvdGVjdGVkfHN0YXRpYylccyspKikoKD8hKD86bmV3fHJldHVybnx0aHJvdylcYilbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqIkNcZCsiKSopXHMqLyxrZT0vXGJmdW5jdGlvbig/OlxzKyhbQS1aYS16XyRdW1x3JF0qKSk/XHMqKCJCXGQrIilccyooIkFcZCsiKS9nCnYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0seS5wcm90b3R5cGUuZ2V0TmFtZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wLG49dGhpcy5wYXJhbXMubGVuZ3RoO3Q8bjsrK3QpZS5wdXNoKHRoaXMucGFyYW1zW3RdLm5hbWUpCnJldHVybiBlfSx5LnByb3RvdHlwZS5wcmVwZW5kTWV0aG9kQXJncz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tZXRob2RBcmdzUGFyYW0/IntcbnZhciAiK3RoaXMubWV0aG9kQXJnc1BhcmFtLm5hbWUrIiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgIit0aGlzLnBhcmFtcy5sZW5ndGgrIik7XG4iK2Uuc3Vic3RyaW5nKDEpOmV9LHkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMucGFyYW1zLmxlbmd0aClyZXR1cm4iKCkiCmZvcih2YXIgZT0iKCIsdD0wLG49dGhpcy5wYXJhbXMubGVuZ3RoO3Q8bjsrK3QpZSs9dGhpcy5wYXJhbXNbdF0rIiwgIgpyZXR1cm4gZS5zdWJzdHJpbmcoMCxlLmxlbmd0aC0yKSsiKSJ9LGIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIm5ldyAoIit0aGlzLmJvZHkrIikifSxFLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWJlLHQ9aCh7dGhpczpudWxsfSx0aGlzLnBhcmFtcy5nZXROYW1lcygpKQpiZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShuLm5hbWUpP24ubmFtZTplKG4pfQp2YXIgbj0iZnVuY3Rpb24iCnRoaXMubmFtZSYmKG4rPSIgIit0aGlzLm5hbWUpCnZhciByPXRoaXMucGFyYW1zLnByZXBlbmRNZXRob2RBcmdzKHRoaXMuYm9keS50b1N0cmluZygpKQpyZXR1cm4gbis9dGhpcy5wYXJhbXMrIiAiK3IsYmU9ZSxufSxQLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWJlCmJlPWZ1bmN0aW9uKHQpe3JldHVybiJ0aGlzIj09PXQubmFtZT8idGhpcyI6ZSh0KX0KZm9yKHZhciB0PSIiLG49MCxyPXRoaXMubWVtYmVycy5sZW5ndGg7bjxyOysrbil0aGlzLm1lbWJlcnNbbl0ubGFiZWwmJih0Kz10aGlzLm1lbWJlcnNbbl0ubGFiZWwrIjogIiksdCs9dGhpcy5tZW1iZXJzW25dLnZhbHVlLnRvU3RyaW5nKCkrIiwgIgpyZXR1cm4gYmU9ZSx0LnN1YnN0cmluZygwLHQubGVuZ3RoLTIpfSxfLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudHJhbnNmb3Jtcyx0PVQodGhpcy5leHByKQpyZXR1cm4gdC5yZXBsYWNlKC8iIShcZCspIi9nLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbbl0udG9TdHJpbmcoKX0pfSxUZT1mdW5jdGlvbihlKXt2YXIgdD1bXSxuPU0oZSkKcmV0dXJuIG49bi5yZXBsYWNlKC8iSChcZCspIi9nLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQucHVzaChTKF9lW25dKSksJyIhJysodC5sZW5ndGgtMSkrJyInfSksbj1uLnJlcGxhY2UoLyJGKFxkKykiL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5wdXNoKHcoX2Vbbl0pKSwnIiEnKyh0Lmxlbmd0aC0xKSsnIid9KSxuPW4ucmVwbGFjZSgvIkkoXGQrKSIvZyxmdW5jdGlvbihlLG4pe3JldHVybiB0LnB1c2goQyhfZVtuXSkpLCciIScrKHQubGVuZ3RoLTEpKyciJ30pLG5ldyBfKG4sdCl9LFIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSsiID0gIit0aGlzLnZhbHVlfSxELnByb3RvdHlwZS5nZXROYW1lcz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLmRlZmluaXRpb25zLmxlbmd0aDt0PG47Kyt0KWUucHVzaCh0aGlzLmRlZmluaXRpb25zW3RdLm5hbWUpCnJldHVybiBlfSxELnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ2YXIgIit0aGlzLmRlZmluaXRpb25zLmpvaW4oIiwiKX0sTy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHByZXNzaW9uLnRvU3RyaW5nKCl9LEYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIigiK3RoaXMuaW5pdFN0YXRlbWVudCsiOyAiK3RoaXMuY29uZGl0aW9uKyI7ICIrdGhpcy5zdGVwKyIpIn0say5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmluaXRTdGF0ZW1lbnQudG9TdHJpbmcoKQpyZXR1cm4gZS5pbmRleE9mKCI9Iik+PTAmJihlPWUuc3Vic3RyaW5nKDAsZS5pbmRleE9mKCI9IikpKSwiKCIrZSsiIGluICIrdGhpcy5jb250YWluZXIrIikifSxCLml0ZXJhdG9ySWQ9MCxCLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5pdFN0YXRlbWVudC50b1N0cmluZygpLHQ9IiRpdCIrQi5pdGVyYXRvcklkKyssbj1lLnJlcGxhY2UoL15ccyp2YXJccyovLCIiKS5zcGxpdCgiPSIpWzBdLHI9InZhciAiK3QrIiA9IG5ldyAkcC5PYmplY3RJdGVyYXRvcigiK3RoaXMuY29udGFpbmVyKyIpLCAiK24rIiA9IHZvaWQoMCkiLGk9dCsiLmhhc05leHQoKSAmJiAoKCIrbisiID0gIit0KyIubmV4dCgpKSB8fCB0cnVlKSIKcmV0dXJuIigiK3IrIjsgIitpKyI7KSJ9LFYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiIrdGhpcy5ib2R5fSx6LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIiK3RoaXMuYm9keX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1oKHt9LHRoaXMucGFyYW1zLmdldE5hbWVzKCkpLHQ9YmUKYmU9ZnVuY3Rpb24obil7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkobi5uYW1lKT9uLm5hbWU6dChuKX0KdmFyIG49dGhpcy5wYXJhbXMucHJlcGVuZE1ldGhvZEFyZ3ModGhpcy5ib2R5LnRvU3RyaW5nKCkpLHI9ImZ1bmN0aW9uICIrdGhpcy5tZXRob2RJZCt0aGlzLnBhcmFtcysiICIrbisiXG4iCnJldHVybiBiZT10LHJ9LFkucHJvdG90eXBlLmdldE5hbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMuZGVmaW5pdGlvbnMubGVuZ3RoO3Q8bjsrK3QpZS5wdXNoKHRoaXMuZGVmaW5pdGlvbnNbdF0ubmFtZSkKcmV0dXJuIGV9LFkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9YmUoe25hbWU6Ilt0aGlzXSJ9KQppZih0aGlzLmlzU3RhdGljKXtmb3IodmFyIHQ9dGhpcy5vd25lci5uYW1lLG49W10scj0wLGk9dGhpcy5kZWZpbml0aW9ucy5sZW5ndGg7cjxpOysrcil7dmFyIHM9dGhpcy5kZWZpbml0aW9uc1tyXSxvPXMubmFtZSxhPXQrIi4iK28sbD0iaWYoIithKyIgPT09IHZvaWQoMCkpIHtcbiAiK2ErIiA9ICIrcy52YWx1ZSsiOyB9XG4kcC5kZWZpbmVQcm9wZXJ0eSgiK2UrIiwgJyIrbysiJywgeyBnZXQ6IGZ1bmN0aW9uKCl7cmV0dXJuICIrYSsiO30sIHNldDogZnVuY3Rpb24odmFsKXsiK2ErIiA9IHZhbDt9IH0pO1xuIgpuLnB1c2gobCl9cmV0dXJuIG4uam9pbigiIil9cmV0dXJuIGUrIi4iK3RoaXMuZGVmaW5pdGlvbnMuam9pbigiOyAiK2UrIi4iKX0sSy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1oKHt9LHRoaXMucGFyYW1zLmdldE5hbWVzKCkpLHQ9YmUKYmU9ZnVuY3Rpb24obil7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkobi5uYW1lKT9uLm5hbWU6dChuKX0KdmFyIG49ImZ1bmN0aW9uICRjb25zdHJfIit0aGlzLnBhcmFtcy5wYXJhbXMubGVuZ3RoK3RoaXMucGFyYW1zLnRvU3RyaW5nKCkscj10aGlzLnBhcmFtcy5wcmVwZW5kTWV0aG9kQXJncyh0aGlzLmJvZHkudG9TdHJpbmcoKSkKcmV0dXJuL1wkKHN1cGVyQ3N0cnxjb25zdHIpXGIvLnRlc3Qocil8fChyPSJ7XG4kc3VwZXJDc3RyKCk7XG4iK3Iuc3Vic3RyaW5nKDEpKSxiZT10LG4rcisiXG4ifSxaLnByb3RvdHlwZS5nZXRNZW1iZXJzPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLm93bmVyLmJhc2UmJnRoaXMub3duZXIuYmFzZS5ib2R5LmdldE1lbWJlcnMoZSx0LG4pCnZhciByLGkscyxvCmZvcihyPTAscz10aGlzLmZpZWxkcy5sZW5ndGg7cjxzOysrcil7dmFyIGE9dGhpcy5maWVsZHNbcl0uZ2V0TmFtZXMoKQpmb3IoaT0wLG89YS5sZW5ndGg7aTxvOysraSllW2FbaV1dPXRoaXMuZmllbGRzW3JdfWZvcihyPTAscz10aGlzLm1ldGhvZHNOYW1lcy5sZW5ndGg7cjxzOysrcil7dmFyIGw9dGhpcy5tZXRob2RzTmFtZXNbcl0KdFtsXT0hMH1mb3Iocj0wLHM9dGhpcy5pbm5lckNsYXNzZXMubGVuZ3RoO3I8czsrK3Ipe3ZhciBoPXRoaXMuaW5uZXJDbGFzc2VzW3JdCm5baC5uYW1lXT1ofX0sWi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgdD0wO2U7KSsrdCxlPWUuc2NvcGUKcmV0dXJuIHR9dmFyIHQ9KGUodGhpcy5vd25lciksdGhpcy5uYW1lKSxuPSIiLHI9IiIsaT17fSxzPXt9LG89e30KdGhpcy5nZXRNZW1iZXJzKGkscyxvKQp2YXIgYSxsCmlmKHRoaXMub3duZXIuaW50ZXJmYWNlcyl7dmFyIGgsdT1bXQpmb3IoYT0wLGw9dGhpcy5pbnRlcmZhY2VzTmFtZXMubGVuZ3RoO2E8bDsrK2EpdGhpcy5vd25lci5pbnRlcmZhY2VzW2FdJiYoaD1iZSh7bmFtZTp0aGlzLmludGVyZmFjZXNOYW1lc1thXX0pLHUucHVzaChoKSxuKz0iJHAuZXh0ZW5kSW50ZXJmYWNlTWVtYmVycygiK3QrIiwgIitoKyIpO1xuIikKcis9dCsiLiRpbnRlcmZhY2VzID0gWyIrdS5qb2luKCIsICIpKyJdO1xuIn1mb3Iocis9dCsiLiRpc0ludGVyZmFjZSA9IHRydWU7XG4iLHIrPXQrIi4kbWV0aG9kcyA9IFsnIit0aGlzLm1ldGhvZHNOYW1lcy5qb2luKCInLCAnIikrIiddO1xuIixHKHRoaXMuaW5uZXJDbGFzc2VzKSxhPTAsbD10aGlzLmlubmVyQ2xhc3Nlcy5sZW5ndGg7YTxsOysrYSl7dmFyIGM9dGhpcy5pbm5lckNsYXNzZXNbYV0KYy5pc1N0YXRpYyYmKG4rPXQrIi4iK2MubmFtZSsiID0gIitjKyI7XG4iKX1mb3IoYT0wLGw9dGhpcy5maWVsZHMubGVuZ3RoO2E8bDsrK2Epe3ZhciBmPXRoaXMuZmllbGRzW2FdCmYuaXNTdGF0aWMmJihuKz10KyIuIitmLmRlZmluaXRpb25zLmpvaW4oIjtcbiIrdCsiLiIpKyI7XG4iKX1yZXR1cm4iKGZ1bmN0aW9uKCkge1xuZnVuY3Rpb24gIit0KyIoKSB7IHRocm93ICdVbmFibGUgdG8gY3JlYXRlIHRoZSBpbnRlcmZhY2UnOyB9XG4iK24rcisicmV0dXJuICIrdCsiO1xufSkoKSJ9LFNlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpCnI9ZyhyKSxyPWQocix0KQp2YXIgcz1bXSxhPVtdCnI9ci5yZXBsYWNlKC8iKFtERV0pKFxkKykiL2csZnVuY3Rpb24oZSx0LG4pe3JldHVybiJEIj09PXQ/cy5wdXNoKG4pOiJFIj09PXQmJmEucHVzaChuKSwiIn0pCnZhciBsLGgsdSxjPXIuc3BsaXQoLzsoPzpccyo7KSovZykKZm9yKG4hPT1vJiYobD1uLnJlcGxhY2UoL15ccypleHRlbmRzXHMrKC4rPylccyokL2csIiQxIikuc3BsaXQoL1xzKixccyovZykpLGg9MCx1PXMubGVuZ3RoO2g8dTsrK2gpe3ZhciBmPVgoX2Vbc1toXV0pCnNbaF09Zi5uYW1lfWZvcihoPTAsdT1jLmxlbmd0aC0xO2g8dTsrK2gpe3ZhciBwPWkoY1toXSkKY1toXT1qKHAubWlkZGxlKX12YXIgbT1jLnBvcCgpCmZvcihoPTAsdT1hLmxlbmd0aDtoPHU7KytoKWFbaF09VShfZVthW2hdXSkKcmV0dXJuIG5ldyBaKHQsbCxzLGMsYSx7dGFpbDptfSl9LHEucHJvdG90eXBlLmdldE1lbWJlcnM9ZnVuY3Rpb24oZSx0LG4pe3RoaXMub3duZXIuYmFzZSYmdGhpcy5vd25lci5iYXNlLmJvZHkuZ2V0TWVtYmVycyhlLHQsbikKdmFyIHIsaSxzLG8KZm9yKHI9MCxzPXRoaXMuZmllbGRzLmxlbmd0aDtyPHM7KytyKXt2YXIgYT10aGlzLmZpZWxkc1tyXS5nZXROYW1lcygpCmZvcihpPTAsbz1hLmxlbmd0aDtpPG87KytpKWVbYVtpXV09dGhpcy5maWVsZHNbcl19Zm9yKHI9MCxzPXRoaXMubWV0aG9kcy5sZW5ndGg7cjxzOysrcil7dmFyIGw9dGhpcy5tZXRob2RzW3JdCnRbbC5uYW1lXT1sfWZvcihyPTAscz10aGlzLmlubmVyQ2xhc3Nlcy5sZW5ndGg7cjxzOysrcil7dmFyIGg9dGhpcy5pbm5lckNsYXNzZXNbcl0KbltoLm5hbWVdPWh9fSxxLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciB0PTA7ZTspKyt0LGU9ZS5zY29wZQpyZXR1cm4gdH12YXIgdD1lKHRoaXMub3duZXIpLG49IiR0aGlzXyIrdCxyPXRoaXMubmFtZSxpPSJ2YXIgIituKyIgPSB0aGlzO1xuIixvPSIiLGE9IiIsbD17fSxoPXt9LHU9e30KdGhpcy5nZXRNZW1iZXJzKGwsaCx1KQp2YXIgYz1iZQpiZT1mdW5jdGlvbihlKXt2YXIgdD1lLm5hbWUKcmV0dXJuInRoaXMiPT09dD9lLmNhbGxTaWdufHwhZS5tZW1iZXI/bisiLiRzZWxmIjpuOmwuaGFzT3duUHJvcGVydHkodCk/bFt0XS5pc1N0YXRpYz9yKyIuIit0Om4rIi4iK3Q6dS5oYXNPd25Qcm9wZXJ0eSh0KT9uKyIuIit0OmguaGFzT3duUHJvcGVydHkodCk/aFt0XS5pc1N0YXRpYz9yKyIuIit0Om4rIi4kc2VsZi4iK3Q6YyhlKX0KdmFyIGYKdGhpcy5iYXNlQ2xhc3NOYW1lPyhmPWMoe25hbWU6dGhpcy5iYXNlQ2xhc3NOYW1lfSksaSs9InZhciAkc3VwZXIgPSB7ICR1cGNhc3Q6ICIrbisiIH07XG4iLGkrPSJmdW5jdGlvbiAkc3VwZXJDc3RyKCl7IitmKyIuYXBwbHkoJHN1cGVyLGFyZ3VtZW50cyk7aWYoISgnJHNlbGYnIGluICRzdXBlcikpICRwLmV4dGVuZENsYXNzQ2hhaW4oJHN1cGVyKX1cbiIsYSs9cisiLiRiYXNlID0gIitmKyI7XG4iKTppKz0iZnVuY3Rpb24gJHN1cGVyQ3N0cigpeyRwLmV4dGVuZENsYXNzQ2hhaW4oIituKyIpfVxuIix0aGlzLm93bmVyLmJhc2UmJihvKz0iJHAuZXh0ZW5kU3RhdGljTWVtYmVycygiK3IrIiwgIitmKyIpO1xuIikKdmFyIHAsbSxnLGQKaWYodGhpcy5vd25lci5pbnRlcmZhY2VzKXt2YXIgdix5PVtdCmZvcihwPTAsbT10aGlzLmludGVyZmFjZXNOYW1lcy5sZW5ndGg7cDxtOysrcCl0aGlzLm93bmVyLmludGVyZmFjZXNbcF0mJih2PWMoe25hbWU6dGhpcy5pbnRlcmZhY2VzTmFtZXNbcF19KSx5LnB1c2godiksbys9IiRwLmV4dGVuZEludGVyZmFjZU1lbWJlcnMoIityKyIsICIrdisiKTtcbiIpCmErPXIrIi4kaW50ZXJmYWNlcyA9IFsiK3kuam9pbigiLCAiKSsiXTtcbiJ9Zm9yKHRoaXMuZnVuY3Rpb25zLmxlbmd0aD4wJiYoaSs9dGhpcy5mdW5jdGlvbnMuam9pbigiXG4iKSsiXG4iKSxHKHRoaXMuaW5uZXJDbGFzc2VzKSxwPTAsbT10aGlzLmlubmVyQ2xhc3Nlcy5sZW5ndGg7cDxtOysrcCl7dmFyIHg9dGhpcy5pbm5lckNsYXNzZXNbcF0KeC5pc1N0YXRpYz8obys9cisiLiIreC5uYW1lKyIgPSAiK3grIjtcbiIsaSs9bisiLiIreC5uYW1lKyIgPSAiK3IrIi4iK3gubmFtZSsiO1xuIik6aSs9bisiLiIreC5uYW1lKyIgPSAiK3grIjtcbiJ9Zm9yKHA9MCxtPXRoaXMuZmllbGRzLmxlbmd0aDtwPG07KytwKXt2YXIgQT10aGlzLmZpZWxkc1twXQppZihBLmlzU3RhdGljKWZvcihvKz1yKyIuIitBLmRlZmluaXRpb25zLmpvaW4oIjtcbiIrcisiLiIpKyI7XG4iLGc9MCxkPUEuZGVmaW5pdGlvbnMubGVuZ3RoO2c8ZDsrK2cpe3ZhciBiPUEuZGVmaW5pdGlvbnNbZ10ubmFtZSx3PXIrIi4iK2IKaSs9IiRwLmRlZmluZVByb3BlcnR5KCIrbisiLCAnIitiKyInLCB7Z2V0OiBmdW5jdGlvbigpe3JldHVybiAiK3crIn0sIHNldDogZnVuY3Rpb24odmFsKXsiK3crIiA9IHZhbH19KTtcbiJ9ZWxzZSBpKz1uKyIuIitBLmRlZmluaXRpb25zLmpvaW4oIjtcbiIrbisiLiIpKyI7XG4ifXZhciBFPXt9CmZvcihwPTAsbT10aGlzLm1ldGhvZHMubGVuZ3RoO3A8bTsrK3Ape3ZhciBTPXRoaXMubWV0aG9kc1twXSxQPUVbUy5uYW1lXSxDPVMubmFtZSsiJCIrUy5wYXJhbXMucGFyYW1zLmxlbmd0aCxNPSEhUy5wYXJhbXMubWV0aG9kQXJnc1BhcmFtClA/KCsrUCxDKz0iXyIrUCk6UD0xLFMubWV0aG9kSWQ9QyxFW1MubmFtZV09UCxTLmlzU3RhdGljPyhvKz1TLG8rPSIkcC5hZGRNZXRob2QoIityKyIsICciK1MubmFtZSsiJywgIitDKyIsICIrTSsiKTtcbiIsaSs9IiRwLmFkZE1ldGhvZCgiK24rIiwgJyIrUy5uYW1lKyInLCAiK0MrIiwgIitNKyIpO1xuIik6KGkrPVMsaSs9IiRwLmFkZE1ldGhvZCgiK24rIiwgJyIrUy5uYW1lKyInLCAiK0MrIiwgIitNKyIpO1xuIil9aSs9cyh0aGlzLm1pc2MudGFpbCksdGhpcy5jc3Rycy5sZW5ndGg+MCYmKGkrPXRoaXMuY3N0cnMuam9pbigiXG4iKSsiXG4iKSxpKz0iZnVuY3Rpb24gJGNvbnN0cigpIHtcbiIKdmFyIFQ9W10KZm9yKHA9MCxtPXRoaXMuY3N0cnMubGVuZ3RoO3A8bTsrK3Ape3ZhciBfPXRoaXMuY3N0cnNbcF0ucGFyYW1zLnBhcmFtcy5sZW5ndGgsUj0hIXRoaXMuY3N0cnNbcF0ucGFyYW1zLm1ldGhvZEFyZ3NQYXJhbQpULnB1c2goImlmKGFyZ3VtZW50cy5sZW5ndGggIisoUj8iPj0iOiI9PT0iKSsiICIrXysiKSB7ICRjb25zdHJfIitfKyIuYXBwbHkoIituKyIsIGFyZ3VtZW50cyk7IH0iKX1yZXR1cm4gVC5sZW5ndGg+MCYmKGkrPVQuam9pbigiIGVsc2UgIikrIiBlbHNlICIpLGkrPSIkc3VwZXJDc3RyKCk7XG59XG4iLGkrPSIkY29uc3RyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4iLGJlPWMsIihmdW5jdGlvbigpIHtcbmZ1bmN0aW9uICIrcisiKCkge1xuIitpKyJ9XG4iK28rYSsicmV0dXJuICIrcisiO1xufSkoKSJ9LEVlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBzPWUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkKcz1nKHMpLHM9ZChzLHQpCnZhciBhPVtdLGw9W10saD1bXSx1PVtdCnM9cy5yZXBsYWNlKC8iKFtERUdIXSkoXGQrKSIvZyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIkQiPT09dD9hLnB1c2gobik6IkUiPT09dD9sLnB1c2gobik6IkgiPT09dD91LnB1c2gobik6aC5wdXNoKG4pLCIifSkKdmFyIGMsZixwLG09cy5yZXBsYWNlKC9eKD86XHMqOykrLywiIikuc3BsaXQoLzsoPzpccyo7KSovZykKZm9yKG4hPT1vJiYoYz1uLnJlcGxhY2UoL15ccypleHRlbmRzXHMrKFtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopXHMqJC9nLCIkMSIpKSxyIT09byYmKGY9ci5yZXBsYWNlKC9eXHMqaW1wbGVtZW50c1xzKyguKz8pXHMqJC9nLCIkMSIpLnNwbGl0KC9ccyosXHMqL2cpKSxwPTA7cDx1Lmxlbmd0aDsrK3ApdVtwXT1TKF9lW3VbcF1dKQpmb3IocD0wO3A8YS5sZW5ndGg7KytwKWFbcF09WChfZVthW3BdXSkKZm9yKHA9MDtwPG0ubGVuZ3RoLTE7KytwKXt2YXIgdj1pKG1bcF0pCm1bcF09aih2Lm1pZGRsZSl9dmFyIHk9bS5wb3AoKQpmb3IocD0wO3A8aC5sZW5ndGg7KytwKWhbcF09VyhfZVtoW3BdXSkKZm9yKHA9MDtwPGwubGVuZ3RoOysrcClsW3BdPVUoX2VbbFtwXV0pCnJldHVybiBuZXcgcSh0LGMsZix1LGEsbSxoLGwse3RhaWw6eX0pfSxRLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ2YXIgIit0aGlzLm5hbWUrIiA9ICIrdGhpcy5ib2R5KyI7XG4kcC4iK3RoaXMubmFtZSsiID0gIit0aGlzLm5hbWUrIjtcbiJ9LEoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInZhciAiK3RoaXMubmFtZSsiID0gIit0aGlzLmJvZHkrIjtcbiRwLiIrdGhpcy5uYW1lKyIgPSAiK3RoaXMubmFtZSsiO1xuIn0sdGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9aCh7fSx0aGlzLnBhcmFtcy5nZXROYW1lcygpKSx0PWJlCmJlPWZ1bmN0aW9uKG4pe3JldHVybiBlLmhhc093blByb3BlcnR5KG4ubmFtZSk/bi5uYW1lOnQobil9CnZhciBuPXRoaXMucGFyYW1zLnByZXBlbmRNZXRob2RBcmdzKHRoaXMuYm9keS50b1N0cmluZygpKSxyPSJmdW5jdGlvbiAiK3RoaXMubmFtZSt0aGlzLnBhcmFtcysiICIrbisiXG4kcC4iK3RoaXMubmFtZSsiID0gIit0aGlzLm5hbWUrIjtcbiIrdGhpcy5uYW1lKyIgPSAiK3RoaXMubmFtZSsiLmJpbmQoJHApOyIKcmV0dXJuIGJlPXQscn0saWUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWlzYy5wcmVmaXgrdGhpcy5hcmd1bWVudC50b1N0cmluZygpfSxzZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5taXNjLnByZWZpeCt0aGlzLmFyZ3VtZW50LnRvU3RyaW5nKCl9LG9lLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMubWlzYy5wcmVmaXgKcmV0dXJuIHRoaXMuYXJndW1lbnQhPT1vJiYoZSs9dGhpcy5hcmd1bWVudC50b1N0cmluZygpKSxlfSxhZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iY2FzZSAiK3RoaXMuZXhwcisiOiJ9LGxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxhYmVsfSxDZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IFJlZ0V4cCgvXGIoY2F0Y2h8Zm9yfGlmfHN3aXRjaHx3aGlsZXx3aXRoKVxzKiJCKFxkKykifFxiKGRvfGVsc2V8ZmluYWxseXxyZXR1cm58dGhyb3d8dHJ5fGJyZWFrfGNvbnRpbnVlKVxifCgiW0FERUhdKFxkKykiKXxcYihjYXNlKVxzKyhbXjpdKyk6fFxiKFtBLVphLXpfJF1bXHckXSpccyo6KXwoOykvZyksYT1bXQplPXJlKGUpCmZvcih2YXIgbCxoLHU9MDtudWxsIT09KGw9ci5leGVjKGUpKTspe2lmKGxbMV0hPT1vKXt2YXIgYz1lLmxhc3RJbmRleE9mKCciQicsci5sYXN0SW5kZXgpLGY9ZS5zdWJzdHJpbmcodSxjKQoiZm9yIj09PWxbMV0/YS5wdXNoKG5ldyBpZSgkKF9lW2xbMl1dKSx7cHJlZml4OmZ9KSk6ImNhdGNoIj09PWxbMV0/YS5wdXNoKG5ldyBzZSh4KF9lW2xbMl1dKSx7cHJlZml4OmZ9KSk6YS5wdXNoKG5ldyBvZShsWzFdLFRlKF9lW2xbMl1dKSx7cHJlZml4OmZ9KSl9ZWxzZSBpZihsWzNdIT09bylhLnB1c2gobmV3IG9lKGxbM10sbyx7cHJlZml4OmUuc3Vic3RyaW5nKHUsci5sYXN0SW5kZXgpfSkpCmVsc2UgaWYobFs0XSE9PW8pe2lmKGg9ZS5zdWJzdHJpbmcodSxyLmxhc3RJbmRleC1sWzRdLmxlbmd0aCksMCE9PXMoaCkubGVuZ3RoKWNvbnRpbnVlCmEucHVzaChoKQp2YXIgcD1sWzRdLmNoYXJBdCgxKSxtPWxbNV0KIkQiPT09cD9hLnB1c2godChfZVttXSkpOiJFIj09PXA/YS5wdXNoKG4oX2VbbV0pKToiSCI9PT1wP2EucHVzaChTKF9lW21dKSk6YS5wdXNoKFBlKF9lW21dKSl9ZWxzZSBpZihsWzZdIT09bylhLnB1c2gobmV3IGFlKFRlKHMobFs3XSkpKSkKZWxzZSBpZihsWzhdIT09byl7aWYoaD1lLnN1YnN0cmluZyh1LHIubGFzdEluZGV4LWxbOF0ubGVuZ3RoKSwwIT09cyhoKS5sZW5ndGgpY29udGludWUKYS5wdXNoKG5ldyBsZShlLnN1YnN0cmluZyh1LHIubGFzdEluZGV4KSkpfWVsc2V7dmFyIGc9aShlLnN1YnN0cmluZyh1LHIubGFzdEluZGV4LTEpKQphLnB1c2goZy5sZWZ0KSxhLnB1c2goTihnLm1pZGRsZSkpLGEucHVzaChnLnJpZ2h0KyI7Iil9dT1yLmxhc3RJbmRleH12YXIgZD1pKGUuc3Vic3RyaW5nKHUpKQpyZXR1cm4gYS5wdXNoKGQubGVmdCksIiIhPT1kLm1pZGRsZSYmKGEucHVzaChOKGQubWlkZGxlKSksYS5wdXNoKCI7IitkLnJpZ2h0KSksYX0sdWUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9aGUodGhpcy5zdGF0ZW1lbnRzKSx0PWJlCnUoZSl8fChiZT1mdW5jdGlvbihuKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eShuLm5hbWUpP24ubmFtZTp0KG4pfSkKdmFyIG49IntcbiIrdGhpcy5zdGF0ZW1lbnRzLmpvaW4oIiIpKyJcbn0iCnJldHVybiBiZT10LG59LFBlPWZ1bmN0aW9uKGUpe3ZhciB0PWkoZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSkKcmV0dXJuIG5ldyB1ZShDZSh0Lm1pZGRsZSkpfSxjZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPVtdLHI9MCxpPXRoaXMuc3RhdGVtZW50cy5sZW5ndGg7cjxpOysrcillPXRoaXMuc3RhdGVtZW50c1tyXSxlIGluc3RhbmNlb2YgSnx8ZSBpbnN0YW5jZW9mIFE/dC5wdXNoKGUpOm4ucHVzaChlKQpHKHQpCnZhciBzPWhlKHRoaXMuc3RhdGVtZW50cykKYmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uYW1lCnJldHVybiBzLmhhc093blByb3BlcnR5KHQpP3Q6bWUuaGFzT3duUHJvcGVydHkodCl8fGwuaGFzT3duUHJvcGVydHkodCl8fGEuaGFzT3duUHJvcGVydHkodCk/IiRwLiIrdDp0fQp2YXIgbz0iLy8gdGhpcyBjb2RlIHdhcyBhdXRvZ2VuZXJhdGVkIGZyb20gUEpTXG4oZnVuY3Rpb24oJHApIHtcbiIrdC5qb2luKCIiKSsiXG4iK24uam9pbigiIikrIlxufSkiCnJldHVybiBiZT1udWxsLG99LE1lPWZ1bmN0aW9uKCl7dmFyIGU9ZyhfZVswXSkKcmV0dXJuIGU9ZS5yZXBsYWNlKC9cYmltcG9ydFxzK1teO10rOy9nLCIiKSxuZXcgY2UoQ2UoZSxuZSxlZSkpfQp2YXIgQmU9TWUoKQpmZShCZSkscGUoQmUpCnZhciAkZT1CZS50b1N0cmluZygpCnJldHVybiAkZT0kZS5yZXBsYWNlKC9ccypcbig/OltcdCBdKlxuKSsvZywiXG5cbiIpLCRlPSRlLnJlcGxhY2UoL19feChbMC05QS1GXXs0fSkvZyxmdW5jdGlvbihlLHQpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHQsMTYpKX0pLG4oJGUsZGUpfWZ1bmN0aW9uIHMoZSx0KXt2YXIgbj1uZXcgUmVnRXhwKC9cL1wqXHMqQHBqc1xzKygoPzpbXlwqXXxcKitbXlwqXC9dKSopXCpcLy9nKS5leGVjKGUpCmlmKG4mJjI9PT1uLmxlbmd0aClmb3IodmFyIHI9W10saT1uLnNwbGljZSgxLDIpWzBdLnJlcGxhY2UoL1x7KFtcc1xTXSo/KVx9L2csZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5wdXNoKHQpLCJ7Iisoci5sZW5ndGgtMSkrIn0ifX0oKSkucmVwbGFjZSgiXG4iLCIiKS5yZXBsYWNlKCJcciIsIiIpLnNwbGl0KCI7Iikscz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9eXHMqWyInXT8vLCIiKS5yZXBsYWNlKC9bIiddP1xzKiQvLCIiKX0sbz0wLGE9aS5sZW5ndGg7bzxhO28rKyl7dmFyIGw9aVtvXS5zcGxpdCgiPSIpCmlmKGwmJjI9PT1sLmxlbmd0aCl7dmFyIGg9cyhsWzBdKSx1PXMobFsxXSksYz1bXQppZigicHJlbG9hZCI9PT1oKXtjPXUuc3BsaXQoIiwiKQpmb3IodmFyIGY9MCxwPWMubGVuZ3RoO2Y8cDtmKyspe3ZhciBtPXMoY1tmXSkKdC5pbWFnZUNhY2hlLmFkZChtKX19ZWxzZSBpZigiZm9udCI9PT1oKXtjPXUuc3BsaXQoIiwiKQpmb3IodmFyIGc9MCxkPWMubGVuZ3RoO2c8ZDtnKyspe3ZhciB2PXMoY1tnXSkseT0vXlx7KFxkKj8pXH0kLy5leGVjKHYpClBGb250LnByZWxvYWRpbmcuYWRkKHk/SlNPTi5wYXJzZSgieyIrclt5WzFdXSsifSIpOnYpfX1lbHNlInBhdXNlT25CbHVyIj09PWg/dC5vcHRpb25zLnBhdXNlT25CbHVyPSJ0cnVlIj09PXU6Imdsb2JhbEtleUV2ZW50cyI9PT1oP3Qub3B0aW9ucy5nbG9iYWxLZXlFdmVudHM9InRydWUiPT09dToicGFyYW0tIj09PWguc3Vic3RyaW5nKDAsNik/dC5wYXJhbXNbaC5zdWJzdHJpbmcoNildPXU6dC5vcHRpb25zW2hdPXV9fXJldHVybiBlfXZhciBvLGE9bi5kZWZhdWx0U2NvcGUsbD1hLlBDb25zdGFudHMsaD1uLmFGdW5jdGlvbnMsdT1uLkJyb3dzZXIsYz11LmRvY3VtZW50CnQuY29tcGlsZT1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdC5Ta2V0Y2gscj1zKGUsbiksbz1pKHIpCnJldHVybiBuLnNvdXJjZUNvZGU9byxufQp2YXIgZj1lKCIuLi9IZWxwZXJzL1Bqc0NvbnNvbGUiKQpyZXR1cm4gdC5sb2dnZXI9bmV3IGYoYyksdH19LHsiLi4vSGVscGVycy9QanNDb25zb2xlIjo1fV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIGUgaW4gbD9sW2VdOiJmdW5jdGlvbiI9PXR5cGVvZiBsW3RdP2xbdF06ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlCmlmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIHQ9W10KcmV0dXJuIHQubGVuZ3RoPWUsdH19fXZhciByPWUuZGVmYXVsdFNjb3BlLGk9ZS5leHRlbmQscz1lLkJyb3dzZXIsbz1zLmFqYXgsYT1zLm5hdmlnYXRvcixsPXMud2luZG93LGg9KGwuWE1MSHR0cFJlcXVlc3Qscy5kb2N1bWVudCksdT1lLm5vb3AsYz1yLlBDb25zdGFudHMKUEZvbnQ9ci5QRm9udCxQU2hhcGVTVkc9ci5QU2hhcGVTVkcsUFZlY3Rvcj1yLlBWZWN0b3IsQ2hhcj1DaGFyYWN0ZXI9ci5DaGFyLE9iamVjdEl0ZXJhdG9yPXIuT2JqZWN0SXRlcmF0b3IsWE1MRWxlbWVudD1yLlhNTEVsZW1lbnQsWE1MPXIuWE1MCnZhciBmLHA9bC5IVE1MQ2FudmFzRWxlbWVudCxtPWwuSFRNTEltYWdlRWxlbWVudAp0cnl7Zj1sLmxvY2FsU3RvcmFnZX1jYXRjaChlKXtmPXt9fSJkb2N1bWVudCJpbiB0aGlzJiYhKCJmYWtlImluIHRoaXMuZG9jdW1lbnQpCmguaGVhZHx8KGguaGVhZD1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0pCnZhciBnPW4oIkZsb2F0MzJBcnJheSIsIldlYkdMRmxvYXRBcnJheSIpLGQ9bigiSW50MzJBcnJheSIsIldlYkdMSW50QXJyYXkiKSx2PW4oIlVpbnQxNkFycmF5IiwiV2ViR0xVbnNpZ25lZFNob3J0QXJyYXkiKSx5PW4oIlVpbnQ4QXJyYXkiLCJXZWJHTFVuc2lnbmVkQnl0ZUFycmF5IikKaWYoaC5kb2N1bWVudE1vZGU+PTkmJiFoLmRvY3R5cGUpdGhyb3ciVGhlIGRvY3R5cGUgZGlyZWN0aXZlIGlzIG1pc3NpbmcuIFRoZSByZWNvbW1lbmRlZCBkb2N0eXBlIGluIEludGVybmV0IEV4cGxvcmVyIGlzIHRoZSBIVE1MNSBkb2N0eXBlOiA8IURPQ1RZUEUgaHRtbD4iCnZhciB4PVtdLEE9e30sYj1mdW5jdGlvbihlKXtlLmV4dGVybmFscy5jYW52YXMuaWQhPT10JiZlLmV4dGVybmFscy5jYW52YXMuaWQubGVuZ3RofHwoZS5leHRlcm5hbHMuY2FudmFzLmlkPSJfX3Byb2Nlc3NpbmciK3gubGVuZ3RoKSxBW2UuZXh0ZXJuYWxzLmNhbnZhcy5pZF09eC5sZW5ndGgseC5wdXNoKGUpfSx3PWZ1bmN0aW9uKGUpe3guc3BsaWNlKEFbZV0sMSksZGVsZXRlIEFbZV19LEU9dGhpcy5Qcm9jZXNzaW5nPWZ1bmN0aW9uKGUsbixzKXtmdW5jdGlvbiB4KGUsdCxuKXtlLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSk6ZS5hdHRhY2hFdmVudCgib24iK3QsbikseWUucHVzaCh7ZWxlbTplLHR5cGU6dCxmbjpufSl9ZnVuY3Rpb24gQShlKXt2YXIgdD1lLmVsZW0sbj1lLnR5cGUscj1lLmZuCnQucmVtb3ZlRXZlbnRMaXN0ZW5lcj90LnJlbW92ZUV2ZW50TGlzdGVuZXIobixyLCExKTp0LmRldGFjaEV2ZW50JiZ0LmRldGFjaEV2ZW50KCJvbiIrbixyKX1mdW5jdGlvbiBTKGUsdCl7T2JqZWN0LmtleXMoeWUpLmZvckVhY2goZnVuY3Rpb24obil7dC5pbmRleE9mKG4udHlwZSk+LTEmJm4uZWxlbT09ZSYmQShuLnR5cGUpfSl9ZnVuY3Rpb24gUChlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwxKX1mdW5jdGlvbiBDKGUsbixyLGkpe3ZhciBzPVd0LmxvY2F0aW9uc1tlXQpzPT09dCYmKHM9QWUuZ2V0VW5pZm9ybUxvY2F0aW9uKG4sciksV3QubG9jYXRpb25zW2VdPXMpLG51bGwhPT1zJiYoND09PWkubGVuZ3RoP0FlLnVuaWZvcm00ZnYocyxpKTozPT09aS5sZW5ndGg/QWUudW5pZm9ybTNmdihzLGkpOjI9PT1pLmxlbmd0aD9BZS51bmlmb3JtMmZ2KHMsaSk6QWUudW5pZm9ybTFmKHMsaSkpfWZ1bmN0aW9uIE0oZSxuLHIsaSl7dmFyIHM9V3QubG9jYXRpb25zW2VdCnM9PT10JiYocz1BZS5nZXRVbmlmb3JtTG9jYXRpb24obixyKSxXdC5sb2NhdGlvbnNbZV09cyksbnVsbCE9PXMmJig0PT09aS5sZW5ndGg/QWUudW5pZm9ybTRpdihzLGkpOjM9PT1pLmxlbmd0aD9BZS51bmlmb3JtM2l2KHMsaSk6Mj09PWkubGVuZ3RoP0FlLnVuaWZvcm0yaXYocyxpKTpBZS51bmlmb3JtMWkocyxpKSl9ZnVuY3Rpb24gVChlLG4scixpLHMpe3ZhciBvPVd0LmxvY2F0aW9uc1tlXQpvPT09dCYmKG89QWUuZ2V0VW5pZm9ybUxvY2F0aW9uKG4sciksV3QubG9jYXRpb25zW2VdPW8pLG8hPT0tMSYmKDE2PT09cy5sZW5ndGg/QWUudW5pZm9ybU1hdHJpeDRmdihvLGkscyk6OT09PXMubGVuZ3RoP0FlLnVuaWZvcm1NYXRyaXgzZnYobyxpLHMpOkFlLnVuaWZvcm1NYXRyaXgyZnYobyxpLHMpKX1mdW5jdGlvbiBfKGUsbixyLGkscyl7dmFyIG89V3QuYXR0cmlidXRlc1tlXQpvPT09dCYmKG89QWUuZ2V0QXR0cmliTG9jYXRpb24obixyKSxXdC5hdHRyaWJ1dGVzW2VdPW8pLG8hPT0tMSYmKEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLHMpLEFlLnZlcnRleEF0dHJpYlBvaW50ZXIobyxpLEFlLkZMT0FULCExLDAsMCksQWUuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobykpfWZ1bmN0aW9uIFIoZSxuLHIpe3ZhciBpPVd0LmF0dHJpYnV0ZXNbZV0KaT09PXQmJihpPUFlLmdldEF0dHJpYkxvY2F0aW9uKG4sciksV3QuYXR0cmlidXRlc1tlXT1pKSxpIT09LTEmJkFlLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKX1mdW5jdGlvbiBMKGUsdCxuLHIpe3ZhciBpLHMsbyxhCmlmKFV0PT09Yy5IU0Ipe3ZhciBsPXhlLmNvbG9yLnRvUkdCKGUsdCxuKQppPWxbMF0scz1sWzFdLG89bFsyXX1lbHNlIGk9TWF0aC5yb3VuZCgyNTUqKGUvQnQpKSxzPU1hdGgucm91bmQoMjU1Kih0LyR0KSksbz1NYXRoLnJvdW5kKDI1NSoobi9HdCkpCnJldHVybiBhPU1hdGgucm91bmQoMjU1KihyL2t0KSksaT1pPDA/MDppLHM9czwwPzA6cyxvPW88MD8wOm8sYT1hPDA/MDphLGk9aT4yNTU/MjU1Omkscz1zPjI1NT8yNTU6cyxvPW8+MjU1PzI1NTpvLGE9YT4yNTU/MjU1OmEsYTw8MjQmYy5BTFBIQV9NQVNLfGk8PDE2JmMuUkVEX01BU0t8czw8OCZjLkdSRUVOX01BU0t8byZjLkJMVUVfTUFTS31mdW5jdGlvbiBJKGUsdCl7dmFyIG4KcmV0dXJuIGUmYy5BTFBIQV9NQVNLPyhuPU1hdGgucm91bmQoMjU1Kih0L2t0KSksbj1uPjI1NT8yNTU6bixuPW48MD8wOm4sZS0oZSZjLkFMUEhBX01BU0spKyhuPDwyNCZjLkFMUEhBX01BU0spKTpVdD09PWMuUkdCP0woZSxlLGUsdCk6VXQ9PT1jLkhTQj9MKDAsMCxlL0J0Kkd0LHQpOnZvaWQgMH1mdW5jdGlvbiBEKGUpe2lmKGU8PUJ0JiZlPj0wKXtpZihVdD09PWMuUkdCKXJldHVybiBMKGUsZSxlLGt0KQppZihVdD09PWMuSFNCKXJldHVybiBMKDAsMCxlL0J0Kkd0LGt0KX1pZihlKXJldHVybiBlPjIxNDc0ODM2NDcmJihlLT00Mjk0OTY3Mjk2KSxlfWZ1bmN0aW9uIE8oZSl7dmFyIHQsbixyCnQ9KChlJmMuUkVEX01BU0spPj4+MTYpLzI1NSxuPSgoZSZjLkdSRUVOX01BU0spPj4+OCkvMjU1LHI9KGUmYy5CTFVFX01BU0spLzI1NQp2YXIgaSxzLG89eGUubWF4KHhlLm1heCh0LG4pLHIpLGE9eGUubWluKHhlLm1pbih0LG4pLHIpCnJldHVybiBhPT09bz9bMCwwLG8qR3RdOihzPShvLWEpL28saT10PT09bz8obi1yKS8oby1hKTpuPT09bz8yKyhyLXQpLyhvLWEpOjQrKHQtbikvKG8tYSksaS89NixpPDA/aSs9MTppPjEmJihpLT0xKSxbaSpCdCxzKiR0LG8qR3RdKX1mdW5jdGlvbiBOKCl7QWUuc2F2ZSgpfWZ1bmN0aW9uIEYoKXtBZS5yZXN0b3JlKCksbXQ9ITAsdXQ9ITB9ZnVuY3Rpb24gaygpe3ZhciBlPShEYXRlLm5vdygpLWp0KS8xZTMKS3QrKwp2YXIgdD1LdC9lCmU+LjUmJihqdD1EYXRlLm5vdygpLEt0PTAseGUuX19mcmFtZVJhdGU9dCkseGUuZnJhbWVDb3VudCsrfWZ1bmN0aW9uIEIoZSl7dmFyIHQ9cGFyc2VJbnQoIjB4IitlLDE2KQpyZXR1cm4gdD4yMTQ3NDgzNjQ3JiYodC09NDI5NDk2NzI5NiksdH1mdW5jdGlvbiAkKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT8wIT09ZToiYm9vbGVhbiI9PXR5cGVvZiBlP2U6InN0cmluZyI9PXR5cGVvZiBlPyJ0cnVlIj09PWUudG9Mb3dlckNhc2UoKTplIGluc3RhbmNlb2YgQ2hhcj80OT09PWUuY29kZXx8ODQ9PT1lLmNvZGV8fDExNj09PWUuY29kZTp2b2lkIDB9ZnVuY3Rpb24gRyhlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/ZToiYm9vbGVhbiI9PXR5cGVvZiBlP2U/MTowOiJzdHJpbmciPT10eXBlb2YgZT9wYXJzZUZsb2F0KGUpOmUgaW5zdGFuY2VvZiBDaGFyP2UuY29kZTp2b2lkIDB9ZnVuY3Rpb24gVihlLHQpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gNDI5NDk2NzI5NSZlCmlmKCJib29sZWFuIj09dHlwZW9mIGUpcmV0dXJuIGU/MTowCmlmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIG49cGFyc2VJbnQoZSx0fHwxMCkKcmV0dXJuIDQyOTQ5NjcyOTUmbn1yZXR1cm4gZSBpbnN0YW5jZW9mIENoYXI/ZS5jb2RlOnZvaWQgMH1mdW5jdGlvbiB6KCl7YXQmJih1dCYmKEFlLmZpbGxTdHlsZT14ZS5jb2xvci50b1N0cmluZyhodCksdXQ9ITEpLEFlLmZpbGwoKSl9ZnVuY3Rpb24gVSgpe2N0JiYobXQmJihBZS5zdHJva2VTdHlsZT14ZS5jb2xvci50b1N0cmluZyhwdCksbXQ9ITEpLEFlLnN0cm9rZSgpKX1mdW5jdGlvbiBIKCl7eigpLFUoKSxBZS5jbG9zZVBhdGgoKX1mdW5jdGlvbiBYKGUsbixyKXt2YXIgaT13ci5zaGlmdCgpCmk9PT10JiYoaT17fSxpLmNhbnZhcz1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGkuY29udGV4dD1pLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpKSx3ci5wdXNoKGkpCnZhciBzPWkuY2FudmFzLG89aS5jb250ZXh0LGE9bnx8ZS53aWR0aCxsPXJ8fGUuaGVpZ2h0CnJldHVybiBzLndpZHRoPWEscy5oZWlnaHQ9bCxlPyJkYXRhImluIGU/by5wdXRJbWFnZURhdGEoZSwwLDApOihvLmNsZWFyUmVjdCgwLDAsYSxsKSxvLmRyYXdJbWFnZShlLDAsMCxhLGwpKTpvLmNsZWFyUmVjdCgwLDAsYSxsKSxpfWZ1bmN0aW9uIFkoZSl7cmV0dXJue2dldExlbmd0aDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtpZihlLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGdldCBsZW5ndGguIgpyZXR1cm4gZS5pbWFnZURhdGEuZGF0YS5sZW5ndGg/ZS5pbWFnZURhdGEuZGF0YS5sZW5ndGgvNDowfX0oZSksZ2V0UGl4ZWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPTQqdCxyPWUuaW1hZ2VEYXRhLmRhdGEKaWYoZS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBnZXQgcGl4ZWxzLiIKcmV0dXJuIHJbbiszXTw8MjQmYy5BTFBIQV9NQVNLfHJbbl08PDE2JmMuUkVEX01BU0t8cltuKzFdPDw4JmMuR1JFRU5fTUFTS3xyW24rMl0mYy5CTFVFX01BU0t9fShlKSxzZXRQaXhlbDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgcj00KnQsaT1lLmltYWdlRGF0YS5kYXRhCmlmKGUuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3Qgc2V0IHBpeGVsLiIKaVtyKzBdPShuJmMuUkVEX01BU0spPj4+MTYsaVtyKzFdPShuJmMuR1JFRU5fTUFTSyk+Pj44LGlbcisyXT1uJmMuQkxVRV9NQVNLLGlbciszXT0obiZjLkFMUEhBX01BU0spPj4+MjQsZS5fX2lzRGlydHk9ITB9fShlKSx0b0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVtdLG49ZS5pbWFnZURhdGEuZGF0YSxyPWUud2lkdGgqZS5oZWlnaHQKaWYoZS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBnZXQgcGl4ZWxzLiIKZm9yKHZhciBpPTAscz0wO2k8cjtpKysscys9NCl0LnB1c2gobltzKzNdPDwyNCZjLkFMUEhBX01BU0t8bltzXTw8MTYmYy5SRURfTUFTS3xuW3MrMV08PDgmYy5HUkVFTl9NQVNLfG5bcysyXSZjLkJMVUVfTUFTSykKcmV0dXJuIHR9fShlKSxzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuLHIsaQppZih0aGlzLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IHNldCBwaXhlbHMuIgpyPWUuaW1hZ2VEYXRhLmRhdGEKZm9yKHZhciBzPTAsbz10Lmxlbmd0aDtzPG87cysrKWk9dFtzXSxuPTQqcyxyW24rMF09KGkmYy5SRURfTUFTSyk+Pj4xNixyW24rMV09KGkmYy5HUkVFTl9NQVNLKT4+PjgscltuKzJdPWkmYy5CTFVFX01BU0sscltuKzNdPShpJmMuQUxQSEFfTUFTSyk+Pj4yNAplLl9faXNEaXJ0eT0hMH19KGUpfX1mdW5jdGlvbiBqKGUsdCl7dmFyIG4KaWYoZT49eGUud2lkdGh8fGU8MHx8dDwwfHx0Pj14ZS5oZWlnaHQpcmV0dXJuIDAKaWYodW4pe3ZhciByPTQqKCgwfGUpK3hlLndpZHRoKigwfHQpKQpyZXR1cm4gbj14ZS5pbWFnZURhdGEuZGF0YSxuW3IrM108PDI0JmMuQUxQSEFfTUFTS3xuW3JdPDwxNiZjLlJFRF9NQVNLfG5bcisxXTw8OCZjLkdSRUVOX01BU0t8bltyKzJdJmMuQkxVRV9NQVNLfXJldHVybiBuPXhlLnRvSW1hZ2VEYXRhKDB8ZSwwfHQsMSwxKS5kYXRhLG5bM108PDI0JmMuQUxQSEFfTUFTS3xuWzBdPDwxNiZjLlJFRF9NQVNLfG5bMV08PDgmYy5HUkVFTl9NQVNLfG5bMl0mYy5CTFVFX01BU0t9ZnVuY3Rpb24gSyhlLHQsbil7aWYobi5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBnZXQgeCx5LiIKdmFyIHI9dCpuLndpZHRoKjQrNCplLGk9bi5pbWFnZURhdGEuZGF0YQpyZXR1cm4gaVtyKzNdPDwyNCZjLkFMUEhBX01BU0t8aVtyXTw8MTYmYy5SRURfTUFTS3xpW3IrMV08PDgmYy5HUkVFTl9NQVNLfGlbcisyXSZjLkJMVUVfTUFTS31mdW5jdGlvbiBXKGUsdCxuLHIpe3ZhciBpPW5ldyBFcihuLHIsYy5BUkdCKQpyZXR1cm4gaS5mcm9tSW1hZ2VEYXRhKHhlLnRvSW1hZ2VEYXRhKGUsdCxuLHIpKSxpfWZ1bmN0aW9uIFooZSx0LG4scixpKXtpZihpLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGdldCB4LHksdyxoLiIKZm9yKHZhciBzPW5ldyBFcihuLHIsYy5BUkdCKSxvPXMuaW1hZ2VEYXRhLmRhdGEsYT1pLndpZHRoLGw9aS5oZWlnaHQsaD1pLmltYWdlRGF0YS5kYXRhLHU9TWF0aC5tYXgoMCwtdCksZj1NYXRoLm1heCgwLC1lKSxwPU1hdGgubWluKHIsbC10KSxtPU1hdGgubWluKG4sYS1lKSxnPXU7ZzxwOysrZylmb3IodmFyIGQ9NCooKHQrZykqYSsoZStmKSksdj00KihnKm4rZikseT1mO3k8bTsrK3kpb1t2KytdPWhbZCsrXSxvW3YrK109aFtkKytdLG9bdisrXT1oW2QrK10sb1t2KytdPWhbZCsrXQpyZXR1cm4gcy5fX2lzRGlydHk9ITAsc31mdW5jdGlvbiBxKCl7dW4mJihBZT1aZSx1bj0hMSx4ZS51cGRhdGVQaXhlbHMoKSl9ZnVuY3Rpb24gUSgpe2Z1bmN0aW9uIGUoZSx0KXtmdW5jdGlvbiBuKCl7cSgpLEFlW3RdLmFwcGx5KEFlLGFyZ3VtZW50cyl9ZVt0XT1ufWZ1bmN0aW9uIHQoZSx0KXtmdW5jdGlvbiBuKCl7cmV0dXJuIHEoKSxBZVt0XX1mdW5jdGlvbiByKGUpe3EoKSxBZVt0XT1lfXhlLmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0Om4sc2V0OnJ9KX1mb3IodmFyIG4gaW4gQWUpImZ1bmN0aW9uIj09dHlwZW9mIEFlW25dP2UodGhpcyxuKTp0KHRoaXMsbil9ZnVuY3Rpb24gSigpe3VufHwoeGUubG9hZFBpeGVscygpLG51bGw9PT1obiYmKFplPUFlLGhuPW5ldyBRKSx1bj0hMCxBZT1obixxZT0wKX1mdW5jdGlvbiBlZShlLHQsbil7ZTx4ZS53aWR0aCYmZT49MCYmdD49MCYmdDx4ZS5oZWlnaHQmJihKKCkseGUucGl4ZWxzLnNldFBpeGVsKCgwfGUpK3hlLndpZHRoKigwfHQpLG4pLCsrcWU+Y24mJnEoKSl9ZnVuY3Rpb24gdGUoZSx0LG4scil7aWYoci5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBzZXQgeCx5LiIKdmFyIGk9eGUuY29sb3IudG9BcnJheShuKSxzPXQqci53aWR0aCo0KzQqZSxvPXIuaW1hZ2VEYXRhLmRhdGEKb1tzXT1pWzBdLG9bcysxXT1pWzFdLG9bcysyXT1pWzJdLG9bcyszXT1pWzNdfWZ1bmN0aW9uIG5lKGUpe3JldHVybiBlIGluc3RhbmNlb2YgU3RyaW5nP2U6Im51bWJlciI9PXR5cGVvZiBlP2U9PT0oMHxlKT9lLnRvU3RyaW5nKCk6eGUubmYoZSwwLDMpOm51bGw9PT1lfHxlPT09dD8iIjplLnRvU3RyaW5nKCl9ZnVuY3Rpb24gcmUoZSx0LG4scil7dmFyIGkscwplLmluZGV4T2YoIlxuIik8MD8oaT1bZV0scz0xKTooaT1lLnNwbGl0KC9ccj9cbi9nKSxzPWkubGVuZ3RoKQp2YXIgbz0wCmVuPT09Yy5UT1A/bz1zbitvbjplbj09PWMuQ0VOVEVSP289c24vMi0ocy0xKSphbi8yOmVuPT09Yy5CT1RUT00mJihvPS0ob24rKHMtMSkqYW4pKQpmb3IodmFyIGE9MDthPHM7KythKXt2YXIgbD1pW2FdCndlLnRleHQkbGluZShsLHQsbitvLHIsSnQpLG8rPWFufX1mdW5jdGlvbiBpZShlLHQsbixyLGkscyl7aWYoMCE9PWUubGVuZ3RoJiYwIT09ciYmMCE9PWkmJiEocm4+aSkpe2Zvcih2YXIgbz0tMSxhPTAsbD0wLGg9W10sdT0wLGY9ZS5sZW5ndGg7dTxmO3UrKyl7dmFyIHA9ZVt1XSxtPSIgIj09PXAsZz1sbi5tZWFzdXJlVGV4dFdpZHRoKHApCmlmKCJcbiIhPT1wJiZsK2c8PXIpbSYmKG89dSksbCs9ZwplbHNle2lmKG8rMT09PWEpe2lmKCEodT4wKSlyZXR1cm4Kbz11fSJcbiI9PT1wPyhoLnB1c2goe3RleHQ6ZS5zdWJzdHJpbmcoYSx1KSx3aWR0aDpsfSksYT11KzEpOihoLnB1c2goe3RleHQ6ZS5zdWJzdHJpbmcoYSxvKzEpLHdpZHRoOmx9KSxhPW8rMSksbD0wLHU9YS0xfX1hPGYmJmgucHVzaCh7dGV4dDplLnN1YnN0cmluZyhhKSx3aWR0aDpsfSkKdmFyIGQ9MSx2PXNuCkp0PT09Yy5DRU5URVI/ZD1yLzI6SnQ9PT1jLlJJR0hUJiYoZD1yKQp2YXIgeT1oLmxlbmd0aCx4PU1hdGgubWluKHksTWF0aC5mbG9vcihpL2FuKSkKZW49PT1jLlRPUD92PXNuK29uOmVuPT09Yy5DRU5URVI/dj1pLzItYW4qKHgvMi0xKTplbj09PWMuQk9UVE9NJiYodj1vbithbikKdmFyIEEsYix3CmZvcihBPTA7QTx5JiYodz1BKmFuLCEodit3Pmktb24pKTtBKyspYj1oW0FdLHdlLnRleHQkbGluZShiLnRleHQsdCtkLG4rdit3LHMsSnQpfX1mdW5jdGlvbiBzZShlKXt3ZT0iM0QiPT09ZT9uZXcgc3I6IjJEIj09PWU/bmV3IGlyOm5ldyBvcgpmb3IodmFyIHQgaW4gb3IucHJvdG90eXBlKW9yLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSh0KSYmdC5pbmRleE9mKCIkIik8MCYmKHhlW3RdPXdlW3RdKQp3ZS4kaW5pdCgpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzZSgiMkQiKSx3ZVtlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGFlKGUpe3ZhciB0PWUud2hpY2h8fGUua2V5Q29kZQpzd2l0Y2godCl7Y2FzZSAxMzpyZXR1cm4gMTAKY2FzZSA5MTpjYXNlIDkzOmNhc2UgMjI0OnJldHVybiAxNTcKY2FzZSA1NzM5MjpyZXR1cm4gMTcKY2FzZSA0NjpyZXR1cm4gMTI3CmNhc2UgNDU6cmV0dXJuIDE1NX1yZXR1cm4gdH1mdW5jdGlvbiBsZShlKXt2YXIgdD1lLndoaWNofHxlLmtleUNvZGUsbj1lLnNoaWZ0S2V5fHxlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkKc3dpdGNoKHQpe2Nhc2UgMTM6dD1uPzEzOjEwCmJyZWFrCmNhc2UgODp0PW4/MTI3Ojh9cmV0dXJuIG5ldyBDaGFyKHQpfWZ1bmN0aW9uIGhlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKToiZnVuY3Rpb24iPT10eXBlb2YgZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksITF9ZnVuY3Rpb24gdWUoKXt2YXIgZQpmb3IoZSBpbiBmbilpZihmbi5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gdm9pZCh4ZS5fX2tleVByZXNzZWQ9ITApCnhlLl9fa2V5UHJlc3NlZD0hMX1mdW5jdGlvbiBjZSgpe3hlLl9fa2V5UHJlc3NlZD0hMSxmbj1bXSxwbj1udWxsfWZ1bmN0aW9uIGZlKGUsdCl7Zm5bZV09dCxwbj1udWxsLHhlLmtleT10LHhlLmtleUNvZGU9ZSx4ZS5rZXlQcmVzc2VkKCkseGUua2V5Q29kZT0wLHhlLmtleVR5cGVkKCksdWUoKX1mdW5jdGlvbiBwZShlKXt2YXIgdD1hZShlKQppZih0PT09Yy5ERUxFVEUpcmV0dXJuIHZvaWQgZmUodCxuZXcgQ2hhcigxMjcpKQppZihtbi5pbmRleE9mKHQpPDApcmV0dXJuIHZvaWQocG49dCkKdmFyIG49bmV3IENoYXIoYy5DT0RFRCkKcmV0dXJuIHhlLmtleT1uLHhlLmtleUNvZGU9dCxmblt0XT1uLHhlLmtleVByZXNzZWQoKSxwbj1udWxsLHVlKCksaGUoZSl9ZnVuY3Rpb24gbWUoZSl7aWYobnVsbCE9PXBuKXt2YXIgdD1wbixuPWxlKGUpCnJldHVybiBmZSh0LG4pLGhlKGUpfX1mdW5jdGlvbiBnZShlKXt2YXIgbj1hZShlKSxyPWZuW25dCnIhPT10JiYoeGUua2V5PXIseGUua2V5Q29kZT1uLHhlLmtleVJlbGVhc2VkKCksZGVsZXRlIGZuW25dLHVlKCkpfWlmKCEodGhpcyBpbnN0YW5jZW9mIEUpKXRocm93ImNhbGxlZCBQcm9jZXNzaW5nIGNvbnN0cnVjdG9yIGFzIGlmIGl0IHdlcmUgYSBmdW5jdGlvbjogbWlzc2luZyAnbmV3Jy4iCnZhciBkZT17fSx2ZT1lPT09dCYmbj09PXQKaWYoZGU9dmU/aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKToic3RyaW5nIj09dHlwZW9mIGU/aC5nZXRFbGVtZW50QnlJZChlKTplLCEoImdldENvbnRleHQiaW4gZGUpKXRocm93ImNhbGxlZCBQcm9jZXNzaW5nIGNvbnN0cnVjdG9yIHdpdGhvdXQgcGFzc2luZyBjYW52YXMgZWxlbWVudCByZWZlcmVuY2Ugb3IgaWQuIgp2YXIgeWU9W10seGU9dGhpcwp4ZS5DaGFyPXhlLkNoYXJhY3Rlcj1DaGFyLHllPVtdLGkud2l0aENvbW1vbkZ1bmN0aW9ucyh4ZSksaS53aXRoTWF0aCh4ZSksaS53aXRoUHJveHlGdW5jdGlvbnMoeGUsUCksaS53aXRoVG91Y2goeGUsZGUseCxTLGgsYykscyYmT2JqZWN0LmtleXMocykuZm9yRWFjaChmdW5jdGlvbihlKXt4ZVtlXT1zW2VdfSkseGUuZXh0ZXJuYWxzPXtjYW52YXM6ZGUsY29udGV4dDp0LHNrZXRjaDp0LHdpbmRvdzpsfSx4ZS5uYW1lPSJQcm9jZXNzaW5nLmpzIEluc3RhbmNlIix4ZS51c2UzRENvbnRleHQ9ITEseGUuZm9jdXNlZD0hMSx4ZS5icmVha1NoYXBlPSExLHhlLmdseXBoVGFibGU9e30seGUucG1vdXNlWD0wLHhlLnBtb3VzZVk9MCx4ZS5tb3VzZVg9MCx4ZS5tb3VzZVk9MCx4ZS5tb3VzZUJ1dHRvbj0wLHhlLm1vdXNlU2Nyb2xsPTAseGUubW91c2VDbGlja2VkPXQseGUubW91c2VEcmFnZ2VkPXQseGUubW91c2VNb3ZlZD10LHhlLm1vdXNlUHJlc3NlZD10LHhlLm1vdXNlUmVsZWFzZWQ9dCx4ZS5tb3VzZVNjcm9sbGVkPXQseGUubW91c2VPdmVyPXQseGUubW91c2VPdXQ9dCx4ZS50b3VjaFN0YXJ0PXQseGUudG91Y2hFbmQ9dCx4ZS50b3VjaE1vdmU9dCx4ZS50b3VjaENhbmNlbD10LHhlLmtleT10LHhlLmtleUNvZGU9dCx4ZS5rZXlQcmVzc2VkPXUseGUua2V5UmVsZWFzZWQ9dSx4ZS5rZXlUeXBlZD11LHhlLmRyYXc9dCx4ZS5zZXR1cD10LHhlLl9fbW91c2VQcmVzc2VkPSExLHhlLl9fa2V5UHJlc3NlZD0hMSx4ZS5fX2ZyYW1lUmF0ZT02MCx4ZS5mcmFtZUNvdW50PTAseGUud2lkdGg9MTAwLHhlLmhlaWdodD0xMDAKdmFyIEFlLGJlLHdlLEVlLFNlLFBlLENlLE1lLFRlLF9lLFJlLExlLEllLERlLE9lLE5lLEZlLGtlLEJlLCRlLEdlLFZlLHplLFVlLEhlLFhlLFllLGplLEtlLFdlLFplLHFlLFFlLEplLGV0LHR0LG50LHJ0LGl0LHN0LG90LGF0PSEwLGx0PVsxLDEsMSwxXSxodD00Mjk0OTY3Mjk1LHV0PSEwLGN0PSEwLGZ0PVswLDAsMCwxXSxwdD00Mjc4MTkwMDgwLG10PSEwLGd0PTEsZHQ9ITEsdnQ9ITEseXQ9ITAseHQ9MCxBdD1jLkNPUk5FUixidD1jLkNFTlRFUix3dD0wLEV0PTAsU3Q9MCxQdD1jLk5PUk1BTF9NT0RFX0FVVE8sQ3Q9NjAsTXQ9MWUzL0N0LFR0PWMuQVJST1csX3Q9ZGUuc3R5bGUuY3Vyc29yLFJ0PWMuUE9MWUdPTixMdD1bXSxJdD0wLER0PTIwLE90PSExLE50PS0zMzU1NDQ0LEZ0PTIwLGt0PTI1NSxCdD0yNTUsJHQ9MjU1LEd0PTI1NSxWdD0wLHp0PTAsVXQ9Yy5SR0IsSHQ9bnVsbCxYdD1udWxsLFl0PURhdGUubm93KCksanQ9WXQsS3Q9MCxXdD17YXR0cmlidXRlczp7fSxsb2NhdGlvbnM6e319LFp0PXt3aWR0aDowLGhlaWdodDowfSxxdD1jLklNQUdFLFF0PSExLEp0PWMuTEVGVCxlbj1jLkJBU0VMSU5FLHRuPWMuTU9ERUwsbm49IkFyaWFsIixybj0xMixzbj05LG9uPTIsYW49MTQsbG49UEZvbnQuZ2V0KG5uLHJuKSxobj1udWxsLHVuPSExLGNuPTFlMyxmbj1bXSxwbj1udWxsLG1uPVtjLlNISUZULGMuQ09OVFJPTCxjLkFMVCxjLkNBUFNMSyxjLlBHVVAsYy5QR0ROLGMuRU5ELGMuSE9NRSxjLkxFRlQsYy5VUCxjLlJJR0hULGMuRE9XTixjLk5VTUxLLGMuSU5TRVJULGMuRjEsYy5GMixjLkYzLGMuRjQsYy5GNSxjLkY2LGMuRjcsYy5GOCxjLkY5LGMuRjEwLGMuRjExLGMuRjEyLGMuTUVUQV0sZ249MCxkbj0wLHZuPTAseW49W10seG49W10sQW49W10sYm49bmV3IGcoYy5TSU5DT1NfTEVOR1RIKSx3bj1uZXcgZyhjLlNJTkNPU19MRU5HVEgpLEVuPSExLFNuPSExLFBuPTYwKihNYXRoLlBJLzE4MCksQ249eGUud2lkdGgvMixNbj14ZS5oZWlnaHQvMixUbj1Nbi9NYXRoLnRhbihQbi8yKSxfbj1Ubi8xMCxSbj0xMCpUbixMbj14ZS53aWR0aC94ZS5oZWlnaHQsSW49W10sRG49W10sT249MCxObj0hMSxGbj0hMSxrbj0hMCxCbj1jLkNPUk5FUiwkbj1bXSxHbj1uZXcgZyhbLjUsLjUsLS41LC41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC41LC0uNSwuNSwuNSwtLjUsLjUsLjUsLjUsLS41LC41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwuNSwtLjUsLjUsLjUsLjUsLjUsLjUsLjUsLS41LC41LC41LC41LC41LC0uNSwuNSwuNSwtLjUsLjUsLjUsLS41LC0uNSwuNSwuNSwtLjUsLjUsLS41LC0uNSwuNSwtLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLS41LC41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwuNSwtLjUsLjUsLjUsLS41LC41LC41LC0uNSwuNSwtLjUsLS41LC0uNSwtLjUsLjUsLjUsLjUsLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLjUsLjUsLjUsLjVdKSxWbj1uZXcgZyhbLjUsLjUsLjUsLjUsLS41LC41LC41LC41LC0uNSwuNSwtLjUsLS41LC0uNSwuNSwtLjUsLS41LC0uNSwtLjUsLS41LC41LC41LC0uNSwtLjUsLjUsLjUsLjUsLjUsLjUsLjUsLS41LC41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC41LC0uNSwuNSwuNSwuNSwuNSwuNSwuNSwtLjUsLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwuNSwtLjUsLjVdKSx6bj1uZXcgZyhbMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDBdKSxVbj1uZXcgZyhbMCwwLDAsMCwxLDAsMSwxLDAsMSwwLDBdKSxIbj1uZXcgZyhbMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDFdKSxYbj0idmFyeWluZyB2ZWM0IHZGcm9udENvbG9yO2F0dHJpYnV0ZSB2ZWMzIGFWZXJ0ZXg7YXR0cmlidXRlIHZlYzQgYUNvbG9yO3VuaWZvcm0gbWF0NCB1Vmlldzt1bmlmb3JtIG1hdDQgdVByb2plY3Rpb247dW5pZm9ybSBmbG9hdCB1UG9pbnRTaXplO3ZvaWQgbWFpbih2b2lkKSB7ICB2RnJvbnRDb2xvciA9IGFDb2xvcjsgIGdsX1BvaW50U2l6ZSA9IHVQb2ludFNpemU7ICBnbF9Qb3NpdGlvbiA9IHVQcm9qZWN0aW9uICogdVZpZXcgKiB2ZWM0KGFWZXJ0ZXgsIDEuMCk7fSIsWW49IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2VuZGlmXG52YXJ5aW5nIHZlYzQgdkZyb250Q29sb3I7dW5pZm9ybSBib29sIHVTbW9vdGg7dm9pZCBtYWluKHZvaWQpeyAgaWYodVNtb290aCA9PSB0cnVlKXsgICAgZmxvYXQgZGlzdCA9IGRpc3RhbmNlKGdsX1BvaW50Q29vcmQsIHZlYzIoMC41KSk7ICAgIGlmKGRpc3QgPiAwLjUpeyAgICAgIGRpc2NhcmQ7ICAgIH0gIH0gIGdsX0ZyYWdDb2xvciA9IHZGcm9udENvbG9yO30iLGpuPSJ2YXJ5aW5nIHZlYzQgdkZyb250Q29sb3I7YXR0cmlidXRlIHZlYzMgYVZlcnRleDthdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO3VuaWZvcm0gdmVjNCB1Q29sb3I7dW5pZm9ybSBtYXQ0IHVNb2RlbDt1bmlmb3JtIG1hdDQgdVZpZXc7dW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uO3VuaWZvcm0gZmxvYXQgdVBvaW50U2l6ZTt2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDt2b2lkIG1haW4odm9pZCkgeyAgZ2xfUG9pbnRTaXplID0gdVBvaW50U2l6ZTsgIHZGcm9udENvbG9yID0gdUNvbG9yOyAgZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbiAqIHVWaWV3ICogdU1vZGVsICogdmVjNChhVmVydGV4LCAxLjApOyAgdlRleHR1cmVDb29yZCA9IGFUZXh0dXJlQ29vcmQ7fSIsS249IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2VuZGlmXG52YXJ5aW5nIHZlYzQgdkZyb250Q29sb3I7dmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7dW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7dW5pZm9ybSBpbnQgdUlzRHJhd2luZ1RleHQ7dW5pZm9ybSBib29sIHVTbW9vdGg7dm9pZCBtYWluKHZvaWQpeyAgaWYodVNtb290aCA9PSB0cnVlKXsgICAgZmxvYXQgZGlzdCA9IGRpc3RhbmNlKGdsX1BvaW50Q29vcmQsIHZlYzIoMC41KSk7ICAgIGlmKGRpc3QgPiAwLjUpeyAgICAgIGRpc2NhcmQ7ICAgIH0gIH0gIGlmKHVJc0RyYXdpbmdUZXh0ID09IDEpeyAgICBmbG9hdCBhbHBoYSA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCkuYTsgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2RnJvbnRDb2xvci5yZ2IgKiBhbHBoYSwgYWxwaGEpOyAgfSAgZWxzZXsgICAgZ2xfRnJhZ0NvbG9yID0gdkZyb250Q29sb3I7ICB9fSIsV249L1dpbmRvd3MvLnRlc3QoYS51c2VyQWdlbnQpLFpuPSJ2YXJ5aW5nIHZlYzQgdkZyb250Q29sb3I7YXR0cmlidXRlIHZlYzMgYVZlcnRleDthdHRyaWJ1dGUgdmVjMyBhTm9ybWFsO2F0dHJpYnV0ZSB2ZWM0IGFDb2xvcjthdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZTt2YXJ5aW5nICAgdmVjMiB2VGV4dHVyZTt1bmlmb3JtIHZlYzQgdUNvbG9yO3VuaWZvcm0gYm9vbCB1VXNpbmdNYXQ7dW5pZm9ybSB2ZWMzIHVTcGVjdWxhcjt1bmlmb3JtIHZlYzMgdU1hdGVyaWFsRW1pc3NpdmU7dW5pZm9ybSB2ZWMzIHVNYXRlcmlhbEFtYmllbnQ7dW5pZm9ybSB2ZWMzIHVNYXRlcmlhbFNwZWN1bGFyO3VuaWZvcm0gZmxvYXQgdVNoaW5pbmVzczt1bmlmb3JtIG1hdDQgdU1vZGVsO3VuaWZvcm0gbWF0NCB1Vmlldzt1bmlmb3JtIG1hdDQgdVByb2plY3Rpb247dW5pZm9ybSBtYXQ0IHVOb3JtYWxUcmFuc2Zvcm07dW5pZm9ybSBpbnQgdUxpZ2h0Q291bnQ7dW5pZm9ybSB2ZWMzIHVGYWxsb2ZmO3N0cnVjdCBMaWdodCB7ICBpbnQgdHlwZTsgIHZlYzMgY29sb3I7ICB2ZWMzIHBvc2l0aW9uOyAgdmVjMyBkaXJlY3Rpb247ICBmbG9hdCBhbmdsZTsgIHZlYzMgaGFsZlZlY3RvcjsgIGZsb2F0IGNvbmNlbnRyYXRpb247fTt1bmlmb3JtIExpZ2h0IHVMaWdodHMwO3VuaWZvcm0gTGlnaHQgdUxpZ2h0czE7dW5pZm9ybSBMaWdodCB1TGlnaHRzMjt1bmlmb3JtIExpZ2h0IHVMaWdodHMzO3VuaWZvcm0gTGlnaHQgdUxpZ2h0czQ7dW5pZm9ybSBMaWdodCB1TGlnaHRzNTt1bmlmb3JtIExpZ2h0IHVMaWdodHM2O3VuaWZvcm0gTGlnaHQgdUxpZ2h0czc7TGlnaHQgZ2V0TGlnaHQoaW50IGluZGV4KXsgIGlmKGluZGV4ID09IDApIHJldHVybiB1TGlnaHRzMDsgIGlmKGluZGV4ID09IDEpIHJldHVybiB1TGlnaHRzMTsgIGlmKGluZGV4ID09IDIpIHJldHVybiB1TGlnaHRzMjsgIGlmKGluZGV4ID09IDMpIHJldHVybiB1TGlnaHRzMzsgIGlmKGluZGV4ID09IDQpIHJldHVybiB1TGlnaHRzNDsgIGlmKGluZGV4ID09IDUpIHJldHVybiB1TGlnaHRzNTsgIGlmKGluZGV4ID09IDYpIHJldHVybiB1TGlnaHRzNjsgIHJldHVybiB1TGlnaHRzNzt9dm9pZCBBbWJpZW50TGlnaHQoIGlub3V0IHZlYzMgdG90YWxBbWJpZW50LCBpbiB2ZWMzIGVjUG9zLCBpbiBMaWdodCBsaWdodCApIHsgIGZsb2F0IGQgPSBsZW5ndGgoIGxpZ2h0LnBvc2l0aW9uIC0gZWNQb3MgKTsgIGZsb2F0IGF0dGVudWF0aW9uID0gMS4wIC8gKCB1RmFsbG9mZlswXSArICggdUZhbGxvZmZbMV0gKiBkICkgKyAoIHVGYWxsb2ZmWzJdICogZCAqIGQgKSk7ICB0b3RhbEFtYmllbnQgKz0gbGlnaHQuY29sb3IgKiBhdHRlbnVhdGlvbjt9dm9pZCBEaXJlY3Rpb25hbExpZ2h0KCBpbm91dCB2ZWMzIGNvbCwgaW5vdXQgdmVjMyBzcGVjLCBpbiB2ZWMzIHZlcnROb3JtYWwsIGluIHZlYzMgZWNQb3MsIGluIExpZ2h0IGxpZ2h0ICkgeyAgZmxvYXQgcG93ZXJGYWN0b3IgPSAwLjA7ICBmbG9hdCBuRG90VlAgPSBtYXgoMC4wLCBkb3QoIHZlcnROb3JtYWwsIG5vcm1hbGl6ZSgtbGlnaHQucG9zaXRpb24pICkpOyAgZmxvYXQgbkRvdFZIID0gbWF4KDAuMCwgZG90KCB2ZXJ0Tm9ybWFsLCBub3JtYWxpemUoLWxpZ2h0LnBvc2l0aW9uLW5vcm1hbGl6ZShlY1BvcykgKSkpOyAgaWYoIG5Eb3RWUCAhPSAwLjAgKXsgICAgcG93ZXJGYWN0b3IgPSBwb3coIG5Eb3RWSCwgdVNoaW5pbmVzcyApOyAgfSAgY29sICs9IGxpZ2h0LmNvbG9yICogbkRvdFZQOyAgc3BlYyArPSB1U3BlY3VsYXIgKiBwb3dlckZhY3Rvcjt9dm9pZCBQb2ludExpZ2h0KCBpbm91dCB2ZWMzIGNvbCwgaW5vdXQgdmVjMyBzcGVjLCBpbiB2ZWMzIHZlcnROb3JtYWwsIGluIHZlYzMgZWNQb3MsIGluIExpZ2h0IGxpZ2h0ICkgeyAgZmxvYXQgcG93ZXJGYWN0b3I7ICAgdmVjMyBWUCA9IGxpZ2h0LnBvc2l0aW9uIC0gZWNQb3M7ICBmbG9hdCBkID0gbGVuZ3RoKCBWUCApOyAgIFZQID0gbm9ybWFsaXplKCBWUCApOyAgZmxvYXQgYXR0ZW51YXRpb24gPSAxLjAgLyAoIHVGYWxsb2ZmWzBdICsgKCB1RmFsbG9mZlsxXSAqIGQgKSArICggdUZhbGxvZmZbMl0gKiBkICogZCApKTsgIGZsb2F0IG5Eb3RWUCA9IG1heCggMC4wLCBkb3QoIHZlcnROb3JtYWwsIFZQICkpOyAgdmVjMyBoYWxmVmVjdG9yID0gbm9ybWFsaXplKCBWUCAtIG5vcm1hbGl6ZShlY1BvcykgKTsgIGZsb2F0IG5Eb3RIViA9IG1heCggMC4wLCBkb3QoIHZlcnROb3JtYWwsIGhhbGZWZWN0b3IgKSk7ICBpZiggbkRvdFZQID09IDAuMCApIHsgICAgcG93ZXJGYWN0b3IgPSAwLjA7ICB9ICBlbHNlIHsgICAgcG93ZXJGYWN0b3IgPSBwb3coIG5Eb3RIViwgdVNoaW5pbmVzcyApOyAgfSAgc3BlYyArPSB1U3BlY3VsYXIgKiBwb3dlckZhY3RvciAqIGF0dGVudWF0aW9uOyAgY29sICs9IGxpZ2h0LmNvbG9yICogbkRvdFZQICogYXR0ZW51YXRpb247fXZvaWQgU3BvdExpZ2h0KCBpbm91dCB2ZWMzIGNvbCwgaW5vdXQgdmVjMyBzcGVjLCBpbiB2ZWMzIHZlcnROb3JtYWwsIGluIHZlYzMgZWNQb3MsIGluIExpZ2h0IGxpZ2h0ICkgeyAgZmxvYXQgc3BvdEF0dGVudWF0aW9uOyAgZmxvYXQgcG93ZXJGYWN0b3IgPSAwLjA7ICB2ZWMzIFZQID0gbGlnaHQucG9zaXRpb24gLSBlY1BvczsgIHZlYzMgbGRpciA9IG5vcm1hbGl6ZSggLWxpZ2h0LmRpcmVjdGlvbiApOyAgZmxvYXQgZCA9IGxlbmd0aCggVlAgKTsgIFZQID0gbm9ybWFsaXplKCBWUCApOyAgZmxvYXQgYXR0ZW51YXRpb24gPSAxLjAgLyAoIHVGYWxsb2ZmWzBdICsgKCB1RmFsbG9mZlsxXSAqIGQgKSArICggdUZhbGxvZmZbMl0gKiBkICogZCApICk7ICBmbG9hdCBzcG90RG90ID0gZG90KCBWUCwgbGRpciApOyIrKFduPyIgIHNwb3RBdHRlbnVhdGlvbiA9IDEuMDsgIjoiICBpZiggc3BvdERvdCA+IGNvcyggbGlnaHQuYW5nbGUgKSApIHsgICAgc3BvdEF0dGVudWF0aW9uID0gcG93KCBzcG90RG90LCBsaWdodC5jb25jZW50cmF0aW9uICk7ICB9ICBlbHNleyAgICBzcG90QXR0ZW51YXRpb24gPSAwLjA7ICB9ICBhdHRlbnVhdGlvbiAqPSBzcG90QXR0ZW51YXRpb247IikrIiAgZmxvYXQgbkRvdFZQID0gbWF4KCAwLjAsIGRvdCggdmVydE5vcm1hbCwgVlAgKSApOyAgdmVjMyBoYWxmVmVjdG9yID0gbm9ybWFsaXplKCBWUCAtIG5vcm1hbGl6ZShlY1BvcykgKTsgIGZsb2F0IG5Eb3RIViA9IG1heCggMC4wLCBkb3QoIHZlcnROb3JtYWwsIGhhbGZWZWN0b3IgKSApOyAgaWYoIG5Eb3RWUCAhPSAwLjAgKSB7ICAgIHBvd2VyRmFjdG9yID0gcG93KCBuRG90SFYsIHVTaGluaW5lc3MgKTsgIH0gIHNwZWMgKz0gdVNwZWN1bGFyICogcG93ZXJGYWN0b3IgKiBhdHRlbnVhdGlvbjsgIGNvbCArPSBsaWdodC5jb2xvciAqIG5Eb3RWUCAqIGF0dGVudWF0aW9uO312b2lkIG1haW4odm9pZCkgeyAgdmVjMyBmaW5hbEFtYmllbnQgPSB2ZWMzKCAwLjAgKTsgIHZlYzMgZmluYWxEaWZmdXNlID0gdmVjMyggMC4wICk7ICB2ZWMzIGZpbmFsU3BlY3VsYXIgPSB2ZWMzKCAwLjAgKTsgIHZlYzQgY29sID0gdUNvbG9yOyAgaWYgKCB1Q29sb3JbMF0gPT0gLTEuMCApeyAgICBjb2wgPSBhQ29sb3I7ICB9ICB2ZWMzIG5vcm0gPSBub3JtYWxpemUodmVjMyggdU5vcm1hbFRyYW5zZm9ybSAqIHZlYzQoIGFOb3JtYWwsIDAuMCApICkpOyAgdmVjNCBlY1BvczQgPSB1VmlldyAqIHVNb2RlbCAqIHZlYzQoYVZlcnRleCwgMS4wKTsgIHZlYzMgZWNQb3MgPSAodmVjMyhlY1BvczQpKS9lY1BvczQudzsgIGlmKCB1TGlnaHRDb3VudCA9PSAwICkgeyAgICB2RnJvbnRDb2xvciA9IGNvbCArIHZlYzQodU1hdGVyaWFsU3BlY3VsYXIsIDEuMCk7ICB9ICBlbHNlIHsgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCA4OyBpKysgKSB7ICAgICAgTGlnaHQgbCA9IGdldExpZ2h0KGkpOyAgICAgIGlmKCBpID49IHVMaWdodENvdW50ICl7ICAgICAgICBicmVhazsgICAgICB9ICAgICAgaWYoIGwudHlwZSA9PSAwICkgeyAgICAgICAgQW1iaWVudExpZ2h0KCBmaW5hbEFtYmllbnQsIGVjUG9zLCBsICk7ICAgICAgfSAgICAgIGVsc2UgaWYoIGwudHlwZSA9PSAxICkgeyAgICAgICAgRGlyZWN0aW9uYWxMaWdodCggZmluYWxEaWZmdXNlLCBmaW5hbFNwZWN1bGFyLCBub3JtLCBlY1BvcywgbCApOyAgICAgIH0gICAgICBlbHNlIGlmKCBsLnR5cGUgPT0gMiApIHsgICAgICAgIFBvaW50TGlnaHQoIGZpbmFsRGlmZnVzZSwgZmluYWxTcGVjdWxhciwgbm9ybSwgZWNQb3MsIGwgKTsgICAgICB9ICAgICAgZWxzZSB7ICAgICAgICBTcG90TGlnaHQoIGZpbmFsRGlmZnVzZSwgZmluYWxTcGVjdWxhciwgbm9ybSwgZWNQb3MsIGwgKTsgICAgICB9ICAgIH0gICBpZiggdVVzaW5nTWF0ID09IGZhbHNlICkgeyAgICAgdkZyb250Q29sb3IgPSB2ZWM0KCAgICAgICB2ZWMzKCBjb2wgKSAqIGZpbmFsQW1iaWVudCArICAgICAgIHZlYzMoIGNvbCApICogZmluYWxEaWZmdXNlICsgICAgICAgdmVjMyggY29sICkgKiBmaW5hbFNwZWN1bGFyLCAgICAgICBjb2xbM10gKTsgICB9ICAgZWxzZXsgICAgIHZGcm9udENvbG9yID0gdmVjNCggICAgICAgIHVNYXRlcmlhbEVtaXNzaXZlICsgICAgICAgICh2ZWMzKGNvbCkgKiB1TWF0ZXJpYWxBbWJpZW50ICogZmluYWxBbWJpZW50ICkgKyAgICAgICAgKHZlYzMoY29sKSAqIGZpbmFsRGlmZnVzZSkgKyAgICAgICAgKHVNYXRlcmlhbFNwZWN1bGFyICogZmluYWxTcGVjdWxhciksICAgICAgICBjb2xbM10gKTsgICAgfSAgfSAgdlRleHR1cmUueHkgPSBhVGV4dHVyZS54eTsgIGdsX1Bvc2l0aW9uID0gdVByb2plY3Rpb24gKiB1VmlldyAqIHVNb2RlbCAqIHZlYzQoIGFWZXJ0ZXgsIDEuMCApO30iLHFuPSIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbmRpZlxudmFyeWluZyB2ZWM0IHZGcm9udENvbG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO3VuaWZvcm0gYm9vbCB1VXNpbmdUZXh0dXJlO3ZhcnlpbmcgdmVjMiB2VGV4dHVyZTt2b2lkIG1haW4odm9pZCl7ICBpZiggdVVzaW5nVGV4dHVyZSApeyAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmUueHkpKSAqIHZGcm9udENvbG9yOyAgfSAgZWxzZXsgICAgZ2xfRnJhZ0NvbG9yID0gdkZyb250Q29sb3I7ICB9fSIsUW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY3JlYXRlU2hhZGVyKGUuVkVSVEVYX1NIQURFUikKaWYoZS5zaGFkZXJTb3VyY2Uocix0KSxlLmNvbXBpbGVTaGFkZXIociksIWUuZ2V0U2hhZGVyUGFyYW1ldGVyKHIsZS5DT01QSUxFX1NUQVRVUykpdGhyb3cgZS5nZXRTaGFkZXJJbmZvTG9nKHIpCnZhciBpPWUuY3JlYXRlU2hhZGVyKGUuRlJBR01FTlRfU0hBREVSKQppZihlLnNoYWRlclNvdXJjZShpLG4pLGUuY29tcGlsZVNoYWRlcihpKSwhZS5nZXRTaGFkZXJQYXJhbWV0ZXIoaSxlLkNPTVBJTEVfU1RBVFVTKSl0aHJvdyBlLmdldFNoYWRlckluZm9Mb2coaSkKdmFyIHM9ZS5jcmVhdGVQcm9ncmFtKCkKaWYoZS5hdHRhY2hTaGFkZXIocyxyKSxlLmF0dGFjaFNoYWRlcihzLGkpLGUubGlua1Byb2dyYW0ocyksIWUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihzLGUuTElOS19TVEFUVVMpKXRocm93IkVycm9yIGxpbmtpbmcgc2hhZGVycy4iCnJldHVybiBzfSxKbj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybnt4OmUseTp0LHc6bixoOnJ9fSxlcj1Kbix0cj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybnt4OmUseTp0LHc6aT9uOm4tZSxoOmk/cjpyLXR9fSxucj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybnt4OmUtbi8yLHk6dC1yLzIsdzpuLGg6cn19LHJyPWZ1bmN0aW9uKCl7fSxpcj1mdW5jdGlvbigpe30sc3I9ZnVuY3Rpb24oKXt9LG9yPWZ1bmN0aW9uKCl7fQppci5wcm90b3R5cGU9bmV3IHJyLGlyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pcixzci5wcm90b3R5cGU9bmV3IHJyLHNyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zcixvci5wcm90b3R5cGU9bmV3IHJyLG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1vcixyci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uPXUseGUuc2hhcGU9ZnVuY3Rpb24oZSx0LG4scixpKXthcmd1bWVudHMubGVuZ3RoPj0xJiZudWxsIT09YXJndW1lbnRzWzBdJiZlLmlzVmlzaWJsZSgpJiYoeGUucHVzaE1hdHJpeCgpLEJuPT09Yy5DRU5URVI/NT09PWFyZ3VtZW50cy5sZW5ndGg/KHhlLnRyYW5zbGF0ZSh0LXIvMixuLWkvMikseGUuc2NhbGUoci9lLmdldFdpZHRoKCksaS9lLmdldEhlaWdodCgpKSk6Mz09PWFyZ3VtZW50cy5sZW5ndGg/eGUudHJhbnNsYXRlKHQtZS5nZXRXaWR0aCgpLzIsLWUuZ2V0SGVpZ2h0KCkvMik6eGUudHJhbnNsYXRlKC1lLmdldFdpZHRoKCkvMiwtZS5nZXRIZWlnaHQoKS8yKTpCbj09PWMuQ09STkVSPzU9PT1hcmd1bWVudHMubGVuZ3RoPyh4ZS50cmFuc2xhdGUodCxuKSx4ZS5zY2FsZShyL2UuZ2V0V2lkdGgoKSxpL2UuZ2V0SGVpZ2h0KCkpKTozPT09YXJndW1lbnRzLmxlbmd0aCYmeGUudHJhbnNsYXRlKHQsbik6Qm49PT1jLkNPUk5FUlMmJig1PT09YXJndW1lbnRzLmxlbmd0aD8oci09dCxpLT1uLHhlLnRyYW5zbGF0ZSh0LG4pLHhlLnNjYWxlKHIvZS5nZXRXaWR0aCgpLGkvZS5nZXRIZWlnaHQoKSkpOjM9PT1hcmd1bWVudHMubGVuZ3RoJiZ4ZS50cmFuc2xhdGUodCxuKSksZS5kcmF3KHhlKSwoMT09PWFyZ3VtZW50cy5sZW5ndGgmJkJuPT09Yy5DRU5URVJ8fGFyZ3VtZW50cy5sZW5ndGg+MSkmJnhlLnBvcE1hdHJpeCgpKX0seGUuc2hhcGVNb2RlPWZ1bmN0aW9uKGUpe0JuPWV9LHhlLmxvYWRTaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGgmJmUuaW5kZXhPZigiLnN2ZyIpPi0xP25ldyBQU2hhcGVTVkcobnVsbCxlKTpudWxsfSx4ZS5sb2FkWE1MPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgWE1MKHhlLGUpfSx4ZS5wYXJzZVhNTD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgWE1MCnJldHVybiB0LnBhcnNlKGUpLHR9CnZhciBhcj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPTA7bjxlLmxlbmd0aDtuKyspdD0wIT09bj9NYXRoLm1heCh0LE1hdGguYWJzKGVbbl0pKTpNYXRoLmFicyhlW25dKQp2YXIgcj0odCsiIikuaW5kZXhPZigiLiIpCnJldHVybiAwPT09cj9yPTE6cj09PS0xJiYocj0odCsiIikubGVuZ3RoKSxyfSxscj14ZS5QTWF0cml4MkQ9ZnVuY3Rpb24oKXswPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLnJlc2V0KCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgbHI/dGhpcy5zZXQoYXJndW1lbnRzWzBdLmFycmF5KCkpOjY9PT1hcmd1bWVudHMubGVuZ3RoJiZ0aGlzLnNldChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSl9CmxyLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKCl7aWYoNj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50cwp0aGlzLnNldChbZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV1dKX1lbHNlIDE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGxyP3RoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLmFycmF5KCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJih0aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5zbGljZSgpKX0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9bmV3IGxyCnJldHVybiBlLnNldCh0aGlzLmVsZW1lbnRzKSxlfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuc2V0KFsxLDAsMCwwLDEsMF0pfSxhcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKCl9LHRyYW5zbGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMuZWxlbWVudHNbMl09ZSp0aGlzLmVsZW1lbnRzWzBdK3QqdGhpcy5lbGVtZW50c1sxXSt0aGlzLmVsZW1lbnRzWzJdLHRoaXMuZWxlbWVudHNbNV09ZSp0aGlzLmVsZW1lbnRzWzNdK3QqdGhpcy5lbGVtZW50c1s0XSt0aGlzLmVsZW1lbnRzWzVdfSxpbnZUcmFuc2xhdGU6ZnVuY3Rpb24oZSx0KXt0aGlzLnRyYW5zbGF0ZSgtZSwtdCl9LHRyYW5zcG9zZTpmdW5jdGlvbigpe30sbXVsdDpmdW5jdGlvbihlLHQpe3ZhciBuLHIKcmV0dXJuIGUgaW5zdGFuY2VvZiBQVmVjdG9yPyhuPWUueCxyPWUueSx0fHwodD1uZXcgUFZlY3RvcikpOmUgaW5zdGFuY2VvZiBBcnJheSYmKG49ZVswXSxyPWVbMV0sdHx8KHQ9W10pKSx0IGluc3RhbmNlb2YgQXJyYXk/KHRbMF09dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdLHRbMV09dGhpcy5lbGVtZW50c1szXSpuK3RoaXMuZWxlbWVudHNbNF0qcit0aGlzLmVsZW1lbnRzWzVdKTp0IGluc3RhbmNlb2YgUFZlY3RvciYmKHQueD10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0sdC55PXRoaXMuZWxlbWVudHNbM10qbit0aGlzLmVsZW1lbnRzWzRdKnIrdGhpcy5lbGVtZW50c1s1XSx0Lno9MCksdH0sbXVsdFg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSp0aGlzLmVsZW1lbnRzWzBdK3QqdGhpcy5lbGVtZW50c1sxXSt0aGlzLmVsZW1lbnRzWzJdfSxtdWx0WTpmdW5jdGlvbihlLHQpe3JldHVybiBlKnRoaXMuZWxlbWVudHNbM10rdCp0aGlzLmVsZW1lbnRzWzRdK3RoaXMuZWxlbWVudHNbNV19LHNrZXdYOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsZSwwLDApfSxza2V3WTpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLDAsZSwwKX0sc2hlYXJYOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsTWF0aC50YW4oZSksMCwwKX0sc2hlYXJZOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsMCxNYXRoLnRhbihlKSwwKX0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzRdLXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1szXX0saW52ZXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZXRlcm1pbmFudCgpCmlmKE1hdGguYWJzKGUpPmMuTUlOX0lOVCl7dmFyIHQ9dGhpcy5lbGVtZW50c1swXSxuPXRoaXMuZWxlbWVudHNbMV0scj10aGlzLmVsZW1lbnRzWzJdLGk9dGhpcy5lbGVtZW50c1szXSxzPXRoaXMuZWxlbWVudHNbNF0sbz10aGlzLmVsZW1lbnRzWzVdCnJldHVybiB0aGlzLmVsZW1lbnRzWzBdPXMvZSx0aGlzLmVsZW1lbnRzWzNdPS1pL2UsdGhpcy5lbGVtZW50c1sxXT0tbi9lLHRoaXMuZWxlbWVudHNbNF09dC9lLHRoaXMuZWxlbWVudHNbMl09KG4qby1zKnIpL2UsdGhpcy5lbGVtZW50c1s1XT0oaSpyLXQqbykvZSwhMH1yZXR1cm4hMX0sc2NhbGU6ZnVuY3Rpb24oZSx0KXtlJiYhdCYmKHQ9ZSksZSYmdCYmKHRoaXMuZWxlbWVudHNbMF0qPWUsdGhpcy5lbGVtZW50c1sxXSo9dCx0aGlzLmVsZW1lbnRzWzNdKj1lLHRoaXMuZWxlbWVudHNbNF0qPXQpfSxpbnZTY2FsZTpmdW5jdGlvbihlLHQpe2UmJiF0JiYodD1lKSx0aGlzLnNjYWxlKDEvZSwxL3QpfSxhcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGxyP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6Nj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCmZvcih2YXIgdD1bMCwwLHRoaXMuZWxlbWVudHNbMl0sMCwwLHRoaXMuZWxlbWVudHNbNV1dLG49MCxyPTA7cjwyO3IrKylmb3IodmFyIGk9MDtpPDM7aSsrLG4rKyl0W25dKz10aGlzLmVsZW1lbnRzWzMqciswXSplW2krMF0rdGhpcy5lbGVtZW50c1szKnIrMV0qZVtpKzNdCnRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxwcmVBcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGxyP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6Nj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCnZhciB0PVswLDAsZVsyXSwwLDAsZVs1XV0KdFsyXT1lWzJdK3RoaXMuZWxlbWVudHNbMl0qZVswXSt0aGlzLmVsZW1lbnRzWzVdKmVbMV0sdFs1XT1lWzVdK3RoaXMuZWxlbWVudHNbMl0qZVszXSt0aGlzLmVsZW1lbnRzWzVdKmVbNF0sdFswXT10aGlzLmVsZW1lbnRzWzBdKmVbMF0rdGhpcy5lbGVtZW50c1szXSplWzFdLHRbM109dGhpcy5lbGVtZW50c1swXSplWzNdK3RoaXMuZWxlbWVudHNbM10qZVs0XSx0WzFdPXRoaXMuZWxlbWVudHNbMV0qZVswXSt0aGlzLmVsZW1lbnRzWzRdKmVbMV0sdFs0XT10aGlzLmVsZW1lbnRzWzFdKmVbM10rdGhpcy5lbGVtZW50c1s0XSplWzRdLHRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxyb3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKSxyPXRoaXMuZWxlbWVudHNbMF0saT10aGlzLmVsZW1lbnRzWzFdCnRoaXMuZWxlbWVudHNbMF09dCpyK24qaSx0aGlzLmVsZW1lbnRzWzFdPS1uKnIrdCppLHI9dGhpcy5lbGVtZW50c1szXSxpPXRoaXMuZWxlbWVudHNbNF0sdGhpcy5lbGVtZW50c1szXT10KnIrbippLHRoaXMuZWxlbWVudHNbNF09LW4qcit0Kml9LHJvdGF0ZVo6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGUoZSl9LGludlJvdGF0ZVo6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGVaKGUtTWF0aC5QSSl9LHByaW50OmZ1bmN0aW9uKCl7dmFyIGU9YXIodGhpcy5lbGVtZW50cyksdD0iIit4ZS5uZnModGhpcy5lbGVtZW50c1swXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1syXSxlLDQpKyJcbiIreGUubmZzKHRoaXMuZWxlbWVudHNbM10sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbNF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbNV0sZSw0KSsiXG5cbiIKeGUucHJpbnRsbih0KX19CnZhciBocj14ZS5QTWF0cml4M0Q9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCl9CmhyLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKCl7MTY9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZWxlbWVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocj90aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5hcnJheSgpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYodGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uc2xpY2UoKSl9LGdldDpmdW5jdGlvbigpe3ZhciBlPW5ldyBocgpyZXR1cm4gZS5zZXQodGhpcy5lbGVtZW50cyksZX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXX0sYXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5zbGljZSgpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oZSxuLHIpe3I9PT10JiYocj0wKSx0aGlzLmVsZW1lbnRzWzNdKz1lKnRoaXMuZWxlbWVudHNbMF0rbip0aGlzLmVsZW1lbnRzWzFdK3IqdGhpcy5lbGVtZW50c1syXSx0aGlzLmVsZW1lbnRzWzddKz1lKnRoaXMuZWxlbWVudHNbNF0rbip0aGlzLmVsZW1lbnRzWzVdK3IqdGhpcy5lbGVtZW50c1s2XSx0aGlzLmVsZW1lbnRzWzExXSs9ZSp0aGlzLmVsZW1lbnRzWzhdK24qdGhpcy5lbGVtZW50c1s5XStyKnRoaXMuZWxlbWVudHNbMTBdLHRoaXMuZWxlbWVudHNbMTVdKz1lKnRoaXMuZWxlbWVudHNbMTJdK24qdGhpcy5lbGVtZW50c1sxM10rcip0aGlzLmVsZW1lbnRzWzE0XX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50c1s0XQp0aGlzLmVsZW1lbnRzWzRdPXRoaXMuZWxlbWVudHNbMV0sdGhpcy5lbGVtZW50c1sxXT1lLGU9dGhpcy5lbGVtZW50c1s4XSx0aGlzLmVsZW1lbnRzWzhdPXRoaXMuZWxlbWVudHNbMl0sdGhpcy5lbGVtZW50c1syXT1lLGU9dGhpcy5lbGVtZW50c1s2XSx0aGlzLmVsZW1lbnRzWzZdPXRoaXMuZWxlbWVudHNbOV0sdGhpcy5lbGVtZW50c1s5XT1lLGU9dGhpcy5lbGVtZW50c1szXSx0aGlzLmVsZW1lbnRzWzNdPXRoaXMuZWxlbWVudHNbMTJdLHRoaXMuZWxlbWVudHNbMTJdPWUsZT10aGlzLmVsZW1lbnRzWzddLHRoaXMuZWxlbWVudHNbN109dGhpcy5lbGVtZW50c1sxM10sdGhpcy5lbGVtZW50c1sxM109ZSxlPXRoaXMuZWxlbWVudHNbMTFdLHRoaXMuZWxlbWVudHNbMTFdPXRoaXMuZWxlbWVudHNbMTRdLHRoaXMuZWxlbWVudHNbMTRdPWV9LG11bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscwpyZXR1cm4gZSBpbnN0YW5jZW9mIFBWZWN0b3I/KG49ZS54LHI9ZS55LGk9ZS56LHM9MSx0fHwodD1uZXcgUFZlY3RvcikpOmUgaW5zdGFuY2VvZiBBcnJheSYmKG49ZVswXSxyPWVbMV0saT1lWzJdLHM9ZVszXXx8MSwoIXR8fDMhPT10Lmxlbmd0aCYmNCE9PXQubGVuZ3RoKSYmKHQ9WzAsMCwwXSkpLHQgaW5zdGFuY2VvZiBBcnJheSYmKDM9PT10Lmxlbmd0aD8odFswXT10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0qaSt0aGlzLmVsZW1lbnRzWzNdLHRbMV09dGhpcy5lbGVtZW50c1s0XSpuK3RoaXMuZWxlbWVudHNbNV0qcit0aGlzLmVsZW1lbnRzWzZdKmkrdGhpcy5lbGVtZW50c1s3XSx0WzJdPXRoaXMuZWxlbWVudHNbOF0qbit0aGlzLmVsZW1lbnRzWzldKnIrdGhpcy5lbGVtZW50c1sxMF0qaSt0aGlzLmVsZW1lbnRzWzExXSk6ND09PXQubGVuZ3RoJiYodFswXT10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0qaSt0aGlzLmVsZW1lbnRzWzNdKnMsdFsxXT10aGlzLmVsZW1lbnRzWzRdKm4rdGhpcy5lbGVtZW50c1s1XSpyK3RoaXMuZWxlbWVudHNbNl0qaSt0aGlzLmVsZW1lbnRzWzddKnMsdFsyXT10aGlzLmVsZW1lbnRzWzhdKm4rdGhpcy5lbGVtZW50c1s5XSpyK3RoaXMuZWxlbWVudHNbMTBdKmkrdGhpcy5lbGVtZW50c1sxMV0qcyx0WzNdPXRoaXMuZWxlbWVudHNbMTJdKm4rdGhpcy5lbGVtZW50c1sxM10qcit0aGlzLmVsZW1lbnRzWzE0XSppK3RoaXMuZWxlbWVudHNbMTVdKnMpKSx0IGluc3RhbmNlb2YgUFZlY3RvciYmKHQueD10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0qaSt0aGlzLmVsZW1lbnRzWzNdLHQueT10aGlzLmVsZW1lbnRzWzRdKm4rdGhpcy5lbGVtZW50c1s1XSpyK3RoaXMuZWxlbWVudHNbNl0qaSt0aGlzLmVsZW1lbnRzWzddLHQuej10aGlzLmVsZW1lbnRzWzhdKm4rdGhpcy5lbGVtZW50c1s5XSpyK3RoaXMuZWxlbWVudHNbMTBdKmkrdGhpcy5lbGVtZW50c1sxMV0pLHR9LHByZUFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKToxNj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCmZvcih2YXIgdD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sbj0wLHI9MDtyPDQ7cisrKWZvcih2YXIgaT0wO2k8NDtpKyssbisrKXRbbl0rPXRoaXMuZWxlbWVudHNbaSswXSplWzQqciswXSt0aGlzLmVsZW1lbnRzW2krNF0qZVs0KnIrMV0rdGhpcy5lbGVtZW50c1tpKzhdKmVbNCpyKzJdK3RoaXMuZWxlbWVudHNbaSsxMl0qZVs0KnIrM10KdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LGFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKToxNj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCmZvcih2YXIgdD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sbj0wLHI9MDtyPDQ7cisrKWZvcih2YXIgaT0wO2k8NDtpKyssbisrKXRbbl0rPXRoaXMuZWxlbWVudHNbNCpyKzBdKmVbaSswXSt0aGlzLmVsZW1lbnRzWzQqcisxXSplW2krNF0rdGhpcy5lbGVtZW50c1s0KnIrMl0qZVtpKzhdK3RoaXMuZWxlbWVudHNbNCpyKzNdKmVbaSsxMl0KdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LHJvdGF0ZTpmdW5jdGlvbihlLHQsbixyKXtpZihhcmd1bWVudHMubGVuZ3RoPDQpdGhpcy5yb3RhdGVaKGUpCmVsc2V7dmFyIGk9bmV3IFBWZWN0b3IodCxuLHIpLHM9aS5tYWcoKQppZigwPT09cylyZXR1cm4KMSE9cyYmKGkubm9ybWFsaXplKCksdD1pLngsbj1pLnkscj1pLnopCnZhciBvPXhlLmNvcyhlKSxhPXhlLnNpbihlKSxsPTEtbwp0aGlzLmFwcGx5KGwqdCp0K28sbCp0Km4tYSpyLGwqdCpyK2EqbiwwLGwqdCpuK2EqcixsKm4qbitvLGwqbipyLWEqdCwwLGwqdCpyLWEqbixsKm4qcithKnQsbCpyKnIrbywwLDAsMCwwLDEpfX0saW52QXBwbHk6ZnVuY3Rpb24oKXtzdD09PXQmJihzdD1uZXcgaHIpCnZhciBlPWFyZ3VtZW50cwpyZXR1cm4gc3Quc2V0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdLGVbOV0sZVsxMF0sZVsxMV0sZVsxMl0sZVsxM10sZVsxNF0sZVsxNV0pLCEhc3QuaW52ZXJ0KCkmJih0aGlzLnByZUFwcGx5KHN0KSwhMCl9LHJvdGF0ZVg6ZnVuY3Rpb24oZSl7dmFyIHQ9eGUuY29zKGUpLG49eGUuc2luKGUpCnRoaXMuYXBwbHkoWzEsMCwwLDAsMCx0LC1uLDAsMCxuLHQsMCwwLDAsMCwxXSl9LHJvdGF0ZVk6ZnVuY3Rpb24oZSl7dmFyIHQ9eGUuY29zKGUpLG49eGUuc2luKGUpCnRoaXMuYXBwbHkoW3QsMCxuLDAsMCwxLDAsMCwtbiwwLHQsMCwwLDAsMCwxXSl9LHJvdGF0ZVo6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKQp0aGlzLmFwcGx5KFt0LC1uLDAsMCxuLHQsMCwwLDAsMCwxLDAsMCwwLDAsMV0pfSxzY2FsZTpmdW5jdGlvbihlLHQsbil7IWV8fHR8fG4/ZSYmdCYmIW4mJihuPTEpOnQ9bj1lLGUmJnQmJm4mJih0aGlzLmVsZW1lbnRzWzBdKj1lLHRoaXMuZWxlbWVudHNbMV0qPXQsdGhpcy5lbGVtZW50c1syXSo9bix0aGlzLmVsZW1lbnRzWzRdKj1lLHRoaXMuZWxlbWVudHNbNV0qPXQsdGhpcy5lbGVtZW50c1s2XSo9bix0aGlzLmVsZW1lbnRzWzhdKj1lLHRoaXMuZWxlbWVudHNbOV0qPXQsdGhpcy5lbGVtZW50c1sxMF0qPW4sdGhpcy5lbGVtZW50c1sxMl0qPWUsdGhpcy5lbGVtZW50c1sxM10qPXQsdGhpcy5lbGVtZW50c1sxNF0qPW4pfSxza2V3WDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsdCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxza2V3WTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsMCwwLDAsdCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxzaGVhclg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLHQsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sc2hlYXJZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSwwLDAsMCx0LDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LG11bHRYOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuP3I/dGhpcy5lbGVtZW50c1swXSplK3RoaXMuZWxlbWVudHNbMV0qdCt0aGlzLmVsZW1lbnRzWzJdKm4rdGhpcy5lbGVtZW50c1szXSpyOnRoaXMuZWxlbWVudHNbMF0qZSt0aGlzLmVsZW1lbnRzWzFdKnQrdGhpcy5lbGVtZW50c1syXSpuK3RoaXMuZWxlbWVudHNbM106dGhpcy5lbGVtZW50c1swXSplK3RoaXMuZWxlbWVudHNbMV0qdCt0aGlzLmVsZW1lbnRzWzNdfSxtdWx0WTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbj9yP3RoaXMuZWxlbWVudHNbNF0qZSt0aGlzLmVsZW1lbnRzWzVdKnQrdGhpcy5lbGVtZW50c1s2XSpuK3RoaXMuZWxlbWVudHNbN10qcjp0aGlzLmVsZW1lbnRzWzRdKmUrdGhpcy5lbGVtZW50c1s1XSp0K3RoaXMuZWxlbWVudHNbNl0qbit0aGlzLmVsZW1lbnRzWzddOnRoaXMuZWxlbWVudHNbNF0qZSt0aGlzLmVsZW1lbnRzWzVdKnQrdGhpcy5lbGVtZW50c1s3XX0sbXVsdFo6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHI/dGhpcy5lbGVtZW50c1s4XSplK3RoaXMuZWxlbWVudHNbOV0qdCt0aGlzLmVsZW1lbnRzWzEwXSpuK3RoaXMuZWxlbWVudHNbMTFdKnI6dGhpcy5lbGVtZW50c1s4XSplK3RoaXMuZWxlbWVudHNbOV0qdCt0aGlzLmVsZW1lbnRzWzEwXSpuK3RoaXMuZWxlbWVudHNbMTFdfSxtdWx0VzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gcj90aGlzLmVsZW1lbnRzWzEyXSplK3RoaXMuZWxlbWVudHNbMTNdKnQrdGhpcy5lbGVtZW50c1sxNF0qbit0aGlzLmVsZW1lbnRzWzE1XSpyOnRoaXMuZWxlbWVudHNbMTJdKmUrdGhpcy5lbGVtZW50c1sxM10qdCt0aGlzLmVsZW1lbnRzWzE0XSpuK3RoaXMuZWxlbWVudHNbMTVdfSxpbnZlcnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbNV0tdGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzRdLHQ9dGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzZdLXRoaXMuZWxlbWVudHNbMl0qdGhpcy5lbGVtZW50c1s0XSxuPXRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s3XS10aGlzLmVsZW1lbnRzWzNdKnRoaXMuZWxlbWVudHNbNF0scj10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbNl0tdGhpcy5lbGVtZW50c1syXSp0aGlzLmVsZW1lbnRzWzVdLGk9dGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzddLXRoaXMuZWxlbWVudHNbM10qdGhpcy5lbGVtZW50c1s1XSxzPXRoaXMuZWxlbWVudHNbMl0qdGhpcy5lbGVtZW50c1s3XS10aGlzLmVsZW1lbnRzWzNdKnRoaXMuZWxlbWVudHNbNl0sbz10aGlzLmVsZW1lbnRzWzhdKnRoaXMuZWxlbWVudHNbMTNdLXRoaXMuZWxlbWVudHNbOV0qdGhpcy5lbGVtZW50c1sxMl0sYT10aGlzLmVsZW1lbnRzWzhdKnRoaXMuZWxlbWVudHNbMTRdLXRoaXMuZWxlbWVudHNbMTBdKnRoaXMuZWxlbWVudHNbMTJdLGw9dGhpcy5lbGVtZW50c1s4XSp0aGlzLmVsZW1lbnRzWzE1XS10aGlzLmVsZW1lbnRzWzExXSp0aGlzLmVsZW1lbnRzWzEyXSxoPXRoaXMuZWxlbWVudHNbOV0qdGhpcy5lbGVtZW50c1sxNF0tdGhpcy5lbGVtZW50c1sxMF0qdGhpcy5lbGVtZW50c1sxM10sdT10aGlzLmVsZW1lbnRzWzldKnRoaXMuZWxlbWVudHNbMTVdLXRoaXMuZWxlbWVudHNbMTFdKnRoaXMuZWxlbWVudHNbMTNdLGM9dGhpcy5lbGVtZW50c1sxMF0qdGhpcy5lbGVtZW50c1sxNV0tdGhpcy5lbGVtZW50c1sxMV0qdGhpcy5lbGVtZW50c1sxNF0sZj1lKmMtdCp1K24qaCtyKmwtaSphK3MqbwppZihNYXRoLmFicyhmKTw9MWUtOSlyZXR1cm4hMQp2YXIgcD1bXQpwWzBdPSt0aGlzLmVsZW1lbnRzWzVdKmMtdGhpcy5lbGVtZW50c1s2XSp1K3RoaXMuZWxlbWVudHNbN10qaCxwWzRdPS10aGlzLmVsZW1lbnRzWzRdKmMrdGhpcy5lbGVtZW50c1s2XSpsLXRoaXMuZWxlbWVudHNbN10qYSxwWzhdPSt0aGlzLmVsZW1lbnRzWzRdKnUtdGhpcy5lbGVtZW50c1s1XSpsK3RoaXMuZWxlbWVudHNbN10qbyxwWzEyXT0tdGhpcy5lbGVtZW50c1s0XSpoK3RoaXMuZWxlbWVudHNbNV0qYS10aGlzLmVsZW1lbnRzWzZdKm8scFsxXT0tdGhpcy5lbGVtZW50c1sxXSpjK3RoaXMuZWxlbWVudHNbMl0qdS10aGlzLmVsZW1lbnRzWzNdKmgscFs1XT0rdGhpcy5lbGVtZW50c1swXSpjLXRoaXMuZWxlbWVudHNbMl0qbCt0aGlzLmVsZW1lbnRzWzNdKmEscFs5XT0tdGhpcy5lbGVtZW50c1swXSp1K3RoaXMuZWxlbWVudHNbMV0qbC10aGlzLmVsZW1lbnRzWzNdKm8scFsxM109K3RoaXMuZWxlbWVudHNbMF0qaC10aGlzLmVsZW1lbnRzWzFdKmErdGhpcy5lbGVtZW50c1syXSpvLHBbMl09K3RoaXMuZWxlbWVudHNbMTNdKnMtdGhpcy5lbGVtZW50c1sxNF0qaSt0aGlzLmVsZW1lbnRzWzE1XSpyLHBbNl09LXRoaXMuZWxlbWVudHNbMTJdKnMrdGhpcy5lbGVtZW50c1sxNF0qbi10aGlzLmVsZW1lbnRzWzE1XSp0LHBbMTBdPSt0aGlzLmVsZW1lbnRzWzEyXSppLXRoaXMuZWxlbWVudHNbMTNdKm4rdGhpcy5lbGVtZW50c1sxNV0qZSxwWzE0XT0tdGhpcy5lbGVtZW50c1sxMl0qcit0aGlzLmVsZW1lbnRzWzEzXSp0LXRoaXMuZWxlbWVudHNbMTRdKmUscFszXT0tdGhpcy5lbGVtZW50c1s5XSpzK3RoaXMuZWxlbWVudHNbMTBdKmktdGhpcy5lbGVtZW50c1sxMV0qcixwWzddPSt0aGlzLmVsZW1lbnRzWzhdKnMtdGhpcy5lbGVtZW50c1sxMF0qbit0aGlzLmVsZW1lbnRzWzExXSp0LHBbMTFdPS10aGlzLmVsZW1lbnRzWzhdKmkrdGhpcy5lbGVtZW50c1s5XSpuLXRoaXMuZWxlbWVudHNbMTFdKmUscFsxNV09K3RoaXMuZWxlbWVudHNbOF0qci10aGlzLmVsZW1lbnRzWzldKnQrdGhpcy5lbGVtZW50c1sxMF0qZQp2YXIgbT0xL2YKcmV0dXJuIHBbMF0qPW0scFsxXSo9bSxwWzJdKj1tLHBbM10qPW0scFs0XSo9bSxwWzVdKj1tLHBbNl0qPW0scFs3XSo9bSxwWzhdKj1tLHBbOV0qPW0scFsxMF0qPW0scFsxMV0qPW0scFsxMl0qPW0scFsxM10qPW0scFsxNF0qPW0scFsxNV0qPW0sdGhpcy5lbGVtZW50cz1wLnNsaWNlKCksITB9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPSIiLHQ9MDt0PDE1O3QrKyllKz10aGlzLmVsZW1lbnRzW3RdKyIsICIKcmV0dXJuIGUrPXRoaXMuZWxlbWVudHNbMTVdfSxwcmludDpmdW5jdGlvbigpe3ZhciBlPWFyKHRoaXMuZWxlbWVudHMpLHQ9IiIreGUubmZzKHRoaXMuZWxlbWVudHNbMF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMV0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMl0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbM10sZSw0KSsiXG4iK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzRdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzVdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzZdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzddLGUsNCkrIlxuIit4ZS5uZnModGhpcy5lbGVtZW50c1s4XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1s5XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxMF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMTFdLGUsNCkrIlxuIit4ZS5uZnModGhpcy5lbGVtZW50c1sxMl0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMTNdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzE0XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxNV0sZSw0KSsiXG5cbiIKeGUucHJpbnRsbih0KX0saW52VHJhbnNsYXRlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnByZUFwcGx5KDEsMCwwLC1lLDAsMSwwLC10LDAsMCwxLC1uLDAsMCwwLDEpfSxpbnZSb3RhdGVYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKC1lKSxuPU1hdGguc2luKC1lKQp0aGlzLnByZUFwcGx5KFsxLDAsMCwwLDAsdCwtbiwwLDAsbix0LDAsMCwwLDAsMV0pfSxpbnZSb3RhdGVZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKC1lKSxuPU1hdGguc2luKC1lKQp0aGlzLnByZUFwcGx5KFt0LDAsbiwwLDAsMSwwLDAsLW4sMCx0LDAsMCwwLDAsMV0pfSxpbnZSb3RhdGVaOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKC1lKSxuPU1hdGguc2luKC1lKQp0aGlzLnByZUFwcGx5KFt0LC1uLDAsMCxuLHQsMCwwLDAsMCwxLDAsMCwwLDAsMV0pfSxpbnZTY2FsZTpmdW5jdGlvbihlLHQsbil7dGhpcy5wcmVBcHBseShbMS9lLDAsMCwwLDAsMS90LDAsMCwwLDAsMS9uLDAsMCwwLDAsMV0pfX0KdmFyIHVyPXhlLlBNYXRyaXhTdGFjaz1mdW5jdGlvbigpe3RoaXMubWF0cml4U3RhY2s9W119CnVyLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9d2UuJG5ld1BNYXRyaXgoKQoxPT09YXJndW1lbnRzLmxlbmd0aD9lLnNldChhcmd1bWVudHNbMF0pOmUuc2V0KGFyZ3VtZW50cyksdGhpcy5tYXRyaXhTdGFjay5wdXNoKGUpfSxpci5wcm90b3R5cGUuJG5ld1BNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGxyfSxzci5wcm90b3R5cGUuJG5ld1BNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGhyfSx1ci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbigpe3RoaXMubWF0cml4U3RhY2sucHVzaCh0aGlzLnBlZWsoKSl9LHVyLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRyaXhTdGFjay5wb3AoKX0sdXIucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXt2YXIgZT13ZS4kbmV3UE1hdHJpeCgpCnJldHVybiBlLnNldCh0aGlzLm1hdHJpeFN0YWNrW3RoaXMubWF0cml4U3RhY2subGVuZ3RoLTFdKSxlfSx1ci5wcm90b3R5cGUubXVsdD1mdW5jdGlvbihlKXt0aGlzLm1hdHJpeFN0YWNrW3RoaXMubWF0cml4U3RhY2subGVuZ3RoLTFdLmFwcGx5KGUpfSx4ZS5zcGxpdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLnNwbGl0KHQpfSx4ZS5zcGxpdFRva2Vucz1mdW5jdGlvbihlLG4pe2lmKG49PT10KXJldHVybiBlLnNwbGl0KC9ccysvZykKdmFyIHIsaSxzPW4uc3BsaXQoLygpL2cpLG89IiIsYT1lLmxlbmd0aCxsPVtdCmZvcihyPTA7cjxhO3IrKylpPWVbcl0scy5pbmRleE9mKGkpPi0xPygiIiE9PW8mJmwucHVzaChvKSxvPSIiKTpvKz1pCnJldHVybiIiIT09byYmbC5wdXNoKG8pLGx9LHhlLmFwcGVuZD1mdW5jdGlvbihlLHQpe3JldHVybiBlW2UubGVuZ3RoXT10LGV9LHhlLmNvbmNhdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdCh0KX0seGUuc29ydD1mdW5jdGlvbihlLHQpe3ZhciBuPVtdCmlmKGUubGVuZ3RoPjApe2Zvcih2YXIgcj10PjA/dDplLmxlbmd0aCxpPTA7aTxyO2krKyluLnB1c2goZVtpXSkKaWYoInN0cmluZyI9PXR5cGVvZiBlWzBdP24uc29ydCgpOm4uc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLXR9KSx0PjApZm9yKHZhciBzPW4ubGVuZ3RoO3M8ZS5sZW5ndGg7cysrKW4ucHVzaChlW3NdKX1yZXR1cm4gbn0seGUuc3BsaWNlPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGUKaWYodCBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgcj0wLGk9bjtyPHQubGVuZ3RoO2krKyxyKyspZS5zcGxpY2UoaSwwLHRbcl0pCmVsc2UgZS5zcGxpY2UobiwwLHQpCnJldHVybiBlfSx4ZS5zdWJzZXQ9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXIhPT10P24rcjplLmxlbmd0aApyZXR1cm4gZS5zbGljZShuLGkpfSx4ZS5qb2luPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuam9pbih0KX0seGUuc2hvcnRlbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1lLmxlbmd0aCxyPTA7cjxuO3IrKyl0W3JdPWVbcl0KcmV0dXJuIHQucG9wKCksdH0seGUuZXhwYW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zbGljZSgwKSxyPXR8fDIqZS5sZW5ndGgKcmV0dXJuIG4ubGVuZ3RoPXIsbn0seGUuYXJyYXlDb3B5PWZ1bmN0aW9uKCl7dmFyIGUsbixyLGk9MCxzPTAKMj09PWFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9ZS5sZW5ndGgpOjM9PT1hcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXSk6NT09PWFyZ3VtZW50cy5sZW5ndGgmJihlPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxyPWFyZ3VtZW50c1s0XSkKZm9yKHZhciBvPWksYT1zO288citpO28rKyxhKyspe2lmKG5bYV09PT10KXRocm93ImFycmF5IGluZGV4IG91dCBvZiBib3VuZHMgZXhjZXB0aW9uIgpuW2FdPWVbb119fSx4ZS5yZXZlcnNlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJldmVyc2UoKX0seGUubWl4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZSsoKHQtZSkqbj4+OCl9LHhlLnBlZz1mdW5jdGlvbihlKXtyZXR1cm4gZTwwPzA6ZT4yNTU/MjU1OmV9LHhlLm1vZGVzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbixyLGksbyxhLGwsaCx1LGMpe3ZhciBmPXMoKCg0Mjc4MTkwMDgwJmUpPj4+MjQpK3QsMjU1KTw8MjQscD1uKygoaC1uKSp0Pj44KQpwPShwPDA/MDpwPjI1NT8yNTU6cCk8PDE2CnZhciBtPXIrKCh1LXIpKnQ+PjgpCm09KG08MD8wOm0+MjU1PzI1NTptKTw8OAp2YXIgZz1pKygoYy1pKSp0Pj44KQpyZXR1cm4gZz1nPDA/MDpnPjI1NT8yNTU6ZyxmfHB8bXxnfXZhciB0PWMuQUxQSEFfTUFTSyxuPWMuUkVEX01BU0sscj1jLkdSRUVOX01BU0ssaT1jLkJMVUVfTUFTSyxzPU1hdGgubWluLG89TWF0aC5tYXgKcmV0dXJue3JlcGxhY2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0sYmxlbmQ6ZnVuY3Rpb24oZSxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9ZSZuLGg9ZSZyLHU9ZSZpLGM9byZuLGY9byZyLHA9byZpCnJldHVybiBzKCgoZSZ0KT4+PjI0KSthLDI1NSk8PDI0fGwrKChjLWwpKmE+PjgpJm58aCsoKGYtaCkqYT4+OCkmcnx1KygocC11KSphPj44KSZpfSxhZGQ6ZnVuY3Rpb24oZSxvKXt2YXIgYT0obyZ0KT4+PjI0CnJldHVybiBzKCgoZSZ0KT4+PjI0KSthLDI1NSk8PDI0fHMoKGUmbikrKChvJm4pPj44KSphLG4pJm58cygoZSZyKSsoKG8mcik+PjgpKmEscikmcnxzKChlJmkpKygobyZpKSphPj44KSxpKX0sc3VidHJhY3Q6ZnVuY3Rpb24oZSxhKXt2YXIgbD0oYSZ0KT4+PjI0CnJldHVybiBzKCgoZSZ0KT4+PjI0KStsLDI1NSk8PDI0fG8oKGUmbiktKChhJm4pPj44KSpsLHIpJm58bygoZSZyKS0oKGEmcik+PjgpKmwsaSkmcnxvKChlJmkpLSgoYSZpKSpsPj44KSwwKX0sbGlnaHRlc3Q6ZnVuY3Rpb24oZSxhKXt2YXIgbD0oYSZ0KT4+PjI0CnJldHVybiBzKCgoZSZ0KT4+PjI0KStsLDI1NSk8PDI0fG8oZSZuLCgoYSZuKT4+OCkqbCkmbnxvKGUmciwoKGEmcik+PjgpKmwpJnJ8byhlJmksKGEmaSkqbD4+OCl9LGRhcmtlc3Q6ZnVuY3Rpb24oZSxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9ZSZuLGg9ZSZyLHU9ZSZpLGM9cyhlJm4sKChvJm4pPj44KSphKSxmPXMoZSZyLCgobyZyKT4+OCkqYSkscD1zKGUmaSwobyZpKSphPj44KQpyZXR1cm4gcygoKGUmdCk+Pj4yNCkrYSwyNTUpPDwyNHxsKygoYy1sKSphPj44KSZufGgrKChmLWgpKmE+PjgpJnJ8dSsoKHAtdSkqYT4+OCkmaX0sZGlmZmVyZW5jZTpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09bD5jP2wtYzpjLWwsZz1oPmY/aC1mOmYtaCxkPXU+cD91LXA6cC11CnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LGV4Y2x1c2lvbjpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09bCtjLShsKmM+PjcpLGc9aCtmLShoKmY+PjcpLGQ9dStwLSh1KnA+PjcpCnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LG11bHRpcGx5OmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT1sKmM+PjgsZz1oKmY+PjgsZD11KnA+PjgKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sc2NyZWVuOmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT0yNTUtKCgyNTUtbCkqKDI1NS1jKT4+OCksZz0yNTUtKCgyNTUtaCkqKDI1NS1mKT4+OCksZD0yNTUtKCgyNTUtdSkqKDI1NS1wKT4+OCkKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0saGFyZF9saWdodDpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09YzwxMjg/bCpjPj43OjI1NS0oKDI1NS1sKSooMjU1LWMpPj43KSxnPWY8MTI4P2gqZj4+NzoyNTUtKCgyNTUtaCkqKDI1NS1mKT4+NyksZD1wPDEyOD91KnA+Pjc6MjU1LSgoMjU1LXUpKigyNTUtcCk+PjcpCnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LHNvZnRfbGlnaHQ6ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPShsKmM+PjcpKyhsKmw+PjgpLShsKmwqYz4+MTUpLGc9KGgqZj4+NykrKGgqaD4+OCktKGgqaCpmPj4xNSksZD0odSpwPj43KSsodSp1Pj44KS0odSp1KnA+PjE1KQpyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxvdmVybGF5OmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT1sPDEyOD9sKmM+Pjc6MjU1LSgoMjU1LWwpKigyNTUtYyk+PjcpLGc9aDwxMjg/aCpmPj43OjI1NS0oKDI1NS1oKSooMjU1LWYpPj43KSxkPXU8MTI4P3UqcD4+NzoyNTUtKCgyNTUtdSkqKDI1NS1wKT4+NykKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sZG9kZ2U6ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPTI1NQoyNTUhPT1jJiYobT0obDw8OCkvKDI1NS1jKSxtPW08MD8wOm0+MjU1PzI1NTptKQp2YXIgZz0yNTUKMjU1IT09ZiYmKGc9KGg8PDgpLygyNTUtZiksZz1nPDA/MDpnPjI1NT8yNTU6ZykKdmFyIGQ9MjU1CnJldHVybiAyNTUhPT1wJiYoZD0odTw8OCkvKDI1NS1wKSxkPWQ8MD8wOmQ+MjU1PzI1NTpkKSxlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LGJ1cm46ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPTAKMCE9PWMmJihtPSgyNTUtbDw8OCkvYyxtPTI1NS0obTwwPzA6bT4yNTU/MjU1Om0pKQp2YXIgZz0wCjAhPT1mJiYoZz0oMjU1LWg8PDgpL2YsZz0yNTUtKGc8MD8wOmc+MjU1PzI1NTpnKSkKdmFyIGQ9MApyZXR1cm4gMCE9PXAmJihkPSgyNTUtdTw8OCkvcCxkPTI1NS0oZDwwPzA6ZD4yNTU/MjU1OmQpKSxlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9fX0oKSx4ZS5jb2xvcj1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZSE9PXQmJm4hPT10JiZyIT09dCYmaSE9PXQ/TChlLG4scixpKTplIT09dCYmbiE9PXQmJnIhPT10P0woZSxuLHIsa3QpOmUhPT10JiZuIT09dD9JKGUsbik6Im51bWJlciI9PXR5cGVvZiBlP0QoZSk6TChCdCwkdCxHdCxrdCl9LHhlLmNvbG9yLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiJyZ2JhKCIrKChlJmMuUkVEX01BU0spPj4+MTYpKyIsIisoKGUmYy5HUkVFTl9NQVNLKT4+PjgpKyIsIisoZSZjLkJMVUVfTUFTSykrIiwiKygoZSZjLkFMUEhBX01BU0spPj4+MjQpLzI1NSsiKSJ9LHhlLmNvbG9yLnRvSW50PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByPDwyNCZjLkFMUEhBX01BU0t8ZTw8MTYmYy5SRURfTUFTS3x0PDw4JmMuR1JFRU5fTUFTS3xuJmMuQkxVRV9NQVNLfSx4ZS5jb2xvci50b0FycmF5PWZ1bmN0aW9uKGUpe3JldHVyblsoZSZjLlJFRF9NQVNLKT4+PjE2LChlJmMuR1JFRU5fTUFTSyk+Pj44LGUmYy5CTFVFX01BU0ssKGUmYy5BTFBIQV9NQVNLKT4+PjI0XX0seGUuY29sb3IudG9HTEFycmF5PWZ1bmN0aW9uKGUpe3JldHVyblsoKGUmYy5SRURfTUFTSyk+Pj4xNikvMjU1LCgoZSZjLkdSRUVOX01BU0spPj4+OCkvMjU1LChlJmMuQkxVRV9NQVNLKS8yNTUsKChlJmMuQUxQSEFfTUFTSyk+Pj4yNCkvMjU1XX0seGUuY29sb3IudG9SR0I9ZnVuY3Rpb24oZSx0LG4pe2U9ZT5CdD9CdDplLHQ9dD4kdD8kdDp0LG49bj5HdD9HdDpuLGU9ZTwwPzA6ZSxlPWUvQnQqMzYwLHQ9dC8kdCoxMDAsbj1uL0d0KjEwMAp2YXIgcj1NYXRoLnJvdW5kKG4vMTAwKjI1NSkKaWYoMD09PXQpcmV0dXJuW3IscixyXQp2YXIgaT1lJTM2MCxzPWklNjAsbz1NYXRoLnJvdW5kKG4qKDEwMC10KS8xZTQqMjU1KSxhPU1hdGgucm91bmQobiooNmUzLXQqcykvNmU1KjI1NSksbD1NYXRoLnJvdW5kKG4qKDZlMy10Kig2MC1zKSkvNmU1KjI1NSkKc3dpdGNoKE1hdGguZmxvb3IoaS82MCkpe2Nhc2UgMDpyZXR1cm5bcixsLG9dCmNhc2UgMTpyZXR1cm5bYSxyLG9dCmNhc2UgMjpyZXR1cm5bbyxyLGxdCmNhc2UgMzpyZXR1cm5bbyxhLHJdCmNhc2UgNDpyZXR1cm5bbCxvLHJdCmNhc2UgNTpyZXR1cm5bcixvLGFdCmRlZmF1bHQ6RS5kZWJ1ZygiVW5leHBlY3RlZGx5IGhpdCBkZWZhdWx0IGNhc2UgaW4gdG9SR0IgZnVuY3Rpb24uIil9fSx4ZS5icmlnaHRuZXNzPWZ1bmN0aW9uKGUpe3JldHVybiBPKGUpWzJdfSx4ZS5zYXR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBPKGUpWzFdfSx4ZS5odWU9ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSlbMF19LHhlLnJlZD1mdW5jdGlvbihlKXtyZXR1cm4oKGUmYy5SRURfTUFTSyk+Pj4xNikvMjU1KkJ0fSx4ZS5ncmVlbj1mdW5jdGlvbihlKXtyZXR1cm4oKGUmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSokdH0seGUuYmx1ZT1mdW5jdGlvbihlKXtyZXR1cm4oZSZjLkJMVUVfTUFTSykvMjU1Kkd0fSx4ZS5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4oKGUmYy5BTFBIQV9NQVNLKT4+PjI0KS8yNTUqa3R9LHhlLmxlcnBDb2xvcj1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG8sYSxsLGgsdSxmLHAsbSxnLGQsdix5LHgsQSxiPXhlLmNvbG9yKGUpLHc9eGUuY29sb3IodCkKcmV0dXJuIFV0PT09Yy5IU0I/KGQ9TyhiKSx1PSgoYiZjLkFMUEhBX01BU0spPj4+MjQpL2t0LHY9Tyh3KSxnPSgodyZjLkFMUEhBX01BU0spPj4+MjQpL2t0LHg9eGUubGVycChkWzBdLHZbMF0sbiksQT14ZS5sZXJwKGRbMV0sdlsxXSxuKSxzPXhlLmxlcnAoZFsyXSx2WzJdLG4pLHk9eGUuY29sb3IudG9SR0IoeCxBLHMpLG89eGUubGVycCh1LGcsbikqa3QrLjV8MCxvPDwyNCZjLkFMUEhBX01BU0t8eVswXTw8MTYmYy5SRURfTUFTS3x5WzFdPDw4JmMuR1JFRU5fTUFTS3x5WzJdJmMuQkxVRV9NQVNLKTooYT0oYiZjLlJFRF9NQVNLKT4+PjE2LGw9KGImYy5HUkVFTl9NQVNLKT4+PjgsaD1iJmMuQkxVRV9NQVNLLHU9KChiJmMuQUxQSEFfTUFTSyk+Pj4yNCkva3QsZj0odyZjLlJFRF9NQVNLKT4+PjE2LHA9KHcmYy5HUkVFTl9NQVNLKT4+PjgsbT13JmMuQkxVRV9NQVNLLGc9KCh3JmMuQUxQSEFfTUFTSyk+Pj4yNCkva3Qscj14ZS5sZXJwKGEsZixuKSsuNXwwLGk9eGUubGVycChsLHAsbikrLjV8MCxzPXhlLmxlcnAoaCxtLG4pKy41fDAsbz14ZS5sZXJwKHUsZyxuKSprdCsuNXwwLG88PDI0JmMuQUxQSEFfTUFTS3xyPDwxNiZjLlJFRF9NQVNLfGk8PDgmYy5HUkVFTl9NQVNLfHMmYy5CTFVFX01BU0spfSx4ZS5jb2xvck1vZGU9ZnVuY3Rpb24oKXtVdD1hcmd1bWVudHNbMF0sYXJndW1lbnRzLmxlbmd0aD4xJiYoQnQ9YXJndW1lbnRzWzFdLCR0PWFyZ3VtZW50c1syXXx8YXJndW1lbnRzWzFdLEd0PWFyZ3VtZW50c1szXXx8YXJndW1lbnRzWzFdLGt0PWFyZ3VtZW50c1s0XXx8YXJndW1lbnRzWzFdKX0seGUuYmxlbmRDb2xvcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49PT1jLlJFUExBQ0U/eGUubW9kZXMucmVwbGFjZShlLHQpOm49PT1jLkJMRU5EP3hlLm1vZGVzLmJsZW5kKGUsdCk6bj09PWMuQUREP3hlLm1vZGVzLmFkZChlLHQpOm49PT1jLlNVQlRSQUNUP3hlLm1vZGVzLnN1YnRyYWN0KGUsdCk6bj09PWMuTElHSFRFU1Q/eGUubW9kZXMubGlnaHRlc3QoZSx0KTpuPT09Yy5EQVJLRVNUP3hlLm1vZGVzLmRhcmtlc3QoZSx0KTpuPT09Yy5ESUZGRVJFTkNFP3hlLm1vZGVzLmRpZmZlcmVuY2UoZSx0KTpuPT09Yy5FWENMVVNJT04/eGUubW9kZXMuZXhjbHVzaW9uKGUsdCk6bj09PWMuTVVMVElQTFk/eGUubW9kZXMubXVsdGlwbHkoZSx0KTpuPT09Yy5TQ1JFRU4/eGUubW9kZXMuc2NyZWVuKGUsdCk6bj09PWMuSEFSRF9MSUdIVD94ZS5tb2Rlcy5oYXJkX2xpZ2h0KGUsdCk6bj09PWMuU09GVF9MSUdIVD94ZS5tb2Rlcy5zb2Z0X2xpZ2h0KGUsdCk6bj09PWMuT1ZFUkxBWT94ZS5tb2Rlcy5vdmVybGF5KGUsdCk6bj09PWMuRE9ER0U/eGUubW9kZXMuZG9kZ2UoZSx0KTpuPT09Yy5CVVJOP3hlLm1vZGVzLmJ1cm4oZSx0KTp2b2lkIDB9LHhlLnByaW50TWF0cml4PWZ1bmN0aW9uKCl7dHQucHJpbnQoKX0saXIucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQpe3R0LnRyYW5zbGF0ZShlLHQpLG50LmludlRyYW5zbGF0ZShlLHQpLEFlLnRyYW5zbGF0ZShlLHQpfSxzci5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxuKXt0dC50cmFuc2xhdGUoZSx0LG4pLG50LmludlRyYW5zbGF0ZShlLHQsbil9LGlyLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihlLHQpe3R0LnNjYWxlKGUsdCksbnQuaW52U2NhbGUoZSx0KSxBZS5zY2FsZShlLHR8fGUpfSxzci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oZSx0LG4pe3R0LnNjYWxlKGUsdCxuKSxudC5pbnZTY2FsZShlLHQsbil9LGlyLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hcnJheSgpCkFlLnRyYW5zZm9ybSh0WzBdLHRbM10sdFsxXSx0WzRdLHRbMl0sdFs1XSl9LHNyLnByb3RvdHlwZS50cmFuc2Zvcm1tPWZ1bmN0aW9uKGUpe3Rocm93InAudHJhbnNmb3JtIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIDNEIG1vZGUifSxpci5wcm90b3R5cGUucHVzaE1hdHJpeD1mdW5jdGlvbigpe3J0LmxvYWQodHQpLGl0LmxvYWQobnQpLE4oKX0sc3IucHJvdG90eXBlLnB1c2hNYXRyaXg9ZnVuY3Rpb24oKXtydC5sb2FkKHR0KSxpdC5sb2FkKG50KX0saXIucHJvdG90eXBlLnBvcE1hdHJpeD1mdW5jdGlvbigpe3R0LnNldChydC5wb3AoKSksbnQuc2V0KGl0LnBvcCgpKSxGKCl9LHNyLnByb3RvdHlwZS5wb3BNYXRyaXg9ZnVuY3Rpb24oKXt0dC5zZXQocnQucG9wKCkpLG50LnNldChpdC5wb3AoKSl9LGlyLnByb3RvdHlwZS5yZXNldE1hdHJpeD1mdW5jdGlvbigpe3R0LnJlc2V0KCksbnQucmVzZXQoKSxBZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApfSxzci5wcm90b3R5cGUucmVzZXRNYXRyaXg9ZnVuY3Rpb24oKXt0dC5yZXNldCgpLG50LnJlc2V0KCl9LHJyLnByb3RvdHlwZS5hcHBseU1hdHJpeD1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cwp0dC5hcHBseShlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdLGVbMTVdKSxudC5pbnZBcHBseShlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdLGVbMTVdKX0saXIucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PWUubGVuZ3RoO3Q8MTY7dCsrKWVbdF09MAplWzEwXT1lWzE1XT0xLHJyLnByb3RvdHlwZS5hcHBseU1hdHJpeC5hcHBseSh0aGlzLGUpfSx4ZS5yb3RhdGVYPWZ1bmN0aW9uKGUpe3R0LnJvdGF0ZVgoZSksbnQuaW52Um90YXRlWChlKX0saXIucHJvdG90eXBlLnJvdGF0ZVo9ZnVuY3Rpb24oKXt0aHJvdyJyb3RhdGVaKCkgaXMgbm90IHN1cHBvcnRlZCBpbiAyRCBtb2RlLiBVc2Ugcm90YXRlKGZsb2F0KSBpbnN0ZWFkLiJ9LHNyLnByb3RvdHlwZS5yb3RhdGVaPWZ1bmN0aW9uKGUpe3R0LnJvdGF0ZVooZSksbnQuaW52Um90YXRlWihlKX0seGUucm90YXRlWT1mdW5jdGlvbihlKXt0dC5yb3RhdGVZKGUpLG50LmludlJvdGF0ZVkoZSl9LGlyLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24oZSl7dHQucm90YXRlWihlKSxudC5pbnZSb3RhdGVaKGUpLEFlLnJvdGF0ZShlKX0sc3IucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbihlKXthcmd1bWVudHMubGVuZ3RoPDQ/eGUucm90YXRlWihlKToodHQucm90YXRlKGUsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pLG50LnJvdGF0ZSgtZSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSkpfSxpci5wcm90b3R5cGUuc2hlYXJYPWZ1bmN0aW9uKGUpe3R0LnNoZWFyWChlKSxBZS50cmFuc2Zvcm0oMSwwLGUsMSwwLDApfSxzci5wcm90b3R5cGUuc2hlYXJYPWZ1bmN0aW9uKGUpe3R0LnNoZWFyWChlKX0saXIucHJvdG90eXBlLnNoZWFyWT1mdW5jdGlvbihlKXt0dC5zaGVhclkoZSksQWUudHJhbnNmb3JtKDEsZSwwLDEsMCwwKX0sc3IucHJvdG90eXBlLnNoZWFyWT1mdW5jdGlvbihlKXt0dC5zaGVhclkoZSl9LHhlLnB1c2hTdHlsZT1mdW5jdGlvbigpe04oKSx4ZS5wdXNoTWF0cml4KCkKdmFyIGU9e2RvRmlsbDphdCxjdXJyZW50RmlsbENvbG9yOmh0LGRvU3Ryb2tlOmN0LGN1cnJlbnRTdHJva2VDb2xvcjpwdCxjdXJUaW50Okh0LGN1clJlY3RNb2RlOkF0LGN1ckNvbG9yTW9kZTpVdCxjb2xvck1vZGVYOkJ0LGNvbG9yTW9kZVo6R3QsY29sb3JNb2RlWTokdCxjb2xvck1vZGVBOmt0LGN1clRleHRGb250OmxuLGhvcml6b250YWxUZXh0QWxpZ25tZW50Okp0LHZlcnRpY2FsVGV4dEFsaWdubWVudDplbix0ZXh0TW9kZTp0bixjdXJGb250TmFtZTpubixjdXJUZXh0U2l6ZTpybixjdXJUZXh0QXNjZW50OnNuLGN1clRleHREZXNjZW50Om9uLGN1clRleHRMZWFkaW5nOmFufQokbi5wdXNoKGUpfSx4ZS5wb3BTdHlsZT1mdW5jdGlvbigpe3ZhciBlPSRuLnBvcCgpCmlmKCFlKXRocm93IlRvbyBtYW55IHBvcFN0eWxlKCkgd2l0aG91dCBlbm91Z2ggcHVzaFN0eWxlKCkiCkYoKSx4ZS5wb3BNYXRyaXgoKSxhdD1lLmRvRmlsbCxodD1lLmN1cnJlbnRGaWxsQ29sb3IsY3Q9ZS5kb1N0cm9rZSxwdD1lLmN1cnJlbnRTdHJva2VDb2xvcixIdD1lLmN1clRpbnQsQXQ9ZS5jdXJSZWN0TW9kZSxVdD1lLmN1ckNvbG9yTW9kZSxCdD1lLmNvbG9yTW9kZVgsR3Q9ZS5jb2xvck1vZGVaLCR0PWUuY29sb3JNb2RlWSxrdD1lLmNvbG9yTW9kZUEsbG49ZS5jdXJUZXh0Rm9udCxubj1lLmN1ckZvbnROYW1lLHJuPWUuY3VyVGV4dFNpemUsSnQ9ZS5ob3Jpem9udGFsVGV4dEFsaWdubWVudCxlbj1lLnZlcnRpY2FsVGV4dEFsaWdubWVudCx0bj1lLnRleHRNb2RlLHNuPWUuY3VyVGV4dEFzY2VudCxvbj1lLmN1clRleHREZXNjZW50LGFuPWUuY3VyVGV4dExlYWRpbmd9LHhlLnllYXI9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldEZ1bGxZZWFyKCl9LHhlLm1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRNb250aCgpKzF9LHhlLmRheT1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0RGF0ZSgpfSx4ZS5ob3VyPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRIb3VycygpfSx4ZS5taW51dGU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldE1pbnV0ZXMoKX0seGUuc2Vjb25kPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRTZWNvbmRzKCl9LHhlLm1pbGxpcz1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpLVl0fSxpci5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7aygpLEFlLmxpbmVXaWR0aD1ndAp2YXIgZT14ZS5wbW91c2VYLHQ9eGUucG1vdXNlWQp4ZS5wbW91c2VYPVZ0LHhlLnBtb3VzZVk9enQsTigpLHhlLmRyYXcoKSxGKCksVnQ9eGUubW91c2VYLHp0PXhlLm1vdXNlWSx4ZS5wbW91c2VYPWUseGUucG1vdXNlWT10fSxzci5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7aygpCnZhciBlPXhlLnBtb3VzZVgsdD14ZS5wbW91c2VZCnhlLnBtb3VzZVg9VnQseGUucG1vdXNlWT16dCxBZS5jbGVhcihBZS5ERVBUSF9CVUZGRVJfQklUKSxXdD17YXR0cmlidXRlczp7fSxsb2NhdGlvbnM6e319LHhlLm5vTGlnaHRzKCkseGUubGlnaHRGYWxsb2ZmKDEsMCwwKSx4ZS5zaGluaW5lc3MoMSkseGUuYW1iaWVudCgyNTUsMjU1LDI1NSkseGUuc3BlY3VsYXIoMCwwLDApLHhlLmVtaXNzaXZlKDAsMCwwKSx4ZS5jYW1lcmEoKSx4ZS5kcmF3KCksVnQ9eGUubW91c2VYLHp0PXhlLm1vdXNlWSx4ZS5wbW91c2VYPWUseGUucG1vdXNlWT10fSx4ZS5ub0xvb3A9ZnVuY3Rpb24oKXt5dD0hMSxkdD0hMSxjbGVhckludGVydmFsKHh0KSxiZS5vblBhdXNlKCl9LHhlLmxvb3A9ZnVuY3Rpb24oKXtkdHx8KGp0PURhdGUubm93KCksS3Q9MCx4dD1sLnNldEludGVydmFsKGZ1bmN0aW9uKCl7dHJ5e2JlLm9uRnJhbWVTdGFydCgpLHhlLnJlZHJhdygpLGJlLm9uRnJhbWVFbmQoKX1jYXRjaChlKXt0aHJvdyBsLmNsZWFySW50ZXJ2YWwoeHQpLGV9fSxNdCkseXQ9ITAsZHQ9ITAsYmUub25Mb29wKCkpfSx4ZS5mcmFtZVJhdGU9ZnVuY3Rpb24oZSl7Q3Q9ZSxNdD0xZTMvQ3QseXQmJih4ZS5ub0xvb3AoKSx4ZS5sb29wKCkpfSx4ZS5leGl0PWZ1bmN0aW9uKCl7bC5jbGVhckludGVydmFsKHh0KSx3KHhlLmV4dGVybmFscy5jYW52YXMuaWQpLGRlbGV0ZSBkZS5vbm1vdXNlZG93bgpmb3IodmFyIGUgaW4gRS5saWIpRS5saWIuaGFzT3duUHJvcGVydHkoZSkmJkUubGliW2VdLmhhc093blByb3BlcnR5KCJkZXRhY2giKSYmRS5saWJbZV0uZGV0YWNoKHhlKQpmb3IodmFyIHQ9eWUubGVuZ3RoO3QtLTspQSh5ZVt0XSkKYmUub25FeGl0KCl9LHhlLmN1cnNvcj1mdW5jdGlvbigpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MXx8MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGUuUEltYWdlKXt2YXIgZSx0LG49YXJndW1lbnRzWzBdCmlmKGFyZ3VtZW50cy5sZW5ndGg+PTMpe2lmKGU9YXJndW1lbnRzWzFdLHQ9YXJndW1lbnRzWzJdLGU8MHx8dDwwfHx0Pj1uLmhlaWdodHx8ZT49bi53aWR0aCl0aHJvdyJ4IGFuZCB5IG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGltYWdlIn1lbHNlIGU9bi53aWR0aD4+PjEsdD1uLmhlaWdodD4+PjEKdmFyIHI9bi50b0RhdGFVUkwoKSxpPSd1cmwoIicrcisnIikgJytlKyIgIit0KyIsIGRlZmF1bHQiClR0PWRlLnN0eWxlLmN1cnNvcj1pfWVsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBzPWFyZ3VtZW50c1swXQpUdD1kZS5zdHlsZS5jdXJzb3I9c31lbHNlIFR0PWRlLnN0eWxlLmN1cnNvcj1fdH0seGUubm9DdXJzb3I9ZnVuY3Rpb24oKXtUdD1kZS5zdHlsZS5jdXJzb3I9Yy5OT0NVUlNPUn0seGUubGluaz1mdW5jdGlvbihlLG4pe24hPT10P2wub3BlbihlLG4pOmwubG9jYXRpb249ZX0seGUuYmVnaW5EcmF3PXUseGUuZW5kRHJhdz11LGlyLnByb3RvdHlwZS50b0ltYWdlRGF0YT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZT1lIT09dD9lOjAsbj1uIT09dD9uOjAscj1yIT09dD9yOnhlLndpZHRoLGk9aSE9PXQ/aTp4ZS5oZWlnaHQsQWUuZ2V0SW1hZ2VEYXRhKGUsbixyLGkpfSxzci5wcm90b3R5cGUudG9JbWFnZURhdGE9ZnVuY3Rpb24oZSxuLHIsaSl7ZT1lIT09dD9lOjAsbj1uIT09dD9uOjAscj1yIT09dD9yOnhlLndpZHRoLGk9aSE9PXQ/aTp4ZS5oZWlnaHQKdmFyIHM9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxvPXMuZ2V0Q29udGV4dCgiMmQiKSxhPW8uY3JlYXRlSW1hZ2VEYXRhKHIsaSksbD1uZXcgeShyKmkqNCkKQWUucmVhZFBpeGVscyhlLG4scixpLEFlLlJHQkEsQWUuVU5TSUdORURfQllURSxsKQpmb3IodmFyIHU9MCxjPWwubGVuZ3RoLGY9YS5kYXRhO3U8Yzt1KyspZlt1XT1sWyhpLTEtTWF0aC5mbG9vcih1LzQvcikpKnIqNCt1JSg0KnIpXQpyZXR1cm4gYX0seGUuc3RhdHVzPWZ1bmN0aW9uKGUpe2wuc3RhdHVzPWV9LHhlLmJpbmFyeT1mdW5jdGlvbihlLHQpe3ZhciBuCmlmKHQ+MCluPXQKZWxzZSBpZihlIGluc3RhbmNlb2YgQ2hhciluPTE2LGV8PTAKZWxzZSBmb3Iobj0zMjtuPjEmJiEoZT4+Pm4tMSYxKTspbi0tCmZvcih2YXIgcj0iIjtuPjA7KXIrPWU+Pj4tLW4mMT8iMSI6IjAiCnJldHVybiByfSx4ZS51bmJpbmFyeT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgtMSxuPTEscj0wO3Q+PTA7KXt2YXIgaT1lW3QtLV0KaWYoIjAiIT09aSYmIjEiIT09aSl0aHJvdyJ0aGUgdmFsdWUgcGFzc2VkIGludG8gdW5iaW5hcnkgd2FzIG5vdCBhbiA4IGJpdCBiaW5hcnkgbnVtYmVyIgoiMSI9PT1pJiYocis9biksbjw8PTF9cmV0dXJuIHJ9CnZhciBjcj1mdW5jdGlvbihlLG4pe249bj09PXR8fG51bGw9PT1uP249ODpuLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpCmZvcih2YXIgcj1OdW1iZXIoZSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7ci5sZW5ndGg8bjspcj0iMCIrcgpyZXR1cm4gci5sZW5ndGg+PW4mJihyPXIuc3Vic3RyaW5nKHIubGVuZ3RoLW4sci5sZW5ndGgpKSxyfQp4ZS5oZXg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGgmJih0PWUgaW5zdGFuY2VvZiBDaGFyPzQ6OCksY3IoZSx0KX0seGUudW5oZXg9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChCKGVbbl0pKQpyZXR1cm4gdH1yZXR1cm4gQihlKX0seGUubG9hZFN0cmluZ3M9ZnVuY3Rpb24oZSl7aWYoZltlXSlyZXR1cm4gZltlXS5zcGxpdCgiXG4iKQp2YXIgdD1vKGUpCnJldHVybiJzdHJpbmciIT10eXBlb2YgdHx8IiI9PT10P1tdOih0PXQucmVwbGFjZSgvKFxyXG4/KS9nLCJcbiIpLnJlcGxhY2UoL1xuJC8sIiIpLHQuc3BsaXQoIlxuIikpfSx4ZS5zYXZlU3RyaW5ncz1mdW5jdGlvbihlLHQpe2ZbZV09dC5qb2luKCJcbiIpfSx4ZS5sb2FkQnl0ZXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW8oZSksbj1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspbi5wdXNoKHQuY2hhckNvZGVBdChyKSkKcmV0dXJuIG59LHhlLm1hdGNoQWxsPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHI9W10saT1uZXcgUmVnRXhwKHQsImciKTtudWxsIT09KG49aS5leGVjKGUpKTspci5wdXNoKG4pLDA9PT1uWzBdLmxlbmd0aCYmKytpLmxhc3RJbmRleApyZXR1cm4gci5sZW5ndGg+MD9yOm51bGx9LHhlLm1hdGNoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubWF0Y2godCl9CnhlLnByaW50bG49ZnVuY3Rpb24oKXtFLmxvZ2dlci5wcmludGxuLmFwcGx5KEUubG9nZ2VyLGFyZ3VtZW50cyl9LHhlLnByaW50PWZ1bmN0aW9uKCl7RS5sb2dnZXIucHJpbnQuYXBwbHkoRS5sb2dnZXIsYXJndW1lbnRzKX0seGUuc3RyPWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goZVtuXS50b1N0cmluZygpKyIiKQpyZXR1cm4gdH1yZXR1cm4gZS50b1N0cmluZygpKyIifSx4ZS5wYXJzZUJvb2xlYW49ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCgkKGVbbl0pKQpyZXR1cm4gdH1yZXR1cm4gJChlKX0seGUucGFyc2VCeXRlPWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goMC0oMTI4JmVbbl0pfDEyNyZlW25dKQpyZXR1cm4gdH1yZXR1cm4gMC0oMTI4JmUpfDEyNyZlfSx4ZS5wYXJzZUNoYXI9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBuZXcgQ2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTM1JmUpKQppZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKG5ldyBDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzUmZVtuXSkpKQpyZXR1cm4gdH10aHJvdyJjaGFyKCkgbWF5IHJlY2VpdmUgb25seSBvbmUgYXJndW1lbnQgb2YgdHlwZSBpbnQsIGJ5dGUsIGludFtdLCBvciBieXRlW10uIn0seGUucGFyc2VGbG9hdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKEcoZVtuXSkpCnJldHVybiB0fXJldHVybiBHKGUpfSx4ZS5wYXJzZUludD1mdW5jdGlvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBuPVtdLHI9MDtyPGUubGVuZ3RoO3IrKykic3RyaW5nIiE9dHlwZW9mIGVbcl18fC9eXHMqWytcLV0/XGQrXHMqJC8udGVzdChlW3JdKT9uLnB1c2goVihlW3JdLHQpKTpuLnB1c2goMCkKcmV0dXJuIG59cmV0dXJuIFYoZSx0KX0seGUuX19pbnRfY2FzdD1mdW5jdGlvbihlKXtyZXR1cm4gMHxlfSx4ZS5fX2luc3RhbmNlb2Y9ZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyJGdW5jdGlvbiBpcyBleHBlY3RlZCBhcyB0eXBlIGFyZ3VtZW50IGZvciBpbnN0YW5jZW9mIG9wZXJhdG9yIgppZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIHQ9PT1PYmplY3R8fHQ9PT1TdHJpbmcKaWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuITAKaWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4hMQp2YXIgbj1lLmNvbnN0cnVjdG9yCmlmKHQuJGlzSW50ZXJmYWNlKXtmb3IodmFyIHI9W107bjspbi4kaW50ZXJmYWNlcyYmKHI9ci5jb25jYXQobi4kaW50ZXJmYWNlcykpLG49bi4kYmFzZQpmb3IoO3IubGVuZ3RoPjA7KXt2YXIgaT1yLnNoaWZ0KCkKaWYoaT09PXQpcmV0dXJuITAKaS4kaW50ZXJmYWNlcyYmKHI9ci5jb25jYXQoaS4kaW50ZXJmYWNlcykpfXJldHVybiExfWZvcig7bi5oYXNPd25Qcm9wZXJ0eSgiJGJhc2UiKTspaWYobj1uLiRiYXNlLG49PT10KXJldHVybiEwCnJldHVybiExfSxyci5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihlLHQsbil7Y3QmJnhlLnN0cm9rZSgwKSxhdCYmeGUuZmlsbCgyNTUpCnZhciByPXtmaWxsU3R5bGU6QWUuZmlsbFN0eWxlLHN0cm9rZVN0eWxlOkFlLnN0cm9rZVN0eWxlLGxpbmVDYXA6QWUubGluZUNhcCxsaW5lSm9pbjpBZS5saW5lSm9pbn0KZGUuc3R5bGUubGVuZ3RoPjAmJihkZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgid2lkdGgiKSxkZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0IikpLGRlLndpZHRoPXhlLndpZHRoPWV8fDEwMCxkZS5oZWlnaHQ9eGUuaGVpZ2h0PXR8fDEwMApmb3IodmFyIGkgaW4gcilyLmhhc093blByb3BlcnR5KGkpJiYoQWVbaV09cltpXSkKeGUudGV4dEZvbnQobG4pLHhlLmJhY2tncm91bmQoKSxjbj1NYXRoLm1heCgxZTMsZSp0Ki4wNSkseGUuZXh0ZXJuYWxzLmNvbnRleHQ9QWUKZm9yKHZhciBzPTA7czxjLlNJTkNPU19MRU5HVEg7cysrKWJuW3NdPXhlLnNpbihzKihjLlBJLzE4MCkqLjUpLHduW3NdPXhlLmNvcyhzKihjLlBJLzE4MCkqLjUpfSxpci5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihlLG4scil7QWU9PT10JiYoQWU9ZGUuZ2V0Q29udGV4dCgiMmQiKSxydD1uZXcgdXIsaXQ9bmV3IHVyLHR0PW5ldyBscixudD1uZXcgbHIpLHJyLnByb3RvdHlwZS5zaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sc3IucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt2YXIgZT0hMQpyZXR1cm4gZnVuY3Rpb24odCxuLHIpe2Z1bmN0aW9uIGkoZSl7Zm9yKHZhciB0LG49WyJleHBlcmltZW50YWwtd2ViZ2wiLCJ3ZWJnbCIsIndlYmtpdC0zZCJdLHI9MCxpPW4ubGVuZ3RoO3I8aSYmISh0PWUuZ2V0Q29udGV4dChuW3JdLHthbnRpYWxpYXM6ITEscHJlc2VydmVEcmF3aW5nQnVmZmVyOiEwfSkpO3IrKyk7cmV0dXJuIHR9aWYoZSl0aHJvdyJNdWx0aXBsZSBjYWxscyB0byBzaXplKCkgZm9yIDNEIHJlbmRlcnMgYXJlIG5vdCBhbGxvd2VkLiIKZT0hMAp0cnl7ZGUud2lkdGg9eGUud2lkdGg9dHx8MTAwLGRlLmhlaWdodD14ZS5oZWlnaHQ9bnx8MTAwLEFlPWkoZGUpLFhlPUFlLmNyZWF0ZVRleHR1cmUoKSxZZT1BZS5jcmVhdGVUZXh0dXJlKCl9Y2F0Y2goZSl7RS5kZWJ1ZyhlKX1pZighQWUpdGhyb3ciV2ViR0wgY29udGV4dCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci4iCkFlLnZpZXdwb3J0KDAsMCxkZS53aWR0aCxkZS5oZWlnaHQpLEFlLmVuYWJsZShBZS5ERVBUSF9URVNUKSxBZS5lbmFibGUoQWUuQkxFTkQpLEFlLmJsZW5kRnVuYyhBZS5TUkNfQUxQSEEsQWUuT05FX01JTlVTX1NSQ19BTFBIQSksTGU9UW4oQWUsam4sS24pLEllPVFuKEFlLFhuLFluKSx4ZS5zdHJva2VXZWlnaHQoMSksUmU9UW4oQWUsWm4scW4pLEFlLnVzZVByb2dyYW0oUmUpLE0oInVzaW5nVGV4dHVyZTNkIixSZSwidXNpbmdUZXh0dXJlIixRdCkseGUubGlnaHRGYWxsb2ZmKDEsMCwwKSx4ZS5zaGluaW5lc3MoMSkseGUuYW1iaWVudCgyNTUsMjU1LDI1NSkseGUuc3BlY3VsYXIoMCwwLDApLHhlLmVtaXNzaXZlKDAsMCwwKSxEZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixEZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsR24sQWUuU1RBVElDX0RSQVcpLE9lPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLE9lKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUix6bixBZS5TVEFUSUNfRFJBVyksTmU9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsTmUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLFZuLEFlLlNUQVRJQ19EUkFXKSxGZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixGZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsVW4sQWUuU1RBVElDX0RSQVcpLGtlPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLGtlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixIbixBZS5TVEFUSUNfRFJBVyksQmU9QWUuY3JlYXRlQnVmZmVyKCksJGU9QWUuY3JlYXRlQnVmZmVyKCksR2U9QWUuY3JlYXRlQnVmZmVyKCksVmU9QWUuY3JlYXRlQnVmZmVyKCksemU9QWUuY3JlYXRlQnVmZmVyKCksSGU9QWUuY3JlYXRlQnVmZmVyKCksVWU9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsVWUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKFswLDAsMF0pLEFlLlNUQVRJQ19EUkFXKSxqZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixqZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsLTEsMF0pLEFlLlNUQVRJQ19EUkFXKSxLZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixLZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoWzAsMCwxLDAsMSwxLDAsMV0pLEFlLlNUQVRJQ19EUkFXKSxXZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLFdlKSxBZS5idWZmZXJEYXRhKEFlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLG5ldyB2KFswLDEsMiwyLDMsMF0pLEFlLlNUQVRJQ19EUkFXKSxKZT1uZXcgaHIsZXQ9bmV3IGhyLHR0PW5ldyBocixudD1uZXcgaHIsb3Q9bmV3IGhyLHhlLmNhbWVyYSgpLHhlLnBlcnNwZWN0aXZlKCkscnQ9bmV3IHVyLGl0PW5ldyB1cixTZT1uZXcgaHIsUGU9bmV3IGhyLENlPW5ldyBocixNZT1uZXcgaHIsVGU9bmV3IGhyLF9lPW5ldyBocixfZS5zZXQoLTEsMywtMywxLDMsLTYsMywwLC0zLDMsMCwwLDEsMCwwLDApLHJyLnByb3RvdHlwZS5zaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksaXIucHJvdG90eXBlLmFtYmllbnRMaWdodD1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5hbWJpZW50TGlnaHQ9ZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKGduPT09Yy5NQVhfTElHSFRTKXRocm93ImNhbiBvbmx5IGNyZWF0ZSAiK2MuTUFYX0xJR0hUUysiIGxpZ2h0cyIKdmFyIG89bmV3IFBWZWN0b3IocixpLHMpLGE9bmV3IGhyCmEuc2NhbGUoMSwtMSwxKSxhLmFwcGx5KHR0LmFycmF5KCkpLGEubXVsdChvLG8pCnZhciBsPUwoZSx0LG4sMCksaD1bKChsJmMuUkVEX01BU0spPj4+MTYpLzI1NSwoKGwmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSwobCZjLkJMVUVfTUFTSykvMjU1XQpBZS51c2VQcm9ncmFtKFJlKSxDKCJ1TGlnaHRzLmNvbG9yLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuY29sb3IiLGgpLEMoInVMaWdodHMucG9zaXRpb24uM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5wb3NpdGlvbiIsby5hcnJheSgpKSxNKCJ1TGlnaHRzLnR5cGUuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi50eXBlIiwwKSxNKCJ1TGlnaHRDb3VudDNkIixSZSwidUxpZ2h0Q291bnQiLCsrZ24pfSxpci5wcm90b3R5cGUuZGlyZWN0aW9uYWxMaWdodD1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5kaXJlY3Rpb25hbExpZ2h0PWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZihnbj09PWMuTUFYX0xJR0hUUyl0aHJvdyJjYW4gb25seSBjcmVhdGUgIitjLk1BWF9MSUdIVFMrIiBsaWdodHMiCkFlLnVzZVByb2dyYW0oUmUpCnZhciBvPW5ldyBocgpvLnNjYWxlKDEsLTEsMSksby5hcHBseSh0dC5hcnJheSgpKSxvPW8uYXJyYXkoKQp2YXIgYT1bb1swXSpyK29bNF0qaStvWzhdKnMsb1sxXSpyK29bNV0qaStvWzldKnMsb1syXSpyK29bNl0qaStvWzEwXSpzXSxsPUwoZSx0LG4sMCksaD1bKChsJmMuUkVEX01BU0spPj4+MTYpLzI1NSwoKGwmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSwobCZjLkJMVUVfTUFTSykvMjU1XQpDKCJ1TGlnaHRzLmNvbG9yLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuY29sb3IiLGgpLEMoInVMaWdodHMucG9zaXRpb24uM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5wb3NpdGlvbiIsYSksTSgidUxpZ2h0cy50eXBlLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIudHlwZSIsMSksTSgidUxpZ2h0Q291bnQzZCIsUmUsInVMaWdodENvdW50IiwrK2duKX0saXIucHJvdG90eXBlLmxpZ2h0RmFsbG9mZj1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5saWdodEZhbGxvZmY9ZnVuY3Rpb24oZSx0LG4pe0FlLnVzZVByb2dyYW0oUmUpLEMoInVGYWxsb2ZmM2QiLFJlLCJ1RmFsbG9mZiIsW2UsdCxuXSl9LGlyLnByb3RvdHlwZS5saWdodFNwZWN1bGFyPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmxpZ2h0U3BlY3VsYXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPUwoZSx0LG4sMCksaT1bKChyJmMuUkVEX01BU0spPj4+MTYpLzI1NSwoKHImYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSwociZjLkJMVUVfTUFTSykvMjU1XQpBZS51c2VQcm9ncmFtKFJlKSxDKCJ1U3BlY3VsYXIzZCIsUmUsInVTcGVjdWxhciIsaSl9LHhlLmxpZ2h0cz1mdW5jdGlvbigpe3hlLmFtYmllbnRMaWdodCgxMjgsMTI4LDEyOCkseGUuZGlyZWN0aW9uYWxMaWdodCgxMjgsMTI4LDEyOCwwLDAsLTEpLHhlLmxpZ2h0RmFsbG9mZigxLDAsMCkseGUubGlnaHRTcGVjdWxhcigwLDAsMCl9LGlyLnByb3RvdHlwZS5wb2ludExpZ2h0PXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLnBvaW50TGlnaHQ9ZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKGduPT09Yy5NQVhfTElHSFRTKXRocm93ImNhbiBvbmx5IGNyZWF0ZSAiK2MuTUFYX0xJR0hUUysiIGxpZ2h0cyIKdmFyIG89bmV3IFBWZWN0b3IocixpLHMpLGE9bmV3IGhyCmEuc2NhbGUoMSwtMSwxKSxhLmFwcGx5KHR0LmFycmF5KCkpLGEubXVsdChvLG8pCnZhciBsPUwoZSx0LG4sMCksaD1bKChsJmMuUkVEX01BU0spPj4+MTYpLzI1NSwoKGwmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSwobCZjLkJMVUVfTUFTSykvMjU1XQpBZS51c2VQcm9ncmFtKFJlKSxDKCJ1TGlnaHRzLmNvbG9yLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuY29sb3IiLGgpLEMoInVMaWdodHMucG9zaXRpb24uM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5wb3NpdGlvbiIsby5hcnJheSgpKSxNKCJ1TGlnaHRzLnR5cGUuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi50eXBlIiwyKSxNKCJ1TGlnaHRDb3VudDNkIixSZSwidUxpZ2h0Q291bnQiLCsrZ24pfSxpci5wcm90b3R5cGUubm9MaWdodHM9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUubm9MaWdodHM9ZnVuY3Rpb24oKXtnbj0wLEFlLnVzZVByb2dyYW0oUmUpLE0oInVMaWdodENvdW50M2QiLFJlLCJ1TGlnaHRDb3VudCIsZ24pfSxpci5wcm90b3R5cGUuc3BvdExpZ2h0PXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLnNwb3RMaWdodD1mdW5jdGlvbihlLHQsbixyLGkscyxvLGEsbCxoLHUpe2lmKGduPT09Yy5NQVhfTElHSFRTKXRocm93ImNhbiBvbmx5IGNyZWF0ZSAiK2MuTUFYX0xJR0hUUysiIGxpZ2h0cyIKQWUudXNlUHJvZ3JhbShSZSkKdmFyIGY9bmV3IFBWZWN0b3IocixpLHMpLHA9bmV3IGhyCnAuc2NhbGUoMSwtMSwxKSxwLmFwcGx5KHR0LmFycmF5KCkpLHAubXVsdChmLGYpLHA9cC5hcnJheSgpCnZhciBtPVtwWzBdKm8rcFs0XSphK3BbOF0qbCxwWzFdKm8rcFs1XSphK3BbOV0qbCxwWzJdKm8rcFs2XSphK3BbMTBdKmxdLGc9TChlLHQsbiwwKSxkPVsoKGcmYy5SRURfTUFTSyk+Pj4xNikvMjU1LCgoZyZjLkdSRUVOX01BU0spPj4+OCkvMjU1LChnJmMuQkxVRV9NQVNLKS8yNTVdCkMoInVMaWdodHMuY29sb3IuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5jb2xvciIsZCksQygidUxpZ2h0cy5wb3NpdGlvbi4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnBvc2l0aW9uIixmLmFycmF5KCkpLEMoInVMaWdodHMuZGlyZWN0aW9uLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuZGlyZWN0aW9uIixtKSxDKCJ1TGlnaHRzLmNvbmNlbnRyYXRpb24uM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5jb25jZW50cmF0aW9uIix1KSxDKCJ1TGlnaHRzLmFuZ2xlLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuYW5nbGUiLGgpLE0oInVMaWdodHMudHlwZS4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnR5cGUiLDMpLE0oInVMaWdodENvdW50M2QiLFJlLCJ1TGlnaHRDb3VudCIsKytnbil9LGlyLnByb3RvdHlwZS5iZWdpbkNhbWVyYT1mdW5jdGlvbigpe3Rocm93ImJlZ2luQ2FtZXJhKCkgaXMgbm90IGF2YWlsYWJsZSBpbiAyRCBtb2RlIn0sc3IucHJvdG90eXBlLmJlZ2luQ2FtZXJhPWZ1bmN0aW9uKCl7aWYoRW4pdGhyb3ciWW91IGNhbm5vdCBjYWxsIGJlZ2luQ2FtZXJhKCkgYWdhaW4gYmVmb3JlIGNhbGxpbmcgZW5kQ2FtZXJhKCkiCkVuPSEwLHR0PWV0LG50PUplfSxpci5wcm90b3R5cGUuZW5kQ2FtZXJhPWZ1bmN0aW9uKCl7dGhyb3ciZW5kQ2FtZXJhKCkgaXMgbm90IGF2YWlsYWJsZSBpbiAyRCBtb2RlIn0sc3IucHJvdG90eXBlLmVuZENhbWVyYT1mdW5jdGlvbigpe2lmKCFFbil0aHJvdyJZb3UgY2Fubm90IGNhbGwgZW5kQ2FtZXJhKCkgYmVmb3JlIGNhbGxpbmcgYmVnaW5DYW1lcmEoKSIKdHQuc2V0KEplKSxudC5zZXQoZXQpLEVuPSExfSx4ZS5jYW1lcmE9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsLGgpe2U9PT10JiYoQ249eGUud2lkdGgvMixNbj14ZS5oZWlnaHQvMixUbj1Nbi9NYXRoLnRhbihQbi8yKSxlPUNuLG49TW4scj1UbixpPUNuLHM9TW4sbz0wLGE9MCxsPTEsaD0wKQp2YXIgdT1uZXcgUFZlY3RvcihlLWksbi1zLHItbyksYz1uZXcgUFZlY3RvcihhLGwsaCkKdS5ub3JtYWxpemUoKQp2YXIgZj1QVmVjdG9yLmNyb3NzKGMsdSkKYz1QVmVjdG9yLmNyb3NzKHUsZiksZi5ub3JtYWxpemUoKSxjLm5vcm1hbGl6ZSgpCnZhciBwPWYueCxtPWYueSxnPWYueixkPWMueCx2PWMueSx5PWMueix4PXUueCxBPXUueSxiPXUuegpKZS5zZXQocCxtLGcsMCxkLHYseSwwLHgsQSxiLDAsMCwwLDAsMSksSmUudHJhbnNsYXRlKC1lLC1uLC1yKSxldC5yZXNldCgpLGV0LmludkFwcGx5KHAsbSxnLDAsZCx2LHksMCx4LEEsYiwwLDAsMCwwLDEpLGV0LnRyYW5zbGF0ZShlLG4sciksdHQuc2V0KEplKSxudC5zZXQoZXQpfSx4ZS5wZXJzcGVjdGl2ZT1mdW5jdGlvbihlLHQsbixyKXswPT09YXJndW1lbnRzLmxlbmd0aCYmKE1uPWRlLmhlaWdodC8yLFRuPU1uL01hdGgudGFuKFBuLzIpLF9uPVRuLzEwLFJuPTEwKlRuLExuPXhlLndpZHRoL3hlLmhlaWdodCxlPVBuLHQ9TG4sbj1fbixyPVJuKQp2YXIgaSxzLG8sYQppPW4qTWF0aC50YW4oZS8yKSxzPS1pLG89aSp0LGE9cyp0LHhlLmZydXN0dW0oYSxvLHMsaSxuLHIpfSxpci5wcm90b3R5cGUuZnJ1c3R1bT1mdW5jdGlvbigpe3Rocm93IlByb2Nlc3NpbmcuanM6IGZydXN0dW0oKSBpcyBub3Qgc3VwcG9ydGVkIGluIDJEIG1vZGUifSxzci5wcm90b3R5cGUuZnJ1c3R1bT1mdW5jdGlvbihlLHQsbixyLGkscyl7U249ITAsb3Q9bmV3IGhyLG90LnNldCgyKmkvKHQtZSksMCwodCtlKS8odC1lKSwwLDAsMippLyhyLW4pLChyK24pLyhyLW4pLDAsMCwwLC0ocytpKS8ocy1pKSwtKDIqcyppKS8ocy1pKSwwLDAsLTEsMCkKdmFyIG89bmV3IGhyCm8uc2V0KG90KSxvLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oTGUpLFQoInByb2plY3Rpb24yZCIsTGUsInVQcm9qZWN0aW9uIiwhMSxvLmFycmF5KCkpLEFlLnVzZVByb2dyYW0oUmUpLFQoInByb2plY3Rpb24zZCIsUmUsInVQcm9qZWN0aW9uIiwhMSxvLmFycmF5KCkpLEFlLnVzZVByb2dyYW0oSWUpLFQoInVQcm9qZWN0aW9uVVMiLEllLCJ1UHJvamVjdGlvbiIsITEsby5hcnJheSgpKX0seGUub3J0aG89ZnVuY3Rpb24oZSx0LG4scixpLHMpezA9PT1hcmd1bWVudHMubGVuZ3RoJiYoZT0wLHQ9eGUud2lkdGgsbj0wLHI9eGUuaGVpZ2h0LGk9LTEwLHM9MTApCnZhciBvPTIvKHQtZSksYT0yLyhyLW4pLGw9LTIvKHMtaSksaD0tKHQrZSkvKHQtZSksdT0tKHIrbikvKHItbiksYz0tKHMraSkvKHMtaSkKb3Q9bmV3IGhyLG90LnNldChvLDAsMCxoLDAsYSwwLHUsMCwwLGwsYywwLDAsMCwxKQp2YXIgZj1uZXcgaHIKZi5zZXQob3QpLGYudHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShMZSksVCgicHJvamVjdGlvbjJkIixMZSwidVByb2plY3Rpb24iLCExLGYuYXJyYXkoKSksQWUudXNlUHJvZ3JhbShSZSksVCgicHJvamVjdGlvbjNkIixSZSwidVByb2plY3Rpb24iLCExLGYuYXJyYXkoKSksQWUudXNlUHJvZ3JhbShJZSksVCgidVByb2plY3Rpb25VUyIsSWUsInVQcm9qZWN0aW9uIiwhMSxmLmFycmF5KCkpLFNuPSExfSx4ZS5wcmludFByb2plY3Rpb249ZnVuY3Rpb24oKXtvdC5wcmludCgpfSx4ZS5wcmludENhbWVyYT1mdW5jdGlvbigpe0plLnByaW50KCl9LGlyLnByb3RvdHlwZS5ib3g9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuYm94PWZ1bmN0aW9uKGUsdCxuKXt0JiZufHwodD1uPWUpCnZhciByPW5ldyBocgpyLnNjYWxlKGUsdCxuKQp2YXIgaT1uZXcgaHIKaWYoaS5zY2FsZSgxLC0xLDEpLGkuYXBwbHkodHQuYXJyYXkoKSksaS50cmFuc3Bvc2UoKSxhdCl7aWYoQWUudXNlUHJvZ3JhbShSZSksVCgibW9kZWwzZCIsUmUsInVNb2RlbCIsITEsci5hcnJheSgpKSxUKCJ2aWV3M2QiLFJlLCJ1VmlldyIsITEsaS5hcnJheSgpKSxBZS5lbmFibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCksQWUucG9seWdvbk9mZnNldCgxLDEpLEMoImNvbG9yM2QiLFJlLCJ1Q29sb3IiLGx0KSxnbj4wKXt2YXIgcz1uZXcgaHIKcy5zZXQoaSkKdmFyIG89bmV3IGhyCm8uc2V0KHIpLHMubXVsdChvKQp2YXIgYT1uZXcgaHIKYS5zZXQocyksYS5pbnZlcnQoKSxhLnRyYW5zcG9zZSgpLFQoInVOb3JtYWxUcmFuc2Zvcm0zZCIsUmUsInVOb3JtYWxUcmFuc2Zvcm0iLCExLGEuYXJyYXkoKSksXygiYU5vcm1hbDNkIixSZSwiYU5vcm1hbCIsMyxPZSl9ZWxzZSBSKCJhTm9ybWFsM2QiLFJlLCJhTm9ybWFsIikKXygiYVZlcnRleDNkIixSZSwiYVZlcnRleCIsMyxEZSksUigiYUNvbG9yM2QiLFJlLCJhQ29sb3IiKSxSKCJhVGV4dHVyZTNkIixSZSwiYVRleHR1cmUiKSxBZS5kcmF3QXJyYXlzKEFlLlRSSUFOR0xFUywwLEduLmxlbmd0aC8zKSxBZS5kaXNhYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpfWd0PjAmJmN0JiYoQWUudXNlUHJvZ3JhbShMZSksVCgidU1vZGVsMmQiLExlLCJ1TW9kZWwiLCExLHIuYXJyYXkoKSksVCgidVZpZXcyZCIsTGUsInVWaWV3IiwhMSxpLmFycmF5KCkpLEMoInVDb2xvcjJkIixMZSwidUNvbG9yIixmdCksTSgidUlzRHJhd2luZ1RleHQyZCIsTGUsInVJc0RyYXdpbmdUZXh0IiwhMSksXygidmVydGV4MmQiLExlLCJhVmVydGV4IiwzLE5lKSxSKCJhVGV4dHVyZUNvb3JkMmQiLExlLCJhVGV4dHVyZUNvb3JkIiksQWUuZHJhd0FycmF5cyhBZS5MSU5FUywwLFZuLmxlbmd0aC8zKSl9CnZhciBmcj1mdW5jdGlvbigpe3ZhciBlCmZvcihRZT1bXSxlPTA7ZTx2bjtlKyspUWUucHVzaCgwKSxRZS5wdXNoKC0xKSxRZS5wdXNoKDApLFFlLnB1c2goeW5bZV0pLFFlLnB1c2goeG5bZV0pLFFlLnB1c2goQW5bZV0pClFlLnB1c2goMCksUWUucHVzaCgtMSksUWUucHVzaCgwKSxRZS5wdXNoKHluWzBdKSxRZS5wdXNoKHhuWzBdKSxRZS5wdXNoKEFuWzBdKQp2YXIgdCxuLHIsaT0wCmZvcihlPTI7ZTxkbjtlKyspe3Q9bj1pLGkrPXZuLHI9aQpmb3IodmFyIHM9MDtzPHZuO3MrKylRZS5wdXNoKHluW3RdKSxRZS5wdXNoKHhuW3RdKSxRZS5wdXNoKEFuW3QrK10pLFFlLnB1c2goeW5bcl0pLFFlLnB1c2goeG5bcl0pLFFlLnB1c2goQW5bcisrXSkKdD1uLHI9aSxRZS5wdXNoKHluW3RdKSxRZS5wdXNoKHhuW3RdKSxRZS5wdXNoKEFuW3RdKSxRZS5wdXNoKHluW3JdKSxRZS5wdXNoKHhuW3JdKSxRZS5wdXNoKEFuW3JdKX1mb3IoZT0wO2U8dm47ZSsrKXI9aStlLFFlLnB1c2goeW5bcl0pLFFlLnB1c2goeG5bcl0pLFFlLnB1c2goQW5bcl0pLFFlLnB1c2goMCksUWUucHVzaCgxKSxRZS5wdXNoKDApClFlLnB1c2goeW5baV0pLFFlLnB1c2goeG5baV0pLFFlLnB1c2goQW5baV0pLFFlLnB1c2goMCksUWUucHVzaCgxKSxRZS5wdXNoKDApLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLEJlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhRZSksQWUuU1RBVElDX0RSQVcpfQp4ZS5zcGhlcmVEZXRhaWw9ZnVuY3Rpb24oZSx0KXt2YXIgbgppZigxPT09YXJndW1lbnRzLmxlbmd0aCYmKGU9dD1hcmd1bWVudHNbMF0pLGU8MyYmKGU9MyksdDwyJiYodD0yKSxlIT09dm58fHQhPT1kbil7dmFyIHI9Yy5TSU5DT1NfTEVOR1RIL2UsaT1uZXcgZyhlKSxzPW5ldyBnKGUpCmZvcihuPTA7bjxlO24rKylpW25dPXduW24qciVjLlNJTkNPU19MRU5HVEh8MF0sc1tuXT1ibltuKnIlYy5TSU5DT1NfTEVOR1RIfDBdCnZhciBvPWUqKHQtMSkrMixhPTAKeW49bmV3IGcobykseG49bmV3IGcobyksQW49bmV3IGcobykKdmFyIGw9LjUqYy5TSU5DT1NfTEVOR1RIL3QsaD1sCmZvcihuPTE7bjx0O24rKyl7Zm9yKHZhciB1PWJuW2glYy5TSU5DT1NfTEVOR1RIfDBdLGY9LXduW2glYy5TSU5DT1NfTEVOR1RIfDBdLHA9MDtwPGU7cCsrKXluW2FdPWlbcF0qdSx4blthXT1mLEFuW2ErK109c1twXSp1CmgrPWx9dm49ZSxkbj10LGZyKCl9fSxpci5wcm90b3R5cGUuc3BoZXJlPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLnNwaGVyZT1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50c1swXTsodm48M3x8ZG48MikmJnhlLnNwaGVyZURldGFpbCgzMCkKdmFyIHQ9bmV3IGhyCnQuc2NhbGUoZSxlLGUpCnZhciBuPW5ldyBocgppZihuLnNjYWxlKDEsLTEsMSksbi5hcHBseSh0dC5hcnJheSgpKSxuLnRyYW5zcG9zZSgpLGF0KXtpZihnbj4wKXt2YXIgcj1uZXcgaHIKci5zZXQobikKdmFyIGk9bmV3IGhyCmkuc2V0KHQpLHIubXVsdChpKQp2YXIgcz1uZXcgaHIKcy5zZXQocikscy5pbnZlcnQoKSxzLnRyYW5zcG9zZSgpLFQoInVOb3JtYWxUcmFuc2Zvcm0zZCIsUmUsInVOb3JtYWxUcmFuc2Zvcm0iLCExLHMuYXJyYXkoKSksXygiYU5vcm1hbDNkIixSZSwiYU5vcm1hbCIsMyxCZSl9ZWxzZSBSKCJhTm9ybWFsM2QiLFJlLCJhTm9ybWFsIikKQWUudXNlUHJvZ3JhbShSZSksUigiYVRleHR1cmUzZCIsUmUsImFUZXh0dXJlIiksVCgidU1vZGVsM2QiLFJlLCJ1TW9kZWwiLCExLHQuYXJyYXkoKSksVCgidVZpZXczZCIsUmUsInVWaWV3IiwhMSxuLmFycmF5KCkpLF8oImFWZXJ0ZXgzZCIsUmUsImFWZXJ0ZXgiLDMsQmUpLFIoImFDb2xvcjNkIixSZSwiYUNvbG9yIiksQWUuZW5hYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLEFlLnBvbHlnb25PZmZzZXQoMSwxKSxDKCJ1Q29sb3IzZCIsUmUsInVDb2xvciIsbHQpLEFlLmRyYXdBcnJheXMoQWUuVFJJQU5HTEVfU1RSSVAsMCxRZS5sZW5ndGgvMyksQWUuZGlzYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKX1ndD4wJiZjdCYmKEFlLnVzZVByb2dyYW0oTGUpLFQoInVNb2RlbDJkIixMZSwidU1vZGVsIiwhMSx0LmFycmF5KCkpLFQoInVWaWV3MmQiLExlLCJ1VmlldyIsITEsbi5hcnJheSgpKSxfKCJhVmVydGV4MmQiLExlLCJhVmVydGV4IiwzLEJlKSxSKCJhVGV4dHVyZUNvb3JkMmQiLExlLCJhVGV4dHVyZUNvb3JkIiksQygidUNvbG9yMmQiLExlLCJ1Q29sb3IiLGZ0KSxNKCJ1SXNEcmF3aW5nVGV4dCIsTGUsInVJc0RyYXdpbmdUZXh0IiwhMSksQWUuZHJhd0FycmF5cyhBZS5MSU5FX1NUUklQLDAsUWUubGVuZ3RoLzMpKX0seGUubW9kZWxYPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10dC5hcnJheSgpLGk9ZXQuYXJyYXkoKSxzPXJbMF0qZStyWzFdKnQrclsyXSpuK3JbM10sbz1yWzRdKmUrcls1XSp0K3JbNl0qbityWzddLGE9cls4XSplK3JbOV0qdCtyWzEwXSpuK3JbMTFdLGw9clsxMl0qZStyWzEzXSp0K3JbMTRdKm4rclsxNV0saD1pWzBdKnMraVsxXSpvK2lbMl0qYStpWzNdKmwsdT1pWzEyXSpzK2lbMTNdKm8raVsxNF0qYStpWzE1XSpsCnJldHVybiAwIT09dT9oL3U6aH0seGUubW9kZWxZPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10dC5hcnJheSgpLGk9ZXQuYXJyYXkoKSxzPXJbMF0qZStyWzFdKnQrclsyXSpuK3JbM10sbz1yWzRdKmUrcls1XSp0K3JbNl0qbityWzddLGE9cls4XSplK3JbOV0qdCtyWzEwXSpuK3JbMTFdLGw9clsxMl0qZStyWzEzXSp0K3JbMTRdKm4rclsxNV0saD1pWzRdKnMraVs1XSpvK2lbNl0qYStpWzddKmwsdT1pWzEyXSpzK2lbMTNdKm8raVsxNF0qYStpWzE1XSpsCnJldHVybiAwIT09dT9oL3U6aH0seGUubW9kZWxaPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10dC5hcnJheSgpLGk9ZXQuYXJyYXkoKSxzPXJbMF0qZStyWzFdKnQrclsyXSpuK3JbM10sbz1yWzRdKmUrcls1XSp0K3JbNl0qbityWzddLGE9cls4XSplK3JbOV0qdCtyWzEwXSpuK3JbMTFdLGw9clsxMl0qZStyWzEzXSp0K3JbMTRdKm4rclsxNV0saD1pWzhdKnMraVs5XSpvK2lbMTBdKmEraVsxMV0qbCx1PWlbMTJdKnMraVsxM10qbytpWzE0XSphK2lbMTVdKmwKcmV0dXJuIDAhPT11P2gvdTpofSxpci5wcm90b3R5cGUuYW1iaWVudD1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5hbWJpZW50PWZ1bmN0aW9uKGUsdCxuKXtBZS51c2VQcm9ncmFtKFJlKSxNKCJ1VXNpbmdNYXQzZCIsUmUsInVVc2luZ01hdCIsITApCnZhciByPXhlLmNvbG9yKGUsdCxuKQpDKCJ1TWF0ZXJpYWxBbWJpZW50M2QiLFJlLCJ1TWF0ZXJpYWxBbWJpZW50Iix4ZS5jb2xvci50b0dMQXJyYXkocikuc2xpY2UoMCwzKSl9LGlyLnByb3RvdHlwZS5lbWlzc2l2ZT1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5lbWlzc2l2ZT1mdW5jdGlvbihlLHQsbil7QWUudXNlUHJvZ3JhbShSZSksTSgidVVzaW5nTWF0M2QiLFJlLCJ1VXNpbmdNYXQiLCEwKQp2YXIgcj14ZS5jb2xvcihlLHQsbikKQygidU1hdGVyaWFsRW1pc3NpdmUzZCIsUmUsInVNYXRlcmlhbEVtaXNzaXZlIix4ZS5jb2xvci50b0dMQXJyYXkocikuc2xpY2UoMCwzKSl9LGlyLnByb3RvdHlwZS5zaGluaW5lc3M9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuc2hpbmluZXNzPWZ1bmN0aW9uKGUpe0FlLnVzZVByb2dyYW0oUmUpLE0oInVVc2luZ01hdDNkIixSZSwidVVzaW5nTWF0IiwhMCksQygidVNoaW5pbmVzczNkIixSZSwidVNoaW5pbmVzcyIsZSl9LGlyLnByb3RvdHlwZS5zcGVjdWxhcj1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5zcGVjdWxhcj1mdW5jdGlvbihlLHQsbil7QWUudXNlUHJvZ3JhbShSZSksTSgidVVzaW5nTWF0M2QiLFJlLCJ1VXNpbmdNYXQiLCEwKQp2YXIgcj14ZS5jb2xvcihlLHQsbikKQygidU1hdGVyaWFsU3BlY3VsYXIzZCIsUmUsInVNYXRlcmlhbFNwZWN1bGFyIix4ZS5jb2xvci50b0dMQXJyYXkocikuc2xpY2UoMCwzKSl9LHhlLnNjcmVlblg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXR0LmFycmF5KCkKaWYoMTY9PT1yLmxlbmd0aCl7dmFyIGk9clswXSplK3JbMV0qdCtyWzJdKm4rclszXSxzPXJbNF0qZStyWzVdKnQrcls2XSpuK3JbN10sbz1yWzhdKmUrcls5XSp0K3JbMTBdKm4rclsxMV0sYT1yWzEyXSplK3JbMTNdKnQrclsxNF0qbityWzE1XSxsPW90LmFycmF5KCksaD1sWzBdKmkrbFsxXSpzK2xbMl0qbytsWzNdKmEsdT1sWzEyXSppK2xbMTNdKnMrbFsxNF0qbytsWzE1XSphCnJldHVybiAwIT09dSYmKGgvPXUpLHhlLndpZHRoKigxK2gpLzJ9cmV0dXJuIHR0Lm11bHRYKGUsdCl9LHhlLnNjcmVlblk9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXR0LmFycmF5KCkKaWYoMTY9PT1yLmxlbmd0aCl7dmFyIGk9clswXSplK3JbMV0qdCtyWzJdKm4rclszXSxzPXJbNF0qZStyWzVdKnQrcls2XSpuK3JbN10sbz1yWzhdKmUrcls5XSp0K3JbMTBdKm4rclsxMV0sYT1yWzEyXSplK3JbMTNdKnQrclsxNF0qbityWzE1XSxsPW90LmFycmF5KCksaD1sWzRdKmkrbFs1XSpzK2xbNl0qbytsWzddKmEsdT1sWzEyXSppK2xbMTNdKnMrbFsxNF0qbytsWzE1XSphCnJldHVybiAwIT09dSYmKGgvPXUpLHhlLmhlaWdodCooMStoKS8yfXJldHVybiB0dC5tdWx0WShlLHQpfSx4ZS5zY3JlZW5aPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10dC5hcnJheSgpCmlmKDE2IT09ci5sZW5ndGgpcmV0dXJuIDAKdmFyIGk9b3QuYXJyYXkoKSxzPXJbMF0qZStyWzFdKnQrclsyXSpuK3JbM10sbz1yWzRdKmUrcls1XSp0K3JbNl0qbityWzddLGE9cls4XSplK3JbOV0qdCtyWzEwXSpuK3JbMTFdLGw9clsxMl0qZStyWzEzXSp0K3JbMTRdKm4rclsxNV0saD1pWzhdKnMraVs5XSpvK2lbMTBdKmEraVsxMV0qbCx1PWlbMTJdKnMraVsxM10qbytpWzE0XSphK2lbMTVdKmwKcmV0dXJuIDAhPT11JiYoaC89dSksKGgrMSkvMn0scnIucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oKXt2YXIgZT14ZS5jb2xvci5hcHBseSh0aGlzLGFyZ3VtZW50cykKZT09PWh0JiZhdHx8KGF0PSEwLGh0PWUpfSxpci5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbigpe3JyLnByb3RvdHlwZS5maWxsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1dD0hMH0sc3IucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oKXtyci5wcm90b3R5cGUuZmlsbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbHQ9eGUuY29sb3IudG9HTEFycmF5KGh0KX0seGUubm9GaWxsPWZ1bmN0aW9uKCl7YXQ9ITF9LHJyLnByb3RvdHlwZS5zdHJva2U9ZnVuY3Rpb24oKXt2YXIgZT14ZS5jb2xvci5hcHBseSh0aGlzLGFyZ3VtZW50cykKZT09PXB0JiZjdHx8KGN0PSEwLHB0PWUpfSxpci5wcm90b3R5cGUuc3Ryb2tlPWZ1bmN0aW9uKCl7cnIucHJvdG90eXBlLnN0cm9rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbXQ9ITB9LHNyLnByb3RvdHlwZS5zdHJva2U9ZnVuY3Rpb24oKXtyci5wcm90b3R5cGUuc3Ryb2tlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxmdD14ZS5jb2xvci50b0dMQXJyYXkocHQpfSx4ZS5ub1N0cm9rZT1mdW5jdGlvbigpe2N0PSExfSxyci5wcm90b3R5cGUuc3Ryb2tlV2VpZ2h0PWZ1bmN0aW9uKGUpe2d0PWV9LGlyLnByb3RvdHlwZS5zdHJva2VXZWlnaHQ9ZnVuY3Rpb24oZSl7cnIucHJvdG90eXBlLnN0cm9rZVdlaWdodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksQWUubGluZVdpZHRoPWV9LHNyLnByb3RvdHlwZS5zdHJva2VXZWlnaHQ9ZnVuY3Rpb24oZSl7cnIucHJvdG90eXBlLnN0cm9rZVdlaWdodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksQWUudXNlUHJvZ3JhbShMZSksQygicG9pbnRTaXplMmQiLExlLCJ1UG9pbnRTaXplIixlKSxBZS51c2VQcm9ncmFtKEllKSxDKCJwb2ludFNpemVVbmxpdFNoYXBlIixJZSwidVBvaW50U2l6ZSIsZSksQWUubGluZVdpZHRoKGUpfSx4ZS5zdHJva2VDYXA9ZnVuY3Rpb24oZSl7d2UuJGVuc3VyZUNvbnRleHQoKS5saW5lQ2FwPWV9LHhlLnN0cm9rZUpvaW49ZnVuY3Rpb24oZSl7d2UuJGVuc3VyZUNvbnRleHQoKS5saW5lSm9pbj1lfSxpci5wcm90b3R5cGUuc21vb3RoPWZ1bmN0aW9uKCl7dnQ9ITAKdmFyIGU9ZGUuc3R5bGUKZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIiwib3B0aW1pemVRdWFsaXR5IiwiaW1wb3J0YW50IiksZS5zZXRQcm9wZXJ0eSgiLW1zLWludGVycG9sYXRpb24tbW9kZSIsImJpY3ViaWMiLCJpbXBvcnRhbnQiKSxBZS5oYXNPd25Qcm9wZXJ0eSgibW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkIikmJihBZS5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQ9ITApfSxzci5wcm90b3R5cGUuc21vb3RoPWZ1bmN0aW9uKCl7dnQ9ITB9LGlyLnByb3RvdHlwZS5ub1Ntb290aD1mdW5jdGlvbigpe3Z0PSExCnZhciBlPWRlLnN0eWxlCmUuc2V0UHJvcGVydHkoImltYWdlLXJlbmRlcmluZyIsIm9wdGltaXplU3BlZWQiLCJpbXBvcnRhbnQiKSxlLnNldFByb3BlcnR5KCJpbWFnZS1yZW5kZXJpbmciLCItbW96LWNyaXNwLWVkZ2VzIiwiaW1wb3J0YW50IiksZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIiwiLXdlYmtpdC1vcHRpbWl6ZS1jb250cmFzdCIsImltcG9ydGFudCIpLGUuc2V0UHJvcGVydHkoImltYWdlLXJlbmRlcmluZyIsIm9wdGltaXplLWNvbnRyYXN0IiwiaW1wb3J0YW50IiksZS5zZXRQcm9wZXJ0eSgiLW1zLWludGVycG9sYXRpb24tbW9kZSIsIm5lYXJlc3QtbmVpZ2hib3IiLCJpbXBvcnRhbnQiKSxBZS5oYXNPd25Qcm9wZXJ0eSgibW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkIikmJihBZS5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQ9ITEpfSxzci5wcm90b3R5cGUubm9TbW9vdGg9ZnVuY3Rpb24oKXt2dD0hMX0saXIucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKGUsdCl7Y3QmJih2dHx8KGU9TWF0aC5yb3VuZChlKSx0PU1hdGgucm91bmQodCkpLEFlLmZpbGxTdHlsZT14ZS5jb2xvci50b1N0cmluZyhwdCksdXQ9ITAsZ3Q+MT8oQWUuYmVnaW5QYXRoKCksQWUuYXJjKGUsdCxndC8yLDAsYy5UV09fUEksITEpLEFlLmZpbGwoKSk6QWUuZmlsbFJlY3QoZSx0LDEsMSkpfSxzci5wcm90b3R5cGUucG9pbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBocgpyLnRyYW5zbGF0ZShlLHQsbnx8MCksci50cmFuc3Bvc2UoKQp2YXIgaT1uZXcgaHIKaS5zY2FsZSgxLC0xLDEpLGkuYXBwbHkodHQuYXJyYXkoKSksaS50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKExlKSxUKCJ1TW9kZWwyZCIsTGUsInVNb2RlbCIsITEsci5hcnJheSgpKSxUKCJ1VmlldzJkIixMZSwidVZpZXciLCExLGkuYXJyYXkoKSksZ3Q+MCYmY3QmJihDKCJ1Q29sb3IyZCIsTGUsInVDb2xvciIsZnQpLE0oInVJc0RyYXdpbmdUZXh0MmQiLExlLCJ1SXNEcmF3aW5nVGV4dCIsITEpLE0oInVTbW9vdGgyZCIsTGUsInVTbW9vdGgiLHZ0KSxfKCJhVmVydGV4MmQiLExlLCJhVmVydGV4IiwzLFVlKSxSKCJhVGV4dHVyZUNvb3JkMmQiLExlLCJhVGV4dHVyZUNvb3JkIiksQWUuZHJhd0FycmF5cyhBZS5QT0lOVFMsMCwxKSl9LHhlLmJlZ2luU2hhcGU9ZnVuY3Rpb24oZSl7UnQ9ZSxMdD1bXSxJbj1bXX0saXIucHJvdG90eXBlLnZlcnRleD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10Ka24mJihrbj0hMSksci5pc1ZlcnQ9ITAsclswXT1lLHJbMV09dCxyWzJdPTAsclszXT0wLHJbNF09MCxyWzVdPWh0LHJbNl09cHQsSW4ucHVzaChyKSxuJiYoSW5bSW4ubGVuZ3RoLTFdLm1vdmVUbz1uKX0sc3IucHJvdG90eXBlLnZlcnRleD1mdW5jdGlvbihlLG4scixpLHMpe3ZhciBvPVtdCmtuJiYoa249ITEpLG8uaXNWZXJ0PSEwLHM9PT10JiZRdCYmKHM9aSxpPXIscj0wKSxpIT09dCYmcyE9PXQmJihxdD09PWMuSU1BR0UmJihpLz1adC53aWR0aCxzLz1adC5oZWlnaHQpLGk9aT4xPzE6aSxpPWk8MD8wOmkscz1zPjE/MTpzLHM9czwwPzA6cyksb1swXT1lLG9bMV09bixvWzJdPXJ8fDAsb1szXT1pfHwwLG9bNF09c3x8MCxvWzVdPWx0WzBdLG9bNl09bHRbMV0sb1s3XT1sdFsyXSxvWzhdPWx0WzNdLG9bOV09ZnRbMF0sb1sxMF09ZnRbMV0sb1sxMV09ZnRbMl0sb1sxMl09ZnRbM10sb1sxM109d3Qsb1sxNF09RXQsb1sxNV09U3QsSW4ucHVzaChvKX0KdmFyIHByPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGhyCm4uc2NhbGUoMSwtMSwxKSxuLmFwcGx5KHR0LmFycmF5KCkpLG4udHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShJZSksVCgidVZpZXdVUyIsSWUsInVWaWV3IiwhMSxuLmFycmF5KCkpLE0oInVTbW9vdGhVUyIsSWUsInVTbW9vdGgiLHZ0KSxfKCJhVmVydGV4VVMiLEllLCJhVmVydGV4IiwzLFVlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhlKSxBZS5TVFJFQU1fRFJBVyksXygiYUNvbG9yVVMiLEllLCJhQ29sb3IiLDQsVmUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKHQpLEFlLlNUUkVBTV9EUkFXKSxBZS5kcmF3QXJyYXlzKEFlLlBPSU5UUywwLGUubGVuZ3RoLzMpfSxtcj1mdW5jdGlvbihlLHQsbil7dmFyIHIKcj0iTElORVMiPT09dD9BZS5MSU5FUzoiTElORV9MT09QIj09PXQ/QWUuTElORV9MT09QOkFlLkxJTkVfU1RSSVAKdmFyIGk9bmV3IGhyCmkuc2NhbGUoMSwtMSwxKSxpLmFwcGx5KHR0LmFycmF5KCkpLGkudHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShJZSksVCgidVZpZXdVUyIsSWUsInVWaWV3IiwhMSxpLmFycmF5KCkpLF8oImFWZXJ0ZXhVUyIsSWUsImFWZXJ0ZXgiLDMsJGUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKGUpLEFlLlNUUkVBTV9EUkFXKSxfKCJhQ29sb3JVUyIsSWUsImFDb2xvciIsNCx6ZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcobiksQWUuU1RSRUFNX0RSQVcpLEFlLmRyYXdBcnJheXMociwwLGUubGVuZ3RoLzMpfSxncj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaQppPSJUUklBTkdMRVMiPT09dD9BZS5UUklBTkdMRVM6IlRSSUFOR0xFX0ZBTiI9PT10P0FlLlRSSUFOR0xFX0ZBTjpBZS5UUklBTkdMRV9TVFJJUAp2YXIgcz1uZXcgaHIKcy5zY2FsZSgxLC0xLDEpLHMuYXBwbHkodHQuYXJyYXkoKSkscy50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKFJlKSxUKCJtb2RlbDNkIixSZSwidU1vZGVsIiwhMSxbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0pLFQoInZpZXczZCIsUmUsInVWaWV3IiwhMSxzLmFycmF5KCkpLEFlLmVuYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKSxBZS5wb2x5Z29uT2Zmc2V0KDEsMSksQygiY29sb3IzZCIsUmUsInVDb2xvciIsWy0xLDAsMCwwXSksXygidmVydGV4M2QiLFJlLCJhVmVydGV4IiwzLEdlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhlKSxBZS5TVFJFQU1fRFJBVyksUXQmJm51bGwhPT1IdCYmWHQobiksXygiYUNvbG9yM2QiLFJlLCJhQ29sb3IiLDQsVmUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKG4pLEFlLlNUUkVBTV9EUkFXKSxSKCJhTm9ybWFsM2QiLFJlLCJhTm9ybWFsIiksUXQmJihNKCJ1VXNpbmdUZXh0dXJlM2QiLFJlLCJ1VXNpbmdUZXh0dXJlIixRdCksXygiYVRleHR1cmUzZCIsUmUsImFUZXh0dXJlIiwyLEhlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhyKSxBZS5TVFJFQU1fRFJBVykpLEFlLmRyYXdBcnJheXMoaSwwLGUubGVuZ3RoLzMpLEFlLmRpc2FibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCl9CmlyLnByb3RvdHlwZS5lbmRTaGFwZT1mdW5jdGlvbihlKXtpZigwIT09SW4ubGVuZ3RoKXt2YXIgbj1lPT09Yy5DTE9TRQpuJiZJbi5wdXNoKEluWzBdKQp2YXIgcixpPVtdLHM9W10sbz1bXSxhPVtdCmtuPSEwCnZhciBsLGgsdT1Jbi5sZW5ndGgKZm9yKGw9MDtsPHU7bCsrKWZvcihyPUluW2xdLGg9MDtoPDM7aCsrKWkucHVzaChyW2hdKQpmb3IobD0wO2w8dTtsKyspZm9yKHI9SW5bbF0saD01O2g8OTtoKyspcy5wdXNoKHJbaF0pCmZvcihsPTA7bDx1O2wrKylmb3Iocj1JbltsXSxoPTk7aDwxMztoKyspby5wdXNoKHJbaF0pCmZvcihsPTA7bDx1O2wrKylyPUluW2xdLGEucHVzaChyWzNdKSxhLnB1c2gocls0XSkKaWYoIU5ufHxSdCE9PWMuUE9MWUdPTiYmUnQhPT10KWlmKCFGbnx8UnQhPT1jLlBPTFlHT04mJlJ0IT09dClpZihSdD09PWMuUE9JTlRTKWZvcihsPTA7bDx1O2wrKylyPUluW2xdLGN0JiZ4ZS5zdHJva2Uocls2XSkseGUucG9pbnQoclswXSxyWzFdKQplbHNlIGlmKFJ0PT09Yy5MSU5FUylmb3IobD0wO2wrMTx1O2wrPTIpcj1JbltsXSxjdCYmeGUuc3Ryb2tlKEluW2wrMV1bNl0pLHhlLmxpbmUoclswXSxyWzFdLEluW2wrMV1bMF0sSW5bbCsxXVsxXSkKZWxzZSBpZihSdD09PWMuVFJJQU5HTEVTKWZvcihsPTA7bCsyPHU7bCs9MylyPUluW2xdLEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhyWzBdLHJbMV0pLEFlLmxpbmVUbyhJbltsKzFdWzBdLEluW2wrMV1bMV0pLEFlLmxpbmVUbyhJbltsKzJdWzBdLEluW2wrMl1bMV0pLEFlLmxpbmVUbyhyWzBdLHJbMV0pLGF0JiYoeGUuZmlsbChJbltsKzJdWzVdKSx6KCkpLGN0JiYoeGUuc3Ryb2tlKEluW2wrMl1bNl0pLFUoKSksQWUuY2xvc2VQYXRoKCkKZWxzZSBpZihSdD09PWMuVFJJQU5HTEVfU1RSSVApZm9yKGw9MDtsKzE8dTtsKyspcj1JbltsXSxBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oSW5bbCsxXVswXSxJbltsKzFdWzFdKSxBZS5saW5lVG8oclswXSxyWzFdKSxjdCYmeGUuc3Ryb2tlKEluW2wrMV1bNl0pLGF0JiZ4ZS5maWxsKEluW2wrMV1bNV0pLGwrMjx1JiYoQWUubGluZVRvKEluW2wrMl1bMF0sSW5bbCsyXVsxXSksY3QmJnhlLnN0cm9rZShJbltsKzJdWzZdKSxhdCYmeGUuZmlsbChJbltsKzJdWzVdKSksSCgpCmVsc2UgaWYoUnQ9PT1jLlRSSUFOR0xFX0ZBTil7aWYodT4yKWZvcihBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oSW5bMF1bMF0sSW5bMF1bMV0pLEFlLmxpbmVUbyhJblsxXVswXSxJblsxXVsxXSksQWUubGluZVRvKEluWzJdWzBdLEluWzJdWzFdKSxhdCYmKHhlLmZpbGwoSW5bMl1bNV0pLHooKSksY3QmJih4ZS5zdHJva2UoSW5bMl1bNl0pLFUoKSksQWUuY2xvc2VQYXRoKCksbD0zO2w8dTtsKyspcj1JbltsXSxBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oSW5bMF1bMF0sSW5bMF1bMV0pLEFlLmxpbmVUbyhJbltsLTFdWzBdLEluW2wtMV1bMV0pLEFlLmxpbmVUbyhyWzBdLHJbMV0pLGF0JiYoeGUuZmlsbChyWzVdKSx6KCkpLGN0JiYoeGUuc3Ryb2tlKHJbNl0pLFUoKSksQWUuY2xvc2VQYXRoKCl9ZWxzZSBpZihSdD09PWMuUVVBRFMpZm9yKGw9MDtsKzM8dTtsKz00KXtmb3Iocj1JbltsXSxBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oclswXSxyWzFdKSxoPTE7aDw0O2grKylBZS5saW5lVG8oSW5bbCtoXVswXSxJbltsK2hdWzFdKQpBZS5saW5lVG8oclswXSxyWzFdKSxhdCYmKHhlLmZpbGwoSW5bbCszXVs1XSkseigpKSxjdCYmKHhlLnN0cm9rZShJbltsKzNdWzZdKSxVKCkpLEFlLmNsb3NlUGF0aCgpfWVsc2UgaWYoUnQ9PT1jLlFVQURfU1RSSVApe2lmKHU+Mylmb3IobD0wO2wrMTx1O2wrPTIpcj1JbltsXSxBZS5iZWdpblBhdGgoKSxsKzM8dT8oQWUubW92ZVRvKEluW2wrMl1bMF0sSW5bbCsyXVsxXSksQWUubGluZVRvKHJbMF0sclsxXSksQWUubGluZVRvKEluW2wrMV1bMF0sSW5bbCsxXVsxXSksQWUubGluZVRvKEluW2wrM11bMF0sSW5bbCszXVsxXSksYXQmJnhlLmZpbGwoSW5bbCszXVs1XSksY3QmJnhlLnN0cm9rZShJbltsKzNdWzZdKSk6KEFlLm1vdmVUbyhyWzBdLHJbMV0pLEFlLmxpbmVUbyhJbltsKzFdWzBdLEluW2wrMV1bMV0pKSxIKCl9ZWxzZXtmb3IoQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKEluWzBdWzBdLEluWzBdWzFdKSxsPTE7bDx1O2wrKylyPUluW2xdLHIuaXNWZXJ0JiYoci5tb3ZlVG8/QWUubW92ZVRvKHJbMF0sclsxXSk6QWUubGluZVRvKHJbMF0sclsxXSkpCkgoKX1lbHNle2ZvcihBZS5iZWdpblBhdGgoKSxsPTA7bDx1O2wrKylyPUluW2xdLEluW2xdLmlzVmVydD9JbltsXS5tb3ZlVG8/QWUubW92ZVRvKHJbMF0sclsxXSk6QWUubGluZVRvKHJbMF0sclsxXSk6QWUuYmV6aWVyQ3VydmVUbyhJbltsXVswXSxJbltsXVsxXSxJbltsXVsyXSxJbltsXVszXSxJbltsXVs0XSxJbltsXVs1XSkKSCgpfWVsc2UgaWYodT4zKXt2YXIgZj1bXSxwPTEtSXQKZm9yKEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhJblsxXVswXSxJblsxXVsxXSksbD0xO2wrMjx1O2wrKylyPUluW2xdLGZbMF09W3JbMF0sclsxXV0sZlsxXT1bclswXSsocCpJbltsKzFdWzBdLXAqSW5bbC0xXVswXSkvNixyWzFdKyhwKkluW2wrMV1bMV0tcCpJbltsLTFdWzFdKS82XSxmWzJdPVtJbltsKzFdWzBdKyhwKkluW2xdWzBdLXAqSW5bbCsyXVswXSkvNixJbltsKzFdWzFdKyhwKkluW2xdWzFdLXAqSW5bbCsyXVsxXSkvNl0sZlszXT1bSW5bbCsxXVswXSxJbltsKzFdWzFdXSxBZS5iZXppZXJDdXJ2ZVRvKGZbMV1bMF0sZlsxXVsxXSxmWzJdWzBdLGZbMl1bMV0sZlszXVswXSxmWzNdWzFdKQpIKCl9Tm49ITEsRm49ITEsRG49W10sT249MCxuJiZJbi5wb3AoKX19LHNyLnByb3RvdHlwZS5lbmRTaGFwZT1mdW5jdGlvbihlKXtpZigwIT09SW4ubGVuZ3RoKXt2YXIgbixyPWU9PT1jLkNMT1NFLGk9W10scz1bXSxvPVtdLGE9W10sbD1bXQprbj0hMAp2YXIgaCx1LGYscD1Jbi5sZW5ndGgKZm9yKGg9MDtoPHA7aCsrKWZvcihuPUluW2hdLHU9MDt1PDM7dSsrKXMucHVzaChuW3VdKQpmb3IoaD0wO2g8cDtoKyspZm9yKG49SW5baF0sdT01O3U8OTt1Kyspby5wdXNoKG5bdV0pCmZvcihoPTA7aDxwO2grKylmb3Iobj1JbltoXSx1PTk7dTwxMzt1KyspYS5wdXNoKG5bdV0pCmZvcihoPTA7aDxwO2grKyluPUluW2hdLGwucHVzaChuWzNdKSxsLnB1c2gobls0XSkKaWYocil7Zm9yKHMucHVzaChJblswXVswXSkscy5wdXNoKEluWzBdWzFdKSxzLnB1c2goSW5bMF1bMl0pLGg9NTtoPDk7aCsrKW8ucHVzaChJblswXVtoXSkKZm9yKGg9OTtoPDEzO2grKylhLnB1c2goSW5bMF1baF0pCmwucHVzaChJblswXVszXSksbC5wdXNoKEluWzBdWzRdKX1pZighTm58fFJ0IT09Yy5QT0xZR09OJiZSdCE9PXQpaWYoIUZufHxSdCE9PWMuUE9MWUdPTiYmUnQhPT10KXtpZihSdD09PWMuUE9JTlRTKXtmb3IoaD0wO2g8cDtoKyspZm9yKG49SW5baF0sdT0wO3U8Mzt1KyspaS5wdXNoKG5bdV0pCnByKGksYSl9ZWxzZSBpZihSdD09PWMuTElORVMpe2ZvcihoPTA7aDxwO2grKylmb3Iobj1JbltoXSx1PTA7dTwzO3UrKylpLnB1c2goblt1XSkKZm9yKGg9MDtoPHA7aCsrKWZvcihuPUluW2hdLHU9NTt1PDk7dSsrKW8ucHVzaChuW3VdKQptcihpLCJMSU5FUyIsYSl9ZWxzZSBpZihSdD09PWMuVFJJQU5HTEVTKXtpZihwPjIpZm9yKGg9MDtoKzI8cDtoKz0zKXtmb3Iocz1bXSxsPVtdLGk9W10sbz1bXSxhPVtdLHU9MDt1PDM7dSsrKWZvcihmPTA7ZjwzO2YrKylpLnB1c2goSW5baCt1XVtmXSkscy5wdXNoKEluW2grdV1bZl0pCmZvcih1PTA7dTwzO3UrKylmb3IoZj0zO2Y8NTtmKyspbC5wdXNoKEluW2grdV1bZl0pCmZvcih1PTA7dTwzO3UrKylmb3IoZj01O2Y8OTtmKyspby5wdXNoKEluW2grdV1bZl0pLGEucHVzaChJbltoK3VdW2YrNF0pCmN0JiZtcihpLCJMSU5FX0xPT1AiLGEpLChhdHx8UXQpJiZncihzLCJUUklBTkdMRVMiLG8sbCl9fWVsc2UgaWYoUnQ9PT1jLlRSSUFOR0xFX1NUUklQKXtpZihwPjIpZm9yKGg9MDtoKzI8cDtoKyspe2ZvcihpPVtdLHM9W10sYT1bXSxvPVtdLGw9W10sdT0wO3U8Mzt1KyspZm9yKGY9MDtmPDM7ZisrKWkucHVzaChJbltoK3VdW2ZdKSxzLnB1c2goSW5baCt1XVtmXSkKZm9yKHU9MDt1PDM7dSsrKWZvcihmPTM7Zjw1O2YrKylsLnB1c2goSW5baCt1XVtmXSkKZm9yKHU9MDt1PDM7dSsrKWZvcihmPTU7Zjw5O2YrKylhLnB1c2goSW5baCt1XVtmKzRdKSxvLnB1c2goSW5baCt1XVtmXSk7KGF0fHxRdCkmJmdyKHMsIlRSSUFOR0xFX1NUUklQIixvLGwpLGN0JiZtcihpLCJMSU5FX0xPT1AiLGEpfX1lbHNlIGlmKFJ0PT09Yy5UUklBTkdMRV9GQU4pe2lmKHA+Mil7Zm9yKGg9MDtoPDM7aCsrKWZvcihuPUluW2hdLHU9MDt1PDM7dSsrKWkucHVzaChuW3VdKQpmb3IoaD0wO2g8MztoKyspZm9yKG49SW5baF0sdT05O3U8MTM7dSsrKWEucHVzaChuW3VdKQpmb3IoY3QmJm1yKGksIkxJTkVfTE9PUCIsYSksaD0yO2grMTxwO2grKyl7Zm9yKGk9W10sYT1bXSxpLnB1c2goSW5bMF1bMF0pLGkucHVzaChJblswXVsxXSksaS5wdXNoKEluWzBdWzJdKSxhLnB1c2goSW5bMF1bOV0pLGEucHVzaChJblswXVsxMF0pLGEucHVzaChJblswXVsxMV0pLGEucHVzaChJblswXVsxMl0pLHU9MDt1PDI7dSsrKWZvcihmPTA7ZjwzO2YrKylpLnB1c2goSW5baCt1XVtmXSkKZm9yKHU9MDt1PDI7dSsrKWZvcihmPTk7ZjwxMztmKyspYS5wdXNoKEluW2grdV1bZl0pCmN0JiZtcihpLCJMSU5FX1NUUklQIixhKX0oYXR8fFF0KSYmZ3IocywiVFJJQU5HTEVfRkFOIixvLGwpfX1lbHNlIGlmKFJ0PT09Yy5RVUFEUylmb3IoaD0wO2grMzxwO2grPTQpe2ZvcihpPVtdLHU9MDt1PDQ7dSsrKWZvcihuPUluW2grdV0sZj0wO2Y8MztmKyspaS5wdXNoKG5bZl0pCmlmKGN0JiZtcihpLCJMSU5FX0xPT1AiLGEpLGF0KXtmb3Iocz1bXSxvPVtdLGw9W10sdT0wO3U8Mzt1Kyspcy5wdXNoKEluW2hdW3VdKQpmb3IodT01O3U8OTt1Kyspby5wdXNoKEluW2hdW3VdKQpmb3IodT0wO3U8Mzt1Kyspcy5wdXNoKEluW2grMV1bdV0pCmZvcih1PTU7dTw5O3UrKylvLnB1c2goSW5baCsxXVt1XSkKZm9yKHU9MDt1PDM7dSsrKXMucHVzaChJbltoKzNdW3VdKQpmb3IodT01O3U8OTt1Kyspby5wdXNoKEluW2grM11bdV0pCmZvcih1PTA7dTwzO3UrKylzLnB1c2goSW5baCsyXVt1XSkKZm9yKHU9NTt1PDk7dSsrKW8ucHVzaChJbltoKzJdW3VdKQpRdCYmKGwucHVzaChJbltoKzBdWzNdKSxsLnB1c2goSW5baCswXVs0XSksbC5wdXNoKEluW2grMV1bM10pLGwucHVzaChJbltoKzFdWzRdKSxsLnB1c2goSW5baCszXVszXSksbC5wdXNoKEluW2grM11bNF0pLGwucHVzaChJbltoKzJdWzNdKSxsLnB1c2goSW5baCsyXVs0XSkpLGdyKHMsIlRSSUFOR0xFX1NUUklQIixvLGwpfX1lbHNlIGlmKFJ0PT09Yy5RVUFEX1NUUklQKXt2YXIgbT1bXQppZihwPjMpe2ZvcihoPTA7aDwyO2grKylmb3Iobj1JbltoXSx1PTA7dTwzO3UrKylpLnB1c2goblt1XSkKZm9yKGg9MDtoPDI7aCsrKWZvcihuPUluW2hdLHU9OTt1PDEzO3UrKylhLnB1c2goblt1XSkKZm9yKG1yKGksIkxJTkVfU1RSSVAiLGEpLHA+NCYmcCUyPjAmJihtPXMuc3BsaWNlKHMubGVuZ3RoLTMpLEluLnBvcCgpKSxoPTA7aCszPHA7aCs9Mil7Zm9yKGk9W10sYT1bXSx1PTA7dTwzO3UrKylpLnB1c2goSW5baCsxXVt1XSkKZm9yKHU9MDt1PDM7dSsrKWkucHVzaChJbltoKzNdW3VdKQpmb3IodT0wO3U8Mzt1KyspaS5wdXNoKEluW2grMl1bdV0pCmZvcih1PTA7dTwzO3UrKylpLnB1c2goSW5baCswXVt1XSkKZm9yKHU9OTt1PDEzO3UrKylhLnB1c2goSW5baCsxXVt1XSkKZm9yKHU9OTt1PDEzO3UrKylhLnB1c2goSW5baCszXVt1XSkKZm9yKHU9OTt1PDEzO3UrKylhLnB1c2goSW5baCsyXVt1XSkKZm9yKHU9OTt1PDEzO3UrKylhLnB1c2goSW5baCswXVt1XSkKY3QmJm1yKGksIkxJTkVfU1RSSVAiLGEpfShhdHx8UXQpJiZncihzLCJUUklBTkdMRV9MSVNUIixvLGwpfX1lbHNlIGlmKDE9PT1wKXtmb3IodT0wO3U8Mzt1KyspaS5wdXNoKEluWzBdW3VdKQpmb3IodT05O3U8MTM7dSsrKWEucHVzaChJblswXVt1XSkKcHIoaSxhKX1lbHNle2ZvcihoPTA7aDxwO2grKyl7Zm9yKG49SW5baF0sdT0wO3U8Mzt1KyspaS5wdXNoKG5bdV0pCmZvcih1PTU7dTw5O3UrKylhLnB1c2goblt1XSl9Y3QmJnI/bXIoaSwiTElORV9MT09QIixhKTpjdCYmIXImJm1yKGksIkxJTkVfU1RSSVAiLGEpLChhdHx8UXQpJiZncihzLCJUUklBTkdMRV9GQU4iLG8sbCl9UXQ9ITEsQWUudXNlUHJvZ3JhbShSZSksTSgidXNpbmdUZXh0dXJlM2QiLFJlLCJ1VXNpbmdUZXh0dXJlIixRdCl9ZWxzZSBpPXMsaS5zcGxpY2UoaS5sZW5ndGgtMyksYS5zcGxpY2UoYS5sZW5ndGgtNCksY3QmJm1yKGksbnVsbCxhKSxhdCYmZ3IocywiVFJJQU5HTEVTIixvKQplbHNlIGk9cyxjdCYmbXIoaSxudWxsLGEpLGF0JiZncihzLG51bGwsbykKTm49ITEsRm49ITEsRG49W10sT249MH19CnZhciBkcj1mdW5jdGlvbihlLHQpe3ZhciBuPTEvZSxyPW4qbixpPXIqbgp0LnNldCgwLDAsMCwxLGkscixuLDAsNippLDIqciwwLDAsNippLDAsMCwwKX0sdnI9ZnVuY3Rpb24oKXtDZXx8KFNlPW5ldyBocixDZT1uZXcgaHIsT3Q9ITApCnZhciBlPUl0ClNlLnNldCgoZS0xKS8yLChlKzMpLzIsKC0zLWUpLzIsKDEtZSkvMiwxLWUsKC01LWUpLzIsZSsyLChlLTEpLzIsKGUtMSkvMiwwLCgxLWUpLzIsMCwwLDEsMCwwKSxkcihEdCxDZSksVGV8fChQZT1uZXcgaHIpLFBlLnNldChTZSksUGUucHJlQXBwbHkoVGUpLENlLmFwcGx5KFNlKX0KaXIucHJvdG90eXBlLmJlemllclZlcnRleD1mdW5jdGlvbigpe0ZuPSEwCnZhciBlPVtdCmlmKGtuKXRocm93InZlcnRleCgpIG11c3QgYmUgdXNlZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBjYWxsaW5nIGJlemllclZlcnRleCgpIgpmb3IodmFyIHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdCkluLnB1c2goZSksSW5bSW4ubGVuZ3RoLTFdLmlzVmVydD0hMX0sc3IucHJvdG90eXBlLmJlemllclZlcnRleD1mdW5jdGlvbigpe0ZuPSEwCmlmKGtuKXRocm93InZlcnRleCgpIG11c3QgYmUgdXNlZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBjYWxsaW5nIGJlemllclZlcnRleCgpIgppZig5PT09YXJndW1lbnRzLmxlbmd0aCl7TWU9PT10JiYoTWU9bmV3IGhyKQp2YXIgZT1Jbi5sZW5ndGgtMQpkcihGdCxNZSksTWUuYXBwbHkoX2UpCmZvcih2YXIgbj1NZS5hcnJheSgpLHI9SW5bZV1bMF0saT1JbltlXVsxXSxzPUluW2VdWzJdLG89bls0XSpyK25bNV0qYXJndW1lbnRzWzBdK25bNl0qYXJndW1lbnRzWzNdK25bN10qYXJndW1lbnRzWzZdLGE9bls4XSpyK25bOV0qYXJndW1lbnRzWzBdK25bMTBdKmFyZ3VtZW50c1szXStuWzExXSphcmd1bWVudHNbNl0sbD1uWzEyXSpyK25bMTNdKmFyZ3VtZW50c1swXStuWzE0XSphcmd1bWVudHNbM10rblsxNV0qYXJndW1lbnRzWzZdLGg9bls0XSppK25bNV0qYXJndW1lbnRzWzFdK25bNl0qYXJndW1lbnRzWzRdK25bN10qYXJndW1lbnRzWzddLHU9bls4XSppK25bOV0qYXJndW1lbnRzWzFdK25bMTBdKmFyZ3VtZW50c1s0XStuWzExXSphcmd1bWVudHNbN10sYz1uWzEyXSppK25bMTNdKmFyZ3VtZW50c1sxXStuWzE0XSphcmd1bWVudHNbNF0rblsxNV0qYXJndW1lbnRzWzddLGY9bls0XSpzK25bNV0qYXJndW1lbnRzWzJdK25bNl0qYXJndW1lbnRzWzVdK25bN10qYXJndW1lbnRzWzhdLHA9bls4XSpzK25bOV0qYXJndW1lbnRzWzJdK25bMTBdKmFyZ3VtZW50c1s1XStuWzExXSphcmd1bWVudHNbOF0sbT1uWzEyXSpzK25bMTNdKmFyZ3VtZW50c1syXStuWzE0XSphcmd1bWVudHNbNV0rblsxNV0qYXJndW1lbnRzWzhdLGc9MDtnPEZ0O2crKylyKz1vLG8rPWEsYSs9bCxpKz1oLGgrPXUsdSs9YyxzKz1mLGYrPXAscCs9bSx4ZS52ZXJ0ZXgocixpLHMpCnhlLnZlcnRleChhcmd1bWVudHNbNl0sYXJndW1lbnRzWzddLGFyZ3VtZW50c1s4XSl9fSx4ZS50ZXh0dXJlPWZ1bmN0aW9uKGUpe3ZhciB0PXdlLiRlbnN1cmVDb250ZXh0KCkKaWYoZS5fX3RleHR1cmUpdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsZS5fX3RleHR1cmUpCmVsc2UgaWYoImNhbnZhcyI9PT1lLmxvY2FsTmFtZSl0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCxYZSksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLGUpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01BR19GSUxURVIsdC5MSU5FQVIpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01JTl9GSUxURVIsdC5MSU5FQVIpLHQuZ2VuZXJhdGVNaXBtYXAodC5URVhUVVJFXzJEKSxadC53aWR0aD1lLndpZHRoLFp0LmhlaWdodD1lLmhlaWdodAplbHNle3ZhciBuLHI9dC5jcmVhdGVUZXh0dXJlKCksaT1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHM9aS5nZXRDb250ZXh0KCIyZCIpCmlmKGUud2lkdGgmZS53aWR0aC0xPT09MClpLndpZHRoPWUud2lkdGgKZWxzZXtmb3Iobj0xO248ZS53aWR0aDspbio9MgppLndpZHRoPW59aWYoZS5oZWlnaHQmZS5oZWlnaHQtMT09PTApaS5oZWlnaHQ9ZS5oZWlnaHQKZWxzZXtmb3Iobj0xO248ZS5oZWlnaHQ7KW4qPTIKaS5oZWlnaHQ9bn1zLmRyYXdJbWFnZShlLnNvdXJjZUltZywwLDAsZS53aWR0aCxlLmhlaWdodCwwLDAsaS53aWR0aCxpLmhlaWdodCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsciksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUl9NSVBNQVBfTElORUFSKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHQuTElORUFSKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1QsdC5DTEFNUF9UT19FREdFKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5DTEFNUF9UT19FREdFKSx0LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAsdC5SR0JBLHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsaSksdC5nZW5lcmF0ZU1pcG1hcCh0LlRFWFRVUkVfMkQpLGUuX190ZXh0dXJlPXIsWnQud2lkdGg9ZS53aWR0aCxadC5oZWlnaHQ9ZS5oZWlnaHR9UXQ9ITAsdC51c2VQcm9ncmFtKFJlKSxNKCJ1c2luZ1RleHR1cmUzZCIsUmUsInVVc2luZ1RleHR1cmUiLFF0KX0seGUudGV4dHVyZU1vZGU9ZnVuY3Rpb24oZSl7cXQ9ZX0KdmFyIHlyPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSxsLGgsdSxjKXt2YXIgZj1yLHA9aSxtPXMsZz1DZS5hcnJheSgpLGQ9Z1s0XSplK2dbNV0qcitnWzZdKm8rZ1s3XSpoLHY9Z1s4XSplK2dbOV0qcitnWzEwXSpvK2dbMTFdKmgseT1nWzEyXSplK2dbMTNdKnIrZ1sxNF0qbytnWzE1XSpoLHg9Z1s0XSp0K2dbNV0qaStnWzZdKmErZ1s3XSp1LEE9Z1s4XSp0K2dbOV0qaStnWzEwXSphK2dbMTFdKnUsYj1nWzEyXSp0K2dbMTNdKmkrZ1sxNF0qYStnWzE1XSp1LHc9Z1s0XSpuK2dbNV0qcytnWzZdKmwrZ1s3XSpjLEU9Z1s4XSpuK2dbOV0qcytnWzEwXSpsK2dbMTFdKmMsUz1nWzEyXSpuK2dbMTNdKnMrZ1sxNF0qbCtnWzE1XSpjCnhlLnZlcnRleChmLHAsbSkKZm9yKHZhciBQPTA7UDxEdDtQKyspZis9ZCxkKz12LHYrPXkscCs9eCx4Kz1BLEErPWIsbSs9dyx3Kz1FLEUrPVMseGUudmVydGV4KGYscCxtKX0KaXIucHJvdG90eXBlLmN1cnZlVmVydGV4PWZ1bmN0aW9uKGUsdCl7Tm49ITAseGUudmVydGV4KGUsdCl9LHNyLnByb3RvdHlwZS5jdXJ2ZVZlcnRleD1mdW5jdGlvbihlLHQsbil7Tm49ITAsT3R8fHZyKCkKdmFyIHI9W10KclswXT1lLHJbMV09dCxyWzJdPW4sRG4ucHVzaChyKSxPbisrLE9uPjMmJnlyKERuW09uLTRdWzBdLERuW09uLTRdWzFdLERuW09uLTRdWzJdLERuW09uLTNdWzBdLERuW09uLTNdWzFdLERuW09uLTNdWzJdLERuW09uLTJdWzBdLERuW09uLTJdWzFdLERuW09uLTJdWzJdLERuW09uLTFdWzBdLERuW09uLTFdWzFdLERuW09uLTFdWzJdKX0saXIucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSl7eGUuYmVnaW5TaGFwZSgpLHhlLmN1cnZlVmVydGV4KGUsdCkseGUuY3VydmVWZXJ0ZXgobixyKSx4ZS5jdXJ2ZVZlcnRleChpLHMpLHhlLmN1cnZlVmVydGV4KG8sYSkseGUuZW5kU2hhcGUoKX0sc3IucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCxoLHUsYyxmKXtyZXR1cm4gZiE9PXQ/KHhlLmJlZ2luU2hhcGUoKSx4ZS5jdXJ2ZVZlcnRleChlLG4scikseGUuY3VydmVWZXJ0ZXgoaSxzLG8pLHhlLmN1cnZlVmVydGV4KGEsbCxoKSx4ZS5jdXJ2ZVZlcnRleCh1LGMsZiksdm9pZCB4ZS5lbmRTaGFwZSgpKTooeGUuYmVnaW5TaGFwZSgpLHhlLmN1cnZlVmVydGV4KGUsbikseGUuY3VydmVWZXJ0ZXgocixpKSx4ZS5jdXJ2ZVZlcnRleChzLG8pLHhlLmN1cnZlVmVydGV4KGEsbCksdm9pZCB4ZS5lbmRTaGFwZSgpKX0seGUuY3VydmVUaWdodG5lc3M9ZnVuY3Rpb24oZSl7SXQ9ZX0seGUuY3VydmVEZXRhaWw9ZnVuY3Rpb24oZSl7RHQ9ZSx2cigpfSx4ZS5yZWN0TW9kZT1mdW5jdGlvbihlKXtBdD1lfSx4ZS5pbWFnZU1vZGU9ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UgYy5DT1JORVI6ZXI9Sm4KYnJlYWsKY2FzZSBjLkNPUk5FUlM6ZXI9dHIKYnJlYWsKY2FzZSBjLkNFTlRFUjplcj1ucgpicmVhawpkZWZhdWx0OnRocm93IkludmFsaWQgaW1hZ2VNb2RlIn19LHhlLmVsbGlwc2VNb2RlPWZ1bmN0aW9uKGUpe2J0PWV9LHhlLmFyYz1mdW5jdGlvbihlLHQsbixyLGkscyxvKXtpZighKG48PTB8fHM8aSkpe2ZvcihidD09PWMuQ09STkVSUz8obi09ZSxyLT10KTpidD09PWMuUkFESVVTPyhlLT1uLHQtPXIsbj0yKm4scj0yKnIpOmJ0PT09Yy5DRU5URVImJihlLT1uLzIsdC09ci8yKTtpPDA7KWkrPWMuVFdPX1BJLHMrPWMuVFdPX1BJCnMtaT5jLlRXT19QSSYmKHM9aStjLlRXT19QSSkKdmFyIGE9bi8yLGw9ci8yLGg9ZSthLHU9dCtsLGY9MS8oYStsKSxwPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIGZ1bmN0aW9uKHMsZixwLG0sZyl7Zm9yKHA9MCxtPW4sZz1pK3Iscy5iZWdpblNoYXBlKCksZiYmcy52ZXJ0ZXgoZS0uNSx0LS41KTttPGc7cCsrLG09cCpyK24pcy52ZXJ0ZXgoZStNYXRoLmNvcyhtKSphfDAsdCtNYXRoLnNpbihtKSpsfDApCm89PT1jLk9QRU4mJmF0P3MudmVydGV4KGgrTWF0aC5jb3MobikqYSx1K01hdGguc2luKG4pKmwpOm89PT1jLkNIT1JEP3MudmVydGV4KGgrTWF0aC5jb3MobikqYSx1K01hdGguc2luKG4pKmwpOm89PT1jLlBJRSYmKHMubGluZShoK01hdGguY29zKG4pKmEsdStNYXRoLnNpbihuKSpsLGgsdSkscy5saW5lKGgsdSxoK01hdGguY29zKGkpKmEsdStNYXRoLnNpbihpKSpsKSkscy5lbmRTaGFwZShmP2MuQ0xPU0U6dm9pZCAwKX19KGgrLjUsdSsuNSxpLGYscykKaWYoYXQpe3ZhciBtPWN0CmN0PSExLHAoeGUsITApLGN0PW19aWYoY3Qpe3ZhciBnPWF0CmF0PSExLHAoeGUpLGF0PWd9fX0saXIucHJvdG90eXBlLmxpbmU9ZnVuY3Rpb24oZSxuLHIsaSl7aWYoY3Qpe2lmKHZ0fHwoZT1NYXRoLnJvdW5kKGUpLHI9TWF0aC5yb3VuZChyKSxuPU1hdGgucm91bmQobiksaT1NYXRoLnJvdW5kKGkpKSxlPT09ciYmbj09PWkpcmV0dXJuIHZvaWQgeGUucG9pbnQoZSxuKQpmb3IodmFyIHM9dCxvPXQsYT0hMCxsPXR0LmFycmF5KCksaD1bMSwwLDAsMCwxLDBdLHU9MDt1PDYmJmE7dSsrKWE9bFt1XT09PWhbdV0KYSYmKGU9PT1yPyhuPmkmJihzPW4sbj1pLGk9cyksaSsrLGd0JTI9PT0xJiZBZS50cmFuc2xhdGUoLjUsMCkpOm49PT1pJiYoZT5yJiYocz1lLGU9cixyPXMpLHIrKyxndCUyPT09MSYmQWUudHJhbnNsYXRlKDAsLjUpKSwxPT09Z3QmJihvPUFlLmxpbmVDYXAsQWUubGluZUNhcD0iYnV0dCIpKSxBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oZXx8MCxufHwwKSxBZS5saW5lVG8ocnx8MCxpfHwwKSxVKCksYSYmKGU9PT1yJiZndCUyPT09MT9BZS50cmFuc2xhdGUoLS41LDApOm49PT1pJiZndCUyPT09MSYmQWUudHJhbnNsYXRlKDAsLS41KSwxPT09Z3QmJihBZS5saW5lQ2FwPW8pKX19LHNyLnByb3RvdHlwZS5saW5lPWZ1bmN0aW9uKGUsbixyLGkscyxvKXtpZihzIT09dCYmbyE9PXR8fChvPTAscz1pLGk9cixyPTApLGU9PT1pJiZuPT09cyYmcj09PW8pcmV0dXJuIHZvaWQgeGUucG9pbnQoZSxuLHIpCnZhciBhPVtlLG4scixpLHMsb10sbD1uZXcgaHIKbC5zY2FsZSgxLC0xLDEpLGwuYXBwbHkodHQuYXJyYXkoKSksbC50cmFuc3Bvc2UoKSxndD4wJiZjdCYmKEFlLnVzZVByb2dyYW0oTGUpLFQoInVNb2RlbDJkIixMZSwidU1vZGVsIiwhMSxbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0pLFQoInVWaWV3MmQiLExlLCJ1VmlldyIsITEsbC5hcnJheSgpKSxDKCJ1Q29sb3IyZCIsTGUsInVDb2xvciIsZnQpLE0oInVJc0RyYXdpbmdUZXh0IixMZSwidUlzRHJhd2luZ1RleHQiLCExKSxfKCJhVmVydGV4MmQiLExlLCJhVmVydGV4IiwzLCRlKSxSKCJhVGV4dHVyZUNvb3JkMmQiLExlLCJhVGV4dHVyZUNvb3JkIiksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoYSksQWUuU1RSRUFNX0RSQVcpLEFlLmRyYXdBcnJheXMoQWUuTElORVMsMCwyKSl9LGlyLnByb3RvdHlwZS5iZXppZXI9ZnVuY3Rpb24oKXtpZig4IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyJZb3UgbXVzdCB1c2UgOCBwYXJhbWV0ZXJzIGZvciBiZXppZXIoKSBpbiAyRCBtb2RlIgp4ZS5iZWdpblNoYXBlKCkseGUudmVydGV4KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLHhlLmJlemllclZlcnRleChhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0sYXJndW1lbnRzWzZdLGFyZ3VtZW50c1s3XSkseGUuZW5kU2hhcGUoKX0sc3IucHJvdG90eXBlLmJlemllcj1mdW5jdGlvbigpe2lmKDEyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyJZb3UgbXVzdCB1c2UgMTIgcGFyYW1ldGVycyBmb3IgYmV6aWVyKCkgaW4gM0QgbW9kZSIKeGUuYmVnaW5TaGFwZSgpLHhlLnZlcnRleChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkseGUuYmV6aWVyVmVydGV4KGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdLGFyZ3VtZW50c1s2XSxhcmd1bWVudHNbN10sYXJndW1lbnRzWzhdLGFyZ3VtZW50c1s5XSxhcmd1bWVudHNbMTBdLGFyZ3VtZW50c1sxMV0pLHhlLmVuZFNoYXBlKCl9LHhlLmJlemllckRldGFpbD1mdW5jdGlvbihlKXtGdD1lfSx4ZS5iZXppZXJQb2ludD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybigxLWkpKigxLWkpKigxLWkpKmUrMyooMS1pKSooMS1pKSppKnQrMyooMS1pKSppKmkqbitpKmkqaSpyfSx4ZS5iZXppZXJUYW5nZW50PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIDMqaSppKigtZSszKnQtMypuK3IpKzYqaSooZS0yKnQrbikrMyooLWUrdCl9LHhlLmN1cnZlUG9pbnQ9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4uNSooMip0KygtZStuKSppKygyKmUtNSp0KzQqbi1yKSppKmkrKC1lKzMqdC0zKm4rcikqaSppKmkpfSx4ZS5jdXJ2ZVRhbmdlbnQ9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4uNSooLWUrbisyKigyKmUtNSp0KzQqbi1yKSppKzMqKC1lKzMqdC0zKm4rcikqaSppKX0seGUudHJpYW5nbGU9ZnVuY3Rpb24oZSx0LG4scixpLHMpe3hlLmJlZ2luU2hhcGUoYy5UUklBTkdMRVMpLHhlLnZlcnRleChlLHQsMCkseGUudmVydGV4KG4sciwwKSx4ZS52ZXJ0ZXgoaSxzLDApLHhlLmVuZFNoYXBlKCl9LHhlLnF1YWQ9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhKXt4ZS5iZWdpblNoYXBlKGMuUVVBRFMpLHhlLnZlcnRleChlLHQsMCkseGUudmVydGV4KG4sciwwKSx4ZS52ZXJ0ZXgoaSxzLDApLHhlLnZlcnRleChvLGEsMCkseGUuZW5kU2hhcGUoKX0KdmFyIHhyPWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCl7bD09PXQmJihvPXMsYT1zLGw9cykKdmFyIGg9ci8yLHU9aS8yOyhzPmh8fHM+dSkmJihzPU1hdGgubWluKGgsdSkpLChvPmh8fG8+dSkmJihvPU1hdGgubWluKGgsdSkpLChhPmh8fGE+dSkmJihhPU1hdGgubWluKGgsdSkpLChsPmh8fGw+dSkmJihsPU1hdGgubWluKGgsdSkpLGF0JiYhY3R8fEFlLnRyYW5zbGF0ZSguNSwuNSksQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKGUrcyxuKSxBZS5saW5lVG8oZStyLW8sbiksQWUucXVhZHJhdGljQ3VydmVUbyhlK3IsbixlK3IsbitvKSxBZS5saW5lVG8oZStyLG4raS1hKSxBZS5xdWFkcmF0aWNDdXJ2ZVRvKGUrcixuK2ksZStyLWEsbitpKSxBZS5saW5lVG8oZStsLG4raSksQWUucXVhZHJhdGljQ3VydmVUbyhlLG4raSxlLG4raS1sKSxBZS5saW5lVG8oZSxuK3MpLEFlLnF1YWRyYXRpY0N1cnZlVG8oZSxuLGUrcyxuKSxhdCYmIWN0fHxBZS50cmFuc2xhdGUoLS41LC0uNSkseigpLFUoKX0KaXIucHJvdG90eXBlLnJlY3Q9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsKXtpZihyPT0iIityfHxpPT0iIitpKXtpZihBdD09PWMuQ09STkVSUz8oci09ZSxpLT1uKTpBdD09PWMuUkFESVVTPyhyKj0yLGkqPTIsZS09ci8yLG4tPWkvMik6QXQ9PT1jLkNFTlRFUiYmKGUtPXIvMixuLT1pLzIpLHZ0fHwoZT1NYXRoLnJvdW5kKGUpLG49TWF0aC5yb3VuZChuKSxyPU1hdGgucm91bmQociksaT1NYXRoLnJvdW5kKGkpKSxzIT09dClyZXR1cm4gdm9pZCB4cihlLG4scixpLHMsbyxhLGwpCmN0JiZndCUyPT09MSYmQWUudHJhbnNsYXRlKC41LC41KSxBZS5iZWdpblBhdGgoKSxBZS5yZWN0KGUsbixyLGkpLHooKSxVKCksY3QmJmd0JTI9PT0xJiZBZS50cmFuc2xhdGUoLS41LC0uNSl9fSxzci5wcm90b3R5cGUucmVjdD1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwpe2lmKHMhPT10KXRocm93InJlY3QoKSB3aXRoIHJvdW5kZWQgY29ybmVycyBpcyBub3Qgc3VwcG9ydGVkIGluIDNEIG1vZGUiCkF0PT09Yy5DT1JORVJTPyhyLT1lLGktPW4pOkF0PT09Yy5SQURJVVM/KHIqPTIsaSo9MixlLT1yLzIsbi09aS8yKTpBdD09PWMuQ0VOVEVSJiYoZS09ci8yLG4tPWkvMikKdmFyIGg9bmV3IGhyCmgudHJhbnNsYXRlKGUsbiwwKSxoLnNjYWxlKHIsaSwxKSxoLnRyYW5zcG9zZSgpCnZhciB1PW5ldyBocgppZih1LnNjYWxlKDEsLTEsMSksdS5hcHBseSh0dC5hcnJheSgpKSx1LnRyYW5zcG9zZSgpLGd0PjAmJmN0JiYoQWUudXNlUHJvZ3JhbShMZSksVCgidU1vZGVsMmQiLExlLCJ1TW9kZWwiLCExLGguYXJyYXkoKSksVCgidVZpZXcyZCIsTGUsInVWaWV3IiwhMSx1LmFycmF5KCkpLEMoInVDb2xvcjJkIixMZSwidUNvbG9yIixmdCksTSgidUlzRHJhd2luZ1RleHQyZCIsTGUsInVJc0RyYXdpbmdUZXh0IiwhMSksXygiYVZlcnRleDJkIixMZSwiYVZlcnRleCIsMyxGZSksUigiYVRleHR1cmVDb29yZDJkIixMZSwiYVRleHR1cmVDb29yZCIpLEFlLmRyYXdBcnJheXMoQWUuTElORV9MT09QLDAsVW4ubGVuZ3RoLzMpKSxhdCl7aWYoQWUudXNlUHJvZ3JhbShSZSksVCgidU1vZGVsM2QiLFJlLCJ1TW9kZWwiLCExLGguYXJyYXkoKSksVCgidVZpZXczZCIsUmUsInVWaWV3IiwhMSx1LmFycmF5KCkpLEFlLmVuYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKSxBZS5wb2x5Z29uT2Zmc2V0KDEsMSksQygiY29sb3IzZCIsUmUsInVDb2xvciIsbHQpLGduPjApe3ZhciBmPW5ldyBocgpmLnNldCh1KQp2YXIgcD1uZXcgaHIKcC5zZXQoaCksZi5tdWx0KHApCnZhciBtPW5ldyBocgptLnNldChmKSxtLmludmVydCgpLG0udHJhbnNwb3NlKCksVCgidU5vcm1hbFRyYW5zZm9ybTNkIixSZSwidU5vcm1hbFRyYW5zZm9ybSIsITEsbS5hcnJheSgpKSxfKCJhTm9ybWFsM2QiLFJlLCJhTm9ybWFsIiwzLGtlKX1lbHNlIFIoIm5vcm1hbDNkIixSZSwiYU5vcm1hbCIpCl8oInZlcnRleDNkIixSZSwiYVZlcnRleCIsMyxGZSksQWUuZHJhd0FycmF5cyhBZS5UUklBTkdMRV9GQU4sMCxVbi5sZW5ndGgvMyksQWUuZGlzYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKX19LGlyLnByb3RvdHlwZS5lbGxpcHNlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9ZXx8MCx0PXR8fDAsIShuPD0wJiZyPD0wKSlpZihidD09PWMuUkFESVVTPyhuKj0yLHIqPTIpOmJ0PT09Yy5DT1JORVJTPyhuLT1lLHItPXQsZSs9bi8yLHQrPXIvMik6YnQ9PT1jLkNPUk5FUiYmKGUrPW4vMix0Kz1yLzIpLG49PT1yKUFlLmJlZ2luUGF0aCgpLEFlLmFyYyhlLHQsbi8yLDAsYy5UV09fUEksITEpLHooKSxVKCkKZWxzZXt2YXIgaT1uLzIscz1yLzIsbz0uNTUyMjg0NzQ5ODMwNzkzMyxhPW8qaSxsPW8qcwp4ZS5iZWdpblNoYXBlKCkseGUudmVydGV4KGUraSx0KSx4ZS5iZXppZXJWZXJ0ZXgoZStpLHQtbCxlK2EsdC1zLGUsdC1zKSx4ZS5iZXppZXJWZXJ0ZXgoZS1hLHQtcyxlLWksdC1sLGUtaSx0KSx4ZS5iZXppZXJWZXJ0ZXgoZS1pLHQrbCxlLWEsdCtzLGUsdCtzKSx4ZS5iZXppZXJWZXJ0ZXgoZSthLHQrcyxlK2ksdCtsLGUraSx0KSx4ZS5lbmRTaGFwZSgpfX0sc3IucHJvdG90eXBlLmVsbGlwc2U9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT1lfHwwLHQ9dHx8MCwhKG48PTAmJnI8PTApKXtidD09PWMuUkFESVVTPyhuKj0yLHIqPTIpOmJ0PT09Yy5DT1JORVJTPyhuLT1lLHItPXQsZSs9bi8yLHQrPXIvMik6YnQ9PT1jLkNPUk5FUiYmKGUrPW4vMix0Kz1yLzIpCnZhciBpPW4vMixzPXIvMixvPS41NTIyODQ3NDk4MzA3OTMzLGE9byppLGw9bypzCmlmKHhlLmJlZ2luU2hhcGUoKSx4ZS52ZXJ0ZXgoZStpLHQpLHhlLmJlemllclZlcnRleChlK2ksdC1sLDAsZSthLHQtcywwLGUsdC1zLDApLHhlLmJlemllclZlcnRleChlLWEsdC1zLDAsZS1pLHQtbCwwLGUtaSx0LDApLHhlLmJlemllclZlcnRleChlLWksdCtsLDAsZS1hLHQrcywwLGUsdCtzLDApLHhlLmJlemllclZlcnRleChlK2EsdCtzLDAsZStpLHQrbCwwLGUraSx0LDApLHhlLmVuZFNoYXBlKCksYXQpe3ZhciBoLHUsZj0wLHA9MApmb3IoaD0wO2g8SW4ubGVuZ3RoO2grKylmKz1JbltoXVswXSxwKz1JbltoXVsxXQpmLz1Jbi5sZW5ndGgscC89SW4ubGVuZ3RoCnZhciBtPVtdLGc9W10sZD1bXQpmb3IobVswXT1mLG1bMV09cCxtWzJdPTAsbVszXT0wLG1bNF09MCxtWzVdPWx0WzBdLG1bNl09bHRbMV0sbVs3XT1sdFsyXSxtWzhdPWx0WzNdLG1bOV09ZnRbMF0sbVsxMF09ZnRbMV0sbVsxMV09ZnRbMl0sbVsxMl09ZnRbM10sbVsxM109d3QsbVsxNF09RXQsbVsxNV09U3QsSW4udW5zaGlmdChtKSxoPTA7aDxJbi5sZW5ndGg7aCsrKXtmb3IodT0wO3U8Mzt1KyspZy5wdXNoKEluW2hdW3VdKQpmb3IodT01O3U8OTt1KyspZC5wdXNoKEluW2hdW3VdKX1ncihnLCJUUklBTkdMRV9GQU4iLGQpfX19LHhlLm5vcm1hbD1mdW5jdGlvbihlLHQsbil7aWYoMyE9PWFyZ3VtZW50cy5sZW5ndGh8fCJudW1iZXIiIT10eXBlb2YgZXx8Im51bWJlciIhPXR5cGVvZiB0fHwibnVtYmVyIiE9dHlwZW9mIG4pdGhyb3cibm9ybWFsKCkgcmVxdWlyZXMgdGhyZWUgbnVtZXJpYyBhcmd1bWVudHMuIgp3dD1lLEV0PXQsU3Q9biwwIT09UnQmJihQdD09PWMuTk9STUFMX01PREVfQVVUTz9QdD1jLk5PUk1BTF9NT0RFX1NIQVBFOlB0PT09Yy5OT1JNQUxfTU9ERV9TSEFQRSYmKFB0PWMuTk9STUFMX01PREVfVkVSVEVYKSl9LHhlLnNhdmU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbiE9PXQ/bC5vcGVuKG4udG9EYXRhVVJMKCksIl9ibGFuayIpOmwub3Blbih4ZS5leHRlcm5hbHMuY2FudmFzLnRvRGF0YVVSTCgpLCJfYmxhbmsiKX0KdmFyIEFyPTAKeGUuc2F2ZUZyYW1lPWZ1bmN0aW9uKGUpe2U9PT10JiYoZT0ic2NyZWVuLSMjIyMucG5nIikKdmFyIG49ZS5yZXBsYWNlKC8jKy8sZnVuY3Rpb24oZSl7Zm9yKHZhciB0PSIiK0FyKys7dC5sZW5ndGg8ZS5sZW5ndGg7KXQ9IjAiK3QKcmV0dXJuIHR9KQp4ZS5zYXZlKG4pfQp2YXIgYnI9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHdyPVt0LHQsdF0sRXI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuX19pc0RpcnR5PSExLGUgaW5zdGFuY2VvZiBtKXRoaXMuZnJvbUhUTUxJbWFnZURhdGEoZSkKZWxzZSBpZih0fHxuKXt0aGlzLndpZHRoPWV8fDEsdGhpcy5oZWlnaHQ9dHx8MQp2YXIgcj10aGlzLnNvdXJjZUltZz1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpCnIud2lkdGg9dGhpcy53aWR0aCxyLmhlaWdodD10aGlzLmhlaWdodAp0aGlzLmltYWdlRGF0YT1yLmdldENvbnRleHQoIjJkIikuY3JlYXRlSW1hZ2VEYXRhKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpCmlmKHRoaXMuZm9ybWF0PW49PT1jLkFSR0J8fG49PT1jLkFMUEhBP246Yy5SR0IsdGhpcy5mb3JtYXQ9PT1jLlJHQilmb3IodmFyIGk9MyxzPXRoaXMuaW1hZ2VEYXRhLmRhdGEsbz1zLmxlbmd0aDtpPG87aSs9NClzW2ldPTI1NQp0aGlzLl9faXNEaXJ0eT0hMCx0aGlzLnVwZGF0ZVBpeGVscygpfWVsc2UgdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5pbWFnZURhdGE9YnIuY3JlYXRlSW1hZ2VEYXRhKDEsMSksdGhpcy5mb3JtYXQ9Yy5BUkdCCnRoaXMucGl4ZWxzPVkodGhpcyl9CkVyLnByb3RvdHlwZT17X19pc1BJbWFnZTohMCx1cGRhdGVQaXhlbHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNvdXJjZUltZwplJiZlIGluc3RhbmNlb2YgcCYmdGhpcy5fX2lzRGlydHkmJmUuZ2V0Q29udGV4dCgiMmQiKS5wdXRJbWFnZURhdGEodGhpcy5pbWFnZURhdGEsMCwwKSx0aGlzLl9faXNEaXJ0eT0hMX0sZnJvbUhUTUxJbWFnZURhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9WChlKQp0cnl7dmFyIG49dC5jb250ZXh0LmdldEltYWdlRGF0YSgwLDAsZS53aWR0aCxlLmhlaWdodCkKdGhpcy5mcm9tSW1hZ2VEYXRhKG4pfWNhdGNoKHQpe2Uud2lkdGgmJmUuaGVpZ2h0JiYodGhpcy5pc1JlbW90ZT0hMCx0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQpfXRoaXMuc291cmNlSW1nPWV9LGdldDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8yPT09YXJndW1lbnRzLmxlbmd0aD94ZS5nZXQoZSx0LHRoaXMpOjQ9PT1hcmd1bWVudHMubGVuZ3RoP3hlLmdldChlLHQsbixyLHRoaXMpOnZvaWQgMDp4ZS5nZXQodGhpcyl9LHNldDpmdW5jdGlvbihlLHQsbil7eGUuc2V0KGUsdCxuLHRoaXMpLHRoaXMuX19pc0RpcnR5PSEwfSxibGVuZDpmdW5jdGlvbihlLHQsbixyLGkscyxvLGEsbCxoKXs5PT09YXJndW1lbnRzLmxlbmd0aD94ZS5ibGVuZCh0aGlzLGUsdCxuLHIsaSxzLG8sYSxsLHRoaXMpOjEwPT09YXJndW1lbnRzLmxlbmd0aCYmeGUuYmxlbmQoZSx0LG4scixpLHMsbyxhLGwsaCx0aGlzKSxkZWxldGUgdGhpcy5zb3VyY2VJbWd9LGNvcHk6ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhLGwpezg9PT1hcmd1bWVudHMubGVuZ3RoP3hlLmJsZW5kKHRoaXMsZSx0LG4scixpLHMsbyxhLGMuUkVQTEFDRSx0aGlzKTo5PT09YXJndW1lbnRzLmxlbmd0aCYmeGUuYmxlbmQoZSx0LG4scixpLHMsbyxhLGwsYy5SRVBMQUNFLHRoaXMpLGRlbGV0ZSB0aGlzLnNvdXJjZUltZ30sZmlsdGVyOmZ1bmN0aW9uKGUsdCl7Mj09PWFyZ3VtZW50cy5sZW5ndGg/eGUuZmlsdGVyKGUsdCx0aGlzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmeGUuZmlsdGVyKGUsbnVsbCx0aGlzKSxkZWxldGUgdGhpcy5zb3VyY2VJbWd9LHNhdmU6ZnVuY3Rpb24oZSl7eGUuc2F2ZShlLHRoaXMpfSxyZXNpemU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IHJlc2l6ZS4iCmlmKDAhPT10aGlzLndpZHRofHwwIT09dGhpcy5oZWlnaHQpezA9PT1lJiYwIT09dD9lPU1hdGguZmxvb3IodGhpcy53aWR0aC90aGlzLmhlaWdodCp0KTowPT09dCYmMCE9PWUmJih0PU1hdGguZmxvb3IodGhpcy5oZWlnaHQvdGhpcy53aWR0aCplKSkKdmFyIG49WCh0aGlzLmltYWdlRGF0YSkuY2FudmFzLHI9WChuLGUsdCkuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLGUsdCkKdGhpcy5mcm9tSW1hZ2VEYXRhKHIpfX0sbWFzazpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy50b0ltYWdlRGF0YSgpCmlmKGUgaW5zdGFuY2VvZiBFcnx8ZS5fX2lzUEltYWdlKXtpZihlLndpZHRoIT09dGhpcy53aWR0aHx8ZS5oZWlnaHQhPT10aGlzLmhlaWdodCl0aHJvdyJtYXNrIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIFBJbWFnZS4iCmZvcihlPWUudG9JbWFnZURhdGEoKSx0PTIsbj10aGlzLndpZHRoKnRoaXMuaGVpZ2h0KjQ7dDxuO3QrPTQpci5kYXRhW3QrMV09ZS5kYXRhW3RdfWVsc2UgaWYoZSBpbnN0YW5jZW9mIEFycmF5KXtpZih0aGlzLndpZHRoKnRoaXMuaGVpZ2h0IT09ZS5sZW5ndGgpdGhyb3cibWFzayBhcnJheSBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyBQSW1hZ2UgcGl4ZWxzIGFycmF5LiIKZm9yKHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3Qpci5kYXRhWzQqdCszXT1lW3RdfXRoaXMuZnJvbUltYWdlRGF0YShyKX0sbG9hZFBpeGVsczp1LHRvSW1hZ2VEYXRhOmZ1bmN0aW9uKCl7aWYodGhpcy5pc1JlbW90ZSlyZXR1cm4gdGhpcy5zb3VyY2VJbWcKaWYoIXRoaXMuX19pc0RpcnR5KXJldHVybiB0aGlzLmltYWdlRGF0YQp2YXIgZT1YKHRoaXMuc291cmNlSW1nKQpyZXR1cm4gZS5jb250ZXh0LmdldEltYWdlRGF0YSgwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCl9LHRvRGF0YVVSTDpmdW5jdGlvbigpe2lmKHRoaXMuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgY3JlYXRlIGRhdGFVUkkuIgp2YXIgZT1YKHRoaXMuaW1hZ2VEYXRhKQpyZXR1cm4gZS5jYW52YXMudG9EYXRhVVJMKCl9LGZyb21JbWFnZURhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxpPXIuZ2V0Q29udGV4dCgiMmQiKQp0aGlzLndpZHRoPXIud2lkdGg9dCx0aGlzLmhlaWdodD1yLmhlaWdodD1uLGkucHV0SW1hZ2VEYXRhKGUsMCwwKSx0aGlzLmZvcm1hdD1jLkFSR0IsdGhpcy5pbWFnZURhdGE9ZSx0aGlzLnNvdXJjZUltZz1yfX0seGUuUEltYWdlPUVyLHhlLmNyZWF0ZUltYWdlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IEVyKGUsdCxuKX0seGUubG9hZEltYWdlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcgppZihiZS5pbWFnZUNhY2hlLmltYWdlc1tlXSlyZXR1cm4gcj1uZXcgRXIoYmUuaW1hZ2VDYWNoZS5pbWFnZXNbZV0pLHIubG9hZGVkPSEwLHIKcj1uZXcgRXIKdmFyIGk9aC5jcmVhdGVFbGVtZW50KCJpbWciKQpyZXR1cm4gci5zb3VyY2VJbWc9aSxpLm9ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSxpPXQscz1uCnJldHVybiBmdW5jdGlvbigpe2kuZnJvbUhUTUxJbWFnZURhdGEociksaS5sb2FkZWQ9ITAscyYmcygpfX0oaSxyLG4pLGkuc3JjPWUscn0seGUucmVxdWVzdEltYWdlPXhlLmxvYWRJbWFnZSx4ZS5nZXQ9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gdm9pZCAwIT09aT9aKGUsdCxuLHIsaSk6dm9pZCAwIT09cj9XKGUsdCxuLHIpOnZvaWQgMCE9PW4/SyhlLHQsbik6dm9pZCAwIT09dD9qKGUsdCk6dm9pZCAwIT09ZT9aKDAsMCxlLndpZHRoLGUuaGVpZ2h0LGUpOlcoMCwwLHhlLndpZHRoLHhlLmhlaWdodCl9LHhlLmNyZWF0ZUdyYXBoaWNzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgRQpyZXR1cm4gci5zaXplKGUsdCxuKSxyLmJhY2tncm91bmQoMCwwKSxyfSx4ZS5zZXQ9ZnVuY3Rpb24oZSx0LG4scil7Mz09PWFyZ3VtZW50cy5sZW5ndGg/Im51bWJlciI9PXR5cGVvZiBuP2VlKGUsdCxuKToobiBpbnN0YW5jZW9mIEVyfHxuLl9faXNQSW1hZ2UpJiZ4ZS5pbWFnZShuLGUsdCk6ND09PWFyZ3VtZW50cy5sZW5ndGgmJnRlKGUsdCxuLHIpfSx4ZS5pbWFnZURhdGE9e30seGUucGl4ZWxzPXtnZXRMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4geGUuaW1hZ2VEYXRhLmRhdGEubGVuZ3RoP3hlLmltYWdlRGF0YS5kYXRhLmxlbmd0aC80OjB9LGdldFBpeGVsOmZ1bmN0aW9uKGUpe3ZhciB0PTQqZSxuPXhlLmltYWdlRGF0YS5kYXRhCnJldHVybiBuW3QrM108PDI0JjQyNzgxOTAwODB8blt0KzBdPDwxNiYxNjcxMTY4MHxuW3QrMV08PDgmNjUyODB8MjU1Jm5bdCsyXX0sc2V0UGl4ZWw6ZnVuY3Rpb24oZSx0KXt2YXIgbj00KmUscj14ZS5pbWFnZURhdGEuZGF0YQpyW24rMF09KDE2NzExNjgwJnQpPj4+MTYscltuKzFdPSg2NTI4MCZ0KT4+PjgscltuKzJdPTI1NSZ0LHJbbiszXT0oNDI3ODE5MDA4MCZ0KT4+PjI0fSx0b0FycmF5OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9eGUuaW1hZ2VEYXRhLndpZHRoKnhlLmltYWdlRGF0YS5oZWlnaHQsbj14ZS5pbWFnZURhdGEuZGF0YSxyPTAsaT0wO3I8dDtyKyssaSs9NCllLnB1c2gobltpKzNdPDwyNCY0Mjc4MTkwMDgwfG5baSswXTw8MTYmMTY3MTE2ODB8bltpKzFdPDw4JjY1MjgwfDI1NSZuW2krMl0pCnJldHVybiBlfSxzZXQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXRoaXMuc2V0UGl4ZWwodCxlW3RdKX19LHhlLmxvYWRQaXhlbHM9ZnVuY3Rpb24oKXt4ZS5pbWFnZURhdGE9d2UuJGVuc3VyZUNvbnRleHQoKS5nZXRJbWFnZURhdGEoMCwwLHhlLndpZHRoLHhlLmhlaWdodCl9LHhlLnVwZGF0ZVBpeGVscz1mdW5jdGlvbigpe3hlLmltYWdlRGF0YSYmd2UuJGVuc3VyZUNvbnRleHQoKS5wdXRJbWFnZURhdGEoeGUuaW1hZ2VEYXRhLDAsMCl9LHhlLmhpbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9d2UuJGVuc3VyZUNvbnRleHQoKQplPT09Yy5ESVNBQkxFX0RFUFRIX1RFU1Q/KHQuZGlzYWJsZSh0LkRFUFRIX1RFU1QpLHQuZGVwdGhNYXNrKCExKSx0LmNsZWFyKHQuREVQVEhfQlVGRkVSX0JJVCkpOmU9PT1jLkVOQUJMRV9ERVBUSF9URVNUPyh0LmVuYWJsZSh0LkRFUFRIX1RFU1QpLHQuZGVwdGhNYXNrKCEwKSk6ZT09PWMuRU5BQkxFX09QRU5HTF8yWF9TTU9PVEh8fGU9PT1jLkVOQUJMRV9PUEVOR0xfNFhfU01PT1RIP3Z0PSEwOmU9PT1jLkRJU0FCTEVfT1BFTkdMXzJYX1NNT09USCYmKHZ0PSExKX0KdmFyIFNyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpCmlmKGUgaW5zdGFuY2VvZiBFcnx8ZS5fX2lzUEltYWdlKXtpZihpPWUsIWkubG9hZGVkKXRocm93IkVycm9yIHVzaW5nIGltYWdlIGluIGJhY2tncm91bmQoKTogUEltYWdlIG5vdCBsb2FkZWQuIgppZihpLndpZHRoIT09eGUud2lkdGh8fGkuaGVpZ2h0IT09eGUuaGVpZ2h0KXRocm93IkJhY2tncm91bmQgaW1hZ2UgbXVzdCBiZSB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBjYW52YXMuIn1lbHNlIGk9eGUuY29sb3IoZSx0LG4scikKTnQ9aX0KaXIucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oZSxuLHIsaSl7ZSE9PXQmJlNyKGUsbixyLGkpLE50IGluc3RhbmNlb2YgRXJ8fE50Ll9faXNQSW1hZ2U/KE4oKSxBZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHhlLmltYWdlKE50LDAsMCksRigpKTooTigpLEFlLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCkseGUuYWxwaGEoTnQpIT09a3QmJkFlLmNsZWFyUmVjdCgwLDAseGUud2lkdGgseGUuaGVpZ2h0KSxBZS5maWxsU3R5bGU9eGUuY29sb3IudG9TdHJpbmcoTnQpLEFlLmZpbGxSZWN0KDAsMCx4ZS53aWR0aCx4ZS5oZWlnaHQpLHV0PSEwLEYoKSl9LHNyLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKGUsdCxuLHIpe2FyZ3VtZW50cy5sZW5ndGg+MCYmU3IoZSx0LG4scikKdmFyIGk9eGUuY29sb3IudG9HTEFycmF5KE50KQpBZS5jbGVhckNvbG9yKGlbMF0saVsxXSxpWzJdLGlbM10pLEFlLmNsZWFyKEFlLkNPTE9SX0JVRkZFUl9CSVR8QWUuREVQVEhfQlVGRkVSX0JJVCl9LGlyLnByb3RvdHlwZS5pbWFnZT1mdW5jdGlvbihlLHQsbixyLGkpe2lmKHQ9TWF0aC5yb3VuZCh0KSxuPU1hdGgucm91bmQobiksZS53aWR0aD4wKXt2YXIgcz0ocnx8ZS53aWR0aCxpfHxlLmhlaWdodCxlcih0fHwwLG58fDAscnx8ZS53aWR0aCxpfHxlLmhlaWdodCxhcmd1bWVudHMubGVuZ3RoPDQpKSxvPSEhZS5zb3VyY2VJbWcmJm51bGw9PT1IdAppZihvKXt2YXIgYT1lLnNvdXJjZUltZwplLl9faXNEaXJ0eSYmZS51cGRhdGVQaXhlbHMoKSxBZS5kcmF3SW1hZ2UoYSwwLDAsYS53aWR0aCxhLmhlaWdodCxzLngscy55LHMudyxzLmgpfWVsc2V7dmFyIGw9ZS50b0ltYWdlRGF0YSgpCm51bGwhPT1IdCYmKEh0KGwpLGUuX19pc0RpcnR5PSEwKSxBZS5kcmF3SW1hZ2UoWChsKS5jYW52YXMsMCwwLGUud2lkdGgsZS5oZWlnaHQscy54LHMueSxzLncscy5oKX19fSxzci5wcm90b3R5cGUuaW1hZ2U9ZnVuY3Rpb24oZSx0LG4scixpKXtlLndpZHRoPjAmJih0PU1hdGgucm91bmQodCksbj1NYXRoLnJvdW5kKG4pLHI9cnx8ZS53aWR0aCxpPWl8fGUuaGVpZ2h0LHhlLmJlZ2luU2hhcGUoeGUuUVVBRFMpLHhlLnRleHR1cmUoZSkseGUudmVydGV4KHQsbiwwLDAsMCkseGUudmVydGV4KHQsbitpLDAsMCxpKSx4ZS52ZXJ0ZXgodCtyLG4raSwwLHIsaSkseGUudmVydGV4KHQrcixuLDAsciwwKSx4ZS5lbmRTaGFwZSgpKX0seGUudGludD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT14ZS5jb2xvcihlLHQsbixyKSxzPXhlLnJlZChpKS9CdCxvPXhlLmdyZWVuKGkpLyR0LGE9eGUuYmx1ZShpKS9HdCxsPXhlLmFscGhhKGkpL2t0Ckh0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmRhdGEsbj00KmUud2lkdGgqZS5oZWlnaHQscj0wO3I8bjspdFtyKytdKj1zLHRbcisrXSo9byx0W3IrK10qPWEsdFtyKytdKj1sfSxYdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOyllW3QrK109cyxlW3QrK109byxlW3QrK109YSxlW3QrK109bH19LHhlLm5vVGludD1mdW5jdGlvbigpe0h0PW51bGwsWHQ9bnVsbH0seGUuY29weT1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwsaCl7aD09PXQmJihoPWwsbD1hLGE9byxvPXMscz1pLGk9cixyPW4sbj1lLGU9eGUpLHhlLmJsZW5kKGUsbixyLGkscyxvLGEsbCxoLGMuUkVQTEFDRSl9LHhlLmJsZW5kPWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCxoLHUsYyl7aWYoZS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBibGVuZCBpbWFnZS4iCnU9PT10JiYodT1oLGg9bCxsPWEsYT1vLG89cyxzPWksaT1yLHI9bixuPWUsZT14ZSkKdmFyIGY9bitpLHA9citzLG09bytsLGc9YStoLGQ9Y3x8eGUKYyE9PXQmJnUhPT10fHx4ZS5sb2FkUGl4ZWxzKCksZS5sb2FkUGl4ZWxzKCksZT09PXhlJiZ4ZS5pbnRlcnNlY3QobixyLGYscCxvLGEsbSxnKT94ZS5ibGl0X3Jlc2l6ZSh4ZS5nZXQobixyLGYtbixwLXIpLDAsMCxmLW4tMSxwLXItMSxkLmltYWdlRGF0YS5kYXRhLGQud2lkdGgsZC5oZWlnaHQsbyxhLG0sZyx1KTp4ZS5ibGl0X3Jlc2l6ZShlLG4scixmLHAsZC5pbWFnZURhdGEuZGF0YSxkLndpZHRoLGQuaGVpZ2h0LG8sYSxtLGcsdSksYz09PXQmJnhlLnVwZGF0ZVBpeGVscygpfQp2YXIgUHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj14ZS5mbG9vcigzLjUqZSkKaWYobj1uPDE/MTpuPDI0OD9uOjI0OCx4ZS5zaGFyZWQuYmx1clJhZGl1cyE9PW4pe3hlLnNoYXJlZC5ibHVyUmFkaXVzPW4seGUuc2hhcmVkLmJsdXJLZXJuZWxTaXplPTErKHhlLnNoYXJlZC5ibHVyUmFkaXVzPDwxKSx4ZS5zaGFyZWQuYmx1cktlcm5lbD1uZXcgZyh4ZS5zaGFyZWQuYmx1cktlcm5lbFNpemUpCnZhciByPXhlLnNoYXJlZC5ibHVyS2VybmVsLGk9eGUuc2hhcmVkLmJsdXJLZXJuZWxTaXplCnhlLnNoYXJlZC5ibHVyUmFkaXVzCmZvcih0PTA7dDxpO3QrKylyW3RdPTAKdmFyIHM9KG4tMSkqKG4tMSkKZm9yKHQ9MTt0PG47dCsrKXJbbit0XT1yW24tdF09cwpyW25dPW4qbn19LENyPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyxhLGwsaCx1LGMsZixwLG0sZCx2LHk9dC5waXhlbHMuZ2V0TGVuZ3RoKCkseD1uZXcgZyh5KSxBPW5ldyBnKHkpLGI9bmV3IGcoeSksdz1uZXcgZyh5KSxFPTAKUHIoZSkKdmFyIFM9dC5oZWlnaHQsUD10LndpZHRoLEM9eGUuc2hhcmVkLmJsdXJLZXJuZWxTaXplLE09eGUuc2hhcmVkLmJsdXJSYWRpdXMsVD14ZS5zaGFyZWQuYmx1cktlcm5lbCxfPXQuaW1hZ2VEYXRhLmRhdGEKZm9yKG09MDttPFM7bSsrKXtmb3IocD0wO3A8UDtwKyspe2lmKHM9aT1yPW89bj0wLGw9cC1NLGw8MClmPS1sLGw9MAplbHNle2lmKGw+PVApYnJlYWsKZj0wfWZvcihkPWY7ZDxDJiYhKGw+PVApO2QrKyl2PTQqKGwrRSksYT1UW2RdLG8rPWEqX1t2KzNdLHIrPWEqX1t2XSxpKz1hKl9bdisxXSxzKz1hKl9bdisyXSxuKz1hLGwrKwpoPUUrcCx3W2hdPW8vbix4W2hdPXIvbixBW2hdPWkvbixiW2hdPXMvbn1FKz1QfWZvcihFPTAsdT0tTSxjPXUqUCxtPTA7bTxTO20rKyl7Zm9yKHA9MDtwPFA7cCsrKXtpZihzPWk9cj1vPW49MCx1PDApZj1oPS11LGw9cAplbHNle2lmKHU+PVMpYnJlYWsKZj0wLGg9dSxsPXArY31mb3IoZD1mO2Q8QyYmIShoPj1TKTtkKyspYT1UW2RdLG8rPWEqd1tsXSxyKz1hKnhbbF0saSs9YSpBW2xdLHMrPWEqYltsXSxuKz1hLGgrKyxsKz1QCnY9NCoocCtFKSxfW3ZdPXIvbixfW3YrMV09aS9uLF9bdisyXT1zL24sX1t2KzNdPW8vbn1FKz1QLGMrPVAsdSsrfX0sTXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvLGEsbCxoLHUsYyxmLHAsbSxnLHYseSx4LEE9MCxiPXQucGl4ZWxzLmdldExlbmd0aCgpLHc9bmV3IGQoYikKaWYoZSlmb3IoO0E8YjspZm9yKG49QSxyPUErdC53aWR0aDtBPHI7KWk9cz10LnBpeGVscy5nZXRQaXhlbChBKSxsPUEtMSxhPUErMSxoPUEtdC53aWR0aCx1PUErdC53aWR0aCxsPG4mJihsPUEpLGE+PXImJihhPUEpLGg8MCYmKGg9MCksdT49YiYmKHU9QSkscD10LnBpeGVscy5nZXRQaXhlbChoKSxmPXQucGl4ZWxzLmdldFBpeGVsKGwpLG09dC5waXhlbHMuZ2V0UGl4ZWwodSksYz10LnBpeGVscy5nZXRQaXhlbChhKSxvPTc3KihpPj4xNiYyNTUpKzE1MSooaT4+OCYyNTUpKzI4KigyNTUmaSksdj03NyooZj4+MTYmMjU1KSsxNTEqKGY+PjgmMjU1KSsyOCooMjU1JmYpLGc9NzcqKGM+PjE2JjI1NSkrMTUxKihjPj44JjI1NSkrMjgqKDI1NSZjKSx5PTc3KihwPj4xNiYyNTUpKzE1MSoocD4+OCYyNTUpKzI4KigyNTUmcCkseD03NyoobT4+MTYmMjU1KSsxNTEqKG0+PjgmMjU1KSsyOCooMjU1Jm0pLHY8byYmKHM9ZixvPXYpLGc8byYmKHM9YyxvPWcpLHk8byYmKHM9cCxvPXkpLHg8byYmKHM9bSxvPXgpLHdbQSsrXT1zCmVsc2UgZm9yKDtBPGI7KWZvcihuPUEscj1BK3Qud2lkdGg7QTxyOylpPXM9dC5waXhlbHMuZ2V0UGl4ZWwoQSksbD1BLTEsYT1BKzEsaD1BLXQud2lkdGgsdT1BK3Qud2lkdGgsbDxuJiYobD1BKSxhPj1yJiYoYT1BKSxoPDAmJihoPTApLHU+PWImJih1PUEpLHA9dC5waXhlbHMuZ2V0UGl4ZWwoaCksZj10LnBpeGVscy5nZXRQaXhlbChsKSxtPXQucGl4ZWxzLmdldFBpeGVsKHUpLGM9dC5waXhlbHMuZ2V0UGl4ZWwoYSksbz03NyooaT4+MTYmMjU1KSsxNTEqKGk+PjgmMjU1KSsyOCooMjU1JmkpLHY9NzcqKGY+PjE2JjI1NSkrMTUxKihmPj44JjI1NSkrMjgqKDI1NSZmKSxnPTc3KihjPj4xNiYyNTUpKzE1MSooYz4+OCYyNTUpKzI4KigyNTUmYykseT03NyoocD4+MTYmMjU1KSsxNTEqKHA+PjgmMjU1KSsyOCooMjU1JnApLHg9NzcqKG0+PjE2JjI1NSkrMTUxKihtPj44JjI1NSkrMjgqKDI1NSZtKSx2Pm8mJihzPWYsbz12KSxnPm8mJihzPWMsbz1nKSx5Pm8mJihzPXAsbz15KSx4Pm8mJihzPW0sbz14KSx3W0ErK109cwp0LnBpeGVscy5zZXQodyl9CnhlLmZpbHRlcj1mdW5jdGlvbihlLG4scil7dmFyIGkscyxvLGEKaWYoMz09PWFyZ3VtZW50cy5sZW5ndGg/KHIubG9hZFBpeGVscygpLGk9cik6KHhlLmxvYWRQaXhlbHMoKSxpPXhlKSxuPT09dCYmKG49bnVsbCksaS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBmaWx0ZXIgaW1hZ2UuIgp2YXIgbD1pLnBpeGVscy5nZXRMZW5ndGgoKQpzd2l0Y2goZSl7Y2FzZSBjLkJMVVI6dmFyIGg9bnx8MQpDcihoLGkpCmJyZWFrCmNhc2UgYy5HUkFZOmlmKGkuZm9ybWF0PT09Yy5BTFBIQSl7Zm9yKGE9MDthPGw7YSsrKXM9MjU1LWkucGl4ZWxzLmdldFBpeGVsKGEpLGkucGl4ZWxzLnNldFBpeGVsKGEsNDI3ODE5MDA4MHxzPDwxNnxzPDw4fHMpCmkuZm9ybWF0PWMuUkdCfWVsc2UgZm9yKGE9MDthPGw7YSsrKXM9aS5waXhlbHMuZ2V0UGl4ZWwoYSksbz03Nyoocz4+MTYmMjU1KSsxNTEqKHM+PjgmMjU1KSsyOCooMjU1JnMpPj44LGkucGl4ZWxzLnNldFBpeGVsKGEscyZjLkFMUEhBX01BU0t8bzw8MTZ8bzw8OHxvKQpicmVhawpjYXNlIGMuSU5WRVJUOmZvcihhPTA7YTxsO2ErKylpLnBpeGVscy5zZXRQaXhlbChhLDE2Nzc3MjE1XmkucGl4ZWxzLmdldFBpeGVsKGEpKQpicmVhawpjYXNlIGMuUE9TVEVSSVpFOmlmKG51bGw9PT1uKXRocm93IlVzZSBmaWx0ZXIoUE9TVEVSSVpFLCBpbnQgbGV2ZWxzKSBpbnN0ZWFkIG9mIGZpbHRlcihQT1NURVJJWkUpIgp2YXIgdT14ZS5mbG9vcihuKQppZih1PDJ8fHU+MjU1KXRocm93IkxldmVscyBtdXN0IGJlIGJldHdlZW4gMiBhbmQgMjU1IGZvciBmaWx0ZXIoUE9TVEVSSVpFLCBsZXZlbHMpIgp2YXIgZj11LTEKZm9yKGE9MDthPGw7YSsrKXt2YXIgcD1pLnBpeGVscy5nZXRQaXhlbChhKT4+MTYmMjU1LG09aS5waXhlbHMuZ2V0UGl4ZWwoYSk+PjgmMjU1LGc9MjU1JmkucGl4ZWxzLmdldFBpeGVsKGEpCnA9MjU1KihwKnU+PjgpL2YsbT0yNTUqKG0qdT4+OCkvZixnPTI1NSooZyp1Pj44KS9mLGkucGl4ZWxzLnNldFBpeGVsKGEsNDI3ODE5MDA4MCZpLnBpeGVscy5nZXRQaXhlbChhKXxwPDwxNnxtPDw4fGcpfWJyZWFrCmNhc2UgYy5PUEFRVUU6Zm9yKGE9MDthPGw7YSsrKWkucGl4ZWxzLnNldFBpeGVsKGEsNDI3ODE5MDA4MHxpLnBpeGVscy5nZXRQaXhlbChhKSkKaS5mb3JtYXQ9Yy5SR0IKYnJlYWsKY2FzZSBjLlRIUkVTSE9MRDppZihudWxsPT09biYmKG49LjUpLG48MHx8bj4xKXRocm93IkxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIGZvciBmaWx0ZXIoVEhSRVNIT0xELCBsZXZlbCkiCnZhciBkPXhlLmZsb29yKDI1NSpuKQpmb3IoYT0wO2E8bDthKyspe3ZhciB2PXhlLm1heCgoaS5waXhlbHMuZ2V0UGl4ZWwoYSkmYy5SRURfTUFTSyk+PjE2LHhlLm1heCgoaS5waXhlbHMuZ2V0UGl4ZWwoYSkmYy5HUkVFTl9NQVNLKT4+OCxpLnBpeGVscy5nZXRQaXhlbChhKSZjLkJMVUVfTUFTSykpCmkucGl4ZWxzLnNldFBpeGVsKGEsaS5waXhlbHMuZ2V0UGl4ZWwoYSkmYy5BTFBIQV9NQVNLfCh2PGQ/MDoxNjc3NzIxNSkpfWJyZWFrCmNhc2UgYy5FUk9ERTpNcighMCxpKQpicmVhawpjYXNlIGMuRElMQVRFOk1yKCExLGkpfWkudXBkYXRlUGl4ZWxzKCl9LHhlLnNoYXJlZD17ZnJhY1U6MCxpZlU6MCxmcmFjVjowLGlmVjowLHUxOjAsdTI6MCx2MTowLHYyOjAsc1g6MCxzWTowLGl3OjAsaXcxOjAsaWgxOjAsdWw6MCxsbDowLHVyOjAsbHI6MCxjVUw6MCxjTEw6MCxjVVI6MCxjTFI6MCxzcmNYT2Zmc2V0OjAsc3JjWU9mZnNldDowLHI6MCxnOjAsYjowLGE6MCxzcmNCdWZmZXI6bnVsbCxibHVyUmFkaXVzOjAsYmx1cktlcm5lbFNpemU6MCxibHVyS2VybmVsOm51bGx9LHhlLmludGVyc2VjdD1mdW5jdGlvbihlLHQsbixyLGkscyxvLGEpe3ZhciBsPW4tZSsxLGg9ci10KzEsdT1vLWkrMSxjPWEtcysxCmlmKGk8ZSl1Kz1pLWUsdT5sJiYodT1sKQplbHNle3ZhciBmPWwrZS1pCnU+ZiYmKHU9Zil9aWYoczx0KWMrPXMtdCxjPmgmJihjPWgpCmVsc2V7dmFyIHA9aCt0LXMKYz5wJiYoYz1wKX1yZXR1cm4hKHU8PTB8fGM8PTApfQp2YXIgVHI9e30KaWYoVHJbYy5CTEVORF09eGUubW9kZXMuYmxlbmQsVHJbYy5BRERdPXhlLm1vZGVzLmFkZCxUcltjLlNVQlRSQUNUXT14ZS5tb2Rlcy5zdWJ0cmFjdCxUcltjLkxJR0hURVNUXT14ZS5tb2Rlcy5saWdodGVzdCxUcltjLkRBUktFU1RdPXhlLm1vZGVzLmRhcmtlc3QsVHJbYy5SRVBMQUNFXT14ZS5tb2Rlcy5yZXBsYWNlLFRyW2MuRElGRkVSRU5DRV09eGUubW9kZXMuZGlmZmVyZW5jZSxUcltjLkVYQ0xVU0lPTl09eGUubW9kZXMuZXhjbHVzaW9uLFRyW2MuTVVMVElQTFldPXhlLm1vZGVzLm11bHRpcGx5LFRyW2MuU0NSRUVOXT14ZS5tb2Rlcy5zY3JlZW4sVHJbYy5PVkVSTEFZXT14ZS5tb2Rlcy5vdmVybGF5LFRyW2MuSEFSRF9MSUdIVF09eGUubW9kZXMuaGFyZF9saWdodCxUcltjLlNPRlRfTElHSFRdPXhlLm1vZGVzLnNvZnRfbGlnaHQsVHJbYy5ET0RHRV09eGUubW9kZXMuZG9kZ2UsVHJbYy5CVVJOXT14ZS5tb2Rlcy5idXJuLHhlLmJsaXRfcmVzaXplPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSxsLGgsdSxmLHApe3ZhciBtLGcKdDwwJiYodD0wKSxuPDAmJihuPTApLHI+PWUud2lkdGgmJihyPWUud2lkdGgtMSksaT49ZS5oZWlnaHQmJihpPWUuaGVpZ2h0LTEpCnZhciBkPXItdCx2PWktbix5PXUtbCx4PWYtaAppZighKHk8PTB8fHg8PTB8fGQ8PTB8fHY8PTB8fGw+PW98fGg+PWF8fHQ+PWUud2lkdGh8fG4+PWUuaGVpZ2h0KSl7dmFyIEE9TWF0aC5mbG9vcihkL3kqYy5QUkVDSVNJT05GKSxiPU1hdGguZmxvb3Iodi94KmMuUFJFQ0lTSU9ORiksdz14ZS5zaGFyZWQKdy5zcmNYT2Zmc2V0PU1hdGguZmxvb3IobDwwPy1sKkE6dCpjLlBSRUNJU0lPTkYpLHcuc3JjWU9mZnNldD1NYXRoLmZsb29yKGg8MD8taCpiOm4qYy5QUkVDSVNJT05GKSxsPDAmJih5Kz1sLGw9MCksaDwwJiYoeCs9aCxoPTApLHk9TWF0aC5taW4oeSxvLWwpLHg9TWF0aC5taW4oeCxhLWgpCnZhciBFLFM9aCpvK2wKdy5zcmNCdWZmZXI9ZS5pbWFnZURhdGEuZGF0YSx3Lml3PWUud2lkdGgsdy5pdzE9ZS53aWR0aC0xLHcuaWgxPWUuaGVpZ2h0LTEKdmFyIFAsQyxNLFQsXyxSLEw9KHhlLmZpbHRlcl9iaWxpbmVhcix4ZS5maWx0ZXJfbmV3X3NjYW5saW5lLFRyW3BdKSxJPWMuQUxQSEFfTUFTSyxEPWMuUkVEX01BU0ssTz1jLkdSRUVOX01BU0ssTj1jLkJMVUVfTUFTSyxGPWMuUFJFQ19NQVhWQUwsaz1jLlBSRUNJU0lPTkIsQj1jLlBSRUNfUkVEX1NISUZULCQ9Yy5QUkVDX0FMUEhBX1NISUZULEc9dy5zcmNCdWZmZXIsVj1NYXRoLm1pbgpmb3IoZz0wO2c8eDtnKyspe2Zvcih3LnNYPXcuc3JjWE9mZnNldCx3LmZyYWNWPXcuc3JjWU9mZnNldCZGLHcuaWZWPUYtdy5mcmFjVix3LnYxPSh3LnNyY1lPZmZzZXQ+PmspKncuaXcsdy52Mj1WKCh3LnNyY1lPZmZzZXQ+PmspKzEsdy5paDEpKncuaXcsbT0wO208eTttKyspQz00KihTK20pLEU9c1tDKzNdPDwyNCZJfHNbQ108PDE2JkR8c1tDKzFdPDw4Jk98c1tDKzJdJk4sdy5mcmFjVT13LnNYJkYsdy5pZlU9Ri13LmZyYWNVLHcudWw9dy5pZlUqdy5pZlY+Pmssdy5sbD13LmlmVSp3LmZyYWNWPj5rLHcudXI9dy5mcmFjVSp3LmlmVj4+ayx3LmxyPXcuZnJhY1Uqdy5mcmFjVj4+ayx3LnUxPXcuc1g+Pmssdy51Mj1WKHcudTErMSx3Lml3MSksTT00Kih3LnYxK3cudTEpLFQ9NCoody52MSt3LnUyKSxfPTQqKHcudjIrdy51MSksUj00Kih3LnYyK3cudTIpLHcuY1VMPUdbTSszXTw8MjQmSXxHW01dPDwxNiZEfEdbTSsxXTw8OCZPfEdbTSsyXSZOLHcuY1VSPUdbVCszXTw8MjQmSXxHW1RdPDwxNiZEfEdbVCsxXTw8OCZPfEdbVCsyXSZOLHcuY0xMPUdbXyszXTw8MjQmSXxHW19dPDwxNiZEfEdbXysxXTw8OCZPfEdbXysyXSZOLHcuY0xSPUdbUiszXTw8MjQmSXxHW1JdPDwxNiZEfEdbUisxXTw8OCZPfEdbUisyXSZOLHcucj13LnVsKigody5jVUwmRCk+PjE2KSt3LmxsKigody5jTEwmRCk+PjE2KSt3LnVyKigody5jVVImRCk+PjE2KSt3LmxyKigody5jTFImRCk+PjE2KTw8QiZELHcuZz13LnVsKih3LmNVTCZPKSt3LmxsKih3LmNMTCZPKSt3LnVyKih3LmNVUiZPKSt3LmxyKih3LmNMUiZPKT4+PmsmTyx3LmI9dy51bCoody5jVUwmTikrdy5sbCoody5jTEwmTikrdy51cioody5jVVImTikrdy5scioody5jTFImTik+Pj5rLHcuYT13LnVsKigody5jVUwmSSk+Pj4yNCkrdy5sbCooKHcuY0xMJkkpPj4+MjQpK3cudXIqKCh3LmNVUiZJKT4+PjI0KSt3LmxyKigody5jTFImSSk+Pj4yNCk8PCQmSSxQPUwoRSx3LmF8dy5yfHcuZ3x3LmIpLHNbQ109KFAmRCk+Pj4xNixzW0MrMV09KFAmTyk+Pj44LHNbQysyXT1QJk4sc1tDKzNdPShQJkkpPj4+MjQsdy5zWCs9QQpTKz1vLHcuc3JjWU9mZnNldCs9Yn19fSx4ZS5sb2FkRm9udD1mdW5jdGlvbihlLG4pe2lmKGU9PT10KXRocm93ImZvbnQgbmFtZSByZXF1aXJlZCBpbiBsb2FkRm9udC4iCmlmKGUuaW5kZXhPZigiLnN2ZyIpPT09LTEpcmV0dXJuIG49PT10JiYobj1sbi5zaXplKSxQRm9udC5nZXQoZSxuKQp2YXIgcj14ZS5sb2FkR2x5cGhzKGUpCnJldHVybntuYW1lOmUsY3NzOiIxMnB4IHNhbnMtc2VyaWYiLGdseXBoOiEwLHVuaXRzX3Blcl9lbTpyLnVuaXRzX3Blcl9lbSxob3Jpel9hZHZfeDoxL3IudW5pdHNfcGVyX2VtKnIuaG9yaXpfYWR2X3gsYXNjZW50OnIuYXNjZW50LGRlc2NlbnQ6ci5kZXNjZW50LHdpZHRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGgsaT0wO2k8cjtpKyspdHJ5e24rPXBhcnNlRmxvYXQoeGUuZ2x5cGhMb29rKHhlLmdseXBoVGFibGVbZV0sdFtpXSkuaG9yaXpfYWR2X3gpfWNhdGNoKGUpe0UuZGVidWcoZSl9cmV0dXJuIG4veGUuZ2x5cGhUYWJsZVtlXS51bml0c19wZXJfZW19fX0seGUuY3JlYXRlRm9udD1mdW5jdGlvbihlLHQpe3JldHVybiB4ZS5sb2FkRm9udChlLHQpfSx4ZS50ZXh0Rm9udD1mdW5jdGlvbihlLG4pe24hPT10JiYoZS5nbHlwaHx8KGU9UEZvbnQuZ2V0KGUubmFtZSxuKSkscm49biksbG49ZSxubj1sbi5uYW1lLHNuPWxuLmFzY2VudCxvbj1sbi5kZXNjZW50LGFuPWxuLmxlYWRpbmcKdmFyIHI9d2UuJGVuc3VyZUNvbnRleHQoKQpyLmZvbnQ9bG4uY3NzfSx4ZS50ZXh0U2l6ZT1mdW5jdGlvbihlKXtsbj1QRm9udC5nZXQobm4sZSkscm49ZSxzbj1sbi5hc2NlbnQsb249bG4uZGVzY2VudCxhbj1sbi5sZWFkaW5nCnZhciB0PXdlLiRlbnN1cmVDb250ZXh0KCkKdC5mb250PWxuLmNzc30seGUudGV4dEFzY2VudD1mdW5jdGlvbigpe3JldHVybiBzbn0seGUudGV4dERlc2NlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gb259LHhlLnRleHRMZWFkaW5nPWZ1bmN0aW9uKGUpe2FuPWV9LHhlLnRleHRBbGlnbj1mdW5jdGlvbihlLHQpe0p0PWUsZW49dHx8Yy5CQVNFTElORX0saXIucHJvdG90eXBlLnRleHRXaWR0aD1mdW5jdGlvbihlKXt2YXIgdCxuPW5lKGUpLnNwbGl0KC9ccj9cbi9nKSxyPTAsaT1uLmxlbmd0aApmb3IoQWUuZm9udD1sbi5jc3MsdD0wO3Q8aTsrK3Qpcj1NYXRoLm1heChyLGxuLm1lYXN1cmVUZXh0V2lkdGgoblt0XSkpCnJldHVybiAwfHJ9LHNyLnByb3RvdHlwZS50ZXh0V2lkdGg9ZnVuY3Rpb24oZSl7dmFyIG4scj1uZShlKS5zcGxpdCgvXHI/XG4vZyksaT0wLHM9ci5sZW5ndGgKRWU9PT10JiYoRWU9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSkKdmFyIG89RWUuZ2V0Q29udGV4dCgiMmQiKQpmb3Ioby5mb250PWxuLmNzcyxuPTA7bjxzOysrbilpPU1hdGgubWF4KGksby5tZWFzdXJlVGV4dChyW25dKS53aWR0aCkKcmV0dXJuIDB8aX0seGUuZ2x5cGhMb29rPWZ1bmN0aW9uKGUsdCl7dHJ5e3N3aXRjaCh0KXtjYXNlIjEiOnJldHVybiBlLm9uZQpjYXNlIjIiOnJldHVybiBlLnR3bwpjYXNlIjMiOnJldHVybiBlLnRocmVlCmNhc2UiNCI6cmV0dXJuIGUuZm91cgpjYXNlIjUiOnJldHVybiBlLmZpdmUKY2FzZSI2IjpyZXR1cm4gZS5zaXgKY2FzZSI3IjpyZXR1cm4gZS5zZXZlbgpjYXNlIjgiOnJldHVybiBlLmVpZ2h0CmNhc2UiOSI6cmV0dXJuIGUubmluZQpjYXNlIjAiOnJldHVybiBlLnplcm8KY2FzZSIgIjpyZXR1cm4gZS5zcGFjZQpjYXNlIiQiOnJldHVybiBlLmRvbGxhcgpjYXNlIiEiOnJldHVybiBlLmV4Y2xhbQpjYXNlJyInOnJldHVybiBlLnF1b3RlZGJsCmNhc2UiIyI6cmV0dXJuIGUubnVtYmVyc2lnbgpjYXNlIiUiOnJldHVybiBlLnBlcmNlbnQKY2FzZSImIjpyZXR1cm4gZS5hbXBlcnNhbmQKY2FzZSInIjpyZXR1cm4gZS5xdW90ZXNpbmdsZQpjYXNlIigiOnJldHVybiBlLnBhcmVubGVmdApjYXNlIikiOnJldHVybiBlLnBhcmVucmlnaHQKY2FzZSIqIjpyZXR1cm4gZS5hc3RlcmlzawpjYXNlIisiOnJldHVybiBlLnBsdXMKY2FzZSIsIjpyZXR1cm4gZS5jb21tYQpjYXNlIi0iOnJldHVybiBlLmh5cGhlbgpjYXNlIi4iOnJldHVybiBlLnBlcmlvZApjYXNlIi8iOnJldHVybiBlLnNsYXNoCmNhc2UiXyI6cmV0dXJuIGUudW5kZXJzY29yZQpjYXNlIjoiOnJldHVybiBlLmNvbG9uCmNhc2UiOyI6cmV0dXJuIGUuc2VtaWNvbG9uCmNhc2UiPCI6cmV0dXJuIGUubGVzcwpjYXNlIj0iOnJldHVybiBlLmVxdWFsCmNhc2UiPiI6cmV0dXJuIGUuZ3JlYXRlcgpjYXNlIj8iOnJldHVybiBlLnF1ZXN0aW9uCmNhc2UiQCI6cmV0dXJuIGUuYXQKY2FzZSJbIjpyZXR1cm4gZS5icmFja2V0bGVmdApjYXNlIlxcIjpyZXR1cm4gZS5iYWNrc2xhc2gKY2FzZSJdIjpyZXR1cm4gZS5icmFja2V0cmlnaHQKY2FzZSJeIjpyZXR1cm4gZS5hc2NpaWNpcmN1bQpjYXNlImAiOnJldHVybiBlLmdyYXZlCmNhc2UieyI6cmV0dXJuIGUuYnJhY2VsZWZ0CmNhc2UifCI6cmV0dXJuIGUuYmFyCmNhc2UifSI6cmV0dXJuIGUuYnJhY2VyaWdodApjYXNlIn4iOnJldHVybiBlLmFzY2lpdGlsZGUKZGVmYXVsdDpyZXR1cm4gZVt0XX19Y2F0Y2goZSl7RS5kZWJ1ZyhlKX19LGlyLnByb3RvdHlwZS50ZXh0JGxpbmU9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz0wLG89MAppZihsbi5nbHlwaCl7dmFyIGE9eGUuZ2x5cGhUYWJsZVtubl0KTigpLEFlLnRyYW5zbGF0ZSh0LG4rcm4pLGkhPT1jLlJJR0hUJiZpIT09Yy5DRU5URVJ8fChzPWEud2lkdGgoZSksbz1pPT09Yy5SSUdIVD8tczotcy8yKQp2YXIgbD1hLnVuaXRzX3Blcl9lbSxoPTEvbCpybgpBZS5zY2FsZShoLGgpCmZvcih2YXIgdT0wLGY9ZS5sZW5ndGg7dTxmO3UrKyl0cnl7eGUuZ2x5cGhMb29rKGEsZVt1XSkuZHJhdygpfWNhdGNoKGUpe0UuZGVidWcoZSl9RigpfWVsc2UgZSYmImZpbGxUZXh0ImluIEFlJiYodXQmJihBZS5maWxsU3R5bGU9eGUuY29sb3IudG9TdHJpbmcoaHQpLHV0PSExKSxpIT09Yy5SSUdIVCYmaSE9PWMuQ0VOVEVSfHwocz1sbi5tZWFzdXJlVGV4dFdpZHRoKGUpLG89aT09PWMuUklHSFQ/LXM6LXMvMiksQWUuZmlsbFRleHQoZSx0K28sbikpfSxzci5wcm90b3R5cGUudGV4dCRsaW5lPWZ1bmN0aW9uKGUsbixyLGkscyl7RWU9PT10JiYoRWU9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSkKdmFyIG89QWUKQWU9RWUuZ2V0Q29udGV4dCgiMmQiKSxBZS5mb250PWxuLmNzcwp2YXIgYT1sbi5tZWFzdXJlVGV4dFdpZHRoKGUpCkVlLndpZHRoPWEsRWUuaGVpZ2h0PXJuLEFlPUVlLmdldENvbnRleHQoIjJkIiksQWUuZm9udD1sbi5jc3MsQWUudGV4dEJhc2VsaW5lPSJ0b3AiLGlyLnByb3RvdHlwZS50ZXh0JGxpbmUoZSwwLDAsMCxjLkxFRlQpCnZhciBsPUVlLndpZHRoL0VlLmhlaWdodApBZT1vLEFlLmJpbmRUZXh0dXJlKEFlLlRFWFRVUkVfMkQsWWUpLEFlLnRleEltYWdlMkQoQWUuVEVYVFVSRV8yRCwwLEFlLlJHQkEsQWUuUkdCQSxBZS5VTlNJR05FRF9CWVRFLEVlKSxBZS50ZXhQYXJhbWV0ZXJpKEFlLlRFWFRVUkVfMkQsQWUuVEVYVFVSRV9NQUdfRklMVEVSLEFlLkxJTkVBUiksQWUudGV4UGFyYW1ldGVyaShBZS5URVhUVVJFXzJELEFlLlRFWFRVUkVfTUlOX0ZJTFRFUixBZS5MSU5FQVIpLEFlLnRleFBhcmFtZXRlcmkoQWUuVEVYVFVSRV8yRCxBZS5URVhUVVJFX1dSQVBfVCxBZS5DTEFNUF9UT19FREdFKSxBZS50ZXhQYXJhbWV0ZXJpKEFlLlRFWFRVUkVfMkQsQWUuVEVYVFVSRV9XUkFQX1MsQWUuQ0xBTVBfVE9fRURHRSkKdmFyIHU9MApzPT09Yy5SSUdIVD91PS1hOnM9PT1jLkNFTlRFUiYmKHU9LWEvMikKdmFyIGY9bmV3IGhyLHA9LjUqcm4KZi50cmFuc2xhdGUobit1LXAvMixyLXAsaSksZi5zY2FsZSgtbCpwLC1wLHApLGYudHJhbnNsYXRlKC0xLC0xLC0xKSxmLnRyYW5zcG9zZSgpCnZhciBtPW5ldyBocgptLnNjYWxlKDEsLTEsMSksbS5hcHBseSh0dC5hcnJheSgpKSxtLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oTGUpLF8oImFWZXJ0ZXgyZCIsTGUsImFWZXJ0ZXgiLDMsamUpLF8oImFUZXh0dXJlQ29vcmQyZCIsTGUsImFUZXh0dXJlQ29vcmQiLDIsS2UpLE0oInVTYW1wbGVyMmQiLExlLCJ1U2FtcGxlciIsWzBdKSxNKCJ1SXNEcmF3aW5nVGV4dDJkIixMZSwidUlzRHJhd2luZ1RleHQiLCEwKSxUKCJ1TW9kZWwyZCIsTGUsInVNb2RlbCIsITEsZi5hcnJheSgpKSxUKCJ1VmlldzJkIixMZSwidVZpZXciLCExLG0uYXJyYXkoKSksQygidUNvbG9yMmQiLExlLCJ1Q29sb3IiLGx0KSxBZS5iaW5kQnVmZmVyKEFlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLFdlKSxBZS5kcmF3RWxlbWVudHMoQWUuVFJJQU5HTEVTLDYsQWUuVU5TSUdORURfU0hPUlQsMCl9LHhlLnRleHQ9ZnVuY3Rpb24oKXt0biE9PWMuU0hBUEUmJigzPT09YXJndW1lbnRzLmxlbmd0aD9yZShuZShhcmd1bWVudHNbMF0pLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sMCk6ND09PWFyZ3VtZW50cy5sZW5ndGg/cmUobmUoYXJndW1lbnRzWzBdKSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSk6NT09PWFyZ3VtZW50cy5sZW5ndGg/aWUobmUoYXJndW1lbnRzWzBdKSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sMCk6Nj09PWFyZ3VtZW50cy5sZW5ndGgmJmllKG5lKGFyZ3VtZW50c1swXSksYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSkpfSx4ZS50ZXh0TW9kZT1mdW5jdGlvbihlKXt0bj1lfSx4ZS5sb2FkR2x5cGhzPWZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxzLG8sYSx1LGMsZixwLG0sZyxkPSJbMC05XFwtXSsiLHY9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT1bXSxzPW5ldyBSZWdFeHAoZSwiZyIpCmZvcihuPWlbcl09cy5leGVjKHQpO247KXIrKyxuPWlbcl09cy5leGVjKHQpCnJldHVybiBpfSx5PWZ1bmN0aW9uKGUpe3ZhciB0PXYoIltBLVphLXpdWzAtOVxcLSBdK3xaIixlKSxsPWZ1bmN0aW9uKCl7cmV0dXJuIE4oKSx3ZS4kZW5zdXJlQ29udGV4dCgpfSxoPWZ1bmN0aW9uKCl7eigpLFUoKSxGKCl9Cmc9InJldHVybiB7ZHJhdzpmdW5jdGlvbigpe3ZhciBjdXJDb250ZXh0PWJlZm9yZVBhdGhEcmF3KCk7Y3VyQ29udGV4dC5iZWdpblBhdGgoKTsiLG49MCxyPTAsaT0wLHM9MCxvPTAsYT0wLGU9MCxjPTAsZj0iIixwPXQubGVuZ3RoLTEKZm9yKHZhciB1PTA7dTxwO3UrKyl7dmFyIHk9dFt1XVswXSx4PXYoZCx5KQpzd2l0Y2goeVswXSl7Y2FzZSJNIjpuPXBhcnNlRmxvYXQoeFswXVswXSkscj1wYXJzZUZsb2F0KHhbMV1bMF0pLGcrPSJjdXJDb250ZXh0Lm1vdmVUbygiK24rIiwiKy1yKyIpOyIKYnJlYWsKY2FzZSJMIjpuPXBhcnNlRmxvYXQoeFswXVswXSkscj1wYXJzZUZsb2F0KHhbMV1bMF0pLGcrPSJjdXJDb250ZXh0LmxpbmVUbygiK24rIiwiKy1yKyIpOyIKYnJlYWsKY2FzZSJIIjpuPXBhcnNlRmxvYXQoeFswXVswXSksZys9ImN1ckNvbnRleHQubGluZVRvKCIrbisiLCIrLXIrIik7IgpicmVhawpjYXNlIlYiOnI9cGFyc2VGbG9hdCh4WzBdWzBdKSxnKz0iY3VyQ29udGV4dC5saW5lVG8oIituKyIsIistcisiKTsiCmJyZWFrCmNhc2UiVCI6bz1wYXJzZUZsb2F0KHhbMF1bMF0pLGE9cGFyc2VGbG9hdCh4WzFdWzBdKSwiUSI9PT1mfHwiVCI9PT1mPyhlPU1hdGguc3FydChNYXRoLnBvdyhuLWksMikrTWF0aC5wb3cocy1yLDIpKSxjPU1hdGguUEkrTWF0aC5hdGFuMihpLW4scy1yKSxpPW4rTWF0aC5zaW4oYykqZSxzPXIrTWF0aC5jb3MoYykqZSk6KGk9bixzPXIpLGcrPSJjdXJDb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oIitpKyIsIistcysiLCIrbysiLCIrLWErIik7IixuPW8scj1hCmJyZWFrCmNhc2UiUSI6aT1wYXJzZUZsb2F0KHhbMF1bMF0pLHM9cGFyc2VGbG9hdCh4WzFdWzBdKSxvPXBhcnNlRmxvYXQoeFsyXVswXSksYT1wYXJzZUZsb2F0KHhbM11bMF0pLGcrPSJjdXJDb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oIitpKyIsIistcysiLCIrbysiLCIrLWErIik7IixuPW8scj1hCmJyZWFrCmNhc2UiWiI6Zys9ImN1ckNvbnRleHQuY2xvc2VQYXRoKCk7In1mPXlbMF19cmV0dXJuIGcrPSJhZnRlclBhdGhEcmF3KCk7IixnKz0iY3VyQ29udGV4dC50cmFuc2xhdGUoIittKyIsMCk7IixnKz0ifX0iLG5ldyBGdW5jdGlvbigiYmVmb3JlUGF0aERyYXciLCJhZnRlclBhdGhEcmF3IixnKShsLGgpfSx4PWZ1bmN0aW9uKG4pe3ZhciByPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvbnQiKQp4ZS5nbHlwaFRhYmxlW2VdLmhvcml6X2Fkdl94PXJbMF0uZ2V0QXR0cmlidXRlKCJob3Jpei1hZHYteCIpCnZhciBpPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvbnQtZmFjZSIpWzBdCnhlLmdseXBoVGFibGVbZV0udW5pdHNfcGVyX2VtPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoInVuaXRzLXBlci1lbSIpKSx4ZS5nbHlwaFRhYmxlW2VdLmFzY2VudD1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJhc2NlbnQiKSkseGUuZ2x5cGhUYWJsZVtlXS5kZXNjZW50PXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRlc2NlbnQiKSkKZm9yKHZhciBzPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImdseXBoIiksbz1zLmxlbmd0aCxhPTA7YTxvO2ErKyl7dmFyIGw9c1thXS5nZXRBdHRyaWJ1dGUoInVuaWNvZGUiKSxoPXNbYV0uZ2V0QXR0cmlidXRlKCJnbHlwaC1uYW1lIikKbT1zW2FdLmdldEF0dHJpYnV0ZSgiaG9yaXotYWR2LXgiKSxudWxsPT09bSYmKG09eGUuZ2x5cGhUYWJsZVtlXS5ob3Jpel9hZHZfeCksdT1zW2FdLmdldEF0dHJpYnV0ZSgiZCIpLHUhPT10JiYoZz15KHUpLHhlLmdseXBoVGFibGVbZV1baF09e25hbWU6aCx1bmljb2RlOmwsaG9yaXpfYWR2X3g6bSxkcmF3OmcuZHJhd30pfX0sQT1mdW5jdGlvbigpe3ZhciB0CnRyeXt0PWguaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsIiIsbnVsbCl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgRS5kZWJ1ZyhlLm1lc3NhZ2UpfXRyeXt0LmFzeW5jPSExLHQubG9hZChlKSx4KHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN2ZyIpWzBdKX1jYXRjaCh0KXtFLmRlYnVnKHQpCnRyeXt2YXIgbj1uZXcgbC5YTUxIdHRwUmVxdWVzdApuLm9wZW4oIkdFVCIsZSwhMSksbi5zZW5kKG51bGwpLHgobi5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQpfWNhdGNoKGUpe0UuZGVidWcodCl9fX0KcmV0dXJuIHhlLmdseXBoVGFibGVbZV09e30sQShlKSx4ZS5nbHlwaFRhYmxlW2VdfSx4ZS5wYXJhbT1mdW5jdGlvbihlKXt2YXIgdD0iZGF0YS1wcm9jZXNzaW5nLSIrZQppZihkZS5oYXNBdHRyaWJ1dGUodCkpcmV0dXJuIGRlLmdldEF0dHJpYnV0ZSh0KQpmb3IodmFyIG49MCxyPWRlLmNoaWxkTm9kZXMubGVuZ3RoO248cjsrK24pe3ZhciBpPWRlLmNoaWxkTm9kZXMuaXRlbShuKQppZigxPT09aS5ub2RlVHlwZSYmInBhcmFtIj09PWkudGFnTmFtZS50b0xvd2VyQ2FzZSgpJiZpLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09ZSlyZXR1cm4gaS5nZXRBdHRyaWJ1dGUoInZhbHVlIil9cmV0dXJuIGJlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eShlKT9iZS5wYXJhbXNbZV06bnVsbH0sb3IucHJvdG90eXBlLnRyYW5zbGF0ZT1vZSgidHJhbnNsYXRlIiksb3IucHJvdG90eXBlLnRyYW5zZm9ybT1vZSgidHJhbnNmb3JtIiksb3IucHJvdG90eXBlLnNjYWxlPW9lKCJzY2FsZSIpLG9yLnByb3RvdHlwZS5wdXNoTWF0cml4PW9lKCJwdXNoTWF0cml4Iiksb3IucHJvdG90eXBlLnBvcE1hdHJpeD1vZSgicG9wTWF0cml4Iiksb3IucHJvdG90eXBlLnJlc2V0TWF0cml4PW9lKCJyZXNldE1hdHJpeCIpLG9yLnByb3RvdHlwZS5hcHBseU1hdHJpeD1vZSgiYXBwbHlNYXRyaXgiKSxvci5wcm90b3R5cGUucm90YXRlPW9lKCJyb3RhdGUiKSxvci5wcm90b3R5cGUucm90YXRlWj1vZSgicm90YXRlWiIpLG9yLnByb3RvdHlwZS5zaGVhclg9b2UoInNoZWFyWCIpLG9yLnByb3RvdHlwZS5zaGVhclk9b2UoInNoZWFyWSIpLG9yLnByb3RvdHlwZS5yZWRyYXc9b2UoInJlZHJhdyIpLG9yLnByb3RvdHlwZS50b0ltYWdlRGF0YT1vZSgidG9JbWFnZURhdGEiKSxvci5wcm90b3R5cGUuYW1iaWVudExpZ2h0PW9lKCJhbWJpZW50TGlnaHQiKSxvci5wcm90b3R5cGUuZGlyZWN0aW9uYWxMaWdodD1vZSgiZGlyZWN0aW9uYWxMaWdodCIpLG9yLnByb3RvdHlwZS5saWdodEZhbGxvZmY9b2UoImxpZ2h0RmFsbG9mZiIpLG9yLnByb3RvdHlwZS5saWdodFNwZWN1bGFyPW9lKCJsaWdodFNwZWN1bGFyIiksb3IucHJvdG90eXBlLnBvaW50TGlnaHQ9b2UoInBvaW50TGlnaHQiKSxvci5wcm90b3R5cGUubm9MaWdodHM9b2UoIm5vTGlnaHRzIiksb3IucHJvdG90eXBlLnNwb3RMaWdodD1vZSgic3BvdExpZ2h0Iiksb3IucHJvdG90eXBlLmJlZ2luQ2FtZXJhPW9lKCJiZWdpbkNhbWVyYSIpLG9yLnByb3RvdHlwZS5lbmRDYW1lcmE9b2UoImVuZENhbWVyYSIpLG9yLnByb3RvdHlwZS5mcnVzdHVtPW9lKCJmcnVzdHVtIiksb3IucHJvdG90eXBlLmJveD1vZSgiYm94Iiksb3IucHJvdG90eXBlLnNwaGVyZT1vZSgic3BoZXJlIiksb3IucHJvdG90eXBlLmFtYmllbnQ9b2UoImFtYmllbnQiKSxvci5wcm90b3R5cGUuZW1pc3NpdmU9b2UoImVtaXNzaXZlIiksb3IucHJvdG90eXBlLnNoaW5pbmVzcz1vZSgic2hpbmluZXNzIiksb3IucHJvdG90eXBlLnNwZWN1bGFyPW9lKCJzcGVjdWxhciIpLG9yLnByb3RvdHlwZS5maWxsPW9lKCJmaWxsIiksb3IucHJvdG90eXBlLnN0cm9rZT1vZSgic3Ryb2tlIiksb3IucHJvdG90eXBlLnN0cm9rZVdlaWdodD1vZSgic3Ryb2tlV2VpZ2h0Iiksb3IucHJvdG90eXBlLnNtb290aD1vZSgic21vb3RoIiksb3IucHJvdG90eXBlLm5vU21vb3RoPW9lKCJub1Ntb290aCIpLG9yLnByb3RvdHlwZS5wb2ludD1vZSgicG9pbnQiKSxvci5wcm90b3R5cGUudmVydGV4PW9lKCJ2ZXJ0ZXgiKSxvci5wcm90b3R5cGUuZW5kU2hhcGU9b2UoImVuZFNoYXBlIiksb3IucHJvdG90eXBlLmJlemllclZlcnRleD1vZSgiYmV6aWVyVmVydGV4Iiksb3IucHJvdG90eXBlLmN1cnZlVmVydGV4PW9lKCJjdXJ2ZVZlcnRleCIpLG9yLnByb3RvdHlwZS5jdXJ2ZT1vZSgiY3VydmUiKSxvci5wcm90b3R5cGUubGluZT1vZSgibGluZSIpLG9yLnByb3RvdHlwZS5iZXppZXI9b2UoImJlemllciIpLG9yLnByb3RvdHlwZS5yZWN0PW9lKCJyZWN0Iiksb3IucHJvdG90eXBlLmVsbGlwc2U9b2UoImVsbGlwc2UiKSxvci5wcm90b3R5cGUuYmFja2dyb3VuZD1vZSgiYmFja2dyb3VuZCIpLG9yLnByb3RvdHlwZS5pbWFnZT1vZSgiaW1hZ2UiKSxvci5wcm90b3R5cGUudGV4dFdpZHRoPW9lKCJ0ZXh0V2lkdGgiKSxvci5wcm90b3R5cGUudGV4dCRsaW5lPW9lKCJ0ZXh0JGxpbmUiKSxvci5wcm90b3R5cGUuJGVuc3VyZUNvbnRleHQ9b2UoIiRlbnN1cmVDb250ZXh0Iiksb3IucHJvdG90eXBlLiRuZXdQTWF0cml4PW9lKCIkbmV3UE1hdHJpeCIpLG9yLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKGUsdCxuKXtzZShuPT09Yy5XRUJHTD8iM0QiOiIyRCIpLHhlLnNpemUoZSx0LG4pfSxvci5wcm90b3R5cGUuJGluaXQ9dSxpci5wcm90b3R5cGUuJGluaXQ9ZnVuY3Rpb24oKXt4ZS5zaXplKHhlLndpZHRoLHhlLmhlaWdodCksQWUubGluZUNhcD0icm91bmQiLHhlLm5vU21vb3RoKCkseGUuZGlzYWJsZUNvbnRleHRNZW51KCl9LHNyLnByb3RvdHlwZS4kaW5pdD1mdW5jdGlvbigpe3hlLnVzZTNEQ29udGV4dD0hMCx4ZS5kaXNhYmxlQ29udGV4dE1lbnUoKX0scnIucHJvdG90eXBlLiRlbnN1cmVDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIEFlfSxkZS5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iil8fGRlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLDApLHZlKWJlPW5ldyBFLlNrZXRjaCxzZSgpLHhlLnNpemU9ZnVuY3Rpb24oZSx0LG4pe3NlKG4mJm49PT1jLldFQkdMPyIzRCI6IjJEIikseGUuc2l6ZShlLHQsbil9CmVsc2V7YmU9biBpbnN0YW5jZW9mIEUuU2tldGNoP246ImZ1bmN0aW9uIj09dHlwZW9mIG4/bmV3IEUuU2tldGNoKG4pOm4/RS5jb21waWxlKG4pOm5ldyBFLlNrZXRjaChmdW5jdGlvbigpe30pLHhlLmV4dGVybmFscy5za2V0Y2g9YmUsc2UoKSxkZS5vbmZvY3VzPWZ1bmN0aW9uKCl7eGUuZm9jdXNlZD0hMH0sZGUub25ibHVyPWZ1bmN0aW9uKCl7eGUuZm9jdXNlZD0hMSxiZS5vcHRpb25zLmdsb2JhbEtleUV2ZW50c3x8Y2UoKX0sYmUub3B0aW9ucy5wYXVzZU9uQmx1ciYmKHgobCwiZm9jdXMiLGZ1bmN0aW9uKCl7eXQmJnhlLmxvb3AoKX0pLHgobCwiYmx1ciIsZnVuY3Rpb24oKXt5dCYmZHQmJih4ZS5ub0xvb3AoKSx5dD0hMCksY2UoKX0pKQp2YXIgX3I9YmUub3B0aW9ucy5nbG9iYWxLZXlFdmVudHM/bDpkZQp4KF9yLCJrZXlkb3duIixwZSkseChfciwia2V5cHJlc3MiLG1lKSx4KF9yLCJrZXl1cCIsZ2UpCmZvcih2YXIgUnIgaW4gRS5saWIpRS5saWIuaGFzT3duUHJvcGVydHkoUnIpJiYoRS5saWJbUnJdLmhhc093blByb3BlcnR5KCJhdHRhY2giKT9FLmxpYltScl0uYXR0YWNoKHhlKTpFLmxpYltScl1pbnN0YW5jZW9mIEZ1bmN0aW9uJiZFLmxpYltScl0uY2FsbCh0aGlzKSkKdmFyIExyPTEwMCxJcj1mdW5jdGlvbihlKXtpZihiZS5pbWFnZUNhY2hlLnBlbmRpbmd8fFBGb250LnByZWxvYWRpbmcucGVuZGluZyhMcikpbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7SXIoZSl9LExyKQplbHNle2lmKGwub3BlcmEpe3ZhciB0LG4saT1iZS5pbWFnZUNhY2hlLm9wZXJhQ2FjaGUKZm9yKHQgaW4gaSlpLmhhc093blByb3BlcnR5KHQpJiYobj1pW3RdLG51bGwhPT1uJiZoLmJvZHkucmVtb3ZlQ2hpbGQobiksZGVsZXRlIGlbdF0pfWJlLmF0dGFjaChlLHIpLGJlLm9uTG9hZChlKSxlLnNldHVwJiYoZS5zZXR1cCgpLGUucmVzZXRNYXRyaXgoKSxiZS5vblNldHVwKCkpLHEoKSxlLmRyYXcmJih5dD9lLmxvb3AoKTplLnJlZHJhdygpKX19CmIodGhpcyksSXIoeGUpfX0KcmV0dXJuIEUuZGVidWc9ZnVuY3Rpb24oKXtyZXR1cm4iY29uc29sZSJpbiBsP2Z1bmN0aW9uKGUpe2wuY29uc29sZS5sb2coIlByb2Nlc3NpbmcuanM6ICIrZSl9OnV9KCksRS5wcm90b3R5cGU9cixFLmluc3RhbmNlcz14LEUuZ2V0SW5zdGFuY2VCeUlkPWZ1bmN0aW9uKGUpe3JldHVybiB4W0FbZV1dfSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBmdW5jdGlvbigpe3Rocm93IlByb2Nlc3NpbmcuanMgZG9lcyBub3Qgc3VwcG9ydCAiK2UrIi4ifX1mb3IodmFyIG4scixpPSJvcGVuKCkgY3JlYXRlT3V0cHV0KCkgY3JlYXRlSW5wdXQoKSBCdWZmZXJlZFJlYWRlciBzZWxlY3RGb2xkZXIoKSBkYXRhUGF0aCgpIGNyZWF0ZVdyaXRlcigpIHNlbGVjdE91dHB1dCgpIGJlZ2luUmVjb3JkKCkgc2F2ZVN0cmVhbSgpIGVuZFJlY29yZCgpIHNlbGVjdElucHV0KCkgc2F2ZUJ5dGVzKCkgY3JlYXRlUmVhZGVyKCkgYmVnaW5SYXcoKSBlbmRSYXcoKSBQcmludFdyaXRlciBkZWxheSgpIi5zcGxpdCgiICIpLHM9aS5sZW5ndGg7cy0tOyluPWlbc10scj1uLnJlcGxhY2UoIigpIiwiIiksZVtyXT10KG4pfShyKSxFfX0se31dLDI4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e3ZpcnRFcXVhbHM6ZSgiLi9IZWxwZXJzL3ZpcnRFcXVhbHMiKSx2aXJ0SGFzaENvZGU6ZSgiLi9IZWxwZXJzL3ZpcnRIYXNoQ29kZSIpLE9iamVjdEl0ZXJhdG9yOmUoIi4vSGVscGVycy9PYmplY3RJdGVyYXRvciIpLFBDb25zdGFudHM6ZSgiLi9IZWxwZXJzL1BDb25zdGFudHMiKSxBcnJheUxpc3Q6ZSgiLi9PYmplY3RzL0FycmF5TGlzdCIpLEhhc2hNYXA6ZSgiLi9PYmplY3RzL0hhc2hNYXAiKSxQVmVjdG9yOmUoIi4vT2JqZWN0cy9QVmVjdG9yIiksUEZvbnQ6ZSgiLi9PYmplY3RzL1BGb250IiksQ2hhcjplKCIuL09iamVjdHMvQ2hhciIpLFhNTEF0dHJpYnV0ZTplKCIuL09iamVjdHMvWE1MQXR0cmlidXRlIiksWE1MRWxlbWVudDplKCIuL09iamVjdHMvWE1MRWxlbWVudCIpLFBNYXRyaXgyRDplKCIuL09iamVjdHMvUE1hdHJpeDJEIiksUE1hdHJpeDNEOmUoIi4vT2JqZWN0cy9QTWF0cml4M0QiKSxQU2hhcGU6ZSgiLi9PYmplY3RzL1BTaGFwZSIpLGNvbG9yczplKCIuL09iamVjdHMvd2ViY29sb3JzIiksUFNoYXBlU1ZHOmUoIi4vT2JqZWN0cy9QU2hhcGVTVkciKSxDb21tb25GdW5jdGlvbnM6ZSgiLi9QNUZ1bmN0aW9ucy9jb21tb25GdW5jdGlvbnMiKSxkZWZhdWx0U2NvcGU6ZSgiLi9IZWxwZXJzL2RlZmF1bHRTY29wZSIpLFByb2Nlc3Npbmc6ZSgiLi9Qcm9jZXNzaW5nIiksc2V0dXBQYXJzZXI6ZSgiLi9QYXJzZXIvUGFyc2VyIiksZmluYWxpemU6ZSgiLi9IZWxwZXJzL2ZpbmFsaXplUHJvY2Vzc2luZyIpfQpyLmV4dGVuZD17d2l0aE1hdGg6ZSgiLi9QNUZ1bmN0aW9ucy9NYXRoLmpzIiksd2l0aFByb3h5RnVuY3Rpb25zOmUoIi4vUDVGdW5jdGlvbnMvSmF2YVByb3h5RnVuY3Rpb25zIikoci52aXJ0SGFzaENvZGUsci52aXJ0RXF1YWxzKSx3aXRoVG91Y2g6ZSgiLi9QNUZ1bmN0aW9ucy90b3VjaG1vdXNlIiksd2l0aENvbW1vbkZ1bmN0aW9uczpyLkNvbW1vbkZ1bmN0aW9ucy53aXRoQ29tbW9uRnVuY3Rpb25zfSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgaT1mdW5jdGlvbigpe30scz1yLnZpcnRFcXVhbHMsbz1yLnZpcnRIYXNoQ29kZSxhPXIuUENvbnN0YW50cyxsPXIuQ29tbW9uRnVuY3Rpb25zLGg9ci5PYmplY3RJdGVyYXRvcix1PXIuQ2hhcixjPXIuWE1MQXR0cmlidXRlKCksZj1yLkFycmF5TGlzdCh7dmlydEhhc2hDb2RlOm8sdmlydEVxdWFsczpzfSkscD1yLkhhc2hNYXAoe3ZpcnRIYXNoQ29kZTpvLHZpcnRFcXVhbHM6c30pLG09ci5QVmVjdG9yKHtQQ29uc3RhbnRzOmF9KSxnPXIuUEZvbnQoe0Jyb3dzZXI6dCxub29wOml9KSxkPXIuWE1MRWxlbWVudCh7QnJvd3Nlcjp0LFhNTEF0dHJpYnV0ZTpjfSksdj1yLlBNYXRyaXgyRCh7cDpsfSkseT1yLlBNYXRyaXgzRCh7cDpsfSkseD1yLlBTaGFwZSh7UENvbnN0YW50czphLFBNYXRyaXgyRDp2LFBNYXRyaXgzRDp5fSksQT1yLlBTaGFwZVNWRyh7Q29tbW9uRnVuY3Rpb25zOmwsUENvbnN0YW50czphLFBTaGFwZTp4LFhNTEVsZW1lbnQ6ZCxjb2xvcnM6ci5jb2xvcnN9KSxiPXIuZGVmYXVsdFNjb3BlKHtBcnJheUxpc3Q6ZixIYXNoTWFwOnAsUFZlY3RvcjptLFBGb250OmcsUFNoYXBlU1ZHOkEsT2JqZWN0SXRlcmF0b3I6aCxQQ29uc3RhbnRzOmEsQ2hhcjp1LFhNTEVsZW1lbnQ6ZCxYTUw6ZH0pLHc9ci5Qcm9jZXNzaW5nKHtkZWZhdWx0U2NvcGU6YixCcm93c2VyOnQsZXh0ZW5kOnIuZXh0ZW5kLG5vb3A6aX0pCnJldHVybiB3PXIuc2V0dXBQYXJzZXIodyx7QnJvd3Nlcjp0LGFGdW5jdGlvbnM6bixkZWZhdWx0U2NvcGU6Yn0pLHc9ci5maW5hbGl6ZSh3LHt2ZXJzaW9uOmUoIi4uL3BhY2thZ2UuanNvbiIpLnZlcnNpb24saXNEb21QcmVzZW50OnQuaXNEb21QcmVzZW50LHdpbmRvdzp0LndpbmRvdyxkb2N1bWVudDp0LmRvY3VtZW50LG5vb3A6aX0pfX0seyIuLi9wYWNrYWdlLmpzb24iOjIsIi4vSGVscGVycy9PYmplY3RJdGVyYXRvciI6MywiLi9IZWxwZXJzL1BDb25zdGFudHMiOjQsIi4vSGVscGVycy9kZWZhdWx0U2NvcGUiOjYsIi4vSGVscGVycy9maW5hbGl6ZVByb2Nlc3NpbmciOjcsIi4vSGVscGVycy92aXJ0RXF1YWxzIjo4LCIuL0hlbHBlcnMvdmlydEhhc2hDb2RlIjo5LCIuL09iamVjdHMvQXJyYXlMaXN0IjoxMCwiLi9PYmplY3RzL0NoYXIiOjExLCIuL09iamVjdHMvSGFzaE1hcCI6MTIsIi4vT2JqZWN0cy9QRm9udCI6MTMsIi4vT2JqZWN0cy9QTWF0cml4MkQiOjE0LCIuL09iamVjdHMvUE1hdHJpeDNEIjoxNSwiLi9PYmplY3RzL1BTaGFwZSI6MTYsIi4vT2JqZWN0cy9QU2hhcGVTVkciOjE3LCIuL09iamVjdHMvUFZlY3RvciI6MTgsIi4vT2JqZWN0cy9YTUxBdHRyaWJ1dGUiOjE5LCIuL09iamVjdHMvWE1MRWxlbWVudCI6MjAsIi4vT2JqZWN0cy93ZWJjb2xvcnMiOjIxLCIuL1A1RnVuY3Rpb25zL0phdmFQcm94eUZ1bmN0aW9ucyI6MjIsIi4vUDVGdW5jdGlvbnMvTWF0aC5qcyI6MjMsIi4vUDVGdW5jdGlvbnMvY29tbW9uRnVuY3Rpb25zIjoyNCwiLi9QNUZ1bmN0aW9ucy90b3VjaG1vdXNlIjoyNSwiLi9QYXJzZXIvUGFyc2VyIjoyNiwiLi9Qcm9jZXNzaW5nIjoyN31dfSx7fSxbMV0pCgogICAgPC9zY3JpcHQ+CiAgICAKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgICB3aW5kb3cub25lcnJvciA9IChtc2csIHVybCwgbGluZSwgY29sdW1uLCBlcnJvcikgPT4gewogICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsKICAgICAgICAgICAgbWVzc2FnZTogbXNnLAogICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgbGluZTogbGluZSwKICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sCiAgICAgICAgICAgIGVycm9yOiBKU09OLnN0cmluZ2lmeShlcnJvcikKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAod2luZG93LndlYmtpdCkgewogICAgICAgICAgICB3aW5kb3cud2Via2l0Lm1lc3NhZ2VIYW5kbGVycy5lcnJvci5wb3N0TWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFcnJvcjoiLCBtZXNzYWdlKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgPC9zY3JpcHQ+CiAgICAKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgICAvLyBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBmZXRjaCBJRCBvZiBza2V0Y2ggaHRtbCBlbGVtZW50CiAgICAgICAgZnVuY3Rpb24gZ2V0UHJvY2Vzc2luZ1NrZXRjaElEICgpIHsgcmV0dXJuICdTa2V0Y2gnOyB9CgogICAgPC9zY3JpcHQ+CiAgICAKICAgIDx0aXRsZT50aW08L3RpdGxlPgoKICA8L2hlYWQ+CgogIDxib2R5PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3Byb2Nlc3NpbmciPgogICAgICAKLy8gMC4yLjQKLy8gdGVzdGVycyByZWVmIG1pY2hhIGF0aGlsIGRvb2RsZQppbnQgWD03MDM7CmludCBZPTY2MTsKaW50IGd1blg9NzAzOwppbnQgZ3VuWT00NjE7CmludCBndW5zY29yZT0wOwppbnQgbW92ZXNjb3JlPTA7CmludCBzY29yZT0wOwppbnQgYWltc2NvcmU9MDsKaW50IHN0YXJ0PTA7CmludCBzcGVlZD0xOwppbnQgZ3Vuc3BlZWQ9MTsKaW50IGNoYW5nZT0xOwppbnQgc3BhY2U9MTAwOwppbnQgc3BhY2VMb2NrPTE7CmludCBzaG9vdGxvY2s9MDsKZmxvYXQgYmlvbWVDaG9vc2U9cmFuZG9tKDUuMSk7CmludCBiaW9tZTE9MzQ7CmludCBiaW9tZTI9MTM5OwppbnQgYmlvbWUzPTM0OwppbnQgYmlvbWVMb2NrPTE7CmludCBoZWFsdGg9MTAwMDsKaW50IHNub3dMb2NrPTE7CmludCBlbmVteVg9NDAwOwppbnQgZW5lbXlZPTQwMDsKZmxvYXQgZW5lbXlNb3ZlOwppbnQgbWF4SGVhbHRoPTEwMDA7Cgp2b2lkIHNldHVwKCl7CnNpemUoMTEwMCw4MDApOwpmaWxsKDApOwpzdHJva2VXZWlnaHQoMTAwKTsKYmFja2dyb3VuZChiaW9tZTEsYmlvbWUyLGJpb21lMyk7CnRleHQoInVzZSBXQVNEIHRvIG1vdmUgdGhlIGdyZWVuIHRhbmsuIHVzZSBJSktMIHRvIG1vdmUgdGhlIGJsYWNrIGNpcmNsZSBhaW1lci4gdXNlIHRoZSBudW1iZXJzIHRvIGNvbnRyb2wgc3BlZWQiLDUwLDUwKTsKdGV4dCgicHJlc3MgRiB0byBmaXJlIHRoZSBndW4gZ2V0IDEwMDAwMCBzY29yZSBpbiBhbGwgb2YgdGhlIHNjb3JlcyB0byB3aW4uIHByZXNzIEggdG8gaGVhbCIsNTAsMTAwKTsKdGV4dFNpemUoNzUpOwp0ZXh0KCJUQU5LIFNJTVVMQVRPUiBQUkVTUyBCIiw1MCw1MDApOwp0ZXh0U2l6ZSgyNSk7CnRleHQoIkVQTElQU1kgV0FSTklORyIsNzAwLDUwKTsKdGV4dFNpemUoNyk7CnRleHQoImRvbid0IHByZXNzIHNwYWNlIiw1MCw2MDApOwpzdHJva2UoMCwxMDAsMCk7CnN0cm9rZVdlaWdodCgxMDApOwpwb2ludCg0MDAsMjAwKTsKc3Ryb2tlKDApOwpzdHJva2VXZWlnaHQoNjApOwpwb2ludCg0MDAsMjAwKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApO30KCnZvaWQgZHJhdygpewppZiAoaGVhbHRoPm1heEhlYWx0aCl7CmhlYWx0aD1tYXhIZWFsdGg7fQp7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKc3Ryb2tlV2VpZ2h0KDUwKTsKbGluZSg0MDAsMjAwLDcwMCw0MDApOwpzdHJva2UoMCk7CnN0cm9rZVdlaWdodCg2MCk7CnBvaW50KDQwMCwyMDApOwppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2InKXsKc3RhcnQ9MTt9CnsKaWYgKFg8MCl7CmJpb21lQ2hvb3NlPXJhbmRvbSgxLDUuMSk7Clg9MTEwMDt9CnsKaWYgKFk+NzUwKXsKWT0xOwpiaW9tZUNob29zZT1yYW5kb20oMSw1LjEpO30KewppZiAoWTwwKXsKWT03NDk7CmJpb21lQ2hvb3NlPXJhbmRvbSgxLDUuMSk7fQp7CmlmIChYPjExMDApewpYPTE7CmJpb21lQ2hvb3NlPXJhbmRvbSgxLDUuMSk7fQp7CmlmIChndW5YPjExMDApewpndW5YPVg7fQp7CmlmIChndW5YPDApewpndW5YPVg7fQp7CmlmIChndW5ZPjc1MCl7Cmd1blk9WTt9CnsKaWYgKGd1blk8MCl7Cmd1blk9WTt9CnsKaWYgKHN0YXJ0PT0xKXsKdGV4dFNpemUoMTUpOwpiYWNrZ3JvdW5kKGJpb21lMSxiaW9tZTIsYmlvbWUzKTsKc3Ryb2tlV2VpZ2h0KDEwKTsKc3Ryb2tlKDApOwpsaW5lKDAsMCwxMTAwLDApOwpsaW5lKDAsMCwwLDgwMCk7CmxpbmUoMCw4MDAsMTEwMCw4MDApOwpsaW5lKDExMDAsMCwxMTAwLDgwMCk7CnRleHQoInNob290aW5nIHNjb3JlIiw1MCwzMCk7CnRleHQoZ3Vuc2NvcmUsNTAsNTApOwp0ZXh0KG1vdmVzY29yZSwyMDAsNTApOwp0ZXh0KCJtb3Zpbmcgc2NvcmUiLDIwMCwzMCk7CnRleHQoYWltc2NvcmUsNDAwLDUwKTsKdGV4dCgiYWltaW5nIHNjb3JlIiw0MDAsMzApOwpzY29yZT1haW1zY29yZStndW5zY29yZSttb3Zlc2NvcmU7CnRleHQoc2NvcmUsNTAwLDUwKTsKdGV4dCgiYmlvbWUiLDgwMCwzMCk7CnRleHQoInNjb3JlIiw1MDAsMzApOwpzdHJva2VXZWlnaHQoMTAwKTsKc3Ryb2tlKDApOwpzdHJva2UoMCwxMDAsMCk7CnBvaW50KFgsWSk7CnN0cm9rZVdlaWdodCgyNSk7CnN0cm9rZSgwKTsKcG9pbnQoZ3VuWCxndW5ZKTsKc3Ryb2tlV2VpZ2h0KDE1KTsKc3Ryb2tlKDM0LDEzOSwzNCk7CnBvaW50KGd1blgsZ3VuWSk7CnN0cm9rZVdlaWdodCg2NSk7CnN0cm9rZSgwKTsKdGV4dCgiaGVhbHRoIiw5MDAsMzApOwp0ZXh0KGhlYWx0aCw5MDAsNTApOwpwb2ludChYLFkpOwpzdHJva2UoMCk7CmZpbGwoMCk7CnRleHQoInRhbmsgc3BlZWQiLDY1MCwzMCk7CnRleHQoc3BlZWQsNjUwLDUwKTsKdGV4dCgibWF4IGhlYWx0aCIsMTAwMCwzMCk7CnRleHQobWF4SGVhbHRoLDEwMDAsNTApOwppZiAoc3BhY2VMb2NrPjApewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JyAnKXsKYmFja2dyb3VuZCgwKTsKZmlsbCgyNTUpOwp0ZXh0U2l6ZSg3NSk7CnRleHQoImRvbid0IHByZXNzIHNwYWNlIiwxMCw0MDApOwpzcGFjZT1zcGFjZS0xOwp0ZXh0KHNwYWNlLDEwLDYwMCk7CnRleHRTaXplKDEpO30KfXsKaWYgKHNwYWNlPDApewpiaW9tZUxvY2s9MjsKc3BhY2VMb2NrPTA7CnRleHRTaXplKHJhbmRvbSgxMDApKTsKZmlsbChyYW5kb20oMjU1KSxyYW5kb20oMjU1KSxyYW5kb20oMjU1KSk7CnN0cm9rZShyYW5kb20oMjU1KSxyYW5kb20oMjU1KSxyYW5kb20oMjU1KSk7CmJhY2tncm91bmQocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwpsaW5lKHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSxyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwpwb2ludChyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwpiZWdpblNoYXBlKCk7CnZlcnRleChyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwp2ZXJ0ZXgocmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKdmVydGV4KHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSk7CmVuZFNoYXBlKCk7CnNob290bG9jaz0xOwpndW5YPTEwMDAwMDAwMDA7Clg9MTAwMDAwMDAwMDsKdGV4dCgieW91IHByZXNzZWQgc3BhY2UiLHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSk7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nMScpewpzcGVlZD0xO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzInKXsKc3BlZWQ9Mjt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSczJyl7CnNwZWVkPTM7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nNCcpewpzcGVlZD00O30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzUnKXsKc3BlZWQ9NTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSc2Jyl7CnNwZWVkPTY7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nNycpewpzcGVlZD03O30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzgnKXsKc3BlZWQ9ODt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSc5Jyl7CnNwZWVkPTk7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0ndycpewpZPVktc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrMTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdzJyl7Clk9WStzcGVlZDsKbW92ZXNjb3JlPW1vdmVzY29yZSsxO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2QnKXsKWD1YK3NwZWVkOwptb3Zlc2NvcmU9bW92ZXNjb3JlKzE7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nYScpewpYPVgtc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrMTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdpJyl7Cmd1blk9Z3VuWS0yOwphaW1zY29yZT1haW1zY29yZSsxO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2snKXsKZ3VuWT1ndW5ZKzI7CmFpbXNjb3JlPWFpbXNjb3JlKzE7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nbCcpewpndW5YPWd1blgrMjsKYWltc2NvcmU9YWltc2NvcmUrMTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdqJyl7Cmd1blg9Z3VuWC0yO2FpbXNjb3JlPWFpbXNjb3JlKzE7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nZicpewpzdHJva2UocmFuZG9tKDEwMCwyNTUpLDAsMCk7Cmd1bnNjb3JlPWd1bnNjb3JlKzE7CnN0cm9rZVdlaWdodCg0OCk7CmxpbmUoWCxZLGd1blgsZ3VuWSk7CnN0cm9rZVdlaWdodCg1MSk7CnN0cm9rZSgwKTsKcG9pbnQoWCxZKTt9CnsKaWYgKGJpb21lTG9jaz09MSl7CmlmIChiaW9tZUNob29zZT4wLjU5KXsKaWYgKGJpb21lQ2hvb3NlPDIpewpiaW9tZTE9MzQ7CmJpb21lMj0xMzk7CmJpb21lMz0zNDsKdGV4dCgicGxhaW5zIiw4MDAsNTApOwplbmVteVg9NDAwOwplbmVteVk9NDAwO30KfXsKaWYgKGJpb21lQ2hvb3NlPjEuOTkpewppZiAoYmlvbWVDaG9vc2U8Myl7CmJpb21lMT0xMDU7CmJpb21lMj0xMDU7CmJpb21lMz0xMDU7CnN0cm9rZSgwKTsKdGV4dCgiTW91bnRhaW5zIiw4MDAsNTApOwplbmVteVg9NDAwOwplbmVteVk9NDAwO30KfXsKaWYgKGJpb21lQ2hvb3NlPjIuOTkpewppZiAoYmlvbWVDaG9vc2U8NCl7CmJpb21lMT0yNDA7CmJpb21lMj0yNDA7CmJpb21lMz05MDsKZW5lbXlNb3ZlPXJhbmRvbSg0KTsKc3Ryb2tlKDApOwpzdHJva2VXZWlnaHQoMTAwKTsKcG9pbnQoZW5lbXlYLGVuZW15WSk7CnRleHQoImRlc2VydCIsODAwLDUwKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApOwpoZWFsdGg9aGVhbHRoLTI7CnN0cm9rZVdlaWdodCg1MCk7CmxpbmUoZW5lbXlYLGVuZW15WSxYLFkpO30KfXsKaWYgKHNub3dMb2NrPT0xKXsKaWYgKGJpb21lQ2hvb3NlPjMuOTkpewppZiAoYmlvbWVDaG9vc2U8NC44MCk7ewpiaW9tZTE9MjU1OwpiaW9tZTI9MjUwOwpiaW9tZTM9MjU1Owp0ZXh0KCJzbm93Iiw4MDAsNTApOwplbmVteVg9NDAwOwplbmVteVk9NDAwO30KfX17CiAgaWYgKGJpb21lQ2hvb3NlPDUuMSl7CiAgICBzbm93TG9jaz0xO30KICAgIHsKaWYgKGJpb21lQ2hvb3NlPT01LjEpewogIGVuZW15WD00MDA7CiAgZW5lbXlZPTQwMDsKICBzbm93TG9jaz0wOwogIGJpb21lMT0xOwogIGJpb21lMj00MDsKICBiaW9tZTM9MTsKdGV4dCgid2FzdGVsYW5kIiw4MDAsNTApOwpzdHJva2UoMCk7CnN0cm9rZVdlaWdodCgxMDApOwpwb2ludCgyMDAsMjAwKTsKc3Ryb2tlV2VpZ2h0KDUwKTsKc3Ryb2tlKHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpKTsKbWF4SGVhbHRoPW1heEhlYWx0aC0yOwpmaWxsKHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpKTsKdGV4dFNpemUocmFuZG9tKDEwMCkpOwp0ZXh0KCJlc2NhcGUiLHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSk7CmZpbGwoMCk7CmxpbmUoMjAwLDIwMCxYLFkpOwpzcGVlZD0xO30KewppZiAoaGVhbHRoPDApewpzaG9vdGxvY2s9MTsKYmFja2dyb3VuZCgwKTsKZmlsbCgyNTUpOwp0ZXh0U2l6ZSgyNSk7CnRleHQoIml0cyBvdmVyIiw0MDAsNTAwKTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdoJyl7CmhlYWx0aD1oZWFsdGgrMTt9CnsKaWYgKGhlYWx0aD4xMDAwKXsKaGVhbHRoPTEwMDA7fQp7CmlmIChzaG9vdGxvY2s9PTApewppZiAobW91c2VQcmVzc2VkPT10cnVlKXsKZ3VuWD1tb3VzZVg7Cmd1blk9bW91c2VZOwpzdHJva2UocmFuZG9tKDEwMCwyNTUpLDAsMCk7CnN0cm9rZVdlaWdodCg0OCk7CmxpbmUoWCxZLGd1blgsZ3VuWSk7CnN0cm9rZVdlaWdodCg0MCk7CnN0cm9rZSgwKTsKcG9pbnQoWCxZKTsKYWltc2NvcmU9YWltc2NvcmUrMTsKZ3Vuc2NvcmU9Z3Vuc2NvcmUrMTt9Cn17CmlmIChlbmVteU1vdmU+MCk7ewppZiAoZW5lbXlNb3ZlPDEuMDEpewplbmVteVg9ZW5lbXlYKzM7fQp7CmlmIChlbmVteU1vdmU+MSl7CmlmIChlbmVteU1vdmU8Mi4wMSl7CmVuZW15WD1lbmVteVgtMzt9CnsKaWYgKGVuZW15TW92ZT4yKXsKaWYgKGVuZW15TW92ZTwzLjAxKXsKZW5lbXlZPWVuZW15WSszO30KewppZiAoZW5lbXlNb3ZlPjMpewppZiAoZW5lbXlNb3ZlPDQpewplbmVteVk9ZW5lbXlZLTM7fQp7CmlmIChndW5zY29yZT4xMDAwMDApewppZiAoc2NvcmU+MTAwMDAwKXsKaWYgKG1vdmVzY29yZT4xMDAwMDApewppZiAoYWltc2NvcmU+MTAwMDAwKXsKYmFja2dyb3VuZCgwKTsKdGV4dFNpemUoNzUpOwpmaWxsKHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpKTsKdGV4dCgiQ09OR1JBVFMgWU9VIEFSRSBOT1ciLDUwLDUwMCk7CnRleHQoIlRBTksgTE9SRCIsNTAsNjAwKTt9Cn19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fQoKCgogICAgPC9zY3JpcHQ+CiAgICAKICAgIDxjYW52YXMgaWQ9IlNrZXRjaCI+PC9jYW52YXM+CiAgICAKICA8L2JvZHk+CjwvaHRtbD4K