IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSBVUExPQUQgaW4gR0lUSFVCCiMgM2IgYWRkIEBoZWFkIGFuZCBAZGVwcmVsIHRvIEk1IHNvd2llIGF1Y2ggQG1zZAojIDNjIGJlYXJiZWl0dW5nIHZvbiBAaGVhZCB1bmQgQGRlcHJlbCBpbiB0ZWkya29yYXB4bWwgZHVyY2ggTmlscz8KIyAzZCBidWlsZCAzMCBiaWxsaW9uIGNvcnB1cwoKIyA0YSB0YWtlIGNhcmUgb2YgSURzCiMgNGIgc2VlIHRvIHRoZSB2YWx1ZXMgb2YgQHhtbDpsYW5nCiMgNSBhYmZhbmdlbiB2b24gdW5lcndhcnRldGVuIGVsZW1lbnRlbiBkaCBhbmRlcmUgYWxzIDxzZW50ZW5jZT4gdW5kIDxwYXJhZ3JhcGg+CiMgNWEgd29ydCByZWloZW5mb2xnZSBub2NobWFsIGNoZWNrZW4KIyA2IGNoZWNrcyBhbmQgYmFsYW5jZXMKIyA2YSBvdXRwdXQgbmFjaCBzdGRvdXQgbWFjaGVuCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNoZWNrIGZpbGUgYXJndW1lbnRzOgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBhcmcwIGluZmlsZTogICB2cnQteG1sCiMgYXJnMSBvdXRmaWxlOiAgdGVpCgp1bmxlc3MoJEFSR1ZbMV0pIHsmdXNhZ2VfbWVzc2FnZSgpfTsgIyBtaW4gYXJnMCB1bmQgYXJnMQppZiAoJEFSR1ZbMl0pIHsmdXNhZ2VfbWVzc2FnZSgpfTsgICAgIyBtYXggYXJnMQoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBHTE9CQUwgVkFSSUFCTEVTIAojIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgJGVuY29kaW5nID0gIlVURi04IjsgICAgICAgICAgICAgICAKI215ICRlbmNvZGluZyA9ICJpc28tODg1OS0xIjsgICAgICAgICAgICAgIyBkaWVzZXMgJGVuY29kaW5nIGlzdCBOVVIgZnVlciBkYXMgb3V0cHV0IHMudS4gdHdpZyBmdW5rdGlvbgpteSAkdGV4dGNvdW50ZXIgPSAwOwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICBNIEEgSSBOICAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKIyBvcGVuIHJlc3VsdCBmaWxlIGFuZCBpbml0aWFsaXNlIGZpbGVoYW5kbGUKb3BlbihteSAkT1VULCAiPiAkQVJHVlsxXSIpIHx8IGRpZSgiY2Fubm90IG9wZW4gZmlsZTogJEFSR1ZbMV0iKTsgCgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHN0YXJ0IHR3aWcgYW5kIGNhbGwgc3RhcnQgdGFnIGhhbmRsZXIgZm9yIHJvb3QgYW5kIHR3aWcgaGFuZGxlciBmb3IgZWFjaCA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdHdpZz0iIjsgICAKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIHByZXR0eV9wcmludCA9PiAnaW5kZW50ZWQnLAogICAgc3RhcnRfdGFnX2hhbmRsZXJzID0+IHsKICAgIAl0ZXh0cyA9PiBcJnJvb3QKICAgIH0sCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7Cgl0ZXh0ID0+IFwmdGV4dAogICAgfSwKICAgICMgZHRkX2hhbmRsZXJzID0+ICAgeyAgICAgICAjIFRvRG8gZm9yIEk1CiAgICAjCVwmc2V0X2R0ZDsKICAgICMgfQogICAgb3V0cHV0X2VuY29kaW5nID0+ICRlbmNvZGluZywKICAgICk7CgokdHdpZy0+cGFyc2VmaWxlKCRBUkdWWzBdKTsKCmNsb3NlKCRPVVQpOwoKCiMjIyMjIyMjIyMjCiMgRU5EIE1BSU4KIyMjIyMjIyMjIyMKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgUyBVIEIgUiBPIFUgVCBJIE4gRSBTCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBzdWIgc2V0X2R0ZCBbCiMgICAgbXkgJHR3aWcsICRkdGQgPSBAXzsKIyAgICBteSAkaW50ZXJuYWwgPSBxcXxcblBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iXG4iRFREL3hodG1sMS1zdHJpY3QuZHRkInw7CiMKIyAgICAkdHdpZy0+dHdpZ19kb2N0eXBlKCdodG1sJywgdW5kZWYsIHVuZGVmLCAkaW50ZXJuYWwpOwojICAgIH0KCgoKc3ViIHJvb3QgewogICAgbXkgKCR0d2lnLCAkcm9vdCkgPUBfOwoKICAgICRyb290LT5zZXRfZ2koJ3RlaUNvcnB1cycpOwogICAgJHJvb3QtPnNldF9hdHQoInhtbG5zIiwgJ2h0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCcpOwoKICAgICZpbnNlcnRDb3JwdXNIZWFkZXIoJHJvb3QpOyAgICAKfQoKCnN1YiBpbnNlcnRDb3JwdXNIZWFkZXJ7CiAgICBteSAoJHJvb3QpID1AXzsKCiAgICBteSBAYXJyYXkgPSBzcGxpdCgvXC8vLCAkQVJHVlswXSk7CiAgICBteSAkbCA9IHNjYWxhcihAYXJyYXkpOwogICAgbXkgJHNvdXJjZSA9ICRhcnJheVskbC0xXTsKICAgICRzb3VyY2UgPX4gcy9cLnhtbC8vOwogICAgJHNvdXJjZSA9ICRzb3VyY2UgLiAiIGZyb20gS0xLLUZJIjsgICAgICAgIyBmb3IgdGhlIHRpbWUgYmVpbmc7IFRPRE8KICAgIAogICAgbXkgJHRlaUhlYWRlciAgICAgICAgPSAkcm9vdCAgICAgICAgICAgLT5pbnNlcnRfbmV3X2VsdCgiZmlyc3RfY2hpbGQiLCAndGVpSGVhZGVyJyk7ICAgIAogICAgbXkgJGZpbGVEZXNjICAgICAgICAgPSAkdGVpSGVhZGVyICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdmaWxlRGVzYycpOwogICAgbXkgJHByb2ZpbGVEZXNjICAgICAgPSAkdGVpSGVhZGVyICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwcm9maWxlRGVzYycpOwogICAgCiAgICBteSAkdGl0bGVTdG10ICAgICAgICA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RpdGxlU3RtdCcpOwogICAgbXkgJHRpdGxlICAgICAgICAgICAgPSAkdGl0bGVTdG10ICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScpOwogICAgJHRpdGxlICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkc291cmNlIC4gIiBmcm9tIEtMSy1maS0yMDIxIGZvciBFdVJlQ28iKTsKICAgIAogICAgbXkgJHB1YmxpY2F0aW9uU3RtdCAgPSAkZmlsZURlc2MgICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJsaWNhdGlvblN0bXQnKTsKICAgIG15ICRkaXN0cmlidXRvciAgICAgID0gJHB1YmxpY2F0aW9uU3RtdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGlzdHJpYnV0b3InKTsKICAgICRkaXN0cmlidXRvciAgICAgICAgIC0+c2V0X3RleHQoIk5PVCBGT1IgRElTVFJJQlVUSU9OIC0gdG8gYmUgdXNlZCBsb2NhbGx5IGluIEV1UmVDbyIpOwoKICAgIG15ICRzb3VyY2VEZXNjICAgICAgID0gJGZpbGVEZXNjICAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnc291cmNlRGVzYycpOwogICAgbXkgJGJpYmwgICAgICAgICAgICAgPSAkc291cmNlRGVzYyAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsJyk7CiAgICAkYmlibCAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRzb3VyY2UpOwoKICAgIG15ICRsYW5nVXNhZ2UgICAgICAgID0gJHByb2ZpbGVEZXNjICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGFuZ1VzYWdlJyk7CiAgICBteSAkbGFuZ3VhZ2UgICAgICAgICA9ICRsYW5nVXNhZ2UgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmd1YWdlJyk7CiAgICAkbGFuZ3VhZ2UgICAgICAgICAgICAtPnNldF9hdHQoImlkZW50IiwnZmknKTsKICAgICRsYW5ndWFnZSAgICAgICAgICAgIC0+c2V0X3RleHQoIkZpbm5pc2giKTsKfQogICAgCiAgICAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBoYW5kbGVyICZ0ZXh0IGZvciA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN1YiB0ZXh0IHsKICAgIG15ICgkdHdpZywgJHRleHQpID0gQF87CgogICAgJHRleHRjb3VudGVyKys7ICAgICAgICAgICAgICAgIyBnbG9iYWwgdmFyaWFibGUKCiAgICAjIFRvRG86IGNhdGNoIGFsbCBvdGhlciwgdW5leHBlY3RlZCBjaGlsZHJlbiBvZiByb290CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0ZXh0IG1ldGFkYXRhIChhdHRyaWJ1dGVzIG9mIDx0ZXh0PikgYW5kIGNyZWF0ZSB0ZWlIZWFkZXIgZm9yIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0ZXh0YXR0c3JlZiA9ICR0ZXh0LT5hdHRzKCk7ICAgICAgICAgICAgICAgIyAkdGV4dGF0dHNyZWYgaXMgbm93IGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aCAnLT4nCgogICAgJmNyZWF0ZVRleHRIZWFkZXIoJHRleHQsICR0ZXh0YXR0c3JlZik7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSA8VEVJPiBmcm9tIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICMgc2V0IHZydCA8dGV4dD4gdG8gPFRFST4gYW5kIGRlbGV0ZSBhbGwgYXR0cmlidXRlcyBhZnRlciB0aGV5IHdlcmUgd2VyZSBzYXZlZCBhYm92ZQogICAgJHRleHQtPmRlbF9hdHRzOwogICAgJHRleHQtPnNldF9naSgiVEVJIik7CiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIHRoZSA8dGVpOnRleHQ+LCA8Ym9keT4sIDxkaXY+IGVsZW1lbnRzIGluc2lkZSA8VEVJPgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSAkdHRleHRfZWxlbWVudCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3RleHQnKTsKICAgIG15ICRib2R5X2VsZW1lbnQgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnYm9keScpOwogICAgbXkgJGRpdl9lbGVtZW50ICAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdkaXYnKTsKCiAgICAjIHNldCBhdHRzCiAgICAkZGl2X2VsZW1lbnQgIC0+c2V0X2F0dCgidHlwZSIsICJwYWdlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvRG86IHRoaXMgaXMgc3BlY2lmaWMgdG8gS0xLCiAgICAkdHRleHRfZWxlbWVudC0+c2V0X2F0dCgieG1sOmxhbmciLCAnZmknKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBpbiBJQ0MtTk9SCgogICAgIyBwYXN0ZQogICAgJHR0ZXh0X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgICR0ZXh0KTsKICAgICRib2R5X2VsZW1lbnQgLT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdHRleHRfZWxlbWVudCk7CiAgICAkZGl2X2VsZW1lbnQgIC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJGJvZHlfZWxlbWVudCk7CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPHA+IGZyb20gPHBhcmFncmFwaD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEBwYXJhZ3JhcGhzID0gJHRleHQtPmNoaWxkcmVuKCAncGFyYWdyYXBoJyk7CgogICAgZm9yZWFjaCBteSAkcGFyYWdyYXBoIChAcGFyYWdyYXBocykgewoJCgkmc2V0UCgkcGFyYWdyYXBoKTsKCgkkcGFyYWdyYXBoLT5tb3ZlKCdsYXN0X2NoaWxkJywgJGRpdl9lbGVtZW50KTsKCQoJCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkjIGNyZWF0ZSA8cz4gZnJvbSA8c2VudGVuY2U+CgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCW15IEBzZW50ZW5jZXMgPSAkcGFyYWdyYXBoLT5jaGlsZHJlbignc2VudGVuY2UnKTsKCWZvcmVhY2ggbXkgJHNlbnRlbmNlIChAc2VudGVuY2VzKSB7CgoJICAgICZzZXRTKCRzZW50ZW5jZSk7CgoKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAjIGNyZWF0ZSA8dz4gKHdvcmQpIGZyb20gZWFjaCAkbGluZQoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgIAoJICAgIG15IEBsaW5lcyA9IHNwbGl0KC9cbisvLCAkc2VudGVuY2UtPnhtbF90ZXh0KTsKCSAgICAkc2VudGVuY2UtPnNldF90ZXh0KCJcbiIpOwoKCSAgICBmb3IgbXkgJGxpbmUgKEBsaW5lcyl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb2RvOiBSZWloZW5mb2xnZSBjaGVja2VuCgkJaWYoJGxpbmUgbmUgIiIgKXsKCQkgICAgbXkgJHdfZWxlbWVudCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3cnKTsKCQkgICAgJmNyZWF0ZVcoJHdfZWxlbWVudCwgJGxpbmUpOwoJCSAgICAkd19lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICRzZW50ZW5jZSk7CgkJfQoJICAgIH0gIyBlbmQgd29yZHMKCX0gIyBlbmQgc2VudGVuY2VzCiAgICB9ICMgZW5kIHBhcmFncmFwaHMKCiAgICAkdHdpZy0+Zmx1c2goJE9VVCk7Cn0gICAjIGVuZCB0ZXh0cwoKCnN1YiBjcmVhdGVUZXh0SGVhZGVyewogICAgbXkgKCR0ZXh0LCAkdGV4dGF0dHNyZWYpID0gQF87CiAgICAKICAgICMgVVNFIDAxIGJpbmRpbmdfaWQ9IjIyNDYwMjUiCiAgICAjIFVTRSAwMiBkYXRlPSIyMDIxLTAxLTE1IgogICAgIyAgICAgMDMgZGF0ZWZyb209IjIwMjEwMTE1IgogICAgIyAgICAgMDQgZGF0ZXRvPSIyMDIxMDExNSIKICAgICMgICAgIDA1IGVsZWNfZGF0ZT0iXyIKICAgICMgICAgIDA2IGZpbGU9IiIKICAgICMgVVNFIDA3IGZpbGVuYW1lX21ldGFkYXRhPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfbWV0cy54bWwiCiAgICAjIFVTRSAwOCBmaWxlbmFtZV9vcmlnICAgID0iZmluY2xhcmluX3NpaXJ0b19rMjAyMS8wMDM5LTU1NTIvMjAyMS9hbHRvLzIyNDYwMjVfMDAzOS01NTUyXzIwMjEtMDEtMTVfU0swMjIxX3BhZ2UtMjAyMTAxMTUwMjIxMDAzMDMwMS54bWwKICAgICMgVVNFIDA5IGlkPSJ0LWJjZDBmM2ZhLWJiZDNkYWM0IgogICAgIyAgICAgMTAgaW1nX3VybD0iIgogICAgIyBVU0UgMTEgaXNzdWVfZGF0ZT0iMTUuMDEuMjAyMSIKICAgICMgVVNFIDEyIGlzc3VlX25vPSJTSzAyMjEiCiAgICAjIFVTRSAxMyBpc3N1ZV90aXRsZT0iU3VvbWVuIEt1dmFsZWh0aSIKICAgICMgVVNFIDE0IGxhYmVsPSJTdW9tZW4gS3V2YWxlaHRpIG5vLiBTSzAyMjEgMTUuMDEuMjAyMSIKICAgICMgVVNFIDE2IGxhbmd1YWdlPSJmaSIKICAgICMgVVNFIDE3IHBhZ2VfaWQ9InAxIgogICAgIyBVU0UgMTggcGFnZV9ubz0iTm9uZSIKICAgICMgICAgIDE5IHBhcnRfbmFtZT0iXyIKICAgICMgICAgIDIwIHB1YmxfaWQ9IjAwMzktNTU1MiIKICAgICMgICAgIDIxIHB1YmxfcGFydD0iIgogICAgIyBVU0UgMjIgcHVibF90aXRsZT0iU3VvbWVuIEt1dmFsZWh0aSIgCiAgICAjIFVTRSAyMyBwdWJsX3R5cGU9ImFpa2FrYXVzaSIKICAgICMgVVNFIDI0IHNlbnRjb3VudD0iNzAiCiAgICAjIFVTRSAyNSBzdW1fbGFuZz0ifHh4eDo0NHxmaW46MjN8ZW5nOjN8IgogICAgIyAgICAgMjYgdGltZWZyb209IjAwMDAwMCIKICAgICMgICAgIDI3IHRpbWV0bz0iMjM1OTU5IgogICAgIyBVU0UgMjggdG9rZW5jb3VudD0iMzA0IgogICAgIyAgICAgMjkgdmVyc2lvbl9hZGRlZD0iS0xLLWZpLTIwMjEiPgoKCiAgICBteSAkQklEICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2JpbmRpbmdfaWQnfTsKICAgIG15ICREQVRFICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnZGF0ZSd9OwogICAgbXkgJE1FVEFGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9tZXRhZGF0YSd9OyAgICAKICAgIG15ICRPUklHRklMRU5BTUUgPSAkdGV4dGF0dHNyZWYtPnsnZmlsZW5hbWVfb3JpZyd9OwogICAgbXkgJElEICAgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydpZCd9OwogICAgbXkgJElTU1VFREFURSAgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV9kYXRlJ307CiAgICBteSAkSVNTVUVOTyAgICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX25vJ307CiAgICBteSAkSVNTVUVUSVRMRSAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX3RpdGxlJ307CiAgICBteSAkTEFCRUwgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2xhYmVsJ307CiAgICBteSAkTEFOR1VBR0UgICAgID0gJHRleHRhdHRzcmVmLT57J2xhbmd1YWdlJ307CiAgICBteSAkUEFHRUlEICAgICAgID0gJHRleHRhdHRzcmVmLT57J3BhZ2VfaWQnfTsKICAgIG15ICRQQUdFTk8gICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9ubyd9OwogICAgbXkgJFBVQkxUSVRMRSAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX3RpdGxlJ307CiAgICBteSAkUFVCTFRZUEUgICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdHlwZSd9OwogICAgbXkgJFNFTlRDT1VOVCAgICA9ICR0ZXh0YXR0c3JlZi0+eydzZW50Y291bnQnfTsKICAgIG15ICRTVU1MQU5HICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnc3VtX2xhbmcnfTsKICAgIG15ICRUT0tFTkNPVU5UICAgPSAkdGV4dGF0dHNyZWYtPnsndG9rZW5jb3VudCd9OwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIERlcml2ZWQgTWV0YWRhdGEgdmFyaWFibGVzCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBteSBAZGF0ZWFycmF5ID0gc3BsaXQoIi0iLCAkREFURSk7CiAgICBteSBAbGFuZ2FycmF5ID0gc3BsaXQoInwiLCAkU1VNTEFORyk7CiAgICBteSBAbmFtZWFycmF5ID0gc3BsaXQoL1tcLlwvXS8sICRPUklHRklMRU5BTUUpOyAgIyB1c2UgJG5hbWVhcnJheVs0XSBhcyBJRCBmb3IgdGhlIHBhZ2UKICAgIAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiBrbGstaGVhZGVyLnRlaS54bWwKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICMgY3JlYXRlIDx0ZWlIZWFkZXI+IGluc2lkZSA8VEVJPgogICAgbXkgJHRlaUhlYWRlciA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3RlaUhlYWRlcicpOwogICAgJHRlaUhlYWRlci0+cGFzdGUoJ2ZpcnN0X2NoaWxkJywgJHRleHQpOwoKICAgICMjIGluc2VydF9uZXdfZWx0IGlzIGEgY29tYm8gb2YgbmV3IGFuZCBwYXN0ZSwgY2YuIHhtbDo6dHdpZyBkb2N1OgogICAgIyMgaW5zZXJ0X25ld19lbHQgKCRvcHRfcG9zaXRpb24sICRnaSwgJG9wdF9hdHRzX2hhc2hyZWYsIEBvcHRfY29udGVudCkKICAgIAogICAgbXkgJGZpbGVEZXNjICAgICA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCdmaWxlRGVzYycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiB7biA9PiAiRXVSZUNvX0tMSy1maV8iIC4gJG5hbWVhcnJheVs0XX0pOwogICAgbXkgJGVuY29kaW5nRGVzYyA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2VuY29kaW5nRGVzYycpOwogICAgbXkgJHByb2ZpbGVEZXNjICA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Byb2ZpbGVEZXNjJyk7CiAgICBteSAkcmV2aXNpb25EZXNjID0gJHRlaUhlYWRlci0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncmV2aXNpb25EZXNjJyk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBmaWxlRGVzYy90aXRsZVN0bXQKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICR0aXRsZVN0bXQgPSAkZmlsZURlc2MgLT5pbnNlcnRfbmV3X2VsdCgndGl0bGVTdG10Jyk7CiAgICBteSAkdGl0bGUgICAgID0gJHRpdGxlU3RtdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGUnKTsKICAgIG15ICRyZXNwU3RtdCAgPSAkdGl0bGVTdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdyZXNwU3RtdCcpOwogICAgbXkgJHJlc3AgICAgICA9ICRyZXNwU3RtdCAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Jlc3AnKTsKICAgIG15ICRuYW1lICAgICAgPSAkcmVzcFN0bXQgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICduYW1lJyk7CgogICAgIyBzZXQgdGV4dHMgZm9yIHRpdGxlU3RtdAogICAgIyAkdGl0bGUtPnNldF90ZXh0KCRMQUJFTCAuICIsIHBhZ2UgIiAuICRQQUdFTk8pOyAgICAgICAgICAgIyBBY2h0dW5nIC0gUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KICAgICR0aXRsZS0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAgICMgYXQgbGVhc3QgZm9yIFN1b21lbiBLdXZhbGVodGkKICAgICRyZXNwIC0+c2V0X3RleHQoImNvbXBpbGVkIGJ5IEV1UmVDbyIpOwogICAgJG5hbWUgLT5zZXRfdGV4dCgiRXVSZUNvOiBITCIpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBmaWxlRGVzYy9wdWJsaWNhdGlvblN0bXQKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbXkgJHB1YmxpY2F0aW9uU3RtdCA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3B1YmxpY2F0aW9uU3RtdCcpOwogICAgbXkgJGRpc3RyaWJ1dG9yICAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2Rpc3RyaWJ1dG9yJyk7CiAgICBteSAkbm90ZSAgICAgICAgICAgID0gJGRpc3RyaWJ1dG9yICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbm90ZScpOwogICAgbXkgJGF2YWlsYWJpbGl0eSAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2F2YWlsYWJpbGl0eScpOyAKICAgIG15ICRsaWNlbmNlICAgICAgICAgPSAkYXZhaWxhYmlsaXR5ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdsaWNlbmNlJyk7CgogICAgIyBzZXQgdGV4dHMgZm9yIHB1YmxpY2F0aW9uU3RtdAogICAgJG5vdGUgICAtPnNldF90ZXh0KCJOT1QgRk9SIERJU1RSSUJVVElPTiAtIHRvIGJlIHVzZWQgbG9jYWxseSBpbiBFdVJlQ28iKTsKICAgICRsaWNlbmNlLT5zZXRfdGV4dCgiQ0xBUklOLVJFUyIpOyAgIyBUT0RPOiBBdXNmdWhlcmxpY2hlcmUgTGljZW5jZSBpbmZvIGluIEtMSyBNZXRhZGF0YSBSZWNvcmQKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbXkgJHNvdXJjZURlc2MgPSAkZmlsZURlc2MgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnc291cmNlRGVzYycpOwogICAgbXkgJGJpYmxTdHJ1Y3QgICA9ICRzb3VyY2VEZXNjLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU3RydWN0Jyk7CgogICAgIyBmaWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvYW5hbHl0aWMKICAgIG15ICRhbmFseXRpYyAgICAgICAgICAgICAgICA9ICRiaWJsU3RydWN0LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdhbmFseXRpYycpOwogICAgbXkgJGFuYWx5dGljX3RpdGxlICAgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScgICAgICAgID0+IHt0eXBlID0+ICJtYWluIn0gKTsKIyAgICBteSAkYW5hbHl0aWNfZGF0ZSAgICAgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2RhdGUnKTsKICAgIG15ICRhbmFseXRpY19kYXRlX3llYXIgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScgICAgICAgICA9PiB7dHlwZSA9PiAieWVhciJ9KTsKICAgIG15ICRhbmFseXRpY19kYXRlX21vbnRoICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScgICAgICAgICA9PiB7dHlwZSA9PiAibW9udGgifSk7CiAgICBteSAkYW5hbHl0aWNfZGF0ZV9kYXkgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2RhdGUnICAgICAgICAgPT4ge3R5cGUgPT4gImRheSJ9KTsKICAgIG15ICRhbmFseXRpY19pZG5vX3BhZ2VpZCAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnaWRubycgICAgICAgICA9PiB7dHlwZSA9PiAiUEFHRUlEIn0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9fYmluZGluZ2lkID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJCSU5ESU5HSUQifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19pZCAgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIklEIn0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9fbWV0YWZpbGUgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJLSUVMSVBBTktLSV9NRVRBRklMRU5BTUUifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19vcmlnZmlsZSAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSJ9KTsKICAgIG15ICRhbmFseXRpY190ZXh0bGFuZyAgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGV4dExhbmcnKTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgYW5hbHl0aWMKIyAgICAkYW5hbHl0aWNfdGl0bGUgICAgICAgICAtPnNldF90ZXh0KCRMQUJFTCAuICIsIHBhZ2UgIiAuICRQQUdFTk8pOyAgIyBBY2h0dW5nICRQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSB6dSBzZWluIgogICAgJGFuYWx5dGljX3RpdGxlICAgICAgICAgLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBUZXh0ICMiIC4gJHRleHRjb3VudGVyKTsgICMgQWNodHVuZyAkUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUgenUgc2VpbiIKIyAgICAkYW5hbHl0aWNfZGF0ZSAgICAgICAgIC0+c2V0X3RleHQoJERBVEUpOwogICAgJGFuYWx5dGljX2RhdGVfeWVhciAgICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzBdKTsKICAgICRhbmFseXRpY19kYXRlX21vbnRoICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsxXSk7CiAgICAkYW5hbHl0aWNfZGF0ZV9kYXkgICAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOwogICAgJGFuYWx5dGljX2lkbm9fcGFnZWlkICAgLT5zZXRfdGV4dCgkUEFHRUlEKTsKICAgICRhbmFseXRpY19pZG5vX2JpbmRpbmdpZC0+c2V0X3RleHQoJEJJRCk7CiAgICAkYW5hbHl0aWNfaWRub19pZCAgICAgICAtPnNldF90ZXh0KCRJRCk7CiAgICAkYW5hbHl0aWNfaWRub19tZXRhZmlsZSAtPnNldF90ZXh0KCRNRVRBRklMRU5BTUUpOwogICAgJGFuYWx5dGljX2lkbm9fb3JpZ2ZpbGUgLT5zZXRfdGV4dCgkT1JJR0ZJTEVOQU1FKTsKICAgICRhbmFseXRpY190ZXh0bGFuZyAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L21vbm9ncgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICRtb25vZ3IgICAgICAgICAgICAgICA9ICRiaWJsU3RydWN0LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdtb25vZ3InKTsKICAgIG15ICRtb25vZ3JfdGl0bGUgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScpOwogICAgbXkgJGltcHJpbnQgICAgICAgICAgICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2ltcHJpbnQnKTsgICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB2YWxpZGlkdHkKICAgIG15ICRwdWJQbGFjZSAgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJQbGFjZScpOyAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKICAgIG15ICRwdWJsaXNoZXIgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJsaXNoZXInKTsgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKICAgIG15ICRiaWJsU2NvcGVfaXNzdWV0aXRsZSA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU2NvcGUnICAgPT4ge3VuaXQgPT4gJ0lTU1VFVElUTEUnfSApOwogICAgbXkgJGJpYmxTY29wZV9pc3N1ZW5vICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnSVNTVUVOTyd9ICk7CiAgICBteSAkYmlibFNjb3BlX2lzc3VlZGF0ZSAgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRURBVEUnfSApOwogICAgbXkgJGJpYmxTY29wZV9wcCAgICAgICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnUEFHRU5PJ30gKTsgICAgICAjIEFjaHR1bmcgUEFHRU5PIGlzdCBtZWlzdCAiTm9uZSIgPwoKICAgICMgc2V0IHRleHRzIGZvciBtb25vZ3IKICAgICRtb25vZ3JfdGl0bGUgICAgICAgIC0+c2V0X3RleHQoJFBVQkxUSVRMRSk7CiAgICAkcHViUGxhY2UgICAgICAgICAgICAtPnNldF90ZXh0KCJUT0RPIik7CiAgICAkcHViUGxhY2UgICAgICAgICAgICAtPnNldF9hdHQoImtleSIsJ0ZJJyk7CiAgICAkcHVibGlzaGVyICAgICAgICAgICAtPnNldF90ZXh0KCJUT0RPIik7CiAgICAkYmlibFNjb3BlX2lzc3VldGl0bGUtPnNldF90ZXh0KCRJU1NVRVRJVExFKTsKICAgICRiaWJsU2NvcGVfaXNzdWVubyAgIC0+c2V0X3RleHQoJElTU1VFTk8pOwogICAgJGJpYmxTY29wZV9pc3N1ZWRhdGUgLT5zZXRfdGV4dCgkSVNTVUVEQVRFKTsKICAgICRiaWJsU2NvcGVfcHAgICAgICAgIC0+c2V0X3RleHQoJFBBR0VOTyk7CiAKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgICMgZW5jb2RpbmdEZXNjCiAgICAjLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkdGFnc0RlY2wgICAgID0gJGVuY29kaW5nRGVzYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnc0RlY2wnKTsKICAgIG15ICRuYW1lc3BhY2UgICAgPSAkdGFnc0RlY2wgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICduYW1lc3BhY2UnICAgID0+IHtuYW1lID0+ICdodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAnfSk7CiAgICBteSAkdGFnVXNhZ2VfcyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAncycsIG9jY3VycyA9PiAkU0VOVENPVU5UfSk7CiAgICBteSAkdGFnVXNhZ2VfdyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAndycsIG9jY3VycyA9PiAkVE9LRU5DT1VOVH0pOwogICAgCiAgICAjLS0tLS0tLS0tLS0tLQogICAgIyBwcm9maWxlRGVzYwogICAgIy0tLS0tLS0tLS0tLS0KICAgIG15ICRsYW5nVXNhZ2UgICA9ICRwcm9maWxlRGVzYyAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmdVc2FnZScpOwogICAgbXkgJGxhbmd1YWdlICAgID0gJGxhbmdVc2FnZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGFuZ3VhZ2UnICAgICAgPT4ge2lkZW50ID0+ICRMQU5HVUFHRSwgdXNhZ2UgPT4gJFNVTUxBTkd9KTsKICAgICMgQWNodHVuZyBpbiBAdXNhZ2UgbXVzcyBlaWd0LiBlaW4gaW50ZWdlcjsgYW0gYmVzdGVuIGluaGFsdCB2b24gU1VNTEFORyBhdWZkcm9lc2VsbiB1bmQgbWVocmVyZSA8bGFuZ3VhZ2U+IG1hY2hlbgogICAgbXkgJHRleHRDbGFzcyAgID0gJHByb2ZpbGVEZXNjIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGV4dENsYXNzJyk7CiAgICBteSAkY2xhc3NDb2RlX2ZpICAgPSAkdGV4dENsYXNzICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjbGFzc0NvZGUnID0+IHtzY2hlbWUgICAgICAgPT4gIktMS19QVUJMVFlQRSJ9KTsKIyAgICBteSAkY2xhc3NDb2RlX2VuICAgPSAkdGV4dENsYXNzICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjbGFzc0NvZGUnID0+IHtzY2hlbWUgICAgICA9PiAiS0xLX1BVQkxUWVBFX01BUFBFRCJ9KTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCB0ZXh0cyBmb3IgcHJvZmlsZURlc2MKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICRjbGFzc0NvZGVfZmkgLT5zZXRfdGV4dCgkUFVCTFRZUEUpOwojICAgICRjbGFzc0NvZGVfZW4tPnNldF90ZXh0KCRQVUJMVFlQRVRSQU5TTCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLQogICAgIyByZXZpc2lvbkRlc2MKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgIG15ICRjaGFuZ2UgICAgICA9ICRyZXZpc2lvbkRlc2MgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjaGFuZ2UnICAgICAgID0+IHt3aGVuID0+IGxvY2FsdGltZS0+eW1kKCctJyksIHdobyA9PiAnSEwnICB9KTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgcmV2aXNpb25EZXNjCiAgICAkY2hhbmdlLT5zZXRfdGV4dCgiVEVJIHZlcnNpb24gZm9yIEV1UmVDbyIpOwoKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyBFTkQgT0YgQ1JFQVRJTkcgVEVJSEVBREVSCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgCn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCnN1YiBzZXRQIHsKICAgIG15ICgkcGFyYWdyYXBoKSA9IEBfOwogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfZ2koJ3AnKTsKICAgIAogICAgIyA8cGFyYWdyYXBoIGlkPSJwLWJjZDBmM2ZhLWJiZDNkYWM0LTgxNWVhZDdhIiBzdW1fbGFuZz0ifGZpbjoxfCI+CiAgICAjIGF0dHMgb2YgPHBhcmFncmFwaD46CiAgICAjICAgIEBpZCAgICAgICAgVVNFCiAgICAjICAgIEBzdW1fbGFuZyAgVVNFOiBwdXQgaW4geG1sOmxhbmcgYW5kIHByZWZpeCB0aGUgdmFsdWUgd2l0aCAieC0iIGZvciBwcml2YXRlIHZhbHVlCiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9hdHQoInhtbDpsYW5nIiwgIngtIiAuICRwYXJhZ3JhcGgtPmF0dCgic3VtX2xhbmciKSk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJzdW1fbGFuZyIpOwogICAgJHBhcmFncmFwaC0+Y2hhbmdlX2F0dF9uYW1lKCdpZCcsICd4bWw6aWQnKTsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UyB7CiAgICBteSAoJHNlbnRlbmNlKSA9IEBfOwogICAgCiAgICAkc2VudGVuY2UtPnNldF9naSgncycpOwoJICAgIAogICAgIyB0aGUgYXR0cyBvZiA8c2VudGVuY2U+OgogICAgIyAgICBVU0UgICAxIEBpZD0icy1iY2QwZjNmYS1iYmQzZGFjNC1mNzQyOTA5MCIKICAgICMgICAgVVNFICAgMiBAbGFuZz0iZmluIiAtPiB4bWw6bGFuZyAKICAgICMgICAgPyAgICAgMyBAbGFuZ19jb25mPSIwLjY3MzQ4NTMiPiAtPiBUb0RvIEBjZXJ0ID8JICAgIAogICAgCiAgICAjIHNldCBhdHRycyBvZiA8cz4KICAgICRzZW50ZW5jZS0+c2V0X2F0dCgieG1sOmxhbmciLCAkc2VudGVuY2UtPmF0dCgibGFuZyIpKTsgICMgVG9EbzogY29udmVydCB0aGUgdmFsdWUgLyBpbnRyb2R1Y2UgYSBoYXNoIGZvciBsb29rdXAgKGlucHV0IHZhbHVlczogImZpbiIsICJ4eHgiLCAuLi4uKQogICAgJHNlbnRlbmNlLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZWQgYnkgeG1sOmxhbmcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZ19jb25mIik7ICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgdGltZSBiZWluZwogICAgCn0KCnN1YiBjcmVhdGVXIHsKICAgIG15ICgkd19lbGVtZW50LCAkbGluZSkgPSBAXzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0aGUgdGFncyAoPWNvbHVtbnMpCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEB0YWdzID0gc3BsaXQoL1x0LywgJGxpbmUpOwogICAgCiAgICAjIHNldCBjb250ZW50IG9mIDx3PiBpLmUuIHRoZSB0b2tlbgogICAgJHdfZWxlbWVudC0+c2V0X3RleHQoJHRhZ3NbMF0pOwogICAgCiAgICAjIHZydCBwb3NpdGlvbmFsLWF0dHJpYnV0ZXMgaW4gY29ycHVzIEtMSzoKICAgICMgIFVTRSBbMF0gd29yZAogICAgIyAgVVNFIFsxXSByZWYgIChpZCBmb3IgcmVmZXJlbmNlIG9mIGRlcGhlYWQpCiAgICAjICBVU0UgWzJdIGxlbW1hCiAgICAjICA/ICAgWzNdIGxlbW1hY29tcCAgIChsZW1tYSB3aXRoIGNvbXBvdW5kIGluZm8gLSBjb3VsZCBnbyBpbiBAbm9ybSwgYXMgdGFnIGFidXNlPykKICAgICMgIFVTRSBbNF0gcG9zIAogICAgIyAgVVNFIFs1XSBtc2QgCiAgICAjICBVU0UgWzZdIGRlcGhlYWQKICAgICMgIFVTRSBbN10gZGVwcmVsIAogICAgIyAgICAgIFs4XSBjb250ZW50ICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgIFs5XSB2cG9zICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEwXSBvY3IgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzExXSBjYyAgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEyXSBoeXBoICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEzXSBzdHlsZSAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzE0XSBsZXggICAgICAgKGtvcnAgc2VtYW50aWMgZGlzYW1iaWd1YXRpb24gZnJvbSBHIm90ZWJvcmcpCiAgICAKICAgICMgc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIDx3PjoKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoIm4iLCAgICAgICR0YWdzWzFdKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgiaWQiLCAgICAgIndfIiAuICRuYW1lYXJyYXlbNF0gLiAkc2VudGVuY2UtPmF0dCgieG1sOmlkIikgLiAiXyIgLiAkdGFnc1sxXSk7CiAgICAjIHNvIHp1c2FtbWVuZ2ViYXV0ZSBJRCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWcuLi4KICAgICR3X2VsZW1lbnQtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJsZW1tYSIsICAkdGFnc1syXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoIm5vcm0iLCAgICR0YWdzWzNdKTsgICMgdGFnIGFidXNlIG9mIEBub3JtCiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJwb3MiLCAgICAkdGFnc1s0XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJtc2QiLCAgICAkdGFnc1s1XSk7CiNUTVAgICAgJHdfZWxlbWVudC0+c2V0X2F0dCgiaGVhZCIsICAgJHRhZ3NbNl0pOwojVE1QICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImRlcHJlbCIsICR0YWdzWzddKTsKICAgIAp9CiAgICAKIyMjIyMjIyMjIyMjIyMjIyMKIyMgdXNhZ2VfbWVzc2FnZQojIyMjIyMjIyMjIyMjIyMjIwoKCnN1YiB1c2FnZV9tZXNzYWdlIHsKICAgIHByaW50ICIgICBVc2FnZTogIC4vdnJ0MnRlaS5wbCA8ZmlsZS52cnQueG1sPiA8b3V0ZmlsZT5cbiI7CiAgICBwcmludCAiICAgPGZpbGUudnJ0LnhtbD4gaXMgYSBWUlQgZmlsZSBjb252ZXJ0ZWQgdG8gcHJvcGVyIFhNTFxuIjsKICAgIGV4aXQ7Cn0KCgo=