PD9waHAKZGVmaW5lKCJfUFNfTU9ERV9ERVZfIiwgdHJ1ZSk7Cgo=PD9waHAKLyoqCiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycwogKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBCiAqCiAqIE5PVElDRSBPRiBMSUNFTlNFCiAqCiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKQogKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC4KICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6CiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMAogKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0bwogKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsCiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogRElTQ0xBSU1FUgogKgogKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlcgogKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91cgogKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+CiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMKICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKQogKi8KCnVzZSBQcmVzdGFTaG9wXEF1dG9sb2FkXFByZXN0YXNob3BBdXRvbG9hZDsKdXNlIFByZXN0YVNob3BcUHJlc3RhU2hvcFxDb3JlXFZlcnNpb247CgpyZXF1aXJlX29uY2UgX19ESVJfXyAuICcvLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CgpkZWZpbmUoJ19QU19WRVJTSU9OXycsIFZlcnNpb246OlZFUlNJT04pOwoKcmVxdWlyZV9vbmNlIF9QU19DT05GSUdfRElSXyAuICdhbGlhcy5waHAnOwoKUHJlc3Rhc2hvcEF1dG9sb2FkOjpjcmVhdGUoX1BTX1JPT1RfRElSXywgX1BTX0NBQ0hFX0RJUl8pCiAgICAtPnJlZ2lzdGVyKCk7Cg==PD9waHAKLyoqCiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycwogKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBCiAqCiAqIE5PVElDRSBPRiBMSUNFTlNFCiAqCiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKQogKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC4KICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6CiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMAogKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0bwogKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsCiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogRElTQ0xBSU1FUgogKgogKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlcgogKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91cgogKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+CiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMKICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKQogKi8KCnVzZSBQcmVzdGFTaG9wXFByZXN0YVNob3BcQWRhcHRlclxTZXJ2aWNlTG9jYXRvcjsKdXNlIFByZXN0YVNob3BcUHJlc3RhU2hvcFxDb3JlXENvbnRhaW5lckJ1aWxkZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJT0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEh0dHBLZXJuZWxcQ2FjaGVXYXJtZXJcQ2FjaGVXYXJtZXJBZ2dyZWdhdGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxZYW1sXFlhbWw7CgokY29udGFpbmVyX2J1aWxkZXIgPSBuZXcgQ29udGFpbmVyQnVpbGRlcigpOwokbGVnYWN5Q29udGFpbmVyID0gJGNvbnRhaW5lcl9idWlsZGVyLT5idWlsZCgpOwpTZXJ2aWNlTG9jYXRvcjo6c2V0U2VydmljZUNvbnRhaW5lckluc3RhbmNlKCRsZWdhY3lDb250YWluZXIpOwoKaWYgKCFmaWxlX2V4aXN0cyhfUFNfQ0FDSEVfRElSXykpIHsKICAgIEBta2RpcihfUFNfQ0FDSEVfRElSXyk7CiAgICAkd2FybWVyID0gbmV3IENhY2hlV2FybWVyQWdncmVnYXRlKFsKICAgICAgICBuZXcgUHJlc3RhU2hvcEJ1bmRsZVxDYWNoZVxMb2NhbGl6YXRpb25XYXJtZXIoX1BTX1ZFUlNJT05fLCAnZW4nKSwgLy9AcmVwbGFjZSBoYXJkLWNvZGVkIExhbmcKICAgIF0pOwogICAgJHdhcm1lci0+d2FybVVwKF9QU19DQUNIRV9ESVJfKTsKfQoKJGNvbmZpZ0RpcmVjdG9yeSA9IF9fRElSX18uICcvLi4vYXBwL2NvbmZpZyc7CiRwaHBQYXJhbWV0ZXJzRmlsZXBhdGggPSAkY29uZmlnRGlyZWN0b3J5IC4gJy9wYXJhbWV0ZXJzLnBocCc7CiR5YW1sUGFyYW1ldGVyc0ZpbGVwYXRoID0gJGNvbmZpZ0RpcmVjdG9yeSAuICcvcGFyYW1ldGVycy55bWwnOwoKJGZpbGVzeXN0ZW0gPSBuZXcgRmlsZXN5c3RlbSgpOwoKJGV4cG9ydFBocENvbmZpZ0ZpbGUgPSBmdW5jdGlvbiAoJGNvbmZpZywgJGRlc3RpbmF0aW9uKSB1c2UgKCRmaWxlc3lzdGVtKSB7CiAgICB0cnkgewogICAgICAgICRmaWxlc3lzdGVtLT5kdW1wRmlsZSgkZGVzdGluYXRpb24sICc8P3BocCByZXR1cm4gJy52YXJfZXhwb3J0KCRjb25maWcsIHRydWUpLic7Jy4iXG4iKTsKICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uICRlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9OwoKLy8gQm9vdHN0cmFwIGFuIGFwcGxpY2F0aW9uIHdpdGggcGFyYW1ldGVycy55bWwsIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCBiZWZvcmUgUEhQIHBhcmFtZXRlcnMgZmlsZSBzdXBwb3J0CmlmICghZmlsZV9leGlzdHMoJHBocFBhcmFtZXRlcnNGaWxlcGF0aCkgJiYgZmlsZV9leGlzdHMoJHlhbWxQYXJhbWV0ZXJzRmlsZXBhdGgpKSB7CiAgICAkcGFyYW1ldGVycyA9IFlhbWw6OnBhcnNlRmlsZSgkeWFtbFBhcmFtZXRlcnNGaWxlcGF0aCk7CiAgICBpZiAoJGV4cG9ydFBocENvbmZpZ0ZpbGUoJHBhcmFtZXRlcnMsICRwaHBQYXJhbWV0ZXJzRmlsZXBhdGgpKSB7CiAgICAgICAgJGZpbGVzeXN0ZW0tPmR1bXBGaWxlKCR5YW1sUGFyYW1ldGVyc0ZpbGVwYXRoLCAncGFyYW1ldGVyczonIC4gIlxuIik7CiAgICB9Cn0KCiRsYXN0UGFyYW1ldGVyc01vZGlmaWNhdGlvblRpbWUgPSAoaW50KUBmaWxlbXRpbWUoJHBocFBhcmFtZXRlcnNGaWxlcGF0aCk7CgppZiAoJGxhc3RQYXJhbWV0ZXJzTW9kaWZpY2F0aW9uVGltZSkgewogICAgJGNhY2hlZFBhcmFtZXRlcnMgPSBfUFNfQ0FDSEVfRElSXy4gJ2FwcFBhcmFtZXRlcnMucGhwJzsKCiAgICAkbGFzdFBhcmFtZXRlcnNDYWNoZU1vZGlmaWNhdGlvblRpbWUgPSAoaW50KUBmaWxlbXRpbWUoJGNhY2hlZFBhcmFtZXRlcnMpOwogICAgaWYgKCEkbGFzdFBhcmFtZXRlcnNDYWNoZU1vZGlmaWNhdGlvblRpbWUgfHwgJGxhc3RQYXJhbWV0ZXJzQ2FjaGVNb2RpZmljYXRpb25UaW1lIDwgJGxhc3RQYXJhbWV0ZXJzTW9kaWZpY2F0aW9uVGltZSkgewogICAgICAgIC8vIFdoZW4gcGFyYW1ldGVycyBmaWxlIGlzIGF2YWlsYWJsZSwgdXBkYXRlIGl0cyBjYWNoZSBpZiBpdCBpcyBzdGFsZS4KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHBocFBhcmFtZXRlcnNGaWxlcGF0aCkpIHsKICAgICAgICAgICAgJGNvbmZpZyA9IHJlcXVpcmUgJHBocFBhcmFtZXRlcnNGaWxlcGF0aDsKICAgICAgICAgICAgJGV4cG9ydFBocENvbmZpZ0ZpbGUoJGNvbmZpZywgJGNhY2hlZFBhcmFtZXRlcnMpOwogICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygkeWFtbFBhcmFtZXRlcnNGaWxlcGF0aCkpIHsKICAgICAgICAgICAgJGNvbmZpZyA9IFlhbWw6OnBhcnNlRmlsZSgkeWFtbFBhcmFtZXRlcnNGaWxlcGF0aCk7CiAgICAgICAgICAgICRleHBvcnRQaHBDb25maWdGaWxlKCRjb25maWcsICRjYWNoZWRQYXJhbWV0ZXJzKTsKICAgICAgICB9CiAgICB9CgogICAgJGNvbmZpZyA9IHJlcXVpcmVfb25jZSBfUFNfQ0FDSEVfRElSXyAuICdhcHBQYXJhbWV0ZXJzLnBocCc7CiAgICBhcnJheV93YWxrKCRjb25maWdbJ3BhcmFtZXRlcnMnXSwgZnVuY3Rpb24gKCYkcGFyYW0pIHsKICAgICAgICAkcGFyYW0gPSBzdHJfcmVwbGFjZSgnJSUnLCAnJScsICRwYXJhbSA/PyAnJyk7CiAgICB9KTsKCiAgICAkZGF0YWJhc2VfaG9zdCA9ICRjb25maWdbJ3BhcmFtZXRlcnMnXVsnZGF0YWJhc2VfaG9zdCddOwoKICAgIGlmICghZW1wdHkoJGNvbmZpZ1sncGFyYW1ldGVycyddWydkYXRhYmFzZV9wb3J0J10pKSB7CiAgICAgICAgJGRhdGFiYXNlX2hvc3QgLj0gJzonLiAkY29uZmlnWydwYXJhbWV0ZXJzJ11bJ2RhdGFiYXNlX3BvcnQnXTsKICAgIH0KCiAgICBkZWZpbmUoJ19EQl9TRVJWRVJfJywgJGRhdGFiYXNlX2hvc3QpOwogICAgaWYgKGRlZmluZWQoJ19QU19JTl9URVNUXycpKSB7CiAgICAgICAgZGVmaW5lKCdfREJfTkFNRV8nLCAndGVzdF8nLiRjb25maWdbJ3BhcmFtZXRlcnMnXVsnZGF0YWJhc2VfbmFtZSddKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZGVmaW5lKCdfREJfTkFNRV8nLCAkY29uZmlnWydwYXJhbWV0ZXJzJ11bJ2RhdGFiYXNlX25hbWUnXSk7CiAgICB9CgogICAgZGVmaW5lKCdfREJfVVNFUl8nLCAkY29uZmlnWydwYXJhbWV0ZXJzJ11bJ2RhdGFiYXNlX3VzZXInXSk7CiAgICBkZWZpbmUoJ19EQl9QQVNTV0RfJywgJGNvbmZpZ1sncGFyYW1ldGVycyddWydkYXRhYmFzZV9wYXNzd29yZCddKTsKICAgIGRlZmluZSgnX0RCX1BSRUZJWF8nLCAgJGNvbmZpZ1sncGFyYW1ldGVycyddWydkYXRhYmFzZV9wcmVmaXgnXSk7CiAgICBkZWZpbmUoJ19NWVNRTF9FTkdJTkVfJywgICRjb25maWdbJ3BhcmFtZXRlcnMnXVsnZGF0YWJhc2VfZW5naW5lJ10pOwogICAgZGVmaW5lKCdfUFNfQ0FDSElOR19TWVNURU1fJywgICRjb25maWdbJ3BhcmFtZXRlcnMnXVsncHNfY2FjaGluZyddKTsKCiAgICBpZiAoIWRlZmluZWQoJ1BTX0lOX1VQR1JBREUnKSAmJiAhZGVmaW5lZCgnX1BTX0lOX1RFU1RfJykpIHsKICAgICAgICBkZWZpbmUoJ19QU19DQUNIRV9FTkFCTEVEXycsICRjb25maWdbJ3BhcmFtZXRlcnMnXVsncHNfY2FjaGVfZW5hYmxlJ10pOwogICAgfSBlbHNlIHsKICAgICAgICBkZWZpbmUoJ19QU19DQUNIRV9FTkFCTEVEXycsIDApOwogICAgICAgICRjb25maWdbJ3BhcmFtZXRlcnMnXVsncHNfY2FjaGVfZW5hYmxlJ10gPSAwOwogICAgfQoKICAgIC8vIExlZ2FjeSBjb29raWUKICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdjb29raWVfa2V5JywgJGNvbmZpZ1sncGFyYW1ldGVycyddKSkgewogICAgICAgIGRlZmluZSgnX0NPT0tJRV9LRVlfJywgJGNvbmZpZ1sncGFyYW1ldGVycyddWydjb29raWVfa2V5J10pOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBEZWZpbmUgY29va2llIGtleSBpZiBtaXNzaW5nIHRvIHByZXZlbnQgZmFpbHVyZSBpbiBjb21wb3NlciBwb3N0LWluc3RhbGwgc2NyaXB0CiAgICAgICAgZGVmaW5lKCdfQ09PS0lFX0tFWV8nLCBUb29sczo6cGFzc3dkR2VuKDU2KSk7CiAgICB9CgogICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ2Nvb2tpZV9pdicsICRjb25maWdbJ3BhcmFtZXRlcnMnXSkpIHsKICAgICAgICBkZWZpbmUoJ19DT09LSUVfSVZfJywgJGNvbmZpZ1sncGFyYW1ldGVycyddWydjb29raWVfaXYnXSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIERlZmluZSBjb29raWUgSVYgaWYgbWlzc2luZyB0byBwcmV2ZW50IGZhaWx1cmUgaW4gY29tcG9zZXIgcG9zdC1pbnN0YWxsIHNjcmlwdAogICAgICAgIGRlZmluZSgnX0NPT0tJRV9JVl8nLCBUb29sczo6cGFzc3dkR2VuKDMyKSk7CiAgICB9CgogICAgLy8gTmV3IGNvb2tpZQogICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ25ld19jb29raWVfa2V5JywgJGNvbmZpZ1sncGFyYW1ldGVycyddKSkgewogICAgICAgIGRlZmluZSgnX05FV19DT09LSUVfS0VZXycsICRjb25maWdbJ3BhcmFtZXRlcnMnXVsnbmV3X2Nvb2tpZV9rZXknXSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIERlZmluZSBjb29raWUga2V5IGlmIG1pc3NpbmcgdG8gcHJldmVudCBmYWlsdXJlIGluIGNvbXBvc2VyIHBvc3QtaW5zdGFsbCBzY3JpcHQKICAgICAgICAka2V5ID0gUGhwRW5jcnlwdGlvbjo6Y3JlYXRlTmV3UmFuZG9tS2V5KCk7CiAgICAgICAgZGVmaW5lKCdfTkVXX0NPT0tJRV9LRVlfJywgJGtleSk7CiAgICB9CgogICAgZGVmaW5lKCdfUFNfQ1JFQVRJT05fREFURV8nLCAkY29uZmlnWydwYXJhbWV0ZXJzJ11bJ3BzX2NyZWF0aW9uX2RhdGUnXSk7CgogICAgaWYgKGlzc2V0KCRjb25maWdbJ3BhcmFtZXRlcnMnXVsnX3Jpam5kYWVsX2tleSddLCAkY29uZmlnWydwYXJhbWV0ZXJzJ11bJ19yaWpuZGFlbF9pdiddKSkgewogICAgICAgIGRlZmluZSgnX1JJSk5EQUVMX0tFWV8nLCAkY29uZmlnWydwYXJhbWV0ZXJzJ11bJ19yaWpuZGFlbF9rZXknXSk7CiAgICAgICAgZGVmaW5lKCdfUklKTkRBRUxfSVZfJywgJGNvbmZpZ1sncGFyYW1ldGVycyddWydfcmlqbmRhZWxfaXYnXSk7CiAgICB9Cn0gZWxzZWlmIChmaWxlX2V4aXN0cyhfUFNfUk9PVF9ESVJfLicvY29uZmlnL3NldHRpbmdzLmluYy5waHAnKSkgewogICAgcmVxdWlyZV9vbmNlIF9QU19ST09UX0RJUl8uJy9jb25maWcvc2V0dGluZ3MuaW5jLnBocCc7Cn0K