IyEvdXNyL2Jpbi9wZXJsIC13VAojIC0qLSBNb2RlOiBwZXJsOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCiMKIyBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwojIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCiMgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCiMgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiMKIyBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKIyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCiMgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCiMgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgSG9sZ2VyCiMgU2NodXJpZy4gUG9ydGlvbnMgY3JlYXRlZCBieSBIb2xnZXIgU2NodXJpZyBhcmUKIyBDb3B5cmlnaHQgKEMpIDE5OTkgSG9sZ2VyIFNjaHVyaWcuIEFsbAojIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOiBIb2xnZXIgU2NodXJpZyA8aG9sZ2Vyc2NodXJpZ0BuaWtvY2l0eS5kZT4KIyAgICAgICAgICAgICAgICAgVGVycnkgV2Vpc3NtYW4gPHRlcnJ5QG1vemlsbGEub3JnPgojICAgICAgICAgICAgICAgICBHYXZpbiBTaGVsbGV5IDxidWd6aWxsYUBjaGltcHljaG9tcHkub3JnPgojICAgICAgICAgICAgICAgICBGculk6XJpYyBCdWNsaW4gPExwU29saXRAZ21haWwuY29tPgojCiMKIyBEaXJlY3QgYW55IHF1ZXN0aW9ucyBvbiB0aGlzIHNvdXJjZSBjb2RlIHRvCiMKIyBIb2xnZXIgU2NodXJpZyA8aG9sZ2Vyc2NodXJpZ0BuaWtvY2l0eS5kZT4KCnVzZSBzdHJpY3Q7CnVzZSBsaWIgIi4iOwoKcmVxdWlyZSAiQ0dJLnBsIjsKcmVxdWlyZSAiZ2xvYmFscy5wbCI7Cgp1c2UgQnVnemlsbGE6OkNvbnN0YW50czsKdXNlIEJ1Z3ppbGxhOjpDb25maWcgcXcoOkRFRkFVTFQgJGRhdGFkaXIpOwp1c2UgQnVnemlsbGE6OlVzZXI7Cgp1c2UgdmFycyBxdygkdGVtcGxhdGUgJHZhcnMpOwoKbXkgJGNnaSA9IEJ1Z3ppbGxhLT5jZ2k7Cm15ICRkYmggPSBCdWd6aWxsYS0+ZGJoOwoKIyBUZXN0UHJvZHVjdDogIGp1c3QgcmV0dXJucyBpZiB0aGUgc3BlY2lmaWVkIHByb2R1Y3QgZG9lcyBleGlzdHMKIyBDaGVja1Byb2R1Y3Q6IHNhbWUgY2hlY2ssIG9wdGlvbmFsbHkgIGVtaXQgYW4gZXJyb3IgdGV4dAojIFRlc3RWZXJzaW9uOiAganVzdCByZXR1cm5zIGlmIHRoZSBzcGVjaWZpZWQgcHJvZHVjdC92ZXJzaW9uIGNvbWJpbmF0aW9uIGV4aXN0cwojIENoZWNrVmVyc2lvbjogc2FtZSBjaGVjaywgb3B0aW9uYWxseSBlbWl0IGFuIGVycm9yIHRleHQKCnN1YiBUZXN0UHJvZHVjdCAoJCkKewogICAgbXkgJHByb2QgPSBzaGlmdDsKCiAgICAjIGRvZXMgdGhlIHByb2R1Y3QgZXhpc3Q/CiAgICBTZW5kU1FMKCJTRUxFQ1QgbmFtZQogICAgICAgICAgICAgRlJPTSBwcm9kdWN0cwogICAgICAgICAgICAgV0hFUkUgbmFtZSA9ICIgLiBTcWxRdW90ZSgkcHJvZCkpOwogICAgcmV0dXJuIEZldGNoT25lQ29sdW1uKCk7Cn0KCnN1YiBDaGVja1Byb2R1Y3QgKCQpCnsKICAgIG15ICRwcm9kID0gc2hpZnQ7CgogICAgIyBkbyB3ZSBoYXZlIGEgcHJvZHVjdD8KICAgIHVubGVzcyAoJHByb2QpIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigncHJvZHVjdF9ub3Rfc3BlY2lmaWVkJyk7ICAgIAogICAgfQoKICAgIHVubGVzcyAoVGVzdFByb2R1Y3QgJHByb2QpIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigncHJvZHVjdF9kb2VzbnRfZXhpc3QnLAogICAgICAgICAgICAgICAgICAgICAgIHsncHJvZHVjdCcgPT4gJHByb2R9KTsKICAgIH0KfQoKc3ViIFRlc3RWZXJzaW9uICgkJCkKewogICAgbXkgKCRwcm9kLCR2ZXIpID0gQF87CgogICAgIyBkb2VzIHRoZSBwcm9kdWN0IGV4aXN0PwogICAgU2VuZFNRTCgiU0VMRUNUIHByb2R1Y3RzLm5hbWUsIHZhbHVlCiAgICAgICAgICAgICBGUk9NIHZlcnNpb25zLCBwcm9kdWN0cwogICAgICAgICAgICAgV0hFUkUgdmVyc2lvbnMucHJvZHVjdF9pZCA9IHByb2R1Y3RzLmlkCiAgICAgICAgICAgICAgIEFORCBwcm9kdWN0cy5uYW1lID0gIiAuIFNxbFF1b3RlKCRwcm9kKSAuICIKICAgICAgICAgICAgICAgQU5EIHZhbHVlID0gIiAuIFNxbFF1b3RlKCR2ZXIpKTsKICAgIHJldHVybiBGZXRjaE9uZUNvbHVtbigpOwp9CgpzdWIgQ2hlY2tWZXJzaW9uICgkJCkKewogICAgbXkgKCRwcm9kLCAkdmVyKSA9IEBfOwoKICAgICMgZG8gd2UgaGF2ZSB0aGUgdmVyc2lvbj8KICAgIHVubGVzcyAoJHZlcikgewogICAgICAgIFRocm93VXNlckVycm9yKCd2ZXJzaW9uX25vdF9zcGVjaWZpZWQnKTsKICAgIH0KCiAgICBDaGVja1Byb2R1Y3QoJHByb2QpOwoKICAgIHVubGVzcyAoVGVzdFZlcnNpb24gJHByb2QsICR2ZXIpIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigndmVyc2lvbl9ub3RfdmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgIHsncHJvZHVjdCcgPT4gJHByb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJyA9PiAkdmVyfSk7CiAgICB9Cn0KCgojCiMgUHJlbGltaW5hcnkgY2hlY2tzOgojCgpCdWd6aWxsYS0+bG9naW4oTE9HSU5fUkVRVUlSRUQpOwoKcHJpbnQgQnVnemlsbGEtPmNnaS0+aGVhZGVyKCk7CgpVc2VySW5Hcm91cCgiZWRpdGNvbXBvbmVudHMiKQogIHx8IFRocm93VXNlckVycm9yKCJhdXRoX2ZhaWx1cmUiLCB7Z3JvdXAgID0+ICJlZGl0Y29tcG9uZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPT4gImVkaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0+ICJ2ZXJzaW9ucyJ9KTsKCiMKIyBvZnRlbiB1c2VkIHZhcmlhYmxlcwojCm15ICRwcm9kdWN0ID0gdHJpbSgkY2dpLT5wYXJhbSgncHJvZHVjdCcpIHx8ICcnKTsKbXkgJHZlcnNpb24gPSB0cmltKCRjZ2ktPnBhcmFtKCd2ZXJzaW9uJykgfHwgJycpOwpteSAkYWN0aW9uICA9IHRyaW0oJGNnaS0+cGFyYW0oJ2FjdGlvbicpICB8fCAnJyk7CgoKIwojIHByb2R1Y3QgPSAnJyAtPiBTaG93IG5pY2UgbGlzdCBvZiB2ZXJzaW9ucwojCgp1bmxlc3MgKCRwcm9kdWN0KSB7CgogICAgbXkgQHByb2R1Y3RzID0gKCk7CgogICAgU2VuZFNRTCgiU0VMRUNUIHByb2R1Y3RzLm5hbWUsIHByb2R1Y3RzLmRlc2NyaXB0aW9uCiAgICAgICAgICAgICBGUk9NIHByb2R1Y3RzIAogICAgICAgICAgICAgT1JERVIgQlkgcHJvZHVjdHMubmFtZSIpOwoKICAgIHdoaWxlICggTW9yZVNRTERhdGEoKSApIHsKICAgICAgICBteSAoJHByb2R1Y3QsICRkZXNjcmlwdGlvbikgPSBGZXRjaFNRTERhdGEoKTsKCiAgICAgICAgbXkgJHByb2QgPSB7fTsKCiAgICAgICAgJHByb2QtPnsnbmFtZSd9ID0gJHByb2R1Y3Q7CiAgICAgICAgJHByb2QtPnsnZGVzY3JpcHRpb24nfSA9ICRkZXNjcmlwdGlvbjsKCiAgICAgICAgcHVzaChAcHJvZHVjdHMsICRwcm9kKTsKICAgIH0KCiAgICAkdmFycy0+eydwcm9kdWN0cyd9ID0gXEBwcm9kdWN0czsKICAgICR0ZW1wbGF0ZS0+cHJvY2VzcygiYWRtaW4vdmVyc2lvbnMvc2VsZWN0LXByb2R1Y3QuaHRtbC50bXBsIiwKICAgICAgICAgICAgICAgICAgICAgICAkdmFycykKICAgICAgfHwgVGhyb3dUZW1wbGF0ZUVycm9yKCR0ZW1wbGF0ZS0+ZXJyb3IoKSk7CgogICAgZXhpdDsKfQoKIwojIGFjdGlvbj0nJyAtPiBTaG93IG5pY2UgbGlzdCBvZiB2ZXJzaW9ucwojCgp1bmxlc3MgKCRhY3Rpb24pIHsKCiAgICBDaGVja1Byb2R1Y3QoJHByb2R1Y3QpOwogICAgbXkgJHByb2R1Y3RfaWQgPSBnZXRfcHJvZHVjdF9pZCgkcHJvZHVjdCk7CiAgICBteSBAdmVyc2lvbnMgPSAoKTsKCiAgICBTZW5kU1FMKCJTRUxFQ1QgdmFsdWUKICAgICAgICAgICAgIEZST00gdmVyc2lvbnMKICAgICAgICAgICAgIFdIRVJFIHByb2R1Y3RfaWQgPSAkcHJvZHVjdF9pZAogICAgICAgICAgICAgT1JERVIgQlkgdmFsdWUiKTsKCiAgICB3aGlsZSAoIE1vcmVTUUxEYXRhKCkgKSB7CiAgICAgICAgbXkgJG5hbWUgPSBGZXRjaE9uZUNvbHVtbigpOwoKICAgICAgICBteSAkdmVyc2lvbiA9IHt9OwoKICAgICAgICAkdmVyc2lvbi0+eyduYW1lJ30gPSAkbmFtZTsKCiAgICAgICAgcHVzaChAdmVyc2lvbnMsICR2ZXJzaW9uKTsKCiAgICB9CgogICAgJHZhcnMtPnsncHJvZHVjdCd9ID0gJHByb2R1Y3Q7CiAgICAkdmFycy0+eyd2ZXJzaW9ucyd9ID0gXEB2ZXJzaW9uczsKICAgICR0ZW1wbGF0ZS0+cHJvY2VzcygiYWRtaW4vdmVyc2lvbnMvbGlzdC5odG1sLnRtcGwiLAogICAgICAgICAgICAgICAgICAgICAgICR2YXJzKQogICAgICB8fCBUaHJvd1RlbXBsYXRlRXJyb3IoJHRlbXBsYXRlLT5lcnJvcigpKTsKCiAgICBleGl0Owp9CgoKCgojCiMgYWN0aW9uPSdhZGQnIC0+IHByZXNlbnQgZm9ybSBmb3IgcGFyYW1ldGVycyBmb3IgbmV3IHZlcnNpb24KIwojIChuZXh0IGFjdGlvbiB3aWxsIGJlICduZXcnKQojCgppZiAoJGFjdGlvbiBlcSAnYWRkJykgewoKICAgIENoZWNrUHJvZHVjdCgkcHJvZHVjdCk7CiAgICBteSAkcHJvZHVjdF9pZCA9IGdldF9wcm9kdWN0X2lkKCRwcm9kdWN0KTsKCiAgICAkdmFycy0+eydwcm9kdWN0J30gPSAkcHJvZHVjdDsKICAgICR0ZW1wbGF0ZS0+cHJvY2VzcygiYWRtaW4vdmVyc2lvbnMvY3JlYXRlLmh0bWwudG1wbCIsCiAgICAgICAgICAgICAgICAgICAgICAgJHZhcnMpCiAgICAgIHx8IFRocm93VGVtcGxhdGVFcnJvcigkdGVtcGxhdGUtPmVycm9yKCkpOwoKICAgIGV4aXQ7Cn0KCgoKIwojIGFjdGlvbj0nbmV3JyAtPiBhZGQgdmVyc2lvbiBlbnRlcmVkIGluIHRoZSAnYWN0aW9uPWFkZCcgc2NyZWVuCiMKCmlmICgkYWN0aW9uIGVxICduZXcnKSB7CgogICAgQ2hlY2tQcm9kdWN0KCRwcm9kdWN0KTsKICAgIG15ICRwcm9kdWN0X2lkID0gZ2V0X3Byb2R1Y3RfaWQoJHByb2R1Y3QpOwoKICAgICMgQ2xlYW51cHMgYW5kIHZhbGlkaWR5IGNoZWNrcwoKICAgIHVubGVzcyAoJHZlcnNpb24pIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigndmVyc2lvbl9ibGFua19uYW1lJywKICAgICAgICAgICAgICAgICAgICAgICB7J25hbWUnID0+ICR2ZXJzaW9ufSk7CiAgICB9CgogICAgaWYgKFRlc3RWZXJzaW9uKCRwcm9kdWN0LCR2ZXJzaW9uKSkgewogICAgICAgIFRocm93VXNlckVycm9yKCd2ZXJzaW9uX2FscmVhZHlfZXhpc3RzJywKICAgICAgICAgICAgICAgICAgICAgICB7J25hbWUnID0+ICR2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjdCcgPT4gJHByb2R1Y3R9KTsKICAgIH0KCiAgICAjIEFkZCB0aGUgbmV3IHZlcnNpb24KICAgIFNlbmRTUUwoIklOU0VSVCBJTlRPIHZlcnNpb25zICggIiAuCiAgICAgICAgICAgICJ2YWx1ZSwgcHJvZHVjdF9pZCIgLgogICAgICAgICAgICAiICkgVkFMVUVTICggIiAuCiAgICAgICAgICAgIFNxbFF1b3RlKCR2ZXJzaW9uKSAuICIsICRwcm9kdWN0X2lkKSIpOwoKICAgICMgTWFrZSB2ZXJzaW9uY2FjaGUgZmx1c2gKICAgIHVubGluayAiJGRhdGFkaXIvdmVyc2lvbmNhY2hlIjsKCiAgICAkdmFycy0+eyduYW1lJ30gPSAkdmVyc2lvbjsKICAgICR2YXJzLT57J3Byb2R1Y3QnfSA9ICRwcm9kdWN0OwogICAgJHRlbXBsYXRlLT5wcm9jZXNzKCJhZG1pbi92ZXJzaW9ucy9jcmVhdGVkLmh0bWwudG1wbCIsCiAgICAgICAgICAgICAgICAgICAgICAgJHZhcnMpCiAgICAgIHx8IFRocm93VGVtcGxhdGVFcnJvcigkdGVtcGxhdGUtPmVycm9yKCkpOwoKICAgIGV4aXQ7Cn0KCgoKCiMKIyBhY3Rpb249J2RlbCcgLT4gYXNrIGlmIHVzZXIgcmVhbGx5IHdhbnRzIHRvIGRlbGV0ZQojCiMgKG5leHQgYWN0aW9uIHdvdWxkIGJlICdkZWxldGUnKQojCgppZiAoJGFjdGlvbiBlcSAnZGVsJykgewoKICAgIENoZWNrVmVyc2lvbigkcHJvZHVjdCwgJHZlcnNpb24pOwogICAgbXkgJHByb2R1Y3RfaWQgPSBnZXRfcHJvZHVjdF9pZCgkcHJvZHVjdCk7CgogICAgU2VuZFNRTCgiU0VMRUNUIGNvdW50KGJ1Z19pZCkKICAgICAgICAgICAgIEZST00gYnVncwogICAgICAgICAgICAgV0hFUkUgcHJvZHVjdF9pZCA9ICRwcm9kdWN0X2lkCiAgICAgICAgICAgICAgIEFORCB2ZXJzaW9uID0gIiAuIFNxbFF1b3RlKCR2ZXJzaW9uKSk7CiAgICBteSAkYnVncyA9IEZldGNoT25lQ29sdW1uKCkgfHwgMDsKCiAgICAkdmFycy0+eydidWdfY291bnQnfSA9ICRidWdzOwogICAgJHZhcnMtPnsnbmFtZSd9ID0gJHZlcnNpb247CiAgICAkdmFycy0+eydwcm9kdWN0J30gPSAkcHJvZHVjdDsKICAgICR0ZW1wbGF0ZS0+cHJvY2VzcygiYWRtaW4vdmVyc2lvbnMvY29uZmlybS1kZWxldGUuaHRtbC50bXBsIiwKICAgICAgICAgICAgICAgICAgICAgICAkdmFycykKICAgICAgfHwgVGhyb3dUZW1wbGF0ZUVycm9yKCR0ZW1wbGF0ZS0+ZXJyb3IoKSk7CgogICAgZXhpdDsKfQoKCgojCiMgYWN0aW9uPSdkZWxldGUnIC0+IHJlYWxseSBkZWxldGUgdGhlIHZlcnNpb24KIwoKaWYgKCRhY3Rpb24gZXEgJ2RlbGV0ZScpIHsKICAgIENoZWNrVmVyc2lvbigkcHJvZHVjdCwgJHZlcnNpb24pOwogICAgbXkgJHByb2R1Y3RfaWQgPSBnZXRfcHJvZHVjdF9pZCgkcHJvZHVjdCk7CgogICAgdHJpY2tfdGFpbnQoJHZlcnNpb24pOwoKICAgIG15ICRuYl9idWdzID0KICAgICAgJGRiaC0+c2VsZWN0cm93X2FycmF5KCJTRUxFQ1QgQ09VTlQoYnVnX2lkKSBGUk9NIGJ1Z3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBwcm9kdWN0X2lkID0gPyBBTkQgdmVyc2lvbiA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLCAoJHByb2R1Y3RfaWQsICR2ZXJzaW9uKSk7CgogICAgIyBUaGUgdmVyc2lvbiBjYW5ub3QgYmUgcmVtb3ZlZCBpZiB0aGVyZSBhcmUgYnVncwogICAgIyBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICBpZiAoJG5iX2J1Z3MpIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigidmVyc2lvbl9oYXNfYnVncyIsIHsgbmIgPT4gJG5iX2J1Z3MgfSk7CiAgICB9CgogICAgJGRiaC0+ZG8oIkRFTEVURSBGUk9NIHZlcnNpb25zIFdIRVJFIHByb2R1Y3RfaWQgPSA/IEFORCB2YWx1ZSA9ID8iLAogICAgICAgICAgICAgIHVuZGVmLCAoJHByb2R1Y3RfaWQsICR2ZXJzaW9uKSk7CgogICAgdW5saW5rICIkZGF0YWRpci92ZXJzaW9uY2FjaGUiOwoKICAgICR2YXJzLT57J25hbWUnfSA9ICR2ZXJzaW9uOwogICAgJHZhcnMtPnsncHJvZHVjdCd9ID0gJHByb2R1Y3Q7CgogICAgJHRlbXBsYXRlLT5wcm9jZXNzKCJhZG1pbi92ZXJzaW9ucy9kZWxldGVkLmh0bWwudG1wbCIsICR2YXJzKQogICAgICB8fCBUaHJvd1RlbXBsYXRlRXJyb3IoJHRlbXBsYXRlLT5lcnJvcigpKTsKICAgIGV4aXQ7Cn0KCgoKIwojIGFjdGlvbj0nZWRpdCcgLT4gcHJlc2VudCB0aGUgZWRpdCB2ZXJzaW9uIGZvcm0KIwojIChuZXh0IGFjdGlvbiB3b3VsZCBiZSAndXBkYXRlJykKIwoKaWYgKCRhY3Rpb24gZXEgJ2VkaXQnKSB7CgogICAgQ2hlY2tWZXJzaW9uKCRwcm9kdWN0LCR2ZXJzaW9uKTsKICAgIG15ICRwcm9kdWN0X2lkID0gZ2V0X3Byb2R1Y3RfaWQoJHByb2R1Y3QpOwoKICAgICR2YXJzLT57J25hbWUnfSA9ICR2ZXJzaW9uOwogICAgJHZhcnMtPnsncHJvZHVjdCd9ID0gJHByb2R1Y3Q7CgogICAgJHRlbXBsYXRlLT5wcm9jZXNzKCJhZG1pbi92ZXJzaW9ucy9lZGl0Lmh0bWwudG1wbCIsCiAgICAgICAgICAgICAgICAgICAgICAgJHZhcnMpCiAgICAgIHx8IFRocm93VGVtcGxhdGVFcnJvcigkdGVtcGxhdGUtPmVycm9yKCkpOwoKICAgIGV4aXQ7Cn0KCgoKIwojIGFjdGlvbj0ndXBkYXRlJyAtPiB1cGRhdGUgdGhlIHZlcnNpb24KIwoKaWYgKCRhY3Rpb24gZXEgJ3VwZGF0ZScpIHsKCiAgICBteSAkdmVyc2lvbm9sZCA9IHRyaW0oJGNnaS0+cGFyYW0oJ3ZlcnNpb25vbGQnKSB8fCAnJyk7CgogICAgQ2hlY2tWZXJzaW9uKCRwcm9kdWN0LCR2ZXJzaW9ub2xkKTsKICAgIG15ICRwcm9kdWN0X2lkID0gZ2V0X3Byb2R1Y3RfaWQoJHByb2R1Y3QpOwoKICAgICMgTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGlzIHRlc3RzIGlzIGltcG9ydGFudC4gSWYgeW91IGNoYW5nZQogICAgIyB0aGVtLCBiZSBzdXJlIHRvIHRlc3QgZm9yIFdIRVJFPSckdmVyc2lvbicgb3IgV0hFUkU9JyR2ZXJzaW9ub2xkJwoKICAgICRkYmgtPmJ6X2xvY2tfdGFibGVzKCdidWdzIFdSSVRFJywKICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9ucyBXUklURScsCiAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjdHMgUkVBRCcpOwoKICAgIGlmICgkdmVyc2lvbiBuZSAkdmVyc2lvbm9sZCkgewogICAgICAgIHVubGVzcyAoJHZlcnNpb24pIHsKICAgICAgICAgICAgVGhyb3dVc2VyRXJyb3IoJ3ZlcnNpb25fYmxhbmtfbmFtZScpOwogICAgICAgIH0KICAgICAgICBpZiAoVGVzdFZlcnNpb24oJHByb2R1Y3QsJHZlcnNpb24pKSB7CiAgICAgICAgICAgIFRocm93VXNlckVycm9yKCd2ZXJzaW9uX2FscmVhZHlfZXhpc3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgeyduYW1lJyA9PiAkdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWN0JyA9PiAkcHJvZHVjdH0pOwogICAgICAgIH0KICAgICAgICBTZW5kU1FMKCJVUERBVEUgYnVncwogICAgICAgICAgICAgICAgIFNFVCB2ZXJzaW9uPSIgLiBTcWxRdW90ZSgkdmVyc2lvbikgLiAiCiAgICAgICAgICAgICAgICAgV0hFUkUgdmVyc2lvbj0iIC4gU3FsUXVvdGUoJHZlcnNpb25vbGQpIC4gIgogICAgICAgICAgICAgICAgICAgQU5EIHByb2R1Y3RfaWQgPSAkcHJvZHVjdF9pZCIpOwogICAgICAgIFNlbmRTUUwoIlVQREFURSB2ZXJzaW9ucwogICAgICAgICAgICAgICAgIFNFVCB2YWx1ZSA9ICIgLiBTcWxRdW90ZSgkdmVyc2lvbikgLiAiCiAgICAgICAgICAgICAgICAgV0hFUkUgcHJvZHVjdF9pZCA9ICRwcm9kdWN0X2lkCiAgICAgICAgICAgICAgICAgICBBTkQgdmFsdWUgPSAiIC4gU3FsUXVvdGUoJHZlcnNpb25vbGQpKTsKICAgICAgICB1bmxpbmsgIiRkYXRhZGlyL3ZlcnNpb25jYWNoZSI7CgogICAgICAgICR2YXJzLT57J3VwZGF0ZWRfbmFtZSd9ID0gMTsKICAgIH0KCiAgICAkZGJoLT5iel91bmxvY2tfdGFibGVzKCk7IAoKICAgICR2YXJzLT57J25hbWUnfSA9ICR2ZXJzaW9uOwogICAgJHZhcnMtPnsncHJvZHVjdCd9ID0gJHByb2R1Y3Q7CiAgICAkdGVtcGxhdGUtPnByb2Nlc3MoImFkbWluL3ZlcnNpb25zL3VwZGF0ZWQuaHRtbC50bXBsIiwKICAgICAgICAgICAgICAgICAgICAgICAkdmFycykKICAgICAgfHwgVGhyb3dUZW1wbGF0ZUVycm9yKCR0ZW1wbGF0ZS0+ZXJyb3IoKSk7CgogICAgZXhpdDsKfQoKCgojCiMgTm8gdmFsaWQgYWN0aW9uIGZvdW5kCiMKVGhyb3dVc2VyRXJyb3IoJ25vX3ZhbGlkX2FjdGlvbicsIHsnZmllbGQnID0+ICJ2ZXJzaW9uIn0pOwo=