IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSByZW1vdmUgdGhlIHZydCBwb3NpdGlvbmFsIGF0dHJpYnV0ZSBjb21tZW50IGxpbmUgLyBhbGwgY29tbWVudCBsaW5lcwojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwojdXNlIGRpYWdub3N0aWNzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2hlY2sgZmlsZSBhcmd1bWVudHM6CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGFyZzAgaW5maWxlOiAgIHZydC14bWwKCnVubGVzcygkQVJHVlswXSkgeyZ1c2FnZV9tZXNzYWdlKCl9IDsgIyBtaW4gYXJnMCwgdGhlIGlucHV0IGZpbGUKaWYgICAgKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAjIG1heCBhcmcwLCB0aGUgaW5wdXQgZmlsZQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgCiNteSAkZW5jb2RpbmcgPSAiaXNvLTg4NTktMSI7ICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KbXkgJHRleHRjb3VudGVyID0gMDsKCm91ciAlY29ycHVzc2lnbGVzICAgID0gKCk7Cm91ciAlc3JjZnVsbG5hbWVzICAgID0gKCk7Cm91ciAlc3JjcHVicGxhY2VzICAgID0gKCk7Cm91ciAlc3JjcHVibGlzaGVycyAgID0gKCk7Cm91ciAlc3JjdGV4dHR5cGVzICAgID0gKCk7Cm91ciAlc3JjdGV4dGxhbmdzICAgID0gKCk7CgpteSAlZG9jY291bnRlciA9ICggICAgICAgICAgICAgICAgICAgICAgICAjIGJ5IHRoZSBtb250aCBhcyBpbiBkZXJla294CiAgICAiMDEiID0+IDEsCiAgICAiMDIiID0+IDEsCiAgICAiMDMiID0+IDEsCiAgICAiMDQiID0+IDEsCiAgICAiMDUiID0+IDEsCiAgICAiMDYiID0+IDEsCiAgICAiMDciID0+IDEsCiAgICAiMDgiID0+IDEsCiAgICAiMDkiID0+IDEsCiAgICAiMTAiID0+IDEsCiAgICAiMTEiID0+IDEsCiAgICAiMTIiID0+IDEsCiAgICApOwoKCm15ICRzb3VyY2VzY3N2ZmlsZSA9ICJzb3VyY2VzX2tsa19maV92Ml8yMDIxXzRldXJlY28uY3N2IjsKbXkgJGNvcnBoZWFkZXJmaWxlID0gInRlaUNvcnB1c0hlYWRlclNrZWxldG9uLnRlaS54bWwiOwpteSAkdGV4dGhlYWRlcmZpbGUgPSAidGVpVGV4dEhlYWRlclNrZWxldG9uLnRlaS54bWwiOwoKCm15ICR0d2lnPSIiOyAgIApteSAkdGVpQ29ycHVzSGVhZGVyRG9jPSIiOwoKIyBnbG9iYWwgdmFyaWFibGVzIHBlcnRhaW5pbmcgdG8gdGhlIG9yaWdpbmFsIGNvcnB1cyA6Cm15ICRraWVsaXBhbmtraUNvcnB1cyA9ICJrbGstZmktdjItdnJ0IjsKCm15ICVtb250aHMgPSAoCiAgICAgIjAxIiA9PiAiSkFOIiwKICAgICAiMDIiID0+ICJGRUIiLAogICAgICIwMyIgPT4gIk1BUiIsCiAgICAgIjA0IiA9PiAiQVBSIiwKICAgICAiMDUiID0+ICJNQVkiLAogICAgICIwNiIgPT4gIkpVTiIsCiAgICAgIjA3IiA9PiAiSlVMIiwKICAgICAiMDgiID0+ICJBVUciLAogICAgICIwOSIgPT4gIlNFUCIsCiAgICAgIjEwIiA9PiAiT0NUIiwKICAgICAiMTEiID0+ICJOT1YiLAogICAgICIxMiIgPT4gIkRFQyIsCiAgICAgKTsKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIGNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50IGFuZCBnZXQgaGVhZGVyIG91dCBvZiBpdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdGVpQ29ycHVzSGVhZGVyRG9jVHdpZyA9IG5ldyBYTUw6OlR3aWcoCiAgICBrZWVwX3NwYWNlcyA9PiAxLAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsCiAgICBjb21tZW50cyA9PiAnZHJvcCcsCiAgICApOwoKCiR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnLT5wYXJzZWZpbGUoJGNvcnBoZWFkZXJmaWxlKTsKbXkgJGNvcnB1c0hlYWRlciA9ICR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnLT5yb290OyAgICAgICAgICAgICAgICAgICMgZ2V0dGluZyB0aGUgdGVpSGVhZGVyIGZvciBjb3JwdXMgb3V0IG9mIHRoZSB0ZWlDb3JwdXNIZWFkZXJTa2VsZXRvbiBkb2N1bWVudAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIHRleHRIZWFkZXJTa2VsZXRvbiBkb2N1bWVudCBhZG4gZ2V0IGhlYWRlciBvdXQgb2YgaXQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbXkgJHRlaVRleHRIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgokdGVpVGV4dEhlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgkdGV4dGhlYWRlcmZpbGUpOwpteSAkdGV4dEhlYWRlciA9ICR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cm9vdDsgICAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaVRleHRIZWFkZXJTa2VsZXRvbiBkb2N1bWVudAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcmVhZCBpbnB1dCBWUlQtWE1MIGRvY3VtZW50CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRJTiwgICI8ICRBUkdWWzBdIikgfHwgZGllKCIkMDogY2Fubm90IG9wZW4gZmlsZSBmb3IgcmVhZGluZzogJEFSR1ZbMF0iKTsgICAgICMgb3BlbiBpbnB1dCAgZmlsZSBhbmQgaW5pdGlhbGlzZSBmaWxlaGFuZGVsLCBhY3R1YWxseSBkb2VzIG5vdCBzZWVtIHRvIGJlIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgcGFyc2VmaWxlKCkgKHMuYi4pIGlzIGFwcGxpZWQgdG8gdGhlIGZpbGVuYW1lCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgc291cmNlIG1ldGFkYXRhIGZpbGUgKHByZXBhcmVkIG1hbnVhbGx5ID0+IHVsdGltYXRlbHkgcmVhZCB0aGUgaW5mbyBmcm9tIENNREkgRmlsZT8pCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRTT1VSQ0VTLCAiPCAkc291cmNlc2NzdmZpbGUiKSB8fCBkaWUoIiQwOiBjYW5ub3Qgb3BlbiBmaWxlIGZvciByZWFkaW5nOiAkc291cmNlc2NzdmZpbGUiKTsKd2hpbGUobXkgJGZsaW5lID0gPCRTT1VSQ0VTPil7CiAgICBjaG9tcCgkZmxpbmUpOwoKICAgIGlmICgkZmxpbmU9fi9eXCMvIHx8ICRmbGluZT1+L15ccyokLyB8fCAkZmxpbmUgPX4gIlRFSUNPUlBVU0lEIil7bmV4dDt9ICAgICMgc2tpcCBsaW5lIGlmIGVtcHR5IGxpbmUgb3IgY29tbWVudCBsaW5lIG9yIGZpcnN0IGxpbmUKICAgIG15IEBmbGFycmF5ID0gc3BsaXQoL1xzKlx0K1xzKi8sICRmbGluZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BsaXQgZWFjaCBsaW5lIGludG8gYXJyYXkKCiAgICAkY29ycHVzc2lnbGVzeyRmbGFycmF5WzJdfSAgPSAkZmxhcnJheVswXTsKICAgICRzcmNmdWxsbmFtZXN7JGZsYXJyYXlbMl19ICA9ICRmbGFycmF5WzFdOwogICAgJHNyY3B1YnBsYWNlc3skZmxhcnJheVsyXX0gID0gJGZsYXJyYXlbNl07CiAgICAkc3JjcHVibGlzaGVyc3skZmxhcnJheVsyXX0gPSAkZmxhcnJheVs3XTsKICAgICRzcmN0ZXh0dHlwZXN7JGZsYXJyYXlbMl19ICA9ICRmbGFycmF5WzRdOwogICAgJHNyY3RleHRsYW5nc3skZmxhcnJheVsyXX0gID0gJGZsYXJyYXlbNV07Cn0KY2xvc2UoJFNPVVJDRVMpOwoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgTSBBIEkgTiAgCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBzdGFydCB0d2lnIGZvciBpbnB1dCBhbmQgY2FsbCBzdGFydCB0YWcgaGFuZGxlciBmb3Igcm9vdCBhbmQgdHdpZyBoYW5kbGVyIGZvciBlYWNoIDx0ZXh0PiBpbiB0aGUgVlJUCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgIHN0YXJ0X3RhZ19oYW5kbGVycyA9PiB7Cgl0ZXh0cyA9PiBzdWJ7cm9vdChAXywgJGNvcnB1c0hlYWRlcil9CiAgICB9LAogICAgdHdpZ19oYW5kbGVycyA9PiAgewojCXRleHQgPT4gXCZ0ZXh0Cgl0ZXh0ID0+ICBzdWJ7dGV4dChAXywgJHRleHRIZWFkZXItPmNvcHkpfSAgICAjICAgY29weSBtdXN0IGJlIGJlY2F1c2UgdGV4dEhlYWRlciB3aWxsIGJlIGZsdXNoZWQgd2l0aCAkdHdpZyBpbiB0aGUgPHRleHQ+IGhhbmRsZXI7CiAgICB9LAogICAgIyBkdGRfaGFuZGxlcnMgPT4gICB7ICAgICAgICMgVG9EbyBmb3IgSTUKICAgICMJXCZzZXRfZHRkOwogICAgIyB9CiAgICAKICAgIG91dHB1dF9lbmNvZGluZyA9PiAkZW5jb2RpbmcsCiAgICApOwoKJHR3aWctPnBhcnNlZmlsZSgkQVJHVlswXSk7CgoKCgoKIyMjIyMjIyMjIyMKIyBFTkQgTUFJTgojIyMjIyMjIyMjIwoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICBTIFUgQiBSIE8gVSBUIEkgTiBFIFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIHN1YiBzZXRfZHRkIFsKIyAgICBteSAkdHdpZywgJGR0ZCA9IEBfOwojICAgIG15ICRpbnRlcm5hbCA9IHFxfFxuUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiJcbiJEVEQveGh0bWwxLXN0cmljdC5kdGQifDsKIwojICAgICR0d2lnLT50d2lnX2RvY3R5cGUoJ2h0bWwnLCB1bmRlZiwgdW5kZWYsICRpbnRlcm5hbCk7CiMgICAgfQoKCgpzdWIgcm9vdCB7CiAgICBteSAoJHR3aWcsICRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgJHJvb3QtPnNldF9naSgndGVpQ29ycHVzJyk7CiAgICAkcm9vdC0+c2V0X2F0dCgieG1sbnMiLCAnaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wJyk7CgogICAgJmluc2VydENvcnB1c0hlYWRlcigkcm9vdCwgJGNvcnB1c0hlYWRlcik7Cn0KCgoKc3ViIGluc2VydENvcnB1c0hlYWRlcnsKICAgIG15ICgkcm9vdCwgJGNvcnB1c0hlYWRlcikgPUBfOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHRha2UgZm5zb3VyY2UgYW5kIHllYXIgZnJvbSB0aGUgY3VycmVudCB4bWwgaW5wdXQgZmlsZW5hbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgbXkgQGFycmF5ID0gc3BsaXQoL1wvLywgJEFSR1ZbMF0pOwogICAgbXkgJGwgPSBzY2FsYXIoQGFycmF5KTsKICAgIG15ICRmbnNvdXJjZSA9ICRhcnJheVskbC0xXTsKICAgICRmbnNvdXJjZSA9fiBzLyhbMC05XVswLTldWzAtOV1bMC05XSlcLnhtbCQvLzsKCiAgICBteSAkeWVhciA9ICQxOyAgICMgJDEgbm93IGNvbnRhaW50cyBzdWJzdHJpbmcgaW4gZmlyc3QgYnJhY2tldCBpbiByZWdleCBhYm92ZQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBzZXQgY29ycHVzIGhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICZzZXRfdGl0bGUoICAgICAkY29ycHVzSGVhZGVyLCAkc3JjZnVsbG5hbWVzeyRmbnNvdXJjZX0sICR5ZWFyLCAka2llbGlwYW5ra2lDb3JwdXMpOwogICAgJnNldF9zb3VyY2VEZXNjKCRjb3JwdXNIZWFkZXIsICRzcmNmdWxsbmFtZXN7JGZuc291cmNlfSwgJHllYXIsICRraWVsaXBhbmtraUNvcnB1cyk7CgogICAgbXkgJHRlaUNvcnB1c0hlYWRlciAgICAgICAgPSAkY29ycHVzSGVhZGVyLT5wYXN0ZSgiZmlyc3RfY2hpbGQiLCAkcm9vdCk7Cgp9CiAgICAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaGFuZGxlciAmdGV4dCBmb3IgPHRleHQ+CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdWIgdGV4dCB7CiAgICBteSAoJHR3aWcsICR0ZXh0LCAkdGV4dEhlYWRlcikgPSBAXzsKCiAgICAkdGV4dGNvdW50ZXIrKzsgICAgICAgICAgICAgICAKCiAgICAKICAgICMgVG9EbzogY2F0Y2ggYWxsIG90aGVyLCB1bmV4cGVjdGVkIGNoaWxkcmVuIG9mIHJvb3QKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRleHQgbWV0YWRhdGEgKGF0dHJpYnV0ZXMgb2YgPHRleHQ+KSBhbmQgY3JlYXRlIHRlaUhlYWRlciBmb3IgPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHRleHRhdHRzcmVmID0gJHRleHQtPmF0dHMoKTsgICAgICAgICAgICAgICAjICR0ZXh0YXR0c3JlZiBpcyBub3cgYSByZWZlcmVuY2UgdG8gYSBoYXNoIGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoICctPicKCiAgICAjICZjcmVhdGVUZXh0SGVhZGVyIHJldHVybnMgdGhlICR0ZXh0SUQ6CiAgICBteSAkdGV4dElEID0gJmNyZWF0ZVRleHRIZWFkZXIoJHRleHQsICR0ZXh0YXR0c3JlZiwgJHRleHRIZWFkZXIpOwogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxURUk+IGZyb20gPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgIyBzZXQgdnJ0IDx0ZXh0PiB0byA8VEVJPiBhbmQgZGVsZXRlIGFsbCBhdHRyaWJ1dGVzIGFmdGVyIHRoZXkgd2VyZSB3ZXJlIHNhdmVkIGFib3ZlCiAgICAkdGV4dC0+ZGVsX2F0dHM7CiAgICAkdGV4dC0+c2V0X2dpKCJURUkiKTsKICAgICR0ZXh0LT5zZXRfYXR0KCd4bWw6aWQnLCAkdGV4dElEKTsKICAgIAoKICAgICAgCgogICAgCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIHRoZSA8dGVpOnRleHQ+LCA8Ym9keT4sIDxkaXY+IGVsZW1lbnRzIGluc2lkZSA8VEVJPgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSAkdHRleHRfZWxlbWVudCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3RleHQnKTsKICAgIG15ICRib2R5X2VsZW1lbnQgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnYm9keScpOwogICAgbXkgJGRpdl9lbGVtZW50ICAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdkaXYnKTsKCiAgICAjIHNldCBhdHRzCiAgICAkZGl2X2VsZW1lbnQgIC0+c2V0X2F0dCgidHlwZSIsICJwYWdlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvRG86IHRoaXMgaXMgc3BlY2lmaWMgdG8gS0xLCiAgICAkdHRleHRfZWxlbWVudC0+c2V0X2F0dCgieG1sOmxhbmciLCAnZmknKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBpbiBJQ0MtTk9SCgogICAgIyBwYXN0ZQogICAgJHR0ZXh0X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgICR0ZXh0KTsKICAgICRib2R5X2VsZW1lbnQgLT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdHRleHRfZWxlbWVudCk7CiAgICAkZGl2X2VsZW1lbnQgIC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJGJvZHlfZWxlbWVudCk7CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPHA+IGZyb20gPHBhcmFncmFwaD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEBwYXJhZ3JhcGhzID0gJHRleHQtPmNoaWxkcmVuKCAncGFyYWdyYXBoJyk7CgogICAgZm9yZWFjaCBteSAkcGFyYWdyYXBoIChAcGFyYWdyYXBocykgewoJCgkmc2V0UCgkcGFyYWdyYXBoKTsKCgkkcGFyYWdyYXBoLT5tb3ZlKCdsYXN0X2NoaWxkJywgJGRpdl9lbGVtZW50KTsKCQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJIyBjcmVhdGUgPHM+IGZyb20gPHNlbnRlbmNlPgoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCglteSBAc2VudGVuY2VzID0gJHBhcmFncmFwaC0+Y2hpbGRyZW4oJ3NlbnRlbmNlJyk7Cglmb3JlYWNoIG15ICRzZW50ZW5jZSAoQHNlbnRlbmNlcykgewoKCSAgICAmc2V0Uygkc2VudGVuY2UpOwoKCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgIyBjcmVhdGUgPHc+ICh3b3JkKSBmcm9tIGVhY2ggJGxpbmUKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAKCSAgICBteSBAbGluZXMgPSBzcGxpdCgvXG4rLywgJHNlbnRlbmNlLT54bWxfdGV4dCk7CgkgICAgJHNlbnRlbmNlLT5zZXRfdGV4dCgiXG4iKTsKCgkgICAgZm9yIG15ICRsaW5lIChAbGluZXMpeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9kbzogUmVpaGVuZm9sZ2UgY2hlY2tlbgoJCWlmKCRsaW5lIG5lICIiICl7CgkJICAgIG15ICR3X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd3Jyk7CgkJICAgICZjcmVhdGVXKCR3X2VsZW1lbnQsICRsaW5lKTsKCQkgICAgJHdfZWxlbWVudC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAkc2VudGVuY2UpOwoJCX0KCSAgICB9ICMgZW5kIHdvcmRzCgl9ICMgZW5kIHNlbnRlbmNlcwogICAgfSAjIGVuZCBwYXJhZ3JhcGhzCgogICAgIyAkdHdpZy0+c2V0X3ByZXR0eV9wcmludCggJ3JlY29yZCcpOwogICAgIyAkdHdpZy0+Zmx1c2goJE9VVCk7CiAgICAkdHdpZy0+Zmx1c2goIi9kZXYvc3Rkb3V0Iik7Cn0KCnN1YiBjcmVhdGVUZXh0SGVhZGVyewogICAgbXkgKCR0ZXh0LCAkdGV4dGF0dHNyZWYsICR0ZXh0SGVhZGVyKSA9IEBfOwogICAgCiAgICAjIFVTRSAwMSBiaW5kaW5nX2lkPSIyMjQ2MDI1IgogICAgIyBVU0UgMDIgZGF0ZT0iMjAyMS0wMS0xNSIKICAgICMgICAgIDAzIGRhdGVmcm9tPSIyMDIxMDExNSIKICAgICMgICAgIDA0IGRhdGV0bz0iMjAyMTAxMTUiCiAgICAjICAgICAwNSBlbGVjX2RhdGU9Il8iCiAgICAjICAgICAwNiBmaWxlPSIiCiAgICAjIFVTRSAwNyBmaWxlbmFtZV9tZXRhZGF0YT0iZmluY2xhcmluX3NpaXJ0b19rMjAyMS8wMDM5LTU1NTIvMjAyMS9hbHRvLzIyNDYwMjVfMDAzOS01NTUyXzIwMjEtMDEtMTVfU0swMjIxX21ldHMueG1sIgogICAgIyBVU0UgMDggZmlsZW5hbWVfb3JpZyAgICA9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9wYWdlLTIwMjEwMTE1MDIyMTAwMzAzMDEueG1sCiAgICAjIFVTRSAwOSBpZD0idC1iY2QwZjNmYS1iYmQzZGFjNCIKICAgICMgICAgIDEwIGltZ191cmw9IiIKICAgICMgVVNFIDExIGlzc3VlX2RhdGU9IjE1LjAxLjIwMjEiCiAgICAjIFVTRSAxMiBpc3N1ZV9ubz0iU0swMjIxIgogICAgIyBVU0UgMTMgaXNzdWVfdGl0bGU9IlN1b21lbiBLdXZhbGVodGkiCiAgICAjIFVTRSAxNCBsYWJlbD0iU3VvbWVuIEt1dmFsZWh0aSBuby4gU0swMjIxIDE1LjAxLjIwMjEiCiAgICAjIFVTRSAxNiBsYW5ndWFnZT0iZmkiCiAgICAjIFVTRSAxNyBwYWdlX2lkPSJwMSIKICAgICMgVVNFIDE4IHBhZ2Vfbm89Ik5vbmUiCiAgICAjICAgICAxOSBwYXJ0X25hbWU9Il8iCiAgICAjICAgICAyMCBwdWJsX2lkPSIwMDM5LTU1NTIiCiAgICAjICAgICAyMSBwdWJsX3BhcnQ9IiIKICAgICMgVVNFIDIyIHB1YmxfdGl0bGU9IlN1b21lbiBLdXZhbGVodGkiIAogICAgIyBVU0UgMjMgcHVibF90eXBlPSJhaWtha2F1c2kiCiAgICAjIFVTRSAyNCBzZW50Y291bnQ9IjcwIgogICAgIyBVU0UgMjUgc3VtX2xhbmc9Inx4eHg6NDR8ZmluOjIzfGVuZzozfCIKICAgICMgICAgIDI2IHRpbWVmcm9tPSIwMDAwMDAiCiAgICAjICAgICAyNyB0aW1ldG89IjIzNTk1OSIKICAgICMgVVNFIDI4IHRva2VuY291bnQ9IjMwNCIKICAgICMgICAgIDI5IHZlcnNpb25fYWRkZWQ9IktMSy1maS0yMDIxIj4KCgogICAgbXkgJEJJRCAgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydiaW5kaW5nX2lkJ307CiAgICBteSAkREFURSAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2RhdGUnfTsKICAgIG15ICRNRVRBRklMRU5BTUUgPSAkdGV4dGF0dHNyZWYtPnsnZmlsZW5hbWVfbWV0YWRhdGEnfTsgICAgCiAgICBteSAkT1JJR0ZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX29yaWcnfTsKICAgIG15ICRJRCAgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaWQnfTsKICAgIG15ICRJU1NVRURBVEUgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfZGF0ZSd9OwogICAgbXkgJElTU1VFTk8gICAgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV9ubyd9OwogICAgbXkgJElTU1VFVElUTEUgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV90aXRsZSd9OwogICAgbXkgJExBQkVMICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydsYWJlbCd9OwogICAgbXkgJExBTkdVQUdFICAgICA9ICR0ZXh0YXR0c3JlZi0+eydsYW5ndWFnZSd9OwogICAgbXkgJFBBR0VJRCAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX2lkJ307CiAgICBteSAkUEFHRU5PICAgICAgID0gJHRleHRhdHRzcmVmLT57J3BhZ2Vfbm8nfTsKICAgIG15ICRQVUJMVElUTEUgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90aXRsZSd9OwogICAgbXkgJFBVQkxUWVBFICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX3R5cGUnfTsKICAgIG15ICRTRU5UQ09VTlQgICAgPSAkdGV4dGF0dHNyZWYtPnsnc2VudGNvdW50J307CiAgICBteSAkU1VNTEFORyAgICAgID0gJHRleHRhdHRzcmVmLT57J3N1bV9sYW5nJ307CiAgICBteSAkVE9LRU5DT1VOVCAgID0gJHRleHRhdHRzcmVmLT57J3Rva2VuY291bnQnfTsKCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIERlcml2ZWQgTWV0YWRhdGEgdmFyaWFibGVzCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBteSBAZGF0ZWFycmF5ID0gc3BsaXQoIi0iLCAkREFURSk7CiAgICBteSBAbGFuZ2FycmF5ID0gc3BsaXQoInwiLCAkU1VNTEFORyk7CiAgICBteSBAbmFtZWFycmF5ID0gc3BsaXQoL1tcLlwvXS8sICRPUklHRklMRU5BTUUpOyAgIyB1c2UgJG5hbWVhcnJheVs0XSBhcyBJRCBmb3IgdGhlIHBhZ2UKICAgIAoKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgdGV4dFNpZ2xlIHRvIGJlIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAjIFNVSzIxLkpBTi4wMDAwMQogICAgCiAgICBteSAkY29ycHVzSUQgPSAiU1VLIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb0RvIHJlYWQgVGFibGUgd2l0aCBTb3VyY2UgbWV0YWRhdGEKICAgIG15ICR5eSAgICAgICA9IHN1YnN0cigkZGF0ZWFycmF5WzBdLCAyLCAyKTsgICAgICAjIHN1YnN0ciBFWFBSLE9GRlNFVCxMRU5HVEgKICAgIG15ICRtbSAgICAgICA9ICRkYXRlYXJyYXlbMV07ICAgICAgICAgICAgICAgICAgICAjIHN1YnN0ciBFWFBSLE9GRlNFVCxMRU5HVEgKICAgIG15ICRNTU0gICAgICA9ICRtb250aHN7JG1tfTsKCiAgICBteSAkdGV4dElEID0gJGNvcnB1c0lEIC4gJHl5IC4gIl8iIC4gJE1NTSAuICIuIiAuIHNwcmludGYoIiUwNWQiLCAkZG9jY291bnRlcnskbW19KyspOwoKICAgIAogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQ1JFQVRFIHRleHQtdGVpSGVhZGVyIEFDQ09SRElORyBUTyBUSEUgU0tFTEVUT04gaW4gJHRleHRIZWFkZXIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiAgICAkdGV4dEhlYWRlci0+cGFzdGUoJ2ZpcnN0X2NoaWxkJywgJHRleHQpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyA8dGVpSGVhZGVyPgogICAgIyAgIDxmaWxlRGVzYyBuPSJFdVJlQ28tS0xLLUZJTl9bJElEXSI+CiAgICAjICAgICA8dGl0bGVTdG10PgogICAgIyAgICAgICA8dGl0bGU+WyRMQUJFTCwgcGFnZSAkUEFHRU5PXTwvdGl0bGU+CQoKICAgICR0ZXh0SGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKSAgIC0+ICBzZXRfYXR0KCduJywgIkV1UmVDby0iLiAka2llbGlwYW5ra2lDb3JwdXMgLiAkSUQpOwogICAgCiAgICAkdGV4dEhlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIikgICAgLT4gZmlyc3RfY2hpbGQoInRpdGxlU3RtdCIpLT5maXJzdF9jaGlsZCgidGl0bGUiKQoJLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBUZXh0ICMiIC4gJHRleHRjb3VudGVyKTsgICAgIyBDYXNlIEtMSzsgIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDxmaWxlRGVzYz4KICAgICMgIDxzb3VyY2VEZXNjPgogICAgIyAgIDxiaWJsU3RydWN0PgogICAgIyAgICAgIDxhbmFseXRpYz4KICAgICMgICAgICAgICA8dGl0bGUgdHlwZT0ibWFpbiI+WyRMQUJFTCwgcGFnZSAkUEFHRU5PXTwvdGl0bGU+CiAgICAjICAgICAgICAgPGRhdGU+WyREQVRFXTwvZGF0ZT4KICAgICMgICAgICAgICA8ZGF0ZSB0eXBlPSJ5ZWFyIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9Im1vbnRoIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9ImRheSI+VE9ETzwvZGF0ZT4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJQQUdFSUQiPiRQQUdFSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iQklORElOR0lEIj4kQklEPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IklEIj4kSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIj4kTUVUQUZJTEVOQU1FPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSI+JE9SSUdGSUxFTkFNRTwvaWRubz4KICAgICMgICAgICAgICA8dGV4dExhbmc+JExBTkdVQUdFPC90ZXh0TGFuZz4KCiAgICBteSAkYW5hbHl0aWMgID0gJHRleHRIZWFkZXItPmdldF94cGF0aCgiLi9maWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvYW5hbHl0aWMiLCAwKTsKCiAgICAkYW5hbHl0aWMtPmZpcnN0X2NoaWxkKCJ0aXRsZSIpICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICMgQ2FzZSBLTEs7IFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9kYXRlW0B0eXBlPSJkYXRlIl0nLCAgIDApICAtPnNldF90ZXh0KCREQVRFKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9InllYXIiXScsICAgMCkgIC0+c2V0X3RleHQoJGRhdGVhcnJheVswXSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9kYXRlW0B0eXBlPSJtb250aCJdJywgIDApICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMV0pOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vZGF0ZVtAdHlwZT0iZGF5Il0nLCAgICAwKSAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzJdKTsgICAgCiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJQQUdFSUQiXScsICAgICAgIDApICAgICAtPnNldF90ZXh0KCRQQUdFSUQpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iQklORElOR0lEIl0nLCAgICAwKSAgICAgLT5zZXRfdGV4dCgkQklEKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IklEIl0nLCAgICAgICAgICAgMCkgICAgIC0+c2V0X3RleHQoJElEKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IktJRUxJUEFOS0tJX01FVEFGSUxFTkFNRSJdJywgMCkgICAgIC0+c2V0X3RleHQoJE1FVEFGSUxFTkFNRSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJLSUVMSVBBTktLSV9PUklHRklMRU5BTUUiXScsIDApICAgICAtPnNldF90ZXh0KCRPUklHRklMRU5BTUUpOwogICAgJGFuYWx5dGljLT5maXJzdF9jaGlsZCgndGV4dExhbmcnKSAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKICAgIAogICAgIyAgPG1vbm9ncj4KICAgICMgICAgPHRpdGxlPiRQVUJMVElUTEU8L3RpdGxlPgogICAgIyAgICA8aW1wcmludD4KICAgICMgICAgICA8cHViUGxhY2U+VE9ETzwvcHViUGxhY2U+CiAgICAjICAgICAgPHB1Ymxpc2hlcj5UT0RPPC9wdWJsaXNoZXI+CiAgICAjICAgIDwvaW1wcmludD4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRVRJVExFIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVOTyIvPgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFREFURSIvPgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9InBwIj4kUEFHRU5PPC9iaWJsU2NvcGU+CgogICAgbXkgJG1vbm9nciAgPSAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCIuL2ZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9tb25vZ3IiLCAwKTsKCiAgICAkbW9ub2dyLT5maXJzdF9jaGlsZCgidGl0bGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkUFVCTFRJVExFKTsKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJQbGFjZSIpICAgICAgICAtPnNldF90ZXh0KCJUb0RvIik7ICAgICAgICAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdGVpIHZhbGlkaXR5CiAgICAkbW9ub2dyLT5maXJzdF9jaGlsZCgiaW1wcmludCIpLT5maXJzdF9jaGlsZCgicHVibGlzaGVyIikgICAgICAgLT5zZXRfdGV4dCgiVG9EbyIpOyAgICAgICAgICMgaW1wcmludCBpcyBuZWVkZWQgZm9yIHRlaSB2YWxpZGl0eQogICAgJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0iSVNTVUVUSVRMRSJdJywgMCkgICAgICAgIC0+c2V0X3RleHQoJElTU1VFVElUTEUpOwogICAgJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0iSVNTVUVOTyJdJywgMCkgICAgICAgICAgIC0+c2V0X3RleHQoJElTU1VFTk8pOwogICAgJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0iSVNTVUVEQVRFIl0nLCAwKSAgICAgICAgIC0+c2V0X3RleHQoJElTU1VFREFURSk7CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJwcCJdJywgMCkgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkUEFHRU5PKTsgICAgICAgICMgQWNodHVuZyAtIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCgogICAgIyAgPGVuY29kaW5nRGVzYz4KICAgICMgICAgPHRhZ3NEZWNsPgogICAgIyAgICAgIDxuYW1lc3BhY2UgbmFtZT0iaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wIj4KICAgICMgICAgICAgIDx0YWdVc2FnZSBnaT0icyIgb2NjdXJzPSJTRU5UQ09VTlQiLz4KICAgICMgICAgICAgIDx0YWdVc2FnZSBnaT0idyIgb2NjdXJzPSJUT0tFTkNPVU5UIi8+CgogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9lbmNvZGluZ0Rlc2MvdGFnc0RlY2wvbmFtZXNwYWNlL3RhZ1VzYWdlW0BnaT0icyJdJywgMCkgICAgICAtPiBzZXRfYXR0KCdvY2N1cnMnLCAkU0VOVENPVU5UKTsKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vZW5jb2RpbmdEZXNjL3RhZ3NEZWNsL25hbWVzcGFjZS90YWdVc2FnZVtAZ2k9InciXScsIDApICAgICAgLT4gc2V0X2F0dCgnb2NjdXJzJywgJFRPS0VOQ09VTlQpOwoJCiAgICAjICA8cHJvZmlsZURlc2M+CiAgICAjICAgIDxsYW5nVXNhZ2U+CiAgICAjICAgICA8bGFuZ3VhZ2UgaWRlbnQ9ImZpIiB1c2FnZT0ifHh4eDo0NHxmaW46MjN8ZW5nOjN8Ii8+CiAgICAjICAgPC9sYW5nVXNhZ2U+CiAgICAjICAgIDx0ZXh0Q2xhc3M+CiAgICAjICAgICAgPGNsYXNzQ29kZSBzY2hlbWU9ImtpZWxpcGFua2tpX2tsayI+JFBVQkxUWVBFPC9jbGFzc0NvZGU+CiAgICAjICAgICAgPGNsYXNzQ29kZSBzY2hlbWU9ImtpZWxpcGFua2tpX2tsa19tYXBwZWQiPlRPRE88L2NsYXNzQ29kZT4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL2xhbmdVc2FnZS9sYW5ndWFnZScsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF9hdHQoJ2lkZW50JywgJExBTkdVQUdFKTsKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgndXNhZ2UnLCAkU1VNTEFORyk7CiAgICAjIGluIEB1c2FnZSBtdXNzIGVpZ3QuIGVpbiBpbnRlZ2VyOyBhbSBiZXN0ZW4gaW5oYWx0IHZvbiBTVU1MQU5HIGF1ZmRyb2VzZWxuIHVuZCBtZWhyZXJlIDxsYW5ndWFnZT4gbWFjaGVuCgogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy90ZXh0Q2xhc3MvY2xhc3NDb2RlW0BzY2hlbWU9ImtpZWxpcGFua2tpX2tsayJdJywgMCkgICAgICAgLT5zZXRfdGV4dCgkUFVCTFRZUEUpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy90ZXh0Q2xhc3MvY2xhc3NDb2RlW0BzY2hlbWU9ImtpZWxpcGFua2tpX2tsa19tYXBwZWQiXScsIDApLT5zZXRfdGV4dCgiVG9EbyIpOwoKICAgICMgIDxyZXZpc2lvbkRlc2M+CiAgICAjICAgIDxjaGFuZ2Ugd2hlbj0iVE9ETyIgd2hvPSJITCI+VEVJIHZlcnNpb24gZm9yIEV1UmVDbzwvY2hhbmdlPgoKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcmV2aXNpb25EZXNjL2NoYW5nZScsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCd3aGVuJywgbG9jYWx0aW1lLT55bWQoJy0nKSk7CiAgICAKICAgIHJldHVybiAkdGV4dElEOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEVORCBPRiBDUkVBVElORyBURUlIRUFERVIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCn0KCnN1YiBzZXRQIHsKICAgIG15ICgkcGFyYWdyYXBoKSA9IEBfOwogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfZ2koJ3AnKTsKICAgIAogICAgIyA8cGFyYWdyYXBoIGlkPSJwLWJjZDBmM2ZhLWJiZDNkYWM0LTgxNWVhZDdhIiBzdW1fbGFuZz0ifGZpbjoxfCI+CiAgICAjIGF0dHMgb2YgPHBhcmFncmFwaD46CiAgICAjICAgIEBpZCAgICAgICAgVVNFCiAgICAjICAgIEBzdW1fbGFuZyAgVVNFOiBwdXQgaW4geG1sOmxhbmcgYW5kIHByZWZpeCB0aGUgdmFsdWUgd2l0aCAieC0iIGZvciBwcml2YXRlIHZhbHVlCiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9hdHQoInhtbDpsYW5nIiwgIngtIiAuICRwYXJhZ3JhcGgtPmF0dCgic3VtX2xhbmciKSk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJzdW1fbGFuZyIpOwogICAgIyAkcGFyYWdyYXBoLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgiaWQiKTsgICAgICAgICAgICAgICMgZGllc2UgaWQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnISEKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UyB7CiAgICBteSAoJHNlbnRlbmNlKSA9IEBfOwogICAgCiAgICAkc2VudGVuY2UtPnNldF9naSgncycpOwoJICAgIAogICAgIyB0aGUgYXR0cyBvZiA8c2VudGVuY2U+OgogICAgIyAgICBVU0UgICAxIEBpZD0icy1iY2QwZjNmYS1iYmQzZGFjNC1mNzQyOTA5MCIKICAgICMgICAgVVNFICAgMiBAbGFuZz0iZmluIiAtPiB4bWw6bGFuZyAKICAgICMgICAgPyAgICAgMyBAbGFuZ19jb25mPSIwLjY3MzQ4NTMiPiAtPiBUb0RvIEBjZXJ0ID8JICAgIAogICAgCiAgICAjIHNldCBhdHRycyBvZiA8cz4KICAgICRzZW50ZW5jZS0+c2V0X2F0dCgieG1sOmxhbmciLCAkc2VudGVuY2UtPmF0dCgibGFuZyIpKTsgICMgVG9EbzogY29udmVydCB0aGUgdmFsdWUgLyBpbnRyb2R1Y2UgYSBoYXNoIGZvciBsb29rdXAgKGlucHV0IHZhbHVlczogImZpbiIsICJ4eHgiLCAuLi4uKQogICAgIyAkc2VudGVuY2UtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7ICAgICAgICAgICAgIyBuaWNodCBlaW5kZXV0aWcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgnaWQnKTsKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2VkIGJ5IHhtbDpsYW5nCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmdfY29uZiIpOyAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIHRpbWUgYmVpbmcKICAgIAp9CgpzdWIgY3JlYXRlVyB7CiAgICBteSAoJHdfZWxlbWVudCwgJGxpbmUpID0gQF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHZXQgdGhlIHRhZ3MgKD1jb2x1bW5zKQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAdGFncyA9IHNwbGl0KC9cdC8sICRsaW5lKTsKICAgIAogICAgIyBzZXQgY29udGVudCBvZiA8dz4gaS5lLiB0aGUgdG9rZW4KICAgICR3X2VsZW1lbnQtPnNldF90ZXh0KCR0YWdzWzBdKTsKICAgIAogICAgIyB2cnQgcG9zaXRpb25hbC1hdHRyaWJ1dGVzIGluIGNvcnB1cyBLTEs6CiAgICAjICBVU0UgWzBdIHdvcmQKICAgICMgIFVTRSBbMV0gcmVmICAoaWQgZm9yIHJlZmVyZW5jZSBvZiBkZXBoZWFkKQogICAgIyAgVVNFIFsyXSBsZW1tYQogICAgIyAgPyAgIFszXSBsZW1tYWNvbXAgICAobGVtbWEgd2l0aCBjb21wb3VuZCBpbmZvIC0gY291bGQgZ28gaW4gQG5vcm0sIGFzIHRhZyBhYnVzZT8pCiAgICAjICBVU0UgWzRdIHBvcyAKICAgICMgIFVTRSBbNV0gbXNkIAogICAgIyAgVVNFIFs2XSBkZXBoZWFkCiAgICAjICBVU0UgWzddIGRlcHJlbCAKICAgICMgICAgICBbOF0gY29udGVudCAgIChvY3ItcHJvY2VzcykKICAgICMgICAgICBbOV0gdnBvcyAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMF0gb2NyICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMV0gY2MgICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMl0gaHlwaCAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxM10gc3R5bGUgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxNF0gbGV4ICAgICAgIChrb3JwIHNlbWFudGljIGRpc2FtYmlndWF0aW9uIGZyb20gRyJvdGVib3JnKQogICAgCiAgICAjIHNldCB0aGUgYXR0cmlidXRlcyBvZiA8dz46CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJuIiwgICAgICAkdGFnc1sxXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoImlkIiwgICAgICJ3XyIgLiAkbmFtZWFycmF5WzRdIC4gJHNlbnRlbmNlLT5hdHQoInhtbDppZCIpIC4gIl8iIC4gJHRhZ3NbMV0pOwogICAgIyBzbyB6dXNhbW1lbmdlYmF1dGUgSUQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnLi4uCiAgICAkd19lbGVtZW50LT5kZWxfYXR0KCJpZCIpOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibGVtbWEiLCAgJHRhZ3NbMl0pOwogICAgIyAkd19lbGVtZW50LT5zZXRfYXR0KCJub3JtIiwgICAkdGFnc1szXSk7ICAjIHRhZyBhYnVzZSBvZiBAbm9ybQogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgicG9zIiwgICAgJHRhZ3NbNF0pOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibXNkIiwgICAgJHRhZ3NbNV0pOwojVE1QICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImhlYWQiLCAgICR0YWdzWzZdKTsKI1RNUCAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJkZXByZWwiLCAkdGFnc1s3XSk7CiAgICAKfQogICAgCgpzdWIgc2V0X3RpdGxlewogICAgbXkgKCRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5ZWFyLCAka2llbGlwYW5ra2lDb3JwdXMpID0gQF87CgogICAgbXkgJGNUaXRsZVN0cmluZyA9ICRzb3VyY2UgLiAiICIgLiAkeWVhciAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgCgogICAgIzx0ZWlIZWFkZXI+CiAgICAjICA8ZmlsZURlc2M+CiAgICAjICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgPHRpdGxlPltBYW11bGVodGkyMDIxXSBmcm9tIFtrbGstZmktdjItdnJ0IGZvcl0gRXVSZUNvPC90aXRsZT4KICAgICMgICAgPC90aXRsZVN0bXQ+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY1RpdGxlTm9kZSA9ICRjb3JwdXNIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpLT5maXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCJ0aXRsZSIpOwoKICAgICRjVGl0bGVOb2RlLT5zZXRfdGV4dCgkY1RpdGxlU3RyaW5nKTsKICAgIAp9CgpzdWIgc2V0X3NvdXJjZURlc2N7CiAgICBteSAoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHllYXIsICRraWVsaXBhbmtraUNvcnB1cykgPSBAXzsKCiAgICBteSAkY0JpYmxTdHJpbmcgPSAkc291cmNlIC4gIiAiIC4gJHllYXIgLiAiLCBmcm9tICIuICRraWVsaXBhbmtraUNvcnB1cyAuICIgZm9yIEV1UmVDbyI7ICAgIAoKICAgICM8dGVpSGVhZGVyPgogICAgIyAgPGZpbGVEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgICAgPHNvdXJjZURlc2M+CiAgICAjICAgICAgPGJpYmw+W0FhbXVsZWh0aTIwMjFdIGZyb20gW2tsay1maS12Mi12cnRdPC9iaWJsPgogICAgIyAgICA8L3NvdXJjZURlc2M+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY0JpYmxOb2RlID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJzb3VyY2VEZXNjIiktPmZpcnN0X2NoaWxkKCJiaWJsIik7CgogICAgJGNCaWJsTm9kZS0+c2V0X3RleHQoJGNCaWJsU3RyaW5nKTsgICAgCn0KCgoKIyMjIyMjIyMjIyMjIyMjIyMKIyMgdXNhZ2VfbWVzc2FnZQojIyMjIyMjIyMjIyMjIyMjIwoKCnN1YiB1c2FnZV9tZXNzYWdlIHsKICAgIHByaW50ICIgICBVc2FnZTogIC4vdnJ0MnRlaS5wbCA8ZmlsZS52cnQueG1sPiA8b3V0ZmlsZT5cbiI7CiAgICBwcmludCAiICAgPGZpbGUudnJ0LnhtbD4gaXMgYSBWUlQgZmlsZSBjb252ZXJ0ZWQgdG8gcHJvcGVyIFhNTFxuIjsKICAgIGV4aXQ7Cn0KCgo=