LyoqCiAqIHNlY3Rpb246IHhtbFdyaXRlcgogKiBzeW5vcHNpczogdXNlIHZhcmlvdXMgQVBJcyBmb3IgdGhlIHhtbFdyaXRlcgogKiBwdXJwb3NlOiB0ZXN0cyBhIG51bWJlciBvZiBBUElzIGZvciB0aGUgeG1sV3JpdGVyLCBlc3BlY2lhbGx5CiAqICAgICAgICAgIHRoZSB2YXJpb3VzIG1ldGhvZHMgdG8gd3JpdGUgdG8gYSBmaWxlbmFtZSwgdG8gYSBtZW1vcnkKICogICAgICAgICAgYnVmZmVyLCB0byBhIG5ldyBkb2N1bWVudCwgb3IgdG8gYSBzdWJ0cmVlLiBJdCBzaG93cyBob3cgdG8KICogICAgICAgICAgZG8gZW5jb2Rpbmcgc3RyaW5nIGNvbnZlcnNpb25zIHRvby4gVGhlIHJlc3VsdGluZwogKiAgICAgICAgICBkb2N1bWVudHMgYXJlIHRoZW4gc2VyaWFsaXplZC4KICogdXNhZ2U6IHRlc3RXcml0ZXIKICogdGVzdDogdGVzdFdyaXRlciA7IGZvciBpIGluIDEgMiAzIDQgOyBkbyBkaWZmIHdyaXRlci54bWwgd3JpdGVyJCRpLnJlcyA7IGRvbmUgOyBybSB3cml0ZXIqLnJlcwogKiBhdXRob3I6IEFsZnJlZCBNaWNrYXV0c2NoCiAqIGNvcHk6IHNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW5jb2RpbmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWx3cml0ZXIuaD4KCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCgojZGVmaW5lIE1ZX0VOQ09ESU5HICJJU08tODg1OS0xIgoKdm9pZCB0ZXN0WG1sd3JpdGVyRmlsZW5hbWUoY29uc3QgY2hhciAqdXJpKTsKdm9pZCB0ZXN0WG1sd3JpdGVyTWVtb3J5KGNvbnN0IGNoYXIgKmZpbGUpOwp2b2lkIHRlc3RYbWx3cml0ZXJEb2MoY29uc3QgY2hhciAqZmlsZSk7CnZvaWQgdGVzdFhtbHdyaXRlclRyZWUoY29uc3QgY2hhciAqZmlsZSk7CnhtbENoYXIgKkNvbnZlcnRJbnB1dChjb25zdCBjaGFyICppbiwgY29uc3QgY2hhciAqZW5jb2RpbmcpOwoKaW50Cm1haW4odm9pZCkKewogICAgLyoKICAgICAqIHRoaXMgaW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBhbmQgY2hlY2sgcG90ZW50aWFsIEFCSSBtaXNtYXRjaGVzCiAgICAgKiBiZXR3ZWVuIHRoZSB2ZXJzaW9uIGl0IHdhcyBjb21waWxlZCBmb3IgYW5kIHRoZSBhY3R1YWwgc2hhcmVkCiAgICAgKiBsaWJyYXJ5IHVzZWQuCiAgICAgKi8KICAgIExJQlhNTF9URVNUX1ZFUlNJT04KCiAgICAvKiBmaXJzdCwgdGhlIGZpbGUgdmVyc2lvbiAqLwogICAgdGVzdFhtbHdyaXRlckZpbGVuYW1lKCJ3cml0ZXIxLnJlcyIpOwoKICAgIC8qIG5leHQsIHRoZSBtZW1vcnkgdmVyc2lvbiAqLwogICAgdGVzdFhtbHdyaXRlck1lbW9yeSgid3JpdGVyMi5yZXMiKTsKCiAgICAvKiBuZXh0LCB0aGUgRE9NIHZlcnNpb24gKi8KICAgIHRlc3RYbWx3cml0ZXJEb2MoIndyaXRlcjMucmVzIik7CgogICAgLyogbmV4dCwgdGhlIHRyZWUgdmVyc2lvbiAqLwogICAgdGVzdFhtbHdyaXRlclRyZWUoIndyaXRlcjQucmVzIik7CgogICAgLyoKICAgICAqIENsZWFudXAgZnVuY3Rpb24gZm9yIHRoZSBYTUwgbGlicmFyeS4KICAgICAqLwogICAgeG1sQ2xlYW51cFBhcnNlcigpOwogICAgLyoKICAgICAqIHRoaXMgaXMgdG8gZGVidWcgbWVtb3J5IGZvciByZWdyZXNzaW9uIHRlc3RzCiAgICAgKi8KICAgIHhtbE1lbW9yeUR1bXAoKTsKICAgIHJldHVybiAwOwp9CgovKioKICogdGVzdFhtbHdyaXRlckZpbGVuYW1lOgogKiBAdXJpOiB0aGUgb3V0cHV0IFVSSQogKgogKiB0ZXN0IHRoZSB4bWxXcml0ZXIgaW50ZXJmYWNlIHdoZW4gd3JpdGluZyB0byBhIG5ldyBmaWxlCiAqLwp2b2lkCnRlc3RYbWx3cml0ZXJGaWxlbmFtZShjb25zdCBjaGFyICp1cmkpCnsKICAgIGludCByYzsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOwogICAgeG1sQ2hhciAqdG1wOwoKICAgIC8qIENyZWF0ZSBhIG5ldyBYbWxXcml0ZXIgZm9yIHVyaSwgd2l0aCBubyBjb21wcmVzc2lvbi4gKi8KICAgIHdyaXRlciA9IHhtbE5ld1RleHRXcml0ZXJGaWxlbmFtZSh1cmksIDApOwogICAgaWYgKHdyaXRlciA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGNyZWF0aW5nIHRoZSB4bWwgd3JpdGVyXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgdGhlIGRvY3VtZW50IHdpdGggdGhlIHhtbCBkZWZhdWx0IGZvciB0aGUgdmVyc2lvbiwKICAgICAqIGVuY29kaW5nIElTTyA4ODU5LTEgYW5kIHRoZSBkZWZhdWx0IGZvciB0aGUgc3RhbmRhbG9uZQogICAgICogZGVjbGFyYXRpb24uICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50KHdyaXRlciwgTlVMTCwgTVlfRU5DT0RJTkcsIE5VTEwpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RG9jdW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJFWEFNUExFIi4gU2luY2UgdGhpc3QgaXMgdGhlIGZpcnN0CiAgICAgKiBlbGVtZW50LCB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRVhBTVBMRSIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGEgY29tbWVudCBhcyBjaGlsZCBvZiBFWEFNUExFLgogICAgICogUGxlYXNlIG9ic2VydmUsIHRoYXQgdGhlIGlucHV0IHRvIHRoZSB4bWxUZXh0V3JpdGVyIGZ1bmN0aW9ucwogICAgICogSEFTIHRvIGJlIGluIFVURi04LCBldmVuIGlmIHRoZSBvdXRwdXQgWE1MIGlzIGVuY29kZWQKICAgICAqIGluIGlzby04ODU5LTEgKi8KICAgIHRtcCA9IENvbnZlcnRJbnB1dCgiVGhpcyBpcyBhIGNvbW1lbnQgd2l0aCBzcGVjaWFsIGNoYXJzOiA85Pb8PiIsCiAgICAgICAgICAgICAgICAgICAgICAgTVlfRU5DT0RJTkcpOwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVDb21tZW50KHdyaXRlciwgdG1wKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIk9SREVSIiBhcyBjaGlsZCBvZiBFWEFNUExFLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIk9SREVSIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckZpbGVuYW1lOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQWRkIGFuIGF0dHJpYnV0ZSB3aXRoIG5hbWUgInZlcnNpb24iIGFuZCB2YWx1ZSAiMS4wIiB0byBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKHdyaXRlciwgQkFEX0NBU1QgInZlcnNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgIjEuMCIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQWRkIGFuIGF0dHJpYnV0ZSB3aXRoIG5hbWUgInhtbDpsYW5nIiBhbmQgdmFsdWUgImRlIiB0byBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKHdyaXRlciwgQkFEX0NBU1QgInhtbDpsYW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICJkZSIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYSBjb21tZW50IGFzIGNoaWxkIG9mIE9SREVSICovCiAgICB0bXAgPSBDb252ZXJ0SW5wdXQoIjzk9vw+IiwgTVlfRU5DT0RJTkcpOwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDb21tZW50KHdyaXRlciwKCQkgICAgICJUaGlzIGlzIGFub3RoZXIgY29tbWVudCB3aXRoIHNwZWNpYWwgY2hhcnM6ICVzIiwKCQkgICAgIHRtcCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckZpbGVuYW1lOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDb21tZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodG1wICE9IE5VTEwpIHhtbEZyZWUodG1wKTsKCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJIRUFERVIiIGFzIGNoaWxkIG9mIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkhFQURFUiIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIlhfT1JERVJfSUQiIGFzIGNoaWxkIG9mIEhFQURFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJYX09SREVSX0lEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTAxMGQiLCA1MzUzNUwpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIkNVU1RPTUVSX0lEIiBhcyBjaGlsZCBvZiBIRUFERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiQ1VTVE9NRVJfSUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCIsIDEwMTApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIk5BTUVfMSIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJN/GxsZXIiLCBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiTkFNRV8xIiwgdG1wKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIk5BTUVfMiIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJK9nJnIiwgTVlfRU5DT0RJTkcpOwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIk5BTUVfMiIsIHRtcCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckZpbGVuYW1lOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodG1wICE9IE5VTEwpIHhtbEZyZWUodG1wKTsKCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBIRUFERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckZpbGVuYW1lOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkVOVFJJRVMiIGFzIGNoaWxkIG9mIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJJRVMiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJFTlRSWSIgYXMgY2hpbGQgb2YgRU5UUklFUy4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJFTlRSWSIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIkFSVElDTEUiIGFzIGNoaWxkIG9mIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkFSVElDTEUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICI8VGVzdD4iKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJFTlRSWV9OTyIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUllfTk8iLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBFTlRSWS4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlckVuZEVsZW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiRU5UUlkiIGFzIGNoaWxkIG9mIEVOVFJJRVMuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUlkiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJBUlRJQ0xFIiBhcyBjaGlsZCBvZiBFTlRSWS4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJBUlRJQ0xFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfQ0FTVCAiPFRlc3QgMj4iKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJFTlRSWV9OTyIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUllfTk8iLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBFTlRSWS4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlckVuZEVsZW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2xvc2UgdGhlIGVsZW1lbnQgbmFtZWQgRU5UUklFUy4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlckVuZEVsZW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiRk9PVEVSIiBhcyBjaGlsZCBvZiBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJGT09URVIiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJURVhUIiBhcyBjaGlsZCBvZiBGT09URVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiVEVYVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgIlRoaXMgaXMgYSB0ZXh0LiIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJGaWxlbmFtZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENsb3NlIHRoZSBlbGVtZW50IG5hbWVkIEZPT1RFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlckVuZEVsZW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogSGVyZSB3ZSBjb3VsZCBjbG9zZSB0aGUgZWxlbWVudHMgT1JERVIgYW5kIEVYQU1QTEUgdXNpbmcgdGhlCiAgICAgKiBmdW5jdGlvbiB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCwgYnV0IHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvCiAgICAgKiB3cml0ZSBhbnkgb3RoZXIgZWxlbWVudHMsIHdlIHNpbXBseSBjYWxsIHhtbFRleHRXcml0ZXJFbmREb2N1bWVudCwKICAgICAqIHdoaWNoIHdpbGwgZG8gYWxsIHRoZSB3b3JrLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRmlsZW5hbWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmREb2N1bWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHhtbEZyZWVUZXh0V3JpdGVyKHdyaXRlcik7Cn0KCi8qKgogKiB0ZXN0WG1sd3JpdGVyTWVtb3J5OgogKiBAZmlsZTogdGhlIG91dHB1dCBmaWxlCiAqCiAqIHRlc3QgdGhlIHhtbFdyaXRlciBpbnRlcmZhY2Ugd2hlbiB3cml0aW5nIHRvIG1lbW9yeQogKi8Kdm9pZAp0ZXN0WG1sd3JpdGVyTWVtb3J5KGNvbnN0IGNoYXIgKmZpbGUpCnsKICAgIGludCByYzsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsKICAgIHhtbENoYXIgKnRtcDsKICAgIEZJTEUgKmZwOwoKICAgIC8qIENyZWF0ZSBhIG5ldyBYTUwgYnVmZmVyLCB0byB3aGljaCB0aGUgWE1MIGRvY3VtZW50IHdpbGwgYmUKICAgICAqIHdyaXR0ZW4gKi8KICAgIGJ1ZiA9IHhtbEJ1ZmZlckNyZWF0ZSgpOwogICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBjcmVhdGluZyB0aGUgeG1sIGJ1ZmZlclxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENyZWF0ZSBhIG5ldyBYbWxXcml0ZXIgZm9yIG1lbW9yeSwgd2l0aCBubyBjb21wcmVzc2lvbi4KICAgICAqIFJlbWFyazogdGhlcmUgaXMgbm8gY29tcHJlc3Npb24gZm9yIHRoaXMga2luZCBvZiB4bWxUZXh0V3JpdGVyICovCiAgICB3cml0ZXIgPSB4bWxOZXdUZXh0V3JpdGVyTWVtb3J5KGJ1ZiwgMCk7CiAgICBpZiAod3JpdGVyID09IE5VTEwpIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGNyZWF0aW5nIHRoZSB4bWwgd3JpdGVyXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgdGhlIGRvY3VtZW50IHdpdGggdGhlIHhtbCBkZWZhdWx0IGZvciB0aGUgdmVyc2lvbiwKICAgICAqIGVuY29kaW5nIElTTyA4ODU5LTEgYW5kIHRoZSBkZWZhdWx0IGZvciB0aGUgc3RhbmRhbG9uZQogICAgICogZGVjbGFyYXRpb24uICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50KHdyaXRlciwgTlVMTCwgTVlfRU5DT0RJTkcsIE5VTEwpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiRVhBTVBMRSIuIFNpbmNlIHRoaXN0IGlzIHRoZSBmaXJzdAogICAgICogZWxlbWVudCwgdGhpcyB3aWxsIGJlIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVYQU1QTEUiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYSBjb21tZW50IGFzIGNoaWxkIG9mIEVYQU1QTEUuCiAgICAgKiBQbGVhc2Ugb2JzZXJ2ZSwgdGhhdCB0aGUgaW5wdXQgdG8gdGhlIHhtbFRleHRXcml0ZXIgZnVuY3Rpb25zCiAgICAgKiBIQVMgdG8gYmUgaW4gVVRGLTgsIGV2ZW4gaWYgdGhlIG91dHB1dCBYTUwgaXMgZW5jb2RlZAogICAgICogaW4gaXNvLTg4NTktMSAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJUaGlzIGlzIGEgY29tbWVudCB3aXRoIHNwZWNpYWwgY2hhcnM6IDzk9vw+IiwKICAgICAgICAgICAgICAgICAgICAgICBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnQod3JpdGVyLCB0bXApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIk9SREVSIiBhcyBjaGlsZCBvZiBFWEFNUExFLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIk9SREVSIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIEFkZCBhbiBhdHRyaWJ1dGUgd2l0aCBuYW1lICJ2ZXJzaW9uIiBhbmQgdmFsdWUgIjEuMCIgdG8gT1JERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZSh3cml0ZXIsIEJBRF9DQVNUICJ2ZXJzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICIxLjAiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBBZGQgYW4gYXR0cmlidXRlIHdpdGggbmFtZSAieG1sOmxhbmciIGFuZCB2YWx1ZSAiZGUiIHRvIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGUod3JpdGVyLCBCQURfQ0FTVCAieG1sOmxhbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgImRlIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYSBjb21tZW50IGFzIGNoaWxkIG9mIE9SREVSICovCiAgICB0bXAgPSBDb252ZXJ0SW5wdXQoIjzk9vw+IiwgTVlfRU5DT0RJTkcpOwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDb21tZW50KHdyaXRlciwKCQkgICAgICJUaGlzIGlzIGFub3RoZXIgY29tbWVudCB3aXRoIHNwZWNpYWwgY2hhcnM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdENvbW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkhFQURFUiIgYXMgY2hpbGQgb2YgT1JERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiSEVBREVSIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIlhfT1JERVJfSUQiIGFzIGNoaWxkIG9mIEhFQURFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJYX09SREVSX0lEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTAxMGQiLCA1MzUzNUwpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJDVVNUT01FUl9JRCIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkNVU1RPTUVSX0lEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQiLCAxMDEwKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiTkFNRV8xIiBhcyBjaGlsZCBvZiBIRUFERVIuICovCiAgICB0bXAgPSBDb252ZXJ0SW5wdXQoIk38bGxlciIsIE1ZX0VOQ09ESU5HKTsKICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJOQU1FXzEiLCB0bXApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIk5BTUVfMiIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJK9nJnIiwgTVlfRU5DT0RJTkcpOwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIk5BTUVfMiIsIHRtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRtcCAhPSBOVUxMKSB4bWxGcmVlKHRtcCk7CgogICAgLyogQ2xvc2UgdGhlIGVsZW1lbnQgbmFtZWQgSEVBREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJFTlRSSUVTIiBhcyBjaGlsZCBvZiBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJFTlRSSUVTIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkVOVFJZIiBhcyBjaGlsZCBvZiBFTlRSSUVTLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJZIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIkFSVElDTEUiIGFzIGNoaWxkIG9mIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkFSVElDTEUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICI8VGVzdD4iKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiRU5UUllfTk8iIGFzIGNoaWxkIG9mIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJZX05PIiwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENsb3NlIHRoZSBlbGVtZW50IG5hbWVkIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJFTlRSWSIgYXMgY2hpbGQgb2YgRU5UUklFUy4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJFTlRSWSIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJBUlRJQ0xFIiBhcyBjaGlsZCBvZiBFTlRSWS4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJBUlRJQ0xFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfQ0FTVCAiPFRlc3QgMj4iKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiRU5UUllfTk8iIGFzIGNoaWxkIG9mIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJZX05PIiwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENsb3NlIHRoZSBlbGVtZW50IG5hbWVkIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBFTlRSSUVTLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlck1lbW9yeTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJGT09URVIiIGFzIGNoaWxkIG9mIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkZPT1RFUiIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJURVhUIiBhcyBjaGlsZCBvZiBGT09URVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiVEVYVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgIlRoaXMgaXMgYSB0ZXh0LiIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJNZW1vcnk6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBGT09URVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIEhlcmUgd2UgY291bGQgY2xvc2UgdGhlIGVsZW1lbnRzIE9SREVSIGFuZCBFWEFNUExFIHVzaW5nIHRoZQogICAgICogZnVuY3Rpb24geG1sVGV4dFdyaXRlckVuZEVsZW1lbnQsIGJ1dCBzaW5jZSB3ZSBkbyBub3Qgd2FudCB0bwogICAgICogd3JpdGUgYW55IG90aGVyIGVsZW1lbnRzLCB3ZSBzaW1wbHkgY2FsbCB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQsCiAgICAgKiB3aGljaCB3aWxsIGRvIGFsbCB0aGUgd29yay4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlckVuZERvY3VtZW50KHdyaXRlcik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB4bWxGcmVlVGV4dFdyaXRlcih3cml0ZXIpOwoKICAgIGZwID0gZm9wZW4oZmlsZSwgInciKTsKICAgIGlmIChmcCA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyTWVtb3J5OiBFcnJvciBhdCBmb3BlblxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZwcmludGYoZnAsICIlcyIsIChjb25zdCBjaGFyICopIGJ1Zi0+Y29udGVudCk7CgogICAgZmNsb3NlKGZwKTsKCiAgICB4bWxCdWZmZXJGcmVlKGJ1Zik7Cn0KCi8qKgogKiB0ZXN0WG1sd3JpdGVyRG9jOgogKiBAZmlsZTogdGhlIG91dHB1dCBmaWxlCiAqCiAqIHRlc3QgdGhlIHhtbFdyaXRlciBpbnRlcmZhY2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBkb2N1bWVudAogKi8Kdm9pZAp0ZXN0WG1sd3JpdGVyRG9jKGNvbnN0IGNoYXIgKmZpbGUpCnsKICAgIGludCByYzsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOwogICAgeG1sQ2hhciAqdG1wOwogICAgeG1sRG9jUHRyIGRvYzsKCgogICAgLyogQ3JlYXRlIGEgbmV3IFhtbFdyaXRlciBmb3IgRE9NLCB3aXRoIG5vIGNvbXByZXNzaW9uLiAqLwogICAgd3JpdGVyID0geG1sTmV3VGV4dFdyaXRlckRvYygmZG9jLCAwKTsKICAgIGlmICh3cml0ZXIgPT0gTlVMTCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgY3JlYXRpbmcgdGhlIHhtbCB3cml0ZXJcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgeG1sIGRlZmF1bHQgZm9yIHRoZSB2ZXJzaW9uLAogICAgICogZW5jb2RpbmcgSVNPIDg4NTktMSBhbmQgdGhlIGRlZmF1bHQgZm9yIHRoZSBzdGFuZGFsb25lCiAgICAgKiBkZWNsYXJhdGlvbi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RG9jdW1lbnQod3JpdGVyLCBOVUxMLCBNWV9FTkNPRElORywgTlVMTCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnREb2N1bWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkVYQU1QTEUiLiBTaW5jZSB0aGlzdCBpcyB0aGUgZmlyc3QKICAgICAqIGVsZW1lbnQsIHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJFWEFNUExFIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYSBjb21tZW50IGFzIGNoaWxkIG9mIEVYQU1QTEUuCiAgICAgKiBQbGVhc2Ugb2JzZXJ2ZSwgdGhhdCB0aGUgaW5wdXQgdG8gdGhlIHhtbFRleHRXcml0ZXIgZnVuY3Rpb25zCiAgICAgKiBIQVMgdG8gYmUgaW4gVVRGLTgsIGV2ZW4gaWYgdGhlIG91dHB1dCBYTUwgaXMgZW5jb2RlZAogICAgICogaW4gaXNvLTg4NTktMSAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJUaGlzIGlzIGEgY29tbWVudCB3aXRoIHNwZWNpYWwgY2hhcnM6IDzk9vw+IiwKICAgICAgICAgICAgICAgICAgICAgICBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnQod3JpdGVyLCB0bXApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRtcCAhPSBOVUxMKSB4bWxGcmVlKHRtcCk7CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiT1JERVIiIGFzIGNoaWxkIG9mIEVYQU1QTEUuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiT1JERVIiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJEb2M6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBBZGQgYW4gYXR0cmlidXRlIHdpdGggbmFtZSAidmVyc2lvbiIgYW5kIHZhbHVlICIxLjAiIHRvIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGUod3JpdGVyLCBCQURfQ0FTVCAidmVyc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfQ0FTVCAiMS4wIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBBZGQgYW4gYXR0cmlidXRlIHdpdGggbmFtZSAieG1sOmxhbmciIGFuZCB2YWx1ZSAiZGUiIHRvIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGUod3JpdGVyLCBCQURfQ0FTVCAieG1sOmxhbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgImRlIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhIGNvbW1lbnQgYXMgY2hpbGQgb2YgT1JERVIgKi8KICAgIHRtcCA9IENvbnZlcnRJbnB1dCgiPOT2/D4iLCBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdENvbW1lbnQod3JpdGVyLAoJCSAiVGhpcyBpcyBhbm90aGVyIGNvbW1lbnQgd2l0aCBzcGVjaWFsIGNoYXJzOiAlcyIsCgkJICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q29tbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRtcCAhPSBOVUxMKSB4bWxGcmVlKHRtcCk7CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiSEVBREVSIiBhcyBjaGlsZCBvZiBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJIRUFERVIiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJEb2M6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJYX09SREVSX0lEIiBhcyBjaGlsZCBvZiBIRUFERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiWF9PUkRFUl9JRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMTBkIiwgNTM1MzVMKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiQ1VTVE9NRVJfSUQiIGFzIGNoaWxkIG9mIEhFQURFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJDVVNUT01FUl9JRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIiwgMTAxMCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIk5BTUVfMSIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJN/GxsZXIiLCBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiTkFNRV8xIiwgdG1wKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJEb2M6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIk5BTUVfMiIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJK9nJnIiwgTVlfRU5DT0RJTkcpOwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIk5BTUVfMiIsIHRtcCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodG1wICE9IE5VTEwpIHhtbEZyZWUodG1wKTsKCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBIRUFERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkVOVFJJRVMiIGFzIGNoaWxkIG9mIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJJRVMiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJEb2M6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJFTlRSWSIgYXMgY2hpbGQgb2YgRU5UUklFUy4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJFTlRSWSIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIkFSVElDTEUiIGFzIGNoaWxkIG9mIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkFSVElDTEUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICI8VGVzdD4iKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJEb2M6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJFTlRSWV9OTyIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUllfTk8iLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2xvc2UgdGhlIGVsZW1lbnQgbmFtZWQgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkVOVFJZIiBhcyBjaGlsZCBvZiBFTlRSSUVTLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJZIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiQVJUSUNMRSIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiQVJUSUNMRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgIjxUZXN0IDI+Iik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiRU5UUllfTk8iIGFzIGNoaWxkIG9mIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJZX05PIiwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENsb3NlIHRoZSBlbGVtZW50IG5hbWVkIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBFTlRSSUVTLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBTdGFydCBhbiBlbGVtZW50IG5hbWVkICJGT09URVIiIGFzIGNoaWxkIG9mIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkZPT1RFUiIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIlRFWFQiIGFzIGNoaWxkIG9mIEZPT1RFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJURVhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfQ0FTVCAiVGhpcyBpcyBhIHRleHQuIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyRG9jOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2xvc2UgdGhlIGVsZW1lbnQgbmFtZWQgRk9PVEVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBIZXJlIHdlIGNvdWxkIGNsb3NlIHRoZSBlbGVtZW50cyBPUkRFUiBhbmQgRVhBTVBMRSB1c2luZyB0aGUKICAgICAqIGZ1bmN0aW9uIHhtbFRleHRXcml0ZXJFbmRFbGVtZW50LCBidXQgc2luY2Ugd2UgZG8gbm90IHdhbnQgdG8KICAgICAqIHdyaXRlIGFueSBvdGhlciBlbGVtZW50cywgd2Ugc2ltcGx5IGNhbGwgeG1sVGV4dFdyaXRlckVuZERvY3VtZW50LAogICAgICogd2hpY2ggd2lsbCBkbyBhbGwgdGhlIHdvcmsuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJFbmREb2N1bWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlckRvYzogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZERvY3VtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgeG1sRnJlZVRleHRXcml0ZXIod3JpdGVyKTsKCiAgICB4bWxTYXZlRmlsZUVuYyhmaWxlLCBkb2MsIE1ZX0VOQ09ESU5HKTsKCiAgICB4bWxGcmVlRG9jKGRvYyk7Cn0KCi8qKgogKiB0ZXN0WG1sd3JpdGVyVHJlZToKICogQGZpbGU6IHRoZSBvdXRwdXQgZmlsZQogKgogKiB0ZXN0IHRoZSB4bWxXcml0ZXIgaW50ZXJmYWNlIHdoZW4gd3JpdGluZyB0byBhIHN1YnRyZWUKICovCnZvaWQKdGVzdFhtbHdyaXRlclRyZWUoY29uc3QgY2hhciAqZmlsZSkKewogICAgaW50IHJjOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgeG1sTm9kZVB0ciBub2RlOwogICAgeG1sQ2hhciAqdG1wOwoKICAgIC8qIENyZWF0ZSBhIG5ldyBYTUwgRE9NIHRyZWUsIHRvIHdoaWNoIHRoZSBYTUwgZG9jdW1lbnQgd2lsbCBiZQogICAgICogd3JpdHRlbiAqLwogICAgZG9jID0geG1sTmV3RG9jKEJBRF9DQVNUIFhNTF9ERUZBVUxUX1ZFUlNJT04pOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGNyZWF0aW5nIHRoZSB4bWwgZG9jdW1lbnQgdHJlZVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENyZWF0ZSBhIG5ldyBYTUwgbm9kZSwgdG8gd2hpY2ggdGhlIFhNTCBkb2N1bWVudCB3aWxsIGJlCiAgICAgKiBhcHBlbmRlZCAqLwogICAgbm9kZSA9IHhtbE5ld0RvY05vZGUoZG9jLCBOVUxMLCBCQURfQ0FTVCAiRVhBTVBMRSIsIE5VTEwpOwogICAgaWYgKG5vZGUgPT0gTlVMTCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGNyZWF0aW5nIHRoZSB4bWwgbm9kZVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIE1ha2UgRUxFTUVOVCB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlICovCiAgICB4bWxEb2NTZXRSb290RWxlbWVudChkb2MsIG5vZGUpOwoKICAgIC8qIENyZWF0ZSBhIG5ldyBYbWxXcml0ZXIgZm9yIERPTSB0cmVlLCB3aXRoIG5vIGNvbXByZXNzaW9uLiAqLwogICAgd3JpdGVyID0geG1sTmV3VGV4dFdyaXRlclRyZWUoZG9jLCBub2RlLCAwKTsKICAgIGlmICh3cml0ZXIgPT0gTlVMTCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGNyZWF0aW5nIHRoZSB4bWwgd3JpdGVyXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgdGhlIGRvY3VtZW50IHdpdGggdGhlIHhtbCBkZWZhdWx0IGZvciB0aGUgdmVyc2lvbiwKICAgICAqIGVuY29kaW5nIElTTyA4ODU5LTEgYW5kIHRoZSBkZWZhdWx0IGZvciB0aGUgc3RhbmRhbG9uZQogICAgICogZGVjbGFyYXRpb24uICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50KHdyaXRlciwgTlVMTCwgTVlfRU5DT0RJTkcsIE5VTEwpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYSBjb21tZW50IGFzIGNoaWxkIG9mIEVYQU1QTEUuCiAgICAgKiBQbGVhc2Ugb2JzZXJ2ZSwgdGhhdCB0aGUgaW5wdXQgdG8gdGhlIHhtbFRleHRXcml0ZXIgZnVuY3Rpb25zCiAgICAgKiBIQVMgdG8gYmUgaW4gVVRGLTgsIGV2ZW4gaWYgdGhlIG91dHB1dCBYTUwgaXMgZW5jb2RlZAogICAgICogaW4gaXNvLTg4NTktMSAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJUaGlzIGlzIGEgY29tbWVudCB3aXRoIHNwZWNpYWwgY2hhcnM6IDzk9vw+IiwKICAgICAgICAgICAgICAgICAgICAgICBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnQod3JpdGVyLCB0bXApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIk9SREVSIiBhcyBjaGlsZCBvZiBFWEFNUExFLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIk9SREVSIik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIEFkZCBhbiBhdHRyaWJ1dGUgd2l0aCBuYW1lICJ2ZXJzaW9uIiBhbmQgdmFsdWUgIjEuMCIgdG8gT1JERVIuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZSh3cml0ZXIsIEJBRF9DQVNUICJ2ZXJzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICIxLjAiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQWRkIGFuIGF0dHJpYnV0ZSB3aXRoIG5hbWUgInhtbDpsYW5nIiBhbmQgdmFsdWUgImRlIiB0byBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKHdyaXRlciwgQkFEX0NBU1QgInhtbDpsYW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICJkZSIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhIGNvbW1lbnQgYXMgY2hpbGQgb2YgT1JERVIgKi8KICAgIHRtcCA9IENvbnZlcnRJbnB1dCgiPOT2/D4iLCBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdENvbW1lbnQod3JpdGVyLAoJCQkgIlRoaXMgaXMgYW5vdGhlciBjb21tZW50IHdpdGggc3BlY2lhbCBjaGFyczogJXMiLAoJCQkJCSAgdG1wKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q29tbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRtcCAhPSBOVUxMKSB4bWxGcmVlKHRtcCk7CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiSEVBREVSIiBhcyBjaGlsZCBvZiBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJIRUFERVIiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiWF9PUkRFUl9JRCIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIlhfT1JERVJfSUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDEwZCIsIDUzNTM1TCk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmCiAgICAgICAgICAgICgidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJDVVNUT01FUl9JRCIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkNVU1RPTUVSX0lEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQiLCAxMDEwKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIk5BTUVfMSIgYXMgY2hpbGQgb2YgSEVBREVSLiAqLwogICAgdG1wID0gQ29udmVydElucHV0KCJN/GxsZXIiLCBNWV9FTkNPRElORyk7CiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiTkFNRV8xIiwgdG1wKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodG1wICE9IE5VTEwpIHhtbEZyZWUodG1wKTsKCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJOQU1FXzIiIGFzIGNoaWxkIG9mIEhFQURFUi4gKi8KICAgIHRtcCA9IENvbnZlcnRJbnB1dCgiSvZyZyIsIE1ZX0VOQ09ESU5HKTsKICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJOQU1FXzIiLCB0bXApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0bXAgIT0gTlVMTCkgeG1sRnJlZSh0bXApOwoKICAgIC8qIENsb3NlIHRoZSBlbGVtZW50IG5hbWVkIEhFQURFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlckVuZEVsZW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFN0YXJ0IGFuIGVsZW1lbnQgbmFtZWQgIkVOVFJJRVMiIGFzIGNoaWxkIG9mIE9SREVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIkVOVFJJRVMiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiRU5UUlkiIGFzIGNoaWxkIG9mIEVOVFJJRVMuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUlkiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiQVJUSUNMRSIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiQVJUSUNMRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgIjxUZXN0PiIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBXcml0ZSBhbiBlbGVtZW50IG5hbWVkICJFTlRSWV9OTyIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUllfTk8iLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYKICAgICAgICAgICAgKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENsb3NlIHRoZSBlbGVtZW50IG5hbWVkIEVOVFJZLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiRU5UUlkiIGFzIGNoaWxkIG9mIEVOVFJJRVMuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiRU5UUlkiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiQVJUSUNMRSIgYXMgY2hpbGQgb2YgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQod3JpdGVyLCBCQURfQ0FTVCAiQVJUSUNMRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QgIjxUZXN0IDI+Iik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFdyaXRlIGFuIGVsZW1lbnQgbmFtZWQgIkVOVFJZX05PIiBhcyBjaGlsZCBvZiBFTlRSWS4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJFTlRSWV9OTyIsICIlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjApOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZgogICAgICAgICAgICAoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2xvc2UgdGhlIGVsZW1lbnQgbmFtZWQgRU5UUlkuICovCiAgICByYyA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0WG1sd3JpdGVyVHJlZTogRXJyb3IgYXQgeG1sVGV4dFdyaXRlckVuZEVsZW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbG9zZSB0aGUgZWxlbWVudCBuYW1lZCBFTlRSSUVTLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogU3RhcnQgYW4gZWxlbWVudCBuYW1lZCAiRk9PVEVSIiBhcyBjaGlsZCBvZiBPUkRFUi4gKi8KICAgIHJjID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIEJBRF9DQVNUICJGT09URVIiKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogV3JpdGUgYW4gZWxlbWVudCBuYW1lZCAiVEVYVCIgYXMgY2hpbGQgb2YgRk9PVEVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHdyaXRlciwgQkFEX0NBU1QgIlRFWFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICJUaGlzIGlzIGEgdGV4dC4iKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2xvc2UgdGhlIGVsZW1lbnQgbmFtZWQgRk9PVEVSLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh3cml0ZXIpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHByaW50ZigidGVzdFhtbHdyaXRlclRyZWU6IEVycm9yIGF0IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogSGVyZSB3ZSBjb3VsZCBjbG9zZSB0aGUgZWxlbWVudHMgT1JERVIgYW5kIEVYQU1QTEUgdXNpbmcgdGhlCiAgICAgKiBmdW5jdGlvbiB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCwgYnV0IHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvCiAgICAgKiB3cml0ZSBhbnkgb3RoZXIgZWxlbWVudHMsIHdlIHNpbXBseSBjYWxsIHhtbFRleHRXcml0ZXJFbmREb2N1bWVudCwKICAgICAqIHdoaWNoIHdpbGwgZG8gYWxsIHRoZSB3b3JrLiAqLwogICAgcmMgPSB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQod3JpdGVyKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBwcmludGYoInRlc3RYbWx3cml0ZXJUcmVlOiBFcnJvciBhdCB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB4bWxGcmVlVGV4dFdyaXRlcih3cml0ZXIpOwoKICAgIHhtbFNhdmVGaWxlRW5jKGZpbGUsIGRvYywgTVlfRU5DT0RJTkcpOwoKICAgIHhtbEZyZWVEb2MoZG9jKTsKfQoKLyoqCiAqIENvbnZlcnRJbnB1dDoKICogQGluOiBzdHJpbmcgaW4gYSBnaXZlbiBlbmNvZGluZwogKiBAZW5jb2Rpbmc6IHRoZSBlbmNvZGluZyB1c2VkCiAqCiAqIENvbnZlcnRzIEBpbiBpbnRvIFVURi04IGZvciBwcm9jZXNzaW5nIHdpdGggbGlieG1sMiBBUElzCiAqCiAqIFJldHVybnMgdGhlIGNvbnZlcnRlZCBVVEYtOCBzdHJpbmcsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnhtbENoYXIgKgpDb252ZXJ0SW5wdXQoY29uc3QgY2hhciAqaW4sIGNvbnN0IGNoYXIgKmVuY29kaW5nKQp7CiAgICB4bWxDaGFyICpvdXQ7CiAgICBpbnQgcmV0OwogICAgaW50IHNpemU7CiAgICBpbnQgb3V0X3NpemU7CiAgICBpbnQgdGVtcDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgaGFuZGxlcjsKCiAgICBpZiAoaW4gPT0gMCkKICAgICAgICByZXR1cm4gMDsKCiAgICBoYW5kbGVyID0geG1sRmluZENoYXJFbmNvZGluZ0hhbmRsZXIoZW5jb2RpbmcpOwoKICAgIGlmICghaGFuZGxlcikgewogICAgICAgIHByaW50ZigiQ29udmVydElucHV0OiBubyBlbmNvZGluZyBoYW5kbGVyIGZvdW5kIGZvciAnJXMnXG4iLAogICAgICAgICAgICAgICBlbmNvZGluZyA/IGVuY29kaW5nIDogIiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHNpemUgPSAoaW50KSBzdHJsZW4oaW4pICsgMTsKICAgIG91dF9zaXplID0gc2l6ZSAqIDIgLSAxOwogICAgb3V0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1sTWFsbG9jKChzaXplX3QpIG91dF9zaXplKTsKCiAgICBpZiAob3V0ICE9IDApIHsKICAgICAgICB0ZW1wID0gc2l6ZSAtIDE7CiAgICAgICAgcmV0ID0gaGFuZGxlci0+aW5wdXQob3V0LCAmb3V0X3NpemUsIChjb25zdCB4bWxDaGFyICopIGluLCAmdGVtcCk7CiAgICAgICAgaWYgKChyZXQgPCAwKSB8fCAodGVtcCAtIHNpemUgKyAxKSkgewogICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJDb252ZXJ0SW5wdXQ6IGNvbnZlcnNpb24gd2Fzbid0IHN1Y2Nlc3NmdWwuXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50ZgogICAgICAgICAgICAgICAgICAgICgiQ29udmVydElucHV0OiBjb252ZXJzaW9uIHdhc24ndCBzdWNjZXNzZnVsLiBjb252ZXJ0ZWQ6ICVpIG9jdGV0cy5cbiIsCiAgICAgICAgICAgICAgICAgICAgIHRlbXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICB4bWxGcmVlKG91dCk7CiAgICAgICAgICAgIG91dCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3V0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1sUmVhbGxvYyhvdXQsIG91dF9zaXplICsgMSk7CiAgICAgICAgICAgIG91dFtvdXRfc2l6ZV0gPSAwOyAgLypudWxsIHRlcm1pbmF0aW5nIG91dCAqLwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJDb252ZXJ0SW5wdXQ6IG5vIG1lbVxuIik7CiAgICB9CgogICAgcmV0dXJuIG91dDsKfQoKI2Vsc2UKaW50IG1haW4odm9pZCkgewogICAgZnByaW50ZihzdGRlcnIsICJXcml0ZXIgb3Igb3V0cHV0IHN1cHBvcnQgbm90IGNvbXBpbGVkIGluXG4iKTsKICAgIGV4aXQoMSk7Cn0KI2VuZGlmCg==