IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSByZW1vdmUgdGhlIHZydCBwb3NpdGlvbmFsIGF0dHJpYnV0ZSBjb21tZW50IGxpbmUgLyBhbGwgY29tbWVudCBsaW5lcwojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2hlY2sgZmlsZSBhcmd1bWVudHM6CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGFyZzAgaW5maWxlOiAgIHZydC14bWwKCnVubGVzcygkQVJHVlswXSkgeyZ1c2FnZV9tZXNzYWdlKCl9IDsgIyBtaW4gYXJnMCwgdGhlIGlucHV0IGZpbGUKaWYgICAgKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAjIG1heCBhcmcwLCB0aGUgaW5wdXQgZmlsZQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgCiNteSAkZW5jb2RpbmcgPSAiaXNvLTg4NTktMSI7ICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KbXkgJHRleHRjb3VudGVyID0gMDsKCgoKbXkgJHR3aWc9IiI7ICAgCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2M9IiI7CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgY29ycHVzSGVhZGVyU2tlbGV0b24gZG9jdW1lbnQgYW5kIGdldCBoZWFkZXIgb3V0IG9mIGl0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgoKJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgidGVpQ29ycHVzSGVhZGVyU2tlbGV0b24udGVpLnhtbCIpOwpteSAkY29ycHVzSGVhZGVyID0gJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnJvb3Q7ICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaUNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgdGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50IGFkbiBnZXQgaGVhZGVyIG91dCBvZiBpdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdGVpVGV4dEhlYWRlckRvY1R3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgKTsKCiR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cGFyc2VmaWxlKCJ0ZWlUZXh0SGVhZGVyU2tlbGV0b24udGVpLnhtbCIpOwpteSAkdGV4dEhlYWRlciA9ICR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cm9vdDsgICAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaVRleHRIZWFkZXJTa2VsZXRvbiBkb2N1bWVudAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcmVhZCBpbnB1dCBWUlQtWE1MIGRvY3VtZW50CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRJTiwgICI8ICRBUkdWWzBdIikgfHwgZGllKCIkMDogY2Fubm90IG9wZW4gZmlsZSBmb3IgcmVhZGluZzogJEFSR1ZbMF0iKTsgICAgICMgb3BlbiBpbnB1dCAgZmlsZSBhbmQgaW5pdGlhbGlzZSBmaWxlaGFuZGVsLCBhY3R1YWxseSBkb2VzIG5vdCBzZWVtIHRvIGJlIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgcGFyc2VmaWxlKCkgKHMuYi4pIGlzIGFwcGxpZWQgdG8gdGhlIGZpbGVuYW1lCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBnbG9iYWwgdmFyaWFibGVzIHBlcnRhaW5pbmcgdG8gdGhlIG9yaWdpbmFsIGNvcnB1cyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAka2llbGlwYW5ra2lDb3JwdXMgPSAia2xrLWZpLXYyLXZydCI7CgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgTSBBIEkgTiAgCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBzdGFydCB0d2lnIGZvciBpbnB1dCBhbmQgY2FsbCBzdGFydCB0YWcgaGFuZGxlciBmb3Igcm9vdCBhbmQgdHdpZyBoYW5kbGVyIGZvciBlYWNoIDx0ZXh0PiBpbiB0aGUgVlJUCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKJHR3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwgICAgICAgICAgICMgZGFkdXJjaCBhdWNoIHdoaXRlc3BhY2VzIGFuIGVoZW1lbGlnZW4gZWxlbWVudGdyZW56ZW4gaW0gb3V0cHV0CiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwgICAgICAgIyByZXF1aXJlcyBUaWU6Okl4SGFzaAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgc3RhcnRfdGFnX2hhbmRsZXJzID0+IHsKCXRleHRzID0+IHN1Yntyb290KEBfLCAkY29ycHVzSGVhZGVyKX0KICAgIH0sCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7CiMJdGV4dCA9PiBcJnRleHQKCXRleHQgPT4gIHN1Ynt0ZXh0KEBfLCAkdGV4dEhlYWRlcil9CiAgICB9LAogICAgIyBkdGRfaGFuZGxlcnMgPT4gICB7ICAgICAgICMgVG9EbyBmb3IgSTUKICAgICMJXCZzZXRfZHRkOwogICAgIyB9CiAgICAKICAgIG91dHB1dF9lbmNvZGluZyA9PiAkZW5jb2RpbmcsCiAgICApOwoKJHR3aWctPnBhcnNlZmlsZSgkQVJHVlswXSk7CgoKCgoKIyMjIyMjIyMjIyMKIyBFTkQgTUFJTgojIyMjIyMjIyMjIwoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICBTIFUgQiBSIE8gVSBUIEkgTiBFIFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIHN1YiBzZXRfZHRkIFsKIyAgICBteSAkdHdpZywgJGR0ZCA9IEBfOwojICAgIG15ICRpbnRlcm5hbCA9IHFxfFxuUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiJcbiJEVEQveGh0bWwxLXN0cmljdC5kdGQifDsKIwojICAgICR0d2lnLT50d2lnX2RvY3R5cGUoJ2h0bWwnLCB1bmRlZiwgdW5kZWYsICRpbnRlcm5hbCk7CiMgICAgfQoKCgpzdWIgcm9vdCB7CiAgICBteSAoJHR3aWcsICRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgJHJvb3QtPnNldF9naSgndGVpQ29ycHVzJyk7CiAgICAkcm9vdC0+c2V0X2F0dCgieG1sbnMiLCAnaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wJyk7CgogICAgJmluc2VydENvcnB1c0hlYWRlcigkcm9vdCwgJGNvcnB1c0hlYWRlcik7Cn0KCgoKc3ViIGluc2VydENvcnB1c0hlYWRlcnsKICAgIG15ICgkcm9vdCwgJGNvcnB1c0hlYWRlcikgPUBfOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZ2V0IHNvbWUgbWV0YWRhdGEgZm9yIHRoZSBjdXJyZW50IG91dHB1dCBjb3JwdXMgYmFzZWQgb24gc291cmNlIGFuZCB5ZWFyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEBhcnJheSA9IHNwbGl0KC9cLy8sICRBUkdWWzBdKTsKICAgIG15ICRsID0gc2NhbGFyKEBhcnJheSk7CiAgICBteSAkc291cmNlID0gJGFycmF5WyRsLTFdOwogICAgJHNvdXJjZSA9fiBzLyhbMC05XVswLTldWzAtOV1bMC05XSlcLnhtbCQvLzsKCiAgICBteSAkbGFuZ3VhZ2U9IkZpbm5pc2giOwogICAgbXkgJGxhbmdfdGxhPSJmaSI7CiAgICAKICAgIG15ICR5eSA9ICQxOyAgICMgJDEgbm93IGNvbnRhaW50cyBzdWJzdHJpbmcgaW4gZmlyc3QgYnJhY2tldCBpbiByZWdleCBhYm92ZQoKICAgIG15ICRjdGl0bGUgPSAkc291cmNlIC4gIiAiIC4gJHl5IC4gIiwgZnJvbSAiLiAka2llbGlwYW5ra2lDb3JwdXMgLiAiIGZvciBFdVJlQ28iOyAgICAjIHRvIGRvOiBhbHNvIGdldCBuYW1lIG9mIGNvcnB1cyAoa2xrLWZpLXYyLXZydCkKCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCBjb3JwdXMgaGVhZGVyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgJnNldF90aXRsZSggICAgICRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5eSwgJGtpZWxpcGFua2tpQ29ycHVzKTsKICAgICZzZXRfc291cmNlRGVzYygkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeXksICRraWVsaXBhbmtraUNvcnB1cyk7CgogICAgbXkgJHRlaUNvcnB1c0hlYWRlciAgICAgICAgPSAkY29ycHVzSGVhZGVyLT5wYXN0ZSgiZmlyc3RfY2hpbGQiLCAkcm9vdCk7Cgp9CiAgICAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaGFuZGxlciAmdGV4dCBmb3IgPHRleHQ+CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdWIgdGV4dCB7CiAgICBteSAoJHR3aWcsICR0ZXh0LCAkdGV4dEhlYWRlcikgPSBAXzsKCiAgICAkdGV4dGNvdW50ZXIrKzsgICAgICAgICAgICAgICAjIGdsb2JhbCB2YXJpYWJsZQoKICAgICMgVG9EbzogY2F0Y2ggYWxsIG90aGVyLCB1bmV4cGVjdGVkIGNoaWxkcmVuIG9mIHJvb3QKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRleHQgbWV0YWRhdGEgKGF0dHJpYnV0ZXMgb2YgPHRleHQ+KSBhbmQgY3JlYXRlIHRlaUhlYWRlciBmb3IgPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHRleHRhdHRzcmVmID0gJHRleHQtPmF0dHMoKTsgICAgICAgICAgICAgICAjICR0ZXh0YXR0c3JlZiBpcyBub3cgYSByZWZlcmVuY2UgdG8gYSBoYXNoIGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoICctPicKCgogICAgJmNyZWF0ZVRleHRIZWFkZXIoJHRleHQsICR0ZXh0YXR0c3JlZiwgJHRleHRIZWFkZXIpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPFRFST4gZnJvbSA8dGV4dD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAjIHNldCB2cnQgPHRleHQ+IHRvIDxURUk+IGFuZCBkZWxldGUgYWxsIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhleSB3ZXJlIHdlcmUgc2F2ZWQgYWJvdmUKICAgICR0ZXh0LT5kZWxfYXR0czsKICAgICR0ZXh0LT5zZXRfZ2koIlRFSSIpOwogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0aGUgPHRlaTp0ZXh0PiwgPGJvZHk+LCA8ZGl2PiBlbGVtZW50cyBpbnNpZGUgPFRFST4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHR0ZXh0X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd0ZXh0Jyk7CiAgICBteSAkYm9keV9lbGVtZW50ICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2JvZHknKTsKICAgIG15ICRkaXZfZWxlbWVudCAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZGl2Jyk7CgogICAgIyBzZXQgYXR0cwogICAgJGRpdl9lbGVtZW50ICAtPnNldF9hdHQoInR5cGUiLCAicGFnZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb0RvOiB0aGlzIGlzIHNwZWNpZmljIHRvIEtMSwogICAgJHR0ZXh0X2VsZW1lbnQtPnNldF9hdHQoInhtbDpsYW5nIiwgJ2ZpJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgaW4gSUNDLU5PUgoKICAgICMgcGFzdGUKICAgICR0dGV4dF9lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdGV4dCk7CiAgICAkYm9keV9lbGVtZW50IC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHR0ZXh0X2VsZW1lbnQpOwogICAgJGRpdl9lbGVtZW50ICAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICRib2R5X2VsZW1lbnQpOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxwPiBmcm9tIDxwYXJhZ3JhcGg+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAcGFyYWdyYXBocyA9ICR0ZXh0LT5jaGlsZHJlbiggJ3BhcmFncmFwaCcpOwoKICAgIGZvcmVhY2ggbXkgJHBhcmFncmFwaCAoQHBhcmFncmFwaHMpIHsKCQoJJnNldFAoJHBhcmFncmFwaCk7CgoJJHBhcmFncmFwaC0+bW92ZSgnbGFzdF9jaGlsZCcsICRkaXZfZWxlbWVudCk7CgkKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgY3JlYXRlIDxzPiBmcm9tIDxzZW50ZW5jZT4KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJbXkgQHNlbnRlbmNlcyA9ICRwYXJhZ3JhcGgtPmNoaWxkcmVuKCdzZW50ZW5jZScpOwoJZm9yZWFjaCBteSAkc2VudGVuY2UgKEBzZW50ZW5jZXMpIHsKCgkgICAgJnNldFMoJHNlbnRlbmNlKTsKCgoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgICMgY3JlYXRlIDx3PiAod29yZCkgZnJvbSBlYWNoICRsaW5lCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgCgkgICAgbXkgQGxpbmVzID0gc3BsaXQoL1xuKy8sICRzZW50ZW5jZS0+eG1sX3RleHQpOwoJICAgICRzZW50ZW5jZS0+c2V0X3RleHQoIlxuIik7CgoJICAgIGZvciBteSAkbGluZSAoQGxpbmVzKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvZG86IFJlaWhlbmZvbGdlIGNoZWNrZW4KCQlpZigkbGluZSBuZSAiIiApewoJCSAgICBteSAkd19lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndycpOwoJCSAgICAmY3JlYXRlVygkd19lbGVtZW50LCAkbGluZSk7CgkJICAgICR3X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgJHNlbnRlbmNlKTsKCQl9CgkgICAgfSAjIGVuZCB3b3JkcwoJfSAjIGVuZCBzZW50ZW5jZXMKICAgIH0gIyBlbmQgcGFyYWdyYXBocwoKICAgICMgJHR3aWctPnNldF9wcmV0dHlfcHJpbnQoICdyZWNvcmQnKTsKICAgICMgJHR3aWctPmZsdXNoKCRPVVQpOwogICAgJHR3aWctPmZsdXNoKCIvZGV2L3N0ZG91dCIpOwp9CgpzdWIgY3JlYXRlVGV4dEhlYWRlcnsKICAgIG15ICgkdGV4dCwgJHRleHRhdHRzcmVmLCAkdGV4dEhlYWRlcikgPSBAXzsKICAgIAogICAgIyBVU0UgMDEgYmluZGluZ19pZD0iMjI0NjAyNSIKICAgICMgVVNFIDAyIGRhdGU9IjIwMjEtMDEtMTUiCiAgICAjICAgICAwMyBkYXRlZnJvbT0iMjAyMTAxMTUiCiAgICAjICAgICAwNCBkYXRldG89IjIwMjEwMTE1IgogICAgIyAgICAgMDUgZWxlY19kYXRlPSJfIgogICAgIyAgICAgMDYgZmlsZT0iIgogICAgIyBVU0UgMDcgZmlsZW5hbWVfbWV0YWRhdGE9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9tZXRzLnhtbCIKICAgICMgVVNFIDA4IGZpbGVuYW1lX29yaWcgICAgPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfcGFnZS0yMDIxMDExNTAyMjEwMDMwMzAxLnhtbAogICAgIyBVU0UgMDkgaWQ9InQtYmNkMGYzZmEtYmJkM2RhYzQiCiAgICAjICAgICAxMCBpbWdfdXJsPSIiCiAgICAjIFVTRSAxMSBpc3N1ZV9kYXRlPSIxNS4wMS4yMDIxIgogICAgIyBVU0UgMTIgaXNzdWVfbm89IlNLMDIyMSIKICAgICMgVVNFIDEzIGlzc3VlX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIgogICAgIyBVU0UgMTQgbGFiZWw9IlN1b21lbiBLdXZhbGVodGkgbm8uIFNLMDIyMSAxNS4wMS4yMDIxIgogICAgIyBVU0UgMTYgbGFuZ3VhZ2U9ImZpIgogICAgIyBVU0UgMTcgcGFnZV9pZD0icDEiCiAgICAjIFVTRSAxOCBwYWdlX25vPSJOb25lIgogICAgIyAgICAgMTkgcGFydF9uYW1lPSJfIgogICAgIyAgICAgMjAgcHVibF9pZD0iMDAzOS01NTUyIgogICAgIyAgICAgMjEgcHVibF9wYXJ0PSIiCiAgICAjIFVTRSAyMiBwdWJsX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIiAKICAgICMgVVNFIDIzIHB1YmxfdHlwZT0iYWlrYWthdXNpIgogICAgIyBVU0UgMjQgc2VudGNvdW50PSI3MCIKICAgICMgVVNFIDI1IHN1bV9sYW5nPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiCiAgICAjICAgICAyNiB0aW1lZnJvbT0iMDAwMDAwIgogICAgIyAgICAgMjcgdGltZXRvPSIyMzU5NTkiCiAgICAjIFVTRSAyOCB0b2tlbmNvdW50PSIzMDQiCiAgICAjICAgICAyOSB2ZXJzaW9uX2FkZGVkPSJLTEstZmktMjAyMSI+CgoKICAgIG15ICRCSUQgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnYmluZGluZ19pZCd9OwogICAgbXkgJERBVEUgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydkYXRlJ307CiAgICBteSAkTUVUQUZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX21ldGFkYXRhJ307ICAgIAogICAgbXkgJE9SSUdGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9vcmlnJ307CiAgICBteSAkSUQgICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2lkJ307CiAgICBteSAkSVNTVUVEQVRFICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX2RhdGUnfTsKICAgIG15ICRJU1NVRU5PICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfbm8nfTsKICAgIG15ICRJU1NVRVRJVExFICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfdGl0bGUnfTsKICAgIG15ICRMQUJFTCAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFiZWwnfTsKICAgIG15ICRMQU5HVUFHRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFuZ3VhZ2UnfTsKICAgIG15ICRQQUdFSUQgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9pZCd9OwogICAgbXkgJFBBR0VOTyAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX25vJ307CiAgICBteSAkUFVCTFRJVExFICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdGl0bGUnfTsKICAgIG15ICRQVUJMVFlQRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90eXBlJ307CiAgICBteSAkU0VOVENPVU5UICAgID0gJHRleHRhdHRzcmVmLT57J3NlbnRjb3VudCd9OwogICAgbXkgJFNVTUxBTkcgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydzdW1fbGFuZyd9OwogICAgbXkgJFRPS0VOQ09VTlQgICA9ICR0ZXh0YXR0c3JlZi0+eyd0b2tlbmNvdW50J307CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgRGVyaXZlZCBNZXRhZGF0YSB2YXJpYWJsZXMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG15IEBkYXRlYXJyYXkgPSBzcGxpdCgiLSIsICREQVRFKTsKICAgIG15IEBsYW5nYXJyYXkgPSBzcGxpdCgifCIsICRTVU1MQU5HKTsKICAgIG15IEBuYW1lYXJyYXkgPSBzcGxpdCgvW1wuXC9dLywgJE9SSUdGSUxFTkFNRSk7ICAjIHVzZSAkbmFtZWFycmF5WzRdIGFzIElEIGZvciB0aGUgcGFnZQogICAgCgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiAkdGV4dEhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKICAgICR0ZXh0SGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDx0ZWlIZWFkZXI+CiAgICAjICAgPGZpbGVEZXNjIG49IltFdVJlQ28tS0xLLUZJTl8kSURdIj4KICAgICMgICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgIDx0aXRsZT5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4JCgogICAgJHRleHRIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpLT5maXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCJ0aXRsZSIpCgktPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICAjIENhc2UgS0xLCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDxmaWxlRGVzYz4KICAgICMgIDxzb3VyY2VEZXNjPgogICAgIyAgIDxiaWJsU3RydWN0PgogICAgIyAgICAgIDxhbmFseXRpYz4KICAgICMgICAgICAgICA8dGl0bGUgdHlwZT0ibWFpbiI+WyRMQUJFTCwgcGFnZSAkUEFHRU5PXTwvdGl0bGU+CiAgICAjICAgICAgICAgPGRhdGU+WyREQVRFXTwvZGF0ZT4KICAgICMgICAgICAgICA8ZGF0ZSB0eXBlPSJ5ZWFyIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9Im1vbnRoIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9ImRheSI+VE9ETzwvZGF0ZT4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJQQUdFSUQiPiRQQUdFSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iQklORElOR0lEIj4kQklEPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IklEIj4kSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIj4kTUVUQUZJTEVOQU1FPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSI+JE9SSUdGSUxFTkFNRTwvaWRubz4KICAgICMgICAgICAgICA8dGV4dExhbmc+JExBTkdVQUdFPC90ZXh0TGFuZz4KICAgICMgICAgICAgPC9hbmFseXRpYz4KCiAgICBteSAkYW5hbHl0aWMgID0gJHRleHRIZWFkZXItPmdldF94cGF0aCgiLi9maWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvYW5hbHl0aWMiLCAwKTsKCiAgICAkYW5hbHl0aWMtPmZpcnN0X2NoaWxkKCJ0aXRsZSIpICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICMgQ2FzZSBLTEsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9InllYXIiXScsICAgMCkgIC0+c2V0X3RleHQoJGRhdGVhcnJheVswXSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9kYXRlW0B0eXBlPSJtb250aCJdJywgIDApICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMV0pOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vZGF0ZVtAdHlwZT0iZGF5Il0nLCAgICAwKSAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzJdKTsgICAgCiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJQQUdFSUQiXScsICAgICAgIDApICAgICAtPnNldF90ZXh0KCRQQUdFSUQpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iQklORElOR0lEIl0nLCAgICAwKSAgICAgLT5zZXRfdGV4dCgkQklEKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IklEIl0nLCAgICAgICAgICAgMCkgICAgIC0+c2V0X3RleHQoJElEKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IktJRUxJUEFOS0tJX01FVEFGSUxFTkFNRSJdJywgMCkgICAgIC0+c2V0X3RleHQoJE1FVEFGSUxFTkFNRSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJLSUVMSVBBTktLSV9PUklHRklMRU5BTUUiXScsIDApICAgICAtPnNldF90ZXh0KCRPUklHRklMRU5BTUUpOwogICAgJGFuYWx5dGljLT5maXJzdF9jaGlsZCgndGV4dExhbmcnKSAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKICAgIAogICAgIyAgPG1vbm9ncj4KICAgICMgICAgPHRpdGxlPiRQVUJMVElUTEU8L3RpdGxlPgogICAgIyAgICA8aW1wcmludD4KICAgICMgICAgICA8cHViUGxhY2U+VE9ETzwvcHViUGxhY2U+CiAgICAjICAgICAgICA8cHVibGlzaGVyPlRPRE88L3B1Ymxpc2hlcj4KICAgICMgICAgPC9pbXByaW50PgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFVElUTEUiLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRU5PIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVEQVRFIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0icHAiPiRQQUdFTk88L2JpYmxTY29wZT4KICAgICMgIDxtb25vZ3I+CgogICAgbXkgJG1vbm9nciAgPSAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCIuL2ZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9tb25vZ3IiLCAwKTsKCgoKCiAgICAKIyNUTVAgICAgICAjIGNyZWF0ZSA8dGVpSGVhZGVyPiBpbnNpZGUgPFRFST4KIyNUTVAgICAgICBteSAkdGVpSGVhZGVyID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGVpSGVhZGVyJyk7CiMjVE1QICAgICAgIyAkdGVpSGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CiMjVE1QICAKIyNUTVAgICAgICAjIyBpbnNlcnRfbmV3X2VsdCBpcyBhIGNvbWJvIG9mIG5ldyBhbmQgcGFzdGUsIGNmLiB4bWw6OnR3aWcgZG9jdToKIyNUTVAgICAgICAjIyBpbnNlcnRfbmV3X2VsdCAoJG9wdF9wb3NpdGlvbiwgJGdpLCAkb3B0X2F0dHNfaGFzaHJlZiwgQG9wdF9jb250ZW50KQojI1RNUCAgICAgIAojI1RNUCAgICAgIG15ICRmaWxlRGVzYyAgICAgPSAkdGVpSGVhZGVyLT5pbnNlcnRfbmV3X2VsdCgnZmlsZURlc2MnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4ge24gPT4gIkV1UmVDb19LTEstZmlfIiAuICRuYW1lYXJyYXlbNF19KTsKIyNUTVAgICAgICBteSAkZW5jb2RpbmdEZXNjID0gJHRlaUhlYWRlci0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZW5jb2RpbmdEZXNjJyk7CiMjVE1QICAgICAgbXkgJHByb2ZpbGVEZXNjICA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Byb2ZpbGVEZXNjJyk7CiMjVE1QICAgICAgbXkgJHJldmlzaW9uRGVzYyA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3JldmlzaW9uRGVzYycpOwojI1RNUCAgCiMjVE1QICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgICMgZmlsZURlc2MvdGl0bGVTdG10CiMjVE1QICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgIG15ICR0aXRsZVN0bXQgPSAkZmlsZURlc2MgLT5pbnNlcnRfbmV3X2VsdCgndGl0bGVTdG10Jyk7CiMjVE1QICAgICAgbXkgJHRpdGxlICAgICA9ICR0aXRsZVN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RpdGxlJyk7CiMjVE1QICAgICAgbXkgJHJlc3BTdG10ICA9ICR0aXRsZVN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Jlc3BTdG10Jyk7CiMjVE1QICAgICAgbXkgJHJlc3AgICAgICA9ICRyZXNwU3RtdCAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Jlc3AnKTsKIyNUTVAgICAgICBteSAkbmFtZSAgICAgID0gJHJlc3BTdG10IC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbmFtZScpOwojI1RNUCAgCiMjVE1QICAgICAgIyBzZXQgdGV4dHMgZm9yIHRpdGxlU3RtdAojI1RNUCAgICAgICMgJHRpdGxlLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBwYWdlICIgLiAkUEFHRU5PKTsgICAgICAgICAgICMgQWNodHVuZyAtIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCiMjVE1QICAgICAgJHRpdGxlLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBUZXh0ICMiIC4gJHRleHRjb3VudGVyKTsgICAgIyBhdCBsZWFzdCBmb3IgU3VvbWVuIEt1dmFsZWh0aQojI1RNUCAgICAgICRyZXNwIC0+c2V0X3RleHQoImNvbXBpbGVkIGJ5IEV1UmVDbyIpOwojI1RNUCAgICAgICRuYW1lIC0+c2V0X3RleHQoIkV1UmVDbzogSEwiKTsKIyNUTVAgIAojI1RNUCAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgICMgZmlsZURlc2MvcHVibGljYXRpb25TdG10CiMjVE1QICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjVE1QICAgICAgbXkgJHB1YmxpY2F0aW9uU3RtdCA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3B1YmxpY2F0aW9uU3RtdCcpOwojI1RNUCAgICAgIG15ICRkaXN0cmlidXRvciAgICAgPSAkcHVibGljYXRpb25TdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkaXN0cmlidXRvcicpOwojI1RNUCAgICAgIG15ICRub3RlICAgICAgICAgICAgPSAkZGlzdHJpYnV0b3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdub3RlJyk7CiMjVE1QICAgICAgbXkgJGF2YWlsYWJpbGl0eSAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2F2YWlsYWJpbGl0eScpOyAKIyNUTVAgICAgICBteSAkbGljZW5jZSAgICAgICAgID0gJGF2YWlsYWJpbGl0eSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGljZW5jZScpOwojI1RNUCAgCiMjVE1QICAgICAgIyBzZXQgdGV4dHMgZm9yIHB1YmxpY2F0aW9uU3RtdAojI1RNUCAgICAgICRub3RlICAgLT5zZXRfdGV4dCgiTk9UIEZPUiBESVNUUklCVVRJT04gLSB0byBiZSB1c2VkIGxvY2FsbHkgaW4gRXVSZUNvIik7CiMjVE1QICAgICAgJGxpY2VuY2UtPnNldF90ZXh0KCJDTEFSSU5fUkVTIik7ICAjIFRPRE86IEF1c2Z1aGVybGljaGVyZSBMaWNlbmNlIGluZm8gaW4gS0xLIE1ldGFkYXRhIFJlY29yZAojI1RNUCAgCiMjVE1QICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0CiMjVE1QICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgIG15ICRzb3VyY2VEZXNjID0gJGZpbGVEZXNjICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3NvdXJjZURlc2MnKTsKIyNUTVAgICAgICBteSAkYmlibFN0cnVjdCAgID0gJHNvdXJjZURlc2MtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTdHJ1Y3QnKTsKIyNUTVAgIAojI1RNUCAgICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L2FuYWx5dGljCiMjVE1QICAgICAgbXkgJGFuYWx5dGljICAgICAgICAgICAgICAgID0gJGJpYmxTdHJ1Y3QtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2FuYWx5dGljJyk7CiMjVE1QICAgICAgbXkgJGFuYWx5dGljX3RpdGxlICAgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScgICAgICAgID0+IHt0eXBlID0+ICJtYWluIn0gKTsKIyNUTVAgICMgICAgbXkgJGFuYWx5dGljX2RhdGUgICAgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyk7CiMjVE1QICAgICAgbXkgJGFuYWx5dGljX2RhdGVfeWVhciAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyAgICAgICAgID0+IHt0eXBlID0+ICJ5ZWFyIn0pOwojI1RNUCAgICAgIG15ICRhbmFseXRpY19kYXRlX21vbnRoICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScgICAgICAgICA9PiB7dHlwZSA9PiAibW9udGgifSk7CiMjVE1QICAgICAgbXkgJGFuYWx5dGljX2RhdGVfZGF5ICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyAgICAgICAgID0+IHt0eXBlID0+ICJkYXkifSk7CiMjVE1QICAgICAgbXkgJGFuYWx5dGljX2lkbm9fcGFnZWlkICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJQQUdFSUQifSk7CiMjVE1QICAgICAgbXkgJGFuYWx5dGljX2lkbm9fYmluZGluZ2lkID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJCSU5ESU5HSUQifSk7CiMjVE1QICAgICAgbXkgJGFuYWx5dGljX2lkbm9faWQgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJJRCJ9KTsKIyNUTVAgICAgICBteSAkYW5hbHl0aWNfaWRub19tZXRhZmlsZSAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIktJRUxJUEFOS0tJX01FVEFGSUxFTkFNRSJ9KTsKIyNUTVAgICAgICBteSAkYW5hbHl0aWNfaWRub19vcmlnZmlsZSAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSJ9KTsKIyNUTVAgICAgICBteSAkYW5hbHl0aWNfdGV4dGxhbmcgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RleHRMYW5nJyk7CiMjVE1QICAKIyNUTVAgICAgICAjIHNldCB0ZXh0cyBmb3IgYW5hbHl0aWMKIyNUTVAgICMgICAgJGFuYWx5dGljX3RpdGxlICAgICAgICAgLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBwYWdlICIgLiAkUEFHRU5PKTsgICMgQWNodHVuZyAkUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUgenUgc2VpbiIKIyNUTVAgICAgICAkYW5hbHl0aWNfdGl0bGUgICAgICAgICAtPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgIyBBY2h0dW5nICRQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSB6dSBzZWluIgojI1RNUCAgIyAgICAkYW5hbHl0aWNfZGF0ZSAgICAgICAgIC0+c2V0X3RleHQoJERBVEUpOwojI1RNUCAgICAgICRhbmFseXRpY19kYXRlX3llYXIgICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVswXSk7CiMjVE1QICAgICAgJGFuYWx5dGljX2RhdGVfbW9udGggICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzFdKTsKIyNUTVAgICAgICAkYW5hbHl0aWNfZGF0ZV9kYXkgICAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOwojI1RNUCAgICAgICRhbmFseXRpY19pZG5vX3BhZ2VpZCAgIC0+c2V0X3RleHQoJFBBR0VJRCk7CiMjVE1QICAgICAgJGFuYWx5dGljX2lkbm9fYmluZGluZ2lkLT5zZXRfdGV4dCgkQklEKTsKIyNUTVAgICAgICAkYW5hbHl0aWNfaWRub19pZCAgICAgICAtPnNldF90ZXh0KCRJRCk7CiMjVE1QICAgICAgJGFuYWx5dGljX2lkbm9fbWV0YWZpbGUgLT5zZXRfdGV4dCgkTUVUQUZJTEVOQU1FKTsKIyNUTVAgICAgICAkYW5hbHl0aWNfaWRub19vcmlnZmlsZSAtPnNldF90ZXh0KCRPUklHRklMRU5BTUUpOwojI1RNUCAgICAgICRhbmFseXRpY190ZXh0bGFuZyAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKIyNUTVAgIAojI1RNUCAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAojI1RNUCAgICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L21vbm9ncgojI1RNUCAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjVE1QICAgICAgbXkgJG1vbm9nciAgICAgICAgICAgICAgID0gJGJpYmxTdHJ1Y3QtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ21vbm9ncicpOwojI1RNUCAgICAgIG15ICRtb25vZ3JfdGl0bGUgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScpOwojI1RNUCAgICAgIG15ICRpbXByaW50ICAgICAgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpbXByaW50Jyk7ICAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpZHR5CiMjVE1QICAgICAgbXkgJHB1YlBsYWNlICAgICAgICAgICAgID0gJGltcHJpbnQgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3B1YlBsYWNlJyk7ICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB2YWxpZGl0eQojI1RNUCAgICAgIG15ICRwdWJsaXNoZXIgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJsaXNoZXInKTsgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKIyNUTVAgICAgICBteSAkYmlibFNjb3BlX2lzc3VldGl0bGUgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRVRJVExFJ30gKTsKIyNUTVAgICAgICBteSAkYmlibFNjb3BlX2lzc3Vlbm8gICAgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRU5PJ30gKTsKIyNUTVAgICAgICBteSAkYmlibFNjb3BlX2lzc3VlZGF0ZSAgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRURBVEUnfSApOwojI1RNUCAgICAgIG15ICRiaWJsU2NvcGVfcHAgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU2NvcGUnICAgPT4ge3VuaXQgPT4gJ1BBR0VOTyd9ICk7ICAgICAgIyBBY2h0dW5nIFBBR0VOTyBpc3QgbWVpc3QgIk5vbmUiID8KIyNUTVAgIAojI1RNUCAgICAgICMgc2V0IHRleHRzIGZvciBtb25vZ3IKIyNUTVAgICAgICAkbW9ub2dyX3RpdGxlICAgICAgICAtPnNldF90ZXh0KCRQVUJMVElUTEUpOwojI1RNUCAgICAgICRwdWJQbGFjZSAgICAgICAgICAgIC0+c2V0X3RleHQoIlRPRE8iKTsKIyNUTVAgICAgICAkcHViUGxhY2UgICAgICAgICAgICAtPnNldF9hdHQoImtleSIsJ0ZJJyk7CiMjVE1QICAgICAgJHB1Ymxpc2hlciAgICAgICAgICAgLT5zZXRfdGV4dCgiVE9ETyIpOwojI1RNUCAgICAgICRiaWJsU2NvcGVfaXNzdWV0aXRsZS0+c2V0X3RleHQoJElTU1VFVElUTEUpOwojI1RNUCAgICAgICRiaWJsU2NvcGVfaXNzdWVubyAgIC0+c2V0X3RleHQoJElTU1VFTk8pOwojI1RNUCAgICAgICRiaWJsU2NvcGVfaXNzdWVkYXRlIC0+c2V0X3RleHQoJElTU1VFREFURSk7CiMjVE1QICAgICAgJGJpYmxTY29wZV9wcCAgICAgICAgLT5zZXRfdGV4dCgkUEFHRU5PKTsKIyNUTVAgICAKIyNUTVAgICAgICAjLS0tLS0tLS0tLS0tLS0tCiMjVE1QICAgICAgIyBlbmNvZGluZ0Rlc2MKIyNUTVAgICAgICAjLS0tLS0tLS0tLS0tLS0tCiMjVE1QICAgICAgbXkgJHRhZ3NEZWNsICAgICA9ICRlbmNvZGluZ0Rlc2MtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RhZ3NEZWNsJyk7CiMjVE1QICAgICAgbXkgJG5hbWVzcGFjZSAgICA9ICR0YWdzRGVjbCAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ25hbWVzcGFjZScgICAgPT4ge25hbWUgPT4gJ2h0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCd9KTsKIyNUTVAgICAgICBteSAkdGFnVXNhZ2VfcyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAncycsIG9jY3VycyA9PiAkU0VOVENPVU5UfSk7CiMjVE1QICAgICAgbXkgJHRhZ1VzYWdlX3cgICA9ICRuYW1lc3BhY2UgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RhZ1VzYWdlJyAgICAgPT4ge2dpICAgPT4gJ3cnLCBvY2N1cnMgPT4gJFRPS0VOQ09VTlR9KTsKIyNUTVAgICAgICAKIyNUTVAgICAgICAjLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgICMgcHJvZmlsZURlc2MKIyNUTVAgICAgICAjLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgIG15ICRsYW5nVXNhZ2UgICA9ICRwcm9maWxlRGVzYyAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmdVc2FnZScpOwojI1RNUCAgICAgIG15ICRsYW5ndWFnZSAgICA9ICRsYW5nVXNhZ2UgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmd1YWdlJyAgICAgID0+IHtpZGVudCA9PiAkTEFOR1VBR0UsIHVzYWdlID0+ICRTVU1MQU5HfSk7CiMjVE1QICAgICAgIyBBY2h0dW5nIGluIEB1c2FnZSBtdXNzIGVpZ3QuIGVpbiBpbnRlZ2VyOyBhbSBiZXN0ZW4gaW5oYWx0IHZvbiBTVU1MQU5HIGF1ZmRyb2VzZWxuIHVuZCBtZWhyZXJlIDxsYW5ndWFnZT4gbWFjaGVuCiMjVE1QICAgICAgbXkgJHRleHRDbGFzcyAgID0gJHByb2ZpbGVEZXNjIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGV4dENsYXNzJyk7CiMjVE1QICAgICAgbXkgJGNsYXNzQ29kZV9maSAgID0gJHRleHRDbGFzcyAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnY2xhc3NDb2RlJyA9PiB7c2NoZW1lICAgICAgID0+ICJLTEtfUFVCTFRZUEUifSk7CiMjVE1QICAjICAgIG15ICRjbGFzc0NvZGVfZW4gICA9ICR0ZXh0Q2xhc3MgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2NsYXNzQ29kZScgPT4ge3NjaGVtZSAgICAgID0+ICJLTEtfUFVCTFRZUEVfTUFQUEVEIn0pOwojI1RNUCAgCiMjVE1QICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojI1RNUCAgICAgICMgc2V0IHRleHRzIGZvciBwcm9maWxlRGVzYwojI1RNUCAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyNUTVAgICAgICAkY2xhc3NDb2RlX2ZpIC0+c2V0X3RleHQoJFBVQkxUWVBFKTsKIyNUTVAgICMgICAgJGNsYXNzQ29kZV9lbi0+c2V0X3RleHQoJFBVQkxUWVBFVFJBTlNMKTsKIyNUTVAgIAojI1RNUCAgICAgICMtLS0tLS0tLS0tLS0tLS0KIyNUTVAgICAgICAjIHJldmlzaW9uRGVzYwojI1RNUCAgICAgICMtLS0tLS0tLS0tLS0tLS0KIyNUTVAgICAgICBteSAkY2hhbmdlICAgICAgPSAkcmV2aXNpb25EZXNjIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnY2hhbmdlJyAgICAgICA9PiB7d2hlbiA9PiBsb2NhbHRpbWUtPnltZCgnLScpLCB3aG8gPT4gJ0hMJyAgfSk7CiMjVE1QICAKIyNUTVAgICAgICAjIHNldCB0ZXh0cyBmb3IgcmV2aXNpb25EZXNjCiMjVE1QICAgICAgJGNoYW5nZS0+c2V0X3RleHQoIlRFSSB2ZXJzaW9uIGZvciBFdVJlQ28iKTsKCgoKCgoKICAgIAoKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAjIEVORCBPRiBDUkVBVElORyBURUlIRUFERVIKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAKfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKc3ViIHNldFAgewogICAgbXkgKCRwYXJhZ3JhcGgpID0gQF87CiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9naSgncCcpOwogICAgCiAgICAjIDxwYXJhZ3JhcGggaWQ9InAtYmNkMGYzZmEtYmJkM2RhYzQtODE1ZWFkN2EiIHN1bV9sYW5nPSJ8ZmluOjF8Ij4KICAgICMgYXR0cyBvZiA8cGFyYWdyYXBoPjoKICAgICMgICAgQGlkICAgICAgICBVU0UKICAgICMgICAgQHN1bV9sYW5nICBVU0U6IHB1dCBpbiB4bWw6bGFuZyBhbmQgcHJlZml4IHRoZSB2YWx1ZSB3aXRoICJ4LSIgZm9yIHByaXZhdGUgdmFsdWUKICAgIAogICAgJHBhcmFncmFwaC0+c2V0X2F0dCgieG1sOmxhbmciLCAieC0iIC4gJHBhcmFncmFwaC0+YXR0KCJzdW1fbGFuZyIpKTsKICAgICRwYXJhZ3JhcGgtPmRlbF9hdHQoInN1bV9sYW5nIik7CiAgICAjICRwYXJhZ3JhcGgtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJpZCIpOyAgICAgICAgICAgICAgIyBkaWVzZSBpZCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWchIQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCnN1YiBzZXRTIHsKICAgIG15ICgkc2VudGVuY2UpID0gQF87CiAgICAKICAgICRzZW50ZW5jZS0+c2V0X2dpKCdzJyk7CgkgICAgCiAgICAjIHRoZSBhdHRzIG9mIDxzZW50ZW5jZT46CiAgICAjICAgIFVTRSAgIDEgQGlkPSJzLWJjZDBmM2ZhLWJiZDNkYWM0LWY3NDI5MDkwIgogICAgIyAgICBVU0UgICAyIEBsYW5nPSJmaW4iIC0+IHhtbDpsYW5nIAogICAgIyAgICA/ICAgICAzIEBsYW5nX2NvbmY9IjAuNjczNDg1MyI+IC0+IFRvRG8gQGNlcnQgPwkgICAgCiAgICAKICAgICMgc2V0IGF0dHJzIG9mIDxzPgogICAgJHNlbnRlbmNlLT5zZXRfYXR0KCJ4bWw6bGFuZyIsICRzZW50ZW5jZS0+YXR0KCJsYW5nIikpOyAgIyBUb0RvOiBjb252ZXJ0IHRoZSB2YWx1ZSAvIGludHJvZHVjZSBhIGhhc2ggZm9yIGxvb2t1cCAoaW5wdXQgdmFsdWVzOiAiZmluIiwgInh4eCIsIC4uLi4pCiAgICAjICRzZW50ZW5jZS0+Y2hhbmdlX2F0dF9uYW1lKCdpZCcsICd4bWw6aWQnKTsgICAgICAgICAgICAjIG5pY2h0IGVpbmRldXRpZwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCdpZCcpOwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZWQgYnkgeG1sOmxhbmcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZ19jb25mIik7ICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgdGltZSBiZWluZwogICAgCn0KCnN1YiBjcmVhdGVXIHsKICAgIG15ICgkd19lbGVtZW50LCAkbGluZSkgPSBAXzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0aGUgdGFncyAoPWNvbHVtbnMpCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEB0YWdzID0gc3BsaXQoL1x0LywgJGxpbmUpOwogICAgCiAgICAjIHNldCBjb250ZW50IG9mIDx3PiBpLmUuIHRoZSB0b2tlbgogICAgJHdfZWxlbWVudC0+c2V0X3RleHQoJHRhZ3NbMF0pOwogICAgCiAgICAjIHZydCBwb3NpdGlvbmFsLWF0dHJpYnV0ZXMgaW4gY29ycHVzIEtMSzoKICAgICMgIFVTRSBbMF0gd29yZAogICAgIyAgVVNFIFsxXSByZWYgIChpZCBmb3IgcmVmZXJlbmNlIG9mIGRlcGhlYWQpCiAgICAjICBVU0UgWzJdIGxlbW1hCiAgICAjICA/ICAgWzNdIGxlbW1hY29tcCAgIChsZW1tYSB3aXRoIGNvbXBvdW5kIGluZm8gLSBjb3VsZCBnbyBpbiBAbm9ybSwgYXMgdGFnIGFidXNlPykKICAgICMgIFVTRSBbNF0gcG9zIAogICAgIyAgVVNFIFs1XSBtc2QgCiAgICAjICBVU0UgWzZdIGRlcGhlYWQKICAgICMgIFVTRSBbN10gZGVwcmVsIAogICAgIyAgICAgIFs4XSBjb250ZW50ICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgIFs5XSB2cG9zICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEwXSBvY3IgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzExXSBjYyAgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEyXSBoeXBoICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEzXSBzdHlsZSAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzE0XSBsZXggICAgICAgKGtvcnAgc2VtYW50aWMgZGlzYW1iaWd1YXRpb24gZnJvbSBHIm90ZWJvcmcpCiAgICAKICAgICMgc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIDx3PjoKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoIm4iLCAgICAgICR0YWdzWzFdKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgiaWQiLCAgICAgIndfIiAuICRuYW1lYXJyYXlbNF0gLiAkc2VudGVuY2UtPmF0dCgieG1sOmlkIikgLiAiXyIgLiAkdGFnc1sxXSk7CiAgICAjIHNvIHp1c2FtbWVuZ2ViYXV0ZSBJRCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWcuLi4KICAgICR3X2VsZW1lbnQtPmRlbF9hdHQoImlkIik7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJsZW1tYSIsICAkdGFnc1syXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoIm5vcm0iLCAgICR0YWdzWzNdKTsgICMgdGFnIGFidXNlIG9mIEBub3JtCiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJwb3MiLCAgICAkdGFnc1s0XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJtc2QiLCAgICAkdGFnc1s1XSk7CiNUTVAgICAgJHdfZWxlbWVudC0+c2V0X2F0dCgiaGVhZCIsICAgJHRhZ3NbNl0pOwojVE1QICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImRlcHJlbCIsICR0YWdzWzddKTsKICAgIAp9CiAgICAKCnN1YiBzZXRfdGl0bGV7CiAgICBteSAoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHl5LCAka2llbGlwYW5ra2lDb3JwdXMpID0gQF87CgogICAgbXkgJGNUaXRsZVN0cmluZyA9ICRzb3VyY2UgLiAiICIgLiAkeXkgLiAiLCBmcm9tICIuICRraWVsaXBhbmtraUNvcnB1cyAuICIgZm9yIEV1UmVDbyI7ICAgIAoKICAgICM8dGVpSGVhZGVyPgogICAgIyAgPGZpbGVEZXNjPgogICAgIyAgICA8dGl0bGVTdG10PgogICAgIyAgICAgIDx0aXRsZT5bQWFtdWxlaHRpMjAyMV0gZnJvbSBba2xrLWZpLXYyLXZydCBmb3JdIEV1UmVDbzwvdGl0bGU+CiAgICAjICAgIDwvdGl0bGVTdG10PgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgIDwvZmlsZURlc2M+CiAgICAjPC90ZWlIZWFkZXI+CgogICAgbXkgJGNUaXRsZU5vZGUgPSAkY29ycHVzSGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInRpdGxlU3RtdCIpLT5maXJzdF9jaGlsZCgidGl0bGUiKTsKCiAgICAkY1RpdGxlTm9kZS0+c2V0X3RleHQoJGNUaXRsZVN0cmluZyk7CiAgICAKfQoKc3ViIHNldF9zb3VyY2VEZXNjewogICAgbXkgKCRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5eSwgJGtpZWxpcGFua2tpQ29ycHVzKSA9IEBfOwoKICAgIG15ICRjQmlibFN0cmluZyA9ICRzb3VyY2UgLiAiICIgLiAkeXkgLiAiLCBmcm9tICIuICRraWVsaXBhbmtraUNvcnB1cyAuICIgZm9yIEV1UmVDbyI7ICAgIAoKICAgICM8dGVpSGVhZGVyPgogICAgIyAgPGZpbGVEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgICAgPHNvdXJjZURlc2M+CiAgICAjICAgICAgPGJpYmw+W0FhbXVsZWh0aTIwMjFdIGZyb20gW2tsay1maS12Mi12cnRdPC9iaWJsPgogICAgIyAgICA8L3NvdXJjZURlc2M+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY0JpYmxOb2RlID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJzb3VyY2VEZXNjIiktPmZpcnN0X2NoaWxkKCJiaWJsIik7CgogICAgJGNCaWJsTm9kZS0+c2V0X3RleHQoJGNCaWJsU3RyaW5nKTsgICAgCn0KCgoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjCiMjIHVzYWdlX21lc3NhZ2UKIyMjIyMjIyMjIyMjIyMjIyMKCgpzdWIgdXNhZ2VfbWVzc2FnZSB7CiAgICBwcmludCAiICAgVXNhZ2U6ICAuL3ZydDJ0ZWkucGwgPGZpbGUudnJ0LnhtbD4gPG91dGZpbGU+XG4iOwogICAgcHJpbnQgIiAgIDxmaWxlLnZydC54bWw+IGlzIGEgVlJUIGZpbGUgY29udmVydGVkIHRvIHByb3BlciBYTUxcbiI7CiAgICBleGl0Owp9CgoK