IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgSnVseSAyMDA0CiMKIyAyLjIyeCBSQzQgdHVuZS11cDotKSBJdCBzaG91bGQgYmUgbm90ZWQgdGhvdWdoIHRoYXQgbXkgaGFuZCBbYXMgaW4KIyAiaGFuZC1jb2RlZCBhc3NlbWJsZXIiXSBkb2Vzbid0IHN0YW5kIGZvciB0aGUgd2hvbGUgaW1wcm92ZW1lbnQKIyBjb2VmZmljaWVudC4gSXQgdHVybmVkIG91dCB0aGF0IGVsaW1pbmF0aW5nIFJDNF9DSEFSIGZyb20gY29uZmlnCiMgbGluZSByZXN1bHRzIGluIH40MCUgaW1wcm92ZW1lbnQgKHllcywgZXZlbiBmb3IgQyBpbXBsZW1lbnRhdGlvbikuCiMgUHJlc3VtYWJseSBpdCBoYXMgZXZlcnl0aGluZyB0byBkbyB3aXRoIEFNRCBjYWNoZSBhcmNoaXRlY3R1cmUgYW5kCiMgUkFXIG9yIHdoYXRldmVyIHBlbmFsdGllcy4gT25jZSBhZ2FpbiEgVGhlIG1vZHVsZSAqcmVxdWlyZXMqIGNvbmZpZwojIGxpbmUgKndpdGhvdXQqIFJDNF9DSEFSISBBcyBmb3IgY29kaW5nICJzZWNyZXQsIiBJIGJldCBvbiBwYXJ0aWFsCiMgcmVnaXN0ZXIgYXJpdGhtZXRpY3MuIEZvciBleGFtcGxlIGluc3RlYWQgb2YgJ2luYyAlcjg7IGFuZCAkMjU1LCVyOCcKIyBJIHNpbXBseSAnaW5jICVyOGInLiBFdmVuIHRob3VnaCBvcHRpbWl6YXRpb24gbWFudWFsIGRpc2NvdXJhZ2VzCiMgdG8gb3BlcmF0ZSBvbiBwYXJ0aWFsIHJlZ2lzdGVycywgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgYmVzdCBiZXQuCiMgQXQgbGVhc3QgZm9yIEFNRC4uLiBIb3cgSUEzMkUgd291bGQgcGVyZm9ybSByZW1haW5zIHRvIGJlIHNlZW4uLi4KCiMgTm92ZW1iZXIgMjAwNAojCiMgQXMgd2FzIHNob3duIGJ5IE1hcmMgQmV2YW5kIHJlb3JkZXJpbmcgb2YgY291cGxlIG9mIGxvYWQgb3BlcmF0aW9ucwojIHJlc3VsdHMgaW4gZXZlbiBoaWdoZXIgcGVyZm9ybWFuY2UgZ2FpbiBvZiAzLjN4Oi0pIEF0IGxlYXN0IG9uCiMgT3B0ZXJvbi4uLiBGb3IgcmVmZXJlbmNlLCAxeCBpbiB0aGlzIGNhc2UgaXMgUkM0X0NIQVIgQy1jb2RlCiMgY29tcGlsZWQgd2l0aCBnY2MgMy4zLjIsIHdoaWNoIHBlcmZvcm1zIGF0IH41NE1CcHMgcGVyIDFHSHogY2xvY2suCiMgTGF0dGVyIG1lYW5zIHRoYXQgaWYgeW91IHdhbnQgdG8gKmVzdGltYXRlKiB3aGF0IHRvIGV4cGVjdCBmcm9tCiMgKnlvdXIqIE9wdGVyb24sIHRoZW4gbXVsdGlwbHkgNTQgYnkgMy4zIGFuZCBjbG9jayBmcmVxdWVuY3kgaW4gR0h6LgoKIyBOb3ZlbWJlciAyMDA0CiMKIyBJbnRlbCBQNCBFTTY0VCBjb3JlIHdhcyBmb3VuZCB0byBydW4gdGhlIEFNRDY0IGNvZGUgcmVhbGx5IHNsb3cuLi4KIyBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSBjb21wYXJhYmxlIHBlcmZvcm1hbmNlIG9uIFA0IHdhcyB0byBrZWVwCiMgUkM0X0NIQVIuIEtpbmQgb2YgaXJvbmljLCBodWg/IEFzIGl0J3MgYXBwYXJlbnRseSBpbXBvc3NpYmxlIHRvCiMgY29tcG9zZSBibGVuZGVkIGNvZGUsIHdoaWNoIHdvdWxkIHBlcmZvcm0gZXZlbiB3aXRoaW4gMzAlIG1hcmdpbmFsCiMgb24gZWl0aGVyIEFNRCBhbmQgSW50ZWwgcGxhdGZvcm1zLCBJIGltcGxlbWVudCBib3RoIGNhc2VzLiBTZWUKIyByYzRfc2tleS5jIGZvciBmdXJ0aGVyIGRldGFpbHMuLi4KCiMgQXByaWwgMjAwNQojCiMgUDQgRU02NFQgY29yZSBhcHBlYXJzIHRvIGJlICJhbGxlcmdpYyIgdG8gNjQtYml0IGluYy9kZWMuIFJlcGxhY2luZyAKIyB0aG9zZSB3aXRoIGFkZC9zdWIgcmVzdWx0cyBpbiA1MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgZm9sZGVkCiMgbG9vcC4uLgoKIyBNYXkgMjAwNQojCiMgQXMgd2FzIHNob3duIGJ5IFpvdSBOYW5oYWkgbG9vcCB1bnJvbGxpbmcgY2FuIGltcHJvdmUgSW50ZWwgRU02NFQKIyBwZXJmb3JtYW5jZSBieSA+MzAlIFt1bmxpa2UgUDQgMzItYml0IGNhc2UgdGhhdCBpc10uIEJ1dCB0aGlzIGlzCiMgcHJvdmlkZWQgdGhhdCBsb2FkcyBhcmUgcmVvcmRlcmVkIGV2ZW4gbW9yZSBhZ2dyZXNzaXZlbHkhIEJvdGggY29kZQojIHBhdGhlcywgQU1ENjQgYW5kIEVNNjRULCByZW9yZGVyIGxvYWRzIGluIGVzc2VudGlhbGx5IHNhbWUgbWFubmVyCiMgYXMgbXkgSUEtNjQgaW1wbGVtZW50YXRpb24uIE9uIE9wdGVyb24gdGhpcyByZXN1bHRlZCBpbiBtb2Rlc3QgNSUKIyBpbXByb3ZlbWVudCBbSSBoYWQgdG8gdGVzdCBpdF0sIHdoaWxlIGZpbmFsIEludGVsIFA0IHBlcmZvcm1hbmNlCiMgYWNoaWV2ZXMgcmVzcGVjdGZ1bCA0MzJNQnBzIG9uIDIuOEdIeiBwcm9jZXNzb3Igbm93LiBGb3IgcmVmZXJlbmNlLgojIElmIGV4ZWN1dGVkIG9uIFhlb24sIGN1cnJlbnQgUkM0X0NIQVIgY29kZS1wYXRoIGlzIDIuN3ggZmFzdGVyIHRoYW4KIyBSQzRfSU5UIGNvZGUtcGF0aC4gV2hpbGUgaWYgZXhlY3V0ZWQgb24gT3B0ZXJvbiwgaXQncyBvbmx5IDI1JQojIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSC1LWFyY2ggZGV0ZWN0aW9uCiMgaXMgbm90IGltcGxlbWVudGVkLCB0aGVuIHRoaXMgZmluYWwgUkM0X0NIQVIgY29kZS1wYXRoIHNob3VsZCBiZQojIHByZWZlcnJlZCwgYXMgaXQgcHJvdmlkZXMgYmV0dGVyICphbGwtcm91bmQqIHBlcmZvcm1hbmNlXS4KCiMgTWFyY2ggMjAwNwojCiMgSW50ZWwgQ29yZTIgd2FzIG9ic2VydmVkIHRvIHBlcmZvcm0gcG9vcmx5IG9uIGJvdGggY29kZSBwYXRoczotKCBJdAojIGFwcGFyZW50bHkgc3VmZmVycyBmcm9tIHNvbWUga2luZCBvZiBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxsLCB3aGljaAojIG9jY3VycyBpbiA2NC1iaXQgbW9kZSBvbmx5IFthcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIDMyLWJpdCBsb29wIHdhcwojIG9ic2VydmVkIHRvIG91dHBlcmZvcm0gNjQtYml0IG9uZSBieSBhbG1vc3QgNTAlXS4gQWRkaW5nIHR3byBtb3Z6YiB0bwojIGNsb29wMSBib29zdHMgaXRzIHBlcmZvcm1hbmNlIGJ5IDgwJSEgVGhpcyBsb29wIGFwcGVhcnMgdG8gYmUgb3B0aW1hbAojIGZpdCBmb3IgQ29yZTIgYW5kIHRoZXJlZm9yZSB0aGUgY29kZSB3YXMgbW9kaWZpZWQgdG8gc2tpcCBjbG9vcDggb24KIyB0aGlzIENQVS4KCiMgTWF5IDIwMTAKIwojIEludGVsIFdlc3RtZXJlIHdhcyBvYnNlcnZlZCB0byBwZXJmb3JtIHN1Ym9wdGltYWxseS4gQWRkaW5nIHlldAojIGFub3RoZXIgbW92emIgdG8gY2xvb3AxIGltcHJvdmVkIHBlcmZvcm1hbmNlIGJ5IGFsbW9zdCA1MCUhIENvcmUyCiMgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQgdG9vLCBidXQgbm9taW5hbGx5Li4uCgojIE1heSAyMDExCiMKIyBUaGUgb25seSBjb2RlIHBhdGggdGhhdCB3YXMgbm90IG1vZGlmaWVkIGlzIFA0LXNwZWNpZmljIG9uZS4gTm9uLVA0CiMgSW50ZWwgY29kZSBwYXRoIG9wdGltaXphdGlvbiBpcyBoZWF2aWx5IGJhc2VkIG9uIHN1Ym1pc3Npb24gYnkgTWF4aW0KIyBQZXJtaW5vdiwgTWF4aW0gTG9ja3R5dWtoaW4gYW5kIEppbSBHdWlsZm9yZCBvZiBJbnRlbC4gSSd2ZSB1c2VkCiMgc29tZSBvZiB0aGUgaWRlYXMgZXZlbiBpbiBhdHRlbXB0IHRvIG9wdG1pemUgdGhlIG9yaWdpbmFsIFJDNF9JTlQKIyBjb2RlIHBhdGguLi4gQ3VycmVudCBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzCiMgaXMgYmV0dGVyKSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnRzIHJlbGF0aXZlIHRvIHByZXZpb3VzCiMgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSBhcmU6CiMKIyBPcHRlcm9uCTUuMy8rMCUoKikKIyBQNAkJNi41CiMgQ29yZTIJCTYuMi8rMTUlKCoqKQojIFdlc3RtZXJlCTQuMi8rNjAlCiMgU2FuZHkgQnJpZGdlCTQuMi8rMTIwJQojIEF0b20JCTkuMy8rODAlCiMKIyAoKikJQnV0IGNvcnJlc3BvbmRpbmcgbG9vcCBoYXMgbGVzcyBpbnN0cnVjdGlvbnMsIHdoaWNoIHNob3VsZCBoYXZlCiMJcG9zaXRpdmUgZWZmZWN0IG9uIHVwY29taW5nIEJ1bGxkb3plciwgd2hpY2ggaGFzIG9uZSBsZXNzIEFMVS4KIwlGb3IgcmVmZXJlbmNlLCBJbnRlbCBjb2RlIHJ1bnMgYXQgNi44IGNwYiByYXRlIG9uIE9wdGVyb24uCiMgKCoqKQlOb3RlIHRoYXQgQ29yZTIgcmVzdWx0IGlzIH4xNSUgbG93ZXIgdGhhbiBjb3JyZXNwb25kaW5nIHJlc3VsdAojCWZvciAzMi1iaXQgY29kZSwgbWVhbmluZyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wcm92ZSBpdCwKIwlidXQgbW9yZSB0aGFuIGxpa2VseSBhdCB0aGUgY29zdCBvZiB0aGUgb3RoZXJzIChzZWUgcmM0LTU4Ni5wbAojCXRvIGdldCB0aGUgaWRlYSkuLi4KCiRmbGF2b3VyID0gc2hpZnQ7CiRvdXRwdXQgID0gc2hpZnQ7CmlmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KCiR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CgokMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwooICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgpkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOwoKb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CipTVERPVVQ9Kk9VVDsKCiRkYXQ9IiVyZGkiOwkgICAgIyBhcmcxCiRsZW49IiVyc2kiOwkgICAgIyBhcmcyCiRpbnA9IiVyZHgiOwkgICAgIyBhcmczCiRvdXQ9IiVyY3giOwkgICAgIyBhcmc0Cgp7CiRjb2RlPTw8X19fOwoudGV4dAouZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCgouZ2xvYmwJUkM0Ci50eXBlCVJDNCxcQGZ1bmN0aW9uLDQKLmFsaWduCTE2ClJDNDoJb3IJJGxlbiwkbGVuCglqbmUJLkxlbnRyeQoJcmV0Ci5MZW50cnk6CglwdXNoCSVyYngKCXB1c2gJJXIxMgoJcHVzaAklcjEzCi5McHJvbG9ndWU6Cgltb3YJJGxlbiwlcjExCgltb3YJJGlucCwlcjEyCgltb3YJJG91dCwlcjEzCl9fXwpteSAkbGVuPSIlcjExIjsJCSMgcmVhc3NpZ24gaW5wdXQgYXJndW1lbnRzCm15ICRpbnA9IiVyMTIiOwpteSAkb3V0PSIlcjEzIjsKCm15IEBYWD0oIiVyMTAiLCIlcnNpIik7Cm15IEBUWD0oIiVyYXgiLCIlcmJ4Iik7Cm15ICRZWT0iJXJjeCI7Cm15ICRUWT0iJXJkeCI7CgokY29kZS49PDxfX187Cgl4b3IJJFhYWzBdLCRYWFswXQoJeG9yCSRZWSwkWVkKCglsZWEJOCgkZGF0KSwkZGF0Cgltb3YJLTgoJGRhdCksJFhYWzBdI2IKCW1vdgktNCgkZGF0KSwkWVkjYgoJY21wbAlcJC0xLDI1NigkZGF0KQoJamUJLkxSQzRfQ0hBUgoJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyOGQKCXhvcgkkVFhbMV0sJFRYWzFdCglpbmMJJFhYWzBdI2IKCXN1YgkkWFhbMF0sJFRYWzFdCglzdWIJJGlucCwkb3V0Cgltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAoJdGVzdAlcJC0xNiwkbGVuCglqegkuTGxvb3AxCglidAlcJDMwLCVyOGQJIyBJbnRlbCBDUFU/CglqYwkuTGludGVsCglhbmQJXCQ3LCRUWFsxXQoJbGVhCTEoJFhYWzBdKSwkWFhbMV0KCWp6CS5Mb29wOAoJc3ViCSRUWFsxXSwkbGVuCi5Mb29wOF93YXJtdXA6CglhZGQJJFRYWzBdI2IsJFlZI2IKCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCgltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQoJbW92bAkkVFkjZCwoJGRhdCwkWFhbMF0sNCkKCWFkZAkkVFkjYiwkVFhbMF0jYgoJaW5jCSRYWFswXSNiCgltb3ZsCSgkZGF0LCRUWFswXSw0KSwkVFkjZAoJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKCXhvcmIJKCRpbnApLCRUWSNiCgltb3ZiCSRUWSNiLCgkb3V0LCRpbnApCglsZWEJMSgkaW5wKSwkaW5wCglkZWMJJFRYWzFdCglqbnoJLkxvb3A4X3dhcm11cAoKCWxlYQkxKCRYWFswXSksJFhYWzFdCglqbXAJLkxvb3A4Ci5hbGlnbgkxNgouTG9vcDg6Cl9fXwpmb3IgKCRpPTA7JGk8ODskaSsrKSB7CiRjb2RlLj08PF9fXyBpZiAoJGk9PTcpOwoJYWRkCVwkOCwkWFhbMV0jYgpfX18KJGNvZGUuPTw8X19fOwoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAoJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKCW1vdmwJYDQqKCRpPT03Py0xOiRpKWAoJGRhdCwkWFhbMV0sNCksJFRYWzFdI2QKCXJvcglcJDgsJXI4CQkJCSMgcm9yIGlzIHJlZHVuZGFudCB3aGVuICRpPTAKCW1vdmwJJFRZI2QsNCokaSgkZGF0LCRYWFswXSw0KQoJYWRkCSRUWFswXSNiLCRUWSNiCgltb3ZiCSgkZGF0LCRUWSw0KSwlcjhiCl9fXwpwdXNoKEBUWCxzaGlmdChAVFgpKTsgI3B1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CiRjb2RlLj08PF9fXzsKCWFkZAlcJDgsJFhYWzBdI2IKCXJvcglcJDgsJXI4CglzdWIJXCQ4LCRsZW4KCgl4b3IJKCRpbnApLCVyOAoJbW92CSVyOCwoJG91dCwkaW5wKQoJbGVhCTgoJGlucCksJGlucAoKCXRlc3QJXCQtOCwkbGVuCglqbnoJLkxvb3A4CgljbXAJXCQwLCRsZW4KCWpuZQkuTGxvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxpbnRlbDoKCXRlc3QJXCQtMzIsJGxlbgoJanoJLkxsb29wMQoJYW5kCVwkMTUsJFRYWzFdCglqegkuTG9vcDE2X2lzX2hvdAoJc3ViCSRUWFsxXSwkbGVuCi5Mb29wMTZfd2FybXVwOgoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAoJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCglhZGQJJFRZI2IsJFRYWzBdI2IKCWluYwkkWFhbMF0jYgoJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCgl4b3JiCSgkaW5wKSwkVFkjYgoJbW92YgkkVFkjYiwoJG91dCwkaW5wKQoJbGVhCTEoJGlucCksJGlucAoJZGVjCSRUWFsxXQoJam56CS5Mb29wMTZfd2FybXVwCgoJbW92CSRZWSwkVFhbMV0KCXhvcgkkWVksJFlZCgltb3YJJFRYWzFdI2IsJFlZI2IKCi5Mb29wMTZfaXNfaG90OgoJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV0KX19fCnN1YiBSQzRfbG9vcCB7CiAgbXkgJGk9c2hpZnQ7CiAgbXkgJGo9JGk8MD8wOiRpOwogIG15ICR4bW09IiV4bW0iLigkaiYxKTsKCiAgICAkY29kZS49IglhZGQJXCQxNiwkWFhbMF0jYlxuIgkJaWYgKCRpPT0xNSk7CiAgICAkY29kZS49Igltb3ZkcXUJKCRpbnApLCV4bW0yXG4iCQkJaWYgKCRpPT0xNSk7CiAgICAkY29kZS49IglhZGQJJFRYWzBdI2IsJFlZI2JcbiIJCWlmICgkaTw9MCk7CiAgICAkY29kZS49Igltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZFxuIjsKICAgICRjb2RlLj0iCXB4b3IJJXhtbTAsJXhtbTJcbiIJCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJcHNsbHEJXCQ4LCV4bW0xXG4iCQkJaWYgKCRpPT0wKTsKICAgICRjb2RlLj0iCXB4b3IJJHhtbSwkeG1tXG4iCQkJaWYgKCRpPD0xKTsKICAgICRjb2RlLj0iCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpXG4iOwogICAgJGNvZGUuPSIJYWRkCSRUWSNiLCRUWFswXSNiXG4iOwogICAgJGNvZGUuPSIJbW92bAlgNCooJGorMSlgKCRYWFsxXSksJFRYWzFdI2RcbiIJaWYgKCRpPDE1KTsKICAgICRjb2RlLj0iCW1vdnoJJFRYWzBdI2IsJFRYWzBdI2RcbiI7CiAgICAkY29kZS49Igltb3ZsCSRUWSNkLDQqJGooJFhYWzFdKVxuIjsKICAgICRjb2RlLj0iCXB4b3IJJXhtbTEsJXhtbTJcbiIJCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV1cbiIJaWYgKCRpPT0xNSk7CiAgICAkY29kZS49IglhZGQJJFRYWzFdI2IsJFlZI2JcbiIJCWlmICgkaTwxNSk7CiAgICAkY29kZS49IglwaW5zcncJXCRgKCRqPj4xKSY3YCwoJGRhdCwkVFhbMF0sNCksJHhtbVxuIjsKICAgICRjb2RlLj0iCW1vdmRxdQkleG1tMiwoJG91dCwkaW5wKVxuIgkJaWYgKCRpPT0wKTsKICAgICRjb2RlLj0iCWxlYQkxNigkaW5wKSwkaW5wXG4iCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJbW92bAkoJFhYWzFdKSwkVFhbMV0jZFxuIgkJaWYgKCRpPT0xNSk7Cn0KCVJDNF9sb29wKC0xKTsKJGNvZGUuPTw8X19fOwoJam1wCS5Mb29wMTZfZW50ZXIKLmFsaWduCTE2Ci5Mb29wMTY6Cl9fXwoKZm9yICgkaT0wOyRpPDE2OyRpKyspIHsKICAgICRjb2RlLj0iLkxvb3AxNl9lbnRlcjpcbiIJCWlmICgkaT09MSk7CglSQzRfbG9vcCgkaSk7CglwdXNoKEBUWCxzaGlmdChAVFgpKTsgCQkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CiRjb2RlLj08PF9fXzsKCW1vdgkkWVksJFRYWzFdCgl4b3IJJFlZLCRZWQkJCSMga2V5d29yZCB0byBwYXJ0aWFsIHJlZ2lzdGVyCglzdWIJXCQxNiwkbGVuCgltb3YJJFRYWzFdI2IsJFlZI2IKCXRlc3QJXCQtMTYsJGxlbgoJam56CS5Mb29wMTYKCglwc2xscQlcJDgsJXhtbTEKCXB4b3IJJXhtbTAsJXhtbTIKCXB4b3IJJXhtbTEsJXhtbTIKCW1vdmRxdQkleG1tMiwoJG91dCwkaW5wKQoJbGVhCTE2KCRpbnApLCRpbnAKCgljbXAJXCQwLCRsZW4KCWpuZQkuTGxvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxsb29wMToKCWFkZAkkVFhbMF0jYiwkWVkjYgoJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCgltb3ZsCSRUWSNkLCgkZGF0LCRYWFswXSw0KQoJYWRkCSRUWSNiLCRUWFswXSNiCglpbmMJJFhYWzBdI2IKCW1vdmwJKCRkYXQsJFRYWzBdLDQpLCRUWSNkCgltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAoJeG9yYgkoJGlucCksJFRZI2IKCW1vdmIJJFRZI2IsKCRvdXQsJGlucCkKCWxlYQkxKCRpbnApLCRpbnAKCWRlYwkkbGVuCglqbnoJLkxsb29wMQoJam1wCS5MZXhpdAoKLmFsaWduCTE2Ci5MUkM0X0NIQVI6CglhZGQJXCQxLCRYWFswXSNiCgltb3Z6YgkoJGRhdCwkWFhbMF0pLCRUWFswXSNkCgl0ZXN0CVwkLTgsJGxlbgoJanoJLkxjbG9vcDEKCWptcAkuTGNsb29wOAouYWxpZ24JMTYKLkxjbG9vcDg6Cgltb3YJKCRpbnApLCVyOGQKCW1vdgk0KCRpbnApLCVyOWQKX19fCiMgdW5yb2xsIDJ4NC13aXNlLCBiZWNhdXNlIDY0LWJpdCByb3RhdGVzIGtpbGwgSW50ZWwgUDQuLi4KZm9yICgkaT0wOyRpPDQ7JGkrKykgewokY29kZS49PDxfX187CglhZGQJJFRYWzBdI2IsJFlZI2IKCWxlYQkxKCRYWFswXSksJFhYWzFdCgltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCgltb3Z6YgkkWFhbMV0jYiwkWFhbMV0jZAoJbW92emIJKCRkYXQsJFhYWzFdKSwkVFhbMV0jZAoJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCgljbXAJJFhYWzFdLCRZWQoJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCglqbmUJLkxjbW92JGkJCQkjIEludGVsIGNtb3YgaXMgc2xvb29vdy4uLgoJbW92CSRUWFswXSwkVFhbMV0KLkxjbW92JGk6CglhZGQJJFRYWzBdI2IsJFRZI2IKCXhvcgkoJGRhdCwkVFkpLCVyOGIKCXJvcglcJDgsJXI4ZApfX18KcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CmZvciAoJGk9NDskaTw4OyRpKyspIHsKJGNvZGUuPTw8X19fOwoJYWRkCSRUWFswXSNiLCRZWSNiCglsZWEJMSgkWFhbMF0pLCRYWFsxXQoJbW92emIJKCRkYXQsJFlZKSwkVFkjZAoJbW92emIJJFhYWzFdI2IsJFhYWzFdI2QKCW1vdnpiCSgkZGF0LCRYWFsxXSksJFRYWzFdI2QKCW1vdmIJJFRYWzBdI2IsKCRkYXQsJFlZKQoJY21wCSRYWFsxXSwkWVkKCW1vdmIJJFRZI2IsKCRkYXQsJFhYWzBdKQoJam5lCS5MY21vdiRpCQkJIyBJbnRlbCBjbW92IGlzIHNsb29vb3cuLi4KCW1vdgkkVFhbMF0sJFRYWzFdCi5MY21vdiRpOgoJYWRkCSRUWFswXSNiLCRUWSNiCgl4b3IJKCRkYXQsJFRZKSwlcjliCglyb3IJXCQ4LCVyOWQKX19fCnB1c2goQFRYLHNoaWZ0KEBUWCkpOyBwdXNoKEBYWCxzaGlmdChAWFgpKTsJIyAicm90YXRlIiByZWdpc3RlcnMKfQokY29kZS49PDxfX187CglsZWEJLTgoJGxlbiksJGxlbgoJbW92CSVyOGQsKCRvdXQpCglsZWEJOCgkaW5wKSwkaW5wCgltb3YJJXI5ZCw0KCRvdXQpCglsZWEJOCgkb3V0KSwkb3V0CgoJdGVzdAlcJC04LCRsZW4KCWpuegkuTGNsb29wOAoJY21wCVwkMCwkbGVuCglqbmUJLkxjbG9vcDEKCWptcAkuTGV4aXQKX19fCiRjb2RlLj08PF9fXzsKLmFsaWduCTE2Ci5MY2xvb3AxOgoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3Z6YgkkWVkjYiwkWVkjZAoJbW92emIJKCRkYXQsJFlZKSwkVFkjZAoJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCgltb3ZiCSRUWSNiLCgkZGF0LCRYWFswXSkKCWFkZAkkVFhbMF0jYiwkVFkjYgoJYWRkCVwkMSwkWFhbMF0jYgoJbW92emIJJFRZI2IsJFRZI2QKCW1vdnpiCSRYWFswXSNiLCRYWFswXSNkCgltb3Z6YgkoJGRhdCwkVFkpLCRUWSNkCgltb3Z6YgkoJGRhdCwkWFhbMF0pLCRUWFswXSNkCgl4b3JiCSgkaW5wKSwkVFkjYgoJbGVhCTEoJGlucCksJGlucAoJbW92YgkkVFkjYiwoJG91dCkKCWxlYQkxKCRvdXQpLCRvdXQKCXN1YglcJDEsJGxlbgoJam56CS5MY2xvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxleGl0OgoJc3ViCVwkMSwkWFhbMF0jYgoJbW92bAkkWFhbMF0jZCwtOCgkZGF0KQoJbW92bAkkWVkjZCwtNCgkZGF0KQoKCW1vdgkoJXJzcCksJXIxMwoJbW92CTgoJXJzcCksJXIxMgoJbW92CTE2KCVyc3ApLCVyYngKCWFkZAlcJDI0LCVyc3AKLkxlcGlsb2d1ZToKCXJldAouc2l6ZQlSQzQsLi1SQzQKX19fCn0KCiRpZHg9IiVyOCI7CiRpZG89IiVyOSI7CgokY29kZS49PDxfX187Ci5nbG9ibAlSQzRfc2V0X2tleQoudHlwZQlSQzRfc2V0X2tleSxcQGZ1bmN0aW9uLDMKLmFsaWduCTE2ClJDNF9zZXRfa2V5OgoJbGVhCTgoJGRhdCksJGRhdAoJbGVhCSgkaW5wLCRsZW4pLCRpbnAKCW5lZwkkbGVuCgltb3YJJGxlbiwlcmN4Cgl4b3IJJWVheCwlZWF4Cgl4b3IJJGlkbywkaWRvCgl4b3IJJXIxMCwlcjEwCgl4b3IJJXIxMSwlcjExCgoJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCRpZHgjZAoJYnQJXCQyMCwkaWR4I2QJIyBSQzRfQ0hBUj8KCWpjCS5MYzFzdGxvb3AKCWptcAkuTHcxc3Rsb29wCgouYWxpZ24JMTYKLkx3MXN0bG9vcDoKCW1vdgklZWF4LCgkZGF0LCVyYXgsNCkKCWFkZAlcJDEsJWFsCglqbmMJLkx3MXN0bG9vcAoKCXhvcgkkaWRvLCRpZG8KCXhvcgkkaWR4LCRpZHgKLmFsaWduCTE2Ci5MdzJuZGxvb3A6Cgltb3YJKCRkYXQsJGlkbyw0KSwlcjEwZAoJYWRkCSgkaW5wLCRsZW4sMSksJGlkeCNiCglhZGQJJXIxMGIsJGlkeCNiCglhZGQJXCQxLCRsZW4KCW1vdgkoJGRhdCwkaWR4LDQpLCVyMTFkCgljbW92egklcmN4LCRsZW4KCW1vdgklcjEwZCwoJGRhdCwkaWR4LDQpCgltb3YJJXIxMWQsKCRkYXQsJGlkbyw0KQoJYWRkCVwkMSwkaWRvI2IKCWpuYwkuTHcybmRsb29wCglqbXAJLkxleGl0X2tleQoKLmFsaWduCTE2Ci5MYzFzdGxvb3A6Cgltb3YJJWFsLCgkZGF0LCVyYXgpCglhZGQJXCQxLCVhbAoJam5jCS5MYzFzdGxvb3AKCgl4b3IJJGlkbywkaWRvCgl4b3IJJGlkeCwkaWR4Ci5hbGlnbgkxNgouTGMybmRsb29wOgoJbW92CSgkZGF0LCRpZG8pLCVyMTBiCglhZGQJKCRpbnAsJGxlbiksJGlkeCNiCglhZGQJJXIxMGIsJGlkeCNiCglhZGQJXCQxLCRsZW4KCW1vdgkoJGRhdCwkaWR4KSwlcjExYgoJam56CS5MY25vd3JhcAoJbW92CSVyY3gsJGxlbgouTGNub3dyYXA6Cgltb3YJJXIxMGIsKCRkYXQsJGlkeCkKCW1vdgklcjExYiwoJGRhdCwkaWRvKQoJYWRkCVwkMSwkaWRvI2IKCWpuYwkuTGMybmRsb29wCgltb3ZsCVwkLTEsMjU2KCRkYXQpCgouYWxpZ24JMTYKLkxleGl0X2tleToKCXhvcgklZWF4LCVlYXgKCW1vdgklZWF4LC04KCRkYXQpCgltb3YJJWVheCwtNCgkZGF0KQoJcmV0Ci5zaXplCVJDNF9zZXRfa2V5LC4tUkM0X3NldF9rZXkKCi5nbG9ibAlSQzRfb3B0aW9ucwoudHlwZQlSQzRfb3B0aW9ucyxcQGFiaS1vbW5pcG90ZW50Ci5hbGlnbgkxNgpSQzRfb3B0aW9uczoKCWxlYQkuTG9wdHMoJXJpcCksJXJheAoJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVlZHgKCWJ0CVwkMjAsJWVkeAoJamMJLkw4eGNoYXIKCWJ0CVwkMzAsJWVkeAoJam5jCS5MZG9uZQoJYWRkCVwkMjUsJXJheAoJcmV0Ci5MOHhjaGFyOgoJYWRkCVwkMTIsJXJheAouTGRvbmU6CglyZXQKLmFsaWduCTY0Ci5Mb3B0czoKLmFzY2l6CSJyYzQoOHgsaW50KSIKLmFzY2l6CSJyYzQoOHgsY2hhcikiCi5hc2NpegkicmM0KDE2eCxpbnQpIgouYXNjaXoJIlJDNCBmb3IgeDg2XzY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgouYWxpZ24JNjQKLnNpemUJUkM0X29wdGlvbnMsLi1SQzRfb3B0aW9ucwpfX18KCiMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAojCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKaWYgKCR3aW42NCkgewokcmVjPSIlcmN4IjsKJGZyYW1lPSIlcmR4IjsKJGNvbnRleHQ9IiVyOCI7CiRkaXNwPSIlcjkiOwoKJGNvZGUuPTw8X19fOwouZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKLnR5cGUJc3RyZWFtX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAouYWxpZ24JMTYKc3RyZWFtX3NlX2hhbmRsZXI6CglwdXNoCSVyc2kKCXB1c2gJJXJkaQoJcHVzaAklcmJ4CglwdXNoCSVyYnAKCXB1c2gJJXIxMgoJcHVzaAklcjEzCglwdXNoCSVyMTQKCXB1c2gJJXIxNQoJcHVzaGZxCglzdWIJXCQ2NCwlcnNwCgoJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4Cgltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKCglsZWEJLkxwcm9sb2d1ZSglcmlwKSwlcjEwCgljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAoJamIJLkxpbl9wcm9sb2d1ZQoKCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAoKCWxlYQkuTGVwaWxvZ3VlKCVyaXApLCVyMTAKCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj1lcGlsb2d1ZSBsYWJlbAoJamFlCS5MaW5fcHJvbG9ndWUKCglsZWEJMjQoJXJheCksJXJheAoKCW1vdgktOCglcmF4KSwlcmJ4Cgltb3YJLTE2KCVyYXgpLCVyMTIKCW1vdgktMjQoJXJheCksJXIxMwoJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4Cgltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMwoKLkxpbl9wcm9sb2d1ZToKCW1vdgk4KCVyYXgpLCVyZGkKCW1vdgkxNiglcmF4KSwlcnNpCgltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQoJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCgoJam1wCS5MY29tbW9uX3NlaF9leGl0Ci5zaXplCXN0cmVhbV9zZV9oYW5kbGVyLC4tc3RyZWFtX3NlX2hhbmRsZXIKCi50eXBlCWtleV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKLmFsaWduCTE2CmtleV9zZV9oYW5kbGVyOgoJcHVzaAklcnNpCglwdXNoCSVyZGkKCXB1c2gJJXJieAoJcHVzaAklcmJwCglwdXNoCSVyMTIKCXB1c2gJJXIxMwoJcHVzaAklcjE0CglwdXNoCSVyMTUKCXB1c2hmcQoJc3ViCVwkNjQsJXJzcAoKCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAoJbW92CTgoJXJheCksJXJkaQoJbW92CTE2KCVyYXgpLCVyc2kKCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQoJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCgouTGNvbW1vbl9zZWhfZXhpdDoKCgltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAoJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAoJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCgkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCgoJbW92CSRkaXNwLCVyc2kKCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCgltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCgltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQoJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQoJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQoKCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAoJYWRkCVwkNjQsJXJzcAoJcG9wZnEKCXBvcAklcjE1Cglwb3AJJXIxNAoJcG9wCSVyMTMKCXBvcAklcjEyCglwb3AJJXJicAoJcG9wCSVyYngKCXBvcAklcmRpCglwb3AJJXJzaQoJcmV0Ci5zaXplCWtleV9zZV9oYW5kbGVyLC4ta2V5X3NlX2hhbmRsZXIKCi5zZWN0aW9uCS5wZGF0YQouYWxpZ24JNAoJLnJ2YQkuTFNFSF9iZWdpbl9SQzQKCS5ydmEJLkxTRUhfZW5kX1JDNAoJLnJ2YQkuTFNFSF9pbmZvX1JDNAoKCS5ydmEJLkxTRUhfYmVnaW5fUkM0X3NldF9rZXkKCS5ydmEJLkxTRUhfZW5kX1JDNF9zZXRfa2V5CgkucnZhCS5MU0VIX2luZm9fUkM0X3NldF9rZXkKCi5zZWN0aW9uCS54ZGF0YQouYWxpZ24JOAouTFNFSF9pbmZvX1JDNDoKCS5ieXRlCTksMCwwLDAKCS5ydmEJc3RyZWFtX3NlX2hhbmRsZXIKLkxTRUhfaW5mb19SQzRfc2V0X2tleToKCS5ieXRlCTksMCwwLDAKCS5ydmEJa2V5X3NlX2hhbmRsZXIKX19fCn0KCnN1YiByZWdfcGFydCB7Cm15ICgkcmVnLCRjb252KT1AXzsKICAgIGlmICgkcmVnID1+IC8lclswLTldKy8pCXsgJHJlZyAuPSAkY29udjsgfQogICAgZWxzaWYgKCRjb252IGVxICJiIikJeyAkcmVnID1+IHMvJVtlcl0oW154XSspeD8vJSQxbC87CX0KICAgIGVsc2lmICgkY29udiBlcSAidyIpCXsgJHJlZyA9fiBzLyVbZXJdKC4rKS8lJDEvOwkJfQogICAgZWxzaWYgKCRjb252IGVxICJkIikJeyAkcmVnID1+IHMvJVtlcl0oLispLyVlJDEvOwkJfQogICAgcmV0dXJuICRyZWc7Cn0KCiRjb2RlID1+IHMvKCVbYS16MC05XSspIyhbYndkXSkvcmVnX3BhcnQoJDEsJDIpL2dlbTsKJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CgpwcmludCAkY29kZTsKCmNsb3NlIFNURE9VVDsK